ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ODA0NwotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTM0IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIGRidXMsIGEgbWVzc2FnZSBidXMgc3lzdGVtIGZvcgorIyAgICAgIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uLgorIworCitCdWlsZENvbmZpZ1NwZWNpYWxpemVkCTo9IE5vCitCdWlsZFByb2R1Y3RTcGVjaWFsaXplZAk6PSBObworCitpbmNsdWRlIHByZS5tYWsKKworUGFja2FnZU5hbWUJCTo9IGRidXMKKworUGFja2FnZUV4dGVuc2lvbgk6PSB0YXIuZ3oKK1BhY2thZ2VTZXBhcmF0b3IJOj0gLQorCitQYWNrYWdlUGF0Y2hBcmdzCTo9CisKK1BhY2thZ2VBcmNoaXZlCQk6PSAkKFBhY2thZ2VOYW1lKS4kKFBhY2thZ2VFeHRlbnNpb24pCitQYWNrYWdlU291cmNlRGlyCTo9ICQoUGFja2FnZU5hbWUpJChQYWNrYWdlU2VwYXJhdG9yKSQoUGFja2FnZVZlcnNpb24pCisKK1BhY2thZ2VCdWlsZE1ha2VmaWxlCT0gJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxNYWtlZmlsZSkKKworQ2xlYW5QYXRocwkJKz0gJChQYWNrYWdlTGljZW5zZUZpbGUpCisKK0V4cGF0RGlyCQk6PSBzdy90cHMvZXhwYXQKK0V4cGF0SW5jRGlyCQk9ICQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCQoRXhwYXREaXIpLHVzci9pbmNsdWRlKQorRXhwYXRMaWJEaXIJCT0gJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsJChFeHBhdERpciksdXNyL2xpYikKKworYWxsOiAkKFBhY2thZ2VEZWZhdWx0R29hbCkKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBsaWNlbnNlIGNvbnRlbnRzLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpL0NPUFlJTkc6IHNvdXJjZQorCiskKFBhY2thZ2VMaWNlbnNlRmlsZSk6ICQoUGFja2FnZVNvdXJjZURpcikvQ09QWUlORworCSQoY29weS1yZXN1bHQpCisKKyMgRXh0cmFjdCB0aGUgc291cmNlIGZyb20gdGhlIGFyY2hpdmUgYW5kIGFwcGx5IHBhdGNoZXMsIGlmIGFueS4KKworJChQYWNrYWdlU291cmNlRGlyKTogJChQYWNrYWdlQXJjaGl2ZSkgJChQYWNrYWdlUGF0Y2hQYXRocykKKwkkKGV4cGFuZC1hbmQtcGF0Y2gtcGFja2FnZSkKKworIyBQcmVwYXJlIHRoZSBzb3VyY2VzLgorCisuUEhPTlk6IHNvdXJjZQorc291cmNlOiB8ICQoUGFja2FnZVNvdXJjZURpcikKKworIyBQYXRjaCB0aGUgc291cmNlcywgaWYgbmVjZXNzYXJ5LgorCisuUEhPTlk6IHBhdGNoCitwYXRjaDogc291cmNlCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUuCisjCisjIFRoZSBjb25maWd1cmUgc2NyaXB0IGNhbm5vdCBkZXRlcm1pbmUgc2V2ZXJhbCBmZWF0dXJlcyB3aGVuCisjIGNyb3NzLWNvbXBpbGluZywgc28gd2UgZ2l2ZSBpdCBkaXJlY3QgY2FjaGVkIGFuc3dlcnMgZm9yIHRoZQorIyBHTlUvTGludXggc3lzdGVtcyB3ZSBhcmUgY29uY2VybmVkIHdpdGguCisKKyQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpOiB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKWNkICQoQnVpbGREaXJlY3RvcnkpICYmIFwKKwkkKENVUkRJUikvJChQYWNrYWdlU291cmNlRGlyKS9jb25maWd1cmUgXAorCUlOU1RBTEw9IiQoSU5TVEFMTCkgJChJTlNUQUxMRkxBR1MpIiBcCisJQ0M9IiQoQ0MpIiBDWFg9IiQoQ1hYKSIgQVI9JChBUikgTk09JChOTSkgUkFOTElCPSQoUkFOTElCKSBTVFJJUD0kKFNUUklQKSBcCisJQ1BQRkxBR1M9IiQoY2FsbCBUb29sR2VuZXJhdGVJbmNsdWRlQXJndW1lbnQsJChFeHBhdEluY0RpcikpIiBcCisJTERGTEFHUz0iJChjYWxsIFRvb2xHZW5lcmF0ZUxpYnJhcnlQYXRoQXJndW1lbnQsJChFeHBhdExpYkRpcikpIiBcCisJLS1idWlsZD0kKEhvc3RUdXBsZSkgXAorCS0taG9zdD0kKFRhcmdldFR1cGxlKSBcCisJYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzPXllcyBcCisJLS1kaXNhYmxlLXNlbGludXggXAorCS0tZW5hYmxlLWFic3RyYWN0LXNvY2tldHMgXAorCS0tZW5hYmxlLWFzc2VydHMgXAorCS0td2l0aG91dC14IFwKKwktLXByZWZpeD0vdXNyIFwKKwktLXN5c2NvbmZkaXI9L2V0YyBcCisJLS1sb2NhbHN0YXRlZGlyPS92YXIgXAorCS0tZGlzYWJsZS1zdGF0aWMKKworIyBDb25maWd1cmUgdGhlIHNvdXJjZSBmb3IgYnVpbGRpbmcuCisKKy5QSE9OWTogY29uZmlndXJlCitjb25maWd1cmU6IHNvdXJjZSAkKFBhY2thZ2VCdWlsZE1ha2VmaWxlKQorCisjIEJ1aWxkIHRoZSBzb3VyY2UuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisKKy5QSE9OWTogYnVpbGQKK2J1aWxkOiBjb25maWd1cmUKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoQnVpbGREaXJlY3RvcnkpIGFsbAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKyMKKyMgV2UgZXhwbGljdGx5IHJlbW92ZSAnbGliZm9vLmxhJyBiZWNhdXNlIHNvbWUgcGFja2FnZXMgdGhhdCBkZXBlbmQgb24KKyMgdGhlc2UgbGlicmFyaWVzIHVzZSBsaWJ0b29sLiBJZiBsaWJ0b29sIGZpbmRzIGEgJ2xpYmZvby5sYScgZmlsZSBmb3IKKyMgYSBsaWJyYXJ5LCBpdCB1c2VzIHRoZSB2YWx1ZSBvZiAnbGliZGlyPTxkaXI+JyBpdCBmaW5kcy4gSW4gb3VyCisjIGNhc2UsIHNpbmNlICctLXByZWZpeD0vdXNyJyB0aGlzIHZhbHVlIGlzICcvdXNyL2xpYicuIEl0IHRoZW4KKyMgcmVzb2x2ZXMgJy1sZm9vJy4gSW4gYSBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudCwgdGhpcyBpcyBsaWtlbHkKKyMgdG8gYmUgbmVpdGhlciB0aGUgcmlnaHQgYXJjaGl0ZWN0dXJlIG5vciB0aGUgcmlnaHQgdmVyc2lvbiB0byBsaW5rCisjIGFnYWluc3QuIEluIHNob3J0LCB3ZSBsb3NlLgorIworIyBXZSBjb3VsZCBhbHNvIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIERFU1RESVIgYW5kIHNldHRpbmcgdGhlIHByZWZpeAorIyB0byAkKFJlc3VsdERpcmVjdG9yeSk7IGhvd2V2ZXIsIHRoYXQgcmVzdWx0cyBpbiBsaWJ0b29sIGhhcmQtY29kaW5nCisjICQoUmVzdWx0RGlyZWN0b3J5KSBhcyB0aGUgUlBBVEggaW4gdGhlIGxpbmtlZCBleGVjdXRhYmxlcyB3aGljaCBpcworIyBOT1Qgd2hhdCB3ZSB3YW50IGVpdGhlci4gV2UgbG9zZSBhZ2Fpbi4KKyMKKyMgQnkgcmVtb3ZpbmcgdGhlICcqLmxhJyBmaWxlLCB3ZSB3aW4gYnkgZW5zdXJpbmcgbmVpdGhlciBhIG1pc2RpcmVjdGVkCisjIGxpbmsgbm9yIGFuIFJQQVRILgorCisuUEhPTlk6IHN0YWdlCitzdGFnZTogYnVpbGQgfCAkKFJlc3VsdERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoQnVpbGREaXJlY3RvcnkpIERFU1RESVI9JChSZXN1bHREaXJlY3RvcnkpIGluc3RhbGwKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAkKGNhbGwgR2VuZXJhdGVSZXN1bHRQYXRocywsdXNyL2xpYi9saWJkYnVzLTEubGEpCisKK2NsZWFuOgorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUGFja2FnZVNvdXJjZURpcikKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9BVVRIT1JTIGIvZGJ1cy0xLjQuMTAvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTdjYmVmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvQVVUSE9SUwpAQCAtMCwwICsxLDEyMyBAQAorQWxiYW4gQ3JlcXV5IDxhbGJhbi5jcmVxdXlAY29sbGFib3JhLmNvLnVrPgorQWxleGFuZGVyIExhcnNzb24gPGFsZXhsQHJlZGhhdC5jb20+CitBbmRlcnMgQ2FybHNzb24gPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorQW5kcmUgSGVpbmVja2UgPGFoZWluZWNrZUBpbnRldmF0aW9uLmRlPgorQXJ0ZW0gQml0eXV0c2tpeSA8QXJ0ZW0uQml0eXV0c2tpeUBub2tpYS5jb20+CitBdXJlbGllbiBKYXJubyA8YXVyZWwzMkBkZWJpYW4ub3JnPgorQmVuamFtaW4gUmVlZCA8cmFuZ2VyQGJlZnVuay5jb20+CitCZW5qYW1pbiBSZWVkIDxyYW5nZXJyaWNrQGJlZnVuay5jb20+CitCZW5qYW1pbiBSZWVkIDxyYW5nZXJAU2luLmxvY2FsPgorQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorQ2hyaXN0aWFuIER5d2FuIDxjaHJpc3RpYW4uZHl3YW5AbGFuZWRvLmNvbT4KK0NocmlzdGlhbiBEeXdhbiA8Y2hyaXN0aWFuQGxhbmVkby5jb20+CitDaHJpc3RpYW4gRWhybGljaGVyIDxDaC5FaHJsaWNoZXJAZ214LmRlPgorQ2hyaXN0aWFuIFBlcnNjaCAoR05PTUUpIDxjaHBlQGdub21lLm9yZz4KK0NvbGluIFdhbHRlcnMgPHdhbHRlcnNAbGlnaHRib3gubG9jYWxkb21haW4+CitDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHNwYWNlLWdob3N0LnZlcmJ1bS5wcml2YXRlPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPgorQ29saW4gV2F0c29uIDxjandhdHNvbkB1YnVudHUuY29tPgorQ3Jpc3RpYW4gUm9kcsOtZ3VleiA8Y3Jpc3RpYW4ucm9kcmlndWV6QG9wZW5zdXNlLm9yZz4KK0N5cmlsIEJydWxlYm9pcyA8a2liaUBkZWJpYW4ub3JnPgorRGFuaWVsIFAuIEJlcnJhbmdlIDxkYW5AYmVycmFuZ2UuY29tPgorRGFuaWVsIFJlZWQgPGRqckByZWRoYXQuY29tPgorRGF2aWQgWmV1dGhlbiA8ZGF2aWR6QHJlZGhhdC5jb20+CitEZW5uaXMgS2FhcnNlbWFrZXIgPGRlbm5pc0BrYWFyc2VtYWtlci5uZXQ+CitEaWVnbyBFLiAnRmxhbWVleWVzJyBQZXR0ZW7DsiA8ZmxhbWVleWVzQGdtYWlsLmNvbT4KK0VhbW9uIFdhbHNoIDxld2Fsc2hAdHljaG8ubnNhLmdvdj4KK0ZlZGVyaWNvIE1lbmEgUXVpbnRlcm8gPGZlZGVyaWNvQG5vdmVsbC5jb20+CitGcmFuayBPc3RlcmZlbGQgPGZyYW5rQGtkYWIubmV0PgorRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLmNvbT4KK0ZyaWRyaWNoIMWgdHJiYSA8ZnJpZHJpY2guc3RyYmFAYmx1ZXdpbi5jaD4KK0dyemVnb3J6IETEhWJyb3dza2kgPGdkeEBwb2N6dGEuZm0+CitIYXJhbGQgRmVybmVuZ2VsIDxoYXJyeUBrZGV2ZWxvcC5vcmc+CitIYXJyaSBQb3J0ZW4gPHBvcnRlbkBrZGUub3JnPgorSGFzc28gVGVwcGVyIDxoYXNzb0Blc3RwYWsuZWU+CitIYXZvYyBQZW5uaW5ndG9uIDxocEBsb2NhbGhvc3QubG9jYWxkb21haW4+CitIYXZvYyBQZW5uaW5ndG9uIDxocEBwb2JveC5jb20+CitIYXZvYyBQZW5uaW5ndG9uIDxocEByZWRoYXQuY29tPgorSGVuZHJpayBCdXNjaG1laWVyIDxoYnVzY2htZUBUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CitKYW1lcyBDYXJ0ZXIgPGp3Y2FydDJAdHljaG8ubnNhLmdvdj4KK0phbWVzIFdlc3RieSA8ancrZGViaWFuQGphbWVzd2VzdGJ5Lm5ldD4KK0phbWVzIFdpbGxjb3ggPGp3aWxsY294QGdub21lLm9yZz4KK0plbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KK0rDqXLDqW1pZSBEaW1pbm8gPGplcmVtaWVAZGltaW5vLm9yZz4KK0pvZSBNYXJjdXMgQ2xhcmtlIDxtYXJjdXNAZnJlZWRlc2t0b3Aub3JnPgorSm9lIFNoYXcgPGpvZXNoYXdAbm92ZWxsLmNvbT4KK0pvaGFuIEd5bGxlbnNwZXR6IDxqb2hhbmd5QGF4aXMuY29tPgorSm9oYW5uZXMgQ2FybHNzb24gPGpvaGFubmVzLmNhcmxzc29uLnhAc29ueWVyaWNzc29uLmNvbT4KK0pvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KK0pvbiBHb3N0aW5nIDx5dWthcmlvbnNlbkBnbWFpbC5jb20+CitKb24gVHJvd2JyaWRnZSA8dHJvd0B4aW1pYW4uY29tPgorS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8uaGFtYWxhaW5lbkBub2tpYS5jb20+CitLamFydGFuIE1hcmFhcyA8a21hcmFhc0Bnbm9tZS5vcmc+CitLcmlzdGlhbiBIw7hnc2JlcmcgPGtyaEByZWRoYXQuY29tPgorS3Jpc3RpYW4gUmlldHZlbGQgPGtyaXNAZ3RrLm9yZz4KK0t1cnQgTWlsbGVyIDxrdXJ0QGludHJpY2F0ZXNvZnR3YXJlLmNvbT4KK0xhd3JlbmNlIFIuIFN0ZWVnZXIgPGxzdGVlZ2VyQGdtYWlsLmNvbT4KK0xlbm5hcnQgUG9ldHRlcmluZyA8bGVubmFydEBwb2V0dGVyaW5nLm5ldD4KK0xlbm5hcnQgUG9ldHRlcmluZyA8bXpxb2hmQDBwb2ludGVyLmRlPgorTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5sYW5kd2VybGluQG9wZW53aWRlLmZyPgorTHVpeiBBdWd1c3RvIFZvbiBEZW50eiA8bHVpei5kZW50ei12b25Abm9raWEuY29tPgorTWFyYyBCcm9ja3NjaG1pZHQgPGhlQGRlYmlhbi5vcmc+CitNYXJjIE11dHogPG1hcmNAa2RhYi5uZXQ+CitNYXJjdXMgQnJpbmttYW5uIDxtYXJjdXMuYnJpbmttYW5uQHJ1aHItdW5pLWJvY2h1bS5kZT4KK01hcmsgTWNMb3VnaGxpbiA8bWFya0Bza3luZXQuaWU+CitNYXR0aGlhcyBDbGFzZW4gPG1jbGFzZW5AcmVkaGF0LmNvbT4KK01hdHQgTWNDdXRjaGVuIDxtYXR0QG1hdHRtY2N1dGNoZW4ubmV0PgorTWljaGFlbCBNZWVrcyA8bWljaGFlbC5tZWVrc0Bub3ZlbGwuY29tPgorTWljaGFlbCBNZWVrcyA8bWljaGFlbEB4aW1pYW4uY29tPgorTWlrYWVsIEhhbGxlbmRhbCA8bWlja2VAY29kZWZhY3Rvcnkuc2U+CitNaWthZWwgSGFsbGVuZGFsIDxtaWNrZUBpbWVuZGlvLmNvbT4KK01pa2UgTWNRdWFpZCA8bWlrZUBtaWtlbWNxdWFpZC5jb20+CitNaWxvc2xhdiBUcm1hYyA8bWl0ckB2b2xueS5jej4KK011cnJheSBDdW1taW5nIDxtdXJyYXljQG11cnJheWMuY29tPgorTmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eSA8cGNsb3Vkc0BnbWFpbC5jb20+CitPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorT2xpdmllciBBbmRyaWV1IDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK09zd2FsZCBCdWRkZW5oYWdlbiA8b3NzaUBrZGUub3JnPgorT3dlbiBGcmFzZXItR3JlZW4gPG93ZW5AZGlzY29iYWJlLm5ldD4KK1BhdHJpY2sgdm9uIFJldGggPHBhdHJpY2sudm9ucmV0aEBnbWFpbC5jb20+CitQYXUgR2FyY2lhIGkgUXVpbGVzIDxwZ3F1aWxlc0BlbHBhdWVyLm9yZz4KK1BhdWwgQm9sbGUgPHBlYm9sbGVAdGlzY2FsaS5ubD4KK1BldGVyIEJyZWl0ZW5sb2huZXIgPHBlYkBtcHBtdS5tcGcuZGU+CitQZXRlciBLw7xtbWVsIDxzeW50aGV0aWNwcEBnbXgubmV0PgorUGV0ZXIgTWNDdXJkeSA8cG1jY3VyZHlAc2tlcHRvcG90YW11cz4KK1BoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KK1Bsw6FjaWRvIFJldmlsbGEgPHVua25vd25AdW5rbm93bi5kb21haW4+CitSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CitSYWxmIEhhYmFja2VyIDxSYWxmLkhhYmFja2VyQGZyZWVuZXQuZGU+CitSYWxmIEhhYmFja2VyIDxyYWxmQHMxNTI5MTM1OS5vbmxpbmVob21lLXNlcnZlci5pbmZvPgorUmF5IFN0cm9kZSA8cnN0cm9kZUByZWRoYXQuY29tPgorUmljaGFyZCBBLiBIYW5raW5zIDxyaWNoYXJkLmEuaGFua2luc0BnbWFpbC5jb20+CitSaWNoYXJkIEh1Z2hlcyA8cmljaGFyZEBodWdoc2llLmNvbT4KK1JpY2hhcmQgSHVsdCA8cmh1bHRAY29kZWZhY3Rvcnkuc2U+CitSaWNoYXJkIEh1bHQgPHJpY2hhcmRAaW1lbmRpby5jb20+CitSb2JlcnQgTWNRdWVlbiA8cm9ib3QxMDFAZGViaWFuLm9yZz4KK1JvbWFpbiBQb2tyenl3a2EgPHJvbWFpbkBrZGFiLmNvbT4KK1Jvc3MgQnVydG9uIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorUnlhbiBMb3J0aWUgPGRlc3J0QGRlc3J0LmNhPgorU2FzY2hhIFNpbGJlIDxzYXNjaGEtd2ViLWJ1Z3MuZnJlZWRlc2t0b3Aub3JnQHNpbGJlLm9yZz4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+CitTZWJhc3RpYW4gU2F1ZXIgPHNlYnNhdWVyQGtkYWIubmV0PgorU2V0aCBOaWNrZWxsIDxzZXRoQGdub21lLm9yZz4KK1NpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CitTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CitTbGVkeiA8c2xlZHpATU9CSUwtNDAwLTU4Ni5pbnRlcm4uZHJlc2VhcmNoLmRlPgorVGhpYWdvIE1hY2llaXJhIDx0aGlhZ29Aa2RlLm9yZz4KK1RpbSBEaWprc3RyYSA8dGltQGZhbWRpamtzdHJhLm9yZz4KK1RvYmlhcyBNdWVsbGVyIDxmZG8tYnVnc0BjcnlwdG9iaXRjaC5kZT4KK1RvbWFzIEhvZ2VyIDx0aG9nZXJAcmVkaGF0LmNvbT4KK1RvbWFzIFBlbGthIDx0cGVsa2FAcmVkaGF0LmNvbT4KK1RvbSBIdWdoZXMgPHRvbS5odWdoZXNAcGFsbS5jb20+CitUb3IgTGlsbHF2aXN0IDx0bWxAaWtpLmZpPgordW5rbm93biA8QWRtaW5pc3RyYXRvckAuKG5vbmUpPgordW5rbm93biA8SGFiYWNrZXJALihub25lKT4KK1dhbGRvIEJhc3RpYW4gPGJhc3RpYW5Aa2RlLm9yZz4KK1dpbGxpYW0gTGFjaGFuY2UgPHdybGFjaEBnbWFpbC5jb20+CitXaWxsIFRob21wc29uIDx3aWxsLnRob21wc29uQGNvbGxhYm9yYS5jby51az4KK1d1bGYgQy4gS3J1ZWdlciA8cGhpbGFudHJvcEBleGhlcmJvLm9yZz4KK1hhbiBMb3BleiA8eGFuQGdub21lLm9yZz4KK1lhYWtvdiBTZWxrb3dpdHogPHlzZWxrb3dpdHpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvQ09QWUlORyBiL2RidXMtMS40LjEwL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2MGIxMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL0NPUFlJTkcKQEAgLTAsMCArMSw1NTIgQEAKK0QtQnVzIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB5b3VyIGNob2ljZSBvZiB0aGUgQWNhZGVtaWMgRnJlZQorTGljZW5zZSB2ZXJzaW9uIDIuMSwgb3IgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKG9yLCBhdCB5b3VyIG9wdGlvbiBhbnkgbGF0ZXIgdmVyc2lvbikuCisKK0JvdGggbGljZW5zZXMgYXJlIGluY2x1ZGVkIGhlcmUuIFNvbWUgb2YgdGhlIHN0YW5kYWxvbmUgYmluYXJpZXMgYXJlCit1bmRlciB0aGUgR1BMIG9ubHk7IGluIHBhcnRpY3VsYXIsIGJ1dCBub3QgbGltaXRlZCB0bywKK3Rvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmMgYW5kIHRlc3QvZGVjb2RlLWdjb3YuYy4gRWFjaCBzb3VyY2UgY29kZQorZmlsZSBpcyBtYXJrZWQgd2l0aCB0aGUgcHJvcGVyIGNvcHlyaWdodCBpbmZvcm1hdGlvbiAtIGlmIHlvdSBmaW5kIGEKK2ZpbGUgdGhhdCBpc24ndCBtYXJrZWQgcGxlYXNlIGJyaW5nIGl0IHRvIG91ciBhdHRlbnRpb24uCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9DaGFuZ2VMb2cgYi9kYnVzLTEuNC4xMC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMzNkNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL0NoYW5nZUxvZwpAQCAtMCwwICsxLDUgQEAKKzIwMDgtMDQtMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IHRha2Ugb3V0IHRoZSB0cmFpbGluZyBjb21tYSBpbiB0aGUKKwkgIFByb2ZpbGVBdHRyaWJ1dGVGbGFncyBlbnVtIGFzIGl0IGlzbid0IGluIG91ciBzdHlsZSBndWlkZXMKKwkgIGFuZCBjYXVzZXMgc29tZSBjb21waWxlcnMgdG8gZXJyb3Igb3V0CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9DaGFuZ2VMb2cucHJlLTEtMCBiL2RidXMtMS40LjEwL0NoYW5nZUxvZy5wcmUtMS0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjU5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9DaGFuZ2VMb2cucHJlLTEtMApAQCAtMCwwICsxLDE1MTQ2IEBACisyMDA2LTExLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAxLjAuMAorCisyMDA2LTExLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBBVVRIT1JTOiBhZGRlZCBQZXRlciBhbmQgVG9yIG9mIHdpbmRvd3MgcG9ydGluZyBmYW1lCisKKzIwMDYtMTEtMDggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIGEgbm90ZSBhYm91dCBwcm90b2NvbCBzdGFiaWxpdHkKKworCSogZG9jL1RPRE86IFJlbW92ZSAiaW1wb3J0YW50IGZvciAxLjAiIHNlY3Rpb24sIHJlcGxhY2Ugd2l0aAorCSJpbXBvcnRhbnQgZm9yIDEuMiIgc2VjdGlvbgorCQorMjAwNi0xMS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUkVBRE1FOiByZW1vdmUgc29tZSBvZiB0aGUgb3V0IG9mIGRhdGUgZmxhZ3MKKworCSogZG9jL1RPRE86IFJlbW92ZSB0b2RvIGl0ZW1zIHdoaWNoIGFyZSBkb25lCisKKzIwMDYtMTEtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+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+CisKKwkqIEluaXRpYWwgbW9kdWxlIGNyZWF0aW9uCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL0NoYW5nZUxvZy5wcmUtMS0yIGIvZGJ1cy0xLjQuMTAvQ2hhbmdlTG9nLnByZS0xLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyMDQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL0NoYW5nZUxvZy5wcmUtMS0yCkBAIC0wLDAgKzEsMjAyNyBAQAorMjAwOC0wNC0wNCAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAxLjIuMQorCisyMDA4LTA0LTAzICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+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+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfZ2VuZXJhdGVfdXVpZCk6IFRoZSBzcGVjIHNhaWQgdGhlCisJVVVJRCBoYWQgdGhlIHRpbWVzdGFtcCBsYXN0LCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGhhZCBpdCBmaXJzdDsKKwltb3ZlIGl0IHRvIGxhc3Qgc2luY2UgSSB0aGluayBpdCdzIGEgdGlueSBiaXQgbmljZXIgKGVhc2llciB0bworCWNvbXBhcmUgYXQgYSBnbGFuY2UsIGZhc3RlciB0byBzb3J0LCBsZXNzIGNvZGUpLCBhbmQgd2lsbCBub3QKKwljYXVzZSBhbnkgcHJhY3RpY2FsIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuIEFsc28sIGFsd2F5cyBjb252ZXJ0CisJdGhlIHRpbWVzdGFtcCB0byBiaWcgZW5kaWFuLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQ2xlYW4gdXAgdGhlIGRvY3Mgb24gdGhlIFVVSUQuCisKKwkqIHRvb2xzL2RidXMtdXVpZGdlbi4xOiBtb3JlIHByb21pbmVudGx5IHNheSBpdCBpcyBub3Qgc3VpdGFibGUKKwlhcyBhIHJlcGxhY2VtZW50IGZvciByZWd1bGFyIHV1aWRnZW4vUkZDNDEyMi4KKworMjAwNi0xMS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuaDogZml4IERCVVNfVEhSRUFEX0ZVTkNUSU9OU19BTExfTUFTSyB0byBoYXZlCisJdGhlIGNvcnJlY3QgdmFsdWUgc28gd2UgZG9uJ3QgYXNzZXJ0IHdoZW4gaW5pdGFsaXppbmcgcmVjdXJzaXZlIHRocmVhZHMKKworCSogdGVzdC9uYW1lLXRlc3QvdGVzdC10aHJlYWQtaW5pdC5jOiBjYWxsIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQKKwlpbnN0ZWFkIG9mIF9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyBzaW5jZSBpdCBpcyBtb3JlIG9mIGEgcmVhbCB3b3JsZAorCXRlc3QKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvRG94eWZpbGUuaW4gYi9kYnVzLTEuNC4xMC9Eb3h5ZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFjNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvRG94eWZpbGUuaW4KQEAgLTAsMCArMSwxODEgQEAKKyMgRG94eWZpbGUgMC4xCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgR2VuZXJhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBELUJ1cworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IEBWRVJTSU9OQAorT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IGRvYy9hcGkKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gTk8KK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gTk8KK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSAKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IFlFUworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUVVJRVQgICAgICAgICAgICAgICAgICA9IFlFUworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworV0FSTl9GT1JNQVQgICAgICAgICAgICA9IAorV0FSTl9MT0dGSUxFICAgICAgICAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOUFVUICAgICAgICAgICAgICAgICAgPSBAdG9wX3NyY2RpckAvZGJ1cworRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmgKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKyNFWENMVURFICAgICAgICAgICAgICAgID0gdGVzdAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUgCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZSAKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gTWFrZWZpbGUuKiBDaGFuZ2VMb2cgQ0hBTkdFUyBDSEFOR0VTLiogUkVBRE1FIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSRUFETUUuKiAqLnBuZyBBVVRIT1JTIERFU0lHTiBERVNJR04uKiAqLmRlc2t0b3AgXAorICAgICAgICAgICAgICAgICAgICAgICAgIERFU0tUT1AqIENPTU1FTlRTIEhPV1RPIG1hZ2ljIE5PVEVTIFRPRE8gVEhBTktTCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciAKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSAKKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gTk8KK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IAorSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorSFRNTF9GT09URVIgICAgICAgICAgICA9IAorSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSAKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBOTworVVNFX1BERkxBVEVYICAgICAgICAgICA9IE5PCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworUlRGX09VVFBVVCAgICAgICAgICAgICA9IAorQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTUFOICAgICAgICAgICA9IFlFUworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zZGJ1cworTUFOX0xJTktTICAgICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCitJTkNMVURFX1BBVEggICAgICAgICAgID0gCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCitQUkVERUZJTkVEICAgICAgICAgICAgID0gIkRCVVNfQkVHSU5fREVDTFM9IiAJCQlcCisJCQkgIkRCVVNfRU5EX0RFQ0xTPSIgCQkJXAorCQkJICJET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMiIAkJXAorICAgICAgICAgICAgICAgICAgICAgICAgICJEQlVTX0dOVUNfREVQUkVDQVRFRD0iICAgICAgICAgICAgICAgIFwKKwkJCSAiX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLKG5hbWUpPSIJXAorCQkJICJfREJVU19HTlVDX1BSSU5URihmcm9tLHRvKT0iCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZHRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcyAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFHRklMRVMgICAgICAgICAgICAgICA9IAorR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCitQRVJMX1BBVEggICAgICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbCAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gWUVTCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCitET1RfUEFUSCAgICAgICAgICAgICAgID0gCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCitNQVhfRE9UX0dSQVBIX1dJRFRIICAgID0gNjQwCitNQVhfRE9UX0dSQVBIX0hFSUdIVCAgID0gMTAyNAorR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGR0aW9ucyByZWxhdGVkIHRvIHRoZSBzZWFyY2ggZW5naW5lICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL0hBQ0tJTkcgYi9kYnVzLTEuNC4xMC9IQUNLSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmY3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9IQUNLSU5HCkBAIC0wLDAgKzEsMzQzIEBACitUaGUgZ3VpZGVsaW5lcyBpbiB0aGlzIGZpbGUgYXJlIHRoZSBpZGVhbHM7IGl0J3MgYmV0dGVyIHRvIHNlbmQgYQorbm90LWZ1bGx5LWZvbGxvd2luZy1ndWlkZWxpbmVzIHBhdGNoIHRoYW4gbm8gcGF0Y2ggYXQgYWxsLCB0aG91Z2guICBXZQorY2FuIGFsd2F5cyBwb2xpc2ggaXQgdXAuCisKK01haWxpbmcgbGlzdAorPT09CisKK1RoZSBELUJ1cyBtYWlsaW5nIGxpc3QgaXMgZGJ1c0BsaXN0cy5mcmVlZGVza3RvcC5vcmc7IGRpc2N1c3Npb24KK29mIHBhdGNoZXMsIGV0Yy4gc2hvdWxkIGdvIHRoZXJlLgorCitTZWN1cml0eQorPT09CisKK01vc3Qgb2YgRC1CdXMgaXMgc2VjdXJpdHkgc2Vuc2l0aXZlLiAgR3VpZGVsaW5lcyByZWxhdGVkIHRvIHRoYXQ6CisKKyAtIGF2b2lkIG1lbWNweSgpLCBzcHJpbnRmKCksIHN0cmxlbigpLCBzbnByaW50Ziwgc3RybGNhdCgpLAorICAgc3Ryc3RyKCksIHN0cnRvaygpLCBvciBhbnkgb2YgdGhpcyBzdHVmZi4gVXNlIERCdXNTdHJpbmcuIAorICAgSWYgREJ1c1N0cmluZyBkb2Vzbid0IGhhdmUgdGhlIGZlYXR1cmUgeW91IG5lZWQsIGFkZCBpdCAKKyAgIHRvIERCdXNTdHJpbmcuIAorCisgICBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zLCBmb3IgZXhhbXBsZQorICAgaWYgeW91ciBzdHJpbmdzIGFyZSBqdXN0IHVzZWQgdG8gaW5kZXggYSBoYXNoIHRhYmxlIAorICAgYW5kIHlvdSBkb24ndCBkbyBhbnkgcGFyc2luZy9tb2RpZmljYXRpb24gb2YgdGhlbSwgcGVyaGFwcworICAgREJ1c1N0cmluZyBpcyB3YXN0ZWZ1bCBhbmQgd291bGRuJ3QgaGVscCBtdWNoLiBCdXQgZGVmaW5pdGVseSAKKyAgIGlmIHlvdSdyZSBkb2luZyBhbnkgcGFyc2luZywgcmVhbGxvY2F0aW9uLCBldGMuIHVzZSBEQnVzU3RyaW5nLgorCisgLSBkbyBub3QgaW5jbHVkZSBzeXN0ZW0gaGVhZGVycyBvdXRzaWRlIG9mIGRidXMtbWVtb3J5LmMsIAorICAgZGJ1cy1zeXNkZXBzLmMsIGFuZCBvdGhlciBwbGFjZXMgd2hlcmUgdGhleSBhcmUgYWxyZWFkeSAKKyAgIGluY2x1ZGVkLiBUaGlzIGdpdmVzIHVzIG9uZSBwbGFjZSB0byBhdWRpdCBhbGwgZXh0ZXJuYWwgCisgICBkZXBlbmRlbmNpZXMgb24gZmVhdHVyZXMgaW4gbGliYywgZXRjLgorCisgLSBkbyBub3QgdXNlIGxpYmMgZmVhdHVyZXMgdGhhdCBhcmUgImNvbXBsaWNhdGVkIiAKKyAgIGFuZCBtYXkgY29udGFpbiBzZWN1cml0eSBob2xlcy4gRm9yIGV4YW1wbGUsIHlvdSBwcm9iYWJseSBzaG91bGRuJ3QKKyAgIHRyeSB0byB1c2UgcmVnY29tcCgpIHRvIGNvbXBpbGUgYW4gdW50cnVzdGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgIFJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGp1c3QgdG9vIGNvbXBsaWNhdGVkLCBhbmQgdGhlcmUgYXJlIG1hbnkgCisgICBkaWZmZXJlbnQgbGliYydzIG91dCB0aGVyZS4KKworIC0gd2UgbmVlZCB0byBkZXNpZ24gdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbiAoYW5kIGFueSBzaW1pbGFyIGZlYXR1cmVzKQorICAgdG8gdXNlIGxpbWl0ZWQgcHJpdmlsZWdlcywgcnVuIGluIGEgY2hyb290IGphaWwsIGFuZCBzbyBvbi4KKworaHR0cDovL3ZzZnRwZC5iZWFzdHMub3JnLyBoYXMgb3RoZXIgZ29vZCBzZWN1cml0eSBzdWdnZXN0aW9ucy4KKworQ29kaW5nIFN0eWxlCis9PT0KKworIC0gVGhlIEMgbGlicmFyeSB1c2VzIEdOVSBjb2RpbmcgY29udmVudGlvbnMsIHdpdGggR0xpYi1saWtlCisgICBleHRlbnNpb25zIChlLmcuIGxpbmluZyB1cCBmdW5jdGlvbiBhcmd1bWVudHMpLiBUaGUKKyAgIFF0IHdyYXBwZXIgdXNlcyBLREUgY29kaW5nIGNvbnZlbnRpb25zLgorCisgLSBXcml0ZSBkb2NzIGZvciBhbGwgbm9uLXN0YXRpYyBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgYW5kIHNvIG9uLiB0cnkKKyAgICJkb3h5Z2VuIERveHlmaWxlIiBwcmlvciB0byBjb21taXQgYW5kIGJlIHN1cmUgdGhlcmUgYXJlIG5vCisgICB3YXJuaW5ncyBwcmludGVkLgorCisgLSBBbGwgZXh0ZXJuYWwgaW50ZXJmYWNlcyAobmV0d29yayBwcm90b2NvbHMsIGZpbGUgZm9ybWF0cywgZXRjLikKKyAgIHNob3VsZCBoYXZlIGRvY3VtZW50ZWQgc3BlY2lmaWNhdGlvbnMgc3VmZmljaWVudCB0byBhbGxvdyBhbgorICAgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gdG8gYmUgd3JpdHRlbi4gT3VyIGltcGxlbWVudGF0aW9uIHNob3VsZAorICAgYmUgc3RyaWN0IGFib3V0IHNwZWNpZmljYXRpb24gY29tcGxpYW5jZSAoc2hvdWxkIG5vdCBmb3IgZXhhbXBsZQorICAgaGV1cmlzdGljYWxseSBwYXJzZSBhIGZpbGUgYW5kIGFjY2VwdCBub3Qtd2VsbC1mb3JtZWQKKyAgIGRhdGEpLiBBdm9pZGluZyBoZXVyaXN0aWNzIGlzIGFsc28gaW1wb3J0YW50IGZvciBzZWN1cml0eSByZWFzb25zOworICAgaWYgaXQgbG9va3MgZnVubnksIGlnbm9yZSBpdCAob3IgZXhpdCwgb3IgZGlzY29ubmVjdCkuCisKK0RldmVsb3BtZW50Cis9PT0KKworRC1CdXMgdXNlcyBHaXQgYXMgaXRzIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uIFRoZSBtYWluIHJlcG9zaXRvcnkgaXMKK2hvc3RlZCBhdCBnaXQuZnJlZWRlc2t0b3Aub3JnL2RidXMvZGJ1cy4gVG8gY2xvbmUgRC1CdXMsIGV4ZWN1dGUgdGhlCitmb2xsb3dpbmcgY29tbWFuZDoKKworICAgIGdpdCBjbG9uZSBnaXQ6Ly9naXQuZnJlZWRlc2t0b3Aub3JnL2RidXMvZGJ1cworT1IKKyAgICBnaXQgY2xvbmUgZ2l0LmZyZWVkZXNrdG9wLm9yZzpkYnVzL2RidXMKKworVGhlIGxhdHRlciBmb3JtIGlzIHRoZSBvbmUgdGhhdCBhbGxvd3MgcHVzaGluZywgYnV0IGl0IGFsc28gcmVxdWlyZXMKK2FuIFNTSCBhY2NvdW50IG9uIHRoZSBzZXJ2ZXIuIFRoZSBmb3JtZXIgZm9ybSBhbGxvd3MgYW5vbnltb3VzCitjaGVja291dHMuCisKK0QtQnVzIGRldmVsb3BtZW50IGhhcHBlbnMgaW4gdHdvIGJyYW5jaGVzIGluIHBhcmFsbGVsOiB0aGUgY3VycmVudAorc3RhYmxlIGJyYW5jaCwgd2l0aCBhbiBldmVuIG1pbm9yIG51bWJlciAobGlrZSAxLjAsIDEuMiBhbmQgMS40KSwgYW5kCit0aGUgbmV4dCBkZXZlbG9wbWVudCBicmFuY2gsIHdpdGggdGhlIG5leHQgb2RkIG51bWJlci4KKworVGhlIHN0YWJsZSBicmFuY2ggaXMgbmFtZWQgYWZ0ZXIgdGhlIHZlcnNpb24gbnVtYmVyIGl0c2VsZiAoZGJ1cy0xLjIsCitkYnVzLTEuNCksIHdoZXJlYXMgdGhlIGRldmVsb3BtZW50IGJyYW5jaCBpcyBzaW1wbHkga25vd24gYXMgIm1hc3RlciIuCisKK1doZW4gbWFraW5nIGEgY2hhbmdlIHRvIEQtQnVzLCBkbyB0aGUgZm9sbG93aW5nOgorCisgLSBjaGVjayBvdXQgdGhlIGVhcmxpZXN0IGJyYW5jaCBvZiBELUJ1cyB0aGF0IG1ha2VzIHNlbnNlIHRvIGhhdmUKKyAgIHlvdXIgY2hhbmdlIGluLiBJZiBpdCdzIGEgYnVnZml4LCBpdCdzIG5vcm1hbGx5IHRoZSBjdXJyZW50IHN0YWJsZQorICAgYnJhbmNoOyBpZiBpdCdzIGEgZmVhdHVyZSwgaXQncyBub3JtYWxseSB0aGUgIm1hc3RlciIgYnJhbmNoLiBJZgorICAgeW91IGhhdmUgYW4gaW1wb3J0YW50IHNlY3VyaXR5IGZpeCwgeW91IG1heSB3YW50IHRvIGFwcGx5IHRvIG9sZGVyCisgICBicmFuY2hlcyB0b28uCisKKyAtIGZvciBsYXJnZSBjaGFuZ2VzOgorICAgICBpZiB5b3UncmUgZGV2ZWxvcGluZyBhIG5ldywgbGFyZ2UgZmVhdHVyZSwgaXQncyByZWNvbW1lbmRlZAorICAgICB0byBjcmVhdGUgYSBuZXcgYnJhbmNoIGFuZCBkbyB5b3VyIGRldmVsb3BtZW50IHRoZXJlLiBQdWJsaXNoCisgICAgIHlvdXIgYnJhbmNoIGF0IGEgc3VpdGFibGUgcGxhY2UgYW5kIGFzayBvdGhlcnMgdG8gaGVscCB5b3UKKyAgICAgZGV2ZWxvcCBhbmQgdGVzdCBpdC4gT25jZSB5b3VyIGZlYXR1cmUgaXMgY29uc2lkZXJlZCBmaW5hbGlzZWQsCisgICAgIHlvdSBtYXkgbWVyZ2UgaXQgaW50byB0aGUgIm1hc3RlciIgYnJhbmNoLgorCistIGZvciBzbWFsbCBjaGFuZ2VzOgorICAgIC4gbWFrZSB5b3VyIGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUKKyAgICAuIGV4ZWN1dGUgdGVzdHMgdG8gZ3VhcmFudGVlIHRoYXQgeW91J3JlIG5vdCBpbnRyb2R1Y2luZyBhCisgICAgICByZWdyZXNzaW9uLiBGb3IgdGhhdCwgZXhlY3V0ZTogbWFrZSBjaGVjaworICAgICAgKGlmIHBvc3NpYmxlLCBhZGQgYSBuZXcgdGVzdCB0byBjaGVjayB0aGUgZml4IHlvdSdyZQorICAgICAgaW50cm9kdWNpbmcpCisgICAgLiBjb21taXQgeW91ciBjaGFuZ2UgdXNpbmcgImdpdCBjb21taXQiCisgICAgICBpbiB0aGUgY29tbWl0IG1lc3NhZ2UsIHdyaXRlIGEgc2hvcnQgc2VudGVuY2UgZGVzY3JpYmluZyB3aGF0CisgICAgICB5b3UgZGlkIGluIHRoZSBmaXJzdCBsaW5lLiBUaGVuIHdyaXRlIGEgbG9uZ2VyIGRlc2NyaXB0aW9uIGluCisgICAgICB0aGUgbmV4dCBwYXJhZ3JhcGgocykuCisgICAgLiByZXBlYXQgdGhlIHByZXZpb3VzIHN0ZXBzIGlmIG5lY2Vzc2FyeSB0byBoYXZlIG11bHRpcGxlIGNvbW1pdHMKKworIC0gZXh0cmFjdCB5b3VyIHBhdGNoZXMgYW5kIHNlbmQgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBmb3IKKyAgIHJldmlldyBvciBwb3N0IHRoZW0gdG8gdGhlIEQtQnVzIEJ1Z3ppbGxhLCBhdHRhY2hpbmcgdGhlbSB0byBhIGJ1ZworICAgcmVwb3J0LiBUbyBleHRyYWN0IHRoZSBwYXRjaGVzLCBleGVjdXRlOgorICAgICBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbi9tYXN0ZXIKKworIC0gb25jZSB5b3VyIGNvZGUgaGFzIGJlZW4gcmV2aWV3ZWQsIHlvdSBtYXkgcHVzaCBpdCB0byB0aGUgR2l0CisgICBzZXJ2ZXI6CisgICAgIGdpdCBwdXNoIG9yaWdpbiBteS1icmFuY2g6cmVtb3RlCisgICBPUgorICAgICBnaXQgcHVzaCBvcmlnaW4gZGJ1cy1YLlkKKyAgIE9SCisgICAgIGdpdCBwdXNoIG9yaWdpbiBtYXN0ZXIKKyAgIChjb25zdWx0IHRoZSBHaXQgbWFudWFsIHRvIGtub3cgd2hpY2ggY29tbWFuZCBhcHBsaWVzKQorCisgLSAoT3B0aW9uYWwpIGlmIHlvdSd2ZSBub3Qgd29ya2VkIG9uICJtYXN0ZXIiLCBtZXJnZSB5b3VyIGNoYW5nZXMgdG8KKyAgIHRoYXQgYnJhbmNoLiBJZiB5b3UndmUgd29ya2VkIG9uIGFuIGVhcmxpZXIgYnJhbmNoIHRoYW4gdGhlIGN1cnJlbnQKKyAgIHN0YWJsZSwgbWVyZ2UgeW91ciBjaGFuZ2VzIHVwd2FyZHMgdG93YXJkcyB0aGUgc3RhYmxlIGJyYW5jaCwgdGhlbgorICAgZnJvbSB0aGVyZSBpbnRvICJtYXN0ZXIiLgorCisgICAgLiBleGVjdXRlOiBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgLiBlbnN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgbGF0ZXN0ICJtYXN0ZXIiIGZyb20gdGhlIHNlcnZlciwgdXBkYXRlCisgICAgICBpZiB5b3UgZG9uJ3QKKyAgICAuIGV4ZWN1dGU6IGdpdCBtZXJnZSBkYnVzLVguWQorICAgIC4gaWYgeW91IGhhdmUgYW55IGNvbmZsaWN0cywgcmVzb2x2ZSB0aGVtLCBnaXQgYWRkIHRoZSBjb25mbGljdGVkCisgICAgICBmaWxlcyBhbmQgdGhlbiBnaXQgY29tbWl0CisgICAgLiBwdXNoIHRoZSAibWFzdGVyIiBicmFuY2ggdG8gdGhlIHNlcnZlciBhcyB3ZWxsCisKKyAgRXhlY3V0aW5nIHRoaXMgbWVyZ2UgaXMgcmVjb21tZW5kZWQsIGJ1dCBub3QgbmVjZXNzYXJ5IGZvciBhbGwKKyAgY2hhbmdlcy4gWW91IHNob3VsZCBkbyB0aGlzIHN0ZXAgaWYgeW91ciBidWdmaXggaXMgY3JpdGljYWwgZm9yIHRoZQorICBkZXZlbG9wbWVudCBpbiAibWFzdGVyIiwgb3IgaWYgeW91IHN1c3BlY3QgdGhhdCBjb25mbGljdHMgd2lsbCBhcmlzZQorICAoeW91J3JlIHVzdWFsbHkgdGhlIGJlc3QgcGVyc29uIHRvIHJlc29sdmUgY29uZmxpY3RzIGludHJvZHVjZWQgYnkKKyAgeW91ciBvd24gY29kZSksIG9yIGlmIGl0IGhhcyBiZWVuIHRvbyBsb25nIHNpbmNlIHRoZSBsYXN0IG1lcmdlLgorCisKK01ha2luZyBhIHJlbGVhc2UKKz09PQorCitUbyBtYWtlIGEgcmVsZWFzZSBvZiBELUJ1cywgZG8gdGhlIGZvbGxvd2luZzoKKworIC0gY2hlY2sgb3V0IGEgZnJlc2ggY29weSBmcm9tIEdpdAorCisgLSB2ZXJpZnkgdGhhdCB0aGUgbGlidG9vbCB2ZXJzaW9uaW5nL2xpYnJhcnkgc29uYW1lIGlzIAorICAgY2hhbmdlZCBpZiBpdCBuZWVkcyB0byBiZSwgb3Igbm90IGNoYW5nZWQgaWYgbm90CisKKyAtIHVwZGF0ZSB0aGUgZmlsZSBORVdTIGJhc2VkIG9uIHRoZSBnaXQgaGlzdG9yeQorCisgLSB1cGRhdGUgdGhlIEFVVEhPUlMgZmlsZSB3aXRoICJtYWtlIHVwZGF0ZS1hdXRob3JzIiBpZiBuZWNlc3NhcnkKKworIC0gdGhlIHZlcnNpb24gbnVtYmVyIHNob3VsZCBoYXZlIG1ham9yLm1pbm9yLm1pY3JvLCBldmVuCisgICBpZiBtaWNybyBpcyAwLCBpLmUuICIxLjAuMCIgYW5kICIxLjIuMCIgbm90ICIxLjAiLyIxLjIiOyB0aGUgbWljcm8KKyAgIHZlcnNpb24gc2hvdWxkIGJlIGV2ZW4gZm9yIHJlbGVhc2VzLCBhbmQgb2RkIGZvciBpbnRlcm1lZGlhdGUgc25hcHNob3RzCisKKyAtICJtYWtlIGRpc3RjaGVjayIgKERPIE5PVCBqdXN0ICJtYWtlIGRpc3QiIC0gcGFzcyB0aGUgY2hlY2shKQorCisgLSBpZiBtYWtlIGRpc3RjaGVjayBmYWlscywgZml4IGl0LgorCisgLSBvbmNlIGRpc3RjaGVjayBzdWNjZWVkcywgImdpdCBjb21taXQgLWEiLiAgVGhpcyBpcyB0aGUgdmVyc2lvbgorICAgb2YgdGhlIHRyZWUgdGhhdCBjb3JyZXNwb25kcyBleGFjdGx5IHRvIHRoZSByZWxlYXNlZCB0YXJiYWxsLgorCisgLSB0YWcgdGhlIHRyZWUgd2l0aCAiZ2l0IHRhZyAtcyAtbSAnUmVsZWFzZWQgWC5ZLlonIGRidXMtWC5ZLloiCisgICB3aGVyZSBYLlkuWiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgcmVsZWFzZS4gIElmIHlvdSBjYW4ndCBzaWduCisgICB0aGVuIHNpbXBseSBjcmVhdGVkIGFuIHVuc2lnbmVkIGFubm90YXRlZCB0YWc6CisgICAiZ2l0IHRhZyAtYSAtbSAnUmVsZWFzZWQgWC5ZLlonIGRidXMtWC5ZLloiLgorCisgLSBidW1wIHRoZSB2ZXJzaW9uIG51bWJlciB1cCBpbiBjb25maWd1cmUuYWMgKHNvIHRoZSBtaWNybyB2ZXJzaW9uIGlzIG9kZCksCisgICBhbmQgY29tbWl0IGl0LiAgTWFrZSBzdXJlIHlvdSBkbyB0aGlzICphZnRlciogdGFnZ2luZyB0aGUgcHJldmlvdXMKKyAgIHJlbGVhc2UhIFRoZSBpZGVhIGlzIHRoYXQgZ2l0IGhhcyBhIG5ld2VyIHZlcnNpb24gbnVtYmVyCisgICB0aGFuIGFueXRoaW5nIHJlbGVhc2VkLgorCisgLSBtZXJnZSB0aGUgYnJhbmNoIHlvdSd2ZSByZWxlYXNlZCB0byB0aGUgY2hyb25vbG9naWNhbGx5LWxhdGVyCisgICBicmFuY2ggKHVzdWFsbHkgIm1hc3RlciIpLiBZb3UnbGwgcHJvYmFibHkgaGF2ZSB0byBmaXggYSBtZXJnZQorICAgY29uZmxpY3QgaW4gY29uZmlndXJlLmFjICh0aGUgdmVyc2lvbiBudW1iZXIpLgorCisgLSBwdXNoIHlvdXIgY2hhbmdlcyBhbmQgdGhlIHRhZyB0byB0aGUgY2VudHJhbCByZXBvc2l0b3J5IHdpdGgKKyAgICAgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlciBkYnVzLVguWSBkYnVzLVguWS5aCisKKyAtIHNjcCB5b3VyIHRhcmJhbGwgdG8gZnJlZWRlc2t0b3Aub3JnIHNlcnZlciBhbmQgY29weSBpdCB0bworICAgZGJ1cy5mcmVlZGVza3RvcC5vcmc6L3Nydi9kYnVzLmZyZWVkZXNrdG9wLm9yZy93d3cvcmVsZWFzZXMvZGJ1cy9kYnVzLVguWS5aLnRhci5nei4KKyAgIFRoaXMgc2hvdWxkIGJlIHBvc3NpYmxlIGlmIHlvdSdyZSBpbiBncm91cCAiZGJ1cyIKKworIC0gVXBkYXRlIHRoZSBvbmxpbmUgZG9jdW1lbnRhdGlvbiB3aXRoIGBtYWtlIC1DIGRvYyBtYWludGFpbmVyLXVwbG9hZC1kb2NzYC4KKworIC0gdXBkYXRlIHRoZSB3aWtpIHBhZ2UgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvU29mdHdhcmUvZGJ1cyBieQorICAgYWRkaW5nIHRoZSBuZXcgcmVsZWFzZSB1bmRlciB0aGUgRG93bmxvYWQgaGVhZGluZy4gVGhlbiwgY3V0IHRoZQorICAgbGluayBhbmQgY2hhbmdlbG9nIGZvciB0aGUgcHJldmlvdXMgdGhhdCB3YXMgdGhlcmUuCisKKyAtIHVwZGF0ZSB0aGUgd2lraSBwYWdlCisgICBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9Tb2Z0d2FyZS9EYnVzUmVsZWFzZUFyY2hpdmUgcGFzdGluZyB0aGUKKyAgIHByZXZpb3VzIHJlbGVhc2UuIE5vdGUgdGhhdCBidWxsZXQgcG9pbnRzIGZvciBlYWNoIG9mIHRoZSBjaGFuZ2Vsb2cKKyAgIGl0ZW1zIG11c3QgYmUgaW5kZW50ZWQgdGhyZWUgbW9yZSBzcGFjZXMgdG8gY29uZm9ybSB0byB0aGUKKyAgIGZvcm1hdHRpbmcgb2YgdGhlIG90aGVyIHJlbGVhc2VzIHRoZXJlLgorICAKKyAtIHBvc3QgdG8gZGJ1c0BsaXN0cy5mcmVlZGVza3RvcC5vcmcgYW5ub3VuY2luZyB0aGUgcmVsZWFzZS4KKyAKKworQWZ0ZXIgbWFraW5nIGEgIi4wIiBzdGFibGUgcmVsZWFzZQorPT09CisKK1dlIGNyZWF0ZSBhIGJyYW5jaCBmb3IgZWFjaCBzdGFibGUgcmVsZWFzZTsgc29tZXRpbWVzIHRoZSBicmFuY2ggaXMKK25vdCBkb25lIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIGl0J3MgcG9zc2libGUgdG8gd2FpdCB1bnRpbCBzb21lb25lIGhhcworYSBub3Qtc3VpdGFibGUtZm9yLXN0YWJsZSBjaGFuZ2UgdGhleSB3YW50IHRvIG1ha2UgYW5kIHRoZW4gYnJhbmNoIHRvCithbGxvdyBjb21taXR0aW5nIHRoYXQgY2hhbmdlLgorCitUaGUgYnJhbmNoIG5hbWUgc2hvdWxkIGJlIGRidXMtWC5ZIHdoaWNoIGlzIGEgYnJhbmNoIHRoYXQgaGFzCityZWxlYXNlcyB2ZXJzaW9uZWQgWC5ZLloKKworVG8gYnJhbmNoOgorICBnaXQgYnJhbmNoIGRidXMtWC5ZCithbmQgdXBsb2FkIHRoZSBicmFuY2ggdGFnIHRvIHRoZSBzZXJ2ZXI6CisgIGdpdCBwdXNoIG9yaWdpbiBkYnVzLVguWQorCitUbyBkZXZlbG9wIGluIHRoaXMgYnJhbmNoOgorICBnaXQgY2hlY2tvdXQgZGJ1cy1YLlkKKworRW52aXJvbm1lbnQgdmFyaWFibGVzCis9PT0KKworVGhlc2UgYXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkKKworREJVU19WRVJCT1NFPTEKK1R1cm5zIG9uIHByaW50aW5nIHZlcmJvc2UgbWVzc2FnZXMuIFRoaXMgb25seSB3b3JrcyBpZiBELUJ1cyBoYXMgYmVlbgorY29tcGlsZWQgd2l0aCAtLWVuYWJsZS12ZXJib3NlLW1vZGUKKworREJVU19NQUxMT0NfRkFJTF9OVEg9bgorQ2FuIGJlIHNldCB0byBhIG51bWJlciwgY2F1c2luZyBldmVyeSBudGggY2FsbCB0byBkYnVzX2FsbG9jIG9yCitkYnVzX3JlYWxsb2MgdG8gZmFpbC4gVGhpcyBvbmx5IHdvcmtzIGlmIEQtQnVzIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGgKKy0tZW5hYmxlLXRlc3RzLgorCitEQlVTX01BTExPQ19GQUlMX0dSRUFURVJfVEhBTj1uCitDYW4gYmUgc2V0IHRvIGEgbnVtYmVyLCBjYXVzaW5nIGV2ZXJ5IGNhbGwgdG8gZGJ1c19hbGxvYyBvcgorZGJ1c19yZWFsbG9jIHRvIGZhaWwgaWYgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBhbGxvY2F0ZWQgaXMgZ3JlYXRlcgordGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlci4gVGhpcyBvbmx5IHdvcmtzIGlmIEQtQnVzIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGgKKy0tZW5hYmxlLXRlc3RzLgorCitEQlVTX1RFU1RfTUFMTE9DX0ZBSUxVUkVTPW4KK01hbnkgb2YgdGhlIEQtQnVzIHRlc3RzIHdpbGwgcnVuIG92ZXIgYW5kIG92ZXIsIG9uY2UgZm9yIGVhY2ggbWFsbG9jCitpbnZvbHZlZCBpbiB0aGUgdGVzdC4gRWFjaCBydW4gd2lsbCBmYWlsIGEgZGlmZmVyZW50IG1hbGxvYywgcGx1cyBzb21lCitudW1iZXIgb2YgbWFsbG9jcyBmb2xsb3dpbmcgdGhhdCBtYWxsb2MgKGJlY2F1c2UgYSBmYWlyIG51bWJlciBvZiBidWdzCitvbmx5IGhhcHBlbiBpZiB0d28gb3IgbW9yZSBtYWxsb2NzIGZhaWwgaW4gYSByb3csIGUuZy4gZXJyb3IgcmVjb3ZlcnkKK3RoYXQgaXRzZWxmIGludm9sdmVzIG1hbGxvYykuICBUaGlzIGVudiB2YXJpYWJsZSBzZXRzIHRoZSBudW1iZXIgb2YKK21hbGxvY3MgdG8gZmFpbC4KK0hlcmUncyB3aHkgeW91IGNhcmU6IElmIHNldCB0byAwLCB0aGVuIHRoZSBtYWxsb2MgY2hlY2tpbmcgaXMgc2tpcHBlZCwKK3doaWNoIG1ha2VzIHRoZSB0ZXN0IHN1aXRlIGEgaGVjayBvZiBhIGxvdCBmYXN0ZXIuIEp1c3QgcnVuIHdpdGggdGhpcworZW52IHZhcmlhYmxlIHVuc2V0IGJlZm9yZSB5b3UgY29tbWl0LgorCitUZXN0cworPT09CisKK1RoZXNlIGFyZSB0aGUgdGVzdCBwcm9ncmFtcyB0aGF0IGFyZSBidWlsdCBpZiBkYnVzIGlzIGNvbXBpbGVkIHVzaW5nCistLWVuYWJsZS10ZXN0cy4KKworZGJ1cy9kYnVzLXRlc3QKK1RoaXMgaXMgdGhlIG1haW4gdW5pdCB0ZXN0IHByb2dyYW0gdGhhdCB0ZXN0cyBhbGwgYXNwZWN0cyBvZiB0aGUgRC1CdXMKK2NsaWVudCBsaWJyYXJ5LgorCitkYnVzL2J1cy10ZXN0CitUaGlzIGl0IHRoZSB1bml0IHRlc3QgcHJvZ3JhbSBmb3IgdGhlIG1lc3NhZ2UgYnVzLgorCit0ZXN0L2JyZWFrLWxvYWRlcgorQSB0ZXN0IHRoYXQgdHJpZXMgdG8gYnJlYWsgdGhlIG1lc3NhZ2UgbG9hZGVyIGJ5IHBhc3NpbmcgaXQgcmFuZG9tbHkKK2NyZWF0ZWQgaW52YWxpZCBtZXNzYWdlcy4KKwordGVzdC9uYW1lLXRlc3QvKgorVGhpcyBpcyBhIHN1aXRlIG9mIHByb2dyYW1zIHdoaWNoIGFyZSBydW4gd2l0aCBhIHRlbXBvcmFyeSBzZXNzaW9uIGJ1cy4KK0lmIHlvdXIgdGVzdCBpbnZvbHZlcyBtdWx0aXBsZSBwcm9jZXNzZXMgY29tbXVuaWNhdGluZywgeW91ciBiZXN0IGJldAoraXMgdG8gYWRkIGEgdGVzdCBpbiBoZXJlLgorCisibWFrZSBjaGVjayIgcnVucyBhbGwgdGhlIGRldGVybWluaXN0aWMgdGVzdCBwcm9ncmFtcyAoaS5lLiBub3QgYnJlYWstbG9hZGVyKS4KKworIm1ha2UgbGNvdi1jaGVjayIgaXMgYXZhaWxhYmxlIGlmIHlvdSBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1jb21waWxlci1jb3ZlcmFnZQorYW5kIGdpdmVzIGEgY29tcGxldGUgcmVwb3J0IG9uIHRlc3Qgc3VpdGUgY292ZXJhZ2UuCisKK1BhdGNoZXMKKz09PQorCitQbGVhc2UgZmlsZSB0aGVtIGF0IGh0dHA6Ly9idWd6aWxsYS5mcmVlZGVza3RvcC5vcmcgdW5kZXIgY29tcG9uZW50CitkYnVzLCBhbmQgYWxzbyBwb3N0IHRvIHRoZSBtYWlsaW5nIGxpc3QgZm9yIGRpc2N1c3Npb24uICBUaGUgY29tbWl0CitydWxlcyBhcmU6CisKKyAtIGZvciBmaXhlcyB0aGF0IGRvbid0IGFmZmVjdCBBUEkgb3IgcHJvdG9jb2wsIHRoZXkgY2FuIGJlIGNvbW1pdHRlZAorICAgaWYgYW55IG9uZSBxdWFsaWZpZWQgcmV2aWV3ZXIgb3RoZXIgdGhhbiBwYXRjaCBhdXRob3IKKyAgIHJldmlld3MgYW5kIGFwcHJvdmVzCisKKyAtIGZvciBmaXhlcyB0aGF0IGRvIGFmZmVjdCBBUEkgb3IgcHJvdG9jb2wsIHR3byBwZW9wbGUKKyAgIGluIHRoZSByZXZpZXdlciBncm91cCBoYXZlIHRvIHJldmlldyBhbmQgYXBwcm92ZSB0aGUgY29tbWl0LCBhbmQgCisgICBwb3N0aW5nIHRvIHRoZSBsaXN0IGlzIGRlZmluaXRlbHkgbWFuZGF0b3J5CisKKyAtIGlmIHRoZXJlJ3MgYSBsaXZlIHVucmVzb2x2ZWQgY29udHJvdmVyc3kgYWJvdXQgYSBjaGFuZ2UsCisgICBkb24ndCBjb21taXQgaXQgd2hpbGUgdGhlIGFyZ3VtZW50IGlzIHN0aWxsIHJhZ2luZy4KKworIC0gYXQgdGhlaXIgZGlzY3JldGlvbiwgbWVtYmVycyBvZiB0aGUgcmV2aWV3ZXIgZ3JvdXAgbWF5IGFsc28gY29tbWl0CisgICBicmFuY2hlcy9wYXRjaGVzIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgIC0gdGhlIGJyYW5jaCBkb2VzIG5vdCBhZGQgb3IgY2hhbmdlIEFQSSwgQUJJIG9yIHdpcmUtcHJvdG9jb2wKKworICAgLSB0aGUgYnJhbmNoIHNvbHZlcyBhIGtub3duIHByb2JsZW0gYW5kIGlzIGNvdmVyZWQgYnkgdGhlIHJlZ3Jlc3Npb24gdGVzdHMKKworICAgLSB0aGVyZSBhcmUgbm8gb2JqZWN0aW9ucyBmcm9tIHRoZSByZXN0IG9mIHRoZSByZXZpZXcgZ3JvdXAgd2l0aGluCisgICAgIGEgd2VlayBvZiB0aGUgcGF0Y2hlcyBiZWluZyBhdHRhY2hlZCB0byBCdWd6aWxsYQorCisgICAtIHRoZSBjb21taXR0ZXIgZ2V0cyBhIHBvc2l0aXZlIHJldmlldyBvbiBCdWd6aWxsYSBmcm9tIHNvbWVvbmUgdGhleQorICAgICBjb25zaWRlciBxdWFsaWZpZWQgdG8gcmV2aWV3IHRoZSBjaGFuZ2UgKGUuZy4gYSBjb2xsZWFndWUgd2l0aCBELUJ1cworICAgICBleHBlcmllbmNlOyBub3QgbmVjZXNzYXJpbHkgYSBtZW1iZXIgb2YgdGhlIHJldmlld2VyIGdyb3VwKQorCisgLSByZWdhcmRsZXNzIG9mIHJldmlld3MsIHRvIGNvbW1pdCBhIHBhdGNoOgorICAgIC0gbWFrZSBjaGVjayBtdXN0IHBhc3MKKyAgICAtIHRoZSB0ZXN0IHN1aXRlIG11c3QgYmUgZXh0ZW5kZWQgdG8gY292ZXIgdGhlIG5ldyBjb2RlCisgICAgICBhcyBtdWNoIGFzIHJlYXNvbmFibHkgZmVhc2libGUgKHNlZSBUZXN0cyBhYm92ZSkKKyAgICAtIHRoZSBwYXRjaCBoYXMgdG8gZm9sbG93IHRoZSBwb3J0YWJpbGl0eSwgc2VjdXJpdHksIGFuZCAKKyAgICAgIHN0eWxlIGd1aWRlbGluZXMKKyAgICAtIHRoZSBwYXRjaCBzaG91bGQgYXMgbXVjaCBhcyByZWFzb25hYmxlIGRvIG9uZSB0aGluZywgCisgICAgICBub3QgbWFueSB1bnJlbGF0ZWQgY2hhbmdlcworICAgTm8gcmV2aWV3ZXIgc2hvdWxkIGFwcHJvdmUgYSBwYXRjaCB3aXRob3V0IHRoZXNlIGF0dHJpYnV0ZXMsIGFuZAorICAgZmFpbHVyZSBvbiB0aGVzZSBwb2ludHMgaXMgZ3JvdW5kcyBmb3IgcmV2ZXJ0aW5nIHRoZSBwYXRjaC4KKworVGhlIHJldmlld2VyIGdyb3VwIHRoYXQgY2FuIGFwcHJvdmUgcGF0Y2hlczoKKworSGF2b2MgUGVubmluZ3RvbiA8aHBAcG9ib3gubmV0PgorTWljaGFlbCBNZWVrcyA8bWljaGFlbC5tZWVrc0Bub3ZlbGwuY29tPgorQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgorSm9lIFNoYXcgPGpvZUBhc3NiYXJuLmNvbT4KK01pa2FlbCBIYWxsZW5kYWwgPG1pY2tlQGltZW5kaW8uY29tPgorUmljaGFyZCBIdWx0IDxyaWNoYXJkQGltZW5kaW8uY29tPgorT3dlbiBGcmFzZXItR3JlZW4gPG93ZW5AZGlzY29iYWJlLm5ldD4KK09saXZpZXIgQW5kcmlldSA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CitUaGlhZ28gTWFjaWVpcmEgPHRoaWFnb0BrZGUub3JnPgorSm9obiBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KK1dpbGwgVGhvbXBzb24gPHdpbGwudGhvbXBzb25AY29sbGFib3JhLmNvLnVrPgorU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KK0RhdmlkIFpldXRoZW4gPGRhdmlkekByZWRoYXQuY29tPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvSU5TVEFMTCBiL2RidXMtMS40LjEwL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4MmY5OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL0lOU1RBTEwKQEAgLTAsMCArMSwyNTIgQEAKKyAgICAgICAgICAgREJ1cyBJbnN0YWxsYXRpb24KKyAgICAgICAgICAgPT09PT09PT09PT09PT09PT0KKworUXVpY2sgc3RhcnQKKz09PT09PT09PT09CisKK0RCdXMgY291bGQgYmUgYnVpbGQgd2l0aCBHTlUgQXV0b1Rvb2xzIG9yIHdpdGggY21ha2UgZm9yIGl0cyBidWlsZCBzeXN0ZW0sCit0aHVzIHRoZSBiYXNpYyBpbnN0YWxsIHByb2NlZHVyZSBjYW4gYmUgc3VtbWFyaXplZCBhczoKKword2l0aCBhdXRvdG9vbHM6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisgICAgbWFrZQorICAgIHN1IG1ha2UgaW5zdGFsbAorCitUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdHJ5IGFuZAorYnVpbGQgYmluZGluZ3MgZm9yIEdMaWIsIFF0LCBRdDMsIFB5dGhvbiBhbmQgTW9ubyBiYXNlZCBvbiB3aGF0IHRvb2xzCithcmUgaW5zdGFsbGVkIG9uIHRoZSBob3N0IHN5c3RlbS4gVGhlIGRlZmF1bHQgYnVpbGQgYmVoYXZpb3VyIGNhbiBiZQorb3ZlcnJpZGRlbiB1c2luZyB0aGUgLS1lbmFibGUtWFhYLy0tZGlzYWJsZS1YWFggYXJndW1lbnRzIHRvIGNvbmZpZ3VyZS4KK0EgdHlwaWNhbCBzY2VuYXJpbyBpbiB3aGljaCBpdCBpcyBkZXNpcmFibGUgdG8gb3ZlcnJpZGUgYXV0b21hdGljCitkZXRlY3Rpb24sIGlzIGR1cmluZyBwYWNrYWdpbmcgb2YgYmluYXJ5IGJ1aWxkcywgd2hlcmUgYSBwcmVkaWN0YWJsZQorZGVwZW5kYW5jeSBjaGFpbiBpcyByZXF1aXJlZC4gRm9yIG1vcmUgZGV0YWlscyBvbiBHTlUgQXV0b1Rvb2xzCitpbnN0YWxsYXRpb24sIGNvbnN1bHQgdGhlIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQKKword2l0aCBjbWFrZToKKyAgICBta2RpciBkYnVzLWJ1aWxkLWRpcgorICAgIGNkIGRidXMtYnVpbGQtZGlyCisgICAgY21ha2UgLUcgPG1ha2VmaWxlLWdlbmVyYXRvci1uYW1lPiBbLUQ8b3B0aW9uPl0gPGRidXMtc3JjLXJvb3Q+L2NtYWtlCisgICAgbWFrZQorICAgIG1ha2UgaW5zdGFsbAorCitjbWFrZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gYnVpbGQgc29tZSBmZWF0dXJlcworYmFzZWQgb24gd2hhdCB0b29scyBhbmQvb3IgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgb24gdGhlIGhvc3Qgc3lzdGVtLiAKK1RoZSBkZWZhdWx0IGJ1aWxkIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgCistREVOQUJMRV88WFhYPiBhcmd1bWVudHMgdG8gY21ha2UuCitBIHR5cGljYWwgc2NlbmFyaW8gaW4gd2hpY2ggaXQgaXMgZGVzaXJhYmxlIHRvIG92ZXJyaWRlIGF1dG9tYXRpYworZGV0ZWN0aW9uLCBpcyBkdXJpbmcgcGFja2FnaW5nIG9mIGJpbmFyeSBidWlsZHMsIHdoZXJlIGEgcHJlZGljdGFibGUKK2RlcGVuZGFuY3kgY2hhaW4gaXMgcmVxdWlyZWQuIEZvciBtb3JlIGRldGFpbHMgb24gY21ha2UgaW5zdGFsbGF0aW9uLCAKK2NvbnN1bHQgaHR0cDovL3d3dy5jbWFrZS5vcmcvY21ha2UvaGVscC9oZWxwLmh0bWwuIAorCitFeHRlcm5hbCBzb2Z0d2FyZSBkZXBlbmRhbmNpZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgb25seSBmdW5kYW1lbnRhbCByZXF1aXJlbWVudCB0byBidWlsZCBEQnVzIGlzIGFuIFhNTCBwYXJzZXIsCitob3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgc29mdHdhcmUgcGFja2FnZXMgd2hpY2ggKGlmCitwcmVzZW50KSB3aWxsIGVuaGFuY2UgZnVuY3Rpb25hbGl0eS4KKworQ29yZSBsaWJyYXJ5CistLS0tLS0tLS0tLS0KKworIFJlcXVpc2l0ZToKKworICAtIEdldHRleHQKKyAgLSBleHBhdCBvciBsaWJ4bWwtMgorCisgTkIsIGV4cGF0IGlzIHRoZSByZWNvbW1lbmRlZCBYTUwgcGFyc2VyIGJlY2F1c2UgaXQgaGFzIG1vcmUgcm9idXN0CisgaGFuZGxpbmcgb2YgT09NIGNvbmRpdGlvbnMuCisKKyBPcHRpb25hbDoKKworICAtIGxpYnNlbGludXggICAgICAgICAgIChmb3IgU0VMaW51eCBpbnRlZ3JhdGlvbikKKyAgLSBkbm90aWZ5ICAgICAgICAgICAgICAoZm9yIGF1dG9tYXRpYyBzZXJ2aWNlIGZpbGUgcmVsb2FkKQorICAtIGRveHlnZW4gICAgICAgICAgICAgIChmb3IgQVBJIGRvY3VtZW50YXRpb24pCisgIC0geG1sdG8gb3IgbWVpbnByb2M0ICAgKGZvciBTcGVjICYgb3RoZXIgWE1MIGRvY3VtZW50YXRpb24pCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQgY29udGFpbnMgdGhlIGdlbmVyaWMgR05VIEF1dG9Ub29scyBpbnN0YWxsCitpbnNydWN0aW9ucy4uLi4KKworQmFzaWMgSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT09PT09PT0KKworICAgVGhlc2UgYXJlIGdlbmVyaWMgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KKworICAgVGhlIGBjb25maWd1cmUnIHNoZWxsIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBjb3JyZWN0IHZhbHVlcyBmb3IKK3ZhcmlvdXMgc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uICBJdCB1c2VzCit0aG9zZSB2YWx1ZXMgdG8gY3JlYXRlIGEgYE1ha2VmaWxlJyBpbiBlYWNoIGRpcmVjdG9yeSBvZiB0aGUgcGFja2FnZS4KK0l0IG1heSBhbHNvIGNyZWF0ZSBvbmUgb3IgbW9yZSBgLmgnIGZpbGVzIGNvbnRhaW5pbmcgc3lzdGVtLWRlcGVuZGVudAorZGVmaW5pdGlvbnMuICBGaW5hbGx5LCBpdCBjcmVhdGVzIGEgc2hlbGwgc2NyaXB0IGBjb25maWcuc3RhdHVzJyB0aGF0Cit5b3UgY2FuIHJ1biBpbiB0aGUgZnV0dXJlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIGEgZmlsZQorYGNvbmZpZy5jYWNoZScgdGhhdCBzYXZlcyB0aGUgcmVzdWx0cyBvZiBpdHMgdGVzdHMgdG8gc3BlZWQgdXAKK3JlY29uZmlndXJpbmcsIGFuZCBhIGZpbGUgYGNvbmZpZy5sb2cnIGNvbnRhaW5pbmcgY29tcGlsZXIgb3V0cHV0CisodXNlZnVsIG1haW5seSBmb3IgZGVidWdnaW5nIGBjb25maWd1cmUnKS4KKworICAgSWYgeW91IG5lZWQgdG8gZG8gdW51c3VhbCB0aGluZ3MgdG8gY29tcGlsZSB0aGUgcGFja2FnZSwgcGxlYXNlIHRyeQordG8gZmlndXJlIG91dCBob3cgYGNvbmZpZ3VyZScgY291bGQgY2hlY2sgd2hldGhlciB0byBkbyB0aGVtLCBhbmQgbWFpbAorZGlmZnMgb3IgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBhZGRyZXNzIGdpdmVuIGluIHRoZSBgUkVBRE1FJyBzbyB0aGV5IGNhbgorYmUgY29uc2lkZXJlZCBmb3IgdGhlIG5leHQgcmVsZWFzZS4gIElmIGF0IHNvbWUgcG9pbnQgYGNvbmZpZy5jYWNoZScKK2NvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKworICAgVGhlIGZpbGUgYGNvbmZpZ3VyZS5pbicgaXMgdXNlZCB0byBjcmVhdGUgYGNvbmZpZ3VyZScgYnkgYSBwcm9ncmFtCitjYWxsZWQgYGF1dG9jb25mJy4gIFlvdSBvbmx5IG5lZWQgYGNvbmZpZ3VyZS5pbicgaWYgeW91IHdhbnQgdG8gY2hhbmdlCitpdCBvciByZWdlbmVyYXRlIGBjb25maWd1cmUnIHVzaW5nIGEgbmV3ZXIgdmVyc2lvbiBvZiBgYXV0b2NvbmYnLgorCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGNvbXBpbGUgdGhpcyBwYWNrYWdlIGlzOgorCisgIDEuIGBjZCcgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgYW5kIHR5cGUKKyAgICAgYC4vY29uZmlndXJlJyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UgZm9yIHlvdXIgc3lzdGVtLiAgSWYgeW91J3JlCisgICAgIHVzaW5nIGBjc2gnIG9uIGFuIG9sZCB2ZXJzaW9uIG9mIFN5c3RlbSBWLCB5b3UgbWlnaHQgbmVlZCB0byB0eXBlCisgICAgIGBzaCAuL2NvbmZpZ3VyZScgaW5zdGVhZCB0byBwcmV2ZW50IGBjc2gnIGZyb20gdHJ5aW5nIHRvIGV4ZWN1dGUKKyAgICAgYGNvbmZpZ3VyZScgaXRzZWxmLgorCisgICAgIFJ1bm5pbmcgYGNvbmZpZ3VyZScgdGFrZXMgYXdoaWxlLiAgV2hpbGUgcnVubmluZywgaXQgcHJpbnRzIHNvbWUKKyAgICAgbWVzc2FnZXMgdGVsbGluZyB3aGljaCBmZWF0dXJlcyBpdCBpcyBjaGVja2luZyBmb3IuCisKKyAgMi4gVHlwZSBgbWFrZScgdG8gY29tcGlsZSB0aGUgcGFja2FnZS4KKworICAzLiBPcHRpb25hbGx5LCB0eXBlIGBtYWtlIGNoZWNrJyB0byBydW4gYW55IHNlbGYtdGVzdHMgdGhhdCBjb21lIHdpdGgKKyAgICAgdGhlIHBhY2thZ2UuCisKKyAgNC4gVHlwZSBgbWFrZSBpbnN0YWxsJyB0byBpbnN0YWxsIHRoZSBwcm9ncmFtcyBhbmQgYW55IGRhdGEgZmlsZXMgYW5kCisgICAgIGRvY3VtZW50YXRpb24uCisKKyAgNS4gWW91IGNhbiByZW1vdmUgdGhlIHByb2dyYW0gYmluYXJpZXMgYW5kIG9iamVjdCBmaWxlcyBmcm9tIHRoZQorICAgICBzb3VyY2UgY29kZSBkaXJlY3RvcnkgYnkgdHlwaW5nIGBtYWtlIGNsZWFuJy4gIFRvIGFsc28gcmVtb3ZlIHRoZQorICAgICBmaWxlcyB0aGF0IGBjb25maWd1cmUnIGNyZWF0ZWQgKHNvIHlvdSBjYW4gY29tcGlsZSB0aGUgcGFja2FnZSBmb3IKKyAgICAgYSBkaWZmZXJlbnQga2luZCBvZiBjb21wdXRlciksIHR5cGUgYG1ha2UgZGlzdGNsZWFuJy4gIFRoZXJlIGlzCisgICAgIGFsc28gYSBgbWFrZSBtYWludGFpbmVyLWNsZWFuJyB0YXJnZXQsIGJ1dCB0aGF0IGlzIGludGVuZGVkIG1haW5seQorICAgICBmb3IgdGhlIHBhY2thZ2UncyBkZXZlbG9wZXJzLiAgSWYgeW91IHVzZSBpdCwgeW91IG1heSBoYXZlIHRvIGdldAorICAgICBhbGwgc29ydHMgb2Ygb3RoZXIgcHJvZ3JhbXMgaW4gb3JkZXIgdG8gcmVnZW5lcmF0ZSBmaWxlcyB0aGF0IGNhbWUKKyAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCitDb21waWxlcnMgYW5kIE9wdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PQorCisgICBTb21lIHN5c3RlbXMgcmVxdWlyZSB1bnVzdWFsIG9wdGlvbnMgZm9yIGNvbXBpbGF0aW9uIG9yIGxpbmtpbmcgdGhhdAordGhlIGBjb25maWd1cmUnIHNjcmlwdCBkb2VzIG5vdCBrbm93IGFib3V0LiAgWW91IGNhbiBnaXZlIGBjb25maWd1cmUnCitpbml0aWFsIHZhbHVlcyBmb3IgdmFyaWFibGVzIGJ5IHNldHRpbmcgdGhlbSBpbiB0aGUgZW52aXJvbm1lbnQuICBVc2luZworYSBCb3VybmUtY29tcGF0aWJsZSBzaGVsbCwgeW91IGNhbiBkbyB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUgbGlrZQordGhpczoKKyAgICAgQ0M9Yzg5IENGTEFHUz0tTzIgTElCUz0tbHBvc2l4IC4vY29uZmlndXJlCisKK09yIG9uIHN5c3RlbXMgdGhhdCBoYXZlIHRoZSBgZW52JyBwcm9ncmFtLCB5b3UgY2FuIGRvIGl0IGxpa2UgdGhpczoKKyAgICAgZW52IENQUEZMQUdTPS1JL3Vzci9sb2NhbC9pbmNsdWRlIExERkxBR1M9LXMgLi9jb25maWd1cmUKKworQ29tcGlsaW5nIEZvciBNdWx0aXBsZSBBcmNoaXRlY3R1cmVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgWW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvciBtb3JlIHRoYW4gb25lIGtpbmQgb2YgY29tcHV0ZXIgYXQgdGhlCitzYW1lIHRpbWUsIGJ5IHBsYWNpbmcgdGhlIG9iamVjdCBmaWxlcyBmb3IgZWFjaCBhcmNoaXRlY3R1cmUgaW4gdGhlaXIKK293biBkaXJlY3RvcnkuICBUbyBkbyB0aGlzLCB5b3UgbXVzdCB1c2UgYSB2ZXJzaW9uIG9mIGBtYWtlJyB0aGF0CitzdXBwb3J0cyB0aGUgYFZQQVRIJyB2YXJpYWJsZSwgc3VjaCBhcyBHTlUgYG1ha2UnLiAgYGNkJyB0byB0aGUKK2RpcmVjdG9yeSB3aGVyZSB5b3Ugd2FudCB0aGUgb2JqZWN0IGZpbGVzIGFuZCBleGVjdXRhYmxlcyB0byBnbyBhbmQgcnVuCit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgYGNvbmZpZ3VyZScgYXV0b21hdGljYWxseSBjaGVja3MgZm9yIHRoZQorc291cmNlIGNvZGUgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGBjb25maWd1cmUnIGlzIGluIGFuZCBpbiBgLi4nLgorCisgICBJZiB5b3UgaGF2ZSB0byB1c2UgYSBgbWFrZScgdGhhdCBkb2VzIG5vdCBzdXBwb3J0cyB0aGUgYFZQQVRIJwordmFyaWFibGUsIHlvdSBoYXZlIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG9uZSBhcmNoaXRlY3R1cmUgYXQgYSB0aW1lCitpbiB0aGUgc291cmNlIGNvZGUgZGlyZWN0b3J5LiAgQWZ0ZXIgeW91IGhhdmUgaW5zdGFsbGVkIHRoZSBwYWNrYWdlIGZvcgorb25lIGFyY2hpdGVjdHVyZSwgdXNlIGBtYWtlIGRpc3RjbGVhbicgYmVmb3JlIHJlY29uZmlndXJpbmcgZm9yIGFub3RoZXIKK2FyY2hpdGVjdHVyZS4KKworSW5zdGFsbGF0aW9uIE5hbWVzCis9PT09PT09PT09PT09PT09PT0KKworICAgQnkgZGVmYXVsdCwgYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIHRoZSBwYWNrYWdlJ3MgZmlsZXMgaW4KK2AvdXNyL2xvY2FsL2JpbicsIGAvdXNyL2xvY2FsL21hbicsIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeSBhbgoraW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIGAvdXNyL2xvY2FsJyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCitvcHRpb24gYC0tcHJlZml4PVBBVEgnLgorCisgICBZb3UgY2FuIHNwZWNpZnkgc2VwYXJhdGUgaW5zdGFsbGF0aW9uIHByZWZpeGVzIGZvcgorYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZpbGVzIGFuZCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMuICBJZiB5b3UKK2dpdmUgYGNvbmZpZ3VyZScgdGhlIG9wdGlvbiBgLS1leGVjLXByZWZpeD1QQVRIJywgdGhlIHBhY2thZ2Ugd2lsbCB1c2UKK1BBVEggYXMgdGhlIHByZWZpeCBmb3IgaW5zdGFsbGluZyBwcm9ncmFtcyBhbmQgbGlicmFyaWVzLgorRG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZGF0YSBmaWxlcyB3aWxsIHN0aWxsIHVzZSB0aGUgcmVndWxhciBwcmVmaXguCisKKyAgIEluIGFkZGl0aW9uLCBpZiB5b3UgdXNlIGFuIHVudXN1YWwgZGlyZWN0b3J5IGxheW91dCB5b3UgY2FuIGdpdmUKK29wdGlvbnMgbGlrZSBgLS1iaW5kaXI9UEFUSCcgdG8gc3BlY2lmeSBkaWZmZXJlbnQgdmFsdWVzIGZvciBwYXJ0aWN1bGFyCitraW5kcyBvZiBmaWxlcy4gIFJ1biBgY29uZmlndXJlIC0taGVscCcgZm9yIGEgbGlzdCBvZiB0aGUgZGlyZWN0b3JpZXMKK3lvdSBjYW4gc2V0IGFuZCB3aGF0IGtpbmRzIG9mIGZpbGVzIGdvIGluIHRoZW0uCisKKyAgIElmIHRoZSBwYWNrYWdlIHN1cHBvcnRzIGl0LCB5b3UgY2FuIGNhdXNlIHByb2dyYW1zIHRvIGJlIGluc3RhbGxlZAord2l0aCBhbiBleHRyYSBwcmVmaXggb3Igc3VmZml4IG9uIHRoZWlyIG5hbWVzIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVgnIG9yIGAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCcuCisKK09wdGlvbmFsIEZlYXR1cmVzCis9PT09PT09PT09PT09PT09PQorCisgICBTb21lIHBhY2thZ2VzIHBheSBhdHRlbnRpb24gdG8gYC0tZW5hYmxlLUZFQVRVUkUnIG9wdGlvbnMgdG8KK2Bjb25maWd1cmUnLCB3aGVyZSBGRUFUVVJFIGluZGljYXRlcyBhbiBvcHRpb25hbCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorVGhleSBtYXkgYWxzbyBwYXkgYXR0ZW50aW9uIHRvIGAtLXdpdGgtUEFDS0FHRScgb3B0aW9ucywgd2hlcmUgUEFDS0FHRQoraXMgc29tZXRoaW5nIGxpa2UgYGdudS1hcycgb3IgYHgnIChmb3IgdGhlIFggV2luZG93IFN5c3RlbSkuICBUaGUKK2BSRUFETUUnIHNob3VsZCBtZW50aW9uIGFueSBgLS1lbmFibGUtJyBhbmQgYC0td2l0aC0nIG9wdGlvbnMgdGhhdCB0aGUKK3BhY2thZ2UgcmVjb2duaXplcy4KKworICAgRm9yIHBhY2thZ2VzIHRoYXQgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0sIGBjb25maWd1cmUnIGNhbiB1c3VhbGx5CitmaW5kIHRoZSBYIGluY2x1ZGUgYW5kIGxpYnJhcnkgZmlsZXMgYXV0b21hdGljYWxseSwgYnV0IGlmIGl0IGRvZXNuJ3QsCit5b3UgY2FuIHVzZSB0aGUgYGNvbmZpZ3VyZScgb3B0aW9ucyBgLS14LWluY2x1ZGVzPURJUicgYW5kCitgLS14LWxpYnJhcmllcz1ESVInIHRvIHNwZWNpZnkgdGhlaXIgbG9jYXRpb25zLgorCitTcGVjaWZ5aW5nIHRoZSBTeXN0ZW0gVHlwZQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVGhlcmUgbWF5IGJlIHNvbWUgZmVhdHVyZXMgYGNvbmZpZ3VyZScgY2FuIG5vdCBmaWd1cmUgb3V0CithdXRvbWF0aWNhbGx5LCBidXQgbmVlZHMgdG8gZGV0ZXJtaW5lIGJ5IHRoZSB0eXBlIG9mIGhvc3QgdGhlIHBhY2thZ2UKK3dpbGwgcnVuIG9uLiAgVXN1YWxseSBgY29uZmlndXJlJyBjYW4gZmlndXJlIHRoYXQgb3V0LCBidXQgaWYgaXQgcHJpbnRzCithIG1lc3NhZ2Ugc2F5aW5nIGl0IGNhbiBub3QgZ3Vlc3MgdGhlIGhvc3QgdHlwZSwgZ2l2ZSBpdCB0aGUKK2AtLWhvc3Q9VFlQRScgb3B0aW9uLiAgVFlQRSBjYW4gZWl0aGVyIGJlIGEgc2hvcnQgbmFtZSBmb3IgdGhlIHN5c3RlbQordHlwZSwgc3VjaCBhcyBgc3VuNCcsIG9yIGEgY2Fub25pY2FsIG5hbWUgd2l0aCB0aHJlZSBmaWVsZHM6CisgICAgIENQVS1DT01QQU5ZLVNZU1RFTQorCitTZWUgdGhlIGZpbGUgYGNvbmZpZy5zdWInIGZvciB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGVhY2ggZmllbGQuICBJZgorYGNvbmZpZy5zdWInIGlzbid0IGluY2x1ZGVkIGluIHRoaXMgcGFja2FnZSwgdGhlbiB0aGlzIHBhY2thZ2UgZG9lc24ndAorbmVlZCB0byBrbm93IHRoZSBob3N0IHR5cGUuCisKKyAgIElmIHlvdSBhcmUgYnVpbGRpbmcgY29tcGlsZXIgdG9vbHMgZm9yIGNyb3NzLWNvbXBpbGluZywgeW91IGNhbiBhbHNvCit1c2UgdGhlIGAtLXRhcmdldD1UWVBFJyBvcHRpb24gdG8gc2VsZWN0IHRoZSB0eXBlIG9mIHN5c3RlbSB0aGV5IHdpbGwKK3Byb2R1Y2UgY29kZSBmb3IgYW5kIHRoZSBgLS1idWlsZD1UWVBFJyBvcHRpb24gdG8gc2VsZWN0IHRoZSB0eXBlIG9mCitzeXN0ZW0gb24gd2hpY2ggeW91IGFyZSBjb21waWxpbmcgdGhlIHBhY2thZ2UuCisKK1NoYXJpbmcgRGVmYXVsdHMKKz09PT09PT09PT09PT09PT0KKworICAgSWYgeW91IHdhbnQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBgY29uZmlndXJlJyBzY3JpcHRzIHRvIHNoYXJlLAoreW91IGNhbiBjcmVhdGUgYSBzaXRlIHNoZWxsIHNjcmlwdCBjYWxsZWQgYGNvbmZpZy5zaXRlJyB0aGF0IGdpdmVzCitkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaWFibGVzIGxpa2UgYENDJywgYGNhY2hlX2ZpbGUnLCBhbmQgYHByZWZpeCcuCitgY29uZmlndXJlJyBsb29rcyBmb3IgYFBSRUZJWC9zaGFyZS9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLCB0aGVuCitgUFJFRklYL2V0Yy9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLiAgT3IsIHlvdSBjYW4gc2V0IHRoZQorYENPTkZJR19TSVRFJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNpdGUgc2NyaXB0LgorQSB3YXJuaW5nOiBub3QgYWxsIGBjb25maWd1cmUnIHNjcmlwdHMgbG9vayBmb3IgYSBzaXRlIHNjcmlwdC4KKworT3BlcmF0aW9uIENvbnRyb2xzCis9PT09PT09PT09PT09PT09PT0KKworICAgYGNvbmZpZ3VyZScgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gY29udHJvbCBob3cgaXQKK29wZXJhdGVzLgorCitgLS1jYWNoZS1maWxlPUZJTEUnCisgICAgIFVzZSBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgaW4gRklMRSBpbnN0ZWFkIG9mCisgICAgIGAuL2NvbmZpZy5jYWNoZScuICBTZXQgRklMRSB0byBgL2Rldi9udWxsJyB0byBkaXNhYmxlIGNhY2hpbmcsIGZvcgorICAgICBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScuCisKK2AtLWhlbHAnCisgICAgIFByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBgY29uZmlndXJlJywgYW5kIGV4aXQuCisKK2AtLXF1aWV0JworYC0tc2lsZW50JworYC1xJworICAgICBEbyBub3QgcHJpbnQgbWVzc2FnZXMgc2F5aW5nIHdoaWNoIGNoZWNrcyBhcmUgYmVpbmcgbWFkZS4gIFRvCisgICAgIHN1cHByZXNzIGFsbCBub3JtYWwgb3V0cHV0LCByZWRpcmVjdCBpdCB0byBgL2Rldi9udWxsJyAoYW55IGVycm9yCisgICAgIG1lc3NhZ2VzIHdpbGwgc3RpbGwgYmUgc2hvd24pLgorCitgLS1zcmNkaXI9RElSJworICAgICBMb29rIGZvciB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGluIGRpcmVjdG9yeSBESVIuICBVc3VhbGx5CisgICAgIGBjb25maWd1cmUnIGNhbiBkZXRlcm1pbmUgdGhhdCBkaXJlY3RvcnkgYXV0b21hdGljYWxseS4KKworYC0tdmVyc2lvbicKKyAgICAgUHJpbnQgdGhlIHZlcnNpb24gb2YgQXV0b2NvbmYgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYGNvbmZpZ3VyZScKKyAgICAgc2NyaXB0LCBhbmQgZXhpdC4KKworYGNvbmZpZ3VyZScgYWxzbyBhY2NlcHRzIHNvbWUgb3RoZXIsIG5vdCB3aWRlbHkgdXNlZnVsLCBvcHRpb25zLgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvTWFrZWZpbGUuYW0gYi9kYnVzLTEuNC4xMC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmI0MGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNCBAQAorU1VCRElSUz1kYnVzIGJ1cyBkb2MgdG9vbHMgdGVzdAorRElTVF9TVUJESVJTPWRidXMgYnVzIGRvYyB0b29scyB0ZXN0CisKK3BrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKK3BrZ2NvbmZpZ19EQVRBID0gZGJ1cy0xLnBjCisKK0RJU1RDTEVBTkZJTEVTID0gCQlcCisJZGJ1cy0xLnBjCisKK0VYVFJBX0RJU1QgPQkJCVwKKwlIQUNLSU5HCQkJXAorCWRidXMtMS5wYy5pbgkJXAorCWNsZWFudXAtbWFuLXBhZ2VzLnNoICAgIFwKKyAgICAgICAgQ2hhbmdlTG9nLnByZS0xLTAgICAgICAgXAorICAgICAgICBORVdTLnByZS0xLTAgICAgICAgICAgICBcCisJQ2hhbmdlTG9nLnByZS0xLTIgICAgICAgXAorICAgICAgICBORVdTLnByZS0xLTIJCVwKKwlSRUFETUUud2luCQlcCisJUkVBRE1FLndpbmNlCQlcCisJUkVBRE1FLmN5Z3dpbgkJXAorCVJFQURNRS5sYXVuY2hkCQlcCisJY21ha2UKKworYWxsLWxvY2FsOiBEb3h5ZmlsZQorCit1cGRhdGUtYXV0aG9yczoKKwlnaXQgc2hvcnRsb2cgLXMgLWUgfCBjdXQgLWMgOC0gfCBzb3J0ID4gQVVUSE9SUworCitESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTID0gXAorCS0td2l0aC1zeXN0ZW1kc3lzdGVtdW5pdGRpcj0kJGRjX2luc3RhbGxfYmFzZS8kKHN5c3RlbWRzeXN0ZW11bml0ZGlyKQorCitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNCAke0FDTE9DQUxfRkxBR1N9CisKK2luY2x1ZGUgdG9vbHMvbGNvdi5hbQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvTWFrZWZpbGUuaW4gYi9kYnVzLTEuNC4xMC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUyYWEwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxMDA5IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIENvcHlyaWdodCDCqSAyMDA4LTIwMTEgQ29sbGFib3JhIEx0ZC4KKyMgQ29weXJpZ2h0IMKpIDIwMDgtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyMgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQoc3JjZGlyKS9Eb3h5ZmlsZS5pbiBcCisJJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJChzcmNkaXIpL2NvbmZpZy5oLmluICQoc3JjZGlyKS9kYnVzLTEtdW5pbnN0YWxsZWQucGMuaW4gXAorCSQoc3JjZGlyKS9kYnVzLTEucGMuaW4gJChzcmNkaXIpL3Rvb2xzL2xjb3YuYW0gXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vVXNlci5zZXJ2aWNlLmluIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYuaW4gXAorCSQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZi5pbiBcCisJJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYuaW4gXAorCSQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbiBcCisJJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gXAorCSQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4gXAorCSQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4gXAorCSQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbiBcCisJJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlLmluIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4gXAorCSQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbiBcCisJQVVUSE9SUyBDT1BZSU5HIENoYW5nZUxvZyBJTlNUQUxMIE5FV1MgY29tcGlsZSBjb25maWcuZ3Vlc3MgXAorCWNvbmZpZy5zdWIgZGVwY29tcCBpbnN0YWxsLXNoIGx0bWFpbi5zaCBtaXNzaW5nCitzdWJkaXIgPSAuCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9hcy1hYy1leHBhbmQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvY29tcGlsZXIubTQgJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCAkKHRvcF9zcmNkaXIpL200L2x0c3VnYXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00ICQodG9wX3NyY2RpcikvbTQvbHR+b2Jzb2xldGUubTQgXAorCSQodG9wX3NyY2RpcikvbTQvcGtnLm00ICQodG9wX3NyY2RpcikvbTQvdHAtY29tcGlsZXItZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKKyBjb25maWd1cmUubGluZW5vIGNvbmZpZy5zdGF0dXMubGluZW5vCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSBEb3h5ZmlsZSBkYnVzLTEucGMgZGJ1cy0xLXVuaW5zdGFsbGVkLnBjIFwKKwl0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mIFwKKwl0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYgXAorCXRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYgXAorCXRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYgXAorCXRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UgXAorCXRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UgXAorCXRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlIFwKKwl0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZSBcCisJdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZSBcCisJdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZSBcCisJdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UgXAorCXRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZSBcCisJdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UgXAorCXRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlIFwKKwl0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZSBcCisJdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2UgXAorCXRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlCitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQorYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOworQU1fVl9hdCA9ICQoYW1fX3ZfYXRfJChWKSkKK2FtX192X2F0XyA9ICQoYW1fX3ZfYXRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9hdF8wID0gQAorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKKwlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAorCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAorCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIKK0RBVEEgPSAkKHBrZ2NvbmZpZ19EQVRBKQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCisJJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKKwlkaXN0ZGlyIGRpc3QgZGlzdC1hbGwgZGlzdGNoZWNrCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQordG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCithbV9fcmVtb3ZlX2Rpc3RkaXIgPSBcCisgIHsgdGVzdCAhIC1kICIkKGRpc3RkaXIpIiBcCisgICAgfHwgeyBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKKyAgICAgICAgICYmIHJtIC1mciAiJChkaXN0ZGlyKSI7IH07IH0KK2FtX19yZWxhdGl2aXplID0gXAorICBkaXIwPWBwd2RgOyBcCisgIHNlZF9maXJzdD0ncyxeXChbXi9dKlwpLy4qJCQsXDEsJzsgXAorICBzZWRfcmVzdD0ncyxeW14vXSovKiwsJzsgXAorICBzZWRfbGFzdD0ncyxeLiovXChbXi9dKlwpJCQsXDEsJzsgXAorICBzZWRfYnV0bGFzdD0ncywvKlteL10qJCQsLCc7IFwKKyAgd2hpbGUgdGVzdCAtbiAiJCRkaXIxIjsgZG8gXAorICAgIGZpcnN0PWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCisgICAgaWYgdGVzdCAiJCRmaXJzdCIgIT0gIi4iOyB0aGVuIFwKKyAgICAgIGlmIHRlc3QgIiQkZmlyc3QiID0gIi4uIjsgdGhlbiBcCisgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2xhc3QiYC8iJCRkaXIyIjsgXAorICAgICAgICBkaXIwPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9idXRsYXN0ImA7IFwKKyAgICAgIGVsc2UgXAorICAgICAgICBmaXJzdDI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICAgICAgaWYgdGVzdCAiJCRmaXJzdDIiID0gIiQkZmlyc3QiOyB0aGVuIFwKKyAgICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgZGlyMj0iLi4vJCRkaXIyIjsgXAorICAgICAgICBmaTsgXAorICAgICAgICBkaXIwPSIkJGRpcjAiLyIkJGZpcnN0IjsgXAorICAgICAgZmk7IFwKKyAgICBmaTsgXAorICAgIGRpcjE9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICBkb25lOyBcCisgIHJlbGRpcj0iJCRkaXIyIgorRElTVF9BUkNISVZFUyA9ICQoZGlzdGRpcikudGFyLmd6CitHWklQX0VOViA9IC0tYmVzdAorZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAorZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JVSUxEX0ZJTEVWRVJTSU9OID0gQEJVSUxEX0ZJTEVWRVJTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RCVVNfQklORElSID0gQERCVVNfQklORElSQAorREJVU19CVVNfQ0ZMQUdTID0gQERCVVNfQlVTX0NGTEFHU0AKK0RCVVNfQlVTX0xJQlMgPSBAREJVU19CVVNfTElCU0AKK0RCVVNfQ0xJRU5UX0NGTEFHUyA9IEBEQlVTX0NMSUVOVF9DRkxBR1NACitEQlVTX0NMSUVOVF9MSUJTID0gQERCVVNfQ0xJRU5UX0xJQlNACitEQlVTX0NPTlNPTEVfQVVUSF9ESVIgPSBAREJVU19DT05TT0xFX0FVVEhfRElSQAorREJVU19DT05TT0xFX09XTkVSX0ZJTEUgPSBAREJVU19DT05TT0xFX09XTkVSX0ZJTEVACitEQlVTX0RBRU1PTkRJUiA9IEBEQlVTX0RBRU1PTkRJUkAKK0RCVVNfREFUQURJUiA9IEBEQlVTX0RBVEFESVJACitEQlVTX0hBVkVfSU5UNjQgPSBAREJVU19IQVZFX0lOVDY0QAorREJVU19JTlQxNl9UWVBFID0gQERCVVNfSU5UMTZfVFlQRUAKK0RCVVNfSU5UMzJfVFlQRSA9IEBEQlVTX0lOVDMyX1RZUEVACitEQlVTX0lOVDY0X0NPTlNUQU5UID0gQERCVVNfSU5UNjRfQ09OU1RBTlRACitEQlVTX0lOVDY0X1RZUEUgPSBAREJVU19JTlQ2NF9UWVBFQAorREJVU19MQVVOQ0hFUl9DRkxBR1MgPSBAREJVU19MQVVOQ0hFUl9DRkxBR1NACitEQlVTX0xBVU5DSEVSX0xJQlMgPSBAREJVU19MQVVOQ0hFUl9MSUJTQAorREJVU19MSUJFWEVDRElSID0gQERCVVNfTElCRVhFQ0RJUkAKK0RCVVNfTUFKT1JfVkVSU0lPTiA9IEBEQlVTX01BSk9SX1ZFUlNJT05ACitEQlVTX01JQ1JPX1ZFUlNJT04gPSBAREJVU19NSUNST19WRVJTSU9OQAorREJVU19NSU5PUl9WRVJTSU9OID0gQERCVVNfTUlOT1JfVkVSU0lPTkAKK0RCVVNfUEFUSF9PUl9BQlNUUkFDVCA9IEBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RACitEQlVTX1BSRUZJWCA9IEBEQlVTX1BSRUZJWEAKK0RCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTQAorREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgPSBAREJVU19TRVNTSU9OX1NPQ0tFVF9ESVJACitEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitEQlVTX1NZU1RFTV9QSURfRklMRSA9IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKK0RCVVNfU1lTVEVNX1NPQ0tFVCA9IEBEQlVTX1NZU1RFTV9TT0NLRVRACitEQlVTX1RFU1RfQ0ZMQUdTID0gQERCVVNfVEVTVF9DRkxBR1NACitEQlVTX1RFU1RfTElCUyA9IEBEQlVTX1RFU1RfTElCU0AKK0RCVVNfVUlOVDY0X0NPTlNUQU5UID0gQERCVVNfVUlOVDY0X0NPTlNUQU5UQAorREJVU19VU0VSID0gQERCVVNfVVNFUkAKK0RCVVNfVkVSU0lPTiA9IEBEQlVTX1ZFUlNJT05ACitEQlVTX1hfQ0ZMQUdTID0gQERCVVNfWF9DRkxBR1NACitEQlVTX1hfTElCUyA9IEBEQlVTX1hfTElCU0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitET1hZR0VOID0gQERPWFlHRU5ACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0VYUEFOREVEX0JJTkRJUiA9IEBFWFBBTkRFRF9CSU5ESVJACitFWFBBTkRFRF9EQVRBRElSID0gQEVYUEFOREVEX0RBVEFESVJACitFWFBBTkRFRF9MSUJESVIgPSBARVhQQU5ERURfTElCRElSQAorRVhQQU5ERURfTElCRVhFQ0RJUiA9IEBFWFBBTkRFRF9MSUJFWEVDRElSQAorRVhQQU5ERURfTE9DQUxTVEFURURJUiA9IEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQAorRVhQQU5ERURfUFJFRklYID0gQEVYUEFOREVEX1BSRUZJWEAKK0VYUEFOREVEX1NZU0NPTkZESVIgPSBARVhQQU5ERURfU1lTQ09ORkRJUkAKK0ZHUkVQID0gQEZHUkVQQAorR0VUVEVYVF9QQUNLQUdFID0gQEdFVFRFWFRfUEFDS0FHRUAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEFVTkNIQ1RMID0gQExBVU5DSENUTEAKK0xBVU5DSERfQUdFTlRfRElSID0gQExBVU5DSERfQUdFTlRfRElSQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJYTUxfQ0ZMQUdTID0gQExJQlhNTF9DRkxBR1NACitMSUJYTUxfTElCUyA9IEBMSUJYTUxfTElCU0AKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitMVF9BR0UgPSBATFRfQUdFQAorTFRfQ1VSUkVOVCA9IEBMVF9DVVJSRU5UQAorTFRfUkVWSVNJT04gPSBATFRfUkVWSVNJT05ACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOMkhUTUwgPSBATUFOMkhUTUxACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSQyA9IEBSQ0AKK1JfRFlOQU1JQ19MREZMQUcgPSBAUl9EWU5BTUlDX0xERkxBR0AKK1NFQ1RJT05fTERGTEFHUyA9IEBTRUNUSU9OX0xERkxBR1NACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVEVTVF9CVVNfQklOQVJZID0gQFRFU1RfQlVTX0JJTkFSWUAKK1RFU1RfRVhJVF9CSU5BUlkgPSBAVEVTVF9FWElUX0JJTkFSWUAKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUiA9IEBURVNUX0lOVkFMSURfU0VSVklDRV9ESVJACitURVNUX0lOVkFMSURfU0VSVklDRV9TWVNURU1fRElSID0gQFRFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVJACitURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZID0gQFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllACitURVNUX1BSSVZTRVJWRVJfQklOQVJZID0gQFRFU1RfUFJJVlNFUlZFUl9CSU5BUllACitURVNUX1NFR0ZBVUxUX0JJTkFSWSA9IEBURVNUX1NFR0ZBVUxUX0JJTkFSWUAKK1RFU1RfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0hFTExfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkgPSBAVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWUAKK1RFU1RfU09DS0VUX0RJUiA9IEBURVNUX1NPQ0tFVF9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfRElSID0gQFRFU1RfVkFMSURfU0VSVklDRV9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUiA9IEBURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJTkRSRVMgPSBAV0lORFJFU0AKK1hNS01GID0gQFhNS01GQAorWE1MVE8gPSBAWE1MVE9ACitYU0xUUFJPQyA9IEBYU0xUUFJPQ0AKK1hfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAorWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKK1hfTElCUyA9IEBYX0xJQlNACitYX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3N5c3RlbWRzeXN0ZW11bml0ZGlyID0gQHN5c3RlbWRzeXN0ZW11bml0ZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitTVUJESVJTID0gZGJ1cyBidXMgZG9jIHRvb2xzIHRlc3QKK0RJU1RfU1VCRElSUyA9IGRidXMgYnVzIGRvYyB0b29scyB0ZXN0Citwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IGRidXMtMS5wYworRElTVENMRUFORklMRVMgPSBcCisJZGJ1cy0xLnBjCisKK0VYVFJBX0RJU1QgPSBcCisJSEFDS0lORwkJCVwKKwlkYnVzLTEucGMuaW4JCVwKKwljbGVhbnVwLW1hbi1wYWdlcy5zaCAgICBcCisgICAgICAgIENoYW5nZUxvZy5wcmUtMS0wICAgICAgIFwKKyAgICAgICAgTkVXUy5wcmUtMS0wICAgICAgICAgICAgXAorCUNoYW5nZUxvZy5wcmUtMS0yICAgICAgIFwKKyAgICAgICAgTkVXUy5wcmUtMS0yCQlcCisJUkVBRE1FLndpbgkJXAorCVJFQURNRS53aW5jZQkJXAorCVJFQURNRS5jeWd3aW4JCVwKKwlSRUFETUUubGF1bmNoZAkJXAorCWNtYWtlCisKK0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MgPSBcCisJLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyPSQkZGNfaW5zdGFsbF9iYXNlLyQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00ICR7QUNMT0NBTF9GTEFHU30KK2FsbDogY29uZmlnLmgKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKK2FtLS1yZWZyZXNoOgorCUA6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS90b29scy9sY292LmFtICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUnOyBcCisJICAgICAgJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAorCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCitjb25maWcuaDogc3RhbXAtaDEKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkgIHJtIC1mIHN0YW1wLWgxOyBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBzdGFtcC1oMTsgXAorCWVsc2UgOjsgZmkKKworc3RhbXAtaDE6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBybSAtZiBzdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKKyQoc3JjZGlyKS9jb25maWcuaC5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykgCisJKCQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikpCisJcm0gLWYgc3RhbXAtaDEKKwl0b3VjaCAkQAorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBjb25maWcuaCBzdGFtcC1oMQorRG94eWZpbGU6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9Eb3h5ZmlsZS5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK2RidXMtMS5wYzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2RidXMtMS5wYy5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK2RidXMtMS11bmluc3RhbGxlZC5wYzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2RidXMtMS11bmluc3RhbGxlZC5wYy5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmY6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZjogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlci5zZXJ2aWNlOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZS5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2U6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2U6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2U6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQodG9wX3NyY2RpcikvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKK3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHRvcF9zcmNkaXIpL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAordGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2U6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQodG9wX3NyY2RpcikvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2UuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACit0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZS5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wgY29uZmlnLmx0CitpbnN0YWxsLXBrZ2NvbmZpZ0RBVEE6ICQocGtnY29uZmlnX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChwa2djb25maWdkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIgorCUBsaXN0PSckKHBrZ2NvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQocGtnY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChwa2djb25maWdkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChwa2djb25maWdfREFUQSknOyB0ZXN0IC1uICIkKHBrZ2NvbmZpZ2RpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwl0ZXN0IC1uICIkJGZpbGVzIiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQocGtnY29uZmlnZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiICYmIHJtIC1mICQkZmlsZXMKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCiskKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKKwlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCWNhc2UgIiRAIiBpbiBcCisJICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCisJICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCisJZXNhYzsgXAorCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCXJldj0iJCRyZXYgLiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKK2N0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKKwlkb25lCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJdGVzdCAtZCAiJChkaXN0ZGlyKSIgfHwgbWtkaXIgIiQoZGlzdGRpcikiCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCisJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCisJICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQodG9wX2Rpc3RkaXIpIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfdG9wX2Rpc3RkaXI9JCRyZWxkaXI7IFwKKwkgICAgZWNobyAiIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFxcIjsgXAorCSAgICBlY2hvICIgICAgIGFtX19yZW1vdmVfZGlzdGRpcj06IGFtX19za2lwX2xlbmd0aF9jaGVjaz06IGFtX19za2lwX21vZGVfZml4PTogZGlzdGRpcikiOyBcCisJICAgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgXAorCSAgICAgICAgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXAorCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCisJCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKKwkJYW1fX3NraXBfbW9kZV9maXg9OiBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwktdGVzdCAtbiAiJChhbV9fc2tpcF9tb2RlX2ZpeCkiIFwKKwl8fCBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTc1NSBcCisJCS1leGVjIGNobW9kIHUrcnd4LGdvK3J4IHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAorCXx8IGNobW9kIC1SIGErciAiJChkaXN0ZGlyKSIKK2Rpc3QtZ3ppcDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtYnppcDI6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWx6bWE6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgbHptYSAtOSAtYyA+JChkaXN0ZGlyKS50YXIubHptYQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXh6OiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IHh6IC1jID4kKGRpc3RkaXIpLnRhci54egorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXRhclo6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC1zaGFyOiBkaXN0ZGlyCisJc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC16aXA6IGRpc3RkaXIKKwktcm0gLWYgJChkaXN0ZGlyKS56aXAKKwl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdCBkaXN0LWFsbDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKKyMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KKyMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKKyMgdGFyZmlsZS4KK2Rpc3RjaGVjazogZGlzdAorCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKKwkqLnRhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCisJKi50YXIuYnoyKikgXAorCSAgYnppcDIgLWRjICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5sem1hKikgXAorCSAgbHptYSAtZGMgJChkaXN0ZGlyKS50YXIubHptYSB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci54eiopIFwKKwkgIHh6IC1kYyAkKGRpc3RkaXIpLnRhci54eiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5aKikgXAorCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAorCSouc2hhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAorCSouemlwKikgXAorCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCisJZXNhYworCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQorCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS9faW5zdAorCWNobW9kIGEtdyAkKGRpc3RkaXIpCisJdGVzdCAtZCAkKGRpc3RkaXIpL19idWlsZCB8fCBleGl0IDA7IFwKKwlkY19pbnN0YWxsX2Jhc2U9YCQoYW1fX2NkKSAkKGRpc3RkaXIpL19pbnN0ICYmIHB3ZCB8IHNlZCAtZSAncyxeW146XFwvXTpbXFwvXSwvLCdgIFwKKwkgICYmIGRjX2Rlc3RkaXI9IiQke1RNUERJUi0vdG1wfS9hbS1kYy0kJCQkLyIgXAorCSAgJiYgYW1fX2N3ZD1gcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJChkaXN0ZGlyKS9fYnVpbGQgXAorCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCisJICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAmJiAoeyBcCisJICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKKwkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAorCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAorCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAorCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sgXAorCSAgJiYgY2QgIiQkYW1fX2N3ZCIgXAorCSAgfHwgZXhpdCAxCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKKwkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKKwkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JworZGlzdHVuaW5zdGFsbGNoZWNrOgorCUAkKGFtX19jZCkgJyQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknIFwKKwkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKKwkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAorCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAorCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAorCSAgICAgICAgZmkgOyBcCisJICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICAgZXhpdCAxOyB9ID4mMgorZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgorCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAorCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCisJICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKKwkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICBleGl0IDE7IH0gPiYyCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlICQoREFUQSkgY29uZmlnLmggYWxsLWxvY2FsCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtcmVjdXJzaXZlCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1wa2djb25maWdEQVRBCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06CisKK3BzOiBwcy1yZWN1cnNpdmUKKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEKKworLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGFsbCBcCisJY3RhZ3MtcmVjdXJzaXZlIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZQorCisuUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKKwlhbGwgYWxsLWFtIGFsbC1sb2NhbCBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjbGVhbiBcCisJY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0IFwKKwlkaXN0LWFsbCBkaXN0LWJ6aXAyIGRpc3QtZ3ppcCBkaXN0LWx6bWEgZGlzdC1zaGFyIGRpc3QtdGFyWiBcCisJZGlzdC14eiBkaXN0LXppcCBkaXN0Y2hlY2sgZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIFwKKwlkaXN0ZGlyIGRpc3R1bmluc3RhbGxjaGVjayBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIFwKKwlpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIFwKKwlpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIFwKKwlpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAorCWluc3RhbGwtbWFuIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcGtnY29uZmlnREFUQSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1wa2djb25maWdEQVRBCisKKworYWxsLWxvY2FsOiBEb3h5ZmlsZQorCit1cGRhdGUtYXV0aG9yczoKKwlnaXQgc2hvcnRsb2cgLXMgLWUgfCBjdXQgLWMgOC0gfCBzb3J0ID4gQVVUSE9SUworCitsY292LXJlc2V0OgorCWxjb3YgLS1kaXJlY3RvcnkgQGFic190b3Bfc3JjZGlyQCAtLXplcm9jb3VudGVycworCitsY292LXJlcG9ydDoKKwlsY292IC0tZGlyZWN0b3J5IEBhYnNfdG9wX3NyY2RpckAgLS1jYXB0dXJlIFwKKwkJLS1vdXRwdXQtZmlsZSBAYWJzX3RvcF9idWlsZGRpckAvbGNvdi5pbmZvCisJJChta2Rpcl9wKSBAYWJzX3RvcF9idWlsZGRpckAvbGNvdi5odG1sCisJZ2l0X2NvbW1pdD1gR0lUX0RJUj1AYWJzX3RvcF9zcmNkaXJALy5naXQgZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6JWggMj4vZGV2L251bGxgO1wKKwlnZW5odG1sIC0tdGl0bGUgIkBQQUNLQUdFX1NUUklOR0AgJCRnaXRfY29tbWl0IiBcCisJCS0tb3V0cHV0LWRpcmVjdG9yeSBAYWJzX3RvcF9idWlsZGRpckAvbGNvdi5odG1sIGxjb3YuaW5mbworCUBlY2hvCisJQGVjaG8gJ2xjb3YgcmVwb3J0IGNhbiBiZSBmb3VuZCBpbjonCisJQGVjaG8gJ2ZpbGU6Ly9AYWJzX3RvcF9idWlsZGRpckAvbGNvdi5odG1sL2luZGV4Lmh0bWwnCisJQGVjaG8KKworbGNvdi1jaGVjazoKKwkkKE1BS0UpIGxjb3YtcmVzZXQKKwkkKE1BS0UpIGNoZWNrICQoTENPVl9DSEVDS19BUkdTKQorCSQoTUFLRSkgbGNvdi1yZXBvcnQKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvTkVXUyBiL2RidXMtMS40LjEwL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlNzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL05FV1MKQEAgLTAsMCArMSwxNTAgQEAKK0QtQnVzIDEuNC4xMCAoMjAxMS0wNi0wMSkKKz09CisKK05vdGVzIGZvciBkaXN0cmlidXRvcnM6CisKKyAgVGhpcyB2ZXJzaW9uIG9mIEQtQnVzIG5vIGxvbmdlciB1c2VzIC1mUElFIGJ5IGRlZmF1bHQuIERpc3RyaWJ1dGlvbnMgd2lzaGluZworICB0byBoYXJkZW4gdGhlIGRidXMtZGFlbW9uIGFuZCBkYnVzLWxhdW5jaC1oZWxwZXIgY2FuIHJlLWVuYWJsZSB0aGlzIGlmIHRoZWlyCisgIHRvb2xjaGFpbiBzdXBwb3J0cyBpdCByZWxpYWJseSwgdmlhIHNvbWV0aGluZyBsaWtlOgorCisgICAgLi9jb25maWd1cmUgQ0ZMQUdTPS1mUElFIExERkxBR1M9Ii1waWUgLVdsLC16LHJlbHJvIgorCisgIG9yIGJ5IHVzaW5nIGRpc3RyaWJ1dGlvbi1zcGVjaWZpYyB3cmFwcGVycyBzdWNoIGFzIERlYmlhbidzIGhhcmRlbmluZy13cmFwcGVyLgorCitDaGFuZ2VzOgorCisgIOKAoiBEb24ndCBmb3JjZSAtZlBJRTogZGlzdHJpYnV0aW9ucyBhbmQgbGlidG9vbCBrbm93IGJldHRlciB0aGFuIHdlIGRvIHdoZXRoZXIKKyAgICBpdCdzIGRlc2lyYWJsZSAoZmQubyAjMTY2MjEsIGZkLm8gIzI3MjE1OyBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEFsbG93IC0tZGlzYWJsZS1nYy1zZWN0aW9ucywgaW4gY2FzZSB5b3VyIHRvb2xjaGFpbiBvZmZlcnMgdGhlCisgICAgLWZmdW5jdGlvbi1zZWN0aW9ucywgLWZkYXRhLXNlY3Rpb25zIGFuZCAtV2wsLS1nYy1zZWN0aW9ucyBvcHRpb25zCisgICAgYnV0IHRoZXkncmUgYnJva2VuLCBhcyBzZWVuIG9uIFNvbGFyaXMgKGZkLm8gIzMzNDY2LCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEluc3RhbGwgZGJ1cy1kYWVtb24gYW5kIGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgaW4gYSBtb3JlIG5vcm1hbCB3YXkKKyAgICAoZmQubyAjMTQ1MTI7IFNpbW9uIE1jVml0dGllLCBsb29zZWx5IGJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBMdWNhIEJhcmJhdG8pCisgIOKAoiBFbnN1cmUgdGhhdCBtYWludGFpbmVycyB1cGxvYWQgZG9jdW1lbnRhdGlvbiB3aXRoIHRoZSByaWdodCBwZXJtaXNzaW9ucworICAgIChmZC5vICMzNjEzMCwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBMb2cgc3lzdGVtLWJ1cyBhY3RpdmF0aW9uIGluZm9ybWF0aW9uIHRvIHN5c2xvZyAoZmQubyAjMzU3MDUsCisgICAgQ29saW4gV2FsdGVycykKKyAg4oCiIExvZyBtZXNzYWdlcyBkcm9wcGVkIGR1ZSB0byBxdW90YXMgdG8gc3lzbG9nIChmZC5vICMzNTM1OCwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIE1ha2UgdGhlIG5vbmNlLXRjcCB0cmFuc3BvcnQgd29yayBvbiBVbml4IChmZC5vICMzNDU2OSwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBPbiBVbml4LCBpZiAvdmFyL2xpYi9kYnVzL21hY2hpbmUtaWQgY2Fubm90IGJlIHJlYWQsIHRyeSAvZXRjL21hY2hpbmUtaWQKKyAgICAoZmQubyAjMzUyMjgsIExlbm5hcnQgUG9ldHRlcmluZykKKyAg4oCiIEluIHRoZSByZWdyZXNzaW9uIHRlc3RzLCBkb24ndCByZXBvcnQgZmRzIGFzICJsZWFrZWQiIGlmIHRoZXkgd2VyZSBvcGVuCisgICAgb24gc3RhcnR1cCAoZmQubyAjMzUxNzMsIFNpbW9uIE1jVml0dGllKQorICDigKIgTWFrZSBkYnVzLW1vbml0b3IgYmFpbCBvdXQgaWYgYXNrZWQgdG8gbW9uaXRvciBtb3JlIHRoYW4gb25lIGJ1cywKKyAgICByYXRoZXIgdGhhbiBzaWxlbnRseSB1c2luZyB0aGUgbGFzdCBvbmUgKGZkLm8gIzI2NTQ4LCBXaWxsIFRob21wc29uKQorICDigKIgQ2xhcmlmeSBkb2N1bWVudGF0aW9uIChmZC5vICMzNTE4MiwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBDbGVhbiB1cCBtaW5vciBkZWFkIGNvZGUgYW5kIHNvbWUgaW5jb3JyZWN0IGVycm9yIGhhbmRsaW5nCisgICAgKGZkLm8gIzMzMTI4LCBmZC5vICMyOTg4MTsgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBDaGVjayB0aGF0IGNvbXBpbGVyIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCBiZWZvcmUgdXNpbmcgdGhlbSAoZmQubyAjMTk2ODEsCisgICAgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBXaW5kb3dzOgorICAgIOKAoiBSZW1vdmUgb2Jzb2xldGUgd29ya2Fyb3VuZCBmb3Igd2luaW9jdGwuaCAoZmQubyAjMzUwODMsIFJhbGYgSGFiYWNrZXIpCisKK0QtQnVzIDEuNC44ICgyMDExLTA0LTA4KQorPT0KKworVGhlICJJdCdzIGxpa2UgdGhlIGJlZ2lubmluZyBvZiBhIGxvYnN0ZXIiIHJlbGVhc2UuCisKKyAg4oCiIFJlbmFtZSBjb25maWd1cmUuaW4gdG8gY29uZmlndXJlLmFjLCBhbmQgdXBkYXRlIGl0IHRvIG1vZGVybiBjb252ZW50aW9ucworICAgIChmZC5vICMzMjI0NTsgSmF2aWVyIEphcmTDs24sIFNpbW9uIE1jVml0dGllKQorICDigKIgQ29ycmVjdGx5IGdpdmUgWERHX0RBVEFfSE9NRSBwcmlvcml0eSBvdmVyIFhER19EQVRBX0RJUlMgKGZkLm8gIzM0NDk2LAorICAgIEFuZGVycyBLYXNlb3JnKQorICDigKIgUHJldmVudCBYMTEgYXV0b2xhdW5jaGluZyBpZiAkRElTUExBWSBpcyB1bnNldCBvciBlbXB0eSwgYW5kIGFkZAorICAgIC0tZGlzYWJsZS14MTEtYXV0b2xhdW5jaCBjb25maWd1cmUgb3B0aW9uIHRvIHByZXZlbnQgaXQgYWx0b2dldGhlcgorICAgIGluIGVtYmVkZGVkIGVudmlyb25tZW50cyAoZmQubyAjMTk5OTcsIE5CIzIxOTk2NDsgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBJbnN0YWxsIHRoZSBkb2N1bWVudGF0aW9uLCBhbmQgYW4gaW5kZXggZm9yIERldmhlbHAgKGZkLm8gIzEzNDk1LAorICAgIERlYmlhbiAjNDU0MTQyOyBTaW1vbiBNY1ZpdHRpZSwgTWF0dGhpYXMgQ2xhc2VuKQorICDigKIgSWYgY2hlY2tzIGFyZSBub3QgZGlzYWJsZWQsIGNoZWNrIHZhbGlkaXR5IG9mIHN0cmluZy1saWtlIHR5cGVzIGFuZAorICAgIGJvb2xlYW5zIHdoZW4gc2VuZGluZyB0aGVtIChmZC5vICMxNjMzOCwgTkIjMjIzMTUyOyBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEFkZCBVbmtub3duT2JqZWN0LCBVbmtub3duSW50ZXJmYWNlLCBVbmtub3duUHJvcGVydHkgYW5kIFByb3BlcnR5UmVhZE9ubHkKKyAgICBlcnJvcnMgdG8gZGJ1cy1zaGFyZWQuaCAoZmQubyAjMzQ1MjcsIExlbm5hcnQgUG9ldHRlcmluZykKKyAg4oCiIEJyZWFrIHVwIGEgaHVnZSBjb25kaXRpb25hbCBpbiBjb25maWctcGFyc2VyIHNvIGdjb3YgY2FuIHByb2R1Y2UgY292ZXJhZ2UKKyAgICBkYXRhIChmZC5vICMxMDg4NywgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBMaXN0IHdoaWNoIHBhcnRzIG9mIHRoZSBEZXNrdG9wIEVudHJ5IHNwZWNpZmljYXRpb24gYXJlIGFwcGxpY2FibGUgdG8KKyAgICAuc2VydmljZSBmaWxlcyAoZmQubyAjMTkxNTksIFN2ZW4gSGVyemJlcmcpCisgIOKAoiBEb24ndCBzdXBwcmVzcyBzZXJ2aWNlIGFjdGl2YXRpb24gaWYgdHdvIHNlcnZpY2VzIGhhdmUgdGhlIHNhbWUgRXhlYz0KKyAgICAoZmQubyAjMzU3NTAsIENvbGluIFdhbHRlcnMpCisgIOKAoiBXaW5kb3dzOgorICAgIMK3IEF2b2lkIHRoZSBuYW1lIEVMRU1FTlRfVFlQRSBkdWUgdG8gbmFtZXNwYWNlLXBvbGx1dGlvbiBmcm9tIHdpbmlvY3RsLmgKKyAgICAgIChBbmRyZSBIZWluZWNrZSkKKyAgICDCtyBJbmNsdWRlIF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgaW4gbGliZGJ1cyBvbiBXaW5kb3dzLCBmaXhpbmcgY29tcGlsYXRpb24KKyAgICAgIChmZC5vICMzMjgwNSwgTWFyayBCcmFuZCkKKworRC1CdXMgMS40LjYgKDIwMTAtMDItMTcpCis9PQorCitUaGUgIjEsIDIsIG1pc3MgYSBmZXcsIDk5LCAxMDAiIHJlbGVhc2UuCisKKyAg4oCiIFJlbW92ZSB1bmZpbmlzaGVkIGNoYW5nZXMgaW50ZW5kZWQgdG8gc3VwcG9ydCBHVGVzdC1iYXNlZCB0ZXN0cywKKyAgICB3aGljaCB3ZXJlIG1pc3Rha2VubHkgaW5jbHVkZWQgaW4gMS40LjQKKworRC1CdXMgMS40LjQgKDIwMTAtMDItMTcpCis9PQorCisgIOKAoiBTd2l0Y2ggYmFjayB0byB1c2luZyBldmVuIG1pY3JvIHZlcnNpb25zIGZvciBzdGFibGUgcmVsZWFzZXM7IDEuNC4xCisgICAgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgMS40LjIsIHNvIHNraXAgdGhhdCB2ZXJzaW9uIG51bWJlcgorICDigKIgRG9uJ3QgbGVhdmUgYmFkIGZpbGUgZGVzY3JpcHRvcnMgYmVpbmcgd2F0Y2hlZCB3aGVuIHNwYXduaW5nIHByb2Nlc3NlcywKKyAgICB3aGljaCBjb3VsZCByZXN1bHQgaW4gYSBidXN5LWxvb3AgKGZkLm8gIzMyOTkyLCBOQiMyMDAyNDg7IHBvc3NpYmx5CisgICAgYWxzbyBMUCM2NTYxMzQsIExQIzY4MDQ0NCwgTFAjNzEzMTU3KQorICDigKIgQ2hlY2sgZm9yIE1TR19OT1NJR05BTCBjb3JyZWN0bHkKKyAg4oCiIEZpeCBmYWlsdXJlIHRvIGRldGVjdCBhYnN0cmFjdCBzb2NrZXQgc3VwcG9ydCAoZmQubyAjMjk4OTUpCisgIOKAoiBNYWtlIF9kYnVzX3N5c3RlbV9sb2d2IGFjdHVhbGx5IGV4aXQgd2l0aCBEQlVTX1NZU1RFTV9MT0dfRkFUQUwKKyAgICAoZmQubyAjMzIyNjIsIE5CIzE4MDQ4NikKKyAg4oCiIEltcHJvdmUgc29tZSBlcnJvciBjb2RlIHBhdGhzIChmZC5vICMyOTk4MSwgZmQubyAjMzIyNjQsIGZkLm8gIzMyMjYyLAorICAgIGZkLm8gIzMzMTI4LCBmZC5vICMzMzI3NywgZmQubyAjMzMxMjYsIE5CIzE4MDQ4NikKKyAg4oCiIEF2b2lkIHBvc3NpYmxlIHN5bWxpbmsgYXR0YWNrcyBpbiAvdG1wIGR1cmluZyBjb21waWxhdGlvbiAoZmQubyAjMzI4NTQpCisgIOKAoiBUaWR5IHVwIGRlYWQgY29kZSAoZmQubyAjMjUzMDYsIGZkLm8gIzMzMTI4LCBmZC5vICMzNDI5MiwgTkIjMTgwNDg2KQorICDigKIgSW1wcm92ZSBnY2MgbWFsbG9jIGFubm90YXRpb25zIChmZC5vICMzMjcxMCkKKyAg4oCiIElmIHRoZSBzeXN0ZW0gYnVzIGlzIGxhdW5jaGVkIHZpYSBzeXN0ZW1kLCBwcm90ZWN0IGl0IGZyb20gdGhlIE9PTSBraWxsZXIKKyAg4oCiIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChmZC5vICMxMTE5MCkKKyAg4oCiIEF2b2lkIHJlYWRkaXJfciwgd2hpY2ggaXMgZGlmZmljdWx0IHRvIHVzZSBjb3JyZWN0bHkgKGZkLm8gIzgyODQsCisgICAgZmQubyAjMTU5MjIsIExQIzI0MTYxOSkKKyAg4oCiIENvcGUgd2l0aCBpbnZhbGlkIGZpbGVzIGluIHNlc3Npb24uZCwgc3lzdGVtLmQgKGZkLm8gIzE5MTg2LAorICAgIERlYmlhbiAjMjMwMjMxKQorICDigKIgRG9uJ3QgZGlzdHJpYnV0ZSBnZW5lcmF0ZWQgZmlsZXMgdGhhdCBlbWJlZCBvdXIgYnVpbGRkaXIgKGZkLm8gIzMwMjg1LAorICAgIGZkLm8gIzM0MjkyKQorICDigKIgUmFpc2UgdGhlIHN5c3RlbSBidXMncyBmZCBsaW1pdCB0byBiZSBzdWZmaWNpZW50IGZvciBpdHMgY29uZmlndXJhdGlvbgorICAgIChmZC5vICMzMzQ3NCwgTFAjMzgxMDYzKQorICDigKIgRml4IHN5c2xvZyBzdHJpbmcgcHJvY2Vzc2luZworICDigKIgSWdub3JlIC1XYWRkcmVzcworICDigKIgUmVtb3ZlIGJyb2tlbiBnY292IHBhcnNpbmcgY29kZSBhbmQgLS1lbmFibGUtZ2NvdiwgYW5kIHJlcGxhY2UgdGhlbQorICAgIHdpdGggbGNvdiBIVE1MIHJlcG9ydHMgYW5kIC0tZW5hYmxlLWNvbXBpbGVyLWNvdmVyYWdlIChmZC5vICMxMDg4NykKKyAg4oCiIFdpbmRvd3M6CisgICAgwrcgYXZvaWQgbGl2ZS1sb2NrIGluIFdpbmRvd3MgQ0UgZHVlIHRvIHVuZmFpciBjb25kaXRpb24gdmFyaWFibGVzCisgIOKAoiBPcGVuQlNEOgorICAgIMK3IHN1cHBvcnQgY3JlZGVudGlhbHMtcGFzc2luZyAoZmQubyAjMzI1NDIpCisgIOKAoiBTb2xhcmlzOgorICAgIMK3IG9wdC1pbiB0byB0aHJlYWQgc2FmZXR5IChmZC5vICMzMzQ2NCkKKworRC1CdXMgMS40LjEgKDIwIERlY2VtYmVyIDIwMTApCis9PQorCisg4oCiIEZpeCBmb3IgQ1ZFLTIwMTAtNDM1Mjogc2VuZGluZyBtZXNzYWdlcyB3aXRoIGV4Y2Vzc2l2ZWx5LW5lc3RlZCB2YXJpYW50cyBjYW4KKyAgIGNyYXNoIHRoZSBidXMuIFRoZSBleGlzdGluZyByZXN0cmljdGlvbiB0byA2NC1sZXZlbHMgb2YgbmVzdGluZyBwcmV2aW91c2x5CisgICBvbmx5IGFwcGxpZWQgdG8gdGhlIHN0YXRpYyB0eXBlIHNpZ25hdHVyZTsgbm93IGl0IGFsc28gYXBwbGllcyB0byBkeW5hbWljCisgICBuZXN0aW5nIHVzaW5nIHZhcmlhbnRzLiBUaGFua3MgdG8gUsOpbWkgRGVuaXMtQ291cm1vbnQgZm9yIGRpc2NvdmluZyB0aGlzCisgICBpc3N1ZS4KKyDigKIgT1MgWCBwb3J0YWJpbGl0eSBmaXhlcywgaW5jbHVkaW5nIGxhdW5jaGQgc3VwcG9ydC4KKyDigKIgV2luZG93cyBhdXRvbGF1bmNoIGltcHJvdmVtZW50cy4KKyDigKIgVmFyaW91cyBidWcgZml4ZXMuCisKK0QtQnVzIDEuNC4wICg2IFNlcCAyMDEwKQorPT0KKyAtIHN5c3RlbWQgaG9va3VwCisKK0QtQnVzIDEuMy4xICgyMyBKdW5lIDIwMTApCis9PQorIC0gTmV3IHN0YW5kYXJkaXplZCBQcm9wZXJ0aWVzQ2hhbmdlZCBzaWduYWwgaW4gdGhlIHByb3BlcnRpZXMgaW50ZXJmYWNlCisgLSBWYXJpb3VzIHBvcnRhYmlsaXR5IGZpeGVzLCBpbiBwYXJ0aWN1bGFyIHRvIFdpbmRvd3MgcGxhdGZvcm1zCisgLSBTdXBwb3J0IGZvcmtpbmcgYnVzIHNlcnZpY2VzLCBmb3IgY29tcGF0aWJpbGl0eQorCitELUJ1cyAxLjMuMCAoMjkgSnVseSAyMDA5KQorPT0KKyAtIGFiaWxpdHkgZm9yIGRidXMtc2VuZCB0byBzZW5kIHRvIGFueSBidXMgKC0tYWRkcmVzcykKKyAtIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIG9uIFVuaXggc29ja2V0IHRyYW5zcG9ydHMKKyAtIHVzZSBvZiBHQ0MgYXRvbWljIGludHJpbnNpY3MgZm9yIGJldHRlciBwcm9jZXNzb3Igc3VwcG9ydAorICAgKHJlcXVpcmVzIC1tYXJjaD1pNDg2IG9yIGFib3ZlIGZvciB4ODYgY29tcGlsYXRpb24pCisgLSB0aHJlYWQtc2FmZSBGRF9DTE9FWEVDIHNldHRpbmcgb24gcmVjZW50IExpbnV4IGtlcm5lbHMgKDIuNi4yNC0yNyBhbmQgdXApCisgICBhbmQgZ2xpYmMgKDIuOSBmb3IgcGlwZTIgYW5kIDIuMTAgZm9yIGFjY2VwdDQpCisgLSBmZWF0dXJlIG5lZ290aWF0aW9uIGluIHRoZSBidXMgZGFlbW9uCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9ORVdTLnByZS0xLTAgYi9kYnVzLTEuNC4xMC9ORVdTLnByZS0xLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNWJjNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL05FV1MucHJlLTEtMApAQCAtMCwwICsxLDYxNCBAQAorRC1CdXMgMS4wLjAgKDA4IE5vdmVtYmVyIDIwMDYpCis9PQorLSBEb2N1bWVudHMgdXBkYXRlZCB3aXRoIEFQSS9BQkkgZ2FydW50ZWVzIAorLSBBZGRlZCBtaXNzaW5nIHBhdGNoIEZyZWVCU0QgbmVlZCB0byBydW4gb3V0IG9mIHRoZSBib3gKKy0gZGJ1cy1tb25pdG9yIG5vdyBoYXMgYSBwcm9maWxlIG1vZGUKKy0gQVVUSE9SUyBmaWxlIHVwZGF0ZWQgd2l0aCBuYW1lcyBmcm9tIHRoZSBDaGFuZ2VMb2cKKyAgVGhhbmtzIHRvIGV2ZXJ5b25lIHdobyBoZWxwZWQgZ2V0IHVzIGhlcmUKKworRC1CdXMgMS4wIFJDIDMgKDAuOTUpICgwMiBOb3ZlbWJlciAyMDA2KQorPT0KKy0gREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0Ugbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGRlZmluZWQgd2hlbiBidWlsZGluZyBhcHBzCistIC4vY29uZmlndXJlIGNoZWNrcyBub3cgd29yayB3aGVuIGNyb3NzIGNvbXBpbGluZworLSBkYnVzLXV1aWRnZW4gLS1lbnN1cmUgaXMgbm93IHJ1biBpbiB0aGUgaW5pdCBzY3JpcHQgc28gdGhlcmUgaXMgbm8gbmVlZCB0bworICBydW4gaXQgaW4gYSBwb3N0IHNjcmlwdAorLSBkYnVzLXV1aWRnZW4gbm93IHdyaXRlcyBvdXQgdG8gL3Zhci9saWIvZGJ1cyB0byB3b3JrIHdpdGggc3lzdGVtcyB0aGF0IGRvIG5vdAorICBoYXZlIGEgd3JpdGFibGUgL2V0Yy4gUGFja2FnZXMgc2hvdWxkIGluc3RhbGwgYW5kIG93biB0aGUgL3Zhci9saWIvZGJ1cyAKKyAgZGlyZWN0b3J5CistIHJlY3Vyc2l2ZSBsb2NrcyBhcmUgbm93IHVzZWQgd2hlbiBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0IGlzIGNhbGxlZAorLSBzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIHRhZyBhZGRlZCB0byB0aGUgc2Vzc2lvbi5jb25mCisgIHVuZGVyIGEgbm9ybWFsIGJ1aWxkIHRoaXMgc3BlY2lmaWVzIHRoZXNlIHNlcnZpY2UgZGlyZWN0b3JpZXM6CisgICAgL3Vzci9sb2NhbC9zaGFyZS9kYnVzLTEvc2VydmljZXMKKyAgICAvdXNyL3NoYXJlL2RidXMtMS9zZXJ2aWNlcworICAgICRIT01FLy5sb2NhbC9zaGFyZS9kYnVzLTEvc2VydmljZXMKKy0gZml4ZWQgY3Jhc2ggd2hlbiBhIHNlcnZpY2UgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZQorLSBmaXhlZCBhIGNyYXNoIGluICpCU0Qgd2hlbiB3YXRjaGluZyBjb25maWcgZGlyZWN0b3JpZXMgZm9yIGNoYW5nZXMKKy0gZml4ZWQgSXJpeCBidWlsZCBieSB1c2luZyBkaXJwLT5fX2RkX2ZkIHRvIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yCistIGNsZWFuZWQgdXAgdGhlIExPQ0FMX0NSRURTIHZzIENNR0NSRUQgY3JlZGVudGlhbCBjb2RlIHNvICpCU0QncyBkb24ndCAKKyAgY3Jhc2ggaGVyZSBhbnltb3JlCistIGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcnJheV9sZW4gZGVwcmVjYXRlZAorLSBjbGVhbnVwLW1hbi1wYWdlcy5zaCBhZGRlZCBzbyBwYWNrYWdlcnMgY2FuIGNsZWFuIHVwIERveHlnZW4gbWFuIHBhZ2Ugb3V0cHV0CisgIGZyb20gNyB0byAyIG1lZ3MKKy0gbGFyZ2UgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKKy0gbnVtZXJvdXMgYnVnIGZpeGVzCisKK0QtQnVzIDEuMCBSQyAyICgwLjk0KSAoMTQgT2N0b2JlciAyMDA2KQorPT0KKy0gZGJ1cy11dWlkZ2VuIGJpbmFyeSBhZGRlZCBmb3IgZnV0dXJlIHJlbW90ZSBtYWNoaW5lIGlkZW50aWZpY2F0aW9uCisgIHBhY2thZ2VycyBzaG91bGQgY2FsbCBkYnVzLXV1aWRnZW4gLS1lbnN1cmUgaW4gdGhlaXIgcG9zdAorLSBHZXRNYWNoaW5lSWQgcGVlciBtZXRob2QgYWRkZWQgdG8gdGhlIGJ1cyBBUEkKKy0gZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzIEFQSSBhZGRlZCB0byBsZXQgdGhlIGJ1cyBzZW5kCisgIHBlZXIgbWVzc2FnZXMgZGlyZWN0bHkgdG8gYW4gYXBwCistIEF1dG9sYXVuY2ggYWJpbGl0aWVzIGFkZGVkIHRvIGRidXMtbGF1bmNoIHdpdGggdGhlIC0tYXV0b2xhdW5jaCBmbGFnCisgIFRoaXMgZmVhdHVyZSBhbGxvd3MgbGliZGJ1cyB0byBzdGFydCBhIHNlc3Npb24gYnVzIGlmIG5vbmUgY2FuIGJlIGZvdW5kCisgIFRoaXMgaXMgYW4gaW50ZXJuYWwgZmVhdHVyZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHNjcmlwdHMKKyAgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIHN0aWxsIHRoZSBjb3JyZWN0IHdheSB0byBzcGVjaWZ5IGEgc2Vzc2lvbiBidXMKKy0gZGJ1cy1sYXVuY2ggbm93IHByaW50cyBvdXQgYSBzaW1wbGUga2V5IHZhbHVlIHBhaXJzIGluc3RlYWQgb2Ygc2hlbGwgc2NyaXB0cworICBpZiBvbmUgb2YgdGhlIHNoZWxsIGZsYWdzIGFyZW4ndCB1c2VkCistIHN1cHBvcnQgREJVU19CTE9DS19PTl9BQk9SVCBlbnYgdmFyaWFibGUgdG8gY2F1c2UgYmxvY2tpbmcgd2FpdGluZyBmb3IgZ2RiCistIHdlYWsgcmVmIGFyZSBub3cgaGVsZCBmb3Igc2hhcmVkIGNvbm5lY3Rpb25zIHNvIHRoZSByaWdodCB0aGluZ3MgaGFwcGVuCisgIHRoaXMgZml4ZXMgc29tZSBwcmV0dHkgbWFqb3IgYnVncyB3aXRoIHRoZSB3YXkgY29ubmVjdGlvbnMgd2VyZSBoYW5kbGVkCistIFNvbWUgcmVmYWN0b3JpbmcgZm9yIFdpbmRvd3MgKGRvZXNuJ3QgZWZmZWN0IFVuaXgpCistIFNvbGFyaXMgYnVpbGQgZml4ZXMKKy0gTWFjT1NYIGJ1aWxkIGZpeGVzCistIENyb3NzIGNvbXBpbGUgYnVpbGQgZml4ZXMuICBXZSBub3cgYXNzdW1lIGdldHB3bmFtX3IgaXMgcG9zaXggYW5kIHZhX2xpc3RzCisgIGNhbiBiZSBjb3BpZWQgYnkgdmFsdWUgc2luY2Ugd2UgY2FuJ3QgY2hlY2sgdGhpcyBpbiBhIGNyb3NzIGNvbXBpbGUuICBJZgorICB0aGlzIGlzIG5vdCB0cnVlIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0IGlzIHVwIHRvIHRoZSBkZXZlbG9wZXIgdG8gcGF0Y2guCistIEJ1ZyBmaXhpbmcgYWxsIGFyb3VuZAorCitELUJ1cyAxLjAgUkMgMSAoMC45MykgKDE0IFNlcHRlbWJlciAyMDA2KQorPT0KKy0gZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCBhZGRlZCBmb3IgaW5pdGFsaXppbmcgdGhyZWFkcyB3aXRob3V0IHRoZSBuZWVkIGZvcgorICBiaW5kaW5ncworLSBGaWx0ZXJzIGFyZSBub3cgcHJvcGVybHkgcmVtb3ZlZAorLSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiBub3cgaG9sZHMgYSBoYXJkIHJlZiB0byBzaGFyZWQgY29ubmVjdGlvbnMKKy0gV2Ugbm93IHByaW50IG91dCBhIHdhcm5pbmcgYW5kIGRvIG5vdGhpbmcgd2hlbiBzb21lb25lIHRyaWVzIHRvIGNsb3NlIGEgCisgIHNoYXJlZCBjb25uZWN0aW9uCistIFRoZSAtLWludHJvc3BlY3Qgc3dpdGNoIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBidXMgZm9yIHByaW50aW5nIG91dCAKKyAgaW50cm9zcGVjdGlvbiBkYXRhIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyB0aGUgYnVzCistIExPQ0FMX0NSRURTIHNvY2tldCBjcmVkZW50aWFscyBhcmUgbm93IHN1cHBvcnRlZCBmb3Igc3lzdGVtcyB3aGljaCAKKyAgc3VwcG9ydCBpdCBzdWNoIGFzIE5ldEJTRAorLSBHZW5lcmFsaXplIGtxdWV1ZSBzdXBwb3J0IHNvIGl0IHdvcmtzIHdpdGggTmV0QlNEIGFzIHdlbGwgYXMgRnJlZUJTRAorLSBOdW1lcm91cyBidWcgZml4ZXMgYW5kIG1lbW9yeSBsZWFrcyBwYXRjaGVkCisKK0QtQnVzIDAuOTIgKDE4IEF1Z3VzdCAyMDA2KQorPT0KKy0gUHJvcGVyIHRocmVhZCBsb2NraW5nIGFkZGVkIHRvIHBlbmRpbmcgY2FsbHMKKy0gVGhyZWFkaW5nIHNlbWFudGljcyBjaGFuZ2VkIGZyb20gaW5pdCBlYXJseSB0byBpbml0IGJlZm9yZSB0aGUgc2Vjb25kIHRocmVhZAorICBpcyBzdGFydGVkCistIENvcnJlY3RseSBlcnJvciBvdXQgd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byBhY3F1aXJlIG9yIHJlbGVhc2UgdGhlCisgIG9yZy5mcmVlZGVza3RvcC5EQnVzIG5hbWUgaW5zdGVhZCBvZiBzZW5kaW5nIGZhbHNlIHJlc3VsdCBjb2RlcworLSBrcXVldWUgZGlyZWN0b3J5IHdhdGNoaW5nIGNvZGUgY2FuIG5vdyBiZSB1c2VkIHRvIG1vbml0b3IgY29uZmlnIGZpbGUgY2hhbmdlcworICBvbiBGcmVlQlNECistIC0td2l0aC1kYnVzLWRhZW1vbmRpciBjb25maWd1cmUgc3dpdGNoIGFkZGVkIHNvIHRoZSBkYWVtb24gY2FuIGJlIGluc3RhbGxlZAorICBzZXBhcmF0ZSBmcm9tIHRoZSB1c2VyIGJpbmFyaWVzCistIE1ha2VmaWxlcyBmaXhlZCBmb3IgY3lnd2luIAorLSBWYXJpb3VzIGZpeGVzIGZvciB0aGUgb25nb2luZyBXaW5kb3dzIHBvcnQgCistIEZpeGVkIGRvY3MgYW5kIGNvbW1lbnRzIHRvIHVzZSB0aGUgRC1CdXMgc3BlbGxpbmcgaW5zdGVhZCBvZiBELUJVUworLSBNYW55IG1lbWxlYWtzIGFuZCBidWdzIGZpeGVkCisKK0QtQnVzIDAuOTEgKDI0IEp1bHkgMjAwNikKKz09CistIFJlbW92ZSBzb21lIGxpbmdlcmluZyBiaXRzIGxlZnQgb3ZlciBmcm9tIHRoZSBiaW5kaW5ncyBzcGxpdAorLSBGaXggYXNzZXJ0aW9uIGNhdXNpbmcgRC1CdXMgYXBwbGljYXRpb25zIHRvIGNyYXNoIHdoZW4gY2hlY2tzIGFyZSBlbmFibGVkCistIEZpeCBhIHRpbWVvdXQgYnVnIHdoaWNoIHdvdWxkIGJsb2NrIGFwcGxpY2F0aW9ucyBmcm9tIGJlaW5nIGF1dG8gc3RhcnRlZAorCitELUJ1cyAwLjkwICgxNyBKdWx5IDIwMDYpCis9PQorLSBBUEkvQUJJIGZyZWV6ZSBmb3IgMS4wCistIEJpbmRpbmdzIGFyZSBub3cgc3BsaXQgb3V0IGludG8gc2VwZXJhdGUgcGFja2FnZXMKKy0gTGlzdEFjdGl2YXRhYmxlTmFtZXMgYWRkZWQgYXMgYSBtZXRob2Qgb24gdGhlIGJ1cworLSBSZW1vdmVkIGRlcHJlY2F0ZWQgZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QgKHVzZSBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UpCistIFNoYXJlZCBjb25uZWN0aW9ucyBhcmUgbm93IHVucmVmZmVkIG9uIGRpc2Nvbm5lY3QKKy0gRml4ZWQgcGVuZGluZyBjYWxscyBmb3IgdGhyZWFkZWQgZW52aW9ybm1lbnRzCistIFBlbmRpbmcgY2FsbHMgZ2V0IHRpbWVkIG91dCBvbiBjb25uZWN0aW9uIGRpc2Nvbm5lY3QKKy0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSByZXR1cm5zIFRSVUUgYW5kIGEgTlVMTCBwZW5kaW5nIGNhbGwKKyAgaWYgeW91IGNhbGwgaXQgb24gYSBjb25uZWN0aW9uIG9iamVjdCB3aGljaCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgYWxyZWFkeQorICAoaXQgcmV0dXJucyBGQUxTRSBvbiBPdXQgb2YgTWVtb3J5IGVycm9ycyBvbmx5KQorLSBkYnVzLW1vbml0b3Igbm93IGNvcnJlY3RseSBjYXRjaGVzIG1ldGhvZHMsIG5vdCBqdXN0IHNpZ25hbHMKKy0gZGJ1cy1tb25pdG9yIG5vdyBwcmludHMgb2JqZWN0IHBhdGhzIAorCitELUJVUyAwLjYyICgxMiBKdW5lIDIwMDYpCis9PQorLSBEb2MgZml4ZXMKKy0gQWRkZWQgc3VwcG9ydCBmb3IgYWxsIGRhdGEtdHlwZXMgZm9yIHRoZSBkYnVzIHRvb2xzCistIEZpeGVkIGVhdmVzZHJvcHBpbmcgb24gbWV0aG9kIGNhbGxzIChkYnVzLW1vbml0b3IpCistIEZpeGVkIHNpbGVudCBkcm9wcGluZyBvZiBtZXRob2QgY2FsbHMgd2l0aCBpbnRlcmZhY2U9TlVMTAorLSBGaXhlZCBjb25zb2xlIG93bmVyc2hpcCBwcm9ibGVtcyBpbiBTb2xhcmlzCistIEZpeGVkIGluc3RhbGxhdGlvbiBvZiBkYnVzLXNpZ25hdHVyZS5oIGFuZCAjaW5jbHVkZSBpdCBpbiBkYnVzL2RidXMuaAorLSBGbHVzaCB0aGUgdXNlciBkYXRhYmFzZSBjYWNoZSBvbiBjb25maWcgcmVsb2FkCistIEdMaWIgYmluZGluZ3M6CisgIC0gRml4IG1lbW9yeSBsZWFrcworICAtIEZpeCBwcm9wZXJ0aWVzIGluIERCdXNHUHJveHkgc28gdGhhdCB0aGV5IGNhbiBiZSBnaXZlbiBpbiBhbnkKKyAgICBvcmRlcgorICAtIEFkZGVkIGxvdHMgb2YgYXNzZXJ0aW9ucyB0byBlbnN1cmUgY29ycmVjdCB1c2UKKyAgLSBSZW1vdmUgZHVwbGljYXRlZCBjb2RlCisgIC0gRml4IHN0YXRpYyBzdHJpbmcgcG9pbnRlciB1c2VzIGluIEdQdHJBcnJheS1iYXNlZCBjb2xsZWN0aW9ucworLSBQeXRob24gYmluZGluZ3M6CisgIC0gUmVtb3ZlIHJlZmVyZW5jZSB0byBzeXMvY2RlZnMuaAorLSBRdDQgYmluZGluZ3M6CisgIC0gQ29kZSByZW9yZ2FuaXplZAorICAtIEFkZGVkIHRoZSBkYnVzaWRsMmNwcCwgZGJ1c2NwcDJ4bWwgYW5kIGRidXMgdG9vbHMKKyAgLSBBZGRlZCBleGFtcGxlIHByb2dyYW1zIChwaW5nLXBvbmcsIGNvbXBsZXggcGluZy1wb25nLCBsaXN0bmFtZXMsIGNoYXQpCisgIC0gVXBkYXRlZCBzZWxmdGVzdHMKKyAgLSBGaXhlZCBjb21waWxhdGlvbiBhbmQgLm1vYy0gYW5kIC51aS1maWxlIHByb2Nlc3NpbmcgYW5kIGNsZWFuaW5nCisgIC0gTWFkZSBjZW50cmFsIGNsYXNzZXMgZGVyaXZlIGZyb20gUU9iamVjdAorICAtIEVuaGFuY2UgZXJyb3IgcmVwb3J0aW5nCisgIC0gTWFueSBidWdmaXhlcworLSBNb25vIGJpbmRpbmdzOgorICAtIE1pbm9yIGJ1Z2ZpeGVzCisKK0QtQlVTIDAuNjEgKDI0IEZlYnVhcnkgMjAwNikKKz09CistIERvY3VtZW50YXRpb24gYWxsIGFyb3VuZAorLSBkYnVzLWxhdW5jaCBub3cgcHJvZHVjZXMgY29ycmVjdCBzaCBhbmQgY3NoIHN5bnRheAorLSBOZXN0ZWQgYXJyYXlzIG5vdyB3b3JrIGNvcnJlY3RseQorLSBHTGliIGJpbmRpbmdzOgorICAtIEluaGVyaXRpbmcgZnJvbSBEQnVzR1Byb3h5IGlzIG5vdyBwb3NzaWJsZQorICAtIEdQdHJBcnJheXMgY2FuIG5vdyBiZSBtYXJzaGFsbGVkCisgIC0gb3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DbGllbnRDU3ltYm9sIGFubm90YXRpb24gYWRkZWQKKyAgLSBPcGVubmluZyBjb25uZWN0aW9ucyB0byBhcmJpdHJhcnkgYWRkcmVzc2VzIG5vdyBzdXBwb3J0ZWQKKy0gUHl0aG9uIGJpbmRpbmdzOgorICAtIHNlbmRlcl9rZXl3b3JkIGFuZCBwYXRoX2tleXdvcmQga2V5d29yZHMgYWRkZWQgdG8gc2lnbmFsIGxpc3RlbmVyIEFQSQorICAtIEJ5dGUgdHlwZXMgbm93IGRlbWFyc2hhbCB0byB1bnNpZ25lZCBjaGFyCisgIC0gY2FsbGluZyBtZXRob2RzIG5vdyBkbyB0aGUgY29ycmVjdCB0aGluZworLSBRdCBiaW5kaW5nczoKKyAgLSBib3RoIFF0MyBhbmQgUXQ0IGJpbmRpbmdzIGNhbiBiZSBidWlsdCBhdCB0aGUgc2FtZSB0aW1lCisgIC0gVXNlIHRoZSBzdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5NZXRob2QuTm9SZXBseSBhbm5vdGF0aW9uIAorICAgIGZvciB0aGUgImFzeW5jIiBjYWxscyBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZSBmb3IgdXMuCistIE1vbm8gYmluZGluZ3M6CisgIC0gNjRiaXQgYXJjaCBmaXhlcworLSBNYXNzaXZlIGJ1ZyBmaXhpbmcgYWxsIGFyb3VuZAorCitELUJVUyAwLjYwICgzMCBOb3ZlbWJlciAyMDA1KQorPT0KKworLSBtYWpvciBBQkkvQVBJIGNoYW5nZXMgLSBzb25hbWVzIGNoYW5nZWQKKy0gUmVxdWVzdE5hbWUgcXVldWluZyBiZWhhdmlvciBoYXMgY2hhbmdlZCAocmVmZXIgdG8gZGJ1cy1zcGVjaWZpY2F0aW9uKQorICAtIERCVVNfTkFNRV9GTEFHX1BST0hJQklUX1JFUExBQ0VNRU5UIGhhcyBiZWVuIHJlbW92ZWQgYW5kCisgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGZsYWdzCistIHNpZ25hbHMgZW1pdHRlZCBieSB0aGUgYnVzIG5vdyBzaG93IHVwIGluIHRoZSBpbnRyb3NwZWN0IGRhdGEKKy0gYXV0aCBFWFRFUk5BTCBub3cgc3VwcG9ydGVkIG9uIEJTRCB2YXJpZW50cworLSBSZWxlYXNlTmFtZSBtZXRob2QgYWRkZWQgdG8gdGhlIGJ1cyB0byBhbGxvdyBhIHNlcnZpY2UKKyAgdG8gcmVtb3ZlIGl0c2VsZiBhcyBvd25lciBvZiBhIGJ1cyBuYW1lCistIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlIGFkZGVkIGZvciBnZXR0aW5nIG1lc3NhZ2VzIG9mZiB0aGUgYnVzIAorICBpbiB0aGUgYWJzZW5jZSBvZiBhIG1haW5sb29wCistIFF0NCBiaW5kaW5ncyBhZGRlZCBhbmQgdGhlIFF0MyBiaW5kaW5ncyBoYXZlIGJlZW4gZGVwcmljYXRlZAorLSBweXRob24gYmluZGluZ3M6CisgIC0gbWFyc2hhbCB1c2luZyBpbnRyb3NwZWN0IGRhdGEgaWYgYXZhaWxhYmxlCisgIC0gYmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBhbmQgcHJvcGlnYXRpb24KKyAgLSBwcml2YXRlIGNvbm5lY3Rpb25zIGFyZSBub3cgc3VwcG9ydGVkCisgIC0gVVRGLTggY2xlYW51cHMKKyAgLSBvdXRfc2lnbmF0dXJlIGFkZGVkIHRvIG1ldGhvZCBkZWNvcmF0b3JzIGZvciBzcGVjaWZ5aW5nCisgICAgaG93IHRoZSByZXR1cm4gdmFsdWVzIHNob3VsZCBiZSBtYXJzaGFsZWQKKyAgLSBzZW5kZXJfa2V5d29yZCBhZGRlZCB0byBtZXRob2QgZGVjb3JhdG9ycyBmb3Igc3BlY2lmeWluZworICAgIGFuZCBhcmd1bWVudCB0byBwcm92aWRlIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgbWV0aG9kIGNhbGxlcgorICAtIGFzeW5jX2NhbGxiYWNrcyBhZGRlZCB0byBtZXRob2QgZGVjb3JhdG9ycyAKKyAgLSBtdWx0aXBsZSBpbmhlcml0YW5jZSBvZiBjbGFzc2VzIG5vdyBzdXBwb3J0ZWQgCistIEdMaWIgYmluZGluZ3M6CisgIC0gcmVzcGVjdCBOb1JlcGx5IGFubm90YXRpb25zCisgIC0gZGJ1c19nX21ldGhvZF9yZXR1cm5fZ2V0X3JlcGx5IGFuZCBkYnVzX2dfbWV0aG9kX3JldHVybl9zZW5kX3JlcGx5CisgICAgYWRkZWQgdG8gdGhlIGxvd2xldmVsIGNvZGUgZm9yIHVzZSB3aGVuIHRoZSBkYnVzLWdsaWIgbWFyc2hhbGxpbmcKKyAgICBjb2RlIGlzIG5vdCBhZGlxdWF0ZQorLSBudW1lcm91cyBidWcgZml4ZXMgYWxsIGFyb3VuZAorCitELUJVUyAwLjUwICgwNiBTZXB0ZW1iZXIgMjAwNSkKKz09PQorVGhpcyBpcyBhIG1pbm9yIHJlbGVhc2UgZnJvbSAwLjM2LjIuICBUaGUgc2VyaWVzIG51bWJlciBoYXMgY2hhbmdlZCAKK25vdCBiZWNhdXNlIG9mIGFueSB0ZWNobmljYWwgcmVhc29ucyBidXQgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlCithcmUgbW92aW5nIGNsb3NlciB0byAxLjAuICBJdCBpcyBob3BlZCB0aGF0IHRoaXMgd2lsbCBiZSB0aGUgbGFzdAorc2VyaWVzIHRvIHNlZSBtYWpvciBjaGFuZ2VzLCBtb3N0IG9mIHdoaWNoIHdpbGwgYmUgaXNvbGF0ZWQgdG8gdGhlCitHTGliIGFuZCBQeXRob24gYmluZGluZ3MsIGFzIHdlIHRyYW5zaXRpb24gdG8gY29uY2VudHJhdGUgbW9yZSBvbgorYnVnIGJ1c3RpbmcgYW5kIGNvZGUgYXVkaXRpbmcuCisKKy0gRC1CdXMgYnVpbGRzIG9uIHRoZSBDeWd3aW4gcGxhdGZvcm0KKy0gTWFrZWZpbGUgY2xlYW51cHMKKy0gVmFyaW91cyBidWcgZml4ZXMKKy0gT3B0aW1pemF0aW9uIG9mIHRoZSBkYnVzIG9iamVjdCB0cmVlIAorLSBNZW1sZWFrcyBhbmQgR0lMIGNyYXNoZXIgYnVncyBoYXZlIGJlZW4gZml4ZWQgaW4gdGhlIFB5dGhvbiBiaW5kaW5ncworCitELUJVUyAwLjM2LjIgKDI5IEF1Z3VzdCAyMDA1KQorPT09CistIFNlY3VyaXR5OiBSZXN0cmljdCBvdGhlciB1c2VycyBmcm9tIGNvbm5lY3RpbmcgdG8gYW5vdGhlciB1c2VycyAKKyAgc2Vzc2lvbiBidXMKKworRC1CVVMgMC4zNi4xICgyNCBBdWd1c3QgMjAwNSkKKz09PQorLSBQeXRob24gQmluZGluZ3M6CisgIC0gZml4ZWQgdG8gd29yayB3aXRoIGhhbC1kZXZpY2UtbWFuYWdlcgorICAtIEZvciA2NGJpdCBidWlsZHMgZXZlcnl0aGluZyBpcyBpbnN0YWxsZWQgdG8gbGliNjQvcHl0aG9uMi40LworICAgIHNpbmNlIFB5dGhvbiBjYW4ndCBoYW5kbGUgbXVsdGlsaWIKKworRC1CVVMgMC4zNiAoMjMgQXVndXN0IDIwMDUpCis9PT0KKy0gTWF4aW11bSBzaXplZCBvZiBjYWNoZWQgbWVzc2FnZXMgaGF2ZSBiZWVuIHJlZHVjZWQgdG8gMTBLCistIE1hdGNoIHJ1bGVzIG5vdyBhbGxvdyBtYXRjaGluZyBvbiBhcmd1bWVudHMgaW5zaWRlIHRoZSBtZXNzYWdlCistIGludHJvc3BlY3QueHNsIFhTTFQgc3R5bGUgc2hlZXQgYWRkZWQgZm9yIGZvcm1hdHRpbmcgaW50cm9zcGVjdGlvbgorICBkYXRhIGludG8gWEhUTUwgZm9yIGFuYWx5c2lzCistIFB5dGhvbiBiaW5kaW5nczoKKyAgLSBub3cgaGF2ZSB3b3JraW5nIHR5cGUgb2JqZWN0cyBmb3IgZXhwbGljaXQKKyAgICB0eXBlY2FzdGluZworICAtIFZhcmlhbnQgdHlwZSBoYXMgYmVlbiBhZGRlZAorICAtIERpY3Rpb25hcmllcywgVmFyaWFudHMgYW5kIEFycmF5cyBjYW4gYWxsIGJlIHBhc3NlZCB0aGUgc2lnbml0dXJlIG9yCisgICAgdHlwZShzKSBvZiB0aGVpciBjaGlsZHJlbgorICAtIHRoZSBvcHRpb25hbCB0aW1lb3V0PSBrZXl3b3JkIGhhcyBiZWVuIGFkZGVkIHdoZW4gbWFraW5nIG1ldGhvZCBjYWxscworICAtIG1hdGNoIG9uIGFyZ3MgaGFzIGJlZW4gaW1wbGVtZW50ZWQKKyAgLSBhIC5wdGggZmlsZSBoYXMgYmVlbiBhZGRlZCBmb3IgZGVhbGluZyB3aXRoIGxpYnJhcmllcyBhbmQgcHl0aG9uIGZpbGVzCisgICAgYmVpbmcgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzIHN1Y2ggYXMgaW4gNjRiaXQgaW5zdGFsbHMKKyAgLSB2YXJpb3VzIGJ1ZyBmaXhlcworLSBHTGliIGJpbmRpbmdzOgorICAtIGRlZXBseSByZWN1cnNpdmUgdHlwZXMgbm93IHN1cHBvcnRlZAorICAtIG1hbnkgc3ltYm9scyBhcmUgbm8gbG9uZ2VyIGV4cG9ydGVkIGFzIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkKKyAgLSB2YXJpb3VzIG1lbWxlYWsgYW5kIG90aGVyIGJ1ZyBmaXhlcworCitELUJVUyAwLjM1LjIgKDE3IEp1bHkgMjAwNSkKKz09PQorLSBSZW5hbWUgVW5peCBTZWN1cml0eSBDb250ZXh0IHRvIFNFTGludXggU2VjdXJpdHkgQ29udGV4dCBpbiBBUEkKKy0gRml4ZWQgbW9yZSBkaXN0IGVycm9ycyB0aGF0IGRpc3RjaGVjayBkaWRuJ3QgcGljayB1cCBvbgorLSBGaXhlZCB2YXJpb3VzIGJ1Z3MgaW4gdGhlIHB5dGhvbiBiaW5kaW5ncyB0aGF0IHByZXZlbnRlZCB0aGVtIGZyb20gd29ya2luZworCitELUJVUyAwLjM1LjEgKDE2IEp1bHkgMjAwNSkKKz09PQorLSBGaXhlZCBkaXN0IGVycm9yIHdoZXJlIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB4ZCB3YXMgYmVpbmcgc2hpcHBlZCAKKyAgaW5zdGVhZCBvZiBkYnVzX2JpbmRpbmdzLnB4ZC5pbgorLSBVc2UgdGhpcyBpbnN0ZWFkIG9mIHRoZSAwLjM1IHRhcmJhbGwgCisKK0QtQlVTIDAuMzUgKDE1IEp1bHkgMjAwNSkKKz09PQorLSAtLXdpdGgtZGJ1cy11c2VyIGFkZGVkIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0cyBmb3IgY29uZmlndXJpbmcgdGhlIAorICB1c2VyIHRoZSBzeXN0ZW0gYnVzIHJ1bnMgb24KKy0gLS13aXRoLWNvbnNvbGUtYXV0aC1kaXIgYWRkZWQgdG8gY29uZmlndXJlIHNjcmlwdHMgZm9yIGNvbmZpZ3VyaW5nIHRoZQorICBkaXJlY3RvcnkgdG8gbG9vayBpbiBmb3IgY29uc29sZSB1c2VyIGxvY2tzCistIHNlcnZpY2UgZmlsZXMgZm9yIGF1dG8tc3RhcnRpbmcgRC1CdXMgc2VydmljZXMgbm93IGhhcyB0aGUgYWJpbGl0eSB0byBwYXNzCisgIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlIGV4ZWN1dGFibGUKKy0gSHVnZSBhdXRvLXN0YXJ0IGJ1ZyBzcXVhc2hlZCB3aGljaCBjYXVzZWQgc29tZSBzZXJ2aWNlcyBub3QgdG8gc3RhcnQgd2hlbgorICByZXF1ZXN0ZWQgaW4gcmFwaWQgc3VjY2Vzc2lvbgorLSBTRS1MaW51eCBzZWN1cml0eSBjb250ZXh0cyBjYW4gbm93IGJlIGFwcGVuZGVkIHRvIG1lc3NhZ2VzIGZvciBpbnNwZWN0aW9uCisgIGJ5IHNlcnZpY2VzIHRoYXQgZW5mb3JjZSB0aGVpciBvd24gc2VjdXJpdHkgcG9saWNpZXMKKy0gQ29saW4gc2F5cyB0aGUgR0xpYiBiaW5kaW5nIGFyZSByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbgorLSBOZXcgR0xpYiB0dXRvcmlhbAorLSBOZXcgR0xpYiBleGFtcGxlIGNvZGUKKy0gUHl0aG9uIGJpbmRpbmdzIGFyZSBub3cgdmVyc2lvbiAoMCw0MiwwKQorLSBQeXRob24gYmluZGluZ3MgQVBJIGhhcyBjaGFuZ2VkIG9uIHRoZSBzZXJ2aWNlIHNpZGUKKy0gZGJ1cy5zZXJ2aWNlIGhhcyBiZWVuIHNwbGl0IG91dCBhcyBhIHNlcGVyYXRlIG1vZHVsZQorLSBkYnVzLnNlcnZpY2UuU2VydmljZSBpcyByZW5hbWVkIHRvIGRidXMuc2VydmljZS5CdXNOYW1lCistIGRidXMuc2VydmljZS5PYmplY3QgaGFzIHN3YXBwZWQgdGhlIGJ1c19uYW1lIGFuZCBvYmplY3RfcGF0aCBjb25zdHJ1Y3RvcgorICBwYXJhbWV0ZXJzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRvIGluaGVyaXRhbmNlIG92ZXIgdGhlIGJ1cworLSBkYnVzLmdsaWIgaGFzIGJlZW4gc2VwZXJhdGVkIG91dCBpbiBvcmRlciB0byBsZXNzZW4gdGhlIGRlcGVuZGVuY3kgb24gZ2xpYgorICBhbmQgdG8gYWxsb3cgb3RoZXIgbWFpbmxvb3BzIHRvIGJlIGludGVncmF0ZWQgd2l0aCB0aGUgYmluZGluZ3MgaW5jbHVkaW5nCisgIGEgcGxhbm5lZCBnZW5lcmljIG1haW5sb29wIGZvciBub24tZ3VpIGFwcHMuCistIFB5dGhvbiBiaW5kaW5ncyBub3cgYXF1aXJlIHRoZSBHSUwgd2hlbiBjYWxsaW5nIGJhY2sgaW50byB0aGUgcHl0aG9uCisgIGludGVycHJldGVyLiAgRml4ZXMgY3Jhc2hlcyB3aGVuIHVzaW5nIHRocmVhZGluZyBhbmQgb3RoZXIgcmFuZG9tIHNlZ2ZhdWx0cy4KKy0gTmV3IFB5dGhvbiB0dXRvcmlhbAorLSBOdW1lcm91cyBELUJ1cyBidWcgZml4ZXMgYWxsIGFyb3VuZAorCitELUJVUyAwLjM0ICgxNSBKdW5lIDIwMDUpCis9PT0KKy0gZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKy0gVGhlIGJ1cyBjYW4gbm93IHVzZSBEX05PVElGWSAoaWYgYXZhaWxhYmxlKSB0byBjaGVjayB3aGVuIGNvbmZpZ3VyYXRpb24gZmlsZXMgCisgIGhhdmUgY2hhbmdlZCBhbmQgcmVsb2FkIHRoZW0KKy0gTmV3IGRidXNfbWVzc2FnZV9oYXNfcGF0aC9tZW1iZXIvaW50ZXJmYWNlIEFQSSBhZGRlZAorLSBUaGUgUGluZyBtZXNzYWdlIGZyb20gdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgaW50ZXJmYWNlIGlzIG5vdyBoYW5kbGVkCistIENvbXBsZXRlIGdsaWIgYmluZGluZ3Mgb3ZlcmhhdWwgKGFuZCBhcmUgc3RpbGwgdW5kZXIgY29uc3RydWN0aW9uKQorLSBUdXRvcmlhbCBub3cgaGFzIGFuIHVwZGF0ZWQgR0xpYiBzZWN0aW9uIAorLSBHTGliIGJpbmRpbmdzIGNhbiBub3cgc2VuZC9yZWNlaXZlIGhhc2ggdGFibGVzLCBhcnJheXMgYW5kIG90aGVyIGNvbXBsZXggdHlwZXMKKy0gUHl0aG9uIGJpbmRpbmdzIG92ZXJoYXVsIChtb3N0IHB1YmxpYyBmYWNpbmcgQVBJJ3MgZG9uZSkKKy0gUHl0aG9uIGJpbmRpbmdzIGhhdmUgYmVlbiBzcGxpdCB1cCBpbnRvIHNlcGFyYXRlIGZpbGVzCistIFB5dGhvbiBhZGRlZCBuZXcgdHlwZSBjbGFzc2VzIGZvciBoaW50aW5nIHRvIHRoZSBtYXJzaGFsZXIgd2hhdCB0eXBlCisgIHRvIHNlbmQgb3ZlciB0aGUgd2lyZQorLSBQeXRob24gYmluZGluZ3Mgbm93IGhhdmUgZGVjb3JhdG9ycyBmb3Igc3BlY2lmeWluZyBleHBvcnRlZCBtZXRob2RzIGFuZCBzaWduYWxzCistIE51bWVyb3VzIGJ1ZyBmaXhlcworCitELUJVUyAwLjMzICgyNSBBcHIgMjAwNSkKKz09PQorCistIGRvd25ncmFkZSByZXF1aXJlbWVudCBmcm9tIEdUSystMi42IHRvIDIuNCBmb3IgYnVpbGRpbmcgZ3RrIGNvbXBvbmVudHMKKy0gcHl0aG9uIGJpbmRpbmcgQVBJJ3MgaGF2ZSBiZWVuIG92ZXJoYWxsZWQgdG8gYmUgbW9yZSAicHl0aG9uaWMiIGFuZCBjbGVhbmVyCistIHB5dGhvbiBiaW5kaW5ncyBub3cgZXhwb3J0IGRidXMudmVyc2lvbiB3aGljaCBpcyBzZXQgdG8gKDAsNDAsMCkKKy0gcHl0aG9uIGJpbmRpbmdzIG5vdyBpbXBsZW1lbnQgdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIGludGVyZmFjZQorLSBweXRob24gYmluZGluZyBtYXRjaCBydWxlcyBhcmUgbm93IG1vcmUgZmxleGFibGUKKy0gbWFrZSBjaGVjayBoYXMgYmVlbiBmaXhlZAorLSBtYW55LCBtYW55IG1ham9yIGJ1ZyBmaXhlcworCitELUJVUyAwLjMyICgyOSBNYXIgMjAwNSkKKz09PQorCistIG1vbm8gYmluZGluZ3Mgbm93IGNvbXBpbGVzIGNvcnJlY3RseQorLSBtb25vIGJpbmRpbmcgY2xlYW51cHMKKy0gZ2xpYiBiaW5kaW5ncyBnZW5lcmF0ZXMgd3JhcHBlcnMgZm9yIGJ1cyBtZXRob2RzIGluIGRidXMtZ2xpYi1iaW5kaW5ncy5oCistIGdsaWIgYmluZGluZyBjbGVhbnVzCistIHVzZXJzIGFuZCBncm91cHMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgYnkgVUlEIGFuZCBHSUQgaW4gY29uZmlnIGZpbGVzCistIG51bWVyb3VzIG1lbW9yeSBsZWFrIGZpeGVzCistIHZhcmlvdXMgb3RoZXIgZml4ZXMKKworRC1CVVMgMC4zMSAoMDcgTWFyIDIwMDUpCis9PT0KKworLSBsYW5kIHRoZSBuZXcgbWVzc2FnZSBhcmdzIEFQSSBhbmQgcmVjdXJzaXZlIHR5cGUgc3lzdGVtCistIGFkZCBkb2NzIGFuZCBmaXhlZCBEb3h5Z2VuIHdhcm5pbmdzIHRocm91Z2h0IHNvdXJjZQorLSBzcGxpdCBvdXQgc29tZSBmdW5jdGlvbnMgbm90IG5lZWRlZCBpbiBsaWJkYnVzIHRvICotdXRpbC5jIHNvdXJjZSBmaWxlcworLSB0YWtlIG91dCB0eXBlIGNvbnZpZW5pZW5jZSBmdW5jdGlvbnMKKy0gbGliZGJ1cyBub3cgYmFjayBiZWxvdyAxNTBLCistIGJvb2xlYW5zIGFyZSBub3cgMzItYml0IGluc3RlYWQgb2YgOC1iaXQKKy0gc3BlY2lmaWNhdGlvbiB1cGRhdGVkCistIGdyYW5kIHJlbmFtaW5nIHRvIHN0cmlwIG91dCB0aGUgdXNlIG9mICJzZXJ2aWNlIgorICBqdXN0IHNheSAibmFtZSIgaW5zdGVhZCAob3IgImJ1cyBuYW1lIiB3aGVuIGFtYmlndW91cykKKy0gcmVuYW1lIGRidXMtZGFlbW9uLTEgdG8gZGJ1cy1kYWVtb24gdGhyb3VnaG91dAorLSByZW5hbWUgYWN0aXZhdGlvbiB0byBhdXRvLXN0YXJ0CistIGF1dG8tc3RhcnQgb24gYnkgZGVmYXVsdCBub3cKKy0gbm90ZSB0aGF0IGxpYmRidXMgaXMgdGhlIGxvdy1sZXZlbCBBUEkKKy0gcHl0aG9uIGJpbmRpbmdzIHVwZGF0ZWQgdG8gdGhlIG5ldyBBUEkKKy0gbW9ubyBiaW5kaW5ncyB1cGRhdGVkIHRvIHRoZSBuZXcgQVBJCistIGFkZCAxNiBiaXQgdHlwZXMKKy0gZGljdGlvbmFyaWVzIGFyZSBub3cgQVJSQVlTIG9mIERJQ1RfRU5UUlkKKy0gZGJ1cy1nbGliLXRvb2wgcmVuYW1lZCB0byBkYnVzLWJpbmRpbmctdG9vbAorLSBtYXNzaXZlIHJld3JpdGUgb2YgdGhlIGdsaWIgYmluZGluZ3MKKy0gc2FuZXIgbmFtZXMgZm9yIHRoZSBkYnVzIGludGVyZmFjZSwgb2JqZWN0IHBhdGggYW5kIHNlcnZpY2UgZGVmaW5lcworLSBuZXcgZnVuY3Rpb25zIGZvciBoYW5kbGluZyB0eXBlIHNpZ25pdHVyZXMKKy0gYnVtcCBzb25hbWVzIGZvciBsaWJkYnVzIGFuZCBsaWJkYnVzLWdsaWIKKy0gdmFyaW91cyBzbWFsbCBmaXhlcworCitELUJVUyAwLjIzICgxMSBKYW4gMjAwNSkKKz09PQorCistIGFkZCBzZXRncm91cHMoKSB0byBkcm9wIHN1cHBsZW1lbnRhcnkgZ3JvdXBzCistIHVwZGF0ZWQgU0VMaW51eCBzdXBwb3J0CistIGFkZCBhbiAiYXQgY29uc29sZSIgc2VjdXJpdHkgcG9saWN5CistIGZpeCBhIGJ1ZyB3aGVyZSBvcmcuZnJlZWRlc2t0b3AuREJ1cyB3YXNuJ3QgcmVjb2duaXplZCBhcyBhbiBleGlzdGluZworICBzZXJ2aWNlLgorLSBlcnJvciBvdXQgaWYgLS1lbmFibGUtbW9ubyBpcyBleHBsaWNpdGx5IHNldCBhbmQgbW9ubyBsaWJzIGNhbid0IGJlIGZvdW5kCistIHNldCB0aGUgbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIGxpbWl0IGZyb20gdGhlIGNvbmZpZyBmaWxlLgorLSByZW1vdmVkIGRidXNfYnVnX2dldF93aXRoX2dfbWFpbiBzaW5jZSBpdCdzIGJlZW4gcmVwbGFjZWQgYnkKKyAgZGJ1c19nX2J1c19nZXQKKy0gZml4IGZkIGxlYWtzIGluIHNvY2tldCBjb2RlCistIGxvdHMgYW5kIGxvdHMgb2YgbW9ubyBiaW5kaW5nIHVwZGF0ZXMsIGluY2x1ZGluZyBmaXhlcyB0byBtYWtlIGl0CisgIGNvbXBhdGlibGUgd2l0aCBNb25vIDEuMS4zCistIGFkZGVkIC0tbm9mb3JrIG9wdGlvbiB0byBvdmVycmlkZSBjb25maWcgZmlsZSBzZXR0aW5nIGF0IHJ1bnRpbWUKKy0gYWRkZWQgc3VwcG9ydCBmb3IgaW50NjQgYW5kIHVpbnQ2NCB0byB0aGUgcHl0aG9uIGJpbmRpbmdzCistIGxvdHMgb2YgcHl0aG9uIGJpbmRpbmcgdXBkYXRlcworLSBjb25maWcgZmlsZSBEVEQgdXBkYXRlcworLSB1c2UgU2VyaXZjZU93bmVyQ2hhbmdlcyBzaWduYWwgaW5zdGVhZCBvZiBTZXJ2aWNlQ3JlYXRlZCBhbmQKKyAgU2VydmljZURlbGV0ZWQKKy0gZml4ZXMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGNvZGUKKy0gbmV3IGluaXQgc2NyaXB0IGZvciBTbGFja3dhcmUKKy0gcHJpbnQgb3V0IHRoZSBwaWQgZXZlbiB3aGVuIC0tZm9yayBpcyBwYXNzZWQKKy0gaW5jcmVhc2UgcHJlYWxsb2NhdGlvbiBzaXplcyBpbiBEQnVzTWVzc2FnZSB0byBoZWF2aWx5IHJlZHVjZQorICByZWFsbG9jcworLSBsb3RzIG9mIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cworLSBsb3RzIG1vcmUgc21hbGwgYnVnIGZpeGVzCisKK0QtQlVTIDAuMjIKKz09PQorCistIGFkZCAtLXJlcGx5LXRpbWVvdXQgdG8gZGJ1cy1zZW5kCistIGZpeCBhIG1lbWxlYWsKKy0gZml4IFNvbGFyaXMvRm9ydGUgYnVpbGQKKy0gc3dpdGNoIHRvIEFGTCAyLjEgcmF0aGVyIHRoYW4gMi4wIHRvIGFkZHJlc3MgcGF0ZW50IHRlcm1pbmF0aW9uIGNsYXVzZSAKKyAgY29uY2VybnMKKy0gYWRkIFNFTGludXggc3VwcG9ydAorLSBtb3N0bHkgcmVwYWlyIGxpYnhtbCBiYWNrZW5kIGZvciBjb25maWcgcGFyc2VyLCBzdGlsbCBkb2Vzbid0IAorICBwYXNzIG91dCBvZiBtZW1vcnkgdGVzdHMKKy0gZml4IGRpc3RjaGVjayB0byBpbmNsdWRlIGxhbmd1YWdlIGJpbmRpbmdzCistIGFkZCBHZXRDb25uZWN0aW9uVW5peFVzZXIgbWV0aG9kIG9uIGJ1cyBkcml2ZXIKKy0gYWxzbyBmb3IgVW5peFByb2Nlc3NJRAorLSBsb3RzIG9mIFB5dGhvbiwgTW9ubywgb3RoZXIgYmluZGluZyBmaXhlcworLSBjaGFuZ2UgR0xpYiBiaW5kaW5ncyB0byBub3QgaW5jbHVkZSBkYnVzL2RidXMuaCAoZnVsbHkgZW5jYXBzdWxhdGUgbGliZGJ1cykKKy0gcGFzcyBwYXRocyBhcyBzdHJpbmdzLCBub3QgYXJyYXlzIG9mIHN0cmluZworLSBhZGQgbWVzc2FnZSBzaWduYXR1cmUgaGVhZGVyIGZpZWxkCistIGNsZWFudXBzIHRvIG1hcnNoYWxpbmcgY29kZQorLSBjbGVhbiB1cCBhdXRoZW50aWNhdGlvbiBjb2RlCistIHJlbG9hZCBjb25mIGZpbGVzIG9uIFNJR0hVUAorLSByZW5hbWUgU0VSVklDRS9TRU5ERVJfU0VSVklDRSB0byBERVNUSU5BVElPTi9TRU5ERVIKKy0gZml4IGNpcmN1bGFyIGNvbmYgZmlsZSBpbmNsdXNpb24KKy0gYWxsb3cgZW1wdHkgYXJyYXlzCistIHRvbnMgb2Ygb3RoZXIgc21hbGwgYnVnZml4ZXMKKworRC1CVVMgMC4yMQorPT09CisKKy0gaW1wbGVtZW50ICJhdXRvIGFjdGl2YXRpb24iIGZsYWcgb24gbWVzc2FnZXMsIHNvIHRoZSBkZXN0aW5hdGlvbiAKKyAgc2VydmljZSBjYW4gYmUgbGF1bmNoZWQgYXV0b21hdGljYWxseQorLSBmaXggYSBidWcgaW4gY3VzdG9tIHR5cGUgbWFyc2hhbGluZworLSBvcHRpbWl6ZSBjYXNlIHdoZXJlIG11bHRpcGxlIGFwcHMgYWN0aXZhdGUgdGhlIHNhbWUgc2VydmljZQorICAoYXZvaWQgInRodW5kZXJpbmcgaGVyZCIpCistIGFkZCBkeW5hbWljIHNlcnZpY2UgZmlsZSBkaXNjb3ZlcnkvcmVsb2FkaW5nCistIGZpeCBhIGJ1c3kgbG9vcCB3aGVuIGJsb2NraW5nIGZvciBhIHJlcGx5CistIGZpeCBhIDY0LWJpdCBjcmFzaCBpbnZvbHZpbmcgdmFyYXJncworLSBmaXggYSBidXMgY3Jhc2ggd2hlbiBwcm9jZXNzaW5nIGFuIEFjcXVpcmVTZXJ2aWNlCistIGFsbG93IGFwcGVuZGluZyBUWVBFX0JZVEUgdmlhIGFwcGVuZF9hcmdzX3ZhbGlzdAorLSBmaXggZGljdHMtaW5zaWRlLWRpY3RzCistIGVuaGFuY2VtZW50cyB0byBQeXRob24gYW5kIFF0IGJpbmRpbmdzCisKK0QtQlVTIDAuMjAKKz09PQorCitUaGlzIHJlbGVhc2UgbGFuZHMgc29tZSB2ZXJ5IGxhcmdlIEFQSSBjaGFuZ2VzIGFuZCBudW1lcm91cyBidWdmaXhlcy4KK1RoZSBsaXN0IG9mIGNoYW5nZXMgaXMgdG9vIGxhcmdlIHRvIGZ1bGx5IGRvY3VtZW50IGhlcmU7IHBsZWFzZSByZWZlcgordG8gdGhlIGRvY3VtZW50YXRpb24sIGFuZCBtZXNzYWdlLWJ1cy1saXN0IGFyY2hpdmVzLgorCitELUJVUyAwLjEzCis9PT0KKworVGhpcyBpcyBwcm9iYWJseSB0aGUgbGFzdCByZWxlYXNlIGJlZm9yZSBsYW5kaW5nIHRoZSBsYXJnZSBBUEkgY2hhbmdlcworb24gdGhlICJkYnVzLW9iamVjdC1uYW1lcyIgYnJhbmNoLgorCistIGZpeCBzeXN0ZW0gYnVzIHRvIGFsd2F5cyB1c2UgZmlsZXN5c3RlbSBzb2NrZXQ7IGFueW9uZSAKKyAgY2FuIGNyZWF0ZSBhbnkgYWJzdHJhY3Qgc29ja2V0LCB3aGljaCBpc24ndCBzZWN1cmUgCisgIHNpbmNlIGlmIHlvdSBjYW4gY3Jhc2ggdGhlIHN5c3RlbSBidXMgeW91J2QgYmUgYWJsZQorICB0byByZXBsYWNlIGl0LgorLSBhZGQgRFREIGZvciBjb25maWd1cmF0aW9uIGZpbGUKKy0gaW1wcm92ZSBzcGVjaWZpY2F0aW9uIGEgYml0CisKK0QtQlVTIDAuMTIKKz09PQorCistIGZpeCAic2VydmljZSBtZXNzYWdlYnVzIHN0YXR1cyIgb24gUmVkIEhhdAorLSBmaXggZGVtYXJzaGFsaW5nIG9mIERCVVNfVFlQRV9OQU1FRAorLSBmaXggImV2YWwgYGRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb25gIiB0byBleGl0IHByb3Blcmx5CistIGZpeCBidWlsZCB3aXRob3V0IC0tcHJlZml4CistIHVzZWxlc3MgZm9vbGluZyB3aXRoIE1vbm8gYmluZGluZ3MKKy0gdXNlbGVzcyBmb29saW5nIHdpdGggZ2NqIGJpbmRpbmdzCistIGZpeCBzcmNkaXIgIT0gYnVpbGRkaXIKKy0gZml4IHZhcmlvdXMgY29tcGlsZXIgd2FybmluZ3MgYW5kIG90aGVyIGlzc3VlcworLSBhZGQgZ2V0L3NldCBkYXRhIHRvIERCdXNNZXNzYWdlCistIGZpeCBoZWFkZXJzIGZvciBDKysKKy0gT1MgWCBidWlsZCBmaXhlcworLSBhYnN0cmFjdCBkb21haW4gc29ja2V0cyBzdXBwb3J0IChMaW51eCBvbmx5KQorLSBhZGQgZGJ1cy1jbGVhbnVwLXNvY2tldHMgdXRpbGl0eSBmb3IgcGVvcGxlCisgIG5vdCB1c2luZyBsaW51eAorLSBiZSBjb25zaXN0ZW50IGFib3V0IGRlZmF1bHRpbmcgdG8gLS1zZXNzaW9uLy0tc3lzdGVtIAorICB3aXRoIGNvbW1hbmQgbGluZSB0b29scworLSBtZXJnZSBpbiBwb2xpY2llcyBmcm9tIGluY2x1ZGVkIGNvbmZpZyBmaWxlcworLSBmaXggYnVpbGQgb24gbm9uLXg4NgorLSBkb2NzIHVwZGF0ZXMKKy0gbG90cyBvZiBvdGhlciBidWdmaXhlcworCitELUJVUyAwLjExCis9PT0KKworLSBhZGQgLS1lbmFibGUtZG9jcyB0byB0dXJuIG9mZi9vbiB0aGUgZG9jYm9vayBzdHVmZgorICAoZG9lc24ndCBjb3ZlciBkb3h5Z2VuIHN0dWZmIHlldCkKKy0gbWFrZSBwZW9wbGUgZGVmaW5lIERCVVNfQVBJX1NVQkpFQ1RfVE9fQ0hBTkdFCisgIGFuZCByZWFkIHdhcm5pbmcgaW4gUkVBRE1FIHNvIHRoZXkgZG9uJ3QgCisgIGV4cGVjdCB0aGUgQVBJIHRvIGJlIGZyb3plbiBhbHJlYWR5CistIHJlbmFtZSAucGMgZmlsZXMgdG8gImRidXMtMS5wYyIgaW5zdGVhZCBvZiAKKyAgImRidXMtMS4wLnBjIiBldGMuIC0gdGhpcyB3aWxsIHJlcXVpcmUgY2hhbmdpbmcgCisgIHBrZy1jb25maWcgaW52b2NhdGlvbnMKKy0gc29tZSBkb2NzIGNsZWFudXBzCistIGFkZCBtYW4gcGFnZXMgZm9yIGFsbCBleGVjdXRhYmxlcworLSBhbGxvdyBzZW5kIHRvL2Zyb20gYnVzIGRyaXZlciBpbiB0aGUgZGVmYXVsdCBzeXN0ZW0uY29uZgorLSBmaXggdXNlciBsb29rdXAgYnVnCistIGltcGxlbWVudCBkYnVzLWxhdW5jaCB0byBsYXVuY2ggdGhlIHNlc3Npb24gbWVzc2FnZSBidXMKKy0gZml4IHNvbWUgdGhyZWFkIGRlYWRsb2NrcworLSBzb21lIHBlcmZvcm1hbmNlIHByb2ZpbGluZy9vcHRpbWl6YXRpb24KKy0gYWRkIGRidXNfYnVzX2FjdGl2YXRlX3NlcnZpY2UoKSBmdW5jdGlvbgorLSBmaXggc29tZSBtaW5vciBidWdzIGhlcmUgYW5kIHRoZXJlCistIGluc3RhbGwgUmVkIEhhdCBpbml0c2NyaXB0IGluIHRoZSByaWdodCBwbGFjZQorCitELUJVUyAwLjEwCis9PT0KKworLSByZXZlcnNlZCBvcmRlciBvZiBhcmdzIHRvIGRidXNfbWVzc2FnZV9uZXcoKQorLSByZW5hbWVkIGRidXNfbWVzc2FnZV9uYW1lX2lzKCkgYW5kIHNvbWUgb3RoZXIKKyAgZnVuY3Rpb25zCistIGNoYW5nZSBEQnVzV2F0Y2ggdG8gaGF2ZSBkYnVzX3dhdGNoX2hhbmRsZSgpIAorICBzaW1pbGFyIHRvIGRidXNfdGltZW91dF9oYW5kbGUoKSwgZHJvcCAKKyAgY29ubmVjdGlvbi9zZXJ2ZXItc3BlY2lmaWMgaGFuZGxlIHJvdXRpbmVzCistIGNoYW5nZSBtZXNzYWdlIHNlcmlhbHMgdG8gYmUgdW5zaWduZWQKKy0gaW1wbGVtZW50ZWQgPGFsbG93Pi88ZGVueT4vPGxpbWl0PiBmZWF0dXJlcyBmb3IgCisgIGNvbmZpZyBmaWxlOyBzeXN0ZW0gYnVzIG5vdyBoYXMgYSBkZW55LWFsbCBwb2xpY3kgCisgIGJ5IGRlZmF1bHQuCistIHN5c3RlbS5jb25mIGhhcyA8aW5jbHVkZWRpcj5zeXN0ZW0uZDwvaW5jbHVkZWRpcj4KKyAgc28gcGFja2FnZXMgY2FuIGluc3RhbGwgYWRkaXRpb25zIHRvIHRoZSBkZWZhdWx0IAorICBwb2xpY3kgdG8gPGFsbG93PiB0aGUgbWVzc2FnZXMgdGhleSBuZWVkLiBlLmcuCisgIENVUFMgbWlnaHQgaW5zdGFsbCBhIGN1cHMuY29uZiAtIHNlZSAKKyAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZC90ZXN0LmNvbmYgCisgIGZvciBhbiBleGFtcGxlLgorLSBhZGQgdGltZW91dHMgZm9yIGF1dGhlbnRpY2F0aW9uLCBhY3RpdmF0aW9uCistIGFkZCBnbGliLXN0eWxlICJjaGVja3MiIG9uIHB1YmxpYyBBUEksIGVuYWJsZSAKKyAgdGhvc2UgYnkgZGVmYXVsdCwgZGlzYWJsZSBhc3NlcnRpb25zIGJ5IGRlZmF1bHQKKy0gYWRkIEdNYWluQ29udGV4dCBhcmd1bWVudCB0byBHTGliIHNldHVwIGZ1bmN0aW9ucywgCisgIGNhbiBiZSBOVUxMIGZvciBkZWZhdWx0IGNvbnRleHQuIE5lZWRlZCBmb3IgdGhyZWFkcy4KKy0gYWRkIDY0LWJpdCBpbnRlZ2VyIHR5cGUKKy0gdmFsaWRhdGUgdHlwZSBvZiBzdGFuZGFyZCBtZXNzYWdlIGhlYWRlciBmaWVsZHMKKy0gY29uc2lkZXIgbWVzc2FnZXMgaW4gdGhlIG9yZy5mcmVlZGVza3RvcC5Mb2NhbAorICBuYW1lc3BhY2UgdG8gYmUgaW52YWxpZCAodG8gYXZvaWQgZmFrZSBkaXNjb25uZWN0IAorICBtZXNzYWdlcyBmb3IgZXhhbXBsZSkKKy0gZml4IGFzc29ydGVkIG1lbW9yeSBsZWFrcyBhbmQgb3RoZXIgYnVncyBpbiAKKyAgdGhlIFNIQS0xIGF1dGggbWVjaGFuaXNtCistIGNhY2hlIHVzZXIgZGF0YWJhc2UgaW5mb3JtYXRpb24gKGdyb3VwcyB1c2VyIGlzIAorICBpbiwgZXRjLikgaGVscHMgYSBsb3Qgd2l0aCBOSVMKKy0gYWx3YXlzIHN0b3JlIHVpZF90LCBwaWRfdCwgZ2lkX3QgaW4gInVsb25nIiAKKyAgcmF0aGVyIHRoYW4gImludCIKKy0gaW1wbGVtZW50IGNvbmZpZyBmaWxlIHNldHRpbmdzIGZvciB3aGljaCAKKyAgdXNlcnMgY2FuIGNvbm5lY3QKKy0gU0hBLTEgdW5pdCB0ZXN0CistIGRidXMtc2VuZCwgZGJ1cy1tb25pdG9yIGNvbW1hbmQgbGluZSB1dGlsaXRpZXMKKy0gZml4ZWQgbG90cyBvZiBtaXNjIGNyYXNoZXMgYW5kIG90aGVyIGJ1Z3MKKworRC1CVVMgMC45Cis9PT0KKworLSBpbXBsZW1lbnRlZCBhIHRlc3QgY2FzZSBmb3Igc2VydmljZSBhY3RpdmF0aW9uLAorICBhbmQgZml4ZWQgbWFueSBidWdzIGV4cG9zZWQgYnkgdGhhdAorLSBpbXBsZW1lbnRlZCByZWN1cnNpdmUgYXJndW1lbnQgbWFyc2hhbGluZy9kZW1hcnNoYWxpbmcgCisgIGZvciBtZXNzYWdlcywgYWxsb3dpbmcgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMKKy0gZml4ZWQgdXAgaW50ZWdyYXRpb24gb2YgbWVzc2FnZSBkaXNwYXRjaCB3aXRoIAorICBtYWluIGxvb3AgYnkgYWRkaW5nIGEgY2FsbGJhY2sgb24gY2hhbmdlIG9mIAorICBkaXNwYXRjaCBzdGF0dXMKKy0gYWRkIGEgcGlkZmlsZSBmZWF0dXJlIHRvIGRhZW1vbgorLSBzb21lIGJ1aWxkIGZpeGVzCistIGNsZWFuIHVwIHVuaXggZG9tYWluIHNvY2tldHMgb24gZXhpdAorLSBhZGQgLS1wcmludC1hZGRyZXNzIGFuZCB0aGUgYWJpbGl0eSAKKyAgdG8gY3JlYXRlIGEgcmFuZG9tIHNlcnZlciBhZGRyZXNzIAorICBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKKworRC1CVVMgMC44Cis9PT0KKworLSBmaXggZHVtYiBidWcgaW4gMC43CisKK0QtQlVTIDAuNworPT09CisKKy0gaW1wbGVtZW50IGNvbmZpZ3VyYXRpb24gZmlsZSB1c2VkIHRvIGNvbnRyb2wgYnVzIGNoYXJhY3RlcmlzdGljcworLSBpbXBsZW1lbnQgZGFlbW9uIG1vZGUsIGNoYW5naW5nIHVzZXIgSUQsIGFuZCBvdGhlciBzeXN0ZW0KKyAgYnVzIGZlYXR1cmVzCistIGFkZCBpbml0IHNjcmlwdHMgZm9yIHN5c3RlbXdpZGUgYnVzCistIGFkZCAibWFrZSBjaGVjay1jb3ZlcmFnZSIgdGFyZ2V0IHRvIGNoZWNrIHRlc3QgY292ZXJhZ2UKKy0gbW9yZSB0ZXN0IHN1aXRlIGFkZGl0aW9ucworLSBtYW55LCBtYW55IGJ1Z2ZpeGVzCistIG1hbnkgQVBJIGNoYW5nZXMvZml4ZXMKKworRC1CVVMgMC42Cis9PT0KKy0gVmFzdGx5IGltcHJvdmVkIGJ1cyBkYWVtb24gdGVzdCBzdWl0ZQorLSBMb3RzIG9mIG1pc2MuIGJ1Z2ZpeGVzIGFuZCBtZW1vcnkgbGVhayBmaXhlcworLSBTdXBwb3J0IGZvciBtYXJzaGFsbGluZyBrZXkvdmFsdWUgZGF0YQorLSBBY3RpdmF0aW9uIGltcHJvdmVtZW50cy4KKworRC1CVVMgMC41Cis9PT0KKworLSBTcGVjaWZpY2F0aW9uIHVwZGF0ZXMKKy0gcG9ydCB0byBPUyBYIGFuZCBvdGhlciBCU0QgdmFyaWFudHMKKy0gcG9ydCB0byBTb2xhcmlzCistIFBhcnRpYWwgd29yayBvbiBjb29raWUtYmFzZWQgYXV0aGVudGljYXRpb24KKy0gVGhyZWFkIHNhZmV0eSBmaXhlcworLSBMb3RzIG9mIG1pc2MuIGJ1Z2ZpeGVzCistIFN1cHBvcnQgZm9yIG1vcmUgYXJyYXkgdHlwZXMKKy0gQWRkIGRhdGEgc2xvdHMgdG8gREJ1c1NlcnZlcgorLSBEQnVzU3RyaW5nIHNlY3VyaXR5IGF1ZGl0IGZpeGVzCistIEZpeCBmb3Igc3lzdGVtcyAob3IgdmFsZ3JpbmQpIHdpdGggdW5hbGlnbmVkIG1hbGxvYyBibG9ja3MKKworRC1CVVMgMC40Cis9PT0KKworLSBQcmVsaW1pbmFyeSBhY3RpdmF0aW9uIHN1cHBvcnQuCistIEJldHRlciBhdXRoZW50aWNhdGlvbiB0ZXN0IHN1aXRlCistIEJ1cyB0ZXN0IHByb2dyYW0KKy0gU3BlY2lmaWNhdGlvbiB1cGRhdGVzCistIFRocmVhZCBzYWZldHkKKy0gQnVnIGZpeGVzCisKK0QtQlVTIDAuMworPT09CisKKyAtIFByZWxpbWluYXJ5IGxpbWl0YXRpb25zIAorIC0gTWVzc2FnZSBzZW5kaW5nIHdvcmtzCisgLSBCdXMgY2xpZW50CisgLSBBcnJheSBtYXJzaGFsbGluZy9kZW1hcnNoYWxsaW5nCisgLSBTZXJ2aWNlcworIC0gQmV0dGVyIE9PTSBoYW5kbGluZyBpbiB0aGUgYnVzCisgLSBJbi1wcm9jIGRlYnVnIHRyYW5zcG9ydAorIC0gVHJhbnNwb3J0L3NlcnZlciBhZGRyZXNzIHN1cHBvcnQKKworRC1CVVMgMC4yCis9PT0KKworIC0gSW5jbHVkZSB0ZXN0IGNvZGUgaW4gdGhlIHRhcmJhbGwuCisKK0QtQlVTIDAuMQorPT09CisKKyAtIEluaXRpYWwgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL05FV1MucHJlLTEtMiBiL2RidXMtMS40LjEwL05FV1MucHJlLTEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTg5OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvTkVXUy5wcmUtMS0yCkBAIC0wLDAgKzEsMTUzIEBACitELUJ1cyAxLjIuMSAoMDQgQXByaWwpCis9PQorLSBEdWUgdG8gaXNzdWVzIHB1dHRpbmcgdGhlIHJlLWxpY2Vuc2luZyBlZmZvcnQgb24gaG9sZCBpbmRlZmluaXRlbHksIGl0IGhhcyAKKyAgYmVlbiBkZWNpZGVkIHRvIG1vdmUgdG8gMS4yLnggdmVyc2lvbmluZyBzY2hlbWUuICBCZWluZyB0aGF0IDEuMS4yMCBpcyAKKyAgY29uc2lkZXJlZCB0byBhbHNvIGJlIDEuMi4wIGFuZCB0aGlzIGJlaW5nIHRoZSBzZWNvbmQgcmVsZWFzZSBpbiB0aGUgMS4yLnggCisgIHN0YWJsZSBzZXJpZXMgd2UgaGF2ZSB2ZXJzaW9uZWQgdGhpcyByZWxlYXNlIDEuMi4xLiBUaGlzIHJlbGVhc2UgY29udGFpbnMgYSAKKyAgbnVtYmVyIG9mIGJ1ZyBmaXhlcyBpZGVudGlmaWVkIGFmdGVyIDEuMS4yMC4KKy0gY29tcGlsZXMgdW5kZXIgc29tZSBvbGRlciB2ZXJzaW9ucyBvZiBnbGliYworLSBjb21waWxlcyB3aXRob3V0IFggc3VwcG9ydCBvbmNlIGFnYWluCistIGZpeCBzdHVjayBzZXJ2ZXIgZ3JhYiBpZiBkYnVzLWxhdW5jaCBpcyBydW4gaW4gYW4gZXhpc3RpbmcgRC1CdXMgWCBzZXNzaW9uCistIHZhcmlvdXMgTWFjIE9TWCBidWlsZCBmaXhlcyBhZGRlZAorLSBkb24ndCB1c2UgdGhlIGJyb2tlbiBwb2xsIGNhbGwgb24gTWFjIE9TWAorLSBiZXR0ZXIgY2hlY2tzIGZvciBsaW5rZXIgZmxhZyBzdXBwb3J0IHNob3VsZCBhbGxvdyBELUJ1cyB0byBsaW5rIHVuZGVyCisgIHZhcmlvdXMgbGlua2VycworLSBleGl0X29uX2Rpc2Nvbm5lY3QgaXMgc2V0IGFmdGVyIHRoZSBjb25uZWN0aW9uIHJlZ2lzdGVycyB3aXRoIGEgYnVzIHNvIHdlIAorICBkb24ndCBleGl0IGlmIHdlIGdldCBhIGRpc2Nvbm5lY3QgZHVyaW5nIHRoZSBoYW5kc2hha2UKKy0gZGljdHMgbm93IHdvcmsgY29ycmVjdGx5IHdpdGggZGJ1cy1zZW5kCistIGlub3RpZnkgYmFja2VuZCBpcyBub3cgbGVzcyBhZ2dyZXNzaXZlCistIHBlbmRpbmcgY2FsbHMgZXhwaXJlIGNvcnJlY3RseQorLSBtZW1sZWFrIG9mIHV1aWQgd2hlbiB0aGUgYnVzIGlzIGF1dG9sYXVuY2hlZCBmaXhlZAorCitELUJ1cyAxLjEuMjAgLSAiQ29uaXN0ZW4gV2F0ZXIiICgyNyBGZWJ1YXJ5KQorPT0KKworLSBUaGlzIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gc3VwcG9ydGVkIFNUQUJMRSByZWxlYXNlIG9mIEQtQnVzLiBGb3IgYWxsIAorICBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGlzIGlzIHRoZSAxLjIuMCByZWxlYXNlIFdJVEhPVVQgdGhlIHBsYW5uZWQgWDExL01JVCAKKyAgbGljZW5zZSBjaGFuZ2UgZHVlIHRvIGEgY291cGxlIG9mIGxpY2Vuc2UgaG9sZGVycyB3aG8gaGF2ZSB5ZXQgdG8gcmVzcG9uZC4KKyAgRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBsaWNlbnNlIGNoYW5nZSBpcyBiZWluZyBwZXJzdWVkIHRvIHNpbXBsaWZ5IGxpY2Vuc2luZworICBpc3N1ZXMgYW5kIGZpeCBhIGNvdXBsZSBvZiBsaWNlbnNpbmcgY291cm5lciBjYXNlcy4gIFdoZW4gdGhpcyBoYXBwZW5zIEQtQnVzCisgIHdpbGwgYmUgcmVsZWFzZWQgdW5kZXIgdGhlIDEuMi4wIHZlcnNpb24uCisKKy0gRC1CdXMgMS4wLnggZWZmZWN0aXZlbHkgZ29lcyBpbnRvIHNlY3VyaXR5IGZpeCBtb2RlIGFuZCB3aWxsIG9ubHkgYmUKKyAgdXBkYXRlZCBmb3IgbWFqb3IgaXNzdWVzLgorCistIEZpeGVkIENWRS0yMDA4LTA1OTUgLSBzZWN1cml0eSBwb2xpY3kgb2YgdGhlIHR5cGUgPGFsbG93IHNlbmRfaW50ZXJmYWNlPQorICAic29tZS5pbnRlcmZhY2UuV2l0aE1ldGhvZHMiLz4gd29yayBhcyBhbiBpbXBsaWNpdCBhbGxvdyBmb3IKKyAgbWVzc2FnZXMgc2VudCB3aXRob3V0IGFuIGludGVyZmFjZSBieXBhc3NpbmcgdGhlIGRlZmF1bHQgZGVueSBydWxlcyBhbmQgCisgIHBvdGVudGlhbGx5IGFsbG93aW5nIHJlc3RyaWN0ZWQgbWV0aG9kcyBleHBvcnRlZCBvbiB0aGUgYnVzIHRvIGJlIGV4ZWN1dGVkCisgIGJ5IHVuYXV0aG9yaXplZCB1c2Vycy4gCisKKy0gRml4ZXMgZGJ1cy1sYXVuY2ggc28gdGhlIHNlc3Npb24gYnVzIGdvZXMgYXdheSBzbyBkb2VzIEQtQnVzCisKKy0gQnVpbGRzIGFnYWluc3QgbGF0ZXN0IGdjYy9nbGliYyBjaGFuZ2VzCisKKy0gQ29ycmVjdGx5IHVucmVmIGNvbm5lY3Rpb25zIHdpdGhvdXQgZ3VpZHMgZHVyaW5nIHNodXRkb3duCisKKy0gQWJvdXQgdGhlIG5hbWU6IFN1Ym1pdHRlZCBieSBHcmVnIEsgTmljaG9sc29uLCBDb25pc3RlbiBXYXRlciBpcyBhIGxha2UgaW4gCisgIEN1bWJyaWEsIEVuZ2xhbmQgd2hlcmUgc2V2ZXJhbCB3YXRlciBzcGVlZCByZWNvcmRzIGhhdmUgYmVlbiBicm9rZW4uIEJldHdlZW4gCisgIDE5NTYgYW5kIDE5NTkgU2lyIE1hbGNvbG0ncyBzb24gRG9uYWxkIENhbXBiZWxsIHNldCBmb3VyIHN1Y2Nlc3NpdmUgcmVjb3JkcyBvbiAgdGhlIGxha2UgaW4gQmx1ZWJpcmQgSzcsIGEgaHlkcm9wbGFuZS4KKyAgKFdpa2lwZWRpYSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmlzdG9uX1dhdGVyI1dhdGVyc3BlZWRfcmVjb3JkKQorCitELUJ1cyAxLjEuNCAtIDEuMi4wUkMyICgxNyBKYW51YXJ5IDIwMDcpCis9PQorLSBGaXhlcyBpbm90aWZ5IHN1cHBvcnQKKworRC1CdXMgMS4xLjMgLSAxLjIuMFJDMSAoMTUgSmFudWFyeSAyMDA3KQorPT0KKworLSBUaGlzIHJlbGVhc2UgaXMgaW50ZW5kZWQgdG8gYmUgUmVsZWFzZSBDYW5kaWRhdGUgMSBvZiBtYWpvciByZWxlYXNlCisgIEQtQnVzIDEuMi4wLiAgSWYgbm90aGluZyBpcyBmb3VuZCB0byBiZSB3cm9uZyB3aXRoIHRoaXMgcmVsZWFzZSBpdAorICB3aWxsIGJlY29tZSAxLjIuMCB3aXRoaW4gYSB3ZWVrLiAgSWYgd2UgbmVlZCB0byBtYWtlIG1ham9yIGNoYW5nZXMKKyAgd2Ugd2lsbCByZWxlYXNlIGFuIFJDMiBhbmQgc3RhcnQgdGhlIHByb2Nlc3Mgb3ZlciBhZ2Fpbi4KKworLSBUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgcmVsZWFzZSwgc28gQVBJJ3MgbWF5IHN0aWxsIGNoYW5nZSBpZiBwcm9ibGVtcworICBhcmUgZm91bmQgKHRob3VnaCB0aGlzIGlzIGV4dHJlYW1seSB1bmxpa2VseSkuCisKKy0gRFREIGZvciB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgaXMgZml4ZWQgYW5kIHVwbG9hZGVkIHRvIHRoZSBzZXJ2ZXJzCisKKy0gU291cmNlcyBub3cgcmVzaWRlIGluIGEgZ2l0IHJlcG9zaXRvcnkgYXQgCisgIGh0dHA6Ly9naXR3ZWIuZnJlZWRlc2t0b3Aub3JnLz9wPWRidXMvZGJ1cy5naXQ7YT1zdW1tYXJ5CisKKy0gQXJndW1lbnQgcGF0aCBtYXRjaGluZyBvZiB0aGUgdHlwZSBhcmcwcGF0aD0nL2FhL2JiLycgaXMgbm93IHN1cHBvcnRlZAorICAoc2VlIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uKQorCistIE5ldyBlcnJvciBvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5PYmplY3RQYXRoSW5Vc2UgYWRkZWQKKworLSBBdXRvbGF1bmNoZWQgYnVzc2VzIG5vdyBzYXZlIHRoZWlyIHBhcmFtZXRlcnMgaW4gWDExIGlmIHBvc3NpYmxlIG1ha2luZyB0aGVtCisgIGJlaGF2ZSBjbG9zZXIgdG8gYnVzc2VzIGxhdW5jaGVkIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc21zIAorCistIGlub3RpZnkgaXMgbm93IHRoZSBkZWZhdWx0IGJhY2tlbmQgZm9yIHdhdGNoaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBjaGFuZ2VzCisKKy0gTW9yZSBzdXBwb3J0IGZvciB0aGUgQUlYIHBsYXRmb3JtIGhhcyBiZWVuIGFkZGVkCisKKy0gTnVtZXJvdXMgYnVnIGZpeGVzIGFuZCBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMKKworRC1CdXMgMS4xLjIgKDI3IEp1bHkgMjAwNykKKz09CisKKy0gVGhpcyByZWxlYXNlIGlzIGludGVuZGVkIHRvIGJlIGEgZmVhdHVyZSBjb21wbGV0ZSBiZXRhIGZvciBzdGFibGUKKyAgcmVsZWFzZSAxLjIuMCwgcGxlYXNlIHRlc3QgaXQuIDEuMi4wIHdpbGwgZm9sbG93IHByZXR0eSBzb29uIGlmIG5vCisgIG1ham9yIHByb2JsZW1zIGFyZSBmb3VuZC4gIFdlJ2xsIGRvIG1vcmUgYmV0YXMgaWYgc2lnbmlmaWNhbnQKKyAgY2hhbmdlcyBhcmUgbWFkZS4KKworLSBUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgcmVsZWFzZSwgc28gQVBJJ3MgbWF5IHN0aWxsIGNoYW5nZSBpZiBwcm9ibGVtcworICBhcmUgZm91bmQgKHRob3VnaCB3ZSB3aWxsIHRyeSBoYXJkIG5vdCB0bykuCisKKy0gVGhlIHN5c3RlbSBidXMgbm93IHN1cHBvcnRzIHN0YXJ0aW5nIHNlcnZpY2VzIG9uIGRlbWFuZC4gVGhpcyB1c2VzIGEKKyAgc2V0dWlkIGhlbHBlciBwcm9ncmFtIGJlY2F1c2Ugc3lzdGVtIGJ1cyBkYWVtb24gcnVucyBhcyBhIG5vYm9keQorICB1c2VyLCB3aGlsZSBzZXJ2aWNlcyBpdCBsYXVuY2hlcyBtYXkgbmVlZCB0byBydW4gYXMgYSBkaWZmZXJlbnQKKyAgdXNlci4KKworICAqKipFeHRyYSBleWVzIGF1ZGl0aW5nIHRoZSBzZXR1aWQgaGVscGVyIGFyZSBlbmNvdXJhZ2VkIGFuZCB3b3VsZCBiZQorICB0aW1lbHkgcmlnaHQgbm93LCBiZWZvcmUgMS4yLjAqKioKKworICBBIGRlc2lnbiBkb2MgaXMgYXZhaWxhYmxlIGluIGRvYy9zeXN0ZW0tYWN0aXZhdGlvbi50eHQKKworLSBUaGUgVENQIGFkZHJlc3MgZm9ybWF0IGhhcyBiZWVuIGVuaGFuY2VkLCBzdWNoIHRoYXQgVENQIG1heSBiZQorICBhY3R1YWxseSB1c2FibGUuICBUaGUgZGJ1cy1kYWVtb24gbWFuIHBhZ2UgZGVzY3JpYmVzIHRoZSBuZXcKKyAgZWxlbWVudHMgaW4gdGhlIGFkZHJlc3MgZm9ybWF0LiAgMS4xLjEgaGFkIGFkZGVkIGFuIGFsbF9pbnRlcmZhY2VzCisgIGZsYWcgdG8gdGhlIGZvcm1hdCwgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZCBpbiBmYXZvciBvZiBhIGNsZWFuZXIKKyAgYXBwcm9hY2guCisKKy0gU29tZSB0aHJlYWQtcmVsYXRlZCBidWdzIGhhdmUgYmVlbiBmaXhlZCwgdGhlc2UgYXJlIGltcG9ydGFudCBmaXhlcworICBpZiB5b3UgYXJlIHVzaW5nIG11bHRpcGxlIHRocmVhZHMgd2l0aCBsaWJkYnVzLCBhbmQgbm90IGltcG9ydGFudAorICBvdGhlcndpc2UuCisKKworRC1CdXMgMS4xLjEgKDE4IEp1bmUgMjAwNykKKz09CistIFRoaXMgaXMgYSBkZXZlbG9wbWVudCByZWxlYXNlLCB1bmxlc3MgeW91IG5lZWQgc3BlY2lmaWMgCisgIGZ1bmN0aW9uYWxpdHkgcGxlYXNlIHVzZSB0aGUgc3RhYmxlIHJlbGVhc2VzIGFzIEFQSSdzIG1heSBjaGFuZ2UKKyAgKHRob3VnaCB3ZSB3aWxsIHRyeSBoYXJkIG5vdCB0bykKKy0gVGhlIGJ1cyBkYWVtb24gbm93IGdlbmVyYXRlcyBhIGdsb2JhbGx5LXVuaXF1ZSBJRCBmb3IgaXRzZWxmLCB3aGljaCBpcyBhdmFpbGFibGUgCisgIHVzaW5nIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiBkYnVzX2J1c19nZXRfaWQoKS4gVXNlIHRoaXMgYXMgYSB1bmlxdWUgSUQgCisgIGZvciBhIHVzZXIncyBzZXNzaW9uLCBmb3IgZXhhbXBsZS4KKy0gZGJ1c19zZXJ2ZXJfZ2V0X2lkKCksIGRidXNfY29ubmVjdGlvbl9nZXRfc2VydmVyX2lkKCkgbm93IGF2YWlsYWJsZSB0byBhY2Nlc3MKKyAgdGhlIHVuaXF1ZSBJRCBvZiBhIHBhcnRpY3VsYXIgYWRkcmVzcworLSBkYnVzX3dhdGNoX2dldF9mZCgpIGRlcHJlY2F0ZWQgc2luY2UgaXQgaGFkIHVuY2xlYXIgY3Jvc3MtcGxhdGZvcm0gc2VtYW50aWNzLgorICBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkgYW5kIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCgpIHJlcGxhY2UgaXQuCistIHN1cHBvcnQgQU5PTllNT1VTIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24sIHdoaWNoIGFsbG93cyBhIGNsaWVudCB0byAKKyAgYXV0aGVudGljYXRlIGFzIG5vYm9keSBpbiBwYXJ0aWN1bGFyCistIGFkZCBBUEkgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMoKSB3aGljaCB3aWxsIGFsbG93IHRoZSBtZXNzYWdlCisgIHN0cmVhbSB0byBiZWdpbiBpZiB0aGUgY2xpZW50IGF1dGhzIGFzIGFub255bW91cyAob3RoZXJ3aXNlLCB0aGUgY2xpZW50IAorICB3aWxsIGJlIGRyb3BwZWQgdW5sZXNzIHRoZXkgYXV0aCBhcyBhIHVzZXIpLgorLSB0aGUgQU5PTllNT1VTIHN1cHBvcnQgbWVhbnMgeW91IGNhbiBub3cgdXNlIEQtQnVzICh3aXRob3V0IGEgYnVzIGRhZW1vbikgYXMgCisgIGEgcHJvdG9jb2wgZm9yIGEgbmV0d29yayBzZXJ2aWNlIHByb3ZpZGVkIHRvIGFub255bW91cyBJbnRlcm5ldCBvciBMQU4gIAorICBjbGllbnRzCistIG1hbnkgaW50ZXJuYWwgY2hhbmdlcyB0byBiZXR0ZXIgc3VwcG9ydCB0aGUgV2luZG93cyBwb3J0LCB0aG91Z2ggdGhlIAorICBwb3J0IGlzIHN0aWxsIG5vdCBjb21wbGV0ZSBpbiB0aGlzIHJlbGVhc2UKKy0gc29tZSBpbXByb3ZlZCBkb2N1bWVudGF0aW9uIGFuZCByZXR1cm5faWZfZmFpbCBjaGVja3MKKy0gc29tZSBzbWFsbCBidWcgZml4ZXMKKworRC1CdXMgMS4xLjAgKDI1IE1heSAyMDA3KQorPT0KKy0gZmlyc3QgcmVsZWFzZSBpbiB0aGUgZGV2ZWxvcG1lbnQgc2VyaWVzLCB1bmxlc3MgeW91IG5lZWQgc3BlY2lmaWMgCisgIGZ1bmN0aW9uYWxpdHkgcGxlYXNlIHVzZSB0aGUgc3RhYmxlIHJlbGVhc2VzIGFzIEFQSSdzIG1heSBjaGFuZ2UKKyAgKHRob3VnaCB3ZSB3aWxsIHRyeSBoYXJkIG5vdCB0bykKKy0gYmV0dGVyIGVhdmVzZHJvcHBpbmcgc3VwcG9ydCBub3cgcGlja3MgdXAgcmVwbHkgbWVzc2FnZXMgZm9yIGRlYnVnZ2luZworLSAucGMgZmlsZSBub3cgbGlzdHMgdGhlIGRpcmVjdG9yeSB0aGUgZGFlbW9uIGlzIGluc3RhbGxlZCBpbnRvIChkYWVtb25kaXIpCistIEdldEFsbCBjYWxsIGFkZGVkIHRvIHRoZSBwcm9wZXJ0aWVzIGludGVyZmFjZQorLSBzdXBwb3J0IGZvciBtZXNzYWdlIHNlcmlhbGl6YXRpb24gYWRkZWQgZm9yIHVzZSB3aXRoIGV4dGVybmFsIHRyYW5zcG9ydHMgbGlrZQorICBUVUJFUyEhIQorLSBtYW55IGJ1Z3MgZml4ZWQKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL1JFQURNRSBiL2RidXMtMS40LjEwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWI2ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvUkVBRE1FCkBAIC0wLDAgKzEsMTYyIEBACitTZWN0aW9ucyBpbiB0aGlzIGZpbGUgZGVzY3JpYmU6CisgLSBpbnRyb2R1Y3Rpb24gYW5kIG92ZXJ2aWV3CisgLSBsb3ctbGV2ZWwgdnMuIGhpZ2gtbGV2ZWwgQVBJCisgLSB2ZXJzaW9uIG51bWJlcnMKKyAtIG9wdGlvbnMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQKKyAtIEFCSSBzdGFiaWxpdHkgcG9saWN5CisKK0ludHJvZHVjdGlvbgorPT09CisKK0QtQnVzIGlzIGEgc2ltcGxlIHN5c3RlbSBmb3IgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gYW5kIGNvb3JkaW5hdGlvbi4KKworVGhlICJhbmQgY29vcmRpbmF0aW9uIiBwYXJ0IGlzIGltcG9ydGFudDsgRC1CdXMgcHJvdmlkZXMgYSBidXMgZGFlbW9uIHRoYXQgZG9lcyB0aGluZ3MgbGlrZToKKyAtIG5vdGlmeSBhcHBsaWNhdGlvbnMgd2hlbiBvdGhlciBhcHBzIGV4aXQKKyAtIHN0YXJ0IHNlcnZpY2VzIG9uIGRlbWFuZAorIC0gc3VwcG9ydCBzaW5nbGUtaW5zdGFuY2UgYXBwbGljYXRpb25zCisKK1NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbG90cyBvZiBkb2N1bWVudGF0aW9uLCAKK21haWxpbmcgbGlzdHMsIGV0Yy4KKworU2VlIGFsc28gdGhlIGZpbGUgSEFDS0lORyBmb3Igbm90ZXMgb2YgaW50ZXJlc3QgdG8gZGV2ZWxvcGVycyB3b3JraW5nIG9uIEQtQnVzLgorCitJZiB5b3UncmUgY29uc2lkZXJpbmcgRC1CdXMgZm9yIHVzZSBpbiBhIHByb2plY3QsIHlvdSBzaG91bGQgYmUgYXdhcmUKK3RoYXQgRC1CdXMgd2FzIGRlc2lnbmVkIGZvciBhIGNvdXBsZSBvZiBzcGVjaWZpYyB1c2UgY2FzZXMsIGEgInN5c3RlbQorYnVzIiBhbmQgYSAiZGVza3RvcCBzZXNzaW9uIGJ1cy4iIFRoZXNlIGFyZSBkb2N1bWVudGVkIGluIG1vcmUgZGV0YWlsCitpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbiBhbmQgRkFRIGF2YWlsYWJsZSBvbiB0aGUgd2ViIHNpdGUuCisKK0lmIHlvdXIgdXNlLWNhc2UgaXNuJ3Qgb25lIG9mIHRoZXNlLCBELUJ1cyBtYXkgc3RpbGwgYmUgdXNlZnVsLCBidXQKK29ubHkgYnkgYWNjaWRlbnQ7IHNvIHlvdSBzaG91bGQgZXZhbHVhdGUgY2FyZWZ1bGx5IHdoZXRoZXIgRC1CdXMgbWFrZXMKK3NlbnNlIGZvciB5b3VyIHByb2plY3QuCisKK05vdGU6IGxvdy1sZXZlbCBBUEkgdnMuIGhpZ2gtbGV2ZWwgYmluZGluZyBBUElzCis9PT0KKworQSBjb3JlIGNvbmNlcHQgb2YgdGhlIEQtQnVzIGltcGxlbWVudGF0aW9uIGlzIHRoYXQgImxpYmRidXMiIGlzCitpbnRlbmRlZCB0byBiZSBhIGxvdy1sZXZlbCBBUEkuIE1vc3QgcHJvZ3JhbW1lcnMgYXJlIGludGVuZGVkIHRvIHVzZQordGhlIGJpbmRpbmdzIHRvIEdMaWIsIFF0LCBQeXRob24sIE1vbm8sIEphdmEsIG9yIHdoYXRldmVyLiBUaGVzZQorYmluZGluZ3MgaGF2ZSB2YXJ5aW5nIGxldmVscyBvZiBjb21wbGV0ZW5lc3MgYW5kIGFyZSBtYWludGFpbmVkIGFzCitzZXBhcmF0ZSBwcm9qZWN0cyBmcm9tIHRoZSBtYWluIEQtQnVzIHBhY2thZ2UuIFRoZSBtYWluIEQtQnVzIHBhY2thZ2UKK2NvbnRhaW5zIHRoZSBsb3ctbGV2ZWwgbGliZGJ1cywgdGhlIGJ1cyBkYWVtb24sIGFuZCBhIGZldyBjb21tYW5kLWxpbmUKK3Rvb2xzIHN1Y2ggYXMgZGJ1cy1sYXVuY2guCisKK0lmIHlvdSB1c2UgdGhlIGxvdy1sZXZlbCBBUEkgZGlyZWN0bHksIHlvdSdyZSBzaWduaW5nIHVwIGZvciBzb21lCitwYWluLiBUaGluayBvZiB0aGUgbG93LWxldmVsIEFQSSBhcyBhbmFsb2dvdXMgdG8gWGxpYiBvciBHREksIGFuZCB0aGUKK2hpZ2gtbGV2ZWwgQVBJIGFzIGFuYWxvZ291cyB0byBRdC9HVEsrL0hUTUwuCisKK1ZlcnNpb24gbnVtYmVycworPT09CisKK0QtQnVzIHVzZXMgdGhlIGNvbW1vbiAiTGludXgga2VybmVsIiB2ZXJzaW9uaW5nIHN5c3RlbSwgd2hlcmUKK2V2ZW4tbnVtYmVyZWQgbWlub3IgdmVyc2lvbnMgYXJlIHN0YWJsZSBhbmQgb2RkLW51bWJlcmVkIG1pbm9yCit2ZXJzaW9ucyBhcmUgZGV2ZWxvcG1lbnQgc25hcHNob3RzLgorCitTbyBmb3IgZXhhbXBsZSwgZGV2ZWxvcG1lbnQgc25hcHNob3RzOiAxLjEuMSwgMS4xLjIsIDEuMS4zLCAxLjMuNAorU3RhYmxlIHZlcnNpb25zOiAxLjAsIDEuMC4xLCAxLjAuMiwgMS4yLjEsIDEuMi4zCisKK0FsbCBwcmUtMS4wIHZlcnNpb25zIHdlcmUgZGV2ZWxvcG1lbnQgc25hcHNob3RzLgorCitEZXZlbG9wbWVudCBzbmFwc2hvdHMgbWFrZSBubyBBQkkgc3RhYmlsaXR5IGd1YXJhbnRlZXMgZm9yIG5ldyBBQkkKK2ludHJvZHVjZWQgc2luY2UgdGhlIGxhc3Qgc3RhYmxlIHJlbGVhc2UuIERldmVsb3BtZW50IHNuYXBzaG90cyBhcmUKK2xpa2VseSB0byBoYXZlIG1vcmUgYnVncyB0aGFuIHN0YWJsZSByZWxlYXNlcywgb2J2aW91c2x5LgorCitDb25maWd1cmF0aW9uIAorPT09CisKK2RidXMgY291bGQgYmUgYnVpbGQgYnkgdXNpbmcgYXV0b3Rvb2xzIG9yIGNtYWtlLiAKKworV2hlbiB1c2luZyBhdXRvdG9vbHMgdGhlIGNvbmZpZ3VyZSBzdGVwIGlzIGluaXRpYXRlZCBieSBydW5uaW5nIC4vY29uZmlndXJlIAord2l0aCBvciB3aXRob3V0IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmbGFncy4gCisKK1doZW4gdXNpbmcgY21ha2UgdGhlIGNvbmZpZ3VyZSBzdGVwIGlzIGluaXRpYXRlZCBieSBydW5uaW5nIHRoZSBjbWFrZSAKK3Byb2dyYW0gd2l0aCBvciB3aXRob3V0IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmbGFncy4gCisKK0NvbmZpZ3VyYXRpb24gZmxhZ3MKKz09PQorCitXaGVuIHVzaW5nIGF1dG90b29scywgcnVuICIuL2NvbmZpZ3VyZSAtLWhlbHAiIHRvIHNlZSB0aGUgcG9zc2libGUKK2NvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitXaGVuIHVzaW5nIHRoZSBjbWFrZSBidWlsZCBzeXN0ZW0gdGhlIGRidXMtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmbGFncyB0aGF0IGNhbiBiZSBnaXZlbiAKK3RvIHRoZSBjbWFrZSBwcm9ncmFtIGFyZSB0aGVzZSAodXNlIC1EPGtleT49PHZhbHVlPiBvbiBjb21tYW5kIGxpbmUpCisKKyAgICBDTUFLRV9CVUlMRF9UWVBFICAgICAgICAgICAgICAgICAgIHNldCBkYnVzIGJ1aWxkIG1vZGUgLSBvbmUgb2YgRGVidWd8UmVsZWFzZXxSZWxXaXRoRGViSW5mb3xNaW5TaXplUmVsCisgICAgREJVU19CVUlMRF9URVNUUyAgICAgICAgICAgICAgICAgICBlbmFibGUgdW5pdCB0ZXN0IGNvZGUgIGRlZmF1bHQ9T04KKyAgICBEQlVTX0JVSUxEX1gxMSAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIHdpdGggWDExIGF1dG9sYXVuY2ggc3VwcG9ydCBkZWZhdWx0PU9OCisgICAgSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUgICAgICAgICAgICBlbmFibGUgY29uc29sZSBvd25lciBmaWxlIChzb2xhcmlzIG9ubHkpICkgZGVmYXVsdD1PTgorICAgIERCVVNfRElTQUJMRV9BU1NFUlRTICAgICAgICAgICAgICAgRGlzYWJsZSBhc3NlcnRpb24gY2hlY2tpbmcgZGVmYXVsdD1PRkYKKyAgICBEQlVTX0RJU0FCTEVfQ0hFQ0tTICAgICAgICAgICAgICAgIERpc2FibGUgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmcgZGVmYXVsdD1PRkYKKyAgICBEQlVTX0VOQUJMRV9BQlNUUkFDVF9TT0NLRVRTICAgICAgIGVuYWJsZSBzdXBwb3J0IGZvciBhYnN0cmFjdCBzb2NrZXRzIChsaW51eCBvbmx5KSBkZWZhdWx0PU9OCisgICAgREJVU19FTkFCTEVfQU5TSSAgICAgICAgICAgICAgICAgICBlbmFibGUgLWFuc2kgLXBlZGFudGljIGdjYyBmbGFncyBkZWZhdWx0PU9GRgorICAgIERCVVNfRU5BQkxFX0ROT1RJRlkgICAgICAgICAgICAgICAgYnVpbGQgd2l0aCBkbm90aWZ5IHN1cHBvcnQgKGxpbnV4IG9ubHkpIGRlZmF1bHQ9T04KKyAgICBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgICAgICAgICAgIHN1cHBvcnQgdmVyYm9zZSBkZWJ1ZyBtb2RlIGRlZmF1bHQ9T04KKyAgICBEQlVTX0VOQUJMRV9ET1hZR0VOX0RPQ1MgICAgICAgICAgIGJ1aWxkIERPWFlHRU4gZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgRG94eWdlbikgZGVmYXVsdD1PTgorICAgIERCVVNfR0NPVl9FTkFCTEVEICAgICAgICAgICAgICAgICAgY29tcGlsZSB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24gKGdjYyBvbmx5KSBkZWZhdWx0PU9GRgorICAgIERCVVNfSU5TVEFMTF9TWVNURU1fTElCUyAgICAgICAgICAgaW5zdGFsbCByZXF1aXJlZCBzeXN0ZW0gbGlicmFyaWVzIGRlZmF1bHQgKHdpbmRvd3Mgb25seSkgPU9GRgorICAgIERCVVNfVVNFX0VYUEFUICAgICAgICAgICAgICAgICAgICAgVXNlIGV4cGF0ICg9PSBPTikgb3IgbGlieG1sMiAoPT1PRkYpIGRlZmF1bHQ9T04gWzFdCisgICAgREJVU19VU0VfTk9OQ0VfVENQX0RFRkFVTFRfQUREUkVTUyBVc2Ugbm9uY2UgdGNwIGRlZmF1bHQgYWRkcmVzcyBkZWZhdWx0PU9GRgorICAgIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcgICAgICAgZW5hYmxlIHdpbjMyIGRlYnVnIHBvcnQgZm9yIG1lc3NhZ2Ugb3V0cHV0IGRlZmF1bHQ9T0ZGCisgICAgCisgICAgWzFdIHJlcXVpcmVzIGluc3RhbGxlZCBkZXZlbG9wbWVudCBwYWNrYWdlIG9mIHRoZSByZWxhdGVkIGRlcGVuZGVuY3kgCisKKyAgICAKK0FQSS9BQkkgUG9saWN5Cis9PT0KKworTm93IHRoYXQgRC1CdXMgaGFzIHJlYWNoZWQgdmVyc2lvbiAxLjAsIHRoZSBvYmplY3RpdmUgaXMgdGhhdCBhbGwKK2FwcGxpY2F0aW9ucyBkeW5hbWljYWxseSBsaW5rZWQgdG8gbGliZGJ1cyB3aWxsIGNvbnRpbnVlIHdvcmtpbmcKK2luZGVmaW5pdGVseSB3aXRoIHRoZSBtb3N0IHJlY2VudCBzeXN0ZW0gYW5kIHNlc3Npb24gYnVzIGRhZW1vbnMuCisKKyAtIFRoZSBwcm90b2NvbCB3aWxsIG5ldmVyIGJlIGJyb2tlbiBhZ2FpbjsgYW55IG1lc3NhZ2UgYnVzIHNob3VsZCAKKyAgIHdvcmsgd2l0aCBhbnkgY2xpZW50IGZvcmV2ZXIuIEhvd2V2ZXIsIGV4dGVuc2lvbnMgYXJlIHBvc3NpYmxlCisgICB3aGVyZSB0aGUgcHJvdG9jb2wgaXMgZXh0ZW5zaWJsZS4KKworIC0gSWYgdGhlIGxpYnJhcnkgQVBJIGlzIG1vZGlmaWVkIGluY29tcGF0aWJseSwgd2Ugd2lsbCByZW5hbWUgaXQgCisgICBhcyBpbiBodHRwOi8vb21ldGVyLmNvbS9wYXJhbGxlbC5odG1sIC0gaW4gb3RoZXIgd29yZHMsIAorICAgaXQgd2lsbCBhbHdheXMgYmUgcG9zc2libGUgdG8gY29tcGlsZSBhZ2FpbnN0IGFuZCB1c2UgdGhlIG9sZGVyIAorICAgQVBJLCBhbmQgYXBwcyB3aWxsIGFsd2F5cyBnZXQgdGhlIEFQSSB0aGV5IGV4cGVjdC4KKworSW50ZXJmYWNlcyBjYW4gYW5kIHByb2JhYmx5IHdpbGwgYmUgX2FkZGVkXy4gVGhpcyBtZWFucyBib3RoIG5ldworZnVuY3Rpb25zIGFuZCB0eXBlcyBpbiBsaWJkYnVzLCBhbmQgbmV3IG1ldGhvZHMgZXhwb3J0ZWQgdG8KK2FwcGxpY2F0aW9ucyBieSB0aGUgYnVzIGRhZW1vbi4KKworVGhlIGFib3ZlIHBvbGljeSBpcyBpbnRlbmRlZCB0byBtYWtlIEQtQnVzIGFzIEFQSS1zdGFibGUgYXMgb3RoZXIKK3dpZGVseS11c2VkIGxpYnJhcmllcyAoc3VjaCBhcyBHVEsrLCBRdCwgWGxpYiwgb3IgeW91ciBmYXZvcml0ZQorZXhhbXBsZSkuIElmIHlvdSBoYXZlIHF1ZXN0aW9ucyBvciBjb25jZXJucyB0aGV5IGFyZSB2ZXJ5IHdlbGNvbWUgb24KK3RoZSBELUJ1cyBtYWlsaW5nIGxpc3QuCisKK05PVEUgQUJPVVQgREVWRUxPUE1FTlQgU05BUFNIT1RTIEFORCBWRVJTSU9OSU5HCisKK09kZC1udW1iZXJlZCBtaW5vciByZWxlYXNlcyAoMS4xLngsIDEuMy54LCAyLjEueCwgZXRjLiAtCittYWpvci5taW5vci5taWNybykgYXJlIGRldmVsIHNuYXBzaG90cyBmb3IgdGVzdGluZywgYW5kIGFueSBuZXcgQUJJCit0aGV5IGludHJvZHVjZSByZWxhdGl2ZSB0byB0aGUgbGFzdCBzdGFibGUgdmVyc2lvbiBpcyBzdWJqZWN0IHRvCitjaGFuZ2UgZHVyaW5nIHRoZSBkZXZlbG9wbWVudCBjeWNsZS4KKworQW55IEFCSSBmb3VuZCBpbiBhIHN0YWJsZSByZWxlYXNlLCBob3dldmVyLCBpcyBmcm96ZW4uCisKK0FCSSB3aWxsIG5vdCBiZSBhZGRlZCBpbiBhIHN0YWJsZSBzZXJpZXMgaWYgd2UgY2FuIGhlbHAgaXQuIGkuZS4gdGhlCitBQkkgb2YgMS4yLjAgYW5kIDEuMi41IHlvdSBjYW4gZXhwZWN0IHRvIGJlIHRoZSBzYW1lLCB3aGlsZSB0aGUgQUJJIG9mCisxLjQueCBtYXkgYWRkIG1vcmUgc3R1ZmYgbm90IGZvdW5kIGluIDEuMi54LgorCitOT1RFIEFCT1VUIFNUQVRJQyBMSU5LSU5HCisKK1dlIGFyZSBub3QgeWV0IGZpcm1seSBmcmVlemluZyBhbGwgcnVudGltZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGxpYmRidXMKK2xpYnJhcnkuIEZvciBleGFtcGxlLCB0aGUgbGlicmFyeSBtYXkgcmVhZCBjZXJ0YWluIGZpbGVzIGFzIHBhcnQgb2YKK2l0cyBpbXBsZW1lbnRhdGlvbiwgYW5kIHRoZXNlIGZpbGVzIG1heSBtb3ZlIGFyb3VuZCBiZXR3ZWVuIHZlcnNpb25zLgorCitBcyBhIHJlc3VsdCwgd2UgZG9uJ3QgeWV0IHJlY29tbWVuZCBzdGF0aWNhbGx5IGxpbmtpbmcgdG8KK2xpYmRidXMuIEFsc28sIHJlaW1wbGVtZW50YXRpb25zIG9mIHRoZSBwcm90b2NvbCBmcm9tIHNjcmF0Y2ggbWlnaHQKK2hhdmUgdG8gd29yayB0byBzdGF5IGluIHN5bmMgd2l0aCBob3cgbGliZGJ1cyBiZWhhdmVzLgorCitUbyBsb2NrIHRoaW5ncyBkb3duIGFuZCBkZWNsYXJlIHN0YXRpYyBsaW5raW5nIGFuZCByZWltcGxlbWVudGF0aW9uIHRvCitiZSBzYWZlLCB3ZSdkIGxpa2UgdG8gc2VlIGFsbCB0aGUgaW50ZXJuYWwgZGVwZW5kZW5jaWVzIG9mIGxpYmRidXMKKyhmb3IgZXhhbXBsZSwgZmlsZXMgcmVhZCkgd2VsbC1kb2N1bWVudGVkIGluIHRoZSBzcGVjaWZpY2F0aW9uLCBhbmQKK3dlJ2QgbGlrZSB0byBoYXZlIGEgaGlnaCBkZWdyZWUgb2YgY29uZmlkZW5jZSB0aGF0IHRoZXNlIGRlcGVuZGVuY2llcworYXJlIHN1cHBvcnRhYmxlIG92ZXIgdGhlIGxvbmcgdGVybSBhbmQgZXh0ZW5zaWJsZSB3aGVyZSByZXF1aXJlZC4KKworTk9URSBBQk9VVCBISUdILUxFVkVMIEJJTkRJTkdTCisKK05vdGUgdGhhdCB0aGUgaGlnaC1sZXZlbCBiaW5kaW5ncyBhcmUgX3NlcGFyYXRlIHByb2plY3RzXyBmcm9tIHRoZQorbWFpbiBELUJ1cyBwYWNrYWdlLCBhbmQgaGF2ZSB0aGVpciBvd24gcmVsZWFzZSBjeWNsZXMsIGxldmVscyBvZgorbWF0dXJpdHksIGFuZCBBQkkgc3RhYmlsaXR5IHBvbGljaWVzLiBQbGVhc2UgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbgorZm9yIHlvdXIgYmluZGluZy4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL1JFQURNRS5jeWd3aW4gYi9kYnVzLTEuNC4xMC9SRUFETUUuY3lnd2luCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc1NGIzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9SRUFETUUuY3lnd2luCkBAIC0wLDAgKzEsOSBAQAorVGhlIGN5Z3dpbiBkYnVzIHBvcnQgaXMgaW5jbHVkZWQgaW4gbWFzdGVyIGJyYW5jaCBvZgorZGJ1cyBnaXQgcmVwb3NpdG9yeSBzaW5jZSAxLjMuMS4KKworU2VlIGN5Z3dpbi9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb25zIGFib3V0Cit0aGUgY3lnd2luIGRidXMgcG9ydC4KKworVGhlIGN5Z3dpbiBwb3J0IG9mIGRidXMgaXMgbWFpbnRhaW5lZCBieToKKworaHR0cDovL3NvdXJjZXdhcmUub3JnL2N5Z3dpbnBvcnRzLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvUkVBRE1FLmxhdW5jaGQgYi9kYnVzLTEuNC4xMC9SRUFETUUubGF1bmNoZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDFlNTdkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvUkVBRE1FLmxhdW5jaGQKQEAgLTAsMCArMSw2MSBAQAorTGF1bmNoZFsxLDJdIHJlcGxhY2VzIGluaXQsIGluZXRkIGFuZCBjcm9uIG9uIE1hYyBPUyBYIHNpbmNlIDEwLjQgIlRpZ2VyIi4KK2RidXMgdXNlcyB0aGlzIHNlcnZpY2UgdG8gcHJvdmlkZSBhIGNvbW1vbiBzZXNzaW9uIGJ1cyBhZGRyZXNzIGZvciBlYWNoIHVzZXIKK2FuZCBzbyBkZXByZWNhdGVzIHRoZSBYMTEgZW5hYmxlZCBkYnVzLWxhdW5jaGVyLgorCitbMV0gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vTWFjT3NYL2xhdW5jaGQuaHRtbAorWzJdIGh0dHA6Ly9sYXVuY2hkLm1hY29zZm9yZ2Uub3JnLworCisKK1NldHVwCis9PT0KKworQ29uZmlndXJlIHdpdGggLS1lbmFibGUtbGF1bmNoZCBhbmQgLS13aXRob3V0LXggKFgxMSBzaG91bGQgbm90IGhhcm0gYnV0IGl0J3MKK3NpbXBseSBub3QgbmVjZXNzYXJ5IGFueSBtb3JlKQorQWZ0ZXIgaW5zdGFsbGF0aW9uLCB0byBwcmV2ZW50IGEgcmVib290LCBsb2FkIHRoZSBkYnVzIHNlc3Npb24gc3RhcnRlciBpbnRvCitsYXVuY2hkIGJ5IGV4ZWN1dGluZzoKKyQgbGF1bmNoY3RsIGxvYWQgL0xpYnJhcnkvTGF1bmNoQWdlbnRzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QKKworWW91IGNhbiBjaGFuZ2UgdGhlIGxhdW5jaCBhZ2VudCBkaXIgdmlhIGNvbmZpZ3VyZSwgYnV0IGl0J3Mgbm90IHJlY29tbWVuZGVkLgorTWFrZSBzdXJlIHRvIGV4ZWN1dGUgdGhlIGFib3ZlIGxpbmUgYXMgdGhlIGFjdHVhbCB1c2VyIGZvciB3aGljaCB5b3Ugd2FudCB0bwordXNlIGEgc2Vzc2lvbiBidXMgc2luY2UgbGF1bmNoZCBtYW5hZ2VzIGl0cyBhZ2VudHMgb24gYSBwZXIgdXNlciBiYXNpcy4KKworCitIb3cgaXQgd29ya3MKKz09PQorCitMYXVuY2hkIGFsbG9jYXRlcyBhIHNvY2tldCBhbmQgcHJvdmlkZXMgdGhlIHVuaXggcGF0aCB0byBpdCB2aWEgdGhlIHZhcmlhYmxlCitEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUIGluIGxhdW5jaGQncyBlbnZpcm9ubWVudC4gRXZlcnkgcHJvY2Vzcworc3Bhd25lZCBieSBsYXVuY2hkIChvciBkYnVzLWRhZW1vbiwgaWYgc3RhcmVkIGJ5IGxhdW5jaGQpIGNhbiBhY2Nlc3MgaXQgdGhyb3VnaAoraXRzIG93biBlbnZpcm9ubWVudC4gT3RoZXIgcHJvY2Vzc2VzIGNhbiBxdWVyeSBsYXVuY2hkIGZvciBpdCBieSBleGVjdXRpbmc6CiskIGxhdW5jaGN0bCBnZXRlbnYgREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVAorSG93ZXZlciwgdGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZSBkYnVzIGNsaWVudCBsaWIgZm9yIHlvdS4KKworSWYgbGF1bmNoZCBzdGFydCBkYnVzLWRhZW1vbiB3aXRoIGEgY29uZmlnIGZpbGUgY29udGFpbmluZyBhICJsYXVuY2hkOmVudj1GT08iCithZGRyZXNzLCBhcyB0aGUgZGVmYXVsdCBzZXNzaW9uIGNvbmZpZyBkb2VzIHdpdGggZW52PURCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQsCit0aGUgZGFlbW9uIHdpbGwgZ2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBsYXVuY2hkIGFuZCBzdGFydCBsaXN0ZW5pbmcgb24gaXQuCitUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZCB0byBnZXQgdGhlIGFjdHVhbCBzb2NrZXQgcGF0aCB3aGljaCBpcyBwYXNzZWQKK3RvIGV2ZXJ5IHNlcnZpY2Ugc3Bhd25lZCBieSBkYnVzLWRhZW1vbiBhcyBhIHJlc3VsdCBmcm9tIGF1dG9sYXVuY2ggbWVzc2FnZXMuCitQbGVhc2Ugbm90ZSB0aGF0IGl0J3Mgbm90IHBvc3NpYmxlIHRvIHN0YXJ0IGRidXMtZGFlbW9uIG1hbnVhbGx5IHdoZW4gdXNpbmcgYQorImxhdW5jaGQ6IiBhZGRyZXNzLiBPbmx5IGNoaWxkIHByb2Nlc3NlcyBvZiBsYXVuY2hkIGNhbiBhY2Nlc3MgdGhlIGFib3ZlCittZW50aW9uZWQgZmlsZSBkZXNjcmlwdG9yIQorCitUbyBjcmVhdGUgY3VzdG9tIGJ1c2VzIGp1c3Qgc2V0IHVwIGFuIG90aGVyIGxhdW5jaCBhZ2VudC4gQXMgYSBxdWljayBzdGFydCBjb3B5CisvTGlicmFyeS9MYXVuY2hBZ2VudHMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdCwgY2hhbmdlIHRoZSBsYWJlbAordG8gaS5lLiAib3JnLmZyZWVkZXNrdG9wLmRidXMtZm9vIiBhbmQgY2hhbmdlIHRoZSBTZWN1cmVTb2NrZXRXaXRoS2V5IHZhbHVlLAoraS5lLiB0byAiREJVU19MQVVOQ0hEX0ZPT19CVVNfU09DS0VUIi4gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgdG8gYmUgc2V0CitpbiB0aGUgY29uZmlnIGZpbGUgZm9yIHlvdXIgbmV3IGJ1cyBpbiB0aGUgPGxpc3Rlbj4gZWxlbWVudCAoc2VlIHNlc3Npb24uY29uZmlnKS4KK1RoZW4gZWRpdCB5b3VyIC9MaWJyYXJ5L0xhdW5jaEFnZW50cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1mb28ucGxpc3QgdG8gc3RhcnQKK2RidXMtZGFlbW9uIHdpdGggIi0tY29uZmlnLWZpbGU9L29wdC9sb2NhbC9ldGMvZGJ1cy0xL2Zvby5jb25mIiBpbnN0ZWFkIG9mCisiLS1zZXNzaW9uIi4gTm93IGxvYWQgdGhlIG5ldyBwbGlzdCBvbnRvIGxhdW5jaGQgYXMgZGVzY3JpYmVkIGluIHRoZSBzZXR1cAorc2VjdGlvbiBvZiB0aGlzIGRvY3VtZW50LgorRXhlY3V0aW5nICJsYXVuY2hjdGwgZXhwb3J0IiBzaG91bGQgbm93IGdpdmUgeW91IHR3byBzb2NrZXRzLCBvbmUgaW4KK0RCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQgYW5kIHRoZSBuZXcgREJVU19MQVVOQ0hEX0ZPT19CVVNfU09DS0VULgorVG8gY29ubmVjdCB0byB0aGlzIG5ldyBidXMgdXNlICJsYXVuY2hkOmVudj1EQlVTX0xBVU5DSERfRk9PX0JVU19TT0NLRVQiLgorCitTaW5jZSBNYWMgT1MgWCAxMC41ICJMZW9wYXJkIiB5b3UgY2FuIGFsc28gY29uZmlndXJlIGxhdW5jaGQgdG8gc3RhcnQKK2RidXMtZGFlbW9uIG9uIGRlbWFuZCBhcyBzb29uIGFzIHNvbWUgcHJvY2VzcyBjb25uZWN0cyB0byB0aGUgc29ja2V0LiBTaW5jZQoraXQncyBicm9rZW4gb24gMTAuNCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgcGVyIGRlZmF1bHQuIExvb2sgYXQKKy9MaWJyYXJ5L0xhdW5jaEFnZW50cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0IHRvIGNoYW5nZSBpdC4KKworT24gdGhlIGNsaWVudCBzaWRlLCB0aGUgZW52dmFyIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBjYW4gYmUgbm9ybWFsbHkgdXNlZAorYnV0IGlmIGl0J3Mgbm90IHNldCwgbGF1bmNoZCBpcyBxdWVyaWVkIGZvciB0aGUgc2Vzc2lvbiBidXMgc29ja2V0LgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvUkVBRE1FLndpbiBiL2RidXMtMS40LjEwL1JFQURNRS53aW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3MWY5NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL1JFQURNRS53aW4KQEAgLTAsMCArMSwxMDcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitXaW5kb3dzIHBvcnQgb2YgdGhlIGZyZWVkZXNrdG9wLm9yZyBELUJ1cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmVhdHVyZXMgYW5kIGNvbXBsZXRlbmVzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHdpbmRvd3MgcG9ydCBvZiBkYnVzIHByb3ZpZGVzIHRoZSBkYnVzLTEgbGlicmFyeSBhbmQgbW9zdGx5CithcHBsaWNhdGlvbnMgd2hpY2ggYXJlIGFscmVhZHkgYXZhaWxhYmxlIG9uIHVuaXguIFRoZXNlIGFwcGxpY2F0aW9ucworYXJlOiBkYnVzLWRhZW1vbiwgZGJ1cy1sYXVuY2gsIGRidXMtbW9uaXRvciBhbmQgZGJ1cy1zZW5kLgorREJ1cyBjb21lcyB3aXRoIGEgdGVzdCBzdWl0ZSB3aGljaCBpcyB1c2VkIG9uIHVuaXggdG8gZ3VhcmFudGF0ZQorcHJvZHVjdGlvbiBxdWFsaXR5IGFuZCB0aGlzIHRlc3Qgc3VpdGUgcnVucyBtb3N0bHkuIFRoZXJlIGFyZSBzb21lCit0ZXN0IG5vdCBydW5uaW5nIHlldCBhbmQgdGhlcmUgaXMgaGVscCBuZWVkZWQgdG8gZ2V0IHRoZW0gcnVubmluZy4KKworCitCdWlsZGluZworLS0tLS0tLS0KK0RCdXMgY291bGQgYmUgYnVpbGQgb24gd2luZG93cyB1c2luZyBhdXRvbWFrZSBvciBjbWFrZS4gU2VlIHRoZQorZmlsZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLgorU3BlY2lhbCBjbWFrZSBidWlsZCBpbnN0cnVjdGlvbnMgY291bGQgYmUgZm91bmQgaW4gY21ha2UvcmVhZG1lLWNtYWtlLnR4dAorCisKK3dpbmRidXMgYW5kIGRidXM0d2luIFBvcnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIFdpbmRvd3MgcG9ydHMgZnJvbSB0aGUgd2luZGJ1cyBhbmQgZGJ1czR3aW4gcHJvamVjdHMgaGFzIGJlZW4gbWVyZ2VkCitpbnRvIHRoZSBmcmVlZGVza3RvcCBnaXQgbWFzdGVyIGJyYW5jaCwgYXMgYXBwbGljYWJsZS4gVGhlIHNwZWMgaGFzIGJlZW4KK3VwZGF0ZWQgd2l0aCB3aW5kb3dzIHNwZWNpZmljIHN0dWZmLgorCisKK1Rlc3RzCistLS0tLQorIC0gZGJ1cyBsaWJyYXJ5IGNoZWNrCisgICAgYmluXGRidXMtdGVzdC5leGUgPGJ1aWxkLXJvb3Q+XHRlc3RcZGF0YQorCisgLSBidXMgZGFlbW9uIGNoZWNrCisgICAgYmluXGJ1cy10ZXN0LmV4ZSA8YnVpbGQtcm9vdD5cdGVzdFxkYXRhCisKKyAtIGNoZWNrIGF2YWlsYWJsZSBuYW1lcworICAgIGJpblx0ZXN0X25hbWVzLmV4ZQorCisgLSBjaGVjayBpZiBkYnVzLWRhZW1vbiBpcyBhY2Nlc3NhYmxlCisgICAgYmluXGRidXMtc2VuZC5leGUgLS1zZXNzaW9uIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyBtZXRob2QgcmV0dXJuIHNlbmRlcj1vcmcuZnJlZWRlc2t0b3AuREJ1cyAtPiBkZXN0PToxLjQgYXJyYXkgWyBzdHJpbmcgIm9yZy5mcmVlZGVza3RvcC5EQnVzInN0cmluZyAiOjEuNCJdCisKKyAtIHN0YXJ0IHNlc3Npb24gZGJ1cy1kYWVtb24KKyAgICBlaXRoZXIgYnkgcnVubmluZworICAgICAgICBiaW5cZGJ1cy1sYXVuY2gKKyAgICBvcgorICAgICAgICBzdGFydCBiaW5cZGJ1cy1kYWVtb24gLS1zZXNzaW9uCisKKyAgICBCZWZvcmUgcnVubmluZyB0aGVzZSBjb21tYW5kcyB5b3UgbWF5IGV4ZWN1dGUKKyAgICAgICAgc2V0IERCVVNfVkVSQk9TRT0xCisgICAgZm9yIGdldHRpbmcgZGVidWcgaW5mb3MKKworCisgLSBjYWxsIGZ1bmN0aW9uIHJlZ2lzdGVyZCBpbiBkYnVzCisgICAgYmluXGRidXMtc2VuZC5leGUgIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyAtLXByaW50LXJlcGx5IC0tdHlwZT1tZXRob2RfY2FsbCAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLlN0YXJ0U2VydmljZUJ5TmFtZSBzdHJpbmc6b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UgIHVpbnQzMjo0NTUgbWV0aG9kIHJldHVybiBzZW5kZXI9b3JnLmZyZWVkZXNrdG9wLkRCdXMgLT4gZGVzdD06MS44IHVpbnQzMiAyCisKKyAgICBub3RlOiBXaGVuIGJ1aWxkaW5nIHdpdGggdGhlIFZpc3VhbCBDKysgSURFIHRoZSAqLmV4ZSBmaWxlcyBhcmUgaW4KKyAgICAgICAgICB0aGUgYmluL0RlYnVnIGFuZCBiaW4vUmVsZWFzZSBmb2xkZXIsIG5vdCBpbiB0aGUgYmluIGZvbGRlci4KKworCitGQVEKKy0tLQorCistIEhvdyBmYXIgaXMgV2luREJ1cyBmcm9tIGJlaW5nIHVzYWJsZSBmb3IgcHJvZHVjdGlvbiA/CisKKyAgZGJ1cyBjb21lcyB3aXRoIGEgdGVzdCBzdWl0ZSB3aGljaCBpcyB1c2VkIG9uIHVuaXggdG8gZ3VhcmFudGF0ZQorICBwcm9kdWN0aW9uIHF1YWxpdHkgYW5kIHRoaXMgdGVzdCBzdWl0ZSBydW5zIG1vc3RseS4gVGhlcmUgYXJlIHNvbWUKKyAgdGVzdCBub3QgcnVubmluZyBhbmQgd2UgbmVlZCBoZWxwIHRvIGdldCB0aGVtIHJ1bm5pbmcuCisgIEluIHRoZSBwcmF0aWNlIEkgYW5kIHNvbWUgb3RoZXIgcGVvcGxlIGFyZSB1c2luZyBkYnVzIGZvciBhdCBsZWFzdCBtb3JlCisgIHRoYW4gZm91ciB5ZWFycyBpbiBjb25qdW5jdGlvbiB3aXRoIGtkZSBvbiB3aW5kb3dzIHdpdGhvdXQgYW55IHByb2JsZW1zLgorCistIE9uIFVOSVggRC1CdXMgdXNlcyBVTklYIHNvY2tldHMgdG8gY29tbXVuaWNhdGUgKGNvcnJlY3QgbWUgaWYgSSdtIHdyb25nKS4KKyAgV2hhdCBpcyB1c2VkIG9uIFdpbmRvd3MgPworCisgIHRjcCBzb2NrZXRzLCB0aGVyZSBhcmUgc29tZSBlZmZvcnRzIHRvIGdldCBuYW1lZCBwaXBlIHJ1bm5pbmcsIGJ1dCBzb21lCisgIGRlc2lnbiBwcm9ibGVtcyBvZiB0aGUgd2luMzIgYXBpLCB3ZSBhcmUgbm90IGFibGUgdG8gc29sdmUgd2l0aG91dAorICBiaWdnZXIgY2hhbmdlcyB0byB0aGUgZGJ1cyBjb2RlIGJhc2UgbGV0IHVzIHN0b3AgdGhpcyBlZmZvcnQuCisKKy0gRG8geW91IGhhdmUgYW55IGNsdWUgaWYgZGJ1cy13aW4zMiBjYW4gcnVuIGluIGEgV2luZG93cyBDRSBlbnZpcm9ubWVudD8KKworICBkYnVzIGhhcyBiZWVuIHBvcnRlZCB0byB3aW5jZSwgc2VlIFJFQURNRS53aW5jZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMKKworLSBEbyB5b3Uga25vdyBpZiB0aGUgQysrIGJpbmRpbmcgbWFkZSBieSBPcGVuV2VuZ28gd2lsbCBiZSBlYXNpbHkgcG9ydGFibGUgdG8gV2luZG93cz8KKworICBUaGUgT3BlbldlbmdvIGRidXMtYysrIGJpbmRpbmcgaGFzIGJlZW4gcG9ydGVkIHRvIHdpbmRvd3Mgc2VlIGluIFdpbkRCdXMgc3ZuCisgIChodHRwOi8vc2YubmV0L3Byb2plY3RzL3dpbmRidXMpCisgIFRoZSByZWxhdGVkIHRlc3QgYXBwbGljYXRpb25hIGFyZSBydW5uaW5nIHdlbGwuCisKKworVE9ETworLS0tLQorCitPa3RvYmVyIDIwMTA6CisKKy0gdGhlIGNvZGUgd3JhcHBlZCB3aXRoIERCVVNfV0lOX0ZJWE1FIHNob3VsZCBiZSBpbnNwZWN0ZWQgaWYgaXQgcmVxdWlyZWQgZm9yIHdpbmRvd3MKKworLSBjcmVhdGUgYSBkYnVzIHNldHVwIGluc3RhbGxlcgorCistIGltcGxlbWVudCBzeXN0ZW0gYnVzIGFuZCBzeXN0ZW0gYnVzIHNlcnZpY2Ugc3RhcnRlcgorICBzZWUgaHR0cDovL3dpbmRidXMuc3ZuLnNvdXJjZWZvcmdlLm5ldC92aWV3dmMvd2luZGJ1cy90cnVuay9idXMvYnVzLXNlcnZpY2Utd2luLmMKKyAgZm9yIGEgc3RhcnRpbmcgcG9pbnQKKworLSBpbXBsZW1lbnQgYSByZWFsIGxvZ2luIHNlc3Npb24gYnVzCisgIFRoZSBzY29wZSBwYXJhbWV0ZXIgb2YgdGhlIGF1dG9sYXVuY2ggbWV0YSBwcm90b2NvbCBjb3VsZCBiZSBleHRlbmRlZCB0byBzdXBwb3J0IHVzZXIKKyAgc3BlY2lmaWMgc2Vzc2lvbiBidXNzZXMgKGxpa2UgYWxyZWFkeSBkb25lIHdpdGggdGhlIGFtYXJvayBidW5kbGVkIGRidXMgd2hpY2ggdXNlIGEKKyAgc2hhcmVkIG1lbW9yeSBhcmVhIG5hbWVkICJEQnVzRGFlbW9uQWRkcmVzc0luZm86PHVzZXJuYW1lPiIuCisgIEFsc28gdGhlIGRidXMgaW5zdGFsbGVyIHNob3VsZCBzdGFydCBhIHNlc3Npb24gYnVzIG9uIHVzZXIgbG9naW4uCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9SRUFETUUud2luY2UgYi9kYnVzLTEuNC4xMC9SRUFETUUud2luY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL1JFQURNRS53aW5jZQpAQCAtMCwwICsxLDgxIEBACitEQnVzIERhZW1vbiBmb3IgV2luZG93cyBDRS9XaW5kb3dzIE1vYmlsZSA2LjUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCdWdzIGluIHVwc3RyZWFtIGZvciBhbnkgd2luZG93IHZlcnNpb246CisqIE1vdmVGaWxlRXhBIDwgMCByZXN1bHQgY2hlY2sgYnVnCisqIGRvdWJsZSBkYnVzX2ZyZWUgc29tZXdoZXJlIEkgZm9yZ290IHdoZXJlIChjaGVjayBpbiAtdWdseSkKKyogYWxpZ25tZW50IGlzc3VlCisqIENyZWF0ZVByb2Nlc3MgcHJvY2VzcyBpbmZvcm1hdGlvbiBoYW5kbGUgbGVhaworKiBfZGJ1c19nZXRzaWQgTlVMTCB2cyBJTlZBTElEX0hBTkRMRV9WQUxVRQorKiB3aW5fYWNjb3VudF90b19zaWQKKworQ3VzdG9taXNhdGlvbgorPT09PT09PT09PT09PQorCisxKSBBdCBpbnN0YWxsYXRpb24sIHRoZSBmb2xsb3dpbmcgcmVnaXN0cnkgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUKK2luc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgdGhlIGRidXMgaW5zdGFsbGF0aW9uICh0aGUgZGlyZWN0b3J5Citjb250YWluaW5nIHRoZSBiaW4sIGV0Yywgc2hhcmUgZm9sZGVycyk6CisKK0hLTE1cU29mdHdhcmVcZnJlZWRlc2t0b3BcREJ1c1xJbnN0YWxsIERpcmVjdG9yeQorCisyKSBJbnN0ZWFkIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIERCVVNfVkVSQk9TRSwgdXNlCitIS0xNXFNvZnR3YXJlXGZyZWVkZXNrdG9wXERCdXNcVmVyYm9zZQorCisyKSBUaGUga2V5cmluZyBkaXJlY3RvcnkgaXMgTVlET0NVTUVOVFNcZGJ1cy1rZXlyaW5ncywgbm90CitIT01FUEFUSFwuZGJ1cy1rZXlyaW5ncy4KKworCitDb21waWxhdGlvbgorPT09PT09PT09PT0KKworLi9jb25maWd1cmUgLS1ob3N0PWFybS1taW5ndzMyY2UgQ1BQRkxBR1M9LUkvcGF0aC90by9leHBhdC9pbmNsdWRlIExERkxBR1M9LUwvcGF0aC90by9leHBhdC9saWIKKworQSByZWNlbnQgdmVyc2lvbiBvZiBsaWJ0b29sIGlzIHJlcXVpcmVkLCB3aXRoIHRoaXMgY2hhbmdlOgorCisyMDEwLTAyLTI4ICBQaWVycmUgT3NzbWFuICA8b3NzbWFuQG9zc21hbi5sa3BnLmNlbmRpby5zZT4gICh0aW55IGNoYW5nZSkKKyAgICAgICAgICAgIFJhbGYgV2lsZGVuaHVlcyA8UmFsZi5XaWxkZW5odWVzQGdteC5kZT4KKworICAgICAgIEZpeCBkZXBsaWJzIGNoZWNrIGZhbGxiYWNrIGZvciA2NC1iaXQgV2luZG93cyBhbmQgV2luZG93cyBDRS4KKyAgICAgICAqIGxpYmx0ZGwvbTQvbGlidG9vbC5tNCAoX0xUX0NIRUNLX01BR0lDX01FVEhPRCk6IEFjY2VwdCBmaWxlIGZvcm1hdHMKKyAgICAgICAncGUtYXJtLXdpbmNlJyBhbmQgJ3BlLXg4Ni02NCcuICBBZGQgbm90ZSBhYm91dCBjb25zaXN0ZW5jeSB3aXRoIC4uLgorICAgICAgICogbGlibHRkbC9jb25maWcvbHRtYWluLm00c2ggKGZ1bmNfd2luMzJfbGliaWQpOiAuLi4gdGhlIHJlc3BlY3RpdmUKKyAgICAgICBwYXR0ZXJuIGhlcmU7IHN5bmMgcGF0dGVybiBmcm9tIHRoZSBmb3JtZXIuCisgICAgICAgKiB0ZXN0cy9kZXBsaWJzLW1pbmd3LmF0IChkZXBsaWJzIHdpdGhvdXQgZmlsZSBjb21tYW5kKTogTmV3CisgICAgICAgZmlsZSwgbmV3IHRlc3QuCisgICAgICAgKiBNYWtlZmlsZS5hbSAoVEVTVFNVSVRFX0FUKTogVXBkYXRlLgorICAgICAgICogTkVXUzogVXBkYXRlLgorCisKK01CIHZzIFdDSEFSCis9PT09PT09PT09PQorCitXaW5kb3dzIENFIG9ubHkgc3VwcG9ydHMgdGhlIFVuaWNvZGUgaW50ZXJmYWNlLCB3aGlsZSBEQnVzIERhZW1vbiB1c2VzCit0aGUgTXVsdGktQnl0ZSBpbnRlcmZhY2Ugb24gV2luZG93cyBieSBkZWZhdWx0LiAgVGhlIGdsdWUgY29kZSBkb2VzCitub3Qgc3VwcG9ydCBtdWx0aWJ5dGUgaW4gYWxsIGNhc2VzLiAgSW4gcGFydGljdWxhciwgdGhlIF9tYnNyY2hyCitmdW5jdGlvbiBpcyBub3QgY29ycmVjdGx5IGltcGxlbWVudGVkLiAgSXQgY291bGQgYmUgY29ycmVjdGx5CitpbXBsZW1lbnRlZCwgb3IgZGJ1cyBkYWVtb24gY291bGQgdXNlIHRoZSB3Y2hhciBpbnRlcmZhY2UgbW9yZQorY29uc2lzdGVudGx5IG9uIGFsbCBXaW5kb3dzIHRhcmdldHMuICBGb3Igbm93LCB0aGUgV2luZG93cyBDRSBwb3J0Cit3aWxsIG9ubHkgd29yayBmb3IgZmlsZXN5c3RlbXMgd2l0aG91dCBzb21lIHdlaXJkIGNoYXJhY3RlcnMgaW4gZmlsZQorbmFtZXMuICBJcyB0aGlzIGEgc2VyaW91cyBsaW1pdGF0aW9uPworCisKK0tub3duIElzc3VlcworPT09PT09PT09PT09CisKK0F1dG9sYXVuY2ggaXMgYnJva2VuIHNvIGZhci4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBmYWtlZC4gIFNvbWUgYXJlIHB1bnRlZCB0byB0aGUgcmVnaXN0cnksIGJ1dAoraW4gYW55IGNhc2UgdGhleSBjYW4gbm90IGJlIHVzZWQgcmVsaWFibHkgZm9yIElQQy4KKworVGhlIHRlc3Qgc3VpdGUgaXMgbm90IHBvcnRlZCB5ZXQuCisKK2RidXMtcGlwZS5jOgorICogVXNlcyBsaWJjIGZpbGUgZGVzY3JpcHRvcnMuICBOZWVkZWQgZm9yIC0tcHJpbnQtYWRkcmVzcyBhbmQKKyAgIC0tcHJpbnQtcGlkIHdoaWNoIHByb2JhYmx5IGRvbid0IHdvcmsgeWV0LgorCitkYnVzLXN5c2RlcHMtd2luLmM6CisgKiBCYWNrdHJhY2VzIGhhdmUgYmVlbiBkaXNhYmxlZC4KKyAqIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIE5vdCBzdXBwb3J0ZWQsIG1heWJlIHdlIHNob3VsZCBkaXNhYmxlCisgICB0aGUgd2FybmluZy4KKyAqIFNlYXJjaFBhdGhBOiBVc2VzIEhLTE1cXFNvZnR3YXJlXFxmcmVlZGVza3RvcFxcREJ1c1xcSW5zdGFsbCBEaXJlY3RvcnkKKyAgIHRvIGxvY2F0ZSBiaW5hcmllcy4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2FjbG9jYWwubTQgYi9kYnVzLTEuNC4xMC9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOGNjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9hY2xvY2FsLm00CkBAIC0wLDAgKzEsMTA4MCBAQAorIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMTEuMSAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorIyAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorbTRfaWYobTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pLCBbMi42OF0sLAorW200X3dhcm5pbmcoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjY4LgorWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSXQgbWF5IHdvcmssIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0by4KK0lmIHlvdSBoYXZlIHByb2JsZW1zLCB5b3UgbWF5IG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgYnVpbGQgc3lzdGVtIGVudGlyZWx5LgorVG8gZG8gc28sIHVzZSB0aGUgcHJvY2VkdXJlIGRvY3VtZW50ZWQgYnkgdGhlIHBhY2thZ2UsIHR5cGljYWxseSBgYXV0b3JlY29uZicuXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCisjIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgorIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKK0FDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKK1thbV9fYXBpX3ZlcnNpb249JzEuMTEnCitkbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCitkbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgorbTRfaWYoWyQxXSwgWzEuMTEuMV0sIFtdLAorICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAorXSkKKworIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCisjIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCisjIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCittNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCisKKyMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCisjIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQU1fSU5JVF9BVVRPTUFLRS4KK0FDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKK1tBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjExLjFdKWRubAorbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorX0FNX0FVVE9DT05GX1ZFUlNJT04obTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pKV0pCisKKyMgQU1fQVVYX0RJUl9FWFBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cworIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bworIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgorIworIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCisjIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCisjIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAorIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKKyMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKKyMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCisjIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCisjCisjICRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQorIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAorIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAorIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCisjCisjIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCisjIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5CisjIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQorIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgorIworIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKKyMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6CisjICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCisjIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcworIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQorIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgorIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCisjIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KKyMKKyMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCisjIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKKyMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgorCitBQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAorW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCitBQ19QUkVSRVEoWzIuNTBdKWRubAorIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorXSkKKworIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA5CisKKyMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBhIGNvbmRpdGlvbmFsLgorQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKK1tBQ19QUkVSRVEoMi41MilkbmwKKyBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAorCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKK0FDX1NVQlNUKFskMV9UUlVFXSlkbmwKK0FDX1NVQlNUKFskMV9GQUxTRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAorbTRfZGVmaW5lKFtfQU1fQ09ORF9WQUxVRV8kMV0sIFskMl0pZG5sCitpZiAkMjsgdGhlbgorICAkMV9UUlVFPQorICAkMV9GQUxTRT0nIycKK2Vsc2UKKyAgJDFfVFJVRT0nIycKKyAgJDFfRkFMU0U9CitmaQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKK1tpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQorZmldKV0pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA5CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEwCisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgorIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgorIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgorIworIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKKyMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKKyMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAorIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KK0FDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKK0FDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKK0FDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCitBQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAorCitpZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKKworQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKKyAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCitbaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gWydzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJ10gPCAuL2RlcGNvbXBgCisgIGZpCisgIGFtX191bml2ZXJzYWw9ZmFsc2UKKyAgbTRfY2FzZShbJDFdLCBbQ0NdLAorICAgIFtjYXNlICIgJGRlcGNjICIgaW4gIygKKyAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKKyAgICAgZXNhY10sCisgICAgW0NYWF0sCisgICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjXSkKKworICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLiAgQWxzbywgc29tZSBJbnRlbAorICAgICMgdmVyc2lvbnMgaGFkIHRyb3VibGUgd2l0aCBvdXRwdXQgaW4gc3ViZGlycworICAgIGFtX19vYmo9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99CisgICAgYW1fX21pbnVzX29iaj0iLW8gJGFtX19vYmoiCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIGdjYykKKyAgICAgICMgVGhpcyBkZXBtb2RlIGNhdXNlcyBhIGNvbXBpbGVyIHJhY2UgaW4gdW5pdmVyc2FsIG1vZGUuCisgICAgICB0ZXN0ICIkYW1fX3VuaXZlcnNhbCIgPSBmYWxzZSB8fCBjb250aW51ZQorICAgICAgOzsKKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCisgICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCisgICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgorICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQorICAgICAgYW1fX21pbnVzX29iaj0KKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCitdKQorQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCitBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQorXSkKKworCisjIEFNX1NFVF9ERVBESVIKKyMgLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KKyMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCitBQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCitbQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK0FDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKK10pCisKKworIyBBTV9ERVBfVFJBQ0sKKyMgLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKK1tBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCitbICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKK2ZpCitBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKK0FDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBCQUNLU0xBU0hdKWRubAorXSkKKworIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjc2VyaWFsIDUKKworIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1t7CisgICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCisgICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKKyAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCisgIGNhc2UgJENPTkZJR19GSUxFUyBpbgorICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OworICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKKyAgZXNhYworICBzaGlmdAorICBmb3IgbWYKKyAgZG8KKyAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCisgICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0CisgICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCisgICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCisgICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCisgICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQorICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgorICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0CisgICAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKKyAgICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAgICMgZXhwYW5zaW9uLgorICAgIGZvciBmaWxlIGluIGBzZWQgLW4gIgorICAgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisJIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbworICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKKyAgICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKKyAgICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKKyAgICBkb25lCisgIGRvbmUKK30KK10pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKworCisjIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KKyMKKyMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZworIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCisjIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCitBQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAorICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKKyAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQorXSkKKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyMgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxNgorCisjIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgorIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorCisjIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCisjIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKKyMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQorIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KKyMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KKyMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCisjIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCisjIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKKyMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KK0FDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKK1tBQ19QUkVSRVEoWzIuNjJdKWRubAorZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKK2RubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgorbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCisgICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0CisgICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKKyAgQUNfU1VCU1QoW2FtX19pc3JjXSwgWycgLUkkKHNyY2RpciknXSlfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKWRubAorICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCisgIGZpCitmaQorCisjIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKK2lmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCisgIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKKyAgZWxzZQorICAgIENZR1BBVEhfVz1lY2hvCisgIGZpCitmaQorQUNfU1VCU1QoW0NZR1BBVEhfV10pCisKKyMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KK2RubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgorbTRfaWZ2YWwoWyQyXSwKK1ttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKKyBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCisgQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCitbX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCitkbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KK200X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAorICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKKworX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCitbQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQorIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKK0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAorQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCisJICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCisJCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCitfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKKwkJCSAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCisJCQkgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfT0JKQ10sCisJCQkgIGRlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldKV0pZG5sCitdKQorX0FNX0lGX09QVElPTihbc2lsZW50LXJ1bGVzXSwgW0FDX1JFUVVJUkUoW0FNX1NJTEVOVF9SVUxFU10pXSlkbmwKK2RubCBUaGUgYHBhcmFsbGVsLXRlc3RzJyBkcml2ZXIgbWF5IG5lZWQgdG8ga25vdyBhYm91dCBFWEVFWFQsIHNvIGFkZCB0aGUKK2RubCBgYW1fX0VYRUVYVCcgY29uZGl0aW9uYWwgaWYgX0FNX0NPTVBJTEVSX0VYRUVYVCB3YXMgc2Vlbi4gIFRoaXMgbWFjcm8KK2RubCBpcyBob29rZWQgb250byBfQUNfQ09NUElMRVJfRVhFRVhUIGVhcmx5LCBzZWUgYmVsb3cuCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKGRubAorW200X3Byb3ZpZGVfaWYoW19BTV9DT01QSUxFUl9FWEVFWFRdLAorICBbQU1fQ09ORElUSU9OQUwoW2FtX19FWEVFWFRdLCBbdGVzdCAtbiAiJEVYRUVYVCJdKV0pXSlkbmwKK10pCisKK2RubCBIb29rIGludG8gYF9BQ19DT01QSUxFUl9FWEVFWFQnIGVhcmx5IHRvIGxlYXJuIGl0cyBleHBhbnNpb24uICBEbyBub3QKK2RubCBhZGQgdGhlIGNvbmRpdGlvbmFsIHJpZ2h0IGhlcmUsIGFzIF9BQ19DT01QSUxFUl9FWEVFWFQgbWF5IGJlIGZ1cnRoZXIKK2RubCBtYW5nbGVkIGJ5IEF1dG9jb25mIGFuZCBydW4gaW4gYSBzaGVsbCBjb25kaXRpb25hbCBzdGF0ZW1lbnQuCittNF9kZWZpbmUoW19BQ19DT01QSUxFUl9FWEVFWFRdLAorbTRfZGVmbihbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW200X3Byb3ZpZGUoW19BTV9DT01QSUxFUl9FWEVFWFRdKV0pCisKKworIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKKyMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgorCisjIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCisjIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKKyMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgorQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAorWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9JDEKK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX1BST0dfSU5TVEFMTF9TSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lICRpbnN0YWxsX3NoLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAoraWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OworICAqKQorICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgorICBlc2FjCitmaQorQUNfU1VCU1QoaW5zdGFsbF9zaCldKQorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCisjIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KK0FDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAorW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCitta2RpciAudHN0IDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC50c3Q7IHRoZW4KKyAgYW1fX2xlYWRpbmdfZG90PS4KK2Vsc2UKKyAgYW1fX2xlYWRpbmdfZG90PV8KK2ZpCitybWRpciAudHN0IDI+L2Rldi9udWxsCitBQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQorCisjIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4gICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIEZyb20gSmltIE1leWVyaW5nCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworIyBBTV9NQUlOVEFJTkVSX01PREUoW0RFRkFVTFQtTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29udHJvbCBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcy4KKyMgRGVmYXVsdCBpcyB0byBkaXNhYmxlIHRoZW0sIHVubGVzcyBgZW5hYmxlJyBpcyBwYXNzZWQgbGl0ZXJhbGx5LgorIyBGb3Igc3ltbWV0cnksIGBkaXNhYmxlJyBtYXkgYmUgcGFzc2VkIGFzIHdlbGwuICBBbnl3YXksIHRoZSB1c2VyCisjIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSAtLWVuYWJsZS8tLWRpc2FibGUgc3dpdGNoLgorQUNfREVGVU4oW0FNX01BSU5UQUlORVJfTU9ERV0sCitbbTRfY2FzZShtNF9kZWZhdWx0KFskMV0sIFtkaXNhYmxlXSksCisgICAgICAgW2VuYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZGlzYWJsZV0pXSwKKyAgICAgICBbZGlzYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSldLAorICAgICAgIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSkKKyAgICAgICAgbTRfd2Fybihbc3ludGF4XSwgW3VuZXhwZWN0ZWQgYXJndW1lbnQgdG8gQU1AJnRAX01BSU5UQUlORVJfTU9ERTogJDFdKV0pCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYW1fbWFpbnRhaW5lcl9vdGhlciBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCisgIGRubCBtYWludGFpbmVyLW1vZGUncyBkZWZhdWx0IGlzICdkaXNhYmxlJyB1bmxlc3MgJ2VuYWJsZScgaXMgcGFzc2VkCisgIEFDX0FSR19FTkFCTEUoW21haW50YWluZXItbW9kZV0sCitbICAtLV1bYW1fbWFpbnRhaW5lcl9vdGhlcl1bLW1haW50YWluZXItbW9kZSAgYW1fbWFpbnRhaW5lcl9vdGhlciBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorCQkJICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKKyAgICAgIFtVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWxdLAorICAgICAgW1VTRV9NQUlOVEFJTkVSX01PREU9XW00X2lmKGFtX21haW50YWluZXJfb3RoZXIsIFtlbmFibGVdLCBbbm9dLCBbeWVzXSkpCisgIEFDX01TR19SRVNVTFQoWyRVU0VfTUFJTlRBSU5FUl9NT0RFXSkKKyAgQU1fQ09ORElUSU9OQUwoW01BSU5UQUlORVJfTU9ERV0sIFt0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzXSkKKyAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCisgIEFDX1NVQlNUKFtNQUlOVF0pZG5sCitdCispCisKK0FVX0RFRlVOKFtqbV9NQUlOVEFJTkVSX01PREVdLCBbQU1fTUFJTlRBSU5FUl9NT0RFXSkKKworIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKK0FDX1NVQlNUKFthbV9fcXVvdGVdKQorQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQorcm0gLWYgY29uZmluYyBjb25mbWYKK10pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDYKKworIyBBTV9QUk9HX0NDX0NfTworIyAtLS0tLS0tLS0tLS0tLQorIyBMaWtlIEFDX1BST0dfQ0NfQ19PLCBidXQgY2hhbmdlZCBmb3IgYXV0b21ha2UuCitBQ19ERUZVTihbQU1fUFJPR19DQ19DX09dLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NfQ19PXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK0FDX1JFUVVJUkVfQVVYX0ZJTEUoW2NvbXBpbGVdKWRubAorIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCisjIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KK3NldCBkdW1teSAkQ0MKK2FtX2NjPWBlY2hvICRbMl0gfCBzZWQgWydzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ11gCitldmFsIGFtX3Q9XCRhY19jdl9wcm9nX2NjXyR7YW1fY2N9X2NfbworaWYgdGVzdCAiJGFtX3QiICE9IHllczsgdGhlbgorICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KKyAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCisgICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KKyAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKKyAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCisgICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCitmaQorZG5sIE1ha2Ugc3VyZSBBQ19QUk9HX0NDIGlzIG5ldmVyIGNhbGxlZCBhZ2Fpbiwgb3IgaXQgd2lsbCBvdmVycmlkZSBvdXIKK2RubCBzZXR0aW5nIG9mIENDLgorbTRfZGVmaW5lKFtBQ19QUk9HX0NDXSwKKyAgICAgICAgICBbbTRfZmF0YWwoW0FDX1BST0dfQ0MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciBBTV9QUk9HX0NDX0NfT10pXSkKK10pCisKKyMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNgorCisjIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAorW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCiskMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KK0FDX1NVQlNUKCQxKV0pCisKKworIyBBTV9NSVNTSU5HX0hBU19SVU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KKyMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgorQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAorQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCitpZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7CisgICopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7CisgIGVzYWMKK2ZpCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQorZmkKK10pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX1BST0dfTUtESVJfUAorIyAtLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCitBQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKK1tBQ19QUkVSRVEoWzIuNjBdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKK2RubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKK2RubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgorZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCitkbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCitkbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCitkbmwgTUtESVJfUCkuCitBQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKK2Nhc2UgJG1rZGlyX3AgaW4KKyAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKKyAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OworZXNhYworXSkKKworIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNAorCisjIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAorW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKyMgX0FNX1NFVF9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KK0FDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCitbbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCisKKyMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKK1ttNF9mb3JlYWNoX3coW19BTV9PcHRpb25dLCBbJDFdLCBbX0FNX1NFVF9PUFRJT04oX0FNX09wdGlvbildKV0pCisKKyMgX0FNX0lGX09QVElPTihPUFRJT04sIElGLVNFVCwgW0lGLU5PVC1TRVRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgorQUNfREVGVU4oW19BTV9JRl9PUFRJT05dLAorW200X2lmc2V0KF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbJDJdLCBbJDNdKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX1JVTl9MT0coQ09NTUFORCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSdW4gQ09NTUFORCwgc2F2ZSB0aGUgZXhpdCBzdGF0dXMgaW4gYWNfc3RhdHVzLCBhbmQgbG9nIGl0LgorIyAoVGhpcyBoYXMgYmVlbiBhZGFwdGVkIGZyb20gQXV0b2NvbmYncyBfQUNfUlVOX0xPRyBtYWNyby4pCitBQ19ERUZVTihbQU1fUlVOX0xPR10sCitbeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJDEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICgkMSkgPiZBU19NRVNTQUdFX0xPR19GRCAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgYWNfc3RhdHVzPSQ/CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgKGV4aXQgJGFjX3N0YXR1cyk7IH1dKQorCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLiAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworIyBBTV9TQU5JVFlfQ0hFQ0sKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCisjIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQorIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgorYW1fbGY9JworJworY2FzZSBgcHdkYCBpbgorICAqW1tcXFwiXCNcJFwmXCdcYCRhbV9sZl1dKikKKyAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lXSk7OworZXNhYworY2FzZSAkc3JjZGlyIGluCisgICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXCBcCV1dKikKKyAgICBBQ19NU0dfRVJST1IoW3Vuc2FmZSBzcmNkaXIgdmFsdWU6IGAkc3JjZGlyJ10pOzsKK2VzYWMKKworIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiRbKl0iICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKKyAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCisgICBmaQorCisgICB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQorZmkKK0FDX01TR19SRVNVTFQoeWVzKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxCisKKyMgQU1fU0lMRU5UX1JVTEVTKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5hYmxlIGxlc3MgdmVyYm9zZSBidWlsZCBydWxlczsgd2l0aCB0aGUgZGVmYXVsdCBzZXQgdG8gREVGQVVMVAorIyAoYHllcycgYmVpbmcgbGVzcyB2ZXJib3NlLCBgbm8nIG9yIGVtcHR5IGJlaW5nIHZlcmJvc2UpLgorQUNfREVGVU4oW0FNX1NJTEVOVF9SVUxFU10sCitbQUNfQVJHX0VOQUJMRShbc2lsZW50LXJ1bGVzXSwKK1sgIC0tZW5hYmxlLXNpbGVudC1ydWxlcyAgICAgICAgICBsZXNzIHZlcmJvc2UgYnVpbGQgb3V0cHV0ICh1bmRvOiBgbWFrZSBWPTEnKQorICAtLWRpc2FibGUtc2lsZW50LXJ1bGVzICAgICAgICAgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MCcpXSkKK2Nhc2UgJGVuYWJsZV9zaWxlbnRfcnVsZXMgaW4KK3llcykgQU1fREVGQVVMVF9WRVJCT1NJVFk9MDs7CitubykgIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTE7OworKikgICBBTV9ERUZBVUxUX1ZFUkJPU0lUWT1tNF9pZihbJDFdLCBbeWVzXSwgWzBdLCBbMV0pOzsKK2VzYWMKK0FDX1NVQlNUKFtBTV9ERUZBVUxUX1ZFUkJPU0lUWV0pZG5sCitBTV9CQUNLU0xBU0g9J1wnCitBQ19TVUJTVChbQU1fQkFDS1NMQVNIXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFtBTV9CQUNLU0xBU0hdKWRubAorXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19JTlNUQUxMX1NUUklQCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKKyMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisjIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCisjIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgorIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCisjIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKKyMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAorW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitkbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQorZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCitBQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dHRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgorIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KK0FDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCisKKyMgQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFB1YmxpYyBzaXN0ZXIgb2YgX0FNX1NVQlNUX05PVE1BS0UuCitBQ19ERUZVTihbQU1fU1VCU1RfTk9UTUFLRV0sIFtfQU1fU1VCU1RfTk9UTUFLRSgkQCldKQorCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgX0FNX1BST0dfVEFSKEZPUk1BVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KKyMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCisjCisjIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCisjIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5CisjICR0YXJkaXIuCisjICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCisjCisjIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKKyMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KKyMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKK0FDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAorWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK0FNX01JU1NJTkdfUFJPRyhbQU1UQVJdLCBbdGFyXSkKK200X2lmKFskMV0sIFt2N10sCisgICAgIFthbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLSddLAorICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAorICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKKyMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KK19hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCitfYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQorIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCisjIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCitmb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scworZG8KKyAgY2FzZSAkX2FtX3Rvb2wgaW4KKyAgZ251dGFyKQorICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKKyAgICBkbworICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKKyAgICBkb25lCisgICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCisgICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKKyAgICA7OworICBwbGFpbnRhcikKKyAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQorICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCisgICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQorICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCisgICAgOzsKKyAgcGF4KQorICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ncGF4IC1yJworICAgIDs7CisgIGNwaW8pCisgICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJworICAgIDs7CisgIG5vbmUpCisgICAgYW1fX3Rhcj1mYWxzZQorICAgIGFtX190YXJfPWZhbHNlCisgICAgYW1fX3VudGFyPWZhbHNlCisgICAgOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCisgICMgYW5kIGFtX191bnRhciBzZXQuCisgIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhaworCisgICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcworICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCisgIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KKyAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQorICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhaworICBmaQorZG9uZQorcm0gLXJmIGNvbmZ0ZXN0LmRpcgorCitBQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCitBQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCitBQ19TVUJTVChbYW1fX3Rhcl0pCitBQ19TVUJTVChbYW1fX3VudGFyXSkKK10pICMgX0FNX1BST0dfVEFSCisKK200X2luY2x1ZGUoW200L2FzLWFjLWV4cGFuZC5tNF0pCittNF9pbmNsdWRlKFttNC9jb21waWxlci5tNF0pCittNF9pbmNsdWRlKFttNC9saWJ0b29sLm00XSkKK200X2luY2x1ZGUoW200L2x0b3B0aW9ucy5tNF0pCittNF9pbmNsdWRlKFttNC9sdHN1Z2FyLm00XSkKK200X2luY2x1ZGUoW200L2x0dmVyc2lvbi5tNF0pCittNF9pbmNsdWRlKFttNC9sdH5vYnNvbGV0ZS5tNF0pCittNF9pbmNsdWRlKFttNC9wa2cubTRdKQorbTRfaW5jbHVkZShbbTQvdHAtY29tcGlsZXItZmxhZy5tNF0pCittNF9pbmNsdWRlKFttNC90cC1jb21waWxlci13YXJuaW5ncy5tNF0pCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvTWFrZWZpbGUuYW0gYi9kYnVzLTEuNC4xMC9idXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiM2JjMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI3NCBAQAorY29uZmlnZGlyPSQoc3lzY29uZmRpcikvZGJ1cy0xCitkYnVzX2RhZW1vbl9leGVjZGlyID0gJChEQlVTX0RBRU1PTkRJUikKKworSU5DTFVERVMgPSAtSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19CVVNfQ0ZMQUdTKSBcCisJLUREQlVTX1NZU1RFTV9DT05GSUdfRklMRT1cIiIkKGNvbmZpZ2Rpcikvc3lzdGVtLmNvbmYiXCIgXAorCS1EREJVU19DT01QSUxBVElPTgorCitFRkVOQ0U9CisKK0NPTkZJR19JTl9GSUxFUz0JCQkJXAorCXNlc3Npb24uY29uZi5pbgkJCQlcCisJc3lzdGVtLmNvbmYuaW4JCQkJXAorCW9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QuaW4KKworY29uZmlnX0RBVEE9CQkJCQlcCisJc2Vzc2lvbi5jb25mCQkJCVwKKwlzeXN0ZW0uY29uZgorCitpZiBEQlVTX0VOQUJMRV9MQVVOQ0hECithZ2VudGRpcj0kKExBVU5DSERfQUdFTlRfRElSKQorYWdlbnRfREFUQT1vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CitlbmRpZgorCitpZiBEQlVTX1VTRV9MSUJYTUwKK1hNTF9TT1VSQ0VTPWNvbmZpZy1sb2FkZXItbGlieG1sLmMKK2VuZGlmCitpZiBEQlVTX1VTRV9FWFBBVAorWE1MX1NPVVJDRVM9Y29uZmlnLWxvYWRlci1leHBhdC5jCitlbmRpZgorCitpZiBEQlVTX0JVU19FTkFCTEVfS1FVRVVFCitESVJfV0FUQ0hfU09VUkNFPWRpci13YXRjaC1rcXVldWUuYworZWxzZQoraWYgREJVU19CVVNfRU5BQkxFX0lOT1RJRlkKK0RJUl9XQVRDSF9TT1VSQ0U9ZGlyLXdhdGNoLWlub3RpZnkuYworZWxzZQoraWYgREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVgKK0RJUl9XQVRDSF9TT1VSQ0U9ZGlyLXdhdGNoLWRub3RpZnkuYworZWxzZQorRElSX1dBVENIX1NPVVJDRT1kaXItd2F0Y2gtZGVmYXVsdC5jCitlbmRpZgorZW5kaWYKK2VuZGlmCisKK0JVU19TT1VSQ0VTPQkJCQkJXAorCWFjdGl2YXRpb24uYwkJCQlcCisJYWN0aXZhdGlvbi5oCQkJCVwKKwlhY3RpdmF0aW9uLWV4aXQtY29kZXMuaAkJCVwKKwlidXMuYwkJCQkJXAorCWJ1cy5oCQkJCQlcCisJY29uZmlnLXBhcnNlci5jCQkJCVwKKwljb25maWctcGFyc2VyLmgJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25uZWN0aW9uLmMJCQkJXAorCWNvbm5lY3Rpb24uaAkJCQlcCisJZGVza3RvcC1maWxlLmMJCQkJXAorCWRlc2t0b3AtZmlsZS5oCQkJCVwKKwkkKERJUl9XQVRDSF9TT1VSQ0UpCQkJXAorCWRpci13YXRjaC5oCQkJCVwKKwlkaXNwYXRjaC5jCQkJCVwKKwlkaXNwYXRjaC5oCQkJCVwKKwlkcml2ZXIuYwkJCQlcCisJZHJpdmVyLmgJCQkJXAorCWV4cGlyZWxpc3QuYwkJCQlcCisJZXhwaXJlbGlzdC5oCQkJCVwKKwlwb2xpY3kuYwkJCQlcCisJcG9saWN5LmgJCQkJXAorCXNlbGludXguaAkJCQlcCisJc2VsaW51eC5jCQkJCVwKKwlzZXJ2aWNlcy5jCQkJCVwKKwlzZXJ2aWNlcy5oCQkJCVwKKwlzaWduYWxzLmMJCQkJXAorCXNpZ25hbHMuaAkJCQlcCisJdGVzdC5jCQkJCQlcCisJdGVzdC5oCQkJCQlcCisJdXRpbHMuYwkJCQkJXAorCXV0aWxzLmgJCQkJCVwKKwkkKFhNTF9TT1VSQ0VTKQorCitkYnVzX2RhZW1vbl9TT1VSQ0VTPQkJCQlcCisJJChCVVNfU09VUkNFUykJCQkJXAorCW1haW4uYworCitkYnVzX2RhZW1vbl9DUFBGTEFHUyA9IC1EREJVU19TVEFUSUNfQlVJTEQKK2RidXNfZGFlbW9uX0xEQUREPQkJCQkJXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEJXAorCSQoRUZFTkNFKQkJCQkJXAorCSQoREJVU19CVVNfTElCUykKKworZGJ1c19kYWVtb25fTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AgQFNFQ1RJT05fTERGTEFHU0AKKworTEFVTkNIX0hFTFBFUl9TT1VSQ0VTPQkJCQlcCisJJChYTUxfU09VUkNFUykJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuYwkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuaAkJCVwKKwlkZXNrdG9wLWZpbGUuYwkJCQlcCisJZGVza3RvcC1maWxlLmgJCQkJXAorCXV0aWxzLmMJCQkJCVwKKwl1dGlscy5oCQkJCQlcCisJYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgJCQlcCisJYWN0aXZhdGlvbi1oZWxwZXIuaAkgIAkJXAorCWFjdGl2YXRpb24taGVscGVyLmMKKworIyMgVGhpcyBpcyB0aGUgaW5zdGFsbGVkIGxhdW5jaCBoZWxwZXIgd2l0aCB0aGUgc2V0dWlkIGNoZWNrcworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9TT1VSQ0VTPQkJXAorCWFjdGl2YXRpb24taGVscGVyLWJpbi5jCQkJXAorCSQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTKQorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTID0gLUREQlVTX1NUQVRJQ19CVUlMRAorZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9MREFERD0JCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKERCVVNfTEFVTkNIRVJfTElCUykKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9MREZMQUdTPUBSX0RZTkFNSUNfTERGTEFHQCBAU0VDVElPTl9MREZMQUdTQAorCisjIyB3ZSBidWlsZCBhbm90aGVyIGJpbmFyeSBzbyB3ZSBjYW4gZG8gdGhlIGxhdW5jaCB0ZXN0aW5nIHdpdGhvdXQgcm9vdCBwcml2cy4KKyMjIERPIE5PVCBJTlNUQUxMIFRISVMgRklMRQorZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X1NPVVJDRVM9CQlcCisJYWN0aXZhdGlvbi1oZWxwZXItYmluLmMJCQlcCisJJChMQVVOQ0hfSEVMUEVSX1NPVVJDRVMpCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9MREFERD0JCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKERCVVNfTEFVTkNIRVJfTElCUykKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdAIEBTRUNUSU9OX0xERkxBR1NACitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1M9IC1EREJVU19TVEFUSUNfQlVJTEQJXAorCS1EQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisKKyMjIHdlIGJ1aWxkIHlldCBhbm90aGVyIGJpbmFyeSBzbyB3ZSBjYW4gZG8gdGhlIE9PTSB0ZXN0cworIyMgRE8gTk9UIElOU1RBTEwgVEhJUyBGSUxFCitidXNfdGVzdF9sYXVuY2hfaGVscGVyX1NPVVJDRVM9CQlcCisJdGVzdC1sYXVuY2gtaGVscGVyLmMgICAJCVwKKwkkKExBVU5DSF9IRUxQRVJfU09VUkNFUykKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9MREFERD0JCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKERCVVNfTEFVTkNIRVJfTElCUykKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9MREZMQUdTPUBSX0RZTkFNSUNfTERGTEFHQCBAU0VDVElPTl9MREZMQUdTQAorYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUz0gLUREQlVTX1NUQVRJQ19CVUlMRAlcCisJLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QJXAorCS1EQUNUSVZBVElPTl9MQVVOQ0hFUl9ET19PT00KKworIyMgd2UgdXNlIG5vaW5zdF9QUk9HUkFNUyBub3QgY2hlY2tfUFJPR1JBTVMgc28gdGhhdCB3ZSBidWlsZAorIyMgZXZlbiB3aGVuIG5vdCBkb2luZyAibWFrZSBjaGVjayIKK25vaW5zdF9QUk9HUkFNUyA9ICQoVEVTVFMpCitkYnVzX2RhZW1vbl9leGVjX1BST0dSQU1TID0gZGJ1cy1kYWVtb24KK2xpYmV4ZWNfUFJPR1JBTVMgPSBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyCisKKyMjIG5vdGUgdGhhdCBURVNUUyBoYXMgc3BlY2lhbCBtZWFuaW5nIChzdHVmZiB0byB1c2UgaW4gbWFrZSBjaGVjaykKKyMjIHNvIGlmIGFkZGluZyB0ZXN0cyBub3QgdG8gYmUgcnVuIGluIG1ha2UgY2hlY2ssIGRvbid0IGFkZCB0aGVtIHRvCisjIyBURVNUUworVEVTVFMgPQorCitpZiBEQlVTX0JVSUxEX1RFU1RTCitURVNUU19FTlZJUk9OTUVOVD1EQlVTX1RFU1RfREFUQT0kKHRvcF9idWlsZGRpcikvdGVzdC9kYXRhIERCVVNfVEVTVF9IT01FRElSPSQodG9wX2J1aWxkZGlyKS9kYnVzIERCVVNfRkFUQUxfV0FSTklOR1M9MSBEQlVTX0JMT0NLX09OX0FCT1JUPTEKK1RFU1RTICs9IGJ1cy10ZXN0IGJ1cy10ZXN0LXN5c3RlbQorCitpZiBEQlVTX1VOSVgKK1RFU1RTICs9IGJ1cy10ZXN0LWxhdW5jaC1oZWxwZXIKKyMgdGhpcyBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyBidXQgaXMgbm90LGl0c2VsZiwgYSB0ZXN0Citub2luc3RfUFJPR1JBTVMgKz0gZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0CitlbmRpZiBEQlVTX1VOSVgKKworZW5kaWYgREJVU19CVUlMRF9URVNUUworCitidXNfdGVzdF9zeXN0ZW1fU09VUkNFUz0JCQlcCisJJChYTUxfU09VUkNFUykJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuYwkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuaAkJCVwKKwl1dGlscy5jCQkJCQlcCisJdXRpbHMuaAkJCQkJXAorCXRlc3Qtc3lzdGVtLmMKKworYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTID0gLUREQlVTX1NUQVRJQ19CVUlMRAorYnVzX3Rlc3Rfc3lzdGVtX0xEQUREPSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChEQlVTX0JVU19MSUJTKQorYnVzX3Rlc3Rfc3lzdGVtX0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdACisKK2J1c190ZXN0X1NPVVJDRVM9CQkJCVwKKwkkKEJVU19TT1VSQ0VTKQkJCQlcCisJdGVzdC1tYWluLmMKKworYnVzX3Rlc3RfQ1BQRkxBR1MgPSAtRERCVVNfU1RBVElDX0JVSUxECitidXNfdGVzdF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhICQoREJVU19CVVNfTElCUykKK2J1c190ZXN0X0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdACisKKyMjIG1vcCB1cCB0aGUgZ2NvdiBmaWxlcworY2xlYW4tbG9jYWw6CisJL2Jpbi9ybSAqLmJiICouYmJnICouZGEgKi5nY292IHx8IHRydWUKKworaW5zdGFsbC1kYXRhLWhvb2s6CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsb2NhbHN0YXRlZGlyKS9ydW4vZGJ1cworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoY29uZmlnZGlyKS9zeXN0ZW0uZAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoY29uZmlnZGlyKS9zZXNzaW9uLmQKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRhdGFkaXIpL2RidXMtMS9zZXJ2aWNlcworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGF0YWRpcikvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcworaWYgSEFWRV9TWVNURU1ECisjIEluc3RhbGwgZGJ1cy5zb2NrZXQgYXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIEQtQnVzIHN0YWNrCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvZGJ1cy50YXJnZXQud2FudHMKKwkkKExOX1MpIC4uL2RidXMuc29ja2V0ICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9kYnVzLnRhcmdldC53YW50cy9kYnVzLnNvY2tldAorIyBVbmNvbmRpdGlvbmFsbHkgZW5hYmxlIEQtQnVzIG9uIHN5c3RlbWQgaW5zdGFsbGF0aW9ucworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpL3NvY2tldHMudGFyZ2V0LndhbnRzCisJJChMTl9TKSAuLi9kYnVzLnNvY2tldCAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvc29ja2V0cy50YXJnZXQud2FudHMvZGJ1cy5zb2NrZXQKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9tdWx0aS11c2VyLnRhcmdldC53YW50cworCSQoTE5fUykgLi4vZGJ1cy5zZXJ2aWNlICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9tdWx0aS11c2VyLnRhcmdldC53YW50cy9kYnVzLnNlcnZpY2UKK2VuZGlmCisKK2lmIERCVVNfVU5JWAoraW5zdGFsbC1leGVjLWhvb2s6CisJaWYgdGVzdCBgaWQgLXVgIC1lcSAwOyB0aGVuIFwKKwkJY2hvd24gcm9vdDokKERCVVNfVVNFUikgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciQoRVhFRVhUKTsgXAorCQljaG1vZCA0NzUwICQoREVTVERJUikkKGxpYmV4ZWNkaXIpL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIkKEVYRUVYVCk7IFwKKwllbHNlIFwKKwkJZWNobyAiTm90IGluc3RhbGxpbmcgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciBiaW5hcnkgc2V0dWlkISI7IFwKKwkJZWNobyAiWW91J2xsIG5lZWQgdG8gbWFudWFsbHkgc2V0IHBlcm1pc3Npb25zIHRvIHJvb3Q6JChEQlVTX1VTRVIpIGFuZCBwZXJtaXNzaW9ucyA0NzUwIjsgXAorCWZpCitlbmRpZgorCisjIyMjIEluaXQgc2NyaXB0cyBmdW4KK1NDUklQVF9JTl9GSUxFUz1tZXNzYWdlYnVzLmluIFwKKwkJbWVzc2FnZWJ1cy1jb25maWcuaW4gXAorCQlyYy5tZXNzYWdlYnVzLmluCisKKyMjIFJlZCBIYXQgc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVQKKworaW5pdGRkaXI9JChzeXNjb25mZGlyKS9yYy5kL2luaXQuZAorCitpbml0ZF9TQ1JJUFRTPSAJXAorCW1lc3NhZ2VidXMKKworZW5kaWYKKyAjIyBSZWQgSGF0IGVuZAorCisjIyBTbGFja3dhcmUgc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRQorCitpbml0ZGRpcj0kKHN5c2NvbmZkaXIpL3JjLmQvCisKK2luaXRkX1NDUklQVFM9IAlcCisJcmMubWVzc2FnZWJ1cworCitlbmRpZgorIyMgU2xhY2t3YXJlIGVuZAorCisjIyBDeWd3aW4gc3RhcnQKK2lmIERCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTgorCitiaW5fU0NSSVBUUz0gCVwKKwltZXNzYWdlYnVzLWNvbmZpZworCitlbmRpZgorIyMgQ3lnd2luIGVuZAorCitpZiBIQVZFX1NZU1RFTUQKK1NDUklQVF9JTl9GSUxFUyArPSBcCisJZGJ1cy5zZXJ2aWNlLmluIFwKKwlkYnVzLnNvY2tldC5pbgorCitzeXN0ZW1kc3lzdGVtdW5pdF9EQVRBID0gXAorCWRidXMuc2VydmljZSBcCisJZGJ1cy5zb2NrZXQKK2VuZGlmCisKKyMjIyMgRXh0cmEgZGlzdAorCitFWFRSQV9ESVNUPSQoQ09ORklHX0lOX0ZJTEVTKSAkKFNDUklQVF9JTl9GSUxFUykKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9NYWtlZmlsZS5pbiBiL2RidXMtMS40LjEwL2J1cy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGNjOTQxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjYwNCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworCisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK25vaW5zdF9QUk9HUkFNUyA9ICQoYW1fX0VYRUVYVF8zKSAkKGFtX19FWEVFWFRfNCkKK2RidXNfZGFlbW9uX2V4ZWNfUFJPR1JBTVMgPSBkYnVzLWRhZW1vbiQoRVhFRVhUKQorbGliZXhlY19QUk9HUkFNUyA9IGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIkKEVYRUVYVCkKK1RFU1RTID0gJChhbV9fRVhFRVhUXzEpICQoYW1fX0VYRUVYVF8yKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUBhbV9fYXBwZW5kXzEgPSBidXMtdGVzdCBidXMtdGVzdC1zeXN0ZW0KK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAQERCVVNfVU5JWF9UUlVFQGFtX19hcHBlbmRfMiA9IGJ1cy10ZXN0LWxhdW5jaC1oZWxwZXIKKyMgdGhpcyBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyBidXQgaXMgbm90LGl0c2VsZiwgYSB0ZXN0CitAREJVU19CVUlMRF9URVNUU19UUlVFQEBEQlVTX1VOSVhfVFJVRUBhbV9fYXBwZW5kXzMgPSBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QKK0BIQVZFX1NZU1RFTURfVFJVRUBhbV9fYXBwZW5kXzQgPSBcCitASEFWRV9TWVNURU1EX1RSVUVACWRidXMuc2VydmljZS5pbiBcCitASEFWRV9TWVNURU1EX1RSVUVACWRidXMuc29ja2V0LmluCisKK3N1YmRpciA9IGJ1cworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluIFwKKwkkKHNyY2RpcikvZGJ1cy5zZXJ2aWNlLmluICQoc3JjZGlyKS9kYnVzLnNvY2tldC5pbiBcCisJJChzcmNkaXIpL21lc3NhZ2VidXMtY29uZmlnLmluICQoc3JjZGlyKS9tZXNzYWdlYnVzLmluIFwKKwkkKHNyY2Rpcikvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdC5pbiBcCisJJChzcmNkaXIpL3JjLm1lc3NhZ2VidXMuaW4gJChzcmNkaXIpL3Nlc3Npb24uY29uZi5pbiBcCisJJChzcmNkaXIpL3N5c3RlbS5jb25mLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9hcy1hYy1leHBhbmQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvY29tcGlsZXIubTQgJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCAkKHRvcF9zcmNkaXIpL200L2x0c3VnYXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00ICQodG9wX3NyY2RpcikvbTQvbHR+b2Jzb2xldGUubTQgXAorCSQodG9wX3NyY2RpcikvbTQvcGtnLm00ICQodG9wX3NyY2RpcikvbTQvdHAtY29tcGlsZXItZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9IHN5c3RlbS5jb25mIHNlc3Npb24uY29uZiBtZXNzYWdlYnVzIFwKKwltZXNzYWdlYnVzLWNvbmZpZyBvcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0IFwKKwlyYy5tZXNzYWdlYnVzIGRidXMuc2VydmljZSBkYnVzLnNvY2tldAorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChkYnVzX2RhZW1vbl9leGVjZGlyKSIgXAorCSIkKERFU1RESVIpJChsaWJleGVjZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiIFwKKwkiJChERVNURElSKSQoaW5pdGRkaXIpIiAiJChERVNURElSKSQoYWdlbnRkaXIpIiBcCisJIiQoREVTVERJUikkKGNvbmZpZ2RpcikiICIkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikiCitAREJVU19CVUlMRF9URVNUU19UUlVFQGFtX19FWEVFWFRfMSA9IGJ1cy10ZXN0JChFWEVFWFQpIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACWJ1cy10ZXN0LXN5c3RlbSQoRVhFRVhUKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUBAREJVU19VTklYX1RSVUVAYW1fX0VYRUVYVF8yID0gYnVzLXRlc3QtbGF1bmNoLWhlbHBlciQoRVhFRVhUKQorYW1fX0VYRUVYVF8zID0gJChhbV9fRVhFRVhUXzEpICQoYW1fX0VYRUVYVF8yKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUBAREJVU19VTklYX1RSVUVAYW1fX0VYRUVYVF80ID0gZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0JChFWEVFWFQpCitQUk9HUkFNUyA9ICQoZGJ1c19kYWVtb25fZXhlY19QUk9HUkFNUykgJChsaWJleGVjX1BST0dSQU1TKSBcCisJJChub2luc3RfUFJPR1JBTVMpCithbV9fYnVzX3Rlc3RfU09VUkNFU19ESVNUID0gYWN0aXZhdGlvbi5jIGFjdGl2YXRpb24uaCBcCisJYWN0aXZhdGlvbi1leGl0LWNvZGVzLmggYnVzLmMgYnVzLmggY29uZmlnLXBhcnNlci5jIFwKKwljb25maWctcGFyc2VyLmggY29uZmlnLXBhcnNlci1jb21tb24uYyBjb25maWctcGFyc2VyLWNvbW1vbi5oIFwKKwljb25uZWN0aW9uLmMgY29ubmVjdGlvbi5oIGRlc2t0b3AtZmlsZS5jIGRlc2t0b3AtZmlsZS5oIFwKKwlkaXItd2F0Y2gtZGVmYXVsdC5jIGRpci13YXRjaC1kbm90aWZ5LmMgZGlyLXdhdGNoLWlub3RpZnkuYyBcCisJZGlyLXdhdGNoLWtxdWV1ZS5jIGRpci13YXRjaC5oIGRpc3BhdGNoLmMgZGlzcGF0Y2guaCBkcml2ZXIuYyBcCisJZHJpdmVyLmggZXhwaXJlbGlzdC5jIGV4cGlyZWxpc3QuaCBwb2xpY3kuYyBwb2xpY3kuaCBzZWxpbnV4LmggXAorCXNlbGludXguYyBzZXJ2aWNlcy5jIHNlcnZpY2VzLmggc2lnbmFscy5jIHNpZ25hbHMuaCB0ZXN0LmMgXAorCXRlc3QuaCB1dGlscy5jIHV0aWxzLmggY29uZmlnLWxvYWRlci1leHBhdC5jIFwKKwljb25maWctbG9hZGVyLWxpYnhtbC5jIHRlc3QtbWFpbi5jCitAREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVhfRkFMU0VAQERCVVNfQlVTX0VOQUJMRV9JTk9USUZZX0ZBTFNFQEBEQlVTX0JVU19FTkFCTEVfS1FVRVVFX0ZBTFNFQGFtX19vYmplY3RzXzEgPSBidXNfdGVzdC1kaXItd2F0Y2gtZGVmYXVsdC4kKE9CSkVYVCkKK0BEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWF9UUlVFQEBEQlVTX0JVU19FTkFCTEVfSU5PVElGWV9GQUxTRUBAREJVU19CVVNfRU5BQkxFX0tRVUVVRV9GQUxTRUBhbV9fb2JqZWN0c18xID0gYnVzX3Rlc3QtZGlyLXdhdGNoLWRub3RpZnkuJChPQkpFWFQpCitAREJVU19CVVNfRU5BQkxFX0lOT1RJRllfVFJVRUBAREJVU19CVVNfRU5BQkxFX0tRVUVVRV9GQUxTRUBhbV9fb2JqZWN0c18xID0gYnVzX3Rlc3QtZGlyLXdhdGNoLWlub3RpZnkuJChPQkpFWFQpCitAREJVU19CVVNfRU5BQkxFX0tRVUVVRV9UUlVFQGFtX19vYmplY3RzXzEgPSBidXNfdGVzdC1kaXItd2F0Y2gta3F1ZXVlLiQoT0JKRVhUKQorQERCVVNfVVNFX0VYUEFUX0ZBTFNFQEBEQlVTX1VTRV9MSUJYTUxfVFJVRUBhbV9fb2JqZWN0c18yID0gYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuJChPQkpFWFQpCitAREJVU19VU0VfRVhQQVRfVFJVRUBhbV9fb2JqZWN0c18yID0gIFwKK0BEQlVTX1VTRV9FWFBBVF9UUlVFQAlidXNfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0LiQoT0JKRVhUKQorYW1fX29iamVjdHNfMyA9IGJ1c190ZXN0LWFjdGl2YXRpb24uJChPQkpFWFQpIGJ1c190ZXN0LWJ1cy4kKE9CSkVYVCkgXAorCWJ1c190ZXN0LWNvbmZpZy1wYXJzZXIuJChPQkpFWFQpIFwKKwlidXNfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi4kKE9CSkVYVCkgXAorCWJ1c190ZXN0LWNvbm5lY3Rpb24uJChPQkpFWFQpIGJ1c190ZXN0LWRlc2t0b3AtZmlsZS4kKE9CSkVYVCkgXAorCSQoYW1fX29iamVjdHNfMSkgYnVzX3Rlc3QtZGlzcGF0Y2guJChPQkpFWFQpIFwKKwlidXNfdGVzdC1kcml2ZXIuJChPQkpFWFQpIGJ1c190ZXN0LWV4cGlyZWxpc3QuJChPQkpFWFQpIFwKKwlidXNfdGVzdC1wb2xpY3kuJChPQkpFWFQpIGJ1c190ZXN0LXNlbGludXguJChPQkpFWFQpIFwKKwlidXNfdGVzdC1zZXJ2aWNlcy4kKE9CSkVYVCkgYnVzX3Rlc3Qtc2lnbmFscy4kKE9CSkVYVCkgXAorCWJ1c190ZXN0LXRlc3QuJChPQkpFWFQpIGJ1c190ZXN0LXV0aWxzLiQoT0JKRVhUKSBcCisJJChhbV9fb2JqZWN0c18yKQorYW1fYnVzX3Rlc3RfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMykgYnVzX3Rlc3QtdGVzdC1tYWluLiQoT0JKRVhUKQorYnVzX3Rlc3RfT0JKRUNUUyA9ICQoYW1fYnVzX3Rlc3RfT0JKRUNUUykKK2FtX19ERVBFTkRFTkNJRVNfMSA9CitidXNfdGVzdF9ERVBFTkRFTkNJRVMgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK0FNX1ZfbHQgPSAkKGFtX192X2x0XyQoVikpCithbV9fdl9sdF8gPSAkKGFtX192X2x0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfbHRfMCA9IC0tc2lsZW50CitidXNfdGVzdF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChidXNfdGVzdF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9fYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9TT1VSQ0VTX0RJU1QgPSB0ZXN0LWxhdW5jaC1oZWxwZXIuYyBcCisJY29uZmlnLWxvYWRlci1leHBhdC5jIGNvbmZpZy1sb2FkZXItbGlieG1sLmMgXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMgY29uZmlnLXBhcnNlci1jb21tb24uaCBcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmMgY29uZmlnLXBhcnNlci10cml2aWFsLmggZGVza3RvcC1maWxlLmMgXAorCWRlc2t0b3AtZmlsZS5oIHV0aWxzLmMgdXRpbHMuaCBhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCBcCisJYWN0aXZhdGlvbi1oZWxwZXIuaCBhY3RpdmF0aW9uLWhlbHBlci5jCitAREJVU19VU0VfRVhQQVRfRkFMU0VAQERCVVNfVVNFX0xJQlhNTF9UUlVFQGFtX19vYmplY3RzXzQgPSBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLiQoT0JKRVhUKQorQERCVVNfVVNFX0VYUEFUX1RSVUVAYW1fX29iamVjdHNfNCA9IGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzUgPSAkKGFtX19vYmplY3RzXzQpIFwKKwlidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLiQoT0JKRVhUKSBcCisJYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwuJChPQkpFWFQpIFwKKwlidXNfdGVzdF9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS4kKE9CSkVYVCkgXAorCWJ1c190ZXN0X2xhdW5jaF9oZWxwZXItdXRpbHMuJChPQkpFWFQpIFwKKwlidXNfdGVzdF9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLiQoT0JKRVhUKQorYW1fYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9PQkpFQ1RTID0gIFwKKwlidXNfdGVzdF9sYXVuY2hfaGVscGVyLXRlc3QtbGF1bmNoLWhlbHBlci4kKE9CSkVYVCkgXAorCSQoYW1fX29iamVjdHNfNSkKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXJfT0JKRUNUUyA9ICQoYW1fYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9PQkpFQ1RTKQorYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9ERVBFTkRFTkNJRVMgPSAgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCitidXNfdGVzdF9sYXVuY2hfaGVscGVyX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK2FtX19idXNfdGVzdF9zeXN0ZW1fU09VUkNFU19ESVNUID0gY29uZmlnLWxvYWRlci1leHBhdC5jIFwKKwljb25maWctbG9hZGVyLWxpYnhtbC5jIGNvbmZpZy1wYXJzZXItY29tbW9uLmMgXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmggY29uZmlnLXBhcnNlci10cml2aWFsLmMgXAorCWNvbmZpZy1wYXJzZXItdHJpdmlhbC5oIHV0aWxzLmMgdXRpbHMuaCB0ZXN0LXN5c3RlbS5jCitAREJVU19VU0VfRVhQQVRfRkFMU0VAQERCVVNfVVNFX0xJQlhNTF9UUlVFQGFtX19vYmplY3RzXzYgPSBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1saWJ4bWwuJChPQkpFWFQpCitAREJVU19VU0VfRVhQQVRfVFJVRUBhbV9fb2JqZWN0c182ID0gYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItZXhwYXQuJChPQkpFWFQpCithbV9idXNfdGVzdF9zeXN0ZW1fT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfNikgXAorCWJ1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLWNvbW1vbi4kKE9CSkVYVCkgXAorCWJ1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLXRyaXZpYWwuJChPQkpFWFQpIFwKKwlidXNfdGVzdF9zeXN0ZW0tdXRpbHMuJChPQkpFWFQpIFwKKwlidXNfdGVzdF9zeXN0ZW0tdGVzdC1zeXN0ZW0uJChPQkpFWFQpCitidXNfdGVzdF9zeXN0ZW1fT0JKRUNUUyA9ICQoYW1fYnVzX3Rlc3Rfc3lzdGVtX09CSkVDVFMpCitidXNfdGVzdF9zeXN0ZW1fREVQRU5ERU5DSUVTID0gIFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQorYnVzX3Rlc3Rfc3lzdGVtX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKGJ1c190ZXN0X3N5c3RlbV9MREZMQUdTKSAkKExERkxBR1MpIFwKKwktbyAkQAorYW1fX2RidXNfZGFlbW9uX1NPVVJDRVNfRElTVCA9IGFjdGl2YXRpb24uYyBhY3RpdmF0aW9uLmggXAorCWFjdGl2YXRpb24tZXhpdC1jb2Rlcy5oIGJ1cy5jIGJ1cy5oIGNvbmZpZy1wYXJzZXIuYyBcCisJY29uZmlnLXBhcnNlci5oIGNvbmZpZy1wYXJzZXItY29tbW9uLmMgY29uZmlnLXBhcnNlci1jb21tb24uaCBcCisJY29ubmVjdGlvbi5jIGNvbm5lY3Rpb24uaCBkZXNrdG9wLWZpbGUuYyBkZXNrdG9wLWZpbGUuaCBcCisJZGlyLXdhdGNoLWRlZmF1bHQuYyBkaXItd2F0Y2gtZG5vdGlmeS5jIGRpci13YXRjaC1pbm90aWZ5LmMgXAorCWRpci13YXRjaC1rcXVldWUuYyBkaXItd2F0Y2guaCBkaXNwYXRjaC5jIGRpc3BhdGNoLmggZHJpdmVyLmMgXAorCWRyaXZlci5oIGV4cGlyZWxpc3QuYyBleHBpcmVsaXN0LmggcG9saWN5LmMgcG9saWN5Lmggc2VsaW51eC5oIFwKKwlzZWxpbnV4LmMgc2VydmljZXMuYyBzZXJ2aWNlcy5oIHNpZ25hbHMuYyBzaWduYWxzLmggdGVzdC5jIFwKKwl0ZXN0LmggdXRpbHMuYyB1dGlscy5oIGNvbmZpZy1sb2FkZXItZXhwYXQuYyBcCisJY29uZmlnLWxvYWRlci1saWJ4bWwuYyBtYWluLmMKK0BEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWF9GQUxTRUBAREJVU19CVVNfRU5BQkxFX0lOT1RJRllfRkFMU0VAQERCVVNfQlVTX0VOQUJMRV9LUVVFVUVfRkFMU0VAYW1fX29iamVjdHNfNyA9IGRidXNfZGFlbW9uLWRpci13YXRjaC1kZWZhdWx0LiQoT0JKRVhUKQorQERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYX1RSVUVAQERCVVNfQlVTX0VOQUJMRV9JTk9USUZZX0ZBTFNFQEBEQlVTX0JVU19FTkFCTEVfS1FVRVVFX0ZBTFNFQGFtX19vYmplY3RzXzcgPSBkYnVzX2RhZW1vbi1kaXItd2F0Y2gtZG5vdGlmeS4kKE9CSkVYVCkKK0BEQlVTX0JVU19FTkFCTEVfSU5PVElGWV9UUlVFQEBEQlVTX0JVU19FTkFCTEVfS1FVRVVFX0ZBTFNFQGFtX19vYmplY3RzXzcgPSBkYnVzX2RhZW1vbi1kaXItd2F0Y2gtaW5vdGlmeS4kKE9CSkVYVCkKK0BEQlVTX0JVU19FTkFCTEVfS1FVRVVFX1RSVUVAYW1fX29iamVjdHNfNyA9IGRidXNfZGFlbW9uLWRpci13YXRjaC1rcXVldWUuJChPQkpFWFQpCitAREJVU19VU0VfRVhQQVRfRkFMU0VAQERCVVNfVVNFX0xJQlhNTF9UUlVFQGFtX19vYmplY3RzXzggPSBkYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWxpYnhtbC4kKE9CSkVYVCkKK0BEQlVTX1VTRV9FWFBBVF9UUlVFQGFtX19vYmplY3RzXzggPSBkYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWV4cGF0LiQoT0JKRVhUKQorYW1fX29iamVjdHNfOSA9IGRidXNfZGFlbW9uLWFjdGl2YXRpb24uJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbi1idXMuJChPQkpFWFQpIGRidXNfZGFlbW9uLWNvbmZpZy1wYXJzZXIuJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLWNvbW1vbi4kKE9CSkVYVCkgXAorCWRidXNfZGFlbW9uLWNvbm5lY3Rpb24uJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbi1kZXNrdG9wLWZpbGUuJChPQkpFWFQpICQoYW1fX29iamVjdHNfNykgXAorCWRidXNfZGFlbW9uLWRpc3BhdGNoLiQoT0JKRVhUKSBkYnVzX2RhZW1vbi1kcml2ZXIuJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbi1leHBpcmVsaXN0LiQoT0JKRVhUKSBkYnVzX2RhZW1vbi1wb2xpY3kuJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbi1zZWxpbnV4LiQoT0JKRVhUKSBkYnVzX2RhZW1vbi1zZXJ2aWNlcy4kKE9CSkVYVCkgXAorCWRidXNfZGFlbW9uLXNpZ25hbHMuJChPQkpFWFQpIGRidXNfZGFlbW9uLXRlc3QuJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbi11dGlscy4kKE9CSkVYVCkgJChhbV9fb2JqZWN0c184KQorYW1fZGJ1c19kYWVtb25fT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfOSkgZGJ1c19kYWVtb24tbWFpbi4kKE9CSkVYVCkKK2RidXNfZGFlbW9uX09CSkVDVFMgPSAkKGFtX2RidXNfZGFlbW9uX09CSkVDVFMpCitkYnVzX2RhZW1vbl9ERVBFTkRFTkNJRVMgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkgJChhbV9fREVQRU5ERU5DSUVTXzEpCitkYnVzX2RhZW1vbl9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChkYnVzX2RhZW1vbl9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9fZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9TT1VSQ0VTX0RJU1QgPSBhY3RpdmF0aW9uLWhlbHBlci1iaW4uYyBcCisJY29uZmlnLWxvYWRlci1leHBhdC5jIGNvbmZpZy1sb2FkZXItbGlieG1sLmMgXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMgY29uZmlnLXBhcnNlci1jb21tb24uaCBcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmMgY29uZmlnLXBhcnNlci10cml2aWFsLmggZGVza3RvcC1maWxlLmMgXAorCWRlc2t0b3AtZmlsZS5oIHV0aWxzLmMgdXRpbHMuaCBhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCBcCisJYWN0aXZhdGlvbi1oZWxwZXIuaCBhY3RpdmF0aW9uLWhlbHBlci5jCitAREJVU19VU0VfRVhQQVRfRkFMU0VAQERCVVNfVVNFX0xJQlhNTF9UUlVFQGFtX19vYmplY3RzXzEwID0gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC4kKE9CSkVYVCkKK0BEQlVTX1VTRV9FWFBBVF9UUlVFQGFtX19vYmplY3RzXzEwID0gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0LiQoT0JKRVhUKQorYW1fX29iamVjdHNfMTEgPSAkKGFtX19vYmplY3RzXzEwKSBcCisJZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi4kKE9CSkVYVCkgXAorCWRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLiQoT0JKRVhUKSBcCisJZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUuJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLiQoT0JKRVhUKSBcCisJZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci4kKE9CSkVYVCkKK2FtX2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfT0JKRUNUUyA9ICBcCisJZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4uJChPQkpFWFQpIFwKKwkkKGFtX19vYmplY3RzXzExKQorZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9PQkpFQ1RTID0gIFwKKwkkKGFtX2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfT0JKRUNUUykKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfREVQRU5ERU5DSUVTID0gIFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQorZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgXAorCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACithbV9fZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X1NPVVJDRVNfRElTVCA9ICBcCisJYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgY29uZmlnLWxvYWRlci1leHBhdC5jIFwKKwljb25maWctbG9hZGVyLWxpYnhtbC5jIGNvbmZpZy1wYXJzZXItY29tbW9uLmMgXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmggY29uZmlnLXBhcnNlci10cml2aWFsLmMgXAorCWNvbmZpZy1wYXJzZXItdHJpdmlhbC5oIGRlc2t0b3AtZmlsZS5jIGRlc2t0b3AtZmlsZS5oIHV0aWxzLmMgXAorCXV0aWxzLmggYWN0aXZhdGlvbi1leGl0LWNvZGVzLmggYWN0aXZhdGlvbi1oZWxwZXIuaCBcCisJYWN0aXZhdGlvbi1oZWxwZXIuYworQERCVVNfVVNFX0VYUEFUX0ZBTFNFQEBEQlVTX1VTRV9MSUJYTUxfVFJVRUBhbV9fb2JqZWN0c18xMiA9IGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC4kKE9CSkVYVCkKK0BEQlVTX1VTRV9FWFBBVF9UUlVFQGFtX19vYmplY3RzXzEyID0gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQuJChPQkpFWFQpCithbV9fb2JqZWN0c18xMyA9ICQoYW1fX29iamVjdHNfMTIpIFwKKwlkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24uJChPQkpFWFQpIFwKKwlkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci10cml2aWFsLiQoT0JKRVhUKSBcCisJZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWRlc2t0b3AtZmlsZS4kKE9CSkVYVCkgXAorCWRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC11dGlscy4kKE9CSkVYVCkgXAorCWRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci4kKE9CSkVYVCkKK2FtX2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9PQkpFQ1RTID0gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLWJpbi4kKE9CSkVYVCkgXAorCSQoYW1fX29iamVjdHNfMTMpCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfT0JKRUNUUyA9ICBcCisJJChhbV9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfT0JKRUNUUykKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9ERVBFTkRFTkNJRVMgPSAgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChhbV9fREVQRU5ERU5DSUVTXzEpCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyBcCisJJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpIFwKKwkkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCitTQ1JJUFRTID0gJChiaW5fU0NSSVBUUykgJChpbml0ZF9TQ1JJUFRTKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAorCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0FNX1ZfQ0MgPSAkKGFtX192X0NDXyQoVikpCithbV9fdl9DQ18gPSAkKGFtX192X0NDXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7CitBTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQorYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X2F0XzAgPSBACitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0FNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF8kKFYpKQorYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOworQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQorYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOworU09VUkNFUyA9ICQoYnVzX3Rlc3RfU09VUkNFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX1NPVVJDRVMpIFwKKwkkKGJ1c190ZXN0X3N5c3RlbV9TT1VSQ0VTKSAkKGRidXNfZGFlbW9uX1NPVVJDRVMpIFwKKwkkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfU09VUkNFUykgXAorCSQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGFtX19idXNfdGVzdF9TT1VSQ0VTX0RJU1QpIFwKKwkkKGFtX19idXNfdGVzdF9sYXVuY2hfaGVscGVyX1NPVVJDRVNfRElTVCkgXAorCSQoYW1fX2J1c190ZXN0X3N5c3RlbV9TT1VSQ0VTX0RJU1QpIFwKKwkkKGFtX19kYnVzX2RhZW1vbl9TT1VSQ0VTX0RJU1QpIFwKKwkkKGFtX19kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX1NPVVJDRVNfRElTVCkgXAorCSQoYW1fX2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9TT1VSQ0VTX0RJU1QpCitEQVRBID0gJChhZ2VudF9EQVRBKSAkKGNvbmZpZ19EQVRBKSAkKHN5c3RlbWRzeXN0ZW11bml0X0RBVEEpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCithbV9fdHR5X2NvbG9ycyA9IFwKK3JlZD07IGdybj07IGxnbj07IGJsdT07IHN0ZD0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JVSUxEX0ZJTEVWRVJTSU9OID0gQEJVSUxEX0ZJTEVWRVJTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RCVVNfQklORElSID0gQERCVVNfQklORElSQAorREJVU19CVVNfQ0ZMQUdTID0gQERCVVNfQlVTX0NGTEFHU0AKK0RCVVNfQlVTX0xJQlMgPSBAREJVU19CVVNfTElCU0AKK0RCVVNfQ0xJRU5UX0NGTEFHUyA9IEBEQlVTX0NMSUVOVF9DRkxBR1NACitEQlVTX0NMSUVOVF9MSUJTID0gQERCVVNfQ0xJRU5UX0xJQlNACitEQlVTX0NPTlNPTEVfQVVUSF9ESVIgPSBAREJVU19DT05TT0xFX0FVVEhfRElSQAorREJVU19DT05TT0xFX09XTkVSX0ZJTEUgPSBAREJVU19DT05TT0xFX09XTkVSX0ZJTEVACitEQlVTX0RBRU1PTkRJUiA9IEBEQlVTX0RBRU1PTkRJUkAKK0RCVVNfREFUQURJUiA9IEBEQlVTX0RBVEFESVJACitEQlVTX0hBVkVfSU5UNjQgPSBAREJVU19IQVZFX0lOVDY0QAorREJVU19JTlQxNl9UWVBFID0gQERCVVNfSU5UMTZfVFlQRUAKK0RCVVNfSU5UMzJfVFlQRSA9IEBEQlVTX0lOVDMyX1RZUEVACitEQlVTX0lOVDY0X0NPTlNUQU5UID0gQERCVVNfSU5UNjRfQ09OU1RBTlRACitEQlVTX0lOVDY0X1RZUEUgPSBAREJVU19JTlQ2NF9UWVBFQAorREJVU19MQVVOQ0hFUl9DRkxBR1MgPSBAREJVU19MQVVOQ0hFUl9DRkxBR1NACitEQlVTX0xBVU5DSEVSX0xJQlMgPSBAREJVU19MQVVOQ0hFUl9MSUJTQAorREJVU19MSUJFWEVDRElSID0gQERCVVNfTElCRVhFQ0RJUkAKK0RCVVNfTUFKT1JfVkVSU0lPTiA9IEBEQlVTX01BSk9SX1ZFUlNJT05ACitEQlVTX01JQ1JPX1ZFUlNJT04gPSBAREJVU19NSUNST19WRVJTSU9OQAorREJVU19NSU5PUl9WRVJTSU9OID0gQERCVVNfTUlOT1JfVkVSU0lPTkAKK0RCVVNfUEFUSF9PUl9BQlNUUkFDVCA9IEBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RACitEQlVTX1BSRUZJWCA9IEBEQlVTX1BSRUZJWEAKK0RCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTQAorREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgPSBAREJVU19TRVNTSU9OX1NPQ0tFVF9ESVJACitEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitEQlVTX1NZU1RFTV9QSURfRklMRSA9IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKK0RCVVNfU1lTVEVNX1NPQ0tFVCA9IEBEQlVTX1NZU1RFTV9TT0NLRVRACitEQlVTX1RFU1RfQ0ZMQUdTID0gQERCVVNfVEVTVF9DRkxBR1NACitEQlVTX1RFU1RfTElCUyA9IEBEQlVTX1RFU1RfTElCU0AKK0RCVVNfVUlOVDY0X0NPTlNUQU5UID0gQERCVVNfVUlOVDY0X0NPTlNUQU5UQAorREJVU19VU0VSID0gQERCVVNfVVNFUkAKK0RCVVNfVkVSU0lPTiA9IEBEQlVTX1ZFUlNJT05ACitEQlVTX1hfQ0ZMQUdTID0gQERCVVNfWF9DRkxBR1NACitEQlVTX1hfTElCUyA9IEBEQlVTX1hfTElCU0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitET1hZR0VOID0gQERPWFlHRU5ACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0VYUEFOREVEX0JJTkRJUiA9IEBFWFBBTkRFRF9CSU5ESVJACitFWFBBTkRFRF9EQVRBRElSID0gQEVYUEFOREVEX0RBVEFESVJACitFWFBBTkRFRF9MSUJESVIgPSBARVhQQU5ERURfTElCRElSQAorRVhQQU5ERURfTElCRVhFQ0RJUiA9IEBFWFBBTkRFRF9MSUJFWEVDRElSQAorRVhQQU5ERURfTE9DQUxTVEFURURJUiA9IEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQAorRVhQQU5ERURfUFJFRklYID0gQEVYUEFOREVEX1BSRUZJWEAKK0VYUEFOREVEX1NZU0NPTkZESVIgPSBARVhQQU5ERURfU1lTQ09ORkRJUkAKK0ZHUkVQID0gQEZHUkVQQAorR0VUVEVYVF9QQUNLQUdFID0gQEdFVFRFWFRfUEFDS0FHRUAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEFVTkNIQ1RMID0gQExBVU5DSENUTEAKK0xBVU5DSERfQUdFTlRfRElSID0gQExBVU5DSERfQUdFTlRfRElSQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJYTUxfQ0ZMQUdTID0gQExJQlhNTF9DRkxBR1NACitMSUJYTUxfTElCUyA9IEBMSUJYTUxfTElCU0AKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitMVF9BR0UgPSBATFRfQUdFQAorTFRfQ1VSUkVOVCA9IEBMVF9DVVJSRU5UQAorTFRfUkVWSVNJT04gPSBATFRfUkVWSVNJT05ACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOMkhUTUwgPSBATUFOMkhUTUxACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSQyA9IEBSQ0AKK1JfRFlOQU1JQ19MREZMQUcgPSBAUl9EWU5BTUlDX0xERkxBR0AKK1NFQ1RJT05fTERGTEFHUyA9IEBTRUNUSU9OX0xERkxBR1NACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVEVTVF9CVVNfQklOQVJZID0gQFRFU1RfQlVTX0JJTkFSWUAKK1RFU1RfRVhJVF9CSU5BUlkgPSBAVEVTVF9FWElUX0JJTkFSWUAKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUiA9IEBURVNUX0lOVkFMSURfU0VSVklDRV9ESVJACitURVNUX0lOVkFMSURfU0VSVklDRV9TWVNURU1fRElSID0gQFRFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVJACitURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZID0gQFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllACitURVNUX1BSSVZTRVJWRVJfQklOQVJZID0gQFRFU1RfUFJJVlNFUlZFUl9CSU5BUllACitURVNUX1NFR0ZBVUxUX0JJTkFSWSA9IEBURVNUX1NFR0ZBVUxUX0JJTkFSWUAKK1RFU1RfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0hFTExfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkgPSBAVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWUAKK1RFU1RfU09DS0VUX0RJUiA9IEBURVNUX1NPQ0tFVF9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfRElSID0gQFRFU1RfVkFMSURfU0VSVklDRV9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUiA9IEBURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJTkRSRVMgPSBAV0lORFJFU0AKK1hNS01GID0gQFhNS01GQAorWE1MVE8gPSBAWE1MVE9ACitYU0xUUFJPQyA9IEBYU0xUUFJPQ0AKK1hfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAorWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKK1hfTElCUyA9IEBYX0xJQlNACitYX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3N5c3RlbWRzeXN0ZW11bml0ZGlyID0gQHN5c3RlbWRzeXN0ZW11bml0ZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitjb25maWdkaXIgPSAkKHN5c2NvbmZkaXIpL2RidXMtMQorZGJ1c19kYWVtb25fZXhlY2RpciA9ICQoREJVU19EQUVNT05ESVIpCitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKSBcCisJJChEQlVTX0JVU19DRkxBR1MpIFwKKwktRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiIiQoY29uZmlnZGlyKS9zeXN0ZW0uY29uZiJcIiBcCisJLUREQlVTX0NPTVBJTEFUSU9OCisKK0VGRU5DRSA9IAorQ09ORklHX0lOX0ZJTEVTID0gXAorCXNlc3Npb24uY29uZi5pbgkJCQlcCisJc3lzdGVtLmNvbmYuaW4JCQkJXAorCW9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QuaW4KKworY29uZmlnX0RBVEEgPSBcCisJc2Vzc2lvbi5jb25mCQkJCVwKKwlzeXN0ZW0uY29uZgorCitAREJVU19FTkFCTEVfTEFVTkNIRF9UUlVFQGFnZW50ZGlyID0gJChMQVVOQ0hEX0FHRU5UX0RJUikKK0BEQlVTX0VOQUJMRV9MQVVOQ0hEX1RSVUVAYWdlbnRfREFUQSA9IG9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QKK0BEQlVTX1VTRV9FWFBBVF9UUlVFQFhNTF9TT1VSQ0VTID0gY29uZmlnLWxvYWRlci1leHBhdC5jCitAREJVU19VU0VfTElCWE1MX1RSVUVAWE1MX1NPVVJDRVMgPSBjb25maWctbG9hZGVyLWxpYnhtbC5jCitAREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVhfRkFMU0VAQERCVVNfQlVTX0VOQUJMRV9JTk9USUZZX0ZBTFNFQEBEQlVTX0JVU19FTkFCTEVfS1FVRVVFX0ZBTFNFQERJUl9XQVRDSF9TT1VSQ0UgPSBkaXItd2F0Y2gtZGVmYXVsdC5jCitAREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVhfVFJVRUBAREJVU19CVVNfRU5BQkxFX0lOT1RJRllfRkFMU0VAQERCVVNfQlVTX0VOQUJMRV9LUVVFVUVfRkFMU0VARElSX1dBVENIX1NPVVJDRSA9IGRpci13YXRjaC1kbm90aWZ5LmMKK0BEQlVTX0JVU19FTkFCTEVfSU5PVElGWV9UUlVFQEBEQlVTX0JVU19FTkFCTEVfS1FVRVVFX0ZBTFNFQERJUl9XQVRDSF9TT1VSQ0UgPSBkaXItd2F0Y2gtaW5vdGlmeS5jCitAREJVU19CVVNfRU5BQkxFX0tRVUVVRV9UUlVFQERJUl9XQVRDSF9TT1VSQ0UgPSBkaXItd2F0Y2gta3F1ZXVlLmMKK0JVU19TT1VSQ0VTID0gXAorCWFjdGl2YXRpb24uYwkJCQlcCisJYWN0aXZhdGlvbi5oCQkJCVwKKwlhY3RpdmF0aW9uLWV4aXQtY29kZXMuaAkJCVwKKwlidXMuYwkJCQkJXAorCWJ1cy5oCQkJCQlcCisJY29uZmlnLXBhcnNlci5jCQkJCVwKKwljb25maWctcGFyc2VyLmgJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25uZWN0aW9uLmMJCQkJXAorCWNvbm5lY3Rpb24uaAkJCQlcCisJZGVza3RvcC1maWxlLmMJCQkJXAorCWRlc2t0b3AtZmlsZS5oCQkJCVwKKwkkKERJUl9XQVRDSF9TT1VSQ0UpCQkJXAorCWRpci13YXRjaC5oCQkJCVwKKwlkaXNwYXRjaC5jCQkJCVwKKwlkaXNwYXRjaC5oCQkJCVwKKwlkcml2ZXIuYwkJCQlcCisJZHJpdmVyLmgJCQkJXAorCWV4cGlyZWxpc3QuYwkJCQlcCisJZXhwaXJlbGlzdC5oCQkJCVwKKwlwb2xpY3kuYwkJCQlcCisJcG9saWN5LmgJCQkJXAorCXNlbGludXguaAkJCQlcCisJc2VsaW51eC5jCQkJCVwKKwlzZXJ2aWNlcy5jCQkJCVwKKwlzZXJ2aWNlcy5oCQkJCVwKKwlzaWduYWxzLmMJCQkJXAorCXNpZ25hbHMuaAkJCQlcCisJdGVzdC5jCQkJCQlcCisJdGVzdC5oCQkJCQlcCisJdXRpbHMuYwkJCQkJXAorCXV0aWxzLmgJCQkJCVwKKwkkKFhNTF9TT1VSQ0VTKQorCitkYnVzX2RhZW1vbl9TT1VSQ0VTID0gXAorCSQoQlVTX1NPVVJDRVMpCQkJCVwKKwltYWluLmMKKworZGJ1c19kYWVtb25fQ1BQRkxBR1MgPSAtRERCVVNfU1RBVElDX0JVSUxECitkYnVzX2RhZW1vbl9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCVwKKwkkKEVGRU5DRSkJCQkJCVwKKwkkKERCVVNfQlVTX0xJQlMpCisKK2RidXNfZGFlbW9uX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AgQFNFQ1RJT05fTERGTEFHU0AKK0xBVU5DSF9IRUxQRVJfU09VUkNFUyA9IFwKKwkkKFhNTF9TT1VSQ0VTKQkJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uYwkJCVwKKwljb25maWctcGFyc2VyLWNvbW1vbi5oCQkJXAorCWNvbmZpZy1wYXJzZXItdHJpdmlhbC5jCQkJXAorCWNvbmZpZy1wYXJzZXItdHJpdmlhbC5oCQkJXAorCWRlc2t0b3AtZmlsZS5jCQkJCVwKKwlkZXNrdG9wLWZpbGUuaAkJCQlcCisJdXRpbHMuYwkJCQkJXAorCXV0aWxzLmgJCQkJCVwKKwlhY3RpdmF0aW9uLWV4aXQtY29kZXMuaAkJCVwKKwlhY3RpdmF0aW9uLWhlbHBlci5oCSAgCQlcCisJYWN0aXZhdGlvbi1oZWxwZXIuYworCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX1NPVVJDRVMgPSBcCisJYWN0aXZhdGlvbi1oZWxwZXItYmluLmMJCQlcCisJJChMQVVOQ0hfSEVMUEVSX1NPVVJDRVMpCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MgPSAtRERCVVNfU1RBVElDX0JVSUxECitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoREJVU19MQVVOQ0hFUl9MSUJTKQorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AgQFNFQ1RJT05fTERGTEFHU0AKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9TT1VSQ0VTID0gXAorCWFjdGl2YXRpb24taGVscGVyLWJpbi5jCQkJXAorCSQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTKQorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCisJJChEQlVTX0xBVU5DSEVSX0xJQlMpCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdAIEBTRUNUSU9OX0xERkxBR1NACitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MgPSAtRERCVVNfU1RBVElDX0JVSUxECVwKKwktREFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorCitidXNfdGVzdF9sYXVuY2hfaGVscGVyX1NPVVJDRVMgPSBcCisJdGVzdC1sYXVuY2gtaGVscGVyLmMgICAJCVwKKwkkKExBVU5DSF9IRUxQRVJfU09VUkNFUykKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKERCVVNfTEFVTkNIRVJfTElCUykKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdAIEBTRUNUSU9OX0xERkxBR1NACitidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTID0gLUREQlVTX1NUQVRJQ19CVUlMRAlcCisJLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QJXAorCS1EQUNUSVZBVElPTl9MQVVOQ0hFUl9ET19PT00KKworQERCVVNfQlVJTERfVEVTVFNfVFJVRUBURVNUU19FTlZJUk9OTUVOVCA9IERCVVNfVEVTVF9EQVRBPSQodG9wX2J1aWxkZGlyKS90ZXN0L2RhdGEgREJVU19URVNUX0hPTUVESVI9JCh0b3BfYnVpbGRkaXIpL2RidXMgREJVU19GQVRBTF9XQVJOSU5HUz0xIERCVVNfQkxPQ0tfT05fQUJPUlQ9MQorYnVzX3Rlc3Rfc3lzdGVtX1NPVVJDRVMgPSBcCisJJChYTUxfU09VUkNFUykJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuYwkJCVwKKwljb25maWctcGFyc2VyLXRyaXZpYWwuaAkJCVwKKwl1dGlscy5jCQkJCQlcCisJdXRpbHMuaAkJCQkJXAorCXRlc3Qtc3lzdGVtLmMKKworYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTID0gLUREQlVTX1NUQVRJQ19CVUlMRAorYnVzX3Rlc3Rfc3lzdGVtX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSAkKERCVVNfQlVTX0xJQlMpCitidXNfdGVzdF9zeXN0ZW1fTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorYnVzX3Rlc3RfU09VUkNFUyA9IFwKKwkkKEJVU19TT1VSQ0VTKQkJCQlcCisJdGVzdC1tYWluLmMKKworYnVzX3Rlc3RfQ1BQRkxBR1MgPSAtRERCVVNfU1RBVElDX0JVSUxECitidXNfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChEQlVTX0JVU19MSUJTKQorYnVzX3Rlc3RfTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorCisjIyMjIEluaXQgc2NyaXB0cyBmdW4KK1NDUklQVF9JTl9GSUxFUyA9IG1lc3NhZ2VidXMuaW4gbWVzc2FnZWJ1cy1jb25maWcuaW4gcmMubWVzc2FnZWJ1cy5pbiBcCisJJChhbV9fYXBwZW5kXzQpCitAREJVU19JTklUX1NDUklQVFNfUkVEX0hBVF9UUlVFQGluaXRkZGlyID0gJChzeXNjb25mZGlyKS9yYy5kL2luaXQuZAorQERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRV9UUlVFQGluaXRkZGlyID0gJChzeXNjb25mZGlyKS9yYy5kLworQERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVRfVFJVRUBpbml0ZF9TQ1JJUFRTID0gXAorQERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVRfVFJVRUAJbWVzc2FnZWJ1cworCitAREJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFX1RSVUVAaW5pdGRfU0NSSVBUUyA9IFwKK0BEQlVTX0lOSVRfU0NSSVBUU19TTEFDS1dBUkVfVFJVRUAJcmMubWVzc2FnZWJ1cworCitAREJVU19JTklUX1NDUklQVFNfQ1lHV0lOX1RSVUVAYmluX1NDUklQVFMgPSBcCitAREJVU19JTklUX1NDUklQVFNfQ1lHV0lOX1RSVUVACW1lc3NhZ2VidXMtY29uZmlnCisKK0BIQVZFX1NZU1RFTURfVFJVRUBzeXN0ZW1kc3lzdGVtdW5pdF9EQVRBID0gXAorQEhBVkVfU1lTVEVNRF9UUlVFQAlkYnVzLnNlcnZpY2UgXAorQEhBVkVfU1lTVEVNRF9UUlVFQAlkYnVzLnNvY2tldAorCisKKyMjIyMgRXh0cmEgZGlzdAorRVhUUkFfRElTVCA9ICQoQ09ORklHX0lOX0ZJTEVTKSAkKFNDUklQVF9JTl9GSUxFUykKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGJ1cy9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSBidXMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CitzeXN0ZW0uY29uZjogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL3N5c3RlbS5jb25mLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAKK3Nlc3Npb24uY29uZjogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL3Nlc3Npb24uY29uZi5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACittZXNzYWdlYnVzOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvbWVzc2FnZWJ1cy5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACittZXNzYWdlYnVzLWNvbmZpZzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL21lc3NhZ2VidXMtY29uZmlnLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAKK29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3Q6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAKK3JjLm1lc3NhZ2VidXM6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9yYy5tZXNzYWdlYnVzLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAKK2RidXMuc2VydmljZTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2RidXMuc2VydmljZS5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACitkYnVzLnNvY2tldDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2RidXMuc29ja2V0LmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAKK2luc3RhbGwtZGJ1c19kYWVtb25fZXhlY1BST0dSQU1TOiAkKGRidXNfZGFlbW9uX2V4ZWNfUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChkYnVzX2RhZW1vbl9leGVjZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoZGJ1c19kYWVtb25fZXhlY2RpcikiCisJQGxpc3Q9JyQoZGJ1c19kYWVtb25fZXhlY19QUk9HUkFNUyknOyB0ZXN0IC1uICIkKGRidXNfZGFlbW9uX2V4ZWNkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisJc2VkICdzLyQoRVhFRVhUKSQkLy8nIHwgXAorCXdoaWxlIHJlYWQgcCBwMTsgZG8gaWYgdGVzdCAtZiAkJHAgfHwgdGVzdCAtZiAkJHAxOyBcCisJICB0aGVuIGVjaG8gIiQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO247aCcgLWUgJ3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJyB8IFwKKwlzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxIH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsICQkMyAiLyIgJCQ0LCAkJDE7IH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICBpZiB0ZXN0ICIkJGRpciIgPSAuOyB0aGVuIGRpcj07IGVsc2UgZGlyPS8kJGRpcjsgZmk7IFwKKwkgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAnJChERVNURElSKSQoZGJ1c19kYWVtb25fZXhlY2RpcikkJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChkYnVzX2RhZW1vbl9leGVjZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAorCSAgICB9IFwKKwk7IGRvbmUKKwordW5pbnN0YWxsLWRidXNfZGFlbW9uX2V4ZWNQUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGRidXNfZGFlbW9uX2V4ZWNfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChkYnVzX2RhZW1vbl9leGVjZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAorCSAgc2VkIC1lICdoO3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSknIFwKKwkgICAgICAtZSAncy8kJC8kKEVYRUVYVCkvJyBgOyBcCisJdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoZGJ1c19kYWVtb25fZXhlY2RpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChkYnVzX2RhZW1vbl9leGVjZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitjbGVhbi1kYnVzX2RhZW1vbl9leGVjUFJPR1JBTVM6CisJQGxpc3Q9JyQoZGJ1c19kYWVtb25fZXhlY19QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCisJdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKKwlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QKK2luc3RhbGwtbGliZXhlY1BST0dSQU1TOiAkKGxpYmV4ZWNfUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChsaWJleGVjZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobGliZXhlY2RpcikiCisJQGxpc3Q9JyQobGliZXhlY19QUk9HUkFNUyknOyB0ZXN0IC1uICIkKGxpYmV4ZWNkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisJc2VkICdzLyQoRVhFRVhUKSQkLy8nIHwgXAorCXdoaWxlIHJlYWQgcCBwMTsgZG8gaWYgdGVzdCAtZiAkJHAgfHwgdGVzdCAtZiAkJHAxOyBcCisJICB0aGVuIGVjaG8gIiQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO247aCcgLWUgJ3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJyB8IFwKKwlzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxIH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsICQkMyAiLyIgJCQ0LCAkJDE7IH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICBpZiB0ZXN0ICIkJGRpciIgPSAuOyB0aGVuIGRpcj07IGVsc2UgZGlyPS8kJGRpcjsgZmk7IFwKKwkgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAnJChERVNURElSKSQobGliZXhlY2RpcikkJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChsaWJleGVjZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAorCSAgICB9IFwKKwk7IGRvbmUKKwordW5pbnN0YWxsLWxpYmV4ZWNQUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGxpYmV4ZWNfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChsaWJleGVjZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAorCSAgc2VkIC1lICdoO3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSknIFwKKwkgICAgICAtZSAncy8kJC8kKEVYRUVYVCkvJyBgOyBcCisJdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQobGliZXhlY2RpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChsaWJleGVjZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitjbGVhbi1saWJleGVjUFJPR1JBTVM6CisJQGxpc3Q9JyQobGliZXhlY19QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCisJdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKKwlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QKKworY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisJQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorYnVzLXRlc3QkKEVYRUVYVCk6ICQoYnVzX3Rlc3RfT0JKRUNUUykgJChidXNfdGVzdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBidXMtdGVzdCQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoYnVzX3Rlc3RfTElOSykgJChidXNfdGVzdF9PQkpFQ1RTKSAkKGJ1c190ZXN0X0xEQUREKSAkKExJQlMpCitidXMtdGVzdC1sYXVuY2gtaGVscGVyJChFWEVFWFQpOiAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfT0JKRUNUUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGJ1cy10ZXN0LWxhdW5jaC1oZWxwZXIkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfTElOSykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX09CSkVDVFMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9MREFERCkgJChMSUJTKQorYnVzLXRlc3Qtc3lzdGVtJChFWEVFWFQpOiAkKGJ1c190ZXN0X3N5c3RlbV9PQkpFQ1RTKSAkKGJ1c190ZXN0X3N5c3RlbV9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBidXMtdGVzdC1zeXN0ZW0kKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGJ1c190ZXN0X3N5c3RlbV9MSU5LKSAkKGJ1c190ZXN0X3N5c3RlbV9PQkpFQ1RTKSAkKGJ1c190ZXN0X3N5c3RlbV9MREFERCkgJChMSUJTKQorZGJ1cy1kYWVtb24kKEVYRUVYVCk6ICQoZGJ1c19kYWVtb25fT0JKRUNUUykgJChkYnVzX2RhZW1vbl9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBkYnVzLWRhZW1vbiQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoZGJ1c19kYWVtb25fTElOSykgJChkYnVzX2RhZW1vbl9PQkpFQ1RTKSAkKGRidXNfZGFlbW9uX0xEQUREKSAkKExJQlMpCitkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyJChFWEVFWFQpOiAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfT0JKRUNUUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfTElOSykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX09CSkVDVFMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9MREFERCkgJChMSUJTKQorZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0JChFWEVFWFQpOiAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9PQkpFQ1RTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9MSU5LKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9PQkpFQ1RTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9MREFERCkgJChMSUJTKQoraW5zdGFsbC1iaW5TQ1JJUFRTOiAkKGJpbl9TQ1JJUFRTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIKKwlAbGlzdD0nJChiaW5fU0NSSVBUUyknOyB0ZXN0IC1uICIkKGJpbmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuJyBcCisJICAgIC1lICdoO3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsOyQodHJhbnNmb3JtKScgfCBzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxOyB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIHsgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgICAgaWYgKCsrbltkXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIHsgXAorCQlwcmludCAiZiIsIGQsIGZpbGVzW2RdOyBuW2RdID0gMDsgZmlsZXNbZF0gPSAiIiB9IH0gXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCBkICIvIiAkJDQsICQkMSB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAorCSAgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgICAgIGVjaG8gIiAkKElOU1RBTExfU0NSSVBUKSAkJGZpbGVzICckKERFU1RESVIpJChiaW5kaXIpJCRkaXInIjsgXAorCSAgICAgICAkKElOU1RBTExfU0NSSVBUKSAkJGZpbGVzICIkKERFU1RESVIpJChiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgICB9IFwKKwk7IGRvbmUKKwordW5pbnN0YWxsLWJpblNDUklQVFM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChiaW5fU0NSSVBUUyknOyB0ZXN0IC1uICIkKGJpbmRpcikiIHx8IGV4aXQgMDsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICAgICAgIHNlZCAtZSAncywuKi8sLDskKHRyYW5zZm9ybSknYDsgXAorCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKGJpbmRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCitpbnN0YWxsLWluaXRkU0NSSVBUUzogJChpbml0ZF9TQ1JJUFRTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoaW5pdGRkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChpbml0ZGRpcikiCisJQGxpc3Q9JyQoaW5pdGRfU0NSSVBUUyknOyB0ZXN0IC1uICIkKGluaXRkZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO24nIFwKKwkgICAgLWUgJ2g7c3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7JCh0cmFuc2Zvcm0pJyB8IHNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDE7IH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgeyBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgICBpZiAoKytuW2RdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgeyBcCisJCXByaW50ICJmIiwgZCwgZmlsZXNbZF07IG5bZF0gPSAwOyBmaWxlc1tkXSA9ICIiIH0gfSBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsIGQgIi8iICQkNCwgJCQxIH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgICAgZWNobyAiICQoSU5TVEFMTF9TQ1JJUFQpICQkZmlsZXMgJyQoREVTVERJUikkKGluaXRkZGlyKSQkZGlyJyI7IFwKKwkgICAgICAgJChJTlNUQUxMX1NDUklQVCkgJCRmaWxlcyAiJChERVNURElSKSQoaW5pdGRkaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgICB9IFwKKwk7IGRvbmUKKwordW5pbnN0YWxsLWluaXRkU0NSSVBUUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGluaXRkX1NDUklQVFMpJzsgdGVzdCAtbiAiJChpbml0ZGRpcikiIHx8IGV4aXQgMDsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICAgICAgIHNlZCAtZSAncywuKi8sLDskKHRyYW5zZm9ybSknYDsgXAorCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKGluaXRkZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKGluaXRkZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtYWN0aXZhdGlvbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtYnVzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1wYXJzZXIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0LWNvbm5lY3Rpb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0LWRlc2t0b3AtZmlsZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWRlZmF1bHQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdC1kaXItd2F0Y2gtaW5vdGlmeS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWtxdWV1ZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtZGlzcGF0Y2guUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0LWRyaXZlci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtZXhwaXJlbGlzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtcG9saWN5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdC1zZWxpbnV4LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdC1zZXJ2aWNlcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3Qtc2lnbmFscy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3QtdGVzdC1tYWluLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdC10ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdC11dGlscy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItdGVzdC1sYXVuY2gtaGVscGVyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLXV0aWxzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItbGlieG1sLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLXRyaXZpYWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS10ZXN0LXN5c3RlbS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLXV0aWxzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1hY3RpdmF0aW9uLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1idXMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uLWNvbmZpZy1sb2FkZXItZXhwYXQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uLWNvbmZpZy1sb2FkZXItbGlieG1sLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLWNvbW1vbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb24tY29ubmVjdGlvbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb24tZGVza3RvcC1maWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtZGVmYXVsdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uLWRpci13YXRjaC1pbm90aWZ5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gta3F1ZXVlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXNwYXRjaC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb24tZHJpdmVyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1leHBpcmVsaXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1tYWluLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1wb2xpY3kuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uLXNlbGludXguUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uLXNlcnZpY2VzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi1zaWduYWxzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi10ZXN0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbi11dGlscy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXItYmluLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWRlc2t0b3AtZmlsZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LXV0aWxzLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK2J1c190ZXN0LWFjdGl2YXRpb24ubzogYWN0aXZhdGlvbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWFjdGl2YXRpb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtYWN0aXZhdGlvbi5UcG8gLWMgLW8gYnVzX3Rlc3QtYWN0aXZhdGlvbi5vIGB0ZXN0IC1mICdhY3RpdmF0aW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFjdGl2YXRpb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtYWN0aXZhdGlvbi5UcG8gJChERVBESVIpL2J1c190ZXN0LWFjdGl2YXRpb24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhY3RpdmF0aW9uLmMnIG9iamVjdD0nYnVzX3Rlc3QtYWN0aXZhdGlvbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1hY3RpdmF0aW9uLm8gYHRlc3QgLWYgJ2FjdGl2YXRpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgYWN0aXZhdGlvbi5jCisKK2J1c190ZXN0LWFjdGl2YXRpb24ub2JqOiBhY3RpdmF0aW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtYWN0aXZhdGlvbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LWFjdGl2YXRpb24uVHBvIC1jIC1vIGJ1c190ZXN0LWFjdGl2YXRpb24ub2JqIGBpZiB0ZXN0IC1mICdhY3RpdmF0aW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWN0aXZhdGlvbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hY3RpdmF0aW9uLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWFjdGl2YXRpb24uVHBvICQoREVQRElSKS9idXNfdGVzdC1hY3RpdmF0aW9uLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYWN0aXZhdGlvbi5jJyBvYmplY3Q9J2J1c190ZXN0LWFjdGl2YXRpb24ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1hY3RpdmF0aW9uLm9iaiBgaWYgdGVzdCAtZiAnYWN0aXZhdGlvbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2FjdGl2YXRpb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYWN0aXZhdGlvbi5jJzsgZmlgCisKK2J1c190ZXN0LWJ1cy5vOiBidXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1idXMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtYnVzLlRwbyAtYyAtbyBidXNfdGVzdC1idXMubyBgdGVzdCAtZiAnYnVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJ1cy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1idXMuVHBvICQoREVQRElSKS9idXNfdGVzdC1idXMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdidXMuYycgb2JqZWN0PSdidXNfdGVzdC1idXMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtYnVzLm8gYHRlc3QgLWYgJ2J1cy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BidXMuYworCitidXNfdGVzdC1idXMub2JqOiBidXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1idXMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdC1idXMuVHBvIC1jIC1vIGJ1c190ZXN0LWJ1cy5vYmogYGlmIHRlc3QgLWYgJ2J1cy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2J1cy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9idXMuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtYnVzLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtYnVzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYnVzLmMnIG9iamVjdD0nYnVzX3Rlc3QtYnVzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtYnVzLm9iaiBgaWYgdGVzdCAtZiAnYnVzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYnVzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2J1cy5jJzsgZmlgCisKK2J1c190ZXN0LWNvbmZpZy1wYXJzZXIubzogY29uZmlnLXBhcnNlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWNvbmZpZy1wYXJzZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLXBhcnNlci5UcG8gLWMgLW8gYnVzX3Rlc3QtY29uZmlnLXBhcnNlci5vIGB0ZXN0IC1mICdjb25maWctcGFyc2VyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1wYXJzZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLXBhcnNlci5UcG8gJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1wYXJzZXIuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLmMnIG9iamVjdD0nYnVzX3Rlc3QtY29uZmlnLXBhcnNlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1jb25maWctcGFyc2VyLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci5jCisKK2J1c190ZXN0LWNvbmZpZy1wYXJzZXIub2JqOiBjb25maWctcGFyc2VyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtY29uZmlnLXBhcnNlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1wYXJzZXIuVHBvIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1wYXJzZXIub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLXBhcnNlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1wYXJzZXIuVHBvICQoREVQRElSKS9idXNfdGVzdC1jb25maWctcGFyc2VyLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLXBhcnNlci5jJyBvYmplY3Q9J2J1c190ZXN0LWNvbmZpZy1wYXJzZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1jb25maWctcGFyc2VyLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLXBhcnNlci5jJzsgZmlgCisKK2J1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm86IGNvbmZpZy1wYXJzZXItY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24uVHBvIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1wYXJzZXItY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLWNvbW1vbi5jJyBvYmplY3Q9J2J1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1wYXJzZXItY29tbW9uLmMKKworYnVzX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24ub2JqOiBjb25maWctcGFyc2VyLWNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24uVHBvIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi5UcG8gJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLXBhcnNlci1jb21tb24uYycgb2JqZWN0PSdidXNfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZmlgCisKK2J1c190ZXN0LWNvbm5lY3Rpb24ubzogY29ubmVjdGlvbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWNvbm5lY3Rpb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtY29ubmVjdGlvbi5UcG8gLWMgLW8gYnVzX3Rlc3QtY29ubmVjdGlvbi5vIGB0ZXN0IC1mICdjb25uZWN0aW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbm5lY3Rpb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtY29ubmVjdGlvbi5UcG8gJChERVBESVIpL2J1c190ZXN0LWNvbm5lY3Rpb24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25uZWN0aW9uLmMnIG9iamVjdD0nYnVzX3Rlc3QtY29ubmVjdGlvbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1jb25uZWN0aW9uLm8gYHRlc3QgLWYgJ2Nvbm5lY3Rpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29ubmVjdGlvbi5jCisKK2J1c190ZXN0LWNvbm5lY3Rpb24ub2JqOiBjb25uZWN0aW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtY29ubmVjdGlvbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LWNvbm5lY3Rpb24uVHBvIC1jIC1vIGJ1c190ZXN0LWNvbm5lY3Rpb24ub2JqIGBpZiB0ZXN0IC1mICdjb25uZWN0aW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29ubmVjdGlvbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25uZWN0aW9uLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWNvbm5lY3Rpb24uVHBvICQoREVQRElSKS9idXNfdGVzdC1jb25uZWN0aW9uLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29ubmVjdGlvbi5jJyBvYmplY3Q9J2J1c190ZXN0LWNvbm5lY3Rpb24ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1jb25uZWN0aW9uLm9iaiBgaWYgdGVzdCAtZiAnY29ubmVjdGlvbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Nvbm5lY3Rpb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29ubmVjdGlvbi5jJzsgZmlgCisKK2J1c190ZXN0LWRlc2t0b3AtZmlsZS5vOiBkZXNrdG9wLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1kZXNrdG9wLWZpbGUubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGVza3RvcC1maWxlLlRwbyAtYyAtbyBidXNfdGVzdC1kZXNrdG9wLWZpbGUubyBgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRlc2t0b3AtZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1kZXNrdG9wLWZpbGUuVHBvICQoREVQRElSKS9idXNfdGVzdC1kZXNrdG9wLWZpbGUuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXNrdG9wLWZpbGUuYycgb2JqZWN0PSdidXNfdGVzdC1kZXNrdG9wLWZpbGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtZGVza3RvcC1maWxlLm8gYHRlc3QgLWYgJ2Rlc2t0b3AtZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkZXNrdG9wLWZpbGUuYworCitidXNfdGVzdC1kZXNrdG9wLWZpbGUub2JqOiBkZXNrdG9wLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1kZXNrdG9wLWZpbGUub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdC1kZXNrdG9wLWZpbGUuVHBvIC1jIC1vIGJ1c190ZXN0LWRlc2t0b3AtZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2Rlc2t0b3AtZmlsZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rlc2t0b3AtZmlsZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kZXNrdG9wLWZpbGUuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtZGVza3RvcC1maWxlLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtZGVza3RvcC1maWxlLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGVza3RvcC1maWxlLmMnIG9iamVjdD0nYnVzX3Rlc3QtZGVza3RvcC1maWxlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtZGVza3RvcC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVza3RvcC1maWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rlc2t0b3AtZmlsZS5jJzsgZmlgCisKK2J1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0Lm86IGRpci13YXRjaC1kZWZhdWx0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtZGlyLXdhdGNoLWRlZmF1bHQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWRlZmF1bHQuVHBvIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0Lm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1kZWZhdWx0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpci13YXRjaC1kZWZhdWx0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0LlRwbyAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWRlZmF1bHQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gtZGVmYXVsdC5jJyBvYmplY3Q9J2J1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0Lm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1kZWZhdWx0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpci13YXRjaC1kZWZhdWx0LmMKKworYnVzX3Rlc3QtZGlyLXdhdGNoLWRlZmF1bHQub2JqOiBkaXItd2F0Y2gtZGVmYXVsdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWRlZmF1bHQuVHBvIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0Lm9iaiBgaWYgdGVzdCAtZiAnZGlyLXdhdGNoLWRlZmF1bHQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXItd2F0Y2gtZGVmYXVsdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gtZGVmYXVsdC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1kaXItd2F0Y2gtZGVmYXVsdC5UcG8gJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlyLXdhdGNoLWRlZmF1bHQuYycgb2JqZWN0PSdidXNfdGVzdC1kaXItd2F0Y2gtZGVmYXVsdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kZWZhdWx0Lm9iaiBgaWYgdGVzdCAtZiAnZGlyLXdhdGNoLWRlZmF1bHQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXItd2F0Y2gtZGVmYXVsdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gtZGVmYXVsdC5jJzsgZmlgCisKK2J1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5Lm86IGRpci13YXRjaC1kbm90aWZ5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtZGlyLXdhdGNoLWRub3RpZnkubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWRub3RpZnkuVHBvIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5Lm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1kbm90aWZ5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpci13YXRjaC1kbm90aWZ5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5LlRwbyAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWRub3RpZnkuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gtZG5vdGlmeS5jJyBvYmplY3Q9J2J1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5Lm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1kbm90aWZ5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpci13YXRjaC1kbm90aWZ5LmMKKworYnVzX3Rlc3QtZGlyLXdhdGNoLWRub3RpZnkub2JqOiBkaXItd2F0Y2gtZG5vdGlmeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWRub3RpZnkuVHBvIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5Lm9iaiBgaWYgdGVzdCAtZiAnZGlyLXdhdGNoLWRub3RpZnkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXItd2F0Y2gtZG5vdGlmeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gtZG5vdGlmeS5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1kaXItd2F0Y2gtZG5vdGlmeS5UcG8gJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlyLXdhdGNoLWRub3RpZnkuYycgb2JqZWN0PSdidXNfdGVzdC1kaXItd2F0Y2gtZG5vdGlmeS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1kbm90aWZ5Lm9iaiBgaWYgdGVzdCAtZiAnZGlyLXdhdGNoLWRub3RpZnkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXItd2F0Y2gtZG5vdGlmeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gtZG5vdGlmeS5jJzsgZmlgCisKK2J1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5Lm86IGRpci13YXRjaC1pbm90aWZ5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtZGlyLXdhdGNoLWlub3RpZnkubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWlub3RpZnkuVHBvIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5Lm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1pbm90aWZ5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpci13YXRjaC1pbm90aWZ5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5LlRwbyAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWlub3RpZnkuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gtaW5vdGlmeS5jJyBvYmplY3Q9J2J1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5Lm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1pbm90aWZ5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpci13YXRjaC1pbm90aWZ5LmMKKworYnVzX3Rlc3QtZGlyLXdhdGNoLWlub3RpZnkub2JqOiBkaXItd2F0Y2gtaW5vdGlmeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWlub3RpZnkuVHBvIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5Lm9iaiBgaWYgdGVzdCAtZiAnZGlyLXdhdGNoLWlub3RpZnkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXItd2F0Y2gtaW5vdGlmeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gtaW5vdGlmeS5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1kaXItd2F0Y2gtaW5vdGlmeS5UcG8gJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlyLXdhdGNoLWlub3RpZnkuYycgb2JqZWN0PSdidXNfdGVzdC1kaXItd2F0Y2gtaW5vdGlmeS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1pbm90aWZ5Lm9iaiBgaWYgdGVzdCAtZiAnZGlyLXdhdGNoLWlub3RpZnkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXItd2F0Y2gtaW5vdGlmeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gtaW5vdGlmeS5jJzsgZmlgCisKK2J1c190ZXN0LWRpci13YXRjaC1rcXVldWUubzogZGlyLXdhdGNoLWtxdWV1ZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWRpci13YXRjaC1rcXVldWUubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWtxdWV1ZS5UcG8gLWMgLW8gYnVzX3Rlc3QtZGlyLXdhdGNoLWtxdWV1ZS5vIGB0ZXN0IC1mICdkaXItd2F0Y2gta3F1ZXVlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpci13YXRjaC1rcXVldWUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtZGlyLXdhdGNoLWtxdWV1ZS5UcG8gJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1rcXVldWUuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gta3F1ZXVlLmMnIG9iamVjdD0nYnVzX3Rlc3QtZGlyLXdhdGNoLWtxdWV1ZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1kaXItd2F0Y2gta3F1ZXVlLm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1rcXVldWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWtxdWV1ZS5jCisKK2J1c190ZXN0LWRpci13YXRjaC1rcXVldWUub2JqOiBkaXItd2F0Y2gta3F1ZXVlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtZGlyLXdhdGNoLWtxdWV1ZS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1rcXVldWUuVHBvIC1jIC1vIGJ1c190ZXN0LWRpci13YXRjaC1rcXVldWUub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gta3F1ZXVlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlyLXdhdGNoLWtxdWV1ZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gta3F1ZXVlLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWRpci13YXRjaC1rcXVldWUuVHBvICQoREVQRElSKS9idXNfdGVzdC1kaXItd2F0Y2gta3F1ZXVlLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlyLXdhdGNoLWtxdWV1ZS5jJyBvYmplY3Q9J2J1c190ZXN0LWRpci13YXRjaC1rcXVldWUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1kaXItd2F0Y2gta3F1ZXVlLm9iaiBgaWYgdGVzdCAtZiAnZGlyLXdhdGNoLWtxdWV1ZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpci13YXRjaC1rcXVldWUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlyLXdhdGNoLWtxdWV1ZS5jJzsgZmlgCisKK2J1c190ZXN0LWRpc3BhdGNoLm86IGRpc3BhdGNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtZGlzcGF0Y2gubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlzcGF0Y2guVHBvIC1jIC1vIGJ1c190ZXN0LWRpc3BhdGNoLm8gYHRlc3QgLWYgJ2Rpc3BhdGNoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc3BhdGNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWRpc3BhdGNoLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtZGlzcGF0Y2guUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNwYXRjaC5jJyBvYmplY3Q9J2J1c190ZXN0LWRpc3BhdGNoLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpc3BhdGNoLm8gYHRlc3QgLWYgJ2Rpc3BhdGNoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc3BhdGNoLmMKKworYnVzX3Rlc3QtZGlzcGF0Y2gub2JqOiBkaXNwYXRjaC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWRpc3BhdGNoLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZGlzcGF0Y2guVHBvIC1jIC1vIGJ1c190ZXN0LWRpc3BhdGNoLm9iaiBgaWYgdGVzdCAtZiAnZGlzcGF0Y2guYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNwYXRjaC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNwYXRjaC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1kaXNwYXRjaC5UcG8gJChERVBESVIpL2J1c190ZXN0LWRpc3BhdGNoLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlzcGF0Y2guYycgb2JqZWN0PSdidXNfdGVzdC1kaXNwYXRjaC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWRpc3BhdGNoLm9iaiBgaWYgdGVzdCAtZiAnZGlzcGF0Y2guYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNwYXRjaC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNwYXRjaC5jJzsgZmlgCisKK2J1c190ZXN0LWRyaXZlci5vOiBkcml2ZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1kcml2ZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZHJpdmVyLlRwbyAtYyAtbyBidXNfdGVzdC1kcml2ZXIubyBgdGVzdCAtZiAnZHJpdmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRyaXZlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1kcml2ZXIuVHBvICQoREVQRElSKS9idXNfdGVzdC1kcml2ZXIuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkcml2ZXIuYycgb2JqZWN0PSdidXNfdGVzdC1kcml2ZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtZHJpdmVyLm8gYHRlc3QgLWYgJ2RyaXZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bkcml2ZXIuYworCitidXNfdGVzdC1kcml2ZXIub2JqOiBkcml2ZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1kcml2ZXIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdC1kcml2ZXIuVHBvIC1jIC1vIGJ1c190ZXN0LWRyaXZlci5vYmogYGlmIHRlc3QgLWYgJ2RyaXZlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2RyaXZlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kcml2ZXIuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtZHJpdmVyLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtZHJpdmVyLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZHJpdmVyLmMnIG9iamVjdD0nYnVzX3Rlc3QtZHJpdmVyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtZHJpdmVyLm9iaiBgaWYgdGVzdCAtZiAnZHJpdmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZHJpdmVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2RyaXZlci5jJzsgZmlgCisKK2J1c190ZXN0LWV4cGlyZWxpc3QubzogZXhwaXJlbGlzdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWV4cGlyZWxpc3QubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtZXhwaXJlbGlzdC5UcG8gLWMgLW8gYnVzX3Rlc3QtZXhwaXJlbGlzdC5vIGB0ZXN0IC1mICdleHBpcmVsaXN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGV4cGlyZWxpc3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtZXhwaXJlbGlzdC5UcG8gJChERVBESVIpL2J1c190ZXN0LWV4cGlyZWxpc3QuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdleHBpcmVsaXN0LmMnIG9iamVjdD0nYnVzX3Rlc3QtZXhwaXJlbGlzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1leHBpcmVsaXN0Lm8gYHRlc3QgLWYgJ2V4cGlyZWxpc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXhwaXJlbGlzdC5jCisKK2J1c190ZXN0LWV4cGlyZWxpc3Qub2JqOiBleHBpcmVsaXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtZXhwaXJlbGlzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LWV4cGlyZWxpc3QuVHBvIC1jIC1vIGJ1c190ZXN0LWV4cGlyZWxpc3Qub2JqIGBpZiB0ZXN0IC1mICdleHBpcmVsaXN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZXhwaXJlbGlzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9leHBpcmVsaXN0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWV4cGlyZWxpc3QuVHBvICQoREVQRElSKS9idXNfdGVzdC1leHBpcmVsaXN0LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXhwaXJlbGlzdC5jJyBvYmplY3Q9J2J1c190ZXN0LWV4cGlyZWxpc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1leHBpcmVsaXN0Lm9iaiBgaWYgdGVzdCAtZiAnZXhwaXJlbGlzdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2V4cGlyZWxpc3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZXhwaXJlbGlzdC5jJzsgZmlgCisKK2J1c190ZXN0LXBvbGljeS5vOiBwb2xpY3kuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1wb2xpY3kubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtcG9saWN5LlRwbyAtYyAtbyBidXNfdGVzdC1wb2xpY3kubyBgdGVzdCAtZiAncG9saWN5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBvbGljeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1wb2xpY3kuVHBvICQoREVQRElSKS9idXNfdGVzdC1wb2xpY3kuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwb2xpY3kuYycgb2JqZWN0PSdidXNfdGVzdC1wb2xpY3kubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtcG9saWN5Lm8gYHRlc3QgLWYgJ3BvbGljeS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwb2xpY3kuYworCitidXNfdGVzdC1wb2xpY3kub2JqOiBwb2xpY3kuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC1wb2xpY3kub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdC1wb2xpY3kuVHBvIC1jIC1vIGJ1c190ZXN0LXBvbGljeS5vYmogYGlmIHRlc3QgLWYgJ3BvbGljeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BvbGljeS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wb2xpY3kuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtcG9saWN5LlRwbyAkKERFUERJUikvYnVzX3Rlc3QtcG9saWN5LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG9saWN5LmMnIG9iamVjdD0nYnVzX3Rlc3QtcG9saWN5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtcG9saWN5Lm9iaiBgaWYgdGVzdCAtZiAncG9saWN5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncG9saWN5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BvbGljeS5jJzsgZmlgCisKK2J1c190ZXN0LXNlbGludXgubzogc2VsaW51eC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LXNlbGludXgubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3Qtc2VsaW51eC5UcG8gLWMgLW8gYnVzX3Rlc3Qtc2VsaW51eC5vIGB0ZXN0IC1mICdzZWxpbnV4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNlbGludXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Qtc2VsaW51eC5UcG8gJChERVBESVIpL2J1c190ZXN0LXNlbGludXguUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZWxpbnV4LmMnIG9iamVjdD0nYnVzX3Rlc3Qtc2VsaW51eC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1zZWxpbnV4Lm8gYHRlc3QgLWYgJ3NlbGludXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VsaW51eC5jCisKK2J1c190ZXN0LXNlbGludXgub2JqOiBzZWxpbnV4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3Qtc2VsaW51eC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LXNlbGludXguVHBvIC1jIC1vIGJ1c190ZXN0LXNlbGludXgub2JqIGBpZiB0ZXN0IC1mICdzZWxpbnV4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2VsaW51eC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zZWxpbnV4LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LXNlbGludXguVHBvICQoREVQRElSKS9idXNfdGVzdC1zZWxpbnV4LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2VsaW51eC5jJyBvYmplY3Q9J2J1c190ZXN0LXNlbGludXgub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1zZWxpbnV4Lm9iaiBgaWYgdGVzdCAtZiAnc2VsaW51eC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NlbGludXguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2VsaW51eC5jJzsgZmlgCisKK2J1c190ZXN0LXNlcnZpY2VzLm86IHNlcnZpY2VzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3Qtc2VydmljZXMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3Qtc2VydmljZXMuVHBvIC1jIC1vIGJ1c190ZXN0LXNlcnZpY2VzLm8gYHRlc3QgLWYgJ3NlcnZpY2VzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNlcnZpY2VzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LXNlcnZpY2VzLlRwbyAkKERFUERJUikvYnVzX3Rlc3Qtc2VydmljZXMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZXJ2aWNlcy5jJyBvYmplY3Q9J2J1c190ZXN0LXNlcnZpY2VzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LXNlcnZpY2VzLm8gYHRlc3QgLWYgJ3NlcnZpY2VzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNlcnZpY2VzLmMKKworYnVzX3Rlc3Qtc2VydmljZXMub2JqOiBzZXJ2aWNlcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LXNlcnZpY2VzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3Qtc2VydmljZXMuVHBvIC1jIC1vIGJ1c190ZXN0LXNlcnZpY2VzLm9iaiBgaWYgdGVzdCAtZiAnc2VydmljZXMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzZXJ2aWNlcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zZXJ2aWNlcy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1zZXJ2aWNlcy5UcG8gJChERVBESVIpL2J1c190ZXN0LXNlcnZpY2VzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2VydmljZXMuYycgb2JqZWN0PSdidXNfdGVzdC1zZXJ2aWNlcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LXNlcnZpY2VzLm9iaiBgaWYgdGVzdCAtZiAnc2VydmljZXMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzZXJ2aWNlcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zZXJ2aWNlcy5jJzsgZmlgCisKK2J1c190ZXN0LXNpZ25hbHMubzogc2lnbmFscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LXNpZ25hbHMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3Qtc2lnbmFscy5UcG8gLWMgLW8gYnVzX3Rlc3Qtc2lnbmFscy5vIGB0ZXN0IC1mICdzaWduYWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNpZ25hbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Qtc2lnbmFscy5UcG8gJChERVBESVIpL2J1c190ZXN0LXNpZ25hbHMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzaWduYWxzLmMnIG9iamVjdD0nYnVzX3Rlc3Qtc2lnbmFscy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1zaWduYWxzLm8gYHRlc3QgLWYgJ3NpZ25hbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2lnbmFscy5jCisKK2J1c190ZXN0LXNpZ25hbHMub2JqOiBzaWduYWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3Qtc2lnbmFscy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LXNpZ25hbHMuVHBvIC1jIC1vIGJ1c190ZXN0LXNpZ25hbHMub2JqIGBpZiB0ZXN0IC1mICdzaWduYWxzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2lnbmFscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zaWduYWxzLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LXNpZ25hbHMuVHBvICQoREVQRElSKS9idXNfdGVzdC1zaWduYWxzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2lnbmFscy5jJyBvYmplY3Q9J2J1c190ZXN0LXNpZ25hbHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1zaWduYWxzLm9iaiBgaWYgdGVzdCAtZiAnc2lnbmFscy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NpZ25hbHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2lnbmFscy5jJzsgZmlgCisKK2J1c190ZXN0LXRlc3QubzogdGVzdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LXRlc3QubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtdGVzdC5UcG8gLWMgLW8gYnVzX3Rlc3QtdGVzdC5vIGB0ZXN0IC1mICd0ZXN0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtdGVzdC5UcG8gJChERVBESVIpL2J1c190ZXN0LXRlc3QuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0LmMnIG9iamVjdD0nYnVzX3Rlc3QtdGVzdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC10ZXN0Lm8gYHRlc3QgLWYgJ3Rlc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGVzdC5jCisKK2J1c190ZXN0LXRlc3Qub2JqOiB0ZXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtdGVzdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LXRlc3QuVHBvIC1jIC1vIGJ1c190ZXN0LXRlc3Qub2JqIGBpZiB0ZXN0IC1mICd0ZXN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LXRlc3QuVHBvICQoREVQRElSKS9idXNfdGVzdC10ZXN0LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVzdC5jJyBvYmplY3Q9J2J1c190ZXN0LXRlc3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC10ZXN0Lm9iaiBgaWYgdGVzdCAtZiAndGVzdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGVzdC5jJzsgZmlgCisKK2J1c190ZXN0LXV0aWxzLm86IHV0aWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtdXRpbHMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtdXRpbHMuVHBvIC1jIC1vIGJ1c190ZXN0LXV0aWxzLm8gYHRlc3QgLWYgJ3V0aWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LXV0aWxzLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtdXRpbHMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd1dGlscy5jJyBvYmplY3Q9J2J1c190ZXN0LXV0aWxzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LXV0aWxzLm8gYHRlc3QgLWYgJ3V0aWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWxzLmMKKworYnVzX3Rlc3QtdXRpbHMub2JqOiB1dGlscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LXV0aWxzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtdXRpbHMuVHBvIC1jIC1vIGJ1c190ZXN0LXV0aWxzLm9iaiBgaWYgdGVzdCAtZiAndXRpbHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1dGlscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlscy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC11dGlscy5UcG8gJChERVBESVIpL2J1c190ZXN0LXV0aWxzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndXRpbHMuYycgb2JqZWN0PSdidXNfdGVzdC11dGlscy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LXV0aWxzLm9iaiBgaWYgdGVzdCAtZiAndXRpbHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1dGlscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlscy5jJzsgZmlgCisKK2J1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQubzogY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5UcG8gLWMgLW8gYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5vIGB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItZXhwYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5UcG8gJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWV4cGF0LmMnIG9iamVjdD0nYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0Lm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1leHBhdC5jCisKK2J1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQub2JqOiBjb25maWctbG9hZGVyLWV4cGF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQuVHBvIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWV4cGF0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQuVHBvICQoREVQRElSKS9idXNfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLWxvYWRlci1leHBhdC5jJyBvYmplY3Q9J2J1c190ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0Lm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZmlgCisKK2J1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm86IGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWxpYnhtbC5jJyBvYmplY3Q9J2J1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItbGlieG1sLmMKKworYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwub2JqOiBjb25maWctbG9hZGVyLWxpYnhtbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gJChERVBESVIpL2J1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLWxvYWRlci1saWJ4bWwuYycgb2JqZWN0PSdidXNfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZmlgCisKK2J1c190ZXN0LXRlc3QtbWFpbi5vOiB0ZXN0LW1haW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC10ZXN0LW1haW4ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3QtdGVzdC1tYWluLlRwbyAtYyAtbyBidXNfdGVzdC10ZXN0LW1haW4ubyBgdGVzdCAtZiAndGVzdC1tYWluLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3QtbWFpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdC10ZXN0LW1haW4uVHBvICQoREVQRElSKS9idXNfdGVzdC10ZXN0LW1haW4uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0LW1haW4uYycgb2JqZWN0PSdidXNfdGVzdC10ZXN0LW1haW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtdGVzdC1tYWluLm8gYHRlc3QgLWYgJ3Rlc3QtbWFpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LW1haW4uYworCitidXNfdGVzdC10ZXN0LW1haW4ub2JqOiB0ZXN0LW1haW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdC10ZXN0LW1haW4ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdC10ZXN0LW1haW4uVHBvIC1jIC1vIGJ1c190ZXN0LXRlc3QtbWFpbi5vYmogYGlmIHRlc3QgLWYgJ3Rlc3QtbWFpbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3QtbWFpbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LW1haW4uYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3QtdGVzdC1tYWluLlRwbyAkKERFUERJUikvYnVzX3Rlc3QtdGVzdC1tYWluLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVzdC1tYWluLmMnIG9iamVjdD0nYnVzX3Rlc3QtdGVzdC1tYWluLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3QtdGVzdC1tYWluLm9iaiBgaWYgdGVzdCAtZiAndGVzdC1tYWluLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdC1tYWluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlc3QtbWFpbi5jJzsgZmlgCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXItdGVzdC1sYXVuY2gtaGVscGVyLm86IHRlc3QtbGF1bmNoLWhlbHBlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci10ZXN0LWxhdW5jaC1oZWxwZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci10ZXN0LWxhdW5jaC1oZWxwZXIuVHBvIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItdGVzdC1sYXVuY2gtaGVscGVyLm8gYHRlc3QgLWYgJ3Rlc3QtbGF1bmNoLWhlbHBlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LWxhdW5jaC1oZWxwZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci10ZXN0LWxhdW5jaC1oZWxwZXIuVHBvICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLXRlc3QtbGF1bmNoLWhlbHBlci5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlc3QtbGF1bmNoLWhlbHBlci5jJyBvYmplY3Q9J2J1c190ZXN0X2xhdW5jaF9oZWxwZXItdGVzdC1sYXVuY2gtaGVscGVyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci10ZXN0LWxhdW5jaC1oZWxwZXIubyBgdGVzdCAtZiAndGVzdC1sYXVuY2gtaGVscGVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3QtbGF1bmNoLWhlbHBlci5jCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXItdGVzdC1sYXVuY2gtaGVscGVyLm9iajogdGVzdC1sYXVuY2gtaGVscGVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9sYXVuY2hfaGVscGVyLXRlc3QtbGF1bmNoLWhlbHBlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItdGVzdC1sYXVuY2gtaGVscGVyLlRwbyAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLXRlc3QtbGF1bmNoLWhlbHBlci5vYmogYGlmIHRlc3QgLWYgJ3Rlc3QtbGF1bmNoLWhlbHBlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3QtbGF1bmNoLWhlbHBlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LWxhdW5jaC1oZWxwZXIuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci10ZXN0LWxhdW5jaC1oZWxwZXIuVHBvICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLXRlc3QtbGF1bmNoLWhlbHBlci5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlc3QtbGF1bmNoLWhlbHBlci5jJyBvYmplY3Q9J2J1c190ZXN0X2xhdW5jaF9oZWxwZXItdGVzdC1sYXVuY2gtaGVscGVyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLXRlc3QtbGF1bmNoLWhlbHBlci5vYmogYGlmIHRlc3QgLWYgJ3Rlc3QtbGF1bmNoLWhlbHBlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3QtbGF1bmNoLWhlbHBlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LWxhdW5jaC1oZWxwZXIuYyc7IGZpYAorCitidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQubzogY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5UcG8gLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQuVHBvICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWV4cGF0LmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1leHBhdC5jCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5vYmo6IGNvbmZpZy1sb2FkZXItZXhwYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5UcG8gLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQuVHBvICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWV4cGF0LmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWV4cGF0LmMnOyBmaWAKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5vOiBjb25maWctbG9hZGVyLWxpYnhtbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLlRwbyAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLWxvYWRlci1saWJ4bWwuYycgb2JqZWN0PSdidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5vIGB0ZXN0IC1mICdjb25maWctbG9hZGVyLWxpYnhtbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctbG9hZGVyLWxpYnhtbC5jCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwub2JqOiBjb25maWctbG9hZGVyLWxpYnhtbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLWxvYWRlci1saWJ4bWwuYycgb2JqZWN0PSdidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZmlgCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24ubzogY29uZmlnLXBhcnNlci1jb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5UcG8gLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vIGB0ZXN0IC1mICdjb25maWctcGFyc2VyLWNvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLWNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24ubyBgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci1jb21tb24uYworCitidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLm9iajogY29uZmlnLXBhcnNlci1jb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLXBhcnNlci1jb21tb24uYyc7IGZpYAorCitidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vOiBjb25maWctcGFyc2VyLXRyaXZpYWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLlRwbyAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vIGB0ZXN0IC1mICdjb25maWctcGFyc2VyLXRyaXZpYWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci10cml2aWFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLlRwbyAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLXRyaXZpYWwuYycgb2JqZWN0PSdidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLXRyaXZpYWwuYworCitidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmo6IGNvbmZpZy1wYXJzZXItdHJpdmlhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5UcG8gLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLXBhcnNlci10cml2aWFsLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLlRwbyAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLXRyaXZpYWwuYycgb2JqZWN0PSdidXNfdGVzdF9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLXBhcnNlci10cml2aWFsLmMnOyBmaWAKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUubzogZGVza3RvcC1maWxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5UcG8gLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUubyBgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRlc2t0b3AtZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5UcG8gJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGVza3RvcC1maWxlLmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5vIGB0ZXN0IC1mICdkZXNrdG9wLWZpbGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGVza3RvcC1maWxlLmMKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUub2JqOiBkZXNrdG9wLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUuVHBvIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVza3RvcC1maWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rlc2t0b3AtZmlsZS5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5UcG8gJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGVza3RvcC1maWxlLmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVza3RvcC1maWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rlc2t0b3AtZmlsZS5jJzsgZmlgCisKK2J1c190ZXN0X2xhdW5jaF9oZWxwZXItdXRpbHMubzogdXRpbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItdXRpbHMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci11dGlscy5UcG8gLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci11dGlscy5vIGB0ZXN0IC1mICd1dGlscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1dGlscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLXV0aWxzLlRwbyAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci11dGlscy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3V0aWxzLmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci11dGlscy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItdXRpbHMubyBgdGVzdCAtZiAndXRpbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdXRpbHMuYworCitidXNfdGVzdF9sYXVuY2hfaGVscGVyLXV0aWxzLm9iajogdXRpbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItdXRpbHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLXV0aWxzLlRwbyAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLXV0aWxzLm9iaiBgaWYgdGVzdCAtZiAndXRpbHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1dGlscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlscy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9sYXVuY2hfaGVscGVyLXV0aWxzLlRwbyAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci11dGlscy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3V0aWxzLmMnIG9iamVjdD0nYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci11dGlscy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci11dGlscy5vYmogYGlmIHRlc3QgLWYgJ3V0aWxzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXRpbHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdXRpbHMuYyc7IGZpYAorCitidXNfdGVzdF9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLm86IGFjdGl2YXRpb24taGVscGVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIuVHBvIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIubyBgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYWN0aXZhdGlvbi1oZWxwZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5UcG8gJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhY3RpdmF0aW9uLWhlbHBlci5jJyBvYmplY3Q9J2J1c190ZXN0X2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3RfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLm8gYHRlc3QgLWYgJ2FjdGl2YXRpb24taGVscGVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFjdGl2YXRpb24taGVscGVyLmMKKworYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5vYmo6IGFjdGl2YXRpb24taGVscGVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5UcG8gLWMgLW8gYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5vYmogYGlmIHRlc3QgLWYgJ2FjdGl2YXRpb24taGVscGVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWN0aXZhdGlvbi1oZWxwZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYWN0aXZhdGlvbi1oZWxwZXIuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3RfbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5UcG8gJChERVBESVIpL2J1c190ZXN0X2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhY3RpdmF0aW9uLWhlbHBlci5jJyBvYmplY3Q9J2J1c190ZXN0X2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIub2JqIGBpZiB0ZXN0IC1mICdhY3RpdmF0aW9uLWhlbHBlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2FjdGl2YXRpb24taGVscGVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FjdGl2YXRpb24taGVscGVyLmMnOyBmaWAKKworYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItZXhwYXQubzogY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5UcG8gLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItZXhwYXQubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1leHBhdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctbG9hZGVyLWV4cGF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWV4cGF0LlRwbyAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItZXhwYXQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWV4cGF0LmMnIG9iamVjdD0nYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItZXhwYXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWV4cGF0Lm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1leHBhdC5jCisKK2J1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWV4cGF0Lm9iajogY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWV4cGF0LlRwbyAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItZXhwYXQuVHBvICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1sb2FkZXItZXhwYXQuYycgb2JqZWN0PSdidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1leHBhdC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IGZpYAorCitidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1saWJ4bWwubzogY29uZmlnLWxvYWRlci1saWJ4bWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItbGlieG1sLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItbGlieG1sLm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWxpYnhtbC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIG9iamVjdD0nYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItbGlieG1sLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1saWJ4bWwubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1saWJ4bWwuYworCitidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1saWJ4bWwub2JqOiBjb25maWctbG9hZGVyLWxpYnhtbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1saWJ4bWwub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvIC1jIC1vIGJ1c190ZXN0X3N5c3RlbS1jb25maWctbG9hZGVyLWxpYnhtbC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItbGlieG1sLlRwbyAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItbGlieG1sLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLWxvYWRlci1saWJ4bWwuYycgb2JqZWN0PSdidXNfdGVzdF9zeXN0ZW0tY29uZmlnLWxvYWRlci1saWJ4bWwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9zeXN0ZW1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWxpYnhtbC5jJzsgZmlgCisKK2J1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLWNvbW1vbi5vOiBjb25maWctcGFyc2VyLWNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci1jb21tb24ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci1jb21tb24ubyBgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci1jb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItY29tbW9uLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLXBhcnNlci1jb21tb24uYycgb2JqZWN0PSdidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci1jb21tb24ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLWNvbW1vbi5vIGB0ZXN0IC1mICdjb25maWctcGFyc2VyLWNvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLWNvbW1vbi5jCisKK2J1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLWNvbW1vbi5vYmo6IGNvbmZpZy1wYXJzZXItY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9zeXN0ZW1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLWNvbW1vbi5UcG8gLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci1jb21tb24uVHBvICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci1jb21tb24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLWNvbW1vbi5jJyBvYmplY3Q9J2J1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBmaWAKKworYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vOiBjb25maWctcGFyc2VyLXRyaXZpYWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLlRwbyAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLXRyaXZpYWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5UcG8gJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLXRyaXZpYWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLXRyaXZpYWwuYycgb2JqZWN0PSdidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLXRyaXZpYWwuYworCitidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLm9iajogY29uZmlnLXBhcnNlci10cml2aWFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9zeXN0ZW1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLXRyaXZpYWwub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLlRwbyAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci10cml2aWFsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLXBhcnNlci10cml2aWFsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tY29uZmlnLXBhcnNlci10cml2aWFsLlRwbyAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJyBvYmplY3Q9J2J1c190ZXN0X3N5c3RlbS1jb25maWctcGFyc2VyLXRyaXZpYWwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9zeXN0ZW1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IGZpYAorCitidXNfdGVzdF9zeXN0ZW0tdXRpbHMubzogdXRpbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgYnVzX3Rlc3Rfc3lzdGVtLXV0aWxzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS11dGlscy5UcG8gLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLXV0aWxzLm8gYHRlc3QgLWYgJ3V0aWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS11dGlscy5UcG8gJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS11dGlscy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3V0aWxzLmMnIG9iamVjdD0nYnVzX3Rlc3Rfc3lzdGVtLXV0aWxzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tdXRpbHMubyBgdGVzdCAtZiAndXRpbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdXRpbHMuYworCitidXNfdGVzdF9zeXN0ZW0tdXRpbHMub2JqOiB1dGlscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9zeXN0ZW0tdXRpbHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tdXRpbHMuVHBvIC1jIC1vIGJ1c190ZXN0X3N5c3RlbS11dGlscy5vYmogYGlmIHRlc3QgLWYgJ3V0aWxzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXRpbHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdXRpbHMuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLXV0aWxzLlRwbyAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLXV0aWxzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndXRpbHMuYycgb2JqZWN0PSdidXNfdGVzdF9zeXN0ZW0tdXRpbHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9zeXN0ZW1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLXV0aWxzLm9iaiBgaWYgdGVzdCAtZiAndXRpbHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1dGlscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlscy5jJzsgZmlgCisKK2J1c190ZXN0X3N5c3RlbS10ZXN0LXN5c3RlbS5vOiB0ZXN0LXN5c3RlbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBidXNfdGVzdF9zeXN0ZW0tdGVzdC1zeXN0ZW0ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLXRlc3Qtc3lzdGVtLlRwbyAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tdGVzdC1zeXN0ZW0ubyBgdGVzdCAtZiAndGVzdC1zeXN0ZW0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGVzdC1zeXN0ZW0uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLXRlc3Qtc3lzdGVtLlRwbyAkKERFUERJUikvYnVzX3Rlc3Rfc3lzdGVtLXRlc3Qtc3lzdGVtLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVzdC1zeXN0ZW0uYycgb2JqZWN0PSdidXNfdGVzdF9zeXN0ZW0tdGVzdC1zeXN0ZW0ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoYnVzX3Rlc3Rfc3lzdGVtX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGJ1c190ZXN0X3N5c3RlbS10ZXN0LXN5c3RlbS5vIGB0ZXN0IC1mICd0ZXN0LXN5c3RlbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LXN5c3RlbS5jCisKK2J1c190ZXN0X3N5c3RlbS10ZXN0LXN5c3RlbS5vYmo6IHRlc3Qtc3lzdGVtLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChidXNfdGVzdF9zeXN0ZW1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGJ1c190ZXN0X3N5c3RlbS10ZXN0LXN5c3RlbS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2J1c190ZXN0X3N5c3RlbS10ZXN0LXN5c3RlbS5UcG8gLWMgLW8gYnVzX3Rlc3Rfc3lzdGVtLXRlc3Qtc3lzdGVtLm9iaiBgaWYgdGVzdCAtZiAndGVzdC1zeXN0ZW0uYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0ZXN0LXN5c3RlbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LXN5c3RlbS5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tdGVzdC1zeXN0ZW0uVHBvICQoREVQRElSKS9idXNfdGVzdF9zeXN0ZW0tdGVzdC1zeXN0ZW0uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0LXN5c3RlbS5jJyBvYmplY3Q9J2J1c190ZXN0X3N5c3RlbS10ZXN0LXN5c3RlbS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGJ1c190ZXN0X3N5c3RlbV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBidXNfdGVzdF9zeXN0ZW0tdGVzdC1zeXN0ZW0ub2JqIGBpZiB0ZXN0IC1mICd0ZXN0LXN5c3RlbS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3Qtc3lzdGVtLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlc3Qtc3lzdGVtLmMnOyBmaWAKKworZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5vOiBhY3RpdmF0aW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1hY3RpdmF0aW9uLlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1hY3RpdmF0aW9uLm8gYHRlc3QgLWYgJ2FjdGl2YXRpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgYWN0aXZhdGlvbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1hY3RpdmF0aW9uLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2FjdGl2YXRpb24uYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1hY3RpdmF0aW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWFjdGl2YXRpb24ubyBgdGVzdCAtZiAnYWN0aXZhdGlvbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BhY3RpdmF0aW9uLmMKKworZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5vYmo6IGFjdGl2YXRpb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1hY3RpdmF0aW9uLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5UcG8gLWMgLW8gZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5vYmogYGlmIHRlc3QgLWYgJ2FjdGl2YXRpb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhY3RpdmF0aW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FjdGl2YXRpb24uYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWFjdGl2YXRpb24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhY3RpdmF0aW9uLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tYWN0aXZhdGlvbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWFjdGl2YXRpb24ub2JqIGBpZiB0ZXN0IC1mICdhY3RpdmF0aW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWN0aXZhdGlvbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hY3RpdmF0aW9uLmMnOyBmaWAKKworZGJ1c19kYWVtb24tYnVzLm86IGJ1cy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLWJ1cy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1idXMuVHBvIC1jIC1vIGRidXNfZGFlbW9uLWJ1cy5vIGB0ZXN0IC1mICdidXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYnVzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWJ1cy5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWJ1cy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2J1cy5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWJ1cy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1idXMubyBgdGVzdCAtZiAnYnVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJ1cy5jCisKK2RidXNfZGFlbW9uLWJ1cy5vYmo6IGJ1cy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLWJ1cy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uLWJ1cy5UcG8gLWMgLW8gZGJ1c19kYWVtb24tYnVzLm9iaiBgaWYgdGVzdCAtZiAnYnVzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYnVzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2J1cy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1idXMuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1idXMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdidXMuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1idXMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1idXMub2JqIGBpZiB0ZXN0IC1mICdidXMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdidXMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYnVzLmMnOyBmaWAKKworZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5vOiBjb25maWctcGFyc2VyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXIuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWNvbmZpZy1wYXJzZXIubyBgdGVzdCAtZiAnY29uZmlnLXBhcnNlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLmMKKworZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5vYmo6IGNvbmZpZy1wYXJzZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5UcG8gLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1wYXJzZXIuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWNvbmZpZy1wYXJzZXIuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWNvbmZpZy1wYXJzZXIub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLXBhcnNlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLmMnOyBmaWAKKworZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24ubzogY29uZmlnLXBhcnNlci1jb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLWNvbW1vbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLWNvbW1vbi5UcG8gLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24ubyBgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci1jb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24uVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLWNvbW1vbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24ubyBgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci1jb21tb24uYworCitkYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLWNvbW1vbi5vYmo6IGNvbmZpZy1wYXJzZXItY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctcGFyc2VyLWNvbW1vbi5UcG8gLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLWNvbW1vbi5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLXBhcnNlci1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBmaWAKKworZGJ1c19kYWVtb24tY29ubmVjdGlvbi5vOiBjb25uZWN0aW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tY29ubmVjdGlvbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25uZWN0aW9uLlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1jb25uZWN0aW9uLm8gYHRlc3QgLWYgJ2Nvbm5lY3Rpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29ubmVjdGlvbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25uZWN0aW9uLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tY29ubmVjdGlvbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Nvbm5lY3Rpb24uYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1jb25uZWN0aW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWNvbm5lY3Rpb24ubyBgdGVzdCAtZiAnY29ubmVjdGlvbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25uZWN0aW9uLmMKKworZGJ1c19kYWVtb24tY29ubmVjdGlvbi5vYmo6IGNvbm5lY3Rpb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1jb25uZWN0aW9uLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tY29ubmVjdGlvbi5UcG8gLWMgLW8gZGJ1c19kYWVtb24tY29ubmVjdGlvbi5vYmogYGlmIHRlc3QgLWYgJ2Nvbm5lY3Rpb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25uZWN0aW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Nvbm5lY3Rpb24uYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tY29ubmVjdGlvbi5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWNvbm5lY3Rpb24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25uZWN0aW9uLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tY29ubmVjdGlvbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWNvbm5lY3Rpb24ub2JqIGBpZiB0ZXN0IC1mICdjb25uZWN0aW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29ubmVjdGlvbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25uZWN0aW9uLmMnOyBmaWAKKworZGJ1c19kYWVtb24tZGVza3RvcC1maWxlLm86IGRlc2t0b3AtZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kZXNrdG9wLWZpbGUuVHBvIC1jIC1vIGRidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5vIGB0ZXN0IC1mICdkZXNrdG9wLWZpbGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGVza3RvcC1maWxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rlc2t0b3AtZmlsZS5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1kZXNrdG9wLWZpbGUubyBgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRlc2t0b3AtZmlsZS5jCisKK2RidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5vYmo6IGRlc2t0b3AtZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uLWRlc2t0b3AtZmlsZS5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGVza3RvcC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVza3RvcC1maWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rlc2t0b3AtZmlsZS5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1kZXNrdG9wLWZpbGUuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1kZXNrdG9wLWZpbGUuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXNrdG9wLWZpbGUuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1kZXNrdG9wLWZpbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1kZXNrdG9wLWZpbGUub2JqIGBpZiB0ZXN0IC1mICdkZXNrdG9wLWZpbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkZXNrdG9wLWZpbGUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGVza3RvcC1maWxlLmMnOyBmaWAKKworZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQubzogZGlyLXdhdGNoLWRlZmF1bHQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1kaXItd2F0Y2gtZGVmYXVsdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtZGVmYXVsdC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQubyBgdGVzdCAtZiAnZGlyLXdhdGNoLWRlZmF1bHQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWRlZmF1bHQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtZGVmYXVsdC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpci13YXRjaC1kZWZhdWx0LmMnIG9iamVjdD0nZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQubyBgdGVzdCAtZiAnZGlyLXdhdGNoLWRlZmF1bHQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWRlZmF1bHQuYworCitkYnVzX2RhZW1vbi1kaXItd2F0Y2gtZGVmYXVsdC5vYmo6IGRpci13YXRjaC1kZWZhdWx0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtZGVmYXVsdC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gtZGVmYXVsdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpci13YXRjaC1kZWZhdWx0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpci13YXRjaC1kZWZhdWx0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWRpci13YXRjaC1kZWZhdWx0LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gtZGVmYXVsdC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWRpci13YXRjaC1kZWZhdWx0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRlZmF1bHQub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gtZGVmYXVsdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpci13YXRjaC1kZWZhdWx0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpci13YXRjaC1kZWZhdWx0LmMnOyBmaWAKKworZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkubzogZGlyLXdhdGNoLWRub3RpZnkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1kaXItd2F0Y2gtZG5vdGlmeS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtZG5vdGlmeS5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkubyBgdGVzdCAtZiAnZGlyLXdhdGNoLWRub3RpZnkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWRub3RpZnkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtZG5vdGlmeS5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpci13YXRjaC1kbm90aWZ5LmMnIG9iamVjdD0nZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkubyBgdGVzdCAtZiAnZGlyLXdhdGNoLWRub3RpZnkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWRub3RpZnkuYworCitkYnVzX2RhZW1vbi1kaXItd2F0Y2gtZG5vdGlmeS5vYmo6IGRpci13YXRjaC1kbm90aWZ5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtZG5vdGlmeS5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gtZG5vdGlmeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpci13YXRjaC1kbm90aWZ5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpci13YXRjaC1kbm90aWZ5LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWRpci13YXRjaC1kbm90aWZ5LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gtZG5vdGlmeS5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWRpci13YXRjaC1kbm90aWZ5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWRub3RpZnkub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gtZG5vdGlmeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpci13YXRjaC1kbm90aWZ5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpci13YXRjaC1kbm90aWZ5LmMnOyBmaWAKKworZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkubzogZGlyLXdhdGNoLWlub3RpZnkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1kaXItd2F0Y2gtaW5vdGlmeS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtaW5vdGlmeS5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkubyBgdGVzdCAtZiAnZGlyLXdhdGNoLWlub3RpZnkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWlub3RpZnkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtaW5vdGlmeS5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpci13YXRjaC1pbm90aWZ5LmMnIG9iamVjdD0nZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkubyBgdGVzdCAtZiAnZGlyLXdhdGNoLWlub3RpZnkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWlub3RpZnkuYworCitkYnVzX2RhZW1vbi1kaXItd2F0Y2gtaW5vdGlmeS5vYmo6IGRpci13YXRjaC1pbm90aWZ5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gtaW5vdGlmeS5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gtaW5vdGlmeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpci13YXRjaC1pbm90aWZ5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpci13YXRjaC1pbm90aWZ5LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWRpci13YXRjaC1pbm90aWZ5LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gtaW5vdGlmeS5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWRpci13YXRjaC1pbm90aWZ5Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWlub3RpZnkub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gtaW5vdGlmeS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpci13YXRjaC1pbm90aWZ5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpci13YXRjaC1pbm90aWZ5LmMnOyBmaWAKKworZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5vOiBkaXItd2F0Y2gta3F1ZXVlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gta3F1ZXVlLlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1kaXItd2F0Y2gta3F1ZXVlLm8gYHRlc3QgLWYgJ2Rpci13YXRjaC1rcXVldWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlyLXdhdGNoLWtxdWV1ZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXItd2F0Y2gta3F1ZXVlLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpci13YXRjaC1rcXVldWUuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1kaXItd2F0Y2gta3F1ZXVlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWRpci13YXRjaC1rcXVldWUubyBgdGVzdCAtZiAnZGlyLXdhdGNoLWtxdWV1ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXItd2F0Y2gta3F1ZXVlLmMKKworZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5vYmo6IGRpci13YXRjaC1rcXVldWUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1kaXItd2F0Y2gta3F1ZXVlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5vYmogYGlmIHRlc3QgLWYgJ2Rpci13YXRjaC1rcXVldWUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXItd2F0Y2gta3F1ZXVlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpci13YXRjaC1rcXVldWUuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWRpci13YXRjaC1rcXVldWUuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXItd2F0Y2gta3F1ZXVlLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tZGlyLXdhdGNoLWtxdWV1ZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWRpci13YXRjaC1rcXVldWUub2JqIGBpZiB0ZXN0IC1mICdkaXItd2F0Y2gta3F1ZXVlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlyLXdhdGNoLWtxdWV1ZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXItd2F0Y2gta3F1ZXVlLmMnOyBmaWAKKworZGJ1c19kYWVtb24tZGlzcGF0Y2gubzogZGlzcGF0Y2guYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1kaXNwYXRjaC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXNwYXRjaC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlzcGF0Y2gubyBgdGVzdCAtZiAnZGlzcGF0Y2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlzcGF0Y2guYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tZGlzcGF0Y2guVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXNwYXRjaC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpc3BhdGNoLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tZGlzcGF0Y2gubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlzcGF0Y2gubyBgdGVzdCAtZiAnZGlzcGF0Y2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlzcGF0Y2guYworCitkYnVzX2RhZW1vbi1kaXNwYXRjaC5vYmo6IGRpc3BhdGNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tZGlzcGF0Y2gub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kaXNwYXRjaC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZGlzcGF0Y2gub2JqIGBpZiB0ZXN0IC1mICdkaXNwYXRjaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc3BhdGNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc3BhdGNoLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWRpc3BhdGNoLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tZGlzcGF0Y2guUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNwYXRjaC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWRpc3BhdGNoLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tZGlzcGF0Y2gub2JqIGBpZiB0ZXN0IC1mICdkaXNwYXRjaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc3BhdGNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc3BhdGNoLmMnOyBmaWAKKworZGJ1c19kYWVtb24tZHJpdmVyLm86IGRyaXZlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLWRyaXZlci5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1kcml2ZXIuVHBvIC1jIC1vIGRidXNfZGFlbW9uLWRyaXZlci5vIGB0ZXN0IC1mICdkcml2ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZHJpdmVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWRyaXZlci5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWRyaXZlci5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RyaXZlci5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWRyaXZlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1kcml2ZXIubyBgdGVzdCAtZiAnZHJpdmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRyaXZlci5jCisKK2RidXNfZGFlbW9uLWRyaXZlci5vYmo6IGRyaXZlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLWRyaXZlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uLWRyaXZlci5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZHJpdmVyLm9iaiBgaWYgdGVzdCAtZiAnZHJpdmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZHJpdmVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2RyaXZlci5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1kcml2ZXIuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1kcml2ZXIuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkcml2ZXIuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1kcml2ZXIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1kcml2ZXIub2JqIGBpZiB0ZXN0IC1mICdkcml2ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkcml2ZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZHJpdmVyLmMnOyBmaWAKKworZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5vOiBleHBpcmVsaXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1leHBpcmVsaXN0LlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1leHBpcmVsaXN0Lm8gYHRlc3QgLWYgJ2V4cGlyZWxpc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXhwaXJlbGlzdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1leHBpcmVsaXN0LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2V4cGlyZWxpc3QuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1leHBpcmVsaXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWV4cGlyZWxpc3QubyBgdGVzdCAtZiAnZXhwaXJlbGlzdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BleHBpcmVsaXN0LmMKKworZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5vYmo6IGV4cGlyZWxpc3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1leHBpcmVsaXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5vYmogYGlmIHRlc3QgLWYgJ2V4cGlyZWxpc3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdleHBpcmVsaXN0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2V4cGlyZWxpc3QuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWV4cGlyZWxpc3QuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdleHBpcmVsaXN0LmMnIG9iamVjdD0nZGJ1c19kYWVtb24tZXhwaXJlbGlzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWV4cGlyZWxpc3Qub2JqIGBpZiB0ZXN0IC1mICdleHBpcmVsaXN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZXhwaXJlbGlzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9leHBpcmVsaXN0LmMnOyBmaWAKKworZGJ1c19kYWVtb24tcG9saWN5Lm86IHBvbGljeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLXBvbGljeS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1wb2xpY3kuVHBvIC1jIC1vIGRidXNfZGFlbW9uLXBvbGljeS5vIGB0ZXN0IC1mICdwb2xpY3kuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG9saWN5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLXBvbGljeS5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLXBvbGljeS5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BvbGljeS5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLXBvbGljeS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1wb2xpY3kubyBgdGVzdCAtZiAncG9saWN5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBvbGljeS5jCisKK2RidXNfZGFlbW9uLXBvbGljeS5vYmo6IHBvbGljeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uLXBvbGljeS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uLXBvbGljeS5UcG8gLWMgLW8gZGJ1c19kYWVtb24tcG9saWN5Lm9iaiBgaWYgdGVzdCAtZiAncG9saWN5LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncG9saWN5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3BvbGljeS5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1wb2xpY3kuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1wb2xpY3kuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwb2xpY3kuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1wb2xpY3kub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbi1wb2xpY3kub2JqIGBpZiB0ZXN0IC1mICdwb2xpY3kuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwb2xpY3kuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcG9saWN5LmMnOyBmaWAKKworZGJ1c19kYWVtb24tc2VsaW51eC5vOiBzZWxpbnV4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tc2VsaW51eC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1zZWxpbnV4LlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1zZWxpbnV4Lm8gYHRlc3QgLWYgJ3NlbGludXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VsaW51eC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1zZWxpbnV4LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tc2VsaW51eC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NlbGludXguYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1zZWxpbnV4Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLXNlbGludXgubyBgdGVzdCAtZiAnc2VsaW51eC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzZWxpbnV4LmMKKworZGJ1c19kYWVtb24tc2VsaW51eC5vYmo6IHNlbGludXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1zZWxpbnV4Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tc2VsaW51eC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tc2VsaW51eC5vYmogYGlmIHRlc3QgLWYgJ3NlbGludXguYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzZWxpbnV4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NlbGludXguYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tc2VsaW51eC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLXNlbGludXguUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZWxpbnV4LmMnIG9iamVjdD0nZGJ1c19kYWVtb24tc2VsaW51eC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLXNlbGludXgub2JqIGBpZiB0ZXN0IC1mICdzZWxpbnV4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2VsaW51eC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zZWxpbnV4LmMnOyBmaWAKKworZGJ1c19kYWVtb24tc2VydmljZXMubzogc2VydmljZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1zZXJ2aWNlcy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1zZXJ2aWNlcy5UcG8gLWMgLW8gZGJ1c19kYWVtb24tc2VydmljZXMubyBgdGVzdCAtZiAnc2VydmljZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VydmljZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tc2VydmljZXMuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1zZXJ2aWNlcy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NlcnZpY2VzLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tc2VydmljZXMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tc2VydmljZXMubyBgdGVzdCAtZiAnc2VydmljZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VydmljZXMuYworCitkYnVzX2RhZW1vbi1zZXJ2aWNlcy5vYmo6IHNlcnZpY2VzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tc2VydmljZXMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1zZXJ2aWNlcy5UcG8gLWMgLW8gZGJ1c19kYWVtb24tc2VydmljZXMub2JqIGBpZiB0ZXN0IC1mICdzZXJ2aWNlcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NlcnZpY2VzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NlcnZpY2VzLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLXNlcnZpY2VzLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tc2VydmljZXMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZXJ2aWNlcy5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLXNlcnZpY2VzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tc2VydmljZXMub2JqIGBpZiB0ZXN0IC1mICdzZXJ2aWNlcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NlcnZpY2VzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NlcnZpY2VzLmMnOyBmaWAKKworZGJ1c19kYWVtb24tc2lnbmFscy5vOiBzaWduYWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tc2lnbmFscy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1zaWduYWxzLlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1zaWduYWxzLm8gYHRlc3QgLWYgJ3NpZ25hbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2lnbmFscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1zaWduYWxzLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tc2lnbmFscy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NpZ25hbHMuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1zaWduYWxzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLXNpZ25hbHMubyBgdGVzdCAtZiAnc2lnbmFscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzaWduYWxzLmMKKworZGJ1c19kYWVtb24tc2lnbmFscy5vYmo6IHNpZ25hbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1zaWduYWxzLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tc2lnbmFscy5UcG8gLWMgLW8gZGJ1c19kYWVtb24tc2lnbmFscy5vYmogYGlmIHRlc3QgLWYgJ3NpZ25hbHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzaWduYWxzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NpZ25hbHMuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tc2lnbmFscy5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLXNpZ25hbHMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzaWduYWxzLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tc2lnbmFscy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLXNpZ25hbHMub2JqIGBpZiB0ZXN0IC1mICdzaWduYWxzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2lnbmFscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zaWduYWxzLmMnOyBmaWAKKworZGJ1c19kYWVtb24tdGVzdC5vOiB0ZXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tdGVzdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi10ZXN0LlRwbyAtYyAtbyBkYnVzX2RhZW1vbi10ZXN0Lm8gYHRlc3QgLWYgJ3Rlc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGVzdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi10ZXN0LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tdGVzdC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlc3QuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi10ZXN0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLXRlc3QubyBgdGVzdCAtZiAndGVzdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LmMKKworZGJ1c19kYWVtb24tdGVzdC5vYmo6IHRlc3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi10ZXN0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tdGVzdC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tdGVzdC5vYmogYGlmIHRlc3QgLWYgJ3Rlc3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0ZXN0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlc3QuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tdGVzdC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLXRlc3QuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0LmMnIG9iamVjdD0nZGJ1c19kYWVtb24tdGVzdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLXRlc3Qub2JqIGBpZiB0ZXN0IC1mICd0ZXN0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LmMnOyBmaWAKKworZGJ1c19kYWVtb24tdXRpbHMubzogdXRpbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi11dGlscy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi11dGlscy5UcG8gLWMgLW8gZGJ1c19kYWVtb24tdXRpbHMubyBgdGVzdCAtZiAndXRpbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdXRpbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tdXRpbHMuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi11dGlscy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3V0aWxzLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tdXRpbHMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tdXRpbHMubyBgdGVzdCAtZiAndXRpbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdXRpbHMuYworCitkYnVzX2RhZW1vbi11dGlscy5vYmo6IHV0aWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tdXRpbHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi11dGlscy5UcG8gLWMgLW8gZGJ1c19kYWVtb24tdXRpbHMub2JqIGBpZiB0ZXN0IC1mICd1dGlscy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3V0aWxzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3V0aWxzLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLXV0aWxzLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tdXRpbHMuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd1dGlscy5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLXV0aWxzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tdXRpbHMub2JqIGBpZiB0ZXN0IC1mICd1dGlscy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3V0aWxzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3V0aWxzLmMnOyBmaWAKKworZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5vOiBjb25maWctbG9hZGVyLWV4cGF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWV4cGF0LlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWV4cGF0Lm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWV4cGF0LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1sb2FkZXItZXhwYXQuYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWV4cGF0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWNvbmZpZy1sb2FkZXItZXhwYXQubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1leHBhdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctbG9hZGVyLWV4cGF0LmMKKworZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5vYmo6IGNvbmZpZy1sb2FkZXItZXhwYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWV4cGF0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLWNvbmZpZy1sb2FkZXItZXhwYXQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWV4cGF0LmMnIG9iamVjdD0nZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1leHBhdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLWNvbmZpZy1sb2FkZXItZXhwYXQub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWV4cGF0LmMnOyBmaWAKKworZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwubzogY29uZmlnLWxvYWRlci1saWJ4bWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWxpYnhtbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1saWJ4bWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWxpYnhtbC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1saWJ4bWwuYworCitkYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWxpYnhtbC5vYmo6IGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uLWNvbmZpZy1sb2FkZXItbGlieG1sLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWxpYnhtbC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uLWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb24tY29uZmlnLWxvYWRlci1saWJ4bWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBmaWAKKworZGJ1c19kYWVtb24tbWFpbi5vOiBtYWluLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb24tbWFpbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbi1tYWluLlRwbyAtYyAtbyBkYnVzX2RhZW1vbi1tYWluLm8gYHRlc3QgLWYgJ21haW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgbWFpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbi1tYWluLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb24tbWFpbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21haW4uYycgb2JqZWN0PSdkYnVzX2RhZW1vbi1tYWluLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLW1haW4ubyBgdGVzdCAtZiAnbWFpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWluLmMKKworZGJ1c19kYWVtb24tbWFpbi5vYmo6IG1haW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbi1tYWluLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb24tbWFpbi5UcG8gLWMgLW8gZGJ1c19kYWVtb24tbWFpbi5vYmogYGlmIHRlc3QgLWYgJ21haW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21haW4uYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb24tbWFpbi5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uLW1haW4uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdtYWluLmMnIG9iamVjdD0nZGJ1c19kYWVtb24tbWFpbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uLW1haW4ub2JqIGBpZiB0ZXN0IC1mICdtYWluLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWFpbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tYWluLmMnOyBmaWAKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4ubzogYWN0aXZhdGlvbi1oZWxwZXItYmluLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLWJpbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLWJpbi5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4ubyBgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFjdGl2YXRpb24taGVscGVyLWJpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLWJpbi5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXItYmluLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLWJpbi5vIGB0ZXN0IC1mICdhY3RpdmF0aW9uLWhlbHBlci1iaW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgYWN0aXZhdGlvbi1oZWxwZXItYmluLmMKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4ub2JqOiBhY3RpdmF0aW9uLWhlbHBlci1iaW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXItYmluLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4uVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXItYmluLm9iaiBgaWYgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FjdGl2YXRpb24taGVscGVyLWJpbi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLWJpbi5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXItYmluLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci1iaW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXItYmluLm9iaiBgaWYgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FjdGl2YXRpb24taGVscGVyLWJpbi5jJzsgZmlgCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5vOiBjb25maWctbG9hZGVyLWV4cGF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0LlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1leHBhdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctbG9hZGVyLWV4cGF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1sb2FkZXItZXhwYXQuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1leHBhdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctbG9hZGVyLWV4cGF0LmMKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm9iajogY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWV4cGF0LlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWV4cGF0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1sb2FkZXItZXhwYXQuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItZXhwYXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1leHBhdC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItZXhwYXQuYyc7IGZpYAorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm86IGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwubyBgdGVzdCAtZiAnY29uZmlnLWxvYWRlci1saWJ4bWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1saWJ4bWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWxpYnhtbC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItbGlieG1sLmMKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5vYmo6IGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWxpYnhtbC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLWxvYWRlci1saWJ4bWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBmaWAKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vOiBjb25maWctcGFyc2VyLWNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1wYXJzZXItY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24uVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLXBhcnNlci1jb21tb24uYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vIGB0ZXN0IC1mICdjb25maWctcGFyc2VyLWNvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLWNvbW1vbi5jCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24ub2JqOiBjb25maWctcGFyc2VyLWNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24uVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci1jb21tb24uVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLXBhcnNlci1jb21tb24uYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZmlgCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLm86IGNvbmZpZy1wYXJzZXItdHJpdmlhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwuVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctcGFyc2VyLXRyaXZpYWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwubyBgdGVzdCAtZiAnY29uZmlnLXBhcnNlci10cml2aWFsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1wYXJzZXItdHJpdmlhbC5jCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLm9iajogY29uZmlnLXBhcnNlci10cml2aWFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1jb25maWctcGFyc2VyLXRyaXZpYWwuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItY29uZmlnLXBhcnNlci10cml2aWFsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IGZpYAorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5vOiBkZXNrdG9wLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5vIGB0ZXN0IC1mICdkZXNrdG9wLWZpbGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGVza3RvcC1maWxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXNrdG9wLWZpbGUuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLm8gYHRlc3QgLWYgJ2Rlc2t0b3AtZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkZXNrdG9wLWZpbGUuYworCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5vYmo6IGRlc2t0b3AtZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUub2JqIGBpZiB0ZXN0IC1mICdkZXNrdG9wLWZpbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkZXNrdG9wLWZpbGUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGVza3RvcC1maWxlLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItZGVza3RvcC1maWxlLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXNrdG9wLWZpbGUuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWRlc2t0b3AtZmlsZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1kZXNrdG9wLWZpbGUub2JqIGBpZiB0ZXN0IC1mICdkZXNrdG9wLWZpbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkZXNrdG9wLWZpbGUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGVza3RvcC1maWxlLmMnOyBmaWAKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci11dGlscy5vOiB1dGlscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci11dGlscy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLm8gYHRlc3QgLWYgJ3V0aWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItdXRpbHMuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndXRpbHMuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci11dGlscy5vIGB0ZXN0IC1mICd1dGlscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B1dGlscy5jCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItdXRpbHMub2JqOiB1dGlscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci11dGlscy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItdXRpbHMuVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItdXRpbHMub2JqIGBpZiB0ZXN0IC1mICd1dGlscy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3V0aWxzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3V0aWxzLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItdXRpbHMuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndXRpbHMuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLXV0aWxzLm9iaiBgaWYgdGVzdCAtZiAndXRpbHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1dGlscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlscy5jJzsgZmlgCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIubzogYWN0aXZhdGlvbi1oZWxwZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5vIGB0ZXN0IC1mICdhY3RpdmF0aW9uLWhlbHBlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BhY3RpdmF0aW9uLWhlbHBlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2FjdGl2YXRpb24taGVscGVyLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIubyBgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYWN0aXZhdGlvbi1oZWxwZXIuYworCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLm9iajogYWN0aXZhdGlvbi1oZWxwZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXItYWN0aXZhdGlvbi1oZWxwZXIub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLm9iaiBgaWYgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhY3RpdmF0aW9uLWhlbHBlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hY3RpdmF0aW9uLWhlbHBlci5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyLWFjdGl2YXRpb24taGVscGVyLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2FjdGl2YXRpb24taGVscGVyLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlci1hY3RpdmF0aW9uLWhlbHBlci5vYmogYGlmIHRlc3QgLWYgJ2FjdGl2YXRpb24taGVscGVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWN0aXZhdGlvbi1oZWxwZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYWN0aXZhdGlvbi1oZWxwZXIuYyc7IGZpYAorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXItYmluLm86IGFjdGl2YXRpb24taGVscGVyLWJpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXItYmluLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4uVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4ubyBgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFjdGl2YXRpb24taGVscGVyLWJpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXItYmluLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLWJpbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2FjdGl2YXRpb24taGVscGVyLWJpbi5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4ubyBgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFjdGl2YXRpb24taGVscGVyLWJpbi5jCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4ub2JqOiBhY3RpdmF0aW9uLWhlbHBlci1iaW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLWJpbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4uVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4ub2JqIGBpZiB0ZXN0IC1mICdhY3RpdmF0aW9uLWhlbHBlci1iaW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhY3RpdmF0aW9uLWhlbHBlci1iaW4uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci1iaW4uVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXItYmluLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLWJpbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXItYmluLm9iaiBgaWYgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYWN0aXZhdGlvbi1oZWxwZXItYmluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FjdGl2YXRpb24taGVscGVyLWJpbi5jJzsgZmlgCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0Lm86IGNvbmZpZy1sb2FkZXItZXhwYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQuVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0Lm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItZXhwYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLWxvYWRlci1leHBhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0LlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLWxvYWRlci1leHBhdC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5vIGB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItZXhwYXQuYworCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5vYmo6IGNvbmZpZy1sb2FkZXItZXhwYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1leHBhdC5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWV4cGF0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWV4cGF0LlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWV4cGF0LmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItZXhwYXQub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWV4cGF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1leHBhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctbG9hZGVyLWV4cGF0LmMnOyBmaWAKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm86IGNvbmZpZy1sb2FkZXItbGlieG1sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5vIGB0ZXN0IC1mICdjb25maWctbG9hZGVyLWxpYnhtbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25maWctbG9hZGVyLWxpYnhtbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctbG9hZGVyLWxpYnhtbC5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm8gYHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1sb2FkZXItbGlieG1sLmMKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm9iajogY29uZmlnLWxvYWRlci1saWJ4bWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLWxvYWRlci1saWJ4bWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctbG9hZGVyLWxpYnhtbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1sb2FkZXItbGlieG1sLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1sb2FkZXItbGlieG1sLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctbG9hZGVyLWxpYnhtbC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1sb2FkZXItbGlieG1sLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLWxvYWRlci1saWJ4bWwuYyc7IGZpYAorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24ubzogY29uZmlnLXBhcnNlci1jb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm8gYHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbmZpZy1wYXJzZXItY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbmZpZy1wYXJzZXItY29tbW9uLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24ubyBgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci1jb21tb24uYworCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24ub2JqOiBjb25maWctcGFyc2VyLWNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24ub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24uVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLXBhcnNlci1jb21tb24uYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLXBhcnNlci1jb21tb24uYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci1jb21tb24ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLXBhcnNlci1jb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLWNvbW1vbi5jJzsgZmlgCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLXRyaXZpYWwubzogY29uZmlnLXBhcnNlci10cml2aWFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLXRyaXZpYWwubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vIGB0ZXN0IC1mICdjb25maWctcGFyc2VyLXRyaXZpYWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci10cml2aWFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLXRyaXZpYWwuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci10cml2aWFsLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLXBhcnNlci10cml2aWFsLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vIGB0ZXN0IC1mICdjb25maWctcGFyc2VyLXRyaXZpYWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLXBhcnNlci10cml2aWFsLmMKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmo6IGNvbmZpZy1wYXJzZXItdHJpdmlhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci10cml2aWFsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5vYmogYGlmIHRlc3QgLWYgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWNvbmZpZy1wYXJzZXItdHJpdmlhbC5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLXRyaXZpYWwuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25maWctcGFyc2VyLXRyaXZpYWwuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtY29uZmlnLXBhcnNlci10cml2aWFsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1jb25maWctcGFyc2VyLXRyaXZpYWwub2JqIGBpZiB0ZXN0IC1mICdjb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWctcGFyc2VyLXRyaXZpYWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLXBhcnNlci10cml2aWFsLmMnOyBmaWAKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWRlc2t0b3AtZmlsZS5vOiBkZXNrdG9wLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWRlc2t0b3AtZmlsZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLm8gYHRlc3QgLWYgJ2Rlc2t0b3AtZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkZXNrdG9wLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWRlc2t0b3AtZmlsZS5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1kZXNrdG9wLWZpbGUuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXNrdG9wLWZpbGUuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLm8gYHRlc3QgLWYgJ2Rlc2t0b3AtZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkZXNrdG9wLWZpbGUuYworCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLm9iajogZGVza3RvcC1maWxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1kZXNrdG9wLWZpbGUub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLm9iaiBgaWYgdGVzdCAtZiAnZGVza3RvcC1maWxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVza3RvcC1maWxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rlc2t0b3AtZmlsZS5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtZGVza3RvcC1maWxlLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWRlc2t0b3AtZmlsZS5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rlc2t0b3AtZmlsZS5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1kZXNrdG9wLWZpbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWRlc2t0b3AtZmlsZS5vYmogYGlmIHRlc3QgLWYgJ2Rlc2t0b3AtZmlsZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rlc2t0b3AtZmlsZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kZXNrdG9wLWZpbGUuYyc7IGZpYAorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtdXRpbHMubzogdXRpbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LXV0aWxzLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC11dGlscy5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LXV0aWxzLm8gYHRlc3QgLWYgJ3V0aWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHV0aWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC11dGlscy5UcG8gJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC11dGlscy5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3V0aWxzLmMnIG9iamVjdD0nZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LXV0aWxzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtdXRpbHMubyBgdGVzdCAtZiAndXRpbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdXRpbHMuYworCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtdXRpbHMub2JqOiB1dGlscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtdXRpbHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtdXRpbHMuVHBvIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC11dGlscy5vYmogYGlmIHRlc3QgLWYgJ3V0aWxzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndXRpbHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdXRpbHMuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LXV0aWxzLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LXV0aWxzLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndXRpbHMuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtdXRpbHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LXV0aWxzLm9iaiBgaWYgdGVzdCAtZiAndXRpbHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd1dGlscy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS91dGlscy5jJzsgZmlgCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci5vOiBhY3RpdmF0aW9uLWhlbHBlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLlRwbyAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXIubyBgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYWN0aXZhdGlvbi1oZWxwZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLlRwbyAkKERFUERJUikvZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYWN0aXZhdGlvbi1oZWxwZXIuYycgb2JqZWN0PSdkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci5vIGB0ZXN0IC1mICdhY3RpdmF0aW9uLWhlbHBlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BhY3RpdmF0aW9uLWhlbHBlci5jCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci5vYmo6IGFjdGl2YXRpb24taGVscGVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci5UcG8gLWMgLW8gZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0LWFjdGl2YXRpb24taGVscGVyLm9iaiBgaWYgdGVzdCAtZiAnYWN0aXZhdGlvbi1oZWxwZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhY3RpdmF0aW9uLWhlbHBlci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hY3RpdmF0aW9uLWhlbHBlci5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXIuVHBvICQoREVQRElSKS9kYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXIuUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhY3RpdmF0aW9uLWhlbHBlci5jJyBvYmplY3Q9J2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdC1hY3RpdmF0aW9uLWhlbHBlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGRidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3QtYWN0aXZhdGlvbi1oZWxwZXIub2JqIGBpZiB0ZXN0IC1mICdhY3RpdmF0aW9uLWhlbHBlci5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2FjdGl2YXRpb24taGVscGVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FjdGl2YXRpb24taGVscGVyLmMnOyBmaWAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtYWdlbnREQVRBOiAkKGFnZW50X0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChhZ2VudGRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGFnZW50ZGlyKSIKKwlAbGlzdD0nJChhZ2VudF9EQVRBKSc7IHRlc3QgLW4gIiQoYWdlbnRkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IFwKKwlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKGFnZW50ZGlyKSciOyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQoYWdlbnRkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLWFnZW50REFUQToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGFnZW50X0RBVEEpJzsgdGVzdCAtbiAiJChhZ2VudGRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwl0ZXN0IC1uICIkJGZpbGVzIiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoYWdlbnRkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoYWdlbnRkaXIpIiAmJiBybSAtZiAkJGZpbGVzCitpbnN0YWxsLWNvbmZpZ0RBVEE6ICQoY29uZmlnX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChjb25maWdkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChjb25maWdkaXIpIgorCUBsaXN0PSckKGNvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQoY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChjb25maWdkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChjb25maWdkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLWNvbmZpZ0RBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChjb25maWdfREFUQSknOyB0ZXN0IC1uICIkKGNvbmZpZ2RpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwl0ZXN0IC1uICIkJGZpbGVzIiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoY29uZmlnZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKGNvbmZpZ2RpcikiICYmIHJtIC1mICQkZmlsZXMKK2luc3RhbGwtc3lzdGVtZHN5c3RlbXVuaXREQVRBOiAkKHN5c3RlbWRzeXN0ZW11bml0X0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKSIKKwlAbGlzdD0nJChzeXN0ZW1kc3lzdGVtdW5pdF9EQVRBKSc7IHRlc3QgLW4gIiQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IFwKKwlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKSciOyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLXN5c3RlbWRzeXN0ZW11bml0REFUQToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHN5c3RlbWRzeXN0ZW11bml0X0RBVEEpJzsgdGVzdCAtbiAiJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwl0ZXN0IC1uICIkJGZpbGVzIiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2NoZWNrLVRFU1RTOiAkKFRFU1RTKQorCUBmYWlsZWQ9MDsgYWxsPTA7IHhmYWlsPTA7IHhwYXNzPTA7IHNraXA9MDsgXAorCXNyY2Rpcj0kKHNyY2Rpcik7IGV4cG9ydCBzcmNkaXI7IFwKKwlsaXN0PScgJChURVNUUykgJzsgXAorCSQoYW1fX3R0eV9jb2xvcnMpOyBcCisJaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBmb3IgdHN0IGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mIC4vJCR0c3Q7IHRoZW4gZGlyPS4vOyBcCisJICAgIGVsaWYgdGVzdCAtZiAkJHRzdDsgdGhlbiBkaXI9OyBcCisJICAgIGVsc2UgZGlyPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgICAgaWYgJChURVNUU19FTlZJUk9OTUVOVCkgJCR7ZGlyfSQkdHN0OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhwYXNzPWBleHByICQkeHBhc3MgKyAxYDsgXAorCQlmYWlsZWQ9YGV4cHIgJCRmYWlsZWQgKyAxYDsgXAorCQljb2w9JCRyZWQ7IHJlcz1YUEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWNvbD0kJGdybjsgcmVzPVBBU1M7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbGlmIHRlc3QgJCQ/IC1uZSA3NzsgdGhlbiBcCisJICAgICAgYWxsPWBleHByICQkYWxsICsgMWA7IFwKKwkgICAgICBjYXNlICIgJChYRkFJTF9URVNUUykgIiBpbiBcCisJICAgICAgKltcIFwJXSQkdHN0W1wgXAldKikgXAorCQl4ZmFpbD1gZXhwciAkJHhmYWlsICsgMWA7IFwKKwkJY29sPSQkbGduOyByZXM9WEZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgKikgXAorCQlmYWlsZWQ9YGV4cHIgJCRmYWlsZWQgKyAxYDsgXAorCQljb2w9JCRyZWQ7IHJlcz1GQUlMOyBcCisJICAgICAgOzsgXAorCSAgICAgIGVzYWM7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcD1gZXhwciAkJHNraXAgKyAxYDsgXAorCSAgICAgIGNvbD0kJGJsdTsgcmVzPVNLSVA7IFwKKwkgICAgZmk7IFwKKwkgICAgZWNobyAiJCR7Y29sfSQkcmVzJCR7c3RkfTogJCR0c3QiOyBcCisJICBkb25lOyBcCisJICBpZiB0ZXN0ICIkJGFsbCIgLWVxIDE7IHRoZW4gXAorCSAgICB0ZXN0cz0idGVzdCI7IFwKKwkgICAgQWxsPSIiOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdHM9InRlc3RzIjsgXAorCSAgICBBbGw9IkFsbCAiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCR4ZmFpbCIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIHBhc3NlZCI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgaWYgdGVzdCAiJCR4ZmFpbCIgLWVxIDE7IHRoZW4gZmFpbHVyZXM9ZmFpbHVyZTsgZWxzZSBmYWlsdXJlcz1mYWlsdXJlczsgZmk7IFwKKwkgICAgICBiYW5uZXI9IiQkQWxsJCRhbGwgJCR0ZXN0cyBiZWhhdmVkIGFzIGV4cGVjdGVkICgkJHhmYWlsIGV4cGVjdGVkICQkZmFpbHVyZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZWxzZSBcCisJICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAwOyB0aGVuIFwKKwkgICAgICBiYW5uZXI9IiQkZmFpbGVkIG9mICQkYWxsICQkdGVzdHMgZmFpbGVkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhwYXNzIiAtZXEgMTsgdGhlbiBwYXNzZXM9cGFzczsgZWxzZSBwYXNzZXM9cGFzc2VzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBkaWQgbm90IGJlaGF2ZSBhcyBleHBlY3RlZCAoJCR4cGFzcyB1bmV4cGVjdGVkICQkcGFzc2VzKSI7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9IiQkYmFubmVyIjsgXAorCSAgc2tpcHBlZD0iIjsgXAorCSAgaWYgdGVzdCAiJCRza2lwIiAtbmUgMDsgdGhlbiBcCisJICAgIGlmIHRlc3QgIiQkc2tpcCIgLWVxIDE7IHRoZW4gXAorCSAgICAgIHNraXBwZWQ9IigkJHNraXAgdGVzdCB3YXMgbm90IHJ1bikiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHNraXBwZWQ9IigkJHNraXAgdGVzdHMgd2VyZSBub3QgcnVuKSI7IFwKKwkgICAgZmk7IFwKKwkgICAgdGVzdCBgZWNobyAiJCRza2lwcGVkIiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHNraXBwZWQiOyBcCisJICBmaTsgXAorCSAgcmVwb3J0PSIiOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLW5lIDAgJiYgdGVzdCAtbiAiJChQQUNLQUdFX0JVR1JFUE9SVCkiOyB0aGVuIFwKKwkgICAgcmVwb3J0PSJQbGVhc2UgcmVwb3J0IHRvICQoUEFDS0FHRV9CVUdSRVBPUlQpIjsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHJlcG9ydCIgfCB3YyAtY2AgLWxlIGBlY2hvICIkJGJhbm5lciIgfCB3YyAtY2AgfHwgXAorCSAgICAgIGRhc2hlcz0iJCRyZXBvcnQiOyBcCisJICBmaTsgXAorCSAgZGFzaGVzPWBlY2hvICIkJGRhc2hlcyIgfCBzZWQgcy8uLz0vZ2A7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgdGhlbiBcCisJICAgIGVjaG8gIiQkZ3JuJCRkYXNoZXMiOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAiJCRyZWQkJGRhc2hlcyI7IFwKKwkgIGZpOyBcCisJICBlY2hvICIkJGJhbm5lciI7IFwKKwkgIHRlc3QgLXogIiQkc2tpcHBlZCIgfHwgZWNobyAiJCRza2lwcGVkIjsgXAorCSAgdGVzdCAteiAiJCRyZXBvcnQiIHx8IGVjaG8gIiQkcmVwb3J0IjsgXAorCSAgZWNobyAiJCRkYXNoZXMkJHN0ZCI7IFwKKwkgIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgXAorCWVsc2UgOjsgZmkKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stVEVTVFMKK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKFNDUklQVFMpICQoREFUQSkKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGRidXNfZGFlbW9uX2V4ZWNkaXIpIiAiJChERVNURElSKSQobGliZXhlY2RpcikiICIkKERFU1RESVIpJChiaW5kaXIpIiAiJChERVNURElSKSQoaW5pdGRkaXIpIiAiJChERVNURElSKSQoYWdlbnRkaXIpIiAiJChERVNURElSKSQoY29uZmlnZGlyKSIgIiQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorQERCVVNfVU5JWF9GQUxTRUBpbnN0YWxsLWV4ZWMtaG9vazoKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZGJ1c19kYWVtb25fZXhlY1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYmV4ZWNQUk9HUkFNUyBjbGVhbi1saWJ0b29sIGNsZWFuLWxvY2FsIFwKKwljbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1hZ2VudERBVEEgaW5zdGFsbC1jb25maWdEQVRBIFwKKwlpbnN0YWxsLWluaXRkU0NSSVBUUyBpbnN0YWxsLXN5c3RlbWRzeXN0ZW11bml0REFUQQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZGF0YS1ob29rCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5TQ1JJUFRTIGluc3RhbGwtZGJ1c19kYWVtb25fZXhlY1BST0dSQU1TIFwKKwlpbnN0YWxsLWxpYmV4ZWNQUk9HUkFNUworCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1ob29rCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1hZ2VudERBVEEgdW5pbnN0YWxsLWJpblNDUklQVFMgXAorCXVuaW5zdGFsbC1jb25maWdEQVRBIHVuaW5zdGFsbC1kYnVzX2RhZW1vbl9leGVjUFJPR1JBTVMgXAorCXVuaW5zdGFsbC1pbml0ZFNDUklQVFMgdW5pbnN0YWxsLWxpYmV4ZWNQUk9HUkFNUyBcCisJdW5pbnN0YWxsLXN5c3RlbWRzeXN0ZW11bml0REFUQQorCisuTUFLRTogY2hlY2stYW0gaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjLWFtIFwKKwlpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1URVNUUyBjaGVjay1hbSBjbGVhbiBcCisJY2xlYW4tZGJ1c19kYWVtb25fZXhlY1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYmV4ZWNQUk9HUkFNUyBjbGVhbi1saWJ0b29sIGNsZWFuLWxvY2FsIFwKKwljbGVhbi1ub2luc3RQUk9HUkFNUyBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYWdlbnREQVRBIFwKKwlpbnN0YWxsLWFtIGluc3RhbGwtYmluU0NSSVBUUyBpbnN0YWxsLWNvbmZpZ0RBVEEgaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhLWhvb2sgXAorCWluc3RhbGwtZGJ1c19kYWVtb25fZXhlY1BST0dSQU1TIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYy1ob29rIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAorCWluc3RhbGwtaW5pdGRTQ1JJUFRTIGluc3RhbGwtbGliZXhlY1BST0dSQU1TIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbC1zeXN0ZW1kc3lzdGVtdW5pdERBVEEgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYWdlbnREQVRBIHVuaW5zdGFsbC1hbSBcCisJdW5pbnN0YWxsLWJpblNDUklQVFMgdW5pbnN0YWxsLWNvbmZpZ0RBVEEgXAorCXVuaW5zdGFsbC1kYnVzX2RhZW1vbl9leGVjUFJPR1JBTVMgdW5pbnN0YWxsLWluaXRkU0NSSVBUUyBcCisJdW5pbnN0YWxsLWxpYmV4ZWNQUk9HUkFNUyB1bmluc3RhbGwtc3lzdGVtZHN5c3RlbXVuaXREQVRBCisKKworY2xlYW4tbG9jYWw6CisJL2Jpbi9ybSAqLmJiICouYmJnICouZGEgKi5nY292IHx8IHRydWUKKworaW5zdGFsbC1kYXRhLWhvb2s6CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsb2NhbHN0YXRlZGlyKS9ydW4vZGJ1cworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoY29uZmlnZGlyKS9zeXN0ZW0uZAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoY29uZmlnZGlyKS9zZXNzaW9uLmQKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRhdGFkaXIpL2RidXMtMS9zZXJ2aWNlcworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGF0YWRpcikvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcworIyBJbnN0YWxsIGRidXMuc29ja2V0IGFzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYSBELUJ1cyBzdGFjaworQEhBVkVfU1lTVEVNRF9UUlVFQAkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9kYnVzLnRhcmdldC53YW50cworQEhBVkVfU1lTVEVNRF9UUlVFQAkkKExOX1MpIC4uL2RidXMuc29ja2V0ICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9kYnVzLnRhcmdldC53YW50cy9kYnVzLnNvY2tldAorIyBVbmNvbmRpdGlvbmFsbHkgZW5hYmxlIEQtQnVzIG9uIHN5c3RlbWQgaW5zdGFsbGF0aW9ucworQEhBVkVfU1lTVEVNRF9UUlVFQAkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9zb2NrZXRzLnRhcmdldC53YW50cworQEhBVkVfU1lTVEVNRF9UUlVFQAkkKExOX1MpIC4uL2RidXMuc29ja2V0ICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9zb2NrZXRzLnRhcmdldC53YW50cy9kYnVzLnNvY2tldAorQEhBVkVfU1lTVEVNRF9UUlVFQAkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9tdWx0aS11c2VyLnRhcmdldC53YW50cworQEhBVkVfU1lTVEVNRF9UUlVFQAkkKExOX1MpIC4uL2RidXMuc2VydmljZSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvbXVsdGktdXNlci50YXJnZXQud2FudHMvZGJ1cy5zZXJ2aWNlCisKK0BEQlVTX1VOSVhfVFJVRUBpbnN0YWxsLWV4ZWMtaG9vazoKK0BEQlVTX1VOSVhfVFJVRUAJaWYgdGVzdCBgaWQgLXVgIC1lcSAwOyB0aGVuIFwKK0BEQlVTX1VOSVhfVFJVRUAJCWNob3duIHJvb3Q6JChEQlVTX1VTRVIpICQoREVTVERJUikkKGxpYmV4ZWNkaXIpL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIkKEVYRUVYVCk7IFwKK0BEQlVTX1VOSVhfVFJVRUAJCWNobW9kIDQ3NTAgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciQoRVhFRVhUKTsgXAorQERCVVNfVU5JWF9UUlVFQAllbHNlIFwKK0BEQlVTX1VOSVhfVFJVRUAJCWVjaG8gIk5vdCBpbnN0YWxsaW5nICQoREVTVERJUikkKGxpYmV4ZWNkaXIpL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgYmluYXJ5IHNldHVpZCEiOyBcCitAREJVU19VTklYX1RSVUVACQllY2hvICJZb3UnbGwgbmVlZCB0byBtYW51YWxseSBzZXQgcGVybWlzc2lvbnMgdG8gcm9vdDokKERCVVNfVVNFUikgYW5kIHBlcm1pc3Npb25zIDQ3NTAiOyBcCitAREJVU19VTklYX1RSVUVACWZpCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9hY3RpdmF0aW9uLWV4aXQtY29kZXMuaCBiL2RidXMtMS40LjEwL2J1cy9hY3RpdmF0aW9uLWV4aXQtY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI5OGRjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2FjdGl2YXRpb24tZXhpdC1jb2Rlcy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1leGl0LWNvZGVzLmggIFJldHVybiB2YWx1ZXMgZm9yIHRoZSBsYXVuY2ggaGVscGVyIHdoaWNoIGlzIHNldAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBoZWxwZXIgYW5kIHJlYWQgaW4gZGJ1cy1zcGF3bi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19BQ1RJVkFUSU9OX0VYSVRfQ09ERVNfSAorI2RlZmluZSBCVVNfQUNUSVZBVElPTl9FWElUX0NPREVTX0gKKworLyoqIFJldHVybiBjb2RlcyBmcm9tIHRoZSBsYXVuY2ggaGVscGVyIC0gbm90IHB1YmxpYyBBUEkuIEhvd2V2ZXIsCisgKiAgcHJlc3VtYWJseSBpZiBzb21lIHRoaXJkIHBhcnR5IGRpZCB3cml0ZSB0aGVpciBvd24gbGF1bmNoIGhlbHBlciwKKyAqICB0aGV5IHdvdWxkIGhhdmUgdG8gcmVseSBvbiB0aGVzZSwgb3IgYXQgbGVhc3QgYWx3YXlzIHJldHVybgorICogIDEgZm9yIEdFTkVSSUNfRkFJTFVSRS4KKyAqLworI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0dFTkVSSUNfRkFJTFVSRSAgICAgIDEKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlkgICAgICAgICAgICAyCisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfQ09ORklHX0lOVkFMSUQgICAgICAgMworI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX1NFVFVQX0ZBSUxFRCAgICAgICAgIDQKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9OQU1FX0lOVkFMSUQgICAgICAgICA1CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfU0VSVklDRV9OT1RfRk9VTkQgICAgNgorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQgIDcKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9GSUxFX0lOVkFMSUQgICAgICAgICA4CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfRVhFQ19GQUlMRUQgICAgICAgICAgOQorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0lOVkFMSURfQVJHUyAgICAgICAgIDEwCisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQgICAgICAgMTEKKworI2VuZGlmIC8qIEJVU19BQ1RJVkFUSU9OX0VYSVRfQ09ERVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2FjdGl2YXRpb24taGVscGVyLWJpbi5jIGIvZGJ1cy0xLjQuMTAvYnVzL2FjdGl2YXRpb24taGVscGVyLWJpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjBhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvYWN0aXZhdGlvbi1oZWxwZXItYmluLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgIFNldHVpZCBoZWxwZXIgZm9yIGxhdW5jaGluZyBwcm9ncmFtcyBhcyBhIGN1c3RvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuIFRoaXMgZmlsZSBpcyBzZWN1cml0eSBzZW5zaXRpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbnQKK2NvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlIChEQnVzRXJyb3IgKmVycm9yKQoreworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9OT19NRU1PUlk7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NPTkZJR19JTlZBTElEKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9DT05GSUdfSU5WQUxJRDsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVEKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVRVUF9GQUlMRUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfSU5WQUxJRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfU0VSVklDRV9OT1RfRk9VTkQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfRklMRV9JTlZBTElEOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfRVhFQ19GQUlMRUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfSU5WQUxJRF9BUkdTOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfQ0hJTERfU0lHTkFMRUQ7CisgIAorICAvKiBzaG91bGQgd2UgYXNzZXJ0PyAqLworICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgZXJyb3ItPm5hbWUsIGVycm9yLT5tZXNzYWdlKTsKKyAgCisgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX1NFVFVQX0ZBSUxFRDsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgaW50IHJldHZhbDsKKworICAvKiBkZWZhdWx0IGlzIGFsbCBva2F5ICovCisgIHJldHZhbCA9IDA7CisKKyAgLyogaGF2ZSB3ZSB1c2VkIGEgaGVscCBvcHRpb24gb3Igbm90IHNwZWNpZmllZCB0aGUgY29ycmVjdCBhcmd1bWVudHM/ICovCisgIGlmIChhcmdjICE9IDIgfHwKKyAgICAgIHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDAgfHwKKyAgICAgIHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCB8fAorICAgICAgc3RyY21wIChhcmd2WzFdLCAiLT8iKSA9PSAwKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXIgc2VydmljZS50by5hY3RpdmF0ZVxuIik7CisgICAgICAgIGV4aXQgKDApOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGlmICghcnVuX2xhdW5jaF9oZWxwZXIgKGFyZ3ZbMV0sICZlcnJvcikpCisgICAgeworICAgICAgLyogY29udmVydCBlcnJvciB0byBhbiBleGl0IGNvZGUgKi8KKyAgICAgIHJldHZhbCA9IGNvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlICgmZXJyb3IpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvYWN0aXZhdGlvbi1oZWxwZXIuYyBiL2RidXMtMS40LjEwL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmE4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvYWN0aXZhdGlvbi1oZWxwZXIuYwpAQCAtMCwwICsxLDU2MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBhY3RpdmF0aW9uLWhlbHBlci5jICBTZXR1aWQgaGVscGVyIGZvciBsYXVuY2hpbmcgcHJvZ3JhbXMgYXMgYSBjdXN0b20KKyAqICAgICAgICAgICAgICAgICAgICAgIHVzZXIuIFRoaXMgZmlsZSBpcyBzZWN1cml0eSBzZW5zaXRpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiZGVza3RvcC1maWxlLmgiCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci10cml2aWFsLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc2hlbGwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCitzdGF0aWMgQnVzRGVza3RvcEZpbGUgKgorZGVza3RvcF9maWxlX2Zvcl9uYW1lIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7CisgIERCdXNMaXN0ICoqc2VydmljZV9kaXJzOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIGNvbnN0IGNoYXIgKmRpcjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBkZXNrdG9wX2ZpbGUgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2FsbDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2ZpbGVuYW1lOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlbmFtZSwgbmFtZSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZW5hbWUsICIuc2VydmljZSIpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc2VydmljZV9kaXJzID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAocGFyc2VyKTsKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoc2VydmljZV9kaXJzKTsKKyAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoc2VydmljZV9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBkaXIgPSBsaW5rLT5kYXRhOworICAgICAgX2RidXNfdmVyYm9zZSAoIkxvb2tpbmcgYXQgJyVzJ1xuIiwgZGlyKTsKKworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICAgICAgLyogY2xlYXIgdGhlIHBhdGggZnJvbSBsYXN0IHRpbWUgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmZnVsbF9wYXRoLCAwKTsKKworICAgICAgLyogYnVpbGQgdGhlIGZ1bGwgcGF0aCAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCBkaXIpIHx8CisgICAgICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gbG9hZCBmaWxlICclcydcbiIsIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJmZ1bGxfcGF0aCkpOworICAgICAgZGVza3RvcF9maWxlID0gYnVzX2Rlc2t0b3BfZmlsZV9sb2FkICgmZnVsbF9wYXRoLCAmdG1wX2Vycm9yKTsKKyAgICAgIGlmIChkZXNrdG9wX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgbG9hZCAlczogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm5hbWUsIHRtcF9lcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIC8qIHdlIG1heSBoYXZlIGZhaWxlZCBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQ7IHRoaXMgaXMgbm90IGZhdGFsICovCisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgIC8qIHdlIG9ubHkgYmFpbCBvdXQgb24gT09NICovCisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgIH0KKworICAgICAgLyogZGlkIHdlIGZpbmQgdGhlIGRlc2t0b3AgZmlsZSB3ZSB3YW50PyAqLworICAgICAgaWYgKGRlc2t0b3BfZmlsZSAhPSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogRGlkbid0IGZpbmQgZGVza3RvcCBmaWxlOyBzZXQgZXJyb3IgKi8KKyAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJXMgd2FzIG5vdCBwcm92aWRlZCBieSBhbnkgLnNlcnZpY2UgZmlsZXMiLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIH0KKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CitvdXRfZmlsZW5hbWU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworb3V0X2FsbDoKKyAgcmV0dXJuIGRlc2t0b3BfZmlsZTsKK30KKworLyogQ2xlYXJlcyB0aGUgZW52aXJvbm1lbnQsIGV4Y2VwdCBmb3IgREJVU19WRVJCT1NFIGFuZCBEQlVTX1NUQVJURVJfeCAqLworc3RhdGljIGRidXNfYm9vbF90CitjbGVhcl9lbnZpcm9ubWVudCAoREJ1c0Vycm9yICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZGVidWdfZW52ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqc3RhcnRlcl9lbnYgPSBOVUxMOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIC8qIGFyZSB3ZSBkZWJ1Z2dpbmcgKi8KKyAgZGVidWdfZW52ID0gX2RidXNfZ2V0ZW52ICgiREJVU19WRVJCT1NFIik7CisjZW5kaWYKKworICAvKiB3ZSBzYXZlIHRoZSBzdGFydGVyICovCisgIHN0YXJ0ZXJfZW52ID0gX2RidXNfZ2V0ZW52ICgiREJVU19TVEFSVEVSX0FERFJFU1MiKTsKKworI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgLyogdG90YWxseSBjbGVhciB0aGUgZW52aXJvbm1lbnQgKi8KKyAgaWYgKCFfZGJ1c19jbGVhcmVudiAoKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY2xlYXIgZW52aXJvbm1lbnRcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIC8qIHJlc3RvcmUgdGhlIGRlYnVnZ2luZyBlbnZpcm9ubWVudCBzZXR0aW5nIGlmIHNldCAqLworICBpZiAoZGVidWdfZW52KQorICAgIF9kYnVzX3NldGVudiAoIkRCVVNfVkVSQk9TRSIsIGRlYnVnX2Vudik7CisjZW5kaWYKKworICAvKiByZXN0b3JlIHRoZSBzdGFydGVyICovCisgIGlmIChzdGFydGVyX2VudikKKyAgICBfZGJ1c19zZXRlbnYgKCJEQlVTX1NUQVJURVJfQUREUkVTUyIsIHN0YXJ0ZXJfZW52KTsKKworICAvKiBzZXQgdGhlIHR5cGUsIHdoaWNoIG11c3QgYmUgc3lzdGVtIGlmIHdlIGdvdCB0aGlzIGZhciAqLworICBfZGJ1c19zZXRlbnYgKCJEQlVTX1NUQVJURVJfQlVTX1RZUEUiLCAic3lzdGVtIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfcGVybWlzc2lvbnMgKGNvbnN0IGNoYXIgKmRidXNfdXNlciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgdWlkX3QgdWlkLCBldWlkOworICBzdHJ1Y3QgcGFzc3dkICpwdzsKKworICBwdyA9IE5VTEw7CisgIHVpZCA9IDA7CisgIGV1aWQgPSAwOworCisjaWZuZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorICAvKiBiYWlsIG91dCB1bmxlc3MgdGhlIGRidXMgdXNlciBpcyBpbnZva2luZyB0aGUgaGVscGVyICovCisgIHB3ID0gZ2V0cHduYW0oZGJ1c191c2VyKTsKKyAgaWYgKCFwdykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGZpbmQgdXNlciAnJXMnIiwgZGJ1c191c2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHVpZCA9IGdldHVpZCgpOworICBpZiAocHctPnB3X3VpZCAhPSB1aWQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbnZva2VkIGZyb20gdXNlciAnJXMnIiwgZGJ1c191c2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogYmFpbCBvdXQgdW5sZXNzIHdlIGFyZSBzZXR1aWQgdG8gdXNlciByb290ICovCisgIGV1aWQgPSBnZXRldWlkKCk7CisgIGlmIChldWlkICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIm5vdCBzZXR1aWQgcm9vdCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2VfbmFtZSAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjaGFyICpuYW1lX3RtcDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIHRyeSB0byBnZXQgTmFtZSAqLworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICAvKiB2ZXJpZnkgdGhhdCB0aGUgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgZmlsZSBzZXJ2aWNlIG5hbWUgKi8KKyAgaWYgKHN0cmNtcCAoc2VydmljZV9uYW1lLCBuYW1lX3RtcCkgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlICclcycgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWUiLCBuYW1lX3RtcCk7CisgICAgICBnb3RvIGZhaWxlZF9mcmVlOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCitmYWlsZWRfZnJlZToKKyAgLyogd2UgZG9uJ3QgcmV0dXJuIHRoZSBuYW1lLCBzbyBmcmVlIGl0IGhlcmUgKi8KKyAgZGJ1c19mcmVlIChuYW1lX3RtcCk7CitmYWlsZWQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X3BhcmFtZXRlcnNfZm9yX3NlcnZpY2UgKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICoqZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICoqdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKmV4ZWNfdG1wOworICBjaGFyICp1c2VyX3RtcDsKKworICBleGVjX3RtcCA9IE5VTEw7CisgIHVzZXJfdG1wID0gTlVMTDsKKworICAvKiBjaGVjayB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSAqLworICBpZiAoIWNoZWNrX3NlcnZpY2VfbmFtZSAoZGVza3RvcF9maWxlLCBzZXJ2aWNlX25hbWUsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICAvKiBnZXQgdGhlIGNvbXBsZXRlIHBhdGggb2YgdGhlIGV4ZWN1dGFibGUgKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0VYRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhlY190bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIGdldCB0aGUgdXNlciB0aGF0IHNob3VsZCBydW4gdGhpcyBzZXJ2aWNlIC0gdXNlciBpcyBjb21wdWxzYXJ5IGZvciBzeXN0ZW0gYWN0aXZhdGlvbiAqLworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfVVNFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogb25seSBhc3NpZ24gaWYgYWxsIHRoZSBjaGVja3MgcGFzc2VkICovCisgICpleGVjID0gZXhlY190bXA7CisgICp1c2VyID0gdXNlcl90bXA7CisgIHJldHVybiBUUlVFOworCitmYWlsZWQ6CisgIGRidXNfZnJlZSAoZXhlY190bXApOworICBkYnVzX2ZyZWUgKHVzZXJfdG1wKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N3aXRjaF91c2VyIChjaGFyICp1c2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgc3RydWN0IHBhc3N3ZCAqcHc7CisKKyAgLyogZmluZCB1c2VyICovCisgIHB3ID0gZ2V0cHduYW0gKHVzZXIpOworICBpZiAoIXB3KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVRVUF9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBmaW5kIHVzZXIgJyVzJ1xuIiwgdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGluaXRpYWxpemUgdGhlIGdyb3VwIGFjY2VzcyBsaXN0ICovCisgIGlmIChpbml0Z3JvdXBzICh1c2VyLCBwdy0+cHdfZ2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgaW5pdGlhbGl6ZSBncm91cHMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogY2hhbmdlIHRvIHRoZSBwcmltYXJ5IGdyb3VwIGZvciB0aGUgdXNlciAqLworICBpZiAoc2V0Z2lkIChwdy0+cHdfZ2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc2V0Z2lkIGdyb3VwICVpIiwgcHctPnB3X2dpZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGNoYW5nZSB0byB0aGUgdXNlciBzcGVjaWZpZWQgKi8KKyAgaWYgKHNldHVpZCAocHctPnB3X3VpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVRVUF9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzZXR1aWQgdXNlciAlaSIsIHB3LT5wd191aWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitleGVjX2Zvcl9jb3JyZWN0X3VzZXIgKGNoYXIgKmV4ZWMsIGNoYXIgKnVzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGNoYXIgKiphcmd2OworICBpbnQgYXJnYzsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIGFyZ2MgPSAwOworICByZXR2YWwgPSBUUlVFOworICBhcmd2ID0gTlVMTDsKKworICBpZiAoIXN3aXRjaF91c2VyICh1c2VyLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGNvbnZlcnQgY29tbWFuZCBpbnRvIGFyZ3VtZW50cyAqLworICBpZiAoIV9kYnVzX3NoZWxsX3BhcnNlX2FyZ3YgKGV4ZWMsICZhcmdjLCAmYXJndiwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTQorICAvKiByZXBsYWNlIHdpdGggbmV3IGJpbmFyeSwgd2l0aCBubyBlbnZpcm9ubWVudCAqLworICBpZiAoZXhlY3YgKGFyZ3ZbMF0sIGFyZ3YpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBleGVjOiAlcyIsIGFyZ3ZbMF0pOworICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgfQorI2VuZGlmCisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfYnVzX25hbWUgKGNvbnN0IGNoYXIgKmJ1c19uYW1lLAorICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgYnVzX25hbWUpOworICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAiYnVzIG5hbWUgJyVzJyBpcyBub3QgYSB2YWxpZCBidXMgbmFtZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X2NvcnJlY3RfcGFyc2VyIChCdXNDb25maWdQYXJzZXIgKipwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgY29uZmlnX2ZpbGU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqdGVzdF9jb25maWdfZmlsZTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgdGVzdF9jb25maWdfZmlsZSA9IE5VTEw7CisKKyNpZmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgLyogdGhlcmUgaXMgbm8gX3dheV8gd2Ugc2hvdWxkIGJlIHNldHVpZCBpZiB0aGlzIGRlZmluZSBpcyBzZXQuCisgICAqIGJ1dCB3ZSBzaG91bGQgYmUgZG91Ymx5IHBhcmFub2lkIGFuZCBjaGVjay4uLiAqLworICBpZiAoZ2V0dWlkKCkgIT0gZ2V0ZXVpZCgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCBiaW5hcnkgaXMgc2V0dWlkISIpOworCisgIC8qIHRoaXMgaXMgbm90IGEgc2VjdXJpdHkgaG9sZS4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG9ubHkgcGFzc2VkIGluIHRoZQorICAgKiBkYnVzLWRhZW1vbi1sYXVjaC1oZWxwZXItdGVzdCBOT04tU0VUVUlEIGxhdW5jaGVyICovCisgIHRlc3RfY29uZmlnX2ZpbGUgPSBfZGJ1c19nZXRlbnYgKCJURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIik7CisgIGlmICh0ZXN0X2NvbmZpZ19maWxlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAidGhlIFRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUcgZW52IHZhcmlhYmxlIGlzIG5vdCBzZXQiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyNlbmRpZgorCisgIC8qIHdlIF9vbmx5XyB1c2UgdGhlIHByZWRlZmluZWQgc3lzdGVtIGNvbmZpZyBmaWxlICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb25maWdfZmlsZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBEQlVTX1NZU1RFTV9DT05GSUdfRklMRSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2ZyZWVfY29uZmlnOworICAgIH0KKyNlbHNlCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCB0ZXN0X2NvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXRfZnJlZV9jb25maWc7CisgICAgfQorI2VuZGlmCisKKyAgLyogd2hlcmUgYXJlIHdlIHBvaW50aW5nLi4uLiAqLworICBfZGJ1c192ZXJib3NlICgiZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXI6IHVzaW5nIGNvbmZpZyBmaWxlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29uZmlnX2ZpbGUpKTsKKworICAvKiBnZXQgdGhlIGRidXMgdXNlciAqLworICAqcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkICgmY29uZmlnX2ZpbGUsIFRSVUUsIE5VTEwsIGVycm9yKTsKKyAgaWYgKCpwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBnb3RvIG91dF9mcmVlX2NvbmZpZzsKKyAgICB9CisKKyAgLyogd29vdCAqLworICByZXR2YWwgPSBUUlVFOworCitvdXRfZnJlZV9jb25maWc6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xhdW5jaF9idXNfbmFtZSAoY29uc3QgY2hhciAqYnVzX25hbWUsIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlOworICBjaGFyICpleGVjLCAqdXNlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIGV4ZWMgPSBOVUxMOworICB1c2VyID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogZ2V0IHRoZSBjb3JyZWN0IHNlcnZpY2UgZmlsZSBmb3IgdGhlIG5hbWUgd2UgYXJlIHRyeWluZyB0byBhY3RpdmF0ZSAqLworICBkZXNrdG9wX2ZpbGUgPSBkZXNrdG9wX2ZpbGVfZm9yX25hbWUgKHBhcnNlciwgYnVzX25hbWUsIGVycm9yKTsKKyAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBnZXQgZXhlYyBhbmQgdXNlciBmb3Igc2VydmljZSBuYW1lICovCisgIGlmICghZ2V0X3BhcmFtZXRlcnNfZm9yX3NlcnZpY2UgKGRlc2t0b3BfZmlsZSwgYnVzX25hbWUsICZleGVjLCAmdXNlciwgZXJyb3IpKQorICAgIGdvdG8gZmluaXNoOworCisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzLWRhZW1vbi1hY3RpdmF0aW9uLWhlbHBlcjogTmFtZT0nJXMnXG4iLCBidXNfbmFtZSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzLWRhZW1vbi1hY3RpdmF0aW9uLWhlbHBlcjogRXhlYz0nJXMnXG4iLCBleGVjKTsKKyAgX2RidXNfdmVyYm9zZSAoImRidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyOiBVc2VyPSclcydcbiIsIHVzZXIpOworCisgIC8qIGFjdHVhbGx5IGV4ZWN1dGUgKi8KKyAgaWYgKCFleGVjX2Zvcl9jb3JyZWN0X3VzZXIgKGV4ZWMsIHVzZXIsIGVycm9yKSkKKyAgICBnb3RvIGZpbmlzaDsKKworICByZXR2YWwgPSBUUlVFOworCitmaW5pc2g6CisgIGRidXNfZnJlZSAoZXhlYyk7CisgIGRidXNfZnJlZSAodXNlcik7CisgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAoZGVza3RvcF9maWxlKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19kYnVzX3VzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjb25zdCBjaGFyICpkYnVzX3VzZXI7CisKKyAgZGJ1c191c2VyID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKHBhcnNlcik7CisgIGlmIChkYnVzX3VzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ09ORklHX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBnZXQgdXNlciBmcm9tIGNvbmZpZyBmaWxlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIHBlcm1pc3Npb25zIGFyZSBjb3JyZWN0ICovCisgIGlmICghY2hlY2tfcGVybWlzc2lvbnMgKGRidXNfdXNlciwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK3J1bl9sYXVuY2hfaGVscGVyIChjb25zdCBjaGFyICpidXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBwYXJzZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBjbGVhciB0aGUgZW52aXJvbm1lbnQsIGFwYXJ0IGZyb20gYSBmZXcgc2VsZWN0IHNldHRpbmdzICovCisgIGlmICghY2xlYXJfZW52aXJvbm1lbnQgKGVycm9yKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYnVzIG5hbWUgKi8KKyAgaWYgKCFjaGVja19idXNfbmFtZSAoYnVzX25hbWUsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGdldCB0aGUgY29ycmVjdCBwYXJzZXIsIGVpdGhlciB0aGUgdGVzdCBvciBkZWZhdWx0IHBhcnNlciAqLworICBpZiAoIWdldF9jb3JyZWN0X3BhcnNlciAoJnBhcnNlciwgZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogY2hlY2sgd2UgYXJlIGJlaW5nIGludm9rZWQgYnkgdGhlIGNvcnJlY3QgZGJ1cyB1c2VyICovCisgIGlmICghY2hlY2tfZGJ1c191c2VyIChwYXJzZXIsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yX2ZyZWVfcGFyc2VyOworCisgIC8qIGxhdW5jaCB0aGUgYnVzIHdpdGggdGhlIHNlcnZpY2UgZGVmaW5lZCB1c2VyICovCisgIGlmICghbGF1bmNoX2J1c19uYW1lIChidXNfbmFtZSwgcGFyc2VyLCBlcnJvcikpCisgICAgZ290byBlcnJvcl9mcmVlX3BhcnNlcjsKKworICAvKiB3b29ob28hICovCisgIHJldHZhbCA9IFRSVUU7CisKK2Vycm9yX2ZyZWVfcGFyc2VyOgorICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKK2Vycm9yOgorICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvYWN0aXZhdGlvbi1oZWxwZXIuaCBiL2RidXMtMS40LjEwL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWE0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvYWN0aXZhdGlvbi1oZWxwZXIuaApAQCAtMCwwICsxLDMxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGFjdGl2YXRpb24taGVscGVyLmggIFRoZSBhY3R1YWwgYWN0aXZhdGlvbiBoZWxwZXIgc3BsaXQgZnJvbSB0aGUgbWFpbgorICogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9yIHRlc3RpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQUNUSVZBVElPTl9IRUxQRVJfSAorI2RlZmluZSBCVVNfQUNUSVZBVElPTl9IRUxQRVJfSAorCitkYnVzX2Jvb2xfdCBydW5fbGF1bmNoX2hlbHBlciAoY29uc3QgY2hhciAqYnVzX25hbWUsIERCdXNFcnJvciAqZXJyb3IpOworCisKKyNlbmRpZiAvKiBCVVNfQUNUSVZBVElPTl9IRUxQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2FjdGl2YXRpb24uYyBiL2RidXMtMS40LjEwL2J1cy9hY3RpdmF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3N2QwMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9hY3RpdmF0aW9uLmMKQEAgLTAsMCArMSwyNTg1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGFjdGl2YXRpb24uYyAgQWN0aXZhdGlvbiBvZiBzZXJ2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0ICBJbWVuZGlvIEhCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24tZXhpdC1jb2Rlcy5oIgorI2luY2x1ZGUgImRlc2t0b3AtZmlsZS5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaGVsbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zcGF3bi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aW1lb3V0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKK3N0cnVjdCBCdXNBY3RpdmF0aW9uCit7CisgIGludCByZWZjb3VudDsKKyAgREJ1c0hhc2hUYWJsZSAqZW50cmllczsKKyAgREJ1c0hhc2hUYWJsZSAqcGVuZGluZ19hY3RpdmF0aW9uczsKKyAgY2hhciAqc2VydmVyX2FkZHJlc3M7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIGludCBuX3BlbmRpbmdfYWN0aXZhdGlvbnM7IC8qKjwgVGhpcyBpcyBpbiBmYWN0IHRoZSBudW1iZXIgb2YgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaS5lLiBudW1iZXIgb2YgcGVuZGluZyBhY3RpdmF0aW9uIHJlcXVlc3RzLCBub3QgcGVuZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhY3RpdmF0aW9ucyBwZXIgc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNIYXNoVGFibGUgKmRpcmVjdG9yaWVzOworICBEQnVzSGFzaFRhYmxlICplbnZpcm9ubWVudDsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCByZWZjb3VudDsKKyAgY2hhciAqZGlyX2M7CisgIERCdXNIYXNoVGFibGUgKmVudHJpZXM7Cit9IEJ1c1NlcnZpY2VEaXJlY3Rvcnk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCByZWZjb3VudDsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZXhlYzsKKyAgY2hhciAqdXNlcjsKKyAgY2hhciAqc3lzdGVtZF9zZXJ2aWNlOworICB1bnNpZ25lZCBsb25nIG10aW1lOworICBCdXNTZXJ2aWNlRGlyZWN0b3J5ICpzX2RpcjsKKyAgY2hhciAqZmlsZW5hbWU7Cit9IEJ1c0FjdGl2YXRpb25FbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5OworCitzdHJ1Y3QgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeQoreworICBEQnVzTWVzc2FnZSAqYWN0aXZhdGlvbl9tZXNzYWdlOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBkYnVzX2Jvb2xfdCBhdXRvX2FjdGl2YXRpb247Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgcmVmY291bnQ7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGNoYXIgKnNlcnZpY2VfbmFtZTsKKyAgY2hhciAqZXhlYzsKKyAgY2hhciAqc3lzdGVtZF9zZXJ2aWNlOworICBEQnVzTGlzdCAqZW50cmllczsKKyAgaW50IG5fZW50cmllczsKKyAgREJ1c0JhYnlzaXR0ZXIgKmJhYnlzaXR0ZXI7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworICB1bnNpZ25lZCBpbnQgdGltZW91dF9hZGRlZCA6IDE7Cit9IEJ1c1BlbmRpbmdBY3RpdmF0aW9uOworCisjaWYgMAorc3RhdGljIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKgorYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3JlZiAoQnVzU2VydmljZURpcmVjdG9yeSAqZGlyKQoreworICBfZGJ1c19hc3NlcnQgKGRpci0+cmVmY291bnQpOworCisgIGRpci0+cmVmY291bnQrKzsKKworICByZXR1cm4gZGlyOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitidXNfc2VydmljZV9kaXJlY3RvcnlfdW5yZWYgKEJ1c1NlcnZpY2VEaXJlY3RvcnkgKmRpcikKK3sKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGRpci0+cmVmY291bnQgPiAwKTsKKyAgZGlyLT5yZWZjb3VudC0tOworCisgIGlmIChkaXItPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGRpci0+ZW50cmllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkaXItPmVudHJpZXMpOworCisgIGRidXNfZnJlZSAoZGlyLT5kaXJfYyk7CisgIGRidXNfZnJlZSAoZGlyKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAoQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqZW50cnkpCit7CisgIGlmIChlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSk7CisKKyAgaWYgKGVudHJ5LT5jb25uZWN0aW9uKQorICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZW50cnktPmNvbm5lY3Rpb24pOworCisgIGRidXNfZnJlZSAoZW50cnkpOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3RpbWVvdXRfY2FsbGJhY2sgKERCdXNUaW1lb3V0ICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgd2hpbGUgKCFkYnVzX3RpbWVvdXRfaGFuZGxlIChwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQpKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKK30KKworc3RhdGljIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICoKK2J1c19wZW5kaW5nX2FjdGl2YXRpb25fcmVmIChCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKTsKKyAgcGVuZGluZ19hY3RpdmF0aW9uLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwZW5kaW5nX2FjdGl2YXRpb247Cit9CisKK3N0YXRpYyB2b2lkCitidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uID09IE5VTEwpIC8qIGhhc2ggdGFibGUgcmVxdWlyZXMgdGhpcyAqLworICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKTsKKyAgcGVuZGluZ19hY3RpdmF0aW9uLT5yZWZjb3VudCAtPSAxOworCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dF9hZGRlZCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90aW1lb3V0X2NhbGxiYWNrLCBwZW5kaW5nX2FjdGl2YXRpb24pOworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0X2FkZGVkID0gRkFMU0U7CisgICAgfQorCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQpCisgICAgX2RidXNfdGltZW91dF91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KTsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfYmFieXNpdHRlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcik7CisgICAgfQorCisgIGRidXNfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUpOworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbi0+ZXhlYyk7CisgIGRidXNfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzKTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKworICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeV9mcmVlIChlbnRyeSk7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIGxpbmspOworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisKKyAgcGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5uX3BlbmRpbmdfYWN0aXZhdGlvbnMgLT0KKyAgICBwZW5kaW5nX2FjdGl2YXRpb24tPm5fZW50cmllczsKKworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zID49IDApOworCisgIGRidXNfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uKTsKK30KKworc3RhdGljIEJ1c0FjdGl2YXRpb25FbnRyeSAqCitidXNfYWN0aXZhdGlvbl9lbnRyeV9yZWYgKEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnkpCit7CisgIF9kYnVzX2Fzc2VydCAoZW50cnktPnJlZmNvdW50ID4gMCk7CisgIGVudHJ5LT5yZWZjb3VudCsrOworCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIHZvaWQKK2J1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmIChCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5KQoreworICBpZiAoZW50cnkgPT0gTlVMTCkgLyogaGFzaCB0YWJsZSByZXF1aXJlcyB0aGlzICovCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoZW50cnktPnJlZmNvdW50ID4gMCk7CisgIGVudHJ5LT5yZWZjb3VudC0tOworCisgIGlmIChlbnRyeS0+cmVmY291bnQgPiAwKQorICAgIHJldHVybjsKKworICBkYnVzX2ZyZWUgKGVudHJ5LT5uYW1lKTsKKyAgZGJ1c19mcmVlIChlbnRyeS0+ZXhlYyk7CisgIGRidXNfZnJlZSAoZW50cnktPnVzZXIpOworICBkYnVzX2ZyZWUgKGVudHJ5LT5maWxlbmFtZSk7CisgIGRidXNfZnJlZSAoZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisKKyAgZGJ1c19mcmVlIChlbnRyeSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordXBkYXRlX2Rlc2t0b3BfZmlsZV9lbnRyeSAoQnVzQWN0aXZhdGlvbiAgICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNEZXNrdG9wRmlsZSAgICAgICpkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAqbmFtZSwgKmV4ZWMsICp1c2VyLCAqZXhlY190bXAsICpzeXN0ZW1kX3NlcnZpY2U7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIERCdXNTdGF0IHN0YXRfYnVmOworICBEQnVzU3RyaW5nIGZpbGVfcGF0aDsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG5hbWUgPSBOVUxMOworICBleGVjID0gTlVMTDsKKyAgdXNlciA9IE5VTEw7CisgIGV4ZWNfdG1wID0gTlVMTDsKKyAgZW50cnkgPSBOVUxMOworICBzeXN0ZW1kX3NlcnZpY2UgPSBOVUxMOworCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZV9wYXRoLCBzX2Rpci0+ZGlyX2MpIHx8CisgICAgICAhX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZpbGVfcGF0aCwgZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdGF0ICgmZmlsZV9wYXRoLCAmc3RhdF9idWYsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHN0YXQgdGhlIHNlcnZpY2UgZmlsZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfRVhFQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGVjX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKworICBleGVjID0gX2RidXNfc3RyZHVwIChfZGJ1c19yZXBsYWNlX2luc3RhbGxfcHJlZml4IChleGVjX3RtcCkpOworICBkYnVzX2ZyZWUgKGV4ZWNfdG1wKTsKKyAgZXhlY190bXAgPSBOVUxMOworCisgIC8qIHVzZXIgaXMgbm90IF9yZXF1aXJlZF8gdW5sZXNzIHdlIGFyZSB1c2luZyBzeXN0ZW0gYWN0aXZhdGlvbiAqLworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfVVNFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLCAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgIC8qIGlmIHdlIGdvdCBPT00sIHRoZW4gZXhpdCAqLworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpZiB3ZSBoYXZlIGVycm9yIGJlY2F1c2Ugd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgdGhlbiBjb250aW51ZSAqLworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgZGJ1c19mcmVlICh1c2VyKTsKKyAgICAgICAgICB1c2VyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKworICAvKiBzeXN0ZW1kIHNlcnZpY2UgaXMgbmV2ZXIgcmVxdWlyZWQgKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NZU1RFTURfU0VSVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeXN0ZW1kX3NlcnZpY2UsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgLyogaWYgd2UgZ290IE9PTSwgdGhlbiBleGl0ICovCisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGlmIHdlIGhhdmUgZXJyb3IgYmVjYXVzZSB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGVuIGNvbnRpbnVlICovCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHN5c3RlbWRfc2VydmljZSk7CisgICAgICAgICAgc3lzdGVtZF9zZXJ2aWNlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworCisgIGVudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzX2Rpci0+ZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkgLyogTmV3IGZpbGUgKi8KKyAgICB7CisgICAgICAvKiBGSVhNRSB3ZSBuZWVkIGEgYmV0dGVyLWRlZmluZWQgYWxnb3JpdGhtIGZvciB3aGljaCBzZXJ2aWNlIGZpbGUgdG8KKyAgICAgICAqIHBpY2sgdGhhbiAid2hpY2hldmVyIG9uZSBpcyBmaXJzdCBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmciCisgICAgICAgKi8KKyAgICAgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgJXMgYWxyZWFkeSBleGlzdHMgaW4gYWN0aXZhdGlvbiBlbnRyeSBsaXN0XG4iLCBuYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBlbnRyeSA9IGRidXNfbmV3MCAoQnVzQWN0aXZhdGlvbkVudHJ5LCAxKTsKKyAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBlbnRyeS0+bmFtZSA9IG5hbWU7CisgICAgICBlbnRyeS0+ZXhlYyA9IGV4ZWM7CisgICAgICBlbnRyeS0+dXNlciA9IHVzZXI7CisgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlID0gc3lzdGVtZF9zZXJ2aWNlOworICAgICAgZW50cnktPnJlZmNvdW50ID0gMTsKKworICAgICAgLyogb3duZXJzaGlwIGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIGVudHJ5LCBkbyBub3QgZnJlZSBzZXBhcmF0ZWx5ICovCisgICAgICBuYW1lID0gTlVMTDsKKyAgICAgIGV4ZWMgPSBOVUxMOworICAgICAgdXNlciA9IE5VTEw7CisgICAgICBzeXN0ZW1kX3NlcnZpY2UgPSBOVUxMOworCisgICAgICBlbnRyeS0+c19kaXIgPSBzX2RpcjsKKyAgICAgIGVudHJ5LT5maWxlbmFtZSA9IF9kYnVzX3N0cmR1cCAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSkpOworICAgICAgaWYgKCFlbnRyeS0+ZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBlbnRyeS0+bmFtZSwgYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmIChlbnRyeSkpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoc19kaXItPmVudHJpZXMsIGVudHJ5LT5maWxlbmFtZSwgYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmIChlbnRyeSkpKQorICAgICAgICB7CisgICAgICAgICAgLyogUmV2ZXJ0IHRoZSBpbnNlcnRpb24gaW4gdGhlIGVudHJpZXMgdGFibGUgKi8KKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIGVudHJ5LT5uYW1lKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRlZCBcIiVzXCIgdG8gbGlzdCBvZiBzZXJ2aWNlc1xuIiwgZW50cnktPm5hbWUpOworICAgIH0KKyAgZWxzZSAvKiBKdXN0IHVwZGF0ZSB0aGUgZW50cnkgKi8KKyAgICB7CisgICAgICBidXNfYWN0aXZhdGlvbl9lbnRyeV9yZWYgKGVudHJ5KTsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgZW50cnktPm5hbWUpOworCisgICAgICBpZiAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaGUgbmV3IHNlcnZpY2UgbmFtZSBcIiVzXCIgb2Ygc2VydmljZSBmaWxlIFwiJXNcIiBhbHJlYWR5IGluIGNhY2hlLCBpZ25vcmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBvd25lcnNoaXAgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gZW50cnksIGRvIG5vdCBmcmVlIHNlcGFyYXRlbHkgKi8KKyAgICAgIGRidXNfZnJlZSAoZW50cnktPm5hbWUpOworICAgICAgZW50cnktPm5hbWUgPSBuYW1lOworICAgICAgbmFtZSA9IE5VTEw7CisKKyAgICAgIGRidXNfZnJlZSAoZW50cnktPmV4ZWMpOworICAgICAgZW50cnktPmV4ZWMgPSBleGVjOworICAgICAgZXhlYyA9IE5VTEw7CisKKyAgICAgIGRidXNfZnJlZSAoZW50cnktPnVzZXIpOworICAgICAgZW50cnktPnVzZXIgPSB1c2VyOworICAgICAgdXNlciA9IE5VTEw7CisKKyAgICAgIGRidXNfZnJlZSAoZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlID0gc3lzdGVtZF9zZXJ2aWNlOworICAgICAgc3lzdGVtZF9zZXJ2aWNlID0gTlVMTDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPm5hbWUsIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3JlZihlbnRyeSkpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAvKiBBbHNvIHJlbW92ZSBwYXRoIHRvIGVudHJpZXMgaGFzaCBzaW5jZSB3ZSB3YW50IHRoaXMgaW4gc3luYyB3aXRoCisgICAgICAgICAgICogdGhlIGVudHJpZXMgaGFzaCB0YWJsZSAqLworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoZW50cnktPnNfZGlyLT5lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmZpbGVuYW1lKTsKKyAgICAgICAgICBidXNfYWN0aXZhdGlvbl9lbnRyeV91bnJlZiAoZW50cnkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBlbnRyeS0+bXRpbWUgPSBzdGF0X2J1Zi5tdGltZTsKKyAgcmV0dmFsID0gVFJVRTsKKworb3V0OgorICAvKiBpZiB0aGVzZSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgaW50byBlbnRyeSwgdGhlIHZhcmlhYmxlcyB3aWxsIGJlIE5VTEwgKi8KKyAgZGJ1c19mcmVlIChuYW1lKTsKKyAgZGJ1c19mcmVlIChleGVjKTsKKyAgZGJ1c19mcmVlICh1c2VyKTsKKyAgZGJ1c19mcmVlIChzeXN0ZW1kX3NlcnZpY2UpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVfcGF0aCk7CisKKyAgaWYgKGVudHJ5KQorICAgIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmIChlbnRyeSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2VfZmlsZSAoQnVzQWN0aXZhdGlvbiAgICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQnVzQWN0aXZhdGlvbkVudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgIEJ1c0FjdGl2YXRpb25FbnRyeSAqKnVwZGF0ZWRfZW50cnksCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RhdCBzdGF0X2J1ZjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNBY3RpdmF0aW9uRW50cnkgKnRtcF9lbnRyeTsKKyAgREJ1c1N0cmluZyBmaWxlX3BhdGg7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgdG1wX2VudHJ5ID0gZW50cnk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgZW50cnktPmZpbGVuYW1lKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZV9wYXRoKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlX3BhdGgsIGVudHJ5LT5zX2Rpci0+ZGlyX2MpIHx8CisgICAgICAhX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZpbGVfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdGF0ICgmZmlsZV9wYXRoLCAmc3RhdF9idWYsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKioqKiogQ2FuJ3Qgc3RhdCBmaWxlIFwiJXNcIiwgcmVtb3ZpbmcgZnJvbSBjYWNoZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVfcGF0aCkpOworCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIGVudHJ5LT5uYW1lKTsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoZW50cnktPnNfZGlyLT5lbnRyaWVzLCBlbnRyeS0+ZmlsZW5hbWUpOworCisgICAgICB0bXBfZW50cnkgPSBOVUxMOworICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChzdGF0X2J1Zi5tdGltZSA+IGVudHJ5LT5tdGltZSkKKyAgICAgICAgeworICAgICAgICAgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7CisgICAgICAgICAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKworICAgICAgICAgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisKKyAgICAgICAgICBkZXNrdG9wX2ZpbGUgPSBidXNfZGVza3RvcF9maWxlX2xvYWQgKCZmaWxlX3BhdGgsICZ0bXBfZXJyb3IpOworICAgICAgICAgIGlmIChkZXNrdG9wX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkIG5vdCBsb2FkICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZV9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQHRvZG8gV2UgY2FuIHJldHVybiBPT00gb3IgYSBEQlVTX0VSUk9SX0ZBSUxFRCBlcnJvcgorICAgICAgICAgICAqICAgICAgIEhhbmRsZSB0aGVzZSBib3RoIGJldHRlcgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghdXBkYXRlX2Rlc2t0b3BfZmlsZV9lbnRyeSAoYWN0aXZhdGlvbiwgZW50cnktPnNfZGlyLCAmZmlsZW5hbWUsIGRlc2t0b3BfZmlsZSwgJnRtcF9lcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAoZGVza3RvcF9maWxlKTsKKyAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAoZGVza3RvcF9maWxlKTsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICB9CisgICAgfQorCitvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZV9wYXRoKTsKKworICBpZiAodXBkYXRlZF9lbnRyeSAhPSBOVUxMKQorICAgICp1cGRhdGVkX2VudHJ5ID0gdG1wX2VudHJ5OworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qIHdhcm5pbmc6IHRoaXMgZG9lc24ndCBmdWxseSAidW5kbyIgaXRzZWxmIG9uIGZhaWx1cmUsIGkuZS4gZG9lc24ndCBzdHJpcAorICogaGFzaCBlbnRyaWVzIGl0IGFscmVhZHkgYWRkZWQuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAordXBkYXRlX2RpcmVjdG9yeSAoQnVzQWN0aXZhdGlvbiAgICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNEaXJJdGVyICppdGVyOworICBEQnVzU3RyaW5nIGRpciwgZmlsZW5hbWU7CisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeTsKKyAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaXRlciA9IE5VTEw7CisgIGRlc2t0b3BfZmlsZSA9IE5VTEw7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZkaXIsIHNfZGlyLT5kaXJfYyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIGZyb20gdGhpcyBwb2ludCBpdCdzIHNhZmUgdG8gImdvdG8gb3V0IiAqLworCisgIGl0ZXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJmRpciwgZXJyb3IpOworICBpZiAoaXRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gb3BlbiBkaXJlY3RvcnkgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgc19kaXItPmRpcl9jLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPyBlcnJvci0+bWVzc2FnZSA6ICJ1bmtub3duIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogTm93IHJlYWQgdGhlIGZpbGVzICovCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoaXRlciwgJmZpbGVuYW1lLCAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJnRtcF9lcnJvcikpOworCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmZ1bGxfcGF0aCwgMCk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZpbGVuYW1lLCAiLnNlcnZpY2UiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLnNlcnZpY2UgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGVudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzX2Rpci0+ZW50cmllcywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgIGlmIChlbnRyeSkgLyogQWxyZWFkeSBoYXMgdGhpcyBzZXJ2aWNlIGZpbGUgaW4gdGhlIGNhY2hlICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfZmlsZSAoYWN0aXZhdGlvbiwgZW50cnksIE5VTEwsIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCBzX2Rpci0+ZGlyX2MpIHx8CisgICAgICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIE5ldyBmaWxlICovCisgICAgICBkZXNrdG9wX2ZpbGUgPSBidXNfZGVza3RvcF9maWxlX2xvYWQgKCZmdWxsX3BhdGgsICZ0bXBfZXJyb3IpOworICAgICAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkIG5vdCBsb2FkICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogQHRvZG8gV2UgY2FuIHJldHVybiBPT00gb3IgYSBEQlVTX0VSUk9SX0ZBSUxFRCBlcnJvcgorICAgICAgICogICAgICAgSGFuZGxlIHRoZXNlIGJvdGggYmV0dGVyCisgICAgICAgKi8KKyAgICAgIGlmICghdXBkYXRlX2Rlc2t0b3BfZmlsZV9lbnRyeSAoYWN0aXZhdGlvbiwgc19kaXIsICZmaWxlbmFtZSwgZGVza3RvcF9maWxlLCAmdG1wX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAoZGVza3RvcF9maWxlKTsKKyAgICAgICAgICBkZXNrdG9wX2ZpbGUgPSBOVUxMOworCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkIG5vdCBhZGQgJXMgdG8gYWN0aXZhdGlvbiBlbnRyeSBsaXN0OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLCB0bXBfZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgZGVza3RvcF9maWxlID0gTlVMTDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmICghcmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgZWxzZQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChpdGVyICE9IE5VTEwpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChpdGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3BvcHVsYXRlX2Vudmlyb25tZW50IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uKQoreworICBEQnVzU3RyaW5nICAga2V5OworICBEQnVzU3RyaW5nICAgdmFsdWU7CisgIGludCAgICAgICAgICBpOworICBjaGFyICAgICAgICoqZW52aXJvbm1lbnQ7CisgIGRidXNfYm9vbF90ICByZXR2YWwgPSBGQUxTRTsKKworICBlbnZpcm9ubWVudCA9IF9kYnVzX2dldF9lbnZpcm9ubWVudCAoKTsKKworICBpZiAoZW52aXJvbm1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleSkpCisgICAgeworICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnZhbHVlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGVudmlyb25tZW50W2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZrZXksIGVudmlyb25tZW50W2ldKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfc3BsaXRfb25fYnl0ZSAoJmtleSwgJz0nLCAmdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqaGFzaF9rZXksICpoYXNoX3ZhbHVlOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmtleSwgJmhhc2hfa2V5KSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnZhbHVlLCAmaGFzaF92YWx1ZSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9rZXksIGhhc2hfdmFsdWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgma2V5LCAwKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmdmFsdWUsIDApOworICAgIH0KKworICBpZiAoZW52aXJvbm1lbnRbaV0gIT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworb3V0OgorCisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ2YWx1ZSk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudmlyb25tZW50KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fcmVsb2FkIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgKipkaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBEQnVzTGlzdCAgICAgICpsaW5rOworICBjaGFyICAgICAgICAgICpkaXI7CisKKyAgaWYgKGFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzICE9IE5VTEwpCisgICAgZGJ1c19mcmVlIChhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcyk7CisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoYWRkcmVzcywgJmFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChhY3RpdmF0aW9uLT5lbnRyaWVzICE9IE5VTEwpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIGFjdGl2YXRpb24tPmVudHJpZXMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWJ1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmKTsKKyAgaWYgKGFjdGl2YXRpb24tPmVudHJpZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChhY3RpdmF0aW9uLT5kaXJlY3RvcmllcyAhPSBOVUxMKQorICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGFjdGl2YXRpb24tPmRpcmVjdG9yaWVzKTsKKyAgYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3VucmVmKTsKKworICBpZiAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChkaXJlY3Rvcmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzU2VydmljZURpcmVjdG9yeSAqc19kaXI7CisKKyAgICAgIGRpciA9IF9kYnVzX3N0cmR1cCAoKGNvbnN0IGNoYXIgKikgbGluay0+ZGF0YSk7CisgICAgICBpZiAoIWRpcikKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgc19kaXIgPSBkYnVzX25ldzAgKEJ1c1NlcnZpY2VEaXJlY3RvcnksIDEpOworICAgICAgaWYgKCFzX2RpcikKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoZGlyKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIHNfZGlyLT5yZWZjb3VudCA9IDE7CisgICAgICBzX2Rpci0+ZGlyX2MgPSBkaXI7CisKKyAgICAgIHNfZGlyLT5lbnRyaWVzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbilidXNfYWN0aXZhdGlvbl9lbnRyeV91bnJlZik7CisKKyAgICAgIGlmICghc19kaXItPmVudHJpZXMpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfc2VydmljZV9kaXJlY3RvcnlfdW5yZWYgKHNfZGlyKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChhY3RpdmF0aW9uLT5kaXJlY3Rvcmllcywgc19kaXItPmRpcl9jLCBzX2RpcikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfc2VydmljZV9kaXJlY3RvcnlfdW5yZWYgKHNfZGlyKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIC8qIG9ubHkgZmFpbCBvbiBPT00sIGl0IGlzIG9rIGlmIHdlIGNhbid0IHJlYWQgdGhlIGRpcmVjdG9yeSAqLworICAgICAgaWYgKCF1cGRhdGVfZGlyZWN0b3J5IChhY3RpdmF0aW9uLCBzX2RpciwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChkaXJlY3RvcmllcywgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworIGZhaWxlZDoKKyAgcmV0dXJuIEZBTFNFOworfQorCitCdXNBY3RpdmF0aW9uKgorYnVzX2FjdGl2YXRpb25fbmV3IChCdXNDb250ZXh0ICAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgKipkaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworICBEQnVzTGlzdCAgICAgICpsaW5rOworICBjaGFyICAgICAgICAgICpkaXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgYWN0aXZhdGlvbiA9IGRidXNfbmV3MCAoQnVzQWN0aXZhdGlvbiwgMSk7CisgIGlmIChhY3RpdmF0aW9uID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBhY3RpdmF0aW9uLT5yZWZjb3VudCA9IDE7CisgIGFjdGl2YXRpb24tPmNvbnRleHQgPSBjb250ZXh0OworICBhY3RpdmF0aW9uLT5uX3BlbmRpbmdfYWN0aXZhdGlvbnMgPSAwOworCisgIGlmICghYnVzX2FjdGl2YXRpb25fcmVsb2FkIChhY3RpdmF0aW9uLCBhZGRyZXNzLCBkaXJlY3RvcmllcywgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgICAvKiBJbml0aWFsaXplIHRoaXMgaGFzaCB0YWJsZSBvbmNlLCB3ZSBkb24ndCB3YW50IHRvIGxvc2UgcGVuZGluZworICAgKiBhY3RpdmF0aW9ucyBvbiByZWxvYWQuICovCisgIGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbilidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmKTsKKworICBpZiAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucyA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pIGRidXNfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pIGRidXNfZnJlZSk7CisKKyAgaWYgKGFjdGl2YXRpb24tPmVudmlyb25tZW50ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIXBvcHVsYXRlX2Vudmlyb25tZW50IChhY3RpdmF0aW9uKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHVybiBhY3RpdmF0aW9uOworCisgZmFpbGVkOgorICBidXNfYWN0aXZhdGlvbl91bnJlZiAoYWN0aXZhdGlvbik7CisgIHJldHVybiBOVUxMOworfQorCitCdXNBY3RpdmF0aW9uICoKK2J1c19hY3RpdmF0aW9uX3JlZiAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0IChhY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApOworCisgIGFjdGl2YXRpb24tPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGFjdGl2YXRpb247Cit9CisKK3ZvaWQKK2J1c19hY3RpdmF0aW9uX3VucmVmIChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKGFjdGl2YXRpb24tPnJlZmNvdW50ID4gMCk7CisKKyAgYWN0aXZhdGlvbi0+cmVmY291bnQgLT0gMTsKKworICBpZiAoYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKQorICAgIHJldHVybjsKKworICBkYnVzX2ZyZWUgKGFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzKTsKKyAgaWYgKGFjdGl2YXRpb24tPmVudHJpZXMpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIGlmIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zKQorICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMpOworICBpZiAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMpOworICBpZiAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQpOworCisgIGRidXNfZnJlZSAoYWN0aXZhdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2J1c19lbnZpcm9ubWVudCAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICp0eXBlOworCisgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1RBUlRFUl9BRERSRVNTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICB0eXBlID0gYnVzX2NvbnRleHRfZ2V0X3R5cGUgKGFjdGl2YXRpb24tPmNvbnRleHQpOworICBpZiAodHlwZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQlVTX1NUQVJURVJfQlVTX1RZUEUiLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoc3RyY21wICh0eXBlLCAic2Vzc2lvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHlwZSwgInN5c3RlbSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1lTVEVNX0JVU19BRERSRVNTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbjsKKyAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKmhhc2hfZW50cnk7Cit9IFJlc3RvcmVQZW5kaW5nRGF0YTsKKworc3RhdGljIHZvaWQKK3Jlc3RvcmVfcGVuZGluZyAodm9pZCAqZGF0YSkKK3sKKyAgUmVzdG9yZVBlbmRpbmdEYXRhICpkID0gZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChkLT5oYXNoX2VudHJ5ICE9IE5VTEwpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZXN0b3JpbmcgcGVuZGluZyBhY3RpdmF0aW9uIGZvciBzZXJ2aWNlICVzLCBoYXMgdGltZW91dCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBkLT5wZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgZC0+cGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0X2FkZGVkKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkIChkLT5wZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmhhc2hfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lLCBkLT5wZW5kaW5nX2FjdGl2YXRpb24pOworCisgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fcmVmIChkLT5wZW5kaW5nX2FjdGl2YXRpb24pOworCisgIGQtPmhhc2hfZW50cnkgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9wZW5kaW5nX3Jlc3RvcmVfZGF0YSAodm9pZCAqZGF0YSkKK3sKKyAgUmVzdG9yZVBlbmRpbmdEYXRhICpkID0gZGF0YTsKKworICBpZiAoZC0+aGFzaF9lbnRyeSkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5IChkLT5wZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+aGFzaF9lbnRyeSk7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAoZC0+cGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBkYnVzX2ZyZWUgKGQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9yZXN0b3JlX3BlbmRpbmdfdG9fdHJhbnNhY3Rpb24gKEJ1c1RyYW5zYWN0aW9uICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIFJlc3RvcmVQZW5kaW5nRGF0YSAqZDsKKworICBkID0gZGJ1c19uZXcgKFJlc3RvcmVQZW5kaW5nRGF0YSwgMSk7CisgIGlmIChkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQtPnBlbmRpbmdfYWN0aXZhdGlvbiA9IHBlbmRpbmdfYWN0aXZhdGlvbjsKKyAgZC0+aGFzaF9lbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucyk7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9yZWYgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgaWYgKGQtPmhhc2hfZW50cnkgPT0gTlVMTCB8fAorICAgICAgIWJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKHRyYW5zYWN0aW9uLCByZXN0b3JlX3BlbmRpbmcsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9wZW5kaW5nX3Jlc3RvcmVfZGF0YSkpCisgICAgeworICAgICAgZnJlZV9wZW5kaW5nX3Jlc3RvcmVfZGF0YSAoZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTYXZlZCBwZW5kaW5nIGFjdGl2YXRpb24gdG8gYmUgcmVzdG9yZWQgaWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCAoQnVzQWN0aXZhdGlvbiAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogQ2hlY2sgaWYgaXQncyBhIHBlbmRpbmcgYWN0aXZhdGlvbiAqLworICBwZW5kaW5nX2FjdGl2YXRpb24gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsIHNlcnZpY2VfbmFtZSk7CisKKyAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb24pCisgICAgcmV0dXJuIFRSVUU7CisKKyAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiU3VjY2Vzc2Z1bGx5IGFjdGl2YXRlZCBzZXJ2aWNlICclcyciLAorICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKworICAgICAgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChlbnRyeS0+Y29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBPbmx5IHNlbmQgYWN0aXZhdGlvbiByZXBsaWVzIHRvIHJlZ3VsYXIgYWN0aXZhdGlvbiByZXF1ZXN0cy4gKi8KKyAgICAgICAgICBpZiAoIWVudHJ5LT5hdXRvX2FjdGl2YXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgcmVzdWx0OworCisgICAgICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKGVudHJ5LT5hY3RpdmF0aW9uX21lc3NhZ2UpOworICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUzsKKworICAgICAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgZW50cnktPmNvbm5lY3Rpb24sIG1lc3NhZ2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fc2VuZF9wZW5kaW5nX2F1dG9fYWN0aXZhdGlvbl9tZXNzYWdlcyAoQnVzQWN0aXZhdGlvbiAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbjsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogQ2hlY2sgaWYgaXQncyBhIHBlbmRpbmcgYWN0aXZhdGlvbiAqLworICBwZW5kaW5nX2FjdGl2YXRpb24gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX3NlcnZpY2VfZ2V0X25hbWUgKHNlcnZpY2UpKTsKKworICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbikKKyAgICByZXR1cm4gVFJVRTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqZW50cnkgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIGxpbmspOworCisgICAgICBpZiAoZW50cnktPmF1dG9fYWN0aXZhdGlvbiAmJiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZW50cnktPmNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQ7CisKKyAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpOworCisgICAgICAgICAgLyogUmVzdW1lIGRpc3BhdGNoaW5nIHdoZXJlIHdlIGxlZnQgb2ZmIGluIGJ1c19kaXNwYXRjaCgpICovCisgICAgICAgICAgaWYgKCFidXNfZGlzcGF0Y2hfbWF0Y2hlcyAodHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBpZiAoIWFkZF9yZXN0b3JlX3BlbmRpbmdfdG9fdHJhbnNhY3Rpb24gKHRyYW5zYWN0aW9uLCBwZW5kaW5nX2FjdGl2YXRpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgYWRkIGNhbmNlbCBob29rIHRvIHRyYW5zYWN0aW9uIHRvIHJldmVydCByZW1vdmluZyBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywgYnVzX3NlcnZpY2VfZ2V0X25hbWUgKHNlcnZpY2UpKTsKKworICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRklYTUUgQHRvZG8gdGhlIGVycm9yIG1lc3NhZ2VzIGhlcmUgd291bGQgaWRlYWxseSBiZSBwcmVhbGxvY2F0ZWQKKyAqIHNvIHdlIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHNlbmQgdGhlbS4KKyAqIFVzaW5nIHRoZSB1c3VhbCB0YWN0aWMsIHByZWFsbG9jIGFuIE9PTSBtZXNzYWdlLCB0aGVuCisgKiBpZiB3ZSBjYW4ndCBhbGxvYyB0aGUgcmVhbCBlcnJvciBzZW5kIHRoZSBPT00gZXJyb3IgaW5zdGVhZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit0cnlfc2VuZF9hY3RpdmF0aW9uX2ZhaWx1cmUgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNFcnJvciAgICAgICpob3cpCit7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIERCdXNMaXN0ICpsaW5rOworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisKKyAgYWN0aXZhdGlvbiA9IHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbjsKKworICB0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGFjdGl2YXRpb24tPmNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKworICAgICAgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChlbnRyeS0+Y29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Vycm9yX3JlcGx5ICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIGlmICh0cmFuc2FjdGlvbikKKyAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGcmVlIHRoZSBwZW5kaW5nIGFjdGl2YXRpb24gYW5kIHNlbmQgYW4gZXJyb3IgbWVzc2FnZSB0byBhbGwgdGhlCisgKiBjb25uZWN0aW9ucyB0aGF0IHdlcmUgd2FpdGluZyBmb3IgaXQuCisgKi8KK3N0YXRpYyB2b2lkCitwZW5kaW5nX2FjdGl2YXRpb25fZmFpbGVkIChCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0Vycm9yICAgICAgKmhvdykKK3sKKyAgLyogRklYTUUgdXNlIHByZWFsbG9jYXRlZCBPT00gbWVzc2FnZXMgaW5zdGVhZCBvZiBidXNfd2FpdF9mb3JfbWVtb3J5KCkgKi8KKyAgd2hpbGUgKCF0cnlfc2VuZF9hY3RpdmF0aW9uX2ZhaWx1cmUgKHBlbmRpbmdfYWN0aXZhdGlvbiwgaG93KSkKKyAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgLyogRGVzdHJveSB0aGlzIHBlbmRpbmcgYWN0aXZhdGlvbiAqLworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7Cit9CisKKy8qKgorICogRGVwZW5kaW5nIG9uIHRoZSBleGl0IGNvZGUgb2YgdGhlIGhlbHBlciwgc2V0IHRoZSBlcnJvciBhY2NvcmRpbmdseQorICovCitzdGF0aWMgdm9pZAoraGFuZGxlX3NlcnZpY2VoZWxwZXJfZXhpdF9lcnJvciAoaW50ICAgICAgICBleGl0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBzd2l0Y2ggKGV4aXRfY29kZSkKKyAgICB7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX05PX01FTU9SWToKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgIkxhdW5jaGVyIGNvdWxkIG5vdCBydW4gKG91dCBvZiBtZW1vcnkpIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfU0VUVVBfRkFJTEVEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldHVwIGVudmlyb25tZW50IGNvcnJlY3RseSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX05BTUVfSU5WQUxJRDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIkJ1cyBuYW1lIGlzIG5vdCB2YWxpZCBvciBtaXNzaW5nIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfU0VSVklDRV9OT1RfRk9VTkQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VSVklDRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgIkJ1cyBuYW1lIG5vdCBmb3VuZCBpbiBzeXN0ZW0gc2VydmljZSBkaXJlY3RvcnkiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9QRVJNSVNTSU9OU19JTlZBTElEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZSBwZXJtaXNzaW9uIG9mIHRoZSBzZXR1aWQgaGVscGVyIGlzIG5vdCBjb3JyZWN0Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfRklMRV9JTlZBTElEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2aWNlIGZpbGUgaXMgaW5jb3JyZWN0IG9yIGRvZXMgbm90IGhhdmUgYWxsIHJlcXVpcmVkIGF0dHJpYnV0ZXMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9FWEVDX0ZBSUxFRDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGxhdW5jaCBkYWVtb24sIGZpbGUgbm90IGZvdW5kIG9yIHBlcm1pc3Npb25zIGludmFsaWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9JTlZBTElEX0FSR1M6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50cyB0byBjb21tYW5kIGxpbmUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9DSElMRF9TSUdOQUxFRDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiTGF1bmNoZWQgY2hpbGQgd2FzIHNpZ25hbGVkLCBpdCBwcm9iYWJseSBjcmFzaGVkIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiTGF1bmNoIGhlbHBlciBleGl0ZWQgd2l0aCB1bmtub3duIHJldHVybiBjb2RlICVpIiwgZXhpdF9jb2RlKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitiYWJ5c2l0dGVyX3dhdGNoX2NhbGxiYWNrIChEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNCYWJ5c2l0dGVyICpiYWJ5c2l0dGVyOworICBkYnVzX2Jvb2xfdCB1c2VzX3NlcnZpY2VoZWxwZXI7CisKKyAgYmFieXNpdHRlciA9IHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcjsKKworICBfZGJ1c19iYWJ5c2l0dGVyX3JlZiAoYmFieXNpdHRlcik7CisKKyAgcmV0dmFsID0gZGJ1c193YXRjaF9oYW5kbGUgKHdhdGNoLCBjb25kaXRpb24pOworCisgIC8qIFRoZXJlIGFyZSB0d28gbWFqb3IgY2FzZXMgaGVyZTsgYXJlIHdlIHRoZSBzeXN0ZW0gYnVzIG9yIHRoZSBzZXNzaW9uPyAgSGVyZSB0aGlzCisgICAqIGlzIGRpc3Rpbmd1aXNoZWQgYnkgd2hldGhlciBvciBub3Qgd2UgdXNlIGEgc2V0dWlkIGhlbHBlciBsYXVuY2hlci4gIFdpdGggdGhlIGxhdW5jaCBoZWxwZXIsCisgICAqIHNvbWUgcHJvY2VzcyBleGl0IGNvZGVzIGFyZSBtZWFuaW5nZnVsLCBwcm9jZXNzZWQgYnkgaGFuZGxlX3NlcnZpY2VoZWxwZXJfZXhpdF9lcnJvci4KKyAgICoKKyAgICogSW4gYm90aCBjYXNlcyB0aG91Z2gsIGp1c3QgaWdub3JlIHdoZW4gYSBwcm9jZXNzIGV4aXRzIHdpdGggc3RhdHVzIDA7IGl0J3MgcG9zc2libGUgZm9yCisgICAqIGEgcHJvZ3JhbSB0byAobWlzZ3VpZGVkbHkpICJkYWVtb25pemUiLCBhbmQgdGhhdCBhcHBlYXJzIHRvIHVzIGFzIGFuIGV4aXQuICBUaGlzIGNsb3NlcyBhIHJhY2UKKyAgICogY29uZGl0aW9uIGJldHdlZW4gdGhpcyBjb2RlIGFuZCB0aGUgY2hpbGQgcHJvY2VzcyBjbGFpbWluZyB0aGUgYnVzIG5hbWUuCisgICAqLworICB1c2VzX3NlcnZpY2VoZWxwZXIgPSBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSAhPSBOVUxMOworCisgIC8qIEZJWE1FIHRoaXMgaXMgYnJva2VuIGluIHRoZSBzYW1lIHdheSB0aGF0CisgICAqIGNvbm5lY3Rpb24gd2F0Y2hlcyB1c2VkIHRvIGJlOyB0aGVyZSBzaG91bGQgYmUKKyAgICogYSBzZXBhcmF0ZSBjYWxsYmFjayBmb3Igc3RhdHVzIGNoYW5nZSwgaW5zdGVhZAorICAgKiBvZiBkb2luZyAiaWYgd2UgaGFuZGxlZCBhIHdhdGNoIHN0YXR1cyBtaWdodAorICAgKiBoYXZlIGNoYW5nZWQiCisgICAqCisgICAqIEZpeGluZyB0aGlzIGxldHMgdXMgbW92ZSBkYnVzX3dhdGNoX2hhbmRsZQorICAgKiBjYWxscyBpbnRvIGRidXMtbWFpbmxvb3AuYworICAgKi8KKyAgaWYgKF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCAoYmFieXNpdHRlcikpCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yOworICAgICAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgICAgICBkYnVzX2Jvb2xfdCBhY3RpdmF0aW9uX2ZhaWxlZDsKKyAgICAgIGludCBleGl0X2NvZGUgPSAwOworCisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKGJhYnlzaXR0ZXIsICZlcnJvcik7CisKKyAgICAgIC8qIEV4cGxpY2l0bHkgY2hlY2sgZm9yIFNQQVdOX0NISUxEX0VYSVRFRCB0byBhdm9pZCBvdmVyd3JpdGluZyBhbgorICAgICAgICogZXhlYyBlcnJvciAqLworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQpCisgICAgICAgICAgJiYgX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdF9zdGF0dXMgKGJhYnlzaXR0ZXIsICZleGl0X2NvZGUpKQorICAgICAgICB7CisgICAgICAgICAgYWN0aXZhdGlvbl9mYWlsZWQgPSBleGl0X2NvZGUgIT0gMDsKKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOworCisgICAgICAgICAgaWYgKGFjdGl2YXRpb25fZmFpbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAodXNlc19zZXJ2aWNlaGVscGVyKQorICAgICAgICAgICAgICAgIGhhbmRsZV9zZXJ2aWNlaGVscGVyX2V4aXRfZXJyb3IgKGV4aXRfY29kZSwgJmVycm9yKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKGJhYnlzaXR0ZXIsICZlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFjdGl2YXRpb25fZmFpbGVkID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoYWN0aXZhdGlvbl9mYWlsZWQpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29udGV4dF9sb2cgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiQWN0aXZhdGVkIHNlcnZpY2UgJyVzJyBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICAvKiBEZXN0cm95IGFsbCBwZW5kaW5nIGFjdGl2YXRpb25zIHdpdGggdGhlIHNhbWUgZXhlYyAqLworICAgICAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyKTsKKyAgICAgICAgICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnAgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgICAgICAgICAgaWYgKHAgIT0gcGVuZGluZ19hY3RpdmF0aW9uICYmIHN0cmNtcCAocC0+ZXhlYywgcGVuZGluZ19hY3RpdmF0aW9uLT5leGVjKSA9PSAwKQorICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbl9mYWlsZWQgKHAsICZlcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBEZXN0cm95cyB0aGUgcGVuZGluZyBhY3RpdmF0aW9uICovCisgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uX2ZhaWxlZCAocGVuZGluZ19hY3RpdmF0aW9uLCAmZXJyb3IpOworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKGJhYnlzaXR0ZXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2JhYnlzaXR0ZXJfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgYmFieXNpdHRlcl93YXRjaF9jYWxsYmFjaywgcGVuZGluZ19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2JhYnlzaXR0ZXJfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGJhYnlzaXR0ZXJfd2F0Y2hfY2FsbGJhY2ssIHBlbmRpbmdfYWN0aXZhdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcGVuZGluZ19hY3RpdmF0aW9uX3RpbWVkX291dCAodm9pZCAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisgIERCdXNFcnJvciBlcnJvcjsKKworICAvKiBLaWxsIHRoZSBzcGF3bmVkIHByb2Nlc3MsIHNpbmNlIGl0IHN1Y2tzCisgICAqIChub3Qgc3VyZSB0aGlzIGlzIHdoYXQgd2Ugd2FudCB0byBkbywgYnV0CisgICAqIG1heSBhcyB3ZWxsIHRyeSBpdCBmb3Igbm93KQorICAgKi8KKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGRidXNfc2V0X2Vycm9yICgmZXJyb3IsIERCVVNfRVJST1JfVElNRURfT1VULAorICAgICAgICAgICAgICAgICAgIkFjdGl2YXRpb24gb2YgJXMgdGltZWQgb3V0IiwKKyAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKyAgYnVzX2NvbnRleHRfbG9nIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhY3RpdmF0ZSBzZXJ2aWNlICclcyc6IHRpbWVkIG91dCIsCisgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUpOworCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9mYWlsZWQgKHBlbmRpbmdfYWN0aXZhdGlvbiwgJmVycm9yKTsKKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfcGVuZGluZyAodm9pZCAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoIkNhbmNlbGluZyBwZW5kaW5nIGFjdGl2YXRpb24gb2YgJXNcbiIsCisgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3BlbmRpbmdfY2FuY2VsX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2NhbmNlbF9wZW5kaW5nX3RvX3RyYW5zYWN0aW9uIChCdXNUcmFuc2FjdGlvbiAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIGNhbmNlbF9wZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3BlbmRpbmdfY2FuY2VsX2RhdGEpKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3JlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBfZGJ1c192ZXJib3NlICgiU2F2ZWQgcGVuZGluZyBhY3RpdmF0aW9uIHRvIGJlIGNhbmNlbGVkIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlsc1xuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordXBkYXRlX3NlcnZpY2VfY2FjaGUgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24sIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChhY3RpdmF0aW9uLT5kaXJlY3RvcmllcywgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICAgICAgQnVzU2VydmljZURpcmVjdG9yeSAqc19kaXI7CisKKyAgICAgIHNfZGlyID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICAgICAgaWYgKCF1cGRhdGVfZGlyZWN0b3J5IChhY3RpdmF0aW9uLCBzX2RpciwgJnRtcF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJ1c0FjdGl2YXRpb25FbnRyeSAqCithY3RpdmF0aW9uX2ZpbmRfZW50cnkgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisKKyAgZW50cnkgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIHNlcnZpY2VfbmFtZSk7CisgIGlmICghZW50cnkpCisgICAgeworICAgICAgaWYgKCF1cGRhdGVfc2VydmljZV9jYWNoZSAoYWN0aXZhdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgZW50cnkgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKnVwZGF0ZWRfZW50cnk7CisKKyAgICAgIGlmICghY2hlY2tfc2VydmljZV9maWxlIChhY3RpdmF0aW9uLCBlbnRyeSwgJnVwZGF0ZWRfZW50cnksIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIGVudHJ5ID0gdXBkYXRlZF9lbnRyeTsKKyAgICB9CisKKyAgaWYgKCFlbnRyeSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgbmFtZSAlcyB3YXMgbm90IHByb3ZpZGVkIGJ5IGFueSAuc2VydmljZSBmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBjaGFyICoqCitidXNfYWN0aXZhdGlvbl9nZXRfZW52aXJvbm1lbnQgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24pCit7CisgIGNoYXIgKiplbnZpcm9ubWVudDsKKyAgaW50IGksIGxlbmd0aDsKKyAgREJ1c1N0cmluZyBlbnRyeTsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgbGVuZ3RoID0gX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCk7CisKKyAgZW52aXJvbm1lbnQgPSBkYnVzX25ldzAgKGNoYXIgKiwgbGVuZ3RoICsgMSk7CisKKyAgaWYgKGVudmlyb25tZW50ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaSA9IDA7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCwgJml0ZXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbnRyeSkpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52aXJvbm1lbnQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmtleSwgKnZhbHVlOworCisgICAgICBrZXkgPSAoY29uc3QgY2hhciAqKSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgKCZpdGVyKTsKKyAgICAgIHZhbHVlID0gKGNvbnN0IGNoYXIgKikgX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmZW50cnksICIlcz0lcyIsIGtleSwgdmFsdWUpKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmVudHJ5LCBlbnZpcm9ubWVudCArIGkpKQorICAgICAgICBicmVhazsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeSk7CisKKyAgaWYgKGkgIT0gbGVuZ3RoKQorICAgIHsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudmlyb25tZW50KTsKKyAgICAgIGVudmlyb25tZW50ID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGVudmlyb25tZW50OworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgICAgICAgICpoYXNoX2tleTsKKyAgY2hhciAgICAgICAgKmhhc2hfdmFsdWU7CisgIGRidXNfYm9vbF90ICByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGhhc2hfa2V5ID0gTlVMTDsKKyAgaGFzaF92YWx1ZSA9IE5VTEw7CisgIGhhc2hfa2V5ID0gX2RidXNfc3RyZHVwIChrZXkpOworCisgIGlmIChoYXNoX2tleSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGhhc2hfdmFsdWUgPSBfZGJ1c19zdHJkdXAgKHZhbHVlKTsKKworICBpZiAoaGFzaF92YWx1ZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfa2V5LCBoYXNoX3ZhbHVlKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworb3V0OgorICBpZiAocmV0dmFsID09IEZBTFNFKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoaGFzaF9rZXkpOworICAgICAgZGJ1c19mcmVlIChoYXNoX3ZhbHVlKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlIChCdXNBY3RpdmF0aW9uICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGF1dG9fYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICphY3RpdmF0aW9uX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5OworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uOworICBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5ICpwZW5kaW5nX2FjdGl2YXRpb25fZW50cnk7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzU3RyaW5nIHNlcnZpY2Vfc3RyOworICBjb25zdCBjaGFyICpzZXJ2aWNlaGVscGVyOworICBjaGFyICoqYXJndjsKKyAgY2hhciAqKmVudnAgPSBOVUxMOworICBpbnQgYXJnYzsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgZGJ1c19ib29sX3Qgd2FzX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgREJ1c1N0cmluZyBjb21tYW5kOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChhY3RpdmF0aW9uLT5uX3BlbmRpbmdfYWN0aXZhdGlvbnMgPj0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyAoYWN0aXZhdGlvbi0+Y29udGV4dCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHBlbmRpbmcgYWN0aXZhdGlvbnMgaGFzIGJlZW4gcmVhY2hlZCwgYWN0aXZhdGlvbiBvZiAlcyBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGVudHJ5ID0gYWN0aXZhdGlvbl9maW5kX2VudHJ5IChhY3RpdmF0aW9uLCBzZXJ2aWNlX25hbWUsIGVycm9yKTsKKyAgaWYgKCFlbnRyeSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQnlwYXNzIHRoZSByZWdpc3RyeSBsb29rdXAgaWYgd2UncmUgYXV0by1hY3RpdmF0aW5nLCBidXNfZGlzcGF0Y2ggd291bGQgbm90CisgICAqIGNhbGwgdXMgaWYgdGhlIHNlcnZpY2UgaXMgYWxyZWFkeSBhY3RpdmUuCisgICAqLworICBpZiAoIWF1dG9fYWN0aXZhdGlvbikKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiB0aGUgc2VydmljZSBpcyBhY3RpdmUgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9zdHIsIHNlcnZpY2VfbmFtZSk7CisgICAgICBpZiAoYnVzX3JlZ2lzdHJ5X2xvb2t1cCAoYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5IChhY3RpdmF0aW9uLT5jb250ZXh0KSwgJnNlcnZpY2Vfc3RyKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCByZXN1bHQ7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2VydmljZSBcIiVzXCIgaXMgYWxyZWFkeSBhY3RpdmVcbiIsIHNlcnZpY2VfbmFtZSk7CisKKyAgICAgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChhY3RpdmF0aW9uX21lc3NhZ2UpOworCisgICAgICAgICAgaWYgKCFtZXNzYWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGNyZWF0ZSByZXBseSB0byBhY3RpdmF0ZSBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcmVzdWx0ID0gREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkc7CisKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIHNldCBhcmdzIG9mIHJlcGx5IHRvIGFjdGl2YXRlIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR2YWwgPSBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgaWYgKCFyZXR2YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gc2VuZCByZXBseVxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgfQorCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSA9IGRidXNfbmV3MCAoQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSwgMSk7CisgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIHBlbmRpbmcgYWN0aXZhdGlvbiBlbnRyeVxuIik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBwZW5kaW5nX2FjdGl2YXRpb25fZW50cnktPmF1dG9fYWN0aXZhdGlvbiA9IGF1dG9fYWN0aXZhdGlvbjsKKworICBwZW5kaW5nX2FjdGl2YXRpb25fZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSA9IGFjdGl2YXRpb25fbWVzc2FnZTsKKyAgZGJ1c19tZXNzYWdlX3JlZiAoYWN0aXZhdGlvbl9tZXNzYWdlKTsKKyAgcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHNlcnZpY2UgaXMgYmVpbmcgYWN0aXZhdGVkICovCisgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywgc2VydmljZV9uYW1lKTsKKyAgd2FzX3BlbmRpbmdfYWN0aXZhdGlvbiA9IChwZW5kaW5nX2FjdGl2YXRpb24gIT0gTlVMTCk7CisgIGlmICh3YXNfcGVuZGluZ19hY3RpdmF0aW9uKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFwcGVuZCBhIG5ldyBlbnRyeSB0byBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+bl9lbnRyaWVzICs9IDE7CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IGRidXNfbmV3MCAoQnVzUGVuZGluZ0FjdGl2YXRpb24sIDEpOworICAgICAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNyZWF0ZSBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbiA9IGFjdGl2YXRpb247CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50ID0gMTsKKworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUgPSBfZGJ1c19zdHJkdXAgKHNlcnZpY2VfbmFtZSk7CisgICAgICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjb3B5IHNlcnZpY2UgbmFtZSBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+ZXhlYyA9IF9kYnVzX3N0cmR1cCAoZW50cnktPmV4ZWMpOworICAgICAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb24tPmV4ZWMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNvcHkgc2VydmljZSBleGVjIGZvciBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKQorICAgICAgICB7CisgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UgPSBfZGJ1c19zdHJkdXAgKGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UpOworICAgICAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY29weSBzeXN0ZW1kIHNlcnZpY2UgZm9yIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dCA9CisgICAgICAgIF9kYnVzX3RpbWVvdXRfbmV3IChidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbl90aW1lb3V0IChhY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbl90aW1lZF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90aW1lb3V0X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dF9hZGRlZCA9IFRSVUU7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkZCBlbnRyeSB0byBqdXN0LWNyZWF0ZWQgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+bl9lbnRyaWVzICs9IDE7CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyArPSAxOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBwdXQgcGVuZGluZyBhY3RpdmF0aW9uIGluIGhhc2ggdGFibGVcbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWFkZF9jYW5jZWxfcGVuZGluZ190b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sIHBlbmRpbmdfYWN0aXZhdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgcGVuZGluZyBhY3RpdmF0aW9uIGNhbmNlbCBob29rIHRvIHRyYW5zYWN0aW9uXG4iKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAod2FzX3BlbmRpbmdfYWN0aXZhdGlvbikKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoYnVzX2NvbnRleHRfZ2V0X3N5c3RlbWRfYWN0aXZhdGlvbiAoYWN0aXZhdGlvbi0+Y29udGV4dCkpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoc2VydmljZV9uYW1lLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIikgPT0gMCkKKyAgICAgICAgICAvKiBzeXN0ZW1kIGl0c2VsZiBpcyBtaXNzaW5nIGFwcGFyZW50bHkuIFRoYXQgY2FuIGhhcHBlbgorICAgICAgICAgICAgIG9ubHkgZHVyaW5nIGVhcmx5IHN0YXJ0dXAuIExldCdzIGp1c3Qgd2FpdCB1bnRpbCBzeXN0ZW1kCisgICAgICAgICAgICAgY29ubmVjdHMgdG8gdXMgYW5kIGRvIG5vdGhpbmcuICovCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBpZiAoZW50cnktPnN5c3RlbWRfc2VydmljZSkKKyAgICAgICAgeworICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICphY3RpdmF0aW9uX3RyYW5zYWN0aW9uOworICAgICAgICAgIERCdXNTdHJpbmcgc2VydmljZV9zdHJpbmc7CisgICAgICAgICAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgICAgICAgICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisKKyAgICAgICAgICAvKiBPSywgd2UgaGF2ZSBhIHN5c3RlbWQgc2VydmljZSBjb25maWd1cmVkIGZvciB0aGlzIGVudHJ5LAorICAgICAgICAgICAgIGhlbmNlIGxldCdzIGVucXVldWUgYW4gYWN0aXZhdGlvbiByZXF1ZXN0IG1lc3NhZ2UuIFRoaXMKKyAgICAgICAgICAgICBpcyBpbXBsZW1lbnRlZCBhcyBhIGRpcmVjdGVkIHNpZ25hbCwgbm90IGEgbWV0aG9kIGNhbGwsCisgICAgICAgICAgICAgZm9yIHRocmVlIHJlYXNvbnM6IDEpIHdlIGRvbid0IGV4cGVjdCBhIHJlc3BvbnNlIG9uCisgICAgICAgICAgICAgc3VjY2Vzcywgd2hlcmUgd2UganVzdCBleHBlY3QgYSBuYW1lIGFwcGVhcmluZyBvbiB0aGUKKyAgICAgICAgICAgICBidXM7IDIpIGF0IHRoaXMgdGltZSB0aGUgc3lzdGVtZCBzZXJ2aWNlIG1pZ2h0IG5vdCB5ZXQKKyAgICAgICAgICAgICBoYXZlIGNvbm5lY3RlZCwgc28gd2Ugd291bGRuJ3Qga25vdyB0aGUgbWVzc2FnZSBzZXJpYWwgYXQKKyAgICAgICAgICAgICB0aGlzIHBvaW50IHRvIHNldCB1cCBhIHBlbmRpbmcgY2FsbDsgMykgaXQgaXMgdWdseSBpZiB0aGUKKyAgICAgICAgICAgICBidXMgc3VkZGVubHkgYmVjb21lcyB0aGUgY2FsbGVyIG9mIGEgcmVtb3RlIG1ldGhvZC4gKi8KKworICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZhdGlvblJlcXVlc3QiKTsKKyAgICAgICAgICBpZiAoIW1lc3NhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIGFjdGl2YXRpb24gbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSB8fAorICAgICAgICAgICAgICAhZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpIHx8CisgICAgICAgICAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gc2V0IGFyZ3Mgb2YgYWN0aXZhdGlvbiBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ3JlYXRlIG91ciB0cmFuc2FjdGlvbiAqLworICAgICAgICAgIGFjdGl2YXRpb25fdHJhbnNhY3Rpb24gPSBidXNfdHJhbnNhY3Rpb25fbmV3IChhY3RpdmF0aW9uLT5jb250ZXh0KTsKKyAgICAgICAgICBpZiAoYWN0aXZhdGlvbl90cmFuc2FjdGlvbiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGNyZWF0ZSBhY3RpdmF0aW9uIHRyYW5zYWN0aW9uXG4iKTsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ2hlY2sgd2hldGhlciBzeXN0ZW1kIGlzIGFscmVhZHkgY29ubmVjdGVkICovCisgICAgICAgICAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9zdHJpbmcsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKyAgICAgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzZXJ2aWNlX3N0cmluZyk7CisKKyAgICAgICAgICBpZiAoc2VydmljZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJBY3RpdmF0aW5nIHZpYSBzeXN0ZW1kOiBzZXJ2aWNlIG5hbWU9JyVzJyB1bml0PSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICAgICAgLyogV29uZGVyZnVsLCBzeXN0ZW1kIGlzIGNvbm5lY3RlZCwgbGV0J3MganVzdCBzZW5kIHRoZSBtc2cgKi8KKyAgICAgICAgICAgICAgcmV0dmFsID0gYnVzX2Rpc3BhdGNoX21hdGNoZXMgKGFjdGl2YXRpb25fdHJhbnNhY3Rpb24sIE5VTEwsIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc3lzdGVtZCB0byBoYW5kLW9mZjogc2VydmljZSBuYW1lPSclcycgdW5pdD0nJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisgICAgICAgICAgICAgIC8qIHN5c3RlbWQgaXMgbm90IGFyb3VuZCwgbGV0J3MgImFjdGl2YXRlIiBpdC4gKi8KKyAgICAgICAgICAgICAgcmV0dmFsID0gYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoYWN0aXZhdGlvbiwgY29ubmVjdGlvbiwgYWN0aXZhdGlvbl90cmFuc2FjdGlvbiwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiRmFpbGVkIHRvIGFjdGl2YXRlIHZpYSBzeXN0ZW1kOiBzZXJ2aWNlIG5hbWU9JyVzJyB1bml0PSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbGVkIHRvIHNlbmQgYWN0aXZhdGlvbiBtZXNzYWdlOiAlc1xuIiwgZXJyb3ItPm5hbWUpOworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlIChhY3RpdmF0aW9uX3RyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKGFjdGl2YXRpb25fdHJhbnNhY3Rpb24pOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisKKyAgICAgIC8qIE9LLCB3ZSBoYXZlIG5vIGNvbmZpZ3VyZWQgc3lzdGVtZCBzZXJ2aWNlLCBoZW5jZSBsZXQncworICAgICAgICAgcHJvY2VlZCB3aXRoIHRyYWRpdGlvbmFsIGFjdGl2YXRpb24uICovCisgICAgfQorCisgIC8qIHVzZSBjb21tYW5kIGFzIHN5c3RlbSBhbmQgc2Vzc2lvbiBkaWZmZXJlbnQgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbW1hbmQpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGRvZXMgdGhlIGJ1cyB1c2UgYSBoZWxwZXI/ICovCisgIHNlcnZpY2VoZWxwZXIgPSBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisgIGlmIChzZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVudHJ5LT51c2VyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9GSUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZG8gc3lzdGVtLWJ1cyBhY3RpdmF0aW9uIHdpdGggbm8gdXNlclxuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIGpvaW4gdGhlIGhlbHBlciBwYXRoIGFuZCB0aGUgc2VydmljZSBuYW1lICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCBzZXJ2aWNlaGVscGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsICIgIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCBzZXJ2aWNlX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHRoZSBidXMgZG9lcyBub3QgdXNlIGEgaGVscGVyLCBzbyB3ZSBjYW4gYXBwZW5kIGFyZ3VtZW50cyB3aXRoIHRoZSBleGVjIGxpbmUgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsIGVudHJ5LT5leGVjKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogY29udmVydCBjb21tYW5kIGludG8gYXJndW1lbnRzICovCisgIGlmICghX2RidXNfc2hlbGxfcGFyc2VfYXJndiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29tbWFuZCksICZhcmdjLCAmYXJndiwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gcGFyc2UgY29tbWFuZCBsaW5lOiAlc1xuIiwgZW50cnktPmV4ZWMpOworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisKKyAgaWYgKCFhZGRfYnVzX2Vudmlyb25tZW50IChhY3RpdmF0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGVudnAgPSBidXNfYWN0aXZhdGlvbl9nZXRfZW52aXJvbm1lbnQgKGFjdGl2YXRpb24pOworCisgIGlmIChlbnZwID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3Bhd25pbmcgJXMgLi4uXG4iLCBhcmd2WzBdKTsKKyAgaWYgKHNlcnZpY2VoZWxwZXIgIT0gTlVMTCkKKyAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc2VydmljZSBuYW1lPSclcycgKHVzaW5nIHNlcnZpY2VoZWxwZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgIGVsc2UKKyAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc2VydmljZSBuYW1lPSclcyciLAorICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgIGlmICghX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHNwYXduIGNoaWxkXG4iKTsKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJGYWlsZWQgdG8gYWN0aXZhdGUgc2VydmljZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcmd2KTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudnApOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICBlbnZwID0gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlciAhPSBOVUxMKTsKKworICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2JhYnlzaXR0ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfYmFieXNpdHRlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBzZXQgYmFieXNpdHRlciB3YXRjaCBmdW5jdGlvbnNcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX2xpc3Rfc2VydmljZXMgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24sCisJCQkgICAgICBjaGFyICAgICAgICAqKipsaXN0cCwKKwkJCSAgICAgIGludCAgICAgICAgICAgKmFycmF5X2xlbikKK3sKKyAgaW50IGksIGosIGxlbjsKKyAgY2hhciAqKnJldHZhbDsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgbGVuID0gX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChhY3RpdmF0aW9uLT5lbnRyaWVzKTsKKyAgcmV0dmFsID0gZGJ1c19uZXcgKGNoYXIgKiwgbGVuICsgMSk7CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoYWN0aXZhdGlvbi0+ZW50cmllcywgJml0ZXIpOworICBpID0gMDsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgcmV0dmFsW2ldID0gX2RidXNfc3RyZHVwIChlbnRyeS0+bmFtZSk7CisgICAgICBpZiAocmV0dmFsW2ldID09IE5VTEwpCisJZ290byBlcnJvcjsKKworICAgICAgaSsrOworICAgIH0KKworICByZXR2YWxbaV0gPSBOVUxMOworCisgIGlmIChhcnJheV9sZW4pCisgICAgKmFycmF5X2xlbiA9IGxlbjsKKworICAqbGlzdHAgPSByZXR2YWw7CisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgZGJ1c19mcmVlIChyZXR2YWxbaV0pOworICBkYnVzX2ZyZWUgKHJldHZhbCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorZGJ1c19hY3RpdmF0aW9uX3N5c3RlbWRfZmFpbHVyZSAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqY29kZSwgKnN0ciwgKnVuaXQgPSBOVUxMOworCisgIGRidXNfZXJyb3JfaW5pdCgmZXJyb3IpOworCisgIC8qIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzeXN0ZW1kIGFjdGl2YXRvciBzZW50IHVzIGEKKyAgICAgcmVzcG9uc2UuIFdlJ2xsIGludmFsaWRhdGUgYWxsIHBlbmRpbmcgYWN0aXZhdGlvbnMgdGhhdCBtYXRjaCB0aGUKKyAgICAgdW5pdCBuYW1lLiAqLworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZGJ1c19zZXRfZXJyb3IoJmVycm9yLCBjb2RlLCBzdHIpOworCisKKyAgaWYgKHVuaXQpCisgICAgeworICAgICAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJBY3RpdmF0aW9uIHZpYSBzeXN0ZW1kIGZhaWxlZCBmb3IgdW5pdCAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyKTsKKworICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcCA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgICAgIGlmIChwLT5zeXN0ZW1kX3NlcnZpY2UgJiYgc3RyY21wIChwLT5zeXN0ZW1kX3NlcnZpY2UsIHVuaXQpID09IDApCisgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb25fZmFpbGVkKHAsICZlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIFNFUlZJQ0VfTkFNRV8xICJNeVNlcnZpY2UxIgorI2RlZmluZSBTRVJWSUNFX05BTUVfMiAiTXlTZXJ2aWNlMiIKKyNkZWZpbmUgU0VSVklDRV9OQU1FXzMgIk15U2VydmljZTMiCisKKyNkZWZpbmUgU0VSVklDRV9GSUxFXzEgInNlcnZpY2UtMS5zZXJ2aWNlIgorI2RlZmluZSBTRVJWSUNFX0ZJTEVfMiAic2VydmljZS0yLnNlcnZpY2UiCisjZGVmaW5lIFNFUlZJQ0VfRklMRV8zICJzZXJ2aWNlLTMuc2VydmljZSIKKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2NyZWF0ZV9zZXJ2aWNlX2ZpbGUgKERCdXNTdHJpbmcgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4ZWMpCit7CisgIERCdXNTdHJpbmcgIGZpbGVfbmFtZSwgZnVsbF9wYXRoOworICBGSUxFICAgICAgICAqZmlsZTsKKyAgZGJ1c19ib29sX3QgIHJldF92YWw7CisKKyAgcmV0X3ZhbCA9IFRSVUU7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZV9uYW1lLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChkaXIpKSB8fAorICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlX25hbWUpKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBmaWxlID0gZm9wZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksICJ3Iik7CisgIGlmICghZmlsZSkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZnByaW50ZiAoZmlsZSwgIltELUJVUyBTZXJ2aWNlXVxuTmFtZT0lc1xuRXhlYz0lc1xuIiwgbmFtZSwgZXhlYyk7CisgIGZjbG9zZSAoZmlsZSk7CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X3JlbW92ZV9zZXJ2aWNlX2ZpbGUgKERCdXNTdHJpbmcgKmRpciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIERCdXNTdHJpbmcgIGZpbGVfbmFtZSwgZnVsbF9wYXRoOworICBkYnVzX2Jvb2xfdCByZXRfdmFsOworCisgIHJldF92YWwgPSBUUlVFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZV9uYW1lLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChkaXIpKSB8fAorICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlX25hbWUpKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX2RlbGV0ZV9maWxlICgmZnVsbF9wYXRoLCBOVUxMKSkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X3JlbW92ZV9kaXJlY3RvcnkgKERCdXNTdHJpbmcgKmRpcikKK3sKKyAgREJ1c0Rpckl0ZXIgKml0ZXI7CisgIERCdXNTdHJpbmcgICBmaWxlbmFtZSwgZnVsbF9wYXRoOworICBkYnVzX2Jvb2xfdCAgcmV0X3ZhbDsKKworICByZXRfdmFsID0gVFJVRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaXRlciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuIChkaXIsIE5VTEwpOworICBpZiAoaXRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGl0ZXIsICZmaWxlbmFtZSwgTlVMTCkpCisgICAgeworICAgICAgaWYgKCF0ZXN0X3JlbW92ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChpdGVyKTsKKworICBpZiAoIV9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKGRpciwgTlVMTCkpCisgICAgeworICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCitvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5pdF9zZXJ2aWNlX3JlbG9hZF90ZXN0IChEQnVzU3RyaW5nICpkaXIpCit7CisgIERCdXNTdGF0IHN0YXRfYnVmOworCisgIGlmICghX2RidXNfc3RhdCAoZGlyLCAmc3RhdF9idWYsIE5VTEwpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlYXRlX2RpcmVjdG9yeSAoZGlyLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghdGVzdF9yZW1vdmVfZGlyZWN0b3J5IChkaXIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfY3JlYXRlX2RpcmVjdG9yeSAoZGlyLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBDcmVhdGUgb25lIGluaXRpYWwgZmlsZSAqLworICBpZiAoIXRlc3RfY3JlYXRlX3NlcnZpY2VfZmlsZSAoZGlyLCBTRVJWSUNFX0ZJTEVfMSwgU0VSVklDRV9OQU1FXzEsICJleGVjLTEiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2xlYW51cF9zZXJ2aWNlX3JlbG9hZF90ZXN0IChEQnVzU3RyaW5nICpkaXIpCit7CisgIGlmICghdGVzdF9yZW1vdmVfZGlyZWN0b3J5IChkaXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgY29uc3QgY2hhciAgICAqc2VydmljZV9uYW1lOworICBkYnVzX2Jvb2xfdCAgICBleHBlY3RpbmdfZmluZDsKK30gQ2hlY2tEYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrRGF0YSAgICAgICAgICAqZDsKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeTsKKyAgREJ1c0Vycm9yICAgICAgICAgICBlcnJvcjsKKyAgZGJ1c19ib29sX3QgICAgICAgICByZXRfdmFsOworCisgIHJldF92YWwgPSBUUlVFOworICBkID0gZGF0YTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgZW50cnkgPSBhY3RpdmF0aW9uX2ZpbmRfZW50cnkgKGQtPmFjdGl2YXRpb24sIGQtPnNlcnZpY2VfbmFtZSwgJmVycm9yKTsKKyAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgcmV0X3ZhbCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChkLT5leHBlY3RpbmdfZmluZCkKKyAgICAgICAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFkLT5leHBlY3RpbmdfZmluZCkKKyAgICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgIH0KKworICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb190ZXN0IChjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgZGJ1c19ib29sX3Qgb29tX3Rlc3QsIENoZWNrRGF0YSAqZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgZXJyOworCisgIGlmIChvb21fdGVzdCkKKyAgICBlcnIgPSAhX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKGRlc2NyaXB0aW9uLCBjaGVja19mdW5jLCBkYXRhKTsKKyAgZWxzZQorICAgIGVyciA9ICFjaGVja19mdW5jIChkYXRhKTsKKworICBpZiAoZXJyKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRlc3QgZmFpbGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fc2VydmljZV9yZWxvYWRfdGVzdCAoREJ1c1N0cmluZyAqZGlyLCBkYnVzX2Jvb2xfdCBvb21fdGVzdCkKK3sKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgREJ1c1N0cmluZyAgICAgYWRkcmVzczsKKyAgREJ1c0xpc3QgICAgICAqZGlyZWN0b3JpZXM7CisgIENoZWNrRGF0YSAgICAgIGQ7CisKKyAgZGlyZWN0b3JpZXMgPSBOVUxMOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmFkZHJlc3MsICIiKTsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZGlyZWN0b3JpZXMsIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoZGlyKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGFjdGl2YXRpb24gPSBidXNfYWN0aXZhdGlvbl9uZXcgKE5VTEwsICZhZGRyZXNzLCAmZGlyZWN0b3JpZXMsIE5VTEwpOworICBpZiAoIWFjdGl2YXRpb24pCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQuYWN0aXZhdGlvbiA9IGFjdGl2YXRpb247CisKKyAgLyogQ2hlY2sgZm9yIGV4aXN0aW5nIHNlcnZpY2UgZmlsZSAqLworICBkLmV4cGVjdGluZ19maW5kID0gVFJVRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX05BTUVfMTsKKworICBpZiAoIWRvX3Rlc3QgKCJFeGlzdGluZyBzZXJ2aWNlIGZpbGUiLCBvb21fdGVzdCwgJmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBDaGVjayBmb3Igbm9uLWV4aXN0aW5nIHNlcnZpY2UgZmlsZSAqLworICBkLmV4cGVjdGluZ19maW5kID0gRkFMU0U7CisgIGQuc2VydmljZV9uYW1lID0gU0VSVklDRV9OQU1FXzM7CisKKyAgaWYgKCFkb190ZXN0ICgiTm9uZXhpc3Rpbmcgc2VydmljZSBmaWxlIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQ2hlY2sgZm9yIGFkZGVkIHNlcnZpY2UgZmlsZSAqLworICBpZiAoIXRlc3RfY3JlYXRlX3NlcnZpY2VfZmlsZSAoZGlyLCBTRVJWSUNFX0ZJTEVfMiwgU0VSVklDRV9OQU1FXzIsICJleGVjLTIiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC5leHBlY3RpbmdfZmluZCA9IFRSVUU7CisgIGQuc2VydmljZV9uYW1lID0gU0VSVklDRV9OQU1FXzI7CisKKyAgaWYgKCFkb190ZXN0ICgiQWRkZWQgc2VydmljZSBmaWxlIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQ2hlY2sgZm9yIHJlbW92ZWQgc2VydmljZSBmaWxlICovCisgIGlmICghdGVzdF9yZW1vdmVfc2VydmljZV9maWxlIChkaXIsIFNFUlZJQ0VfRklMRV8yKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC5leHBlY3RpbmdfZmluZCA9IEZBTFNFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfRklMRV8yOworCisgIGlmICghZG9fdGVzdCAoIlJlbW92ZWQgc2VydmljZSBmaWxlIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQ2hlY2sgZm9yIHVwZGF0ZWQgc2VydmljZSBmaWxlICovCisKKyAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICgxMDAwKTsgLyogU2xlZXAgYSBzZWNvbmQgdG8gbWFrZSBzdXJlIHRoZSBtdGltZSBpcyB1cGRhdGVkICovCisKKyAgaWYgKCF0ZXN0X2NyZWF0ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgU0VSVklDRV9GSUxFXzEsIFNFUlZJQ0VfTkFNRV8zLCAiZXhlYy0zIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBUUlVFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8zOworCisgIGlmICghZG9fdGVzdCAoIlVwZGF0ZWQgc2VydmljZSBmaWxlLCBwYXJ0IDEiLCBvb21fdGVzdCwgJmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLmV4cGVjdGluZ19maW5kID0gRkFMU0U7CisgIGQuc2VydmljZV9uYW1lID0gU0VSVklDRV9OQU1FXzE7CisKKyAgaWYgKCFkb190ZXN0ICgiVXBkYXRlZCBzZXJ2aWNlIGZpbGUsIHBhcnQgMiIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19hY3RpdmF0aW9uX3VucmVmIChhY3RpdmF0aW9uKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmRpcmVjdG9yaWVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNTdHJpbmcgZGlyZWN0b3J5OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkaXJlY3RvcnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZkaXJlY3RvcnksIF9kYnVzX2dldF90bXBkaXIoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmRpcmVjdG9yeSwgIi9kYnVzLXJlbG9hZC10ZXN0LSIpIHx8CisgICAgICAhX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICgmZGlyZWN0b3J5LCA2KSkKKyAgICAgeworICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgfQorCisgIC8qIERvIG5vcm1hbCB0ZXN0cyAqLworICBpZiAoIWluaXRfc2VydmljZV9yZWxvYWRfdGVzdCAoJmRpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXRpYXRlIHNlcnZpY2UgcmVsb2FkIHRlc3QiKTsKKworICBpZiAoIWRvX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZkaXJlY3RvcnksIEZBTFNFKSkKKyAgICA7IC8qIERvIG5vdGhpbmc/ICovCisKKyAgLyogRG8gT09NIHRlc3RzICovCisgIGlmICghaW5pdF9zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdGlhdGUgc2VydmljZSByZWxvYWQgdGVzdCIpOworCisgIGlmICghZG9fc2VydmljZV9yZWxvYWRfdGVzdCAoJmRpcmVjdG9yeSwgVFJVRSkpCisgICAgOyAvKiBEbyBub3RoaW5nPyAqLworCisgIC8qIENsZWFudXAgdGVzdCBkaXJlY3RvcnkgKi8KKyAgaWYgKCFjbGVhbnVwX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZkaXJlY3RvcnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpcmVjdG9yeSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvYWN0aXZhdGlvbi5oIGIvZGJ1cy0xLjQuMTAvYnVzL2FjdGl2YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YyNWIxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2FjdGl2YXRpb24uaApAQCAtMCwwICsxLDY5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGFjdGl2YXRpb24uaCAgQWN0aXZhdGlvbiBvZiBzZXJ2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0FDVElWQVRJT05fSAorI2RlZmluZSBCVVNfQUNUSVZBVElPTl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgImJ1cy5oIgorCitCdXNBY3RpdmF0aW9uKiBidXNfYWN0aXZhdGlvbl9uZXcgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICAqY29udGV4dCwKKwkJCQkJCWNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzLAorCQkJCQkJREJ1c0xpc3QgICAgICAgICAqKmRpcmVjdG9yaWVzLAorCQkJCQkJREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19hY3RpdmF0aW9uX3JlbG9hZCAgICAgICAgICAgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorCQkJCQkJY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisJCQkJCQlEQnVzTGlzdCAgICAgICAgICoqZGlyZWN0b3JpZXMsCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworQnVzQWN0aXZhdGlvbiogYnVzX2FjdGl2YXRpb25fcmVmICAgICAgICAgICAgICAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24pOwordm9pZCAgICAgICAgICAgYnVzX2FjdGl2YXRpb25fdW5yZWYgICAgICAgICAgICAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24pOworCitkYnVzX2Jvb2xfdCAgIGJ1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQljb25zdCBjaGFyICAgICAgICAqa2V5LAorCQkJCQkJY29uc3QgY2hhciAgICAgICAgKnZhbHVlLAorCQkJCQkJREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgIGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorCQkJCQkJREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisJCQkJCQlCdXNUcmFuc2FjdGlvbiAgICAqdHJhbnNhY3Rpb24sCisJCQkJCQlkYnVzX2Jvb2xfdCAgICAgICAgYXV0b19hY3RpdmF0aW9uLAorCQkJCQkJREJ1c01lc3NhZ2UgICAgICAgKmFjdGl2YXRpb25fbWVzc2FnZSwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICAgICpzZXJ2aWNlX25hbWUsCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkICAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQljb25zdCBjaGFyICAgICAgICAqc2VydmljZV9uYW1lLAorCQkJCQkJQnVzVHJhbnNhY3Rpb24gICAgKnRyYW5zYWN0aW9uLAorCQkJCQkJREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgIGJ1c19hY3RpdmF0aW9uX2xpc3Rfc2VydmljZXMgICAgKEJ1c0FjdGl2YXRpb24gICAgICpyZWdpc3RyeSwKKwkJCQkJCWNoYXIgICAgICAgICAgICAqKipsaXN0cCwKKwkJCQkJCWludCAgICAgICAgICAgICAgICphcnJheV9sZW4pOworZGJ1c19ib29sX3QgICAgZGJ1c19hY3RpdmF0aW9uX3N5c3RlbWRfZmFpbHVyZSAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAqbWVzc2FnZSk7CisKK2RidXNfYm9vbF90ICAgIGJ1c19hY3RpdmF0aW9uX3NlbmRfcGVuZGluZ19hdXRvX2FjdGl2YXRpb25fbWVzc2FnZXMgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorCQkJCQkJCQkgICAgIEJ1c1NlcnZpY2UgICAgICAgICpzZXJ2aWNlLAorCQkJCQkJCQkgICAgIEJ1c1RyYW5zYWN0aW9uICAgICp0cmFuc2FjdGlvbiwKKwkJCQkJCQkJICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisKKyNlbmRpZiAvKiBCVVNfQUNUSVZBVElPTl9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvYnVzLmMgYi9kYnVzLTEuNC4xMC9idXMvYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwZGMwOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9idXMuYwpAQCAtMCwwICsxLDE2NjAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYnVzLmMgIG1lc3NhZ2UgYnVzIGNvbnRleHQgb2JqZWN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJidXMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhY3RpdmF0aW9uLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInNlbGludXguaCIKKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorCisjaWZkZWYgREJVU19DWUdXSU4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCitzdHJ1Y3QgQnVzQ29udGV4dAoreworICBpbnQgcmVmY291bnQ7CisgIERCdXNHVUlEIHV1aWQ7CisgIGNoYXIgKmNvbmZpZ19maWxlOworICBjaGFyICp0eXBlOworICBjaGFyICpzZXJ2aWNlaGVscGVyOworICBjaGFyICphZGRyZXNzOworICBjaGFyICpwaWRmaWxlOworICBjaGFyICp1c2VyOworICBjaGFyICpsb2dfcHJlZml4OworICBEQnVzTG9vcCAqbG9vcDsKKyAgREJ1c0xpc3QgKnNlcnZlcnM7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNQb2xpY3kgKnBvbGljeTsKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKyAgQnVzTGltaXRzIGxpbWl0czsKKyAgdW5zaWduZWQgaW50IGZvcmsgOiAxOworICB1bnNpZ25lZCBpbnQgc3lzbG9nIDogMTsKKyAgdW5zaWduZWQgaW50IGtlZXBfdW1hc2sgOiAxOworICB1bnNpZ25lZCBpbnQgYWxsb3dfYW5vbnltb3VzIDogMTsKKyAgdW5zaWduZWQgaW50IHN5c3RlbWRfYWN0aXZhdGlvbiA6IDE7Cit9OworCitzdGF0aWMgZGJ1c19pbnQzMl90IHNlcnZlcl9kYXRhX3Nsb3QgPSAtMTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKK30gQnVzU2VydmVyRGF0YTsKKworI2RlZmluZSBCVVNfU0VSVkVSX0RBVEEoc2VydmVyKSAoZGJ1c19zZXJ2ZXJfZ2V0X2RhdGEgKChzZXJ2ZXIpLCBzZXJ2ZXJfZGF0YV9zbG90KSkKKworc3RhdGljIEJ1c0NvbnRleHQqCitzZXJ2ZXJfZ2V0X2NvbnRleHQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgQnVzU2VydmVyRGF0YSAqYmQ7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KSkKKyAgICByZXR1cm4gTlVMTDsKKworICBiZCA9IEJVU19TRVJWRVJfREFUQSAoc2VydmVyKTsKKyAgaWYgKGJkID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBjb250ZXh0ID0gYmQtPmNvbnRleHQ7CisKKyAgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KTsKKworICByZXR1cm4gY29udGV4dDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2ZXJfd2F0Y2hfY2FsbGJhY2sgKERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIC8qIEZJWE1FIHRoaXMgY2FuIGJlIGRvbmUgaW4gZGJ1cy1tYWlubG9vcC5jCisgICAqIGlmIHRoZSBjb2RlIGluIGFjdGl2YXRpb24uYyBmb3IgdGhlIGJhYnlzaXR0ZXIKKyAgICogd2F0Y2ggaGFuZGxlciBpcyBmaXhlZC4KKyAgICovCisKKyAgcmV0dXJuIGRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfc2VydmVyX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGRhdGE7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyAgY29udGV4dCA9IHNlcnZlcl9nZXRfY29udGV4dCAoc2VydmVyKTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfd2F0Y2ggKGNvbnRleHQtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIHNlcnZlcl93YXRjaF9jYWxsYmFjaywgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNvbnRleHQtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgc2VydmVyX3dhdGNoX2NhbGxiYWNrLCBzZXJ2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfdGltZW91dF9jYWxsYmFjayAoREJ1c1RpbWVvdXQgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKQoreworICAvKiBjYW4gcmV0dXJuIEZBTFNFIG9uIE9PTSBidXQgd2UganVzdCBsZXQgaXQgZmlyZSBhZ2FpbiBsYXRlciAqLworICBkYnVzX3RpbWVvdXRfaGFuZGxlICh0aW1lb3V0KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfc2VydmVyX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBjb250ZXh0ID0gc2VydmVyX2dldF9jb250ZXh0IChzZXJ2ZXIpOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF90aW1lb3V0IChjb250ZXh0LT5sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwgc2VydmVyX3RpbWVvdXRfY2FsbGJhY2ssIHNlcnZlciwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VydmVyX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBjb250ZXh0ID0gc2VydmVyX2dldF9jb250ZXh0IChzZXJ2ZXIpOworCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNvbnRleHQtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIHNlcnZlcl90aW1lb3V0X2NhbGxiYWNrLCBzZXJ2ZXIpOworfQorCitzdGF0aWMgdm9pZAorbmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2sgKERCdXNTZXJ2ZXIgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0ID0gZGF0YTsKKworICBpZiAoIWJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uIChjb250ZXh0LT5jb25uZWN0aW9ucywgbmV3X2Nvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gc2V0dXAgbmV3IGNvbm5lY3Rpb25cbiIpOworCisgICAgICAvKiBpZiB3ZSBkb24ndCBkbyB0aGlzLCBpdCB3aWxsIGdldCB1bnJlZidkIHdpdGhvdXQKKyAgICAgICAqIGJlaW5nIGRpc2Nvbm5lY3RlZC4uLiBraW5kIG9mIHN0cmFuZ2UgcmVhbGx5CisgICAgICAgKiB0aGF0IHdlIGhhdmUgdG8gZG8gdGhpcywgcGVvcGxlIHdvbid0IGdldCBpdCByaWdodAorICAgICAgICogaW4gZ2VuZXJhbC4KKyAgICAgICAqLworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChuZXdfY29ubmVjdGlvbik7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5saW1pdHMubWF4X2luY29taW5nX2J5dGVzKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfbWVzc2FnZV9zaXplKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfaW5jb21pbmdfdW5peF9mZHMpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfbWVzc2FnZV91bml4X2Zkcyk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+YWxsb3dfYW5vbnltb3VzKTsKKworICAvKiBvbiBPT00sIHdlIHdvbid0IGhhdmUgcmVmJ2QgdGhlIGNvbm5lY3Rpb24gc28gaXQgd2lsbCBkaWUuICovCit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3NlcnZlcl9kYXRhICh2b2lkICpkYXRhKQoreworICBCdXNTZXJ2ZXJEYXRhICpiZCA9IGRhdGE7CisKKyAgZGJ1c19mcmVlIChiZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0dXBfc2VydmVyIChCdXNDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICBEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgIGNoYXIgICAgICAqKmF1dGhfbWVjaGFuaXNtcywKKyAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c1NlcnZlckRhdGEgKmJkOworCisgIGJkID0gZGJ1c19uZXcwIChCdXNTZXJ2ZXJEYXRhLCAxKTsKKyAgaWYgKGJkID09IE5VTEwgfHwgIWRidXNfc2VydmVyX3NldF9kYXRhIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2RhdGFfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZCwgZnJlZV9zZXJ2ZXJfZGF0YSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChiZCk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBiZC0+Y29udGV4dCA9IGNvbnRleHQ7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zIChzZXJ2ZXIsIChjb25zdCBjaGFyKiopIGF1dGhfbWVjaGFuaXNtcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgTlVMTCk7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3NlcnZlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfc2VydmVyX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfc2VydmVyX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLCBOVUxMKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogVGhpcyBjb2RlIG9ubHkgZ2V0cyBleGVjdXRlZCB0aGUgZmlyc3QgdGltZSB0aGUKKyAqIGNvbmZpZyBmaWxlcyBhcmUgcGFyc2VkLiAgSXQgaXMgbm90IGV4ZWN1dGVkCisgKiB3aGVuIGNvbmZpZyBmaWxlcyBhcmUgcmVsb2FkZWQuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5IChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorCQkJCUJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICBzeXN0ZW1kX2FjdGl2YXRpb24sCisJCQkJREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgbG9nX3ByZWZpeDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICoqYWRkcmVzc2VzOworICBjb25zdCBjaGFyICp1c2VyLCAqcGlkZmlsZTsKKyAgY2hhciAqKmF1dGhfbWVjaGFuaXNtczsKKyAgREJ1c0xpc3QgKiphdXRoX21lY2hhbmlzbXNfbGlzdDsKKyAgaW50IGxlbjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IEZBTFNFOworICBhdXRoX21lY2hhbmlzbXMgPSBOVUxMOworCisgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoKTsKKworICBjb250ZXh0LT5zeXN0ZW1kX2FjdGl2YXRpb24gPSBzeXN0ZW1kX2FjdGl2YXRpb247CisKKyAgLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIHBpZCBmaWxlLiBPZiBjb3Vyc2UgdGhpcyBpcyBhIHJhY2U7CisgICAqIHdlJ2QgaGF2ZSB0byB1c2UgZmNudGwoKSBsb2NrcyBvbiB0aGUgcGlkIGZpbGUgdG8KKyAgICogYXZvaWQgdGhhdC4gQnV0IHdlIHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBwaWQgZmlsZQorICAgKiBiZWZvcmUgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHNvY2tldHMsIGV0Yy4KKyAgICovCisgIHBpZGZpbGUgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfcGlkZmlsZSAocGFyc2VyKTsKKyAgaWYgKHBpZGZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHU7CisgICAgICBEQnVzU3RhdCBzdGJ1ZjsKKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCBwaWRmaWxlKTsKKworICAgICAgaWYgKF9kYnVzX3N0YXQgKCZ1LCAmc3RidWYsIE5VTEwpKQorICAgICAgICB7CisjaWZkZWYgREJVU19DWUdXSU4KKyAgICAgICAgICBEQnVzU3RyaW5nIHA7CisgICAgICAgICAgbG9uZyAvKiBpbnQgKi8gcGlkOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXQgKCZwKTsKKyAgICAgICAgICBfZGJ1c19maWxlX2dldF9jb250ZW50cygmcCwgJnUsIE5VTEwpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19wYXJzZV9pbnQoJnAsIDAsICZwaWQsIE5VTEwpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZwKTsKKworICAgICAgICAgIGlmICgoa2lsbCgoaW50KXBpZCwgMCkpKSB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvcihOVUxMLCBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpZCAlbGQgbm90IHJ1bm5pbmcsIHJlbW92aW5nIHN0YWxlIHBpZCBmaWxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgICAgIF9kYnVzX2RlbGV0ZV9maWxlKCZ1LCBOVUxMKTsKKyAgICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKwkJICAgICAgICAgICAgICAgICAgIlRoZSBwaWQgZmlsZSBcIiVzXCIgZXhpc3RzLCBpZiB0aGUgbWVzc2FnZSBidXMgaXMgbm90IHJ1bm5pbmcsIHJlbW92ZSB0aGlzIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRmaWxlKTsKKwkgICAgICBnb3RvIGZhaWxlZDsKKyNpZmRlZiBEQlVTX0NZR1dJTgorICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgIC8qIGtlZXAgYXJvdW5kIHRoZSBwaWQgZmlsZW5hbWUgc28gd2UgY2FuIGRlbGV0ZSBpdCBsYXRlciAqLworICBjb250ZXh0LT5waWRmaWxlID0gX2RidXNfc3RyZHVwIChwaWRmaWxlKTsKKworICAvKiBub3RlIHRoYXQgdHlwZSBtYXkgYmUgTlVMTCAqLworICBjb250ZXh0LT50eXBlID0gX2RidXNfc3RyZHVwIChidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAocGFyc2VyKSk7CisgIGlmIChidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAocGFyc2VyKSAhPSBOVUxMICYmIGNvbnRleHQtPnR5cGUgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICB1c2VyID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKHBhcnNlcik7CisgIGlmICh1c2VyICE9IE5VTEwpCisgICAgeworICAgICAgY29udGV4dC0+dXNlciA9IF9kYnVzX3N0cmR1cCAodXNlcik7CisgICAgICBpZiAoY29udGV4dC0+dXNlciA9PSBOVUxMKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyogU2V0IHVwIHRoZSBwcmVmaXggZm9yIHN5c2xvZyBtZXNzYWdlcyAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbG9nX3ByZWZpeCkpCisgICAgZ290byBvb207CisgIGlmIChjb250ZXh0LT50eXBlICYmICFzdHJjbXAgKGNvbnRleHQtPnR5cGUsICJzeXN0ZW0iKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZsb2dfcHJlZml4LCAiW3N5c3RlbV0gIikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZSBpZiAoY29udGV4dC0+dHlwZSAmJiAhc3RyY21wIChjb250ZXh0LT50eXBlLCAic2Vzc2lvbiIpKQorICAgIHsKKyAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7CisKKyAgICAgIGNyZWRlbnRpYWxzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgICAgaWYgKCFjcmVkZW50aWFscykKKyAgICAgICAgZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZsb2dfcHJlZml4LCAiW3Nlc3Npb24gIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX3RvX3N0cmluZ19hcHBlbmQgKGNyZWRlbnRpYWxzLCAmbG9nX3ByZWZpeCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZsb2dfcHJlZml4LCAiXSAiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgfQorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmbG9nX3ByZWZpeCwgJmNvbnRleHQtPmxvZ19wcmVmaXgpKQorICAgIGdvdG8gb29tOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxvZ19wcmVmaXgpOworCisgIC8qIEJ1aWxkIGFuIGFycmF5IG9mIGF1dGggbWVjaGFuaXNtcyAqLworCisgIGF1dGhfbWVjaGFuaXNtc19saXN0ID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X21lY2hhbmlzbXMgKHBhcnNlcik7CisgIGxlbiA9IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoYXV0aF9tZWNoYW5pc21zX2xpc3QpOworCisgIGlmIChsZW4gPiAwKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBhdXRoX21lY2hhbmlzbXMgPSBkYnVzX25ldzAgKGNoYXIqLCBsZW4gKyAxKTsKKyAgICAgIGlmIChhdXRoX21lY2hhbmlzbXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGkgPSAwOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGF1dGhfbWVjaGFuaXNtc19saXN0KTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBhdXRoX21lY2hhbmlzbXNbaV0gPSBfZGJ1c19zdHJkdXAgKGxpbmstPmRhdGEpOworICAgICAgICAgIGlmIChhdXRoX21lY2hhbmlzbXNbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gb29tOworICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGF1dGhfbWVjaGFuaXNtc19saXN0LCBsaW5rKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGF1dGhfbWVjaGFuaXNtcyA9IE5VTEw7CisgICAgfQorCisgIC8qIExpc3RlbiBvbiBvdXIgYWRkcmVzc2VzICovCisKKyAgaWYgKGFkZHJlc3MpCisgICAgeworICAgICAgREJ1c1NlcnZlciAqc2VydmVyOworCisgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShhZGRyZXNzKSwgZXJyb3IpOworICAgICAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc2V0dXBfc2VydmVyIChjb250ZXh0LCBzZXJ2ZXIsIGF1dGhfbWVjaGFuaXNtcywgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb250ZXh0LT5zZXJ2ZXJzLCBzZXJ2ZXIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhZGRyZXNzZXMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWRkcmVzc2VzIChwYXJzZXIpOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoYWRkcmVzc2VzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisKKyAgICAgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpbmstPmRhdGEsIGVycm9yKTsKKyAgICAgICAgICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoIXNldHVwX3NlcnZlciAoY29udGV4dCwgc2VydmVyLCBhdXRoX21lY2hhbmlzbXMsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb250ZXh0LT5zZXJ2ZXJzLCBzZXJ2ZXIpKQorICAgICAgICAgICAgZ290byBvb207CisKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChhZGRyZXNzZXMsIGxpbmspOworICAgICAgICB9CisgICAgfQorCisgIGNvbnRleHQtPmZvcmsgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfZm9yayAocGFyc2VyKTsKKyAgY29udGV4dC0+c3lzbG9nID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3N5c2xvZyAocGFyc2VyKTsKKyAgY29udGV4dC0+a2VlcF91bWFzayA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9rZWVwX3VtYXNrIChwYXJzZXIpOworICBjb250ZXh0LT5hbGxvd19hbm9ueW1vdXMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChwYXJzZXIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhdXRoX21lY2hhbmlzbXMpOworICByZXR1cm4gcmV0dmFsOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhdXRoX21lY2hhbmlzbXMpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIFRoaXMgY29kZSBnZXRzIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgdGhlIGNvbmZpZyBmaWxlcworICogYXJlIHBhcnNlZDogYm90aCBkdXJpbmcgQnVzQ29udGV4dCBjb25zdHJ1Y3Rpb24KKyAqIGFuZCBvbiByZWxvYWRzLiBUaGlzIGZ1bmN0aW9uIGlzIHNsaWdodGx5IHNjcmV3eQorICogc2luY2UgaXQgY2FuIGRvIGEgImhhbGYgcmVsb2FkIiBpbiBvdXQtb2YtbWVtb3J5CisgKiBzaXR1YXRpb25zLiBSZWFsaXN0aWNhbGx5LCB1bmxpa2VseSB0byBldmVyIG1hdHRlci4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQsCisJCQkgICBCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKwkJCSAgIGRidXNfYm9vbF90ICAgICAgaXNfcmVsb2FkLAorCQkJICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBmdWxsX2FkZHJlc3M7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzTGlzdCAqKmRpcnM7CisgIEJ1c0FjdGl2YXRpb24gKm5ld19hY3RpdmF0aW9uOworICBjaGFyICphZGRyOworICBjb25zdCBjaGFyICpzZXJ2aWNlaGVscGVyOworICBjaGFyICpzOworCisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhZGRyID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfYWRkcmVzcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogZ2V0IG91ciBsaW1pdHMgYW5kIHRpbWVvdXQgbGVuZ3RocyAqLworICBidXNfY29uZmlnX3BhcnNlcl9nZXRfbGltaXRzIChwYXJzZXIsICZjb250ZXh0LT5saW1pdHMpOworCisgIGlmIChjb250ZXh0LT5wb2xpY3kpCisgICAgYnVzX3BvbGljeV91bnJlZiAoY29udGV4dC0+cG9saWN5KTsKKyAgY29udGV4dC0+cG9saWN5ID0gYnVzX2NvbmZpZ19wYXJzZXJfc3RlYWxfcG9saWN5IChwYXJzZXIpOworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQtPnBvbGljeSAhPSBOVUxMKTsKKworICAvKiBXZSBoYXZlIHRvIGJ1aWxkIHRoZSBhZGRyZXNzIGJhY2t3YXJkLCBzbyB0aGF0CisgICAqIDxsaXN0ZW4+IGxhdGVyIGluIHRoZSBjb25maWcgZmlsZSBoYXZlIHByaW9yaXR5CisgICAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmY29udGV4dC0+c2VydmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChsaW5rLT5kYXRhKTsKKyAgICAgIGlmIChhZGRyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmZ1bGxfYWRkcmVzcykgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9hZGRyZXNzLCAiOyIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX2FkZHJlc3MsIGFkZHIpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGFkZHIpOworICAgICAgYWRkciA9IE5VTEw7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmsgKCZjb250ZXh0LT5zZXJ2ZXJzLCBsaW5rKTsKKyAgICB9CisKKyAgaWYgKGlzX3JlbG9hZCkKKyAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPmFkZHJlc3MpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoJmZ1bGxfYWRkcmVzcywgJmNvbnRleHQtPmFkZHJlc3MpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogZ2V0IHRoZSBzZXJ2aWNlIGRpcmVjdG9yaWVzICovCisgIGRpcnMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChwYXJzZXIpOworCisgIC8qIGFuZCB0aGUgc2VydmljZSBoZWxwZXIgKi8KKyAgc2VydmljZWhlbHBlciA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlaGVscGVyIChwYXJzZXIpOworCisgIHMgPSBfZGJ1c19zdHJkdXAoc2VydmljZWhlbHBlcik7CisgIGlmIChzID09IE5VTEwgJiYgc2VydmljZWhlbHBlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2ZyZWUoY29udGV4dC0+c2VydmljZWhlbHBlcik7CisgICAgICBjb250ZXh0LT5zZXJ2aWNlaGVscGVyID0gczsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGFjdGl2YXRpb24gc3Vic3lzdGVtICovCisgIGlmIChjb250ZXh0LT5hY3RpdmF0aW9uKQorICAgIHsKKyAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fcmVsb2FkIChjb250ZXh0LT5hY3RpdmF0aW9uLCAmZnVsbF9hZGRyZXNzLCBkaXJzLCBlcnJvcikpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnRleHQtPmFjdGl2YXRpb24gPSBidXNfYWN0aXZhdGlvbl9uZXcgKGNvbnRleHQsICZmdWxsX2FkZHJlc3MsIGRpcnMsIGVycm9yKTsKKyAgICB9CisKKyAgaWYgKGNvbnRleHQtPmFjdGl2YXRpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHZhbCA9IFRSVUU7CisKKyBmYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9hZGRyZXNzKTsKKworICBpZiAoYWRkcikKKyAgICBkYnVzX2ZyZWUgKGFkZHIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGlzdF9jb25jYXRfbmV3IChEQnVzTGlzdCAqKmEsCisgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqYiwKKyAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKipyZXN1bHQpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgICpyZXN1bHQgPSBOVUxMOworCisgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGEpOyBsaW5rOyBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChhLCBsaW5rKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChyZXN1bHQsIGxpbmstPmRhdGEpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGIpOyBsaW5rOyBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChiLCBsaW5rKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChyZXN1bHQsIGxpbmstPmRhdGEpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Citvb206CisgIF9kYnVzX2xpc3RfY2xlYXIgKHJlc3VsdCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK3JhaXNlX2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAoQnVzQ29udGV4dCAgICAgICpjb250ZXh0KQoreworCisgIC8qIEkganVzdCBwaWNrZWQgdGhpcyBvdXQgb2YgdGhpbiBhaXI7IHdlIG5lZWQgc29tZSBleHRyYQorICAgKiBkZXNjcmlwdG9ycyBmb3IgdGhpbmdzIGxpa2UgYW55IGludGVybmFsIHBpcGVzIHdlIGNyZWF0ZSwKKyAgICogaW5vdGlmeSwgY29ubmVjdGlvbnMgdG8gU0VMaW51eCwgZXRjLgorICAgKi8KKyAgdW5zaWduZWQgaW50IGFyYml0cmFyeV9leHRyYV9mZHMgPSAzMjsKKyAgdW5zaWduZWQgaW50IGxpbWl0OworCisgIGxpbWl0ID0gY29udGV4dC0+bGltaXRzLm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgKworICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucworICAgICsgYXJiaXRyYXJ5X2V4dHJhX2ZkczsKKworICBfZGJ1c19yZXF1ZXN0X2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAobGltaXQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfY29uZmlnX3Bvc3Rpbml0IChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQsCisJCQkgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisJCQkgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c0hhc2hUYWJsZSAqc2VydmljZV9jb250ZXh0X3RhYmxlOworICBEQnVzTGlzdCAqd2F0Y2hlZF9kaXJzID0gTlVMTDsKKworICByYWlzZV9maWxlX2Rlc2NyaXB0b3JfbGltaXQgKGNvbnRleHQpOworCisgIHNlcnZpY2VfY29udGV4dF90YWJsZSA9IGJ1c19jb25maWdfcGFyc2VyX3N0ZWFsX3NlcnZpY2VfY29udGV4dF90YWJsZSAocGFyc2VyKTsKKyAgaWYgKCFidXNfcmVnaXN0cnlfc2V0X3NlcnZpY2VfY29udGV4dF90YWJsZSAoY29udGV4dC0+cmVnaXN0cnksCisJCQkJCSAgICAgICBzZXJ2aWNlX2NvbnRleHRfdGFibGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHNlcnZpY2VfY29udGV4dF90YWJsZSk7CisKKyAgLyogV2UgbmVlZCB0byBtb25pdG9yIGJvdGggdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgYW5kIGRpcmVjdG9yaWVzCisgICAqIGNvbnRhaW5pbmcgLnNlcnZpY2UgZmlsZXMuCisgICAqLworICBpZiAoIWxpc3RfY29uY2F0X25ldyAoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2NvbmZfZGlycyAocGFyc2VyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKHBhcnNlciksCisgICAgICAgICAgICAgICAgICAgICAgICAmd2F0Y2hlZF9kaXJzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfc2V0X3dhdGNoZWRfZGlycyAoY29udGV4dCwgJndhdGNoZWRfZGlycyk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJndhdGNoZWRfZGlycyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0J1c0NvbnRleHQqCitidXNfY29udGV4dF9uZXcgKGNvbnN0IERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAgICBGb3JjZUZvcmtTZXR0aW5nICBmb3JjZV9mb3JrLAorICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9hZGRyX3BpcGUsCisgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgIHN5c3RlbWRfYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgbG9nX3ByZWZpeDsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgY29udGV4dCA9IE5VTEw7CisgIHBhcnNlciA9IE5VTEw7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGNvbnRleHQgPSBkYnVzX25ldzAgKEJ1c0NvbnRleHQsIDEpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGNvbnRleHQtPnJlZmNvdW50ID0gMTsKKworICBfZGJ1c19nZW5lcmF0ZV91dWlkICgmY29udGV4dC0+dXVpZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChjb25maWdfZmlsZSwgJmNvbnRleHQtPmNvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGNvbnRleHQtPmxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgaWYgKGNvbnRleHQtPmxvb3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGNvbnRleHQtPnJlZ2lzdHJ5ID0gYnVzX3JlZ2lzdHJ5X25ldyAoY29udGV4dCk7CisgIGlmIChjb250ZXh0LT5yZWdpc3RyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChjb25maWdfZmlsZSwgVFJVRSwgTlVMTCwgZXJyb3IpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5IChjb250ZXh0LCBwYXJzZXIsIGFkZHJlc3MsIHN5c3RlbWRfYWN0aXZhdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChjb250ZXh0LCBwYXJzZXIsIEZBTFNFLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIHdlIG5lZWQgYW5vdGhlciByZWYgb2YgdGhlIHNlcnZlciBkYXRhIHNsb3QgZm9yIHRoZSBjb250ZXh0CisgICAqIHRvIG93bgorICAgKi8KKyAgaWYgKCFkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZWNvbmQgcmVmIG9mIHNlcnZlciBkYXRhIHNsb3QgZmFpbGVkIik7CisKKyAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgcHJpbnRfYWRkcl9waXBlIGlzCisgICAqIG9uZSBvZiB0aGUgc29ja2V0cyB3ZSdyZSB1c2luZyB0byBsaXN0ZW4gb24sIG9yIHNvbWUKKyAgICogb3RoZXIgcmFuZG9tIHRoaW5nLiBCdXQgSSB0aGluayB0aGUgYW5zd2VyIGlzICJkb24ndCBkbworICAgKiB0aGF0IHRoZW4iCisgICAqLworICBpZiAocHJpbnRfYWRkcl9waXBlICE9IE5VTEwgJiYgX2RidXNfcGlwZV9pc192YWxpZCAocHJpbnRfYWRkcl9waXBlKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGFkZHI7CisgICAgICBjb25zdCBjaGFyICphID0gYnVzX2NvbnRleHRfZ2V0X2FkZHJlc3MgKGNvbnRleHQpOworICAgICAgaW50IGJ5dGVzOworCisgICAgICBfZGJ1c19hc3NlcnQgKGEgIT0gTlVMTCk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHIsIGEpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyLCAiXG4iKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYWRkcik7CisgICAgICBpZiAoX2RidXNfcGlwZV93cml0ZSAocHJpbnRfYWRkcl9waXBlLCAmYWRkciwgMCwgYnl0ZXMsIGVycm9yKSAhPSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgIC8qIHBpcGUgd3JpdGUgcmV0dXJucyBhbiBlcnJvciBvbiBmYWlsdXJlIGJ1dCBub3Qgc2hvcnQgd3JpdGUgKi8KKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmludGluZyBtZXNzYWdlIGJ1cyBhZGRyZXNzOiBkaWQgbm90IHdyaXRlIGFsbCBieXRlc1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3BpcGVfaXNfc3Rkb3V0X29yX3N0ZGVyciAocHJpbnRfYWRkcl9waXBlKSkKKyAgICAgICAgX2RidXNfcGlwZV9jbG9zZSAocHJpbnRfYWRkcl9waXBlLCBOVUxMKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyKTsKKyAgICB9CisKKyAgY29udGV4dC0+Y29ubmVjdGlvbnMgPSBidXNfY29ubmVjdGlvbnNfbmV3IChjb250ZXh0KTsKKyAgaWYgKGNvbnRleHQtPmNvbm5lY3Rpb25zID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb250ZXh0LT5tYXRjaG1ha2VyID0gYnVzX21hdGNobWFrZXJfbmV3ICgpOworICBpZiAoY29udGV4dC0+bWF0Y2htYWtlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogY2hlY2sgdXNlciBiZWZvcmUgd2UgZm9yayAqLworICBpZiAoY29udGV4dC0+dXNlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyIChjb250ZXh0LT51c2VyKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IFVJRCBhbmQgR0lEIGZvciB1c2VybmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT51c2VyKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3cgYmVjb21lIGEgZGFlbW9uIGlmIGFwcHJvcHJpYXRlIGFuZCB3cml0ZSBvdXQgcGlkIGZpbGUgaW4gYW55IGNhc2UgKi8KKyAgeworICAgIERCdXNTdHJpbmcgdTsKKworICAgIGlmIChjb250ZXh0LT5waWRmaWxlKQorICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCBjb250ZXh0LT5waWRmaWxlKTsKKworICAgIGlmICgoZm9yY2VfZm9yayAhPSBGT1JLX05FVkVSICYmIGNvbnRleHQtPmZvcmspIHx8IGZvcmNlX2ZvcmsgPT0gRk9SS19BTFdBWVMpCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGb3JraW5nIGFuZCBiZWNvbWluZyBkYWVtb25cbiIpOworCisgICAgICAgIGlmICghX2RidXNfYmVjb21lX2RhZW1vbiAoY29udGV4dC0+cGlkZmlsZSA/ICZ1IDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5rZWVwX3VtYXNrKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlICgiRm9yayBub3QgcmVxdWVzdGVkXG4iKTsKKworICAgICAgICAvKiBOZWVkIHRvIHdyaXRlIFBJRCBmaWxlIGFuZCB0byBQSUQgcGlwZSBmb3Igb3Vyc2VsdmVzLAorICAgICAgICAgKiBub3QgZm9yIHRoZSBjaGlsZCBwcm9jZXNzLiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIHBpZGZpbGUKKyAgICAgICAgICogaXMgTlVMTCBhbmQgcHJpbnRfcGlkX3BpcGUgaXMgTlVMTC4KKyAgICAgICAgICovCisgICAgICAgIGlmICghX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKGNvbnRleHQtPnBpZGZpbGUgPyAmdSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRwaWQgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKworICBpZiAocHJpbnRfcGlkX3BpcGUgJiYgX2RidXNfcGlwZV9pc192YWxpZCAocHJpbnRfcGlkX3BpcGUpICYmCisgICAgICAhX2RidXNfcGlwZV9pc19zdGRvdXRfb3Jfc3RkZXJyIChwcmludF9waWRfcGlwZSkpCisgICAgX2RidXNfcGlwZV9jbG9zZSAocHJpbnRfcGlkX3BpcGUsIE5VTEwpOworCisgIGlmICghYnVzX3NlbGludXhfZnVsbF9pbml0ICgpKQorICAgIHsKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX0ZBVEFMLCAiU0VMaW51eCBlbmFibGVkIGJ1dCBBVkMgaW5pdGlhbGl6YXRpb24gZmFpbGVkOyBjaGVjayBzeXN0ZW0gbG9nXG4iKTsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdCAoY29udGV4dCwgcGFyc2VyLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgICAgIHBhcnNlciA9IE5VTEw7CisgICAgfQorCisgIC8qIEhlcmUgd2UgY2hhbmdlIG91ciBjcmVkZW50aWFscyBpZiByZXF1aXJlZCwKKyAgICogYXMgc29vbiBhcyB3ZSd2ZSBzZXQgdXAgb3VyIHNvY2tldHMgYW5kIHBpZGZpbGUKKyAgICovCisgIGlmIChjb250ZXh0LT51c2VyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgKGNvbnRleHQtPnVzZXIsIGVycm9yKSkKKwl7CisJICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisJICBnb3RvIGZhaWxlZDsKKwl9CisKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgICAgIC8qIEZJWE1FIC0gd2h5IG5vdCBqdXN0IHB1dCB0aGlzIGluIGZ1bGxfaW5pdCgpIGJlbG93PyAqLworICAgICAgYnVzX3NlbGludXhfYXVkaXRfaW5pdCAoKTsKKyNlbmRpZgorICAgIH0KKworICBkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpOworCisgIHJldHVybiBjb250ZXh0OworCisgZmFpbGVkOgorICBpZiAocGFyc2VyICE9IE5VTEwpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisgIGlmIChjb250ZXh0ICE9IE5VTEwpCisgICAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIGlmIChzZXJ2ZXJfZGF0YV9zbG90ID49IDApCisgICAgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KTsKKworICByZXR1cm4gTlVMTDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2dldF9pZCAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdXVpZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3V1aWRfZW5jb2RlICgmY29udGV4dC0+dXVpZCwgdXVpZCk7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29udGV4dF9yZWxvYWRfY29uZmlnIChCdXNDb250ZXh0ICpjb250ZXh0LAorCQkJICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgLyogRmx1c2ggdGhlIHVzZXIgZGF0YWJhc2UgY2FjaGUgKi8KKyAgX2RidXNfZmx1c2hfY2FjaGVzICgpOworCisgIHJldCA9IEZBTFNFOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbmZpZ19maWxlLCBjb250ZXh0LT5jb25maWdfZmlsZSk7CisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoJmNvbmZpZ19maWxlLCBUUlVFLCBOVUxMLCBlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChjb250ZXh0LCBwYXJzZXIsIFRSVUUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICghcHJvY2Vzc19jb25maWdfcG9zdGluaXQgKGNvbnRleHQsIHBhcnNlciwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgcmV0ID0gVFJVRTsKKworICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiUmVsb2FkZWQgY29uZmlndXJhdGlvbiIpOworIGZhaWxlZDoKKyAgaWYgKCFyZXQpCisgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIlVuYWJsZSB0byByZWxvYWQgY29uZmlndXJhdGlvbjogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3NodXRkb3duX3NlcnZlciAoQnVzQ29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAqc2VydmVyKQoreworICBpZiAoc2VydmVyID09IE5VTEwgfHwKKyAgICAgICFkYnVzX3NlcnZlcl9nZXRfaXNfY29ubmVjdGVkIChzZXJ2ZXIpKQorICAgIHJldHVybjsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyB3YXRjaCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoc2VydmVyKTsKK30KKwordm9pZAorYnVzX2NvbnRleHRfc2h1dGRvd24gKEJ1c0NvbnRleHQgICpjb250ZXh0KQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRleHQtPnNlcnZlcnMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNodXRkb3duX3NlcnZlciAoY29udGV4dCwgbGluay0+ZGF0YSk7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250ZXh0LT5zZXJ2ZXJzLCBsaW5rKTsKKyAgICB9Cit9CisKK0J1c0NvbnRleHQgKgorYnVzX2NvbnRleHRfcmVmIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQtPnJlZmNvdW50ID4gMCk7CisgIGNvbnRleHQtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X3VucmVmIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQtPnJlZmNvdW50ID4gMCk7CisgIGNvbnRleHQtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGNvbnRleHQtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaW5hbGl6aW5nIGJ1cyBjb250ZXh0ICVwXG4iLCBjb250ZXh0KTsKKworICAgICAgYnVzX2NvbnRleHRfc2h1dGRvd24gKGNvbnRleHQpOworCisgICAgICBpZiAoY29udGV4dC0+Y29ubmVjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbnNfdW5yZWYgKGNvbnRleHQtPmNvbm5lY3Rpb25zKTsKKyAgICAgICAgICBjb250ZXh0LT5jb25uZWN0aW9ucyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbnRleHQtPnJlZ2lzdHJ5KQorICAgICAgICB7CisgICAgICAgICAgYnVzX3JlZ2lzdHJ5X3VucmVmIChjb250ZXh0LT5yZWdpc3RyeSk7CisgICAgICAgICAgY29udGV4dC0+cmVnaXN0cnkgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChjb250ZXh0LT5hY3RpdmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2FjdGl2YXRpb25fdW5yZWYgKGNvbnRleHQtPmFjdGl2YXRpb24pOworICAgICAgICAgIGNvbnRleHQtPmFjdGl2YXRpb24gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGV4dC0+c2VydmVycyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKGxpbmstPmRhdGEpOworCisgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRleHQtPnNlcnZlcnMsIGxpbmspOworICAgICAgICB9CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmY29udGV4dC0+c2VydmVycyk7CisKKyAgICAgIGlmIChjb250ZXh0LT5wb2xpY3kpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfcG9saWN5X3VucmVmIChjb250ZXh0LT5wb2xpY3kpOworICAgICAgICAgIGNvbnRleHQtPnBvbGljeSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbnRleHQtPmxvb3ApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19sb29wX3VucmVmIChjb250ZXh0LT5sb29wKTsKKyAgICAgICAgICBjb250ZXh0LT5sb29wID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoY29udGV4dC0+bWF0Y2htYWtlcikKKyAgICAgICAgeworICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChjb250ZXh0LT5tYXRjaG1ha2VyKTsKKyAgICAgICAgICBjb250ZXh0LT5tYXRjaG1ha2VyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPmNvbmZpZ19maWxlKTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+bG9nX3ByZWZpeCk7CisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnR5cGUpOworICAgICAgZGJ1c19mcmVlIChjb250ZXh0LT5hZGRyZXNzKTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+dXNlcik7CisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnNlcnZpY2VoZWxwZXIpOworCisgICAgICBpZiAoY29udGV4dC0+cGlkZmlsZSkKKwl7CisgICAgICAgICAgREJ1c1N0cmluZyB1OworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgY29udGV4dC0+cGlkZmlsZSk7CisKKyAgICAgICAgICAvKiBEZWxpYmVyYXRlbHkgaWdub3JlIGVycm9ycyBoZXJlLCBzaW5jZSB0aGVyZSdzIG5vdCBtdWNoCisJICAgKiB3ZSBjYW4gZG8gYWJvdXQgaXQsIGFuZCB3ZSdyZSBleGl0aW5nIGFueXdheXMuCisJICAgKi8KKwkgIF9kYnVzX2RlbGV0ZV9maWxlICgmdSwgTlVMTCk7CisKKyAgICAgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPnBpZGZpbGUpOworCX0KKyAgICAgIGRidXNfZnJlZSAoY29udGV4dCk7CisKKyAgICAgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCk7CisgICAgfQorfQorCisvKiB0eXBlIG1heSBiZSBOVUxMICovCitjb25zdCBjaGFyKgorYnVzX2NvbnRleHRfZ2V0X3R5cGUgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT50eXBlOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbnRleHRfZ2V0X2FkZHJlc3MgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5hZGRyZXNzOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5zZXJ2aWNlaGVscGVyOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbnRleHRfZ2V0X3N5c3RlbWRfYWN0aXZhdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnN5c3RlbWRfYWN0aXZhdGlvbjsKK30KKworQnVzUmVnaXN0cnkqCitidXNfY29udGV4dF9nZXRfcmVnaXN0cnkgKEJ1c0NvbnRleHQgICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+cmVnaXN0cnk7Cit9CisKK0J1c0Nvbm5lY3Rpb25zKgorYnVzX2NvbnRleHRfZ2V0X2Nvbm5lY3Rpb25zIChCdXNDb250ZXh0ICAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmNvbm5lY3Rpb25zOworfQorCitCdXNBY3RpdmF0aW9uKgorYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb24gKEJ1c0NvbnRleHQgICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+YWN0aXZhdGlvbjsKK30KKworQnVzTWF0Y2htYWtlcioKK2J1c19jb250ZXh0X2dldF9tYXRjaG1ha2VyIChCdXNDb250ZXh0ICAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPm1hdGNobWFrZXI7Cit9CisKK0RCdXNMb29wKgorYnVzX2NvbnRleHRfZ2V0X2xvb3AgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5sb29wOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbnRleHRfYWxsb3dfdW5peF91c2VyIChCdXNDb250ZXh0ICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWlkKQoreworICByZXR1cm4gYnVzX3BvbGljeV9hbGxvd191bml4X3VzZXIgKGNvbnRleHQtPnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworfQorCisvKiBGb3Igbm93IHRoaXMgaXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQKKyAqIERCdXNDb25uZWN0aW9uIGJlaGF2aW9yIG9mICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZSBidXMgY2FuIGNvbm5lY3QnCisgKiBpcyBhbGwgaXQgd291bGQgZG8uCisgKi8KK2RidXNfYm9vbF90CitidXNfY29udGV4dF9hbGxvd193aW5kb3dzX3VzZXIgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKndpbmRvd3Nfc2lkKQoreworICByZXR1cm4gYnVzX3BvbGljeV9hbGxvd193aW5kb3dzX3VzZXIgKGNvbnRleHQtPnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzX3NpZCk7Cit9CisKK0J1c1BvbGljeSAqCitidXNfY29udGV4dF9nZXRfcG9saWN5IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+cG9saWN5OworfQorCitCdXNDbGllbnRQb2xpY3kqCitidXNfY29udGV4dF9jcmVhdGVfY2xpZW50X3BvbGljeSAoQnVzQ29udGV4dCAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dXJuIGJ1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kgKGNvbnRleHQtPnBvbGljeSwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbl90aW1lb3V0IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworCisgIHJldHVybiBjb250ZXh0LT5saW1pdHMuYWN0aXZhdGlvbl90aW1lb3V0OworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9hdXRoX3RpbWVvdXQgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMuYXV0aF90aW1lb3V0OworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnM7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfcGVuZGluZ19hY3RpdmF0aW9uczsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X3NlcnZpY2VzX3Blcl9jb25uZWN0aW9uIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbjsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbjsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb247Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X3JlcGx5X3RpbWVvdXQgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMucmVwbHlfdGltZW91dDsKK30KKwordm9pZAorYnVzX2NvbnRleHRfbG9nIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIgKm1zZywgLi4uKSBfREJVU19HTlVDX1BSSU5URiAoMywgNCk7CisKK3ZvaWQKK2J1c19jb250ZXh0X2xvZyAoQnVzQ29udGV4dCAqY29udGV4dCwgREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIGlmICghY29udGV4dC0+c3lzbG9nKQorICAgIHsKKyAgICAgIC8qIHdlJ3JlIG5vdCBzeXNsb2dnaW5nOyBqdXN0IG91dHB1dCB0byBzdGRlcnIgKi8KKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBtc2cpOworICAgICAgdmZwcmludGYgKHN0ZGVyciwgbXNnLCBhcmdzKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB2YV9zdGFydCAoYXJncywgbXNnKTsKKworICBpZiAoY29udGV4dC0+bG9nX3ByZWZpeCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfbXNnOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9tc2cpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfbXNnLCBjb250ZXh0LT5sb2dfcHJlZml4KSkKKyAgICAgICAgZ290byBvb21fb3V0OworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgKCZmdWxsX21zZywgbXNnLCBhcmdzKSkKKyAgICAgICAgZ290byBvb21fb3V0OworCisgICAgICBfZGJ1c19zeXN0ZW1fbG9nIChzZXZlcml0eSwgIiVzIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9tc2cpKTsKKyAgICBvb21fb3V0OgorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX21zZyk7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfc3lzdGVtX2xvZ3YgKHNldmVyaXR5LCBtc2csIGFyZ3MpOworCitvdXQ6CisgIHZhX2VuZCAoYXJncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCitub25udWxsIChjb25zdCBjaGFyICptYXliZV9udWxsLAorICAgICAgICAgY29uc3QgY2hhciAqaWZfbnVsbCkKK3sKKyAgcmV0dXJuIChtYXliZV9udWxsID8gbWF5YmVfbnVsbCA6IGlmX251bGwpOworfQorCisvKgorICogTG9nIHNvbWV0aGluZyBhYm91dCBhIG1lc3NhZ2UsIHVzdWFsbHkgdGhhdCBpdCB3YXMgcmVqZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitjb21wbGFpbl9hYm91dF9tZXNzYWdlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmNvbXBsYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBtYXRjaGVkX3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzRXJyb3Igc3RhY2tfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGNvbnN0IGNoYXIgKnNlbmRlcl9uYW1lOworICBjb25zdCBjaGFyICpzZW5kZXJfbG9naW5mbzsKKyAgY29uc3QgY2hhciAqcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm87CisKKyAgaWYgKGVycm9yID09IE5VTEwgJiYgIWxvZykKKyAgICByZXR1cm47CisKKyAgaWYgKHNlbmRlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNlbmRlcl9uYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKHNlbmRlcik7CisgICAgICBzZW5kZXJfbG9naW5mbyA9IGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChzZW5kZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNlbmRlcl9uYW1lID0gIih1bnNldCkiOworICAgICAgc2VuZGVyX2xvZ2luZm8gPSAiKGJ1cykiOworICAgIH0KKworICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwpCisgICAgcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm8gPSBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAocHJvcG9zZWRfcmVjaXBpZW50KTsKKyAgZWxzZQorICAgIHByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvID0gImJ1cyI7CisKKyAgZGJ1c19zZXRfZXJyb3IgKCZzdGFja19lcnJvciwgZXJyb3JfbmFtZSwKKyAgICAgICIlcywgJWQgbWF0Y2hlZCBydWxlczsgdHlwZT1cIiVzXCIsIHNlbmRlcj1cIiVzXCIgKCVzKSAiCisgICAgICAiaW50ZXJmYWNlPVwiJXNcIiBtZW1iZXI9XCIlc1wiIGVycm9yIG5hbWU9XCIlc1wiICIKKyAgICAgICJyZXF1ZXN0ZWRfcmVwbHk9XCIlZFwiIGRlc3RpbmF0aW9uPVwiJXNcIiAoJXMpIiwKKyAgICAgIGNvbXBsYWludCwKKyAgICAgIG1hdGNoZWRfcnVsZXMsCisgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgc2VuZGVyX25hbWUsCisgICAgICBzZW5kZXJfbG9naW5mbywKKyAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwgIih1bnNldCkiKSwKKyAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgIih1bnNldCkiKSwKKyAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksICIodW5zZXQpIiksCisgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSwgREJVU19TRVJWSUNFX0RCVVMpLAorICAgICAgcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm8pOworCisgIC8qIElmIHdlIGhpdCBPT00gd2hpbGUgc2V0dGluZyB0aGUgZXJyb3IsIHRoaXMgd2lsbCBzeXNsb2cgIm91dCBvZiBtZW1vcnkiCisgICAqIHdoaWNoIGlzIGl0c2VsZiBhbiBpbmRpY2F0aW9uIHRoYXQgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZyAqLworICBpZiAobG9nKQorICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLCAiJXMiLAorICAgICAgICBzdGFja19lcnJvci5tZXNzYWdlKTsKKworICBkYnVzX21vdmVfZXJyb3IgKCZzdGFja19lcnJvciwgZXJyb3IpOworfQorCisvKgorICogYWRkcmVzc2VkX3JlY2lwaWVudCBpcyB0aGUgcmVjaXBpZW50IHNwZWNpZmllZCBpbiB0aGUgbWVzc2FnZS4KKyAqCisgKiBwcm9wb3NlZF9yZWNpcGllbnQgaXMgdGhlIHJlY2lwaWVudCB3ZSdyZSBjb25zaWRlcmluZyBzZW5kaW5nCisgKiB0byByaWdodCB0aGlzIHNlY29uZCwgYW5kIG1heSBiZSBhbiBlYXZlc2Ryb3BwZXIuCisgKgorICogc2VuZGVyIGlzIHRoZSBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UuCisgKgorICogTlVMTCBmb3IgcHJvcG9zZWRfcmVjaXBpZW50IG9yIHNlbmRlciBkZWZpbml0ZWx5IG1lYW5zIHRoZSBidXMgZHJpdmVyLgorICoKKyAqIE5VTEwgZm9yIGFkZHJlc3NlZF9yZWNpcGllbnQgbWF5IG1lYW4gdGhlIGJ1cyBkcml2ZXIsIG9yIG1heSBtZWFuCisgKiBubyBkZXN0aW5hdGlvbiB3YXMgc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlIChlLmcuIGEgc2lnbmFsKS4KKyAqLworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmRlc3Q7CisgIEJ1c0NsaWVudFBvbGljeSAqc2VuZGVyX3BvbGljeTsKKyAgQnVzQ2xpZW50UG9saWN5ICpyZWNpcGllbnRfcG9saWN5OworICBkYnVzX2ludDMyX3QgdG9nZ2xlczsKKyAgZGJ1c19ib29sX3QgbG9nOworICBpbnQgdHlwZTsKKyAgZGJ1c19ib29sX3QgcmVxdWVzdGVkX3JlcGx5OworICBjb25zdCBjaGFyICpzZW5kZXJfbmFtZTsKKyAgY29uc3QgY2hhciAqc2VuZGVyX2xvZ2luZm87CisgIGNvbnN0IGNoYXIgKnByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvOworCisgIHR5cGUgPSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpOworICBkZXN0ID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyAgLyogZGlzcGF0Y2guYyB3YXMgc3VwcG9zZWQgdG8gZW5zdXJlIHRoZXNlIGludmFyaWFudHMgKi8KKyAgX2RidXNfYXNzZXJ0IChkZXN0ICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCB8fAorICAgICAgICAgICAgICAgIChzZW5kZXIgPT0gTlVMTCAmJiAhYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChwcm9wb3NlZF9yZWNpcGllbnQpKSk7CisgIF9kYnVzX2Fzc2VydCAodHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgfHwKKyAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAgKGRlc3QsIERCVVNfU0VSVklDRV9EQlVTKSA9PSAwKTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgY2hlY2sgZGlzYWxsb3dpbmcgbWVzc2FnZSBvZiB1bmtub3duIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgYnVzIHdpbGwgbm90IGFjY2VwdCBtZXNzYWdlcyBvZiB1bmtub3duIHR5cGVcbiIpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlcXVlc3RlZF9yZXBseSA9IEZBTFNFOworCisgIGlmIChzZW5kZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBGaXJzdCB2ZXJpZnkgdGhlIFNFTGludXggYWNjZXNzIGNvbnRyb2xzLiAgSWYgYWxsb3dlZCB0aGVuCisgICAgICAgKiBnbyBvbiB3aXRoIHRoZSBzdGFuZGFyZCBjaGVja3MuCisgICAgICAgKi8KKyAgICAgIGlmICghYnVzX3NlbGludXhfYWxsb3dzX3NlbmQgKHNlbmRlciwgcHJvcG9zZWRfcmVjaXBpZW50LAorCQkJCSAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorCQkJCSAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisJCQkJICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKwkJCQkgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwKKwkJCQkgICAgZGVzdCA/IGRlc3QgOiBEQlVTX1NFUlZJQ0VfREJVUywgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGVycm9yICE9IE5VTEwgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGRvbid0IHN5c2xvZyB0aGlzLCBqdXN0IHNldCB0aGUgZXJyb3I6IGF2Y19oYXNfcGVybSBzaG91bGQKKyAgICAgICAgICAgICAgICogaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gdG8gZWl0aGVyIHRoZSBhdWRpdCBsb2cgb3Igc3lzbG9nICovCisgICAgICAgICAgICAgIGNvbXBsYWluX2Fib3V0X21lc3NhZ2UgKGNvbnRleHQsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICJBbiBTRUxpbnV4IHBvbGljeSBwcmV2ZW50cyB0aGlzIHNlbmRlciBmcm9tIHNlbmRpbmcgdGhpcyAiCisgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0byB0aGlzIHJlY2lwaWVudCIsCisgICAgICAgICAgICAgICAgICAwLCBtZXNzYWdlLCBzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwgRkFMU0UsIEZBTFNFLCBlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IHNlY3VyaXR5IGNoZWNrIGRlbnlpbmcgc2VuZCB0byBzZXJ2aWNlXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChzZW5kZXIpKQorICAgICAgICB7CisgICAgICAgICAgc2VuZGVyX3BvbGljeSA9IGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgKHNlbmRlcik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZW5kZXJfcG9saWN5ICE9IE5VTEwpOworCisgICAgICAgICAgLyogRmlsbCBpbiByZXF1ZXN0ZWRfcmVwbHkgdmFyaWFibGUgd2l0aCBUUlVFIGlmIHRoaXMgaXMgYQorICAgICAgICAgICAqIHJlcGx5IGFuZCB0aGUgcmVwbHkgd2FzIHBlbmRpbmcuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwgLyogbm90IHRvIHRoZSBidXMgZHJpdmVyICovICYmCisgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCAvKiBub3QgZWF2ZXNkcm9wcGluZyAqLykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgZXJyb3IyOworCisgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcjIpOworICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5ID0gYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX3JlcGx5IChidXNfY29ubmVjdGlvbl9nZXRfY29ubmVjdGlvbnMgKHNlbmRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcjIpOworICAgICAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJmVycm9yMiwgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogUG9saWN5IGZvciBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpcyB0aGF0IHRoZXkgY2FuIG9ubHkgc2VuZAorICAgICAgICAgICAqIHRoZSBoZWxsbyBtZXNzYWdlIHRvIHRoZSBidXMgZHJpdmVyCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCA9PSBOVUxMICYmCisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgY2hlY2sgYWxsb3dpbmcgJXMgbWVzc2FnZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIik7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IGNoZWNrIGRpc2FsbG93aW5nIG5vbi0lcyBtZXNzYWdlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsKKworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGllbnQgdHJpZWQgdG8gc2VuZCBhIG1lc3NhZ2Ugb3RoZXIgdGhhbiAlcyB3aXRob3V0IGJlaW5nIHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIik7CisKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VuZGVyX3BvbGljeSA9IE5VTEw7CisKKyAgICAgIC8qIElmIHRoZSBzZW5kZXIgaXMgdGhlIGJ1cyBkcml2ZXIsIHdlIGFzc3VtZSBhbnkgcmVwbHkgd2FzIGEKKyAgICAgICAqIHJlcXVlc3RlZCByZXBseSBhcyBidXMgZHJpdmVyIHdvbid0IHNlbmQgYm9ndXMgb25lcworICAgICAgICovCisgICAgICBpZiAoYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBwcm9wb3NlZF9yZWNpcGllbnQgLyogbm90IGVhdmVzZHJvcHBpbmcgKi8gJiYKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gMCkKKyAgICAgICAgcmVxdWVzdGVkX3JlcGx5ID0gVFJVRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICgoc2VuZGVyICE9IE5VTEwgJiYgc2VuZGVyX3BvbGljeSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChzZW5kZXIgPT0gTlVMTCAmJiBzZW5kZXJfcG9saWN5ID09IE5VTEwpKTsKKworICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwpCisgICAgeworICAgICAgLyogb25seSB0aGUgYnVzIGRyaXZlciBjYW4gc2VuZCB0byBhbiBpbmFjdGl2ZSByZWNpcGllbnQgKGFzIGl0CisgICAgICAgKiBvd25zIG5vIHNlcnZpY2VzLCBzbyBvdGhlciBhcHBzIGNhbid0IGFkZHJlc3MgaXQpLiBJbmFjdGl2ZQorICAgICAgICogcmVjaXBpZW50cyBjYW4gcmVjZWl2ZSBhbnkgbWVzc2FnZS4KKyAgICAgICAqLworICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAocHJvcG9zZWRfcmVjaXBpZW50KSkKKyAgICAgICAgeworICAgICAgICAgIHJlY2lwaWVudF9wb2xpY3kgPSBidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5IChwcm9wb3NlZF9yZWNpcGllbnQpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAocmVjaXBpZW50X3BvbGljeSAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc2VuZGVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgY2hlY2sgdXNpbmcgTlVMTCByZWNpcGllbnQgcG9saWN5IGZvciBtZXNzYWdlIGZyb20gYnVzXG4iKTsKKyAgICAgICAgICByZWNpcGllbnRfcG9saWN5ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYSBtZXNzYWdlIHdhcyBzb21laG93IHNlbnQgdG8gYW4gaW5hY3RpdmUgcmVjaXBpZW50IGZyb20gYSBzb3VyY2Ugb3RoZXIgdGhhbiB0aGUgbWVzc2FnZSBidXNcbiIpOworICAgICAgICAgIHJlY2lwaWVudF9wb2xpY3kgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgcmVjaXBpZW50X3BvbGljeSA9IE5VTEw7CisKKyAgX2RidXNfYXNzZXJ0ICgocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwgJiYgcmVjaXBpZW50X3BvbGljeSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChwcm9wb3NlZF9yZWNpcGllbnQgIT0gTlVMTCAmJiBzZW5kZXIgPT0gTlVMTCAmJiByZWNpcGllbnRfcG9saWN5ID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3JlY2lwaWVudCA9PSBOVUxMICYmIHJlY2lwaWVudF9wb2xpY3kgPT0gTlVMTCkpOworCisgIGxvZyA9IEZBTFNFOworICBpZiAoc2VuZGVyX3BvbGljeSAmJgorICAgICAgIWJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kIChzZW5kZXJfcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZ0b2dnbGVzLCAmbG9nKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICptc2cgPSAiUmVqZWN0ZWQgc2VuZCBtZXNzYWdlLCAlZCBtYXRjaGVkIHJ1bGVzOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHlwZT1cIiVzXCIsIHNlbmRlcj1cIiVzXCIgKCVzKSBpbnRlcmZhY2U9XCIlc1wiIG1lbWJlcj1cIiVzXCIgZXJyb3IgbmFtZT1cIiVzXCIgcmVxdWVzdGVkX3JlcGx5PSVkIGRlc3RpbmF0aW9uPVwiJXNcIiAoJXMpKSI7CisKKyAgICAgIGNvbXBsYWluX2Fib3V0X21lc3NhZ2UgKGNvbnRleHQsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAiUmVqZWN0ZWQgc2VuZCBtZXNzYWdlIiwgdG9nZ2xlcywKKyAgICAgICAgICBtZXNzYWdlLCBzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgIChhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCksIGVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBwb2xpY3kgZGlzYWxsb3dpbmcgbWVzc2FnZSBkdWUgdG8gc2VuZGVyIHBvbGljeVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChsb2cpCisgICAgeworICAgICAgLyogV2Ugd2FudCB0byBkcm9wIHRoaXMgbWVzc2FnZSwgYW5kIGFyZSBvbmx5IG5vdCBkb2luZyBzbyBmb3IgYmFja3dhcmRzCisgICAgICAgKiBjb21wYXRpYmlsaXR5LiAqLworICAgICAgY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoY29udGV4dCwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICJXb3VsZCByZWplY3QgbWVzc2FnZSIsIHRvZ2dsZXMsCisgICAgICAgICAgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICBUUlVFLCBOVUxMKTsKKyAgICB9CisKKyAgaWYgKHJlY2lwaWVudF9wb2xpY3kgJiYKKyAgICAgICFidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fcmVjZWl2ZSAocmVjaXBpZW50X3BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50LCBwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZ0b2dnbGVzKSkKKyAgICB7CisgICAgICBjb21wbGFpbl9hYm91dF9tZXNzYWdlIChjb250ZXh0LCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgIlJlamVjdGVkIHJlY2VpdmUgbWVzc2FnZSIsIHRvZ2dsZXMsCisgICAgICAgICAgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAoYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBwcm9wb3NlZF9yZWNpcGllbnQpLCBOVUxMKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBwb2xpY3kgZGlzYWxsb3dpbmcgbWVzc2FnZSBkdWUgdG8gcmVjaXBpZW50IHBvbGljeVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFNlZSBpZiBsaW1pdHMgb24gc2l6ZSBoYXZlIGJlZW4gZXhjZWVkZWQgKi8KKyAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCAmJgorICAgICAgKChkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3NpemUgKHByb3Bvc2VkX3JlY2lwaWVudCkgPiBjb250ZXh0LT5saW1pdHMubWF4X291dGdvaW5nX2J5dGVzKSB8fAorICAgICAgIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3VuaXhfZmRzIChwcm9wb3NlZF9yZWNpcGllbnQpID4gY29udGV4dC0+bGltaXRzLm1heF9vdXRnb2luZ191bml4X2ZkcykpKQorICAgIHsKKyAgICAgIGNvbXBsYWluX2Fib3V0X21lc3NhZ2UgKGNvbnRleHQsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICJSZWplY3RlZDogZGVzdGluYXRpb24gaGFzIGEgZnVsbCBtZXNzYWdlIHF1ZXVlIiwKKyAgICAgICAgICAwLCBtZXNzYWdlLCBzZW5kZXIsIHByb3Bvc2VkX3JlY2lwaWVudCwgcmVxdWVzdGVkX3JlcGx5LCBUUlVFLAorICAgICAgICAgIGVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBwb2xpY3kgZGlzYWxsb3dpbmcgbWVzc2FnZSBkdWUgdG8gZnVsbCBtZXNzYWdlIHF1ZXVlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogUmVjb3JkIHRoYXQgd2Ugd2lsbCBhbGxvdyBhIHJlcGx5IGhlcmUgaW4gdGhlIGZ1dHVyZSAoZG9uJ3QKKyAgICogYm90aGVyIGlmIHRoZSByZWNpcGllbnQgaXMgdGhlIGJ1cyBvciB0aGlzIGlzIGFuIGVhdmVzZHJvcHBpbmcKKyAgICogY29ubmVjdGlvbikuIE9ubHkgdGhlIGFkZHJlc3NlZCByZWNpcGllbnQgbWF5IHJlcGx5LgorICAgKi8KKyAgaWYgKHR5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgJiYKKyAgICAgIHNlbmRlciAmJgorICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCAmJgorICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBwcm9wb3NlZF9yZWNpcGllbnQgJiYgLyogbm90IGVhdmVzZHJvcHBpbmcgKi8KKyAgICAgICFidXNfY29ubmVjdGlvbnNfZXhwZWN0X3JlcGx5IChidXNfY29ubmVjdGlvbl9nZXRfY29ubmVjdGlvbnMgKHNlbmRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHJlY29yZCByZXBseSBleHBlY3RhdGlvbiBvciBwcm9ibGVtIHdpdGggdGhlIG1lc3NhZ2UgZXhwZWN0aW5nIGEgcmVwbHlcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgcG9saWN5IGFsbG93aW5nIG1lc3NhZ2VcbiIpOworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9idXMuaCBiL2RidXMtMS40LjEwL2J1cy9idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVmMTdjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2J1cy5oCkBAIC0wLDAgKzEsMTI4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGJ1cy5oICBtZXNzYWdlIGJ1cyBjb250ZXh0IG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19CVVNfSAorI2RlZmluZSBCVVNfQlVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcGlwZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK3R5cGVkZWYgc3RydWN0IEJ1c0FjdGl2YXRpb24gICAgQnVzQWN0aXZhdGlvbjsKK3R5cGVkZWYgc3RydWN0IEJ1c0Nvbm5lY3Rpb25zICAgQnVzQ29ubmVjdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBCdXNDb250ZXh0ICAgICAgIEJ1c0NvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBCdXNQb2xpY3kgICAgICAgIEJ1c1BvbGljeTsKK3R5cGVkZWYgc3RydWN0IEJ1c0NsaWVudFBvbGljeSAgQnVzQ2xpZW50UG9saWN5OwordHlwZWRlZiBzdHJ1Y3QgQnVzUG9saWN5UnVsZSAgICBCdXNQb2xpY3lSdWxlOwordHlwZWRlZiBzdHJ1Y3QgQnVzUmVnaXN0cnkgICAgICBCdXNSZWdpc3RyeTsKK3R5cGVkZWYgc3RydWN0IEJ1c1NFTGludXhJRCAgICAgQnVzU0VMaW51eElEOwordHlwZWRlZiBzdHJ1Y3QgQnVzU2VydmljZSAgICAgICBCdXNTZXJ2aWNlOwordHlwZWRlZiBzdHJ1Y3QgQnVzT3duZXIJCUJ1c093bmVyOwordHlwZWRlZiBzdHJ1Y3QgQnVzVHJhbnNhY3Rpb24gICBCdXNUcmFuc2FjdGlvbjsKK3R5cGVkZWYgc3RydWN0IEJ1c01hdGNobWFrZXIgICAgQnVzTWF0Y2htYWtlcjsKK3R5cGVkZWYgc3RydWN0IEJ1c01hdGNoUnVsZSAgICAgQnVzTWF0Y2hSdWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICBsb25nIG1heF9pbmNvbWluZ19ieXRlczsgICAgICAgICAgLyoqPCBIb3cgbWFueSBpbmNvbWluZyBtZXNzYWdlIGJ5dGVzIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGxvbmcgbWF4X2luY29taW5nX3VuaXhfZmRzOyAgICAgICAvKio8IEhvdyBtYW55IGluY29taW5nIG1lc3NhZ2UgdW5peCBmZHMgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgbG9uZyBtYXhfb3V0Z29pbmdfYnl0ZXM7ICAgICAgICAgIC8qKjwgSG93IG1hbnkgb3V0Z29pbmcgYnl0ZXMgY2FuIGJlIHF1ZXVlZCBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiAqLworICBsb25nIG1heF9vdXRnb2luZ191bml4X2ZkczsgICAgICAgLyoqPCBIb3cgbWFueSBvdXRnb2luZyB1bml4IGZkcyBjYW4gYmUgcXVldWVkIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGxvbmcgbWF4X21lc3NhZ2Vfc2l6ZTsgICAgICAgICAgICAvKio8IE1heCBzaXplIG9mIGEgc2luZ2xlIG1lc3NhZ2UgaW4gYnl0ZXMgKi8KKyAgbG9uZyBtYXhfbWVzc2FnZV91bml4X2ZkczsgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiB1bml4IGZkcyBvZiBhIHNpbmdsZSBtZXNzYWdlKi8KKyAgaW50IGFjdGl2YXRpb25fdGltZW91dDsgICAgICAgICAgIC8qKjwgSG93IGxvbmcgdG8gd2FpdCBmb3IgYW4gYWN0aXZhdGlvbiB0byB0aW1lIG91dCAqLworICBpbnQgYXV0aF90aW1lb3V0OyAgICAgICAgICAgICAgICAgLyoqPCBIb3cgbG9uZyB0byB3YWl0IGZvciBhbiBhdXRoZW50aWNhdGlvbiB0byB0aW1lIG91dCAqLworICBpbnQgbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9uczsgICAgLyoqPCBNYXggbnVtYmVyIG9mIGF1dGhvcml6ZWQgY29ubmVjdGlvbnMgKi8KKyAgaW50IG1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zOyAgIC8qKjwgTWF4IG51bWJlciBvZiBpbmNvbXBsZXRlIGNvbm5lY3Rpb25zICovCisgIGludCBtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXI7ICAgICAvKio8IE1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMgYXV0aCdkIGFzIHNhbWUgdXNlciAqLworICBpbnQgbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnM7ICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHBlbmRpbmcgYWN0aXZhdGlvbnMgZm9yIHRoZSBlbnRpcmUgYnVzICovCisgIGludCBtYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb247ICAvKio8IE1heCBudW1iZXIgb2Ygb3duZWQgc2VydmljZXMgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgaW50IG1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbjsgLyoqPCBNYXggbnVtYmVyIG9mIG1hdGNoIHJ1bGVzIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGludCBtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbjsgICAgIC8qKjwgTWF4IG51bWJlciBvZiByZXBsaWVzIHRoYXQgY2FuIGJlIHBlbmRpbmcgZm9yIGVhY2ggY29ubmVjdGlvbiAqLworICBpbnQgcmVwbHlfdGltZW91dDsgICAgICAgICAgICAgICAgICAvKio8IEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHRpbWluZyBvdXQgYSByZXBseSAqLworfSBCdXNMaW1pdHM7CisKK3R5cGVkZWYgZW51bQoreworICBGT1JLX0ZPTExPV19DT05GSUdfRklMRSwKKyAgRk9SS19BTFdBWVMsCisgIEZPUktfTkVWRVIKK30gRm9yY2VGb3JrU2V0dGluZzsKKworQnVzQ29udGV4dCogICAgICAgYnVzX2NvbnRleHRfbmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqY29uZmlnX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JjZUZvcmtTZXR0aW5nICBmb3JjZV9mb3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfYWRkcl9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICBzeXN0ZW1kX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9yZWxvYWRfY29uZmlnICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorCQkJCQkJCQkgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICAgIGJ1c19jb250ZXh0X3NodXRkb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzQ29udGV4dCogICAgICAgYnVzX2NvbnRleHRfcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7Cit2b2lkICAgICAgICAgICAgICBidXNfY29udGV4dF91bnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2dldF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp1dWlkKTsKK2NvbnN0IGNoYXIqICAgICAgIGJ1c19jb250ZXh0X2dldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworY29uc3QgY2hhciogICAgICAgYnVzX2NvbnRleHRfZ2V0X2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7Citjb25zdCBjaGFyKiAgICAgICBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2dldF9zeXN0ZW1kX2FjdGl2YXRpb24gICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzUmVnaXN0cnkqICAgICAgYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitCdXNDb25uZWN0aW9ucyogICBidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK0J1c0FjdGl2YXRpb24qICAgIGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzTWF0Y2htYWtlciogICAgYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitEQnVzTG9vcCogICAgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2FsbG93X3VuaXhfdXNlciAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpOworZGJ1c19ib29sX3QgICAgICAgYnVzX2NvbnRleHRfYWxsb3dfd2luZG93c191c2VyICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKndpbmRvd3Nfc2lkKTsKK0J1c1BvbGljeSogICAgICAgIGJ1c19jb250ZXh0X2dldF9wb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworCitCdXNDbGllbnRQb2xpY3kqICBidXNfY29udGV4dF9jcmVhdGVfY2xpZW50X3BvbGljeSAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uX3RpbWVvdXQgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X2F1dGhfdGltZW91dCAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9jb25uZWN0aW9uc19wZXJfdXNlciAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0ICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOwordm9pZCAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1sb2FkZXItZXhwYXQuYyBiL2RidXMtMS40LjEwL2J1cy9jb25maWctbG9hZGVyLWV4cGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3MWZkYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9jb25maWctbG9hZGVyLWV4cGF0LmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLWxvYWRlci1leHBhdC5jICBleHBhdCBYTUwgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGV4cGF0Lmg+CisKK3N0YXRpYyBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlIG1lbXN1aXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIERCdXNTdHJpbmcgY29udGVudDsKKyAgREJ1c0Vycm9yICplcnJvcjsKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworfSBFeHBhdFBhcnNlQ29udGV4dDsKKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbnRlbnQgKEV4cGF0UGFyc2VDb250ZXh0ICpjb250ZXh0KQoreworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50KSA+IDApCisgICAgeworICAgICAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LT5jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50LCAwKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitleHBhdF9TdGFydEVsZW1lbnRIYW5kbGVyICh2b2lkICAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpbnQgaTsKKyAgY2hhciAqKm5hbWVzOworICBjaGFyICoqdmFsdWVzOworCisgIC8qIEV4cGF0IHNlZW1zIHRvIHN1Y2sgYW5kIGNhbid0IGFib3J0IHRoZSBwYXJzZSBpZiB3ZQorICAgKiB0aHJvdyBhbiBlcnJvci4gRXhwYXQgMi4wIGlzIHN1cHBvc2VkIHRvIGZpeCB0aGlzLgorICAgKi8KKyAgaWYgKGNvbnRleHQtPmZhaWxlZCkKKyAgICByZXR1cm47CisKKyAgaWYgKCFwcm9jZXNzX2NvbnRlbnQgKGNvbnRleHQpKQorICAgIHJldHVybjsKKworICAvKiAiYXR0cyIgaXMga2V5LCB2YWx1ZSwga2V5LCB2YWx1ZSwgTlVMTCAqLworICBmb3IgKGkgPSAwOyBhdHRzW2ldICE9IE5VTEw7ICsraSkKKyAgICA7IC8qIG5vdGhpbmcgKi8KKworICBfZGJ1c19hc3NlcnQgKGkgJSAyID09IDApOworICBuYW1lcyA9IGRidXNfbmV3MCAoY2hhciAqLCBpIC8gMiArIDEpOworICB2YWx1ZXMgPSBkYnVzX25ldzAgKGNoYXIgKiwgaSAvIDIgKyAxKTsKKworICBpZiAobmFtZXMgPT0gTlVMTCB8fCB2YWx1ZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgICAgIGRidXNfZnJlZSAodmFsdWVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChhdHRzW2ldICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpICUgMiA9PSAwKTsKKyAgICAgIG5hbWVzIFtpIC8gMl0gPSAoY2hhciopIGF0dHNbaV07CisgICAgICB2YWx1ZXNbaSAvIDJdID0gKGNoYXIqKSBhdHRzW2krMV07CisKKyAgICAgIGkgKz0gMjsKKyAgICB9CisKKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChuYW1lcyk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlcyk7CisgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKworICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgZGJ1c19mcmVlICh2YWx1ZXMpOworfQorCitzdGF0aWMgdm9pZAorZXhwYXRfRW5kRWxlbWVudEhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgRXhwYXRQYXJzZUNvbnRleHQgKmNvbnRleHQgPSB1c2VyRGF0YTsKKworICBpZiAoIXByb2Nlc3NfY29udGVudCAoY29udGV4dCkpCisgICAgcmV0dXJuOworCisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQgKGNvbnRleHQtPnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IpKQorICAgIHsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBzIGlzIG5vdCAwIHRlcm1pbmF0ZWQuICovCitzdGF0aWMgdm9pZAorZXhwYXRfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGVuKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmY29udGV4dC0+Y29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgbGVuKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisKK0J1c0NvbmZpZ1BhcnNlcioKK2J1c19jb25maWdfbG9hZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICpmaWxlLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICplcnJvcikKK3sKKyAgWE1MX1BhcnNlciBleHBhdDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBFeHBhdFBhcnNlQ29udGV4dCBjb250ZXh0OworICBEQnVzU3RyaW5nIGRpcm5hbWU7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBwYXJzZXIgPSBOVUxMOworICBleHBhdCA9IE5VTEw7CisgIGNvbnRleHQuZXJyb3IgPSBlcnJvcjsKKyAgY29udGV4dC5mYWlsZWQgPSBGQUxTRTsKKworICBmaWxlbmFtZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRleHQuY29udGVudCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRpcm5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZXh0LmNvbnRlbnQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG1lbXN1aXRlLm1hbGxvY19mY24gPSBkYnVzX21hbGxvYzsKKyAgbWVtc3VpdGUucmVhbGxvY19mY24gPSBkYnVzX3JlYWxsb2M7CisgIG1lbXN1aXRlLmZyZWVfZmNuID0gZGJ1c19mcmVlOworCisgIGV4cGF0ID0gWE1MX1BhcnNlckNyZWF0ZV9NTSAoIlVURi04IiwgJm1lbXN1aXRlLCBOVUxMKTsKKyAgaWYgKGV4cGF0ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUgKGZpbGUsICZkaXJuYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIHBhcnNlciA9IGJ1c19jb25maWdfcGFyc2VyX25ldyAoJmRpcm5hbWUsIGlzX3RvcGxldmVsLCBwYXJlbnQpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGNvbnRleHQucGFyc2VyID0gcGFyc2VyOworCisgIFhNTF9TZXRVc2VyRGF0YSAoZXhwYXQsICZjb250ZXh0KTsKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyIChleHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9TdGFydEVsZW1lbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGF0X0VuZEVsZW1lbnRIYW5kbGVyKTsKKyAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIChleHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9DaGFyYWN0ZXJEYXRhSGFuZGxlcik7CisKKyAgeworICAgIERCdXNTdHJpbmcgZGF0YTsKKyAgICBjb25zdCBjaGFyICpkYXRhX3N0cjsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkYXRhKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJmRhdGEsIGZpbGUsIGVycm9yKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisKKyAgICBkYXRhX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmRhdGEpOworCisgICAgaWYgKCFYTUxfUGFyc2UgKGV4cGF0LCBkYXRhX3N0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkYXRhKSwgVFJVRSkpCisgICAgICB7CisgICAgICAgIGlmIChjb250ZXh0LmVycm9yICE9IE5VTEwgJiYKKyAgICAgICAgICAgICFkYnVzX2Vycm9yX2lzX3NldCAoY29udGV4dC5lcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgZW51bSBYTUxfRXJyb3IgZTsKKworICAgICAgICAgICAgZSA9IFhNTF9HZXRFcnJvckNvZGUgKGV4cGF0KTsKKyAgICAgICAgICAgIGlmIChlID09IFhNTF9FUlJPUl9OT19NRU1PUlkpCisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGluIGZpbGUgJXMsIGxpbmUgJWQsIGNvbHVtbiAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAoZXhwYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgKGV4cGF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FcnJvclN0cmluZyAoZSkpOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGEpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YSk7CisKKyAgICBpZiAoY29udGV4dC5mYWlsZWQpCisgICAgICBnb3RvIGZhaWxlZDsKKyAgfQorCisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgKHBhcnNlciwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlybmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dC5jb250ZW50KTsKKyAgWE1MX1BhcnNlckZyZWUgKGV4cGF0KTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dXJuIHBhcnNlcjsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlybmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dC5jb250ZW50KTsKKyAgaWYgKGV4cGF0KQorICAgIFhNTF9QYXJzZXJGcmVlIChleHBhdCk7CisgIGlmIChwYXJzZXIpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmMgYi9kYnVzLTEuNC4xMC9idXMvY29uZmlnLWxvYWRlci1saWJ4bWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzNhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLWxvYWRlci1saWJ4bWwuYyAgbGlieG1sMiBYTUwgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8bGlieG1sL3htbHJlYWRlci5oPgorI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwvZ2xvYmFscy5oPgorI2luY2x1ZGUgPGxpYnhtbC94bWxtZW1vcnkuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEFib3V0IHRoZSBlcnJvciBoYW5kbGluZzogCisgKiAgLSBzZXR1cCBhICJzdHJ1Y3R1cmVkIiBlcnJvciBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBzdHJ1Y3R1cmFsCisgKiAgICBlcnJvcnMgYW5kIHNvbWUgb29tIGVycm9ycyAKKyAqICAtIGFzc3VtZSB0aGF0IGEgbGlieG1sIGZ1bmN0aW9uIHJldHVybmluZyBhbiBlcnJvciBjb2RlIG1lYW5zCisgKiAgICBvdXQtb2YtbWVtb3J5CisgKi8KKyNkZWZpbmUgX0RCVVNfTUFZQkVfU0VUX09PTShlKSAoZGJ1c19lcnJvcl9pc19zZXQoZSkgPyAodm9pZCkwIDogX0RCVVNfU0VUX09PTShlKSkKKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3htbF90ZXh0X3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisJCQl4bWxUZXh0UmVhZGVyICAgICAqcmVhZGVyLAorCQkJREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgbl9hdHRyaWJ1dGVzOworICBjb25zdCBjaGFyICoqYXR0cmlidXRlX25hbWVzLCAqKmF0dHJpYnV0ZV92YWx1ZXM7CisgIGRidXNfYm9vbF90IHJldDsKKyAgaW50IGksIHN0YXR1cywgaXNfZW1wdHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0ID0gRkFMU0U7CisgIGF0dHJpYnV0ZV9uYW1lcyA9IE5VTEw7CisgIGF0dHJpYnV0ZV92YWx1ZXMgPSBOVUxMOworCisgIG5hbWUgPSB4bWxUZXh0UmVhZGVyQ29uc3ROYW1lIChyZWFkZXIpOworICBuX2F0dHJpYnV0ZXMgPSB4bWxUZXh0UmVhZGVyQXR0cmlidXRlQ291bnQgKHJlYWRlcik7CisgIGlzX2VtcHR5ID0geG1sVGV4dFJlYWRlcklzRW1wdHlFbGVtZW50IChyZWFkZXIpOworCisgIGlmIChuYW1lID09IE5VTEwgfHwgbl9hdHRyaWJ1dGVzIDwgMCB8fCBpc19lbXB0eSA9PSAtMSkKKyAgICB7CisgICAgICBfREJVU19NQVlCRV9TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgYXR0cmlidXRlX25hbWVzID0gZGJ1c19uZXcwIChjb25zdCBjaGFyICosIG5fYXR0cmlidXRlcyArIDEpOworICBhdHRyaWJ1dGVfdmFsdWVzID0gZGJ1c19uZXcwIChjb25zdCBjaGFyICosIG5fYXR0cmlidXRlcyArIDEpOworICBpZiAoYXR0cmlidXRlX25hbWVzID09IE5VTEwgfHwgYXR0cmlidXRlX3ZhbHVlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaSA9IDA7CisgIHdoaWxlICgoc3RhdHVzID0geG1sVGV4dFJlYWRlck1vdmVUb05leHRBdHRyaWJ1dGUgKHJlYWRlcikpID09IDEpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpIDwgbl9hdHRyaWJ1dGVzKTsKKyAgICAgIGF0dHJpYnV0ZV9uYW1lc1tpXSA9IHhtbFRleHRSZWFkZXJDb25zdE5hbWUgKHJlYWRlcik7CisgICAgICBhdHRyaWJ1dGVfdmFsdWVzW2ldID0geG1sVGV4dFJlYWRlckNvbnN0VmFsdWUgKHJlYWRlcik7CisgICAgICBpZiAoYXR0cmlidXRlX25hbWVzW2ldID09IE5VTEwgfHwgYXR0cmlidXRlX3ZhbHVlc1tpXSA9PSBOVUxMKQorCXsgCisgICAgICAgICAgX0RCVVNfTUFZQkVfU0VUX09PTSAoZXJyb3IpOworCSAgZ290byBvdXQ7CisJfQorICAgICAgaSsrOworICAgIH0KKyAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICB7CisgICAgICBfREJVU19NQVlCRV9TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIF9kYnVzX2Fzc2VydCAoaSA9PSBuX2F0dHJpYnV0ZXMpOworCisgIHJldCA9IGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKHBhcnNlciwgbmFtZSwKKwkJCQkJIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKwkJCQkJIGVycm9yKTsKKyAgaWYgKHJldCAmJiBpc19lbXB0eSA9PSAxKQorICAgIHJldCA9IGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50IChwYXJzZXIsIG5hbWUsIGVycm9yKTsKKworIG91dDoKKyAgZGJ1c19mcmVlIChhdHRyaWJ1dGVfbmFtZXMpOworICBkYnVzX2ZyZWUgKGF0dHJpYnV0ZV92YWx1ZXMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHhtbF9zaHV0X3VwICh2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3htbF90ZXh0X3JlYWRlcl9lcnJvciAodm9pZCAqYXJnLCB4bWxFcnJvclB0ciB4bWxfZXJyb3IpCit7CisgIERCdXNFcnJvciAqZXJyb3IgPSBhcmc7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJYTUxfRVJST1IgbGV2ZWw9JWQsIGRvbWFpbj0lZCwgY29kZT0lZCwgbXNnPSVzXG4iLAorICAgICAgICAgICAgICAgICB4bWxfZXJyb3ItPmxldmVsLCB4bWxfZXJyb3ItPmRvbWFpbiwKKyAgICAgICAgICAgICAgICAgeG1sX2Vycm9yLT5jb2RlLCB4bWxfZXJyb3ItPm1lc3NhZ2UpOworI2VuZGlmCisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIHsKKyAgICAgIGlmICh4bWxfZXJyb3ItPmNvZGUgPT0gWE1MX0VSUl9OT19NRU1PUlkpCisgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGVsc2UgaWYgKHhtbF9lcnJvci0+bGV2ZWwgPT0gWE1MX0VSUl9FUlJPUiB8fAorICAgICAgICAgICAgICAgeG1sX2Vycm9yLT5sZXZlbCA9PSBYTUxfRVJSX0ZBVEFMKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGxvYWRpbmcgY29uZmlnIGZpbGU6ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgeG1sX2Vycm9yLT5tZXNzYWdlKTsKKyAgICB9Cit9CisKKworQnVzQ29uZmlnUGFyc2VyKgorYnVzX2NvbmZpZ19sb2FkIChjb25zdCBEQnVzU3RyaW5nICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqcGFyZW50LAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgKmVycm9yKQorCit7CisgIHhtbFRleHRSZWFkZXIgKnJlYWRlcjsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNTdHJpbmcgZGlybmFtZSwgZGF0YTsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgaW50IHJldDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgcGFyc2VyID0gTlVMTDsKKyAgcmVhZGVyID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGlybmFtZSkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkYXRhKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpcm5hbWUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChpc190b3BsZXZlbCkKKyAgICB7CisgICAgICAvKiB4bWxNZW1TZXR1cCBvbmx5IGZhaWxzIGlmIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGlzIE5VTEwgKi8KKyAgICAgIHhtbE1lbVNldHVwIChkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgZGJ1c19tYWxsb2MsCisgICAgICAgICAgICAgICAgICAgZGJ1c19yZWFsbG9jLAorICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmR1cCk7CisgICAgICB4bWxJbml0UGFyc2VyICgpOworICAgICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyAoTlVMTCwgeG1sX3NodXRfdXApOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19nZXRfZGlybmFtZSAoZmlsZSwgJmRpcm5hbWUpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIHBhcnNlciA9IGJ1c19jb25maWdfcGFyc2VyX25ldyAoJmRpcm5hbWUsIGlzX3RvcGxldmVsLCBwYXJlbnQpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJmRhdGEsIGZpbGUsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZWFkZXIgPSB4bWxSZWFkZXJGb3JNZW1vcnkgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmRhdGEpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRhdGEpLAorCQkJICAgICAgIE5VTEwsIE5VTEwsIDApOworICBpZiAocmVhZGVyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHhtbFRleHRSZWFkZXJTZXRQYXJzZXJQcm9wIChyZWFkZXIsIFhNTF9QQVJTRVJfU1VCU1RfRU5USVRJRVMsIDEpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgIHhtbFRleHRSZWFkZXJTZXRTdHJ1Y3R1cmVkRXJyb3JIYW5kbGVyIChyZWFkZXIsIHhtbF90ZXh0X3JlYWRlcl9lcnJvciwgJnRtcF9lcnJvcik7CisKKyAgd2hpbGUgKChyZXQgPSB4bWxUZXh0UmVhZGVyUmVhZCAocmVhZGVyKSkgPT0gMSkKKyAgICB7CisgICAgICBpbnQgdHlwZTsKKyAgICAgIAorICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICAgICAgZ290byByZWFkZXJfb3V0OworCisgICAgICB0eXBlID0geG1sVGV4dFJlYWRlck5vZGVUeXBlIChyZWFkZXIpOworICAgICAgaWYgKHR5cGUgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19NQVlCRV9TRVRfT09NICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBnb3RvIHJlYWRlcl9vdXQ7CisgICAgICAgIH0KKworICAgICAgc3dpdGNoICgoeG1sUmVhZGVyVHlwZXMpIHR5cGUpIHsKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0VMRU1FTlQ6CisJeG1sX3RleHRfc3RhcnRfZWxlbWVudCAocGFyc2VyLCByZWFkZXIsICZ0bXBfZXJyb3IpOworCWJyZWFrOworCisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9URVhUOgorICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfQ0RBVEE6CisJeworCSAgREJ1c1N0cmluZyBjb250ZW50OworCSAgY29uc3QgY2hhciAqdmFsdWU7CisJICB2YWx1ZSA9IHhtbFRleHRSZWFkZXJDb25zdFZhbHVlIChyZWFkZXIpOworCSAgaWYgKHZhbHVlICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRlbnQsIHZhbHVlKTsKKwkgICAgICBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChwYXJzZXIsICZjb250ZW50LCAmdG1wX2Vycm9yKTsKKwkgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9EQlVTX01BWUJFX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworCSAgYnJlYWs7CisJfQorCisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9ET0NVTUVOVF9UWVBFOgorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBuYW1lID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZSAocmVhZGVyKTsKKwkgIGlmIChuYW1lICE9IE5VTEwpCisJICAgIGJ1c19jb25maWdfcGFyc2VyX2NoZWNrX2RvY3R5cGUgKHBhcnNlciwgbmFtZSwgJnRtcF9lcnJvcik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX0RCVVNfTUFZQkVfU0VUX09PTSAoJnRtcF9lcnJvcik7CisJICBicmVhazsKKwl9CisKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0VORF9FTEVNRU5UOgorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBuYW1lID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZSAocmVhZGVyKTsKKwkgIGlmIChuYW1lICE9IE5VTEwpCisJICAgIGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50IChwYXJzZXIsIG5hbWUsICZ0bXBfZXJyb3IpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9EQlVTX01BWUJFX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworCSAgYnJlYWs7CisJfQorCisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9ET0NVTUVOVDoKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UOgorICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0NPTU1FTlQ6CisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9FTlRJVFk6CisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9OT1RBVElPTjoKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX1dISVRFU1BBQ0U6CisgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9TSUdOSUZJQ0FOVF9XSElURVNQQUNFOgorICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfRU5EX0VOVElUWToKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX1hNTF9ERUNMQVJBVElPTjoKKwkvKiBub3RoaW5nIHRvIGRvLCBqdXN0IHJlYWQgb24gKi8KKwlicmVhazsKKworICAgICAgY2FzZSBYTUxfUkVBREVSX1RZUEVfTk9ORToKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0FUVFJJQlVURToKKyAgICAgIGNhc2UgWE1MX1JFQURFUl9UWVBFX0VOVElUWV9SRUZFUkVOQ0U6CisJX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBub2RlcyBpbiBYTUwiKTsKKyAgICAgIH0KKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICAgICAgZ290byByZWFkZXJfb3V0OworICAgIH0KKworICBpZiAocmV0ID09IC0xKQorICAgIF9EQlVTX01BWUJFX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworCisgcmVhZGVyX291dDoKKyAgeG1sRnJlZVRleHRSZWFkZXIgKHJlYWRlcik7CisgIHJlYWRlciA9IE5VTEw7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJnRtcF9lcnJvcikpCisgICAgeworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoIWJ1c19jb25maWdfcGFyc2VyX2ZpbmlzaGVkIChwYXJzZXIsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaXJuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKyAgaWYgKGlzX3RvcGxldmVsKQorICAgIHhtbENsZWFudXBQYXJzZXIoKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHVybiBwYXJzZXI7CisgIAorIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpcm5hbWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGEpOworICBpZiAoaXNfdG9wbGV2ZWwpCisgICAgeG1sQ2xlYW51cFBhcnNlcigpOworICBpZiAocGFyc2VyKQorICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlciA9PSBOVUxMKTsgLyogbXVzdCBnbyB0byByZWFkZXJfb3V0IGZpcnN0ICovCisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmMgYi9kYnVzLTEuNC4xMC9idXMvY29uZmlnLXBhcnNlci1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIyZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci1jb21tb24uYyAgQ29tbW9uIGRlZmluZXMgYW5kIHJvdXRpbmVzIGZvciBjb25maWcgZmlsZSBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisgCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci1jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitFbGVtZW50VHlwZQorYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGlmIChzdHJjbXAgKG5hbWUsICJub25lIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9OT05FOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYnVzY29uZmlnIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9CVVNDT05GSUc7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1c2VyIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9VU0VSOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0aCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQVVUSDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInR5cGUiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0NPTkZJR1RZUEU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJmb3JrIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9GT1JLOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicGlkZmlsZSIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfUElERklMRTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImxpc3RlbiIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfTElTVEVOOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXV0aCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQVVUSDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImFsbG93IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BTExPVzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImRlbnkiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0RFTlk7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzZXJ2aWNlaGVscGVyIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9TRVJWSUNFSEVMUEVSOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiaW5jbHVkZWRpciIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfSU5DTFVERURJUjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlM7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNlcnZpY2VkaXIiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NFUlZJQ0VESVI7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJpbmNsdWRlIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9JTkNMVURFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicG9saWN5IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9QT0xJQ1k7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJsaW1pdCIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfTElNSVQ7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzZWxpbnV4IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9TRUxJTlVYOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXNzb2NpYXRlIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BU1NPQ0lBVEU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzeXNsb2ciKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NZU0xPRzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImtlZXBfdW1hc2siKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0tFRVBfVU1BU0s7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhbGxvd19hbm9ueW1vdXMiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzsKKyAgICB9CisgIHJldHVybiBFTEVNRU5UX05PTkU7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAoRWxlbWVudFR5cGUgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEVMRU1FTlRfTk9ORToKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgRUxFTUVOVF9CVVNDT05GSUc6CisgICAgICByZXR1cm4gImJ1c2NvbmZpZyI7CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREU6CisgICAgICByZXR1cm4gImluY2x1ZGUiOworICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgcmV0dXJuICJ1c2VyIjsKKyAgICBjYXNlIEVMRU1FTlRfTElTVEVOOgorICAgICAgcmV0dXJuICJsaXN0ZW4iOworICAgIGNhc2UgRUxFTUVOVF9BVVRIOgorICAgICAgcmV0dXJuICJhdXRoIjsKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgICAgcmV0dXJuICJwb2xpY3kiOworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIHJldHVybiAibGltaXQiOworICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICAgIHJldHVybiAiYWxsb3ciOworICAgIGNhc2UgRUxFTUVOVF9ERU5ZOgorICAgICAgcmV0dXJuICJkZW55IjsKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICAgIHJldHVybiAiZm9yayI7CisgICAgY2FzZSBFTEVNRU5UX1BJREZJTEU6CisgICAgICByZXR1cm4gInBpZGZpbGUiOworICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgICAgcmV0dXJuICJzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIjsKKyAgICBjYXNlIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTOgorICAgICAgcmV0dXJuICJzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMiOworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFRElSOgorICAgICAgcmV0dXJuICJzZXJ2aWNlZGlyIjsKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRUhFTFBFUjoKKyAgICAgIHJldHVybiAic2VydmljZWhlbHBlciI7CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREVESVI6CisgICAgICByZXR1cm4gImluY2x1ZGVkaXIiOworICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgcmV0dXJuICJ0eXBlIjsKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICAgIHJldHVybiAic2VsaW51eCI7CisgICAgY2FzZSBFTEVNRU5UX0FTU09DSUFURToKKyAgICAgIHJldHVybiAiYXNzb2NpYXRlIjsKKyAgICBjYXNlIEVMRU1FTlRfU1lTTE9HOgorICAgICAgcmV0dXJuICJzeXNsb2ciOworICAgIGNhc2UgRUxFTUVOVF9LRUVQX1VNQVNLOgorICAgICAgcmV0dXJuICJrZWVwX3VtYXNrIjsKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOgorICAgICAgcmV0dXJuICJhbGxvd19hbm9ueW1vdXMiOworICAgIH0KKworICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJiYWQgZWxlbWVudCB0eXBlIik7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oIGIvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2YmY0YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9jb25maWctcGFyc2VyLWNvbW1vbi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci1jb21tb24uaCAgQ29tbW9uIGRlZmluZXMgYW5kIHJvdXRpbmVzIGZvciBjb25maWcgZmlsZSBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQ09ORklHX1BBUlNFUl9DT01NT05fSAorI2RlZmluZSBCVVNfQ09ORklHX1BBUlNFUl9DT01NT05fSAorCit0eXBlZGVmIGVudW0KK3sKKyAgRUxFTUVOVF9OT05FLAorICBFTEVNRU5UX0JVU0NPTkZJRywKKyAgRUxFTUVOVF9JTkNMVURFLAorICBFTEVNRU5UX1VTRVIsCisgIEVMRU1FTlRfTElTVEVOLAorICBFTEVNRU5UX0FVVEgsCisgIEVMRU1FTlRfUE9MSUNZLAorICBFTEVNRU5UX0xJTUlULAorICBFTEVNRU5UX0FMTE9XLAorICBFTEVNRU5UX0RFTlksCisgIEVMRU1FTlRfRk9SSywKKyAgRUxFTUVOVF9QSURGSUxFLAorICBFTEVNRU5UX1NFUlZJQ0VESVIsCisgIEVMRU1FTlRfU0VSVklDRUhFTFBFUiwKKyAgRUxFTUVOVF9JTkNMVURFRElSLAorICAvKiB0aGlzIGlzIHJlYWxseSA8dHlwZT4sIGJ1dCB3aW5pb2N0bC5oIGRlZmluZXMgRUxFTUVOVF9UWVBFICovCisgIEVMRU1FTlRfQ09ORklHVFlQRSwKKyAgRUxFTUVOVF9TRUxJTlVYLAorICBFTEVNRU5UX0FTU09DSUFURSwKKyAgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTLAorICBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUywKKyAgRUxFTUVOVF9LRUVQX1VNQVNLLAorICBFTEVNRU5UX1NZU0xPRywKKyAgRUxFTUVOVF9BTExPV19BTk9OWU1PVVMKK30gRWxlbWVudFR5cGU7CisKK0VsZW1lbnRUeXBlIGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfbmFtZV90b190eXBlIChjb25zdCBjaGFyICplbGVtZW50X25hbWUpOworY29uc3QgY2hhciogYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKEVsZW1lbnRUeXBlIHR5cGUpOworCisjZW5kaWYgLyogQlVTX0NPTkZJR19QQVJTRVJfQ09NTU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jIGIvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2I0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmMKQEAgLTAsMCArMSw3MTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci10cml2aWFsLmMgIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqICAgICAgICAgICAgICAgICAgRG9lcyBub3QgZG8gaW5jbHVkZXMgb3IgYW55dGhpbmcgcmVtb3RlbHkgY29tcGxpY2F0ZWQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisgCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci1jb21tb24uaCIKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLXRyaXZpYWwuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIFRSSVZJQUwgcGFyc2VyIGZvciBidXMgY29uZmlndXJhdGlvbiBmaWxlLgorICovCitzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyCit7CisgIEVsZW1lbnRUeXBlIHR5cGU7CisgIERCdXNTdHJpbmcgdXNlcjsgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgdGhlIGRidXMtZGFlbW9uIHJ1bnMgYXMgKi8KKyAgREJ1c1N0cmluZyBidXNfdHlwZTsgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSBidXMgdHlwZSAqLworICBEQnVzU3RyaW5nIHNlcnZpY2VfaGVscGVyOyAgICAgICAgLyoqPCBMb2NhdGlvbiBvZiB0aGUgc2V0dWlkIGhlbHBlciAqLworICBEQnVzTGlzdCAqc2VydmljZV9kaXJzOyAgICAgICAgICAgLyoqPCBEaXJlY3RvcmllcyB0byBsb29rIGZvciBzZXJ2aWNlcyBpbiAqLworfTsKKworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2aWNlX2RpcnNfZmluZF9kaXIgKERCdXNMaXN0ICoqc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoZGlyICE9IE5VTEwpOworCisgIGZvciAobGluayA9ICpzZXJ2aWNlX2RpcnM7IGxpbms7IGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsoc2VydmljZV9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpsaW5rX2RpcjsKKworICAgICAgbGlua19kaXIgPSAoY29uc3QgY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBpZiAoc3RyY21wIChkaXIsIGxpbmtfZGlyKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKmRpcl9saW5rKQoreworICBpZiAoIXNlcnZpY2VfZGlyc19maW5kX2RpciAoc2VydmljZV9kaXJzLCBkaXJfbGluay0+ZGF0YSkpCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoc2VydmljZV9kaXJzLCBkaXJfbGluayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19mcmVlIChkaXJfbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZGlyX2xpbmspOworICAgIH0KK30KKworQnVzQ29uZmlnUGFyc2VyKgorYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICAgICAgICAqcGFyZW50KQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKworICBwYXJzZXIgPSBkYnVzX25ldzAgKEJ1c0NvbmZpZ1BhcnNlciwgMSk7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBwYXJzZXItPnR5cGUgPSBFTEVNRU5UX05PTkU7CisKKyAgLyogaW5pdCB0aGUgbGlzdHMgKi8KKyAgcGFyc2VyLT5zZXJ2aWNlX2RpcnMgPSBOVUxMOworCisgIC8qIGluaXQgdGhlIHN0cmluZ3MgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhcnNlci0+dXNlcikpCisgICAgZ290byBmYWlsZWRfcGFyc2VyOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGFyc2VyLT5idXNfdHlwZSkpCisgICAgZ290byBmYWlsZWRfdHlwZTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhcnNlci0+c2VydmljZV9oZWxwZXIpKQorICAgIGdvdG8gZmFpbGVkX2hlbHBlcjsKKworICAvKiB3b290ISAqLworICByZXR1cm4gcGFyc2VyOworCisvKiBhcmdoLiB3ZSBoYXZlIGRvIGRvIHRoaXMgY2FyZWZ1bGx5IGJlY2F1c2Ugb2YgT09NICovCitmYWlsZWRfaGVscGVyOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YnVzX3R5cGUpOworZmFpbGVkX3R5cGU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT51c2VyKTsKK2ZhaWxlZF9wYXJzZXI6CisgIGRidXNfZnJlZSAocGFyc2VyKTsKK2ZhaWxlZDoKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2J1c19jb25maWdfcGFyc2VyX3VucmVmIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXItPnVzZXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+c2VydmljZV9oZWxwZXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YnVzX3R5cGUpOworCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+c2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+c2VydmljZV9kaXJzKTsKKworICBkYnVzX2ZyZWUgKHBhcnNlcik7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9jaGVja19kb2N0eXBlIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChzdHJjbXAgKGRvY3R5cGUsICJidXNjb25maWciKSAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ29uZmlndXJhdGlvbiBmaWxlIGhhcyB0aGUgd3JvbmcgZG9jdW1lbnQgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgLyogd2UgZG9uJ3QgZG8gcHJvY2Vzc2luZyBvZiBhdHRyaWJ1dGUgbmFtZXMsIHdlIGRvbid0IG5lZWQgdG8gKi8KKyAgcGFyc2VyLT50eXBlID0gYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUgKGVsZW1lbnRfbmFtZSk7CisKKyAgc3dpdGNoIChwYXJzZXItPnR5cGUpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgICAgLyogY29udGVudCBhYm91dCB0byBiZSBoYW5kbGVkICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgICB7CisgICAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgICBEQnVzTGlzdCAqZGlyczsKKyAgICAgICAgZGlycyA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZGlycykpKQorICAgICAgICAgICAgc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGxpbmspOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIC8qIHdlIHJlYWxseSBkb24ndCBjYXJlIGFib3V0IHRoZSBvdGhlcnMuLi4gKi8KKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBTVEFSVCBXZSBkb250IGNhcmUgYWJvdXQgJyVzJyB0eXBlICclaSdcbiIsIGVsZW1lbnRfbmFtZSwgcGFyc2VyLT50eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIC8qIHdlIGRvbid0IGNhcmUgKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgY29udGVudF9zYW5lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRlbnRfc2FuZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoY29udGVudCwgMCwgJmNvbnRlbnRfc2FuZSwgMCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgfQorCisgIC8qIHJpcCBvdXQgd2hpdGUgc3BhY2UgKi8KKyAgX2RidXNfc3RyaW5nX2Nob3Bfd2hpdGUgKCZjb250ZW50X3NhbmUpOworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50X3NhbmUpID09IDApCisgICAgeworICAgICAgLyogb3B0aW1pc2UsIHRoZXJlIGlzIG5vIGNvbnRlbnQgKi8KKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF9jb250ZW50OworICAgIH0KKworICBzd2l0Y2ggKHBhcnNlci0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgICB7CisgICAgICAJY2hhciAqY3BhdGg7CisKKyAgICAgICAgLyogY29weSB0aGUgc2FuZSBkYXRhIGludG8gYSBjaGFyIGFycmF5ICovCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSgmY29udGVudF9zYW5lLCAmY3BhdGgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG91dF9jb250ZW50OworICAgICAgICAgIH0KKworICAgICAgICAvKiBhcHBlbmQgdGhlIGR5bmFtaWMgY2hhciBzdHJpbmcgdG8gc2VydmljZSBkaXJzICovCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPnNlcnZpY2VfZGlycywgY3BhdGgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAoY3BhdGgpOworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRUhFTFBFUjoKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvbnRlbnRfc2FuZSwgMCwgJnBhcnNlci0+c2VydmljZV9oZWxwZXIsIDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG91dF9jb250ZW50OworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1VTRVI6CisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZjb250ZW50X3NhbmUsIDAsICZwYXJzZXItPnVzZXIsIDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG91dF9jb250ZW50OworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0NPTkZJR1RZUEU6CisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZjb250ZW50X3NhbmUsIDAsICZwYXJzZXItPmJ1c190eXBlLCAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICAvKiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBvdGhlcnMuLi4gcmVhbGx5ICovCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgQ09OVEVOVFMgV2UgZG9udCBjYXJlICclcycgdHlwZSAnJWknXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZjb250ZW50X3NhbmUpLCBwYXJzZXItPnR5cGUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgLyogd29vdCEgKi8KKyAgcmV0dmFsID0gVFJVRTsKKworb3V0X2NvbnRlbnQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudF9zYW5lKTsKK291dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2ZpbmlzaGVkIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIF9kYnVzX3ZlcmJvc2UgKCJmaW5pc2hlZCBzY2FubmluZyFcbiIpOworICByZXR1cm4gVFJVRTsKK30KKworY29uc3QgY2hhcioKK2J1c19jb25maWdfcGFyc2VyX2dldF91c2VyIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhcnNlci0+dXNlcik7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZwYXJzZXItPmJ1c190eXBlKTsKK30KKworREJ1c0xpc3QqKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiAmcGFyc2VyLT5zZXJ2aWNlX2RpcnM7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisKK3R5cGVkZWYgZW51bQoreworICBWQUxJRCwKKyAgSU5WQUxJRCwKKyAgVU5LTk9XTgorfSBWYWxpZGl0eTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19yZXR1cm5fdmFsdWVzIChjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGgpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqdXNlcjsKKyAgY29uc3QgY2hhciAqdHlwZTsKKyAgREJ1c0xpc3QgKipkaXJzOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgcHJpbnRmICgiVGVzdGluZyB2YWx1ZXMgZnJvbTogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZnVsbF9wYXRoKSk7CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBkdWUgdG8gT09NXG4iKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmZXJyb3IpOworCisgIC8qIGNoZWNrIHVzZXIgcmV0dXJuIHZhbHVlIGlzIG9rYXkgKi8KKyAgdXNlciA9IGJ1c19jb25maWdfcGFyc2VyX2dldF91c2VyIChwYXJzZXIpOworICBpZiAodXNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVc2VyIHdhcyBOVUxMIVxuIik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisjaWYgMAorICAvKiB0aGUgdXNlcm5hbWUgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gY29uZmlndXJlLmluIHNvIHRoaXMgdGVzdCBkb2Vzbid0IHdvcmsgKi8KKyAgaWYgKHN0cmNtcCAodXNlciwgImRidXMiKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVc2VyIHdhcyBpbnZhbGlkOyAnJXMnIVxuIiwgdXNlcik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgIHByaW50ZiAoIiAgICA8dXNlcj5kYnVzPC91c2VyPiBPS0FZIVxuIik7ICAKKyNlbmRpZgorICAKKyAgLyogY2hlY2sgdHlwZSByZXR1cm4gdmFsdWUgaXMgb2theSAqLworICB0eXBlID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3R5cGUgKHBhcnNlcik7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlR5cGUgd2FzIE5VTEwhXG4iKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgaWYgKHN0cmNtcCAodHlwZSwgInN5c3RlbSIpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlR5cGUgd2FzIGludmFsaWQ7ICclcychXG4iLCB1c2VyKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgcHJpbnRmICgiICAgIDx0eXBlPnN5c3RlbTwvdHlwZT4gT0tBWSFcbiIpOworCisgIC8qIGNoZWNrIGRpcnMgcmV0dXJuIHZhbHVlIGlzIG9rYXkgKi8KKyAgZGlycyA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKHBhcnNlcik7CisgIGlmIChkaXJzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlNlcnZpY2UgZGlycyBhcmUgTlVMTCFcbiIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICBwcmludGYgKCIgICAgPHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlX2RpcnMvPiBPS0FZIVxuIik7CisgIC8qIE5PVEU6IFdlIHRlc3RlZCB0aGUgc3BlY2lmaWMgcmV0dXJuIHZhbHVlcyBpbiB0aGUgY29uZmlnLXBhcnNlciB0ZXN0cyAqLworCisgIC8qIHdvb2hvbyEgKi8KKyAgcmV0dmFsID0gVFJVRTsKK2ZpbmlzaDoKKyAgaWYgKHBhcnNlciAhPSBOVUxMKQorICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fbG9hZCAoY29uc3QgREJ1c1N0cmluZyAqZnVsbF9wYXRoLAorICAgICAgICAgVmFsaWRpdHkgICAgICAgICAgdmFsaWRpdHksCisgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBvb21fcG9zc2libGUpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoZnVsbF9wYXRoLCBUUlVFLCBOVUxMLCAmZXJyb3IpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKworICAgICAgaWYgKG9vbV9wb3NzaWJsZSAmJgorICAgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBsb2FkIHZhbGlkIGZpbGUgZHVlIHRvIE9PTVxuIik7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh2YWxpZGl0eSA9PSBWQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gbG9hZCB2YWxpZCBmaWxlIGJ1dCBzdGlsbCBoYWQgbWVtb3J5OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJmVycm9yKTsKKworICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisKKyAgICAgIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkFjY2VwdGVkIGludmFsaWQgZmlsZVxuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqZnVsbF9wYXRoOworICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eTsKK30gTG9hZGVyT29tRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sb2FkZXJfb29tX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIExvYWRlck9vbURhdGEgKmQgPSBkYXRhOworCisgIHJldHVybiBkb19sb2FkIChkLT5mdWxsX3BhdGgsIGQtPnZhbGlkaXR5LCBUUlVFKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2Jhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3ViZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRpdHkgICAgICAgICAgdmFsaWRpdHkpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHJldHZhbCA9IEZBTFNFOworICBkaXIgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0X2RpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIHRlc3RfZGlyZWN0b3J5XG4iKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBzdWJkaXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfYmFzZV9kaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X2RpcmVjdG9yeSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSB0ZXN0X2Jhc2VfZGlyIHRvIHRlc3RfZGlyZWN0b3J5Iik7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmdGVzdF9kaXJlY3RvcnksICZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIGZpbGVuYW1lIHN0cmluZ1xuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICh2YWxpZGl0eSA9PSBWQUxJRCkKKyAgICBwcmludGYgKCJUZXN0aW5nIHZhbGlkIGZpbGVzOlxuIik7CisgIGVsc2UgaWYgKHZhbGlkaXR5ID09IElOVkFMSUQpCisgICAgcHJpbnRmICgiVGVzdGluZyBpbnZhbGlkIGZpbGVzOlxuIik7CisgIGVsc2UKKyAgICBwcmludGYgKCJUZXN0aW5nIHVua25vd24gZmlsZXM6XG4iKTsKKworIG5leHQ6CisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICBMb2FkZXJPb21EYXRhIGQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmdGVzdF9kaXJlY3RvcnksIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IGRpciB0byBmdWxsX3BhdGgiKTsKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb25jYXQgZmlsZSB0byBkaXIiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZnVsbF9wYXRoLCAiLmNvbmYiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLmNvbmYgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgiICAgICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5ID09IFZBTElEID8gInZhbGlkIiA6CisgICAgICAgICAgICAgICAgICAgICAodmFsaWRpdHkgPT0gSU5WQUxJRCA/ICJpbnZhbGlkIiA6CisgICAgICAgICAgICAgICAgICAgICAgKHZhbGlkaXR5ID09IFVOS05PV04gPyAidW5rbm93biIgOiAiPz8/IikpKTsKKworICAgICAgZC5mdWxsX3BhdGggPSAmZnVsbF9wYXRoOworICAgICAgZC52YWxpZGl0eSA9IHZhbGlkaXR5OworCisgICAgICAvKiBGSVhNRSBoYWNrYXJvdW5kIGZvciBhbiBleHBhdCBwcm9ibGVtLCBzZWUKKyAgICAgICAqIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTI0NzQ3CisgICAgICAgKiBodHRwOi8vZnJlZWRlc2t0b3Aub3JnL3BpcGVybWFpbC9kYnVzLzIwMDQtTWF5LzAwMTE1My5odG1sCisgICAgICAgKi8KKyAgICAgIC8qIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJjb25maWctbG9hZGVyIiwgY2hlY2tfbG9hZGVyX29vbV9mdW5jLCAmZCkpICovCisgICAgICBpZiAoIWNoZWNrX2xvYWRlcl9vb21fZnVuYyAoJmQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgfQorCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGdldCBuZXh0IGZpbGUgaW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBkbyBub3QgcmV1c2Ugb3V0c2lkZSBvZiBURVNUICovCitzdGF0aWMgZGJ1c19ib29sX3QKK21ha2VfZnVsbF9wYXRoIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorCQkJICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN1YmRpciwKKwkJCSAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaWxlLAorCQkJICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZ1bGxfcGF0aCkKK3sKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKGZ1bGxfcGF0aCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfZGF0YV9kaXIsIDAsIGZ1bGxfcGF0aCwgMCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgZmlsZSk7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAvKiB3b290ISAqLworICByZXR2YWwgPSBUUlVFOworCitmaW5pc2g6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2ZpbGVfdmFsaWQgKERCdXNTdHJpbmcgKmZ1bGxfcGF0aCwKKwkJCSAgICAgICAgICAgIFZhbGlkaXR5ICAgIHZhbGlkaXR5KQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgdmFsaWQgZmlsZTpcbiIpOworICBlbHNlIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgaW52YWxpZCBmaWxlOlxuIik7CisgIGVsc2UKKyAgICBwcmludGYgKCJUZXN0aW5nIHVua25vd24gZmlsZTpcbiIpOworCisgIC8qIHByaW50IHRoZSBmaWxlbmFtZSwganVzdCBzbyB3ZSBtYXRjaCB0aGUgb3RoZXIgb3V0cHV0ICovCisgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmdWxsX3BhdGgpKTsKKworICAvKiBvbmx5IHRlc3Qgb25lIGZpbGUgKi8KKyAgcmV0dmFsID0gZG9fbG9hZCAoZnVsbF9wYXRoLCB2YWxpZGl0eSwgVFJVRSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX3RyaXZpYWxfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMIHx8CisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodGVzdF9kYXRhX2RpcikgPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJObyB0ZXN0IGRhdGFcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgLyogV2UgYWxyZWFkeSB0ZXN0IGRlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyBhbmQgZGVmYXVsdF9zeXN0ZW1fc2VydmljZWRpcnMKKyAgICogaW4gYnVzX2NvbmZpZ19wYXJzZXJfdGVzdCgpICovCisgIGlmICghcHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciAodGVzdF9kYXRhX2RpciwgInZhbGlkLWNvbmZpZy1maWxlcyIsIFZBTElEKSkKKyAgICBnb3RvIGZpbmlzaDsKKworICAvKiB3ZSBkb24ndCBwcm9jZXNzIGFsbCB0aGUgaW52YWxpZCBmaWxlcywgYXMgdGhlIHRyaXZpYWwgcGFyc2VyIGNhbid0IGhvcGUKKyAgICogdG8gdmFsaWRhdGUgdGhlbSBhbGwgZm9yIGFsbCBkaWZmZXJlbnQgc3ludGF4ZXMuIFdlIGp1c3QgY2hlY2sgb25lIGJyb2tlbgorICAgKiBmaWxlIHRvIHNlZSBpZiBqdW5rIGlzIHJlY2VpdmVkICovCisgIGlmICghbWFrZV9mdWxsX3BhdGggKHRlc3RfZGF0YV9kaXIsICJpbnZhbGlkLWNvbmZpZy1maWxlcyIsICJub3Qtd2VsbC1mb3JtZWQuY29uZiIsICZmdWxsX3BhdGgpKQorICAgIGdvdG8gZmluaXNoOworICBpZiAoIWNoZWNrX2ZpbGVfdmFsaWQgKCZmdWxsX3BhdGgsIElOVkFMSUQpKQorICAgIGdvdG8gZmluaXNoOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisKKyAgLyoganVzdCB0ZXN0IGlmIHRoZSBjaGVja19maWxlX3ZhbGlkIHdvcmtzIG9rYXkgYW5kIHdlIGdvdCBzYW5lIHZhbHVlcyAqLworICBpZiAoIW1ha2VfZnVsbF9wYXRoICh0ZXN0X2RhdGFfZGlyLCAidmFsaWQtY29uZmlnLWZpbGVzIiwgInN5c3RlbS5jb25mIiwgJmZ1bGxfcGF0aCkpCisgICAgZ290byBmaW5pc2g7CisgIGlmICghY2hlY2tfZmlsZV92YWxpZCAoJmZ1bGxfcGF0aCwgVkFMSUQpKQorICAgIGdvdG8gZmluaXNoOworICAvKiBjaGVjayB0byBzZWUgaWYgd2UgZ290IHRoZSBjb3JyZWN0IHZhbHVlcyBmcm9tIHRoZSBwYXJzZXIgKi8KKyAgaWYgKCFjaGVja19yZXR1cm5fdmFsdWVzICgmZnVsbF9wYXRoKSkKKyAgICBnb3RvIGZpbmlzaDsKKworICAvKiB3b290ISAqLworICByZXR2YWwgPSBUUlVFOworCitmaW5pc2g6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworICAvKiB3ZSBkb24ndCBwcm9jZXNzIGVxdWl2LWNvbmZpZy1maWxlcyBhcyB3ZSBkb24ndCBoYW5kbGUgPGluY2x1ZGU+ICovCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaCBiL2RidXMtMS40LjEwL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRkZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci10cml2aWFsLmggIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05GSUdfUEFSU0VSX1RSSVZJQUxfSAorI2RlZmluZSBCVVNfQ09ORklHX1BBUlNFUl9UUklWSUFMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisKKy8qIFdoYXRldmVyIFhNTCBsaWJyYXJ5IHdlJ3JlIHVzaW5nIGp1c3QgcHVzaGVzIGRhdGEgaW50byB0aGlzIEFQSSAqLworCit0eXBlZGVmIHN0cnVjdCBCdXNDb25maWdQYXJzZXIgQnVzQ29uZmlnUGFyc2VyOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX25ldyAoY29uc3QgREJ1c1N0cmluZyAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpwYXJlbnQpOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX3JlZiAgICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOwordm9pZCAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAgICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50ICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworLyogRnVuY3Rpb25zIGZvciBleHRyYWN0aW5nIHRoZSBwYXJzZSByZXN1bHRzICovCitjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CisKKy8qIExvYWRlciBmdW5jdGlvbnMgKGJhY2tlbmRlZCBvZmYgb25lIG9mIHRoZSBYTUwgcGFyc2VycykuICBSZXR1cm5zIGEKKyAqIGZpbmlzaGVkIENvbmZpZ1BhcnNlci4KKyAqLworQnVzQ29uZmlnUGFyc2VyKiBidXNfY29uZmlnX2xvYWQgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX0NPTkZJR19QQVJTRVJfVFJJVklBTF9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvY29uZmlnLXBhcnNlci5jIGIvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWRiZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2NvbmZpZy1wYXJzZXIuYwpAQCAtMCwwICsxLDM1NTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci5jICBYTUwtbGlicmFyeS1hZ25vc3RpYyBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25maWctcGFyc2VyLWNvbW1vbi5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBlbnVtCit7CisgIC8qIHdlIGlnbm9yZSBwb2xpY2llcyBmb3IgdW5rbm93biBncm91cHMvdXNlcnMgKi8KKyAgUE9MSUNZX0lHTk9SRUQsCisKKyAgLyogbm9uLWlnbm9yZWQgKi8KKyAgUE9MSUNZX0RFRkFVTFQsCisgIFBPTElDWV9NQU5EQVRPUlksCisgIFBPTElDWV9VU0VSLAorICBQT0xJQ1lfR1JPVVAsCisgIFBPTElDWV9DT05TT0xFCit9IFBvbGljeVR5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZW1lbnRUeXBlIHR5cGU7CisKKyAgdW5zaWduZWQgaW50IGhhZF9jb250ZW50IDogMTsKKworICB1bmlvbgorICB7CisgICAgc3RydWN0CisgICAgeworICAgICAgdW5zaWduZWQgaW50IGlnbm9yZV9taXNzaW5nIDogMTsKKyAgICAgIHVuc2lnbmVkIGludCBpZl9zZWxpbnV4X2VuYWJsZWQgOiAxOworICAgICAgdW5zaWduZWQgaW50IHNlbGludXhfcm9vdF9yZWxhdGl2ZSA6IDE7CisgICAgfSBpbmNsdWRlOworCisgICAgc3RydWN0CisgICAgeworICAgICAgUG9saWN5VHlwZSB0eXBlOworICAgICAgdW5zaWduZWQgbG9uZyBnaWRfdWlkX29yX2F0X2NvbnNvbGU7ICAgICAgCisgICAgfSBwb2xpY3k7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBjaGFyICpuYW1lOworICAgICAgbG9uZyB2YWx1ZTsKKyAgICB9IGxpbWl0OworICAgIAorICB9IGQ7CisKK30gRWxlbWVudDsKKworLyoqCisgKiBQYXJzZXIgZm9yIGJ1cyBjb25maWd1cmF0aW9uIGZpbGUuIAorICovCitzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyCit7CisgIGludCByZWZjb3VudDsgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisKKyAgREJ1c1N0cmluZyBiYXNlZGlyOyAgLyoqPCBEaXJlY3Rvcnkgd2UgcmVzb2x2ZSBwYXRocyByZWxhdGl2ZSB0byAqLworICAKKyAgREJ1c0xpc3QgKnN0YWNrOyAgICAgLyoqPCBzdGFjayBvZiBFbGVtZW50ICovCisKKyAgY2hhciAqdXNlcjsgICAgICAgICAgLyoqPCB1c2VyIHRvIHJ1biBhcyAqLworCisgIGNoYXIgKnNlcnZpY2VoZWxwZXI7IC8qKjwgbG9jYXRpb24gb2YgdGhlIHNldHVpZCBoZWxwZXIgKi8KKworICBjaGFyICpidXNfdHlwZTsgICAgICAgICAgLyoqPCBNZXNzYWdlIGJ1cyB0eXBlICovCisgIAorICBEQnVzTGlzdCAqbGlzdGVuX29uOyAvKio8IExpc3Qgb2YgYWRkcmVzc2VzIHRvIGxpc3RlbiB0byAqLworCisgIERCdXNMaXN0ICptZWNoYW5pc21zOyAvKio8IEF1dGggbWVjaGFuaXNtcyAqLworCisgIERCdXNMaXN0ICpzZXJ2aWNlX2RpcnM7IC8qKjwgRGlyZWN0b3JpZXMgdG8gbG9vayBmb3Igc2Vzc2lvbiBzZXJ2aWNlcyBpbiAqLworCisgIERCdXNMaXN0ICpjb25mX2RpcnM7ICAgLyoqPCBEaXJlY3RvcmllcyB0byBsb29rIGZvciBwb2xpY3kgY29uZmlndXJhdGlvbiBpbiAqLworCisgIEJ1c1BvbGljeSAqcG9saWN5OyAgICAgLyoqPCBTZWN1cml0eSBwb2xpY3kgKi8KKworICBCdXNMaW1pdHMgbGltaXRzOyAgICAgIC8qKjwgTGltaXRzICovCisKKyAgY2hhciAqcGlkZmlsZTsgICAgICAgICAvKio8IFBJRCBmaWxlICovCisKKyAgREJ1c0xpc3QgKmluY2x1ZGVkX2ZpbGVzOyAgLyoqPCBJbmNsdWRlZCBmaWxlcyBzdGFjayAqLworCisgIERCdXNIYXNoVGFibGUgKnNlcnZpY2VfY29udGV4dF90YWJsZTsgLyoqPCBNYXAgc2VydmljZSBuYW1lcyB0byBTRUxpbnV4IGNvbnRleHRzICovCisKKyAgdW5zaWduZWQgaW50IGZvcmsgOiAxOyAvKio8IFRSVUUgdG8gZm9yayBpbnRvIGRhZW1vbiBtb2RlICovCisKKyAgdW5zaWduZWQgaW50IHN5c2xvZyA6IDE7IC8qKjwgVFJVRSB0byBlbmFibGUgc3lzbG9nICovCisgIHVuc2lnbmVkIGludCBrZWVwX3VtYXNrIDogMTsgLyoqPCBUUlVFIHRvIGtlZXAgb3JpZ2luYWwgdW1hc2sgd2hlbiBmb3JraW5nICovCisKKyAgdW5zaWduZWQgaW50IGlzX3RvcGxldmVsIDogMTsgLyoqPCBGQUxTRSBpZiB3ZSBhcmUgYSBzdWItY29uZmlnLWZpbGUgaW5zaWRlIGFub3RoZXIgb25lICovCisKKyAgdW5zaWduZWQgaW50IGFsbG93X2Fub255bW91cyA6IDE7IC8qKjwgVFJVRSB0byBhbGxvdyBhbm9ueW1vdXMgY29ubmVjdGlvbnMgKi8KK307CisKK3N0YXRpYyBFbGVtZW50KgorcHVzaF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgRWxlbWVudFR5cGUgICAgICB0eXBlKQoreworICBFbGVtZW50ICplOworCisgIF9kYnVzX2Fzc2VydCAodHlwZSAhPSBFTEVNRU5UX05PTkUpOworICAKKyAgZSA9IGRidXNfbmV3MCAoRWxlbWVudCwgMSk7CisgIGlmIChlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBhcnNlci0+c3RhY2ssIGUpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBlLT50eXBlID0gdHlwZTsKKworICByZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQKK2VsZW1lbnRfZnJlZSAoRWxlbWVudCAqZSkKK3sKKyAgaWYgKGUtPnR5cGUgPT0gRUxFTUVOVF9MSU1JVCkKKyAgICBkYnVzX2ZyZWUgKGUtPmQubGltaXQubmFtZSk7CisgIAorICBkYnVzX2ZyZWUgKGUpOworfQorCitzdGF0aWMgdm9pZAorcG9wX2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBFbGVtZW50ICplOworCisgIGUgPSBfZGJ1c19saXN0X3BvcF9sYXN0ICgmcGFyc2VyLT5zdGFjayk7CisgIAorICBlbGVtZW50X2ZyZWUgKGUpOworfQorCitzdGF0aWMgRWxlbWVudCoKK3BlZWtfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgZSA9IF9kYnVzX2xpc3RfZ2V0X2xhc3QgKCZwYXJzZXItPnN0YWNrKTsKKworICByZXR1cm4gZTsKK30KKworc3RhdGljIEVsZW1lbnRUeXBlCit0b3BfZWxlbWVudF90eXBlIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgRWxlbWVudCAqZTsKKworICBlID0gX2RidXNfbGlzdF9nZXRfbGFzdCAoJnBhcnNlci0+c3RhY2spOworCisgIGlmIChlKQorICAgIHJldHVybiBlLT50eXBlOworICBlbHNlCisgICAgcmV0dXJuIEVMRU1FTlRfTk9ORTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittZXJnZV9zZXJ2aWNlX2NvbnRleHRfaGFzaCAoREJ1c0hhc2hUYWJsZSAqZGVzdCwKKwkJCSAgICBEQnVzSGFzaFRhYmxlICpmcm9tKQoreworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgY2hhciAqc2VydmljZV9jb3B5OworICBjaGFyICpjb250ZXh0X2NvcHk7CisKKyAgc2VydmljZV9jb3B5ID0gTlVMTDsKKyAgY29udGV4dF9jb3B5ID0gTlVMTDsKKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoZnJvbSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzZXJ2aWNlID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICBjb25zdCBjaGFyICpjb250ZXh0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBzZXJ2aWNlX2NvcHkgPSBfZGJ1c19zdHJkdXAgKHNlcnZpY2UpOworICAgICAgaWYgKHNlcnZpY2VfY29weSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgICBjb250ZXh0X2NvcHkgPSBfZGJ1c19zdHJkdXAgKGNvbnRleHQpOworICAgICAgaWYgKGNvbnRleHRfY29weSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7IAorICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoZGVzdCwgc2VydmljZV9jb3B5LCBjb250ZXh0X2NvcHkpKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgIHNlcnZpY2VfY29weSA9IE5VTEw7CisgICAgICBjb250ZXh0X2NvcHkgPSBOVUxMOyAgICAKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsOgorICBpZiAoc2VydmljZV9jb3B5KQorICAgIGRidXNfZnJlZSAoc2VydmljZV9jb3B5KTsKKworICBpZiAoY29udGV4dF9jb3B5KQorICAgIGRidXNfZnJlZSAoY29udGV4dF9jb3B5KTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VydmljZV9kaXJzX2ZpbmRfZGlyIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlyKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c19hc3NlcnQgKGRpciAhPSBOVUxMKTsKKworICBmb3IgKGxpbmsgPSAqc2VydmljZV9kaXJzOyBsaW5rOyBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rKHNlcnZpY2VfZGlycywgbGluaykpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbGlua19kaXI7CisgICAgICAKKyAgICAgIGxpbmtfZGlyID0gKGNvbnN0IGNoYXIgKilsaW5rLT5kYXRhOworICAgICAgaWYgKHN0cmNtcCAoZGlyLCBsaW5rX2RpcikgPT0gMCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2aWNlX2RpcnNfYXBwZW5kX3VuaXF1ZV9vcl9mcmVlIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRpcikKK3sKKyAgaWYgKCFzZXJ2aWNlX2RpcnNfZmluZF9kaXIgKHNlcnZpY2VfZGlycywgZGlyKSkKKyAgICByZXR1cm4gX2RidXNfbGlzdF9hcHBlbmQgKHNlcnZpY2VfZGlycywgZGlyKTsgIAorCisgIGRidXNfZnJlZSAoZGlyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIAorc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKmRpcl9saW5rKQoreworICBpZiAoIXNlcnZpY2VfZGlyc19maW5kX2RpciAoc2VydmljZV9kaXJzLCBkaXJfbGluay0+ZGF0YSkpCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoc2VydmljZV9kaXJzLCBkaXJfbGluayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19mcmVlIChkaXJfbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZGlyX2xpbmspOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CittZXJnZV9pbmNsdWRlZCAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgQnVzQ29uZmlnUGFyc2VyICppbmNsdWRlZCwKKyAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBpZiAoIWJ1c19wb2xpY3lfbWVyZ2UgKHBhcnNlci0+cG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLT5wb2xpY3kpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghbWVyZ2Vfc2VydmljZV9jb250ZXh0X2hhc2ggKHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlLAorCQkJCSAgIGluY2x1ZGVkLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKGluY2x1ZGVkLT51c2VyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnVzZXIpOworICAgICAgcGFyc2VyLT51c2VyID0gaW5jbHVkZWQtPnVzZXI7CisgICAgICBpbmNsdWRlZC0+dXNlciA9IE5VTEw7CisgICAgfQorCisgIGlmIChpbmNsdWRlZC0+YnVzX3R5cGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+YnVzX3R5cGUpOworICAgICAgcGFyc2VyLT5idXNfdHlwZSA9IGluY2x1ZGVkLT5idXNfdHlwZTsKKyAgICAgIGluY2x1ZGVkLT5idXNfdHlwZSA9IE5VTEw7CisgICAgfQorICAKKyAgaWYgKGluY2x1ZGVkLT5mb3JrKQorICAgIHBhcnNlci0+Zm9yayA9IFRSVUU7CisKKyAgaWYgKGluY2x1ZGVkLT5rZWVwX3VtYXNrKQorICAgIHBhcnNlci0+a2VlcF91bWFzayA9IFRSVUU7CisKKyAgaWYgKGluY2x1ZGVkLT5waWRmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnBpZGZpbGUpOworICAgICAgcGFyc2VyLT5waWRmaWxlID0gaW5jbHVkZWQtPnBpZGZpbGU7CisgICAgICBpbmNsdWRlZC0+cGlkZmlsZSA9IE5VTEw7CisgICAgfQorICAKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmluY2x1ZGVkLT5saXN0ZW5fb24pKSkKKyAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmcGFyc2VyLT5saXN0ZW5fb24sIGxpbmspOworCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZpbmNsdWRlZC0+bWVjaGFuaXNtcykpKQorICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZwYXJzZXItPm1lY2hhbmlzbXMsIGxpbmspOworCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZpbmNsdWRlZC0+c2VydmljZV9kaXJzKSkpCisgICAgc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGxpbmspOworCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZpbmNsdWRlZC0+Y29uZl9kaXJzKSkpCisgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJnBhcnNlci0+Y29uZl9kaXJzLCBsaW5rKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlZW5faW5jbHVkZSAoQnVzQ29uZmlnUGFyc2VyICAqcGFyc2VyLAorCSAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGUpCit7CisgIERCdXNMaXN0ICppdGVyOworCisgIGl0ZXIgPSBwYXJzZXItPmluY2x1ZGVkX2ZpbGVzOworICB3aGlsZSAoaXRlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIHN0cmNtcCAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlKSwgaXRlci0+ZGF0YSkpCisJcmV0dXJuIFRSVUU7CisKKyAgICAgIGl0ZXIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwYXJzZXItPmluY2x1ZGVkX2ZpbGVzLCBpdGVyKTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitCdXNDb25maWdQYXJzZXIqCitidXNfY29uZmlnX3BhcnNlcl9uZXcgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqYmFzZWRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpwYXJlbnQpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworCisgIHBhcnNlciA9IGRidXNfbmV3MCAoQnVzQ29uZmlnUGFyc2VyLCAxKTsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHBhcnNlci0+aXNfdG9wbGV2ZWwgPSAhIWlzX3RvcGxldmVsOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhcnNlci0+YmFzZWRpcikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICgoKHBhcnNlci0+cG9saWN5ID0gYnVzX3BvbGljeV9uZXcgKCkpID09IE5VTEwpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2NvcHkgKGJhc2VkaXIsIDAsICZwYXJzZXItPmJhc2VkaXIsIDApIHx8CisgICAgICAoKHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisJCQkJCQkJICAgICAgZGJ1c19mcmVlLAorCQkJCQkJCSAgICAgIGRidXNfZnJlZSkpID09IE5VTEwpKQorICAgIHsKKyAgICAgIGlmIChwYXJzZXItPnBvbGljeSkKKyAgICAgICAgYnVzX3BvbGljeV91bnJlZiAocGFyc2VyLT5wb2xpY3kpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YmFzZWRpcik7CisKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAocGFyZW50ICE9IE5VTEwpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcGFyc2VyJ3MgbGltaXRzIGZyb20gdGhlIHBhcmVudC4gKi8KKyAgICAgIHBhcnNlci0+bGltaXRzID0gcGFyZW50LT5saW1pdHM7CisKKyAgICAgIC8qIFVzZSB0aGUgcGFyZW50J3MgbGlzdCBvZiBpbmNsdWRlZF9maWxlcyB0byBhdm9pZAorCSBjaXJjdWxhciBpbmNsdXNpb25zLiAqLworICAgICAgcGFyc2VyLT5pbmNsdWRlZF9maWxlcyA9IHBhcmVudC0+aW5jbHVkZWRfZmlsZXM7CisgICAgfQorICBlbHNlCisgICAgeworCisgICAgICAvKiBNYWtlIHVwIHNvbWUgbnVtYmVycyEgd29vdCEgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbWluZ19ieXRlcyA9IF9EQlVTX09ORV9NRUdBQllURSAqIDEyNzsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9vdXRnb2luZ19ieXRlcyA9IF9EQlVTX09ORV9NRUdBQllURSAqIDEyNzsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9tZXNzYWdlX3NpemUgPSBfREJVU19PTkVfTUVHQUJZVEUgKiAzMjsKKworICAgICAgLyogV2Ugc2V0IHJlbGF0aXZlbHkgY29uc2VydmF0aXZlIHZhbHVlcyBoZXJlIHNpbmNlIGR1ZSB0byB0aGUKKyAgICAgIHdheSBTQ01fUklHSFRTIHdvcmtzIHdlIG5lZWQgdG8gcHJlYWxsb2NhdGUgYW4gYXJyYXkgZm9yIHRoZQorICAgICAgbWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB3ZSBjYW4gcmVjZWl2ZS4gUGlja2luZyBhCisgICAgICBoaWdoIHZhbHVlIGhlcmUgdGh1cyB0cmFuc2xhdGVzIGRpcmVjdGx5IHRvIG1vcmUgbWVtb3J5CisgICAgICBhbGxvY2F0aW9uLiAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2luY29taW5nX3VuaXhfZmRzID0gMTAyNCo0OworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X291dGdvaW5nX3VuaXhfZmRzID0gMTAyNCo0OworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2VfdW5peF9mZHMgPSAxMDI0OworICAgICAgCisgICAgICAvKiBNYWtpbmcgdGhpcyBsb25nIG1lYW5zIHRoZSB1c2VyIGhhcyB0byB3YWl0IGxvbmdlciBmb3IgYW4gZXJyb3IKKyAgICAgICAqIG1lc3NhZ2UgaWYgc29tZXRoaW5nIHNjcmV3cyB1cCwgYnV0IG1ha2luZyBpdCB0b28gc2hvcnQgbWVhbnMKKyAgICAgICAqIHRoZXkgbWlnaHQgc2VlIGEgZmFsc2UgZmFpbHVyZS4KKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMuYWN0aXZhdGlvbl90aW1lb3V0ID0gMjUwMDA7IC8qIDI1IHNlY29uZHMgKi8KKworICAgICAgLyogTWFraW5nIHRoaXMgbG9uZyByaXNrcyBtYWtpbmcgYSBET1MgYXR0YWNrIGVhc2llciwgYnV0IHRvbyBzaG9ydAorICAgICAgICogYW5kIGxlZ2l0aW1hdGUgYXV0aCB3aWxsIGZhaWwuICBJZiBpbnRlcmFjdGl2ZSBhdXRoIChhc2sgdXNlciBmb3IKKyAgICAgICAqIHBhc3N3b3JkKSBpcyBhbGxvd2VkLCB0aGVuIHBvdGVudGlhbGx5IGl0IGhhcyB0byBiZSBxdWl0ZSBsb25nLgorICAgICAgICovCisgICAgICBwYXJzZXItPmxpbWl0cy5hdXRoX3RpbWVvdXQgPSAzMDAwMDsgLyogMzAgc2Vjb25kcyAqLworICAgICAgCisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyA9IDY0OworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyID0gMjU2OworICAgICAgCisgICAgICAvKiBOb3RlIHRoYXQgbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyAvIG1heF9jb25uZWN0aW9uc19wZXJfdXNlcgorICAgICAgICogaXMgdGhlIG51bWJlciBvZiB1c2VycyB0aGF0IHdvdWxkIGhhdmUgdG8gd29yayB0b2dldGhlciB0bworICAgICAgICogRE9TIGFsbCB0aGUgb3RoZXIgdXNlcnMuCisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgPSAyMDQ4OworICAgICAgCisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyA9IDUxMjsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiA9IDUxMjsKKworICAgICAgLyogRm9yIHRoaXMgb25lLCBrZWVwIGluIG1pbmQgdGhhdCBpdCBpc24ndCBvbmx5IHRoZSBtZW1vcnkgdXNlZAorICAgICAgICogYnkgdGhlIG1hdGNoIHJ1bGVzLCBidXQgc2xvd2Rvd24gZnJvbSBsaW5lYXJseSB3YWxraW5nIGEgYmlnCisgICAgICAgKiBsaXN0IG9mIHRoZW0uIEEgY2xpZW50IGFkZGluZyBtb3JlIHRoYW4gdGhpcyBpcyBhbG1vc3QKKyAgICAgICAqIGNlcnRhaW5seSBhIGJhZCBpZGVhIGZvciB0aGF0IHJlYXNvbiwgYW5kIHNob3VsZCBjaGFuZ2UgdG8gYQorICAgICAgICogc21hbGxlciBudW1iZXIgb2Ygd2lkZXItbmV0IG1hdGNoIHJ1bGVzIC0gZ2V0dGluZyBldmVyeSBsYXN0CisgICAgICAgKiBtZXNzYWdlIHRvIHRoZSBidXMgaXMgcHJvYmFibHkgYmV0dGVyIHRoYW4gaGF2aW5nIGEgdGhvdXNhbmQKKyAgICAgICAqIG1hdGNoIHJ1bGVzLgorICAgICAgICovCisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24gPSA1MTI7CisgICAgICAKKyAgICAgIHBhcnNlci0+bGltaXRzLnJlcGx5X3RpbWVvdXQgPSAtMTsgLyogbmV2ZXIgKi8KKworICAgICAgLyogdGhpcyBpcyBlZmZlY3RpdmVseSBhIGxpbWl0IG9uIG1lc3NhZ2UgcXVldWUgc2l6ZSBmb3IgbWVzc2FnZXMKKyAgICAgICAqIHRoYXQgcmVxdWlyZSBhIHJlcGx5CisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uID0gMTAyNCo4OworICAgIH0KKyAgICAgIAorICBwYXJzZXItPnJlZmNvdW50ID0gMTsKKyAgICAgIAorICByZXR1cm4gcGFyc2VyOworfQorCitCdXNDb25maWdQYXJzZXIgKgorYnVzX2NvbmZpZ19wYXJzZXJfcmVmIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChwYXJzZXItPnJlZmNvdW50ID4gMCk7CisKKyAgcGFyc2VyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwYXJzZXI7Cit9CisKK3ZvaWQKK2J1c19jb25maWdfcGFyc2VyX3VucmVmIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChwYXJzZXItPnJlZmNvdW50ID4gMCk7CisKKyAgcGFyc2VyLT5yZWZjb3VudCAtPSAxOworCisgIGlmIChwYXJzZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgd2hpbGUgKHBhcnNlci0+c3RhY2sgIT0gTlVMTCkKKyAgICAgICAgcG9wX2VsZW1lbnQgKHBhcnNlcik7CisKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT51c2VyKTsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5zZXJ2aWNlaGVscGVyKTsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5idXNfdHlwZSk7CisgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+cGlkZmlsZSk7CisgICAgICAKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+bGlzdGVuX29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+bGlzdGVuX29uKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMpOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwYXJzZXItPmNvbmZfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwYXJzZXItPmNvbmZfZGlycyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+bWVjaGFuaXNtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwYXJzZXItPm1lY2hhbmlzbXMpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+YmFzZWRpcik7CisKKyAgICAgIGlmIChwYXJzZXItPnBvbGljeSkKKyAgICAgICAgYnVzX3BvbGljeV91bnJlZiAocGFyc2VyLT5wb2xpY3kpOworCisgICAgICBpZiAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChwYXJzZXIpOworICAgIH0KK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2NoZWNrX2RvY3R5cGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHN0cmNtcCAoZG9jdHlwZSwgImJ1c2NvbmZpZyIpICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb25maWd1cmF0aW9uIGZpbGUgaGFzIHRoZSB3cm9uZyBkb2N1bWVudCB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBkb2N0eXBlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAgKm5hbWU7CisgIGNvbnN0IGNoYXIgKipyZXRsb2M7Cit9IExvY2F0ZUF0dHI7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbG9jYXRlX2F0dHJpYnV0ZXMgKEJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICoqYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZmlyc3RfYXR0cmlidXRlX25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICoqZmlyc3RfYXR0cmlidXRlX3JldGxvYywKKyAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqKnJldGxvYzsKKyAgaW50IG5fYXR0cnM7CisjZGVmaW5lIE1BWF9BVFRSUyAyNAorICBMb2NhdGVBdHRyIGF0dHJzW01BWF9BVFRSU107CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IGk7CisKKyAgX2RidXNfYXNzZXJ0IChmaXJzdF9hdHRyaWJ1dGVfbmFtZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jICE9IE5VTEwpOworCisgIHJldHZhbCA9IFRSVUU7CisKKyAgbl9hdHRycyA9IDE7CisgIGF0dHJzWzBdLm5hbWUgPSBmaXJzdF9hdHRyaWJ1dGVfbmFtZTsKKyAgYXR0cnNbMF0ucmV0bG9jID0gZmlyc3RfYXR0cmlidXRlX3JldGxvYzsKKyAgKmZpcnN0X2F0dHJpYnV0ZV9yZXRsb2MgPSBOVUxMOworCisgIHZhX3N0YXJ0IChhcmdzLCBmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jKTsKKworICBuYW1lID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKik7CisgIHJldGxvYyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhcioqKTsKKworICB3aGlsZSAobmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocmV0bG9jICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChuX2F0dHJzIDwgTUFYX0FUVFJTKTsKKworICAgICAgYXR0cnNbbl9hdHRyc10ubmFtZSA9IG5hbWU7CisgICAgICBhdHRyc1tuX2F0dHJzXS5yZXRsb2MgPSByZXRsb2M7CisgICAgICBuX2F0dHJzICs9IDE7CisgICAgICAqcmV0bG9jID0gTlVMTDsKKworICAgICAgbmFtZSA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciopOworICAgICAgcmV0bG9jID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKiopOworICAgIH0KKworICB2YV9lbmQgKGFyZ3MpOworCisgIGkgPSAwOworICB3aGlsZSAoYXR0cmlidXRlX25hbWVzW2ldKQorICAgIHsKKyAgICAgIGludCBqOworICAgICAgZGJ1c19ib29sX3QgZm91bmQ7CisgICAgICAKKyAgICAgIGZvdW5kID0gRkFMU0U7CisgICAgICBqID0gMDsKKyAgICAgIHdoaWxlIChqIDwgbl9hdHRycykKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKGF0dHJzW2pdLm5hbWUsIGF0dHJpYnV0ZV9uYW1lc1tpXSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0bG9jID0gYXR0cnNbal0ucmV0bG9jOworCisgICAgICAgICAgICAgIGlmICgqcmV0bG9jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIFwiJXNcIiByZXBlYXRlZCB0d2ljZSBvbiB0aGUgc2FtZSA8JXM+IGVsZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzW2pdLm5hbWUsIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAqcmV0bG9jID0gYXR0cmlidXRlX3ZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgKytqOworICAgICAgICB9CisKKyAgICAgIGlmICghZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIFwiJXNcIiBpcyBpbnZhbGlkIG9uIDwlcz4gZWxlbWVudCBpbiB0aGlzIGNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXNbaV0sIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19ub19hdHRyaWJ1dGVzIChCdXNDb25maWdQYXJzZXIgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGlmIChhdHRyaWJ1dGVfbmFtZXNbMF0gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgXCIlc1wiIGlzIGludmFsaWQgb24gPCVzPiBlbGVtZW50IGluIHRoaXMgY29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzWzBdLCBlbGVtZW50X25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdGFydF9idXNjb25maWdfY2hpbGQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIEVsZW1lbnRUeXBlIGVsZW1lbnRfdHlwZTsKKworICBlbGVtZW50X3R5cGUgPSBidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X25hbWVfdG9fdHlwZSAoZWxlbWVudF9uYW1lKTsKKworICBpZiAoZWxlbWVudF90eXBlID09IEVMRU1FTlRfVVNFUikKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgInVzZXIiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfVVNFUikgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoZWxlbWVudF90eXBlID09IEVMRU1FTlRfQ09ORklHVFlQRSkKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgInR5cGUiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfQ09ORklHVFlQRSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoZWxlbWVudF90eXBlID09IEVMRU1FTlRfRk9SSykKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImZvcmsiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfRk9SSykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBhcnNlci0+Zm9yayA9IFRSVUU7CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoZWxlbWVudF90eXBlID09IEVMRU1FTlRfU1lTTE9HKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAic3lzbG9nIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NZU0xPRykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIHBhcnNlci0+c3lzbG9nID0gVFJVRTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9LRUVQX1VNQVNLKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAia2VlcF91bWFzayIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9LRUVQX1VNQVNLKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGFyc2VyLT5rZWVwX3VtYXNrID0gVFJVRTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9QSURGSUxFKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAicGlkZmlsZSIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9QSURGSUxFKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9MSVNURU4pCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJsaXN0ZW4iLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfTElTVEVOKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9BVVRIKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAiYXV0aCIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BVVRIKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TRVJWSUNFSEVMUEVSKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAic2VydmljZWhlbHBlciIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9TRVJWSUNFSEVMUEVSKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9JTkNMVURFRElSKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAiaW5jbHVkZWRpciIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9JTkNMVURFRElSKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgREJ1c0xpc3QgKmRpcnM7CisgICAgICBkaXJzID0gTlVMTDsKKworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlMpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzICgmZGlycykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZkaXJzKSkpCisgICAgICAgICAgc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIGxpbmspOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUykKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIERCdXNMaXN0ICpkaXJzOworICAgICAgZGlycyA9IE5VTEw7CisKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAic3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoJmRpcnMpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZGlycykpKQorICAgICAgICAgIHNlcnZpY2VfZGlyc19hcHBlbmRfbGlua191bmlxdWVfb3JfZnJlZSAoJnBhcnNlci0+c2VydmljZV9kaXJzLCBsaW5rKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9BTExPV19BTk9OWU1PVVMpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJhbGxvd19hbm9ueW1vdXMiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGFyc2VyLT5hbGxvd19hbm9ueW1vdXMgPSBUUlVFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TRVJWSUNFRElSKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAic2VydmljZWRpciIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9TRVJWSUNFRElSKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9JTkNMVURFKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKmU7CisgICAgICBjb25zdCBjaGFyICppZl9zZWxpbnV4X2VuYWJsZWQ7CisgICAgICBjb25zdCBjaGFyICppZ25vcmVfbWlzc2luZzsKKyAgICAgIGNvbnN0IGNoYXIgKnNlbGludXhfcm9vdF9yZWxhdGl2ZTsKKworICAgICAgaWYgKChlID0gcHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfSU5DTFVERSkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBlLT5kLmluY2x1ZGUuaWdub3JlX21pc3NpbmcgPSBGQUxTRTsKKyAgICAgIGUtPmQuaW5jbHVkZS5pZl9zZWxpbnV4X2VuYWJsZWQgPSBGQUxTRTsKKyAgICAgIGUtPmQuaW5jbHVkZS5zZWxpbnV4X3Jvb3RfcmVsYXRpdmUgPSBGQUxTRTsKKworICAgICAgaWYgKCFsb2NhdGVfYXR0cmlidXRlcyAocGFyc2VyLCAiaW5jbHVkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlX21pc3NpbmciLCAmaWdub3JlX21pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWZfc2VsaW51eF9lbmFibGVkIiwgJmlmX3NlbGludXhfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxpbnV4X3Jvb3RfcmVsYXRpdmUiLCAmc2VsaW51eF9yb290X3JlbGF0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKGlnbm9yZV9taXNzaW5nICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChpZ25vcmVfbWlzc2luZywgInllcyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuaWdub3JlX21pc3NpbmcgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaWdub3JlX21pc3NpbmcsICJubyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuaWdub3JlX21pc3NpbmcgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlX21pc3NpbmcgYXR0cmlidXRlIG11c3QgaGF2ZSB2YWx1ZSBcInllc1wiIG9yIFwibm9cIiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKGlmX3NlbGludXhfZW5hYmxlZCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoaWZfc2VsaW51eF9lbmFibGVkLCAieWVzIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5pZl9zZWxpbnV4X2VuYWJsZWQgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaWZfc2VsaW51eF9lbmFibGVkLCAibm8iKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLmlmX3NlbGludXhfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZl9zZWxpbnV4X2VuYWJsZWQgYXR0cmlidXRlIG11c3QgaGF2ZSB2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXCJ5ZXNcIiBvciBcIm5vXCIiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHNlbGludXhfcm9vdF9yZWxhdGl2ZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoc2VsaW51eF9yb290X3JlbGF0aXZlLCAieWVzIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5zZWxpbnV4X3Jvb3RfcmVsYXRpdmUgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VsaW51eF9yb290X3JlbGF0aXZlLCAibm8iKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxpbnV4X3Jvb3RfcmVsYXRpdmUgYXR0cmlidXRlIG11c3QgaGF2ZSB2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXCJ5ZXNcIiBvciBcIm5vXCIiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCSAgICB9CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9QT0xJQ1kpCisgICAgeworICAgICAgRWxlbWVudCAqZTsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQ7CisgICAgICBjb25zdCBjaGFyICp1c2VyOworICAgICAgY29uc3QgY2hhciAqZ3JvdXA7CisgICAgICBjb25zdCBjaGFyICphdF9jb25zb2xlOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9QT0xJQ1kpKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9JR05PUkVEOworICAgICAgCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJwb2xpY3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHQiLCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyIiwgJnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiLCAmZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXRfY29uc29sZSIsICZhdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCgoY29udGV4dCAmJiB1c2VyKSB8fAorICAgICAgICAgICAoY29udGV4dCAmJiBncm91cCkgfHwKKyAgICAgICAgICAgKGNvbnRleHQgJiYgYXRfY29uc29sZSkpIHx8CisgICAgICAgICAgICgodXNlciAmJiBncm91cCkgfHwKKyAgICAgICAgICAgKHVzZXIgJiYgYXRfY29uc29sZSkpIHx8CisgICAgICAgICAgIChncm91cCAmJiBhdF9jb25zb2xlKSB8fAorICAgICAgICAgICEoY29udGV4dCB8fCB1c2VyIHx8IGdyb3VwIHx8IGF0X2NvbnNvbGUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjxwb2xpY3k+IGVsZW1lbnQgbXVzdCBoYXZlIGV4YWN0bHkgb25lIG9mIChjb250ZXh0fHVzZXJ8Z3JvdXB8YXRfY29uc29sZSkgYXR0cmlidXRlcyIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoY29udGV4dCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoY29udGV4dCwgImRlZmF1bHQiKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX0RFRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChjb250ZXh0LCAibWFuZGF0b3J5IikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9NQU5EQVRPUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHQgYXR0cmlidXRlIG9uIDxwb2xpY3k+IG11c3QgaGF2ZSB0aGUgdmFsdWUgXCJkZWZhdWx0XCIgb3IgXCJtYW5kYXRvcnlcIiwgbm90IFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmICh1c2VyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdXNlcm5hbWUsIHVzZXIpOworCisgICAgICAgICAgaWYgKF9kYnVzX3BhcnNlX3VuaXhfdXNlcl9mcm9tX2NvbmZpZyAoJnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUpKQorICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9VU0VSOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmtub3duIHVzZXJuYW1lIFwiJXNcIiBpbiBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIGZpbGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VyKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZ3JvdXAgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZ3JvdXBfbmFtZTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmdyb3VwX25hbWUsIGdyb3VwKTsKKworICAgICAgICAgIGlmIChfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnICgmZ3JvdXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSkpCisgICAgICAgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX0dST1VQOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmtub3duIGdyb3VwIFwiJXNcIiBpbiBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIGZpbGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCk7ICAgICAgICAgIAorICAgICAgICB9CisgICAgICBlbHNlIGlmIChhdF9jb25zb2xlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgZGJ1c19ib29sX3QgdDsKKyAgICAgICAgICAgdCA9IChzdHJjbXAgKGF0X2NvbnNvbGUsICJ0cnVlIikgPT0gMCk7CisgICAgICAgICAgIGlmICh0IHx8IHN0cmNtcCAoYXRfY29uc29sZSwgImZhbHNlIikgPT0gMCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUgPSB0OyAKKyAgICAgICAgICAgICAgIGUtPmQucG9saWN5LnR5cGUgPSBQT0xJQ1lfQ09OU09MRTsKKyAgICAgICAgICAgICB9ICAKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biB2YWx1ZSBcIiVzXCIgZm9yIGF0X2NvbnNvbGUgaW4gbWVzc2FnZSBidXMgY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0X2NvbnNvbGUpOworCisgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhbGwgPHBvbGljeT4gYXR0cmlidXRlcyBudWxsIGFuZCB3ZSBkaWRuJ3Qgc2V0IGVycm9yIik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9MSU1JVCkKKyAgICB7CisgICAgICBFbGVtZW50ICplOworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgICAgaWYgKChlID0gcHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfTElNSVQpKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFsb2NhdGVfYXR0cmlidXRlcyAocGFyc2VyLCAibGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxpbWl0PiBlbGVtZW50IG11c3QgaGF2ZSBhIFwibmFtZVwiIGF0dHJpYnV0ZSIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBlLT5kLmxpbWl0Lm5hbWUgPSBfZGJ1c19zdHJkdXAgKG5hbWUpOworICAgICAgaWYgKGUtPmQubGltaXQubmFtZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TRUxJTlVYKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAic2VsaW51eCIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9TRUxJTlVYKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IG5vdCBhbGxvd2VkIGluc2lkZSA8JXM+IGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lLCAiYnVzY29uZmlnIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICBhbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpsb2c7CisgIGNvbnN0IGNoYXIgKnNlbmRfaW50ZXJmYWNlOworICBjb25zdCBjaGFyICpzZW5kX21lbWJlcjsKKyAgY29uc3QgY2hhciAqc2VuZF9lcnJvcjsKKyAgY29uc3QgY2hhciAqc2VuZF9kZXN0aW5hdGlvbjsKKyAgY29uc3QgY2hhciAqc2VuZF9wYXRoOworICBjb25zdCBjaGFyICpzZW5kX3R5cGU7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfaW50ZXJmYWNlOworICBjb25zdCBjaGFyICpyZWNlaXZlX21lbWJlcjsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9lcnJvcjsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9zZW5kZXI7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfcGF0aDsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV90eXBlOworICBjb25zdCBjaGFyICplYXZlc2Ryb3A7CisgIGNvbnN0IGNoYXIgKnNlbmRfcmVxdWVzdGVkX3JlcGx5OworICBjb25zdCBjaGFyICpyZWNlaXZlX3JlcXVlc3RlZF9yZXBseTsKKyAgY29uc3QgY2hhciAqb3duOworICBjb25zdCBjaGFyICp1c2VyOworICBjb25zdCBjaGFyICpncm91cDsKKworICBCdXNQb2xpY3lSdWxlICpydWxlOworICAKKyAgaWYgKCFsb2NhdGVfYXR0cmlidXRlcyAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX2ludGVyZmFjZSIsICZzZW5kX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfbWVtYmVyIiwgJnNlbmRfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9lcnJvciIsICZzZW5kX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9kZXN0aW5hdGlvbiIsICZzZW5kX2Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9wYXRoIiwgJnNlbmRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfdHlwZSIsICZzZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX2ludGVyZmFjZSIsICZyZWNlaXZlX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfbWVtYmVyIiwgJnJlY2VpdmVfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9lcnJvciIsICZyZWNlaXZlX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9zZW5kZXIiLCAmcmVjZWl2ZV9zZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX3BhdGgiLCAmcmVjZWl2ZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV90eXBlIiwgJnJlY2VpdmVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVhdmVzZHJvcCIsICZlYXZlc2Ryb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX3JlcXVlc3RlZF9yZXBseSIsICZzZW5kX3JlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IiwgJnJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAib3duIiwgJm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXIiLCAmdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIiwgJmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nIiwgJmxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghKHNlbmRfaW50ZXJmYWNlIHx8IHNlbmRfbWVtYmVyIHx8IHNlbmRfZXJyb3IgfHwgc2VuZF9kZXN0aW5hdGlvbiB8fAorICAgICAgICBzZW5kX3R5cGUgfHwgc2VuZF9wYXRoIHx8CisgICAgICAgIHJlY2VpdmVfaW50ZXJmYWNlIHx8IHJlY2VpdmVfbWVtYmVyIHx8IHJlY2VpdmVfZXJyb3IgfHwgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgcmVjZWl2ZV90eXBlIHx8IHJlY2VpdmVfcGF0aCB8fCBlYXZlc2Ryb3AgfHwKKyAgICAgICAgc2VuZF9yZXF1ZXN0ZWRfcmVwbHkgfHwgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgb3duIHx8IHVzZXIgfHwgZ3JvdXApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPCVzPiBtdXN0IGhhdmUgb25lIG9yIG1vcmUgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKChzZW5kX21lbWJlciAmJiAoc2VuZF9pbnRlcmZhY2UgPT0gTlVMTCAmJiBzZW5kX3BhdGggPT0gTlVMTCkpIHx8CisgICAgICAocmVjZWl2ZV9tZW1iZXIgJiYgKHJlY2VpdmVfaW50ZXJmYWNlID09IE5VTEwgJiYgcmVjZWl2ZV9wYXRoID09IE5VTEwpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJPbiBlbGVtZW50IDwlcz4sIGlmIHlvdSBzcGVjaWZ5IGEgbWVtYmVyIHlvdSBtdXN0IHNwZWNpZnkgYW4gaW50ZXJmYWNlIG9yIGEgcGF0aC4gS2VlcCBpbiBtaW5kIHRoYXQgbm90IGFsbCBtZXNzYWdlcyBoYXZlIGFuIGludGVyZmFjZSBmaWVsZC4iLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgLyogQWxsb3dlZCBjb21iaW5hdGlvbnMgb2YgZWxlbWVudHMgYXJlOgorICAgKgorICAgKiAgIGJhc2UsIG11c3QgYmUgYWxsIHNlbmQgb3IgYWxsIHJlY2VpdmU6CisgICAqICAgICBub3RoaW5nCisgICAqICAgICBpbnRlcmZhY2UKKyAgICogICAgIGludGVyZmFjZSArIG1lbWJlcgorICAgKiAgICAgZXJyb3IKKyAgICogCisgICAqICAgYmFzZSBzZW5kXyBjYW4gY29tYmluZSB3aXRoIHNlbmRfZGVzdGluYXRpb24sIHNlbmRfcGF0aCwgc2VuZF90eXBlLCBzZW5kX3JlcXVlc3RlZF9yZXBseQorICAgKiAgIGJhc2UgcmVjZWl2ZV8gd2l0aCByZWNlaXZlX3NlbmRlciwgcmVjZWl2ZV9wYXRoLCByZWNlaXZlX3R5cGUsIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5LCBlYXZlc2Ryb3AKKyAgICoKKyAgICogICB1c2VyLCBncm91cCwgb3duIG11c3Qgb2NjdXIgYWxvbmUKKyAgICoKKyAgICogUHJldHR5IHN1cmUgdGhlIGJlbG93IHN0dWZmIGlzIGJyb2tlbiwgRklYTUUgdGhpbmsgYWJvdXQgaXQgbW9yZS4KKyAgICovCisKKyAgaWYgKChzZW5kX2ludGVyZmFjZSAmJiAoc2VuZF9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2ludGVyZmFjZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX21lbWJlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIG93biB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfbWVtYmVyICYmIChzZW5kX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgb3duIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAoc2VuZF9lcnJvciAmJiAocmVjZWl2ZV9pbnRlcmZhY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX21lbWJlciB8fAorICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3NlbmRlciB8fAorICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgICAgICAgICAgICAgICAgb3duIHx8CisgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfZGVzdGluYXRpb24gJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9tZW1iZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93biB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChzZW5kX3R5cGUgJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX21lbWJlciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IHx8CisgICAgICAgICAgICAgICAgICAgICBvd24gfHwKKyAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKHNlbmRfcGF0aCAmJiAocmVjZWl2ZV9pbnRlcmZhY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Vycm9yIHx8CisgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3NlbmRlciB8fAorICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgIG93biB8fAorICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHkgJiYgKHJlY2VpdmVfaW50ZXJmYWNlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbWVtYmVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9zZW5kZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAocmVjZWl2ZV9pbnRlcmZhY2UgJiYgKHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAocmVjZWl2ZV9tZW1iZXIgJiYgKHJlY2VpdmVfZXJyb3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3duIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAocmVjZWl2ZV9lcnJvciAmJiAob3duIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKSkgfHwKKworICAgICAgKGVhdmVzZHJvcCAmJiAob3duIHx8CisgICAgICAgICAgICAgICAgICAgICB1c2VyIHx8CisgICAgICAgICAgICAgICAgICAgICBncm91cCkpIHx8CisKKyAgICAgIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSAmJiAob3duIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXApKSB8fAorCisgICAgICAob3duICYmICh1c2VyIHx8IGdyb3VwKSkgfHwKKworICAgICAgKHVzZXIgJiYgZ3JvdXApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29tYmluYXRpb24gb2YgYXR0cmlidXRlcyBvbiBlbGVtZW50IDwlcz4iLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcnVsZSA9IE5VTEw7CisKKyAgLyogSW4gQnVzUG9saWN5UnVsZSwgTlVMTCByZXByZXNlbnRzIHdpbGRjYXJkLgorICAgKiBJbiB0aGUgY29uZmlnIGZpbGUsICcqJyByZXByZXNlbnRzIGl0LgorICAgKi8KKyNkZWZpbmUgSVNfV0lMRENBUkQoc3RyKSAoKHN0cikgJiYgKChzdHIpWzBdKSA9PSAnKicgJiYgKChzdHIpWzFdKSA9PSAnXDAnKQorCisgIGlmIChzZW5kX2ludGVyZmFjZSB8fCBzZW5kX21lbWJlciB8fCBzZW5kX2Vycm9yIHx8IHNlbmRfZGVzdGluYXRpb24gfHwKKyAgICAgIHNlbmRfcGF0aCB8fCBzZW5kX3R5cGUgfHwgc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpCisgICAgeworICAgICAgaW50IG1lc3NhZ2VfdHlwZTsKKyAgICAgIAorICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX2ludGVyZmFjZSkpCisgICAgICAgIHNlbmRfaW50ZXJmYWNlID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAoc2VuZF9tZW1iZXIpKQorICAgICAgICBzZW5kX21lbWJlciA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfZXJyb3IpKQorICAgICAgICBzZW5kX2Vycm9yID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAoc2VuZF9kZXN0aW5hdGlvbikpCisgICAgICAgIHNlbmRfZGVzdGluYXRpb24gPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX3BhdGgpKQorICAgICAgICBzZW5kX3BhdGggPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX3R5cGUpKQorICAgICAgICBzZW5kX3R5cGUgPSBOVUxMOworCisgICAgICBtZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgaWYgKHNlbmRfdHlwZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHNlbmRfdHlwZSk7CisgICAgICAgICAgaWYgKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBtZXNzYWdlIHR5cGUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdHlwZSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoZWF2ZXNkcm9wICYmCisgICAgICAgICAgIShzdHJjbXAgKGVhdmVzZHJvcCwgInRydWUiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAgKGVhdmVzZHJvcCwgImZhbHNlIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHZhbHVlIFwiJXNcIiBmb3IgJXMgYXR0cmlidXRlLCBtdXN0IGJlIHRydWUgb3IgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZWF2ZXNkcm9wIiwgZWF2ZXNkcm9wKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKHNlbmRfcmVxdWVzdGVkX3JlcGx5ICYmCisgICAgICAgICAgIShzdHJjbXAgKHNlbmRfcmVxdWVzdGVkX3JlcGx5LCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHksICJmYWxzZSIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCB2YWx1ZSBcIiVzXCIgZm9yICVzIGF0dHJpYnV0ZSwgbXVzdCBiZSB0cnVlIG9yIGZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfcmVxdWVzdGVkX3JlcGx5Iiwgc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBydWxlID0gYnVzX3BvbGljeV9ydWxlX25ldyAoQlVTX1BPTElDWV9SVUxFX1NFTkQsIGFsbG93KTsgCisgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgCisgICAgICBpZiAoZWF2ZXNkcm9wKQorICAgICAgICBydWxlLT5kLnNlbmQuZWF2ZXNkcm9wID0gKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDApOworCisgICAgICBpZiAobG9nKQorICAgICAgICBydWxlLT5kLnNlbmQubG9nID0gKHN0cmNtcCAobG9nLCAidHJ1ZSIpID09IDApOworCisgICAgICBpZiAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpCisgICAgICAgIHJ1bGUtPmQuc2VuZC5yZXF1ZXN0ZWRfcmVwbHkgPSAoc3RyY21wIChzZW5kX3JlcXVlc3RlZF9yZXBseSwgInRydWUiKSA9PSAwKTsKKworICAgICAgcnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSA9IG1lc3NhZ2VfdHlwZTsKKyAgICAgIHJ1bGUtPmQuc2VuZC5wYXRoID0gX2RidXNfc3RyZHVwIChzZW5kX3BhdGgpOworICAgICAgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9IF9kYnVzX3N0cmR1cCAoc2VuZF9pbnRlcmZhY2UpOworICAgICAgcnVsZS0+ZC5zZW5kLm1lbWJlciA9IF9kYnVzX3N0cmR1cCAoc2VuZF9tZW1iZXIpOworICAgICAgcnVsZS0+ZC5zZW5kLmVycm9yID0gX2RidXNfc3RyZHVwIChzZW5kX2Vycm9yKTsKKyAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbiA9IF9kYnVzX3N0cmR1cCAoc2VuZF9kZXN0aW5hdGlvbik7CisgICAgICBpZiAoc2VuZF9wYXRoICYmIHJ1bGUtPmQuc2VuZC5wYXRoID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAoc2VuZF9pbnRlcmZhY2UgJiYgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHNlbmRfbWVtYmVyICYmIHJ1bGUtPmQuc2VuZC5tZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChzZW5kX2Vycm9yICYmIHJ1bGUtPmQuc2VuZC5lcnJvciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHNlbmRfZGVzdGluYXRpb24gJiYgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICBlbHNlIGlmIChyZWNlaXZlX2ludGVyZmFjZSB8fCByZWNlaXZlX21lbWJlciB8fCByZWNlaXZlX2Vycm9yIHx8IHJlY2VpdmVfc2VuZGVyIHx8CisgICAgICAgICAgIHJlY2VpdmVfcGF0aCB8fCByZWNlaXZlX3R5cGUgfHwgZWF2ZXNkcm9wIHx8IHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5KQorICAgIHsKKyAgICAgIGludCBtZXNzYWdlX3R5cGU7CisgICAgICAKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAocmVjZWl2ZV9pbnRlcmZhY2UpKQorICAgICAgICByZWNlaXZlX2ludGVyZmFjZSA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfbWVtYmVyKSkKKyAgICAgICAgcmVjZWl2ZV9tZW1iZXIgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX2Vycm9yKSkKKyAgICAgICAgcmVjZWl2ZV9lcnJvciA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfc2VuZGVyKSkKKyAgICAgICAgcmVjZWl2ZV9zZW5kZXIgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX3BhdGgpKQorICAgICAgICByZWNlaXZlX3BhdGggPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX3R5cGUpKQorICAgICAgICByZWNlaXZlX3R5cGUgPSBOVUxMOworCisgICAgICBtZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgaWYgKHJlY2VpdmVfdHlwZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHJlY2VpdmVfdHlwZSk7CisgICAgICAgICAgaWYgKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBtZXNzYWdlIHR5cGUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfdHlwZSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgIGlmIChlYXZlc2Ryb3AgJiYKKyAgICAgICAgICAhKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZWF2ZXNkcm9wLCAiZmFsc2UiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgdmFsdWUgXCIlc1wiIGZvciAlcyBhdHRyaWJ1dGUsIG11c3QgYmUgdHJ1ZSBvciBmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlYXZlc2Ryb3AiLCBlYXZlc2Ryb3ApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgJiYKKyAgICAgICAgICAhKHN0cmNtcCAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHksICJ0cnVlIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSwgImZhbHNlIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHZhbHVlIFwiJXNcIiBmb3IgJXMgYXR0cmlidXRlLCBtdXN0IGJlIHRydWUgb3IgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkiLCByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRSwgYWxsb3cpOyAKKyAgICAgIGlmIChydWxlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgIGlmIChlYXZlc2Ryb3ApCisgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3AgPSAoc3RyY21wIChlYXZlc2Ryb3AsICJ0cnVlIikgPT0gMCk7CisKKyAgICAgIGlmIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSkKKyAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLnJlcXVlc3RlZF9yZXBseSA9IChzdHJjbXAgKHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5LCAidHJ1ZSIpID09IDApOworICAgICAgCisgICAgICBydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlID0gbWVzc2FnZV90eXBlOworICAgICAgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfcGF0aCk7CisgICAgICBydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlID0gX2RidXNfc3RyZHVwIChyZWNlaXZlX2ludGVyZmFjZSk7CisgICAgICBydWxlLT5kLnJlY2VpdmUubWVtYmVyID0gX2RidXNfc3RyZHVwIChyZWNlaXZlX21lbWJlcik7CisgICAgICBydWxlLT5kLnJlY2VpdmUuZXJyb3IgPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfZXJyb3IpOworICAgICAgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbiA9IF9kYnVzX3N0cmR1cCAocmVjZWl2ZV9zZW5kZXIpOworCisgICAgICBpZiAocmVjZWl2ZV9wYXRoICYmIHJ1bGUtPmQucmVjZWl2ZS5wYXRoID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAocmVjZWl2ZV9pbnRlcmZhY2UgJiYgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHJlY2VpdmVfbWVtYmVyICYmIHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChyZWNlaXZlX2Vycm9yICYmIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHJlY2VpdmVfc2VuZGVyICYmIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4gPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIGVsc2UgaWYgKG93bikKKyAgICB7CisgICAgICBydWxlID0gYnVzX3BvbGljeV9ydWxlX25ldyAoQlVTX1BPTElDWV9SVUxFX09XTiwgYWxsb3cpOyAKKyAgICAgIGlmIChydWxlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAob3duKSkKKyAgICAgICAgb3duID0gTlVMTDsKKyAgICAgIAorICAgICAgcnVsZS0+ZC5vd24uc2VydmljZV9uYW1lID0gX2RidXNfc3RyZHVwIChvd24pOworICAgICAgaWYgKG93biAmJiBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIGVsc2UgaWYgKHVzZXIpCisgICAgeyAgICAgIAorICAgICAgaWYgKElTX1dJTERDQVJEICh1c2VyKSkKKyAgICAgICAgeworICAgICAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfVVNFUiwgYWxsb3cpOyAKKyAgICAgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIHJ1bGUtPmQudXNlci51aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyB1c2VybmFtZTsKKyAgICAgICAgICBkYnVzX3VpZF90IHVpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnVzZXJuYW1lLCB1c2VyKTsKKyAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19wYXJzZV91bml4X3VzZXJfZnJvbV9jb25maWcgKCZ1c2VybmFtZSwgJnVpZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfVVNFUiwgYWxsb3cpOyAKKyAgICAgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgICAgIHJ1bGUtPmQudXNlci51aWQgPSB1aWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiVW5rbm93biB1c2VybmFtZSBcIiVzXCIgb24gZWxlbWVudCA8JXM+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLCBlbGVtZW50X25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChncm91cCkKKyAgICB7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKGdyb3VwKSkKKyAgICAgICAgeworICAgICAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfR1JPVVAsIGFsbG93KTsgCisgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBydWxlLT5kLmdyb3VwLmdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGdyb3VwbmFtZTsKKyAgICAgICAgICBkYnVzX2dpZF90IGdpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmdyb3VwbmFtZSwgZ3JvdXApOworICAgICAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnICgmZ3JvdXBuYW1lLCAmZ2lkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9HUk9VUCwgYWxsb3cpOyAKKyAgICAgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgICAgIHJ1bGUtPmQuZ3JvdXAuZ2lkID0gZ2lkOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gZ3JvdXAgXCIlc1wiIG9uIGVsZW1lbnQgPCVzPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGhhbmRsZSBzb21lIGNvbWJpbmF0aW9uIG9mIGF0dHJpYnV0ZXMgb24gPGFsbG93PiBvciA8ZGVueT4iKTsKKworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKnBlOworICAgICAgCisgICAgICBwZSA9IHBlZWtfZWxlbWVudCAocGFyc2VyKTsgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocGUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHBlLT50eXBlID09IEVMRU1FTlRfUE9MSUNZKTsKKworICAgICAgc3dpdGNoIChwZS0+ZC5wb2xpY3kudHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFBPTElDWV9JR05PUkVEOgorICAgICAgICAgIC8qIGRyb3AgdGhlIHJ1bGUgb24gdGhlIGZsb29yICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgIGNhc2UgUE9MSUNZX0RFRkFVTFQ6CisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF9kZWZhdWx0X3J1bGUgKHBhcnNlci0+cG9saWN5LCBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE9MSUNZX01BTkRBVE9SWToKKyAgICAgICAgICBpZiAoIWJ1c19wb2xpY3lfYXBwZW5kX21hbmRhdG9yeV9ydWxlIChwYXJzZXItPnBvbGljeSwgcnVsZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPTElDWV9VU0VSOgorICAgICAgICAgIGlmICghQlVTX1BPTElDWV9SVUxFX0lTX1BFUl9DTElFTlQgKHJ1bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwlcz4gcnVsZSBjYW5ub3QgYmUgcGVyLXVzZXIgYmVjYXVzZSBpdCBoYXMgYnVzLWdsb2JhbCBzZW1hbnRpY3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF91c2VyX3J1bGUgKHBhcnNlci0+cG9saWN5LCBwZS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUE9MSUNZX0dST1VQOgorICAgICAgICAgIGlmICghQlVTX1BPTElDWV9SVUxFX0lTX1BFUl9DTElFTlQgKHJ1bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwlcz4gcnVsZSBjYW5ub3QgYmUgcGVyLWdyb3VwIGJlY2F1c2UgaXQgaGFzIGJ1cy1nbG9iYWwgc2VtYW50aWNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAocGFyc2VyLT5wb2xpY3ksIHBlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorCisgICAgICAgIGNhc2UgUE9MSUNZX0NPTlNPTEU6CisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF9jb25zb2xlX3J1bGUgKHBhcnNlci0+cG9saWN5LCBwZS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAKKyAgICAgIGJ1c19wb2xpY3lfcnVsZV91bnJlZiAocnVsZSk7CisgICAgICBydWxlID0gTlVMTDsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworIGZhaWxlZDoKKyAgaWYgKHJ1bGUpCisgICAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChydWxlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0YXJ0X3BvbGljeV9jaGlsZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgaWYgKHN0cmNtcCAoZWxlbWVudF9uYW1lLCAiYWxsb3ciKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghYXBwZW5kX3J1bGVfZnJvbV9lbGVtZW50IChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BTExPVykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChlbGVtZW50X25hbWUsICJkZW55IikgPT0gMCkKKyAgICB7CisgICAgICBpZiAoIWFwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0RFTlkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gbm90IGFsbG93ZWQgaW5zaWRlIDwlcz4gaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUsICJwb2xpY3kiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RhcnRfc2VsaW51eF9jaGlsZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKm93bl9jb3B5OworICBjaGFyICpjb250ZXh0X2NvcHk7CisKKyAgb3duX2NvcHkgPSBOVUxMOworICBjb250ZXh0X2NvcHkgPSBOVUxMOworCisgIGlmIChzdHJjbXAgKGVsZW1lbnRfbmFtZSwgImFzc29jaWF0ZSIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqb3duOworICAgICAgY29uc3QgY2hhciAqY29udGV4dDsKKyAgICAgIAorICAgICAgaWYgKCFsb2NhdGVfYXR0cmlidXRlcyAocGFyc2VyLCAiYXNzb2NpYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvd24iLCAmb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHQiLCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BU1NPQ0lBVEUpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAob3duID09IE5VTEwgfHwgY29udGV4dCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPGFzc29jaWF0ZT4gbXVzdCBoYXZlIGF0dHJpYnV0ZXMgb3duPVwiPHNlcnZpY2VuYW1lPlwiIGFuZCBjb250ZXh0PVwiPHNlbGludXggY29udGV4dD5cIiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBvd25fY29weSA9IF9kYnVzX3N0cmR1cCAob3duKTsKKyAgICAgIGlmIChvd25fY29weSA9PSBOVUxMKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGNvbnRleHRfY29weSA9IF9kYnVzX3N0cmR1cCAoY29udGV4dCk7CisgICAgICBpZiAoY29udGV4dF9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUsCisJCQkJCSAgIG93bl9jb3B5LCBjb250ZXh0X2NvcHkpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IG5vdCBhbGxvd2VkIGluc2lkZSA8JXM+IGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lLCAic2VsaW51eCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworIG9vbToKKyAgaWYgKG93bl9jb3B5KQorICAgIGRidXNfZnJlZSAob3duX2NvcHkpOworCisgIGlmIChjb250ZXh0X2NvcHkpICAKKyAgICBkYnVzX2ZyZWUgKGNvbnRleHRfY29weSk7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfc3RhcnRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICoqYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIEVsZW1lbnRUeXBlIHQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogcHJpbnRmICgiU1RBUlQ6ICVzXG4iLCBlbGVtZW50X25hbWUpOyAqLworICAKKyAgdCA9IHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcik7CisKKyAgaWYgKHQgPT0gRUxFTUVOVF9OT05FKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGVsZW1lbnRfbmFtZSwgImJ1c2NvbmZpZyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImJ1c2NvbmZpZyIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIAorICAgICAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9CVVNDT05GSUcpID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlbGVtZW50IDwlcz4gYXQgcm9vdCBvZiBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAodCA9PSBFTEVNRU5UX0JVU0NPTkZJRykKKyAgICB7CisgICAgICByZXR1cm4gc3RhcnRfYnVzY29uZmlnX2NoaWxkIChwYXJzZXIsIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9CisgIGVsc2UgaWYgKHQgPT0gRUxFTUVOVF9QT0xJQ1kpCisgICAgeworICAgICAgcmV0dXJuIHN0YXJ0X3BvbGljeV9jaGlsZCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgfQorICBlbHNlIGlmICh0ID09IEVMRU1FTlRfU0VMSU5VWCkKKyAgICB7CisgICAgICByZXR1cm4gc3RhcnRfc2VsaW51eF9jaGlsZCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9saW1pdCAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZSwKKyAgICAgICAgICAgbG9uZyAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgbXVzdF9iZV9wb3NpdGl2ZTsKKyAgZGJ1c19ib29sX3QgbXVzdF9iZV9pbnQ7CisKKyAgbXVzdF9iZV9pbnQgPSBGQUxTRTsKKyAgbXVzdF9iZV9wb3NpdGl2ZSA9IEZBTFNFOworICAKKyAgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9pbmNvbWluZ19ieXRlcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21pbmdfYnl0ZXMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9pbmNvbWluZ191bml4X2ZkcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21pbmdfdW5peF9mZHMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9vdXRnb2luZ19ieXRlcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfYnl0ZXMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9vdXRnb2luZ191bml4X2ZkcyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfdW5peF9mZHMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9tZXNzYWdlX3NpemUiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2Vfc2l6ZSA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X21lc3NhZ2VfdW5peF9mZHMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2VfdW5peF9mZHMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNlcnZpY2Vfc3RhcnRfdGltZW91dCIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5hY3RpdmF0aW9uX3RpbWVvdXQgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImF1dGhfdGltZW91dCIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5hdXRoX3RpbWVvdXQgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInJlcGx5X3RpbWVvdXQiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMucmVwbHlfdGltZW91dCA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9jb25uZWN0aW9uc19wZXJfdXNlciA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9uYW1lc19wZXJfY29ubmVjdGlvbiIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24gPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uID0gdmFsdWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgbm8gbGltaXQgY2FsbGVkIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAobXVzdF9iZV9wb3NpdGl2ZSAmJiB2YWx1ZSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiPGxpbWl0IG5hbWU9XCIlc1wiPiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobXVzdF9iZV9pbnQgJiYKKyAgICAgICh2YWx1ZSA8IF9EQlVTX0lOVF9NSU4gfHwgdmFsdWUgPiBfREJVU19JTlRfTUFYKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICI8bGltaXQgbmFtZT1cIiVzXCI+IHZhbHVlIGlzIHRvbyBsYXJnZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7ICAKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBFbGVtZW50VHlwZSB0OworICBjb25zdCBjaGFyICpuOworICBFbGVtZW50ICplOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIC8qIHByaW50ZiAoIkVORDogJXNcbiIsIGVsZW1lbnRfbmFtZSk7ICovCisgIAorICB0ID0gdG9wX2VsZW1lbnRfdHlwZSAocGFyc2VyKTsKKworICBpZiAodCA9PSBFTEVNRU5UX05PTkUpCisgICAgeworICAgICAgLyogc2hvdWxkIHByb2JhYmx5IGJlIGFuIGFzc2VydGlvbiBmYWlsdXJlIGJ1dAorICAgICAgICogYmVpbmcgcGFyYW5vaWQgYWJvdXQgWE1MIHBhcnNlcnMKKyAgICAgICAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiWE1MIHBhcnNlciBlbmRlZCBlbGVtZW50IHdpdGggbm8gZWxlbWVudCBvbiB0aGUgc3RhY2siKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbiA9IGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfdHlwZV90b19uYW1lICh0KTsKKyAgX2RidXNfYXNzZXJ0IChuICE9IE5VTEwpOworICBpZiAoc3RyY21wIChuLCBlbGVtZW50X25hbWUpICE9IDApCisgICAgeworICAgICAgLyogc2hvdWxkIHByb2JhYmx5IGJlIGFuIGFzc2VydGlvbiBmYWlsdXJlIGJ1dAorICAgICAgICogYmVpbmcgcGFyYW5vaWQgYWJvdXQgWE1MIHBhcnNlcnMKKyAgICAgICAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiWE1MIGVsZW1lbnQgPCVzPiBlbmRlZCBidXQgdG9wbW9zdCBlbGVtZW50IG9uIHRoZSBzdGFjayB3YXMgPCVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lLCBuKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZSA9IHBlZWtfZWxlbWVudCAocGFyc2VyKTsKKyAgX2RidXNfYXNzZXJ0IChlICE9IE5VTEwpOworCisgIHN3aXRjaCAoZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBFTEVNRU5UX05PTkU6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IGluIHN0YWNrIGhhcyBubyB0eXBlIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9JTkNMVURFOgorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgIGNhc2UgRUxFTUVOVF9MSVNURU46CisgICAgY2FzZSBFTEVNRU5UX1BJREZJTEU6CisgICAgY2FzZSBFTEVNRU5UX0FVVEg6CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI6CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREVESVI6CisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgICAgaWYgKCFlLT5oYWRfY29udGVudCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJYTUwgZWxlbWVudCA8JXM+IHdhcyBleHBlY3RlZCB0byBoYXZlIGNvbnRlbnQgaW5zaWRlIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKGUtPnR5cGUpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGUtPnR5cGUgPT0gRUxFTUVOVF9MSU1JVCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghc2V0X2xpbWl0IChwYXJzZXIsIGUtPmQubGltaXQubmFtZSwgZS0+ZC5saW1pdC52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9CVVNDT05GSUc6CisgICAgY2FzZSBFTEVNRU5UX1BPTElDWToKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1c6CisgICAgY2FzZSBFTEVNRU5UX0RFTlk6CisgICAgY2FzZSBFTEVNRU5UX0ZPUks6CisgICAgY2FzZSBFTEVNRU5UX1NZU0xPRzoKKyAgICBjYXNlIEVMRU1FTlRfS0VFUF9VTUFTSzoKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgY2FzZSBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBwb3BfZWxlbWVudCAocGFyc2VyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfd2hpdGVzcGFjZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKworICBfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZSAoc3RyLCAwLCAmaSk7CisKKyAgcmV0dXJuIGkgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFrZV9mdWxsX3BhdGggKGNvbnN0IERCdXNTdHJpbmcgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZnVsbF9wYXRoKQoreworICBpZiAoX2RidXNfcGF0aF9pc19hYnNvbHV0ZSAoZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weSAoZmlsZW5hbWUsIDAsIGZ1bGxfcGF0aCwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoYmFzZWRpciwgMCwgZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKGZ1bGxfcGF0aCwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbmNsdWRlX2ZpbGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIGlnbm9yZV9taXNzaW5nLAorICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIC8qIEZJWE1FIGdvb2QgdGVzdCBjYXNlIGZvciB0aGlzIHdvdWxkIGxvYWQgZWFjaCBjb25maWcgZmlsZSBpbiB0aGUKKyAgICogdGVzdCBzdWl0ZSBib3RoIGFsb25lLCBhbmQgYXMgYW4gaW5jbHVkZSwgYW5kIGNoZWNrCisgICAqIHRoYXQgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZQorICAgKi8KKyAgQnVzQ29uZmlnUGFyc2VyICppbmNsdWRlZDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICAgICAgICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICBmaWxlbmFtZV9zdHIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhpcyBmaWxlIGhhc24ndCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuICovCisgIGlmIChzZWVuX2luY2x1ZGUgKHBhcnNlciwgZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisJCSAgICAgICJDaXJjdWxhciBpbmNsdXNpb24gb2YgZmlsZSAnJXMnIiwKKwkJICAgICAgZmlsZW5hbWVfc3RyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoISBfZGJ1c19saXN0X2FwcGVuZCAoJnBhcnNlci0+aW5jbHVkZWRfZmlsZXMsICh2b2lkICopIGZpbGVuYW1lX3N0cikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2luY2UgcGFyc2VyIGlzIHBhc3NlZCBpbiBhcyB0aGUgcGFyZW50LCBpbmNsdWRlZAorICAgICBpbmhlcml0cyBwYXJzZXIncyBsaW1pdHMuICovCisgIGluY2x1ZGVkID0gYnVzX2NvbmZpZ19sb2FkIChmaWxlbmFtZSwgRkFMU0UsIHBhcnNlciwgJnRtcF9lcnJvcik7CisKKyAgX2RidXNfbGlzdF9wb3BfbGFzdCAoJnBhcnNlci0+aW5jbHVkZWRfZmlsZXMpOworCisgIGlmIChpbmNsdWRlZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworCisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCkgJiYKKyAgICAgICAgICBpZ25vcmVfbWlzc2luZykKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgICAgIGlmICghbWVyZ2VfaW5jbHVkZWQgKHBhcnNlciwgaW5jbHVkZWQsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChpbmNsdWRlZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIENvcHkgaW5jbHVkZWQncyBsaW1pdHMgYmFjayB0byBwYXJzZXIuICovCisgICAgICBwYXJzZXItPmxpbWl0cyA9IGluY2x1ZGVkLT5saW1pdHM7CisKKyAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChpbmNsdWRlZCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VydmljZWhlbHBlcl9wYXRoIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyOworICBjaGFyICpzZXJ2aWNlaGVscGVyOworCisgIGZpbGVuYW1lX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIC8qIGNvcHkgdG8gYXZvaWQgb3ZlcndyaXRpbmcgd2l0aCBOVUxMIG9uIE9PTSAqLworICBzZXJ2aWNlaGVscGVyID0gX2RidXNfc3RyZHVwIChmaWxlbmFtZV9zdHIpOworCisgIC8qIGNoZWNrIGZvciBPT00gKi8KKyAgaWYgKHNlcnZpY2VoZWxwZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBzYXZlIHRoZSBsYXRlc3Qgc2VydmljZWhlbHBlciBvbmx5IGlmIG5vdCBPT00gKi8KKyAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICBwYXJzZXItPnNlcnZpY2VoZWxwZXIgPSBzZXJ2aWNlaGVscGVyOworCisgIC8qIFdlIGRvbid0IGNoZWNrIHdoZXRoZXIgdGhlIGhlbHBlciBleGlzdHM7IGluc3RlYWQgd2UKKyAgICogd291bGQganVzdCBmYWlsIHRvIGV2ZXIgYWN0aXZhdGUgYW55dGhpbmcgaWYgaXQgZG9lc24ndC4KKyAgICogVGhpcyBhbGxvd3MgYW4gYWRtaW4gdG8gZml4IHRoZSBwcm9ibGVtIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAqIEl0IGFsc28gYWxsb3dzIHRoZSBwYXJzZXIgdGVzdCBzdWl0ZSB0byBzdWNjZXNzZnVsbHkgcGFyc2UKKyAgICogdGVzdCBjYXNlcyB3aXRob3V0IGluc3RhbGxpbmcgdGhlIGhlbHBlci4gOy0pCisgICAqLworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5jbHVkZV9kaXIgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmRpcm5hbWUsCisgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIGNoYXIgKnM7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgZGlyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKGRpcm5hbWUsIGVycm9yKTsKKworICBpZiAoZGlyID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChkaXJuYW1lLCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9ICAgICAgCisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZnVsbF9wYXRoLCAiLmNvbmYiKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghaW5jbHVkZV9maWxlIChwYXJzZXIsICZmdWxsX3BhdGgsIFRSVUUsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogV2UgbG9nIHRvIHN5c2xvZyB1bmNvbmRpdGlvbmFsbHkgaGVyZSwgYmVjYXVzZSB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgKiB0aGUgY29uZmlndXJhdGlvbiBwYXJzZXIsIHNvIHdlIGRvbid0IHlldCBrbm93IHdoZXRoZXIKKyAgICAgICAgICAgICAgICAgICAqIHRoaXMgYnVzIGlzIGdvaW5nIHRvIHdhbnQgdG8gd3JpdGUgdG8gc3lzbG9nISAoVGhlcmUncworICAgICAgICAgICAgICAgICAgICogYWxzbyBzb21lIGxheWVyIGludmVyc2lvbiBnb2luZyBvbiwgaWYgd2Ugd2FudCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAqIHRoZSBidXMgY29udGV4dC4pICovCisgICAgICAgICAgICAgICAgICBfZGJ1c19zeXN0ZW1fbG9nIChEQlVTX1NZU1RFTV9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmNvdW50ZXJlZCBlcnJvciAnJXMnIHdoaWxlIHBhcnNpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSk7CisgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChkaXJuYW1lLCAmcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5jb25mX2RpcnMsIHMpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisgIAorIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIAorICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBFbGVtZW50ICplOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisjaWYgMAorICB7CisgICAgY29uc3QgY2hhciAqY19zdHI7CisgICAgCisgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChjb250ZW50LCAmY19zdHIpOworCisgICAgcHJpbnRmICgiQ09OVEVOVCAlZCBieXRlczogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZW50KSwgY19zdHIpOworICB9CisjZW5kaWYKKyAgCisgIGUgPSBwZWVrX2VsZW1lbnQgKHBhcnNlcik7CisgIGlmIChlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGV4dCBjb250ZW50IG91dHNpZGUgb2YgYW55IFhNTCBlbGVtZW50IGluIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoZS0+aGFkX2NvbnRlbnQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRWxlbWVudCBoYWQgbXVsdGlwbGUgY29udGVudCBibG9ja3MiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc3dpdGNoICh0b3BfZWxlbWVudF90eXBlIChwYXJzZXIpKQorICAgIHsKKyAgICBjYXNlIEVMRU1FTlRfTk9ORToKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgYXQgdG9wIG9mIHN0YWNrIGhhcyBubyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBjYXNlIEVMRU1FTlRfQlVTQ09ORklHOgorICAgIGNhc2UgRUxFTUVOVF9QT0xJQ1k6CisgICAgY2FzZSBFTEVNRU5UX0FMTE9XOgorICAgIGNhc2UgRUxFTUVOVF9ERU5ZOgorICAgIGNhc2UgRUxFTUVOVF9GT1JLOgorICAgIGNhc2UgRUxFTUVOVF9TWVNMT0c6CisgICAgY2FzZSBFTEVNRU5UX0tFRVBfVU1BU0s6CisgICAgY2FzZSBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlM6ICAgIAorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6ICAgIAorICAgIGNhc2UgRUxFTUVOVF9BTExPV19BTk9OWU1PVVM6CisgICAgY2FzZSBFTEVNRU5UX1NFTElOVVg6CisgICAgY2FzZSBFTEVNRU5UX0FTU09DSUFURToKKyAgICAgIGlmIChhbGxfd2hpdGVzcGFjZSAoY29udGVudCkpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHRleHQgY29udGVudCBleHBlY3RlZCBpbnNpZGUgWE1MIGVsZW1lbnQgJXMgaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgIGNhc2UgRUxFTUVOVF9QSURGSUxFOgorICAgICAgeworICAgICAgICBjaGFyICpzOworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5waWRmaWxlKTsKKyAgICAgICAgcGFyc2VyLT5waWRmaWxlID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREU6CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoLCBzZWxpbnV4X3BvbGljeV9yb290OworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworCWlmIChlLT5kLmluY2x1ZGUuaWZfc2VsaW51eF9lbmFibGVkCisJICAgICYmICFidXNfc2VsaW51eF9lbmFibGVkICgpKQorCSAgYnJlYWs7CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICBpZiAoZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSkKKwkgIHsKKyAgICAgICAgICAgIGlmICghYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICgpKQorCSAgICAgIHsKKwkJZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKwkJCQkiQ291bGQgbm90IGRldGVybWluZSBTRUxpbnV4IHBvbGljeSByb290IGZvciByZWxhdGl2ZSBpbmNsdXNpb24iKTsKKwkJX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCQlyZXR1cm4gRkFMU0U7CisJICAgICAgfQorICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZWxpbnV4X3BvbGljeV9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19zZWxpbnV4X2dldF9wb2xpY3lfcm9vdCAoKSk7CisgICAgICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmc2VsaW51eF9wb2xpY3lfcm9vdCwgY29udGVudCwgJmZ1bGxfcGF0aCkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoIWluY2x1ZGVfZmlsZSAocGFyc2VyLCAmZnVsbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLmlnbm9yZV9taXNzaW5nLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgICAgeworICAgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgICAgCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAKKyAgICAgICAgaWYgKCFtYWtlX2Z1bGxfcGF0aCAoJnBhcnNlci0+YmFzZWRpciwgY29udGVudCwgJmZ1bGxfcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzZXJ2aWNlaGVscGVyX3BhdGggKHBhcnNlciwgJmZ1bGxfcGF0aCwgZXJyb3IpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICAgIHsKKyAgICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgICAgICAgIAorICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgCisgICAgICAgIGlmICghbWFrZV9mdWxsX3BhdGggKCZwYXJzZXItPmJhc2VkaXIsIGNvbnRlbnQsICZmdWxsX3BhdGgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpbmNsdWRlX2RpciAocGFyc2VyLCAmZnVsbF9wYXRoLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgICAgeworICAgICAgICBjaGFyICpzOworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgIGRidXNfZnJlZSAocGFyc2VyLT51c2VyKTsKKyAgICAgICAgcGFyc2VyLT51c2VyID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0NPTkZJR1RZUEU6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+YnVzX3R5cGUpOworICAgICAgICBwYXJzZXItPmJ1c190eXBlID0gczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBFTEVNRU5UX0xJU1RFTjoKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKworICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisgICAgICAgIAorICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbnRlbnQsICZzKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPmxpc3Rlbl9vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcykpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfQVVUSDoKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKyAgICAgICAgCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbnRlbnQsICZzKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwYXJzZXItPm1lY2hhbmlzbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoJmZ1bGxfcGF0aCwgJnMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorCisgICAgICAgIC8qIF9vbmx5XyBleHRyYSBzZXNzaW9uIGRpcmVjdG9yaWVzIGNhbiBiZSBzcGVjaWZpZWQgKi8KKyAgICAgICAgaWYgKCFzZXJ2aWNlX2RpcnNfYXBwZW5kX3VuaXF1ZV9vcl9mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsIHMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIHsKKyAgICAgICAgbG9uZyB2YWw7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoY29udGVudCwgMCwgJnZhbCwgTlVMTCkpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxpbWl0IG5hbWU9XCIlc1wiPiBlbGVtZW50IGhhcyBpbnZhbGlkIHZhbHVlIChjb3VsZCBub3QgcGFyc2UgYXMgaW50ZWdlcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmQubGltaXQubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIGUtPmQubGltaXQudmFsdWUgPSB2YWw7CisKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxvYWRlZCB2YWx1ZSAlbGQgZm9yIGxpbWl0ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlLT5kLmxpbWl0LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBlLT5kLmxpbWl0Lm5hbWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChwYXJzZXItPnN0YWNrICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IHdhcyBub3QgY2xvc2VkIGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocGFyc2VyLT5pc190b3BsZXZlbCAmJiBwYXJzZXItPmxpc3Rlbl9vbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyYXRpb24gZmlsZSBuZWVkcyBvbmUgb3IgbW9yZSA8bGlzdGVuPiBlbGVtZW50cyBnaXZpbmcgYWRkcmVzc2VzIik7IAorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT51c2VyOworfQorCitjb25zdCBjaGFyKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3R5cGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5idXNfdHlwZTsKK30KKworREJ1c0xpc3QqKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2FkZHJlc3NlcyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiAmcGFyc2VyLT5saXN0ZW5fb247Cit9CisKK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9tZWNoYW5pc21zIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPm1lY2hhbmlzbXM7Cit9CisKK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gJnBhcnNlci0+c2VydmljZV9kaXJzOworfQorCitEQnVzTGlzdCoqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfY29uZl9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPmNvbmZfZGlyczsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2dldF9mb3JrIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5mb3JrOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3N5c2xvZyAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcikKK3sKKyAgcmV0dXJuIHBhcnNlci0+c3lzbG9nOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2tlZXBfdW1hc2sgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPmtlZXBfdW1hc2s7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5hbGxvd19hbm9ueW1vdXM7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3BpZGZpbGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPnBpZGZpbGU7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VoZWxwZXIgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPnNlcnZpY2VoZWxwZXI7Cit9CisKK0J1c1BvbGljeSoKK2J1c19jb25maWdfcGFyc2VyX3N0ZWFsX3BvbGljeSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIEJ1c1BvbGljeSAqcG9saWN5OworCisgIF9kYnVzX2Fzc2VydCAocGFyc2VyLT5wb2xpY3kgIT0gTlVMTCk7IC8qIGNhbiBvbmx5IHN0ZWFsIHRoZSBwb2xpY3kgMSB0aW1lICovCisgIAorICBwb2xpY3kgPSBwYXJzZXItPnBvbGljeTsKKworICBwYXJzZXItPnBvbGljeSA9IE5VTEw7CisKKyAgcmV0dXJuIHBvbGljeTsKK30KKworLyogT3ZlcndyaXRlIGFueSBsaW1pdHMgdGhhdCB3ZXJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCit2b2lkCitidXNfY29uZmlnX3BhcnNlcl9nZXRfbGltaXRzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0xpbWl0cyAgICAgICAqbGltaXRzKQoreworICAqbGltaXRzID0gcGFyc2VyLT5saW1pdHM7Cit9CisKK0RCdXNIYXNoVGFibGUqCitidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBEQnVzSGFzaFRhYmxlICp0YWJsZTsKKworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlICE9IE5VTEwpOyAvKiBjYW4gb25seSBzdGVhbCBvbmNlICovCisKKyAgdGFibGUgPSBwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZTsKKworICBwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSA9IE5VTEw7CisKKyAgcmV0dXJuIHRhYmxlOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgZW51bQoreworICBWQUxJRCwKKyAgSU5WQUxJRCwKKyAgVU5LTk9XTgorfSBWYWxpZGl0eTsKKworc3RhdGljIGRidXNfYm9vbF90Citkb19sb2FkIChjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGgsCisgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSwKKyAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIG9vbV9wb3NzaWJsZSkKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICBpZiAob29tX3Bvc3NpYmxlICYmCisgICAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBkdWUgdG8gT09NXG4iKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBsb2FkIHZhbGlkIGZpbGUgYnV0IHN0aWxsIGhhZCBtZW1vcnk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmZXJyb3IpOworCisgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKworICAgICAgaWYgKHZhbGlkaXR5ID09IElOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQWNjZXB0ZWQgaW52YWxpZCBmaWxlXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGg7CisgIFZhbGlkaXR5ICAgICAgICAgIHZhbGlkaXR5OworfSBMb2FkZXJPb21EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xvYWRlcl9vb21fZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgTG9hZGVyT29tRGF0YSAqZCA9IGRhdGE7CisKKyAgcmV0dXJuIGRvX2xvYWQgKGQtPmZ1bGxfcGF0aCwgZC0+dmFsaWRpdHksIFRSVUUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzdWJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRpciA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnlcbiIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nXG4iKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmdGVzdF9kaXJlY3RvcnksICZlcnJvcik7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgdmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZSBpZiAodmFsaWRpdHkgPT0gSU5WQUxJRCkKKyAgICBwcmludGYgKCJUZXN0aW5nIGludmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIlRlc3RpbmcgdW5rbm93biBmaWxlczpcbiIpOworCisgbmV4dDoKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgIExvYWRlck9vbURhdGEgZDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmdWxsX3BhdGgsICIuY29uZiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNraXBwaW5nIG5vbi0uY29uZiBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgZXhwZWN0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgPT0gVkFMSUQgPyAidmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICh2YWxpZGl0eSA9PSBJTlZBTElEID8gImludmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAodmFsaWRpdHkgPT0gVU5LTk9XTiA/ICJ1bmtub3duIiA6ICI/Pz8iKSkpOworCisgICAgICBkLmZ1bGxfcGF0aCA9ICZmdWxsX3BhdGg7CisgICAgICBkLnZhbGlkaXR5ID0gdmFsaWRpdHk7CisKKyAgICAgIC8qIEZJWE1FIGhhY2thcm91bmQgZm9yIGFuIGV4cGF0IHByb2JsZW0sIHNlZQorICAgICAgICogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMjQ3NDcKKyAgICAgICAqIGh0dHA6Ly9mcmVlZGVza3RvcC5vcmcvcGlwZXJtYWlsL2RidXMvMjAwNC1NYXkvMDAxMTUzLmh0bWwKKyAgICAgICAqLworICAgICAgLyogaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoImNvbmZpZy1sb2FkZXIiLCBjaGVja19sb2FkZXJfb29tX2Z1bmMsICZkKSkgKi8KKyAgICAgIGlmICghY2hlY2tfbG9hZGVyX29vbV9mdW5jICgmZCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citib29sc19lcXVhbCAoZGJ1c19ib29sX3QgYSwKKwkgICAgIGRidXNfYm9vbF90IGIpCit7CisgIHJldHVybiBhID8gYiA6ICFiOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ3NfZXF1YWxfb3JfYm90aF9udWxsIChjb25zdCBjaGFyICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmIpCit7CisgIGlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQorICAgIHJldHVybiBhID09IGI7CisgIGVsc2UKKyAgICByZXR1cm4gIXN0cmNtcCAoYSwgYik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZWxlbWVudHNfZXF1YWwgKGNvbnN0IEVsZW1lbnQgKmEsCisJCWNvbnN0IEVsZW1lbnQgKmIpCit7CisgIGlmIChhLT50eXBlICE9IGItPnR5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYm9vbHNfZXF1YWwgKGEtPmhhZF9jb250ZW50LCBiLT5oYWRfY29udGVudCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHN3aXRjaCAoYS0+dHlwZSkKKyAgICB7CisKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERToKKyAgICAgIGlmICghYm9vbHNfZXF1YWwgKGEtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZywKKwkJCWItPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZykpCisJcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgICAgaWYgKGEtPmQucG9saWN5LnR5cGUgIT0gYi0+ZC5wb2xpY3kudHlwZSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoYS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlICE9IGItPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIGlmIChzdHJjbXAgKGEtPmQubGltaXQubmFtZSwgYi0+ZC5saW1pdC5uYW1lKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoYS0+ZC5saW1pdC52YWx1ZSAhPSBiLT5kLmxpbWl0LnZhbHVlKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpc3RzX29mX2VsZW1lbnRzX2VxdWFsIChEQnVzTGlzdCAqYSwKKwkJCSBEQnVzTGlzdCAqYikKK3sKKyAgREJ1c0xpc3QgKmlhOworICBEQnVzTGlzdCAqaWI7CisKKyAgaWEgPSBhOworICBpYiA9IGI7CisgIAorICB3aGlsZSAoaWEgIT0gTlVMTCAmJiBpYiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChlbGVtZW50c19lcXVhbCAoaWEtPmRhdGEsIGliLT5kYXRhKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpYSA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmEsIGlhKTsKKyAgICAgIGliID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmYiwgaWIpOworICAgIH0KKworICByZXR1cm4gaWEgPT0gTlVMTCAmJiBpYiA9PSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpc3RzX29mX2Nfc3RyaW5nc19lcXVhbCAoREJ1c0xpc3QgKmEsCisJCQkgIERCdXNMaXN0ICpiKQoreworICBEQnVzTGlzdCAqaWE7CisgIERCdXNMaXN0ICppYjsKKworICBpYSA9IGE7CisgIGliID0gYjsKKyAgCisgIHdoaWxlIChpYSAhPSBOVUxMICYmIGliICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoaWEtPmRhdGEsIGliLT5kYXRhKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpYSA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmEsIGlhKTsKKyAgICAgIGliID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmYiwgaWIpOworICAgIH0KKworICByZXR1cm4gaWEgPT0gTlVMTCAmJiBpYiA9PSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpbWl0c19lcXVhbCAoY29uc3QgQnVzTGltaXRzICphLAorCSAgICAgIGNvbnN0IEJ1c0xpbWl0cyAqYikKK3sKKyAgcmV0dXJuCisgICAgKGEtPm1heF9pbmNvbWluZ19ieXRlcyA9PSBiLT5tYXhfaW5jb21pbmdfYnl0ZXMKKyAgICAgfHwgYS0+bWF4X2luY29taW5nX3VuaXhfZmRzID09IGItPm1heF9pbmNvbWluZ191bml4X2ZkcworICAgICB8fCBhLT5tYXhfb3V0Z29pbmdfYnl0ZXMgPT0gYi0+bWF4X291dGdvaW5nX2J5dGVzCisgICAgIHx8IGEtPm1heF9vdXRnb2luZ191bml4X2ZkcyA9PSBiLT5tYXhfb3V0Z29pbmdfdW5peF9mZHMKKyAgICAgfHwgYS0+bWF4X21lc3NhZ2Vfc2l6ZSA9PSBiLT5tYXhfbWVzc2FnZV9zaXplCisgICAgIHx8IGEtPm1heF9tZXNzYWdlX3VuaXhfZmRzID09IGItPm1heF9tZXNzYWdlX3VuaXhfZmRzCisgICAgIHx8IGEtPmFjdGl2YXRpb25fdGltZW91dCA9PSBiLT5hY3RpdmF0aW9uX3RpbWVvdXQKKyAgICAgfHwgYS0+YXV0aF90aW1lb3V0ID09IGItPmF1dGhfdGltZW91dAorICAgICB8fCBhLT5tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zID09IGItPm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMKKyAgICAgfHwgYS0+bWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMgPT0gYi0+bWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMKKyAgICAgfHwgYS0+bWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyID09IGItPm1heF9jb25uZWN0aW9uc19wZXJfdXNlcgorICAgICB8fCBhLT5tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyA9PSBiLT5tYXhfcGVuZGluZ19hY3RpdmF0aW9ucworICAgICB8fCBhLT5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gPT0gYi0+bWF4X3NlcnZpY2VzX3Blcl9jb25uZWN0aW9uCisgICAgIHx8IGEtPm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiA9PSBiLT5tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24KKyAgICAgfHwgYS0+bWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gPT0gYi0+bWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24KKyAgICAgfHwgYS0+cmVwbHlfdGltZW91dCA9PSBiLT5yZXBseV90aW1lb3V0KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb25maWdfcGFyc2Vyc19lcXVhbCAoY29uc3QgQnVzQ29uZmlnUGFyc2VyICphLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqYikKK3sKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZhLT5iYXNlZGlyLCAmYi0+YmFzZWRpcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfZWxlbWVudHNfZXF1YWwgKGEtPnN0YWNrLCBiLT5zdGFjaykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghc3RyaW5nc19lcXVhbF9vcl9ib3RoX251bGwgKGEtPnVzZXIsIGItPnVzZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWxpc3RzX29mX2Nfc3RyaW5nc19lcXVhbCAoYS0+bGlzdGVuX29uLCBiLT5saXN0ZW5fb24pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWxpc3RzX29mX2Nfc3RyaW5nc19lcXVhbCAoYS0+bWVjaGFuaXNtcywgYi0+bWVjaGFuaXNtcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChhLT5zZXJ2aWNlX2RpcnMsIGItPnNlcnZpY2VfZGlycykpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgLyogRklYTUU6IGNvbXBhcmUgcG9saWN5ICovCisKKyAgLyogRklYTUU6IGNvbXBhcmUgc2VydmljZSBzZWxpbnV4IElEIHRhYmxlICovCisKKyAgaWYgKCEgbGltaXRzX2VxdWFsICgmYS0+bGltaXRzLCAmYi0+bGltaXRzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFzdHJpbmdzX2VxdWFsX29yX2JvdGhfbnVsbCAoYS0+cGlkZmlsZSwgYi0+cGlkZmlsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghIGJvb2xzX2VxdWFsIChhLT5mb3JrLCBiLT5mb3JrKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEgYm9vbHNfZXF1YWwgKGEtPmtlZXBfdW1hc2ssIGItPmtlZXBfdW1hc2spKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoISBib29sc19lcXVhbCAoYS0+aXNfdG9wbGV2ZWwsIGItPmlzX3RvcGxldmVsKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxsX2FyZV9lcXVpdiAoY29uc3QgREJ1c1N0cmluZyAqdGFyZ2V0X2RpcmVjdG9yeSkKK3sKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgQnVzQ29uZmlnUGFyc2VyICpmaXJzdF9wYXJzZXI7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfYm9vbF90IGVxdWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgZGlyID0gTlVMTDsKKyAgZmlyc3RfcGFyc2VyID0gTlVMTDsKKyAgcGFyc2VyID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAodGFyZ2V0X2RpcmVjdG9yeSwgJmVycm9yKTsKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3Qgb3BlbiAlczogJXNcbiIsCisJCSAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh0YXJnZXRfZGlyZWN0b3J5KSwKKwkJICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorCisgIHByaW50ZiAoIkNvbXBhcmluZyBlcXVpdmFsZW50IGZpbGVzOlxuIik7CisKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0YXJnZXRfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZ1bGxfcGF0aCwgIi5jb25mIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5jb25mIGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKwkgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgiICAgICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCisgICAgICBwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKCZmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisKKyAgICAgIGlmIChwYXJzZXIgPT0gTlVMTCkKKwl7CisJICBfZGJ1c193YXJuICgiQ291bGQgbm90IGxvYWQgZmlsZSAlczogJXNcbiIsCisJCSAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksCisJCSAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKwkgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKwkgIGdvdG8gZmluaXNoZWQ7CisJfQorICAgICAgZWxzZSBpZiAoZmlyc3RfcGFyc2VyID09IE5VTEwpCisJeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKwkgIGZpcnN0X3BhcnNlciA9IHBhcnNlcjsKKwl9CisgICAgICBlbHNlCisJeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKwkgIGVxdWFsID0gY29uZmlnX3BhcnNlcnNfZXF1YWwgKGZpcnN0X3BhcnNlciwgcGFyc2VyKTsKKwkgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworCSAgaWYgKCEgZXF1YWwpCisJICAgIGdvdG8gZmluaXNoZWQ7CisJfQorICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmluaXNoZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoZmlyc3RfcGFyc2VyKQorICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChmaXJzdF9wYXJzZXIpOworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKworICByZXR1cm4gcmV0dmFsOworICAKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3RfZXF1aXZfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2Jhc2VfZGlyLAorCQkJICAgY29uc3QgY2hhciAgICAgICAqc3ViZGlyKQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfYm9vbF90IGVxdWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgZGlyID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnkiKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBzdWJkaXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfYmFzZV9kaXIsIDAsCisJCQkgICZ0ZXN0X2RpcmVjdG9yeSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSB0ZXN0X2Jhc2VfZGlyIHRvIHRlc3RfZGlyZWN0b3J5Iik7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmdGVzdF9kaXJlY3RvcnksICZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIGZpbGVuYW1lIHN0cmluZyIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZGlyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKCZ0ZXN0X2RpcmVjdG9yeSwgJmVycm9yKTsKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3Qgb3BlbiAlczogJXNcbiIsCisJCSAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorCQkgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmaW5pc2hlZDsKKyAgICB9CisKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKworICAgICAgLyogU2tpcCBDVlMncyBtYWdpYyBkaXJlY3RvcmllcyEgKi8KKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZmaWxlbmFtZSwgIkNWUyIpKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmdGVzdF9kaXJlY3RvcnksIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IGRpciB0byBmdWxsX3BhdGgiKTsKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb25jYXQgZmlsZSB0byBkaXIiKTsKKyAgICAgIAorICAgICAgZXF1YWwgPSBhbGxfYXJlX2VxdWl2ICgmZnVsbF9wYXRoKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworICAgICAgaWYgKCFlcXVhbCkKKwlnb3RvIGZpbmlzaGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmluaXNoZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdF9kaXJlY3RvcnkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKGRpcikKKyAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGRpcik7CisKKyAgcmV0dXJuIHJldHZhbDsKKyAgCit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1tdID0gCisgICAgICAgIHsKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgICAgICIvdGVzdGhvbWUvZm9vLy50ZXN0bG9jYWwvdGVzdHNoYXJlL2RidXMtMS9zZXJ2aWNlcyIsCisgICAgICAgICAiL3Rlc3R1c3IvdGVzdGxvY2FsL3Rlc3RzaGFyZS9kYnVzLTEvc2VydmljZXMiLAorICAgICAgICAgIi90ZXN0dXNyL3Rlc3RzaGFyZS9kYnVzLTEvc2VydmljZXMiLAorICAgICAgICAgREJVU19EQVRBRElSIi9kYnVzLTEvc2VydmljZXMiLAorI2VuZGlmCisvKiB3aWxsIGJlIGZpbGxlZCBpbiB0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycygpICovCisjaWZkZWYgREJVU19XSU4KKyAgICAgICAgIE5VTEwsCisgICAgICAgICBOVUxMLAorI2VuZGlmCisgICAgICAgICBOVUxMCisgICAgICAgIH07CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMgKHZvaWQpCit7CisgIERCdXNMaXN0ICpkaXJzOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c1N0cmluZyBwcm9nczsKKyAgY29uc3QgY2hhciAqY29tbW9uX3Byb2dzOworICBpbnQgaTsKKworI2lmZGVmIERCVVNfV0lOCisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBpZiAoX2RidXNfZ2V0X2luc3RhbGxfcm9vdChidWZmZXIsIHNpemVvZihidWZmZXIpKSkKKyAgICB7CisgICAgICBzdHJjYXQoYnVmZmVyLERCVVNfREFUQURJUik7CisgICAgICBzdHJjYXQoYnVmZmVyLCIvZGJ1cy0xL3NlcnZpY2VzIik7CisgICAgICB0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1swXSA9IGJ1ZmZlcjsKKyAgICB9CisjZW5kaWYKKworICAvKiBPbiBVbml4IHdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGlzIHZhcmlhYmxlLCBidXQgaXQncyBlYXNpZXIgdG8gaGFuZGxlIHRoZQorICAgKiBkZWFsbG9jYXRpb24gaWYgd2UgYWx3YXlzIGFsbG9jYXRlIGl0LCB3aGV0aGVyIG5lZWRlZCBvciBub3QgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnByb2dzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJPT00gYWxsb2NhdGluZyBwcm9ncyIpOworCisgIGNvbW1vbl9wcm9ncyA9IF9kYnVzX2dldGVudiAoIkNvbW1vblByb2dyYW1GaWxlcyIpOworI2lmbmRlZiBEQlVTX1VOSVgKKyAgaWYgKGNvbW1vbl9wcm9ncykgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsIGNvbW1vbl9wcm9ncykpIAorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnByb2dzLCAiL2RidXMtMS9zZXJ2aWNlcyIpKSAKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMV0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnByb2dzKTsKKyAgICB9CisjZW5kaWYKKyAgZGlycyA9IE5VTEw7CisKKyAgcHJpbnRmICgiVGVzdGluZyByZXRyaWV2aW5nIHRoZSBkZWZhdWx0IHNlc3Npb24gc2VydmljZSBkaXJlY3Rvcmllc1xuIik7CisgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSBvdXIgZGVmYXVsdHMgZW5kIHdpdGggc2hhcmUvZGJ1cy0xL3NlcnZpY2UgKi8KKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHBhdGg7CisgICAgICAKKyAgICAgIHByaW50ZiAoIiAgICBkZWZhdWx0IHNlcnZpY2UgZGlyOiAlc1xuIiwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aCwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJnBhdGgsICJkYnVzLTEvc2VydmljZXMiKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoImVycm9yIHdpdGggZGVmYXVsdCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXNcbiIpOworCSAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgCSAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorIAorICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgaWYgKCFfZGJ1c19zZXRlbnYgKCJYREdfREFUQV9IT01FIiwgIi90ZXN0aG9tZS9mb28vLnRlc3Rsb2NhbC90ZXN0c2hhcmUiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBzZXRlbnYgWERHX0RBVEFfSE9NRSIpOworCisgIGlmICghX2RidXNfc2V0ZW52ICgiWERHX0RBVEFfRElSUyIsICI6L3Rlc3R1c3IvdGVzdGxvY2FsL3Rlc3RzaGFyZTogOi90ZXN0dXNyL3Rlc3RzaGFyZToiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBzZXRlbnYgWERHX0RBVEFfRElSUyIpOworI2VuZGlmCisgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSB3ZSByZWFkIGFuZCBwYXJzZSB0aGUgZW52IHZhcmlhYmxlIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgICAgdGVzdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1vcmUgZGlyZWN0b3JpZXMgcGFyc2VkIHRoYW4gaW4gbWF0Y2ggc2V0XG4iKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAKKyAgICAgIGlmIChzdHJjbXAgKHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldLCAKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbGluay0+ZGF0YSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiVzIGRpcmVjdG9yeSBkb2VzIG5vdCBtYXRjaCAlcyBpbiB0aGUgbWF0Y2ggc2V0XG4iLCAKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgIHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgKytpOworCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgIH0KKyAgCisgIGlmICh0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImV4dHJhIGRhdGEgJXMgaW4gdGhlIG1hdGNoIHNldCB3YXMgbm90IG1hdGNoZWRcbiIsCisgICAgICAgICAgICAgIHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW10gPSAKKyAgICAgICAgeworI2lmZGVmIERCVVNfVU5JWAorICAgICAgICAgIi90ZXN0dXNyL3Rlc3Rsb2NhbC90ZXN0c2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIsCisgICAgICAgICAiL3Rlc3R1c3IvdGVzdHNoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiLAorI2VuZGlmCisgICAgICAgICBEQlVTX0RBVEFESVIiL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiLAorI2lmZGVmIERCVVNfV0lOCisgICAgICAgICBOVUxMLAorI2VuZGlmCisgICAgICAgICBOVUxMCisgICAgICAgIH07CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9kZWZhdWx0X3N5c3RlbV9zZXJ2aWNlZGlycyAodm9pZCkKK3sKKyAgREJ1c0xpc3QgKmRpcnM7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzU3RyaW5nIHByb2dzOworICBjb25zdCBjaGFyICpjb21tb25fcHJvZ3M7CisgIGludCBpOworCisgIC8qIE9uIFVuaXggd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoaXMgdmFyaWFibGUsIGJ1dCBpdCdzIGVhc2llciB0byBoYW5kbGUgdGhlCisgICAqIGRlYWxsb2NhdGlvbiBpZiB3ZSBhbHdheXMgYWxsb2NhdGUgaXQsIHdoZXRoZXIgbmVlZGVkIG9yIG5vdCAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcHJvZ3MpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIk9PTSBhbGxvY2F0aW5nIHByb2dzIik7CisKKyAgY29tbW9uX3Byb2dzID0gX2RidXNfZ2V0ZW52ICgiQ29tbW9uUHJvZ3JhbUZpbGVzIik7CisjaWZuZGVmIERCVVNfVU5JWAorICBpZiAoY29tbW9uX3Byb2dzKSAKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwcm9ncywgY29tbW9uX3Byb2dzKSkgCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsICIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIpKSAKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgdGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1sxXSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmcHJvZ3MpOworICAgIH0KKyNlbmRpZgorICBkaXJzID0gTlVMTDsKKworICBwcmludGYgKCJUZXN0aW5nIHJldHJpZXZpbmcgdGhlIGRlZmF1bHQgc3lzdGVtIHNlcnZpY2UgZGlyZWN0b3JpZXNcbiIpOworICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSBvdXIgZGVmYXVsdHMgZW5kIHdpdGggc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlICovCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZkaXJzKSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBwYXRoOworICAgICAgCisgICAgICBwcmludGYgKCIgICAgZGVmYXVsdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnBhdGgsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZwYXRoLCAiZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiZXJyb3Igd2l0aCBkZWZhdWx0IHN5c3RlbSBzZXJ2aWNlIGRpcmVjdG9yaWVzXG4iKTsKKwkgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgIAkgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgfQorCisjaWZkZWYgREJVU19VTklYCisgIGlmICghX2RidXNfc2V0ZW52ICgiWERHX0RBVEFfSE9NRSIsICIvdGVzdGhvbWUvZm9vLy50ZXN0bG9jYWwvdGVzdHNoYXJlIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3Qgc2V0ZW52IFhER19EQVRBX0hPTUUiKTsKKworICBpZiAoIV9kYnVzX3NldGVudiAoIlhER19EQVRBX0RJUlMiLCAiOi90ZXN0dXNyL3Rlc3Rsb2NhbC90ZXN0c2hhcmU6IDovdGVzdHVzci90ZXN0c2hhcmU6IikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3Qgc2V0ZW52IFhER19EQVRBX0RJUlMiKTsKKyNlbmRpZgorICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSB3ZSByZWFkIGFuZCBwYXJzZSB0aGUgZW52IHZhcmlhYmxlIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgICAgdGVzdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAodGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibW9yZSBkaXJlY3RvcmllcyBwYXJzZWQgdGhhbiBpbiBtYXRjaCBzZXRcbiIpOworICAgICAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorIAorICAgICAgaWYgKHN0cmNtcCAodGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSwgCisgICAgICAgICAgICAgICAgICAoY2hhciAqKWxpbmstPmRhdGEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIlcyBkaXJlY3RvcnkgZG9lcyBub3QgbWF0Y2ggJXMgaW4gdGhlIG1hdGNoIHNldFxuIiwgCisgICAgICAgICAgICAgICAgICAoY2hhciAqKWxpbmstPmRhdGEsCisgICAgICAgICAgICAgICAgICB0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgKytpOworCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgIH0KKyAgCisgIGlmICh0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldICE9IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiZXh0cmEgZGF0YSAlcyBpbiB0aGUgbWF0Y2ggc2V0IHdhcyBub3QgbWF0Y2hlZFxuIiwKKyAgICAgICAgICAgICAgdGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcHJvZ3MpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9ncyk7CisgIHJldHVybiBUUlVFOworfQorCQkgICAKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMIHx8CisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodGVzdF9kYXRhX2RpcikgPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJObyB0ZXN0IGRhdGFcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghdGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBEQlVTX1dJTgorICBwcmludGYoImRlZmF1bHQgc3lzdGVtIHNlcnZpY2UgZGlyIHNraXBwZWRcbiIpOworI2Vsc2UKKyAgaWYgKCF0ZXN0X2RlZmF1bHRfc3lzdGVtX3NlcnZpY2VkaXJzKCkpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgaWYgKCFwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAidmFsaWQtY29uZmlnLWZpbGVzIiwgVkFMSUQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKHRlc3RfZGF0YV9kaXIsICJpbnZhbGlkLWNvbmZpZy1maWxlcyIsIElOVkFMSUQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXByb2Nlc3NfdGVzdF9lcXVpdl9zdWJkaXIgKHRlc3RfZGF0YV9kaXIsICJlcXVpdi1jb25maWctZmlsZXMiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9jb25maWctcGFyc2VyLmggYi9kYnVzLTEuNC4xMC9idXMvY29uZmlnLXBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWJmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvY29uZmlnLXBhcnNlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci5oICBYTUwtbGlicmFyeS1hZ25vc3RpYyBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQ09ORklHX1BBUlNFUl9ICisjZGVmaW5lIEJVU19DT05GSUdfUEFSU0VSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSAiYnVzLmgiCisKKy8qIFdoYXRldmVyIFhNTCBsaWJyYXJ5IHdlJ3JlIHVzaW5nIGp1c3QgcHVzaGVzIGRhdGEgaW50byB0aGlzIEFQSSAqLworCit0eXBlZGVmIHN0cnVjdCBCdXNDb25maWdQYXJzZXIgQnVzQ29uZmlnUGFyc2VyOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX25ldyAoY29uc3QgREJ1c1N0cmluZyAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpwYXJlbnQpOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX3JlZiAgICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOwordm9pZCAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAgICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50ICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworLyogRnVuY3Rpb25zIGZvciBleHRyYWN0aW5nIHRoZSBwYXJzZSByZXN1bHRzICovCitjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWRkcmVzc2VzICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfbWVjaGFuaXNtcyAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfZm9yayAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfc3lzbG9nICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl9nZXRfa2VlcF91bWFzayAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfcGlkZmlsZSAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZWhlbHBlciAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworREJ1c0xpc3QqKiAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworREJ1c0xpc3QqKiAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2NvbmZfZGlycyAgICAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworQnVzUG9saWN5KiAgYnVzX2NvbmZpZ19wYXJzZXJfc3RlYWxfcG9saWN5ICAgICAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOwordm9pZCAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2xpbWl0cyAgICAgICAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNMaW1pdHMgICAgICAgKmxpbWl0cyk7CisKK0RCdXNIYXNoVGFibGUqIGJ1c19jb25maWdfcGFyc2VyX3N0ZWFsX3NlcnZpY2VfY29udGV4dF90YWJsZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworCisvKiBMb2FkZXIgZnVuY3Rpb25zIChiYWNrZW5kZWQgb2ZmIG9uZSBvZiB0aGUgWE1MIHBhcnNlcnMpLiAgUmV0dXJucyBhCisgKiBmaW5pc2hlZCBDb25maWdQYXJzZXIuCisgKi8KK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19sb2FkIChjb25zdCBEQnVzU3RyaW5nICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19DT05GSUdfUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9jb25uZWN0aW9uLmMgYi9kYnVzLTEuNC4xMC9idXMvY29ubmVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlN2QyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsMjMwOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25uZWN0aW9uLmMgIENsaWVudCBjb25uZWN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInNpZ25hbHMuaCIKKyNpbmNsdWRlICJleHBpcmVsaXN0LmgiCisjaW5jbHVkZSAic2VsaW51eC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGltZW91dC5oPgorCisvKiBUcmltIGV4ZWN1dGVkIGNvbW1hbmRzIHRvIHRoaXMgbGVuZ3RoOyB3ZSB3YW50IHRvIGtlZXAgbG9ncyByZWFkYWJsZSAqLworI2RlZmluZSBNQVhfTE9HX0NPTU1BTkRfTEVOIDUwCisKK3N0YXRpYyB2b2lkIGJ1c19jb25uZWN0aW9uX3JlbW92ZV90cmFuc2FjdGlvbnMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzRXhwaXJlSXRlbSBleHBpcmVfaXRlbTsKKworICBEQnVzQ29ubmVjdGlvbiAqd2lsbF9nZXRfcmVwbHk7CisgIERCdXNDb25uZWN0aW9uICp3aWxsX3NlbmRfcmVwbHk7CisKKyAgZGJ1c191aW50MzJfdCByZXBseV9zZXJpYWw7CisgIAorfSBCdXNQZW5kaW5nUmVwbHk7CisKK3N0cnVjdCBCdXNDb25uZWN0aW9ucworeworICBpbnQgcmVmY291bnQ7CisgIERCdXNMaXN0ICpjb21wbGV0ZWQ7ICAvKio8IExpc3Qgb2YgYWxsIGNvbXBsZXRlZCBjb25uZWN0aW9ucyAqLworICBpbnQgbl9jb21wbGV0ZWQ7ICAgICAgLyoqPCBMZW5ndGggb2YgY29tcGxldGVkIGxpc3QgKi8KKyAgREJ1c0xpc3QgKmluY29tcGxldGU7IC8qKjwgTGlzdCBvZiBhbGwgbm90LXlldC1hY3RpdmUgY29ubmVjdGlvbnMgKi8KKyAgaW50IG5faW5jb21wbGV0ZTsgICAgIC8qKjwgTGVuZ3RoIG9mIGluY29tcGxldGUgbGlzdCAqLworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzSGFzaFRhYmxlICpjb21wbGV0ZWRfYnlfdXNlcjsgLyoqPCBOdW1iZXIgb2YgY29tcGxldGVkIGNvbm5lY3Rpb25zIGZvciBlYWNoIFVJRCAqLworICBEQnVzVGltZW91dCAqZXhwaXJlX3RpbWVvdXQ7IC8qKjwgVGltZW91dCBmb3IgZXhwaXJpbmcgaW5jb21wbGV0ZSBjb25uZWN0aW9ucy4gKi8KKyAgaW50IHN0YW1wOyAgICAgICAgICAgICAgICAgICAvKio8IEluY3JlbWVudGluZyBudW1iZXIgKi8KKyAgQnVzRXhwaXJlTGlzdCAqcGVuZGluZ19yZXBsaWVzOyAvKio8IExpc3Qgb2YgcGVuZGluZyByZXBsaWVzICovCit9OworCitzdGF0aWMgZGJ1c19pbnQzMl90IGNvbm5lY3Rpb25fZGF0YV9zbG90ID0gLTE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgREJ1c0xpc3QgKmxpbmtfaW5fY29ubmVjdGlvbl9saXN0OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0xpc3QgKnNlcnZpY2VzX293bmVkOworICBpbnQgbl9zZXJ2aWNlc19vd25lZDsKKyAgREJ1c0xpc3QgKm1hdGNoX3J1bGVzOworICBpbnQgbl9tYXRjaF9ydWxlczsKKyAgY2hhciAqbmFtZTsKKyAgREJ1c0xpc3QgKnRyYW5zYWN0aW9uX21lc3NhZ2VzOyAvKio8IFN0dWZmIHdlIG5lZWQgdG8gc2VuZCBhcyBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gKi8KKyAgREJ1c01lc3NhZ2UgKm9vbV9tZXNzYWdlOworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqb29tX3ByZWFsbG9jYXRlZDsKKyAgQnVzQ2xpZW50UG9saWN5ICpwb2xpY3k7CisKKyAgY2hhciAqY2FjaGVkX2xvZ2luZm9fc3RyaW5nOworICBCdXNTRUxpbnV4SUQgKnNlbGludXhfaWQ7CisKKyAgbG9uZyBjb25uZWN0aW9uX3R2X3NlYzsgIC8qKjwgVGltZSB3aGVuIHdlIGNvbm5lY3RlZCAoc2Vjb25kcyBjb21wb25lbnQpICovCisgIGxvbmcgY29ubmVjdGlvbl90dl91c2VjOyAvKio8IFRpbWUgd2hlbiB3ZSBjb25uZWN0ZWQgKG1pY3Jvc2VjIGNvbXBvbmVudCkgKi8KKyAgaW50IHN0YW1wOyAgICAgICAgICAgICAgIC8qKjwgY29ubmVjdGlvbnMtPnN0YW1wIGxhc3QgdGltZSB3ZSB3ZXJlIHRyYXZlcnNlZCAqLworfSBCdXNDb25uZWN0aW9uRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90IGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQgYnVzX2Nvbm5lY3Rpb25fZHJvcF9wZW5kaW5nX3JlcGxpZXMgKEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uKTsKKworc3RhdGljIGRidXNfYm9vbF90IGV4cGlyZV9pbmNvbXBsZXRlX3RpbWVvdXQgKHZvaWQgKmRhdGEpOworCisjZGVmaW5lIEJVU19DT05ORUNUSU9OX0RBVEEoY29ubmVjdGlvbikgKGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSAoKGNvbm5lY3Rpb24pLCBjb25uZWN0aW9uX2RhdGFfc2xvdCkpCisKK3N0YXRpYyBEQnVzTG9vcCoKK2Nvbm5lY3Rpb25fZ2V0X2xvb3AgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGJ1c19jb250ZXh0X2dldF9sb29wIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7Cit9CisKKworc3RhdGljIGludAorZ2V0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgdWlkKQoreworICB2b2lkICp2YWw7CisgIGludCBjdXJyZW50X2NvdW50OworCisgIC8qIHZhbCBpcyBOVUxMIGlzIDAgd2hlbiBpdCBpc24ndCBpbiB0aGUgaGFzaCB5ZXQgKi8KKyAgCisgIHZhbCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisKKyAgY3VycmVudF9jb3VudCA9IF9EQlVTX1BPSU5URVJfVE9fSU5UICh2YWwpOworCisgIHJldHVybiBjdXJyZW50X2NvdW50OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkanVzdF9jb25uZWN0aW9uc19mb3JfdWlkIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYWRqdXN0bWVudCkKK3sKKyAgaW50IGN1cnJlbnRfY291bnQ7CisKKyAgY3VycmVudF9jb3VudCA9IGdldF9jb25uZWN0aW9uc19mb3JfdWlkIChjb25uZWN0aW9ucywgdWlkKTsKKworICBfZGJ1c192ZXJib3NlICgiQWRqdXN0aW5nIGNvbm5lY3Rpb24gY291bnQgZm9yIFVJRCAiIERCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAiOiB3YXMgJWQgYWRqdXN0bWVudCAlZCBtYWtpbmcgJWRcbiIsCisgICAgICAgICAgICAgICAgIHVpZCwgY3VycmVudF9jb3VudCwgYWRqdXN0bWVudCwgY3VycmVudF9jb3VudCArIGFkanVzdG1lbnQpOworICAKKyAgX2RidXNfYXNzZXJ0IChjdXJyZW50X2NvdW50ID49IDApOworICAKKyAgY3VycmVudF9jb3VudCArPSBhZGp1c3RtZW50OworCisgIF9kYnVzX2Fzc2VydCAoY3VycmVudF9jb3VudCA+PSAwKTsKKworICBpZiAoY3VycmVudF9jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3VpbnRwdHIgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciwgdWlkKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgICAgIAorICAgICAgcmV0dmFsID0gX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZF9ieV91c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGN1cnJlbnRfY291bnQpKTsKKworICAgICAgLyogb25seSBwb3NpdGl2ZSBhZGp1c3RtZW50IGNhbiBmYWlsIGFzIG90aGVyd2lzZQorICAgICAgICogYSBoYXNoIGVudHJ5IHNob3VsZCBhbHJlYWR5IGV4aXN0CisgICAgICAgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRqdXN0bWVudCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKGFkanVzdG1lbnQgPD0gMCAmJiByZXR2YWwpKTsKKworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzIGRpc2Nvbm5lY3RlZCwgZHJvcHBpbmcgYWxsIHNlcnZpY2Ugb3duZXJzaGlwIGFuZCByZWxlYXNpbmdcbiIsCisgICAgICAgICAgICAgICAgIGQtPm5hbWUgPyBkLT5uYW1lIDogIihpbmFjdGl2ZSkiKTsKKworICAvKiBEZWxldGUgb3VyIG1hdGNoIHJ1bGVzICovCisgIGlmIChkLT5uX21hdGNoX3J1bGVzID4gMCkKKyAgICB7CisgICAgICBtYXRjaG1ha2VyID0gYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKyAgICAgIGJ1c19tYXRjaG1ha2VyX2Rpc2Nvbm5lY3RlZCAobWF0Y2htYWtlciwgY29ubmVjdGlvbik7CisgICAgfQorICAKKyAgLyogRHJvcCBhbnkgc2VydmljZSBvd25lcnNoaXAuIFVuZm9ydHVuYXRlbHksIHRoaXMgcmVxdWlyZXMKKyAgICogbWVtb3J5IGFsbG9jYXRpb24gYW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2Qgd2F5IHRvCisgICAqIGhhbmRsZSBpdCBvdGhlciB0aGFuIHNsZWVwaW5nOyB3ZSBjYW4ndCAiZmFpbCIgdGhlIG9wZXJhdGlvbiBvZgorICAgKiBkaXNjb25uZWN0aW5nIGEgY2xpZW50LCBhbmQgcHJlYWxsb2NhdGluZyBhIGJyb2FkY2FzdCAic2VydmljZSBpcworICAgKiBub3cgZ29uZSIgbWVzc2FnZSBmb3IgZXZlcnkgY2xpZW50LXNlcnZpY2UgcGFpciBzZWVtcyBraW5kIG9mCisgICAqIGludm9sdmVkLgorICAgKi8KKyAgd2hpbGUgKChzZXJ2aWNlID0gX2RidXNfbGlzdF9nZXRfbGFzdCAoJmQtPnNlcnZpY2VzX293bmVkKSkpCisgICAgeworICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworICAgICAgREJ1c0Vycm9yIGVycm9yOworCisgICAgcmV0cnk6CisgICAgICAKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgICAgICAgCisgICAgICB3aGlsZSAoKHRyYW5zYWN0aW9uID0gYnVzX3RyYW5zYWN0aW9uX25ldyAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpKSA9PSBOVUxMKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgIAorICAgICAgaWYgKCFidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gcmVtb3ZlIHNlcnZpY2Ugb3duZXI6ICVzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUmVtb3Zpbmcgc2VydmljZSBvd25lciBmYWlsZWQgZm9yIG5vbi1tZW1vcnktcmVsYXRlZCByZWFzb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgfQorCisgIGJ1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoY29ubmVjdGlvbik7CisgIAorICAvKiBubyBtb3JlIHdhdGNoaW5nICovCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgCisgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV90cmFuc2FjdGlvbnMgKGNvbm5lY3Rpb24pOworCisgIGlmIChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkLT5uYW1lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmZC0+Y29ubmVjdGlvbnMtPmNvbXBsZXRlZCwgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QpOworICAgICAgICAgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ID0gTlVMTDsKKyAgICAgICAgICBkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgLT0gMTsKKworICAgICAgICAgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghYWRqdXN0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKGQtPmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIC0xKSkKKyAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhZGp1c3RpbmcgZG93bndhcmQgc2hvdWxkIG5ldmVyIGZhaWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmQtPmNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLCBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBOVUxMOworICAgICAgICAgIGQtPmNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgLT0gMTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKGQtPmNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgPj0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGQtPmNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZCA+PSAwKTsKKyAgICB9CisKKyAgYnVzX2Nvbm5lY3Rpb25fZHJvcF9wZW5kaW5nX3JlcGxpZXMgKGQtPmNvbm5lY3Rpb25zLCBjb25uZWN0aW9uKTsKKyAgCisgIC8qIGZyZWVzICJkIiBhcyBzaWRlIGVmZmVjdCAqLworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9kYXRhX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Nvbm5lY3Rpb25fd2F0Y2hfY2FsbGJhY2sgKERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAvKiBGSVhNRSB0aGlzIGNhbiBiZSBkb25lIGluIGRidXMtbWFpbmxvb3AuYworICAqIGlmIHRoZSBjb2RlIGluIGFjdGl2YXRpb24uYyBmb3IgdGhlIGJhYnlzaXR0ZXIKKyAgKiB3YXRjaCBoYW5kbGVyIGlzIGZpeGVkLgorICAqLworICAKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJDYWxsaW5nIGhhbmRsZV93YXRjaFxuIik7CisjZW5kaWYKKyAgcmV0dXJuIGRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY29ubmVjdGlvbl93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb25uZWN0aW9uX2dldF9sb29wIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgY29ubmVjdGlvbl93YXRjaF9jYWxsYmFjaywgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jb25uZWN0aW9uX3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChjb25uZWN0aW9uX2dldF9sb29wIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLCBjb25uZWN0aW9uX3dhdGNoX2NhbGxiYWNrLCBjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK2Nvbm5lY3Rpb25fdGltZW91dF9jYWxsYmFjayAoREJ1c1RpbWVvdXQgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgLyogREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOyAqLworCisgIC8qIGNhbiByZXR1cm4gRkFMU0Ugb24gT09NIGJ1dCB3ZSBqdXN0IGxldCBpdCBmaXJlIGFnYWluIGxhdGVyICovCisgIGRidXNfdGltZW91dF9oYW5kbGUgKHRpbWVvdXQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9jb25uZWN0aW9uX3RpbWVvdXQgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKyAgCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF90aW1lb3V0IChjb25uZWN0aW9uX2dldF9sb29wIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIGNvbm5lY3Rpb25fdGltZW91dF9jYWxsYmFjaywgY29ubmVjdGlvbiwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfY29ubmVjdGlvbl90aW1lb3V0IChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisgIAorICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChjb25uZWN0aW9uX2dldF9sb29wIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwgY29ubmVjdGlvbl90aW1lb3V0X2NhbGxiYWNrLCBjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBuZXdfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xvb3AgKmxvb3AgPSBkYXRhOworICAKKyAgaWYgKG5ld19zdGF0dXMgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICB3aGlsZSAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsbG93X3VuaXhfdXNlcl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBidXNfY29udGV4dF9hbGxvd191bml4X3VzZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LCB1aWQpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25uZWN0aW9uX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkID0gZGF0YTsKKworICAvKiBzZXJ2aWNlc19vd25lZCBzaG91bGQgYmUgTlVMTCBzaW5jZSB3ZSBzaG91bGQgYmUgZGlzY29ubmVjdGVkICovCisgIF9kYnVzX2Fzc2VydCAoZC0+c2VydmljZXNfb3duZWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+bl9zZXJ2aWNlc19vd25lZCA9PSAwKTsKKyAgLyogc2ltaWxhcmx5ICovCisgIF9kYnVzX2Fzc2VydCAoZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMgPT0gTlVMTCk7CisKKyAgaWYgKGQtPm9vbV9wcmVhbGxvY2F0ZWQpCisgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGQtPmNvbm5lY3Rpb24sIGQtPm9vbV9wcmVhbGxvY2F0ZWQpOworCisgIGlmIChkLT5vb21fbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGQtPm9vbV9tZXNzYWdlKTsKKworICBpZiAoZC0+cG9saWN5KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChkLT5wb2xpY3kpOworCisgIGlmIChkLT5zZWxpbnV4X2lkKQorICAgIGJ1c19zZWxpbnV4X2lkX3VucmVmIChkLT5zZWxpbnV4X2lkKTsKKyAgCisgIGRidXNfZnJlZSAoZC0+Y2FjaGVkX2xvZ2luZm9fc3RyaW5nKTsKKyAgCisgIGRidXNfZnJlZSAoZC0+bmFtZSk7CisgIAorICBkYnVzX2ZyZWUgKGQpOworfQorCitzdGF0aWMgdm9pZAorY2FsbF90aW1lb3V0X2NhbGxiYWNrIChEQnVzVGltZW91dCAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKQoreworICAvKiBjYW4gcmV0dXJuIEZBTFNFIG9uIE9PTSBidXQgd2UganVzdCBsZXQgaXQgZmlyZSBhZ2FpbiBsYXRlciAqLworICBkYnVzX3RpbWVvdXRfaGFuZGxlICh0aW1lb3V0KTsKK30KKworQnVzQ29ubmVjdGlvbnMqCitidXNfY29ubmVjdGlvbnNfbmV3IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90ICgmY29ubmVjdGlvbl9kYXRhX3Nsb3QpKQorICAgIGdvdG8gZmFpbGVkXzA7CisKKyAgY29ubmVjdGlvbnMgPSBkYnVzX25ldzAgKEJ1c0Nvbm5lY3Rpb25zLCAxKTsKKyAgaWYgKGNvbm5lY3Rpb25zID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMTsKKworICBjb25uZWN0aW9ucy0+Y29tcGxldGVkX2J5X3VzZXIgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgaWYgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzI7CisKKyAgY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKDEwMCwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlX2luY29tcGxldGVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLCBOVUxMKTsKKyAgaWYgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzM7CisKKyAgX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAoY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0LCBGQUxTRSk7CisKKyAgY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyA9IGJ1c19leHBpcmVfbGlzdF9uZXcgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0IChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyk7CisgIGlmIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfNDsKKyAgCisgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3RpbWVvdXRfY2FsbGJhY2ssIE5VTEwsIE5VTEwpKQorICAgIGdvdG8gZmFpbGVkXzU7CisgIAorICBjb25uZWN0aW9ucy0+cmVmY291bnQgPSAxOworICBjb25uZWN0aW9ucy0+Y29udGV4dCA9IGNvbnRleHQ7CisgIAorICByZXR1cm4gY29ubmVjdGlvbnM7CisKKyBmYWlsZWRfNToKKyAgYnVzX2V4cGlyZV9saXN0X2ZyZWUgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworIGZhaWxlZF80OgorICBfZGJ1c190aW1lb3V0X3VucmVmIChjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQpOworIGZhaWxlZF8zOgorICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChjb25uZWN0aW9ucy0+Y29tcGxldGVkX2J5X3VzZXIpOworIGZhaWxlZF8yOgorICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb25zKTsKKyBmYWlsZWRfMToKKyAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmY29ubmVjdGlvbl9kYXRhX3Nsb3QpOworIGZhaWxlZF8wOgorICByZXR1cm4gTlVMTDsKK30KKworQnVzQ29ubmVjdGlvbnMgKgorYnVzX2Nvbm5lY3Rpb25zX3JlZiAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb25zLT5yZWZjb3VudCA+IDApOworICBjb25uZWN0aW9ucy0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gY29ubmVjdGlvbnM7Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uc191bnJlZiAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb25zLT5yZWZjb3VudCA+IDApOworICBjb25uZWN0aW9ucy0+cmVmY291bnQgLT0gMTsKKyAgaWYgKGNvbm5lY3Rpb25zLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGRyb3AgYWxsIGluY29tcGxldGUgKi8KKyAgICAgIHdoaWxlIChjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgICAgICAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbnMtPmluY29tcGxldGUtPmRhdGE7CisKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCAoY29ubmVjdGlvbik7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgPT0gMCk7CisgICAgICAKKyAgICAgIC8qIGRyb3AgYWxsIHJlYWwgY29ubmVjdGlvbnMgKi8KKyAgICAgIHdoaWxlIChjb25uZWN0aW9ucy0+Y29tcGxldGVkICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9ucy0+Y29tcGxldGVkLT5kYXRhOworCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgPT0gMCk7CisKKyAgICAgIGJ1c19leHBpcmVfbGlzdF9mcmVlIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzKTsKKyAgICAgIAorICAgICAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbm5lY3Rpb25zLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdGltZW91dF9jYWxsYmFjaywgTlVMTCk7CisgICAgICAKKyAgICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCk7CisgICAgICAKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlcik7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoY29ubmVjdGlvbnMpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX2RhdGFfc2xvdCk7CisgICAgfQorfQorCisvKiBVc2VkIGZvciBsb2dnaW5nICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NhY2hlX3BlZXJfbG9naW5mb19zdHJpbmcgKEJ1c0Nvbm5lY3Rpb25EYXRhICpkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uKQoreworICBEQnVzU3RyaW5nIGxvZ2luZm9fYnVmOworICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgdW5zaWduZWQgbG9uZyBwaWQ7CisgIGNoYXIgKndpbmRvd3Nfc2lkOworICBkYnVzX2Jvb2xfdCBwcmV2X2FkZGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsb2dpbmZvX2J1ZikpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcHJldl9hZGRlZCA9IEZBTFNFOworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm5lY3Rpb24sICZ1aWQpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZsb2dpbmZvX2J1ZiwgInVpZD0lbGQiLCB1aWQpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJldl9hZGRlZCA9IFRSVUU7CisgICAgfQorCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubmVjdGlvbiwgJnBpZCkpCisgICAgeworICAgICAgaWYgKHByZXZfYWRkZWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmxvZ2luZm9fYnVmLCAnICcpKQorICAgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZsb2dpbmZvX2J1ZiwgInBpZD0lbGQgY29tbT1cIiIsIHBpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgLyogSWdub3JlIGVycm9ycyBoZXJlOyB3ZSBtYXkgbm90IGhhdmUgcGVybWlzc2lvbnMgdG8gcmVhZCB0aGUKKyAgICAgICAqIHByb2MgZmlsZS4gKi8KKyAgICAgIF9kYnVzX2NvbW1hbmRfZm9yX3BpZCAocGlkLCAmbG9naW5mb19idWYsIE1BWF9MT0dfQ09NTUFORF9MRU4sIE5VTEwpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZsb2dpbmZvX2J1ZiwgJyInKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAoY29ubmVjdGlvbiwgJndpbmRvd3Nfc2lkKSkKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBkaWRfYXBwZW5kOworICAgICAgZGlkX2FwcGVuZCA9IF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmbG9naW5mb19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWQ9XCIlc1wiICIsIHdpbmRvd3Nfc2lkKTsKKyAgICAgIGRidXNfZnJlZSAod2luZG93c19zaWQpOworICAgICAgaWYgKCFkaWRfYXBwZW5kKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmxvZ2luZm9fYnVmLCAmKGQtPmNhY2hlZF9sb2dpbmZvX3N0cmluZykpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmbG9naW5mb19idWYpOyAKKworICByZXR1cm4gVFJVRTsKK29vbToKKyAgIF9kYnVzX3N0cmluZ19mcmVlICgmbG9naW5mb19idWYpOworICAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24gKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgCisgIGQgPSBkYnVzX25ldzAgKEJ1c0Nvbm5lY3Rpb25EYXRhLCAxKTsKKyAgCisgIGlmIChkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQtPmNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnM7CisgIGQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAKKyAgX2RidXNfZ2V0X2N1cnJlbnRfdGltZSAoJmQtPmNvbm5lY3Rpb25fdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZC0+Y29ubmVjdGlvbl90dl91c2VjKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbl9kYXRhX3Nsb3QgPj0gMCk7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCwgZnJlZV9jb25uZWN0aW9uX2RhdGEpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcyAoY29ubmVjdGlvbiwgVFJVRSk7CisgIAorICByZXR2YWwgPSBGQUxTRTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGQtPnNlbGludXhfaWQgPSBidXNfc2VsaW51eF9pbml0X2Nvbm5lY3Rpb25faWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgYml0IGJvZ3VzIGJlY2F1c2Ugd2UgcHJldGVuZCBhbGwgZXJyb3JzCisgICAgICAgKiBhcmUgT09NOyB0aGlzIGlzIGRvbmUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgaW4gYnVzLmMKKyAgICAgICAqIGFuIE9PTSBlcnJvciBkaXNjb25uZWN0cyB0aGUgY29ubmVjdGlvbiwgd2hpY2ggaXMKKyAgICAgICAqIHRoZSBzYW1lIHRoaW5nIHdlIHdhbnQgb24gYW55IG90aGVyIGVycm9yLgorICAgICAgICovCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Nvbm5lY3Rpb25fd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jb25uZWN0aW9uX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY29ubmVjdGlvbl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jb25uZWN0aW9uX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBGb3Igbm93IHdlIGRvbid0IG5lZWQgdG8gc2V0IGEgV2luZG93cyB1c2VyIGZ1bmN0aW9uIGJlY2F1c2UKKyAgICogdGhlcmUgYXJlIG5vIHBvbGljaWVzIGluIHRoZSBjb25maWcgZmlsZSBjb250cm9sbGluZyB3aGF0CisgICAqIFdpbmRvd3MgdXNlcnMgY2FuIGNvbm5lY3QuIFRoZSBkZWZhdWx0ICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZQorICAgKiBidXMgY2FuIGNvbm5lY3QnIGJlaGF2aW9yIG9mIERCdXNDb25uZWN0aW9uIGlzIGZpbmUgb24gV2luZG93cy4KKyAgICovCisgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5peF91c2VyX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAoY29ubmVjdGlvbnMtPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGNvbm5lY3Rpb24pOworICBpZiAoZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKyAgCisgIC8qIFNldHVwIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIGRpc3BhdGNoZXIgKi8KKyAgaWYgKCFidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24gKGNvbm5lY3Rpb24pKQorICAgIGdvdG8gb3V0OworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChjb25uZWN0aW9ucy0+Y29udGV4dCksIGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Rpc3BhdGNoX3JlbW92ZV9jb25uZWN0aW9uIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmY29ubmVjdGlvbnMtPmluY29tcGxldGUsIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSArPSAxOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyogTm90ZSB0aGF0IHdlIG1pZ2h0IGRpc2Nvbm5lY3Qgb3Vyc2VsdmVzIGhlcmUsIGJ1dCBpdCBvbmx5IHRha2VzCisgICAqIGVmZmVjdCBvbiByZXR1cm4gdG8gdGhlIG1haW4gbG9vcC4gV2UgY2FsbCB0aGlzIHRvIGZyZWUgdXAKKyAgICogZXhwaXJlZCBjb25uZWN0aW9ucyBpZiBwb3NzaWJsZSwgYW5kIHRvIHF1ZXVlIHRoZSB0aW1lb3V0IGZvciBvdXIKKyAgICogb3duIGV4cGlyYXRpb24uCisgICAqLworICBidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUgKGNvbm5lY3Rpb25zKTsKKyAgCisgIC8qIEFuZCB3ZSBtaWdodCBhbHNvIGRpc2Nvbm5lY3Qgb3Vyc2VsdmVzIGhlcmUsIGJ1dCBhZ2FpbiBpdAorICAgKiBvbmx5IHRha2VzIGVmZmVjdCBvbiByZXR1cm4gdG8gbWFpbiBsb29wLgorICAgKi8KKyAgaWYgKGNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgPgorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIChjb25uZWN0aW9ucy0+Y29udGV4dCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk51bWJlciBvZiBpbmNvbXBsZXRlIGNvbm5lY3Rpb25zIGV4Y2VlZHMgbWF4LCBkcm9wcGluZyBvbGRlc3Qgb25lXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSAhPSBOVUxMKTsKKyAgICAgIC8qIERpc2Nvbm5lY3QgdGhlIG9sZGVzdCB1bmF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbi4gIEZJWE1FCisgICAgICAgKiB3b3VsZCBpdCBiZSBtb3JlIHNlY3VyZSB0byBkcm9wIGEgKnJhbmRvbSogY29ubmVjdGlvbj8gIFRoaXMKKyAgICAgICAqIGFsZ29yaXRobSBzZWVtcyB0byBtZWFuIHRoYXQgaWYgc29tZW9uZSBjYW4gY3JlYXRlIG5ldworICAgICAgICogY29ubmVjdGlvbnMgcXVpY2tseSBlbm91Z2gsIHRoZXkgY2FuIGtlZXAgYW55b25lIGVsc2UgZnJvbQorICAgICAgICogY29tcGxldGluZyBhdXRoZW50aWNhdGlvbi4gQnV0IHJhbmRvbSBtYXkgb3IgbWF5IG5vdCByZWFsbHkKKyAgICAgICAqIGhlbHAgd2l0aCB0aGF0LCBhIG1vcmUgZWxhYm9yYXRlIHNvbHV0aW9uIG1pZ2h0IGJlIHJlcXVpcmVkLgorICAgICAgICovCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLT5kYXRhKTsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAoIXJldHZhbCkKKyAgICB7CisgICAgICBpZiAoZC0+c2VsaW51eF9pZCkKKyAgICAgICAgYnVzX3NlbGludXhfaWRfdW5yZWYgKGQtPnNlbGludXhfaWQpOworICAgICAgZC0+c2VsaW51eF9pZCA9IE5VTEw7CisgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAgICAgCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIAorICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmIChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdC0+bmV4dCA9PSBOVUxMKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0LT5wcmV2ID09IE5VTEwpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc2V0IGNvbm5lY3Rpb24gZGF0YSB0byBudWxsIik7CisKKyAgICAgIC8qICJkIiBoYXMgbm93IGJlZW4gZnJlZWQgKi8KKyAgICB9CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sgICAgCisgIGludCBuZXh0X2ludGVydmFsOworCisgIG5leHRfaW50ZXJ2YWwgPSAtMTsKKyAgCisgIGlmIChjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxvbmcgdHZfc2VjLCB0dl91c2VjOworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBpbnQgYXV0aF90aW1lb3V0OworICAgICAgCisgICAgICBfZGJ1c19nZXRfY3VycmVudF90aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisgICAgICBhdXRoX3RpbWVvdXQgPSBidXNfY29udGV4dF9nZXRfYXV0aF90aW1lb3V0IChjb25uZWN0aW9ucy0+Y29udGV4dCk7CisgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwgbGluayk7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgICAgICAgICAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgICAgICAgZG91YmxlIGVsYXBzZWQ7CisgICAgICAKKyAgICAgICAgICBjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIAorICAgICAgICAgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgICAgIGVsYXBzZWQgPSBFTEFQU0VEX01JTExJU0VDT05EU19TSU5DRSAoZC0+Y29ubmVjdGlvbl90dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5jb25uZWN0aW9uX3R2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl9zZWMsIHR2X3VzZWMpOworCisgICAgICAgICAgaWYgKGVsYXBzZWQgPj0gKGRvdWJsZSkgYXV0aF90aW1lb3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiVGltaW5nIG91dCBhdXRoZW50aWNhdGlvbiBmb3IgY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBXZSBjYW4gZW5kIHRoZSBsb29wLCBzaW5jZSB0aGUgY29ubmVjdGlvbnMgYXJlIGluIG9sZGVzdC1maXJzdCBvcmRlciAqLworICAgICAgICAgICAgICBuZXh0X2ludGVydmFsID0gKChkb3VibGUpYXV0aF90aW1lb3V0KSAtIGVsYXBzZWQ7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb25uZWN0aW9uICVwIGF1dGhlbnRpY2F0aW9uIGV4cGlyZXMgaW4gJWQgbWlsbGlzZWNvbmRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBuZXh0X2ludGVydmFsKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICBidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2V4cGlyZV9pbmNvbXBsZXRlX3RpbWVvdXQgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmdcbiIpOworICAKKyAgLyogbm90ZSB0aGF0IHRoaXMgbWF5IHJlbW92ZSB0aGUgdGltZW91dCAqLworICBidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUgKGNvbm5lY3Rpb25zKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2dldF91bml4X2dyb3VwcyAgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgKipncm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuX2dyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgICpncm91cHMgPSBOVUxMOworICAqbl9ncm91cHMgPSAwOworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c191bml4X2dyb3Vwc19mcm9tX3VpZCAodWlkLCBncm91cHMsIG5fZ3JvdXBzKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaWQgbm90IGdldCBhbnkgZ3JvdXBzIGZvciBVSUQgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiR290ICVkIGdyb3VwcyBmb3IgVUlEICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqbl9ncm91cHMsIHVpZCk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsgLyogc3VjY2Vzc2Z1bGx5IGdvdCAwIGdyb3VwcyAqLworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25faXNfaW5fdW5peF9ncm91cCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgZ2lkKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgbG9uZyAqZ3JvdXBfaWRzOworICBpbnQgbl9ncm91cF9pZHM7CisKKyAgaWYgKCFidXNfY29ubmVjdGlvbl9nZXRfdW5peF9ncm91cHMgKGNvbm5lY3Rpb24sICZncm91cF9pZHMsICZuX2dyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2dyb3VwX2lkcykKKyAgICB7CisgICAgICBpZiAoZ3JvdXBfaWRzW2ldID09IGdpZCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoZ3JvdXBfaWRzKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgKytpOworICAgIH0KKworICBkYnVzX2ZyZWUgKGdyb3VwX2lkcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworY29uc3QgY2hhciAqCitidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSkKKyAgICByZXR1cm4gImluYWN0aXZlIjsKKyAgcmV0dXJuIGQtPmNhY2hlZF9sb2dpbmZvX3N0cmluZzsgIAorfQorCitCdXNDbGllbnRQb2xpY3kqCitidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+cG9saWN5ICE9IE5VTEwpOworICAKKyAgcmV0dXJuIGQtPnBvbGljeTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citmb3JlYWNoX2FjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb25zLT5jb21wbGV0ZWQpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29ubmVjdGlvbnMtPmNvbXBsZXRlZCwgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZm9yZWFjaF9pbmFjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2FsbHMgZnVuY3Rpb24gb24gZWFjaCBhY3RpdmUgY29ubmVjdGlvbjsgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqICNGQUxTRSwgc3RvcHMgaXRlcmF0aW5nLiBBY3RpdmUgY29ubmVjdGlvbnMgYXJlIGF1dGhlbnRpY2F0ZWQKKyAqIGFuZCBoYXZlIHNlbnQgYSBIZWxsbyBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9ucyB0aGUgY29ubmVjdGlvbnMgb2JqZWN0CisgKiBAcGFyYW0gZnVuY3Rpb24gdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gaXQgYXMgYSBzZWNvbmQgYXJnCisgKi8KK3ZvaWQKK2J1c19jb25uZWN0aW9uc19mb3JlYWNoX2FjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBmb3JlYWNoX2FjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKTsKK30KKworLyoqCisgKiBDYWxscyBmdW5jdGlvbiBvbiBlYWNoIGNvbm5lY3Rpb247IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgKiAjRkFMU0UsIHN0b3BzIGl0ZXJhdGluZy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbnMgdGhlIGNvbm5lY3Rpb25zIG9iamVjdAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBmdW5jdGlvbgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGl0IGFzIGEgc2Vjb25kIGFyZworICovCit2b2lkCitidXNfY29ubmVjdGlvbnNfZm9yZWFjaCAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgaWYgKCFmb3JlYWNoX2FjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKSkKKyAgICByZXR1cm47CisKKyAgZm9yZWFjaF9pbmFjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKTsKK30KKworQnVzQ29udGV4dCoKK2J1c19jb25uZWN0aW9uc19nZXRfY29udGV4dCAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPmNvbnRleHQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgY292ZXJpbmcgdGhlIHNhbWUgY29ubmVjdGlvbiB0d2ljZSB3aGVuCisgKiB0cmF2ZXJzaW5nIGNvbm5lY3Rpb25zLiBOb3RlIHRoYXQgaXQgYXNzdW1lcyB3ZSB3aWxsCisgKiBidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wKCkgZWFjaCBjb25uZWN0aW9uIGF0IGxlYXN0IG9uY2UgcGVyCisgKiBJTlRfTUFYIGluY3JlbWVudHMgb2YgdGhlIGdsb2JhbCBzdGFtcCwgb3Igd3JhcGFyb3VuZCB3b3VsZCBicmVhaworICogdGhpbmdzLgorICovCit2b2lkCitidXNfY29ubmVjdGlvbnNfaW5jcmVtZW50X3N0YW1wIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIGNvbm5lY3Rpb25zLT5zdGFtcCArPSAxOworfQorCisvKiBNYXJrIGNvbm5lY3Rpb24gd2l0aCBjdXJyZW50IHN0YW1wLCByZXR1cm4gVFJVRSBpZiBpdAorICogZGlkbid0IGFscmVhZHkgaGF2ZSB0aGF0IHN0YW1wCisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgaWYgKGQtPnN0YW1wID09IGQtPmNvbm5lY3Rpb25zLT5zdGFtcCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICB7CisgICAgICBkLT5zdGFtcCA9IGQtPmNvbm5lY3Rpb25zLT5zdGFtcDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworQnVzQ29udGV4dCoKK2J1c19jb25uZWN0aW9uX2dldF9jb250ZXh0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICByZXR1cm4gZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQ7Cit9CisKK0J1c0Nvbm5lY3Rpb25zKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPmNvbm5lY3Rpb25zOworfQorCitCdXNSZWdpc3RyeSoKK2J1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGJ1c19jb250ZXh0X2dldF9yZWdpc3RyeSAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNBY3RpdmF0aW9uKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNNYXRjaG1ha2VyKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X21hdGNobWFrZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNTRUxpbnV4SUQqCitidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPnNlbGludXhfaWQ7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBtZXNzYWdlIGJ1cy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UncmUgYW4gYWN0aXZlIG1lc3NhZ2UgYnVzIHBhcnRpY2lwYW50CisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gZCAhPSBOVUxMICYmIGQtPm5hbWUgIT0gTlVMTDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7ICAKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgaWYgKGQtPm9vbV9wcmVhbGxvY2F0ZWQgIT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kIChjb25uZWN0aW9uKTsKKyAgaWYgKHByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGNvbm5lY3Rpb24sIHByZWFsbG9jYXRlZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGQtPm5hbWUgbWF5IGJlIE5VTEwsIGJ1dCB0aGF0IGlzIE9LICovCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9lcnJvcl9uYW1lIChtZXNzYWdlLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCBkLT5uYW1lKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGNvbm5lY3Rpb24sIHByZWFsbG9jYXRlZCk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIC8qIHNldCByZXBseSBzZXJpYWwgdG8gcGxhY2Vob2xkZXIgdmFsdWUganVzdCBzbyBzcGFjZSBpcyBhbHJlYWR5IGFsbG9jYXRlZAorICAgKiBmb3IgaXQuCisgICAqLworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLCAxNCkpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGNvbm5lY3Rpb24sIHByZWFsbG9jYXRlZCk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkLT5vb21fbWVzc2FnZSA9IG1lc3NhZ2U7CisgIGQtPm9vbV9wcmVhbGxvY2F0ZWQgPSBwcmVhbGxvY2F0ZWQ7CisgIAorICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICppbl9yZXBseV90bykKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOyAgCisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOyAgCisgIF9kYnVzX2Fzc2VydCAoZC0+b29tX21lc3NhZ2UgIT0gTlVMTCk7CisKKyAgLyogc2hvdWxkIGFsd2F5cyBzdWNjZWVkIHNpbmNlIHdlIHNldCBpdCB0byBhIHBsYWNlaG9sZGVyIGVhcmxpZXIgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAoZC0+b29tX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChpbl9yZXBseV90bykpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkZhaWxlZCB0byBzZXQgcmVwbHkgc2VyaWFsIGZvciBwcmVhbGxvY2F0ZWQgb29tIG1lc3NhZ2UiKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChkLT5vb21fbWVzc2FnZSkgIT0gTlVMTCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWQgKGNvbm5lY3Rpb24sIGQtPm9vbV9wcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+b29tX21lc3NhZ2UsIE5VTEwpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoZC0+b29tX21lc3NhZ2UpOworICBkLT5vb21fbWVzc2FnZSA9IE5VTEw7CisgIGQtPm9vbV9wcmVhbGxvY2F0ZWQgPSBOVUxMOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICpsaW5rKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmZC0+bWF0Y2hfcnVsZXMsIGxpbmspOworCisgIGQtPm5fbWF0Y2hfcnVsZXMgKz0gMTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAqcnVsZSkKK3sKKyAgICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChydWxlKTsKKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZV9saW5rIChjb25uZWN0aW9uLCBsaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX21hdGNoX3J1bGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICpydWxlKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmZC0+bWF0Y2hfcnVsZXMsIHJ1bGUpOworCisgIGQtPm5fbWF0Y2hfcnVsZXMgLT0gMTsKKyAgX2RidXNfYXNzZXJ0IChkLT5uX21hdGNoX3J1bGVzID49IDApOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICByZXR1cm4gZC0+bl9tYXRjaF9ydWxlczsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbGluaykKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmQtPnNlcnZpY2VzX293bmVkLCBsaW5rKTsKKworICBkLT5uX3NlcnZpY2VzX293bmVkICs9IDE7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZSAgICAgKnNlcnZpY2UpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKHNlcnZpY2UpOworCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19jb25uZWN0aW9uX2FkZF9vd25lZF9zZXJ2aWNlX2xpbmsgKGNvbm5lY3Rpb24sIGxpbmspOworCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbl9yZW1vdmVfb3duZWRfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZSAgICAgKnNlcnZpY2UpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZkLT5zZXJ2aWNlc19vd25lZCwgc2VydmljZSk7CisKKyAgZC0+bl9zZXJ2aWNlc19vd25lZCAtPSAxOworICBfZGJ1c19hc3NlcnQgKGQtPm5fc2VydmljZXNfb3duZWQgPj0gMCk7Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBkLT5uX3NlcnZpY2VzX293bmVkOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fY29tcGxldGUgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisJCQkgY29uc3QgREJ1c1N0cmluZyAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIHVuc2lnbmVkIGxvbmcgdWlkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+bmFtZSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChkLT5wb2xpY3kgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKG5hbWUsICZkLT5uYW1lKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGQtPm5hbWUgIT0gTlVMTCk7CisgIAorICBfZGJ1c192ZXJib3NlICgiTmFtZSAlcyBhc3NpZ25lZCB0byAlcFxuIiwgZC0+bmFtZSwgY29ubmVjdGlvbik7CisKKyAgZC0+cG9saWN5ID0gYnVzX2NvbnRleHRfY3JlYXRlX2NsaWVudF9wb2xpY3kgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICAvKiB3ZSBtYXkgaGF2ZSBhIE5VTEwgcG9saWN5IG9uIE9PTSBvciBlcnJvciBnZXR0aW5nIGxpc3Qgb2YKKyAgICogZ3JvdXBzIGZvciBhIHVzZXIuIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBkb24ndCBoYW5kbGUgaXQgc28KKyAgICogd2VsbCBjdXJyZW50bHksIGFzIGl0IHdpbGwganVzdCBrZWVwIGZhaWxpbmcgb3ZlciBhbmQgb3Zlci4KKyAgICovCisKKyAgaWYgKGQtPnBvbGljeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIHNlY3VyaXR5IHBvbGljeSBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlIChkLT5uYW1lKTsKKyAgICAgIGQtPm5hbWUgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKCFhZGp1c3RfY29ubmVjdGlvbnNfZm9yX3VpZCAoZC0+Y29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIDEpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIC8qIENyZWF0ZSBhbmQgY2FjaGUgYSBzdHJpbmcgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIAorICAgKiBwZWVyIHByb2Nlc3M7IHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgICAqLworICBpZiAoIWNhY2hlX3BlZXJfbG9naW5mb19zdHJpbmcgKGQsIGNvbm5lY3Rpb24pKQorICAgIGdvdG8gZmFpbDsKKworICAvKiBOb3cgdGhlIGNvbm5lY3Rpb24gaXMgYWN0aXZlLCBtb3ZlIGl0IGJldHdlZW4gbGlzdHMgKi8KKyAgX2RidXNfbGlzdF91bmxpbmsgKCZkLT5jb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgZC0+Y29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSAtPSAxOworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmZC0+Y29ubmVjdGlvbnMtPmNvbXBsZXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QpOworICBkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgKz0gMTsKKworICBfZGJ1c19hc3NlcnQgKGQtPmNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+Y29ubmVjdGlvbnMtPm5fY29tcGxldGVkID4gMCk7CisKKyAgLyogU2VlIGlmIHdlIGNhbiByZW1vdmUgdGhlIHRpbWVvdXQgKi8KKyAgYnVzX2Nvbm5lY3Rpb25zX2V4cGlyZV9pbmNvbXBsZXRlIChkLT5jb25uZWN0aW9ucyk7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKyAgCisgIHJldHVybiBUUlVFOworZmFpbDoKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgZGJ1c19mcmVlIChkLT5uYW1lKTsKKyAgZC0+bmFtZSA9IE5VTEw7CisgIGlmIChkLT5wb2xpY3kpCisgICAgYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgKGQtPnBvbGljeSk7CisgIGQtPnBvbGljeSA9IE5VTEw7CisgIHJldHVybiBGQUxTRTsKK30KKworY29uc3QgY2hhciAqCitidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICByZXR1cm4gZC0+bmFtZTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGNvbXBsZXRpbmcgdGhlIHBhc3NlZC1pbiBjb25uZWN0aW9uIHdvdWxkCisgKiBleGNlZWQgbGltaXRzLCBhbmQgaWYgc28gc2V0IGVycm9yIGFuZCByZXR1cm4gI0ZBTFNFCisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbnNfY2hlY2tfbGltaXRzIChCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpyZXF1ZXN0aW5nX2NvbXBsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAocmVxdWVzdGluZ19jb21wbGV0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoZC0+bmFtZSA9PSBOVUxMKTsKKworICBpZiAoY29ubmVjdGlvbnMtPm5fY29tcGxldGVkID49CisgICAgICBidXNfY29udGV4dF9nZXRfbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyAoY29ubmVjdGlvbnMtPmNvbnRleHQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY29ubmVjdGlvbnMgaGFzIGJlZW4gcmVhY2hlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAocmVxdWVzdGluZ19jb21wbGV0aW9uLCAmdWlkKSkKKyAgICB7CisgICAgICBpZiAoZ2V0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKGNvbm5lY3Rpb25zLCB1aWQpID49CisgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9jb25uZWN0aW9uc19wZXJfdXNlciAoY29ubmVjdGlvbnMtPmNvbnRleHQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY29ubmVjdGlvbnMgZm9yIFVJRCAlbHUgaGFzIGJlZW4gcmVhY2hlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfcGVuZGluZ19yZXBseV9mcmVlIChCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJGcmVlaW5nIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworCisgIGRidXNfZnJlZSAocGVuZGluZyk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX3BlbmRpbmdfcmVwbHlfc2VuZF9ub19yZXBseSAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICplcnJtc2c7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fUkVQTFkpKQorICAgIGdvdG8gb3V0OworCisgIGVycm1zZyA9ICJNZXNzYWdlIGRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5ICh0aW1lb3V0IGJ5IG1lc3NhZ2UgYnVzKSI7CisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwgREJVU19UWVBFX1NUUklORywgJmVycm1zZykpCisgICAgZ290byBvdXQ7CisgICAgCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfcGVuZGluZ19yZXBseV9leHBpcmVkIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdSZXBseSAqcGVuZGluZyA9IGxpbmstPmRhdGE7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyA9IGRhdGE7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgCisgIC8qIE5vIHJlcGx5IGlzIGZvcnRoY29taW5nLiBTbyBudWtlIGl0IGlmIHdlIGNhbi4gSWYgbm90LAorICAgKiBsZWF2ZSBpdCBpbiB0aGUgbGlzdCB0byB0cnkgZXhwaXJpbmcgYWdhaW4gbGF0ZXIgd2hlbiB3ZQorICAgKiBnZXQgbW9yZSBtZW1vcnkuCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCJFeHBpcmluZyBwZW5kaW5nIHJlcGx5ICVwLCByZXBsaWVyICVwIHJlY2VpdmVyICVwIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgCisgIHRyYW5zYWN0aW9uID0gYnVzX3RyYW5zYWN0aW9uX25ldyAoY29ubmVjdGlvbnMtPmNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIWJ1c19wZW5kaW5nX3JlcGx5X3NlbmRfbm9fcmVwbHkgKGNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcpKQorICAgIHsKKyAgICAgIGJ1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgKHRyYW5zYWN0aW9uKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnVzX2V4cGlyZV9saXN0X3JlbW92ZV9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLCBsaW5rKTsKKworICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKHRyYW5zYWN0aW9uKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2J1c19jb25uZWN0aW9uX2Ryb3BfcGVuZGluZ19yZXBsaWVzIChCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbikKK3sKKyAgLyogVGhlIERCdXNDb25uZWN0aW9uIGlzIGFsbW9zdCAxMDAlIGZpbmFsaXplZCBoZXJlLCBzbyB5b3UgY2FuJ3QKKyAgICogZG8gYW55dGhpbmcgd2l0aCBpdCBleGNlcHQgY2hlY2sgZm9yIHBvaW50ZXIgZXF1YWxpdHkKKyAgICovCisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX3ZlcmJvc2UgKCJEcm9wcGluZyBwZW5kaW5nIHJlcGxpZXMgdGhhdCBpbnZvbHZlIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICAKKyAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQ7CisgICAgICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmc7CisKKyAgICAgIG5leHQgPSBidXNfZXhwaXJlX2xpc3RfZ2V0X25leHRfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICBwZW5kaW5nID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5ID09IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHRyYWNrIHRoaXMgcGVuZGluZyByZXBseSBhbnltb3JlICovCisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRHJvcHBpbmcgcGVuZGluZyByZXBseSAlcCwgcmVwbGllciAlcCByZWNlaXZlciAlcCBzZXJpYWwgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgICAgICAgICAKKyAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlX2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5ID09IGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgcmVwbHkgaXNuJ3QgZ29pbmcgdG8gYmUgc2VudCwgc28gc2V0IHRoaW5ncworICAgICAgICAgICAqIHVwIHNvIGl0IHdpbGwgYmUgZXhwaXJlZCByaWdodCBhd2F5CisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZXhwaXJlIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCk7CisgICAgICAgICAgCisgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5ID0gTlVMTDsKKyAgICAgICAgICBwZW5kaW5nLT5leHBpcmVfaXRlbS5hZGRlZF90dl9zZWMgPSAwOworICAgICAgICAgIHBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3VzZWMgPSAwOworCisgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X3JlY2hlY2tfaW1tZWRpYXRlbHkgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmc7CisgIEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnM7Cit9IENhbmNlbFBlbmRpbmdSZXBseURhdGE7CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfcGVuZGluZ19yZXBseSAodm9pZCAqZGF0YSkKK3sKKyAgQ2FuY2VsUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIiwgZCk7CisgIAorICBpZiAoIWJ1c19leHBpcmVfbGlzdF9yZW1vdmUgKGQtPmNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQtPnBlbmRpbmctPmV4cGlyZV9pdGVtKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJwZW5kaW5nIHJlcGx5IGRpZCBub3QgZXhpc3QgdG8gYmUgY2FuY2VsbGVkIik7CisKKyAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAoZC0+cGVuZGluZyk7IC8qIHNpbmNlIGl0J3MgYmVlbiBjYW5jZWxsZWQgKi8KK30KKworc3RhdGljIHZvaWQKK2NhbmNlbF9wZW5kaW5nX3JlcGx5X2RhdGFfZnJlZSAodm9pZCAqZGF0YSkKK3sKKyAgQ2FuY2VsUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIiwgZCk7CisgIAorICAvKiBkLT5wZW5kaW5nIHNob3VsZCBiZSBlaXRoZXIgZnJlZWQgb3Igc3RpbGwKKyAgICogaW4gdGhlIGxpc3Qgb2YgcGVuZGluZyByZXBsaWVzIChvd25lZCBieSBzb21lb25lCisgICAqIGVsc2UpCisgICAqLworICAKKyAgZGJ1c19mcmVlIChkKTsKK30KKworLyoKKyAqIFJlY29yZCB0aGF0IGEgcmVwbHkgaXMgYWxsb3dlZDsgcmV0dXJuIFRSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkgKEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICp3aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqd2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICpyZXBseV90b190aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nOworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIENhbmNlbFBlbmRpbmdSZXBseURhdGEgKmNwcmQ7CisgIGludCBjb3VudDsKKworICBfZGJ1c19hc3NlcnQgKHdpbGxfZ2V0X3JlcGx5ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHdpbGxfc2VuZF9yZXBseSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZXBseV90b190aGlzICE9IE5VTEwpOworICAKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKHJlcGx5X3RvX3RoaXMpKQorICAgIHJldHVybiBUUlVFOyAvKiB3ZSB3b24ndCBhbGxvdyBhIHJlcGx5LCBzaW5jZSBjbGllbnQgZG9lc24ndCBjYXJlIGZvciBvbmUuICovCisgIAorICByZXBseV9zZXJpYWwgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAocmVwbHlfdG9fdGhpcyk7CisKKyAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgIGNvdW50ID0gMDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBwZW5kaW5nID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9PSByZXBseV9zZXJpYWwgJiYKKyAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9PSB3aWxsX2dldF9yZXBseSAmJgorICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSA9PSB3aWxsX3NlbmRfcmVwbHkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgaGFzIHRoZSBzYW1lIHJlcGx5IHNlcmlhbCBhcyBhIGN1cnJlbnRseS1vdXRzdGFuZGluZyBleGlzdGluZyBtZXRob2QgY2FsbCIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgaWYgKHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5ID09IHdpbGxfZ2V0X3JlcGx5KQorICAgICAgICArK2NvdW50OworICAgIH0KKyAgCisgIGlmIChjb3VudCA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIChjb25uZWN0aW9ucy0+Y29udGV4dCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCwKKwkJICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIHJlcGxpZXMgcGVyIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVhY2hlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBwZW5kaW5nID0gZGJ1c19uZXcwIChCdXNQZW5kaW5nUmVwbHksIDEpOworICBpZiAocGVuZGluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIC8qIHNvIHdlIGNhbiBzZWUgYSBub3QteWV0LWFkZGVkIHBlbmRpbmcgcmVwbHkgKi8KKyAgcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfc2VjID0gMTsKKyAgcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfdXNlYyA9IDE7CisjZW5kaWYKKworICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9IHdpbGxfZ2V0X3JlcGx5OworICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPSB3aWxsX3NlbmRfcmVwbHk7CisgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9IHJlcGx5X3NlcmlhbDsKKyAgCisgIGNwcmQgPSBkYnVzX25ldzAgKENhbmNlbFBlbmRpbmdSZXBseURhdGEsIDEpOworICBpZiAoY3ByZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIWJ1c19leHBpcmVfbGlzdF9hZGQgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmctPmV4cGlyZV9pdGVtKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZGJ1c19mcmVlIChjcHJkKTsKKyAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2ZyZWUgKHBlbmRpbmcpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF9wZW5kaW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX3BlbmRpbmdfcmVwbHlfZGF0YV9mcmVlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgYnVzX2V4cGlyZV9saXN0X3JlbW92ZSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywgJnBlbmRpbmctPmV4cGlyZV9pdGVtKTsKKyAgICAgIGRidXNfZnJlZSAoY3ByZCk7CisgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGNwcmQtPnBlbmRpbmcgPSBwZW5kaW5nOworICBjcHJkLT5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zOworICAKKyAgX2RidXNfZ2V0X2N1cnJlbnRfdGltZSAoJnBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3VzZWMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJBZGRlZCBwZW5kaW5nIHJlcGx5ICVwLCByZXBsaWVyICVwIHJlY2VpdmVyICVwIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzTGlzdCAgICAgICAgKmxpbms7CisgIEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnM7Cit9IENoZWNrUGVuZGluZ1JlcGx5RGF0YTsKKworc3RhdGljIHZvaWQKK2NhbmNlbF9jaGVja19wZW5kaW5nX3JlcGx5ICh2b2lkICpkYXRhKQoreworICBDaGVja1BlbmRpbmdSZXBseURhdGEgKmQgPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJkID0gJXBcbiIsZCk7CisKKyAgYnVzX2V4cGlyZV9saXN0X2FkZF9saW5rIChkLT5jb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmxpbmspOworICBkLT5saW5rID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BlbmRpbmdfcmVwbHlfZGF0YV9mcmVlICh2b2lkICpkYXRhKQoreworICBDaGVja1BlbmRpbmdSZXBseURhdGEgKmQgPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJkID0gJXBcbiIsZCk7CisgIAorICBpZiAoZC0+bGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdSZXBseSAqcGVuZGluZyA9IGQtPmxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWJ1c19leHBpcmVfbGlzdF9jb250YWluc19pdGVtIChkLT5jb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5leHBpcmVfaXRlbSkpOworICAgICAgCisgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkLT5saW5rKTsKKyAgICB9CisgIAorICBkYnVzX2ZyZWUgKGQpOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciBhIHJlcGx5IGlzIGFsbG93ZWQsIHJlbW92ZSBCdXNQZW5kaW5nUmVwbHkKKyAqIGlmIHNvLCByZXR1cm4gVFJVRSBpZiBzby4KKyAqLworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uc19jaGVja19yZXBseSAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kaW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcmVjZWl2aW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQ2hlY2tQZW5kaW5nUmVwbHlEYXRhICpjcHJkOworICBEQnVzTGlzdCAqbGluazsKKyAgZGJ1c191aW50MzJfdCByZXBseV9zZXJpYWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHNlbmRpbmdfcmVwbHkgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVjZWl2aW5nX3JlcGx5ICE9IE5VTEwpOworCisgIHJlcGx5X3NlcmlhbCA9IGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChyZXBseSk7CisKKyAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9PSByZXBseV9zZXJpYWwgJiYKKyAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9PSByZWNlaXZpbmdfcmVwbHkgJiYKKyAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPT0gc2VuZGluZ19yZXBseSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGb3VuZCBwZW5kaW5nIHJlcGx5IHdpdGggc2VyaWFsICV1XG4iLCByZXBseV9zZXJpYWwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBidXNfZXhwaXJlX2xpc3RfZ2V0X25leHRfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgfQorCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBlbmRpbmcgcmVwbHkgZXhwZWN0ZWRcbiIpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNwcmQgPSBkYnVzX25ldzAgKENoZWNrUGVuZGluZ1JlcGx5RGF0YSwgMSk7CisgIGlmIChjcHJkID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIWJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF9jaGVja19wZW5kaW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfcGVuZGluZ19yZXBseV9kYXRhX2ZyZWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBkYnVzX2ZyZWUgKGNwcmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjcHJkLT5saW5rID0gbGluazsKKyAgY3ByZC0+Y29ubmVjdGlvbnMgPSBjb25uZWN0aW9uczsKKyAgCisgIGJ1c19leHBpcmVfbGlzdF91bmxpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAKKyAgX2RidXNfYXNzZXJ0ICghYnVzX2V4cGlyZV9saXN0X2NvbnRhaW5zX2l0ZW0gKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsIGxpbmstPmRhdGEpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFRyYW5zYWN0aW9ucworICoKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIGZhaXJseSBmcmFnaWxlOyBpbiBwYXJ0aWN1bGFyLCBkb24ndCB0cnkgdG8gdXNlCisgKiBvbmUgdHJhbnNhY3Rpb24gYWNyb3NzIGFueSBtYWluIGxvb3AgaXRlcmF0aW9ucy4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisgIERCdXNNZXNzYWdlICAgICptZXNzYWdlOworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkOworfSBNZXNzYWdlVG9TZW5kOworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNUcmFuc2FjdGlvbkNhbmNlbEZ1bmN0aW9uIGNhbmNlbF9mdW5jdGlvbjsKKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuY3Rpb247CisgIHZvaWQgKmRhdGE7Cit9IENhbmNlbEhvb2s7CisKK3N0cnVjdCBCdXNUcmFuc2FjdGlvbgoreworICBEQnVzTGlzdCAqY29ubmVjdGlvbnM7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNMaXN0ICpjYW5jZWxfaG9va3M7Cit9OworCitzdGF0aWMgdm9pZAorbWVzc2FnZV90b19zZW5kX2ZyZWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgICp0b19zZW5kKQoreworICBpZiAodG9fc2VuZC0+bWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHRvX3NlbmQtPm1lc3NhZ2UpOworCisgIGlmICh0b19zZW5kLT5wcmVhbGxvY2F0ZWQpCisgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGNvbm5lY3Rpb24sIHRvX3NlbmQtPnByZWFsbG9jYXRlZCk7CisKKyAgZGJ1c19mcmVlICh0b19zZW5kKTsKK30KKworc3RhdGljIHZvaWQKK2NhbmNlbF9ob29rX2NhbmNlbCAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgQ2FuY2VsSG9vayAqY2ggPSBlbGVtZW50OworCisgIF9kYnVzX3ZlcmJvc2UgKCJSdW5uaW5nIHRyYW5zYWN0aW9uIGNhbmNlbCBob29rXG4iKTsKKyAgCisgIGlmIChjaC0+Y2FuY2VsX2Z1bmN0aW9uKQorICAgICgqIGNoLT5jYW5jZWxfZnVuY3Rpb24pIChjaC0+ZGF0YSk7ICAKK30KKworc3RhdGljIHZvaWQKK2NhbmNlbF9ob29rX2ZyZWUgKHZvaWQgKmVsZW1lbnQsCisgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBDYW5jZWxIb29rICpjaCA9IGVsZW1lbnQ7CisKKyAgaWYgKGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24pCisgICAgKCogY2gtPmZyZWVfZGF0YV9mdW5jdGlvbikgKGNoLT5kYXRhKTsKKworICBkYnVzX2ZyZWUgKGNoKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfY2FuY2VsX2hvb2tzIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRyYW5zYWN0aW9uLT5jYW5jZWxfaG9va3MsCisgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX2hvb2tfZnJlZSwgTlVMTCk7CisgIAorICBfZGJ1c19saXN0X2NsZWFyICgmdHJhbnNhY3Rpb24tPmNhbmNlbF9ob29rcyk7Cit9CisKK0J1c1RyYW5zYWN0aW9uKgorYnVzX3RyYW5zYWN0aW9uX25ldyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworCisgIHRyYW5zYWN0aW9uID0gZGJ1c19uZXcwIChCdXNUcmFuc2FjdGlvbiwgMSk7CisgIGlmICh0cmFuc2FjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHRyYW5zYWN0aW9uLT5jb250ZXh0ID0gY29udGV4dDsKKyAgCisgIHJldHVybiB0cmFuc2FjdGlvbjsKK30KKworQnVzQ29udGV4dCoKK2J1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAoQnVzVHJhbnNhY3Rpb24gICp0cmFuc2FjdGlvbikKK3sKKyAgcmV0dXJuIHRyYW5zYWN0aW9uLT5jb250ZXh0OworfQorCitCdXNDb25uZWN0aW9ucyoKK2J1c190cmFuc2FjdGlvbl9nZXRfY29ubmVjdGlvbnMgKEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24pCit7CisgIHJldHVybiBidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgKHRyYW5zYWN0aW9uLT5jb250ZXh0KTsKK30KKworZGJ1c19ib29sX3QKK2J1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIC8qIFdlIGhhdmUgdG8gc2V0IHRoZSBzZW5kZXIgdG8gdGhlIGRyaXZlciwgYW5kIGhhdmUKKyAgICogdG8gY2hlY2sgc2VjdXJpdHkgcG9saWN5IHNpbmNlIGl0IHdhcyBub3QgZG9uZSBpbgorICAgKiBkaXNwYXRjaC5jCisgICAqLworICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyAlcyAlcyAlcyBmcm9tIGRyaXZlclxuIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDogIihubyBpbnRlcmZhY2UpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDogIihubyBtZW1iZXIpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgOiAiKG5vIGVycm9yIG5hbWUpIik7CisgICAgICAgICAgICAgICAgIAorICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIC8qIGJ1cyBkcml2ZXIgbmV2ZXIgd2FudHMgYSByZXBseSAqLworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKyAgCisgIC8qIElmIHNlY3VyaXR5IHBvbGljeSBkb2Vzbid0IGFsbG93IHRoZSBtZXNzYWdlLCB3ZSBzaWxlbnRseQorICAgKiBlYXQgaXQ7IHRoZSBkcml2ZXIgZG9lc24ndCBjYXJlIGFib3V0IGdldHRpbmcgYSByZXBseS4KKyAgICovCisgIGlmICghYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5IChidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgY29ubmVjdGlvbiwgY29ubmVjdGlvbiwgbWVzc2FnZSwgTlVMTCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIGJ1c190cmFuc2FjdGlvbl9zZW5kICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgbWVzc2FnZSk7Cit9CisKK2RidXNfYm9vbF90CitidXNfdHJhbnNhY3Rpb25fc2VuZCAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBNZXNzYWdlVG9TZW5kICp0b19zZW5kOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHJ5aW5nIHRvIGFkZCAlcyBpbnRlcmZhY2U9JXMgbWVtYmVyPSVzIGVycm9yPSVzIHRvIHRyYW5zYWN0aW9uJXNcbiIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IgPyAiZXJyb3IiIDoKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDAgPyAicmVwbHkiIDoKKyAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICIiIDogIiAoZGlzY29ubmVjdGVkKSIpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworICAKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgcmV0dXJuIFRSVUU7IC8qIHNpbGVudGx5IGlnbm9yZSBkaXNjb25uZWN0ZWQgY29ubmVjdGlvbnMgKi8KKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgdG9fc2VuZCA9IGRidXNfbmV3IChNZXNzYWdlVG9TZW5kLCAxKTsKKyAgaWYgKHRvX3NlbmQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHRvX3NlbmQtPnByZWFsbG9jYXRlZCA9IGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kIChjb25uZWN0aW9uKTsKKyAgaWYgKHRvX3NlbmQtPnByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodG9fc2VuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgCisgIAorICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKyAgdG9fc2VuZC0+bWVzc2FnZSA9IG1lc3NhZ2U7CisgIHRvX3NlbmQtPnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisKKyAgX2RidXNfdmVyYm9zZSAoImFib3V0IHRvIHByZXBlbmQgbWVzc2FnZVxuIik7CisgIAorICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCB0b19zZW5kKSkKKyAgICB7CisgICAgICBtZXNzYWdlX3RvX3NlbmRfZnJlZSAoY29ubmVjdGlvbiwgdG9fc2VuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJwcmVwZW5kZWQgbWVzc2FnZVxuIik7CisgIAorICAvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYWQgdGhpcyBjb25uZWN0aW9uIGluIHRoZSBsaXN0CisgICAqIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBJZiB3ZSBoYXZlIGEgcGVuZGluZyBtZXNzYWdlLAorICAgKiB0aGVuIHdlIHNob3VsZCBhbHJlYWR5IGJlIGluIHRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucworICAgKi8KKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcyk7CisgIF9kYnVzX2Fzc2VydCAobGluay0+ZGF0YSA9PSB0b19zZW5kKTsKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCBsaW5rKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBNZXNzYWdlVG9TZW5kICptID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIGxpbmspOworICAgICAgCisgICAgICBpZiAobS0+dHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24pCisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmdHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zLCBjb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIHRvX3NlbmQpOworICAgICAgICAgIG1lc3NhZ2VfdG9fc2VuZF9mcmVlIChjb25uZWN0aW9uLCB0b19zZW5kKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX2NhbmNlbF90cmFuc2FjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIE1lc3NhZ2VUb1NlbmQgKm0gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgbGluayk7CisgICAgICAKKyAgICAgIGlmIChtLT50cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgICAKKyAgICAgICAgICBtZXNzYWdlX3RvX3NlbmRfZnJlZSAoY29ubmVjdGlvbiwgbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgX2RidXNfdmVyYm9zZSAoIlRSQU5TQUNUSU9OOiBjYW5jZWxsZWRcbiIpOworICAKKyAgd2hpbGUgKChjb25uZWN0aW9uID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZ0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMpKSkKKyAgICBjb25uZWN0aW9uX2NhbmNlbF90cmFuc2FjdGlvbiAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAodHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zID09IE5VTEwpOworCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRyYW5zYWN0aW9uLT5jYW5jZWxfaG9va3MsCisgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX2hvb2tfY2FuY2VsLCBOVUxMKTsKKworICBmcmVlX2NhbmNlbF9ob29rcyAodHJhbnNhY3Rpb24pOworICAKKyAgZGJ1c19mcmVlICh0cmFuc2FjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX2V4ZWN1dGVfdHJhbnNhY3Rpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIC8qIFNlbmQgdGhlIHF1ZXVlIGluIG9yZGVyIChGSUZPKSAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIE1lc3NhZ2VUb1NlbmQgKm0gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKnByZXYgPSBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgbGluayk7CisgICAgICAKKyAgICAgIGlmIChtLT50cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0tPm1lc3NhZ2UpICE9IE5VTEwpOworICAgICAgICAgIAorICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgIG0tPnByZWFsbG9jYXRlZCA9IE5VTEw7IC8qIHNvIHdlIGRvbid0IGRvdWJsZS1mcmVlIGl0ICovCisgICAgICAgICAgCisgICAgICAgICAgbWVzc2FnZV90b19zZW5kX2ZyZWUgKGNvbm5lY3Rpb24sIG0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgbGluayA9IHByZXY7CisgICAgfQorfQorCit2b2lkCitidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICAvKiBGb3IgZWFjaCBjb25uZWN0aW9uIGluIHRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucworICAgKiBzZW5kIHRoZSBtZXNzYWdlcworICAgKi8KKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgX2RidXNfdmVyYm9zZSAoIlRSQU5TQUNUSU9OOiBleGVjdXRpbmdcbiIpOworICAKKyAgd2hpbGUgKChjb25uZWN0aW9uID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZ0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMpKSkKKyAgICBjb25uZWN0aW9uX2V4ZWN1dGVfdHJhbnNhY3Rpb24gKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKHRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucyA9PSBOVUxMKTsKKworICBmcmVlX2NhbmNlbF9ob29rcyAodHJhbnNhY3Rpb24pOworICAKKyAgZGJ1c19mcmVlICh0cmFuc2FjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfY29ubmVjdGlvbl9yZW1vdmVfdHJhbnNhY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgTWVzc2FnZVRvU2VuZCAqdG9fc2VuZDsKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHdoaWxlICgodG9fc2VuZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMpKSkKKyAgICB7CisgICAgICAvKiBvbmx5IGhhcyBhbiBlZmZlY3QgZm9yIHRoZSBmaXJzdCBNZXNzYWdlVG9TZW5kIGxpc3RpbmcgdGhpcyB0cmFuc2FjdGlvbiAqLworICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZ0b19zZW5kLT50cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIHRvX3NlbmQpOworICAgICAgbWVzc2FnZV90b19zZW5kX2ZyZWUgKGNvbm5lY3Rpb24sIHRvX3NlbmQpOworICAgIH0KK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgREJ1c0Vycm9yIHRvIGEgbWVzc2FnZSByZXBseQorICovCitkYnVzX2Jvb2xfdAorYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICppbl9yZXBseV90bykKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICAKKyAgX2RidXNfYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgZXJyb3IgcmVwbHkgJXMgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICBlcnJvci0+bmFtZSwgZXJyb3ItPm1lc3NhZ2UpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAoaW5fcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb25DYW5jZWxGdW5jdGlvbiAgY2FuY2VsX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgQ2FuY2VsSG9vayAqY2g7CisKKyAgY2ggPSBkYnVzX25ldyAoQ2FuY2VsSG9vaywgMSk7CisgIGlmIChjaCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c192ZXJib3NlICgiICAgICBhZGRpbmcgY2FuY2VsIGhvb2sgZnVuY3Rpb24gPSAlcCBkYXRhID0gJXBcbiIsCisgICAgICAgICAgICAgICAgIGNhbmNlbF9mdW5jdGlvbiwgZGF0YSk7CisgIAorICBjaC0+Y2FuY2VsX2Z1bmN0aW9uID0gY2FuY2VsX2Z1bmN0aW9uOworICBjaC0+ZGF0YSA9IGRhdGE7CisgIGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisKKyAgLyogSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgaG9va3MgZ2V0IHJ1biBpbiByZXZlcnNlIG9yZGVyIHRoYXQgdGhleQorICAgKiB3ZXJlIGFkZGVkCisgICAqLworICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJnRyYW5zYWN0aW9uLT5jYW5jZWxfaG9va3MsIGNoKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGNoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvY29ubmVjdGlvbi5oIGIvZGJ1cy0xLjQuMTAvYnVzL2Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjlhNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDE0MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25uZWN0aW9uLmggIENsaWVudCBjb25uZWN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05ORUNUSU9OX0gKKyNkZWZpbmUgQlVTX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlICJidXMuaCIKKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uKSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworCisKK0J1c0Nvbm5lY3Rpb25zKiBidXNfY29ubmVjdGlvbnNfbmV3ICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworQnVzQ29ubmVjdGlvbnMqIGJ1c19jb25uZWN0aW9uc19yZWYgICAgICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOwordm9pZCAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc191bnJlZiAgICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfZm9yZWFjaCAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfZm9yZWFjaF9hY3RpdmUgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKK0J1c0NvbnRleHQqICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X2NvbnRleHQgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfaW5jcmVtZW50X3N0YW1wICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKK0J1c0NvbnRleHQqICAgICBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzQ29ubmVjdGlvbnMqIGJ1c19jb25uZWN0aW9uX2dldF9jb25uZWN0aW9ucyAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitCdXNSZWdpc3RyeSogICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5ICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0J1c0FjdGl2YXRpb24qICBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzTWF0Y2htYWtlciogIGJ1c19jb25uZWN0aW9uX2dldF9tYXRjaG1ha2VyICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7Citjb25zdCBjaGFyICogICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzU0VMaW51eElEKiAgIGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX2xpbWl0cyAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKnJlcXVlc3RpbmdfY29tcGxldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNfZXhwaXJlX2luY29tcGxldGUgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zKTsKKworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqd2lsbF9zZW5kX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqcmVwbHlfdG9fdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICBidXNfY29ubmVjdGlvbnNfY2hlY2tfcmVwbHkgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpzZW5kaW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqcmVjZWl2aW5nX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90ICAgICBidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworCitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2NvbnN0IGNoYXIgKmJ1c19jb25uZWN0aW9uX2dldF9uYW1lICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9vb21fZXJyb3IgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX3NlbmRfb29tX2Vycm9yICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICppbl9yZXBseV90byk7CisKKy8qIGNhbGxlZCBieSBzaWduYWxzLmMgKi8KK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgKnJ1bGUpOwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkX21hdGNoX3J1bGVfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbGluayk7Cit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICpydWxlKTsKK2ludCAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworCisvKiBjYWxsZWQgYnkgc2VydmljZXMuYyAqLworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2UgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7Cit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9yZW1vdmVfb3duZWRfc2VydmljZSAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZF9vd25lZF9zZXJ2aWNlX2xpbmsgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKmxpbmspOworaW50ICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisvKiBjYWxsZWQgYnkgZHJpdmVyLmMgKi8KK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2NvbXBsZXRlIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uLAorCQkJCSAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKKy8qIGNhbGxlZCBieSBkaXNwYXRjaC5jIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZHJvcHBlZCAqLwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90ICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfaW5fdW5peF9ncm91cCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBnaWQpOworZGJ1c19ib29sX3QgICAgICBidXNfY29ubmVjdGlvbl9nZXRfdW5peF9ncm91cHMgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAqKmdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKm5fZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworQnVzQ2xpZW50UG9saWN5KiBidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5ICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgKmNvbm5lY3Rpb24pOworCisvKiB0cmFuc2FjdGlvbiBBUEkgc28gd2UgY2FuIHNlbmQgb3Igbm90IHNlbmQgYSBibG9jayBvZiBtZXNzYWdlcyBhcyBhIHdob2xlICovCisKK3R5cGVkZWYgdm9pZCAoKiBCdXNUcmFuc2FjdGlvbkNhbmNlbEZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CisKK0J1c1RyYW5zYWN0aW9uKiBidXNfdHJhbnNhY3Rpb25fbmV3ICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNDb250ZXh0KiAgICAgYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICAgICAgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK0J1c0Nvbm5lY3Rpb25zKiBidXNfdHJhbnNhY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zICAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24pOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9zZW5kICAgICAgICAgICAgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICptZXNzYWdlKTsKK2RidXNfYm9vbF90ICAgICBidXNfdHJhbnNhY3Rpb25fc2VuZF9lcnJvcl9yZXBseSAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNFcnJvciAgICAgICAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICppbl9yZXBseV90byk7Cit2b2lkICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24pOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb25DYW5jZWxGdW5jdGlvbiAgY2FuY2VsX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworCisjZW5kaWYgLyogQlVTX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2RidXMuc2VydmljZS5pbiBiL2RidXMtMS40LjEwL2J1cy9kYnVzLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4N2E1OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9kYnVzLnNlcnZpY2UuaW4KQEAgLTAsMCArMSwxMSBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1ELUJ1cyBTeXN0ZW0gTWVzc2FnZSBCdXMKK1JlcXVpcmVzPWRidXMuc29ja2V0CitBZnRlcj1zeXNsb2cudGFyZ2V0CisKK1tTZXJ2aWNlXQorRXhlY1N0YXJ0UHJlPUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtdXVpZGdlbiAtLWVuc3VyZQorRXhlY1N0YXJ0UHJlPS0vYmluL3JtIC1mIEBEQlVTX1NZU1RFTV9QSURfRklMRUAKK0V4ZWNTdGFydD1ARVhQQU5ERURfQklORElSQC9kYnVzLWRhZW1vbiAtLXN5c3RlbSAtLWFkZHJlc3M9c3lzdGVtZDogLS1ub2ZvcmsgLS1zeXN0ZW1kLWFjdGl2YXRpb24KK0V4ZWNSZWxvYWQ9QEVYUEFOREVEX0JJTkRJUkAvZGJ1cy1zZW5kIC0tcHJpbnQtcmVwbHkgLS1zeXN0ZW0gLS10eXBlPW1ldGhvZF9jYWxsIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLlJlbG9hZENvbmZpZworT09NU2NvcmVBZGp1c3Q9LTkwMApkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2RidXMuc29ja2V0LmluIGIvZGJ1cy0xLjQuMTAvYnVzL2RidXMuc29ja2V0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2JlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvZGJ1cy5zb2NrZXQuaW4KQEAgLTAsMCArMSw1IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUQtQnVzIFN5c3RlbSBNZXNzYWdlIEJ1cyBTb2NrZXQKKworW1NvY2tldF0KK0xpc3RlblN0cmVhbT1AREJVU19TWVNURU1fU09DS0VUQApkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2Rlc2t0b3AtZmlsZS5jIGIvZGJ1cy0xLjQuMTAvYnVzL2Rlc2t0b3AtZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDQxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvZGVza3RvcC1maWxlLmMKQEAgLTAsMCArMSw4MDIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGVza3RvcC1maWxlLmMgIC5kZXNrdG9wIGZpbGUgcGFyc2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgImRlc2t0b3AtZmlsZS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKmtleTsKKyAgY2hhciAqdmFsdWU7Cit9IEJ1c0Rlc2t0b3BGaWxlTGluZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqc2VjdGlvbl9uYW1lOworICAKKyAgaW50IG5fbGluZXM7CisgIEJ1c0Rlc2t0b3BGaWxlTGluZSAqbGluZXM7CisgIGludCBuX2FsbG9jYXRlZF9saW5lczsgIAorfSBCdXNEZXNrdG9wRmlsZVNlY3Rpb247CisKK3N0cnVjdCBCdXNEZXNrdG9wRmlsZQoreworICBpbnQgbl9zZWN0aW9uczsKKyAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uczsKKyAgaW50IG5fYWxsb2NhdGVkX3NlY3Rpb25zOworfTsKKworLyoqCisgKiBQYXJzZXIgZm9yIHNlcnZpY2UgZmlsZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNTdHJpbmcgZGF0YTsgLyoqPCBUaGUgZGF0YSBmcm9tIHRoZSBmaWxlICovCisKKyAgQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZTsgLyoqPCBUaGUgcmVzdWx0aW5nIG9iamVjdCAqLworICBpbnQgY3VycmVudF9zZWN0aW9uOyAgICAvKio8IFRoZSBjdXJyZW50IHNlY3Rpb24gYmVpbmcgcGFyc2VkICovCisgIAorICBpbnQgcG9zOyAgICAgICAgICAvKio8IEN1cnJlbnQgcG9zaXRpb24gKi8KKyAgaW50IGxlbjsgICAgICAgICAgLyoqPCBMZW5ndGggKi8KKyAgaW50IGxpbmVfbnVtOyAgICAgLyoqPCBDdXJyZW50IGxpbmUgbnVtYmVyICovCisgIAorfSBCdXNEZXNrdG9wRmlsZVBhcnNlcjsKKworI2RlZmluZSBWQUxJRF9LRVlfQ0hBUiAxCisjZGVmaW5lIFZBTElEX0xPQ0FMRV9DSEFSIDIKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHZhbGlkWzI1Nl0gPSB7IAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MyAsIDB4MiAsIDB4MCAsIAorICAgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAKKyAgIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MiAsIAorICAgMHgwICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgCisgICAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCit9OworCitzdGF0aWMgdm9pZCByZXBvcnRfZXJyb3IgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsCisJCQkgIGNoYXIgICAgICAgICAgICAgICAgICptZXNzYWdlLAorCQkJICBjb25zdCBjaGFyICAgICAgICAgICAqZXJyb3JfbmFtZSwKKwkJCSAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKTsKKworc3RhdGljIHZvaWQKK3BhcnNlcl9mcmVlIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyKQoreworICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKHBhcnNlci0+ZGVza3RvcF9maWxlKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19kZXNrdG9wX2ZpbGVfbGluZV9mcmVlIChCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmUpCit7CisgIGRidXNfZnJlZSAobGluZS0+a2V5KTsKKyAgZGJ1c19mcmVlIChsaW5lLT52YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZGVza3RvcF9maWxlX3NlY3Rpb25fZnJlZSAoQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbi0+bl9saW5lczsgaSsrKQorICAgIGJ1c19kZXNrdG9wX2ZpbGVfbGluZV9mcmVlICgmc2VjdGlvbi0+bGluZXNbaV0pOworCisgIGRidXNfZnJlZSAoc2VjdGlvbi0+bGluZXMpOworICBkYnVzX2ZyZWUgKHNlY3Rpb24tPnNlY3Rpb25fbmFtZSk7Cit9CisKK3ZvaWQKK2J1c19kZXNrdG9wX2ZpbGVfZnJlZSAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGRlc2t0b3BfZmlsZS0+bl9zZWN0aW9uczsgaSsrKQorICAgIGJ1c19kZXNrdG9wX2ZpbGVfc2VjdGlvbl9mcmVlICgmZGVza3RvcF9maWxlLT5zZWN0aW9uc1tpXSk7CisgIGRidXNfZnJlZSAoZGVza3RvcF9maWxlLT5zZWN0aW9ucyk7CisKKyAgZGJ1c19mcmVlIChkZXNrdG9wX2ZpbGUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dyb3dfbGluZXNfaW5fc2VjdGlvbiAoQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uKQoreworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmVzOworICAKKyAgaW50IG5ld19uX2xpbmVzOworCisgIGlmIChzZWN0aW9uLT5uX2FsbG9jYXRlZF9saW5lcyA9PSAwKQorICAgIG5ld19uX2xpbmVzID0gMTsKKyAgZWxzZQorICAgIG5ld19uX2xpbmVzID0gc2VjdGlvbi0+bl9hbGxvY2F0ZWRfbGluZXMqMjsKKworICBsaW5lcyA9IGRidXNfcmVhbGxvYyAoc2VjdGlvbi0+bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKEJ1c0Rlc2t0b3BGaWxlTGluZSkgKiBuZXdfbl9saW5lcyk7CisKKyAgaWYgKGxpbmVzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgc2VjdGlvbi0+bGluZXMgPSBsaW5lczsKKyAgc2VjdGlvbi0+bl9hbGxvY2F0ZWRfbGluZXMgPSBuZXdfbl9saW5lczsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citncm93X3NlY3Rpb25zIChCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlKQoreworICBpbnQgbmV3X25fc2VjdGlvbnM7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbnM7CisgIAorICBpZiAoZGVza3RvcF9maWxlLT5uX2FsbG9jYXRlZF9zZWN0aW9ucyA9PSAwKQorICAgIG5ld19uX3NlY3Rpb25zID0gMTsKKyAgZWxzZQorICAgIG5ld19uX3NlY3Rpb25zID0gZGVza3RvcF9maWxlLT5uX2FsbG9jYXRlZF9zZWN0aW9ucyoyOworCisgIHNlY3Rpb25zID0gZGJ1c19yZWFsbG9jIChkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChCdXNEZXNrdG9wRmlsZVNlY3Rpb24pICogbmV3X25fc2VjdGlvbnMpOworICBpZiAoc2VjdGlvbnMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zID0gc2VjdGlvbnM7CisgIAorICBkZXNrdG9wX2ZpbGUtPm5fYWxsb2NhdGVkX3NlY3Rpb25zID0gbmV3X25fc2VjdGlvbnM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjaGFyICoKK3VuZXNjYXBlX3N0cmluZyAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGVuZF9wb3MsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAqcmV0dmFsLCAqcTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIC8qIGxlbiArIDEgaXMgZW5vdWdoLCBiZWNhdXNlIHVuZXNjYXBpbmcgbmV2ZXIgbWFrZXMgdGhlCisgICAqIHN0cmluZyBsb25nZXIKKyAgICovCisgIHJldHZhbCA9IGRidXNfbWFsbG9jIChlbmRfcG9zIC0gcG9zICsgMSk7CisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHEgPSByZXR2YWw7CisgIAorICB3aGlsZSAocG9zIDwgZW5kX3BvcykKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcykgPT0gMCkKKwl7CisJICAvKiBGb3VuZCBhbiBlbWJlZGRlZCBudWxsICovCisJICBkYnVzX2ZyZWUgKHJldHZhbCk7CisgICAgICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJUZXh0IHRvIGJlIHVuZXNjYXBlZCBjb250YWlucyBlbWJlZGRlZCBudWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9FU0NBUEVTLCBlcnJvcik7CisJICByZXR1cm4gTlVMTDsKKwl9CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKSA9PSAnXFwnKQorCXsKKwkgIHBvcyArKzsKKworCSAgaWYgKHBvcyA+PSBlbmRfcG9zKQorCSAgICB7CisJICAgICAgLyogRXNjYXBlIGF0IGVuZCBvZiBzdHJpbmcgKi8KKwkgICAgICBkYnVzX2ZyZWUgKHJldHZhbCk7CisgICAgICAgICAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiVGV4dCB0byBiZSB1bmVzY2FwZWQgZW5kZWQgaW4gXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfRVNDQVBFUywgZXJyb3IpOworCSAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisKKwkgIHN3aXRjaCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcykpCisJICAgIHsKKwkgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICpxKysgPSAnICc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgKnErKyA9ICdcdCc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgKnErKyA9ICdcbic7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgKnErKyA9ICdccic7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICpxKysgPSAnXFwnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgZGVmYXVsdDoKKwkgICAgIC8qIEludmFsaWQgZXNjYXBlIGNvZGUgKi8KKwkgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgICAgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIlRleHQgdG8gYmUgdW5lc2NhcGVkIGhhZCBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0VTQ0FQRVMsIGVycm9yKTsKKyAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgcG9zKys7CisJfQorICAgICAgZWxzZQorCXsKKwkgICpxKysgPV9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpOworCisJICBwb3MrKzsKKwl9CisgICAgfQorCisgICpxID0gMDsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgQnVzRGVza3RvcEZpbGVTZWN0aW9uKiAKK25ld19zZWN0aW9uIChCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lKQoreworICBpbnQgbjsKKyAgY2hhciAqbmFtZV9jb3B5OworICAKKyAgaWYgKGRlc2t0b3BfZmlsZS0+bl9hbGxvY2F0ZWRfc2VjdGlvbnMgPT0gZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zKQorICAgIHsKKyAgICAgIGlmICghZ3Jvd19zZWN0aW9ucyAoZGVza3RvcF9maWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG5hbWVfY29weSA9IF9kYnVzX3N0cmR1cCAobmFtZSk7CisgIGlmIChuYW1lX2NvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBuID0gZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zOworICBkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLnNlY3Rpb25fbmFtZSA9IG5hbWVfY29weTsKKworICBkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLm5fbGluZXMgPSAwOworICBkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLmxpbmVzID0gTlVMTDsKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5uX2FsbG9jYXRlZF9saW5lcyA9IDA7CisKKyAgaWYgKCFncm93X2xpbmVzX2luX3NlY3Rpb24gKCZkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0uc2VjdGlvbl9uYW1lKTsKKyAgICAgIGRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0uc2VjdGlvbl9uYW1lID0gTlVMTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnMgKz0gMTsKKyAgCisgIHJldHVybiAmZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXTsgIAorfQorCitzdGF0aWMgQnVzRGVza3RvcEZpbGVTZWN0aW9uKiAKK29wZW5fc2VjdGlvbiAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgKm5hbWUpCit7ICAKKyAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uOworCisgIHNlY3Rpb24gPSBuZXdfc2VjdGlvbiAocGFyc2VyLT5kZXNrdG9wX2ZpbGUsIG5hbWUpOworICBpZiAoc2VjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgcGFyc2VyLT5jdXJyZW50X3NlY3Rpb24gPSBwYXJzZXItPmRlc2t0b3BfZmlsZS0+bl9zZWN0aW9ucyAtIDE7CisgIF9kYnVzX2Fzc2VydCAoJnBhcnNlci0+ZGVza3RvcF9maWxlLT5zZWN0aW9uc1twYXJzZXItPmN1cnJlbnRfc2VjdGlvbl0gPT0gc2VjdGlvbik7CisgIAorICByZXR1cm4gc2VjdGlvbjsKK30KKworc3RhdGljIEJ1c0Rlc2t0b3BGaWxlTGluZSAqCituZXdfbGluZSAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlcikKK3sKKyAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uOworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmU7CisgIAorICBzZWN0aW9uID0gJnBhcnNlci0+ZGVza3RvcF9maWxlLT5zZWN0aW9uc1twYXJzZXItPmN1cnJlbnRfc2VjdGlvbl07CisKKyAgaWYgKHNlY3Rpb24tPm5fYWxsb2NhdGVkX2xpbmVzID09IHNlY3Rpb24tPm5fbGluZXMpCisgICAgeworICAgICAgaWYgKCFncm93X2xpbmVzX2luX3NlY3Rpb24gKHNlY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbGluZSA9ICZzZWN0aW9uLT5saW5lc1tzZWN0aW9uLT5uX2xpbmVzKytdOworCisgIF9EQlVTX1pFUk8oKmxpbmUpOworICAgIAorICByZXR1cm4gbGluZTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpc19ibGFua19saW5lIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyKQoreworICBpbnQgcDsKKyAgY2hhciBjOworICAKKyAgcCA9IHBhcnNlci0+cG9zOworCisgIGMgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApOworCisgIHdoaWxlIChjICYmIGMgIT0gJ1xuJykKKyAgICB7CisgICAgICBpZiAoIShjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcZicpKQorCXJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgcCsrOworICAgICAgYyA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfY29tbWVudF9vcl9ibGFuayAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlcikKK3sKKyAgaW50IGxpbmVfZW5kLCBlb2xfbGVuOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZwYXJzZXItPmRhdGEsIHBhcnNlci0+cG9zLCAmbGluZV9lbmQsICZlb2xfbGVuKSkKKyAgICBsaW5lX2VuZCA9IHBhcnNlci0+bGVuOworCisgIGlmIChsaW5lX2VuZCA9PSBwYXJzZXItPmxlbikKKyAgICBwYXJzZXItPnBvcyA9IHBhcnNlci0+bGVuOworICBlbHNlCisgICAgcGFyc2VyLT5wb3MgPSBsaW5lX2VuZCArIGVvbF9sZW47CisgIAorICBwYXJzZXItPmxpbmVfbnVtICs9IDE7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXNfdmFsaWRfc2VjdGlvbl9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICAvKiA1LiBHcm91cCBuYW1lcyBtYXkgY29udGFpbiBhbGwgQVNDSUkgY2hhcmFjdGVycyBleGNlcHQgZm9yIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgJ1snIGFuZCAnXScuICovCisKKyAgd2hpbGUgKCpuYW1lKQorICAgIHsKKyAgICAgIGlmICghKCgqbmFtZSA+PSAnQScgJiYgKm5hbWUgPD0gJ1onKSB8fCAoKm5hbWUgPj0gJ2EnIHx8ICpuYW1lIDw9ICd6JykgfHwKKwkgICAgKm5hbWUgPT0gJ1xuJyB8fCAqbmFtZSA9PSAnXHQnKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIG5hbWUrKzsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcGFyc2Vfc2VjdGlvbl9zdGFydCAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgaW50IGxpbmVfZW5kLCBlb2xfbGVuOworICBjaGFyICpzZWN0aW9uX25hbWU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmcGFyc2VyLT5kYXRhLCBwYXJzZXItPnBvcywgJmxpbmVfZW5kLCAmZW9sX2xlbikpCisgICAgbGluZV9lbmQgPSBwYXJzZXItPmxlbjsKKyAgCisgIGlmIChsaW5lX2VuZCAtIHBhcnNlci0+cG9zIDw9IDIgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgbGluZV9lbmQgLSAxKSAhPSAnXScpCisgICAgeworICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJJbnZhbGlkIHN5bnRheCBmb3Igc2VjdGlvbiBoZWFkZXIiLCBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX1NZTlRBWCwgZXJyb3IpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHNlY3Rpb25fbmFtZSA9IHVuZXNjYXBlX3N0cmluZyAocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzZXItPmRhdGEsIHBhcnNlci0+cG9zICsgMSwgbGluZV9lbmQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICBpZiAoc2VjdGlvbl9uYW1lID09IE5VTEwpCisgICAgeworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghaXNfdmFsaWRfc2VjdGlvbl9uYW1lIChzZWN0aW9uX25hbWUpKQorICAgIHsKKyAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiSW52YWxpZCBjaGFyYWN0ZXJzIGluIHNlY3Rpb24gbmFtZSIsIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfQ0hBUlMsIGVycm9yKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgZGJ1c19mcmVlIChzZWN0aW9uX25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAob3Blbl9zZWN0aW9uIChwYXJzZXIsIHNlY3Rpb25fbmFtZSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHNlY3Rpb25fbmFtZSk7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChsaW5lX2VuZCA9PSBwYXJzZXItPmxlbikKKyAgICBwYXJzZXItPnBvcyA9IHBhcnNlci0+bGVuOworICBlbHNlCisgICAgcGFyc2VyLT5wb3MgPSBsaW5lX2VuZCArIGVvbF9sZW47CisgIAorICBwYXJzZXItPmxpbmVfbnVtICs9IDE7CisKKyAgZGJ1c19mcmVlIChzZWN0aW9uX25hbWUpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcGFyc2Vfa2V5X3ZhbHVlIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBpbnQgbGluZV9lbmQsIGVvbF9sZW47CisgIGludCBrZXlfc3RhcnQsIGtleV9lbmQ7CisgIGludCB2YWx1ZV9zdGFydDsKKyAgaW50IHA7CisgIGNoYXIgKnZhbHVlLCAqdG1wOworICBEQnVzU3RyaW5nIGtleTsKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZwYXJzZXItPmRhdGEsIHBhcnNlci0+cG9zLCAmbGluZV9lbmQsICZlb2xfbGVuKSkKKyAgICBsaW5lX2VuZCA9IHBhcnNlci0+bGVuOworICAKKyAgcCA9IHBhcnNlci0+cG9zOworICBrZXlfc3RhcnQgPSBwOworICB3aGlsZSAocCA8IGxpbmVfZW5kICYmCisJICh2YWxpZFtfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApXSAmIFZBTElEX0tFWV9DSEFSKSkKKyAgICBwKys7CisgIGtleV9lbmQgPSBwOworICAKKyAgaWYgKGtleV9zdGFydCA9PSBrZXlfZW5kKQorICAgIHsKKyAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiRW1wdHkga2V5IG5hbWUiLCBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX1NZTlRBWCwgZXJyb3IpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFdlIGlnbm9yZSBsb2NhbGVzIGZvciBub3cgKi8KKyAgaWYgKHAgPCBsaW5lX2VuZCAmJiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApID09ICdbJykKKyAgICB7CisgICAgICBpZiAobGluZV9lbmQgPT0gcGFyc2VyLT5sZW4pCisJcGFyc2VyLT5wb3MgPSBwYXJzZXItPmxlbjsKKyAgICAgIGVsc2UKKwlwYXJzZXItPnBvcyA9IGxpbmVfZW5kICsgZW9sX2xlbjsKKwkgIAorICAgICAgcGFyc2VyLT5saW5lX251bSArPSAxOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIAorICAvKiBTa2lwIHNwYWNlIGJlZm9yZSAnPScgKi8KKyAgd2hpbGUgKHAgPCBsaW5lX2VuZCAmJiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApID09ICcgJykKKyAgICBwKys7CisKKyAgaWYgKHAgPCBsaW5lX2VuZCAmJiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApICE9ICc9JykKKyAgICB7CisgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIkludmFsaWQgY2hhcmFjdGVycyBpbiBrZXkgbmFtZSIsIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfQ0hBUlMsIGVycm9yKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocCA9PSBsaW5lX2VuZCkKKyAgICB7CisgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIk5vICc9JyBpbiBrZXkvdmFsdWUgcGFpciIsIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfU1lOVEFYLCBlcnJvcik7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2tpcCB0aGUgJz0nICovCisgIHArKzsKKworICAvKiBTa2lwIHNwYWNlIGFmdGVyICc9JyAqLworICB3aGlsZSAocCA8IGxpbmVfZW5kICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCkgPT0gJyAnKQorICAgIHArKzsKKworICB2YWx1ZV9zdGFydCA9IHA7CisgIAorICB2YWx1ZSA9IHVuZXNjYXBlX3N0cmluZyAocGFyc2VyLCAmcGFyc2VyLT5kYXRhLCB2YWx1ZV9zdGFydCwgbGluZV9lbmQsIGVycm9yKTsKKyAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgeworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGxpbmUgPSBuZXdfbGluZSAocGFyc2VyKTsKKyAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgma2V5KSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJnBhcnNlci0+ZGF0YSwga2V5X3N0YXJ0LCBrZXlfZW5kIC0ga2V5X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwgMCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgZGJ1c19mcmVlICh2YWx1ZSk7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmtleSwgJnRtcCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgZGJ1c19mcmVlICh2YWx1ZSk7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAKKyAgbGluZS0+a2V5ID0gdG1wOworICBsaW5lLT52YWx1ZSA9IHZhbHVlOworCisgIGlmIChsaW5lX2VuZCA9PSBwYXJzZXItPmxlbikKKyAgICBwYXJzZXItPnBvcyA9IHBhcnNlci0+bGVuOworICBlbHNlCisgICAgcGFyc2VyLT5wb3MgPSBsaW5lX2VuZCArIGVvbF9sZW47CisgIAorICBwYXJzZXItPmxpbmVfbnVtICs9IDE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCityZXBvcnRfZXJyb3IgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsCisJICAgICAgY2hhciAgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisJICAgICAgY29uc3QgY2hhciAgICAgICAgICAgKmVycm9yX25hbWUsCisJICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWUgPSBOVUxMOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgaWYgKHBhcnNlci0+Y3VycmVudF9zZWN0aW9uICE9IC0xKQorICAgIHNlY3Rpb25fbmFtZSA9IHBhcnNlci0+ZGVza3RvcF9maWxlLT5zZWN0aW9uc1twYXJzZXItPmN1cnJlbnRfc2VjdGlvbl0uc2VjdGlvbl9uYW1lOworCisgIGlmIChzZWN0aW9uX25hbWUpCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBlcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gc2VjdGlvbiAlcyBhdCBsaW5lICVkOiAlc1xuIiwgc2VjdGlvbl9uYW1lLCBwYXJzZXItPmxpbmVfbnVtLCBtZXNzYWdlKTsKKyAgZWxzZQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIGF0IGxpbmUgJWQ6ICVzXG4iLCBwYXJzZXItPmxpbmVfbnVtLCBtZXNzYWdlKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitkdW1wX2Rlc2t0b3BfZmlsZSAoQnVzRGVza3RvcEZpbGUgKmZpbGUpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBmaWxlLT5uX3NlY3Rpb25zOyBpKyspCisgICAgeworICAgICAgaW50IGo7CisgICAgICAKKyAgICAgIHByaW50ZiAoIlslc11cbiIsIGZpbGUtPnNlY3Rpb25zW2ldLnNlY3Rpb25fbmFtZSk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBmaWxlLT5zZWN0aW9uc1tpXS5uX2xpbmVzOyBqKyspCisJeworCSAgcHJpbnRmICgiJXM9JXNcbiIsIGZpbGUtPnNlY3Rpb25zW2ldLmxpbmVzW2pdLmtleSwKKwkJICBmaWxlLT5zZWN0aW9uc1tpXS5saW5lc1tqXS52YWx1ZSk7CisJfQorICAgIH0KK30KKyNlbmRpZgorCitCdXNEZXNrdG9wRmlsZSoKK2J1c19kZXNrdG9wX2ZpbGVfbG9hZCAoREJ1c1N0cmluZyAqZmlsZW5hbWUsCisJCSAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c0Rlc2t0b3BGaWxlUGFyc2VyIHBhcnNlcjsKKyAgREJ1c1N0YXQgc2I7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICAvKiBDbGVhcmx5IHRoZXJlJ3MgYSByYWNlIGhlcmUsIGJ1dCBpdCdzIGp1c3QgdG8gbWFrZSBpdCB1bmxpa2VseQorICAgKiB0aGF0IHdlIGRvIHNvbWV0aGluZyBzaWxseSwgd2Ugc3RpbGwgaGFuZGxlIGRvaW5nIGl0IGJlbG93LgorICAgKi8KKyAgaWYgKCFfZGJ1c19zdGF0IChmaWxlbmFtZSwgJnNiLCBlcnJvcikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHNiLnNpemUgPiBfREJVU19PTkVfS0lMT0JZVEUgKiAxMjgpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRGVza3RvcCBmaWxlIHNpemUgKCVsZCBieXRlcykgaXMgdG9vIGxhcmdlIiwgKGxvbmcpIHNiLnNpemUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZzdHIsIGZpbGVuYW1lLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBVVEYtOCIpOyAgIAorICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcGFyc2VyLmRlc2t0b3BfZmlsZSA9IGRidXNfbmV3MCAoQnVzRGVza3RvcEZpbGUsIDEpOworICBpZiAocGFyc2VyLmRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBwYXJzZXIuZGF0YSA9IHN0cjsKKyAgcGFyc2VyLmxpbmVfbnVtID0gMTsKKyAgcGFyc2VyLnBvcyA9IDA7CisgIHBhcnNlci5sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBhcnNlci5kYXRhKTsKKyAgcGFyc2VyLmN1cnJlbnRfc2VjdGlvbiA9IC0xOworCisgIHdoaWxlIChwYXJzZXIucG9zIDwgcGFyc2VyLmxlbikKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLmRhdGEsIHBhcnNlci5wb3MpID09ICdbJykKKwl7CisJICBpZiAoIXBhcnNlX3NlY3Rpb25fc3RhcnQgKCZwYXJzZXIsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisJfQorICAgICAgZWxzZSBpZiAoaXNfYmxhbmtfbGluZSAoJnBhcnNlcikgfHwKKwkgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLmRhdGEsIHBhcnNlci5wb3MpID09ICcjJykKKwlwYXJzZV9jb21tZW50X29yX2JsYW5rICgmcGFyc2VyKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIXBhcnNlX2tleV92YWx1ZSAoJnBhcnNlciwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLmRhdGEpOworCisgIHJldHVybiBwYXJzZXIuZGVza3RvcF9maWxlOworfQorCitzdGF0aWMgQnVzRGVza3RvcEZpbGVTZWN0aW9uICoKK2xvb2t1cF9zZWN0aW9uIChCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlLAorCQljb25zdCBjaGFyICAgICAqc2VjdGlvbl9uYW1lKQoreworICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb247CisgIGludCBpOworICAKKyAgaWYgKHNlY3Rpb25fbmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgZm9yIChpID0gMDsgaSA8IGRlc2t0b3BfZmlsZS0+bl9zZWN0aW9uczsgaSArKykKKyAgICB7CisgICAgICBzZWN0aW9uID0gJmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKHNlY3Rpb24tPnNlY3Rpb25fbmFtZSwgc2VjdGlvbl9uYW1lKSA9PSAwKQorCXJldHVybiBzZWN0aW9uOworICAgIH0KKyAgCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgQnVzRGVza3RvcEZpbGVMaW5lICoKK2xvb2t1cF9saW5lIChCdXNEZXNrdG9wRmlsZSAgICAgICAgKmRlc2t0b3BfZmlsZSwKKwkgICAgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbiwKKwkgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqa2V5bmFtZSkKK3sKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbi0+bl9saW5lczsgaSsrKQorICAgIHsKKyAgICAgIGxpbmUgPSAmc2VjdGlvbi0+bGluZXNbaV07CisgICAgICAKKyAgICAgIGlmIChzdHJjbXAgKGxpbmUtPmtleSwga2V5bmFtZSkgPT0gMCkKKwlyZXR1cm4gbGluZTsKKyAgICB9CisgIAorICByZXR1cm4gTlVMTDsKK30KKworZGJ1c19ib29sX3QKK2J1c19kZXNrdG9wX2ZpbGVfZ2V0X3JhdyAoQnVzRGVza3RvcEZpbGUgICpkZXNrdG9wX2ZpbGUsCisJCQkgIGNvbnN0IGNoYXIgICAgICAqc2VjdGlvbl9uYW1lLAorCQkJICBjb25zdCBjaGFyICAgICAgKmtleW5hbWUsCisJCQkgIGNvbnN0IGNoYXIgICAgICoqdmFsKQoreworICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb247CisgIEJ1c0Rlc2t0b3BGaWxlTGluZSAqbGluZTsKKworICAqdmFsID0gTlVMTDsKKworICBzZWN0aW9uID0gbG9va3VwX3NlY3Rpb24gKGRlc2t0b3BfZmlsZSwgc2VjdGlvbl9uYW1lKTsKKyAgCisgIGlmICghc2VjdGlvbikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGluZSA9IGxvb2t1cF9saW5lIChkZXNrdG9wX2ZpbGUsCisJCSAgICAgIHNlY3Rpb24sCisJCSAgICAgIGtleW5hbWUpOworCisgIGlmICghbGluZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICAqdmFsID0gbGluZS0+dmFsdWU7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoQnVzRGVza3RvcEZpbGUgICpkZXNrdG9wX2ZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgICAgICAqc2VjdGlvbiwKKwkJCSAgICAgY29uc3QgY2hhciAgICAgICprZXluYW1lLAorCQkJICAgICBjaGFyICAgICAgICAgICAqKnZhbCwKKwkJCSAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqcmF3OworIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAqdmFsID0gTlVMTDsKKyAgCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfcmF3IChkZXNrdG9wX2ZpbGUsIHNlY3Rpb24sIGtleW5hbWUsICZyYXcpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIk5vIFwiJXNcIiBrZXkgaW4gLnNlcnZpY2UgZmlsZVxuIiwga2V5bmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICp2YWwgPSBfZGJ1c19zdHJkdXAgKHJhdyk7CisKKyAgaWYgKCp2YWwgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2Rlc2t0b3AtZmlsZS5oIGIvZGJ1cy0xLjQuMTAvYnVzL2Rlc2t0b3AtZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTc4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvZGVza3RvcC1maWxlLmgKQEAgLTAsMCArMSw1NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkZXNrdG9wLWZpbGUuaCAgLmRlc2t0b3AgZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBCVVNfREVTS1RPUF9GSUxFX0gKKyNkZWZpbmUgQlVTX0RFU0tUT1BfRklMRV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKKyNkZWZpbmUgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9TWU5UQVggICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXNrdG9wUGFyc2VFcnJvci5JbnZhbGlkU3ludGF4IgorI2RlZmluZSBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0VTQ0FQRVMgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlc2t0b3BQYXJzZUVycm9yLkludmFsaWRFc2NhcGVzIgorI2RlZmluZSBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0NIQVJTICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlc2t0b3BQYXJzZUVycm9yLkludmFsaWRDaGFycyIKKworI2RlZmluZSBEQlVTX1NFUlZJQ0VfU0VDVElPTiAgIkQtQlVTIFNlcnZpY2UiCisjZGVmaW5lIERCVVNfU0VSVklDRV9OQU1FICAgICAiTmFtZSIKKyNkZWZpbmUgREJVU19TRVJWSUNFX0VYRUMgICAgICJFeGVjIgorI2RlZmluZSBEQlVTX1NFUlZJQ0VfVVNFUiAgICAgIlVzZXIiCisjZGVmaW5lIERCVVNfU0VSVklDRV9HUk9VUCAgICAiR3JvdXAiCisjZGVmaW5lIERCVVNfU0VSVklDRV9TWVNURU1EX1NFUlZJQ0UgIlN5c3RlbWRTZXJ2aWNlIgorCit0eXBlZGVmIHN0cnVjdCBCdXNEZXNrdG9wRmlsZSBCdXNEZXNrdG9wRmlsZTsKKworQnVzRGVza3RvcEZpbGUgKmJ1c19kZXNrdG9wX2ZpbGVfbG9hZCAoREJ1c1N0cmluZyAgICAgKmZpbGVuYW1lLAorCQkJCSAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgICAgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAoQnVzRGVza3RvcEZpbGUgKmZpbGUpOworCitkYnVzX2Jvb2xfdCBidXNfZGVza3RvcF9maWxlX2dldF9yYXcgICAgKEJ1c0Rlc2t0b3BGaWxlICAqZGVza3RvcF9maWxlLAorCQkJCQkgY29uc3QgY2hhciAgICAgICpzZWN0aW9uX25hbWUsCisJCQkJCSBjb25zdCBjaGFyICAgICAgKmtleW5hbWUsCisJCQkJCSBjb25zdCBjaGFyICAgICAqKnZhbCk7CitkYnVzX2Jvb2xfdCBidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKEJ1c0Rlc2t0b3BGaWxlICAqZGVza3RvcF9maWxlLAorCQkJCQkgY29uc3QgY2hhciAgICAgICpzZWN0aW9uLAorCQkJCQkgY29uc3QgY2hhciAgICAgICprZXluYW1lLAorCQkJCQkgY2hhciAgICAgICAgICAgKip2YWwsCisJCQkJCSBEQnVzRXJyb3IgICAgICAgKmVycm9yKTsKKworCisjZW5kaWYgLyogQlVTX0RFU0tUT1BfRklMRV9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvZGlyLXdhdGNoLWRlZmF1bHQuYyBiL2RidXMtMS40LjEwL2J1cy9kaXItd2F0Y2gtZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzYxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvZGlyLXdhdGNoLWRlZmF1bHQuYwpAQCAtMCwwICsxLDM1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRpci13YXRjaC1kZWZhdWx0LmMgIE9TIHNwZWNpZmljIGRpcmVjdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciBtZXNzYWdlIGJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKworCisvKiBOb09wICovCisKK3ZvaWQKK2J1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcmVjdG9yaWVzKQoreworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2Rpci13YXRjaC1kbm90aWZ5LmMgYi9kYnVzLTEuNC4xMC9idXMvZGlyLXdhdGNoLWRub3RpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhkN2QxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2Rpci13YXRjaC1kbm90aWZ5LmMKQEAgLTAsMCArMSw5MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXItd2F0Y2gtZG5vdGlmeS5jICBPUyBzcGVjaWZpYyBkaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKworI2RlZmluZSBNQVhfRElSU19UT19XQVRDSCAxMjgKKworLyogdXNlIGEgc3RhdGljIGFycmF5IHRvIGF2b2lkIGhhbmRsaW5nIE9PTSAqLworc3RhdGljIGludCBmZHNbTUFYX0RJUlNfVE9fV0FUQ0hdOworc3RhdGljIGludCBudW1fZmRzID0gMDsKKwordm9pZAorYnVzX3dhdGNoX2RpcmVjdG9yeSAoY29uc3QgY2hhciAqZGlyLCBCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBpbnQgZmQ7CisKKyAgX2RidXNfYXNzZXJ0IChkaXIgIT0gTlVMTCk7CisKKyAgaWYgKG51bV9mZHMgPj0gTUFYX0RJUlNfVE9fV0FUQ0ggKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3Qgd2F0Y2ggY29uZmlnIGRpcmVjdG9yeSAnJXMnLiBBbHJlYWR5IHdhdGNoaW5nICVkIGRpcmVjdG9yaWVzXG4iLCBkaXIsIE1BWF9ESVJTX1RPX1dBVENIKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBmZCA9IG9wZW4gKGRpciwgT19SRE9OTFkpOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3Qgb3BlbiBkaXJlY3RvcnkgJyVzJzsgZXJyb3IgJyVzJ1xuIiwgZGlyLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZmNudGwgKGZkLCBGX05PVElGWSwgRE5fQ1JFQVRFfEROX0RFTEVURXxETl9SRU5BTUV8RE5fTU9ESUZZKSA9PSAtMSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IHNldHVwIERfTk9USUZZIGZvciAnJXMnIGVycm9yICclcydcbiIsIGRpciwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBjbG9zZSAoZmQpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgZmRzW251bV9mZHMrK10gPSBmZDsKKyAgX2RidXNfdmVyYm9zZSAoIkFkZGVkIHdhdGNoIG9uIGNvbmZpZyBkaXJlY3RvcnkgJyVzJ1xuIiwgZGlyKTsKKworIG91dDoKKyAgOworfQorCit2b2lkIAorYnVzX2Ryb3BfYWxsX2RpcmVjdG9yeV93YXRjaGVzICh2b2lkKQoreworICBpbnQgaTsKKyAKKyAgX2RidXNfdmVyYm9zZSAoIkRyb3BwaW5nIGFsbCB3YXRjaGVzIG9uIGNvbmZpZyBkaXJlY3Rvcmllc1xuIik7CisgCisgIGZvciAoaSA9IDA7IGkgPCBudW1fZmRzOyBpKyspCisgICAgeworICAgICAgaWYgKGNsb3NlIChmZHNbaV0pICE9IDApCisJeworCSAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGNsb3NpbmcgZmQgJWQgZm9yIGNvbmZpZyBkaXJlY3Rvcnkgd2F0Y2hcbiIsIGZkc1tpXSk7CisJfQorICAgIH0KKyAgCisgIG51bV9mZHMgPSAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgYi9kYnVzLTEuNC4xMC9idXMvZGlyLXdhdGNoLWlub3RpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjFiOGVlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiIC0qLSAqLworLyogZGlyLXdhdGNoLWlub3RpZnkuYyAgT1Mgc3BlY2lmaWMgZGlyZWN0b3J5IGNoYW5nZSBub3RpZmljYXRpb24gZm9yIG1lc3NhZ2UgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqICAgICAgICAgICAoYykgMjAwNiBNYW5kcml2YQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy13YXRjaC5oPgorI2luY2x1ZGUgImRpci13YXRjaC5oIgorCisjZGVmaW5lIE1BWF9ESVJTX1RPX1dBVENIIDEyOAorI2RlZmluZSBJTk9USUZZX0VWRU5UX1NJWkUgKHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkpCisjZGVmaW5lIElOT1RJRllfQlVGX0xFTiAoMTAyNCAqIChJTk9USUZZX0VWRU5UX1NJWkUgKyAxNikpCisKKy8qIHVzZSBhIHN0YXRpYyBhcnJheSB0byBhdm9pZCBoYW5kbGluZyBPT00gKi8KK3N0YXRpYyBpbnQgd2RzW01BWF9ESVJTX1RPX1dBVENIXTsKK3N0YXRpYyBjaGFyICpkaXJzW01BWF9ESVJTX1RPX1dBVENIXTsKK3N0YXRpYyBpbnQgbnVtX3dkcyA9IDA7CitzdGF0aWMgaW50IGlub3RpZnlfZmQgPSAtMTsKK3N0YXRpYyBEQnVzV2F0Y2ggKndhdGNoID0gTlVMTDsKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcCA9IE5VTEw7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2lub3RpZnlfd2F0Y2hfY2FsbGJhY2sgKERCdXNXYXRjaCAqd2F0Y2gsIHVuc2lnbmVkIGludCBjb25kaXRpb24sIHZvaWQgKmRhdGEpCit7CisgIHJldHVybiBkYnVzX3dhdGNoX2hhbmRsZSAod2F0Y2gsIGNvbmRpdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2hhbmRsZV9pbm90aWZ5X3dhdGNoIChEQnVzV2F0Y2ggKnBhc3NlZF93YXRjaCwgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpkYXRhKQoreworICBjaGFyIGJ1ZmZlcltJTk9USUZZX0JVRl9MRU5dOworICBzc2l6ZV90IHJldCA9IDA7CisgIGludCBpID0gMDsKKyAgcGlkX3QgcGlkOworICBkYnVzX2Jvb2xfdCBoYXZlX2NoYW5nZSA9IEZBTFNFOworCisgIHJldCA9IHJlYWQgKGlub3RpZnlfZmQsIGJ1ZmZlciwgSU5PVElGWV9CVUZfTEVOKTsKKyAgaWYgKHJldCA8IDApCisgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHJlYWRpbmcgaW5vdGlmeSBldmVudDogJyVzJ1xuIiwgX2RidXNfc3RyZXJyb3IoZXJybm8pKTsKKyAgZWxzZSBpZiAoIXJldCkKKyAgICBfZGJ1c192ZXJib3NlICgiRXJyb3IgcmVhZGluZyBpbm90aWZ5IGV2ZW50OiBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKworICB3aGlsZSAoaSA8IHJldCkKKyAgICB7CisgICAgICBzdHJ1Y3QgaW5vdGlmeV9ldmVudCAqZXY7CisgICAgICBwaWQgPSBfZGJ1c19nZXRwaWQgKCk7CisKKyAgICAgIGV2ID0gKHN0cnVjdCBpbm90aWZ5X2V2ZW50ICopICZidWZmZXJbaV07CisgICAgICBpICs9IElOT1RJRllfRVZFTlRfU0laRSArIGV2LT5sZW47CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgICAgICBpZiAoZXYtPmxlbikKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoImV2ZW50IG5hbWU6ICclcydcbiIsIGV2LT5uYW1lKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbm90aWZ5IGV2ZW50OiB3ZD0lZCBtYXNrPSV1IGNvb2tpZT0ldSBsZW49JXVcbiIsIGV2LT53ZCwgZXYtPm1hc2ssIGV2LT5jb29raWUsIGV2LT5sZW4pOworI2VuZGlmCisgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyBTSUdIVVAgc2lnbmFsIG9uIHJlY2VwdGlvbiBvZiBhIGlub3RpZnkgZXZlbnRcbiIpOworICAgICAgaGF2ZV9jaGFuZ2UgPSBUUlVFOworICAgIH0KKyAgaWYgKGhhdmVfY2hhbmdlKQorICAgICh2b2lkKSBraWxsIChwaWQsIFNJR0hVUCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgdm9pZAorX3NldF93YXRjaGVkX2RpcnNfaW50ZXJuYWwgKERCdXNMaXN0ICoqZGlyZWN0b3JpZXMpCit7CisgIGludCBuZXdfd2RzW01BWF9ESVJTX1RPX1dBVENIXTsKKyAgY2hhciAqbmV3X2RpcnNbTUFYX0RJUlNfVE9fV0FUQ0hdOworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IGksIGosIHdkOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfRElSU19UT19XQVRDSDsgaSsrKQorICAgIHsKKyAgICAgIG5ld193ZHNbaV0gPSAtMTsKKyAgICAgIG5ld19kaXJzW2ldID0gTlVMTDsKKyAgICB9CisKKyAgaSA9IDA7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChkaXJlY3Rvcmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgbmV3X2RpcnNbaSsrXSA9IChjaGFyICopbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGRpcmVjdG9yaWVzLCBsaW5rKTsKKyAgICB9CisKKyAgLyogTG9vayBmb3IgZGlyZWN0b3JpZXMgaW4gYm90aCB0aGUgb2xkIGFuZCBuZXcgc2V0cywgaWYKKyAgICogd2UgZmluZCBvbmUsIG1vdmUgaXRzIGRhdGEgaW50byB0aGUgbmV3IHNldC4KKyAgICovCisgIGZvciAoaSA9IDA7IG5ld19kaXJzW2ldOyBpKyspCisgICAgeworICAgICAgZm9yIChqID0gMDsgaiA8IG51bV93ZHM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChkaXJzW2pdICYmIHN0cmNtcCAobmV3X2RpcnNbaV0sIGRpcnNbal0pID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5ld193ZHNbaV0gPSB3ZHNbal07CisgICAgICAgICAgICAgIG5ld19kaXJzW2ldID0gZGlyc1tqXTsKKyAgICAgICAgICAgICAgd2RzW2pdID0gLTE7CisgICAgICAgICAgICAgIGRpcnNbal0gPSBOVUxMOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvKiBBbnkgZGlyZWN0b3JpZXMgd2UgZmluZCBpbiAid2RzIiB3aXRoIGEgbm9uemVybyBmZCBtdXN0CisgICAqIG5vdCBiZSBpbiB0aGUgbmV3IHNldCwgc28gcGVyZm9ybSBjbGVhbnVwIG5vdy4KKyAgICovCisgIGZvciAoaiA9IDA7IGogPCBudW1fd2RzOyBqKyspCisgICAgeworICAgICAgaWYgKHdkc1tqXSAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIGlub3RpZnlfcm1fd2F0Y2ggKGlub3RpZnlfZmQsIHdkc1tqXSk7CisgICAgICAgICAgZGJ1c19mcmVlIChkaXJzW2pdKTsKKyAgICAgICAgICB3ZHNbal0gPSAtMTsKKyAgICAgICAgICBkaXJzW2pdID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChuZXdfd2RzW2ldID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgLyogRklYTUUgLSBsZXNzIGxhbWUgZXJyb3IgaGFuZGxpbmcgZm9yIGZhaWxpbmcgdG8gYWRkIGEgd2F0Y2g7IHdlIG1heSBuZWVkIHRvIHNsZWVwLiAqLworICAgICAgICAgIHdkID0gaW5vdGlmeV9hZGRfd2F0Y2ggKGlub3RpZnlfZmQsIG5ld19kaXJzW2ldLCBJTl9DTE9TRV9XUklURSB8IElOX0RFTEVURSB8IElOX01PVkVEX1RPIHwgSU5fTU9WRURfRlJPTSk7CisgICAgICAgICAgaWYgKHdkIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTm90IGFsbCBzZXJ2aWNlIGRpcmVjdG9yaWVzIG5lZWQgdG8gZXhpc3QuICovCisgICAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBzZXR1cCBpbm90aWZ5IGZvciAnJXMnOyBlcnJvciAnJXMnXG4iLCBuZXdfZGlyc1tpXSwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBuZXdfd2RzW2ldID0gLTE7CisgICAgICAgICAgICAgICAgICBuZXdfZGlyc1tpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgbmV3X3dkc1tpXSA9IHdkOworICAgICAgICAgIG5ld19kaXJzW2ldID0gX2RidXNfc3RyZHVwIChuZXdfZGlyc1tpXSk7CisgICAgICAgICAgaWYgKCFuZXdfZGlyc1tpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRklYTUUgaGF2ZSBsZXNzIGxhbWUgaGFuZGxpbmcgZm9yIE9PTSwgd2UganVzdCBzaWxlbnRseSBmYWlsIHRvCisgICAgICAgICAgICAgICAqIHdhdGNoLiAgKEluIHJlYWxpdHkgdGhvdWdoLCB0aGUgd2hvbGUgT09NIGhhbmRsaW5nIGluIGRidXMgaXMgc3R1cGlkCisgICAgICAgICAgICAgICAqIGJ1dCB3ZSB3b24ndCBnbyBpbnRvIHRoYXQgaW4gdGhpcyBjb21tZW50ID0pICkKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGlub3RpZnlfcm1fd2F0Y2ggKGlub3RpZnlfZmQsIHdkKTsKKyAgICAgICAgICAgICAgbmV3X3dkc1tpXSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIG51bV93ZHMgPSBpOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfRElSU19UT19XQVRDSDsgaSsrKQorICAgIHsKKyAgICAgIHdkc1tpXSA9IG5ld193ZHNbaV07CisgICAgICBkaXJzW2ldID0gbmV3X2RpcnNbaV07CisgICAgfQorCisgb3V0OjsKK30KKworI2luY2x1ZGUgPHN0ZGlvLmg+CitzdGF0aWMgdm9pZAorX3NodXRkb3duX2lub3RpZnkgKHZvaWQgKmRhdGEpCit7CisgIERCdXNMaXN0ICplbXB0eSA9IE5VTEw7CisKKyAgaWYgKGlub3RpZnlfZmQgPT0gLTEpCisgICAgcmV0dXJuOworCisgIF9zZXRfd2F0Y2hlZF9kaXJzX2ludGVybmFsICgmZW1wdHkpOworCisgIGNsb3NlIChpbm90aWZ5X2ZkKTsKKyAgaW5vdGlmeV9mZCA9IC0xOworICBpZiAod2F0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gsIF9pbm90aWZ5X3dhdGNoX2NhbGxiYWNrLCBOVUxMKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKKyAgICB9CisgIHdhdGNoID0gTlVMTDsKKyAgbG9vcCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK19pbml0X2lub3RpZnkgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIGludCByZXQgPSAwOworCisgIGlmIChpbm90aWZ5X2ZkID09IC0xKQorICAgIHsKKyNpZmRlZiBIQVZFX0lOT1RJRllfSU5JVDEKKyAgICAgIGlub3RpZnlfZmQgPSBpbm90aWZ5X2luaXQxIChJTl9DTE9FWEVDKTsKKyAgICAgIC8qIFRoaXMgZW5zdXJlcyB3ZSBzdGlsbCBydW4gb24gb2xkZXIgTGludXgga2VybmVscy4KKyAgICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTIzOTU3CisgICAgICAgKi8KKyAgICAgIGlmIChpbm90aWZ5X2ZkIDwgMCkKKyAgICAgICAgaW5vdGlmeV9mZCA9IGlub3RpZnlfaW5pdCAoKTsKKyNlbHNlCisgICAgICBpbm90aWZ5X2ZkID0gaW5vdGlmeV9pbml0ICgpOworI2VuZGlmCisgICAgICBpZiAoaW5vdGlmeV9mZCA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBpbml0aWFsaXplIGlub3RpZnlcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBsb29wID0gYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpOworICAgICAgX2RidXNfbG9vcF9yZWYgKGxvb3ApOworCisgICAgICB3YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoaW5vdGlmeV9mZCwgREJVU19XQVRDSF9SRUFEQUJMRSwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaGFuZGxlX2lub3RpZnlfd2F0Y2gsIE5VTEwsIE5VTEwpOworCisgICAgICBpZiAod2F0Y2ggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gY3JlYXRlIGlub3RpZnkgd2F0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbG9vcF9hZGRfd2F0Y2ggKGxvb3AsIHdhdGNoLCBfaW5vdGlmeV93YXRjaF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBhZGQgcmVsb2FkIHdhdGNoIHRvIG1haW4gbG9vcCIpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgd2F0Y2ggPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoX3NodXRkb3duX2lub3RpZnksIE5VTEwpKQorICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmVnaXN0ZXIgc2h1dGRvd24gZnVuYyIpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgd2F0Y2ggPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgfQorICAgIH0KKworICByZXQgPSAxOworCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2J1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcmVjdG9yaWVzKQoreworICBpZiAoIV9pbml0X2lub3RpZnkgKGNvbnRleHQpKQorICAgIHJldHVybjsKKworICBfc2V0X3dhdGNoZWRfZGlyc19pbnRlcm5hbCAoZGlyZWN0b3JpZXMpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2Rpci13YXRjaC1rcXVldWUuYyBiL2RidXMtMS40LjEwL2J1cy9kaXItd2F0Y2gta3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0MzZlYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9kaXItd2F0Y2gta3F1ZXVlLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGlyLXdhdGNoLWtxdWV1ZS5jICBPUyBzcGVjaWZpYyBkaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZXZlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYnVzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlICJkaXItd2F0Y2guaCIKKworI2RlZmluZSBNQVhfRElSU19UT19XQVRDSCAxMjgKKworc3RhdGljIGludCBrcSA9IC0xOworc3RhdGljIGludCBmZHNbTUFYX0RJUlNfVE9fV0FUQ0hdOworc3RhdGljIGNoYXIgKmRpcnNbTUFYX0RJUlNfVE9fV0FUQ0hdOworc3RhdGljIGludCBudW1fZmRzID0gMDsKK3N0YXRpYyBEQnVzV2F0Y2ggKndhdGNoID0gTlVMTDsKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcCA9IE5VTEw7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2txdWV1ZV93YXRjaF9jYWxsYmFjayAoREJ1c1dhdGNoICp3YXRjaCwgdW5zaWduZWQgaW50IGNvbmRpdGlvbiwgdm9pZCAqZGF0YSkKK3sKKyAgcmV0dXJuIGRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfaGFuZGxlX2txdWV1ZV93YXRjaCAoREJ1c1dhdGNoICp3YXRjaCwgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpkYXRhKQoreworICBzdHJ1Y3Qga2V2ZW50IGV2OworICBzdHJ1Y3QgdGltZXNwZWMgbnVsbHRzID0geyAwLCAwIH07CisgIGludCByZXM7CisgIHBpZF90IHBpZDsKKworICByZXMgPSBrZXZlbnQgKGtxLCBOVUxMLCAwLCAmZXYsIDEsICZudWxsdHMpOworCisgIC8qIFNsZWVwIGZvciBoYWxmIGEgc2Vjb25kIHRvIGF2b2lkIGEgcmFjZSB3aGVuIGZpbGVzIGFyZSBpbnN0YWxsKDEpJ2QKKyAgICogdG8gc3lzdGVtLmQuICovCisgIHVzbGVlcCg1MDAwMDApOworCisgIGlmIChyZXMgPiAwKQorICAgIHsKKyAgICAgIHBpZCA9IGdldHBpZCAoKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nIFNJR0hVUCBzaWduYWwgb24gcmVjZXB0aW9uIG9mIGEga2V2ZW50XG4iKTsKKyAgICAgICh2b2lkKSBraWxsIChwaWQsIFNJR0hVUCk7CisgICAgfQorICBlbHNlIGlmIChyZXMgPCAwICYmIGVycm5vID09IEVCQURGKQorICAgIHsKKyAgICAgIGtxID0gLTE7CisgICAgICBpZiAod2F0Y2ggIT0gTlVMTCkKKwl7CisJICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gsIF9rcXVldWVfd2F0Y2hfY2FsbGJhY2ssIE5VTEwpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisJICB3YXRjaCA9IE5VTEw7CisJfQorICAgICAgcGlkID0gZ2V0cGlkICgpOworICAgICAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgU0lHSFVQIHNpZ25hbCBzaW5jZSBrcXVldWUgaGFzIGJlZW4gY2xvc2VkXG4iKTsKKyAgICAgICh2b2lkKSBraWxsIChwaWQsIFNJR0hVUCk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitfaW5pdF9rcXVldWUgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIGludCByZXQgPSAwOworCisgIGlmIChrcSA8IDApCisgICAgeworCisgICAgICBrcSA9IGtxdWV1ZSAoKTsKKyAgICAgIGlmIChrcSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IGNyZWF0ZSBrcXVldWU7IGVycm9yICclcydcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAgIGxvb3AgPSBidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCk7CisKKyAgICAgICAgd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGtxLCBEQlVTX1dBVENIX1JFQURBQkxFLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2hhbmRsZV9rcXVldWVfd2F0Y2gsIE5VTEwsIE5VTEwpOworCisJaWYgKHdhdGNoID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBjcmVhdGUga3F1ZXVlIHdhdGNoXG4iKTsKKwkgICAgY2xvc2UgKGtxKTsKKwkgICAga3EgPSAtMTsKKwkgICAgZ290byBvdXQ7CisJICB9CisKKwlpZiAoIV9kYnVzX2xvb3BfYWRkX3dhdGNoIChsb29wLCB3YXRjaCwgX2txdWV1ZV93YXRjaF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBhZGQgcmVsb2FkIHdhdGNoIHRvIG1haW4gbG9vcCIpOworCSAgICBjbG9zZSAoa3EpOworCSAgICBrcSA9IC0xOworCSAgICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworCSAgICB3YXRjaCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIG91dDsKKwkgIH0KKyAgICB9CisKKyAgcmV0ID0gMTsKKworb3V0OgorICByZXR1cm4gcmV0OworfQorCit2b2lkCitidXNfc2V0X3dhdGNoZWRfZGlycyAoQnVzQ29udGV4dCAqY29udGV4dCwgREJ1c0xpc3QgKipkaXJlY3RvcmllcykKK3sKKyAgaW50IG5ld19mZHNbTUFYX0RJUlNfVE9fV0FUQ0hdOworICBjaGFyICpuZXdfZGlyc1tNQVhfRElSU19UT19XQVRDSF07CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgaSwgaiwgZiwgZmQ7CisgIHN0cnVjdCBrZXZlbnQgZXY7CisKKyAgaWYgKCFfaW5pdF9rcXVldWUgKGNvbnRleHQpKQorICAgIGdvdG8gb3V0OworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfRElSU19UT19XQVRDSDsgaSsrKQorICAgIHsKKyAgICAgIG5ld19mZHNbaV0gPSAtMTsKKyAgICAgIG5ld19kaXJzW2ldID0gTlVMTDsKKyAgICB9CisKKyAgaSA9IDA7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChkaXJlY3Rvcmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgbmV3X2RpcnNbaSsrXSA9IChjaGFyICopbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGRpcmVjdG9yaWVzLCBsaW5rKTsKKyAgICB9CisKKyAgLyogTG9vayBmb3IgZGlyZWN0b3JpZXMgaW4gYm90aCB0aGUgb2xkIGFuZCBuZXcgc2V0cywgaWYKKyAgICogd2UgZmluZCBvbmUsIG1vdmUgaXRzIGRhdGEgaW50byB0aGUgbmV3IHNldC4KKyAgICovCisgIGZvciAoaSA9IDA7IG5ld19kaXJzW2ldOyBpKyspCisgICAgeworICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9mZHM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChkaXJzW2pdICYmIHN0cmNtcCAobmV3X2RpcnNbaV0sIGRpcnNbal0pID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5ld19mZHNbaV0gPSBmZHNbal07CisJICAgICAgbmV3X2RpcnNbaV0gPSBkaXJzW2pdOworCSAgICAgIGZkc1tqXSA9IC0xOworCSAgICAgIGRpcnNbal0gPSBOVUxMOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBBbnkgZGlyZWN0b3J5IHdlIGZpbmQgaW4gImZkcyIgd2l0aCBhIG5vbnplcm8gZmQgbXVzdAorICAgKiBub3QgYmUgaW4gdGhlIG5ldyBzZXQsIHNvIHBlcmZvcm0gY2xlYW51cCBub3cuCisgICAqLworICBmb3IgKGogPSAwOyBqIDwgbnVtX2ZkczsgaisrKQorICAgIHsKKyAgICAgIGlmIChmZHNbal0gIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZSAoZmRzW2pdKTsKKwkgIGRidXNfZnJlZSAoZGlyc1tqXSk7CisJICBmZHNbal0gPSAtMTsKKwkgIGRpcnNbal0gPSBOVUxMOworCX0KKyAgICB9CisKKyAgZm9yIChpID0gMDsgbmV3X2RpcnNbaV07IGkrKykKKyAgICB7CisgICAgICBpZiAobmV3X2Zkc1tpXSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZJWE1FIC0gbGVzcyBsYW1lIGVycm9yIGhhbmRsaW5nIGZvciBmYWlsaW5nIHRvIGFkZCBhIHdhdGNoOworCSAgICogd2UgbWF5IG5lZWQgdG8gc2xlZXAuCisJICAgKi8KKyAgICAgICAgICBmZCA9IG9wZW4gKG5ld19kaXJzW2ldLCBPX1JET05MWSk7CisgICAgICAgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IG9wZW4gZGlyZWN0b3J5ICclcyc7IGVycm9yICclcydcbiIsIG5ld19kaXJzW2ldLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG5ld19mZHNbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICAgIG5ld19kaXJzW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIEVWX1NFVCAoJmV2LCBmZCwgRVZGSUxUX1ZOT0RFLCBFVl9BREQgfCBFVl9FTkFCTEUgfCBFVl9DTEVBUiwKKyAgICAgICAgICAgICAgICAgIE5PVEVfREVMRVRFIHwgTk9URV9FWFRFTkQgfCBOT1RFX1dSSVRFIHwgTk9URV9SRU5BTUUsIDAsIDApOworICAgICAgICAgIGlmIChrZXZlbnQgKGtxLCAmZXYsIDEsIE5VTEwsIDAsIE5VTEwpID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IHNldHVwIGEga2V2ZW50IGZvciAnJXMnOyBlcnJvciAnJXMnXG4iLCBuZXdfZGlyc1tpXSwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGNsb3NlIChmZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisJICBuZXdfZmRzW2ldID0gZmQ7CisJICBuZXdfZGlyc1tpXSA9IF9kYnVzX3N0cmR1cCAobmV3X2RpcnNbaV0pOworCSAgaWYgKCFuZXdfZGlyc1tpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRklYTUUgaGF2ZSBsZXNzIGxhbWUgaGFuZGxpbmcgZm9yIE9PTSwgd2UganVzdCBzaWxlbnRseSBmYWlsIHRvCisJICAgICAgICogd2F0Y2guICAoSW4gcmVhbGl0eSB0aG91Z2gsIHRoZSB3aG9sZSBPT00gaGFuZGxpbmcgaW4gZGJ1cyBpcworCSAgICAgICAqIHN0dXBpZCBidXQgd2Ugd29uJ3QgZ28gaW50byB0aGF0IGluIHRoaXMgY29tbWVudCA9KSApCisJICAgICAgICovCisgICAgICAgICAgICAgIGNsb3NlIChmZCk7CisJICAgICAgbmV3X2Zkc1tpXSA9IC0xOworCSAgICB9CisJfQorICAgIH0KKworICBudW1fZmRzID0gaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICBmZHNbaV0gPSBuZXdfZmRzW2ldOworICAgICAgZGlyc1tpXSA9IG5ld19kaXJzW2ldOworICAgIH0KKworIG91dDoKKyAgOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2Rpci13YXRjaC5oIGIvZGJ1cy0xLjQuMTAvYnVzL2Rpci13YXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDUyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvZGlyLXdhdGNoLmgKQEAgLTAsMCArMSw0MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXItd2F0Y2guaCAgV2F0Y2ggZGlyZWN0b3JpZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAiYnVzLmgiCisKKyNpZm5kZWYgRElSX1dBVENIX0gKKyNkZWZpbmUgRElSX1dBVENIX0gKKworLyoqCisgKiBVcGRhdGUgdGhlIHNldCBvZiBkaXJlY3RvcmllcyB0byBtb25pdG9yIGZvciBjaGFuZ2VzLiAgVGhlCisgKiBvcGVyYXRpbmctc3lzdGVtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiBhdm9pZCBjcmVhdGluZyBhIHdpbmRvdyB3aGVyZSBhIGRpcmVjdG9yeSBpbiBib3RoIHRoZQorICogb2xkIGFuZCBuZXcgc2V0IGlzbid0IG1vbml0b3JlZC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBUaGUgYnVzIGNvbnRleHQKKyAqIEBwYXJhbSBkaXJzIExpc3Qgb2Ygc3RyaW5ncyB3aGljaCBhcmUgZGlyZWN0b3J5IHBhdGhzCisgKi8KK3ZvaWQgYnVzX3NldF93YXRjaGVkX2RpcnMgKEJ1c0NvbnRleHQgKmNvbnRleHQsIERCdXNMaXN0ICoqZGlycyk7CisKKyNlbmRpZiAvKiBESVJfV0FUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2Rpc3BhdGNoLmMgYi9kYnVzLTEuNC4xMC9idXMvZGlzcGF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA0NzZjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2Rpc3BhdGNoLmMKQEAgLTAsMCArMSw0OTE4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRpc3BhdGNoLmMgIE1lc3NhZ2UgZGlzcGF0Y2hlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0ICBJbWVuZGlvIEhCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiZHJpdmVyLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgVEVTVF9DT05ORUNUSU9OCisvKgorIFRPRE8gYXV0b3Rvb2xzOgorICBtb3ZlIHRvIGJ1aWxkIHN5c3RlbSBhcyBhbHJlYWR5IGRvbmUgZm9yIGNtYWtlCisqLworI2lmZGVmIERCVVNfVU5JWAorI2RlZmluZSBURVNUX0NPTk5FQ1RJT04gImRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlciIKKyNlbHNlCisjZGVmaW5lIFRFU1RfQ09OTkVDVElPTiAidGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MTIzNCIKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9vbmVfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICBCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpZiAoIWJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSAoY29udGV4dCwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gVFJVRTsgLyogc2lsZW50bHkgZG9uJ3Qgc2VuZCBpdCAqLworCisgIGlmIChkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMobWVzc2FnZSkgJiYKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZShjb25uZWN0aW9uLCBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgcmV0dXJuIFRSVUU7IC8qIHNpbGVudGx5IGRvbid0IHNlbmQgaXQgKi8KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGlzcGF0Y2hfbWF0Y2hlcyAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNMaXN0ICpyZWNpcGllbnRzOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBEQnVzTGlzdCAqbGluazsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBzZW5kZXIgYW5kIHJlY2lwaWVudCBjYW4gYm90aCBiZSBOVUxMIGZvciB0aGUgYnVzIGRyaXZlciwKKyAgICogb3IgZm9yIHNpZ25hbHMgd2l0aCBubyBwYXJ0aWN1bGFyIHJlY2lwaWVudAorICAgKi8KKworICBfZGJ1c19hc3NlcnQgKHNlbmRlciA9PSBOVUxMIHx8IGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoc2VuZGVyKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworCisgIGNvbnRleHQgPSBidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKTsKKworICAvKiBGaXJzdCwgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgYWRkcmVzc2VkX3JlY2lwaWVudCwgaWYgdGhlcmUgaXMgb25lLiAqLworICBpZiAoYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5IChjb250ZXh0LCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAobWVzc2FnZSkgJiYKKyAgICAgICAgICAhZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIHNlbmQgbWVzc2FnZSB3aXRoIFVuaXggZmlsZSBkZXNjcmlwdG9ycyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGEgY2xpZW50IHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoYXQuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorCisgICAgICAvKiBEaXNwYXRjaCB0aGUgbWVzc2FnZSAqLworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZCAodHJhbnNhY3Rpb24sIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm93IGRpc3BhdGNoIHRvIG90aGVycyB3aG8gbG9vayBpbnRlcmVzdGVkIGluIHRoaXMgbWVzc2FnZSAqLworICBjb25uZWN0aW9ucyA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29ubmVjdGlvbnMgKHRyYW5zYWN0aW9uKTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgbWF0Y2htYWtlciA9IGJ1c19jb250ZXh0X2dldF9tYXRjaG1ha2VyIChjb250ZXh0KTsKKworICByZWNpcGllbnRzID0gTlVMTDsKKyAgaWYgKCFidXNfbWF0Y2htYWtlcl9nZXRfcmVjaXBpZW50cyAobWF0Y2htYWtlciwgY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY2lwaWVudHMpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcmVjaXBpZW50cyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmRlc3Q7CisKKyAgICAgIGRlc3QgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoIXNlbmRfb25lX21lc3NhZ2UgKGRlc3QsIGNvbnRleHQsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgdHJhbnNhY3Rpb24sICZ0bXBfZXJyb3IpKQorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJlY2lwaWVudHMsIGxpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmcmVjaXBpZW50cyk7CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitidXNfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqc2VuZGVyLCAqc2VydmljZV9uYW1lOworICBEQnVzRXJyb3IgZXJyb3I7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBEQnVzQ29ubmVjdGlvbiAqYWRkcmVzc2VkX3JlY2lwaWVudDsKKworICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisKKyAgdHJhbnNhY3Rpb24gPSBOVUxMOworICBhZGRyZXNzZWRfcmVjaXBpZW50ID0gTlVMTDsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoY29udGV4dCAhPSBOVUxMKTsKKworICAvKiBJZiB3ZSBjYW4ndCBldmVuIGFsbG9jYXRlIGFuIE9PTSBlcnJvciwgd2UganVzdCBnbyB0byBzbGVlcAorICAgKiB1bnRpbCB3ZSBjYW4uCisgICAqLworICB3aGlsZSAoIWJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvciAoY29ubmVjdGlvbikpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIC8qIFJlZiBjb25uZWN0aW9uIGluIGNhc2Ugd2UgZGlzY29ubmVjdCBpdCBhdCBzb21lIHBvaW50IGluIGhlcmUgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgc2VydmljZV9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgeworICAgIGNvbnN0IGNoYXIgKmludGVyZmFjZV9uYW1lLCAqbWVtYmVyX25hbWUsICplcnJvcl9uYW1lOworCisgICAgaW50ZXJmYWNlX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisgICAgbWVtYmVyX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisgICAgZXJyb3JfbmFtZSA9IGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSk7CisKKyAgICBfZGJ1c192ZXJib3NlICgiRElTUEFUQ0g6ICVzICVzICVzIHRvICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9uYW1lID8gaW50ZXJmYWNlX25hbWUgOiAiKG5vIGludGVyZmFjZSkiLAorICAgICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID8gbWVtYmVyX25hbWUgOiAiKG5vIG1lbWJlcikiLAorICAgICAgICAgICAgICAgICAgIGVycm9yX25hbWUgPyBlcnJvcl9uYW1lIDogIihubyBlcnJvciBuYW1lKSIsCisgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID8gc2VydmljZV9uYW1lIDogInBlZXIiKTsKKyAgfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisgIC8qIElmIHNlcnZpY2VfbmFtZSBpcyBOVUxMLCBpZiBpdCdzIGEgc2lnbmFsIHdlIHNlbmQgaXQgdG8gYWxsCisgICAqIGNvbm5lY3Rpb25zIHdpdGggYSBtYXRjaCBydWxlLiBJZiBpdCdzIG5vdCBhIHNpZ25hbCwgdGhlcmUKKyAgICogYXJlIHNvbWUgc3BlY2lhbCBjYXNlcyBoZXJlIGJ1dCBtb3N0bHkgd2UganVzdCBiYWlsIG91dC4KKyAgICovCisgIGlmIChzZXJ2aWNlX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERCdXNDb25uZWN0aW9uIGFsc28gaGFuZGxlcyBzb21lIG9mIHRoZXNlIGF1dG9tYXRpY2FsbHksIHdlIGxlYXZlCisgICAgICAgICAgICogaXQgdG8gZG8gc28uCisgICAgICAgICAgICovCisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQ3JlYXRlIG91ciB0cmFuc2FjdGlvbiAqLworICB0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBBc3NpZ24gYSBzZW5kZXIgdG8gdGhlIG1lc3NhZ2UgKi8KKyAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgc2VuZGVyID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICAgICAgX2RidXNfYXNzZXJ0IChzZW5kZXIgIT0gTlVMTCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIHNlbmRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoJmVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBXZSBuZWVkIHRvIHJlZmV0Y2ggdGhlIHNlcnZpY2UgbmFtZSBoZXJlLCBiZWNhdXNlCisgICAgICAgKiBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciBjYW4gY2F1c2UgdGhlIGhlYWRlciB0byBiZQorICAgICAgICogcmVhbGxvY2F0ZWQsIGFuZCB0aHVzIHRoZSBzZXJ2aWNlX25hbWUgcG9pbnRlciB3aWxsIGJlY29tZQorICAgICAgICogaW52YWxpZC4KKyAgICAgICAqLworICAgICAgc2VydmljZV9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisgICAgfQorCisgIGlmIChzZXJ2aWNlX25hbWUgJiYKKyAgICAgIHN0cmNtcCAoc2VydmljZV9uYW1lLCBEQlVTX1NFUlZJQ0VfREJVUykgPT0gMCkgLyogdG8gYnVzIGRyaXZlciAqLworICAgIHsKKyAgICAgIGlmICghYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5IChjb250ZXh0LCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBtZXNzYWdlLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNlY3VyaXR5IHBvbGljeSByZWplY3RlZCBtZXNzYWdlXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR2l2aW5nIG1lc3NhZ2UgdG8gJXNcbiIsIERCVVNfU0VSVklDRV9EQlVTKTsKKyAgICAgIGlmICghYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIG1lc3NhZ2UsICZlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAoIWJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpIC8qIGNsaWVudHMgbXVzdCB0YWxrIHRvIGJ1cyBkcml2ZXIgZmlyc3QgKi8KKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiUmVjZWl2ZWQgbWVzc2FnZSBmcm9tIG5vbi1yZWdpc3RlcmVkIGNsaWVudC4gRGlzY29ubmVjdGluZy5cbiIpOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAoc2VydmljZV9uYW1lICE9IE5VTEwpIC8qIHJvdXRlIHRvIG5hbWVkIHNlcnZpY2UgKi8KKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHNlcnZpY2Vfc3RyaW5nOworICAgICAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgICAgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlX25hbWUgIT0gTlVMTCk7CisKKyAgICAgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlX3N0cmluZywgc2VydmljZV9uYW1lKTsKKyAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnNlcnZpY2Vfc3RyaW5nKTsKKworICAgICAgaWYgKHNlcnZpY2UgPT0gTlVMTCAmJiBkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgICAgICAgICAvKiBXZSBjYW4ndCBkbyB0aGUgc2VjdXJpdHkgcG9saWN5IGNoZWNrIGhlcmUsIHNpbmNlIHRoZSBhZGRyZXNzZWQKKyAgICAgICAgICAgKiByZWNpcGllbnQgc2VydmljZSBkb2Vzbid0IGV4aXN0IHlldC4gV2UgZG8gaXQgYmVmb3JlIHNlbmRpbmcgdGhlCisgICAgICAgICAgICogbWVzc2FnZSBhZnRlciB0aGUgc2VydmljZSBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGFjdGl2YXRpb24gPSBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAoY29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UgKGFjdGl2YXRpb24sIGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgc2VydmljZV9uYW1lLCAmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSgpIGZhaWxlZDogJXNcbiIsIGVycm9yLm5hbWUpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05BTUVfSEFTX05PX09XTkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50ID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnZpY2UpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3cgc2VuZCB0aGUgbWVzc2FnZSB0byBpdHMgZGVzdGluYXRpb24gKG9yIG5vdCwgaWYKKyAgICogYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBOVUxMKSwgYW5kIG1hdGNoIGl0IGFnYWluc3Qgb3RoZXIgY29ubmVjdGlvbnMnCisgICAqIG1hdGNoIHJ1bGVzLgorICAgKi8KKyAgaWYgKCFidXNfZGlzcGF0Y2hfbWF0Y2hlcyAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UsICZlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyBvdXQ6CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHdlIGRpc2Nvbm5lY3RlZCBpdCwgd2Ugd29uJ3QgYm90aGVyIHRvIHNlbmQgaXQgYW55IGVycm9yCisgICAgICAgICAgICogbWVzc2FnZXMuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vdCBzZW5kaW5nIGVycm9yIHRvIGNvbm5lY3Rpb24gd2UgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9zZW5kX29vbV9lcnJvciAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgICAgICAgICAvKiBjYW5jZWwgdHJhbnNhY3Rpb24gZHVlIHRvIE9PTSAqLworICAgICAgICAgIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgIHRyYW5zYWN0aW9uID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogVHJ5IHRvIHNlbmQgdGhlIHJlYWwgZXJyb3IsIGlmIG5vIG1lbSB0byBkbyB0aGF0LCBzZW5kCisgICAgICAgICAgICogdGhlIE9PTSBlcnJvcgorICAgICAgICAgICAqLworICAgICAgICAgIF9kYnVzX2Fzc2VydCAodHJhbnNhY3Rpb24gIT0gTlVMTCk7CisgICAgICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9lcnJvcl9yZXBseSAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgICAgICAgICAgICAgIC8qIGNhbmNlbCB0cmFuc2FjdGlvbiBkdWUgdG8gT09NICovCisgICAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJ1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorCisgIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitidXNfZGlzcGF0Y2hfbWVzc2FnZV9maWx0ZXIgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgcmV0dXJuIGJ1c19kaXNwYXRjaCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfZGlzcGF0Y2hfbWVzc2FnZV9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2Rpc3BhdGNoX3JlbW92ZV9jb25uZWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogSGVyZSB3ZSB0ZWxsIHRoZSBidXMgZHJpdmVyIHRoYXQgd2Ugd2FudCB0byBnZXQgb2ZmLiAqLworICBidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uIChjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19kaXNwYXRjaF9tZXNzYWdlX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogVGhpcyBpcyB1c2VkIHRvIGtub3cgd2hldGhlciB3ZSBuZWVkIHRvIGJsb2NrIGluIG9yZGVyIHRvIGZpbmlzaAorICogc2VuZGluZyBhIG1lc3NhZ2UsIG9yIHdoZXRoZXIgdGhlIGluaXRpYWwgZGJ1c19jb25uZWN0aW9uX3NlbmQoKQorICogYWxyZWFkeSBmbHVzaGVkIHRoZSBxdWV1ZS4KKyAqLworI2RlZmluZSBTRU5EX1BFTkRJTkcoY29ubmVjdGlvbikgKGRidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZCAoY29ubmVjdGlvbikpCisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2sxRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0KTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2syRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitzdGF0aWMgZGJ1c19ib29sX3QgY2hlY2tfbm9fbGVmdG92ZXJzIChCdXNDb250ZXh0ICpjb250ZXh0KTsKKworc3RhdGljIHZvaWQKK2Jsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqd2hhdF9pc19leHBlY3RlZCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoImV4cGVjdGluZzogJXNcbiIsIHdoYXRfaXNfZXhwZWN0ZWQpOworCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfQ09NUExFVEUgJiYKKyAgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBidXNfdGVzdF9ydW5fYnVzX2xvb3AgKGNvbnRleHQsIFRSVUUpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIlNwaW5uaW5nIHRvIGF1dGggY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisgIHdoaWxlICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uKSAmJgorICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KKyAgX2RidXNfdmVyYm9zZSAoIiAuLi4gZG9uZSBzcGlubmluZyB0byBhdXRoIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworfQorCisvKiBjb21wZW5zYXRlIGZvciBmYWN0IHRoYXQgcG9wX21lc3NhZ2UoKSBjYW4gcmV0dXJuICNOVUxMIGR1ZSB0byBPT00gKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3BvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIHJldHVybiBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitib3Jyb3dfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICB3aGlsZSAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pID09CisgICAgICAgICBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICByZXR1cm4gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3dhcm5fdW5leHBlY3RlZF9yZWFsIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsaW5lKQoreworICBpZiAobWVzc2FnZSkKKyAgICBfZGJ1c193YXJuICgiJXM6JWQgcmVjZWl2ZWQgbWVzc2FnZSBpbnRlcmZhY2UgXCIlc1wiIG1lbWJlciBcIiVzXCIgZXJyb3IgbmFtZSBcIiVzXCIgb24gJXAsIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbGluZSwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQpOworICBlbHNlCisgICAgX2RidXNfd2FybiAoIiVzOiVkIHJlY2VpdmVkIG5vIG1lc3NhZ2Ugb24gJXAsIGV4cGVjdGluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbGluZSwgY29ubmVjdGlvbiwgZXhwZWN0ZWQpOworfQorCisjZGVmaW5lIHdhcm5fdW5leHBlY3RlZChjb25uZWN0aW9uLCBtZXNzYWdlLCBleHBlY3RlZCkgXAorICB3YXJuX3VuZXhwZWN0ZWRfcmVhbCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgZXhwZWN0ZWQsIF9EQlVTX0ZVTkNUSU9OX05BTUUsIF9fTElORV9fKQorCitzdGF0aWMgdm9pZAordmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJSZWNlaXZlZCBtZXNzYWdlIGludGVyZmFjZSBcIiVzXCIgbWVtYmVyIFwiJXNcIiBlcnJvciBuYW1lIFwiJXNcIiBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKK30KKwordHlwZWRlZiBlbnVtCit7CisgIFNFUlZJQ0VfQ1JFQVRFRCwKKyAgT1dORVJfQ0hBTkdFRCwKKyAgU0VSVklDRV9ERUxFVEVECit9IFNlcnZpY2VJbmZvS2luZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgU2VydmljZUluZm9LaW5kIGV4cGVjdGVkX2tpbmQ7CisgIGNvbnN0IGNoYXIgKmV4cGVjdGVkX3NlcnZpY2VfbmFtZTsKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworICBEQnVzQ29ubmVjdGlvbiAqc2tpcF9jb25uZWN0aW9uOworfSBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSAqZCA9IGRhdGE7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKworICBpZiAoZC0+ZXhwZWN0ZWRfa2luZCA9PSBTRVJWSUNFX0NSRUFURUQKKyAgICAgICYmIGNvbm5lY3Rpb24gPT0gZC0+c2tpcF9jb25uZWN0aW9uKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZC0+ZmFpbGVkID0gVFJVRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgbWVzc2FnZSBvbiAlcCwgZXhwZWN0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgIk5hbWVPd25lckNoYW5nZWQiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAoIWRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiKSkKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICByZWdldF9zZXJ2aWNlX2luZm9fZGF0YToKKyAgICAgIHNlcnZpY2VfbmFtZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgbmV3X293bmVyID0gTlVMTDsKKworICAgICAgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZvbGRfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuZXdfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZWdldF9zZXJ2aWNlX2luZm9fZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKChkLT5leHBlY3RlZF9raW5kID09IFNFUlZJQ0VfQ1JFQVRFRCAgICAmJiAoIG9sZF9vd25lclswXSB8fCAhbmV3X293bmVyWzBdKSkKKyAgICAgICAgICB8fCAoZC0+ZXhwZWN0ZWRfa2luZCA9PSBPV05FUl9DSEFOR0VEICAgJiYgKCFvbGRfb3duZXJbMF0gfHwgIW5ld19vd25lclswXSkpCisgICAgICAgICAgfHwgKGQtPmV4cGVjdGVkX2tpbmQgPT0gU0VSVklDRV9ERUxFVEVEICYmICghb2xkX293bmVyWzBdIHx8ICBuZXdfb3duZXJbMF0pKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJpbmNvbnNpc3RlbnQgTmFtZU93bmVyQ2hhbmdlZCBhcmd1bWVudHNcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHNlcnZpY2VfbmFtZSwgZC0+ZXhwZWN0ZWRfc2VydmljZV9uYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIGluZm8gb24gc2VydmljZSAlcywgZ290IGluZm8gb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZC0+ZXhwZWN0ZWRfc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCpzZXJ2aWNlX25hbWUgPT0gJzonICYmIG5ld19vd25lclswXQorICAgICAgICAgICYmIHN0cmNtcCAoc2VydmljZV9uYW1lLCBuZXdfb3duZXIpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiaW5jb25zaXN0ZW50IFNlcnZpY2VPd25lZENoYW5nZWQgbWVzc2FnZSAoXCIlc1wiIFsgJXMgLT4gJXMgXSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBvbGRfb3duZXIsIG5ld19vd25lcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgZC0+ZmFpbGVkID0gRkFMU0U7CisKKyBvdXQ6CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiAhZC0+ZmFpbGVkOworfQorCisKK3N0YXRpYyB2b2lkCitraWxsX2NsaWVudF9jb25uZWN0aW9uIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBjaGFyICpiYXNlX3NlcnZpY2U7CisgIGNvbnN0IGNoYXIgKnM7CisgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKworICBfZGJ1c192ZXJib3NlICgia2lsbGluZyBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBzID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChzICE9IE5VTEwpOworCisgIHdoaWxlICgoYmFzZV9zZXJ2aWNlID0gX2RidXNfc3RyZHVwIChzKSkgPT0gTlVMTCkKKyAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyoga2ljayBpbiB0aGUgZGlzY29ubmVjdCBoYW5kbGVyIHRoYXQgdW5yZWZzIHRoZSBjb25uZWN0aW9uICovCisgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIF9kYnVzX2Fzc2VydCAoYnVzX3Rlc3RfY2xpZW50X2xpc3RlZCAoY29ubmVjdGlvbikpOworCisgIC8qIFJ1biBkaXNjb25uZWN0IGhhbmRsZXIgaW4gdGVzdC5jICovCisgIGlmIChidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9vbmVfbWVzc2FnZSAoY29ubmVjdGlvbikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic29tZXRoaW5nIHJlY2VpdmVkIG9uIGNvbm5lY3Rpb24gYmVpbmcga2lsbGVkIG90aGVyIHRoYW4gdGhlIGRpc2Nvbm5lY3QiKTsKKworICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICBjb25uZWN0aW9uID0gTlVMTDsKKyAgX2RidXNfYXNzZXJ0ICghYnVzX3Rlc3RfY2xpZW50X2xpc3RlZCAoY29ubmVjdGlvbikpOworCisgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfREVMRVRFRDsKKyAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2U7CisgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gTlVMTDsKKworICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICBkYnVzX2ZyZWUgKGJhc2Vfc2VydmljZSk7CisKKyAgaWYgKHNvY2QuZmFpbGVkKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgdGhlIGV4cGVjdGVkIE5hbWVPd25lckNoYW5nZWQgKGRlbGV0aW9uKSBtZXNzYWdlcyIpOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzdHVmZiBsZWZ0IGluIG1lc3NhZ2UgcXVldWVzIGFmdGVyIGRpc2Nvbm5lY3RpbmcgYSBjbGllbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2tpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogVGhpcyBraWxscyB0aGUgY29ubmVjdGlvbiB3aXRob3V0IGV4cGVjdGluZyBpdCB0byBhZmZlY3QKKyAgICogdGhlIHJlc3Qgb2YgdGhlIGJ1cy4KKyAgICovCisgIF9kYnVzX3ZlcmJvc2UgKCJVbmNoZWNrZWQga2lsbCBvZiBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgLyogZGlzcGF0Y2hpbmcgZGlzY29ubmVjdCBoYW5kbGVyIHdpbGwgdW5yZWYgb25jZSAqLworICBpZiAoYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgKGNvbm5lY3Rpb24pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm1lc3NhZ2Ugb3RoZXIgdGhhbiBkaXNjb25uZWN0IGRpc3BhdGNoZWQgYWZ0ZXIgZmFpbHVyZSB0byByZWdpc3RlciIpOworCisgIF9kYnVzX2Fzc2VydCAoIWJ1c190ZXN0X2NsaWVudF9saXN0ZWQgKGNvbm5lY3Rpb24pKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworfSBDaGVja05vTWVzc2FnZXNEYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vX21lc3NhZ2VzX2ZvcmVhY2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIENoZWNrTm9NZXNzYWdlc0RhdGEgKmQgPSBkYXRhOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJubyBtZXNzYWdlcyIpOworCisgICAgICBkLT5mYWlsZWQgPSBUUlVFOworICAgIH0KKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICByZXR1cm4gIWQtPmZhaWxlZDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19ub19sZWZ0b3ZlcnMgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIENoZWNrTm9NZXNzYWdlc0RhdGEgbm1kOworCisgIG5tZC5mYWlsZWQgPSBGQUxTRTsKKyAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19ub19tZXNzYWdlc19mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZubWQpOworCisgIGlmIChubWQuZmFpbGVkKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJsZWZ0b3ZlciBtZXNzYWdlIGZvdW5kXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19oZWxsb19tZXNzYWdlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2UgKm5hbWVfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICphY3F1aXJlZDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBuYW1lID0gTlVMTDsKKyAgYWNxdWlyZWQgPSBOVUxMOworICBtZXNzYWdlID0gTlVMTDsKKyAgbmFtZV9tZXNzYWdlID0gTlVMTDsKKworICBfZGJ1c192ZXJib3NlICgiY2hlY2tfaGVsbG9fbWVzc2FnZSBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChtZXNzYWdlLCAiIikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWQgKHByZXN1bWFibHkgYXV0aCBmYWlsZWQpXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZCAocHJlc3VtYWJseSBhdXRoIGZhaWxlZClcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gSGVsbG8iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIChwcmVzdW1hYmx5IGF1dGggZmFpbGVkKVxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJIZWxsbyIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibWV0aG9kIHJldHVybiBmb3IgSGVsbG8iKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICByZXRyeV9nZXRfaGVsbG9fbmFtZToKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIGdldCBzZXJ2aWNlIG5hbWUgYXJnIGZyb20gaGVsbG9cbiIpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeV9nZXRfaGVsbG9fbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQgdG8gaGVsbG9cbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGhlbGxvIG5hbWU6ICVzXG4iLCBuYW1lKTsKKworICAgICAgd2hpbGUgKCFkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24sIG5hbWUpKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgICAgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gbmFtZTsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247IC8qIHdlIGhhdmVuJ3QgZG9uZSBBZGRNYXRjaCBzbyB3b24ndCBnZXQgaXQgb3Vyc2VsdmVzICovCisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIG5hbWVfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAvKiBDbGllbnQgc2hvdWxkIGFsc28gaGF2ZSBnb3R0ZW4gU2VydmljZUFjcXVpcmVkICovCisKKyAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RpbmcgJXMsIGdvdCBub3RoaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgaWYgKCEgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RpbmcgJXMsIGdvdCBzbXRoZyBlbHNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgcmV0cnlfZ2V0X2FjcXVpcmVkX25hbWU6CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhY3F1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gZ2V0IHNlcnZpY2UgbmFtZSBhcmcgZnJvbSBhY3F1aXJlZFxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9hY3F1aXJlZF9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgc2luZ2xlIHN0cmluZyBhcmd1bWVudCB0byBTZXJ2aWNlQWNxdWlyZWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGFjcXVpcmVkIG5hbWU6ICVzXG4iLCBhY3F1aXJlZCk7CisKKyAgICAgIGlmIChzdHJjbXAgKGFjcXVpcmVkLCBuYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkFjcXVpcmVkIG5hbWUgaXMgJXMgYnV0IGV4cGVjdGVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkLCBuYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgYWNxdWlyZWQgPSBOVUxMOworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgX2RidXNfdmVyYm9zZSAoImVuZGluZyAtIHJldHZhbCA9ICVkXG4iLCByZXR2YWwpOworCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChuYW1lX21lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChuYW1lX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZG91YmxlX2hlbGxvX21lc3NhZ2UgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEhlbGxvIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJIZWxsbyIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibWV0aG9kIHJldHVybiBmb3IgSGVsbG8iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlX25hbWU7CisgIGRidXNfdWludDMyX3QgdWlkOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgZm9yICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBiYXNlX3NlcnZpY2VfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uVW5peFVzZXIiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZF9yZXR1cm4gZm9yIEdldENvbm5lY3Rpb25Vbml4VXNlciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIHJldHJ5X2dldF9wcm9wZXJ0eToKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSB0byBnZXQgdWlkIGJ5IEdldENvbm5lY3Rpb25Vbml4VXNlclxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9wcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9VSU5UMzIgZnJvbSBHZXRDb25uZWN0aW9uVW5peFVzZXJcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlX25hbWU7CisgIGRidXNfdWludDMyX3QgcGlkOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgZm9yICVwXG4iLCBjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGJhc2Vfc2VydmljZV9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChjb25uZWN0aW9uKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZiYXNlX3NlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgLyogc2VuZCBvdXIgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsgLyogYmVjYXVzZSB3ZSBtYXkgZ2V0IGRpc2Nvbm5lY3RlZCAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorI2lmZGVmIERCVVNfV0lOCisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsIERCVVNfRVJST1JfVU5JWF9QUk9DRVNTX0lEX1VOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgLyogV2UgYXJlIGV4cGVjdGluZyB0aGlzIGVycm9yLCBzaW5jZSB3ZSBrbm93IGluIHRoZSB0ZXN0IHN1aXRlIHdlIGFyZW4ndAorICAgICAgICAgICAqIHRhbGtpbmcgdG8gYSBjbGllbnQgcnVubmluZyBvbiBVTklYCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbmRvd3MgY29ycmVjdGx5IGRvZXMgbm90IHN1cHBvcnQgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSURcbiIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBEQlVTX1dJTgorICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgdG8gZmFpbCBvbiBXaW5kb3dzIik7CisgICAgICBnb3RvIG91dDsKKyNlbHNlCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCBleHBlY3RlZCAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kX3JldHVybiBmb3IgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICByZXRyeV9nZXRfcHJvcGVydHk6CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gZ2V0IHBpZCBieSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRFxuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9wcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9VSU5UMzIgZnJvbSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiB0ZXN0IGlmIHJldHVybmVkIHBpZCBpcyB0aGUgc2FtZSBhcyBvdXIgb3duIHBpZAorICAgICAgICAgICAqCisgICAgICAgICAgICogQHRvZG8gSXQgd291bGQgcHJvYmFibHkgYmUgZ29vZCB0byByZXN0cnVjdHVyZSB0aGUgdGVzdHMKKyAgICAgICAgICAgKiAgICAgICBpbiBhIHdheSBzbyBvdXIgcGFyZW50IGlzIHRoZSBidXMgdGhhdCB3ZSdyZSB0ZXN0aW5nCisgICAgICAgICAgICogICAgICAgY2F1c2UgdGhlbiB3ZSBjYW4gdGVzdCB0aGF0IHRoZSBwaWQgcmV0dXJuZWQgbWF0Y2hlcworICAgICAgICAgICAqICAgICAgIGdldHBwaWQoKQorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwaWQgIT0gKGRidXNfdWludDMyX3QpIF9kYnVzX2dldHBpZCAoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJSZXN1bHQgZnJvbSBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCBpcyBub3Qgb3VyIG93biBwaWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qICFEQlVTX1dJTiAqLworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19hZGRfbWF0Y2hfYWxsIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICplbXB0eSA9ICIiOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19hZGRfbWF0Y2hfYWxsIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBlbXB0eSBzdHJpbmcgbWF0Y2ggcnVsZSBtYXRjaGVzIGV2ZXJ5dGhpbmcgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsIERCVVNfVFlQRV9TVFJJTkcsICZlbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gQWRkTWF0Y2giKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSA9PSBzZXJpYWwpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJtZXRob2QgcmV0dXJuIGZvciBBZGRNYXRjaCIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfaGVsbG9fY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfQ09OTkVDVElPTiwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgZGlkbid0IHN1Y2Nlc3NmdWxseSByZWdpc3Rlciwgc28gd2UgY2FuJ3QKKyAgICAgICAqIGRvIHRoZSB1c3VhbCBraWxsX2NsaWVudF9jb25uZWN0aW9uKCkgY2hlY2tzCisgICAgICAgKi8KKyAgICAgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChjb25uZWN0aW9uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX2FkZF9tYXRjaF9hbGwgKGNvbnRleHQsIGNvbm5lY3Rpb24pKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb24gKGNvbnRleHQsIGNvbm5lY3Rpb24pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBOT05FWElTVEVOVF9TRVJWSUNFX05BTUUgInRlc3QudGhpcy5zZXJ2aWNlLmRvZXMubm90LmV4aXN0LmV3dW9pdXJqZGZ4Y3ZuIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqbm9uZXhpc3RlbnQgPSBOT05FWElTVEVOVF9TRVJWSUNFX05BTUU7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBGQUxTRSk7CisKKyAgZmxhZ3MgPSAwOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZub25leGlzdGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBBY3RpdmF0ZVNlcnZpY2Ugb24gbm9uZXhpc3RlbnQiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIE5PTkVYSVNURU5UX1NFUlZJQ0VfTkFNRSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2VfYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoTk9ORVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TRVJWSUNFX1VOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGV4cGVjdGVkIGFsc28gKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYWN0aXZhdGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICBOT05FWElTVEVOVF9TRVJWSUNFX05BTUUpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19iYXNlX3NlcnZpY2VfYWN0aXZhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluaXRpYWxfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipiYXNlX3NlcnZpY2VfcCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICpiYXNlX3NlcnZpY2UsICpiYXNlX3NlcnZpY2VfZnJvbV9idXMsICpvbGRfb3duZXI7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBiYXNlX3NlcnZpY2UgPSBOVUxMOworICBvbGRfb3duZXIgPSBOVUxMOworICBiYXNlX3NlcnZpY2VfZnJvbV9idXMgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBpbml0aWFsX21lc3NhZ2U7CisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgcmVnZXRfc2VydmljZV9uYW1lX2FyZzoKKyAgICAgIGJhc2Vfc2VydmljZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzID0gTlVMTDsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZvbGRfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJhc2Vfc2VydmljZV9mcm9tX2J1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSAlcyBkb2Vzbid0IGhhdmUgYSBzZXJ2aWNlIG5hbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmICgqYmFzZV9zZXJ2aWNlICE9ICc6JykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBiYXNlIHNlcnZpY2UgYWN0aXZhdGlvbiwgZ290IFwiJXNcIiBpbnN0ZWFkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfc2VydmljZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCAoYmFzZV9zZXJ2aWNlLCBiYXNlX3NlcnZpY2VfZnJvbV9idXMpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgYmFzZSBzZXJ2aWNlIGFjdGl2YXRpb24sIGdvdCBcIiVzXCIgaW5zdGVhZCB3aXRoIG93bmVyIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UsIGJhc2Vfc2VydmljZV9mcm9tX2J1cyk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKG9sZF9vd25lclswXSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJSZWNlaXZlZCBhbiBvbGRfb3duZXIgYXJndW1lbnQgZHVyaW5nIGJhc2Ugc2VydmljZSBhY3RpdmF0aW9uLCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb2xkX293bmVyKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0NSRUFURUQ7CisgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIGZvciBiYXNlIHNlcnZpY2UiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChiYXNlX3NlcnZpY2VfcCkKKyAgICAqYmFzZV9zZXJ2aWNlX3AgPSBiYXNlX3NlcnZpY2U7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VydmljZV9hY3RpdmF0ZWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICphY3RpdmF0ZWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluaXRpYWxfbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBkYnVzX3VpbnQzMl90IGFjdGl2YXRpb25fcmVzdWx0OworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBtZXNzYWdlID0gaW5pdGlhbF9tZXNzYWdlOworICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpKQorICAgIHsKKyAgICAgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKmJhc2Vfc2VydmljZV9mcm9tX2J1cywgKm9sZF9vd25lcjsKKworICAgIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc6CisgICAgICBzZXJ2aWNlX25hbWUgPSBOVUxMOworICAgICAgb2xkX293bmVyID0gTlVMTDsKKyAgICAgIGJhc2Vfc2VydmljZV9mcm9tX2J1cyA9IE5VTEw7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlX2Zyb21fYnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9uYW1lX2FyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlICVzIGRvZXNuJ3QgaGF2ZSBhIHNlcnZpY2UgbmFtZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCAoc2VydmljZV9uYW1lLCBhY3RpdmF0ZWRfbmFtZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCB0byBzZWUgc2VydmljZSAlcyBjcmVhdGVkLCBzYXcgJXMgaW5zdGVhZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZWRfbmFtZSwgc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChiYXNlX3NlcnZpY2VfbmFtZSwgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk5hbWVPd25lckNoYW5nZWQgcmVwb3J0cyB3cm9uZyBiYXNlIHNlcnZpY2U6ICVzIG93bmVyLCBleHBlY3RlZCAlcyBpbnN0ZWFkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfc2VydmljZV9mcm9tX2J1cywgYmFzZV9zZXJ2aWNlX25hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChvbGRfb3duZXJbMF0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiZXhwZWN0ZWQgYSAlcywgZ290IGEgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQgKGNoYW5nZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0NSRUFURUQ7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBzZXJ2aWNlX25hbWU7CisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBzZXJ2aWNlX25hbWUgPSBOVUxMOworICAgICAgb2xkX293bmVyID0gTlVMTDsKKyAgICAgIGJhc2Vfc2VydmljZV9mcm9tX2J1cyA9IE5VTEw7CisKKyAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBhIHJlcGx5IHRvICVzLCBnb3Qgbm90aGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIGZvciB0aGUgYWN0aXZhdGVkIG5hbWUiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAicmVwbHkgdG8gU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBhY3RpdmF0aW9uX3Jlc3VsdCA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmYWN0aXZhdGlvbl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgaWYgKCFkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGhhdmUgYWN0aXZhdGlvbiByZXN1bHQgZmlyc3QgYXJndW1lbnQgdG8gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGFjdGl2YXRpb25fcmVzdWx0ID09IERCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUykKKyAgICAgICAgOyAvKiBHb29kICovCisgICAgICBlbHNlIGlmIChhY3RpdmF0aW9uX3Jlc3VsdCA9PSBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORykKKyAgICAgICAgOyAvKiBHb29kIGFsc28gKi8KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJBY3RpdmF0aW9uIHJlc3VsdCB3YXMgJXUsIG5vIGdvb2QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb25fcmVzdWx0KTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2VzIHdlcmUgbGVmdCBvdmVyIGFmdGVyIHZlcmlmeWluZyBleGlzdGVudCBhY3RpdmF0aW9uIHJlc3VsdHNcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2VfYXV0b19hY3RpdmF0ZWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYWN0aXZhdGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaW5pdGlhbF9tZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIG1lc3NhZ2UgPSBpbml0aWFsX21lc3NhZ2U7CisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VydmljZV9uYW1lOworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgcmVnZXRfc2VydmljZV9uYW1lX2FyZzoKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSAlcyBkb2Vzbid0IGhhdmUgYSBzZXJ2aWNlIG5hbWU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHNlcnZpY2VfbmFtZSwgYWN0aXZhdGVkX25hbWUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgdG8gc2VlIHNlcnZpY2UgJXMgY3JlYXRlZCwgc2F3ICVzIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGVkX25hbWUsIHNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9DUkVBVEVEOworICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBzZXJ2aWNlX25hbWU7CisgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19zZXJ2aWNlX293bmVyX2NoYW5nZWRfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgICAgICBpZiAoc29jZC5mYWlsZWQpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICAvKiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gcmVndWxhciBhY3RpdmF0aW9uIGluIHRoYXQgd2UgZG9uJ3QgZ2V0IGEKKyAgICAgICAqIHJlcGx5IHRvIEFjdGl2YXRlU2VydmljZSBoZXJlLgorICAgICAgICovCisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgIHNlcnZpY2VfbmFtZSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiTmFtZU93bmVyQ2hhbmdlZCBmb3IgdGhlIGFjdGl2YXRlZCBuYW1lIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VydmljZV9kZWFjdGl2YXRlZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICphY3RpdmF0ZWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2UpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIE5vdyB3ZSBhcmUgZXhwZWN0aW5nIFNlcnZpY2VPd25lckNoYW5nZWQgKGRlbGV0aW9uKSBtZXNzYWdlcyBmb3IgdGhlIGJhc2UKKyAgICogc2VydmljZSBhbmQgdGhlIGFjdGl2YXRlZF9uYW1lLiAgVGhlIGJhc2Ugc2VydmljZQorICAgKiBub3RpZmljYXRpb24gaXMgcmVxdWlyZWQgdG8gY29tZSBsYXN0LgorICAgKi8KKyAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGFjdGl2YXRlZF9uYW1lOworICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgIGlmIChzb2NkLmZhaWxlZCkKKyAgICBnb3RvIG91dDsKKworICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlOworICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgIGlmIChzb2NkLmZhaWxlZCkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2UpCit7CisgIGRidXNfYm9vbF90IGdvdF9lcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgZXhpdCBtZXNzYWdlIHRvIHRoZSB0ZXN0IHNlcnZpY2VcbiIpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIEtpbGwgb2ZmIHRoZSB0ZXN0IHNlcnZpY2UgYnkgc2VuZGluZyBpdCBhIHF1aXQgbWVzc2FnZSAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0Iik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBEbyB0aGlzIGFnYWluOyB3ZSBzdGlsbCBuZWVkIHRoZSBzZXJ2aWNlIHRvIGV4aXQuLi4gKi8KKyAgICAgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAgICAgLyogRG8gdGhpcyBhZ2Fpbjsgd2Ugc3RpbGwgbmVlZCB0aGUgc2VydmljZSB0byBleGl0Li4uICovCisgICAgICBpZiAoIWNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIC8qIHNlbmQgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICAvKiByZWFkIGl0IGluIGFuZCB3cml0ZSBpdCBvdXQgdG8gdGVzdCBzZXJ2aWNlICovCisgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworCisgIC8qIHNlZSBpZiB3ZSBnb3QgYW4gZXJyb3IgZHVyaW5nIG1lc3NhZ2UgYnVzIGRpc3BhdGNoaW5nICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKEZBTFNFKTsKKyAgbWVzc2FnZSA9IGJvcnJvd19tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGdvdF9lcnJvciA9IG1lc3NhZ2UgIT0gTlVMTCAmJiBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOworICBpZiAobWVzc2FnZSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgfQorCisgIGlmICghZ290X2Vycm9yKQorICAgIHsKKyAgICAgIC8qIElmIG5vIGVycm9yLCB3YWl0IGZvciB0aGUgdGVzdCBzZXJ2aWNlIHRvIGV4aXQgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgICB9CisKKyAgaWYgKGdvdF9lcnJvcikKKyAgICB7CisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2l0aCB0aGUgY29ycmVjdCByZXBseSBzZXJpYWwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBubyBtZW1vcnkgZXJyb3IgZnJvbSBhc2tpbmcgdGVzdCBzZXJ2aWNlIHRvIGV4aXQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGVycm9yICVzIHdoZW4gYXNraW5nIHRlc3Qgc2VydmljZSB0byBleGl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIC8qIERvIHRoaXMgYWdhaW47IHdlIHN0aWxsIG5lZWQgdGhlIHNlcnZpY2UgdG8gZXhpdC4uLiAqLworICAgICAgaWYgKCFjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgYmFzZV9zZXJ2aWNlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2RlYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICAvKiBTaG91bGQgbm93IGhhdmUgYSBOb1JlcGx5IGVycm9yIGZyb20gdGhlIEV4aXQoKSBtZXRob2QKKyAgICAgICAqIGNhbGw7IGl0IHNob3VsZCBoYXZlIGNvbWUgYWZ0ZXIgYWxsIHRoZSBkZWFjdGl2YXRpb24KKyAgICAgICAqIHN0dWZmLgorICAgICAgICovCisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBseSB0byBFeGl0KCkgbWV0aG9kIGNhbGwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19SRVBMWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9SZXBseSBlcnJvciBmcm9tIEV4aXQoKSBtZXRob2QgY2FsbCIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdpdGggdGhlIGNvcnJlY3QgcmVwbHkgc2VyaWFsIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIkdvdCBlcnJvciAlcyBhZnRlciB0ZXN0IHNlcnZpY2UgZXhpdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ290X2Vycm9yIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmaXJzdF9lcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAuLi4pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgYXA7CisgIGRidXNfYm9vbF90IGVycm9yX2ZvdW5kOworICBjb25zdCBjaGFyICplcnJvcl9uYW1lOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBleHBlY3RlZCBlcnJvclxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiYW4gZXJyb3IiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVycm9yX2ZvdW5kID0gRkFMU0U7CisKKyAgdmFfc3RhcnQgKGFwLCBmaXJzdF9lcnJvcl9uYW1lKTsKKyAgZXJyb3JfbmFtZSA9IGZpcnN0X2Vycm9yX25hbWU7CisgIHdoaWxlIChlcnJvcl9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgZXJyb3JfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcl9mb3VuZCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVycm9yX25hbWUgPSB2YV9hcmcgKGFwLCBjaGFyKik7CisgICAgfQorICB2YV9lbmQgKGFwKTsKKworICBpZiAoIWVycm9yX2ZvdW5kKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBlcnJvciAlcyBvciBvdGhlciwgZ290ICVzIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICBmaXJzdF9lcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCit0eXBlZGVmIGVudW0KK3sKKyAgR09UX1NFUlZJQ0VfQ1JFQVRFRCwKKyAgR09UX1NFUlZJQ0VfREVMRVRFRCwKKyAgR09UX0VSUk9SLAorICBHT1RfU09NRVRISU5HX0VMU0UKK30gR290U2VydmljZUluZm87CisKK3N0YXRpYyBHb3RTZXJ2aWNlSW5mbworY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIEdvdFNlcnZpY2VJbmZvIG1lc3NhZ2Vfa2luZDsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAgIHJlZ2V0X3NlcnZpY2VfaW5mb19kYXRhOgorICAgICAgc2VydmljZV9uYW1lID0gTlVMTDsKKyAgICAgIG9sZF9vd25lciA9IE5VTEw7CisgICAgICBuZXdfb3duZXIgPSBOVUxMOworCisgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5ld19vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9pbmZvX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgidW5leHBlY3RlZCBhcmd1bWVudHMgZm9yIE5hbWVPd25lckNoYW5nZWQgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TT01FVEhJTkdfRUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIW9sZF9vd25lclswXSkKKyAgICAgICAgbWVzc2FnZV9raW5kID0gR09UX1NFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIGVsc2UgaWYgKCFuZXdfb3duZXJbMF0pCisgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TRVJWSUNFX0RFTEVURUQ7CisgICAgICBlbHNlCisgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TT01FVEhJTkdfRUxTRTsKKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICBtZXNzYWdlX2tpbmQgPSBHT1RfRVJST1I7CisgIGVsc2UKKyAgICBtZXNzYWdlX2tpbmQgPSBHT1RfU09NRVRISU5HX0VMU0U7CisKKyAgcmV0dXJuIG1lc3NhZ2Vfa2luZDsKK30KKworI2RlZmluZSBFWElTVEVOVF9TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2UgKmJhc2Vfc2VydmljZV9tZXNzYWdlOworICBjb25zdCBjaGFyICpiYXNlX3NlcnZpY2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGNvbnN0IGNoYXIgKmV4aXN0ZW50ID0gRVhJU1RFTlRfU0VSVklDRV9OQU1FOworICBkYnVzX3VpbnQzMl90IGZsYWdzOworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UsIEZBTFNFKTsKKworICBmbGFncyA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogbm93IHdhaXQgZm9yIHRoZSBtZXNzYWdlIGJ1cyB0byBoZWFyIGJhY2sgZnJvbSB0aGUgYWN0aXZhdGVkCisgICAqIHNlcnZpY2UuCisgICAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJhY3RpdmF0ZWQgc2VydmljZSB0byBjb25uZWN0Iik7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgZXJyb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJmJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAidGVzdCBzZXJ2aWNlIHRvIGV4aXQgb3IgZmluaXNoIHVwIik7CisKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyIGJhc2Ugc2VydmljZSBjcmVhdGlvbiBub3RpZmljYXRpb25cbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR09UX1NPTUVUSElOR19FTFNFOgorICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgQWN0aXZhdGVTZXJ2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiKHNob3VsZCBiZSBhbiBlcnJvciBvciBhIHNlcnZpY2UgYW5ub3VuY2VtZW50Iik7CisgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgY2FzZSBHT1RfRVJST1I6CisgICAgICAgICAgaWYgKCFjaGVja19nb3RfZXJyb3IgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAvKiBBIHNlcnZpY2UgZGVsZXRlZCBzaG91bGQgYmUgY29taW5nIGFsb25nIG5vdyBhZnRlciB0aGlzIGVycm9yLgorICAgICAgICAgICAqIFdlIGNhbiBhbHNvIGdldCB0aGUgZXJyb3IgKmFmdGVyKiB0aGUgc2VydmljZSBkZWxldGVkLgorICAgICAgICAgICAqLworCisgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9ERUxFVEVEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBzZXJ2aWNlIHN0YXJ0ZWQgdXAgYW5kIGdvdCBhIGJhc2UgYWRkcmVzcywgYnV0IHRoZW4KKyAgICAgICAgICAgICAqIGZhaWxlZCB0byByZWdpc3RlciB1bmRlciBFWElTVEVOVF9TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisKKyAgICAgICAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICAgICAgICAgICAgaWYgKHNvY2QuZmFpbGVkKQorICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgLyogTm93IHdlIHNob3VsZCBnZXQgYW4gZXJyb3IgYWJvdXQgdGhlIHNlcnZpY2UgZXhpdGluZworICAgICAgICAgICAgICogaWYgd2UgZGlkbid0IGdldCBpdCBiZWZvcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtZXNzYWdlX2tpbmQgIT0gR09UX0VSUk9SKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAiZXJyb3IgYWJvdXQgc2VydmljZSBleGl0aW5nIik7CisKKyAgICAgICAgICAgICAgICAvKiBhbmQgcHJvY2VzcyBldmVyeXRoaW5nIGFnYWluICovCisgICAgICAgICAgICAgICAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgICAgICAgICAgICAgICAgaWYgKCFjaGVja19nb3RfZXJyb3IgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorCQkJCSAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2Ugd2UganVzdCBwdXQgYmFjayEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhIE5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKVxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwgRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfc2VydmljZSwgbWVzc2FnZSkpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgICAgICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciBzdWNjZXNzZnVsIGFjdGl2YXRpb25cbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworCSAgaWYgKCFjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWElTVEVOVF9TRVJWSUNFX05BTUUsIGJhc2Vfc2VydmljZSkpCisJICAgIGdvdG8gb3V0OworCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBpZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChiYXNlX3NlcnZpY2VfbWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmbmRlZiBEQlVTX1dJTl9GSVhNRQorLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGNvbnN0IGNoYXIgKnNlZ3Zfc2VydmljZTsKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgKG1lc3NhZ2UsIEZBTFNFKTsKKworICBzZWd2X3NlcnZpY2UgPSAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlIjsKKyAgZmxhZ3MgPSAwOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZWd2X3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gYWN0aXZhdGluZyBzZWdmYXVsdCBzZXJ2aWNlIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqc2VydmljZWhlbHBlcjsKKyAgICAgICAgICBzZXJ2aWNlaGVscGVyID0gYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIgKGNvbnRleHQpOworICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGlzIG9ubHkgaGFwcGVucyB3aXRoIHRoZSBsYXVuY2ggaGVscGVyICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlaGVscGVyICE9IE5VTEwpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGV4cGVjdGVkIGFsc28gKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSBzZWdmYXVsdCBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZWdmYXVsdF9zZXJ2aWNlX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBzZWdmYXVsdCBzZXJ2aWNlIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGFjdGl2YXRlIHNlZ2ZhdWx0IHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisjZGVmaW5lIFRFU1RfRUNIT19NRVNTQUdFICJUZXN0IGVjaG8gbWVzc2FnZSIKKyNkZWZpbmUgVEVTVF9SVU5fSEVMTE9fRlJPTV9TRUxGX01FU1NBR0UgIlRlc3Qgc2VuZGluZyBtZXNzYWdlIHRvIHNlbGYiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZXhpc3RlbnRfaGVsbG9fZnJvbV9zZWxmIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgY29uc3QgY2hhciAqdGV4dDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdW5IZWxsb0Zyb21TZWxmIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICB0ZXh0ID0gVEVTVF9SVU5fSEVMTE9fRlJPTV9TRUxGX01FU1NBR0U7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBOb3RlOiBpZiB0aGlzIHRlc3QgaXMgcnVuIGluIE9PTSBtb2RlLCBpdCB3aWxsIGJsb2NrIHdoZW4gdGhlIGJ1cworICAgKiBkb2Vzbid0IHNlbmQgYSByZXBseSBkdWUgdG8gT09NLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgZnJvbSBydW5uaW5nIGhlbGxvIGZyb20gc2VsZiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBSdW5IZWxsb0Zyb21TZWxmIG1lc3NhZ2VcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IHNlcmlhbCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiV3JvbmcgcmVwbHkgc2VyaWFsXG4iKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3BpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGluZyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gcnVubmluZyBQaW5nIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIFBpbmcgbWVzc2FnZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWxcbiIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBtZXNzYWdlIHJldHVybiBkdXJpbmcgUGluZ1xuIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9nZXRfbWFjaGluZV9pZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgY29uc3QgY2hhciAqbWFjaGluZV9pZDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRNYWNoaW5lSWQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIE5vdGU6IGlmIHRoaXMgdGVzdCBpcyBydW4gaW4gT09NIG1vZGUsIGl0IHdpbGwgYmxvY2sgd2hlbiB0aGUgYnVzCisgICAqIGRvZXNuJ3Qgc2VuZCBhIHJlcGx5IGR1ZSB0byBPT00uCisgICAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSBmcm9tIHJ1bm5pbmcgR2V0TWFjaGluZUlkIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIEdldE1hY2hpbmVJZCBtZXNzYWdlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIldyb25nIHJlcGx5IHNlcmlhbFxuIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgcmV0dXJuIGR1cmluZyBHZXRNYWNoaW5lSWRcbiIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbWFjaGluZV9pZCA9IE5VTEw7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBOVUxMLCBEQlVTX1RZUEVfU1RSSU5HLCAmbWFjaGluZV9pZCwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhIG1hY2hpbmUgSUQgaW4gcmVwbHkgdG8gR2V0TWFjaGluZUlkXG4iKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtYWNoaW5lX2lkID09IE5VTEwgfHwgc3RybGVuIChtYWNoaW5lX2lkKSAhPSAzMikKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWFjaGluZSBpZCBsb29rcyBib2d1czogJyVzJ1xuIiwgbWFjaGluZV9pZCA/IG1hY2hpbmVfaWQgOiAibnVsbCIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogV2UgY2FuJ3QgY2hlY2sgdGhhdCB0aGUgbWFjaGluZSBpZCBpcyBjb3JyZWN0IGJlY2F1c2UgZHVyaW5nIG1ha2UgY2hlY2sgaXQgaXMKKyAgICoganVzdCBtYWRlIHVwIGZvciBlYWNoIHByb2Nlc3Mgc2VwYXJhdGVseQorICAgKi8KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICp0ZXh0OworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICB0ZXh0ID0gVEVTVF9FQ0hPX01FU1NBR0U7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBub3cgd2FpdCBmb3IgdGhlIG1lc3NhZ2UgYnVzIHRvIGhlYXIgYmFjayBmcm9tIHRoZSBhY3RpdmF0ZWQKKyAgICogc2VydmljZS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEVjaG8gb24gZXhpc3RlbnQgc2VydmljZSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgYXV0byBzdGFydCAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiYXV0byBzdGFydCIpOworCisgIC8qIHdlIHNob3VsZCBnZXQgemVybyBvciB0d28gU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzICovCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJmJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAic2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIC8qIFNob3VsZCBnZXQgYSBzZXJ2aWNlIGNyZWF0aW9uIG5vdGlmaWNhdGlvbiBmb3IgdGhlIGFjdGl2YXRlZAorICAgICAgICogc2VydmljZSBuYW1lLCBvciBhIHNlcnZpY2UgZGVsZXRpb24gb24gdGhlIGJhc2Ugc2VydmljZSBuYW1lCisgICAgICAgKi8KKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJObyBtZXNzYWdlIGFmdGVyIGF1dG8gYWN0aXZhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIihzaG91bGQgYmUgYSBzZXJ2aWNlIGFubm91bmNlbWVudClcbiIpOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZV9raW5kID0gY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAobWVzc2FnZSk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgc3dpdGNoIChtZXNzYWdlX2tpbmQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2Ugd2UganVzdCBwdXQgYmFjayEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhIE5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKVxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ2hlY2sgdGhhdCBTZXJ2aWNlT3duZXJDaGFuZ2VkIChjcmVhdGlvbikgd2FzIGNvcnJlY3RseSByZWNlaXZlZCAqLworICAgICAgICAgIGlmICghY2hlY2tfc2VydmljZV9hdXRvX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwgRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfREVMRVRFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBzdGFydGVkIHVwIGFuZCBnb3QgYSBiYXNlIGFkZHJlc3MsIGJ1dCB0aGVuCisgICAgICAgICAgICAgKiBmYWlsZWQgdG8gcmVnaXN0ZXIgdW5kZXIgRVhJU1RFTlRfU0VSVklDRV9OQU1FCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGEgc29jZDsKKworICAgICAgICAgICAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICAgICAgICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2U7CisgICAgICAgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgICAgICAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBOVUxMOworICAgICAgICAgICAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19zZXJ2aWNlX293bmVyX2NoYW5nZWRfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgICAgICAgICAgICBpZiAoc29jZC5mYWlsZWQpCisgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHT1RfRVJST1I6CisgICAgICAgIGNhc2UgR09UX1NPTUVUSElOR19FTFNFOgorICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgYXV0byBhY3RpdmF0aW9uXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBPSywgbm93IHdlJ3ZlIGRlYWx0IHdpdGggU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzLCBub3cgc2hvdWxkCisgICAqIGNvbWUgdGhlIG1ldGhvZCByZXBseSAob3IgZXJyb3IpIGZyb20gdGhlIGluaXRpYWwgbWV0aG9kIGNhbGwKKyAgICovCisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gZWNobyBtZXNzYWdlIGFmdGVyIGF1dG8tYWN0aXZhdGlvbiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWxcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfZXhpc3RlbnRfcGluZyAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFjaGVja19leGlzdGVudF9nZXRfbWFjaGluZV9pZCAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFjaGVja19leGlzdGVudF9oZWxsb19mcm9tX3NlbGYgKGNvbnRleHQsIGNvbm5lY3Rpb24pKQorICAgIGdvdG8gb3V0OworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChiYXNlX3NlcnZpY2VfbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfRklMRV9NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlRG90U2VydmljZUZpbGVEb2VzTm90RXhpc3QiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfZmlsZV9taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX0ZJTEVfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gc2VydmljZSBmaWxlIG1pc3Npbmcgc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIHVua25vd25cbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCAob25seSB2YWxpZCB3aGVuIHVzaW5nIGxhdW5jaCBoZWxwZXIpICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYXV0by1zdGFydCBtaXNzaW5nIHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBTRVJWSUNFX1VTRVJfTUlTU0lOR19OQU1FICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX1VTRVJfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAJCQkJCSAgICJyZXBseSB0byBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQgKG1pc3NpbmcgVXNlcikiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3Qgc2VydmljZSBmaWxlIGludmFsaWRcbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCAob25seSB2YWxpZCB3aGVuIHVzaW5nIGxhdW5jaCBoZWxwZXIpICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYXV0by1zdGFydCBtaXNzaW5nIHNlcnZpY2VcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBTRVJWSUNFX0VYRUNfTUlTU0lOR19OQU1FICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMiCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChTRVJWSUNFX0VYRUNfTUlTU0lOR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAJCQkJCSAgICJyZXBseSB0byBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQgKG1pc3NpbmcgRXhlYykiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJjb3VsZCBub3QgYWN0aXZhdGUgYXMgaW52YWxpZCBzZXJ2aWNlIGZpbGUgd2FzIG5vdCBhZGRlZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGV4cGVjdGVkIGFzIHdlIHNob3VsZG4ndCBoYXZlIGJlZW4gYWRkZWQgdG8KKyAgICAgICAgICAgICAqIHRoZSBhY3RpdmF0aW9uIGxpc3Qgd2l0aCBhIG1pc3NpbmcgRXhlYyBrZXkgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3Qgc2VydmljZSBmaWxlIGludmFsaWRcbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhbGxvd2VkLCBhbmQgaXMgdGhlIG1lc3NhZ2UgcGFzc2VkIGJhY2sgZnJvbSB0aGUKKyAgICAgICAgICAgICAqIGxhdW5jaCBoZWxwZXIgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhdXRvLXN0YXJ0IG1pc3Npbmcgc2VydmljZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZSIKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sYXVuY2hfc2VydmljZV9zZXJ2aWNlX21pc3NpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgIAkJCQkJICAgInJlcGx5IHRvIHNlcnZpY2Ugd2hpY2ggc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCAobWlzc2luZyBTZXJ2aWNlKSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImNvdWxkIG5vdCBhY3RpdmF0ZSBhcyBpbnZhbGlkIHNlcnZpY2UgZmlsZSB3YXMgbm90IGFkZGVkXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYXMgd2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBhZGRlZCB0bworICAgICAgICAgICAgICogdGhlIGFjdGl2YXRpb24gbGlzdCB3aXRoIGEgbWlzc2luZyBFeGVjIGtleSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIGZpbGUgaW52YWxpZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGFsbG93ZWQsIGFuZCBpcyB0aGUgbWVzc2FnZSBwYXNzZWQgYmFjayBmcm9tIHRoZQorICAgICAgICAgICAgICogbGF1bmNoIGhlbHBlciAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgbWlzc2luZyBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0hFTExfRkFJTF9TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNIRUxMX0ZBSUxfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gc2hlbGwgRWNobyBvbiBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3QgaW52YWxpZCBhcmdzXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgc2hlbGwgZmFpbCBzZXJ2aWNlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX3NlcnZpY2Vfc3VjY2Vzc19hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICphcmd2WzddID0ge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIG5vdyB3YWl0IGZvciB0aGUgbWVzc2FnZSBidXMgdG8gaGVhciBiYWNrIGZyb20gdGhlIGFjdGl2YXRlZAorICAgKiBzZXJ2aWNlLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBzaGVsbCBzdWNjZXNzIHNlcnZpY2UiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyIGF1dG8gc3RhcnQgJWQgb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIF9kYnVzX3ZlcmJvc2UgKCIgIChhZnRlciBzZW5kaW5nICVzKVxuIiwgImF1dG8gc3RhcnQiKTsKKworICAvKiB3ZSBzaG91bGQgZ2V0IHplcm8gb3IgdHdvIFNlcnZpY2VPd25lckNoYW5nZWQgc2lnbmFscyAqLworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpCisgICAgeworICAgICAgR290U2VydmljZUluZm8gbWVzc2FnZV9raW5kOworCisgICAgICBpZiAoIWNoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGJsb2NrIGhlcmUgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgdG8gZXhpdCBvciBmaW5pc2ggdXAgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInNlcnZpY2UgdG8gZXhpdCIpOworCisgICAgICAvKiBTaG91bGQgZ2V0IGEgc2VydmljZSBjcmVhdGlvbiBub3RpZmljYXRpb24gZm9yIHRoZSBhY3RpdmF0ZWQKKyAgICAgICAqIHNlcnZpY2UgbmFtZSwgb3IgYSBzZXJ2aWNlIGRlbGV0aW9uIG9uIHRoZSBiYXNlIHNlcnZpY2UgbmFtZQorICAgICAgICovCisgICAgICBtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTm8gbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICIoc2hvdWxkIGJlIGEgc2VydmljZSBhbm5vdW5jZW1lbnQpXG4iKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfQ1JFQVRFRDoKKyAgICAgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBvcCBtZXNzYWdlIHdlIGp1c3QgcHV0IGJhY2shICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBoYXZlIGJlZW4gYSBOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbilcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIENoZWNrIHRoYXQgU2VydmljZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIHdhcyBjb3JyZWN0bHkgcmVjZWl2ZWQgKi8KKyAgICAgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfYXV0b19hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sIFNIRUxMX1NVQ0NFU1NfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfREVMRVRFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBzdGFydGVkIHVwIGFuZCBnb3QgYSBiYXNlIGFkZHJlc3MsIGJ1dCB0aGVuCisgICAgICAgICAgICAgKiBmYWlsZWQgdG8gcmVnaXN0ZXIgdW5kZXIgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgICAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEdPVF9FUlJPUjoKKyAgICAgICAgY2FzZSBHT1RfU09NRVRISU5HX0VMU0U6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb25cbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIC8qIE9LLCBub3cgd2UndmUgZGVhbHQgd2l0aCBTZXJ2aWNlT3duZXJDaGFuZ2VkIHNpZ25hbHMsIG5vdyBzaG91bGQKKyAgICogY29tZSB0aGUgbWV0aG9kIHJlcGx5IChvciBlcnJvcikgZnJvbSB0aGUgaW5pdGlhbCBtZXRob2QgY2FsbAorICAgKi8KKworICAvKiBOb3RlOiBpZiB0aGlzIHRlc3QgaXMgcnVuIGluIE9PTSBtb2RlLCBpdCB3aWxsIGJsb2NrIHdoZW4gdGhlIGJ1cworICAgKiBkb2Vzbid0IHNlbmQgYSByZXBseSBkdWUgdG8gT09NLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2UgYWZ0ZXIgYXV0by1hY3RpdmF0aW9uIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIGVjaG8gbWVzc2FnZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIldyb25nIHJlcGx5IHNlcmlhbFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndls2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBhcmd1bWVudHMgZnJvbSByZXR1cm5cbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAvKiBkb24ndCB3b3JyeSBhYm91dCBhcmdbMF0gYXMgaXQgbWF5IGJlIGRpZmZlcmVudAorICAgICAgZGVwZW5kaW5nIG9uIHRoZSBwYXRoIHRvIHRoZSB0ZXN0cworICAgKi8KKyAgaWYgKHN0cmNtcCgiLXRlc3QiLCBhcmd2WzFdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbMV0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcylcbiIsCisgICAgICAgICAgICAgICAgICAiLXRlc3QiLCBhcmd2WzFdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJ0aGF0IiwgYXJndlsyXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzJdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJ0aGF0IiwgYXJndlsyXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgid2UgZ2V0IiwgYXJndlszXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzNdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJ3ZSBnZXQiLCBhcmd2WzNdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJiYWNrIiwgYXJndls0XSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzRdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICJiYWNrIiwgYXJndls0XSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgiLS13aGF0IiwgYXJndls1XSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzVdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICItLXdoYXQiLCBhcmd2WzVdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJ3ZSBwdXQgaW4iLCBhcmd2WzZdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbNl0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgIndlIHB1dCBpbiIsIGFyZ3ZbNl0pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIRUxMX1NVQ0NFU1NfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoZWNrMUZ1bmMgZnVuYzsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKK30gQ2hlY2sxRGF0YTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19vb21fY2hlY2sxX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrMURhdGEgKmQgPSBkYXRhOworCisgIGlmICghICgqIGQtPmZ1bmMpIChkLT5jb250ZXh0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGQtPmNvbnRleHQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3Zlciwgc2hvdWxkIGJlIGNvdmVyZWQgYnkgdGVzdCBzdWl0ZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY2hlY2sxX3RyeV9pdGVyYXRpb25zIChCdXNDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sxRnVuYyAgZnVuYykKK3sKKyAgQ2hlY2sxRGF0YSBkOworCisgIGQuZnVuYyA9IGZ1bmM7CisgIGQuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoZGVzY3JpcHRpb24sIGNoZWNrX29vbV9jaGVjazFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ2V0X3NlcnZpY2VzIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKwkJICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkgICAgY29uc3QgY2hhciAgICAgKm1ldGhvZCwKKwkJICAgIGNoYXIgICAgICAgICAqKipzZXJ2aWNlcywKKwkJICAgIGludCAgICAgICAgICAgICpsZW4pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNoYXIgKipzcnZzOworICBpbnQgbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBtZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisJCQkJCSAgREJVU19QQVRIX0RCVVMsCisJCQkJCSAgREJVU19JTlRFUkZBQ0VfREJVUywKKwkJCQkJICBtZXRob2QpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIExpc3RBY3RpdmF0YWJsZU5hbWVzL0xpc3ROYW1lcyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXBcbiIsCisJCSAgbWV0aG9kLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorCXsKKwkgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorCQkJICAgIm1ldGhvZF9yZXR1cm4gZm9yIExpc3RBY3RpdmF0YWJsZU5hbWVzL0xpc3ROYW1lcyIpOworCisJICBnb3RvIG91dDsKKwl9CisKKyAgICByZXRyeV9nZXRfcHJvcGVydHk6CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisJCQkJICBEQlVTX1RZUEVfQVJSQVksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLAorCQkJCSAgJnNydnMsICZsLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorCXsKKwkgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKwkgICAgeworCSAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gbGlzdCBzZXJ2aWNlcyBieSAlc1xuIiwgbWV0aG9kKTsKKwkgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisJICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCSAgICAgIGdvdG8gcmV0cnlfZ2V0X3Byb3BlcnR5OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKwkgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9BUlJBWSBmcm9tICVzXG4iLCBtZXRob2QpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisJfSBlbHNlIHsKKwkgICpzZXJ2aWNlcyA9IHNydnM7CisJICAqbGVuID0gbDsKKwl9CisgICAgfQorCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xpc3Rfc2VydmljZXMgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorCQkgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICAqYmFzZV9zZXJ2aWNlX21lc3NhZ2U7CisgIGNvbnN0IGNoYXIgICAqYmFzZV9zZXJ2aWNlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgICByZXR2YWw7CisgIGNvbnN0IGNoYXIgICAqZXhpc3RlbnQgPSBFWElTVEVOVF9TRVJWSUNFX05BTUU7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisgIGNoYXIgICAgICAgICoqc2VydmljZXM7CisgIGludCAgICAgICAgICAgbGVuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19saXN0X3NlcnZpY2VzIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgaWYgKCFjaGVja19nZXRfc2VydmljZXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJMaXN0QWN0aXZhdGFibGVOYW1lcyIsICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zICgoY29uc3QgY2hhciAqKilzZXJ2aWNlcywgZXhpc3RlbnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgJXMgZnJvbSBMaXN0QWN0aXZhdGFibGVOYW1lc1xuIiwgZXhpc3RlbnQpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisKKyAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKwkJCQkJICBEQlVTX1BBVEhfREJVUywKKwkJCQkJICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorCQkJCQkgICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAobWVzc2FnZSwgRkFMU0UpOworCisgIGZsYWdzID0gMDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZleGlzdGVudCwKKwkJCQkgREJVU19UWVBFX1VJTlQzMiwgJmZsYWdzLAorCQkJCSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICAvKiBub3cgd2FpdCBmb3IgdGhlIG1lc3NhZ2UgYnVzIHRvIGhlYXIgYmFjayBmcm9tIHRoZSBhY3RpdmF0ZWQKKyAgICogc2VydmljZS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgImFjdGl2YXRlZCBzZXJ2aWNlIHRvIGNvbm5lY3QiKTsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgJXMgJWQgb24gJXBcbiIsCisJCSAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorCXsKKwkgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXNcbiIsCisJCSAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisJCSAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKwkJCQkgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisJfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorCQkJCSAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSB8fAorCSAgICAgICBkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisJCQkJICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkgfHwKKwkgICAgICAgZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorCQkJCSAgICAgIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCBlcnJvciAlc1xuIiwKKwkJICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisJICBnb3RvIG91dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgR290U2VydmljZUluZm8gbWVzc2FnZV9raW5kOworCisgICAgICBpZiAoIWNoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisJCQkJCSBtZXNzYWdlLCAmYmFzZV9zZXJ2aWNlKSkKKwlnb3RvIG91dDsKKworICAgICAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGJsb2NrIGhlcmUgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgdG8gZXhpdCBvciBmaW5pc2ggdXAgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCIpOworCisgICAgICBtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisJeworCSAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYWZ0ZXIgYmFzZSBzZXJ2aWNlIGNyZWF0aW9uIG5vdGlmaWNhdGlvblxuIik7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorCXsKKwljYXNlIEdPVF9TT01FVEhJTkdfRUxTRToKKwljYXNlIEdPVF9FUlJPUjoKKwljYXNlIEdPVF9TRVJWSUNFX0RFTEVURUQ6CisJICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBtZXNzYWdlIGFmdGVyIEFjdGl2YXRlU2VydmljZSAiCisJCSAgICAgICIoc2hvdWxkIGJlIGFuIGVycm9yIG9yIGEgc2VydmljZSBhbm5vdW5jZW1lbnQpXG4iKTsKKwkgIGdvdG8gb3V0OworCisJY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorCSAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisJICBpZiAobWVzc2FnZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSB3ZSBqdXN0IHB1dCBiYWNrISAiCisJCQkgICJzaG91bGQgaGF2ZSBiZWVuIGEgTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pXG4iKTsKKwkgICAgICBnb3RvIG91dDsKKwkgICAgfQorCisJICBpZiAoIWNoZWNrX3NlcnZpY2VfYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLCBFWElTVEVOVF9TRVJWSUNFX05BTUUsCisJCQkJCWJhc2Vfc2VydmljZSwgbWVzc2FnZSkpCisJICAgIGdvdG8gb3V0OworCisJICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCSAgbWVzc2FnZSA9IE5VTEw7CisKKwkgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKwkgICAgeworCSAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciBzdWNjZXNzZnVsIGFjdGl2YXRpb25cbiIpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKCFjaGVja19nZXRfc2VydmljZXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJMaXN0TmFtZXMiLCAmc2VydmljZXMsICZsZW4pKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoKGNvbnN0IGNoYXIgKiopc2VydmljZXMsIGV4aXN0ZW50KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkICVzIGZyb20gTGlzdE5hbWVzXG4iLCBleGlzdGVudCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisJCQkJICAgRVhJU1RFTlRfU0VSVklDRV9OQU1FLCBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoZWNrMkZ1bmMgZnVuYzsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247Cit9IENoZWNrMkRhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfb29tX2NoZWNrMl9mdW5jICh2b2lkICpkYXRhKQoreworICBDaGVjazJEYXRhICpkID0gZGF0YTsKKworICBpZiAoISAoKiBkLT5mdW5jKSAoZC0+Y29udGV4dCwgZC0+Y29ubmVjdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChkLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIsIHNob3VsZCBiZSBjb3ZlcmVkIGJ5IHRlc3Qgc3VpdGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrMl90cnlfaXRlcmF0aW9ucyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIENoZWNrMkZ1bmMgICAgICBmdW5jKQoreworICBDaGVjazJEYXRhIGQ7CisKKyAgZC5mdW5jID0gZnVuYzsKKyAgZC5jb250ZXh0ID0gY29udGV4dDsKKyAgZC5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChkZXNjcmlwdGlvbiwgY2hlY2tfb29tX2NoZWNrMl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVzIGZhaWxlZCBkdXJpbmcgb29tXG4iLCBkZXNjcmlwdGlvbik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXRlbnZfVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyhjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZmlsZW5hbWUpCit7CisgIERCdXNTdHJpbmcgZnVsbDsKKyAgREJ1c1N0cmluZyBmaWxlOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9kYXRhX2RpciwgMCwgJmZ1bGwsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZSwgZmlsZW5hbWUpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGwsICZmaWxlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU2V0dGluZyBURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGwpKTsKKworICBfZGJ1c19zZXRlbnYgKCJURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbCkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZiAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKwkJICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaWxlbmFtZSwKKwkJICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICB1c2VfbGF1bmNoZXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNDb25uZWN0aW9uICpmb287CisgIERCdXNDb25uZWN0aW9uICpiYXI7CisgIERCdXNDb25uZWN0aW9uICpiYXo7CisgIERCdXNFcnJvciBlcnJvcjsKKworICAvKiBzYXZlIHRoZSBjb25maWcgbmFtZSBmb3IgdGhlIGFjdGl2YXRpb24gaGVscGVyICovCisgIGlmICghc2V0ZW52X1RFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUcgKHRlc3RfZGF0YV9kaXIsIGZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgc2V0dGluZyBURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfY29udGV4dF9uZXdfdGVzdCAodGVzdF9kYXRhX2RpciwgZmlsZW5hbWUpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb28gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChURVNUX0NPTk5FQ1RJT04sICZlcnJvcik7CisgIGlmIChmb28gPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2MgY29ubmVjdGlvbiIpOworCisgIGlmICghYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3Qgc2V0IHVwIGNvbm5lY3Rpb24iKTsKKworICBzcGluX2Nvbm5lY3Rpb25fdW50aWxfYXV0aGVudGljYXRlZCAoY29udGV4dCwgZm9vKTsKKworICBpZiAoIWNoZWNrX2hlbGxvX21lc3NhZ2UgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2RvdWJsZV9oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZSBoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGJhciA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfQ09OTkVDVElPTiwgJmVycm9yKTsKKyAgaWYgKGJhciA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChiYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBiYXIpOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGJheiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfQ09OTkVDVElPTiwgJmVycm9yKTsKKyAgaWYgKGJheiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBiYXopOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisjaWZkZWYgREJVU19XSU5fRklYTUUKKyAgX2RidXNfd2FybigiVE9ETzogdGVzdGluZyBvZiBHZXRDb25uZWN0aW9uVW5peFVzZXIgbWVzc2FnZSBza2lwcGVkIGZvciBub3dcbiIpOworICBfZGJ1c193YXJuKCJUT0RPOiB0ZXN0aW5nIG9mIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIG1lc3NhZ2Ugc2tpcHBlZCBmb3Igbm93XG4iKTsKKyNlbHNlCisgIGlmICghY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdldENvbm5lY3Rpb25Vbml4VXNlciBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIG1lc3NhZ2UgZmFpbGVkIik7CisjZW5kaWYKKworICBpZiAoIWNoZWNrX2xpc3Rfc2VydmljZXMgKGNvbnRleHQsIGJheikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiTGlzdEFjdGl2YXRhYmxlTmFtZXMgbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2VzIHdlcmUgbGVmdCBvdmVyIGFmdGVyIHNldHRpbmcgdXAgaW5pdGlhbCBjb25uZWN0aW9uc1xuIik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbml0aWFsIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkIik7CisgICAgfQorCisgIGNoZWNrMV90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgImNyZWF0ZV9hbmRfaGVsbG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlbGxvX2Nvbm5lY3Rpb24pOworCisgIGNoZWNrMl90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgZm9vLCAibm9uZXhpc3RlbnRfc2VydmljZV9ub19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19ub25leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQpOworCisjaWZkZWYgREJVU19XSU5fRklYTUUKKyAgX2RidXNfd2FybigiVE9ETzogZGlzcGF0Y2guYyBzZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQgdGVzdFxuIik7CisjZWxzZQorICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgInNlZ2ZhdWx0X3NlcnZpY2Vfbm9fYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2VnZmF1bHRfc2VydmljZV9ub19hdXRvX3N0YXJ0KTsKKyNlbmRpZgorCisgIGNoZWNrMl90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgZm9vLCAiZXhpc3RlbnRfc2VydmljZV9ub19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQpOworCisgIGNoZWNrMl90cnlfaXRlcmF0aW9ucyAoY29udGV4dCwgZm9vLCAibm9uZXhpc3RlbnRfc2VydmljZV9hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19ub25leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworCisKKyNpZmRlZiBEQlVTX1dJTl9GSVhNRQorICBfZGJ1c193YXJuKCJUT0RPOiBkaXNwYXRjaC5jIHNlZ2ZhdWx0X3NlcnZpY2VfYXV0b19zdGFydCB0ZXN0XG4iKTsKKyNlbHNlCisgIC8qIG9ubHkgZG8gdGhlIHNlZ2ZhdWx0IHRlc3QgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgbGF1bmNoZXIgKi8KKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzZWdmYXVsdF9zZXJ2aWNlX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NlZ2ZhdWx0X3NlcnZpY2VfYXV0b19zdGFydCk7CisjZW5kaWYKKworICAvKiBvbmx5IGRvIHRoZSBzaGVsbCBmYWlsIHRlc3QgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgbGF1bmNoZXIgKi8KKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzaGVsbF9mYWlsX3NlcnZpY2VfYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2hlbGxfZmFpbF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworCisgIC8qIHNwZWNpZmljIHRvIGxhdW5jaGVyICovCisgIGlmICh1c2VfbGF1bmNoZXIpCisgICAgaWYgKCFjaGVja19sYXVuY2hfc2VydmljZV9maWxlX21pc3NpbmcgKGNvbnRleHQsIGZvbykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWQgbm90IGdldCBzZXJ2aWNlIGZpbGUgbm90IGZvdW5kIGVycm9yIik7CisKKyNpZiAwCisgIC8qIE5vdGU6IG5lZWQgdG8gcmVzb2x2ZSBzb21lIGlzc3VlcyB3aXRoIHRoZSB0ZXN0aW5nIGNvZGUgaW4gb3JkZXIgdG8gcnVuCisgICAqIHRoaXMgaW4gb29tIChoYW5kbGUgdGhhdCB3ZSBzb21ldGltZXMgZG9uJ3QgZ2V0IHJlcGxpZXMgYmFjayBmcm9tIHRoZSBidXMKKyAgICogd2hlbiBvb20gaGFwcGVucywgd2l0aG91dCBibG9ja2luZyB0aGUgdGVzdCkuCisgICAqLworICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgImV4aXN0ZW50X3NlcnZpY2VfYXV0b19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworI2VuZGlmCisKKyAgaWYgKCFjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZXhpc3RlbnQgc2VydmljZSBhdXRvIHN0YXJ0IGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfc2hlbGxfc2VydmljZV9zdWNjZXNzX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hlbGwgc3VjY2VzcyBzZXJ2aWNlIGF1dG8gc3RhcnQgZmFpbGVkIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vLCBiYXIsIGFuZCBiYXpcbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworICBraWxsX2NsaWVudF9jb25uZWN0aW9uX3VuY2hlY2tlZCAoYmFyKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJheik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKwkJICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGVuYW1lKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzQ29ubmVjdGlvbiAqZm9vOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogc2F2ZSB0aGUgY29uZmlnIG5hbWUgZm9yIHRoZSBhY3RpdmF0aW9uIGhlbHBlciAqLworICBpZiAoIXNldGVudl9URVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHICh0ZXN0X2RhdGFfZGlyLCBmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHNldHRpbmcgVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsIGZpbGVuYW1lKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9DT05ORUNUSU9OLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaF9hbGwgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGFjdGl2YXRpb24uYyB1c2VyIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVzZXIgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBleGVjIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImV4ZWMgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBzZXJ2aWNlIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2Vfc2VydmljZV9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNlcnZpY2UgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGluZyBmb29cbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICAvKiBydW4gbm9ybWFsIGFjdGl2YXRpb24gdGVzdHMgKi8KKyAgX2RidXNfdmVyYm9zZSAoIk5vcm1hbCBhY3RpdmF0aW9uIHRlc3RzXG4iKTsKKyAgaWYgKCFidXNfZGlzcGF0Y2hfdGVzdF9jb25mICh0ZXN0X2RhdGFfZGlyLAorICAJCQkgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZiIsIEZBTFNFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBEQlVTX1dJTgorICBfZGJ1c193YXJuKCJJbmZvOiBMYXVuY2ggaGVscGVyIGFjdGl2YXRpb24gdGVzdHMgc2tpcHBlZCBiZWNhdXNlIGxhdW5jaC1oZWxwZXIgaXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworI2Vsc2UKKyAgLyogcnVuIGxhdW5jaC1oZWxwZXIgYWN0aXZhdGlvbiB0ZXN0cyAqLworICBfZGJ1c192ZXJib3NlICgiTGF1bmNoIGhlbHBlciBhY3RpdmF0aW9uIHRlc3RzXG4iKTsKKyAgaWYgKCFidXNfZGlzcGF0Y2hfdGVzdF9jb25mICh0ZXN0X2RhdGFfZGlyLAorICAJCQkgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZiIsIFRSVUUpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBydW4gc2VsZWN0IGxhdW5jaC1oZWxwZXIgYWN0aXZhdGlvbiB0ZXN0cyBvbiBicm9rZW4gc2VydmljZSBmaWxlcyAqLworICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCAodGVzdF9kYXRhX2RpciwKKyAgCQkJICAgICAgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZiIpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmZvbzsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAvKiBUZXN0IFNIQTEgYXV0aGVudGljYXRpb24gKi8KKyAgX2RidXNfdmVyYm9zZSAoIlRlc3RpbmcgU0hBMSBjb250ZXh0XG4iKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mIik7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvbyA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfQ09OTkVDVElPTiwgJmVycm9yKTsKKyAgaWYgKGZvbyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBmb28pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhZGRtYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgc2V0dGluZyB1cCBpbml0aWFsIFNIQS0xIGNvbm5lY3Rpb25cbiIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW5pdGlhbCBjb25uZWN0aW9uIHNldHVwIGZhaWxlZCIpOworICAgIH0KKworICBjaGVjazFfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsICJjcmVhdGVfYW5kX2hlbGxvX3NoYTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlbGxvX2Nvbm5lY3Rpb24pOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKK2RidXNfYm9vbF90CitidXNfdW5peF9mZHNfcGFzc2luZ190ZXN0KGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNDb25uZWN0aW9uICpmb28sICpiYXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm07CisgIGRidXNfYm9vbF90IGI7CisgIGludCBvbmVbMl0sIHR3b1syXSwgeCwgeSwgejsKKyAgY2hhciByOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsICJ2YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYiKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2MgY29udGV4dCIpOworCisgIGZvbyA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfQ09OTkVDVElPTiwgJmVycm9yKTsKKyAgaWYgKGZvbyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBmb28pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGJhciA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfQ09OTkVDVElPTiwgJmVycm9yKTsKKyAgaWYgKGJhciA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb25uZWN0aW9uIik7CisKKyAgaWYgKCFidXNfc2V0dXBfZGVidWdfY2xpZW50IChiYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBzZXQgdXAgY29ubmVjdGlvbiIpOworCisgIHNwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChjb250ZXh0LCBiYXIpOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoZWxsbyBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfYWRkX21hdGNoX2FsbCAoY29udGV4dCwgYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisgIGlmICghKG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCgiLyIsICJhLmIuYyIsICJkIikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBtZXNzYWdlIik7CisKKyAgaWYgKCEoX2RidXNfZnVsbF9kdXBsZXhfcGlwZShvbmUsIG9uZSsxLCBUUlVFLCAmZXJyb3IpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhbGxvY2F0ZSBwaXBlICMxIik7CisKKyAgaWYgKCEoX2RidXNfZnVsbF9kdXBsZXhfcGlwZSh0d28sIHR3bysxLCBUUlVFLCAmZXJyb3IpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhbGxvY2F0ZSBwaXBlICMyIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsIHR3bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsIHR3bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGF0dGFjaCBmZHMuIik7CisKKyAgaWYgKCFfZGJ1c19jbG9zZShvbmVbMF0sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMSAiKTsKKyAgaWYgKCFfZGJ1c19jbG9zZSh0d29bMF0sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMiAiKTsKKworICBpZiAoIShkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZShmb28sIERCVVNfVFlQRV9VTklYX0ZEKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJDb25uZWN0aW9uIGNhbm5vdCBkbyBmZCBwYXNzaW5nIik7CisKKyAgaWYgKCEoZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUoYmFyLCBEQlVTX1RZUEVfVU5JWF9GRCkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiQ29ubmVjdGlvbiBjYW5ub3QgZG8gZmQgcGFzc2luZyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGZvbywgbSwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gc2VuZCBmZHMiKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYobSk7CisKKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChmb28pKTsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBmb28sICJ1bml4IGZkIHJlY2VwdGlvbiBvbiBmb28iKTsKKworICBpZiAoIShtID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChmb28pKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byByZWNlaXZlIG1zZyIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtLCAiYS5iLmMiLCAiZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiYm9ndXMgbWVzc2FnZSByZWNlaXZlZCIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZihtKTsKKworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGJhciwgInVuaXggZmQgcmVjZXB0aW9uIG9uIGJhciIpOworCisgIGlmICghKG0gPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGJhcikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlY2VpdmUgbXNnIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG0sICJhLmIuYyIsICJkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJib2d1cyBtZXNzYWdlIHJlY2VpdmVkIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZ6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcGFyc2UgZmRzLiIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZihtKTsKKworICBpZiAod3JpdGUoeCwgIlgiLCAxKSAhPSAxKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHdyaXRlIHRvIHBpcGUgIzEiKTsKKyAgaWYgKHdyaXRlKHksICJZIiwgMSkgIT0gMSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byB3cml0ZSB0byBwaXBlICMyIik7CisgIGlmICh3cml0ZSh6LCAiWiIsIDEpICE9IDEpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gd3JpdGUgdG8gcGlwZSAjMi8ybmQgZmQiKTsKKworICBpZiAoIV9kYnVzX2Nsb3NlKHgsICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMS9vdGhlciBzaWRlICIpOworICBpZiAoIV9kYnVzX2Nsb3NlKHksICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMi9vdGhlciBzaWRlICIpOworICBpZiAoIV9kYnVzX2Nsb3NlKHosICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMi9vdGhlciBzaXplIDJuZCBmZCAiKTsKKworICBpZiAocmVhZChvbmVbMV0sICZyLCAxKSAhPSAxIHx8IHIgIT0gJ1gnKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlYWQgdmFsdWUgZnJvbSBwaXBlLiIpOworICBpZiAocmVhZCh0d29bMV0sICZyLCAxKSAhPSAxIHx8IHIgIT0gJ1knKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlYWQgdmFsdWUgZnJvbSBwaXBlLiIpOworICBpZiAocmVhZCh0d29bMV0sICZyLCAxKSAhPSAxIHx8IHIgIT0gJ1onKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlYWQgdmFsdWUgZnJvbSBwaXBlLiIpOworCisgIGlmICghX2RidXNfY2xvc2Uob25lWzFdLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGNsb3NlIHBpcGUgIzEgIik7CisgIGlmICghX2RidXNfY2xvc2UodHdvWzFdLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGNsb3NlIHBpcGUgIzIgIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGZvbyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgYmFyXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJhcik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvZGlzcGF0Y2guaCBiL2RidXMtMS40LjEwL2J1cy9kaXNwYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNWJhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvZGlzcGF0Y2guaApAQCAtMCwwICsxLDM4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRpc3BhdGNoLmggIE1lc3NhZ2UgZGlzcGF0Y2hlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfRElTUEFUQ0hfSAorI2RlZmluZSBCVVNfRElTUEFUQ0hfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCitkYnVzX2Jvb2xfdCBidXNfZGlzcGF0Y2hfYWRkX2Nvbm5lY3Rpb24gICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX21hdGNoZXMgICAgICAgICAgIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpyZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogQlVTX0RJU1BBVENIX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9kcml2ZXIuYyBiL2RidXMtMS40LjEwL2J1cy9kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhkMWYyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2RyaXZlci5jCkBAIC0wLDAgKzEsMjAzMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkcml2ZXIuYyAgQnVzIGNsaWVudCAoZHJpdmVyKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJhY3RpdmF0aW9uLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmhlbGxvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkIChjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorCQkJCSAgICAgICBjb25zdCBjaGFyICAgICAqb2xkX293bmVyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICAgICAqbmV3X293bmVyLAorCQkJCSAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqbnVsbF9zZXJ2aWNlOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG51bGxfc2VydmljZSA9ICIiOworICBfZGJ1c192ZXJib3NlICgic2VuZGluZyBuYW1lIG93bmVyIGNoYW5nZWQ6ICVzIFslcyAtPiAlc11cbiIsCisgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgb2xkX293bmVyID8gb2xkX293bmVyIDogbnVsbF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICBuZXdfb3duZXIgPyBuZXdfb3duZXIgOiBudWxsX3NlcnZpY2UpOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIGdvdG8gb29tOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsIG9sZF9vd25lciA/ICZvbGRfb3duZXIgOiAmbnVsbF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgbmV3X293bmVyID8gJm5ld19vd25lciA6ICZudWxsX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAobWVzc2FnZSwgInNzcyIpKTsKKworICByZXR2YWwgPSBidXNfZGlzcGF0Y2hfbWF0Y2hlcyAodHJhbnNhY3Rpb24sIE5VTEwsIE5VTEwsIG1lc3NhZ2UsIGVycm9yKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworCisgb29tOgorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZUxvc3QiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCBtZXNzYWdlKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCBtZXNzYWdlKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUgKEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICpzdHIpCit7CisgIC8qIFdlIG5ldmVyIHdhbnQgdG8gdXNlIHRoZSBzYW1lIHVuaXF1ZSBjbGllbnQgbmFtZSB0d2ljZSwgYmVjYXVzZQorICAgKiB3ZSB3YW50IHRvIGd1YXJhbnRlZSB0aGF0IGlmIHlvdSBzZW5kIGEgbWVzc2FnZSB0byBhIGdpdmVuIHVuaXF1ZQorICAgKiBuYW1lLCB5b3UgYWx3YXlzIGdldCB0aGUgc2FtZSBhcHBsaWNhdGlvbi4gU28gd2UgdXNlIHR3byBudW1iZXJzCisgICAqIGZvciBJTlRfTUFYICogSU5UX01BWCBjb21iaW5hdGlvbnMsIHNob3VsZCBiZSBwcmV0dHkgc2FmZSBhZ2FpbnN0CisgICAqIHdyYXBhcm91bmQuCisgICAqLworICAvKiBGSVhNRSB0aGVzZSBzaG91bGQgYmUgaW4gQnVzUmVnaXN0cnkgcmF0aGVyIHRoYW4gc3RhdGljIHZhcnMgKi8KKyAgc3RhdGljIGludCBuZXh0X21ham9yX251bWJlciA9IDA7CisgIHN0YXRpYyBpbnQgbmV4dF9taW5vcl9udW1iZXIgPSAwOworICBpbnQgbGVuOworCisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIHdoaWxlIChUUlVFKQorICAgIHsKKyAgICAgIC8qIHN0YXJ0IG91dCB3aXRoIDEtMCwgZ28gdG8gMS0xLCAxLTIsIDEtMywKKyAgICAgICAqIHVwIHRvIDEtTUFYSU5ULCB0aGVuIDItMCwgMi0xLCBldGMuCisgICAgICAgKi8KKyAgICAgIGlmIChuZXh0X21pbm9yX251bWJlciA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgbmV4dF9tYWpvcl9udW1iZXIgKz0gMTsKKyAgICAgICAgICBuZXh0X21pbm9yX251bWJlciA9IDA7CisgICAgICAgICAgaWYgKG5leHRfbWFqb3JfbnVtYmVyIDw9IDApCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJJTlRfTUFYICogSU5UX01BWCBjbGllbnRzIHdlcmUgYWRkZWQiKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKG5leHRfbWFqb3JfbnVtYmVyID4gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG5leHRfbWlub3JfbnVtYmVyID49IDApOworCisgICAgICAvKiBhcHBuYW1lOk1BSk9SLU1JTk9SICovCisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCAiOiIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKHN0ciwgbmV4dF9tYWpvcl9udW1iZXIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCAiLiIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKHN0ciwgbmV4dF9taW5vcl9udW1iZXIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIG5leHRfbWlub3JfbnVtYmVyICs9IDE7CisKKyAgICAgIC8qIENoZWNrIGlmIGEgY2xpZW50IHdpdGggdGhlIG5hbWUgZXhpc3RzICovCisgICAgICBpZiAoYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksIHN0cikgPT0gTlVMTCkKKwlicmVhazsKKworICAgICAgLyogZHJvcCB0aGUgbnVtYmVyIGFnYWluLCB0cnkgdGhlIG5leHQgb25lLiAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgbGVuKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgdW5pcXVlX25hbWU7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgLyogV2UgYWxyZWFkeSBoYW5kbGVkIGFuIEhlbGxvIG1lc3NhZ2UgZm9yIHRoaXMgY29ubmVjdGlvbi4gKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkFscmVhZHkgaGFuZGxlZCBhbiBIZWxsbyBtZXNzYWdlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIE5vdGUgdGhhdCB3aGVuIHRoZXNlIGxpbWl0cyBhcmUgZXhjZWVkZWQgd2UgZG9uJ3QgZGlzY29ubmVjdCB0aGUKKyAgICogY29ubmVjdGlvbjsgd2UganVzdCBzb3J0IG9mIGxlYXZlIGl0IGhhbmdpbmcgdGhlcmUgdW50aWwgaXQgdGltZXMKKyAgICogb3V0IG9yIGRpc2Nvbm5lY3RzIGl0c2VsZiBvciBpcyBkcm9wcGVkIGR1ZSB0byB0aGUgbWF4IG51bWJlciBvZgorICAgKiBpbmNvbXBsZXRlIGNvbm5lY3Rpb25zLiBJdCdzIGV2ZW4gT0sgaWYgdGhlIGNvbm5lY3Rpb24gd2FudHMgdG8KKyAgICogcmV0cnkgdGhlIGhlbGxvIG1lc3NhZ2UsIHdlIHN1cHBvcnQgdGhhdC4KKyAgICovCisgIGNvbm5lY3Rpb25zID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChjb25uZWN0aW9uKTsKKyAgaWYgKCFidXNfY29ubmVjdGlvbnNfY2hlY2tfbGltaXRzIChjb25uZWN0aW9ucywgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdW5pcXVlX25hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBpZiAoIWNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUgKHJlZ2lzdHJ5LCAmdW5pcXVlX25hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2NvbXBsZXRlIChjb25uZWN0aW9uLCAmdW5pcXVlX25hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgZ290byBvdXRfMDsKKworICAvKiBDcmVhdGUgdGhlIHNlcnZpY2UgKi8KKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9lbnN1cmUgKHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuaXF1ZV9uYW1lLCBjb25uZWN0aW9uLCAwLCB0cmFuc2FjdGlvbiwgZXJyb3IpOworICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0XzA7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVuaXF1ZV9uYW1lKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICpoZWxsb19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqd2VsY29tZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBuYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisKKyAgd2VsY29tZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAoaGVsbG9fbWVzc2FnZSk7CisgIGlmICh3ZWxjb21lID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHdlbGNvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHdlbGNvbWUpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAod2VsY29tZSwgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcpKTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgd2VsY29tZSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICh3ZWxjb21lKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICh3ZWxjb21lKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGludCBsZW47CisgIGNoYXIgKipzZXJ2aWNlczsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBpbnQgaTsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBzdWI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfcmVnaXN0cnlfbGlzdF9zZXJ2aWNlcyAocmVnaXN0cnksICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksICZpdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB7CisgICAgLyogSW5jbHVkZSB0aGUgYnVzIGRyaXZlciBpbiB0aGUgbGlzdCAqLworICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gREJVU19TRVJWSUNFX0RCVVM7CisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORykpCisgICAgICB7CisgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKyAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZXNbaV0pKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICArK2k7CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZzdWIpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9hY3RpdmF0YWJsZV9zZXJ2aWNlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBpbnQgbGVuOworICBjaGFyICoqc2VydmljZXM7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGludCBpOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHN1YjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhY3RpdmF0aW9uID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKGNvbm5lY3Rpb24pOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9saXN0X3NlcnZpY2VzIChhY3RpdmF0aW9uLCAmc2VydmljZXMsICZsZW4pKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKHJlcGx5LCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKwkJCQkJIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorCQkJCQkgJnN1YikpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB7CisgICAgLyogSW5jbHVkZSB0aGUgYnVzIGRyaXZlciBpbiB0aGUgbGlzdCAqLworICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gREJVU19TRVJWSUNFX0RCVVM7CisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9TVFJJTkcsCisJCQkJCSAmdl9TVFJJTkcpKQorICAgICAgeworCWRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKwlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKwlCVVNfU0VUX09PTSAoZXJyb3IpOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKwkJCQkJICAgJnNlcnZpY2VzW2ldKSkKKwl7CisJICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisJICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKwkgIEJVU19TRVRfT09NIChlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgKytpOworICAgIH0KKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmc3ViKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c191aW50MzJfdCBzZXJ2aWNlX3JlcGx5OworICBkYnVzX3VpbnQzMl90IGZsYWdzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gb3duIG5hbWUgJXMgd2l0aCBmbGFncyAweCV4XG4iLCBuYW1lLCBmbGFncyk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIHJlcGx5ID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2VfbmFtZSwgbmFtZSk7CisKKyAgaWYgKCFidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlIChyZWdpc3RyeSwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9uYW1lLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9yZXBseSwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksIERCVVNfVFlQRV9VSU5UMzIsICZzZXJ2aWNlX3JlcGx5LCBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3JlbGVhc2Vfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c191aW50MzJfdCBzZXJ2aWNlX3JlcGx5OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gcmVsZWFzZSBuYW1lICVzXG4iLCBuYW1lKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgcmVwbHkgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9uYW1lLCBuYW1lKTsKKworICBpZiAoIWJ1c19yZWdpc3RyeV9yZWxlYXNlX3NlcnZpY2UgKHJlZ2lzdHJ5LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX25hbWUsICZzZXJ2aWNlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwgREJVU19UWVBFX1VJTlQzMiwgJnNlcnZpY2VfcmVwbHksIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlX25hbWU7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIGRidXNfYm9vbF90IHNlcnZpY2VfZXhpc3RzOworICBjb25zdCBjaGFyICpuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChzdHJjbXAgKG5hbWUsIERCVVNfU0VSVklDRV9EQlVTKSA9PSAwKQorICAgIHsKKyAgICAgIHNlcnZpY2VfZXhpc3RzID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2VfbmFtZSwgbmFtZSk7CisgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzZXJ2aWNlX25hbWUpOworICAgICAgc2VydmljZV9leGlzdHMgPSBzZXJ2aWNlICE9IE5VTEw7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQk9PTEVBTiwgJnNlcnZpY2VfZXhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGFjdGl2YXRpb24gPSBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgYXJndW1lbnRzIHRvIFN0YXJ0U2VydmljZUJ5TmFtZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoYWN0aXZhdGlvbiwgY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIG5hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSgpIGZhaWxlZFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2Fja19yZXBseSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChtZXNzYWdlKSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV91cGRhdGVfYWN0aXZhdGlvbl9lbnZpcm9ubWVudCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIGRpY3RfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIGRpY3RfZW50cnlfaXRlcjsKKyAgaW50IG1zZ190eXBlOworICBpbnQgYXJyYXlfdHlwZTsKKyAgaW50IGtleV90eXBlOworICBEQnVzTGlzdCAqa2V5cywgKmtleV9saW5rOworICBEQnVzTGlzdCAqdmFsdWVzLCAqdmFsdWVfbGluazsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhY3RpdmF0aW9uID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKGNvbm5lY3Rpb24pOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKworICAvKiBUaGUgbWVzc2FnZSBzaWduYXR1cmUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciB1cywKKyAgICogc28gbGV0J3MganVzdCBhc3NlcnQgaXQncyByaWdodC4KKyAgICovCisgIG1zZ190eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChtc2dfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmZGljdF9pdGVyKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBUaGVuIGxvb3AgdGhyb3VnaCB0aGUgc2VudCBkaWN0aW9uYXJ5LCBhZGQgdGhlIGxvY2F0aW9uIG9mCisgICAqIHRoZSBlbnZpcm9ubWVudCBrZXlzIGFuZCB2YWx1ZXMgdG8gbGlzdHMuIFRoZSByZXN1bHQgd2lsbAorICAgKiBiZSBpbiByZXZlcnNlIG9yZGVyLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGNvbnN0YW50bHkgc2VhcmNoCisgICAqIGZvciB0aGUgZW5kIG9mIHRoZSBsaXN0IGluIGEgbG9vcC4KKyAgICovCisgIGtleXMgPSBOVUxMOworICB2YWx1ZXMgPSBOVUxMOworICB3aGlsZSAoKGFycmF5X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZkaWN0X2l0ZXIpKSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmZGljdF9pdGVyLCAmZGljdF9lbnRyeV9pdGVyKTsKKworICAgICAgd2hpbGUgKChrZXlfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmRpY3RfZW50cnlfaXRlcikpID09IERCVVNfVFlQRV9TVFJJTkcpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICprZXk7CisgICAgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgICAgaW50IHZhbHVlX3R5cGU7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZkaWN0X2VudHJ5X2l0ZXIsICZrZXkpOworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZkaWN0X2VudHJ5X2l0ZXIpOworCisgICAgICAgICAgdmFsdWVfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmRpY3RfZW50cnlfaXRlcik7CisKKyAgICAgICAgICBpZiAodmFsdWVfdHlwZSAhPSBEQlVTX1RZUEVfU1RSSU5HKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZkaWN0X2VudHJ5X2l0ZXIsICZ2YWx1ZSk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgma2V5cywga2V5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdmFsdWVzLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmRpY3RfZW50cnlfaXRlcik7CisgICAgICAgIH0KKworICAgICAgaWYgKGtleV90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICBicmVhazsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmRpY3RfaXRlcik7CisgICAgfQorCisgIGlmIChhcnJheV90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgma2V5cykgPT0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmdmFsdWVzKSk7CisKKyAga2V5X2xpbmsgPSBrZXlzOworICB2YWx1ZV9saW5rID0gdmFsdWVzOworICB3aGlsZSAoa2V5X2xpbmsgIT0gTlVMTCkKKyAgeworICAgICAgY29uc3QgY2hhciAqa2V5OworICAgICAgY29uc3QgY2hhciAqdmFsdWU7CisKKyAgICAgIGtleSA9IGtleV9saW5rLT5kYXRhOworICAgICAgdmFsdWUgPSB2YWx1ZV9saW5rLT5kYXRhOworCisgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBlcnJvcikpCisgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUoKSBmYWlsZWRcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAga2V5X2xpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZrZXlzLCBrZXlfbGluayk7CisgICAgICB2YWx1ZV9saW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdmFsdWVzLCB2YWx1ZV9saW5rKTsKKyAgfQorCisgIC8qIEZJWE1FOiBXZSBjYW4gZmFpbCBlYXJseSBoYXZpbmcgc2V0IG9ubHkgc29tZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLAorICAgKiAoYmVjYXVzZSBvZiBPT00gZmFpbHVyZSkuICBJdCdzIHNvcnQgb2YgaGFyZCB0byBmaXggYW5kIGl0IGRvZXNuJ3QgcmVhbGx5CisgICAqIG1hdHRlciwgc28gd2UncmUgcHVudGluZyBmb3Igbm93LgorICAgKi8KKyAgaWYgKGtleV9saW5rICE9IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFzZW5kX2Fja19yZXBseSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBfZGJ1c19saXN0X2NsZWFyICgma2V5cyk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ2YWx1ZXMpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2FkZF9tYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworICBjb25zdCBjaGFyICp0ZXh0OworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICB0ZXh0ID0gTlVMTDsKKyAgcnVsZSA9IE5VTEw7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzIChjb25uZWN0aW9uKSA+PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbikpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBtb3JlIG1hdGNoIHJ1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGluY3JlYXNlIGxpbWl0cyBpbiBjb25maWd1cmF0aW9uIGZpbGUgaWYgcmVxdWlyZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgYXJndW1lbnRzIHRvIEFkZE1hdGNoXG4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisKKyAgcnVsZSA9IGJ1c19tYXRjaF9ydWxlX3BhcnNlIChjb25uZWN0aW9uLCAmc3RyLCBlcnJvcik7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgbWF0Y2htYWtlciA9IGJ1c19jb25uZWN0aW9uX2dldF9tYXRjaG1ha2VyIChjb25uZWN0aW9uKTsKKworICBpZiAoIWJ1c19tYXRjaG1ha2VyX2FkZF9ydWxlIChtYXRjaG1ha2VyLCBydWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghc2VuZF9hY2tfcmVwbHkgKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgKG1hdGNobWFrZXIsIHJ1bGUpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9yZW1vdmVfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgdGV4dCA9IE5VTEw7CisgIHJ1bGUgPSBOVUxMOworCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gZ2V0IGFyZ3VtZW50cyB0byBSZW1vdmVNYXRjaFxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHRleHQpOworCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9wYXJzZSAoY29ubmVjdGlvbiwgJnN0ciwgZXJyb3IpOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIFNlbmQgdGhlIGFjayBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBydWxlLCBzaW5jZSB0aGUgYWNrIGlzIHVuZG9uZQorICAgKiBvbiB0cmFuc2FjdGlvbiBjYW5jZWwsIGJ1dCBydWxlIHJlbW92YWwgaXNuJ3QuCisgICAqLworICBpZiAoIXNlbmRfYWNrX3JlcGx5IChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIG1hdGNobWFrZXIgPSBidXNfY29ubmVjdGlvbl9nZXRfbWF0Y2htYWtlciAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9ieV92YWx1ZSAobWF0Y2htYWtlciwgcnVsZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgY29uc3QgY2hhciAqYmFzZV9uYW1lOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHRleHQgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdGV4dCwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgIGlmIChzZXJ2aWNlID09IE5VTEwgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIC8qIE9SR19GUkVFREVTS1RPUF9EQlVTIG93bnMgaXRzZWxmICovCisgICAgICBiYXNlX25hbWUgPSBEQlVTX1NFUlZJQ0VfREJVUzsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBvd25lciBvZiBuYW1lICclcyc6IG5vIHN1Y2ggbmFtZSIsIHRleHQpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmFzZV9uYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSk7CisgICAgICBpZiAoYmFzZV9uYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGSVhNRSAtIGhvdyBpcyB0aGlzIGVycm9yIHBvc3NpYmxlPyAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHVuaXF1ZSBuYW1lIGZvciAnJXMnIiwgdGV4dCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX2Fzc2VydCAoKmJhc2VfbmFtZSA9PSAnOicpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJhc2VfbmFtZSAhPSBOVUxMKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9uYW1lLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2xpc3RfcXVldWVkX293bmVycyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCSAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgREJ1c0xpc3QgKmJhc2VfbmFtZXM7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJheV9pdGVyOworICBjaGFyICpkYnVzX3NlcnZpY2VfbmFtZSA9IERCVVNfU0VSVklDRV9EQlVTOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBiYXNlX25hbWVzID0gTlVMTDsKKyAgdGV4dCA9IE5VTEw7CisgIHJlcGx5ID0gTlVMTDsKKworICBpZiAoISBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorCQkJICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ0ZXh0LAorCQkJICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXh0KTsKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCAmJgorICAgICAgX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgLyogT1JHX0ZSRUVERVNLVE9QX0RCVVMgb3ducyBpdHNlbGYgKi8KKyAgICAgIGlmICghIF9kYnVzX2xpc3RfYXBwZW5kICgmYmFzZV9uYW1lcywgZGJ1c19zZXJ2aWNlX25hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBvd25lcnMgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCB0ZXh0KTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghYnVzX3NlcnZpY2VfbGlzdF9xdWV1ZWRfb3duZXJzIChzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYmFzZV9uYW1lcyAhPSBOVUxMKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycmF5X2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmYmFzZV9uYW1lcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgY2hhciAqdW5hbWU7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+ZGF0YSAhPSBOVUxMKTsKKyAgICAgIHVuYW1lID0gKGNoYXIgKilsaW5rLT5kYXRhOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFycmF5X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmJhc2VfbmFtZXMsIGxpbmspOworICAgIH0KKworICBpZiAoISBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmYXJyYXlfaXRlcikpCisgICAgZ290byBvb207CisKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgaWYgKGJhc2VfbmFtZXMpCisgICAgX2RidXNfbGlzdF9jbGVhciAoJmJhc2VfbmFtZXMpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2U7CisgIERCdXNTdHJpbmcgc3RyOworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisgIEJ1c1NlcnZpY2UgKnNlcnY7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIHVuc2lnbmVkIGxvbmcgdWlkOworICBkYnVzX3VpbnQzMl90IHVpZDMyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBzZXJ2aWNlID0gTlVMTDsKKyAgcmVwbHkgPSBOVUxMOworCisgIGlmICghIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisJCQkgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2UsCisJCQkgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImFza2VkIGZvciBVSUQgb2YgY29ubmVjdGlvbiAlc1xuIiwgc2VydmljZSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNlcnZpY2UpOworICBzZXJ2ID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzdHIpOworICBpZiAoc2VydiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKwkJICAgICAgIkNvdWxkIG5vdCBnZXQgVUlEIG9mIG5hbWUgJyVzJzogbm8gc3VjaCBuYW1lIiwgc2VydmljZSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29ubiA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2KTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm4sICZ1aWQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVybWluZSBVSUQgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICB1aWQzMiA9IHVpZDsKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdWlkMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkJCSAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCQkgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgdW5zaWduZWQgbG9uZyBwaWQ7CisgIGRidXNfdWludDMyX3QgcGlkMzI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHNlcnZpY2UgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZSwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c192ZXJib3NlICgiYXNrZWQgZm9yIFBJRCBvZiBjb25uZWN0aW9uICVzXG4iLCBzZXJ2aWNlKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgc2VydmljZSk7CisgIHNlcnYgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgIGlmIChzZXJ2ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX05BTUVfSEFTX05PX09XTkVSLAorCQkgICAgICAiQ291bGQgbm90IGdldCBQSUQgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb25uID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnYpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubiwgJnBpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfVU5JWF9QUk9DRVNTX0lEX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgUElEIGZvciAnJXMnIiwgc2VydmljZSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcGlkMzIgPSBwaWQ7CisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnBpZDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkJICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgdm9pZCAqZGF0YSA9IE5VTEw7CisgIGRidXNfdWludDMyX3QgZGF0YV9zaXplOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBzZXJ2aWNlID0gTlVMTDsKKyAgcmVwbHkgPSBOVUxMOworCisgIGlmICghIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisJCQkgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2UsCisJCQkgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImFza2VkIGZvciBhdWRpdCBzZXNzaW9uIGRhdGEgZm9yIGNvbm5lY3Rpb24gJXNcbiIsIHNlcnZpY2UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBzZXJ2aWNlKTsKKyAgc2VydiA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgaWYgKHNlcnYgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisJCSAgICAgICJDb3VsZCBub3QgZ2V0IGF1ZGl0IHNlc3Npb24gZGF0YSBmb3IgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb25uID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnYpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKGNvbm4sICZkYXRhLCAmZGF0YV9zaXplKSB8fCBkYXRhID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQURUX0FVRElUX0RBVEFfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVybWluZSBhdWRpdCBzZXNzaW9uIGRhdGEgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoISBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsICZkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3NlbGludXhfc2VjdXJpdHlfY29udGV4dCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkJICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkJCSAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgQnVzU0VMaW51eElEICpjb250ZXh0OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBzZXJ2aWNlID0gTlVMTDsKKyAgcmVwbHkgPSBOVUxMOworCisgIGlmICghIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisJCQkgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2UsCisJCQkgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImFza2VkIGZvciBzZWN1cml0eSBjb250ZXh0IG9mIGNvbm5lY3Rpb24gJXNcbiIsIHNlcnZpY2UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBzZXJ2aWNlKTsKKyAgc2VydiA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgaWYgKHNlcnYgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisJCSAgICAgICJDb3VsZCBub3QgZ2V0IHNlY3VyaXR5IGNvbnRleHQgb2YgbmFtZSAnJXMnOiBubyBzdWNoIG5hbWUiLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb25uID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKHNlcnYpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgY29udGV4dCA9IGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkIChjb25uKTsKKyAgaWYgKCFjb250ZXh0KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFTElOVVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHNlY3VyaXR5IGNvbnRleHQgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoISBidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCAocmVwbHksIGNvbnRleHQsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9yZWxvYWRfY29uZmlnIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVwbHkgPSBOVUxMOworCisgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgIGlmICghYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyAoY29udGV4dCwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCEgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHV1aWQ7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXBseSA9IE5VTEw7CisKKyAgY29udGV4dCA9IGJ1c19jb25uZWN0aW9uX2dldF9jb250ZXh0IChjb25uZWN0aW9uKTsKKyAgaWYgKCFidXNfY29udGV4dF9nZXRfaWQgKGNvbnRleHQsICZ1dWlkKSkKKyAgICBnb3RvIG9vbTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdXVpZCk7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChyZXBseSwgInMiKSk7CisKKyAgaWYgKCEgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBGb3Igc3BlZWQgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIHNvcnQgdGhpcyBpbiBvcmRlciBvZgorICogZnJlcXVlbmN5IG9mIHVzZSAoYnV0IGRvZXNuJ3QgbWF0dGVyIHdpdGggb25seSBhIGZldyBpdGVtcworICogYW55aG93KQorICovCitzdGF0aWMgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKmluX2FyZ3M7CisgIGNvbnN0IGNoYXIgKm91dF9hcmdzOworICBkYnVzX2Jvb2xfdCAoKiBoYW5kbGVyKSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7Cit9IG1lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiSGVsbG8iLAorICAgICIiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvIH0sCisgIHsgIlJlcXVlc3ROYW1lIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9hY3F1aXJlX3NlcnZpY2UgfSwKKyAgeyAiUmVsZWFzZU5hbWUiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX3JlbGVhc2Vfc2VydmljZSB9LAorICB7ICJTdGFydFNlcnZpY2VCeU5hbWUiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2FjdGl2YXRlX3NlcnZpY2UgfSwKKyAgeyAiVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50IiwKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORyBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVJfQVNfU1RSSU5HLAorICAgICIiLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50IH0sCisgIHsgIk5hbWVIYXNPd25lciIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX0JPT0xFQU5fQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzIH0sCisgIHsgIkxpc3ROYW1lcyIsCisgICAgIiIsCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORyBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzIH0sCisgIHsgIkxpc3RBY3RpdmF0YWJsZU5hbWVzIiwKKyAgICAiIiwKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2xpc3RfYWN0aXZhdGFibGVfc2VydmljZXMgfSwKKyAgeyAiQWRkTWF0Y2giLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgICIiLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2FkZF9tYXRjaCB9LAorICB7ICJSZW1vdmVNYXRjaCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgIiIsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfcmVtb3ZlX21hdGNoIH0sCisgIHsgIkdldE5hbWVPd25lciIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X3NlcnZpY2Vfb3duZXIgfSwKKyAgeyAiTGlzdFF1ZXVlZE93bmVycyIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORyBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9saXN0X3F1ZXVlZF9vd25lcnMgfSwKKyAgeyAiR2V0Q29ubmVjdGlvblVuaXhVc2VyIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3VzZXIgfSwKKyAgeyAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCB9LAorICB7ICJHZXRBZHRBdWRpdFNlc3Npb25EYXRhIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSB9LAorICB7ICJHZXRDb25uZWN0aW9uU0VMaW51eFNlY3VyaXR5Q29udGV4dCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORyBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fc2VsaW51eF9zZWN1cml0eV9jb250ZXh0IH0sCisgIHsgIlJlbG9hZENvbmZpZyIsCisgICAgIiIsCisgICAgIiIsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfcmVsb2FkX2NvbmZpZyB9LAorICB7ICJHZXRJZCIsCisgICAgIiIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2lkIH0KK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uIChEQnVzU3RyaW5nICp4bWwsCisJCQkgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZSwKKwkJCSAgZGJ1c19ib29sX3QgaW4pCit7CisgIERCdXNUeXBlUmVhZGVyIHR5cGVyZWFkZXI7CisgIERCdXNTdHJpbmcgc2lnc3RyOworICBpbnQgY3VycmVudF90eXBlOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2lnc3RyLCBzaWduYXR1cmUpOworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZ0eXBlcmVhZGVyLCAmc2lnc3RyLCAwKTsKKworICB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZ0eXBlcmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgY29uc3QgREJ1c1N0cmluZyAqc3Vic2lnOworICAgICAgaW50IHN0YXJ0LCBsZW47CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9zaWduYXR1cmUgKCZ0eXBlcmVhZGVyLCAmc3Vic2lnLCAmc3RhcnQsICZsZW4pOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICAgICAgPGFyZyBkaXJlY3Rpb249XCIlc1wiIHR5cGU9XCIiLAorCQkJCSAgICAgICBpbiA/ICJpbiIgOiAib3V0IikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICh4bWwsCisJCQkJICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3Vic2lnKSArIHN0YXJ0LAorCQkJCSAgICBsZW4pKQorCWdvdG8gb29tOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICJcIi8+XG4iKSkKKwlnb3RvIG9vbTsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnR5cGVyZWFkZXIpOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cisgb29tOgorICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nIChEQnVzU3RyaW5nICp4bWwpCit7CisgIGludCBpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoeG1sLCBEQlVTX0lOVFJPU1BFQ1RfMV8wX1hNTF9ET0NUWVBFX0RFQ0xfTk9ERSkpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIjxub2RlPlxuIikpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICh4bWwsICIgIDxpbnRlcmZhY2UgbmFtZT1cIiVzXCI+XG4iLCBEQlVTX0lOVEVSRkFDRV9JTlRST1NQRUNUQUJMRSkpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIiAgICA8bWV0aG9kIG5hbWU9XCJJbnRyb3NwZWN0XCI+XG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgICAgIDxhcmcgbmFtZT1cImRhdGFcIiBkaXJlY3Rpb249XCJvdXRcIiB0eXBlPVwiJXNcIi8+XG4iLCBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORykpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIiAgICA8L21ldGhvZD5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICIgIDwvaW50ZXJmYWNlPlxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgPGludGVyZmFjZSBuYW1lPVwiJXNcIj5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChtZXNzYWdlX2hhbmRsZXJzKSkKKyAgICB7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgICA8bWV0aG9kIG5hbWU9XCIlc1wiPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaGFuZGxlcnNbaV0ubmFtZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCF3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24gKHhtbCwgbWVzc2FnZV9oYW5kbGVyc1tpXS5pbl9hcmdzLCBUUlVFKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghd3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uICh4bWwsIG1lc3NhZ2VfaGFuZGxlcnNbaV0ub3V0X2FyZ3MsIEZBTFNFKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoeG1sLCAiICAgIDwvbWV0aG9kPlxuIikpCisJcmV0dXJuIEZBTFNFOworCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgICA8c2lnbmFsIG5hbWU9XCJOYW1lT3duZXJDaGFuZ2VkXCI+XG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICAgICAgPGFyZyB0eXBlPVwic1wiLz5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICh4bWwsICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICAgIDwvc2lnbmFsPlxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICh4bWwsICIgICAgPHNpZ25hbCBuYW1lPVwiTmFtZUxvc3RcIj5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICh4bWwsICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgICA8L3NpZ25hbD5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICAgIDxzaWduYWwgbmFtZT1cIk5hbWVBY3F1aXJlZFwiPlxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICAgIDwvc2lnbmFsPlxuIikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoeG1sLCAiICA8L2ludGVyZmFjZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIjwvbm9kZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHhtbDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjb25zdCBjaGFyICp2X1NUUklORzsKKworICBfZGJ1c192ZXJib3NlICgiSW50cm9zcGVjdCgpIG9uIGJ1cyBkcml2ZXJcbiIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlcGx5ID0gTlVMTDsKKworICBpZiAoISBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorCQkJICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ4bWwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyAoJnhtbCkpCisgICAgZ290byBvb207CisKKyAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ4bWwpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnhtbCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmeG1sKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCSAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpuYW1lLCAqc2VuZGVyLCAqaW50ZXJmYWNlOworICBpbnQgaTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvbkZhaWx1cmUiKSkKKyAgICB7CisgICAgICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgICAgICBjb250ZXh0ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2NvbnRleHQgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIGRidXNfYWN0aXZhdGlvbl9zeXN0ZW1kX2ZhaWx1cmUoYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb24oY29udGV4dCksIG1lc3NhZ2UpOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRHJpdmVyIGdvdCBhIG5vbi1tZXRob2QtY2FsbCBtZXNzYWdlLCBpZ25vcmluZ1xuIik7CisgICAgICByZXR1cm4gVFJVRTsgLyogd2UganVzdCBpZ25vcmUgdGhpcyAqLworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9JTlRST1NQRUNUQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludHJvc3BlY3QiKSkKKyAgICByZXR1cm4gYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIG1lc3NhZ2UsIGVycm9yKTsKKworICBpbnRlcmZhY2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisgIGlmIChpbnRlcmZhY2UgPT0gTlVMTCkKKyAgICBpbnRlcmZhY2UgPSBEQlVTX0lOVEVSRkFDRV9EQlVTOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworCisgIG5hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisgIHNlbmRlciA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKTsKKworICBpZiAoc3RyY21wIChpbnRlcmZhY2UsCisgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMpICE9IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkRyaXZlciBnb3QgbWVzc2FnZSB0byB1bmtub3duIGludGVyZmFjZSBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UpOworICAgICAgZ290byB1bmtub3duOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiRHJpdmVyIGdvdCBhIG1ldGhvZCBjYWxsOiAlc1xuIiwKKwkJIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSk7CisKKyAgLyogc2VjdXJpdHkgY2hlY2tzIHNob3VsZCBoYXZlIGtlcHQgdGhpcyBmcm9tIGdldHRpbmcgaGVyZSAqLworICBfZGJ1c19hc3NlcnQgKHNlbmRlciAhPSBOVUxMIHx8IHN0cmNtcCAobmFtZSwgIkhlbGxvIikgPT0gMCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAobWVzc2FnZV9oYW5kbGVycykpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAobWVzc2FnZV9oYW5kbGVyc1tpXS5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZvdW5kIGRyaXZlciBoYW5kbGVyIGZvciAlc1xuIiwgbmFtZSk7CisKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChtZXNzYWdlLCBtZXNzYWdlX2hhbmRsZXJzW2ldLmluX2FyZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNhbGwgdG8gJXMgaGFzIHdyb25nIGFyZ3MgKCVzLCBleHBlY3RlZCAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9oYW5kbGVyc1tpXS5pbl9hcmdzKTsKKworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGwgdG8gJXMgaGFzIHdyb25nIGFyZ3MgKCVzLCBleHBlY3RlZCAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2hhbmRsZXJzW2ldLmluX2FyZ3MpOworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICgoKiBtZXNzYWdlX2hhbmRsZXJzW2ldLmhhbmRsZXIpIChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgbWVzc2FnZSwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkRyaXZlciBoYW5kbGVyIHN1Y2NlZWRlZFxuIik7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRHJpdmVyIGhhbmRsZXIgcmV0dXJuZWQgZmFpbHVyZVxuIik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgdW5rbm93bjoKKyAgX2RidXNfdmVyYm9zZSAoIk5vIGRyaXZlciBoYW5kbGVyIGZvciBtZXNzYWdlIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgbmFtZSk7CisKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9ELAorICAgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IHVuZGVyc3RhbmQgbWVzc2FnZSAlcyIsCisgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUywgbmFtZSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogRklYTUUgMS4wIERvZXMgbm90aGluZyBmb3Igbm93LCBzaG91bGQgdW5yZWdpc3RlciB0aGUgY29ubmVjdGlvbgorICAgKiB3aXRoIHRoZSBidXMgZHJpdmVyLgorICAgKi8KK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9kcml2ZXIuaCBiL2RidXMtMS40LjEwL2J1cy9kcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTNiMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL2RyaXZlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZHJpdmVyLmggIEJ1cyBjbGllbnQgKGRyaXZlcikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0RSSVZFUl9ICisjZGVmaW5lIEJVU19EUklWRVJfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCit2b2lkICAgICAgICBidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSAgICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgIChjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorCQkJCQkJICAgIGNvbnN0IGNoYXIgICAgICpvbGRfb3duZXIsCisJCQkJCQkgICAgY29uc3QgY2hhciAgICAgKm5ld19vd25lciwKKwkJCQkJCSAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJCQkgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfZ2VuZXJhdGVfaW50cm9zcGVjdF9zdHJpbmcgIChEQnVzU3RyaW5nICp4bWwpOworCisKKworI2VuZGlmIC8qIEJVU19EUklWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2V4cGlyZWxpc3QuYyBiL2RidXMtMS40LjEwL2J1cy9leHBpcmVsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2YTYxNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9leHBpcmVsaXN0LmMKQEAgLTAsMCArMSw0MTMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZXhwaXJlbGlzdC5jICBMaXN0IG9mIGl0ZW1zIHRoYXQgZXhwaXJlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZXhwaXJlbGlzdC5oIgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1haW5sb29wLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKworc3RydWN0IEJ1c0V4cGlyZUxpc3QKK3sKKyAgREJ1c0xpc3QgICAgICAqaXRlbXM7IC8qKjwgTGlzdCBvZiBCdXNFeHBpcmVJdGVtICovCisgIERCdXNUaW1lb3V0ICAgKnRpbWVvdXQ7CisgIERCdXNMb29wICAgICAgKmxvb3A7CisgIEJ1c0V4cGlyZUZ1bmMgIGV4cGlyZV9mdW5jOworICB2b2lkICAgICAgICAgICpkYXRhOworICBpbnQgICAgICAgICAgICBleHBpcmVfYWZ0ZXI7IC8qKjwgRXhwaXJlIGFmdGVyIG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMpICovCit9OworCitzdGF0aWMgZGJ1c19ib29sX3QgZXhwaXJlX3RpbWVvdXRfaGFuZGxlciAodm9pZCAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCitjYWxsX3RpbWVvdXRfY2FsbGJhY2sgKERCdXNUaW1lb3V0ICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIC8qIGNhbiByZXR1cm4gRkFMU0Ugb24gT09NIGJ1dCB3ZSBqdXN0IGxldCBpdCBmaXJlIGFnYWluIGxhdGVyICovCisgIGRidXNfdGltZW91dF9oYW5kbGUgKHRpbWVvdXQpOworfQorCitCdXNFeHBpcmVMaXN0KgorYnVzX2V4cGlyZV9saXN0X25ldyAoREJ1c0xvb3AgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGV4cGlyZV9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUZ1bmMgIGV4cGlyZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzRXhwaXJlTGlzdCAqbGlzdDsKKworICBsaXN0ID0gZGJ1c19uZXcwIChCdXNFeHBpcmVMaXN0LCAxKTsKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBsaXN0LT5leHBpcmVfZnVuYyA9IGV4cGlyZV9mdW5jOworICBsaXN0LT5kYXRhID0gZGF0YTsKKyAgbGlzdC0+bG9vcCA9IGxvb3A7CisgIGxpc3QtPmV4cGlyZV9hZnRlciA9IGV4cGlyZV9hZnRlcjsKKworICBsaXN0LT50aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKDEwMCwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZV90aW1lb3V0X2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgTlVMTCk7CisgIGlmIChsaXN0LT50aW1lb3V0ID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAobGlzdC0+dGltZW91dCwgRkFMU0UpOworCisgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAobGlzdC0+bG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LT50aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdGltZW91dF9jYWxsYmFjaywgTlVMTCwgTlVMTCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dXJuIGxpc3Q7CisKKyBmYWlsZWQ6CisgIGlmIChsaXN0LT50aW1lb3V0KQorICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGxpc3QtPnRpbWVvdXQpOworCisgIGRidXNfZnJlZSAobGlzdCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF9mcmVlIChCdXNFeHBpcmVMaXN0ICpsaXN0KQoreworICBfZGJ1c19hc3NlcnQgKGxpc3QtPml0ZW1zID09IE5VTEwpOworCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGxpc3QtPmxvb3AsIGxpc3QtPnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdGltZW91dF9jYWxsYmFjaywgTlVMTCk7CisKKyAgX2RidXNfdGltZW91dF91bnJlZiAobGlzdC0+dGltZW91dCk7CisKKyAgZGJ1c19mcmVlIChsaXN0KTsKK30KKwordm9pZAorYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAoREJ1c1RpbWVvdXQgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwpCit7CisgIGlmIChuZXh0X2ludGVydmFsID49IDApCisgICAgeworICAgICAgX2RidXNfdGltZW91dF9zZXRfaW50ZXJ2YWwgKHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCk7CisgICAgICBfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkICh0aW1lb3V0LCBUUlVFKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkVuYWJsZWQgYW4gZXhwaXJlIHRpbWVvdXQgd2l0aCBpbnRlcnZhbCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c190aW1lb3V0X2dldF9lbmFibGVkICh0aW1lb3V0KSkKKyAgICB7CisgICAgICBfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkICh0aW1lb3V0LCBGQUxTRSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaXNhYmxlZCBhbiBleHBpcmUgdGltZW91dFxuIik7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfdmVyYm9zZSAoIk5vIG5lZWQgdG8gZGlzYWJsZSB0aGlzIGV4cGlyZSB0aW1lb3V0XG4iKTsKK30KKwordm9pZAorYnVzX2V4cGlyZV9saXN0X3JlY2hlY2tfaW1tZWRpYXRlbHkgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJzZXR0aW5nIGludGVydmFsIG9uIGV4cGlyZSBsaXN0IHRvIDAgZm9yIGltbWVkaWF0ZSByZWNoZWNrXG4iKTsKKworICBidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChsaXN0LT50aW1lb3V0LCAwKTsKK30KKworc3RhdGljIGludAorZG9fZXhwaXJhdGlvbl93aXRoX2N1cnJlbnRfdGltZSAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHR2X3VzZWMpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgbmV4dF9pbnRlcnZhbCwgbWluX3dhaXRfdGltZSwgaXRlbXNfdG9fZXhwaXJlOworCisgIG5leHRfaW50ZXJ2YWwgPSAtMTsKKyAgbWluX3dhaXRfdGltZSA9IDM2MDAgKiAxMDAwOyAvKiB0aGlzIGlzIHJlc2V0IGFueXdheSBpZiB1c2VkICovCisgIGl0ZW1zX3RvX2V4cGlyZSA9IDA7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QtPml0ZW1zKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKKyAgICAgIGRvdWJsZSBlbGFwc2VkOworICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbTsKKworICAgICAgaXRlbSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGVsYXBzZWQgPSBFTEFQU0VEX01JTExJU0VDT05EU19TSU5DRSAoaXRlbS0+YWRkZWRfdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5hZGRlZF90dl91c2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl9zZWMsIHR2X3VzZWMpOworCisgICAgICBpZiAoKChpdGVtLT5hZGRlZF90dl9zZWMgPT0gMCkgJiYgKGl0ZW0tPmFkZGVkX3R2X3VzZWMgPT0gMCkpIHx8CisgICAgICAgICAgKChsaXN0LT5leHBpcmVfYWZ0ZXIgPiAwKSAmJiAoZWxhcHNlZCA+PSAoZG91YmxlKSBsaXN0LT5leHBpcmVfYWZ0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFeHBpcmluZyBhbiBpdGVtICVwXG4iLCBpdGVtKTsKKworICAgICAgICAgIC8qIElmIHRoZSBleHBpcmUgZnVuY3Rpb24gZmFpbHMsIHdlIGp1c3QgZW5kIHVwIGV4cGlyaW5nCisgICAgICAgICAgICogdGhpcyBpdGVtIG5leHQgdGltZSB3ZSB3YWxrIHRocm91Z2ggdGhlIGxpc3QuIFRoaXMgd291bGQKKyAgICAgICAgICAgKiBiZSBhbiBpbmRldGVybWluYXRlIHRpbWUgbm9ybWFsbHksIHNvIHdlIHNldCB1cCB0aGUKKyAgICAgICAgICAgKiBuZXh0X2ludGVydmFsIHRvIGJlICJzaG9ydGx5IiAoanVzdCBlbm91Z2ggdG8gYXZvaWQKKyAgICAgICAgICAgKiBhIGJ1c3kgbG9vcCkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoISgqIGxpc3QtPmV4cGlyZV9mdW5jKSAobGlzdCwgbGluaywgbGlzdC0+ZGF0YSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwgPSBfZGJ1c19nZXRfb29tX3dhaXQgKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChsaXN0LT5leHBpcmVfYWZ0ZXIgPiAwKQorICAgICAgICB7CisgICAgICAgICAgZG91YmxlIHRvX3dhaXQ7CisKKyAgICAgICAgICBpdGVtc190b19leHBpcmUgPSAxOworICAgICAgICAgIHRvX3dhaXQgPSAoZG91YmxlKSBsaXN0LT5leHBpcmVfYWZ0ZXIgLSBlbGFwc2VkOworICAgICAgICAgIGlmIChtaW5fd2FpdF90aW1lID4gdG9fd2FpdCkKKyAgICAgICAgICAgIG1pbl93YWl0X3RpbWUgPSB0b193YWl0OworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBpZiAobmV4dF9pbnRlcnZhbCA8IDAgJiYgaXRlbXNfdG9fZXhwaXJlKQorICAgIG5leHRfaW50ZXJ2YWwgPSBtaW5fd2FpdF90aW1lOworCisgIHJldHVybiBuZXh0X2ludGVydmFsOworfQorCitzdGF0aWMgdm9pZAorYnVzX2V4cGlyZWxpc3RfZXhwaXJlIChCdXNFeHBpcmVMaXN0ICpsaXN0KQoreworICBpbnQgbmV4dF9pbnRlcnZhbDsKKworICBuZXh0X2ludGVydmFsID0gLTE7CisKKyAgaWYgKGxpc3QtPml0ZW1zICE9IE5VTEwpCisgICAgeworICAgICAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisKKyAgICAgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKworICAgICAgbmV4dF9pbnRlcnZhbCA9IGRvX2V4cGlyYXRpb25fd2l0aF9jdXJyZW50X3RpbWUgKGxpc3QsIHR2X3NlYywgdHZfdXNlYyk7CisgICAgfQorCisgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGxpc3QtPnRpbWVvdXQsIG5leHRfaW50ZXJ2YWwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2V4cGlyZV90aW1lb3V0X2hhbmRsZXIgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0V4cGlyZUxpc3QgKmxpc3QgPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSdW5uaW5nXG4iKTsKKworICAvKiBub3RlIHRoYXQgdGhpcyBtYXkgcmVtb3ZlIHRoZSB0aW1lb3V0ICovCisgIGJ1c19leHBpcmVsaXN0X2V4cGlyZSAobGlzdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF9yZW1vdmVfbGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaykKK3sKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19leHBpcmVfbGlzdF9yZW1vdmUgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKQoreworICByZXR1cm4gX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0LT5pdGVtcywgaXRlbSk7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF91bmxpbmsgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKQoreworICBfZGJ1c19saXN0X3VubGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19leHBpcmVfbGlzdF9hZGQgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKQoreworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgcmV0ID0gX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdC0+aXRlbXMsIGl0ZW0pOworICBpZiAocmV0ICYmICFkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKGxpc3QtPnRpbWVvdXQpKQorICAgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGxpc3QtPnRpbWVvdXQsIDApOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2J1c19leHBpcmVfbGlzdF9hZGRfbGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaykKK3sKKyAgX2RidXNfYXNzZXJ0IChsaW5rLT5kYXRhICE9IE5VTEwpOworICAKKyAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZsaXN0LT5pdGVtcywgbGluayk7CisKKyAgaWYgKCFkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKGxpc3QtPnRpbWVvdXQpKQorICAgIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKGxpc3QtPnRpbWVvdXQsIDApOworfQorCitEQnVzTGlzdCoKK2J1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAoQnVzRXhwaXJlTGlzdCAqbGlzdCkKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0LT5pdGVtcyk7Cit9CisKK0RCdXNMaXN0KgorYnVzX2V4cGlyZV9saXN0X2dldF9uZXh0X2xpbmsgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaykKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19leHBpcmVfbGlzdF9jb250YWluc19pdGVtIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pCit7CisgIHJldHVybiBfZGJ1c19saXN0X2ZpbmRfbGFzdCAoJmxpc3QtPml0ZW1zLCBpdGVtKSAhPSBOVUxMOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNFeHBpcmVJdGVtIGl0ZW07CisgIGludCBleHBpcmVfY291bnQ7Cit9IFRlc3RFeHBpcmVJdGVtOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfZXhwaXJlX2Z1bmMgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rLAorICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgVGVzdEV4cGlyZUl0ZW0gKnQ7CisKKyAgdCA9IChUZXN0RXhwaXJlSXRlbSopIGxpbmstPmRhdGE7CisKKyAgdC0+ZXhwaXJlX2NvdW50ICs9IDE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0aW1lX2FkZF9taWxsaXNlY29uZHMgKGxvbmcgKnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbWlsbGlzZWNvbmRzKQoreworICAqdHZfc2VjID0gKnR2X3NlYyArIG1pbGxpc2Vjb25kcyAvIDEwMDA7CisgICp0dl91c2VjID0gKnR2X3VzZWMgKyBtaWxsaXNlY29uZHMgKiAxMDAwOworICBpZiAoKnR2X3VzZWMgPj0gMTAwMDAwMCkKKyAgICB7CisgICAgICAqdHZfdXNlYyAtPSAxMDAwMDAwOworICAgICAgKnR2X3NlYyArPSAxOworICAgIH0KK30KKworZGJ1c19ib29sX3QKK2J1c19leHBpcmVfbGlzdF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzTG9vcCAqbG9vcDsKKyAgQnVzRXhwaXJlTGlzdCAqbGlzdDsKKyAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisgIGxvbmcgdHZfc2VjX25vdF9leHBpcmVkLCB0dl91c2VjX25vdF9leHBpcmVkOworICBsb25nIHR2X3NlY19leHBpcmVkLCB0dl91c2VjX2V4cGlyZWQ7CisgIGxvbmcgdHZfc2VjX3Bhc3QsIHR2X3VzZWNfcGFzdDsKKyAgVGVzdEV4cGlyZUl0ZW0gKml0ZW07CisgIGludCBuZXh0X2ludGVydmFsOworICBkYnVzX2Jvb2xfdCByZXN1bHQgPSBGQUxTRTsKKworCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgX2RidXNfYXNzZXJ0IChsb29wICE9IE5VTEwpOworCisjZGVmaW5lIEVYUElSRV9BRlRFUiAxMDAKKyAgCisgIGxpc3QgPSBidXNfZXhwaXJlX2xpc3RfbmV3IChsb29wLCBFWFBJUkVfQUZURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2V4cGlyZV9mdW5jLCBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0ICE9IE5VTEwpOworCisgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKworICB0dl9zZWNfbm90X2V4cGlyZWQgPSB0dl9zZWM7CisgIHR2X3VzZWNfbm90X2V4cGlyZWQgPSB0dl91c2VjOworICB0aW1lX2FkZF9taWxsaXNlY29uZHMgKCZ0dl9zZWNfbm90X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR2X3VzZWNfbm90X2V4cGlyZWQsIEVYUElSRV9BRlRFUiAtIDEpOworCisgIHR2X3NlY19leHBpcmVkID0gdHZfc2VjOworICB0dl91c2VjX2V4cGlyZWQgPSB0dl91c2VjOworICB0aW1lX2FkZF9taWxsaXNlY29uZHMgKCZ0dl9zZWNfZXhwaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdHZfdXNlY19leHBpcmVkLCBFWFBJUkVfQUZURVIpOworICAKKworICB0dl9zZWNfcGFzdCA9IHR2X3NlYyAtIDE7CisgIHR2X3VzZWNfcGFzdCA9IHR2X3VzZWM7CisKKyAgaXRlbSA9IGRidXNfbmV3MCAoVGVzdEV4cGlyZUl0ZW0sIDEpOworCisgIGlmIChpdGVtID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaXRlbS0+aXRlbS5hZGRlZF90dl9zZWMgPSB0dl9zZWM7CisgIGl0ZW0tPml0ZW0uYWRkZWRfdHZfdXNlYyA9IHR2X3VzZWM7CisgIGlmICghYnVzX2V4cGlyZV9saXN0X2FkZCAobGlzdCwgJml0ZW0tPml0ZW0pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKworICBuZXh0X2ludGVydmFsID0KKyAgICBkb19leHBpcmF0aW9uX3dpdGhfY3VycmVudF90aW1lIChsaXN0LCB0dl9zZWNfbm90X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZfdXNlY19ub3RfZXhwaXJlZCk7CisgIF9kYnVzX2Fzc2VydCAoaXRlbS0+ZXhwaXJlX2NvdW50ID09IDApOworICBfZGJ1c192ZXJib3NlICgibmV4dF9pbnRlcnZhbCA9ICVkXG4iLCBuZXh0X2ludGVydmFsKTsKKyAgX2RidXNfYXNzZXJ0IChuZXh0X2ludGVydmFsID09IDEpOworICAKKyAgbmV4dF9pbnRlcnZhbCA9CisgICAgZG9fZXhwaXJhdGlvbl93aXRoX2N1cnJlbnRfdGltZSAobGlzdCwgdHZfc2VjX2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZfdXNlY19leHBpcmVkKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVtLT5leHBpcmVfY291bnQgPT0gMSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJuZXh0X2ludGVydmFsID0gJWRcbiIsIG5leHRfaW50ZXJ2YWwpOworICBfZGJ1c19hc3NlcnQgKG5leHRfaW50ZXJ2YWwgPT0gLTEpOworCisgIG5leHRfaW50ZXJ2YWwgPQorICAgIGRvX2V4cGlyYXRpb25fd2l0aF9jdXJyZW50X3RpbWUgKGxpc3QsIHR2X3NlY19wYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2X3VzZWNfcGFzdCk7CisgIF9kYnVzX2Fzc2VydCAoaXRlbS0+ZXhwaXJlX2NvdW50ID09IDEpOworICBfZGJ1c192ZXJib3NlICgibmV4dF9pbnRlcnZhbCA9ICVkXG4iLCBuZXh0X2ludGVydmFsKTsKKyAgX2RidXNfYXNzZXJ0IChuZXh0X2ludGVydmFsID09IDEwMDAgKyBFWFBJUkVfQUZURVIpOworCisgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmUgKGxpc3QsICZpdGVtLT5pdGVtKTsKKyAgZGJ1c19mcmVlIChpdGVtKTsKKyAgCisgIGJ1c19leHBpcmVfbGlzdF9mcmVlIChsaXN0KTsKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisgIAorICByZXN1bHQgPSBUUlVFOworCisgb29tOgorICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL2V4cGlyZWxpc3QuaCBiL2RidXMtMS40LjEwL2J1cy9leHBpcmVsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3Y2I5NwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9leHBpcmVsaXN0LmgKQEAgLTAsMCArMSw4MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBleHBpcmVsaXN0LmggIExpc3Qgb2Ygc3R1ZmYgdGhhdCBleHBpcmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19FWFBJUkVfTElTVF9ICisjZGVmaW5lIEJVU19FWFBJUkVfTElTVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorCit0eXBlZGVmIHN0cnVjdCBCdXNFeHBpcmVMaXN0IEJ1c0V4cGlyZUxpc3Q7Cit0eXBlZGVmIHN0cnVjdCBCdXNFeHBpcmVJdGVtIEJ1c0V4cGlyZUl0ZW07CisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQnVzRXhwaXJlRnVuYykgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSk7CisKKworLyogZW1iZWQgdGhpcyBpbiBhIGNoaWxkIGV4cGlyZSBpdGVtIHN0cnVjdCAqLworc3RydWN0IEJ1c0V4cGlyZUl0ZW0KK3sKKyAgbG9uZyBhZGRlZF90dl9zZWM7ICAvKio8IFRpbWUgd2Ugd2VyZSBhZGRlZCAoc2Vjb25kcyBjb21wb25lbnQpICovCisgIGxvbmcgYWRkZWRfdHZfdXNlYzsgLyoqPCBUaW1lIHdlIHdlcmUgYWRkZWQgKG1pY3Jvc2VjIGNvbXBvbmVudCkgKi8KK307CisKK0J1c0V4cGlyZUxpc3QqIGJ1c19leHBpcmVfbGlzdF9uZXcgICAgICAgICAgICAgICAgIChEQnVzTG9vcCAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGV4cGlyZV9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVGdW5jICBleHBpcmVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKTsKK3ZvaWQgICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF9mcmVlICAgICAgICAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0KTsKK3ZvaWQgICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF9yZWNoZWNrX2ltbWVkaWF0ZWx5IChCdXNFeHBpcmVMaXN0ICpsaXN0KTsKK3ZvaWQgICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmVfbGluayAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspOworZGJ1c19ib29sX3QgICAgYnVzX2V4cGlyZV9saXN0X3JlbW92ZSAgICAgICAgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbSk7CitEQnVzTGlzdCogICAgICBidXNfZXhwaXJlX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCk7CitEQnVzTGlzdCogICAgICBidXNfZXhwaXJlX2xpc3RfZ2V0X25leHRfbGluayAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKTsKK2RidXNfYm9vbF90ICAgIGJ1c19leHBpcmVfbGlzdF9hZGQgICAgICAgICAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pOwordm9pZCAgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X2FkZF9saW5rICAgICAgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluayk7CitkYnVzX2Jvb2xfdCAgICBidXNfZXhwaXJlX2xpc3RfY29udGFpbnNfaXRlbSAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKTsKK3ZvaWQgICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF91bmxpbmsgICAgICAgICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspOworCisvKiB0aGlzIG1hY3JvIGFuZCBmdW5jdGlvbiBhcmUgc2VtaS1yZWxhdGVkIHV0aWxpdHkgZnVuY3Rpb25zLCBub3QgcmVhbGx5IHBhcnQgb2YgdGhlCisgKiBCdXNFeHBpcmVMaXN0IEFQSQorICovCisKKyNkZWZpbmUgRUxBUFNFRF9NSUxMSVNFQ09ORFNfU0lOQ0Uob3JpZ190dl9zZWMsIG9yaWdfdHZfdXNlYywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd190dl9zZWMsIG5vd190dl91c2VjKSAgICAgXAorICgoKGRvdWJsZSkgKG5vd190dl9zZWMpIC0gKGRvdWJsZSkgKG9yaWdfdHZfc2VjKSkgKiAxMDAwLjAgKyAgIFwKKyAoKGRvdWJsZSkgKG5vd190dl91c2VjKSAtIChkb3VibGUpIChvcmlnX3R2X3VzZWMpKSAvIDEwMDAuMCkKKwordm9pZCBidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChEQnVzVGltZW91dCAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBuZXh0X2ludGVydmFsKTsKKworI2VuZGlmIC8qIEJVU19FWFBJUkVfTElTVF9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvbWFpbi5jIGIvZGJ1cy0xLjQuMTAvYnVzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzAzOGRiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL21haW4uYwpAQCAtMCwwICsxLDUyNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBtYWluLmMgIG1haW4oKSBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisKK3N0YXRpYyBCdXNDb250ZXh0ICpjb250ZXh0OworCitzdGF0aWMgaW50IHJlbG9hZF9waXBlWzJdOworI2RlZmluZSBSRUxPQURfUkVBRF9FTkQgMAorI2RlZmluZSBSRUxPQURfV1JJVEVfRU5EIDEKKworc3RhdGljIHZvaWQgY2xvc2VfcmVsb2FkX3BpcGUgKHZvaWQpOworCitzdGF0aWMgdm9pZAorc2lnbmFsX2hhbmRsZXIgKGludCBzaWcpCit7CisKKyAgc3dpdGNoIChzaWcpCisgICAgeworI2lmZGVmIERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYCisgICAgY2FzZSBTSUdJTzoKKyAgICAgIC8qIGV4cGxpY2l0IGZhbGwtdGhyb3VnaCAqLworI2VuZGlmIC8qIERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYICAqLworI2lmZGVmIFNJR0hVUAorICAgIGNhc2UgU0lHSFVQOgorICAgICAgeworICAgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICJmb28iKTsKKyAgICAgICAgaWYgKChyZWxvYWRfcGlwZVtSRUxPQURfV1JJVEVfRU5EXSA+IDApICYmCisgICAgICAgICAgICAhX2RidXNfd3JpdGVfc29ja2V0IChyZWxvYWRfcGlwZVtSRUxPQURfV1JJVEVfRU5EXSwgJnN0ciwgMCwgMSkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byB3cml0ZSB0byByZWxvYWQgcGlwZS5cbiIpOworICAgICAgICAgICAgY2xvc2VfcmVsb2FkX3BpcGUgKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSAodm9pZCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCBEQlVTX0RBRU1PTl9OQU1FICIgWy0tdmVyc2lvbl0gWy0tc2Vzc2lvbl0gWy0tc3lzdGVtXSBbLS1jb25maWctZmlsZT1GSUxFXSBbLS1wcmludC1hZGRyZXNzWz1ERVNDUklQVE9SXV0gWy0tcHJpbnQtcGlkWz1ERVNDUklQVE9SXV0gWy0tZm9ya10gWy0tbm9mb3JrXSBbLS1pbnRyb3NwZWN0XSBbLS1hZGRyZXNzPUFERFJFU1NdIFstLXN5c3RlbWQtYWN0aXZhdGlvbl1cbiIpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIE1lc3NhZ2UgQnVzIERhZW1vbiAlc1xuIgorICAgICAgICAgICJDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCwgSW5jLiwgQ29kZUZhY3RvcnkgQUIsIGFuZCBvdGhlcnNcbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgREJVU19WRVJTSU9OX1NUUklORyk7CisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAoraW50cm9zcGVjdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyB4bWw7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ4bWwpKQorICAgIGdvdG8gb29tOworCisgIGlmICghYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyAoJnhtbCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ4bWwpOworICAgICAgZ290byBvb207CisgICAgfQorCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmeG1sKTsKKyAgcHJpbnRmICgiJXNcbiIsIHZfU1RSSU5HKTsKKworICBleGl0ICgwKTsKKworIG9vbToKKyAgX2RidXNfd2FybiAoIkNhbiBub3QgaW50cm9zcGVjdCAtIE91dCBvZiBtZW1vcnlcbiIpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3R3b19jb25maWdfZmlsZXMgKGNvbnN0IERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXh0cmFfYXJnKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbmZpZ19maWxlKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IGNvbmZpZ3VyYXRpb24gZmlsZSAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChjb25maWdfZmlsZSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdHdvX2FkZHJlc3NlcyAoY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmV4dHJhX2FyZykKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhZGRyZXNzKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IGFkZHJlc3MgJXMgYWxyZWFkeSByZXF1ZXN0ZWRcbiIsCisgICAgICAgICAgICAgICBleHRyYV9hcmcsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoYWRkcmVzcykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdHdvX2FkZHJfZGVzY3JpcHRvcnMgKGNvbnN0IERCdXNTdHJpbmcgKmFkZHJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXh0cmFfYXJnKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFkZHJfZmQpID4gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItLSVzIHNwZWNpZmllZCBidXQgcHJpbnRpbmcgYWRkcmVzcyB0byAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChhZGRyX2ZkKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja190d29fcGlkX2Rlc2NyaXB0b3JzIChjb25zdCBEQnVzU3RyaW5nICpwaWRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpleHRyYV9hcmcpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocGlkX2ZkKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IHByaW50aW5nIHBpZCB0byAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChwaWRfZmQpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfcmVsb2FkX3dhdGNoIChEQnVzV2F0Y2ggICAgKndhdGNoLAorCQkgICAgIHVuc2lnbmVkIGludCAgZmxhZ3MsCisJCSAgICAgdm9pZCAgICAgICAgICpkYXRhKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgc3RyOworCisgIHdoaWxlICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICBpZiAoKHJlbG9hZF9waXBlW1JFTE9BRF9SRUFEX0VORF0gPiAwKSAmJgorICAgICAgX2RidXNfcmVhZF9zb2NrZXQgKHJlbG9hZF9waXBlW1JFTE9BRF9SRUFEX0VORF0sICZzdHIsIDEpICE9IDEpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkbid0IHJlYWQgZnJvbSByZWxvYWQgcGlwZS5cbiIpOworICAgICAgY2xvc2VfcmVsb2FkX3BpcGUgKCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiB0aGlzIGNhbiBvbmx5IGZhaWwgaWYgd2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgY29uZmlnIGZpbGUKKyAgICogb3IgT09NLiAgRWl0aGVyIHdheSB3ZSBzaG91bGQganVzdCBzdGljayB3aXRoIHRoZSBjdXJyZW50bHkKKyAgICogbG9hZGVkIGNvbmZpZy4KKyAgICovCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgaWYgKCEgYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyAoY29udGV4dCwgJmVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfRkFJTEVEKSB8fAorCQkgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpOworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byByZWxvYWQgY29uZmlndXJhdGlvbjogJXNcbiIsCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CityZWxvYWRfd2F0Y2hfY2FsbGJhY2sgKERCdXNXYXRjaCAgICAqd2F0Y2gsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgIGNvbmRpdGlvbiwKKwkJICAgICAgIHZvaWQgICAgICAgICAqZGF0YSkKK3sKKyAgcmV0dXJuIGRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwX3JlbG9hZF9waXBlIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzV2F0Y2ggKndhdGNoOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBpZiAoIV9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUgKCZyZWxvYWRfcGlwZVswXSwgJnJlbG9hZF9waXBlWzFdLAorCQkJICAgICAgIFRSVUUsICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBjcmVhdGUgcmVsb2FkIHBpcGU6ICVzXG4iLAorCQkgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHdhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChyZWxvYWRfcGlwZVtSRUxPQURfUkVBRF9FTkRdLAorCQkJICAgREJVU19XQVRDSF9SRUFEQUJMRSwgVFJVRSwKKwkJCSAgIGhhbmRsZV9yZWxvYWRfd2F0Y2gsIE5VTEwsIE5VTEwpOworCisgIGlmICh3YXRjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gY3JlYXRlIHJlbG9hZCB3YXRjaDogJXNcbiIsCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19sb29wX2FkZF93YXRjaCAobG9vcCwgd2F0Y2gsIHJlbG9hZF93YXRjaF9jYWxsYmFjaywKKwkJCSAgICAgTlVMTCwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBhZGQgcmVsb2FkIHdhdGNoIHRvIG1haW4gbG9vcDogJXNcbiIsCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK2Nsb3NlX3JlbG9hZF9waXBlICh2b2lkKQoreworICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXSwgTlVMTCk7CisgICAgcmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXSA9IC0xOworCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChyZWxvYWRfcGlwZVtSRUxPQURfV1JJVEVfRU5EXSwgTlVMTCk7CisgICAgcmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0gPSAtMTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c1N0cmluZyBjb25maWdfZmlsZTsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBEQnVzU3RyaW5nIGFkZHJfZmQ7CisgIERCdXNTdHJpbmcgcGlkX2ZkOworICBjb25zdCBjaGFyICpwcmV2X2FyZzsKKyAgREJ1c1BpcGUgcHJpbnRfYWRkcl9waXBlOworICBEQnVzUGlwZSBwcmludF9waWRfcGlwZTsKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IHByaW50X2FkZHJlc3M7CisgIGRidXNfYm9vbF90IHByaW50X3BpZDsKKyAgZGJ1c19ib29sX3QgaXNfc2Vzc2lvbl9idXM7CisgIGludCBmb3JjZV9mb3JrOworICBkYnVzX2Jvb2xfdCBzeXN0ZW1kX2FjdGl2YXRpb247CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbmZpZ19maWxlKSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJfZmQpKQorICAgIHJldHVybiAxOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwaWRfZmQpKQorICAgIHJldHVybiAxOworCisgIHByaW50X2FkZHJlc3MgPSBGQUxTRTsKKyAgcHJpbnRfcGlkID0gRkFMU0U7CisgIGlzX3Nlc3Npb25fYnVzID0gRkFMU0U7CisgIGZvcmNlX2ZvcmsgPSBGT1JLX0ZPTExPV19DT05GSUdfRklMRTsKKyAgc3lzdGVtZF9hY3RpdmF0aW9uID0gRkFMU0U7CisKKyAgcHJldl9hcmcgPSBOVUxMOworICBpID0gMTsKKyAgd2hpbGUgKGkgPCBhcmdjKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0taGVscCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi1oIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLT8iKSA9PSAwKQorICAgICAgICB1c2FnZSAoKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgdmVyc2lvbiAoKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1pbnRyb3NwZWN0IikgPT0gMCkKKyAgICAgICAgaW50cm9zcGVjdCAoKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1ub2ZvcmsiKSA9PSAwKQorICAgICAgICBmb3JjZV9mb3JrID0gRk9SS19ORVZFUjsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1mb3JrIikgPT0gMCkKKyAgICAgICAgZm9yY2VfZm9yayA9IEZPUktfQUxXQVlTOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXN5c3RlbWQtYWN0aXZhdGlvbiIpID09IDApCisgICAgICAgIHN5c3RlbWRfYWN0aXZhdGlvbiA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX3R3b19jb25maWdfZmlsZXMgKCZjb25maWdfZmlsZSwgInN5c3RlbSIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfc3lzdGVtX2NvbmZpZ19maWxlICgmY29uZmlnX2ZpbGUpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX3R3b19jb25maWdfZmlsZXMgKCZjb25maWdfZmlsZSwgInNlc3Npb24iKTsKKworICAgICAgICAgIGlmICghX2RidXNfYXBwZW5kX3Nlc3Npb25fY29uZmlnX2ZpbGUgKCZjb25maWdfZmlsZSkpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWNvbmZpZy1maWxlPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBjaGVja190d29fY29uZmlnX2ZpbGVzICgmY29uZmlnX2ZpbGUsICJjb25maWctZmlsZSIpOworCisgICAgICAgICAgZmlsZSA9IHN0cmNociAoYXJnLCAnPScpOworICAgICAgICAgICsrZmlsZTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBmaWxlKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2NvbmZpZ19maWxlcyAoJmNvbmZpZ19maWxlLCAiY29uZmlnLWZpbGUiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBhcmcpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1jb25maWctZmlsZSIpID09IDApCisgICAgICAgIDsgLyogd2FpdCBmb3IgbmV4dCBhcmcgKi8KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1hZGRyZXNzPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBjaGVja190d29fYWRkcmVzc2VzICgmYWRkcmVzcywgImFkZHJlc3MiKTsKKworICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBmaWxlKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tYWRkcmVzcyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGVja190d29fYWRkcmVzc2VzICgmYWRkcmVzcywgImFkZHJlc3MiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWFkZHJlc3MiKSA9PSAwKQorICAgICAgICA7IC8qIHdhaXQgZm9yIG5leHQgYXJnICovCisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tcHJpbnQtYWRkcmVzcz0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICpkZXNjOworCisgICAgICAgICAgY2hlY2tfdHdvX2FkZHJfZGVzY3JpcHRvcnMgKCZhZGRyX2ZkLCAicHJpbnQtYWRkcmVzcyIpOworCisgICAgICAgICAgZGVzYyA9IHN0cmNociAoYXJnLCAnPScpOworICAgICAgICAgICsrZGVzYzsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJfZmQsIGRlc2MpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisKKyAgICAgICAgICBwcmludF9hZGRyZXNzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocHJldl9hcmcgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAocHJldl9hcmcsICItLXByaW50LWFkZHJlc3MiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2FkZHJfZGVzY3JpcHRvcnMgKCZhZGRyX2ZkLCAicHJpbnQtYWRkcmVzcyIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcl9mZCwgYXJnKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworCisgICAgICAgICAgcHJpbnRfYWRkcmVzcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1wcmludC1hZGRyZXNzIikgPT0gMCkKKyAgICAgICAgcHJpbnRfYWRkcmVzcyA9IFRSVUU7IC8qIGFuZCB3ZSdsbCBnZXQgdGhlIG5leHQgYXJnIGlmIGFwcHJvcHJpYXRlICovCisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tcHJpbnQtcGlkPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2M7CisKKyAgICAgICAgICBjaGVja190d29fcGlkX2Rlc2NyaXB0b3JzICgmcGlkX2ZkLCAicHJpbnQtcGlkIik7CisKKyAgICAgICAgICBkZXNjID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytkZXNjOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcGlkX2ZkLCBkZXNjKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworCisgICAgICAgICAgcHJpbnRfcGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocHJldl9hcmcgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAocHJldl9hcmcsICItLXByaW50LXBpZCIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGVja190d29fcGlkX2Rlc2NyaXB0b3JzICgmcGlkX2ZkLCAicHJpbnQtcGlkIik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwaWRfZmQsIGFyZykpCisgICAgICAgICAgICBleGl0ICgxKTsKKworICAgICAgICAgIHByaW50X3BpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1wcmludC1waWQiKSA9PSAwKQorICAgICAgICBwcmludF9waWQgPSBUUlVFOyAvKiBhbmQgd2UnbGwgZ2V0IHRoZSBuZXh0IGFyZyBpZiBhcHByb3ByaWF0ZSAqLworICAgICAgZWxzZQorICAgICAgICB1c2FnZSAoKTsKKworICAgICAgcHJldl9hcmcgPSBhcmc7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29uZmlnX2ZpbGUpID09IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTm8gY29uZmlndXJhdGlvbiBmaWxlIHNwZWNpZmllZC5cbiIpOworICAgICAgdXNhZ2UgKCk7CisgICAgfQorCisgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAoJnByaW50X2FkZHJfcGlwZSk7CisgIGlmIChwcmludF9hZGRyZXNzKQorICAgIHsKKyAgICAgIF9kYnVzX3BpcGVfaW5pdF9zdGRvdXQgKCZwcmludF9hZGRyX3BpcGUpOworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYWRkcl9mZCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgbG9uZyB2YWw7CisgICAgICAgICAgaW50IGVuZDsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZhZGRyX2ZkLCAwLCAmdmFsLCAmZW5kKSB8fAorICAgICAgICAgICAgICBlbmQgIT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhZGRyX2ZkKSB8fAorICAgICAgICAgICAgICB2YWwgPCAwIHx8IHZhbCA+IF9EQlVTX0lOVF9NQVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmFkZHJfZmQpKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19waXBlX2luaXQgKCZwcmludF9hZGRyX3BpcGUsIHZhbCk7CisgICAgICAgIH0KKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcl9mZCk7CisKKyAgX2RidXNfcGlwZV9pbnZhbGlkYXRlICgmcHJpbnRfcGlkX3BpcGUpOworICBpZiAocHJpbnRfcGlkKQorICAgIHsKKyAgICAgIF9kYnVzX3BpcGVfaW5pdF9zdGRvdXQgKCZwcmludF9waWRfcGlwZSk7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZwaWRfZmQpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGxvbmcgdmFsOworICAgICAgICAgIGludCBlbmQ7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmcGlkX2ZkLCAwLCAmdmFsLCAmZW5kKSB8fAorICAgICAgICAgICAgICBlbmQgIT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZwaWRfZmQpIHx8CisgICAgICAgICAgICAgIHZhbCA8IDAgfHwgdmFsID4gX0RCVVNfSU5UX01BWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3I6IFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcGlkX2ZkKSk7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfcGlwZV9pbml0ICgmcHJpbnRfcGlkX3BpcGUsIHZhbCk7CisgICAgICAgIH0KKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGlkX2ZkKTsKKworICBpZiAoIWJ1c19zZWxpbnV4X3ByZV9pbml0ICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJTRUxpbnV4IHByZS1pbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29udGV4dCA9IGJ1c19jb250ZXh0X25ldyAoJmNvbmZpZ19maWxlLCBmb3JjZV9mb3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbnRfYWRkcl9waXBlLCAmcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKCZhZGRyZXNzKSA+IDAgPyAmYWRkcmVzcyA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbWRfYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBzdGFydCBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBidXNfY29udGV4dF9uZXcoKSBjbG9zZXMgdGhlIHByaW50X2FkZHJfcGlwZSBhbmQKKyAgICogcHJpbnRfcGlkX3BpcGUKKyAgICovCisKKyAgc2V0dXBfcmVsb2FkX3BpcGUgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSk7CisKKyNpZmRlZiBTSUdIVVAKKyAgX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIChTSUdIVVAsIHNpZ25hbF9oYW5kbGVyKTsKKyNlbmRpZgorI2lmZGVmIERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYCisgIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciAoU0lHSU8sIHNpZ25hbF9oYW5kbGVyKTsKKyNlbmRpZiAvKiBEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWCAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCJXZSBhcmUgb24gRC1CdXMuLi5cbiIpOworICBfZGJ1c19sb29wX3J1biAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpKTsKKworICBidXNfY29udGV4dF9zaHV0ZG93biAoY29udGV4dCk7CisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKyAgYnVzX3NlbGludXhfc2h1dGRvd24gKCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvbWVzc2FnZWJ1cy1jb25maWcuaW4gYi9kYnVzLTEuNC4xMC9idXMvbWVzc2FnZWJ1cy1jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NTlkYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9tZXNzYWdlYnVzLWNvbmZpZy5pbgpAQCAtMCwwICsxLDE3OCBAQAorIyEvYmluL3NoCisjCisjIG1lc3NhZ2VidXMtY29uZmlnLCBDb3B5cmlnaHQgMjAwOSBZYWFrb3YgU2Vsa293aXR6CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDeWd3aW4gcG9ydCBvZiBkYnVzLgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgSW5pdGlhbGl6YXRpb24KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUFJPR05BTUU9JChiYXNlbmFtZSAkMCkKK190ZGlyPSQoZGlybmFtZSAkMCkKK1BST0dESVI9JChjZCAkX3RkaXIgJiYgcHdkKQorCitDU0lIX1NDUklQVD0vdXNyL3NoYXJlL2NzaWgvY3lnd2luLXNlcnZpY2UtaW5zdGFsbGF0aW9uLWhlbHBlci5zaAorCisjIFN1YmRpcmVjdG9yeSB3aGVyZSB0aGUgbmV3IHBhY2thZ2UgaXMgYmVpbmcgaW5zdGFsbGVkCitQUkVGSVg9QHByZWZpeEAKKworIyBEaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbmZpZyBmaWxlcyBhcmUgc3RvcmVkCitTWVNDT05GRElSPUBzeXNjb25mZGlyQC9kYnVzLTEKK0RFVkRJUj0vZGV2CitMT0dESVI9L3Zhci9sb2cKK1JVTkRJUj0kKGRpcm5hbWUgQERCVVNfU1lTVEVNX1BJRF9GSUxFQCkKK1NPQ0tESVI9JChkaXJuYW1lIEBEQlVTX1NZU1RFTV9TT0NLRVRAKQorCitzb3VyY2UgJHtDU0lIX1NDUklQVH0KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFJvdXRpbmU6IGluc3RhbGxfc2VydmljZQorIyAgIEluc3RhbGwgbWVzc2FnZWJ1cyBhcyBhIHNlcnZpY2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW5zdGFsbF9zZXJ2aWNlKCkgeworCisgIGlmIGNzaWhfaXNfbnQKKyAgdGhlbgorCisgICAgIyBDaGVjayBpZiBtZXNzYWdlYnVzIGlzIGluc3RhbGxlZCBhbmQgcmVtb3ZlIG9uIHVzZXIgcmVxdWVzdC4KKyAgICBpZiBjeWdydW5zcnYgLVEgbWVzc2FnZWJ1cyA+IC9kZXYvbnVsbCAyPiYxCisgICAgdGhlbgorICAgICAgY3NpaF93YXJuaW5nICJUaGUgbWVzc2FnZWJ1cyBzZXJ2aWNlIGlzIGFscmVhZHkgaW5zdGFsbGVkLiIKKyAgICAgIGVjaG8KKyAgICAgIGlmIGNzaWhfcmVxdWVzdCAiRG8geW91IHdhbnQgdG8gcmVpbnN0YWxsIGl0IHdpdGggZGlmZmVyZW50IGFyZ3M/IgorICAgICAgdGhlbgorICAgICAgICBjeWdydW5zcnYgLUUgbWVzc2FnZWJ1cworICAgICAgICBjeWdydW5zcnYgLVIgbWVzc2FnZWJ1cworICAgICAgZmkKKyAgICBmaQorCisgICAgIyBJbnN0YWxsIG1lc3NhZ2VidXMgc2VydmljZSBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQKKyAgICBpZiAhIGN5Z3J1bnNydiAtUSBtZXNzYWdlYnVzID4gL2Rldi9udWxsIDI+JjEKKyAgICB0aGVuCisgICAgICBlY2hvCisgICAgICBjc2loX3dhcm5pbmcgIlRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcmVxdWlyZXMgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzISIKKyAgICAgIGlmIGNzaWhfcmVxdWVzdCAiRG8geW91IHdhbnQgdG8gaW5zdGFsbCBtZXNzYWdlYnVzIGFzIHNlcnZpY2U/IgorICAgICAgdGhlbgorICAgICAgICBpZiBjeWdydW5zcnYgLUkgbWVzc2FnZWJ1cyAtZCAiQ1lHV0lOIEQtQnVzIHN5c3RlbSBzZXJ2aWNlIiAtcCBARVhQQU5ERURfQklORElSQC9kYnVzLWRhZW1vbiAtYSAiLS1ub2ZvcmsgLS1zeXN0ZW0iCisgICAgICAgIHRoZW4KKwkgIGVjaG8KKwkgIGNzaWhfaW5mb3JtICJUaGUgbWVzc2FnZWJ1cyBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCB1bmRlciB0aGUgTG9jYWxTeXN0ZW0iCisJICBjc2loX2luZm9ybSAiYWNjb3VudCAoYWxzbyBrbm93biBhcyBTWVNURU0pLiBUbyBzdGFydCB0aGUgc2VydmljZSBub3csIGNhbGwiCisgICAgICAgICAgY3NpaF9pbmZvcm0gIlxgbmV0IHN0YXJ0IG1lc3NhZ2VidXMnIG9yIFxgY3lncnVuc3J2IC1TIG1lc3NhZ2VidXMnLiBPdGhlcndpc2UsIGl0IgorICAgICAgICAgIGNzaWhfaW5mb3JtICJ3aWxsIHN0YXJ0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIG5leHQgcmVib290LiIKKwkgIGVjaG8KKwkgIGNzaWhfaW5mb3JtICJDaGVjayAke1NZU0NPTkZESVJ9L3N5c3RlbS5jb25mIGZpcnN0LCBpZiBpdCBzdWl0cyB5b3VyIG5lZWRzLiIKKyAgICAgICAgZmkKKyAgICAgIGZpICMgdXNlciBhbGxvd2VkIHVzIHRvIGluc3RhbGwgbWVzc2FnZWJ1cworICAgIGZpICMgbWVzc2FnZWJ1cyBhbHJlYWR5IGluc3RhbGxlZAorICBmaSAjIGNzaWhfaXNfbnQKK30gIyAtLS0gRW5kIG9mIGluc3RhbGxfc2VydmljZSAtLS0gIworCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBNYWluIEVudHJ5IFBvaW50CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjIENoZWNrIGhvdyB0aGUgc2NyaXB0IGhhcyBiZWVuIHN0YXJ0ZWQuICBJZgorIyAgICgxKSBpdCBoYXMgYmVlbiBzdGFydGVkIGJ5IGdpdmluZyB0aGUgZnVsbCBwYXRoIGFuZAorIyAgICAgICB0aGF0IHBhdGggaXMgL2V0Yy9wb3N0aW5zdGFsbCwgT1IKKyMgICAoMikgT3RoZXJ3aXNlLCBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyMgICAgICAgQ09ORklHX0FVVE9fQU5TV0VSX05PIGlzIHNldAorIyB0aGVuIHNldCBhdXRvX2Fuc3dlciB0byAibm8iLiAgVGhpcyBhbGxvd3MgYXV0b21hdGljCisjIGNyZWF0aW9uIG9mIHRoZSBjb25maWcgZmlsZXMgaW4gL2V0YyB3L28gb3ZlcndyaXRpbmcKKyMgdGhlbSBpZiB0aGV5IGFscmVhZHkgZXhpc3QuICBJbiBib3RoIGNhc2VzLCBjb2xvcgorIyBlc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwcmVzc2VkLCBzbyBhcyB0byBwcmV2ZW50CisjIGNsdXR0ZXJpbmcgc2V0dXAncyBsb2dmaWxlcy4KK2lmIFsgIiRQUk9HRElSIiA9ICIvZXRjL3Bvc3RpbnN0YWxsIiBdCit0aGVuCisgIGNzaWhfYXV0b19hbnN3ZXI9Im5vIgorICBjc2loX2Rpc2FibGVfY29sb3IKK2ZpCitpZiBbIC1uICIke0NPTkZJR19BVVRPX0FOU1dFUl9OT30iIF0KK3RoZW4KKyAgY3NpaF9hdXRvX2Fuc3dlcj0ibm8iCisgIGNzaWhfZGlzYWJsZV9jb2xvcgorZmkKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUGFyc2Ugb3B0aW9ucworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit3aGlsZSA6CitkbworICBjYXNlICQjIGluCisgIDApCisgICAgYnJlYWsKKyAgICA7OworICBlc2FjCisKKyAgb3B0aW9uPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLWQgfCAtLWRlYnVnICkKKyAgICBzZXQgLXgKKyAgICBjc2loX3RyYWNlX29uCisgICAgOzsKKworICAteSB8IC0teWVzICkKKyAgICBjc2loX2F1dG9fYW5zd2VyPXllcworICAgIDs7CisKKyAgLW4gfCAtLW5vICkKKyAgICBjc2loX2F1dG9fYW5zd2VyPW5vCisgICAgOzsKKworICAqKQorICAgIGVjaG8gInVzYWdlOiAke1BST0dOQU1FfSBbT1BUSU9OXS4uLiIKKyAgICBlY2hvCisgICAgZWNobyAiVGhpcyBzY3JpcHQgY3JlYXRlcyBhIGJhc2ljIG1lc3NhZ2VidXMgY29uZmlndXJhdGlvbi4iCisgICAgZWNobworICAgIGVjaG8gIk9wdGlvbnM6IgorICAgIGVjaG8gIiAgICAtLWRlYnVnICAtZCAgICAgRW5hYmxlIHNoZWxsJ3MgZGVidWcgb3V0cHV0LiIKKyAgICBlY2hvICIgICAgLS15ZXMgICAgLXkgICAgIEFuc3dlciBhbGwgcXVlc3Rpb25zIHdpdGggXCJ5ZXNcIiBhdXRvbWF0aWNhbGx5LiIKKyAgICBlY2hvICIgICAgLS1ubyAgICAgLW4gICAgIEFuc3dlciBhbGwgcXVlc3Rpb25zIHdpdGggXCJub1wiIGF1dG9tYXRpY2FsbHkuIgorICAgIGVjaG8KKyAgICBleGl0IDEKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEFjdGlvbiEKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIENoZWNrIGZvciAke1NZU0NPTkZESVJ9IGRpcmVjdG9yeQorY3NpaF9tYWtlX2RpciAiJHtTWVNDT05GRElSfSIgIkNhbm5vdCBjcmVhdGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMuIgorY2htb2QgNzc1ICIke1NZU0NPTkZESVJ9Igorc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7U1lTQ09ORkRJUn0iCisKKyMgQ2hlY2sgZm9yICR7REVWRElSfSBkaXJlY3RvcnkKK2NzaWhfbWFrZV9kaXIgIiR7REVWRElSfSIgIlN5c2xvZ2dpbmcgdXNpbmcgbWVzc2FnZWJ1cyB3aWxsIG5vdCB3b3JrLiIKK2NobW9kIDc3NSAiJHtERVZESVJ9Igorc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7REVWRElSfSIKKworIyBDaGVjayBmb3IgJHtMT0dESVJ9IGRpcmVjdG9yeQorY3NpaF9tYWtlX2RpciAiJHtMT0dESVJ9IiAiU3lzbG9nZ2luZyB1c2luZyBtZXNzYWdlYnVzIHdpbGwgbm90IHdvcmsuIgorY2htb2QgNzc1ICIke0xPR0RJUn0iCitzZXRmYWNsIC1tIHU6c3lzdGVtOnJ3eCAiJHtMT0dESVJ9IgorCisjIENoZWNrIGZvciAke1JVTkRJUn0gZGlyZWN0b3J5Citjc2loX21ha2VfZGlyICIke1JVTkRJUn0iICJQSUQgZmlsZXMgb2YgcnVubmluZyBwcm9jZXNzZXMgd2lsbCBub3QgYmUgY3JlYXRlZC4iCitjaG1vZCA3NzUgIiR7UlVORElSfSIKK3NldGZhY2wgLW0gdTpzeXN0ZW06cnd4ICIke1JVTkRJUn0iCisKKyMgQ2hlY2sgZm9yICR7U09DS0RJUn0gZGlyZWN0b3J5Citjc2loX21ha2VfZGlyICIke1NPQ0tESVJ9IiAiU09DS0VUIGZpbGVzIG9mIHJ1bm5pbmcgcHJvY2Vzc2VzIHdpbGwgbm90IGJlIGNyZWF0ZWQuIgorY2htb2QgNzc1ICIke1NPQ0tESVJ9Igorc2V0ZmFjbCAtbSB1OnN5c3RlbTpyd3ggIiR7U09DS0RJUn0iCisKKyMgbWF5YmU6IGNzaWhfYXV0b19hbnN3ZXI9bm8gd2lsbCBza2lwLAorIyBpbnRlcmFjdGl2ZSB1c2VyIHdpbGwgZ2V0IGEgY2hhbmNlIHRvIG92ZXJyaWRlCitpbnN0YWxsX3NlcnZpY2UKKworCitlY2hvCitlY2hvICJDb25maWd1cmF0aW9uIGZpbmlzaGVkLiBIYXZlIGZ1biEiCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvbWVzc2FnZWJ1cy5pbiBiL2RidXMtMS40LjEwL2J1cy9tZXNzYWdlYnVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlMmVlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvbWVzc2FnZWJ1cy5pbgpAQCAtMCwwICsxLDkyIEBACisjIS9iaW4vc2gKKyMKKyMgbWVzc2FnZWJ1czogICBUaGUgRC1CVVMgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cworIworIyBjaGtjb25maWc6IDM0NSAyMiA4NQorIyBkZXNjcmlwdGlvbjogIFRoaXMgaXMgYSBkYWVtb24gd2hpY2ggYnJvYWRjYXN0cyBub3RpZmljYXRpb25zIG9mIHN5c3RlbSBldmVudHMgXAorIyAgICAgICAgICAgICAgIGFuZCBvdGhlciBtZXNzYWdlcy4gU2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvCisjCisjIHByb2Nlc3NuYW1lOiBkYnVzLWRhZW1vbgorIyBwaWRmaWxlOiBAREJVU19TWVNURU1fUElEX0ZJTEVACisjCisjIyMgQkVHSU4gSU5JVCBJTkZPCisjIFByb3ZpZGVzOiBtZXNzYWdlYnVzCisjIFJlcXVpcmVkLVN0YXJ0OiAkc3lzbG9nICRsb2NhbF9mcworIyBSZXF1aXJlZC1TdG9wOiAkc3lzbG9nICRsb2NhbF9mcworIyBEZWZhdWx0LVN0YXJ0OiAyIDMgNCA1CisjIERlZmF1bHQtU3RvcDogMCAxIDYKKyMgU2hvcnQtRGVzY3JpcHRpb246IFRoZSBELUJ1cyBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisjIERlc2NyaXB0aW9uOiBUaGlzIGlzIGEgZGFlbW9uIHdoaWNoIGJyb2FkY2FzdHMgbm90aWZpY2F0aW9ucyBvZiBzeXN0ZW0gCisjICBldmVudHMgYW5kIG90aGVyIG1lc3NhZ2VzLiBTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cworIyMjIEVORCBJTklUIElORk8KKworIyBTYW5pdHkgY2hlY2tzLgorWyAteCBARVhQQU5ERURfQklORElSQC9kYnVzLWRhZW1vbiBdIHx8IGV4aXQgMAorCisjIFNvdXJjZSBmdW5jdGlvbiBsaWJyYXJ5LgorLiBARVhQQU5ERURfU1lTQ09ORkRJUkAvcmMuZC9pbml0LmQvZnVuY3Rpb25zCisKKyMgc28gd2UgY2FuIHJlYXJyYW5nZSB0aGlzIGVhc2lseQorcHJvY2Vzc25hbWU9ZGJ1cy1kYWVtb24KK3NlcnZpY2VuYW1lPW1lc3NhZ2VidXMKKworUkVUVkFMPTAKKworc3RhcnQoKSB7CisgICAgZWNobyAtbiAkIlN0YXJ0aW5nIHN5c3RlbSBtZXNzYWdlIGJ1czogIgorICAgIGlmIFsgLXggQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy11dWlkZ2VuIF0gOyB0aGVuCisgICAgICAgIEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtdXVpZGdlbiAtLWVuc3VyZQorICAgIGZpCisKKyAgICBkYWVtb24gLS1jaGVjayAkc2VydmljZW5hbWUgJHByb2Nlc3NuYW1lIC0tc3lzdGVtCisgICAgUkVUVkFMPSQ/CisgICAgZWNobworICAgIFsgJFJFVFZBTCAtZXEgMCBdICYmIHRvdWNoIEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQC9sb2NrL3N1YnN5cy8kc2VydmljZW5hbWUKK30KKworc3RvcCgpIHsKKyAgICBlY2hvIC1uICQiU3RvcHBpbmcgc3lzdGVtIG1lc3NhZ2UgYnVzOiAiCisKKyAgICAjIyB3ZSBkb24ndCB3YW50IHRvIGtpbGwgYWxsIHRoZSBwZXItdXNlciAkcHJvY2Vzc25hbWUsIHdlIHdhbnQKKyAgICAjIyB0byB1c2UgdGhlIHBpZCBmaWxlICpvbmx5KjsgYmVjYXVzZSB3ZSB1c2UgdGhlIGZha2Ugbm9uZXhpc3RlbnQgCisgICAgIyMgcHJvZ3JhbSBuYW1lICIkc2VydmljZW5hbWUiIHRoYXQgc2hvdWxkIGJlIHNhZmUtaXNoCisgICAga2lsbHByb2MgJHNlcnZpY2VuYW1lIC1URVJNCisgICAgUkVUVkFMPSQ/CisgICAgZWNobworICAgIGlmIFsgJFJFVFZBTCAtZXEgMCBdOyB0aGVuCisgICAgICAgIHJtIC1mIEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQC9sb2NrL3N1YnN5cy8kc2VydmljZW5hbWUKKyAgICAgICAgcm0gLWYgQERCVVNfU1lTVEVNX1BJRF9GSUxFQAorICAgIGZpCit9CisKKyMgU2VlIGhvdyB3ZSB3ZXJlIGNhbGxlZC4KK2Nhc2UgIiQxIiBpbgorICAgIHN0YXJ0KQorICAgICAgICBzdGFydAorICAgICAgICA7OworICAgIHN0b3ApCisgICAgICAgIHN0b3AKKyAgICAgICAgOzsKKyAgICBzdGF0dXMpCisgICAgICAgIHN0YXR1cyAkc2VydmljZW5hbWUKKyAgICAgICAgUkVUVkFMPSQ/CisgICAgICAgIDs7CisgICAgcmVzdGFydCkKKyAgICAgICAgc3RvcAorICAgICAgICBzdGFydAorICAgICAgICA7OworICAgIGNvbmRyZXN0YXJ0KQorICAgICAgICBpZiBbIC1mIEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQC9sb2NrL3N1YnN5cy8kc2VydmljZW5hbWUgXTsgdGhlbgorICAgICAgICAgICAgc3RvcAorICAgICAgICAgICAgc3RhcnQKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICByZWxvYWQpCisgICAgICAgIGVjaG8gIk1lc3NhZ2UgYnVzIGNhbid0IHJlbG9hZCBpdHMgY29uZmlndXJhdGlvbiwgeW91IGhhdmUgdG8gcmVzdGFydCBpdCIKKyAgICAgICAgUkVUVkFMPSQ/CisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgZWNobyAkIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxzdGF0dXN8cmVzdGFydHxjb25kcmVzdGFydHxyZWxvYWR9IgorICAgICAgICA7OworZXNhYworZXhpdCAkUkVUVkFMCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdC5pbiBiL2RidXMtMS40LjEwL2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmYzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdC5pbgpAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+TGFiZWw8L2tleT4KKwk8c3RyaW5nPm9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb248L3N0cmluZz4KKworCTxrZXk+U2VydmljZUlQQzwva2V5PgorCTx0cnVlLz4KKworCTwhLS0gUGxlYXNlIHVuY29tbWVudCBvbiAxMC40OyBPbkRlbWFuZCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgdGhlcmUuIC0tPgorCTwhLS0KKwk8a2V5Pk9uRGVtYW5kPC9rZXk+CisJPGZhbHNlIC8+CisJLS0+CisKKwk8a2V5PlByb2dyYW1Bcmd1bWVudHM8L2tleT4KKwk8YXJyYXk+CisJCTxzdHJpbmc+QERCVVNfREFFTU9ORElSQC9kYnVzLWRhZW1vbjwvc3RyaW5nPgorCQk8c3RyaW5nPi0tbm9mb3JrPC9zdHJpbmc+CisJCTxzdHJpbmc+LS1zZXNzaW9uPC9zdHJpbmc+CisJPC9hcnJheT4KKworCTxrZXk+U29ja2V0czwva2V5PgorCTxkaWN0PgorCQk8a2V5PnVuaXhfZG9tYWluX2xpc3RlbmVyPC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5TZWN1cmVTb2NrZXRXaXRoS2V5PC9rZXk+CisJCQk8c3RyaW5nPkRCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCTwvZGljdD4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvcG9saWN5LmMgYi9kYnVzLTEuNC4xMC9idXMvcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmZmY4NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9wb2xpY3kuYwpAQCAtMCwwICsxLDEyOTcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogcG9saWN5LmMgIEJ1cyBzZWN1cml0eSBwb2xpY3kKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworQnVzUG9saWN5UnVsZSoKK2J1c19wb2xpY3lfcnVsZV9uZXcgKEJ1c1BvbGljeVJ1bGVUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBhbGxvdykKK3sKKyAgQnVzUG9saWN5UnVsZSAqcnVsZTsKKworICBydWxlID0gZGJ1c19uZXcwIChCdXNQb2xpY3lSdWxlLCAxKTsKKyAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBydWxlLT50eXBlID0gdHlwZTsKKyAgcnVsZS0+cmVmY291bnQgPSAxOworICBydWxlLT5hbGxvdyA9IGFsbG93OworCisgIHN3aXRjaCAocnVsZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfVVNFUjoKKyAgICAgIHJ1bGUtPmQudXNlci51aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX0dST1VQOgorICAgICAgcnVsZS0+ZC5ncm91cC5naWQgPSBEQlVTX0dJRF9VTlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1NFTkQ6CisgICAgICBydWxlLT5kLnNlbmQubWVzc2FnZV90eXBlID0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRDsKKworICAgICAgLyogYWxsb3cgcnVsZXMgZGVmYXVsdCB0byBUUlVFIChvbmx5IHJlcXVlc3RlZCByZXBsaWVzIGFsbG93ZWQpCisgICAgICAgKiBkZW55IHJ1bGVzIGRlZmF1bHQgdG8gRkFMU0UgKG9ubHkgdW5yZXF1ZXN0ZWQgcmVwbGllcyBkZW5pZWQpCisgICAgICAgKi8KKyAgICAgIHJ1bGUtPmQuc2VuZC5yZXF1ZXN0ZWRfcmVwbHkgPSBydWxlLT5hbGxvdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1JFQ0VJVkU6CisgICAgICBydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlID0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRDsKKyAgICAgIC8qIGFsbG93IHJ1bGVzIGRlZmF1bHQgdG8gVFJVRSAob25seSByZXF1ZXN0ZWQgcmVwbGllcyBhbGxvd2VkKQorICAgICAgICogZGVueSBydWxlcyBkZWZhdWx0IHRvIEZBTFNFIChvbmx5IHVucmVxdWVzdGVkIHJlcGxpZXMgZGVuaWVkKQorICAgICAgICovCisgICAgICBydWxlLT5kLnJlY2VpdmUucmVxdWVzdGVkX3JlcGx5ID0gcnVsZS0+YWxsb3c7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9PV046CisgICAgICBicmVhazsKKyAgICB9CisgIAorICByZXR1cm4gcnVsZTsKK30KKworQnVzUG9saWN5UnVsZSAqCitidXNfcG9saWN5X3J1bGVfcmVmIChCdXNQb2xpY3lSdWxlICpydWxlKQoreworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnJlZmNvdW50ID4gMCk7CisKKyAgcnVsZS0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gcnVsZTsKK30KKwordm9pZAorYnVzX3BvbGljeV9ydWxlX3VucmVmIChCdXNQb2xpY3lSdWxlICpydWxlKQoreworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnJlZmNvdW50ID4gMCk7CisKKyAgcnVsZS0+cmVmY291bnQgLT0gMTsKKyAgCisgIGlmIChydWxlLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHN3aXRjaCAocnVsZS0+dHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9TRU5EOgorICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5zZW5kLnBhdGgpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5zZW5kLmludGVyZmFjZSk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQubWVtYmVyKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQuc2VuZC5lcnJvcik7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFOgorICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5yZWNlaXZlLnBhdGgpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUubWVtYmVyKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQucmVjZWl2ZS5lcnJvcik7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfT1dOOgorICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5vd24uc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfVVNFUjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChydWxlKTsKKyAgICB9Cit9CisKK3N0cnVjdCBCdXNQb2xpY3kKK3sKKyAgaW50IHJlZmNvdW50OworCisgIERCdXNMaXN0ICpkZWZhdWx0X3J1bGVzOyAgICAgICAgIC8qKjwgRGVmYXVsdCBwb2xpY3kgcnVsZXMgKi8KKyAgREJ1c0xpc3QgKm1hbmRhdG9yeV9ydWxlczsgICAgICAgLyoqPCBNYW5kYXRvcnkgcG9saWN5IHJ1bGVzICovCisgIERCdXNIYXNoVGFibGUgKnJ1bGVzX2J5X3VpZDsgICAgIC8qKjwgcGVyLVVJRCBwb2xpY3kgcnVsZXMgKi8KKyAgREJ1c0hhc2hUYWJsZSAqcnVsZXNfYnlfZ2lkOyAgICAgLyoqPCBwZXItR0lEIHBvbGljeSBydWxlcyAqLworICBEQnVzTGlzdCAqYXRfY29uc29sZV90cnVlX3J1bGVzOyAvKio8IGNvbnNvbGUgdXNlciBwb2xpY3kgcnVsZXMgd2hlcmUgYXRfY29uc29sZT0idHJ1ZSIqLworICBEQnVzTGlzdCAqYXRfY29uc29sZV9mYWxzZV9ydWxlczsgLyoqPCBjb25zb2xlIHVzZXIgcG9saWN5IHJ1bGVzIHdoZXJlIGF0X2NvbnNvbGU9ImZhbHNlIiovCit9OworCitzdGF0aWMgdm9pZAorZnJlZV9ydWxlX2Z1bmMgKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBCdXNQb2xpY3lSdWxlICpydWxlID0gZGF0YTsKKworICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9ydWxlX2xpc3RfZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0ID0gZGF0YTsKKworICBpZiAobGlzdCA9PSBOVUxMKSAvKiBEQnVzSGFzaFRhYmxlIGlzIG9uIGNyYWNrICovCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoIChsaXN0LCBmcmVlX3J1bGVfZnVuYywgTlVMTCk7CisgIAorICBfZGJ1c19saXN0X2NsZWFyIChsaXN0KTsKKworICBkYnVzX2ZyZWUgKGxpc3QpOworfQorCitCdXNQb2xpY3kqCitidXNfcG9saWN5X25ldyAodm9pZCkKK3sKKyAgQnVzUG9saWN5ICpwb2xpY3k7CisKKyAgcG9saWN5ID0gZGJ1c19uZXcwIChCdXNQb2xpY3ksIDEpOworICBpZiAocG9saWN5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcG9saWN5LT5yZWZjb3VudCA9IDE7CisgIAorICBwb2xpY3ktPnJ1bGVzX2J5X3VpZCA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfVUlOVFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9ydWxlX2xpc3RfZnVuYyk7CisgIGlmIChwb2xpY3ktPnJ1bGVzX2J5X3VpZCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIHBvbGljeS0+cnVsZXNfYnlfZ2lkID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3J1bGVfbGlzdF9mdW5jKTsKKyAgaWYgKHBvbGljeS0+cnVsZXNfYnlfZ2lkID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dXJuIHBvbGljeTsKKyAgCisgZmFpbGVkOgorICBidXNfcG9saWN5X3VucmVmIChwb2xpY3kpOworICByZXR1cm4gTlVMTDsKK30KKworQnVzUG9saWN5ICoKK2J1c19wb2xpY3lfcmVmIChCdXNQb2xpY3kgKnBvbGljeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChwb2xpY3ktPnJlZmNvdW50ID4gMCk7CisKKyAgcG9saWN5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwb2xpY3k7Cit9CisKK3ZvaWQKK2J1c19wb2xpY3lfdW5yZWYgKEJ1c1BvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBvbGljeS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPmRlZmF1bHRfcnVsZXMsIGZyZWVfcnVsZV9mdW5jLCBOVUxMKTsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwb2xpY3ktPmRlZmF1bHRfcnVsZXMpOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPm1hbmRhdG9yeV9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcG9saWN5LT5hdF9jb25zb2xlX3RydWVfcnVsZXMsIGZyZWVfcnVsZV9mdW5jLCBOVUxMKTsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcyk7CisKKyAgICAgIGlmIChwb2xpY3ktPnJ1bGVzX2J5X3VpZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHBvbGljeS0+cnVsZXNfYnlfdWlkKTsKKyAgICAgICAgICBwb2xpY3ktPnJ1bGVzX2J5X3VpZCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHBvbGljeS0+cnVsZXNfYnlfZ2lkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocG9saWN5LT5ydWxlc19ieV9naWQpOworICAgICAgICAgIHBvbGljeS0+cnVsZXNfYnlfZ2lkID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHBvbGljeSk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9saXN0X3RvX2NsaWVudCAoREJ1c0xpc3QgICAgICAgICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgQnVzQ2xpZW50UG9saWN5ICAqY2xpZW50KQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKworICAgICAgc3dpdGNoIChydWxlLT50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1VTRVI6CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX0dST1VQOgorICAgICAgICAgIC8qIFRoZXNlIGFyZW4ndCBwZXItY29ubmVjdGlvbiBwb2xpY2llcyAqLworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgICAgICAvKiBUaGVzZSBhcmUgcGVyLWNvbm5lY3Rpb24gKi8KKyAgICAgICAgICBpZiAoIWJ1c19jbGllbnRfcG9saWN5X2FwcGVuZF9ydWxlIChjbGllbnQsIHJ1bGUpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0J1c0NsaWVudFBvbGljeSoKK2J1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kgKEJ1c1BvbGljeSAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzQ2xpZW50UG9saWN5ICpjbGllbnQ7CisgIGRidXNfdWlkX3QgdWlkOworICBkYnVzX2Jvb2xfdCBhdF9jb25zb2xlOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uKSk7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgY2xpZW50ID0gYnVzX2NsaWVudF9wb2xpY3lfbmV3ICgpOworICBpZiAoY2xpZW50ID09IE5VTEwpCisgICAgZ290byBub21lbTsKKworICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCkpCisgICAgZ290byBub21lbTsKKworICAvKiB3ZSBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgbG9va2luZyB1cCB1c2VyJ3MgZ3JvdXBzCisgICAqIGlmIHdlIGRvbid0IGhhdmUgYW55IGdyb3VwIHJ1bGVzIGFueXdheQorICAgKi8KKyAgaWYgKF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAocG9saWN5LT5ydWxlc19ieV9naWQpID4gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nICpncm91cHM7CisgICAgICBpbnQgbl9ncm91cHM7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgaWYgKCFidXNfY29ubmVjdGlvbl9nZXRfdW5peF9ncm91cHMgKGNvbm5lY3Rpb24sICZncm91cHMsICZuX2dyb3VwcywgZXJyb3IpKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fZ3JvdXBzKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKipsaXN0OworICAgICAgICAgIAorICAgICAgICAgIGxpc3QgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChwb2xpY3ktPnJ1bGVzX2J5X2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tpXSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGxpc3QgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFhZGRfbGlzdF90b19jbGllbnQgKGxpc3QsIGNsaWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlIChncm91cHMpOworICAgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoZ3JvdXBzKTsKKyAgICB9CisgIAorICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm5lY3Rpb24sICZ1aWQpKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHBvbGljeS0+cnVsZXNfYnlfdWlkKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKmxpc3Q7CisgICAgICAgICAgCisgICAgICAgICAgbGlzdCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKHBvbGljeS0+cnVsZXNfYnlfdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAobGlzdCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAobGlzdCwgY2xpZW50KSkKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIEFkZCBjb25zb2xlIHJ1bGVzICovCisgICAgICBhdF9jb25zb2xlID0gX2RidXNfdW5peF91c2VyX2lzX2F0X2NvbnNvbGUgKHVpZCwgZXJyb3IpOworICAgICAgCisgICAgICBpZiAoYXRfY29uc29sZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYWRkX2xpc3RfdG9fY2xpZW50ICgmcG9saWN5LT5hdF9jb25zb2xlX3RydWVfcnVsZXMsIGNsaWVudCkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcywgY2xpZW50KSkKKyAgICAgICAgeworICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFhZGRfbGlzdF90b19jbGllbnQgKCZwb2xpY3ktPm1hbmRhdG9yeV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCkpCisgICAgZ290byBub21lbTsKKworICBidXNfY2xpZW50X3BvbGljeV9vcHRpbWl6ZSAoY2xpZW50KTsKKyAgCisgIHJldHVybiBjbGllbnQ7CisKKyBub21lbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgaWYgKGNsaWVudCkKKyAgICBidXNfY2xpZW50X3BvbGljeV91bnJlZiAoY2xpZW50KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGlzdF9hbGxvd3NfdXNlciAoZGJ1c19ib29sX3QgICAgICAgICAgIGRlZiwKKyAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgICAgKipsaXN0LAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgICpncm91cF9pZHMsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9ncm91cF9pZHMpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBkYnVzX2Jvb2xfdCBhbGxvd2VkOworICAKKyAgYWxsb3dlZCA9IGRlZjsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKworICAgICAgaWYgKHJ1bGUtPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX1VTRVIpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTGlzdCAlcCB1c2VyIHJ1bGUgdWlkPSJEQlVTX1VJRF9GT1JNQVQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QsIHJ1bGUtPmQudXNlci51aWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChydWxlLT5kLnVzZXIudWlkID09IERCVVNfVUlEX1VOU0VUKQorICAgICAgICAgICAgOyAvKiAnKicgd2lsZGNhcmQgKi8KKyAgICAgICAgICBlbHNlIGlmIChydWxlLT5kLnVzZXIudWlkICE9IHVpZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChydWxlLT50eXBlID09IEJVU19QT0xJQ1lfUlVMRV9HUk9VUCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJMaXN0ICVwIGdyb3VwIHJ1bGUgdWlkPSJEQlVTX1VJRF9GT1JNQVQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QsIHJ1bGUtPmQudXNlci51aWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChydWxlLT5kLmdyb3VwLmdpZCA9PSBEQlVTX0dJRF9VTlNFVCkKKyAgICAgICAgICAgIDsgIC8qICcqJyB3aWxkY2FyZCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAocnVsZS0+ZC5ncm91cC5naWQgPT0gZ3JvdXBfaWRzW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoaSA9PSBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250aW51ZTsKKworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgIH0KKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd191bml4X3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpCit7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIHVuc2lnbmVkIGxvbmcgKmdyb3VwX2lkczsKKyAgaW50IG5fZ3JvdXBfaWRzOworCisgIC8qIE9uIE9PTSBvciBlcnJvciB3ZSBhbHdheXMgcmVqZWN0IHRoZSB1c2VyICovCisgIGlmICghX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKHVpZCwgJmdyb3VwX2lkcywgJm5fZ3JvdXBfaWRzKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRGlkIG5vdCBnZXQgYW55IGdyb3VwcyBmb3IgVUlEICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIERlZmF1bHQgdG8gInVzZXIgb3duaW5nIGJ1cyIgY2FuIGNvbm5lY3QgKi8KKyAgYWxsb3dlZCA9IF9kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyICh1aWQpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkcywgbl9ncm91cF9pZHMpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWRzLCBuX2dyb3VwX2lkcyk7CisKKyAgZGJ1c19mcmVlIChncm91cF9pZHMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJVSUQgJWx1IGFsbG93ZWQgPSAlZFxuIiwgdWlkLCBhbGxvd2VkKTsKKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCisvKiBGb3Igbm93IHRoaXMgaXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQKKyAqIERCdXNDb25uZWN0aW9uIGJlaGF2aW9yIG9mICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZSBidXMgY2FuCisgKiBjb25uZWN0JyBpcyBhbGwgaXQgd291bGQgZG8uIFNldCB0aGUgd2luZG93cyB1c2VyIGZ1bmN0aW9uIGluCisgKiBjb25uZWN0aW9uLmMgaWYgdGhlIGNvbmZpZyBmaWxlIGV2ZXIgc3VwcG9ydHMgZG9pbmcgc29tZXRoaW5nCisgKiBpbnRlcmVzdGluZyBoZXJlLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd193aW5kb3dzX3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgLyogV2luZG93cyBoYXMgbm8gcG9saWNpZXMgaGVyZSBzaW5jZSBvbmx5IHRoZSBzZXNzaW9uIGJ1cworICAgKiBpcyByZWFsbHkgdXNlZCBmb3Igbm93LCBzbyBqdXN0IGNoZWNraW5nIHRoYXQgdGhlCisgICAqIGNvbm5lY3RpbmcgcGVyc29uIGlzIHRoZSBzYW1lIGFzIHRoZSBidXMgb3duZXIgaXMgZmluZS4KKyAgICovCisgIHJldHVybiBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAod2luZG93c19zaWQpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfbWFuZGF0b3J5X3J1bGUgKEJ1c1BvbGljeSAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPm1hbmRhdG9yeV9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCisKKworc3RhdGljIERCdXNMaXN0KioKK2dldF9saXN0IChEQnVzSGFzaFRhYmxlICpoYXNoLAorICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtleSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChoYXNoLCBrZXkpOworCisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGlzdCA9IGRidXNfbmV3MCAoREJ1c0xpc3QqLCAxKTsKKyAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGhhc2gsIGtleSwgbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpc3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBsaXN0OworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfdXNlcl9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV91aWQsIHVpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAoQnVzUG9saWN5ICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV9naWQsIGdpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfY29uc29sZV9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmIChhdF9jb25zb2xlKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgcnVsZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfZmFsc2VfcnVsZXMsIHJ1bGUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqKnRvX2FwcGVuZCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICp0bXBfbGlzdDsKKworICB0bXBfbGlzdCA9IE5VTEw7CisKKyAgLyogUHJlYWxsb2NhdGUgYWxsIG91ciBsaW5rcyAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAodG9fYXBwZW5kKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdG1wX2xpc3QsIGxpbmstPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnRtcF9saXN0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAodG9fYXBwZW5kLCBsaW5rKTsKKyAgICB9CisKKyAgLyogTm93IGFwcGVuZCB0aGVtICovCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZ0bXBfbGlzdCkpKQorICAgIHsKKyAgICAgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21lcmdlX2lkX2hhc2ggKERCdXNIYXNoVGFibGUgKmRlc3QsCisgICAgICAgICAgICAgICBEQnVzSGFzaFRhYmxlICp0b19hYnNvcmIpCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICAKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRvX2Fic29yYiwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGlkID0gX2RidXNfaGFzaF9pdGVyX2dldF91aW50cHRyX2tleSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKipsaXN0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKip0YXJnZXQgPSBnZXRfbGlzdCAoZGVzdCwgaWQpOworCisgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAodGFyZ2V0LCBsaXN0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19wb2xpY3lfbWVyZ2UgKEJ1c1BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgQnVzUG9saWN5ICp0b19hYnNvcmIpCit7CisgIC8qIEZJWE1FIE5vdCBwcm9wZXJseSBhdG9taWMsIGJ1dCBhcyB1c2VkIGZvciBjb25maWd1cmF0aW9uIGZpbGVzIHdlCisgICAqIGRvbid0IHJlbHkgb24gaXQgcXVpdGUgc28gbXVjaC4KKyAgICovCisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5kZWZhdWx0X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9fYWJzb3JiLT5kZWZhdWx0X3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5tYW5kYXRvcnlfcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19hYnNvcmItPm1hbmRhdG9yeV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV90cnVlX3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV9mYWxzZV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV91aWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV91aWQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV9naWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV9naWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IEJ1c0NsaWVudFBvbGljeQoreworICBpbnQgcmVmY291bnQ7CisKKyAgREJ1c0xpc3QgKnJ1bGVzOworfTsKKworQnVzQ2xpZW50UG9saWN5KgorYnVzX2NsaWVudF9wb2xpY3lfbmV3ICh2b2lkKQoreworICBCdXNDbGllbnRQb2xpY3kgKnBvbGljeTsKKworICBwb2xpY3kgPSBkYnVzX25ldzAgKEJ1c0NsaWVudFBvbGljeSwgMSk7CisgIGlmIChwb2xpY3kgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb2xpY3ktPnJlZmNvdW50ID0gMTsKKworICByZXR1cm4gcG9saWN5OworfQorCitCdXNDbGllbnRQb2xpY3kgKgorYnVzX2NsaWVudF9wb2xpY3lfcmVmIChCdXNDbGllbnRQb2xpY3kgKnBvbGljeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChwb2xpY3ktPnJlZmNvdW50ID4gMCk7CisKKyAgcG9saWN5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwb2xpY3k7Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX3VucmVmX2ZvcmVhY2ggKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGRhdGE7CisKKyAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChydWxlKTsKK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBvbGljeS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlX3VucmVmX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5ydWxlcyk7CisKKyAgICAgIGRidXNfZnJlZSAocG9saWN5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnVsZXNfYnlfdHlwZV91cF90byAoQnVzQ2xpZW50UG9saWN5ICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlVHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAqdXBfdG8pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IHVwX3RvKQorICAgIHsKKyAgICAgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKworICAgICAgaWYgKHJ1bGUtPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgICAgICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfb3B0aW1pemUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBEQnVzTGlzdCAqbGluazsKKworICAvKiBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgaWYgd2UgaGF2ZToKKyAgICogCisgICAqIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iZm9vLmJhciIvPgorICAgKiA8ZGVueSBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgKgorICAgKiAoZm9yIGV4YW1wbGUpIHRoZSBkZW55IHdpbGwgYWx3YXlzIG92ZXJyaWRlIHRoZSBhbGxvdy4gIFNvIHdlCisgICAqIGRlbGV0ZSB0aGUgYWxsb3cuIERpdHRvIGZvciBkZW55IGZvbGxvd2VkIGJ5IGFsbG93LCBldGMuIFRoaXMgaXMKKyAgICogYSBkdW1iIHRoaW5nIHRvIHB1dCBpbiBhIGNvbmZpZyBmaWxlLCBidXQgdGhlIDxpbmNsdWRlPiBmZWF0dXJlCisgICAqIG9mIGZpbGVzIGFsbG93cyBmb3IgYW4gImluaGVyaXRhbmNlIGFuZCBvdmVycmlkZSIgcGF0dGVybiB3aGVyZQorICAgKiBpdCBjb3VsZCBtYWtlIHNlbnNlLiBJZiBhbiBpbmNsdWRlZCBmaWxlIHdhbnRzIHRvICJzdGFydCBvdmVyIgorICAgKiB3aXRoIGEgYmxhbmtldCBkZW55LCBubyBwb2ludCBrZWVwaW5nIHRoZSBydWxlcyBmcm9tIHRoZSBwYXJlbnQKKyAgICogZmlsZS4KKyAgICovCisKKyAgX2RidXNfdmVyYm9zZSAoIk9wdGltaXppbmcgcG9saWN5IHdpdGggJWQgcnVsZXNcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnBvbGljeS0+cnVsZXMpKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZTsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworICAgICAgZGJ1c19ib29sX3QgcmVtb3ZlX3ByZWNlZGluZzsKKworICAgICAgbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBvbGljeS0+cnVsZXMsIGxpbmspOworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIHJlbW92ZV9wcmVjZWRpbmcgPSBGQUxTRTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworICAgICAgCisgICAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gPT0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luID09IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9PSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9HUk9VUDoKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHJ1bGUiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAocmVtb3ZlX3ByZWNlZGluZykKKyAgICAgICAgcmVtb3ZlX3J1bGVzX2J5X3R5cGVfdXBfdG8gKHBvbGljeSwgcnVsZS0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIkFmdGVyIG9wdGltaXphdGlvbiwgcG9saWN5IGhhcyAlZCBydWxlc1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmcG9saWN5LT5ydWxlcykpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfYXBwZW5kX3J1bGUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAqcnVsZSkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkFwcGVuZGluZyBydWxlICVwIHdpdGggdHlwZSAlZCB0byBwb2xpY3kgJXBcbiIsCisgICAgICAgICAgICAgICAgIHJ1bGUsIHJ1bGUtPnR5cGUsIHBvbGljeSk7CisgIAorICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcG9saWN5LT5ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICp0b2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAqbG9nKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgZGJ1c19ib29sX3QgYWxsb3dlZDsKKyAgCisgIC8qIHBvbGljeS0+cnVsZXMgaXMgaW4gdGhlIG9yZGVyIHRoZSBydWxlcyBhcHBlYXJlZAorICAgKiBpbiB0aGUgY29uZmlnIGZpbGUsIGkuZS4gbGFzdCBydWxlIHRoYXQgYXBwbGllcyB3aW5zCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIGNoZWNraW5nIHNlbmQgcnVsZXNcbiIpOworICAqdG9nZ2xlcyA9IDA7CisgIAorICBhbGxvd2VkID0gRkFMU0U7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgIAorICAgICAgLyogUnVsZSBpcyBza2lwcGVkIGlmIGl0IHNwZWNpZmllcyBhIGRpZmZlcmVudAorICAgICAgICogbWVzc2FnZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UsIG9yIGEgZGlmZmVyZW50CisgICAgICAgKiBkZXN0aW5hdGlvbiBmcm9tIHRoZSBtZXNzYWdlCisgICAgICAgKi8KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPnR5cGUgIT0gQlVTX1BPTElDWV9SVUxFX1NFTkQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBub24tc2VuZCBydWxlXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSAhPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gcnVsZS0+ZC5zZW5kLm1lc3NhZ2VfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIElmIGl0J3MgYSByZXBseSwgdGhlIHJlcXVlc3RlZF9yZXBseSBmbGFnIGtpY2tzIGluICovCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmb3IgYWxsb3csIHJlcXVlc3RlZF9yZXBseT10cnVlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMKKyAgICAgICAgICAgKiBvbmx5IHdoZW4gcmVwbHkgd2FzIHJlcXVlc3RlZC4gcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zCisgICAgICAgICAgICogYWx3YXlzIGFsbG93LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghcmVxdWVzdGVkX3JlcGx5ICYmIHJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQuc2VuZC5yZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmQuc2VuZC5lYXZlc2Ryb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGFsbG93IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RlZCByZXBsaWVzIGFuZCBkb2VzIG5vdCBhbGxvdyBlYXZlc2Ryb3BwaW5nXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBmb3IgZGVueSwgcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMgb25seQorICAgICAgICAgICAqIHdoZW4gdGhlIHJlcGx5IHdhcyBub3QgcmVxdWVzdGVkLiByZXF1ZXN0ZWRfcmVwbHk9dHJ1ZSBtZWFucyB0aGUKKyAgICAgICAgICAgKiBydWxlIGFsd2F5cyBhcHBsaWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnNlbmQucmVxdWVzdGVkX3JlcGx5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHVucmVxdWVzdGVkIHJlcGxpZXNcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLnBhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5wYXRoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgcGF0aFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnNlbmQuaW50ZXJmYWNlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgaW50ZXJmYWNlIGlzIG9wdGlvbmFsIGluIG1lc3NhZ2VzLiBGb3IgYWxsb3cgcnVsZXMsIGlmIHRoZSBtZXNzYWdlCisgICAgICAgICAgICogaGFzIG5vIGludGVyZmFjZSB3ZSB3YW50IHRvIHNraXAgdGhlIHJ1bGUgKGFuZCB0aHVzIG5vdCBhbGxvdyk7CisgICAgICAgICAgICogZm9yIGRlbnkgcnVsZXMsIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBpbnRlcmZhY2Ugd2Ugd2FudCB0byB1c2UgdGhlCisgICAgICAgICAgICogcnVsZSAoYW5kIHRodXMgZGVueSkuCisgICAgICAgICAgICovCisgICAgICAgICAgZGJ1c19ib29sX3Qgbm9faW50ZXJmYWNlOworCisgICAgICAgICAgbm9faW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID09IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKChub19pbnRlcmZhY2UgJiYgcnVsZS0+YWxsb3cpIHx8CisgICAgICAgICAgICAgICghbm9faW50ZXJmYWNlICYmIAorICAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5pbnRlcmZhY2UpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgaW50ZXJmYWNlXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5tZW1iZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQubWVtYmVyKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgbWVtYmVyXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5lcnJvciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmVycm9yKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgZXJyb3IgbmFtZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHJlY2VpdmVyIGNhbiBiZSBOVUxMIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBzZW50IHRvIHRoZQorICAgICAgICAgICAqIG1lc3NhZ2UgYnVzIGl0c2VsZiwgd2UgY2hlY2sgdGhlIHN0cmluZ3MgaW4gdGhhdCBjYXNlIGFzCisgICAgICAgICAgICogYnVpbHQtaW4gc2VydmljZXMgZG9uJ3QgaGF2ZSBhIERCdXNDb25uZWN0aW9uIGJ1dCBtZXNzYWdlcworICAgICAgICAgICAqIHRvIHRoZW0gaGF2ZSBhIGRlc3RpbmF0aW9uIHNlcnZpY2UgbmFtZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocmVjZWl2ZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG1lc3NhZ2UgZGVzdCBpcyBub3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIGRlc3QgJXMgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIHJlY2VpdmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGJlY2F1c2UgZGVzdCAlcyBpc24ndCBvd25lZCBieSByZWNlaXZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgICAgKmxvZyA9IHJ1bGUtPmQuc2VuZC5sb2c7CisgICAgICAoKnRvZ2dsZXMpKys7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHVzZWQgcnVsZSwgYWxsb3cgbm93ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkKTsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93ZWQ7Cit9CisKKy8qIFNlZSBkb2NzIG9uIHdoYXQgdGhlIGFyZ3MgbWVhbiBvbiBidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3koKQorICogY29tbWVudAorICovCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgKnRvZ2dsZXMpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBkYnVzX2Jvb2xfdCBhbGxvd2VkOworICBkYnVzX2Jvb2xfdCBlYXZlc2Ryb3BwaW5nOworCisgIGVhdmVzZHJvcHBpbmcgPQorICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgIT0gcHJvcG9zZWRfcmVjaXBpZW50ICYmCisgICAgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgIT0gTlVMTDsKKyAgCisgIC8qIHBvbGljeS0+cnVsZXMgaXMgaW4gdGhlIG9yZGVyIHRoZSBydWxlcyBhcHBlYXJlZAorICAgKiBpbiB0aGUgY29uZmlnIGZpbGUsIGkuZS4gbGFzdCBydWxlIHRoYXQgYXBwbGllcyB3aW5zCisgICAqLworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIGNoZWNraW5nIHJlY2VpdmUgcnVsZXMsIGVhdmVzZHJvcHBpbmcgPSAlZFxuIiwgZWF2ZXNkcm9wcGluZyk7CisgICp0b2dnbGVzID0gMDsKKyAgCisgIGFsbG93ZWQgPSBGQUxTRTsKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBvbGljeS0+cnVsZXMsIGxpbmspOyAgICAgIAorICAgICAgCisgICAgICBpZiAocnVsZS0+dHlwZSAhPSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIG5vbi1yZWNlaXZlIHJ1bGVcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBydWxlLT5kLnJlY2VpdmUubWVzc2FnZV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogZm9yIGFsbG93LCBlYXZlc2Ryb3A9ZmFsc2UgbWVhbnMgdGhlIHJ1bGUgZG9lc24ndCBhcHBseSB3aGVuCisgICAgICAgKiBlYXZlc2Ryb3BwaW5nLiBlYXZlc2Ryb3A9dHJ1ZSBtZWFucyBhbHdheXMgYWxsb3cuCisgICAgICAgKi8KKyAgICAgIGlmIChlYXZlc2Ryb3BwaW5nICYmIHJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnJlY2VpdmUuZWF2ZXNkcm9wKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgYWxsb3cgcnVsZSBzaW5jZSBpdCBkb2Vzbid0IGFwcGx5IHRvIGVhdmVzZHJvcHBpbmdcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIGZvciBkZW55LCBlYXZlc2Ryb3A9dHJ1ZSBtZWFucyB0aGUgcnVsZSBhcHBsaWVzIG9ubHkgd2hlbgorICAgICAgICogZWF2ZXNkcm9wcGluZzsgZWF2ZXNkcm9wPWZhbHNlIG1lYW5zIGFsd2F5cyBkZW55LgorICAgICAgICovCisgICAgICBpZiAoIWVhdmVzZHJvcHBpbmcgJiYgIXJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3ApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIGVhdmVzZHJvcHBpbmdcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIElmIGl0J3MgYSByZXBseSwgdGhlIHJlcXVlc3RlZF9yZXBseSBmbGFnIGtpY2tzIGluICovCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBmb3IgYWxsb3csIHJlcXVlc3RlZF9yZXBseT10cnVlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMKKyAgICAgICAgICAgKiBvbmx5IHdoZW4gcmVwbHkgd2FzIHJlcXVlc3RlZC4gcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zCisgICAgICAgICAgICogYWx3YXlzIGFsbG93LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICghcmVxdWVzdGVkX3JlcGx5ICYmIHJ1bGUtPmFsbG93ICYmIHJ1bGUtPmQucmVjZWl2ZS5yZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGFsbG93IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RlZCByZXBsaWVzIGFuZCBkb2VzIG5vdCBhbGxvdyBlYXZlc2Ryb3BwaW5nXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBmb3IgZGVueSwgcmVxdWVzdGVkX3JlcGx5PWZhbHNlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMgb25seQorICAgICAgICAgICAqIHdoZW4gdGhlIHJlcGx5IHdhcyBub3QgcmVxdWVzdGVkLiByZXF1ZXN0ZWRfcmVwbHk9dHJ1ZSBtZWFucyB0aGUKKyAgICAgICAgICAgKiBydWxlIGFsd2F5cyBhcHBsaWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXF1ZXN0ZWRfcmVwbHkgJiYgIXJ1bGUtPmFsbG93ICYmICFydWxlLT5kLnJlY2VpdmUucmVxdWVzdGVkX3JlcGx5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBkZW55IHJ1bGUgc2luY2UgaXQgb25seSBhcHBsaWVzIHRvIHVucmVxdWVzdGVkIHJlcGxpZXNcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLnBhdGggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5wYXRoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGZvciBkaWZmZXJlbnQgcGF0aFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgaW50ZXJmYWNlIGlzIG9wdGlvbmFsIGluIG1lc3NhZ2VzLiBGb3IgYWxsb3cgcnVsZXMsIGlmIHRoZSBtZXNzYWdlCisgICAgICAgICAgICogaGFzIG5vIGludGVyZmFjZSB3ZSB3YW50IHRvIHNraXAgdGhlIHJ1bGUgKGFuZCB0aHVzIG5vdCBhbGxvdyk7CisgICAgICAgICAgICogZm9yIGRlbnkgcnVsZXMsIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBpbnRlcmZhY2Ugd2Ugd2FudCB0byB1c2UgdGhlCisgICAgICAgICAgICogcnVsZSAoYW5kIHRodXMgZGVueSkuCisgICAgICAgICAgICovCisgICAgICAgICAgZGJ1c19ib29sX3Qgbm9faW50ZXJmYWNlOworCisgICAgICAgICAgbm9faW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID09IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKChub19pbnRlcmZhY2UgJiYgcnVsZS0+YWxsb3cpIHx8CisgICAgICAgICAgICAgICghbm9faW50ZXJmYWNlICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLm1lbWJlciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBtZW1iZXJcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLmVycm9yICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUuZXJyb3IpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBlcnJvciBuYW1lXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4gIT0gTlVMTCkKKyAgICAgICAgeyAgICAgICAgICAKKyAgICAgICAgICAvKiBzZW5kZXIgY2FuIGJlIE5VTEwgZm9yIG1lc3NhZ2VzIHRoYXQgb3JpZ2luYXRlIGZyb20gdGhlCisgICAgICAgICAgICogbWVzc2FnZSBidXMgaXRzZWxmLCB3ZSBjaGVjayB0aGUgc3RyaW5ncyBpbiB0aGF0IGNhc2UgYXMKKyAgICAgICAgICAgKiBidWlsdC1pbiBzZXJ2aWNlcyBkb24ndCBoYXZlIGEgREJ1c0Nvbm5lY3Rpb24gYnV0IHdpbGwKKyAgICAgICAgICAgKiBzdGlsbCBzZXQgdGhlIHNlbmRlciBvbiB0aGVpciBtZXNzYWdlcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoc2VuZGVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBtZXNzYWdlIHNlbmRlciBpcyBub3QgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgICAgICAgICAgICAgIERCdXNTdHJpbmcgc3RyOworCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBvcmlnaW4gJXMgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghYnVzX3NlcnZpY2VfaGFzX293bmVyIChzZXJ2aWNlLCBzZW5kZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBvcmlnaW4gJXMgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgICAgKCp0b2dnbGVzKSsrOworCisgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSB1c2VkIHJ1bGUsIGFsbG93IG5vdyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCk7CisgICAgfQorCisgIHJldHVybiBhbGxvd2VkOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX293biAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICAvKiBwb2xpY3ktPnJ1bGVzIGlzIGluIHRoZSBvcmRlciB0aGUgcnVsZXMgYXBwZWFyZWQKKyAgICogaW4gdGhlIGNvbmZpZyBmaWxlLCBpLmUuIGxhc3QgcnVsZSB0aGF0IGFwcGxpZXMgd2lucworICAgKi8KKworICBhbGxvd2VkID0gRkFMU0U7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgIAorICAgICAgLyogUnVsZSBpcyBza2lwcGVkIGlmIGl0IHNwZWNpZmllcyBhIGRpZmZlcmVudCBzZXJ2aWNlIG5hbWUgZnJvbQorICAgICAgICogdGhlIGRlc2lyZWQgb25lLgorICAgICAgICovCisgICAgICAKKyAgICAgIGlmIChydWxlLT50eXBlICE9IEJVU19QT0xJQ1lfUlVMRV9PV04pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAocnVsZS0+ZC5vd24uc2VydmljZV9uYW1lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgIH0KKworICByZXR1cm4gYWxsb3dlZDsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworZGJ1c19ib29sX3QKK2J1c19wb2xpY3lfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgLyogVGhpcyBkb2Vzbid0IGRvIGFueXRoaW5nIGZvciBub3cgYmVjYXVzZSBJIGRlY2lkZWQgdG8gZG8gaXQgaW4KKyAgICogZGlzcGF0Y2guYyBpbnN0ZWFkIGJ5IGhhdmluZyBzb21lIG9mIHRoZSBjbGllbnRzIGluIGRpc3BhdGNoLmMKKyAgICogaGF2ZSBwYXJ0aWN1bGFyIHBvbGljaWVzIGFwcGxpZWQgdG8gdGhlbS4KKyAgICovCisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9wb2xpY3kuaCBiL2RidXMtMS40LjEwL2J1cy9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgyZGJmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL3BvbGljeS5oCkBAIC0wLDAgKzEsMTY0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHBvbGljeS5oICBCdXMgc2VjdXJpdHkgcG9saWN5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1BPTElDWV9ICisjZGVmaW5lIEJVU19QT0xJQ1lfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlICJidXMuaCIKKwordHlwZWRlZiBlbnVtCit7CisgIEJVU19QT0xJQ1lfUlVMRV9TRU5ELAorICBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRSwKKyAgQlVTX1BPTElDWV9SVUxFX09XTiwKKyAgQlVTX1BPTElDWV9SVUxFX1VTRVIsCisgIEJVU19QT0xJQ1lfUlVMRV9HUk9VUAorfSBCdXNQb2xpY3lSdWxlVHlwZTsKKworLyoqIGRldGVybWluZXMgd2hldGhlciB0aGUgcnVsZSBhZmZlY3RzIGEgY29ubmVjdGlvbiwgb3Igc29tZSBnbG9iYWwgaXRlbSAqLworI2RlZmluZSBCVVNfUE9MSUNZX1JVTEVfSVNfUEVSX0NMSUVOVChydWxlKSAoISgocnVsZSktPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX1VTRVIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocnVsZSktPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX0dST1VQKSkKKworc3RydWN0IEJ1c1BvbGljeVJ1bGUKK3sKKyAgaW50IHJlZmNvdW50OworICAKKyAgQnVzUG9saWN5UnVsZVR5cGUgdHlwZTsKKworICB1bnNpZ25lZCBpbnQgYWxsb3cgOiAxOyAvKio8ICNUUlVFIGlmIHRoaXMgYWxsb3dzLCAjRkFMU0UgaWYgaXQgZGVuaWVzICovCisgIAorICB1bmlvbgorICB7CisgICAgc3RydWN0CisgICAgeworICAgICAgLyogbWVzc2FnZSB0eXBlIGNhbiBiZSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGludCAgIG1lc3NhZ2VfdHlwZTsKKyAgICAgIC8qIGFueSBvZiB0aGVzZSBjYW4gYmUgTlVMTCBtZWFuaW5nICJhbnkiICovCisgICAgICBjaGFyICpwYXRoOworICAgICAgY2hhciAqaW50ZXJmYWNlOworICAgICAgY2hhciAqbWVtYmVyOworICAgICAgY2hhciAqZXJyb3I7CisgICAgICBjaGFyICpkZXN0aW5hdGlvbjsKKyAgICAgIHVuc2lnbmVkIGludCBlYXZlc2Ryb3AgOiAxOworICAgICAgdW5zaWduZWQgaW50IHJlcXVlc3RlZF9yZXBseSA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgbG9nIDogMTsKKyAgICB9IHNlbmQ7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBtZXNzYWdlIHR5cGUgY2FuIGJlIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgbWVhbmluZyAiYW55IiAqLworICAgICAgaW50ICAgbWVzc2FnZV90eXBlOworICAgICAgLyogYW55IG9mIHRoZXNlIGNhbiBiZSBOVUxMIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGNoYXIgKnBhdGg7CisgICAgICBjaGFyICppbnRlcmZhY2U7CisgICAgICBjaGFyICptZW1iZXI7CisgICAgICBjaGFyICplcnJvcjsKKyAgICAgIGNoYXIgKm9yaWdpbjsKKyAgICAgIHVuc2lnbmVkIGludCBlYXZlc2Ryb3AgOiAxOworICAgICAgdW5zaWduZWQgaW50IHJlcXVlc3RlZF9yZXBseSA6IDE7CisgICAgfSByZWNlaXZlOworCisgICAgc3RydWN0CisgICAgeworICAgICAgLyogY2FuIGJlIE5VTEwgbWVhbmluZyAiYW55IiAqLworICAgICAgY2hhciAqc2VydmljZV9uYW1lOworICAgIH0gb3duOworCisgICAgc3RydWN0CisgICAgeworICAgICAgLyogY2FuIGJlIERCVVNfVUlEX1VOU0VUIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGRidXNfdWlkX3QgdWlkOworICAgIH0gdXNlcjsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIC8qIGNhbiBiZSBEQlVTX0dJRF9VTlNFVCBtZWFuaW5nICJhbnkiICovCisgICAgICBkYnVzX2dpZF90IGdpZDsKKyAgICB9IGdyb3VwOworCisgIH0gZDsKK307CisKK0J1c1BvbGljeVJ1bGUqIGJ1c19wb2xpY3lfcnVsZV9uZXcgICAoQnVzUG9saWN5UnVsZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYWxsb3cpOworQnVzUG9saWN5UnVsZSogYnVzX3BvbGljeV9ydWxlX3JlZiAgIChCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK3ZvaWQgICAgICAgICAgIGJ1c19wb2xpY3lfcnVsZV91bnJlZiAoQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CisKK0J1c1BvbGljeSogICAgICAgYnVzX3BvbGljeV9uZXcgICAgICAgICAgICAgICAgICAgKHZvaWQpOworQnVzUG9saWN5KiAgICAgICBidXNfcG9saWN5X3JlZiAgICAgICAgICAgICAgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5KTsKK3ZvaWQgICAgICAgICAgICAgYnVzX3BvbGljeV91bnJlZiAgICAgICAgICAgICAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSk7CitCdXNDbGllbnRQb2xpY3kqIGJ1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FsbG93X3VuaXhfdXNlciAgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdWlkKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hbGxvd193aW5kb3dzX3VzZXIgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKndpbmRvd3Nfc2lkKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FwcGVuZF9tYW5kYXRvcnlfcnVsZSAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYXBwZW5kX3VzZXJfcnVsZSAgICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FwcGVuZF9jb25zb2xlX3J1bGUgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIGF0X2NvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKKworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X21lcmdlICAgICAgICAgICAgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5ICAgICAgICAqdG9fYWJzb3JiKTsKKworQnVzQ2xpZW50UG9saWN5KiBidXNfY2xpZW50X3BvbGljeV9uZXcgICAgICAgICAgICAgICAodm9pZCk7CitCdXNDbGllbnRQb2xpY3kqIGJ1c19jbGllbnRfcG9saWN5X3JlZiAgICAgICAgICAgICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3kpOwordm9pZCAgICAgICAgICAgICBidXNfY2xpZW50X3BvbGljeV91bnJlZiAgICAgICAgICAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5KTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAqdG9nZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgKmxvZyk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAqdG9nZ2xlcyk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9vd24gICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NsaWVudF9wb2xpY3lfYXBwZW5kX3J1bGUgICAgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOwordm9pZCAgICAgICAgICAgICBidXNfY2xpZW50X3BvbGljeV9vcHRpbWl6ZSAgICAgICAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5KTsKKworCisjZW5kaWYgLyogQlVTX1BPTElDWV9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvcmMubWVzc2FnZWJ1cy5pbiBiL2RidXMtMS40LjEwL2J1cy9yYy5tZXNzYWdlYnVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmNhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvcmMubWVzc2FnZWJ1cy5pbgpAQCAtMCwwICsxLDc5IEBACisjIS9iaW4vc2gKKyMKKyMgbWVzc2FnZWJ1czogICBUaGUgRC1CVVMgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cworIworIyBjaGtjb25maWc6IDM0NSA5NyAwMworIyBkZXNjcmlwdGlvbjogIFRoaXMgaXMgYSBkYWVtb24gd2hpY2ggYnJvYWRjYXN0cyBub3RpZmljYXRpb25zIG9mIHN5c3RlbSBldmVudHMgXAorIyAgICAgICAgICAgICAgIGFuZCBvdGhlciBtZXNzYWdlcy4gU2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvCisjCisjIHByb2Nlc3NuYW1lOiBkYnVzLWRhZW1vbgorIyBwaWRmaWxlOiBAREJVU19TWVNURU1fUElEX0ZJTEVACisjCisKKyMgU2FuaXR5IGNoZWNrcy4KKyNbIC14IEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIF0gfHwgZXhpdCAwCisKKyMgU291cmNlIGZ1bmN0aW9uIGxpYnJhcnkuCisjLiBARVhQQU5ERURfU1lTQ09ORkRJUkAvcmMuZC9pbml0LmQvZnVuY3Rpb25zCisKKyMgc28gd2UgY2FuIHJlYXJyYW5nZSB0aGlzIGVhc2lseQorI3Byb2Nlc3NuYW1lPWRidXMtZGFlbW9uCisjc2VydmljZW5hbWU9bWVzc2FnZWJ1cworCisjUkVUVkFMPTAKKworc3RhcnQoKSB7CisgICAgZWNobyAiU3RhcnRpbmcgc3lzdGVtIG1lc3NhZ2UgYnVzIgorICAgIGlmIFsgLXggQEVYUEFOREVEX0JJTkRJUkAvZGJ1cy11dWlkZ2VuIF0gOyB0aGVuCisgICAgICAgIEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtdXVpZGdlbiAtLWVuc3VyZQorICAgIGZpCisKKyAgICBpZiBbIC14IEBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIF07dGhlbgorICAgIAlARVhQQU5ERURfQklORElSQC9kYnVzLWRhZW1vbiAtLXN5c3RlbQorICAgIGZpCisgICAgI2RhZW1vbiAtLWNoZWNrICRzZXJ2aWNlbmFtZSAkcHJvY2Vzc25hbWUgLS1zeXN0ZW0KKyAgICAjUkVUVkFMPSQ/CisgICAgI2VjaG8KKyAgICAjWyAkUkVUVkFMIC1lcSAwIF0gJiYgdG91Y2ggQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xvY2svc3Vic3lzLyRzZXJ2aWNlbmFtZQorfQorCitzdG9wKCkgeworICAgIGVjaG8gIlN0b3BwaW5nIHN5c3RlbSBtZXNzYWdlIGJ1cyIKKworICAgICMjIHdlIGRvbid0IHdhbnQgdG8ga2lsbCBhbGwgdGhlIHBlci11c2VyICRwcm9jZXNzbmFtZSwgd2Ugd2FudAorICAgICMjIHRvIHVzZSB0aGUgcGlkIGZpbGUgKm9ubHkqOyBiZWNhdXNlIHdlIHVzZSB0aGUgZmFrZSBub25leGlzdGVudCAKKyAgICAjIyBwcm9ncmFtIG5hbWUgIiRzZXJ2aWNlbmFtZSIgdGhhdCBzaG91bGQgYmUgc2FmZS1pc2gKKyAgICBraWxsYWxsIGRidXMtZGFlbW9uCisgICAgI1JFVFZBTD0kPworICAgICNlY2hvCisgICAgI2lmIFsgJFJFVFZBTCAtZXEgMCBdOyB0aGVuCisgICAgIyAgICBybSAtZiBARVhQQU5ERURfTE9DQUxTVEFURURJUkAvbG9jay9zdWJzeXMvJHNlcnZpY2VuYW1lCisgICAgIyAgICBybSAtZiBAREJVU19TWVNURU1fUElEX0ZJTEVACisgICAgI2ZpCit9CisKKyMgU2VlIGhvdyB3ZSB3ZXJlIGNhbGxlZC4KK2Nhc2UgIiQxIiBpbgorICAgIHN0YXJ0KQorICAgICAgICBzdGFydAorICAgICAgICA7OworICAgIHN0b3ApCisgICAgICAgIHN0b3AKKyAgICAgICAgOzsKKyAgICBzdGF0dXMpCisgICAgICAgIHN0YXR1cyAkc2VydmljZW5hbWUKKyAgICAgICAgUkVUVkFMPSQ/CisgICAgICAgIDs7CisgICAgcmVzdGFydCkKKyAgICAgICAgc3RvcAorICAgICAgICBzdGFydAorICAgICAgICA7OworICAgIHJlbG9hZCkKKyAgICAgICAgZWNobyAiTWVzc2FnZSBidXMgY2FuJ3QgcmVsb2FkIGl0cyBjb25maWd1cmF0aW9uLCB5b3UgaGF2ZSB0byByZXN0YXJ0IGl0IgorICAgICAgICBSRVRWQUw9JD8KKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBlY2hvICQiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHN0YXR1c3xyZXN0YXJ0fHJlbG9hZH0iCisgICAgICAgIDs7Citlc2FjCitleGl0ICRSRVRWQUwKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9zZWxpbnV4LmMgYi9kYnVzLTEuNC4xMC9idXMvc2VsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGQ4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvc2VsaW51eC5jCkBAIC0wLDAgKzEsMTA5MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotCisgKiBzZWxpbnV4LmMgIFNFTGludXggc2VjdXJpdHkgY2hlY2tzIGZvciBELUJ1cworICoKKyAqIEF1dGhvcjogTWF0dGhldyBSaWNrYXJkIDxtanJpY2thQGVwb2NoLm5jc2MubWlsPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpZm5kZWYgREJVU19XSU4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdXNlcmRiLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c2VsaW51eC9hdmMuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L2F2X3Blcm1pc3Npb25zLmg+CisjaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisjaWZkZWYgSEFWRV9MSUJBVURJVAorI2luY2x1ZGUgPGNhcC1uZy5oPgorI2luY2x1ZGUgPGxpYmF1ZGl0Lmg+CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworCisjZGVmaW5lIEJVU19TSURfRlJPTV9TRUxJTlVYKHNpZCkgICgoQnVzU0VMaW51eElEKikgKHNpZCkpCisjZGVmaW5lIFNFTElOVVhfU0lEX0ZST01fQlVTKHNpZCkgICgoc2VjdXJpdHlfaWRfdCkgKHNpZCkpCisKKyNpZmRlZiBIQVZFX1NFTElOVVgKKy8qIFN0b3JlIHRoZSB2YWx1ZSB0ZWxsaW5nIHVzIGlmIFNFTGludXggaXMgZW5hYmxlZCBpbiB0aGUga2VybmVsLiAqLworc3RhdGljIGRidXNfYm9vbF90IHNlbGludXhfZW5hYmxlZCA9IEZBTFNFOworCisvKiBTdG9yZSBhbiBhdmNfZW50cnlfcmVmIHRvIHNwZWVkIEFWQyBkZWNpc2lvbnMuICovCitzdGF0aWMgc3RydWN0IGF2Y19lbnRyeV9yZWYgYWVyZWY7CisKKy8qIFN0b3JlIHRoZSBTSUQgb2YgdGhlIGJ1cyBpdHNlbGYgdG8gdXNlIGFzIHRoZSBkZWZhdWx0LiAqLworc3RhdGljIHNlY3VyaXR5X2lkX3QgYnVzX3NpZCA9IFNFQ1NJRF9XSUxEOworCisvKiBUaHJlYWQgdG8gbGlzdGVuIGZvciBTRUxpbnV4IHN0YXR1cyBjaGFuZ2VzIHZpYSBuZXRsaW5rLiAqLworc3RhdGljIHB0aHJlYWRfdCBhdmNfbm90aWZ5X3RocmVhZDsKKworLyogUHJvdG90eXBlcyBmb3IgQVZDIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgdm9pZCBsb2dfY2FsbGJhY2sgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkIGxvZ19hdWRpdF9jYWxsYmFjayAodm9pZCAqZGF0YSwgc2VjdXJpdHlfY2xhc3NfdCBjbGFzcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVmdCk7CitzdGF0aWMgdm9pZCAqYXZjX2NyZWF0ZV90aHJlYWQgKHZvaWQgKCpydW4pICh2b2lkKSk7CitzdGF0aWMgdm9pZCBhdmNfc3RvcF90aHJlYWQgKHZvaWQgKnRocmVhZCk7CitzdGF0aWMgdm9pZCAqYXZjX2FsbG9jX2xvY2sgKHZvaWQpOworc3RhdGljIHZvaWQgYXZjX2dldF9sb2NrICh2b2lkICpsb2NrKTsKK3N0YXRpYyB2b2lkIGF2Y19yZWxlYXNlX2xvY2sgKHZvaWQgKmxvY2spOworc3RhdGljIHZvaWQgYXZjX2ZyZWVfbG9jayAodm9pZCAqbG9jayk7CisKKy8qIEFWQyBjYWxsYmFjayBzdHJ1Y3R1cmVzIGZvciB1c2UgaW4gYXZjX2luaXQuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhdmNfbWVtb3J5X2NhbGxiYWNrIG1lbV9jYiA9Cit7CisgIC5mdW5jX21hbGxvYyA9IGRidXNfbWFsbG9jLAorICAuZnVuY19mcmVlID0gZGJ1c19mcmVlCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhdmNfbG9nX2NhbGxiYWNrIGxvZ19jYiA9Cit7CisgIC5mdW5jX2xvZyA9IGxvZ19jYWxsYmFjaywKKyAgLmZ1bmNfYXVkaXQgPSBsb2dfYXVkaXRfY2FsbGJhY2sKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGF2Y190aHJlYWRfY2FsbGJhY2sgdGhyZWFkX2NiID0KK3sKKyAgLmZ1bmNfY3JlYXRlX3RocmVhZCA9IGF2Y19jcmVhdGVfdGhyZWFkLAorICAuZnVuY19zdG9wX3RocmVhZCA9IGF2Y19zdG9wX3RocmVhZAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZjX2xvY2tfY2FsbGJhY2sgbG9ja19jYiA9Cit7CisgIC5mdW5jX2FsbG9jX2xvY2sgPSBhdmNfYWxsb2NfbG9jaywKKyAgLmZ1bmNfZ2V0X2xvY2sgPSBhdmNfZ2V0X2xvY2ssCisgIC5mdW5jX3JlbGVhc2VfbG9jayA9IGF2Y19yZWxlYXNlX2xvY2ssCisgIC5mdW5jX2ZyZWVfbG9jayA9IGF2Y19mcmVlX2xvY2sKK307CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisKKy8qKgorICogTG9nIGNhbGxiYWNrIHRvIGxvZyBkZW5pYWwgbWVzc2FnZXMgZnJvbSB0aGUgQVZDLgorICogVGhpcyBpcyB1c2VkIGluIGF2Y19pbml0LiAgTG9ncyB0byBib3RoIHN0YW5kYXJkCisgKiBlcnJvciBhbmQgc3lzbG9nZC4KKyAqCisgKiBAcGFyYW0gZm10IHRoZSBmb3JtYXQgc3RyaW5nCisgKiBAcGFyYW0gdmFyaWFibGUgYXJndW1lbnQgbGlzdAorICovCisjaWZkZWYgSEFWRV9TRUxJTlVYCisKKyNpZmRlZiBIQVZFX0xJQkFVRElUCitzdGF0aWMgaW50IGF1ZGl0X2ZkID0gLTE7CisjZW5kaWYKKwordm9pZAorYnVzX3NlbGludXhfYXVkaXRfaW5pdCh2b2lkKQoreworI2lmZGVmIEhBVkVfTElCQVVESVQgIAorICBhdWRpdF9mZCA9IGF1ZGl0X29wZW4gKCk7CisKKyAgaWYgKGF1ZGl0X2ZkIDwgMCkKKyAgICB7CisgICAgICAvKiBJZiBrZXJuZWwgZG9lc24ndCBzdXBwb3J0IGF1ZGl0LCBiYWlsIG91dCAqLworICAgICAgaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFUFJPVE9OT1NVUFBPUlQgfHwgZXJybm8gPT0gRUFGTk9TVVBQT1JUKQorICAgICAgICByZXR1cm47CisgICAgICAvKiBJZiB1c2VyIGJ1cywgYmFpbCBvdXQgKi8KKyAgICAgIGlmIChlcnJubyA9PSBFUEVSTSAmJiBnZXR1aWQoKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIG9wZW5pbmcgY29ubmVjdGlvbiB0byB0aGUgYXVkaXQgc3Vic3lzdGVtIik7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfTElCQVVESVQgKi8KK30KKworc3RhdGljIHZvaWQgCitsb2dfY2FsbGJhY2sgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSAKK3sKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydChhcCwgZm10KTsKKworI2lmZGVmIEhBVkVfTElCQVVESVQKKyAgaWYgKGF1ZGl0X2ZkID49IDApCisgIHsKKyAgICBjYXBuZ19nZXRfY2Fwc19wcm9jZXNzKCk7CisgICAgaWYgKGNhcG5nX2hhdmVfY2FwYWJpbGl0eShDQVBOR19FRkZFQ1RJVkUsIENBUF9BVURJVF9XUklURSkpCisgICAgeworICAgICAgY2hhciBidWZbUEFUSF9NQVgqMl07CisgICAgCisgICAgICAvKiBGSVhNRTogbmVlZCB0byBjaGFuZ2UgdGhpcyB0byBzaG93IHJlYWwgdXNlciAqLworICAgICAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOworICAgICAgYXVkaXRfbG9nX3VzZXJfYXZjX21lc3NhZ2UoYXVkaXRfZmQsIEFVRElUX1VTRVJfQVZDLCBidWYsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZ2V0dWlkKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorI2VuZGlmIC8qIEhBVkVfTElCQVVESVQgKi8KKyAgCisgIHZzeXNsb2cgKExPR19VU0VSIHwgTE9HX0lORk8sIGZtdCwgYXApOworICB2YV9lbmQoYXApOworfQorCisvKioKKyAqIE9uIGEgcG9saWN5IHJlbG9hZCB3ZSBuZWVkIHRvIHJlcGFyc2UgdGhlIFNFTGludXggY29uZmlndXJhdGlvbiBmaWxlLCBzaW5jZQorICogdGhpcyBjb3VsZCBoYXZlIGNoYW5nZWQuICBTZW5kIGEgU0lHSFVQIHRvIHJlbG9hZCBhbGwgY29uZmlncy4KKyAqLworc3RhdGljIGludAorcG9saWN5X3JlbG9hZF9jYWxsYmFjayAodV9pbnQzMl90IGV2ZW50LCBzZWN1cml0eV9pZF90IHNzaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlfaWRfdCB0c2lkLCBzZWN1cml0eV9jbGFzc190IHRjbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsIGFjY2Vzc192ZWN0b3JfdCAqb3V0X3JldGFpbmVkKQoreworICBpZiAoZXZlbnQgPT0gQVZDX0NBTExCQUNLX1JFU0VUKQorICAgIHJldHVybiByYWlzZSAoU0lHSFVQKTsKKyAgCisgIHJldHVybiAwOworfQorCisvKioKKyAqIExvZyBhbnkgYXV4aWxpYXJ5IGRhdGEgCisgKi8KK3N0YXRpYyB2b2lkCitsb2dfYXVkaXRfY2FsbGJhY2sgKHZvaWQgKmRhdGEsIHNlY3VyaXR5X2NsYXNzX3QgY2xhc3MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlZnQpCit7CisgIERCdXNTdHJpbmcgKmF1ZG1zZyA9IGRhdGE7CisKKyAgaWYgKGJ1ZmxlZnQgPiAoc2l6ZV90KSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aChhdWRtc2cpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoYXVkbXNnLCBidWYsIGJ1ZmxlZnQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgczsKKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QoJnMsICJCdWZmZXIgdG9vIHNtYWxsIGZvciBhdWRpdCBtZXNzYWdlIik7CisKKyAgICAgIGlmIChidWZsZWZ0ID4gKHNpemVfdCkgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgoJnMpKQorICAgICAgICBfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXJfd2l0aF9udWwgKCZzLCBidWYsIGJ1ZmxlZnQpOworICAgIH0KK30KKworLyoqCisgKiBDcmVhdGUgdGhyZWFkIHRvIG5vdGlmeSB0aGUgQVZDIG9mIGVuZm9yY2luZyBhbmQgcG9saWN5IHJlbG9hZAorICogY2hhbmdlcyB2aWEgbmV0bGluay4KKyAqCisgKiBAcGFyYW0gcnVuIHRoZSB0aHJlYWQgcnVuIGZ1bmN0aW9uCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIHRocmVhZAorICovCitzdGF0aWMgdm9pZCAqCithdmNfY3JlYXRlX3RocmVhZCAodm9pZCAoKnJ1bikgKHZvaWQpKQoreworICBpbnQgcmM7CisKKyAgcmMgPSBwdGhyZWFkX2NyZWF0ZSAoJmF2Y19ub3RpZnlfdGhyZWFkLCBOVUxMLCAodm9pZCAqKCopICh2b2lkICopKSBydW4sIE5VTEwpOworICBpZiAocmMgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHN0YXJ0IEFWQyB0aHJlYWQ6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAocmMpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgcmV0dXJuICZhdmNfbm90aWZ5X3RocmVhZDsKK30KKworLyogU3RvcCBBVkMgbmV0bGluayB0aHJlYWQuICAqLworc3RhdGljIHZvaWQKK2F2Y19zdG9wX3RocmVhZCAodm9pZCAqdGhyZWFkKQoreworICBwdGhyZWFkX2NhbmNlbCAoKihwdGhyZWFkX3QgKikgdGhyZWFkKTsKK30KKworLyogQWxsb2NhdGUgYSBuZXcgQVZDIGxvY2suICAqLworc3RhdGljIHZvaWQgKgorYXZjX2FsbG9jX2xvY2sgKHZvaWQpCit7CisgIHB0aHJlYWRfbXV0ZXhfdCAqYXZjX211dGV4OworCisgIGF2Y19tdXRleCA9IGRidXNfbmV3IChwdGhyZWFkX211dGV4X3QsIDEpOworICBpZiAoYXZjX211dGV4ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBjcmVhdGUgbXV0ZXg6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgcHRocmVhZF9tdXRleF9pbml0IChhdmNfbXV0ZXgsIE5VTEwpOworCisgIHJldHVybiBhdmNfbXV0ZXg7Cit9CisKKy8qIEFjcXVpcmUgYW4gQVZDIGxvY2suICAqLworc3RhdGljIHZvaWQKK2F2Y19nZXRfbG9jayAodm9pZCAqbG9jaykKK3sKKyAgcHRocmVhZF9tdXRleF9sb2NrIChsb2NrKTsKK30KKworLyogUmVsZWFzZSBhbiBBVkMgbG9jay4gICovCitzdGF0aWMgdm9pZAorYXZjX3JlbGVhc2VfbG9jayAodm9pZCAqbG9jaykKK3sKKyAgcHRocmVhZF9tdXRleF91bmxvY2sgKGxvY2spOworfQorCisvKiBGcmVlIGFuIEFWQyBsb2NrLiAgKi8KK3N0YXRpYyB2b2lkCithdmNfZnJlZV9sb2NrICh2b2lkICpsb2NrKQoreworICBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKGxvY2spOworICBkYnVzX2ZyZWUgKGxvY2spOworfQorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworCisvKioKKyAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBTRUxpbnV4IGlzIGVuYWJsZWQ7IG11c3QgYmUKKyAqIGNhbGxlZCBhZnRlciBidXNfc2VsaW51eF9pbml0LgorICovCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfZW5hYmxlZCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgcmV0dXJuIHNlbGludXhfZW5hYmxlZDsKKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworLyoqCisgKiBEbyBlYXJseSBpbml0aWFsaXphdGlvbjsgZGV0ZXJtaW5lIHdoZXRoZXIgU0VMaW51eCBpcyBlbmFibGVkLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfcHJlX2luaXQgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIGludCByOworICBfZGJ1c19hc3NlcnQgKGJ1c19zaWQgPT0gU0VDU0lEX1dJTEQpOworICAKKyAgLyogRGV0ZXJtaW5lIGlmIHdlIGFyZSBydW5uaW5nIGFuIFNFTGludXgga2VybmVsLiAqLworICByID0gaXNfc2VsaW51eF9lbmFibGVkICgpOworICBpZiAociA8IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCB0ZWxsIGlmIFNFTGludXggaXMgZW5hYmxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2VsaW51eF9lbmFibGVkID0gciAhPSAwOworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgdXNlciBzcGFjZSBhY2Nlc3MgdmVjdG9yIGNhY2hlIChBVkMpIGZvciBELUJ1cyBhbmQgc2V0IHVwCisgKiBsb2dnaW5nIGNhbGxiYWNrcy4KKyAqLworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2Z1bGxfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgY2hhciAqYnVzX2NvbnRleHQ7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfc2lkID09IFNFQ1NJRF9XSUxEKTsKKyAgCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IG5vdCBlbmFibGVkIGluIHRoaXMga2VybmVsLlxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggaXMgZW5hYmxlZCBpbiB0aGlzIGtlcm5lbC5cbiIpOworCisgIGF2Y19lbnRyeV9yZWZfaW5pdCAoJmFlcmVmKTsKKyAgaWYgKGF2Y19pbml0ICgiYXZjIiwgJm1lbV9jYiwgJmxvZ19jYiwgJnRocmVhZF9jYiwgJmxvY2tfY2IpIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHN0YXJ0IEFjY2VzcyBWZWN0b3IgQ2FjaGUgKEFWQykuXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQWNjZXNzIFZlY3RvciBDYWNoZSAoQVZDKSBzdGFydGVkLlxuIik7CisgICAgfQorCisgIGlmIChhdmNfYWRkX2NhbGxiYWNrIChwb2xpY3lfcmVsb2FkX2NhbGxiYWNrLCBBVkNfQ0FMTEJBQ0tfUkVTRVQsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsIDApIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGFkZCBwb2xpY3kgcmVsb2FkIGNhbGxiYWNrOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgYXZjX2Rlc3Ryb3kgKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19jb250ZXh0ID0gTlVMTDsKKyAgYnVzX3NpZCA9IFNFQ1NJRF9XSUxEOworCisgIGlmIChnZXRjb24gKCZidXNfY29udGV4dCkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIGNvbnRleHQgb2YgYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAgIAorICBpZiAoYXZjX2NvbnRleHRfdG9fc2lkIChidXNfY29udGV4dCwgJmJ1c19zaWQpIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBidXMgY29udGV4dDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGZyZWVjb24gKGJ1c19jb250ZXh0KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZnJlZWNvbiAoYnVzX2NvbnRleHQpOworICAKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRGVjcmVtZW50IFNJRCByZWZlcmVuY2UgY291bnQuCisgKiAKKyAqIEBwYXJhbSBzaWQgdGhlIFNJRCB0byBkZWNyZW1lbnQKKyAqLwordm9pZAorYnVzX3NlbGludXhfaWRfdW5yZWYgKEJ1c1NFTGludXhJRCAqc2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChzaWQgIT0gTlVMTCk7CisgIAorICBzaWRwdXQgKFNFTElOVVhfU0lEX0ZST01fQlVTIChzaWQpKTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKwordm9pZAorYnVzX3NlbGludXhfaWRfcmVmIChCdXNTRUxpbnV4SUQgKnNpZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoc2lkICE9IE5VTEwpOworICAKKyAgc2lkZ2V0IChTRUxJTlVYX1NJRF9GUk9NX0JVUyAoc2lkKSk7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKy8qKgorICogRGV0ZXJtaW5lIGlmIHRoZSBTRUxpbnV4IHNlY3VyaXR5IHBvbGljeSBhbGxvd3MgdGhlIGdpdmVuIHNlbmRlcgorICogc2VjdXJpdHkgY29udGV4dCB0byBnbyB0byB0aGUgZ2l2ZW4gcmVjaXBpZW50IHNlY3VyaXR5IGNvbnRleHQuCisgKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBhcmUgdG8gYmUKKyAqIGdyYW50ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiB0byB0aGUgbWVzc2FnZSBidXMgb3IgdG8gYW5vdGhlcgorICogb3B0aW9uYWxseSBzdXBwbGllZCBzZWN1cml0eSBpZGVudGlmaWVyIChlLmcuIGZvciBhIHNlcnZpY2UKKyAqIGNvbnRleHQpLiAgQ3VycmVudGx5IHRoZXNlIHBlcm1pc3Npb25zIGFyZSBlaXRoZXIgc2VuZF9tc2cgb3IKKyAqIGFjcXVpcmVfc3ZjIGluIHRoZSBkYnVzIGNsYXNzLgorICoKKyAqIEBwYXJhbSBzZW5kZXJfc2lkIHNvdXJjZSBzZWN1cml0eSBjb250ZXh0CisgKiBAcGFyYW0gb3ZlcnJpZGVfc2lkIGlzIHRoZSB0YXJnZXQgc2VjdXJpdHkgY29udGV4dC4gIElmIFNFQ1NJRF9XSUxEIHRoaXMgd2lsbAorICogICAgICAgIHVzZSB0aGUgY29udGV4dCBvZiB0aGUgYnVzIGl0c2VsZiAoZS5nLiB0aGUgZGVmYXVsdCkuCisgKiBAcGFyYW0gdGFyZ2V0X2NsYXNzIGlzIHRoZSB0YXJnZXQgc2VjdXJpdHkgY2xhc3MuCisgKiBAcGFyYW0gcmVxdWVzdGVkIGlzIHRoZSByZXF1ZXN0ZWQgcGVybWlzc2lvbnMuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzZWN1cml0eSBwb2xpY3kgYWxsb3dzIHRoZSBzZW5kLgorICovCisjaWZkZWYgSEFWRV9TRUxJTlVYCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2NoZWNrIChCdXNTRUxpbnV4SUQgICAgICAgICpzZW5kZXJfc2lkLAorICAgICAgICAgICAgICAgICAgIEJ1c1NFTGludXhJRCAgICAgICAgKm92ZXJyaWRlX3NpZCwKKyAgICAgICAgICAgICAgICAgICBzZWN1cml0eV9jbGFzc190ICAgICB0YXJnZXRfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgYWNjZXNzX3ZlY3Rvcl90ICAgICAgcmVxdWVzdGVkLAorCQkgICBEQnVzU3RyaW5nICAgICAgICAgICphdXhkYXRhKQoreworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBNYWtlIHRoZSBzZWN1cml0eSBjaGVjay4gIEFWQyBjaGVja3MgZW5mb3JjaW5nIG1vZGUgaGVyZSBhcyB3ZWxsLiAqLworICBpZiAoYXZjX2hhc19wZXJtIChTRUxJTlVYX1NJRF9GUk9NX0JVUyAoc2VuZGVyX3NpZCksCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX3NpZCA/CisgICAgICAgICAgICAgICAgICAgIFNFTElOVVhfU0lEX0ZST01fQlVTIChvdmVycmlkZV9zaWQpIDoKKyAgICAgICAgICAgICAgICAgICAgU0VMSU5VWF9TSURfRlJPTV9CVVMgKGJ1c19zaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2NsYXNzLCByZXF1ZXN0ZWQsICZhZXJlZiwgYXV4ZGF0YSkgPCAwKQorICAgIHsKKyAgICBzd2l0Y2ggKGVycm5vKQorICAgICAgeworICAgICAgY2FzZSBFQUNDRVM6CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IGRlbnlpbmcgZHVlIHRvIHNlY3VyaXR5IHBvbGljeS5cbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBjYXNlIEVJTlZBTDoKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggZGVueWluZyBkdWUgdG8gaW52YWxpZCBzZWN1cml0eSBjb250ZXh0LlxuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IGRlbnlpbmcgZHVlIHRvOiAlc1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNvbm5lY3Rpb24gY2FuIGFjcXVpcmUgYSBzZXJ2aWNlLAorICogYXNzdW1pbmcgdGhlIGdpdmVuIHNlY3VyaXR5IElEIGlzIG5lZWRlZCBmb3IgdGhhdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGNvbm5lY3Rpb24gdGhhdCB3YW50cyB0byBvd24gdGhlIHNlcnZpY2UKKyAqIEBwYXJhbSBzZXJ2aWNlX3NpZCB0aGUgU0lEIG9mIHRoZSBzZXJ2aWNlIGZyb20gdGhlIHRhYmxlCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhY3F1aXJlIGlzIHBlcm1pdHRlZC4KKyAqLworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NFTGludXhJRCAgICAgICAqc2VydmljZV9zaWQsCisJCQkJICAgIGNvbnN0IGNoYXIgICAgICAgICAqc2VydmljZV9uYW1lLAorCQkJCSAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBCdXNTRUxpbnV4SUQgKmNvbm5lY3Rpb25fc2lkOworICB1bnNpZ25lZCBsb25nIHNwaWQ7CisgIERCdXNTdHJpbmcgYXV4ZGF0YTsKKyAgZGJ1c19ib29sX3QgcmV0OworICAKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisgIAorICBjb25uZWN0aW9uX3NpZCA9IGJ1c19jb25uZWN0aW9uX2dldF9zZWxpbnV4X2lkIChjb25uZWN0aW9uKTsKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubmVjdGlvbiwgJnNwaWQpKQorICAgIHNwaWQgPSAwOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXhkYXRhKSkKKyAgICBnb3RvIG9vbTsKKyAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgInNlcnZpY2U9IikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgc2VydmljZV9uYW1lKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoc3BpZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIHNwaWQ9IikpCisJZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF91aW50ICgmYXV4ZGF0YSwgc3BpZCkpCisJZ290byBvb207CisgICAgfQorICAKKyAgcmV0ID0gYnVzX3NlbGludXhfY2hlY2sgKGNvbm5lY3Rpb25fc2lkLAorCQkJICAgc2VydmljZV9zaWQsCisJCQkgICBTRUNDTEFTU19EQlVTLAorCQkJICAgREJVU19fQUNRVUlSRV9TVkMsCisJCQkgICAmYXV4ZGF0YSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKyAgcmV0dXJuIHJldDsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworCisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworLyoqCisgKiBDaGVjayBpZiBTRUxpbnV4IHNlY3VyaXR5IGNvbnRyb2xzIGFsbG93IHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gYQorICogcGFydGljdWxhciBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBzZW5kZXIgYW5kCisgKiB0aGF0IG9mIHRoZSByZWNlaXZlci4gVGhlIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb24gbmVlZCBub3QgYmUgdGhlCisgKiBhZGRyZXNzZWQgcmVjaXBpZW50LCBpdCBjb3VsZCBiZSBhbiAiZWF2ZXNkcm9wcGVyIgorICoKKyAqIEBwYXJhbSBzZW5kZXIgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSBwcm9wb3NlZF9yZWNpcGllbnQgdGhlIGNvbm5lY3Rpb24gdGhlIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCB0by4KKyAqIEByZXR1cm5zIHdoZXRoZXIgdG8gYWxsb3cgdGhlIHNlbmQKKyAqLworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2FsbG93c19zZW5kIChEQnVzQ29ubmVjdGlvbiAgICAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgKnByb3Bvc2VkX3JlY2lwaWVudCwKKwkJCSBjb25zdCBjaGFyICAgICAgICAgKm1zZ3R5cGUsCisJCQkgY29uc3QgY2hhciAgICAgICAgICppbnRlcmZhY2UsCisJCQkgY29uc3QgY2hhciAgICAgICAgICptZW1iZXIsCisJCQkgY29uc3QgY2hhciAgICAgICAgICplcnJvcl9uYW1lLAorCQkJIGNvbnN0IGNoYXIgICAgICAgICAqZGVzdGluYXRpb24sCisJCQkgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgQnVzU0VMaW51eElEICpyZWNpcGllbnRfc2lkOworICBCdXNTRUxpbnV4SUQgKnNlbmRlcl9zaWQ7CisgIHVuc2lnbmVkIGxvbmcgc3BpZCwgdHBpZDsKKyAgREJ1c1N0cmluZyBhdXhkYXRhOworICBkYnVzX2Jvb2xfdCByZXQ7CisgIGRidXNfYm9vbF90IHN0cmluZ19hbGxvY2VkOworCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghc2VuZGVyIHx8ICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoc2VuZGVyLCAmc3BpZCkpCisgICAgc3BpZCA9IDA7CisgIGlmICghcHJvcG9zZWRfcmVjaXBpZW50IHx8ICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAocHJvcG9zZWRfcmVjaXBpZW50LCAmdHBpZCkpCisgICAgdHBpZCA9IDA7CisKKyAgc3RyaW5nX2FsbG9jZWQgPSBGQUxTRTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1eGRhdGEpKQorICAgIGdvdG8gb29tOworICBzdHJpbmdfYWxsb2NlZCA9IFRSVUU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIm1zZ3R5cGU9IikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgbXNndHlwZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKGludGVyZmFjZSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIGludGVyZmFjZT0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIGludGVyZmFjZSkpCisJZ290byBvb207CisgICAgfQorCisgIGlmIChtZW1iZXIpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBtZW1iZXI9IikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBtZW1iZXIpKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAoZXJyb3JfbmFtZSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIGVycm9yX25hbWU9IikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBlcnJvcl9uYW1lKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGRlc3RpbmF0aW9uKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICIgZGVzdD0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIGRlc3RpbmF0aW9uKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKHNwaWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBzcGlkPSIpKQorCWdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoJmF1eGRhdGEsIHNwaWQpKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAodHBpZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIHRwaWQ9IikpCisJZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF91aW50ICgmYXV4ZGF0YSwgdHBpZCkpCisJZ290byBvb207CisgICAgfQorCisgIHNlbmRlcl9zaWQgPSBidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoc2VuZGVyKTsKKyAgLyogQSBOVUxMIHByb3Bvc2VkX3JlY2lwaWVudCBtZWFucyB0aGUgYnVzIGl0c2VsZi4gKi8KKyAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCkKKyAgICByZWNpcGllbnRfc2lkID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlbGludXhfaWQgKHByb3Bvc2VkX3JlY2lwaWVudCk7CisgIGVsc2UKKyAgICByZWNpcGllbnRfc2lkID0gQlVTX1NJRF9GUk9NX1NFTElOVVggKGJ1c19zaWQpOworCisgIHJldCA9IGJ1c19zZWxpbnV4X2NoZWNrIChzZW5kZXJfc2lkLCAKKwkJCSAgIHJlY2lwaWVudF9zaWQsCisJCQkgICBTRUNDTEFTU19EQlVTLCAKKwkJCSAgIERCVVNfX1NFTkRfTVNHLAorCQkJICAgJmF1eGRhdGEpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisKKyAgcmV0dXJuIHJldDsKKworIG9vbToKKyAgaWYgKHN0cmluZ19hbGxvY2VkKQorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKKyAgCisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2FwcGVuZF9jb250ZXh0IChEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCSAgICBCdXNTRUxpbnV4SUQgICAqc2lkLAorCQkJICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgY2hhciAqY29udGV4dDsKKworICBpZiAoYXZjX3NpZF90b19jb250ZXh0IChTRUxJTlVYX1NJRF9GUk9NX0JVUyAoc2lkKSwgJmNvbnRleHQpIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PTUVNKQorICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGdldHRpbmcgY29udGV4dCBmcm9tIFNJRDogJXNcbiIsCisJCQlfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorCQkJCSBEQlVTX1RZUEVfQVJSQVksCisJCQkJIERCVVNfVFlQRV9CWVRFLAorCQkJCSAmY29udGV4dCwKKwkJCQkgc3RybGVuIChjb250ZXh0KSwKKwkJCQkgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGZyZWVjb24gKGNvbnRleHQpOworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKKy8qKgorICogR2V0cyB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cy4gSXQgaXMgdXAgdG8KKyAqIHRoZSBjYWxsZXIgdG8gZnJlZWNvbigpIHdoZW4gdGhleSBhcmUgZG9uZS4gCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdG8gZ2V0IHRoZSBjb250ZXh0IG9mLgorICogQHBhcmFtIGNvbiB0aGUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHNlY3VyaXR5IGNvbnRleHQuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZC4KKyAqLworI2lmZGVmIEhBVkVfU0VMSU5VWAorc3RhdGljIGRidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9yZWFkX3NlbGludXhfY29udGV4dCAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICoqY29uKQoreworICBpbnQgZmQ7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X2ZkIChjb25uZWN0aW9uLCAmZmQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0IGZpbGUgZGVzY3JpcHRvciBvZiBzb2NrZXQuXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoZ2V0cGVlcmNvbiAoZmQsIGNvbikgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIGNvbnRleHQgb2Ygc29ja2V0IHBlZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSByZWFkIGNvbm5lY3Rpb24gY29udGV4dC5cbiIpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBSZWFkIHRoZSBTRUxpbnV4IElEIGZyb20gdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdG8gcmVhZCBmcm9tCisgKiBAcmV0dXJucyB0aGUgU0lEIGlmIHN1Y2Nlc3NmdWxseSBkZXRlcm1pbmVkLCAjTlVMTCBvdGhlcndpc2UuCisgKi8KK0J1c1NFTGludXhJRCoKK2J1c19zZWxpbnV4X2luaXRfY29ubmVjdGlvbl9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgY2hhciAqY29uOworICBzZWN1cml0eV9pZF90IHNpZDsKKyAgCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25fcmVhZF9zZWxpbnV4X2NvbnRleHQgKGNvbm5lY3Rpb24sICZjb24pKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGFuIFNFTGludXggY29udGV4dCBmcm9tIGNvbm5lY3Rpb24iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIHBlZXIgY29udGV4dC5cbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDb252ZXJ0aW5nIGNvbnRleHQgdG8gU0lEIHRvIHN0b3JlIG9uIGNvbm5lY3Rpb25cbiIpOworCisgIGlmIChhdmNfY29udGV4dF90b19zaWQgKGNvbiwgJnNpZCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFTk9NRU0pCisgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBjb250ZXh0IFwiJXNcIjogJXNcbiIsCisJCQljb24sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgCisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBjb250ZXh0IFwiJXNcIjogJXNcbiIsCisJCSAgY29uLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIAorICAgICAgZnJlZWNvbiAoY29uKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAKKyAgZnJlZWNvbiAoY29uKTsgCisgIHJldHVybiBCVVNfU0lEX0ZST01fU0VMSU5VWCAoc2lkKTsKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisKKy8qKgorICogRnVuY3Rpb24gZm9yIGZyZWVpbmcgaGFzaCB0YWJsZSBkYXRhLiAgVGhlc2UgU0lEcworICogc2hvdWxkIG5vIGxvbmdlciBiZSByZWZlcmVuY2VkLgorICovCitzdGF0aWMgdm9pZAorYnVzX3NlbGludXhfaWRfdGFibGVfZnJlZV92YWx1ZSAoQnVzU0VMaW51eElEICpzaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIC8qIE5VTEwgc29tZXRpbWVzIGR1ZSB0byBob3cgREJ1c0hhc2hUYWJsZSB3b3JrcyAqLworICBpZiAoc2lkKQorICAgIGJ1c19zZWxpbnV4X2lkX3VucmVmIChzaWQpOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdGFibGUgbWFwcGluZyBzZXJ2aWNlIG5hbWVzIHRvIHNlY3VyaXR5IElELgorICogQSBzZWN1cml0eSBJRCBpcyBhICJjb21waWxlZCIgc2VjdXJpdHkgY29udGV4dCwgYSBzZWN1cml0eQorICogY29udGV4dCBpcyBqdXN0IGEgc3RyaW5nLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgdGFibGUgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNIYXNoVGFibGUqCitidXNfc2VsaW51eF9pZF90YWJsZV9uZXcgKHZvaWQpCit7CisgIHJldHVybiBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKSBidXNfc2VsaW51eF9pZF90YWJsZV9mcmVlX3ZhbHVlKTsKK30KKworLyoqIAorICogSGFzaGVzIGEgc2VydmljZSBuYW1lIGFuZCBzZXJ2aWNlIGNvbnRleHQgaW50byB0aGUgc2VydmljZSBTSUQKKyAqIHRhYmxlIGFzIGEgc3RyaW5nIGFuZCBhIFNJRC4KKyAqCisgKiBAcGFyYW0gc2VydmljZV9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLgorICogQHBhcmFtIHNlcnZpY2VfY29udGV4dCBpcyB0aGUgY29udGV4dCBvZiB0aGUgc2VydmljZS4KKyAqIEBwYXJhbSBzZXJ2aWNlX3RhYmxlIGlzIHRoZSB0YWJsZSB0byBoYXNoIHRoZW0gaW50by4KKyAqIEByZXR1cm4gI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9pZF90YWJsZV9pbnNlcnQgKERCdXNIYXNoVGFibGUgKnNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2VydmljZV9jb250ZXh0KQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHNlY3VyaXR5X2lkX3Qgc2lkOworICBjaGFyICprZXk7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgc2lkID0gU0VDU0lEX1dJTEQ7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGtleSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZV9uYW1lKTsKKyAgaWYgKGtleSA9PSBOVUxMKQorICAgIHJldHVybiByZXR2YWw7CisgIAorICBpZiAoYXZjX2NvbnRleHRfdG9fc2lkICgoY2hhciAqKSBzZXJ2aWNlX2NvbnRleHQsICZzaWQpIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PTUVNKQorICAgICAgICB7CisJICBkYnVzX2ZyZWUgKGtleSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKworICAgICAgX2RidXNfd2FybiAoIkVycm9yIGdldHRpbmcgU0lEIGZyb20gY29udGV4dCBcIiVzXCI6ICVzXG4iLAorCQkgIChjaGFyICopIHNlcnZpY2VfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTX1NJRF9GUk9NX1NFTElOVVggKHNpZCkpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX3ZlcmJvc2UgKCJQYXJzZWQgXHRzZXJ2aWNlOiAlcyBcblx0XHRjb250ZXh0OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGtleSwgCisgICAgICAgICAgICAgICAgICBzaWQtPmN0eCk7CisKKyAgLyogVGhlc2UgYXJlIG93bmVkIGJ5IHRoZSBoYXNoLCBzbyBjbGVhciB0aGVtIHRvIGF2b2lkIHVucmVmICovCisgIGtleSA9IE5VTEw7CisgIHNpZCA9IFNFQ1NJRF9XSUxEOworCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKHNpZCAhPSBTRUNTSURfV0lMRCkKKyAgICBzaWRwdXQgKHNpZCk7CisKKyAgaWYgKGtleSkKKyAgICBkYnVzX2ZyZWUgKGtleSk7CisKKyAgcmV0dXJuIHJldHZhbDsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisKKy8qKgorICogRmluZCB0aGUgc2VjdXJpdHkgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHNlcnZpY2UKKyAqIG5hbWUuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoaXMgU0lELCBvciAjTlVMTC9TRUNTSURfV0lMRCBpZiB0aGUKKyAqIHNlcnZpY2UgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhpcyBzaG91bGQgYmUgbmVhcmx5IGEKKyAqIGNvbnN0YW50IHRpbWUgb3BlcmF0aW9uLiAgSWYgU0VMaW51eCBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUsCisgKiBhbHdheXMgcmV0dXJuIE5VTEwuCisgKgorICogQHBhcmFtIHNlcnZpY2VfdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gY2hlY2sgZm9yIHNlcnZpY2UgbmFtZS4KKyAqIEBwYXJhbSBzZXJ2aWNlX25hbWUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gbG9vayBmb3IuCisgKiBAcmV0dXJucyB0aGUgU0VMaW51eCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UKKyAqLworQnVzU0VMaW51eElEKgorYnVzX3NlbGludXhfaWRfdGFibGVfbG9va3VwIChEQnVzSGFzaFRhYmxlICAgICpzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIHNlY3VyaXR5X2lkX3Qgc2lkOworCisgIHNpZCA9IFNFQ1NJRF9XSUxEOyAgICAgLyogZGVmYXVsdCBjb250ZXh0ICovCisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBfZGJ1c192ZXJib3NlICgiTG9va2luZyB1cCBzZXJ2aWNlIFNJRCBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgc2lkID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgaWYgKHNpZCA9PSBTRUNTSURfV0lMRCkKKyAgICBfZGJ1c192ZXJib3NlICgiU2VydmljZSAlcyBub3QgZm91bmRcbiIsIAorICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgIGVsc2UKKyAgICBfZGJ1c192ZXJib3NlICgiU2VydmljZSAlcyBmb3VuZFxuIiwgCisgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICByZXR1cm4gQlVTX1NJRF9GUk9NX1NFTElOVVggKHNpZCk7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEdldCB0aGUgU0VMaW51eCBwb2xpY3kgcm9vdC4gIFRoaXMgaXMgdXNlZCB0byBmaW5kIHRoZSBELUJ1cworICogc3BlY2lmaWMgY29uZmlnIGZpbGUgd2l0aGluIHRoZSBwb2xpY3kuCisgKi8KK2NvbnN0IGNoYXIgKgorYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICByZXR1cm4gc2VsaW51eF9wb2xpY3lfcm9vdCAoKTsKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfSAKKworLyoqCisgKiBGb3IgZGVidWdnaW5nOiAgUHJpbnQgb3V0IHRoZSBjdXJyZW50IGhhc2ggdGFibGUgb2Ygc2VydmljZSBTSURzLgorICovCit2b2lkCitidXNfc2VsaW51eF9pZF90YWJsZV9wcmludCAoREJ1c0hhc2hUYWJsZSAqc2VydmljZV90YWJsZSkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfdmVyYm9zZSAoIlNlcnZpY2UgU0lEIFRhYmxlOlxuIik7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChzZXJ2aWNlX3RhYmxlLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmtleSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpOworICAgICAgc2VjdXJpdHlfaWRfdCBzaWQgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiVGhlIGtleSBpcyAlc1xuIiwga2V5KTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaGUgY29udGV4dCBpcyAlc1xuIiwgc2lkLT5jdHgpOworICAgICAgX2RidXNfdmVyYm9zZSAoIlRoZSByZWZjb3VudCBpcyAlZFxuIiwgc2lkLT5yZWZjbnQpOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KK30KKworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisjaWZkZWYgSEFWRV9TRUxJTlVYCisvKioKKyAqIFByaW50IG91dCBzb21lIEFWQyBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgdm9pZAorYnVzX2F2Y19wcmludF9zdGF0cyAodm9pZCkKK3sKKyAgc3RydWN0IGF2Y19jYWNoZV9zdGF0cyBjc3RhdHM7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfdmVyYm9zZSAoIkFWQyBTdGF0aXN0aWNzOlxuIik7CisgIGF2Y19jYWNoZV9zdGF0cyAoJmNzdGF0cyk7CisgIGF2Y19hdl9zdGF0cyAoKTsKKyAgX2RidXNfdmVyYm9zZSAoIkFWQyBDYWNoZSBTdGF0aXN0aWNzOlxuIik7CisgIF9kYnVzX3ZlcmJvc2UgKCJFbnRyeSBsb29rdXBzOiAlZFxuIiwgY3N0YXRzLmVudHJ5X2xvb2t1cHMpOworICBfZGJ1c192ZXJib3NlICgiRW50cnkgaGl0czogJWRcbiIsIGNzdGF0cy5lbnRyeV9oaXRzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkVudHJ5IG1pc3NlcyAlZFxuIiwgY3N0YXRzLmVudHJ5X21pc3Nlcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJFbnRyeSBkaXNjYXJkczogJWRcbiIsIGNzdGF0cy5lbnRyeV9kaXNjYXJkcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDQVYgbG9va3VwczogJWRcbiIsIGNzdGF0cy5jYXZfbG9va3Vwcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDQVYgaGl0czogJWRcbiIsIGNzdGF0cy5jYXZfaGl0cyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDQVYgcHJvYmVzOiAlZFxuIiwgY3N0YXRzLmNhdl9wcm9iZXMpOworICBfZGJ1c192ZXJib3NlICgiQ0FWIG1pc3NlczogJWRcbiIsIGNzdGF0cy5jYXZfbWlzc2VzKTsKK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKworCisvKioKKyAqIERlc3Ryb3kgdGhlIEFWQyBiZWZvcmUgd2UgdGVybWluYXRlLgorICovCit2b2lkCitidXNfc2VsaW51eF9zaHV0ZG93biAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJBVkMgc2h1dGRvd25cbiIpOworCisgIGlmIChidXNfc2lkICE9IFNFQ1NJRF9XSUxEKQorICAgIHsKKyAgICAgIHNpZHB1dCAoYnVzX3NpZCk7CisgICAgICBidXNfc2lkID0gU0VDU0lEX1dJTEQ7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAKKyAgICAgIGlmIChfZGJ1c19pc192ZXJib3NlKCkpIAorICAgICAgICBidXNfYXZjX3ByaW50X3N0YXRzICgpOworIAorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisgICAgICBhdmNfZGVzdHJveSAoKTsKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgICAgICBhdWRpdF9jbG9zZSAoYXVkaXRfZmQpOworI2VuZGlmIC8qIEhBVkVfTElCQVVESVQgKi8KKyAgICB9CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKy8qIFRoZSAhSEFWRV9MSUJBVURJVCBjYXNlIGxpdmVzIGluIGRidXMtc3lzZGVwcy11dGlsLXVuaXguYyAqLworI2lmZGVmIEhBVkVfTElCQVVESVQKKy8qKgorICogQ2hhbmdlcyB0aGUgdXNlciBhbmQgZ3JvdXAgdGhlIGJ1cyBpcyBydW5uaW5nIGFzLgorICoKKyAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyIHRvIGJlY29tZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyICAoY29uc3QgY2hhciAgICAqdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBkYnVzX3VpZF90IHVpZDsKKyAgZGJ1c19naWRfdCBnaWQ7CisgIERCdXNTdHJpbmcgdTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnUsIHVzZXIpOworCisgIGlmICghX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKCZ1LCAmdWlkLCAmZ2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJVc2VyICclcycgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0PyIsCisgICAgICAgICAgICAgICAgICAgICAgdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIElmIHdlIHdlcmUgcm9vdCAqLworICBpZiAoX2RidXNfZ2V0ZXVpZCAoKSA9PSAwKQorICAgIHsKKyAgICAgIGludCByYzsKKworICAgICAgY2FwbmdfY2xlYXIgKENBUE5HX1NFTEVDVF9CT1RIKTsKKyAgICAgIGNhcG5nX3VwZGF0ZSAoQ0FQTkdfQURELCBDQVBOR19FRkZFQ1RJVkUgfCBDQVBOR19QRVJNSVRURUQsCisgICAgICAgICAgICAgICAgICAgIENBUF9BVURJVF9XUklURSk7CisgICAgICByYyA9IGNhcG5nX2NoYW5nZV9pZCAodWlkLCBnaWQsIDApOworICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoIChyYykgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZHJvcCBjYXBhYmlsaXRpZXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtNDoKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBHSUQgdG8gJWx1OiAlcyIsIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLTU6CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLTY6CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVUlEIHRvICVsdTogJXMiLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIC03OgorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gdW5zZXQga2VlcC1jYXBhYmlsaXRpZXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL3NlbGludXguaCBiL2RidXMtMS40LjEwL2J1cy9zZWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhYjM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9zZWxpbnV4LmgKQEAgLTAsMCArMSw3MiBAQAorLyogc2VsaW51eC5oICBTRUxpbnV4IHNlY3VyaXR5IGNoZWNrIGhlYWRlcnMgZm9yIEQtQlVTCisgKgorICogQXV0aG9yOiBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1NFTElOVVhfSAorI2RlZmluZSBCVVNfU0VMSU5VWF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAic2VydmljZXMuaCIKKworZGJ1c19ib29sX3QgYnVzX3NlbGludXhfcHJlX2luaXQgKHZvaWQpOworZGJ1c19ib29sX3QgYnVzX3NlbGludXhfZnVsbF9pbml0KHZvaWQpOwordm9pZCAgICAgICAgYnVzX3NlbGludXhfc2h1dGRvd24gKHZvaWQpOworCitkYnVzX2Jvb2xfdCBidXNfc2VsaW51eF9lbmFibGVkICAodm9pZCk7CisKK3ZvaWQgYnVzX3NlbGludXhfaWRfcmVmICAgIChCdXNTRUxpbnV4SUQgKnNpZCk7Cit2b2lkIGJ1c19zZWxpbnV4X2lkX3VucmVmICAoQnVzU0VMaW51eElEICpzaWQpOworCitEQnVzSGFzaFRhYmxlKiBidXNfc2VsaW51eF9pZF90YWJsZV9uZXcgICAgKHZvaWQpOworQnVzU0VMaW51eElEKiAgYnVzX3NlbGludXhfaWRfdGFibGVfbG9va3VwIChEQnVzSGFzaFRhYmxlICAgICpzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpOworZGJ1c19ib29sX3QgICAgYnVzX3NlbGludXhfaWRfdGFibGVfaW5zZXJ0IChEQnVzSGFzaFRhYmxlICAgICpzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnNlcnZpY2VfY29udGV4dCk7Cit2b2lkICAgICAgICAgICBidXNfc2VsaW51eF9pZF90YWJsZV9wcmludCAgKERCdXNIYXNoVGFibGUgICAgKnNlcnZpY2VfdGFibGUpOworY29uc3QgY2hhciogICAgYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICh2b2lkKTsKKworZGJ1c19ib29sX3QgICAgYnVzX3NlbGludXhfYXBwZW5kX2NvbnRleHQgICAgICAoREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCQlCdXNTRUxpbnV4SUQgICAqY29udGV4dCwKKwkJCQkJCURCdXNFcnJvciAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU0VMaW51eElEICAgKnNlcnZpY2Vfc2lkLAorCQkJCQkJY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCURCdXNFcnJvciAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IGJ1c19zZWxpbnV4X2FsbG93c19zZW5kICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcHJvcG9zZWRfcmVjaXBpZW50LAorCQkJCQkJY29uc3QgY2hhciAgICAgKm1zZ3R5cGUsIC8qIFN1cHBsZW1lbnRhcnkgYXVkaXQgZGF0YSAqLworCQkJCQkJY29uc3QgY2hhciAgICAgKmludGVyZmFjZSwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICptZW1iZXIsCisJCQkJCQljb25zdCBjaGFyICAgICAqZXJyb3JfbmFtZSwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICpkZXN0aW5hdGlvbiwKKwkJCQkJCURCdXNFcnJvciAgICAgICplcnJvcik7CisKK0J1c1NFTGludXhJRCogYnVzX3NlbGludXhfaW5pdF9jb25uZWN0aW9uX2lkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisKK3ZvaWQgYnVzX3NlbGludXhfYXVkaXRfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIEJVU19TRUxJTlVYX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9zZXJ2aWNlcy5jIGIvZGJ1cy0xLjQuMTAvYnVzL3NlcnZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwNDkyNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9zZXJ2aWNlcy5jCkBAIC0wLDAgKzEsMTMwOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBzZXJ2aWNlcy5jICBTZXJ2aWNlIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtcG9vbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24uaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisKK3N0cnVjdCBCdXNTZXJ2aWNlCit7CisgIGludCByZWZjb3VudDsKKworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisgIGNoYXIgKm5hbWU7CisgIERCdXNMaXN0ICpvd25lcnM7Cit9OworCitzdHJ1Y3QgQnVzT3duZXIKK3sKKyAgaW50IHJlZmNvdW50OworCisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworCisgIHVuc2lnbmVkIGludCBhbGxvd19yZXBsYWNlbWVudCA6IDE7CisgIHVuc2lnbmVkIGludCBkb19ub3RfcXVldWUgOiAxOworfTsKKworc3RydWN0IEJ1c1JlZ2lzdHJ5Cit7CisgIGludCByZWZjb3VudDsKKworICBCdXNDb250ZXh0ICpjb250ZXh0OworICAKKyAgREJ1c0hhc2hUYWJsZSAqc2VydmljZV9oYXNoOworICBEQnVzTWVtUG9vbCAgICpzZXJ2aWNlX3Bvb2w7CisgIERCdXNNZW1Qb29sICAgKm93bmVyX3Bvb2w7CisKKyAgREJ1c0hhc2hUYWJsZSAqc2VydmljZV9zaWRfdGFibGU7Cit9OworCitCdXNSZWdpc3RyeSoKK2J1c19yZWdpc3RyeV9uZXcgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICByZWdpc3RyeSA9IGRidXNfbmV3MCAoQnVzUmVnaXN0cnksIDEpOworICBpZiAocmVnaXN0cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZWdpc3RyeS0+cmVmY291bnQgPSAxOworICByZWdpc3RyeS0+Y29udGV4dCA9IGNvbnRleHQ7CisgIAorICByZWdpc3RyeS0+c2VydmljZV9oYXNoID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgIGlmIChyZWdpc3RyeS0+c2VydmljZV9oYXNoID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisgIAorICByZWdpc3RyeS0+c2VydmljZV9wb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplb2YgKEJ1c1NlcnZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKKworICBpZiAocmVnaXN0cnktPnNlcnZpY2VfcG9vbCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJlZ2lzdHJ5LT5vd25lcl9wb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplb2YgKEJ1c093bmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworCisgIGlmIChyZWdpc3RyeS0+b3duZXJfcG9vbCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJlZ2lzdHJ5LT5zZXJ2aWNlX3NpZF90YWJsZSA9IE5VTEw7CisgIAorICByZXR1cm4gcmVnaXN0cnk7CisKKyBmYWlsZWQ6CisgIGJ1c19yZWdpc3RyeV91bnJlZiAocmVnaXN0cnkpOworICByZXR1cm4gTlVMTDsKK30KKworQnVzUmVnaXN0cnkgKgorYnVzX3JlZ2lzdHJ5X3JlZiAoQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5KQoreworICBfZGJ1c19hc3NlcnQgKHJlZ2lzdHJ5LT5yZWZjb3VudCA+IDApOworICByZWdpc3RyeS0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gcmVnaXN0cnk7Cit9CisKK3ZvaWQKK2J1c19yZWdpc3RyeV91bnJlZiAgKEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChyZWdpc3RyeS0+cmVmY291bnQgPiAwKTsKKyAgcmVnaXN0cnktPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHJlZ2lzdHJ5LT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGlmIChyZWdpc3RyeS0+c2VydmljZV9oYXNoKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChyZWdpc3RyeS0+c2VydmljZV9oYXNoKTsKKyAgICAgIGlmIChyZWdpc3RyeS0+c2VydmljZV9wb29sKQorICAgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlIChyZWdpc3RyeS0+c2VydmljZV9wb29sKTsKKyAgICAgIGlmIChyZWdpc3RyeS0+b3duZXJfcG9vbCkKKyAgICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAocmVnaXN0cnktPm93bmVyX3Bvb2wpOworICAgICAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3NpZF90YWJsZSkKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChyZWdpc3RyeSk7CisgICAgfQorfQorCitCdXNTZXJ2aWNlKgorYnVzX3JlZ2lzdHJ5X2xvb2t1cCAoQnVzUmVnaXN0cnkgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpCit7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisKKyAgc2VydmljZSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICByZXR1cm4gc2VydmljZTsKK30KKworc3RhdGljIERCdXNMaXN0ICoKK19idXNfc2VydmljZV9maW5kX293bmVyX2xpbmsgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNPd25lciAqYnVzX293bmVyOworCisgICAgICBidXNfb3duZXIgPSAoQnVzT3duZXIgKikgbGluay0+ZGF0YTsKKyAgICAgIGlmIChidXNfb3duZXItPmNvbm4gPT0gY29ubmVjdGlvbikgCisgICAgICAgIGJyZWFrOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIGxpbms7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfb3duZXJfc2V0X2ZsYWdzIChCdXNPd25lciAqb3duZXIsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGZsYWdzKQoreworICAgb3duZXItPmFsbG93X3JlcGxhY2VtZW50ID0gCisgICAgICAgIChmbGFncyAmIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UKSAhPSBGQUxTRTsKKworICAgb3duZXItPmRvX25vdF9xdWV1ZSA9CisgICAgICAgIChmbGFncyAmIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSkgIT0gRkFMU0U7Cit9CisKK3N0YXRpYyBCdXNPd25lciAqCitidXNfb3duZXJfbmV3IChCdXNTZXJ2aWNlICpzZXJ2aWNlLCAKKyAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uLCAKKwkgICAgICAgZGJ1c191aW50MzJfdCBmbGFncykKK3sKKyAgQnVzT3duZXIgKnJlc3VsdDsKKworICByZXN1bHQgPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAoc2VydmljZS0+cmVnaXN0cnktPm93bmVyX3Bvb2wpOworICBpZiAocmVzdWx0ICE9IE5VTEwpCisgICAgeworICAgICAgcmVzdWx0LT5yZWZjb3VudCA9IDE7CisgICAgICAvKiBkb24ndCByZWYgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSB3ZSBkb24ndCB3YW50CisgICAgICAgICB0byBibG9jayB0aGUgY29ubmVjdGlvbiBmcm9tIGdvaW5nIGF3YXkuCisgICAgICAgICB0cmFuc2FjdGlvbnMgdGFrZSBjYXJlIG9mIHJlZmZpbmcgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgIGJ1dCB3ZSBuZWVkIHRvIHVzZSByZWZjb3VudGluZyBvbiB0aGUgb3duZXIKKyAgICAgICAgIHNvIHRoYXQgdGhlIG93bmVyIGRvZXMgbm90IGdldCBmcmVlZCBiZWZvcmUKKyAgICAgICAgIHdlIGNhbiBkZXJlZiB0aGUgY29ubmVjdGlvbiBpbiB0aGUgdHJhbnNhY3Rpb24KKyAgICAgICAqLworICAgICAgcmVzdWx0LT5jb25uID0gY29ubjsKKyAgICAgIHJlc3VsdC0+c2VydmljZSA9IHNlcnZpY2U7CisKKyAgICAgIGlmICghYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2UgKGNvbm4sIHNlcnZpY2UpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAoc2VydmljZS0+cmVnaXN0cnktPm93bmVyX3Bvb2wsIHJlc3VsdCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBidXNfb3duZXJfc2V0X2ZsYWdzIChyZXN1bHQsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBCdXNPd25lciAqCitidXNfb3duZXJfcmVmIChCdXNPd25lciAqb3duZXIpCit7CisgIF9kYnVzX2Fzc2VydCAob3duZXItPnJlZmNvdW50ID4gMCk7CisgIG93bmVyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBvd25lcjsKK30KKworc3RhdGljIHZvaWQKK2J1c19vd25lcl91bnJlZiAgKEJ1c093bmVyICpvd25lcikKK3sKKyAgX2RidXNfYXNzZXJ0IChvd25lci0+cmVmY291bnQgPiAwKTsKKyAgb3duZXItPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKG93bmVyLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9vd25lZF9zZXJ2aWNlIChvd25lci0+Y29ubiwgb3duZXItPnNlcnZpY2UpOworICAgICAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAob3duZXItPnNlcnZpY2UtPnJlZ2lzdHJ5LT5vd25lcl9wb29sLCBvd25lcik7CisgICAgfQorfQorCitCdXNTZXJ2aWNlKgorYnVzX3JlZ2lzdHJ5X2Vuc3VyZSAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpvd25lcl9jb25uZWN0aW9uX2lmX2NyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBfZGJ1c19hc3NlcnQgKG93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc2FjdGlvbiAhPSBOVUxMKTsKKworICBzZXJ2aWNlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChyZWdpc3RyeS0+c2VydmljZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICBpZiAoc2VydmljZSAhPSBOVUxMKQorICAgIHJldHVybiBzZXJ2aWNlOworICAKKyAgc2VydmljZSA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChyZWdpc3RyeS0+c2VydmljZV9wb29sKTsKKyAgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHNlcnZpY2UtPnJlZ2lzdHJ5ID0gcmVnaXN0cnk7ICAKKyAgc2VydmljZS0+cmVmY291bnQgPSAxOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjb3B5aW5nIHN0cmluZyAlcCAnJXMnIHRvIHNlcnZpY2UtPm5hbWVcbiIsCisgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChzZXJ2aWNlX25hbWUsICZzZXJ2aWNlLT5uYW1lKSkKKyAgICB7CisgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChyZWdpc3RyeS0+c2VydmljZV9wb29sLCBzZXJ2aWNlKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIF9kYnVzX3ZlcmJvc2UgKCJjb3BpZWQgc3RyaW5nICVwICclcycgdG8gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSksCisgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5hbWUpOworCisgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2Vfb3duZXJfY2hhbmdlZCAoc2VydmljZS0+bmFtZSwgCisJCQkJCSAgICAgIE5VTEwsCisJCQkJCSAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChvd25lcl9jb25uZWN0aW9uX2lmX2NyZWF0ZWQpLAorCQkJCQkgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIGJ1c19zZXJ2aWNlX3VucmVmIChzZXJ2aWNlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCAoYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb24gKHJlZ2lzdHJ5LT5jb250ZXh0KSwKKwkJCQkgICAgICAgc2VydmljZS0+bmFtZSwgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICB7CisgICAgICBidXNfc2VydmljZV91bnJlZiAoc2VydmljZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoIWJ1c19zZXJ2aWNlX2FkZF9vd25lciAoc2VydmljZSwgb3duZXJfY29ubmVjdGlvbl9pZl9jcmVhdGVkLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIGJ1c19zZXJ2aWNlX3VucmVmIChzZXJ2aWNlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChyZWdpc3RyeS0+c2VydmljZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpKQorICAgIHsKKyAgICAgIC8qIFRoZSBhZGRfb3duZXIgZ2V0cyByZXZlcnRlZCBvbiB0cmFuc2FjdGlvbiBjYW5jZWwgKi8KKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICByZXR1cm4gc2VydmljZTsKK30KKwordm9pZAorYnVzX3JlZ2lzdHJ5X2ZvcmVhY2ggKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2VGb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICAKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgQnVzU2VydmljZSAqc2VydmljZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgKCogZnVuY3Rpb24pIChzZXJ2aWNlLCBkYXRhKTsKKyAgICB9Cit9CisKK2RidXNfYm9vbF90CitidXNfcmVnaXN0cnlfbGlzdF9zZXJ2aWNlcyAoQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKipsaXN0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAqYXJyYXlfbGVuKQoreworICBpbnQgaSwgaiwgbGVuOworICBjaGFyICoqcmV0dmFsOworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgIAorICBsZW4gPSBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gpOworICByZXR2YWwgPSBkYnVzX25ldyAoY2hhciAqLCBsZW4gKyAxKTsKKworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChyZWdpc3RyeS0+c2VydmljZV9oYXNoLCAmaXRlcik7CisgIGkgPSAwOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBCdXNTZXJ2aWNlICpzZXJ2aWNlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICByZXR2YWxbaV0gPSBfZGJ1c19zdHJkdXAgKHNlcnZpY2UtPm5hbWUpOworICAgICAgaWYgKHJldHZhbFtpXSA9PSBOVUxMKQorCWdvdG8gZXJyb3I7CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgcmV0dmFsW2ldID0gTlVMTDsKKyAgCisgIGlmIChhcnJheV9sZW4pCisgICAgKmFycmF5X2xlbiA9IGxlbjsKKyAgCisgICpsaXN0cCA9IHJldHZhbDsKKyAgcmV0dXJuIFRSVUU7CisgIAorIGVycm9yOgorICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgIGRidXNfZnJlZSAocmV0dmFsW2ldKTsKKyAgZGJ1c19mcmVlIChyZXR2YWwpOworCisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UgKEJ1c1JlZ2lzdHJ5ICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzQ29ubmVjdGlvbiAqb2xkX293bmVyX2Nvbm47CisgIERCdXNDb25uZWN0aW9uICpjdXJyZW50X293bmVyX2Nvbm47CisgIEJ1c0NsaWVudFBvbGljeSAqcG9saWN5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBCdXNBY3RpdmF0aW9uICAqYWN0aXZhdGlvbjsKKyAgQnVzU0VMaW51eElEICpzaWQ7CisgIEJ1c093bmVyICpwcmltYXJ5X293bmVyOworIAorICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lIChzZXJ2aWNlX25hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzZXJ2aWNlX25hbWUpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0ZWQgYnVzIG5hbWUgXCIlc1wiIGlzIG5vdCB2YWxpZCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIkF0dGVtcHQgdG8gYWNxdWlyZSBpbnZhbGlkIHNlcnZpY2UgbmFtZVxuIik7CisgICAgICAKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHNlcnZpY2VfbmFtZSwgMCkgPT0gJzonKQorICAgIHsKKyAgICAgIC8qIE5vdCBhbGxvd2VkOyBvbmx5IGJhc2Ugc2VydmljZXMgY2FuIHN0YXJ0IHdpdGggJzonICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWNxdWlyZSBhIHNlcnZpY2Ugc3RhcnRpbmcgd2l0aCAnOicgc3VjaCBhcyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBdHRlbXB0IHRvIGFjcXVpcmUgaW52YWxpZCBiYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgICAgIAorICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKHNlcnZpY2VfbmFtZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIG93biB0aGUgc2VydmljZSBcIiVzXCJiZWNhdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiaXQgaXMgcmVzZXJ2ZWQgZm9yIEQtQnVzJyB1c2Ugb25seSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHBvbGljeSA9IGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKHBvbGljeSAhPSBOVUxMKTsKKworICAvKiBOb3RlIHRoYXQgaWYgc2lkIGlzICNOVUxMIHRoZW4gdGhlIGJ1cydzIG93biBjb250ZXh0IGdldHMgdXNlZAorICAgKiBpbiBidXNfY29ubmVjdGlvbl9zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UoKQorICAgKi8KKyAgc2lkID0gYnVzX3NlbGludXhfaWRfdGFibGVfbG9va3VwIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBpZiAoIWJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKGNvbm5lY3Rpb24sIHNpZCwKKwkJCQkJICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpLCBlcnJvcikpCisgICAgeworCisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSAmJgorCSAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKwl7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBvd24gdGhlIHNlcnZpY2UgXCIlc1wiIGR1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgInRvIFNFTGludXggcG9saWN5IiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgaWYgKCFidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fb3duIChwb2xpY3ksIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBcIiVzXCIgaXMgbm90IGFsbG93ZWQgdG8gb3duIHRoZSBzZXJ2aWNlIFwiJXNcIiBkdWUgIgorICAgICAgICAgICAgICAgICAgICAgICJ0byBzZWN1cml0eSBwb2xpY2llcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChidXNfY29ubmVjdGlvbl9nZXRfbl9zZXJ2aWNlc19vd25lZCAoY29ubmVjdGlvbikgPj0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gKHJlZ2lzdHJ5LT5jb250ZXh0KSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBvd24gbW9yZSBzZXJ2aWNlcyAiCisgICAgICAgICAgICAgICAgICAgICAgIihpbmNyZWFzZSBsaW1pdHMgaW4gY29uZmlndXJhdGlvbiBmaWxlIGlmIHJlcXVpcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCBzZXJ2aWNlX25hbWUpOworCisgIGlmIChzZXJ2aWNlICE9IE5VTEwpCisgICAgeworICAgICAgcHJpbWFyeV9vd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKyAgICAgIGlmIChwcmltYXJ5X293bmVyICE9IE5VTEwpCisgICAgICAgIG9sZF9vd25lcl9jb25uID0gcHJpbWFyeV9vd25lci0+Y29ubjsKKyAgICAgIGVsc2UKKyAgICAgICAgb2xkX293bmVyX2Nvbm4gPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIG9sZF9vd25lcl9jb25uID0gTlVMTDsKKyAgICAgIAorICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfZW5zdXJlIChyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGNvbm5lY3Rpb24sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcik7CisgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcHJpbWFyeV9vd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKyAgaWYgKHByaW1hcnlfb3duZXIgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKyAgICAKKyAgY3VycmVudF9vd25lcl9jb25uID0gcHJpbWFyeV9vd25lci0+Y29ubjsKKyAgICAgCisgIGlmIChvbGRfb3duZXJfY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY3VycmVudF9vd25lcl9jb25uID09IGNvbm5lY3Rpb24pOworCisgICAgICAqcmVzdWx0ID0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUjsgICAgICAKKyAgICB9CisgIGVsc2UgaWYgKG9sZF9vd25lcl9jb25uID09IGNvbm5lY3Rpb24pCisgICAgeworICAgICAgYnVzX293bmVyX3NldF9mbGFncyAocHJpbWFyeV9vd25lciwgZmxhZ3MpOworICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0FMUkVBRFlfT1dORVI7CisgICAgfQorICBlbHNlIGlmICgoKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFKSAmJgorICAgICAgICAgICAhKGJ1c19zZXJ2aWNlX2dldF9hbGxvd19yZXBsYWNlbWVudCAoc2VydmljZSkpKSB8fAorCSAgICgoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUpICYmCisgICAgICAgICAgICEoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HKSkpIAorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgQnVzT3duZXIgKnRlbXBfb3duZXI7CisgICAgLyogU2luY2Ugd2UgY2FuJ3QgYmUgcXVldWVkIGlmIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBxdWV1ZQorICAgICAgIHJlbW92ZSB1cyAqLworCisgICAgICBsaW5rID0gX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayAoc2VydmljZSwgY29ubmVjdGlvbik7CisgICAgICBpZiAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF91bmxpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgICAgICAgIHRlbXBfb3duZXIgPSAoQnVzT3duZXIgKilsaW5rLT5kYXRhOworICAgICAgICAgIGJ1c19vd25lcl91bnJlZiAodGVtcF9vd25lcik7IAorICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICAqcmVzdWx0ID0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfRVhJU1RTOworICAgIH0KKyAgZWxzZSBpZiAoIShmbGFncyAmIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSkgJiYKKyAgICAgICAgICAgKCEoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HKSB8fAorCSAgICAhKGJ1c19zZXJ2aWNlX2dldF9hbGxvd19yZXBsYWNlbWVudCAoc2VydmljZSkpKSkKKyAgICB7CisgICAgICAvKiBRdWV1ZSB0aGUgY29ubmVjdGlvbiAqLworICAgICAgaWYgKCFidXNfc2VydmljZV9hZGRfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICAqcmVzdWx0ID0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfSU5fUVVFVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVwbGFjZSB0aGUgY3VycmVudCBvd25lciAqLworCisgICAgICAvKiBXZSBlbnF1ZXVlIHRoZSBuZXcgb3duZXIgYW5kIHJlbW92ZSB0aGUgZmlyc3Qgb25lIGJlY2F1c2UKKyAgICAgICAqIHRoYXQgd2lsbCBjYXVzZSBOYW1lQWNxdWlyZWQgYW5kIE5hbWVMb3N0IG1lc3NhZ2VzIHRvCisgICAgICAgKiBiZSBzZW50LgorICAgICAgICovCisgICAgICAKKyAgICAgIGlmICghYnVzX3NlcnZpY2VfYWRkX293bmVyIChzZXJ2aWNlLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAocHJpbWFyeV9vd25lci0+ZG9fbm90X3F1ZXVlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKHNlcnZpY2UsIG9sZF9vd25lcl9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX3NlcnZpY2Vfc3dhcF9vd25lciAoc2VydmljZSwgb2xkX293bmVyX2Nvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gPT0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpLT5jb25uKTsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSOworICAgIH0KKworICBhY3RpdmF0aW9uID0gYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb24gKHJlZ2lzdHJ5LT5jb250ZXh0KTsKKyAgcmV0dmFsID0gYnVzX2FjdGl2YXRpb25fc2VuZF9wZW5kaW5nX2F1dG9fYWN0aXZhdGlvbl9tZXNzYWdlcyAoYWN0aXZhdGlvbiwKKwkJCQkJCQkJIHNlcnZpY2UsCisJCQkJCQkJCSB0cmFuc2FjdGlvbiwKKwkJCQkJCQkJIGVycm9yKTsKKyAgCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3JlZ2lzdHJ5X3JlbGVhc2Vfc2VydmljZSAoQnVzUmVnaXN0cnkgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKHNlcnZpY2VfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNlcnZpY2VfbmFtZSkpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkdpdmVuIGJ1cyBuYW1lIFwiJXNcIiBpcyBub3QgdmFsaWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBdHRlbXB0IHRvIHJlbGVhc2UgaW52YWxpZCBzZXJ2aWNlIG5hbWVcbiIpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc2VydmljZV9uYW1lLCAwKSA9PSAnOicpCisgICAgeworICAgICAgLyogTm90IGFsbG93ZWQ7IHRoZSBiYXNlIHNlcnZpY2UgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWxlYXNlZCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlbGVhc2UgYSBzZXJ2aWNlIHN0YXJ0aW5nIHdpdGggJzonIHN1Y2ggYXMgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiQXR0ZW1wdCB0byByZWxlYXNlIGludmFsaWQgYmFzZSBzZXJ2aWNlIG5hbWUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoc2VydmljZV9uYW1lLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgLyogTm90IGFsbG93ZWQ7IHRoZSBiYXNlIHNlcnZpY2UgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWxlYXNlZCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlbGVhc2UgdGhlICVzIHNlcnZpY2UgYmVjYXVzZSBpdCBpcyBvd25lZCBieSB0aGUgYnVzIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9EQlVTKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkF0dGVtcHQgdG8gcmVsZWFzZSBzZXJ2aWNlIG5hbWUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9EQlVTKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgc2VydmljZV9uYW1lKTsKKworICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT05fRVhJU1RFTlQ7CisgICAgfQorICBlbHNlIGlmICghYnVzX3NlcnZpY2VfaGFzX293bmVyIChzZXJ2aWNlLCBjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICAqcmVzdWx0ID0gREJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9UX09XTkVSOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyIChzZXJ2aWNlLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBfZGJ1c19hc3NlcnQgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24pKTsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9SRUxFQVNFRDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19yZWdpc3RyeV9zZXRfc2VydmljZV9jb250ZXh0X3RhYmxlIChCdXNSZWdpc3RyeSAgICpyZWdpc3RyeSwKKwkJCQkJREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIERCdXNIYXNoVGFibGUgKm5ld190YWJsZTsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIAorICBuZXdfdGFibGUgPSBidXNfc2VsaW51eF9pZF90YWJsZV9uZXcgKCk7CisgIGlmICghbmV3X3RhYmxlKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VydmljZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpOworICAgICAgY29uc3QgY2hhciAqY29udGV4dCA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgaWYgKCFidXNfc2VsaW51eF9pZF90YWJsZV9pbnNlcnQgKG5ld190YWJsZSwKKwkJCQkJc2VydmljZSwKKwkJCQkJY29udGV4dCkpCisJcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlKTsKKyAgcmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlID0gbmV3X3RhYmxlOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2J1c19zZXJ2aWNlX3VubGlua19vd25lciAoQnVzU2VydmljZSAgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNPd25lciAgICAgICAgKm93bmVyKQoreworICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmc2VydmljZS0+b3duZXJzLCBvd25lcik7CisgIGJ1c19vd25lcl91bnJlZiAob3duZXIpOworfQorCitzdGF0aWMgdm9pZAorYnVzX3NlcnZpY2VfdW5saW5rIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKTsKKworICAvKiB0aGUgc2VydmljZSBtYXkgbm90IGJlIGluIHRoZSBoYXNoLCBpZgorICAgKiB0aGUgZmFpbHVyZSBjYXVzaW5nIHRyYW5zYWN0aW9uIGNhbmNlbAorICAgKiB3YXMgaW4gdGhlIHJpZ2h0IHBsYWNlLCBidXQgdGhhdCdzIE9LCisgICAqLworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHNlcnZpY2UtPnJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSk7CisgIAorICBidXNfc2VydmljZV91bnJlZiAoc2VydmljZSk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfc2VydmljZV9yZWxpbmsgKEJ1c1NlcnZpY2UgICAgICAgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwcmVhbGxvY2F0ZWQgIT0gTlVMTCk7CisKKyAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nX3ByZWFsbG9jYXRlZCAoc2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlKTsKKyAgCisgIGJ1c19zZXJ2aWNlX3JlZiAoc2VydmljZSk7Cit9CisKKy8qKgorICogRGF0YSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvd25lcnNoaXAgY2FuY2VsbGF0aW9uIGluCisgKiBhIGJ1cyB0cmFuc2FjdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzT3duZXIgKm93bmVyOyAgICAgICAgICAgIC8qKjwgdGhlIG93bmVyICovCisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7ICAgICAgICAvKio8IHNlcnZpY2UgdG8gY2FuY2VsIG93bmVyc2hpcCBvZiAqLworfSBPd25lcnNoaXBDYW5jZWxEYXRhOworCitzdGF0aWMgdm9pZAorY2FuY2VsX293bmVyc2hpcCAodm9pZCAqZGF0YSkKK3sKKyAgT3duZXJzaGlwQ2FuY2VsRGF0YSAqZCA9IGRhdGE7CisKKyAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZW5kIG1lc3NhZ2VzIG5vdGlmeWluZyBvZiB0aGVzZQorICAgKiBjaGFuZ2VzLCBzaW5jZSB3ZSdyZSByZXZlcnRpbmcgc29tZXRoaW5nIHRoYXQgd2FzCisgICAqIGNhbmNlbGxlZCAoZWZmZWN0aXZlbHkgbmV2ZXIgcmVhbGx5IGhhcHBlbmVkKQorICAgKi8KKyAgYnVzX3NlcnZpY2VfdW5saW5rX293bmVyIChkLT5zZXJ2aWNlLCBkLT5vd25lcik7CisgIAorICBpZiAoZC0+c2VydmljZS0+b3duZXJzID09IE5VTEwpCisgICAgYnVzX3NlcnZpY2VfdW5saW5rIChkLT5zZXJ2aWNlKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfb3duZXJzaGlwX2NhbmNlbF9kYXRhICh2b2lkICpkYXRhKQoreworICBPd25lcnNoaXBDYW5jZWxEYXRhICpkID0gZGF0YTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGQtPm93bmVyLT5jb25uKTsKKyAgYnVzX293bmVyX3VucmVmIChkLT5vd25lcik7CisgIGJ1c19zZXJ2aWNlX3VucmVmIChkLT5zZXJ2aWNlKTsKKyAgCisgIGRidXNfZnJlZSAoZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2NhbmNlbF9vd25lcnNoaXBfdG9fdHJhbnNhY3Rpb24gKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNPd25lciAgICAgICAqb3duZXIpCit7CisgIE93bmVyc2hpcENhbmNlbERhdGEgKmQ7CisKKyAgZCA9IGRidXNfbmV3IChPd25lcnNoaXBDYW5jZWxEYXRhLCAxKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkLT5zZXJ2aWNlID0gc2VydmljZTsKKyAgZC0+b3duZXIgPSBvd25lcjsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKHRyYW5zYWN0aW9uLCBjYW5jZWxfb3duZXJzaGlwLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfb3duZXJzaGlwX2NhbmNlbF9kYXRhKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfc2VydmljZV9yZWYgKGQtPnNlcnZpY2UpOworICBidXNfb3duZXJfcmVmIChvd25lcik7CisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGQtPm93bmVyLT5jb25uKTsKKyAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgc2VsZi1jYW5jZWxsaW5nIGlmIHlvdSBjYW5jZWwgdGhlIHRyYW5zYWN0aW9uICovCitkYnVzX2Jvb2xfdAorYnVzX3NlcnZpY2VfYWRkX293bmVyIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzT3duZXIgKmJ1c19vd25lcjsKKyAgREJ1c0xpc3QgKmJ1c19vd25lcl9saW5rOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorIC8qIFNlbmQgc2VydmljZSBhY3F1aXJlZCBtZXNzYWdlIGZpcnN0LCBPT00gd2lsbCByZXN1bHQKKyAgKiBpbiBjYW5jZWxsaW5nIHRoZSB0cmFuc2FjdGlvbgorICAqLworICBpZiAoc2VydmljZS0+b3duZXJzID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCAoY29ubmVjdGlvbiwgc2VydmljZS0+bmFtZSwgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGJ1c19vd25lcl9saW5rID0gX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayAoc2VydmljZSwgY29ubmVjdGlvbik7CisgIAorICBpZiAoYnVzX293bmVyX2xpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICBidXNfb3duZXIgPSBidXNfb3duZXJfbmV3IChzZXJ2aWNlLCBjb25uZWN0aW9uLCBmbGFncyk7CisgICAgICBpZiAoYnVzX293bmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBidXNfb3duZXJfc2V0X2ZsYWdzIChidXNfb3duZXIsIGZsYWdzKTsKKyAgICAgIGlmICghKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORykgfHwgc2VydmljZS0+b3duZXJzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmc2VydmljZS0+b3duZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19vd25lcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19vd25lcl91bnJlZiAoYnVzX293bmVyKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyICgmc2VydmljZS0+b3duZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX293bmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX293bmVyX3VucmVmIChidXNfb3duZXIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAKKyAgICB9IAorICBlbHNlIAorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSB0aGUgbGluayBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcXVldWUKKyAgICAgICAqIE5vIG5lZWQgZm9yIG9wZXJhdGlvbnMgdGhhdCBjYW4gcHJvZHVjZSBPT00KKyAgICAgICAqLworCisgICAgICBidXNfb3duZXIgPSAoQnVzT3duZXIgKikgYnVzX293bmVyX2xpbmstPmRhdGE7CisgICAgICBpZiAoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HKQorICAgICAgICB7CisJICBEQnVzTGlzdCAqbGluazsKKyAgICAgICAgICBfZGJ1c19saXN0X3VubGluayAoJnNlcnZpY2UtPm93bmVycywgYnVzX293bmVyX2xpbmspOworCSAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworCSAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworCSAgCisgICAgICAgICAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXJfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluaywgYnVzX293bmVyX2xpbmspOworICAgICAgICB9CisgICAgICAKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKGJ1c19vd25lciwgZmxhZ3MpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghYWRkX2NhbmNlbF9vd25lcnNoaXBfdG9fdHJhbnNhY3Rpb24gKHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfb3duZXIpKQorICAgIHsKKyAgICAgIGJ1c19zZXJ2aWNlX3VubGlua19vd25lciAoc2VydmljZSwgYnVzX293bmVyKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNPd25lciAgICAgICAqb3duZXI7CisgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlOworICBCdXNPd25lciAgICAgICAqYmVmb3JlX293bmVyOyAvKiByZXN0b3JlIHRvIHBvc2l0aW9uIGJlZm9yZSB0aGlzIGNvbm5lY3Rpb24gaW4gb3duZXJzIGxpc3QgKi8KKyAgREJ1c0xpc3QgICAgICAgKm93bmVyX2xpbms7CisgIERCdXNMaXN0ICAgICAgICpzZXJ2aWNlX2xpbms7CisgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpoYXNoX2VudHJ5OworfSBPd25lcnNoaXBSZXN0b3JlRGF0YTsKKworc3RhdGljIHZvaWQKK3Jlc3RvcmVfb3duZXJzaGlwICh2b2lkICpkYXRhKQoreworICBPd25lcnNoaXBSZXN0b3JlRGF0YSAqZCA9IGRhdGE7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoZC0+c2VydmljZV9saW5rICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGQtPm93bmVyX2xpbmsgIT0gTlVMTCk7CisgIAorICBpZiAoZC0+c2VydmljZS0+b3duZXJzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChkLT5oYXNoX2VudHJ5ICE9IE5VTEwpOworICAgICAgYnVzX3NlcnZpY2VfcmVsaW5rIChkLT5zZXJ2aWNlLCBkLT5oYXNoX2VudHJ5KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGQtPmhhc2hfZW50cnkgPT0gTlVMTCk7CisgICAgfQorICAKKyAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZW5kIG1lc3NhZ2VzIG5vdGlmeWluZyBvZiB0aGVzZQorICAgKiBjaGFuZ2VzLCBzaW5jZSB3ZSdyZSByZXZlcnRpbmcgc29tZXRoaW5nIHRoYXQgd2FzCisgICAqIGNhbmNlbGxlZCAoZWZmZWN0aXZlbHkgbmV2ZXIgcmVhbGx5IGhhcHBlbmVkKQorICAgKi8KKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZkLT5zZXJ2aWNlLT5vd25lcnMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChsaW5rLT5kYXRhID09IGQtPmJlZm9yZV9vd25lcikKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZkLT5zZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgIH0KKyAgCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2JlZm9yZV9saW5rICgmZC0+c2VydmljZS0+b3duZXJzLCBsaW5rLCBkLT5vd25lcl9saW5rKTsKKworICAvKiBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhlbiByZXN0b3JpbmcgdGhpcyBjaGFuZ2VzIHRoZSBvcmRlciBpbiB3aGljaAorICAgKiBTZXJ2aWNlRGVsZXRlZCBtZXNzYWdlcyBhcmUgc2VudCBvbiBkZXN0cnVjdGlvbiBvZiB0aGUKKyAgICogY29ubmVjdGlvbi4gIFRoaXMgc2hvdWxkIGJlIE9LIGFzIHRoZSBvbmx5IGd1YXJhbnRlZSB0aGVyZSBpcworICAgKiB0aGF0IHRoZSBiYXNlIHNlcnZpY2UgaXMgZGVzdHJveWVkIGxhc3QsIGFuZCB3ZSBuZXZlciBldmVuCisgICAqIHRlbnRhdGl2ZWx5IHJlbW92ZSB0aGUgYmFzZSBzZXJ2aWNlLgorICAgKi8KKyAgYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2VfbGluayAoZC0+b3duZXItPmNvbm4sIGQtPnNlcnZpY2VfbGluayk7CisgIAorICBkLT5oYXNoX2VudHJ5ID0gTlVMTDsKKyAgZC0+c2VydmljZV9saW5rID0gTlVMTDsKKyAgZC0+b3duZXJfbGluayA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX293bmVyc2hpcF9yZXN0b3JlX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIE93bmVyc2hpcFJlc3RvcmVEYXRhICpkID0gZGF0YTsKKworICBpZiAoZC0+c2VydmljZV9saW5rKQorICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkLT5zZXJ2aWNlX2xpbmspOworICBpZiAoZC0+b3duZXJfbGluaykKKyAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZC0+b3duZXJfbGluayk7CisgIGlmIChkLT5oYXNoX2VudHJ5KQorICAgIF9kYnVzX2hhc2hfdGFibGVfZnJlZV9wcmVhbGxvY2F0ZWRfZW50cnkgKGQtPnNlcnZpY2UtPnJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+aGFzaF9lbnRyeSk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChkLT5vd25lci0+Y29ubik7CisgIGJ1c19vd25lcl91bnJlZiAoZC0+b3duZXIpOworICBidXNfc2VydmljZV91bnJlZiAoZC0+c2VydmljZSk7CisgIAorICBkYnVzX2ZyZWUgKGQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9yZXN0b3JlX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzT3duZXIgICAgICAgKm93bmVyKQoreworICBPd25lcnNoaXBSZXN0b3JlRGF0YSAqZDsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgZCA9IGRidXNfbmV3IChPd25lcnNoaXBSZXN0b3JlRGF0YSwgMSk7CisgIGlmIChkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZC0+c2VydmljZSA9IHNlcnZpY2U7CisgIGQtPm93bmVyID0gb3duZXI7CisgIGQtPnNlcnZpY2VfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoc2VydmljZSk7CisgIGQtPm93bmVyX2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKG93bmVyKTsKKyAgZC0+aGFzaF9lbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgKHNlcnZpY2UtPnJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gpOworICAKKyAgYnVzX3NlcnZpY2VfcmVmIChkLT5zZXJ2aWNlKTsKKyAgYnVzX293bmVyX3JlZiAoZC0+b3duZXIpOworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChkLT5vd25lci0+Y29ubik7CisKKyAgZC0+YmVmb3JlX293bmVyID0gTlVMTDsKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChsaW5rLT5kYXRhID09IG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisKKyAgICAgICAgICBpZiAobGluaykKKyAgICAgICAgICAgIGQtPmJlZm9yZV9vd25lciA9IGxpbmstPmRhdGE7CisKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICB9CisgIAorICBpZiAoZC0+c2VydmljZV9saW5rID09IE5VTEwgfHwKKyAgICAgIGQtPm93bmVyX2xpbmsgPT0gTlVMTCB8fAorICAgICAgZC0+aGFzaF9lbnRyeSA9PSBOVUxMIHx8CisgICAgICAhYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIHJlc3RvcmVfb3duZXJzaGlwLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfb3duZXJzaGlwX3Jlc3RvcmVfZGF0YSkpCisgICAgeworICAgICAgZnJlZV9vd25lcnNoaXBfcmVzdG9yZV9kYXRhIChkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19zZXJ2aWNlX3N3YXBfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNMaXN0ICpzd2FwX2xpbms7CisgIEJ1c093bmVyICpwcmltYXJ5X293bmVyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIC8qIFdlIHNlbmQgb3V0IG5vdGlmaWNhdGlvbnMgYmVmb3JlIHdlIGRvIGFueSB3b3JrIHdlCisgICAqIG1pZ2h0IGhhdmUgdG8gdW5kbyBpZiB0aGUgbm90aWZpY2F0aW9uLXNlbmRpbmcgZmFpbGVkCisgICAqLworICAKKyAgLyogU2VuZCBzZXJ2aWNlIGxvc3QgbWVzc2FnZSAqLworICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICBpZiAocHJpbWFyeV9vd25lciA9PSBOVUxMIHx8IHByaW1hcnlfb3duZXItPmNvbm4gIT0gY29ubmVjdGlvbikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJUcmllZCB0byBzd2FwIGEgbm9uIHByaW1hcnkgb3duZXIiKTsKKworICAgIAorICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgKGNvbm5lY3Rpb24sIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHN3YXAgb3duZXIgb2YgYSBzZXJ2aWNlIHRoYXQgaGFzIG5vIG93bmVycyIpOworICAgIH0KKyAgZWxzZSBpZiAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lICgmc2VydmljZS0+b3duZXJzKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJUcmllZCB0byBzd2FwIG93bmVyIG9mIGEgc2VydmljZSB0aGF0IGhhcyBubyBvdGhlciBvd25lcnMgaW4gdGhlIHF1ZXVlIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBCdXNPd25lciAqbmV3X293bmVyOworICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19vd25lcl9jb25uOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisKKyAgICAgIG5ld19vd25lciA9IChCdXNPd25lciAqKWxpbmstPmRhdGE7CisgICAgICBuZXdfb3duZXJfY29ubiA9IG5ld19vd25lci0+Y29ubjsKKworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkIChzZXJ2aWNlLT5uYW1lLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKG5ld19vd25lcl9jb25uKSwKKyAJCQkJCQkgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogVGhpcyB3aWxsIGJlIG91ciBuZXcgb3duZXIgKi8KKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKG5ld19vd25lcl9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uICh0cmFuc2FjdGlvbiwgc2VydmljZSwgcHJpbWFyeV9vd25lcikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogdW5saW5rIHRoZSBwcmltYXJ5IGFuZCBtYWtlIGl0IHRoZSBzZWNvbmQgbGluayAqLworICBzd2FwX2xpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKTsKKyAgX2RidXNfbGlzdF91bmxpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIHN3YXBfbGluayk7CisKKyAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXJfbGluayAoJnNlcnZpY2UtPm93bmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyksCisJCQkJc3dhcF9saW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBzZWxmLWNhbmNlbGxpbmcgaWYgeW91IGNhbmNlbCB0aGUgdHJhbnNhY3Rpb24gKi8KK2RidXNfYm9vbF90CitidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c093bmVyICpwcmltYXJ5X293bmVyOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICAvKiBXZSBzZW5kIG91dCBub3RpZmljYXRpb25zIGJlZm9yZSB3ZSBkbyBhbnkgd29yayB3ZQorICAgKiBtaWdodCBoYXZlIHRvIHVuZG8gaWYgdGhlIG5vdGlmaWNhdGlvbi1zZW5kaW5nIGZhaWxlZAorICAgKi8KKyAgCisgIC8qIFNlbmQgc2VydmljZSBsb3N0IG1lc3NhZ2UgKi8KKyAgcHJpbWFyeV9vd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKyAgaWYgKHByaW1hcnlfb3duZXIgIT0gTlVMTCAmJiBwcmltYXJ5X293bmVyLT5jb25uID09IGNvbm5lY3Rpb24pCisgICAgeworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0IChjb25uZWN0aW9uLCBzZXJ2aWNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogaWYgd2UgYXJlIG5vdCB0aGUgcHJpbWFyeSBvd25lciB0aGVuIGp1c3QgcmVtb3ZlIHVzIGZyb20gdGhlIHF1ZXVlICovCisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIEJ1c093bmVyICp0ZW1wX293bmVyOworCisgICAgICBsaW5rID0gX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayAoc2VydmljZSwgY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19saXN0X3VubGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgICB0ZW1wX293bmVyID0gKEJ1c093bmVyICopbGluay0+ZGF0YTsKKyAgICAgIGJ1c19vd25lcl91bnJlZiAodGVtcF9vd25lcik7IAorICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworCisgICAgICByZXR1cm4gVFJVRTsgCisgICAgfQorCisgIGlmIChzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJUcmllZCB0byByZW1vdmUgb3duZXIgb2YgYSBzZXJ2aWNlIHRoYXQgaGFzIG5vIG93bmVycyIpOworICAgIH0KKyAgZWxzZSBpZiAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lICgmc2VydmljZS0+b3duZXJzKSkKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgKHNlcnZpY2UtPm5hbWUsCisgCQkJCQkJICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbiksCisgCQkJCQkJICBOVUxMLAorIAkJCQkJCSAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgQnVzT3duZXIgKm5ld19vd25lcjsKKyAgICAgIERCdXNDb25uZWN0aW9uICpuZXdfb3duZXJfY29ubjsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworCisgICAgICBuZXdfb3duZXIgPSAoQnVzT3duZXIgKilsaW5rLT5kYXRhOworICAgICAgbmV3X293bmVyX2Nvbm4gPSBuZXdfb3duZXItPmNvbm47CisKKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2Vfb3duZXJfY2hhbmdlZCAoc2VydmljZS0+bmFtZSwKKyAJCQkJCQkgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAJCQkJCQkgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChuZXdfb3duZXJfY29ubiksCisgCQkJCQkJICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIFRoaXMgd2lsbCBiZSBvdXIgbmV3IG93bmVyICovCisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkIChuZXdfb3duZXJfY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWFkZF9yZXN0b3JlX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sIHNlcnZpY2UsIHByaW1hcnlfb3duZXIpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorIAorICBidXNfc2VydmljZV91bmxpbmtfb3duZXIgKHNlcnZpY2UsIHByaW1hcnlfb3duZXIpOworCisgIGlmIChzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICBidXNfc2VydmljZV91bmxpbmsgKHNlcnZpY2UpOworCisgIHJldHVybiBUUlVFOworfQorCitCdXNTZXJ2aWNlICoKK2J1c19zZXJ2aWNlX3JlZiAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5yZWZjb3VudCA+IDApOworICAKKyAgc2VydmljZS0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gc2VydmljZTsKK30KKwordm9pZAorYnVzX3NlcnZpY2VfdW5yZWYgKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+cmVmY291bnQgPiAwKTsKKyAgCisgIHNlcnZpY2UtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHNlcnZpY2UtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoc2VydmljZS0+bmFtZSk7CisgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChzZXJ2aWNlLT5yZWdpc3RyeS0+c2VydmljZV9wb29sLCBzZXJ2aWNlKTsKKyAgICB9Cit9CisKK0RCdXNDb25uZWN0aW9uICoKK2J1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICBCdXNPd25lciAqb3duZXI7CisKKyAgb3duZXIgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoc2VydmljZSk7CisKKyAgaWYgKG93bmVyICE9IE5VTEwpCisgICAgcmV0dXJuIG93bmVyLT5jb25uOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0J1c093bmVyKgorYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIHJldHVybiBfZGJ1c19saXN0X2dldF9maXJzdCAoJnNlcnZpY2UtPm93bmVycyk7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfc2VydmljZV9nZXRfbmFtZSAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgcmV0dXJuIHNlcnZpY2UtPm5hbWU7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIEJ1c093bmVyICpvd25lcjsKKyAgREJ1c0xpc3QgKmxpbms7CisgCisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+b3duZXJzICE9IE5VTEwpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKTsKKyAgb3duZXIgPSAoQnVzT3duZXIgKikgbGluay0+ZGF0YTsKKworICByZXR1cm4gb3duZXItPmFsbG93X3JlcGxhY2VtZW50OworfQorCitkYnVzX2Jvb2xfdAorYnVzX3NlcnZpY2VfaGFzX293bmVyIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKwkJICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayAoc2VydmljZSwgY29ubmVjdGlvbik7CisgCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90IAorYnVzX3NlcnZpY2VfbGlzdF9xdWV1ZWRfb3duZXJzIChCdXNTZXJ2aWNlICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKipyZXR1cm5fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoKnJldHVybl9saXN0ID09IE5VTEwpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKTsKKyAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworICAKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNPd25lciAqb3duZXI7CisgICAgICBjb25zdCBjaGFyICp1bmFtZTsKKworICAgICAgb3duZXIgPSAoQnVzT3duZXIgKikgbGluay0+ZGF0YTsKKyAgICAgIHVuYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKG93bmVyLT5jb25uKTsKKworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmV0dXJuX2xpc3QsIChjaGFyICopdW5hbWUpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7CisgIAorIG9vbToKKyAgX2RidXNfbGlzdF9jbGVhciAocmV0dXJuX2xpc3QpOworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvc2VydmljZXMuaCBiL2RidXMtMS40LjEwL2J1cy9zZXJ2aWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NmRkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvc2VydmljZXMuaApAQCAtMCwwICsxLDk0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHNlcnZpY2VzLmggIFNlcnZpY2UgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19TRVJWSUNFU19ICisjZGVmaW5lIEJVU19TRVJWSUNFU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiYnVzLmgiCisKK3R5cGVkZWYgdm9pZCAoKiBCdXNTZXJ2aWNlRm9yZWFjaEZ1bmN0aW9uKSAoQnVzU2VydmljZSAgICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSk7CisKK0J1c1JlZ2lzdHJ5KiBidXNfcmVnaXN0cnlfbmV3ICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworQnVzUmVnaXN0cnkqIGJ1c19yZWdpc3RyeV9yZWYgICAgICAgICAgICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnkpOwordm9pZCAgICAgICAgIGJ1c19yZWdpc3RyeV91bnJlZiAgICAgICAgICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnkpOworQnVzU2VydmljZSogIGJ1c19yZWdpc3RyeV9sb29rdXAgICAgICAgICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICpzZXJ2aWNlX25hbWUpOworQnVzU2VydmljZSogIGJ1c19yZWdpc3RyeV9lbnN1cmUgICAgICAgICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpvd25lcl9jb25uZWN0aW9uX2lmX2NyZWF0ZWQsCisJCQkJCSAgIGRidXNfdWludDMyX3QgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICBidXNfcmVnaXN0cnlfZm9yZWFjaCAgICAgICAgIChCdXNSZWdpc3RyeSAgICAgICAgICAgICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2VGb3JlYWNoRnVuY3Rpb24gICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKK2RidXNfYm9vbF90ICBidXNfcmVnaXN0cnlfbGlzdF9zZXJ2aWNlcyAgIChCdXNSZWdpc3RyeSAgICAgICAgICAgICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKioqbGlzdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICphcnJheV9sZW4pOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICBidXNfcmVnaXN0cnlfcmVsZWFzZV9zZXJ2aWNlIChCdXNSZWdpc3RyeSAgICAgICAgICAgICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAgICAgICAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9zZXRfc2VydmljZV9jb250ZXh0X3RhYmxlIChCdXNSZWdpc3RyeSAgICAgICAgICAgKnJlZ2lzdHJ5LAorCQkJCQkJICAgICBEQnVzSGFzaFRhYmxlICAgICAgICAgKnRhYmxlKTsKKworQnVzU2VydmljZSogICAgIGJ1c19zZXJ2aWNlX3JlZiAgICAgICAgICAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK3ZvaWQgICAgICAgICAgICBidXNfc2VydmljZV91bnJlZiAgICAgICAgICAgICAgICAgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfYWRkX293bmVyICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkgICAgICAgZGJ1c191aW50MzJfdCAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgIGJ1c19zZXJ2aWNlX3N3YXBfb3duZXIgICAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgIGJ1c19zZXJ2aWNlX3JlbW92ZV9vd25lciAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgIGJ1c19zZXJ2aWNlX2hhc19vd25lciAgICAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK0J1c093bmVyKiAgICAgICBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAgICAgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfZ2V0X2FsbG93X3JlcGxhY2VtZW50ICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOworY29uc3QgY2hhciogICAgIGJ1c19zZXJ2aWNlX2dldF9uYW1lICAgICAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK2RidXNfYm9vbF90ICAgICBidXNfc2VydmljZV9saXN0X3F1ZXVlZF9vd25lcnMgICAgICAgIChCdXNTZXJ2aWNlICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqKnJldHVybl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworREJ1c0Nvbm5lY3Rpb24qIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7CisjZW5kaWYgLyogQlVTX1NFUlZJQ0VTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy9zZXNzaW9uLmNvbmYuaW4gYi9kYnVzLTEuNC4xMC9idXMvc2Vzc2lvbi5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjFmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvc2Vzc2lvbi5jb25mLmluCkBAIC0wLDAgKzEsNjMgQEAKKzwhLS0gVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgY29udHJvbHMgdGhlIHBlci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMuCisgICAgIEFkZCBhIHNlc3Npb24tbG9jYWwuY29uZiBhbmQgZWRpdCB0aGF0IHJhdGhlciB0aGFuIGNoYW5naW5nIHRoaXMgCisgICAgIGZpbGUgZGlyZWN0bHkuIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKworICA8IS0tIElmIHdlIGZvcmssIGtlZXAgdGhlIHVzZXIncyBvcmlnaW5hbCB1bWFzayB0byBhdm9pZCBhZmZlY3RpbmcKKyAgICAgICB0aGUgYmVoYXZpb3Igb2YgY2hpbGQgcHJvY2Vzc2VzLiAtLT4KKyAgPGtlZXBfdW1hc2svPgorCisgIDxsaXN0ZW4+QERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTQDwvbGlzdGVuPgorCisgIDxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIC8+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgc2VudCAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHJlY2VpdmVkIC0tPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byBvd24gYW55dGhpbmcgLS0+CisgICAgPGFsbG93IG93bj0iKiIvPgorICA8L3BvbGljeT4KKworICA8IS0tIENvbmZpZyBmaWxlcyBhcmUgcGxhY2VkIGhlcmUgdGhhdCBhbW9uZyBvdGhlciB0aGluZ3MsIAorICAgICAgIGZ1cnRoZXIgcmVzdHJpY3QgdGhlIGFib3ZlIHBvbGljeSBmb3Igc3BlY2lmaWMgc2VydmljZXMuIC0tPgorICA8aW5jbHVkZWRpcj5zZXNzaW9uLmQ8L2luY2x1ZGVkaXI+CisKKyAgPCEtLSBUaGlzIGlzIGluY2x1ZGVkIGxhc3Qgc28gbG9jYWwgY29uZmlndXJhdGlvbiBjYW4gb3ZlcnJpZGUgd2hhdCdzIAorICAgICAgIGluIHRoaXMgc3RhbmRhcmQgZmlsZSAtLT4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+c2Vzc2lvbi1sb2NhbC5jb25mPC9pbmNsdWRlPgorCisgIDxpbmNsdWRlIGlmX3NlbGludXhfZW5hYmxlZD0ieWVzIiBzZWxpbnV4X3Jvb3RfcmVsYXRpdmU9InllcyI+Y29udGV4dHMvZGJ1c19jb250ZXh0czwvaW5jbHVkZT4KKworICA8IS0tIEZvciB0aGUgc2Vzc2lvbiBidXMsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlbGF0aXZlbHktbG93IGxpbWl0cyAKKyAgICAgICB3aXRoIGVzc2VudGlhbGx5IGluZmluaXRlIGxpbWl0cywgc2luY2UgdGhlIGJ1cyBpcyBqdXN0IHJ1bm5pbmcgCisgICAgICAgYXMgdGhlIHVzZXIgYW55d2F5LCB1c2luZyB1cCBidXMgcmVzb3VyY2VzIGlzIG5vdCBzb21ldGhpbmcgd2UgbmVlZCAKKyAgICAgICB0byB3b3JyeSBhYm91dC4gSW4gc29tZSBjYXNlcywgd2UgZG8gc2V0IHRoZSBsaW1pdHMgbG93ZXIgdGhhbiAKKyAgICAgICAiYWxsIGF2YWlsYWJsZSBtZW1vcnkiIGlmIGV4Y2VlZGluZyB0aGUgbGltaXQgaXMgYWxtb3N0IGNlcnRhaW5seSBhIGJ1ZywgCisgICAgICAgaGF2aW5nIHRoZSBidXMgZW5mb3JjZSBhIGxpbWl0IGlzIG5pY2VyIHRoYW4gYSBodWdlIG1lbW9yeSBsZWFrLiBCdXQgdGhlIAorICAgICAgIGludGVudCBpcyB0aGF0IHRoZXNlIGxpbWl0cyBzaG91bGQgbmV2ZXIgYmUgaGl0LiAtLT4KKworICA8IS0tIHRoZSBtZW1vcnkgbGltaXRzIGFyZSAxRyBpbnN0ZWFkIG9mIHNheSA0RyBiZWNhdXNlIHRoZXkgY2FuJ3QgZXhjZWVkIDMyLWJpdCBzaWduZWQgaW50IG1heCAtLT4KKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+MTAwMDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfdW5peF9mZHMiPjI1MDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X291dGdvaW5nX3VuaXhfZmRzIj4yNTAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MTAwMDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV91bml4X2ZkcyI+NDA5NjwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiPjEyMDAwMDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+MjQwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMiPjEwMDAwMDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj4xMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjEwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+MTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iPjUwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL3NpZ25hbHMuYyBiL2RidXMtMS40LjEwL2J1cy9zaWduYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1YTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9zaWduYWxzLmMKQEAgLTAsMCArMSwyMzI0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHNpZ25hbHMuYyAgQnVzIHNpZ25hbCBjb25uZWN0aW9uIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCitzdHJ1Y3QgQnVzTWF0Y2hSdWxlCit7CisgIGludCByZWZjb3VudDsgICAgICAgLyoqPCByZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzQ29ubmVjdGlvbiAqbWF0Y2hlc19nb190bzsgLyoqPCBPd25lciBvZiB0aGUgcnVsZSAqLworCisgIHVuc2lnbmVkIGludCBmbGFnczsgLyoqPCBCdXNNYXRjaEZsYWdzICovCisKKyAgaW50ICAgbWVzc2FnZV90eXBlOworICBjaGFyICppbnRlcmZhY2U7CisgIGNoYXIgKm1lbWJlcjsKKyAgY2hhciAqc2VuZGVyOworICBjaGFyICpkZXN0aW5hdGlvbjsKKyAgY2hhciAqcGF0aDsKKworICB1bnNpZ25lZCBpbnQgKmFyZ19sZW5zOworICBjaGFyICoqYXJnczsKKyAgaW50IGFyZ3NfbGVuOworfTsKKworI2RlZmluZSBCVVNfTUFUQ0hfQVJHX0lTX1BBVEggIDB4ODAwMDAwMHUKKworQnVzTWF0Y2hSdWxlKgorYnVzX21hdGNoX3J1bGVfbmV3IChEQnVzQ29ubmVjdGlvbiAqbWF0Y2hlc19nb190bykKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgIHJ1bGUgPSBkYnVzX25ldzAgKEJ1c01hdGNoUnVsZSwgMSk7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcnVsZS0+cmVmY291bnQgPSAxOworICBydWxlLT5tYXRjaGVzX2dvX3RvID0gbWF0Y2hlc19nb190bzsKKworI2lmbmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIF9kYnVzX2Fzc2VydCAocnVsZS0+bWF0Y2hlc19nb190byAhPSBOVUxMKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIHJ1bGU7Cit9CisKK0J1c01hdGNoUnVsZSAqCitidXNfbWF0Y2hfcnVsZV9yZWYgKEJ1c01hdGNoUnVsZSAqcnVsZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5yZWZjb3VudCA+IDApOworCisgIHJ1bGUtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHJ1bGU7Cit9CisKK3ZvaWQKK2J1c19tYXRjaF9ydWxlX3VucmVmIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCAtPSAxOworICBpZiAocnVsZS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmludGVyZmFjZSk7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPm1lbWJlcik7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPnNlbmRlcik7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmRlc3RpbmF0aW9uKTsKKyAgICAgIGRidXNfZnJlZSAocnVsZS0+cGF0aCk7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmFyZ19sZW5zKTsKKworICAgICAgLyogY2FuJ3QgdXNlIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKSBzaW5jZSB0aGVyZQorICAgICAgICogYXJlIGVtYmVkZGVkIE5VTEwKKyAgICAgICAqLworICAgICAgaWYgKHJ1bGUtPmFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgIGkgPSAwOworICAgICAgICAgIHdoaWxlIChpIDwgcnVsZS0+YXJnc19sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChydWxlLT5hcmdzW2ldKQorICAgICAgICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+YXJnc1tpXSk7CisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+YXJncyk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChydWxlKTsKKyAgICB9Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKy8qIE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkbyBlc2NhcGluZywgc28gaXQncyBvbmx5CisgKiBnb29kIGZvciBkZWJ1ZyBzcGV3IGF0IHRoZSBtb21lbnQKKyAqLworc3RhdGljIGNoYXIqCittYXRjaF9ydWxlX3RvX3N0cmluZyAoQnVzTWF0Y2hSdWxlICpydWxlKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgY2hhciAqcmV0OworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgeworICAgICAgY2hhciAqczsKKyAgICAgIHdoaWxlICgocyA9IF9kYnVzX3N0cmR1cCAoIm5vbWVtIikpID09IE5VTEwpCisgICAgICAgIDsgLyogb25seSBPSyBmb3IgZGVidWcgc3Bldy4uLiAqLworICAgICAgcmV0dXJuIHM7CisgICAgfQorICAKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX01FU1NBR0VfVFlQRSkKKyAgICB7CisgICAgICBpZiAocnVsZS0+bWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAidHlwZT0nSU5WQUxJRCciKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJ1bGUtPm1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsICJ0eXBlPSdtZXRob2RfY2FsbCciKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJ1bGUtPm1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnN0ciwgInR5cGU9J21ldGhvZF9yZXR1cm4nIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChydWxlLT5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAidHlwZT0nZXJyb3InIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChydWxlLT5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnN0ciwgInR5cGU9J3NpZ25hbCciKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsICJ0eXBlPSclZCciLCBydWxlLT5tZXNzYWdlX3R5cGUpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAiaW50ZXJmYWNlPSclcyciLCBydWxlLT5pbnRlcmZhY2UpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAibWVtYmVyPSclcyciLCBydWxlLT5tZW1iZXIpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfUEFUSCkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJnN0ciwgInBhdGg9JyVzJyIsIHJ1bGUtPnBhdGgpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLCAic2VuZGVyPSclcyciLCBydWxlLT5zZW5kZXIpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsICJkZXN0aW5hdGlvbj0nJXMnIiwgcnVsZS0+ZGVzdGluYXRpb24pKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQVJHUykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgcnVsZS0+YXJnc19sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+YXJnc1tpXSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19wYXRoOworCisgICAgICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaXNfcGF0aCA9IChydWxlLT5hcmdfbGVuc1tpXSAmIEJVU19NQVRDSF9BUkdfSVNfUEFUSCkgIT0gMDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmclZCVzPSclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpc19wYXRoID8gInBhdGgiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmFyZ3NbaV0pKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnJldCkpCisgICAgZ290byBub21lbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiByZXQ7CisgIAorIG5vbWVtOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHsKKyAgICBjaGFyICpzOworICAgIHdoaWxlICgocyA9IF9kYnVzX3N0cmR1cCAoIm5vbWVtIikpID09IE5VTEwpCisgICAgICA7ICAvKiBvbmx5IE9LIGZvciBkZWJ1ZyBzcGV3Li4uICovCisgICAgcmV0dXJuIHM7CisgIH0KK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3NldF9tZXNzYWdlX3R5cGUgKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgdHlwZSkKK3sKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX01FU1NBR0VfVFlQRTsKKworICBydWxlLT5tZXNzYWdlX3R5cGUgPSB0eXBlOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X2ludGVyZmFjZSAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICppbnRlcmZhY2UpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKGludGVyZmFjZSAhPSBOVUxMKTsKKworICBuZXcgPSBfZGJ1c19zdHJkdXAgKGludGVyZmFjZSk7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX0lOVEVSRkFDRTsKKyAgZGJ1c19mcmVlIChydWxlLT5pbnRlcmZhY2UpOworICBydWxlLT5pbnRlcmZhY2UgPSBuZXc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9zZXRfbWVtYmVyIChCdXNNYXRjaFJ1bGUgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm1lbWJlcikKK3sKKyAgY2hhciAqbmV3OworCisgIF9kYnVzX2Fzc2VydCAobWVtYmVyICE9IE5VTEwpOworCisgIG5ldyA9IF9kYnVzX3N0cmR1cCAobWVtYmVyKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfTUVNQkVSOworICBkYnVzX2ZyZWUgKHJ1bGUtPm1lbWJlcik7CisgIHJ1bGUtPm1lbWJlciA9IG5ldzsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3NldF9zZW5kZXIgKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqc2VuZGVyKQoreworICBjaGFyICpuZXc7CisKKyAgX2RidXNfYXNzZXJ0IChzZW5kZXIgIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChzZW5kZXIpOworICBpZiAobmV3ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9TRU5ERVI7CisgIGRidXNfZnJlZSAocnVsZS0+c2VuZGVyKTsKKyAgcnVsZS0+c2VuZGVyID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X2Rlc3RpbmF0aW9uIChCdXNNYXRjaFJ1bGUgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqZGVzdGluYXRpb24pCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKGRlc3RpbmF0aW9uICE9IE5VTEwpOworCisgIG5ldyA9IF9kYnVzX3N0cmR1cCAoZGVzdGluYXRpb24pOworICBpZiAobmV3ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9ERVNUSU5BVElPTjsKKyAgZGJ1c19mcmVlIChydWxlLT5kZXN0aW5hdGlvbik7CisgIHJ1bGUtPmRlc3RpbmF0aW9uID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X3BhdGggKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnBhdGgpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChwYXRoKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfUEFUSDsKKyAgZGJ1c19mcmVlIChydWxlLT5wYXRoKTsKKyAgcnVsZS0+cGF0aCA9IG5ldzsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3NldF9hcmcgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19wYXRoKQoreworICBpbnQgbGVuZ3RoOworICBjaGFyICpuZXc7CisKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKworICAvKiBhcmdzX2xlbiBpcyB0aGUgbnVtYmVyIG9mIGFyZ3Mgbm90IGluY2x1ZGluZyBudWxsIHRlcm1pbmF0aW9uCisgICAqIGluIHRoZSBjaGFyKioKKyAgICovCisgIGlmIChhcmcgPj0gcnVsZS0+YXJnc19sZW4pCisgICAgeworICAgICAgdW5zaWduZWQgaW50ICpuZXdfYXJnX2xlbnM7CisgICAgICBjaGFyICoqbmV3X2FyZ3M7CisgICAgICBpbnQgbmV3X2FyZ3NfbGVuOworICAgICAgaW50IGk7CisKKyAgICAgIG5ld19hcmdzX2xlbiA9IGFyZyArIDE7CisKKyAgICAgIC8qIGFkZCBhbm90aGVyICsgMSBoZXJlIGZvciBudWxsIHRlcm1pbmF0aW9uICovCisgICAgICBuZXdfYXJncyA9IGRidXNfcmVhbGxvYyAocnVsZS0+YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGNoYXIgKikgKiAobmV3X2FyZ3NfbGVuICsgMSkpOworICAgICAgaWYgKG5ld19hcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogTlVMTCB0aGUgbmV3IHNsb3RzICovCisgICAgICBpID0gcnVsZS0+YXJnc19sZW47CisgICAgICB3aGlsZSAoaSA8PSBuZXdfYXJnc19sZW4pIC8qIDw9IGZvciBudWxsIHRlcm1pbmF0aW9uICovCisgICAgICAgIHsKKyAgICAgICAgICBuZXdfYXJnc1tpXSA9IE5VTEw7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJ1bGUtPmFyZ3MgPSBuZXdfYXJnczsKKworICAgICAgLyogYW5kIG5vdyBhZGQgdG8gdGhlIGxlbmd0aHMgKi8KKyAgICAgIG5ld19hcmdfbGVucyA9IGRidXNfcmVhbGxvYyAocnVsZS0+YXJnX2xlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoaW50KSAqIChuZXdfYXJnc19sZW4gKyAxKSk7CisKKyAgICAgIGlmIChuZXdfYXJnX2xlbnMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiB6ZXJvIHRoZSBuZXcgc2xvdHMgKi8KKyAgICAgIGkgPSBydWxlLT5hcmdzX2xlbjsKKyAgICAgIHdoaWxlIChpIDw9IG5ld19hcmdzX2xlbikgLyogPD0gZm9yIG51bGwgdGVybWluYXRpb24gKi8KKyAgICAgICAgeworICAgICAgICAgIG5ld19hcmdfbGVuc1tpXSA9IDA7CisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgIHJ1bGUtPmFyZ19sZW5zID0gbmV3X2FyZ19sZW5zOworICAgICAgcnVsZS0+YXJnc19sZW4gPSBuZXdfYXJnc19sZW47CisgICAgfQorCisgIGxlbmd0aCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh2YWx1ZSk7CisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAodmFsdWUsICZuZXcpKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfQVJHUzsKKworICBkYnVzX2ZyZWUgKHJ1bGUtPmFyZ3NbYXJnXSk7CisgIHJ1bGUtPmFyZ19sZW5zW2FyZ10gPSBsZW5ndGg7CisgIHJ1bGUtPmFyZ3NbYXJnXSA9IG5ldzsKKworICBpZiAoaXNfcGF0aCkKKyAgICBydWxlLT5hcmdfbGVuc1thcmddIHw9IEJVU19NQVRDSF9BUkdfSVNfUEFUSDsKKworICAvKiBOVUxMIHRlcm1pbmF0aW9uIGRpZG4ndCBnZXQgYnVzdGVkICovCisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1tydWxlLT5hcmdzX2xlbl0gPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnX2xlbnNbcnVsZS0+YXJnc19sZW5dID09IDApOworCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIElTV0hJVEUoYykgKCgoYykgPT0gJyAnKSB8fCAoKGMpID09ICdcdCcpIHx8ICgoYykgPT0gJ1xuJykgfHwgKChjKSA9PSAnXHInKSkKKworc3RhdGljIGRidXNfYm9vbF90CitmaW5kX2tleSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmtleSwKKyAgICAgICAgICBpbnQgICAgICAgICAgICAgICp2YWx1ZV9wb3MsCisgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmtleV9zdGFydDsKKyAgY29uc3QgY2hhciAqa2V5X2VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICB3aGlsZSAoKnAgJiYgSVNXSElURSAoKnApKQorICAgICsrcDsKKworICBrZXlfc3RhcnQgPSBwOworCisgIHdoaWxlICgqcCAmJiAqcCAhPSAnPScgJiYgIUlTV0hJVEUgKCpwKSkKKyAgICArK3A7CisKKyAga2V5X2VuZCA9IHA7CisKKyAgd2hpbGUgKCpwICYmIElTV0hJVEUgKCpwKSkKKyAgICArK3A7CisgIAorICBpZiAoa2V5X3N0YXJ0ID09IGtleV9lbmQpCisgICAgeworICAgICAgLyogRW1wdHkgbWF0Y2ggcnVsZXMgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcmUgT0sgKi8KKyAgICAgICp2YWx1ZV9wb3MgPSBwIC0gczsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoKnAgIT0gJz0nKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1hdGNoIHJ1bGUgaGFzIGEga2V5IHdpdGggbm8gc3Vic2VxdWVudCAnPScgY2hhcmFjdGVyIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICArK3A7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChrZXksIGtleV9zdGFydCwga2V5X2VuZCAtIGtleV9zdGFydCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnZhbHVlX3BvcyA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF92YWx1ZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICprZXksCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnZhbHVlX2VuZCwKKyAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIHF1b3RlX2NoYXI7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICBxdW90ZV9jaGFyID0gJ1wwJzsKKworICB3aGlsZSAoKnApCisgICAgeworICAgICAgaWYgKHF1b3RlX2NoYXIgPT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wnJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1xcJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHF1b3RlX2NoYXIgPT0gJ1xcJykKKyAgICAgICAgeworICAgICAgICAgIC8qIFwgb25seSBjb3VudHMgYXMgYW4gZXNjYXBlIGlmIGVzY2FwaW5nIGEgcXVvdGUgbWFyayAqLworICAgICAgICAgIGlmICgqcCAhPSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICdcXCcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICpwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgcXVvdGVfY2hhciA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAocXVvdGVfY2hhciA9PSAnXCcnKTsKKworICAgICAgICAgIGlmICgqcCA9PSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK3A7CisgICAgfQorCisgZG9uZToKKworICBpZiAocXVvdGVfY2hhciA9PSAnXFwnKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgJ1xcJykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChxdW90ZV9jaGFyID09ICdcJycpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5iYWxhbmNlZCBxdW90YXRpb24gbWFya3MgaW4gbWF0Y2ggcnVsZSIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfYXNzZXJ0IChxdW90ZV9jaGFyID09ICdcMCcpOworCisgIC8qIFplcm8tbGVuZ3RoIHZhbHVlcyBhcmUgYWxsb3dlZCAqLworICAKKyAgKnZhbHVlX2VuZCA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHZhbHVlLCBvcmlnX2xlbik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyogZHVwbGljYXRlcyBhcmVuJ3QgYWxsb3dlZCBzbyB0aGUgcmVhbCBsZWdpdGltYXRlIG1heCBpcyBvbmx5IDYgb3IKKyAqIHNvLiBMZWF2aW5nIGV4dHJhIHNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIHRvIHVwZGF0ZSBpdC4KKyAqIEZJWE1FIHRoaXMgaXMgc29ydCBvZiBidXN0ZWQgbm93IHdpdGggYXJnIG1hdGNoaW5nLCBidXQgd2UgbGV0CisgKiB5b3UgbWF0Y2ggb24gdXAgdG8gMTAgYXJncyBmb3Igbm93CisgKi8KKyNkZWZpbmUgTUFYX1JVTEVfVE9LRU5TIDE2CisKKy8qIHRoaXMgaXMgc2xpZ2h0bHkgdG9vIGhpZ2ggbGV2ZWwgdG8gYmUgdGVybWVkIGEgInRva2VuIgorICogYnV0IGxldCdzIG5vdCBiZSBwZWRhbnRpYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqa2V5OworICBjaGFyICp2YWx1ZTsKK30gUnVsZVRva2VuOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rva2VuaXplX3J1bGUgKGNvbnN0IERCdXNTdHJpbmcgKnJ1bGVfdGV4dCwKKyAgICAgICAgICAgICAgIFJ1bGVUb2tlbiAgICAgICAgIHRva2Vuc1tNQVhfUlVMRV9UT0tFTlNdLAorICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpIAoreworICBpbnQgaTsKKyAgaW50IHBvczsKKyAgREJ1c1N0cmluZyBrZXk7CisgIERCdXNTdHJpbmcgdmFsdWU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ2YWx1ZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHBvcyA9IDA7CisgIHdoaWxlIChpIDwgTUFYX1JVTEVfVE9LRU5TICYmCisgICAgICAgICBwb3MgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocnVsZV90ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS5rZXkgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS52YWx1ZSA9PSBOVUxMKTsKKworICAgICAgaWYgKCFmaW5kX2tleSAocnVsZV90ZXh0LCBwb3MsICZrZXksICZwb3MsIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmtleSkgPT0gMCkKKyAgICAgICAgZ290byBuZXh0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgma2V5LCAmdG9rZW5zW2ldLmtleSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghZmluZF92YWx1ZSAocnVsZV90ZXh0LCBwb3MsIHRva2Vuc1tpXS5rZXksICZ2YWx1ZSwgJnBvcywgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnZhbHVlLCAmdG9rZW5zW2ldLnZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK2k7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAodG9rZW5zW2ldLmtleSB8fCB0b2tlbnNbaV0udmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS5rZXkpOworICAgICAgICAgIGRidXNfZnJlZSAodG9rZW5zW2ldLnZhbHVlKTsKKyAgICAgICAgICB0b2tlbnNbaV0ua2V5ID0gTlVMTDsKKyAgICAgICAgICB0b2tlbnNbaV0udmFsdWUgPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ2YWx1ZSk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IGlzX3BhdGg7CisgIERCdXNTdHJpbmcga2V5X3N0cjsKKyAgdW5zaWduZWQgbG9uZyBhcmc7CisgIGludCBsZW5ndGg7CisgIGludCBlbmQ7CisKKyAgLyogRm9yIG5vdywgYXJnMD0nZm9vJyBhbHdheXMgaW1wbGllcyB0aGF0ICdmb28nIGlzIGEKKyAgICogREJVU19UWVBFX1NUUklORy4gU29tZWRheSB3ZSBjb3VsZCBhZGQgYW4gYXJnMHR5cGU9J2ludDMyJyB0aGluZworICAgKiBpZiB3ZSB3YW50ZWQsIHdoaWNoIHdvdWxkIHNwZWNpZnkgYW5vdGhlciB0eXBlLCBpbiB3aGljaCBjYXNlCisgICAqIGFyZzA9JzUnIHdvdWxkIGhhdmUgdGhlIDUgcGFyc2VkIGFzIGFuIGludCByYXRoZXIgdGhhbiBzdHJpbmcuCisgICAqLworICAKKyAgLyogRmlyc3Qgd2UgbmVlZCB0byBwYXJzZSBhcmcwID0gMCwgYXJnMjcgPSAyNyAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgma2V5X3N0ciwga2V5KTsKKyAgbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKSA8IDQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiS2V5ICclcycgaW4gbWF0Y2ggcnVsZSBzdGFydHMgd2l0aCAnYXJnJyBidXQgbGFja3MgYW4gYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKCZrZXlfc3RyLCAzLCAmYXJnLCAmZW5kKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJLZXkgJyVzJyBpbiBtYXRjaCBydWxlIHN0YXJ0cyB3aXRoICdhcmcnIGJ1dCBjb3VsZCBub3QgcGFyc2UgYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChlbmQgIT0gbGVuZ3RoICYmCisgICAgICAoKGVuZCArIDQpICE9IGxlbmd0aCB8fAorICAgICAgICFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgma2V5X3N0ciwgInBhdGgiKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiS2V5ICclcycgaW4gbWF0Y2ggcnVsZSBjb250YWlucyBqdW5rIGFmdGVyIGFyZ3VtZW50IG51bWJlci4gT25seSAncGF0aCcgaXMgb3B0aW9uYWxseSB2YWxpZCAoJ2FyZzBwYXRoJyBmb3IgZXhhbXBsZSkuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlzX3BhdGggPSBlbmQgIT0gbGVuZ3RoOworCisgIC8qIElmIHdlIGRpZG4ndCBjaGVjayB0aGlzIHdlIGNvdWxkIGFsbG9jYXRlIGEgaHVnZSBhbW91bnQgb2YgUkFNICovCisgIGlmIChhcmcgPiBEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9BUkdfTlVNQkVSKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIktleSAnJXMnIGluIG1hdGNoIHJ1bGUgaGFzIGFyZyBudW1iZXIgJWx1IGJ1dCB0aGUgbWF4aW11bSBpcyAlZC5cbiIsIGtleSwgKHVuc2lnbmVkIGxvbmcpIGFyZywgREJVU19NQVhJTVVNX01BVENIX1JVTEVfQVJHX05VTUJFUik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0FSR1MpICYmCisgICAgICBydWxlLT5hcmdzX2xlbiA+IChpbnQpIGFyZyAmJgorICAgICAgcnVsZS0+YXJnc1thcmddICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgJWQgbWF0Y2hlZCBtb3JlIHRoYW4gb25jZSBpbiBtYXRjaCBydWxlXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfYXJnIChydWxlLCBhcmcsIHZhbHVlLCBpc19wYXRoKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFRoZSBmb3JtYXQgaXMgY29tbWEtc2VwYXJhdGVkIHdpdGggc3RyaW5ncyBxdW90ZWQgd2l0aCBzaW5nbGUgcXVvdGVzCisgKiBhcyBmb3IgdGhlIHNoZWxsICh0byBlc2NhcGUgYSBsaXRlcmFsIHNpbmdsZSBxdW90ZSwgdXNlICdcJycpLgorICoKKyAqIHR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLAorICogcGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JworICoKKyAqLworQnVzTWF0Y2hSdWxlKgorYnVzX21hdGNoX3J1bGVfcGFyc2UgKERCdXNDb25uZWN0aW9uICAgKm1hdGNoZXNfZ29fdG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqcnVsZV90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIFJ1bGVUb2tlbiB0b2tlbnNbTUFYX1JVTEVfVE9LRU5TKzFdOyAvKiBOVUxMIHRlcm1pbmF0aW9uICsgMSAqLworICBpbnQgaTsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocnVsZV90ZXh0KSA+IERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJNYXRjaCBydWxlIHRleHQgaXMgJWQgYnl0ZXMsIG1heGltdW0gaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChydWxlX3RleHQpLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBtZW1zZXQgKHRva2VucywgJ1wwJywgc2l6ZW9mICh0b2tlbnMpKTsKKyAgCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9uZXcgKG1hdGNoZXNfZ29fdG8pOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoIXRva2VuaXplX3J1bGUgKHJ1bGVfdGV4dCwgdG9rZW5zLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKHRva2Vuc1tpXS5rZXkgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHRtcF9zdHI7CisgICAgICBpbnQgbGVuOworICAgICAgY29uc3QgY2hhciAqa2V5ID0gdG9rZW5zW2ldLmtleTsKKyAgICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gdG9rZW5zW2ldLnZhbHVlOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRtcF9zdHIsIHZhbHVlKTsKKyAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wX3N0cik7CisKKyAgICAgIGlmIChzdHJjbXAgKGtleSwgInR5cGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IHQ7CisKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgdCA9IGRidXNfbWVzc2FnZV90eXBlX2Zyb21fc3RyaW5nICh2YWx1ZSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHQgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG1lc3NhZ2UgdHlwZSAoJXMpIGluIG1hdGNoIHJ1bGVcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9tZXNzYWdlX3R5cGUgKHJ1bGUsIHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChrZXksICJzZW5kZXIiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXkgJXMgc3BlY2lmaWVkIHR3aWNlIGluIG1hdGNoIHJ1bGVcbiIsIGtleSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZGVyIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfc2VuZGVyIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgImludGVyZmFjZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfaW50ZXJmYWNlIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgIm1lbWJlciIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyIG5hbWUgJyVzJyBpcyBpbnZhbGlkXG4iLCB2YWx1ZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfbWVtYmVyIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgInBhdGgiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1BBVEgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5ICVzIHNwZWNpZmllZCB0d2ljZSBpbiBtYXRjaCBydWxlXG4iLCBrZXkpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfcGF0aCAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGF0aCAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9wYXRoIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgImRlc3RpbmF0aW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXkgJXMgc3BlY2lmaWVkIHR3aWNlIGluIG1hdGNoIHJ1bGVcbiIsIGtleSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzdGluYXRpb24gbmFtZSAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9kZXN0aW5hdGlvbiAocnVsZSwgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAoa2V5LCAiYXJnIiwgMykgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX21hdGNoX3J1bGVfcGFyc2VfYXJnX21hdGNoIChydWxlLCBrZXksICZ0bXBfc3RyLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24ga2V5IFwiJXNcIiBpbiBtYXRjaCBydWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorICAKKworICBnb3RvIG91dDsKKyAgCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChydWxlKQorICAgIHsKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICAgIHJ1bGUgPSBOVUxMOworICAgIH0KKworIG91dDoKKyAgCisgIGkgPSAwOworICB3aGlsZSAodG9rZW5zW2ldLmtleSB8fCB0b2tlbnNbaV0udmFsdWUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpIDwgTUFYX1JVTEVfVE9LRU5TKTsKKyAgICAgIGRidXNfZnJlZSAodG9rZW5zW2ldLmtleSk7CisgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS52YWx1ZSk7CisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIHJ1bGU7Cit9CisKK3R5cGVkZWYgc3RydWN0IFJ1bGVQb29sIFJ1bGVQb29sOworc3RydWN0IFJ1bGVQb29sCit7CisgIC8qIE1hcHMgbm9uLU5VTEwgaW50ZXJmYWNlIG5hbWVzIHRvIG5vbi1OVUxMIChEQnVzTGlzdCAqKilzICovCisgIERCdXNIYXNoVGFibGUgKnJ1bGVzX2J5X2lmYWNlOworCisgIC8qIExpc3Qgb2YgQnVzTWF0Y2hSdWxlcyB3aGljaCBkb24ndCBzcGVjaWZ5IGFuIGludGVyZmFjZSAqLworICBEQnVzTGlzdCAqcnVsZXNfd2l0aG91dF9pZmFjZTsKK307CisKK3N0cnVjdCBCdXNNYXRjaG1ha2VyCit7CisgIGludCByZWZjb3VudDsKKworICAvKiBQb29scyBvZiBydWxlcywgZ3JvdXBlZCBieSB0aGUgdHlwZSBvZiBtZXNzYWdlIHRoZXkgbWF0Y2guIDAKKyAgICogKERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpIHJlcHJlc2VudHMgcnVsZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhIG1lc3NhZ2UKKyAgICogdHlwZS4KKyAgICovCisgIFJ1bGVQb29sIHJ1bGVzX2J5X3R5cGVbREJVU19OVU1fTUVTU0FHRV9UWVBFU107Cit9OworCitzdGF0aWMgdm9pZAorcnVsZV9saXN0X2ZyZWUgKERCdXNMaXN0ICoqcnVsZXMpCit7CisgIHdoaWxlICgqcnVsZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisKKyAgICAgIHJ1bGUgPSAoKnJ1bGVzKS0+ZGF0YTsKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKHJ1bGVzLCAqcnVsZXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3J1bGVfbGlzdF9wdHJfZnJlZSAoREJ1c0xpc3QgKipsaXN0KQoreworICAvKiBXZSBoYXZlIHRvIGNvcGUgd2l0aCBOVUxMIGJlY2F1c2UgdGhlIGhhc2ggdGFibGUgZnJlZXMgdGhlICJleGlzdGluZyIKKyAgICogdmFsdWUgKHdoaWNoIGlzIE5VTEwpIHdoZW4gY3JlYXRpbmcgYSBuZXcgdGFibGUgZW50cnkuLi4KKyAgICovCisgIGlmIChsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgcnVsZV9saXN0X2ZyZWUgKGxpc3QpOworICAgICAgZGJ1c19mcmVlIChsaXN0KTsKKyAgICB9Cit9CisKK0J1c01hdGNobWFrZXIqCitidXNfbWF0Y2htYWtlcl9uZXcgKHZvaWQpCit7CisgIEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXI7CisgIGludCBpOworCisgIG1hdGNobWFrZXIgPSBkYnVzX25ldzAgKEJ1c01hdGNobWFrZXIsIDEpOworICBpZiAobWF0Y2htYWtlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1hdGNobWFrZXItPnJlZmNvdW50ID0gMTsKKworICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgIFJ1bGVQb29sICpwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIGk7CisKKyAgICAgIHAtPnJ1bGVzX2J5X2lmYWNlID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgZGJ1c19mcmVlLCAoREJ1c0ZyZWVGdW5jdGlvbikgcnVsZV9saXN0X3B0cl9mcmVlKTsKKworICAgICAgaWYgKHAtPnJ1bGVzX2J5X2lmYWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIHJldHVybiBtYXRjaG1ha2VyOworCisgbm9tZW06CisgIGZvciAoaSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7IGkgPCBEQlVTX05VTV9NRVNTQUdFX1RZUEVTOyBpKyspCisgICAgeworICAgICAgUnVsZVBvb2wgKnAgPSBtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlICsgaTsKKworICAgICAgaWYgKHAtPnJ1bGVzX2J5X2lmYWNlID09IE5VTEwpCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChwLT5ydWxlc19ieV9pZmFjZSk7CisgICAgfQorICBkYnVzX2ZyZWUgKG1hdGNobWFrZXIpOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgREJ1c0xpc3QgKioKK2J1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGNyZWF0ZSkKK3sKKyAgUnVsZVBvb2wgKnA7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX3R5cGUgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV90eXBlIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkxvb2tpbmcgdXAgcnVsZXMgZm9yIG1lc3NhZ2VfdHlwZSAlZCwgaW50ZXJmYWNlICVzXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgIGludGVyZmFjZSAhPSBOVUxMID8gaW50ZXJmYWNlIDogIjxudWxsPiIpOworCisgIHAgPSBtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlICsgbWVzc2FnZV90eXBlOworCisgIGlmIChpbnRlcmZhY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gJnAtPnJ1bGVzX3dpdGhvdXRfaWZhY2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0xpc3QgKipsaXN0OworCisgICAgICBsaXN0ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChwLT5ydWxlc19ieV9pZmFjZSwgaW50ZXJmYWNlKTsKKworICAgICAgaWYgKGxpc3QgPT0gTlVMTCAmJiBjcmVhdGUpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpkdXBwZWRfaW50ZXJmYWNlOworCisgICAgICAgICAgbGlzdCA9IGRidXNfbmV3MCAoREJ1c0xpc3QgKiwgMSk7CisgICAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgICAgZHVwcGVkX2ludGVyZmFjZSA9IF9kYnVzX3N0cmR1cCAoaW50ZXJmYWNlKTsKKyAgICAgICAgICBpZiAoZHVwcGVkX2ludGVyZmFjZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKGxpc3QpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRpbmcgbGlzdCBmb3IgdHlwZSAlZCwgaWZhY2UgJXNcbiIsIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHAtPnJ1bGVzX2J5X2lmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBwZWRfaW50ZXJmYWNlLCBsaXN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChsaXN0KTsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChkdXBwZWRfaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKipydWxlcykKK3sKKyAgUnVsZVBvb2wgKnA7CisKKyAgaWYgKGludGVyZmFjZSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoKnJ1bGVzICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJHQ2luZyBIVCBlbnRyeSBmb3IgbWVzc2FnZV90eXBlICV1LCBpbnRlcmZhY2UgJXNcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgaW50ZXJmYWNlKTsKKworICBwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIG1lc3NhZ2VfdHlwZTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAocC0+cnVsZXNfYnlfaWZhY2UsIGludGVyZmFjZSkKKyAgICAgID09IHJ1bGVzKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHAtPnJ1bGVzX2J5X2lmYWNlLCBpbnRlcmZhY2UpOworfQorCitCdXNNYXRjaG1ha2VyICoKK2J1c19tYXRjaG1ha2VyX3JlZiAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChtYXRjaG1ha2VyLT5yZWZjb3VudCA+IDApOworCisgIG1hdGNobWFrZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIG1hdGNobWFrZXI7Cit9CisKK3ZvaWQKK2J1c19tYXRjaG1ha2VyX3VucmVmIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKQoreworICBfZGJ1c19hc3NlcnQgKG1hdGNobWFrZXItPnJlZmNvdW50ID4gMCk7CisKKyAgbWF0Y2htYWtlci0+cmVmY291bnQgLT0gMTsKKyAgaWYgKG1hdGNobWFrZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7IGkgPCBEQlVTX05VTV9NRVNTQUdFX1RZUEVTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBSdWxlUG9vbCAqcCA9IG1hdGNobWFrZXItPnJ1bGVzX2J5X3R5cGUgKyBpOworCisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocC0+cnVsZXNfYnlfaWZhY2UpOworICAgICAgICAgIHJ1bGVfbGlzdF9mcmVlICgmcC0+cnVsZXNfd2l0aG91dF9pZmFjZSk7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChtYXRjaG1ha2VyKTsKKyAgICB9Cit9CisKKy8qIFRoZSBydWxlIGNhbid0IGJlIG1vZGlmaWVkIGFmdGVyIGl0J3MgYWRkZWQuICovCitkYnVzX2Jvb2xfdAorYnVzX21hdGNobWFrZXJfYWRkX3J1bGUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpCit7CisgIERCdXNMaXN0ICoqcnVsZXM7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKHJ1bGUtPm1hdGNoZXNfZ29fdG8pKTsKKworICBfZGJ1c192ZXJib3NlICgiQWRkaW5nIHJ1bGUgd2l0aCBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICBydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCA/IHJ1bGUtPmludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBydWxlcyA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+aW50ZXJmYWNlLCBUUlVFKTsKKworICBpZiAocnVsZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocnVsZXMsIHJ1bGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlIChydWxlLT5tYXRjaGVzX2dvX3RvLCBydWxlKSkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0IChydWxlcywgcnVsZSk7CisgICAgICBidXNfbWF0Y2htYWtlcl9nY19ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSwgcnVsZXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfbWF0Y2hfcnVsZV9yZWYgKHJ1bGUpOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHsKKyAgICBjaGFyICpzID0gbWF0Y2hfcnVsZV90b19zdHJpbmcgKHJ1bGUpOworCisgICAgX2RidXNfdmVyYm9zZSAoIkFkZGVkIG1hdGNoIHJ1bGUgJXMgdG8gY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBzLCBydWxlLT5tYXRjaGVzX2dvX3RvKTsKKyAgICBkYnVzX2ZyZWUgKHMpOworICB9CisjZW5kaWYKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hdGNoX3J1bGVfZXF1YWwgKEJ1c01hdGNoUnVsZSAqYSwKKyAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAqYikKK3sKKyAgaWYgKGEtPmZsYWdzICE9IGItPmZsYWdzKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoYS0+bWF0Y2hlc19nb190byAhPSBiLT5tYXRjaGVzX2dvX3RvKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX01FU1NBR0VfVFlQRSkgJiYKKyAgICAgIGEtPm1lc3NhZ2VfdHlwZSAhPSBiLT5tZXNzYWdlX3R5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKSAmJgorICAgICAgc3RyY21wIChhLT5tZW1iZXIsIGItPm1lbWJlcikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIKSAmJgorICAgICAgc3RyY21wIChhLT5wYXRoLCBiLT5wYXRoKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKSAmJgorICAgICAgc3RyY21wIChhLT5pbnRlcmZhY2UsIGItPmludGVyZmFjZSkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpICYmCisgICAgICBzdHJjbXAgKGEtPnNlbmRlciwgYi0+c2VuZGVyKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKSAmJgorICAgICAgc3RyY21wIChhLT5kZXN0aW5hdGlvbiwgYi0+ZGVzdGluYXRpb24pICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChhLT5mbGFncyAmIEJVU19NQVRDSF9BUkdTKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBpZiAoYS0+YXJnc19sZW4gIT0gYi0+YXJnc19sZW4pCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IGEtPmFyZ3NfbGVuKQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbmd0aDsKKworICAgICAgICAgIGlmICgoYS0+YXJnc1tpXSAhPSBOVUxMKSAhPSAoYi0+YXJnc1tpXSAhPSBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmIChhLT5hcmdfbGVuc1tpXSAhPSBiLT5hcmdfbGVuc1tpXSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGxlbmd0aCA9IGEtPmFyZ19sZW5zW2ldICYgfkJVU19NQVRDSF9BUkdfSVNfUEFUSDsKKworICAgICAgICAgIGlmIChhLT5hcmdzW2ldICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoYi0+YXJnc1tpXSAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgaWYgKG1lbWNtcCAoYS0+YXJnc1tpXSwgYi0+YXJnc1tpXSwgbGVuZ3RoKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2J1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2xpbmsgKERCdXNMaXN0ICAgICAgICoqcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgKmxpbmspCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisgIAorICBidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSAocnVsZS0+bWF0Y2hlc19nb190bywgcnVsZSk7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKHJ1bGVzLCBsaW5rKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICB7CisgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmVkIG1hdGNoIHJ1bGUgJXMgZm9yIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgcywgcnVsZS0+bWF0Y2hlc19nb190byk7CisgICAgZGJ1c19mcmVlIChzKTsKKyAgfQorI2VuZGlmCisgIAorICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7ICAKK30KKwordm9pZAorYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpCit7CisgIERCdXNMaXN0ICoqcnVsZXM7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIHJ1bGUgd2l0aCBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICBydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCA/IHJ1bGUtPmludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSAocnVsZS0+bWF0Y2hlc19nb190bywgcnVsZSk7CisKKyAgcnVsZXMgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSwgRkFMU0UpOworCisgIC8qIFdlIHNob3VsZCBvbmx5IGJlIGFza2VkIHRvIHJlbW92ZSBhIHJ1bGUgYnkgaWRlbnRpdHkgcmlnaHQgYWZ0ZXIgaXQgd2FzCisgICAqIGFkZGVkLCBzbyB0aGVyZSBzaG91bGQgYmUgYSBsaXN0IGZvciBpdC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAocnVsZXMgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9yZW1vdmUgKHJ1bGVzLCBydWxlKTsKKyAgYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKG1hdGNobWFrZXIsIHJ1bGUtPm1lc3NhZ2VfdHlwZSwgcnVsZS0+aW50ZXJmYWNlLAorICAgICAgcnVsZXMpOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHsKKyAgICBjaGFyICpzID0gbWF0Y2hfcnVsZV90b19zdHJpbmcgKHJ1bGUpOworCisgICAgX2RidXNfdmVyYm9zZSAoIlJlbW92ZWQgbWF0Y2ggcnVsZSAlcyBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBzLCBydWxlLT5tYXRjaGVzX2dvX3RvKTsKKyAgICBkYnVzX2ZyZWUgKHMpOworICB9CisjZW5kaWYKKyAgCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKK30KKworLyogUmVtb3ZlIGEgc2luZ2xlIHJ1bGUgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHJ1bGUgYnkgdmFsdWUgKi8KK2RidXNfYm9vbF90CitidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9ieV92YWx1ZSAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKipydWxlczsKKyAgREJ1c0xpc3QgKmxpbmsgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyBydWxlIGJ5IHZhbHVlIHdpdGggbWVzc2FnZV90eXBlICVkLCBpbnRlcmZhY2UgJXNcbiIsCisgICAgICAgICAgICAgICAgIHZhbHVlLT5tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgIHZhbHVlLT5pbnRlcmZhY2UgIT0gTlVMTCA/IHZhbHVlLT5pbnRlcmZhY2UgOiAiPG51bGw+Iik7CisKKyAgcnVsZXMgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHZhbHVlLT5tZXNzYWdlX3R5cGUsCisgICAgICB2YWx1ZS0+aW50ZXJmYWNlLCBGQUxTRSk7CisKKyAgaWYgKHJ1bGVzICE9IE5VTEwpCisgICAgeworICAgICAgLyogd2UgdHJhdmVyc2UgYmFja3dhcmQgYmVjYXVzZSBidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSgpCisgICAgICAgKiByZW1vdmVzIHRoZSBtb3N0LXJlY2VudGx5LWFkZGVkIHJ1bGUKKyAgICAgICAqLworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAocnVsZXMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgICAgICAgICBEQnVzTGlzdCAqcHJldjsKKworICAgICAgICAgIHJ1bGUgPSBsaW5rLT5kYXRhOworICAgICAgICAgIHByZXYgPSBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmsgKHJ1bGVzLCBsaW5rKTsKKworICAgICAgICAgIGlmIChtYXRjaF9ydWxlX2VxdWFsIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2xpbmsgKHJ1bGVzLCBsaW5rKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBsaW5rID0gcHJldjsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIGdpdmVuIG1hdGNoIHJ1bGUgd2Fzbid0IGZvdW5kIGFuZCBjYW4ndCBiZSByZW1vdmVkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19tYXRjaG1ha2VyX2djX3J1bGVzIChtYXRjaG1ha2VyLCB2YWx1ZS0+bWVzc2FnZV90eXBlLCB2YWx1ZS0+aW50ZXJmYWNlLAorICAgICAgcnVsZXMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcnVsZV9saXN0X3JlbW92ZV9ieV9jb25uZWN0aW9uIChEQnVzTGlzdCAgICAgICAqKnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzTWF0Y2hSdWxlICpydWxlOworICAgICAgREJ1c0xpc3QgKm5leHQ7CisKKyAgICAgIHJ1bGUgPSBsaW5rLT5kYXRhOworICAgICAgbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAocnVsZXMsIGxpbmspOworCisgICAgICBpZiAocnVsZS0+bWF0Y2hlc19nb190byA9PSBjb25uZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfbGluayAocnVsZXMsIGxpbmspOworICAgICAgICB9CisgICAgICBlbHNlIGlmICgoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUikgJiYgKnJ1bGUtPnNlbmRlciA9PSAnOicpIHx8CisgICAgICAgICAgICAgICAoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKSAmJiAqcnVsZS0+ZGVzdGluYXRpb24gPT0gJzonKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRoZSBydWxlIG1hdGNoZXMgdG8vZnJvbSBhIGJhc2Ugc2VydmljZSwgc2VlIGlmIGl0J3MgdGhlCisgICAgICAgICAgICogb25lIGJlaW5nIGRpc2Nvbm5lY3RlZCwgc2luY2Ugd2Uga25vdyB0aGlzIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAqIHdpbGwgbmV2ZXIgYmUgcmVjeWNsZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgICAgICAgIG5hbWUgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChuYW1lICE9IE5VTEwpOyAvKiBiZWNhdXNlIHdlJ3JlIGFuIGFjdGl2ZSBjb25uZWN0aW9uICovCisKKyAgICAgICAgICBpZiAoKChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHJ1bGUtPnNlbmRlciwgbmFtZSkgPT0gMCkgfHwKKyAgICAgICAgICAgICAgKChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTikgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAocnVsZS0+ZGVzdGluYXRpb24sIG5hbWUpID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9saW5rIChydWxlcywgbGluayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCit2b2lkCitidXNfbWF0Y2htYWtlcl9kaXNjb25uZWN0ZWQgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uKQoreworICBpbnQgaTsKKworICAvKiBGSVhNRQorICAgKgorICAgKiBUaGlzIHNjYW5zIGFsbCBtYXRjaCBydWxlcyBvbiB0aGUgYnVzLiBXZSBjb3VsZCBhdm9pZCB0aGF0CisgICAqIGZvciB0aGUgcnVsZXMgYmVsb25naW5nIHRvIHRoZSBjb25uZWN0aW9uLCBzaW5jZSB3ZSBrZWVwCisgICAqIGEgbGlzdCBvZiB0aG9zZTsgYnV0IGZvciB0aGUgcnVsZXMgdGhhdCBqdXN0IHJlZmVyIHRvCisgICAqIHRoZSBjb25uZWN0aW9uIHdlJ2QgbmVlZCB0byBkbyBzb21ldGhpbmcgbW9yZSBlbGFib3JhdGUuCisgICAqLworCisgIF9kYnVzX2Fzc2VydCAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIGFsbCBydWxlcyBmb3IgY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgZm9yIChpID0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRDsgaSA8IERCVVNfTlVNX01FU1NBR0VfVFlQRVM7IGkrKykKKyAgICB7CisgICAgICBSdWxlUG9vbCAqcCA9IG1hdGNobWFrZXItPnJ1bGVzX2J5X3R5cGUgKyBpOworICAgICAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgICAgIHJ1bGVfbGlzdF9yZW1vdmVfYnlfY29ubmVjdGlvbiAoJnAtPnJ1bGVzX3dpdGhvdXRfaWZhY2UsIGNvbm5lY3Rpb24pOworCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAocC0+cnVsZXNfYnlfaWZhY2UsICZpdGVyKTsKKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKippdGVtcyA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgICAgIHJ1bGVfbGlzdF9yZW1vdmVfYnlfY29ubmVjdGlvbiAoaXRlbXMsIGNvbm5lY3Rpb24pOworCisgICAgICAgICAgaWYgKCppdGVtcyA9PSBOVUxMKQorICAgICAgICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoJml0ZXIpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Nvbm5lY3Rpb25faXNfcHJpbWFyeV9vd25lciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUpCit7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIERCdXNTdHJpbmcgc3RyOworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBzZXJ2aWNlX25hbWUpOworICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzdHIpOworCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOyAvKiBTZXJ2aWNlIGRvZXNuJ3QgZXhpc3Qgc28gY29ubmVjdGlvbiBjYW4ndCBvd24gaXQuICovCisKKyAgcmV0dXJuIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSA9PSBjb25uZWN0aW9uOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hdGNoX3J1bGVfbWF0Y2hlcyAoQnVzTWF0Y2hSdWxlICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoRmxhZ3MgICAgYWxyZWFkeV9tYXRjaGVkKQoreworICBpbnQgZmxhZ3M7CisKKyAgLyogQWxsIGZlYXR1cmVzIG9mIHRoZSBtYXRjaCBydWxlIGFyZSBBTkQnZCB0b2dldGhlciwKKyAgICogc28gRkFMU0UgaWYgYW55IG9mIHRoZW0gZG9uJ3QgbWF0Y2guCisgICAqLworCisgIC8qIHNlbmRlci9hZGRyZXNzZWRfcmVjaXBpZW50IG9mICNOVUxMIG1heSBtZWFuIGJ1cyBkcml2ZXIsCisgICAqIG9yIGZvciBhZGRyZXNzZWRfcmVjaXBpZW50IG1heSBtZWFuIGEgbWVzc2FnZSB3aXRoIG5vCisgICAqIHNwZWNpZmljIHJlY2lwaWVudCAoaS5lLiBhIHNpZ25hbCkKKyAgICovCisKKyAgLyogRG9uJ3QgYm90aGVyIHJlLW1hdGNoaW5nIGZlYXR1cmVzIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBpbXBsaWNpdGx5LiAqLworICBmbGFncyA9IHJ1bGUtPmZsYWdzICYgKH5hbHJlYWR5X21hdGNoZWQpOworCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5tZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgIGlmIChydWxlLT5tZXNzYWdlX3R5cGUgIT0gZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmlmYWNlOworCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmludGVyZmFjZSAhPSBOVUxMKTsKKworICAgICAgaWZhY2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisgICAgICBpZiAoaWZhY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoc3RyY21wIChpZmFjZSwgcnVsZS0+aW50ZXJmYWNlKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9NRU1CRVIpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbWVtYmVyOworCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1lbWJlciAhPSBOVUxMKTsKKworICAgICAgbWVtYmVyID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworICAgICAgaWYgKG1lbWJlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChzdHJjbXAgKG1lbWJlciwgcnVsZS0+bWVtYmVyKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5zZW5kZXIgIT0gTlVMTCk7CisKKyAgICAgIGlmIChzZW5kZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKHJ1bGUtPnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUykgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFjb25uZWN0aW9uX2lzX3ByaW1hcnlfb3duZXIgKHNlbmRlciwgcnVsZS0+c2VuZGVyKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pCisgICAgeworICAgICAgY29uc3QgY2hhciAqZGVzdGluYXRpb247CisKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZGVzdGluYXRpb24gIT0gTlVMTCk7CisKKyAgICAgIGRlc3RpbmF0aW9uID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisgICAgICBpZiAoZGVzdGluYXRpb24gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBOVUxMKQorICAgICAgICB7ICAgICAgICAgIAorICAgICAgICAgIGlmIChzdHJjbXAgKHJ1bGUtPmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9EQlVTKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNvbm5lY3Rpb25faXNfcHJpbWFyeV9vd25lciAoYWRkcmVzc2VkX3JlY2lwaWVudCwgcnVsZS0+ZGVzdGluYXRpb24pKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9QQVRIKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnBhdGg7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+cGF0aCAhPSBOVUxMKTsKKworICAgICAgcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSk7CisgICAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChzdHJjbXAgKHBhdGgsIHJ1bGUtPnBhdGgpICE9IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZsYWdzICYgQlVTX01BVENIX0FSR1MpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworCisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgICAgICAKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBydWxlLT5hcmdzX2xlbikKKyAgICAgICAgeworICAgICAgICAgIGludCBjdXJyZW50X3R5cGU7CisgICAgICAgICAgY29uc3QgY2hhciAqZXhwZWN0ZWRfYXJnOworICAgICAgICAgIGludCBleHBlY3RlZF9sZW5ndGg7CisgICAgICAgICAgZGJ1c19ib29sX3QgaXNfcGF0aDsKKworICAgICAgICAgIGV4cGVjdGVkX2FyZyA9IHJ1bGUtPmFyZ3NbaV07CisgICAgICAgICAgZXhwZWN0ZWRfbGVuZ3RoID0gcnVsZS0+YXJnX2xlbnNbaV0gJiB+QlVTX01BVENIX0FSR19JU19QQVRIOworICAgICAgICAgIGlzX3BhdGggPSAocnVsZS0+YXJnX2xlbnNbaV0gJiBCVVNfTUFUQ0hfQVJHX0lTX1BBVEgpICE9IDA7CisgICAgICAgICAgCisgICAgICAgICAgY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcik7CisKKyAgICAgICAgICBpZiAoZXhwZWN0ZWRfYXJnICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFjdHVhbF9hcmc7CisgICAgICAgICAgICAgIGludCBhY3R1YWxfbGVuZ3RoOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfU1RSSU5HKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICBhY3R1YWxfYXJnID0gTlVMTDsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmaXRlciwgJmFjdHVhbF9hcmcpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGFjdHVhbF9hcmcgIT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgYWN0dWFsX2xlbmd0aCA9IHN0cmxlbiAoYWN0dWFsX2FyZyk7CisKKyAgICAgICAgICAgICAgaWYgKGlzX3BhdGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbF9sZW5ndGggPCBleHBlY3RlZF9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfYXJnW2FjdHVhbF9sZW5ndGggLSAxXSAhPSAnLycpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX2xlbmd0aCA8IGFjdHVhbF9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmdbZXhwZWN0ZWRfbGVuZ3RoIC0gMV0gIT0gJy8nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgIGlmIChtZW1jbXAgKGFjdHVhbF9hcmcsIGV4cGVjdGVkX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAoYWN0dWFsX2xlbmd0aCwgZXhwZWN0ZWRfbGVuZ3RoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZF9sZW5ndGggIT0gYWN0dWFsX2xlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICAgIG1lbWNtcCAoZXhwZWN0ZWRfYXJnLCBhY3R1YWxfYXJnLCBleHBlY3RlZF9sZW5ndGgpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpOworCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X3JlY2lwaWVudHNfZnJvbV9saXN0IChEQnVzTGlzdCAgICAgICAqKnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICoqcmVjaXBpZW50c19wKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBpZiAocnVsZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAocnVsZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgICAgIHsKKyAgICAgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2hlY2tpbmcgd2hldGhlciBtZXNzYWdlIG1hdGNoZXMgcnVsZSAlcyBmb3IgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcywgcnVsZS0+bWF0Y2hlc19nb190byk7CisgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKG1hdGNoX3J1bGVfbWF0Y2hlcyAocnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUgfCBCVVNfTUFUQ0hfSU5URVJGQUNFKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSdWxlIG1hdGNoZWRcbiIpOworCisgICAgICAgICAgLyogQXBwZW5kIHRvIHRoZSBsaXN0IGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSAqLworICAgICAgICAgIGlmIChidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wIChydWxlLT5tYXRjaGVzX2dvX3RvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmVjaXBpZW50c19wLCBydWxlLT5tYXRjaGVzX2dvX3RvKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ29ubmVjdGlvbiBhbHJlYWR5IHJlY2VpdmluZyB0aGlzIG1lc3NhZ2UsIHNvIG5vdCBhZGRpbmcgYWdhaW5cbiIpOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHJ1bGVzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2htYWtlcl9nZXRfcmVjaXBpZW50cyAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqKnJlY2lwaWVudHNfcCkKK3sKKyAgaW50IHR5cGU7CisgIGNvbnN0IGNoYXIgKmludGVyZmFjZTsKKyAgREJ1c0xpc3QgKipuZWl0aGVyLCAqKmp1c3RfdHlwZSwgKipqdXN0X2lmYWNlLCAqKmJvdGg7CisKKyAgX2RidXNfYXNzZXJ0ICgqcmVjaXBpZW50c19wID09IE5VTEwpOworCisgIC8qIFRoaXMgYXZvaWRzIHNlbmRpbmcgc2FtZSBtZXNzYWdlIHRvIHRoZSBzYW1lIGNvbm5lY3Rpb24gdHdpY2UuCisgICAqIFB1cnBvc2Ugb2YgdGhlIHN0YW1wIGluc3RlYWQgb2YgYSBib29sIGlzIHRvIGF2b2lkIGl0ZXJhdGluZyBvdmVyCisgICAqIGFsbCBjb25uZWN0aW9ucyByZXNldHRpbmcgdGhlIGJvb2wgZWFjaCB0aW1lLgorICAgKi8KKyAgYnVzX2Nvbm5lY3Rpb25zX2luY3JlbWVudF9zdGFtcCAoY29ubmVjdGlvbnMpOworCisgIC8qIGFkZHJlc3NlZF9yZWNpcGllbnQgaXMgYWxyZWFkeSByZWNlaXZpbmcgdGhlIG1lc3NhZ2UsIGRvbid0IGFkZCB0byBsaXN0LgorICAgKiBOVUxMIGFkZHJlc3NlZF9yZWNpcGllbnQgbWVhbnMgZWl0aGVyIGJ1cyBkcml2ZXIsIG9yIHRoaXMgaXMgYSBzaWduYWwKKyAgICogYW5kIHRodXMgbGFja3MgYSBzcGVjaWZpYyBhZGRyZXNzZWRfcmVjaXBpZW50LgorICAgKi8KKyAgaWYgKGFkZHJlc3NlZF9yZWNpcGllbnQgIT0gTlVMTCkKKyAgICBidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wIChhZGRyZXNzZWRfcmVjaXBpZW50KTsKKworICB0eXBlID0gZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKTsKKyAgaW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworCisgIG5laXRoZXIgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQsCisgICAgICBOVUxMLCBGQUxTRSk7CisgIGp1c3RfdHlwZSA9IGp1c3RfaWZhY2UgPSBib3RoID0gTlVMTDsKKworICBpZiAoaW50ZXJmYWNlICE9IE5VTEwpCisgICAganVzdF9pZmFjZSA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwKKyAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCwgaW50ZXJmYWNlLCBGQUxTRSk7CisKKyAgaWYgKHR5cGUgPiBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEICYmIHR5cGUgPCBEQlVTX05VTV9NRVNTQUdFX1RZUEVTKQorICAgIHsKKyAgICAgIGp1c3RfdHlwZSA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgdHlwZSwgTlVMTCwgRkFMU0UpOworCisgICAgICBpZiAoaW50ZXJmYWNlICE9IE5VTEwpCisgICAgICAgIGJvdGggPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHR5cGUsIGludGVyZmFjZSwgRkFMU0UpOworICAgIH0KKworICBpZiAoIShnZXRfcmVjaXBpZW50c19mcm9tX2xpc3QgKG5laXRoZXIsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZWNpcGllbnRzX3ApICYmCisgICAgICAgIGdldF9yZWNpcGllbnRzX2Zyb21fbGlzdCAoanVzdF9pZmFjZSwgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlY2lwaWVudHNfcCkgJiYKKyAgICAgICAgZ2V0X3JlY2lwaWVudHNfZnJvbV9saXN0IChqdXN0X3R5cGUsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZWNpcGllbnRzX3ApICYmCisgICAgICAgIGdldF9yZWNpcGllbnRzX2Zyb21fbGlzdCAoYm90aCwgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlY2lwaWVudHNfcCkpKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKHJlY2lwaWVudHNfcCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIEJ1c01hdGNoUnVsZSoKK2NoZWNrX3BhcnNlIChkYnVzX2Jvb2xfdCBzaG91bGRfc3VjY2VlZCwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0KQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXh0KTsKKyAgCisgIHJ1bGUgPSBidXNfbWF0Y2hfcnVsZV9wYXJzZSAoTlVMTCwgJnN0ciwgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgIHsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoc2hvdWxkX3N1Y2NlZWQgJiYgcnVsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcGFyc2U6ICVzOiAlczogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmICghc2hvdWxkX3N1Y2NlZWQgJiYgcnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZmFpbCB0byBwYXJzZTogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiBydWxlOworfQorCitzdGF0aWMgdm9pZAorYXNzZXJ0X2xhcmdlX3J1bGUgKEJ1c01hdGNoUnVsZSAqcnVsZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1NFTkRFUik7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRU1CRVIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIKTsKKworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmludGVyZmFjZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5tZW1iZXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+c2VuZGVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmRlc3RpbmF0aW9uICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnBhdGggIT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmludGVyZmFjZSwgIm9yZy5mcmVlZGVza3RvcC5EQnVzSW50ZXJmYWNlIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5zZW5kZXIsICJvcmcuZnJlZWRlc2t0b3AuREJ1c1NlbmRlciIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+bWVtYmVyLCAiRm9vIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5wYXRoLCAiL2Jhci9mb28iKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmRlc3RpbmF0aW9uLCAiOjQ1MjM0NS4zNCIpID09IDApOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfcGFyc2luZyAodm9pZCAqZGF0YSkKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1c1NlbmRlcicsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1c0ludGVyZmFjZScsbWVtYmVyPSdGb28nLHBhdGg9Jy9iYXIvZm9vJyxkZXN0aW5hdGlvbj0nOjQ1MjM0NS4zNCciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc3NlcnRfbGFyZ2VfcnVsZSAocnVsZSk7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIFdpdGggZXh0cmEgd2hpdGVzcGFjZSBhbmQgdXNlbGVzcyBxdW90ZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiICAgIHR5cGU9J3NpZ25hbCcsICBcdHNlbmRlcj0nb3JnLmZyZWVkZXMnJ2t0b3AuREJ1c1NlbmRlcicsICAgaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1c0ludGVyZmFjZScnJycnLCBcdG1lbWJlcj0nRm9vJyxwYXRoPScvYmFyL2ZvbycsZGVzdGluYXRpb249Jzo0NTIzNDUuMzQnJycnJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzc2VydF9sYXJnZV9ydWxlIChydWxlKTsKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisKKworICAvKiBBIHNpbXBsZSBzaWduYWwgY29ubmVjdGlvbiAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJ0eXBlPSdzaWduYWwnLHBhdGg9Jy9mb28nLGludGVyZmFjZT0nb3JnLkJhciciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX01FU1NBR0VfVFlQRSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1BBVEgpOworCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnBhdGggIT0gTlVMTCk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5pbnRlcmZhY2UsICJvcmcuQmFyIikgPT0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+cGF0aCwgIi9mb28iKSA9PSAwKTsKKyAgCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIGFyZ04gKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnMD0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzBdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisgIAorICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmcxPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDIpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzBdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzFdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzJdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMV0sICJmb28iKSA9PSAwKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmcyPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDMpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzBdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzFdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzJdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzNdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbMl0sICJmb28iKSA9PSAwKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKyAgCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgImFyZzQwPSdmb28nIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSBCVVNfTUFUQ0hfQVJHUyk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NfbGVuID09IDQxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s0MF0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbNDFdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPmFyZ3NbNDBdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisgIAorICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmc2Mz0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSA2NCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMF0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMV0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbNjNdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzY0XSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzYzXSwgImZvbyIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorICAKKyAgLyogVG9vLWxhcmdlIGFyZ04gKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzMwMD0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmc2ND0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogTm8gTiBpbiBhcmdOICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmc9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJndj0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmczanVuaz0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmd1bWVudD0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIAorICAvKiBSZWplY3QgZHVwbGljYXRlcyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAidHlwZT0nc2lnbmFsJyx0eXBlPSdtZXRob2RfY2FsbCciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIER1cGxpY2F0ZXMgd2l0aCB0aGUgYXJnTiBjb2RlICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwPSdmb28nLGFyZzA9J2JhciciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMz0nZm9vJyxhcmczPSdiYXInIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzMwPSdmb28nLGFyZzMwPSdiYXInIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgCisgIC8qIFJlamVjdCBicm9rZW4ga2V5cyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYmxhaD0nc2lnbmFsJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogUmVqZWN0IGJyb2tlbiB2YWx1ZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInR5cGU9J2Nob3VpbiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiaW50ZXJmYWNlPSdhYmNAZGVmKysnIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInNlcnZpY2U9J3lvdXBpJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogQWxsb3cgZW1wdHkgcnVsZSAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICIiKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IDApOworICAgICAgCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisgIC8qIEFsbC13aGl0ZXNwYWNlIHJ1bGUgaXMgdGhlIHNhbWUgYXMgZW1wdHkgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiICAgIFx0Iik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSAwKTsKKyAgICAgIAorICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBCdXQgd2l0aCBub24td2hpdGVzcGFjZSBjaGFycyBhbmQgbm8gPXZhbHVlLCBpdCdzIG5vdCBPSyAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAidHlwZSIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKmZpcnN0OworICBjb25zdCBjaGFyICpzZWNvbmQ7Cit9IGVxdWFsaXR5X3Rlc3RzW10gPSB7CisgIHsgInR5cGU9J3NpZ25hbCciLCAidHlwZT0nc2lnbmFsJyIgfSwKKyAgeyAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J2Zvby5iYXInIiwgImludGVyZmFjZT0nZm9vLmJhcicsdHlwZT0nc2lnbmFsJyIgfSwKKyAgeyAidHlwZT0nc2lnbmFsJyxtZW1iZXI9J2JhciciLCAibWVtYmVyPSdiYXInLHR5cGU9J3NpZ25hbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxzZW5kZXI9JzoxLjAnIiwgInNlbmRlcj0nOjEuMCcsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsZGVzdGluYXRpb249JzoxLjAnIiwgImRlc3RpbmF0aW9uPSc6MS4wJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxwYXRoPScvZm9vL2JhciciLCAicGF0aD0nL2Zvby9iYXInLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGFyZzA9J2JsYWgnIiwgImFyZzA9J2JsYWgnLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGFyZzA9J2JvbyciLCAiYXJnMD0nYm9vJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxhcmcwPSdibGFoJyxhcmcxPSdiYXonIiwgImFyZzA9J2JsYWgnLGFyZzE9J2JheicsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsYXJnMz0nZm9vc2gnIiwgImFyZzM9J2Zvb3NoJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgImFyZzM9J2Zvb2wnIiwgImFyZzM9J2Zvb2wnIiB9LAorICB7ICJtZW1iZXI9J2Zvb2QnIiwgIm1lbWJlcj0nZm9vZCciIH0KK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VxdWFsaXR5ICh2b2lkKQoreworICBpbnQgaTsKKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGVxdWFsaXR5X3Rlc3RzKSkKKyAgICB7CisgICAgICBCdXNNYXRjaFJ1bGUgKmZpcnN0OworICAgICAgQnVzTWF0Y2hSdWxlICpzZWNvbmQ7CisgICAgICBpbnQgajsKKyAgICAgIAorICAgICAgZmlyc3QgPSBjaGVja19wYXJzZSAoVFJVRSwgZXF1YWxpdHlfdGVzdHNbaV0uZmlyc3QpOworICAgICAgX2RidXNfYXNzZXJ0IChmaXJzdCAhPSBOVUxMKTsKKyAgICAgIHNlY29uZCA9IGNoZWNrX3BhcnNlIChUUlVFLCBlcXVhbGl0eV90ZXN0c1tpXS5zZWNvbmQpOworICAgICAgX2RidXNfYXNzZXJ0IChzZWNvbmQgIT0gTlVMTCk7CisKKyAgICAgIGlmICghbWF0Y2hfcnVsZV9lcXVhbCAoZmlyc3QsIHNlY29uZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgicnVsZSAlcyBhbmQgJXMgc2hvdWxkIGhhdmUgYmVlbiBlcXVhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBlcXVhbGl0eV90ZXN0c1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBlcXVhbGl0eV90ZXN0c1tpXS5zZWNvbmQpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChzZWNvbmQpOworCisgICAgICAvKiBDaGVjayB0aGF0IHRoZSBydWxlIGlzIG5vdCBlcXVhbCB0byBhbnkgb2YgdGhlCisgICAgICAgKiBvdGhlcnMgYmVzaWRlcyBpdHMgcGFpciBtYXRjaAorICAgICAgICovCisgICAgICBqID0gMDsKKyAgICAgIHdoaWxlIChqIDwgX0RCVVNfTl9FTEVNRU5UUyAoZXF1YWxpdHlfdGVzdHMpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgIT0gaikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2Vjb25kID0gY2hlY2tfcGFyc2UgKFRSVUUsIGVxdWFsaXR5X3Rlc3RzW2pdLnNlY29uZCk7CisKKyAgICAgICAgICAgICAgaWYgKG1hdGNoX3J1bGVfZXF1YWwgKGZpcnN0LCBzZWNvbmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJydWxlICVzIGFuZCAlcyBzaG91bGQgbm90IGhhdmUgYmVlbiBlcXVhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsaXR5X3Rlc3RzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxpdHlfdGVzdHNbal0uc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChzZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgICsrajsKKyAgICAgICAgfQorCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoZmlyc3QpOworCisgICAgICArK2k7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhcioKK3Nob3VsZF9tYXRjaF9tZXNzYWdlXzFbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCciLAorICAibWVtYmVyPSdGcm9iYXRlZCciLAorICAiYXJnMD0nZm9vYmFyJyIsCisgICJ0eXBlPSdzaWduYWwnLG1lbWJlcj0nRnJvYmF0ZWQnIiwKKyAgInR5cGU9J3NpZ25hbCcsbWVtYmVyPSdGcm9iYXRlZCcsYXJnMD0nZm9vYmFyJyIsCisgICJtZW1iZXI9J0Zyb2JhdGVkJyxhcmcwPSdmb29iYXInIiwKKyAgInR5cGU9J3NpZ25hbCcsYXJnMD0nZm9vYmFyJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzFbXSA9IHsKKyAgInR5cGU9J21ldGhvZF9jYWxsJyIsCisgICJ0eXBlPSdlcnJvciciLAorICAidHlwZT0nbWV0aG9kX3JldHVybiciLAorICAidHlwZT0nc2lnbmFsJyxtZW1iZXI9J09vcHNlZCciLAorICAiYXJnMD0nYmxhaCciLAorICAiYXJnMT0nZm9vYmFyJyIsCisgICJhcmcyPSdmb29iYXInIiwKKyAgImFyZzM9J2Zvb2JhciciLAorICAiYXJnMD0nMyciLAorICAiYXJnMT0nMyciLAorICAiYXJnMD0nZm9vYmFyJyxhcmcxPSdhYmNkZWYnIiwKKyAgImFyZzA9J2Zvb2JhcicsYXJnMT0nYWJjZGVmJyxhcmcyPSdhYmNkZWZnaGknLGFyZzM9J2FiY2RlZmdoaScsYXJnND0nYWJjZGVmZ2hpJyIsCisgICJhcmcwPSdmb29iYXInLGFyZzE9J2FiY2RlZicsYXJnND0nYWJjZGVmZ2hpJyxhcmczPSdhYmNkZWZnaGknLGFyZzI9J2FiY2RlZmdoaSciLAorICBOVUxMCit9OworCitzdGF0aWMgdm9pZAorY2hlY2tfbWF0Y2hlcyAoZGJ1c19ib29sX3QgIGV4cGVjdGVkX3RvX21hdGNoLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG51bWJlciwKKyAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnJ1bGVfdGV4dCkKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworICBkYnVzX2Jvb2xfdCBtYXRjaGVkOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgcnVsZV90ZXh0KTsKKyAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworCisgIC8qIFdlIGNhbid0IHRlc3Qgc2VuZGVyL2Rlc3RpbmF0aW9uIHJ1bGVzIHNpbmNlIHdlIHBhc3MgTlVMTCBoZXJlICovCisgIG1hdGNoZWQgPSBtYXRjaF9ydWxlX21hdGNoZXMgKHJ1bGUsIE5VTEwsIE5VTEwsIG1lc3NhZ2UsIDApOworCisgIGlmIChtYXRjaGVkICE9IGV4cGVjdGVkX3RvX21hdGNoKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBydWxlICVzIHRvICVzIG1lc3NhZ2UgJWQsIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHJ1bGVfdGV4dCwgZXhwZWN0ZWRfdG9fbWF0Y2ggPworICAgICAgICAgICAgICAgICAgIm1hdGNoIiA6ICJub3QgbWF0Y2giLCBudW1iZXIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21hdGNoaW5nIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbnVtYmVyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzaG91bGRfbWF0Y2gsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnNob3VsZF9ub3RfbWF0Y2gpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoc2hvdWxkX21hdGNoW2ldICE9IE5VTEwpCisgICAgeworICAgICAgY2hlY2tfbWF0Y2hlcyAoVFJVRSwgbnVtYmVyLCBtZXNzYWdlLCBzaG91bGRfbWF0Y2hbaV0pOworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKHNob3VsZF9ub3RfbWF0Y2hbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGVja19tYXRjaGVzIChGQUxTRSwgbnVtYmVyLCBtZXNzYWdlLCBzaG91bGRfbm90X21hdGNoW2ldKTsKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21hdGNoaW5nICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTE7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKworICBtZXNzYWdlMSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTEgIT0gTlVMTCk7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UxLCAiRnJvYmF0ZWQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICB2X1NUUklORyA9ICJmb29iYXIiOworICB2X0lOVDMyID0gMzsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAKKyAgY2hlY2tfbWF0Y2hpbmcgKG1lc3NhZ2UxLCAxLAorICAgICAgICAgICAgICAgICAgc2hvdWxkX21hdGNoX21lc3NhZ2VfMSwKKyAgICAgICAgICAgICAgICAgIHNob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8xKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTEpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3NpZ25hbHNfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKworICBtYXRjaG1ha2VyID0gYnVzX21hdGNobWFrZXJfbmV3ICgpOworICBidXNfbWF0Y2htYWtlcl9yZWYgKG1hdGNobWFrZXIpOworICBidXNfbWF0Y2htYWtlcl91bnJlZiAobWF0Y2htYWtlcik7CisgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChtYXRjaG1ha2VyKTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgicGFyc2luZyBtYXRjaCBydWxlcyIsIHRlc3RfcGFyc2luZywgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2luZyBtYXRjaCBydWxlcyB0ZXN0IGZhaWxlZCIpOworCisgIHRlc3RfZXF1YWxpdHkgKCk7CisKKyAgdGVzdF9tYXRjaGluZyAoKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvc2lnbmFscy5oIGIvZGJ1cy0xLjQuMTAvYnVzL3NpZ25hbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIxZDJkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL3NpZ25hbHMuaApAQCAtMCwwICsxLDg4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHNpZ25hbHMuaCAgQnVzIHNpZ25hbCBjb25uZWN0aW9uIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19TSUdOQUxTX0gKKyNkZWZpbmUgQlVTX1NJR05BTFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgQlVTX01BVENIX01FU1NBR0VfVFlQRSA9IDEgPDwgMCwKKyAgQlVTX01BVENIX0lOVEVSRkFDRSAgICA9IDEgPDwgMSwKKyAgQlVTX01BVENIX01FTUJFUiAgICAgICA9IDEgPDwgMiwKKyAgQlVTX01BVENIX1NFTkRFUiAgICAgICA9IDEgPDwgMywKKyAgQlVTX01BVENIX0RFU1RJTkFUSU9OICA9IDEgPDwgNCwKKyAgQlVTX01BVENIX1BBVEggICAgICAgICA9IDEgPDwgNSwKKyAgQlVTX01BVENIX0FSR1MgICAgICAgICA9IDEgPDwgNgorfSBCdXNNYXRjaEZsYWdzOworCitCdXNNYXRjaFJ1bGUqIGJ1c19tYXRjaF9ydWxlX25ldyAgIChEQnVzQ29ubmVjdGlvbiAqbWF0Y2hlc19nb190byk7CitCdXNNYXRjaFJ1bGUqIGJ1c19tYXRjaF9ydWxlX3JlZiAgIChCdXNNYXRjaFJ1bGUgICAqcnVsZSk7Cit2b2lkICAgICAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChCdXNNYXRjaFJ1bGUgICAqcnVsZSk7CisKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9tZXNzYWdlX3R5cGUgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9pbnRlcmZhY2UgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICppbnRlcmZhY2UpOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X21lbWJlciAgICAgICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm1lbWJlcik7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfc2VuZGVyICAgICAgIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc2VuZGVyKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9kZXN0aW5hdGlvbiAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpkZXN0aW5hdGlvbik7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfcGF0aCAgICAgICAgIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqcGF0aCk7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfYXJnICAgICAgICAgIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19wYXRoKTsKKworQnVzTWF0Y2hSdWxlKiBidXNfbWF0Y2hfcnVsZV9wYXJzZSAoREJ1c0Nvbm5lY3Rpb24gICAqbWF0Y2hlc19nb190bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnJ1bGVfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworQnVzTWF0Y2htYWtlciogYnVzX21hdGNobWFrZXJfbmV3ICAgKHZvaWQpOworQnVzTWF0Y2htYWtlciogYnVzX21hdGNobWFrZXJfcmVmICAgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIpOwordm9pZCAgICAgICAgICAgYnVzX21hdGNobWFrZXJfdW5yZWYgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIpOworCitkYnVzX2Jvb2xfdCBidXNfbWF0Y2htYWtlcl9hZGRfcnVsZSAgICAgICAgICAgICAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICAqcnVsZSk7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9ieV92YWx1ZSAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICBidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZSAgICAgICAgICAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICAqcnVsZSk7Cit2b2lkICAgICAgICBidXNfbWF0Y2htYWtlcl9kaXNjb25uZWN0ZWQgICAgICAgICAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbik7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2htYWtlcl9nZXRfcmVjaXBpZW50cyAgICAgICAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqKnJlY2lwaWVudHNfcCk7CisKKyNlbmRpZiAvKiBCVVNfU0lHTkFMU19IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvc3lzdGVtLmNvbmYuaW4gYi9kYnVzLTEuNC4xMC9idXMvc3lzdGVtLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNGNjNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy9zeXN0ZW0uY29uZi5pbgpAQCAtMCwwICsxLDgzIEBACis8IS0tIFRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRyb2xzIHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzLgorICAgICBBZGQgYSBzeXN0ZW0tbG9jYWwuY29uZiBhbmQgZWRpdCB0aGF0IHJhdGhlciB0aGFuIGNoYW5naW5nIHRoaXMgCisgICAgIGZpbGUgZGlyZWN0bHkuIC0tPgorCis8IS0tIE5vdGUgdGhhdCB0aGVyZSBhcmUgYW55IG51bWJlciBvZiB3YXlzIHlvdSBjYW4gaG9zZSB5b3Vyc2VsZgorICAgICBzZWN1cml0eS13aXNlIGJ5IHNjcmV3aW5nIHVwIHRoaXMgZmlsZTsgaW4gcGFydGljdWxhciwgeW91CisgICAgIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gbGlzdGVuIG9uIGFueSBtb3JlIGFkZHJlc3NlcywgYWRkIGFueSBtb3JlCisgICAgIGF1dGggbWVjaGFuaXNtcywgcnVuIGFzIGEgZGlmZmVyZW50IHVzZXIsIGV0Yy4gLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisKKyAgPCEtLSBPdXIgd2VsbC1rbm93biBidXMgdHlwZSwgZG8gbm90IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zeXN0ZW08L3R5cGU+CisKKyAgPCEtLSBSdW4gYXMgc3BlY2lhbCB1c2VyIC0tPgorICA8dXNlcj5AREJVU19VU0VSQDwvdXNlcj4KKworICA8IS0tIEZvcmsgaW50byBkYWVtb24gbW9kZSAtLT4KKyAgPGZvcmsvPgorCisgIDwhLS0gV2UgdXNlIHN5c3RlbSBzZXJ2aWNlIGxhdW5jaGluZyB1c2luZyBhIGhlbHBlciAtLT4KKyAgPHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycy8+CisKKyAgPCEtLSBUaGlzIGlzIGEgc2V0dWlkIGhlbHBlciB0aGF0IGlzIHVzZWQgdG8gbGF1bmNoIHN5c3RlbSBzZXJ2aWNlcyAtLT4KKyAgPHNlcnZpY2VoZWxwZXI+QERCVVNfTElCRVhFQ0RJUkAvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlcjwvc2VydmljZWhlbHBlcj4KKworICA8IS0tIFdyaXRlIGEgcGlkIGZpbGUgLS0+CisgIDxwaWRmaWxlPkBEQlVTX1NZU1RFTV9QSURfRklMRUA8L3BpZGZpbGU+CisKKyAgPCEtLSBFbmFibGUgbG9nZ2luZyB0byBzeXNsb2cgLS0+CisgIDxzeXNsb2cvPgorCisgIDwhLS0gT25seSBhbGxvdyBzb2NrZXQtY3JlZGVudGlhbHMtYmFzZWQgYXV0aGVudGljYXRpb24gLS0+CisgIDxhdXRoPkVYVEVSTkFMPC9hdXRoPgorCisgIDwhLS0gT25seSBsaXN0ZW4gb24gYSBsb2NhbCBzb2NrZXQuIChhYnN0cmFjdD0vcGF0aC90by9zb2NrZXQgCisgICAgICAgbWVhbnMgdXNlIGFic3RyYWN0IG5hbWVzcGFjZSwgZG9uJ3QgcmVhbGx5IGNyZWF0ZSBmaWxlc3lzdGVtIAorICAgICAgIGZpbGU7IG9ubHkgTGludXggc3VwcG9ydHMgdGhpcy4gVXNlIHBhdGg9L3doYXRldmVyIG9uIG90aGVyIAorICAgICAgIHN5c3RlbXMuKSAtLT4KKyAgPGxpc3Rlbj5AREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0A8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsIHVzZXJzIGNhbiBjb25uZWN0IHRvIHN5c3RlbSBidXMgLS0+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKworICAgIDwhLS0gSG9sZXMgbXVzdCBiZSBwdW5jaGVkIGluIHNlcnZpY2UgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IKKyAgICAgICAgIG5hbWUgb3duZXJzaGlwIGFuZCBzZW5kaW5nIG1ldGhvZCBjYWxscyAtLT4KKyAgICA8ZGVueSBvd249IioiLz4KKyAgICA8ZGVueSBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisKKyAgICA8IS0tIFNpZ25hbHMgYW5kIHJlcGx5IG1lc3NhZ2VzIChtZXRob2QgcmV0dXJucywgZXJyb3JzKSBhcmUgYWxsb3dlZAorICAgICAgICAgYnkgZGVmYXVsdCAtLT4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJzaWduYWwiLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgc2VuZF90eXBlPSJlcnJvciIvPgorCisgICAgPCEtLSBBbGwgbWVzc2FnZXMgbWF5IGJlIHJlY2VpdmVkIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0iZXJyb3IiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJzaWduYWwiLz4KKworICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIHRhbGsgdG8gdGhlIG1lc3NhZ2UgYnVzIC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIvPgorICAgIDwhLS0gQnV0IGRpc2FsbG93IHNvbWUgc3BlY2lmaWMgYnVzIHNlcnZpY2VzIC0tPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX21lbWJlcj0iVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50Ii8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gQ29uZmlnIGZpbGVzIGFyZSBwbGFjZWQgaGVyZSB0aGF0IGFtb25nIG90aGVyIHRoaW5ncywgcHVuY2ggCisgICAgICAgaG9sZXMgaW4gdGhlIGFib3ZlIHBvbGljeSBmb3Igc3BlY2lmaWMgc2VydmljZXMuIC0tPgorICA8aW5jbHVkZWRpcj5zeXN0ZW0uZDwvaW5jbHVkZWRpcj4KKworICA8IS0tIFRoaXMgaXMgaW5jbHVkZWQgbGFzdCBzbyBsb2NhbCBjb25maWd1cmF0aW9uIGNhbiBvdmVycmlkZSB3aGF0J3MgCisgICAgICAgaW4gdGhpcyBzdGFuZGFyZCBmaWxlIC0tPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5zeXN0ZW0tbG9jYWwuY29uZjwvaW5jbHVkZT4KKworICA8aW5jbHVkZSBpZl9zZWxpbnV4X2VuYWJsZWQ9InllcyIgc2VsaW51eF9yb290X3JlbGF0aXZlPSJ5ZXMiPmNvbnRleHRzL2RidXNfY29udGV4dHM8L2luY2x1ZGU+CisKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jIGIvZGJ1cy0xLjQuMTAvYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzZiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvdGVzdC1sYXVuY2gtaGVscGVyLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdGVzdC1tYWluLmMgIG1haW4oKSBmb3IgdGhlIE9PTSBjaGVjayBvZiB0aGUgbGF1bmNoIGhlbHBlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1oZWxwZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVW5pdCB0ZXN0IGZhaWxlZDogJXNcbiIsIGZhaWx1cmUpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzIChjb25zdCBjaGFyICpuYW1lKQoreworICBkYnVzX3NodXRkb3duICgpOworICAKKyAgcHJpbnRmICgiJXM6IGNoZWNraW5nIGZvciBtZW1sZWFrc1xuIiwgbmFtZSk7CisgIGlmIChfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlZCBkYnVzX21hbGxvYyBibG9ja3Mgd2VyZSBub3QgZnJlZWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSk7CisgICAgICBkaWUgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcG9zdF9ob29rIChjb25zdCBjaGFyICpuYW1lKQoreworICBjaGVja19tZW1sZWFrcyAobmFtZSk7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisKKyNpZmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTQorCisvKiByZXR1cm5zIHRydWUgaWYgZ29vZCB0aGluZ3MgaGFwcGVuLCBvciBpZiB3ZSBnZXQgT09NICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX2hlbHBlcl9vb21fdGVzdCAodm9pZCAqZGF0YSkKK3sKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgREJ1c0Vycm9yIGVycm9yOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgc2VydmljZSA9IChjb25zdCBjaGFyICopIGRhdGE7CisgIHJldHZhbCA9IFRSVUU7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBpZiAoIXJ1bl9sYXVuY2hfaGVscGVyIChzZXJ2aWNlLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICAvKiB3ZSBmYWlsZWQsIGJ1dCBhIE9PTSBpcyBnb29kICovCisgICAgICBpZiAoIWRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkZBSUxFRCBTRUxGIFRFU1Q6IEVycm9yOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiB3ZSBzdWNjZWVkZWQsIHlheSEgKi8KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJmVycm9yKTsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGNvbnN0IGNoYXIgKmRpcjsKKyAgREJ1c1N0cmluZyBjb25maWdfZmlsZTsKKworICBpZiAoYXJnYyA+IDEpCisgICAgZGlyID0gYXJndlsxXTsKKyAgZWxzZQorICAgIGRpciA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIik7CisKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk11c3Qgc3BlY2lmeSB0ZXN0IGRhdGEgZGlyZWN0b3J5IGFzIGFyZ3ZbMV0gb3IgaW4gREJVU19URVNUX0RBVEEgZW52IHZhcmlhYmxlXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBwcmludGYgKCIlczogUnVubmluZyBsYXVuY2ggaGVscGVyIE9PTSBjaGVja3NcbiIsIGFyZ3ZbMF0pOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb25maWdfZmlsZSkpCisgICAgcmV0dXJuIDE7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBkaXIpKQorICAgIHJldHVybiAxOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb25maWdfZmlsZSwgIi92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYiKSkKKyAgICByZXR1cm4gMTsKKworICAvKiB1c2UgYSBjb25maWcgZmlsZSB0aGF0IHdpbGwgYWN0dWFsbHkgd29yay4uLiAqLworICBfZGJ1c19zZXRlbnYgKCJURVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHIiwKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZjb25maWdfZmlsZSkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworCisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2FjdGl2YXRpb25faGVscGVyX29vbV90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiKSkKKyAgICBkaWUgKCJPT00gZmFpbGVkIik7CisKKyAgdGVzdF9wb3N0X2hvb2sgKGFyZ3ZbMF0pOworCisgIHByaW50ZiAoIiVzOiBTdWNjZXNzXG4iLCBhcmd2WzBdKTsKKworICByZXR1cm4gMDsKKyNlbHNlIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworICBwcmludGYgKCJOb3QgY29tcGlsZWQgd2l0aCB0ZXN0IHN1cHBvcnRcbiIpOworICAKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL3Rlc3QtbWFpbi5jIGIvZGJ1cy0xLjQuMTAvYnVzL3Rlc3QtbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDM5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvdGVzdC1tYWluLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdGVzdC1tYWluLmMgIG1haW4oKSBmb3IgbWFrZSBjaGVjaworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oPgorI2luY2x1ZGUgInNlbGludXguaCIKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVuaXQgdGVzdCBmYWlsZWQ6ICVzXG4iLCBmYWlsdXJlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKyAgCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsIG5hbWUpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkpOworICAgICAgZGllICgibWVtbGVha3MiKTsKKyAgICB9Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCitzdGF0aWMgREJ1c0luaXRpYWxGRHMgKmluaXRpYWxfZmRzID0gTlVMTDsKKworc3RhdGljIHZvaWQKK3Rlc3RfcHJlX2hvb2sgKHZvaWQpCit7CisgIAorICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX1NFTElOVVgiKQorICAgICAgJiYgKCFidXNfc2VsaW51eF9wcmVfaW5pdCAoKQorCSAgfHwgIWJ1c19zZWxpbnV4X2Z1bGxfaW5pdCAoKSkpCisgICAgZGllICgiY291bGQgbm90IGluaXQgc2VsaW51eCBzdXBwb3J0Iik7CisKKyAgaW5pdGlhbF9mZHMgPSBfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICgpOworfQorCitzdGF0aWMgY2hhciAqcHJvZ25hbWUgPSAiIjsKKworc3RhdGljIHZvaWQKK3Rlc3RfcG9zdF9ob29rICh2b2lkKQoreworICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX1NFTElOVVgiKSkKKyAgICBidXNfc2VsaW51eF9zaHV0ZG93biAoKTsKKyAgY2hlY2tfbWVtbGVha3MgKHByb2duYW1lKTsKKworICBfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChpbml0aWFsX2Zkcyk7CisgIGluaXRpYWxfZmRzID0gTlVMTDsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBjb25zdCBjaGFyICpkaXI7CisgIGNvbnN0IGNoYXIgKm9ubHk7CisgIERCdXNTdHJpbmcgdGVzdF9kYXRhX2RpcjsKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIGRpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICBkaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpOworCisgIGlmIChhcmdjID4gMikKKyAgICBvbmx5ID0gYXJndlsyXTsKKyAgZWxzZQorICAgIG9ubHkgPSBOVUxMOworCisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJNdXN0IHNwZWNpZnkgdGVzdCBkYXRhIGRpcmVjdG9yeSBhcyBhcmd2WzFdIG9yIGluIERCVVNfVEVTVF9EQVRBIGVudiB2YXJpYWJsZVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0ZXN0X2RhdGFfZGlyLCBkaXIpOworCisgIGlmICghX2RidXNfdGhyZWFkc19pbml0X2RlYnVnICgpKQorICAgIGRpZSAoImluaXRpYWxpemluZyBkZWJ1ZyB0aHJlYWRzIik7CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJleHBpcmUtbGlzdCIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIGV4cGlyZSBsaXN0IHRlc3RcbiIsIGFyZ3ZbMF0pOworICAgICAgaWYgKCFidXNfZXhwaXJlX2xpc3RfdGVzdCAoJnRlc3RfZGF0YV9kaXIpKQorICAgICAgICBkaWUgKCJleHBpcmUgbGlzdCIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiY29uZmlnLXBhcnNlciIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIGNvbmZpZyBmaWxlIHBhcnNlciB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfdGVzdCAoJnRlc3RfZGF0YV9kaXIpKQorICAgICAgICBkaWUgKCJwYXJzZXIiKTsKKyAgICAgIHRlc3RfcG9zdF9ob29rICgpOworICAgIH0KKworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgInBvbGljeSIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHBvbGljeSB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX3BvbGljeV90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoInBvbGljeSIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAic2lnbmFscyIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHNpZ25hbHMgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19zaWduYWxzX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgic2lnbmFscyIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiZGlzcGF0Y2gtc2hhMSIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIFNIQTEgY29ubmVjdGlvbiB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCAoJnRlc3RfZGF0YV9kaXIpKQorICAgICAgICBkaWUgKCJzaGExIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJkaXNwYXRjaCIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIG1lc3NhZ2UgZGlzcGF0Y2ggdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpIAorICAgICAgICBkaWUgKCJkaXNwYXRjaCIpOworICAgICAgdGVzdF9wb3N0X2hvb2sgKCk7CisgICAgfQorCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiYWN0aXZhdGlvbi1zZXJ2aWNlLXJlbG9hZCIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHNlcnZpY2UgZmlsZXMgcmVsb2FkaW5nIHRlc3RcbiIsIGFyZ3ZbMF0pOworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX3JlbG9hZF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoInNlcnZpY2UgcmVsb2FkIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgInVuaXgtZmRzLXBhc3NpbmciKSA9PSAwKQorICAgIHsKKyAgICAgIHRlc3RfcHJlX2hvb2sgKCk7CisgICAgICBwcmludGYgKCIlczogUnVubmluZyB1bml4IGZkIHBhc3NpbmcgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c191bml4X2Zkc19wYXNzaW5nX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgidW5peCBmZCBwYXNzaW5nIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisjZW5kaWYKKworICBwcmludGYgKCIlczogU3VjY2Vzc1xuIiwgYXJndlswXSk7CisKKyAgCisgIHJldHVybiAwOworI2Vsc2UgLyogREJVU19CVUlMRF9URVNUUyAqLworCisgIHByaW50ZiAoIk5vdCBjb21waWxlZCB3aXRoIHRlc3Qgc3VwcG9ydFxuIik7CisgIAorICByZXR1cm4gMDsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvYnVzL3Rlc3Qtc3lzdGVtLmMgYi9kYnVzLTEuNC4xMC9idXMvdGVzdC1zeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE3ZDRlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL3Rlc3Qtc3lzdGVtLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiIC0qLSAqLworLyogdGVzdC1tYWluLmMgIG1haW4oKSBmb3IgbWFrZSBjaGVjaworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVW5pdCB0ZXN0IGZhaWxlZDogJXNcbiIsIGZhaWx1cmUpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzIChjb25zdCBjaGFyICpuYW1lKQoreworICBkYnVzX3NodXRkb3duICgpOworCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsIG5hbWUpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkpOworICAgICAgZGllICgibWVtbGVha3MiKTsKKyAgICB9Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCitzdGF0aWMgdm9pZAordGVzdF9wcmVfaG9vayAodm9pZCkKK3sKK30KKworc3RhdGljIGNoYXIgKnByb2duYW1lID0gIiI7CitzdGF0aWMgdm9pZAordGVzdF9wb3N0X2hvb2sgKHZvaWQpCit7CisgIGNoZWNrX21lbWxlYWtzIChwcm9nbmFtZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgY29uc3QgY2hhciAqZGlyOworICBEQnVzU3RyaW5nIHRlc3RfZGF0YV9kaXI7CisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworCisgIGlmIChhcmdjID4gMSkKKyAgICBkaXIgPSBhcmd2WzFdOworICBlbHNlCisgICAgZGlyID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKTsKKworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IHRlc3QgZGF0YSBkaXJlY3RvcnkgYXMgYXJndlsxXSBvciBpbiBEQlVTX1RFU1RfREFUQSBlbnYgdmFyaWFibGVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kYXRhX2RpciwgZGlyKTsKKworICBpZiAoIV9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAoKSkKKyAgICBkaWUgKCJpbml0aWFsaXppbmcgZGVidWcgdGhyZWFkcyIpOworCisgIHRlc3RfcHJlX2hvb2sgKCk7CisgIHByaW50ZiAoIiVzOiBSdW5uaW5nIGNvbmZpZyBmaWxlIHBhcnNlciAodHJpdmlhbCkgdGVzdFxuIiwgYXJndlswXSk7CisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgZGllICgicGFyc2VyIik7CisgIHRlc3RfcG9zdF9ob29rICgpOworCisgIHByaW50ZiAoIiVzOiBTdWNjZXNzXG4iLCBhcmd2WzBdKTsKKworICByZXR1cm4gMDsKKyNlbHNlIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworICBwcmludGYgKCJOb3QgY29tcGlsZWQgd2l0aCB0ZXN0IHN1cHBvcnRcbiIpOworCisgIHJldHVybiAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvdGVzdC5jIGIvZGJ1cy0xLjQuMTAvYnVzL3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZhZDZlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvYnVzL3Rlc3QuYwpAQCAtMCwwICsxLDM0NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0ZXN0LmMgIHVuaXQgdGVzdCByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKKy8qIFRoZSAiZGVidWcgY2xpZW50IiB3YXRjaC90aW1lb3V0IGhhbmRsZXJzIGRvbid0IGRpc3BhdGNoIG1lc3NhZ2VzLAorICogYXMgd2UgbWFudWFsbHkgcHVsbCB0aGVtIGluIG9yZGVyIHRvIHZlcmlmeSB0aGVtLiBUaGlzIGlzIHdoeSB0aGV5CisgKiBhcmUgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgaGFuZGxlcnMgaW4gY29ubmVjdGlvbi5jCisgKi8KK3N0YXRpYyBEQnVzTGlzdCAqY2xpZW50cyA9IE5VTEw7CitzdGF0aWMgREJ1c0xvb3AgKmNsaWVudF9sb29wID0gTlVMTDsKKworc3RhdGljIGRidXNfYm9vbF90CitjbGllbnRfd2F0Y2hfY2FsbGJhY2sgKERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIC8qIEZJWE1FIHRoaXMgY2FuIGJlIGRvbmUgaW4gZGJ1cy1tYWlubG9vcC5jCisgICAqIGlmIHRoZSBjb2RlIGluIGFjdGl2YXRpb24uYyBmb3IgdGhlIGJhYnlzaXR0ZXIKKyAgICogd2F0Y2ggaGFuZGxlciBpcyBmaXhlZC4KKyAgICovCisKKyAgcmV0dXJuIGRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2xpZW50X3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoY2xpZW50X2xvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGNsaWVudF93YXRjaF9jYWxsYmFjaywgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jbGllbnRfd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNsaWVudF9sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGNsaWVudF93YXRjaF9jYWxsYmFjaywgY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitjbGllbnRfdGltZW91dF9jYWxsYmFjayAoREJ1c1RpbWVvdXQgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgLyogY2FuIHJldHVybiBGQUxTRSBvbiBPT00gYnV0IHdlIGp1c3QgbGV0IGl0IGZpcmUgYWdhaW4gbGF0ZXIgKi8KKyAgZGJ1c190aW1lb3V0X2hhbmRsZSAodGltZW91dCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2xpZW50X3RpbWVvdXQgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF90aW1lb3V0IChjbGllbnRfbG9vcCwgdGltZW91dCwgY2xpZW50X3RpbWVvdXRfY2FsbGJhY2ssIGNvbm5lY3Rpb24sIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2NsaWVudF90aW1lb3V0IChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKworICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChjbGllbnRfbG9vcCwgdGltZW91dCwgY2xpZW50X3RpbWVvdXRfY2FsbGJhY2ssIGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2NsaWVudF9kaXNjb25uZWN0X2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBpZiAoIWRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKworICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgY2xpZW50ICVwIGluIGRpc2Nvbm5lY3QgaGFuZGxlclxuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisKKyAgX2RidXNfbGlzdF9yZW1vdmUgKCZjbGllbnRzLCBjb25uZWN0aW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIGlmIChjbGllbnRzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbG9vcF91bnJlZiAoY2xpZW50X2xvb3ApOworICAgICAgY2xpZW50X2xvb3AgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfZGlzY29ubmVjdF9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoY2xpZW50X2xvb3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBjbGllbnRfbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICAgICAgaWYgKGNsaWVudF9sb29wID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY2xpZW50X3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfY2xpZW50X3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2NsaWVudF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jbGllbnRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjbGllbnRzLCBjb25uZWN0aW9uKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAoIXJldHZhbCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfZGlzY29ubmVjdF9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmY2xpZW50cywgY29ubmVjdGlvbik7CisKKyAgICAgIGlmIChjbGllbnRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19sb29wX3VucmVmIChjbGllbnRfbG9vcCk7CisgICAgICAgICAgY2xpZW50X2xvb3AgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQKK2J1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY2xpZW50cyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjbGllbnRzLCBsaW5rKTsKKworICAgICAgaWYgKCEoKiBmdW5jdGlvbikgKGNvbm5lY3Rpb24sIGRhdGEpKQorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX3Rlc3RfY2xpZW50X2xpc3RlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY2xpZW50cyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmMgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjbGllbnRzLCBsaW5rKTsKKworICAgICAgaWYgKGMgPT0gY29ubmVjdGlvbikKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK2J1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKGRidXNfYm9vbF90IGJsb2NrX29uY2UpCit7CisgIGlmIChjbGllbnRfbG9vcCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c192ZXJib3NlICgiLS0tPiBEaXNwYXRjaGluZyBvbiBcImNsaWVudCBzaWRlXCJcbiIpOworCisgIC8qIGRpc3BhdGNoIGJlZm9yZSB3ZSBibG9jayBzbyBwZW5kaW5nIGRpc3BhdGNoZXMKKyAgICogd29uJ3QgbWFrZSBvdXIgYmxvY2sgcmV0dXJuIGVhcmx5CisgICAqLworICBfZGJ1c19sb29wX2Rpc3BhdGNoIChjbGllbnRfbG9vcCk7CisKKyAgLyogRG8gb25lIGJsb2NraW5nIHdhaXQsIHNpbmNlIHdlJ3JlIGV4cGVjdGluZyBkYXRhICovCisgIGlmIChibG9ja19vbmNlKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IGJsb2NraW5nIG9uIFwiY2xpZW50IHNpZGVcIlxuIik7CisgICAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGNsaWVudF9sb29wLCBUUlVFKTsKKyAgICB9CisKKyAgLyogVGhlbiBtb3AgZXZlcnl0aGluZyB1cCAqLworICB3aGlsZSAoX2RidXNfbG9vcF9pdGVyYXRlIChjbGllbnRfbG9vcCwgRkFMU0UpKQorICAgIDsKKworICBfZGJ1c192ZXJib3NlICgiLS0tPiBEb25lIGRpc3BhdGNoaW5nIG9uIFwiY2xpZW50IHNpZGVcIlxuIik7Cit9CisKK3ZvaWQKK2J1c190ZXN0X3J1bl9idXNfbG9vcCAoQnVzQ29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgYmxvY2tfb25jZSkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIi0tLT4gRGlzcGF0Y2hpbmcgb24gXCJzZXJ2ZXIgc2lkZVwiXG4iKTsKKworICAvKiBkaXNwYXRjaCBiZWZvcmUgd2UgYmxvY2sgc28gcGVuZGluZyBkaXNwYXRjaGVzCisgICAqIHdvbid0IG1ha2Ugb3VyIGJsb2NrIHJldHVybiBlYXJseQorICAgKi8KKyAgX2RidXNfbG9vcF9kaXNwYXRjaCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpKTsKKworICAvKiBEbyBvbmUgYmxvY2tpbmcgd2FpdCwgc2luY2Ugd2UncmUgZXhwZWN0aW5nIGRhdGEgKi8KKyAgaWYgKGJsb2NrX29uY2UpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIi0tLT4gYmxvY2tpbmcgb24gXCJzZXJ2ZXIgc2lkZVwiXG4iKTsKKyAgICAgIF9kYnVzX2xvb3BfaXRlcmF0ZSAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLCBUUlVFKTsKKyAgICB9CisKKyAgLyogVGhlbiBtb3AgZXZlcnl0aGluZyB1cCAqLworICB3aGlsZSAoX2RidXNfbG9vcF9pdGVyYXRlIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCksIEZBTFNFKSkKKyAgICA7CisKKyAgX2RidXNfdmVyYm9zZSAoIi0tLT4gRG9uZSBkaXNwYXRjaGluZyBvbiBcInNlcnZlciBzaWRlXCJcbiIpOworfQorCit2b2lkCitidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgd2hpbGUgKF9kYnVzX2xvb3BfaXRlcmF0ZSAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLCBGQUxTRSkgfHwKKyAgICAgICAgIChjbGllbnRfbG9vcCA9PSBOVUxMIHx8IF9kYnVzX2xvb3BfaXRlcmF0ZSAoY2xpZW50X2xvb3AsIEZBTFNFKSkpCisgICAgOworfQorCitCdXNDb250ZXh0KgorYnVzX2NvbnRleHRfbmV3X3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZmlsZW5hbWUpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c1N0cmluZyBjb25maWdfZmlsZTsKKyAgREJ1c1N0cmluZyByZWxhdGl2ZTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29uZmlnX2ZpbGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJObyBtZW1vcnlcbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfZGF0YV9kaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWdfZmlsZSwgMCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vIG1lbW9yeVxuIik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnJlbGF0aXZlLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmY29uZmlnX2ZpbGUsICZyZWxhdGl2ZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vIG1lbW9yeVxuIik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbnRleHQgPSBidXNfY29udGV4dF9uZXcgKCZjb25maWdfZmlsZSwgRkFMU0UsIE5VTEwsIE5VTEwsIE5VTEwsIEZBTFNFLCAmZXJyb3IpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gY3JlYXRlIGRlYnVnIGJ1cyBjb250ZXh0IGZyb20gY29uZmlndXJhdGlvbiBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBlcnJvci5tZXNzYWdlKTsKKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworCisgIHJldHVybiBjb250ZXh0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy90ZXN0LmggYi9kYnVzLTEuNC4xMC9idXMvdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDI0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvdGVzdC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdGVzdC5oICB1bml0IHRlc3Qgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19URVNUX0gKKyNkZWZpbmUgQlVTX1RFU1RfSAorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX3Rlc3QgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfZGlzcGF0Y2hfc2hhMV90ZXN0ICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19wb2xpY3lfdGVzdCAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX2NvbmZpZ19wYXJzZXJfdGVzdCAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfY29uZmlnX3BhcnNlcl90cml2aWFsX3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19zaWduYWxzX3Rlc3QgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX2V4cGlyZV9saXN0X3Rlc3QgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX3JlbG9hZF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoICAoQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKK2RidXNfYm9vbF90IGJ1c190ZXN0X2NsaWVudF9saXN0ZWQgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgYnVzX3Rlc3RfcnVuX2J1c19sb29wICAgICAoQnVzQ29udGV4dCAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKK3ZvaWQgICAgICAgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKK3ZvaWQgICAgICAgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworQnVzQ29udGV4dCogYnVzX2NvbnRleHRfbmV3X3Rlc3QgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgKmZpbGVuYW1lKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCitkYnVzX2Jvb2xfdCBidXNfdW5peF9mZHNfcGFzc2luZ190ZXN0IChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKKyNlbmRpZgorCisjZW5kaWYKKworI2VuZGlmIC8qIEJVU19URVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2J1cy91dGlscy5jIGIvZGJ1cy0xLjQuMTAvYnVzL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNDg3MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2J1cy91dGlscy5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdXRpbHMuYyAgR2VuZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorCitjb25zdCBjaGFyIGJ1c19ub19tZW1vcnlfbWVzc2FnZVtdID0gIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gbWVzc2FnZSBidXMiOworCit2b2lkCitidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9hbGxfbWVzc2FnZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICB3aGlsZSAoYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgKGNvbm5lY3Rpb24pKQorICAgIDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2Rpc3BhdGNoX29uZV9tZXNzYWdlICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgd2hpbGUgKChzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggKGNvbm5lY3Rpb24pKSA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgCisgIHJldHVybiBzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9idXMvdXRpbHMuaCBiL2RidXMtMS40LjEwL2J1cy91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzM4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9idXMvdXRpbHMuaApAQCAtMCwwICsxLDM2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHV0aWxzLmggIEdlbmVyYWwgdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfVVRJTFNfSAorI2RlZmluZSBCVVNfVVRJTFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK2V4dGVybiBjb25zdCBjaGFyIGJ1c19ub19tZW1vcnlfbWVzc2FnZVtdOworI2RlZmluZSBCVVNfU0VUX09PTShlcnJvcikgZGJ1c19zZXRfZXJyb3JfY29uc3QgKChlcnJvciksIERCVVNfRVJST1JfTk9fTUVNT1JZLCBidXNfbm9fbWVtb3J5X21lc3NhZ2UpCisKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX2FsbF9tZXNzYWdlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKyNlbmRpZiAvKiBCVVNfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY2xlYW51cC1tYW4tcGFnZXMuc2ggYi9kYnVzLTEuNC4xMC9jbGVhbnVwLW1hbi1wYWdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yM2U5OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY2xlYW51cC1tYW4tcGFnZXMuc2gKQEAgLTAsMCArMSw4NiBAQAorIyEgL2Jpbi9zaAorCisjIyBUaGlzIHNjcmlwdCBjbGVhbnMgdXAgcHJpdmF0ZS9pbnRlcm5hbCBBUEkgZnJvbSB0aGUgbWFuIHBhZ2VzCisjIyBnZW5lcmF0ZWQgYnkgRG94eWdlbi4gIFRoaXMgYnJpbmdzIHRoZSBtYW4gcGFnZXMgZG93biBmcm9tIDcgbWVncworIyMgdG8gMiBtZWdzIGFuZCBhdm9pZHMgbmFtZXNwYWNlLXBvbGx1dGluZyBtYW4gcGFnZXMuICBJdCdzIHByb2JhYmx5CisjIyBwcmV0dHkgc3BlY2lmaWMgdG8gR05VIHV0aWxpdGllcy4gUGF0Y2hlcyBnbGFkbHkgYWNjZXB0ZWQgdG8gbWFrZQorIyMgaXQgd29yayB3aXRob3V0IHRoZW0uCisKKyMjIFlvdSB3b3VsZCBydW4gdGhpcyBhZnRlciBidWlsZGluZyBkYnVzIGFuZCBhZnRlciBydW5uaW5nICJkb3h5Z2VuCisjIyBEb3h5ZmlsZSIKKworZGllKCkgeworICAgIGVjaG8gIiQqIiAxPiYyCisgICAgZXhpdCAxCit9CisKK01BTkRJUj0kMQoraWYgdGVzdCB4IiRNQU5ESVIiID0geCA7IHRoZW4KKyAgICBNQU5ESVI9ZG9jL2FwaS9tYW4vbWFuM2RidXMKK2ZpCisKK2NkICIkTUFORElSIiB8fCBkaWUgIkNvdWxkIG5vdCBjZCB0byAkTUFORElSIgorCit0ZXN0IC1kIGtlZXAgfHwgbWtkaXIga2VlcCB8fCBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgJE1BTkRJUi9rZWVwIGRpcmVjdG9yeSIKK3Rlc3QgLWQgbnVrZSB8fCBta2RpciBudWtlIHx8IGRpZSAiQ291bGQgbm90IGNyZWF0ZSAkTUFORElSL251a2UgZGlyZWN0b3J5IgorCisjIyBibGFja2xpc3QKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgIl8qIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgbnVrZSkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgdW5kZXJzY29yZS1wcmVmaXhlZCBpdGVtcyIKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgIkRCdXMqSW50ZXJuYWwqIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgbnVrZSkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgaW50ZXJuYWwtY29udGFpbmluZyBpdGVtcyIKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgImRidXNfKl9pbnRlcm5hbF8qIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgbnVrZSkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgaW50ZXJuYWwtY29udGFpbmluZyBpdGVtcyIKKworIyMgdGhpcyBpcyBraW5kIG9mIHVubWFpbnRhaW5hYmxlLCBidXQgSSBndWVzcyBpdCdzIG5vIGh1Z2UgZGlzYXN0ZXIgaWYgd2UgbWlzcyBzb21ldGhpbmcuCisjIyB0aGlzIGxpc3Qgc2hvdWxkIG9ubHkgY29udGFpbiBtYW4gcGFnZXMgd2l0aCA+MSBsaW5lLCBpLmUuIHdpdGggcmVhbCBjb250ZW50OyB0aGUgCisjIyBvbmUtbGluZSBjcm9zcy1yZWZlcmVuY2VzIGdldCBjbGVhbmVkIHVwIG5leHQuCitmb3IgSSBpbiBEQnVzQ291bnRlci4qIERCdXNDcmVkZW50aWFscy4qIERCdXNEYXRhU2xvdC4qIERCdXNEYXRhU2xvdEFsbG9jYXRvci4qIERCdXNEYXRhU2xvdExpc3QuKiBcCisgICAgREJ1c0Rpckl0ZXIuKiBEQnVzRmFrZU11dGV4LiogREJ1c0ZyZWVkRWxlbWVudC4qIERCdXNHcm91cEluZm8uKiBEQnVzR1VJRC4qIERCdXNIYXNoRW50cnkuKiBcCisgICAgREJ1c0hhc2hJdGVyLiogREJ1c0hhc2hUYWJsZS4qIERCdXNIZWFkZXIuKiBEQnVzSGVhZGVyRmllbGQuKiBEQnVzS2V5LiogREJ1c0tleXJpbmcuKiBEQnVzTGlzdC4qIFwKKyAgICBEQnVzTWFyc2hhbC4qIERCdXNNRDUqIERCdXNNZW1CbG9jay4qIERCdXNNZW1Qb29sLiogREJ1c01lc3NhZ2VHZW5lcmF0b3IuKiBEQnVzTWVzc2FnZUxvYWRlci4qIFwKKyAgICBEQnVzTWVzc2FnZVJlYWxJdGVyLiogREJ1c09iamVjdFN1YnRyZWUuKiBEQnVzT2JqZWN0VHJlZS4qIERCdXNQb2xsRkQuKiBEQnVzUmVhbCogXAorICAgIERCdXNSZXNvdXJjZXMuKiBEQnVzU2VydmVyRGVidWdQaXBlLiogREJ1c1NlcnZlclNvY2tldC4qIERCdXNTZXJ2ZXJVbml4LiogXAorICAgIERCdXNTZXJ2ZXJWVGFibGUuKiBEQnVzU0hBLiogREJ1c1NIQUNvbnRleHQuKiBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIuKiBEQnVzU3RhdC4qIERCdXNTdHJpbmcuKiBcCisgICAgREJ1c1N5c2RlcHMuKiBEQnVzU3lzZGVwc1VuaXguKiBEQnVzVGltZW91dExpc3QuKiBEQnVzVHJhbnNwb3J0KiBEQnVzVHlwZVJlYWRlciogREJ1c1R5cGVXcml0ZXIqIFwKKyAgICBEQnVzVXNlckluZm8uKiBEQnVzV2F0Y2hMaXN0LiogOyBkbyAKKyAgICBpZiB0ZXN0IC1mICIkSSIgOyB0aGVuCisgICAgICAgIC9iaW4vbXYgIiRJIiBudWtlIHx8IGRpZSAiY291bGQgbm90IG1vdmUgJEkgdG8gJE1BTkRJUi9udWtlIgorICAgIGZpCitkb25lCisKKyMjIG1hbnkgZmlsZXMganVzdCBjb250YWluICIuc28gbWFuM2RidXMvREJ1c1N0cmluZ0ludGVybmFscy4zZGJ1cyIgb3IgdGhlIGxpa2UsIAorIyMgaWYgdGhlc2UgcG9pbnQgdG8gc29tZXRoaW5nIHdlIG51a2VkLCB3ZSB3YW50IHRvIGFsc28gbnVrZSB0aGUgcG9pbnRlci4KK2ZvciBJIGluICogOyBkbworICAgIGlmIHRlc3QgLWYgIiRJIiA7IHRoZW4KKyAgICAgICAgTElORVM9YHdjIC1sICIkSSIgfCBjdXQgLWQgJyAnIC1mIDFgCisgICAgICAgIGlmIHRlc3QgeCIkTElORVMiID0geDEgOyB0aGVuCisgICAgICAgICAgICBSRUZfVE89YGNhdCAiJEkiIHwgc2VkIC1lICdzL1wuc28gbWFuM2RidXNcLy8vZydgCisgICAgICAgICAgICAjIyBlY2hvICIkSSBwb2ludHMgdG8gJFJFRl9UTyIKKyAgICAgICAgICAgIGlmICEgdGVzdCAtZiAiJFJFRl9UTyIgOyB0aGVuCisgICAgICAgICAgICAgICAgL2Jpbi9tdiAiJEkiIG51a2UgfHwgZGllICJjb3VsZCBub3QgbW92ZSAkSSB0byAkTUFORElSL251a2UiCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGZpCitkb25lCisKKyMjIHdoaXRlbGlzdAorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiZGJ1c18qIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMga2VlcCkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgZGJ1cy1wcmVmaXhlZCBpdGVtcyIKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgIkRCVVNfKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIGtlZXApIHx8IGRpZSAiY291bGQgbm90IG1vdmUgYWxsIERCVVNfLXByZWZpeGVkIGl0ZW1zIgorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiREJ1cyoiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBrZWVwKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGFsbCBEQnVzLXByZWZpeGVkIGl0ZW1zIgorCisjIyBldmVyeXRoaW5nIGVsc2UgaXMgYXNzdW1lZCBpcnJlbGV2YW50LCB0aGlzIGlzIG1vc3RseSBzdHJ1Y3QgZmllbGRzCisjIyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVycworKGZpbmQgLiAtbWF4ZGVwdGggMSAtdHlwZSBmIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBudWtlKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIHJlbWFpbmluZyBpdGVtcyIKKworTlVLRV9DT1VOVD1gZmluZCBudWtlIC10eXBlIGYgLW5hbWUgIioiIHwgd2MgLWxgCitLRUVQX0NPVU5UPWBmaW5kIGtlZXAgLXR5cGUgZiAtbmFtZSAiKiIgfCB3YyAtbGAKK01JU1NJTkdfQ09VTlQ9YGZpbmQgLiAtbWF4ZGVwdGggMSAtdHlwZSBmIC1uYW1lICIqIiB8IHdjIC1sYAorCitlY2hvICIkS0VFUF9DT1VOVCBtYW4gcGFnZXMga2VwdCBhbmQgJE5VS0VfQ09VTlQgbWFuIHBhZ2VzIHRvIHJlbW92ZSIKK2VjaG8gIiRNSVNTSU5HX0NPVU5UIG5vdCBoYW5kbGVkIgorCisoZmluZCBrZWVwIC10eXBlIGYgLW5hbWUgIioiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyAuKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGtlcHQgaXRlbXMgYmFjayIKKworcm1kaXIga2VlcCB8fCBkaWUgImNvdWxkIG5vdCByZW1vdmUgJE1BTkRJUi9rZWVwIgorCitlY2hvICJNYW4gcGFnZXMgdG8gYmUgaW5zdGFsbGVkIGFyZSBpbiAkTUFORElSIGFuZCBtYW4gcGFnZXMgdG8gaWdub3JlIGFyZSBpbiAkTUFORElSL251a2UiCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvQ01ha2VMaXN0cy50eHQgYi9kYnVzLTEuNC4xMC9jbWFrZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjlhYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2MTMgQEAKK3Byb2plY3QoZGJ1cykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBkZXRlY3QgdmVyc2lvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmlsZSAoUkVBRCAuLi9jb25maWd1cmUuYWMgY29uZmlndXJlX2FjKQorc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKmRidXNfbWFqb3JfdmVyc2lvbl0sIC4oWzAtOV0rKS4qIiAiXFwxIiBEQlVTX01BSk9SX1ZFUlNJT04gJHtjb25maWd1cmVfYWN9KQorc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKmRidXNfbWlub3JfdmVyc2lvbl0sIC4oWzAtOV0rKS4qIiAiXFwxIiBEQlVTX01JTk9SX1ZFUlNJT04gJHtjb25maWd1cmVfYWN9KQorc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKmRidXNfbWljcm9fdmVyc2lvbl0sIC4oWzAtOV0rKS4qIiAiXFwxIiBEQlVTX01JQ1JPX1ZFUlNJT04gJHtjb25maWd1cmVfYWN9KQorIyB1c2VkIGJ5IGZpbGUgdmVyc2lvbiBpbmZvCitzZXQgKERCVVNfUEFUQ0hfVkVSU0lPTiAiMCIpCitzZXQgKERCVVNfVkVSU0lPTiAke0RCVVNfTUFKT1JfVkVSU0lPTn0uJHtEQlVTX01JTk9SX1ZFUlNJT059LiR7REJVU19NSUNST19WRVJTSU9OfSkKKworc2V0IChEQlVTX1ZFUlNJT05fU1RSSU5HICIke0RCVVNfVkVSU0lPTn0iKQorCitpZiAoTk9UIERCVVNfQlVJTERfVElNRVNUQU1QKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGSVhNRSBzZXQgREJVU19CVUlMRF9USU1FU1RBTVAgdG8gY3VycmVudCBkYXRlIG9yIGZpeCBjdXJyZW50IHRpbWUgc3RhbXAgZ2VuZXJhdGlvbiBmb3IgaGF2aW5nIGFjdHVhbCBidWlsZCBkYXRlIGluIHZlcnNpb24gZmlsZSBpbmZvIikKKyAgICBzZXQgKERCVVNfQlVJTERfVElNRVNUQU1QIDIwMDkxMjMxKQorZW5kaWYgKE5PVCBEQlVTX0JVSUxEX1RJTUVTVEFNUCkKKworIyB3ZSBuZWVkIHRvIGJlIHVwIHRvIGRhdGUKK0NNQUtFX01JTklNVU1fUkVRVUlSRUQoVkVSU0lPTiAyLjQuNCBGQVRBTF9FUlJPUikKK2lmKENPTU1BTkQgY21ha2VfcG9saWN5KQorICAgIGNtYWtlX3BvbGljeShTRVQgQ01QMDAwMyBORVcpCitlbmRpZihDT01NQU5EIGNtYWtlX3BvbGljeSkKKworIyB3aGVyZSB0byBsb29rIGZpcnN0IGZvciBjbWFrZSBtb2R1bGVzLCBiZWZvcmUgJHtDTUFLRV9ST09UfS9Nb2R1bGVzLyBpcyBjaGVja2VkCitzZXQoQ01BS0VfTU9EVUxFX1BBVEggIiR7Q01BS0VfU09VUkNFX0RJUn0vbW9kdWxlcyIpCisKKyMjIyMjIyMjIyMjIGJhc2ljIHZhcnMgIyMjIyMjIyMjIyMjIyMjCisKKworaWYgKERCVVNESVIpCisJc2V0KERCVVNfSU5TVEFMTF9ESVIgIiR7REJVU0RJUn0iKQorZW5kaWYgKERCVVNESVIpCitpZiAoJEVOVntEQlVTRElSfSkKKwlzZXQoREJVU19JTlNUQUxMX0RJUiAiJEVOVntEQlVTRElSfSIpCitlbmRpZiAoJEVOVntEQlVTRElSfSkKKworaWYgKERCVVNfSU5TVEFMTF9ESVIpCisJc2V0KENNQUtFX0lOU1RBTExfUFJFRklYICIke0RCVVNfSU5TVEFMTF9ESVJ9IiBDQUNIRSBUWVBFIFBBVEggRk9SQ0UpCitlbHNlIChEQlVTX0lOU1RBTExfRElSKQorCXNldChEQlVTX0lOU1RBTExfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCitlbmRpZiAoREJVU19JTlNUQUxMX0RJUikKKworIyBhdXRvdG9vbHMgc3R5bGUKK2lmIChOT1QgREFUQVJPT1RESVIpCisgICAgc2V0IChEQVRBUk9PVERJUiBzaGFyZSkKK2VuZGlmKCkKKworaWYgKE5PVCBEQVRBRElSKQorICAgIHNldCAoREFUQURJUiAke0RBVEFST09URElSfSkKK2VuZGlmKCkKKworaWYgKE5PVCBET0NESVIpCisgICAgU0VUKERPQ0RJUiAke0RBVEFST09URElSfS9kb2MvZGJ1cykKK2VuZGlmKCkKKworaWYgKE5PVCBEQlVTX0RBVEFESVIpCisgICAgU0VUKERCVVNfREFUQURJUiAke0RBVEFESVJ9KQorZW5kaWYoKQorCitzZXQocHJlZml4ICAgICAgICAgICAgICAgICAgICR7REJVU19JTlNUQUxMX0RJUn0pCitzZXQoZXhlY19wcmVmaXggICAgICAgICAgICAgICR7cHJlZml4fSkKK3NldChFWFBBTkRFRF9MSUJESVIgICAgICAgICAgJHtEQlVTX0lOU1RBTExfRElSfS9saWIpCitzZXQoRVhQQU5ERURfSU5DTFVERURJUiAgICAgICR7REJVU19JTlNUQUxMX0RJUn0vaW5jbHVkZSkKK3NldChFWFBBTkRFRF9CSU5ESVIgICAgICAgICAgJHtEQlVTX0lOU1RBTExfRElSfS9iaW4pCitzZXQoRVhQQU5ERURfU1lTQ09ORkRJUiAgICAgICR7REJVU19JTlNUQUxMX0RJUn0vZXRjKQorc2V0KEVYUEFOREVEX0RBVEFESVIgICAgICAgICAke0RCVVNfSU5TVEFMTF9ESVJ9LyR7REJVU19EQVRBRElSfSkKK3NldChEQlVTX01BQ0hJTkVfVVVJRF9GSUxFICAgJHtEQlVTX0lOU1RBTExfRElSfS9saWIvZGJ1cy9tYWNoaW5lLWlkKQorc2V0KERCVVNfQklORElSICAgICAgICAgICAgICAke0VYUEFOREVEX0JJTkRJUn0pCitzZXQoREJVU19EQUVNT05ESVIgCQkJICR7RVhQQU5ERURfQklORElSfSkKKworCisjZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZCBsaWJyYXJ5CitTRVQoQlVJTERfU0hBUkVEX0xJQlMgT04pCisKK2lmIChDWUdXSU4pCisgICBzZXQgKFdJTjMyKQorZW5kaWYgKENZR1dJTikKKworIyBzZWFyY2ggZm9yIHJlcXVpcmVkIHBhY2thZ2VzCitpZiAoV0lOMzIpCisgICAgIyBpbmNsdWRlIGxvY2FsIGhlYWRlciBmaXJzdCB0byBhdm9pZCB1c2luZyBvbGQgaW5zdGFsbGVkIGhlYWRlcgorICAgIHNldCAoQ01BS0VfSU5DTFVERV9QQVRIICR7Q01BS0VfSU5DTFVERV9QQVRIfSAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uKQorCWZpbmRfcGFja2FnZShMaWJJY29udikKKyAgICBpbmNsdWRlKFdpbjMyTWFjcm9zKQorICAgIGFkZEV4cGxvcmVyV3JhcHBlcigke0NNQUtFX1BST0pFQ1RfTkFNRX0pCitlbmRpZiAoV0lOMzIpCitmaW5kX3BhY2thZ2UoTGliWG1sMikKK2ZpbmRfcGFja2FnZShMaWJFeHBhdCkKK2ZpbmRfcGFja2FnZShYMTEpCisKK2lmKE5PVCBXSU4zMikKKwlPUFRJT04oREJVU19FTkFCTEVfQUJTVFJBQ1RfU09DS0VUUyAiZW5hYmxlIHN1cHBvcnQgZm9yIGFic3RyYWN0IHNvY2tldHMiIE9OKQorZW5kaWYoTk9UIFdJTjMyKQorCisjQUNfQVJHX0VOQUJMRShhc3NlcnRzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtYXNzZXJ0c10sW2luY2x1ZGUgYXNzZXJ0aW9uIGNoZWNrc10pLGVuYWJsZV9hc3NlcnRzPSRlbmFibGV2YWwsZW5hYmxlX2Fzc2VydHM9JFVTRV9NQUlOVEFJTkVSX01PREUpCitPUFRJT04oREJVU19ESVNBQkxFX0FTU0VSVFMgIkRpc2FibGUgYXNzZXJ0aW9uIGNoZWNraW5nIiBPRkYpCisKKyMgZG8gY29uZmlnIGNoZWNrcworSU5DTFVERShDb25maWd1cmVDaGVja3MuY21ha2UpCisKKyMgQFRPRE86IGhvdyB0byByZW1vdmUgbGFzdCBkaXIgZnJvbSAke0NNQUtFX1NPVVJDRV9ESVJ9ID8KK1NFVChEQlVTX1NPVVJDRV9ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLikKKworIyBtYWtlIHNvbWUgbW9yZSBtYWNyb3MgYXZhaWxhYmxlCitpbmNsdWRlIChNYWNyb0xpYnJhcnkpCisKK2lmKFZDUykKKwlzZXQoREJVU19WRVJCT1NFX0NfUyAxIENBQ0hFIFRZUEUgU1RSSU5HIEZPUkNFKQorCXNldChEQlVTX1ZFUkJPU0VfQ19TIDEpCitlbmRpZihWQ1MpCisKK2lmKFdJTjMyKQorCXNldChDTUFLRV9ERUJVR19QT1NURklYICJkIikKKwlpZihNU1ZDKQorCQkjIGNvbnRyb2xsIGZvbGRlcnMgaW4gbXN2YyBwcm9qZWN0cworCQlpbmNsdWRlKFByb2plY3RTb3VyY2VHcm91cCkKKwkJaWYoTk9UIEdST1VQX0NPREUpCisJCQkjc2V0KEdST1VQX0NPREUgc3BsaXQpICNjbWFrZSBkZWZhdWx0CisJCQlzZXQoR1JPVVBfQ09ERSBmbGF0KQorCQllbmRpZihOT1QgR1JPVVBfQ09ERSkKKwkJQUREX0RFRklOSVRJT05TKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKKworCisJCSMgVXNlIHRoZSBoaWdoZXN0IHdhcm5pbmcgbGV2ZWwKKwkJaWYgKFdBTEwpCisJCQlzZXQoV0FMTCAxIENBQ0hFIFRZUEUgU1RSSU5HIEZPUkNFKQorCQkJc2V0KENNQUtFX0NYWF9XQVJOSU5HX0xFVkVMIDQgQ0FDSEUgVFlQRSBTVFJJTkcgRk9SQ0UpCisKKwkJCWlmKENNQUtFX0NYWF9GTEFHUyBNQVRDSEVTICIvV1swLTRdIikKKwkJCQlTVFJJTkcoUkVHRVggUkVQTEFDRSAiL1dbMC00XSIgIi9XNCIgQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30iKQorCQkJZWxzZShDTUFLRV9DWFhfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCisJCQkJU0VUKENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC9XNCIpCisJCQllbmRpZihDTUFLRV9DWFhfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCisKKwkJCWlmKENNQUtFX0NfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCisJCQkJU1RSSU5HKFJFR0VYIFJFUExBQ0UgIi9XWzAtNF0iICIvVzQiIENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30iKQorCQkJZWxzZShDTUFLRV9DX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorCQkJCVNFVChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC9XNCIpCisJCQllbmRpZihDTUFLRV9DX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorCQllbHNlIChXQUxMKQorCQkJc2V0KENNQUtFX0NYWF9XQVJOSU5HX0xFVkVMIDMgQ0FDSEUgVFlQRSBTVFJJTkcgRk9SQ0UpCisJCWVuZGlmIChXQUxMKQorCisJCVNFVChNU1ZDX1dfRVJST1IgICAiIC93ZTQwMjggL3dlNDAxMyAvd2U0MTMzIC93ZTQwNDcgL3dlNDAzMSAvd2U0MDAyIC93ZTQwMDMgL3dlNDExNCIpCisJCVNFVChNU1ZDX1dfRElTQUJMRSAiIC93ZDQxMjcgL3dkNDA5MCAvd2Q0MTAxIC93ZDQyNDQiKQorCisJCVNFVChDTUFLRV9DX0ZMQUdTX0RFQlVHICAgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gICAvRkljb25maWcuaCAke01TVkNfV19FUlJPUn0gJHtNU1ZDX1dfRElTQUJMRX0iKQorCQlTRVQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gL0ZJY29uZmlnLmggJHtNU1ZDX1dfRVJST1J9ICR7TVNWQ19XX0RJU0FCTEV9IikKKwllbmRpZihNU1ZDKQorZW5kaWYoV0lOMzIpCisKK2lmIChVTklYIEFORCBOT1QgREJVU19ESVNBQkxFX0FTU0VSVFMpCisJIyByZXF1aXJlZCBmb3IgYmFja3RyYWNlCisJU0VUKENNQUtFX0NfRkxBR1NfREVCVUcgICAiJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAgIC1XbCwtLWV4cG9ydC1keW5hbWljIikKKwlTRVQoQ01BS0VfQ19GTEFHU19SRUxFQVNFICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gLVdsLC0tZXhwb3J0LWR5bmFtaWMiKQorCWFkZF9kZWZpbml0aW9ucygtRERCVVNfQlVJTFRfUl9EWU5BTUlDKQorZW5kaWYgKFVOSVggQU5EIE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUUykKKworU0VUKENNQUtFX0NfRkxBR1NfREVCVUcgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gIC1EX0RFQlVHIikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXaW5kb3dzIENFICg+PSA1LjAuMCkKKyMKKyMgV2luQ0Ugc3VwcG9ydCBub3cgcmVsaWVzIG9uIHRoZSBwcmVzZW5jZSBvZiBwbGF0Zm9ybSBmaWxlcywgZm91bmQgaW4gY21ha2UvbW9kdWxlcy9wbGF0Zm9ybQorIyBDbWFrZSAyLjguMCBkb2Vzbid0IGluY2x1ZGUgV2luQ0UgcGxhdGZvcm0gZmlsZXMgYnkgZGVmYXVsdCwgYnV0IHdvcmtpbmcgb25lcyBjYW4gYmUgZm91bmQKKyMgb24gQ01ha2UncyBidWd0cmFja2VyIDoKKyMgaHR0cDovL3B1YmxpYy5raXR3YXJlLmNvbS9CdWcvdmlldy5waHA/aWQ9NzkxOQorIworIyBmb3IgY21ha2UgMi44LjAgZ2V0IHRoZSBmb2xsb3dpbmcgcGF0Y2ggb25seSA6CisjIGh0dHA6Ly9wdWJsaWMua2l0d2FyZS5jb20vQnVnL2ZpbGVfZG93bmxvYWQucGhwP2ZpbGVfaWQ9Mjk0NCZ0eXBlPWJ1ZworIworIyBhZnRlciBhcHBseWluZyB0aGUgcGF0Y2gsIHlvdSBjYW4gZW5hYmxlIHRoZSBXaW5DRSBidWlsZCBieSBzcGVjaWZ5aW5nIDoKKyMgY21ha2UgWy4uLl0gLURDTUFLRV9TWVNURU1fTkFNRT1XaW5DRSAtRENNQUtFX1NZU1RFTV9WRVJTSU9OPVguWFgKKyMgKHdoZXJlIFguWFggaXMgeW91ciBhY3R1YWwgV2luQ0UgdmVyc2lvbiwgZS5nLiA1LjAyIGZvciBXaW5kb3dzIE1vYmlsZSA2KQorIworIyBOb3RlIHRoYXQgeW91IHNob3VsZCBoYXZlIGEgcHJvcGVyIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCBwcmlvciB0byBydW5uaW5nCisjIGNtYWtlLCBpZS4gdGhlIFBBVEgsIElOQ0xVREUgYW5kIExJQiBlbnYgdmFycyBwb2ludGluZyB0byB5b3VyIENFIFNESy90b29sY2hhaW4uCisjCitpZihXSU5DRSkKKworTUVTU0FHRSgiQnVpbGRpbmcgZm9yIFdpbkNFICgke0NNQUtFX1NZU1RFTV9WRVJTSU9OfSkiKQorCitlbmRpZihXSU5DRSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitFTkFCTEVfVEVTVElORygpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGlzYWxsb3cgaW4tc291cmNlIGJ1aWxkCisjbWFjcm9fZW5zdXJlX291dF9vZl9zb3VyY2VfYnVpbGQoImRidXMgcmVxdWlyZXMgYW4gb3V0IG9mIHNvdXJjZSBidWlsZC4gUGxlYXNlIGNyZWF0ZSBhIHNlcGFyYXRlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgcnVuICdjbWFrZSBwYXRoX3RvX2RidXMgW29wdGlvbnNdJyB0aGVyZS4iKQorCisjIC4uLiBhbmQgd2FybiBpbiBjYXNlIG9mIGFuIGVhcmxpZXIgaW4tc291cmNlIGJ1aWxkCisjc2V0KGdlbmVyYXRlZEZpbGVJblNvdXJjZURpciBFWElTVFMgJHtkYnVzX1NPVVJDRV9ESVJ9L2NvbmZpZy5oKQorI2lmKCR7Z2VuZXJhdGVkRmlsZUluU291cmNlRGlyfSkKKyMgICBtZXNzYWdlKFNUQVRVUyAiY29uZmlnLmggZXhpc3RzIGluIHlvdXIgc291cmNlIGRpcmVjdG9yeS4iKQorI2VuZGlmKCR7Z2VuZXJhdGVkRmlsZUluU291cmNlRGlyfSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgKFdJTjMyIE9SIENZR1dJTikKKwlzZXQgKExJQlJBUllfT1VUUFVUX1BBVEggICR7Q01BS0VfQklOQVJZX0RJUn0vYmluKQorZWxzZSAoV0lOMzIgT1IgQ1lHV0lOKQorCXNldCAoTElCUkFSWV9PVVRQVVRfUEFUSCAgJHtDTUFLRV9CSU5BUllfRElSfS9saWIpCitlbmRpZiAoV0lOMzIgT1IgQ1lHV0lOKQorCitzZXQgKEVYRUNVVEFCTEVfT1VUUFVUX1BBVEggJHtDTUFLRV9CSU5BUllfRElSfS9iaW4pCisKKyMgZm9yIGluY2x1ZGluZyBjb25maWcuaCBhbmQgZm9yIGluY2x1ZGVzIGxpa2UgPGRpci9mb28uaD4KK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfU09VUkNFX0RJUn0vLi4gJHtDTUFLRV9CSU5BUllfRElSfSAke0NNQUtFX0lOQ0xVREVfUEFUSH0gKQorCisjIGxpbmtlciBzZWFyY2ggZGlyZWN0b3JpZXMKK2xpbmtfZGlyZWN0b3JpZXMoJHtEQlVTX0xJQl9ESVJ9ICR7TElCUkFSWV9PVVRQVVRfUEFUSH0gKQoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9MSUJSQVJZX1BBVEh9ICApCisKK3NldChEQlVTX0lOQ0xVREVTKQorCitFTkFCTEVfVEVTVElORygpCisKKyMjIyMjIyMjIyMjIGNvbW1hbmQgbGluZSBvcHRpb25zICMjIyMjIyMjIyMjIyMjIworIyBUT0RPOiB0YWtlIGNoZWNrIGZyb20gY29uZmlndXJlLmluCisKKyNBQ19BUkdfRU5BQkxFKHRlc3RzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdGVzdHNdLFtlbmFibGUgdW5pdCB0ZXN0IGNvZGVdKSxlbmFibGVfdGVzdHM9JGVuYWJsZXZhbCxlbmFibGVfdGVzdHM9JFVTRV9NQUlOVEFJTkVSX01PREUpCitPUFRJT04oREJVU19CVUlMRF9URVNUUyAiZW5hYmxlIHVuaXQgdGVzdCBjb2RlIiBPTikKKyAKK2lmKERCVVNfQlVJTERfVEVTVFMpCisgICAgYWRkX2RlZmluaXRpb25zKC1EREJVU19CVUlMRF9URVNUUykKK2VuZGlmKERCVVNfQlVJTERfVEVTVFMpCisKK09QVElPTihEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HICJlbmFibGUgd2luMzIgZGVidWcgcG9ydCBmb3IgbWVzc2FnZSBvdXRwdXQiIE9GRikKK2lmKERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcpCisgICAgYWRkX2RlZmluaXRpb25zKC1EREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORykKK2VuZGlmKERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcpCisKK2lmKFdJTjMyKQorCSMgd2luMzIgZGJ1cyBzZXJ2aWNlIHN1cHBvcnQgLSB0aGlzIHN1cHBvcnQgaXMgbm90IGNvbXBsZXRlCisJT1BUSU9OKERCVVNfU0VSVklDRSAiZW5hYmxlIGRidXMgc2VydmljZSBpbnN0YWxsZXIiIE9GRikKK2VuZGlmKFdJTjMyKQorCisjQUNfQVJHX0VOQUJMRShhbnNpLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtYW5zaV0sW2VuYWJsZSAtYW5zaSAtcGVkYW50aWMgZ2NjIGZsYWdzXSksZW5hYmxlX2Fuc2k9JGVuYWJsZXZhbCxlbmFibGVfYW5zaT1ubykKK09QVElPTihEQlVTX0VOQUJMRV9BTlNJICJlbmFibGUgLWFuc2kgLXBlZGFudGljIGdjYyBmbGFncyIgT0ZGKQoraWYoREJVU19FTkFCTEVfQU5TSSkKKyAgIGlmKE5PVCBNU1ZDKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLWFuc2kgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9CU0RfU09VUkNFIC1wZWRhbnRpYykKKyAgIGVsc2UoTk9UIE1TVkMpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtWmEgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9CU0RfU09VUkNFIC1XNCkKKyAgIGVuZGlmKE5PVCBNU1ZDKQorZW5kaWYoREJVU19FTkFCTEVfQU5TSSkKKworI0FDX0FSR19FTkFCTEUodmVyYm9zZS1tb2RlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdmVyYm9zZS1tb2RlXSxbc3VwcG9ydCB2ZXJib3NlIGRlYnVnIG1vZGVdKSxlbmFibGVfdmVyYm9zZV9tb2RlPSRlbmFibGV2YWwsZW5hYmxlX3ZlcmJvc2VfbW9kZT0kVVNFX01BSU5UQUlORVJfTU9ERSkKK09QVElPTihEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgInN1cHBvcnQgdmVyYm9zZSBkZWJ1ZyBtb2RlIiBPTikKKworI0FDX0FSR19FTkFCTEUoY2hlY2tzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY2hlY2tzXSxbaW5jbHVkZSBzYW5pdHkgY2hlY2tzIG9uIHB1YmxpYyBBUEldKSxlbmFibGVfY2hlY2tzPSRlbmFibGV2YWwsZW5hYmxlX2NoZWNrcz15ZXMpCitPUFRJT04oREJVU19ESVNBQkxFX0NIRUNLUyAiRGlzYWJsZSBwdWJsaWMgQVBJIHNhbml0eSBjaGVja2luZyIgT0ZGKQorCitpZihOT1QgTVNWQykKKyAgICAjQUNfQVJHX0VOQUJMRShnY292LCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZ2Nvdl0sW2NvbXBpbGUgd2l0aCBjb3ZlcmFnZSBwcm9maWxpbmcgaW5zdHJ1bWVudGF0aW9uIChnY2Mgb25seSldKSxlbmFibGVfZ2Nvdj0kZW5hYmxldmFsLGVuYWJsZV9nY292PW5vKQorICAgIE9QVElPTihEQlVTX0dDT1ZfRU5BQkxFRCAiY29tcGlsZSB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24gKGdjYyBvbmx5KSIgT0ZGKQorICAgIGlmKERCVVNfR0NPVl9FTkFCTEVEKQorICAgICAgICAgICAgYWRkX2RlZmluaXRpb25zKC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSkKKyAgICAgICAgICAgICMgRklYTUUhISEhCisgICAgICAgICAgICAjIyByZW1vdmUgb3B0aW1pemF0aW9uCisgICAgIyAgICAgICAgQ0ZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAtZSAncy8tT1swLTldKi8vZydgCisgICAgZW5kaWYoREJVU19HQ09WX0VOQUJMRUQpCitlbmRpZihOT1QgTVNWQykKKworI0FDX0FSR19FTkFCTEUoYWJzdHJhY3Qtc29ja2V0cywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFic3RyYWN0LXNvY2tldHNdLFt1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZSAobGludXggb25seSldKSxlbmFibGVfYWJzdHJhY3Rfc29ja2V0cz0kZW5hYmxldmFsLGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzPWF1dG8pCisjIC0+IG1vdmVkIGJlZm9yZSBpbmNsdWRlKENvbmZpZ3VyZUNoZWNrcy5jbWFrZSkKKworI0FDX0FSR19FTkFCTEUoc2VsaW51eCwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNlbGludXhdLFtidWlsZCB3aXRoIFNFTGludXggc3VwcG9ydF0pLGVuYWJsZV9zZWxpbnV4PSRlbmFibGV2YWwsZW5hYmxlX3NlbGludXg9YXV0bykKKyNzZWxpbnV4IG1pc3NpbmcKKworI0FDX0FSR19FTkFCTEUoZG5vdGlmeSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRub3RpZnldLFtidWlsZCB3aXRoIGRub3RpZnkgc3VwcG9ydCAobGludXggb25seSldKSxlbmFibGVfZG5vdGlmeT0kZW5hYmxldmFsLGVuYWJsZV9kbm90aWZ5PWF1dG8pCitpZigiJHtDTUFLRV9TWVNURU1fTkFNRX0iIFNUUkVRVUFMICJMaW51eCIpCisgICAgT1BUSU9OKERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYICJidWlsZCB3aXRoIGRub3RpZnkgc3VwcG9ydCAobGludXggb25seSkiIE9OKSAjIGFkZCBhIGNoZWNrICEKK2VuZGlmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgU1RSRVFVQUwgIkxpbnV4IikKKworI0FDX0FSR19FTkFCTEUoa3F1ZXVlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUta3F1ZXVlXSxbYnVpbGQgd2l0aCBrcXVldWUgc3VwcG9ydCAoRnJlZUJTRCBvbmx5KV0pLGVuYWJsZV9rcXVldWU9JGVuYWJsZXZhbCxlbmFibGVfa3F1ZXVlPWF1dG8pCisjbWlzc2luZworCisjQUNfQVJHX0VOQUJMRShjb25zb2xlLW93bmVyLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jb25zb2xlLW93bmVyLWZpbGVdLFtlbmFibGUgY29uc29sZSBvd25lciBmaWxlXSksZW5hYmxlX2NvbnNvbGVfb3duZXJfZmlsZT0kZW5hYmxldmFsLGVuYWJsZV9jb25zb2xlX293bmVyX2ZpbGU9YXV0bykKK1NUUklORyhUT1VQUEVSICR7Q01BS0VfU1lTVEVNX05BTUV9IHN5c25hbWUpCitpZigiJHtzeXNuYW1lfSIgTUFUQ0hFUyAiLipTT0xBUklTLioiKQorICAgIE9QVElPTihIQVZFX0NPTlNPTEVfT1dORVJfRklMRSAiZW5hYmxlIGNvbnNvbGUgb3duZXIgZmlsZSAoc29sYXJpcyBvbmx5KSIgT04pCisgICAgaWYoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUpCisgICAgICAgIFNFVChEQlVTX0NPTlNPTEVfT1dORVJfRklMRSAiL2Rldi9jb25zb2xlIiBDQUNIRSBTVFJJTkcgIkRpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcCIpCisgICAgZW5kaWYoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUpCitlbmRpZigiJHtzeXNuYW1lfSIgTUFUQ0hFUyAiLipTT0xBUklTLioiKQorCisjQUNfQVJHX1dJVEgoeG1sLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXhtbD1bbGlieG1sL2V4cGF0XV0sW1hNTCBsaWJyYXJ5IHRvIHVzZV0pKQoraWYoTk9UIExJQlhNTDJfRk9VTkQgQU5EIE5PVCBMSUJFWFBBVF9GT1VORCkKKyAgICBtZXNzYWdlKEZBVEFMICJOZWl0aGVyIGV4cGF0IG5vciBsaWJ4bWwyIGZvdW5kISIpCitlbmRpZihOT1QgTElCWE1MMl9GT1VORCBBTkQgTk9UIExJQkVYUEFUX0ZPVU5EKQorCitpZihMSUJFWFBBVF9GT1VORCkKKyAgICBPUFRJT04oREJVU19VU0VfRVhQQVQgIlVzZSBleHBhdCAoPT0gT04pIG9yIGxpYnhtbDIgKD09T0ZGKSIgT04pCitlbHNlKExJQkVYUEFUX0ZPVU5EKQorICAgIE9QVElPTihEQlVTX1VTRV9FWFBBVCAiVXNlIGV4cGF0ICg9PSBPTikgb3IgbGlieG1sMiAoPT1PRkYpIiBPRkYpCitlbmRpZihMSUJFWFBBVF9GT1VORCkKKworaWYoREJVU19VU0VfRVhQQVQpCisgICAgU0VUKFhNTF9MSUIgIkV4cGF0IikKKyAgICBTRVQoWE1MX0xJQlJBUlkgICAgICR7TElCRVhQQVRfTElCUkFSSUVTfSkKKyAgICBTRVQoWE1MX0lOQ0xVREVfRElSICR7TElCRVhQQVRfSU5DTFVERV9ESVJ9KQorZWxzZShEQlVTX1VTRV9FWFBBVCkKKyAgICBTRVQoWE1MX0xJQiAiTGliWE1MMiIpCisgICAgU0VUKFhNTF9MSUJSQVJZICAgICAke0xJQlhNTDJfTElCUkFSSUVTfSkKKyAgICBTRVQoWE1MX0lOQ0xVREVfRElSICR7TElCWE1MMl9JTkNMVURFX0RJUn0pCitlbmRpZihEQlVTX1VTRV9FWFBBVCkKKworCisjQUNfQVJHX1dJVEgoaW5pdC1zY3JpcHRzLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWluaXQtc2NyaXB0cz1bcmVkaGF0XV0sW1N0eWxlIG9mIGluaXQgc2NyaXB0cyB0byBpbnN0YWxsXSkpCisjQUNfQVJHX1dJVEgoc2Vzc2lvbi1zb2NrZXQtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXNlc3Npb24tc29ja2V0LWRpcj1bZGlybmFtZV1dLFtXaGVyZSB0byBwdXQgc29ja2V0cyBmb3IgdGhlIHBlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzXSkpCisjQUNfQVJHX1dJVEgodGVzdC1zb2NrZXQtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXRlc3Qtc29ja2V0LWRpcj1bZGlybmFtZV1dLFtXaGVyZSB0byBwdXQgc29ja2V0cyBmb3IgbWFrZSBjaGVja10pKQorI0FDX0FSR19XSVRIKHN5c3RlbS1waWQtZmlsZSwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW0tcGlkLWZpbGU9W3BpZGZpbGVdXSxbUElEIGZpbGUgZm9yIHN5c3RlbXdpZGUgZGFlbW9uXSkpCisjQUNfQVJHX1dJVEgoc3lzdGVtLXNvY2tldCwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW0tc29ja2V0PVtmaWxlbmFtZV1dLFtVTklYIGRvbWFpbiBzb2NrZXQgZm9yIHN5c3RlbXdpZGUgZGFlbW9uXSkpCisjQUNfQVJHX1dJVEgoY29uc29sZS1hdXRoLWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1jb25zb2xlLWF1dGgtZGlyPVtkaXJuYW1lXV0sW2RpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcF0pKQorI0FDX0FSR19XSVRIKGNvbnNvbGUtb3duZXItZmlsZSwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1jb25zb2xlLW93bmVyLWZpbGU9W2ZpbGVuYW1lXV0sW2ZpbGUgd2hvc2Ugb3duZXIgZGV0ZXJtaW5lcyBjdXJyZW50IGNvbnNvbGUgb3duZXJdKSkKKyNBQ19BUkdfV0lUSChkYnVzX3VzZXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy11c2VyPTx1c2VyPl0sW1VzZXIgZm9yIHJ1bm5pbmcgdGhlIERCVVMgZGFlbW9uIChtZXNzYWdlYnVzKV0pKQorI0FDX0FSR19XSVRIKGRidXNfZGFlbW9uZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWRidXMtZGFlbW9uZGlyPVtkaXJuYW1lXV0sW0RpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgREJVUyBkYWVtb25dKSkKKyMgYWxsIG1pc3Npbmcgb3IgaGFyZGNvZGVkIGZvciBub3cKKworIyAnaGlkZGVuJyBvbmVzCitzZXQoYXRvbWljX2ludCBPRkYpCitzZXQoYXRvbWljX2ludDQ4NiBPRkYpCitpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgTk9UIERCVVNfRU5BQkxFX0FOU0kpCisgICAgRklORF9QUk9HUkFNKFVOQU1FX0VYRUNVVEFCTEUKKyAgICAgICAgICAgICAgICAgICAgTkFNRVMgdW5hbWUKKyAgICAgICAgICAgICAgICAgICAgUEFUSFMgL2JpbiAvdXNyL2JpbiAvdXNyL2xvY2FsL2JpbiBjOi9Qcm9ncmFtbWUvTVN5cy9iaW4gZDovUHJvZ3JhbW1lL01TeXMvYmluKQorCisgICAgaWYoVU5BTUVfRVhFQ1VUQUJMRSkKKyAgICAgICAgRVhFQ1VURV9QUk9DRVNTKENPTU1BTkQgJHtVTkFNRV9FWEVDVVRBQkxFfSAiLW0iCisgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfVkFSSUFCTEUgVU5BTUVfT1VUUFVUKQorCisgICAgICAgIGlmKCJVTkFNRV9PVVRQVVQiIE1BVENIRVMgIl4uKmlbMDEyM104Ni4qJCIpCisgICAgICAgICAgICBzZXQoYXRvbWljX2ludCBPTikKKyAgICAgICAgZWxzZSgiVU5BTUVfT1VUUFVUIiBNQVRDSEVTICJeLippWzAxMjNdODYuKiQiKQorICAgICAgICAgICAgaWYoIlVOQU1FX09VVFBVVCIgTUFUQ0hFUyAiXi4qaT84Ni4qJCIpCisgICAgICAgICAgICAgICAgc2V0KGF0b21pY19pbnQgT04pCisgICAgICAgICAgICAgICAgc2V0KGF0b21pY19pbnRfNDg2IE9OKQorICAgICAgICAgICAgZW5kaWYoIlVOQU1FX09VVFBVVCIgTUFUQ0hFUyAiXi4qaT84Ni4qJCIpCisgICAgICAgIGVuZGlmKCJVTkFNRV9PVVRQVVQiIE1BVENIRVMgIl4uKmlbMDEyM104Ni4qJCIpCisgICAgZW5kaWYoVU5BTUVfRVhFQ1VUQUJMRSkKK2VuZGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBOT1QgREJVU19FTkFCTEVfQU5TSSkKKworT1BUSU9OKERCVVNfSEFWRV9BVE9NSUNfSU5UICAgICJTb21lIGF0b21pYyBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIHByZXNlbnQiICR7YXRvbWljX2ludH0pCitPUFRJT04oREJVU19VU0VfQVRPTUlDX0lOVF80ODYgIlVzZSBhdG9taWMgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBmb3IgNDg2IiAke2F0b21pY19pbnRfNDg2fSkKKworaWYoWDExX0ZPVU5EKQorICBPUFRJT04oREJVU19CVUlMRF9YMTEgIkJ1aWxkIHdpdGggWDExIGF1dG9sYXVuY2ggc3VwcG9ydCAiIE9OKQorZW5kaWYoWDExX0ZPVU5EKQorCisjIHRlc3QgYmluYXJ5IG5hbWVzCitpZiAoV0lOMzIpCisJc2V0IChFWFQgIi5leGUiKQorZW5kaWYoV0lOMzIpCisKK2lmIChNU1ZDX0lERSkKKyAgICBpZihDTUFLRV9CVUlMRF9UWVBFIE1BVENIRVMgRGVidWcpCisJCXNldChJREVfQklOIERlYnVnLyApCisJCW1lc3NhZ2UoU1RBVFVTKQorCQltZXNzYWdlKFNUQVRVUyAiVmlzdWFsIFN0dWRpbzogdGVzdCBwcm9ncmFtcyB3aWxsIG9ubHkgd29yayB3aXRoICdEZWJ1ZycgY29uZmlndXJhdGlvbiEiKQorCQltZXNzYWdlKFNUQVRVUyAiVG8gcnVuIHRlc3RzIHdpdGggJ1JlbGVhc2UnIGNvbmZpZ3VyYXRpb24gdXNlIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIikKKwkJbWVzc2FnZShTVEFUVVMgIkFkZCAnLi5cXC4uXFx0ZXN0XFxkYXRhJyB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiBvZiB0aGUgdGVzdCBwcm9ncmFtcyIpCisJCW1lc3NhZ2UoU1RBVFVTKQorICAgIGVsc2UoQ01BS0VfQlVJTERfVFlQRSBNQVRDSEVTIERlYnVnKQorCQlzZXQoSURFX0JJTiBSZWxlYXNlLykKKwkJbWVzc2FnZShTVEFUVVMpCisJCW1lc3NhZ2UoU1RBVFVTICJWaXN1YWwgU3R1ZGlvOiB0ZXN0IHByb2dyYW1zIHdpbGwgb25seSB3b3JrIHdpdGggJ1JlbGVhc2UnIGNvbmZpZ3VyYXRpb24hIikKKwkJbWVzc2FnZShTVEFUVVMgIlRvIHJ1biB0ZXN0cyB3aXRoICdEZWJ1ZycgY29uZmlndXJhdGlvbiB1c2UgLURDTUFLRV9CVUlMRF9UWVBFPURlYnVnIikKKwkJbWVzc2FnZShTVEFUVVMgIkFkZCAnLi5cXC4uXFx0ZXN0XFxkYXRhJyB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiBvZiB0aGUgdGVzdCBwcm9ncmFtcyIpCisJCW1lc3NhZ2UoU1RBVFVTKQorICAgIGVuZGlmKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyBEZWJ1ZykKKwlzZXQgKFRFU1RfUEFUSF9GT1JDRSBGT1JDRSkKKwlGSUxFKFJFTU9WRSAke0NNQUtFX0JJTkFSWV9ESVJ9L2RhdGEvZGJ1cy0xL3NlcnZpY2VzKQorZW5kaWYgKE1TVkNfSURFKQorCitzZXQoVEVTVF9TRVJWSUNFX0RJUiAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzICAgICBDQUNIRSBTVFJJTkcgIkZ1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMgaW4gYnVpbGRkaXIiICkKK3NldChURVNUX1NFUlZJQ0VfQklOQVJZICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0vYmluLyR7SURFX0JJTn10ZXN0LXNlcnZpY2Uke0VYVH0gICAgICAgQ0FDSEUgU1RSSU5HICJGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1zZXJ2aWNlIGluIGJ1aWxkZGlyIiAke1RFU1RfUEFUSF9GT1JDRX0pCitzZXQoVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi8ke0lERV9CSU59dGVzdC1zaGVsbC1zZXJ2aWNlJHtFWFR9IENBQ0hFIFNUUklORyAiRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZSBpbiBidWlsZGRpciIgJHtURVNUX1BBVEhfRk9SQ0V9KQorc2V0KFRFU1RfRVhJVF9CSU5BUlkgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS9iaW4vJHtJREVfQklOfXRlc3QtZXhpdCR7RVhUfSAgICAgICAgICBDQUNIRSBTVFJJTkcgIkZ1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC90ZXN0LWV4aXQgaW4gYnVpbGRkaXIiICR7VEVTVF9QQVRIX0ZPUkNFfSkKK3NldChURVNUX1NFR0ZBVUxUX0JJTkFSWSAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0vYmluLyR7SURFX0JJTn10ZXN0LXNlZ2ZhdWx0JHtFWFR9ICAgICAgQ0FDSEUgU1RSSU5HICJGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1zZWdmYXVsdCBpbiBidWlsZGRpciIgJHtURVNUX1BBVEhfRk9SQ0V9KQorc2V0KFRFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkgJHtDTUFLRV9CSU5BUllfRElSfS9iaW4vJHtJREVfQklOfXRlc3Qtc2xlZXAtZm9yZXZlciR7RVhUfSBDQUNIRSBTVFJJTkcgIkZ1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIgaW4gYnVpbGRkaXIiICR7VEVTVF9QQVRIX0ZPUkNFfSkKKworIyMjIyBGaW5kIHNvY2tldCBkaXJlY3RvcmllcworIGlmIChOT1QgJEVOVntUTVBESVJ9IFNUUkVRVUFMICIiKQorICAgICBzZXQgKERCVVNfU0VTU0lPTl9TT0NLRVRfRElSICRFTlZ7VE1QRElSfSkKKyBlbHNlIChOT1QgJEVOVntUTVBESVJ9IFNUUkVRVUFMICIiKQorICAgICBpZiAoTk9UICRFTlZ7VEVNUH0gU1RSRVFVQUwgIiIpCisgICAgICAgICBzZXQgKERCVVNfU0VTU0lPTl9TT0NLRVRfRElSICRFTlZ7VEVNUH0pCisgICAgIGVsc2UgKE5PVCAkRU5We1RFTVB9IFNUUkVRVUFMICIiKQorICAgICAgICAgaWYgKE5PVCAkRU5We1RNUH0gU1RSRVFVQUwgIiIpCisgICAgICAgICAgICAgc2V0IChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAkRU5We1RNUH0pCisgICAgICAgICBlbHNlIChOT1QgJEVOVntUTVB9IFNUUkVRVUFMICIiKQorICAgICAgICAgaWYgKFdJTjMyKQorICAgICAgICAgICAgICNTaG91bGQgbmV2ZXIgaGFwcGVuLCBib3RoIFRNUCBhbmQgVEVNUCBzZWVtIGFsd2F5cyBzZXQgb24gV2luZG93cworICAgICAgICAgICAgIG1lc3NhZ2UoRkFUQUwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgYSB1c2FibGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSIpCisgICAgICAgICBlbHNlKFdJTjMyKQorICAgICAgICAgICAgc2V0IChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAvdG1wKQorICAgICAgICAgZW5kaWYoV0lOMzIpCisgICAgICAgICBlbmRpZiAoTk9UICRFTlZ7VE1QfSBTVFJFUVVBTCAiIikKKyAgICAgZW5kaWYgKE5PVCAkRU5We1RFTVB9IFNUUkVRVUFMICIiKQorIGVuZGlmIChOT1QgJEVOVntUTVBESVJ9IFNUUkVRVUFMICIiKQorCisjQUNfQVJHX1dJVEgodGVzdC1zb2NrZXQtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXRlc3Qtc29ja2V0LWRpcj1bZGlybmFtZV1dLFtXaGVyZSB0byBwdXQgc29ja2V0cyBmb3IgbWFrZSBjaGVja10pKQorCisjQUNfQVJHX1dJVEgoc3lzdGVtLXBpZC1maWxlLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbS1waWQtZmlsZT1bcGlkZmlsZV1dLFtQSUQgZmlsZSBmb3Igc3lzdGVtd2lkZSBkYWVtb25dKSkKKworI2lmICEgdGVzdCAteiAiJHdpdGhfc3lzdGVtX3BpZF9maWxlIjsgdGhlbgorIyAgIERCVVNfU1lTVEVNX1BJRF9GSUxFPSR3aXRoX3N5c3RlbV9waWRfZmlsZQorI2VsaWYgdGVzdCB4JG9wZXJhdGluZ19zeXN0ZW0gPSB4cmVkaGF0IDsgdGhlbgorIyAgIERCVVNfU1lTVEVNX1BJRF9GSUxFPSR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0vcnVuL21lc3NhZ2VidXMucGlkCisjZWxzZQorIyAgIERCVVNfU1lTVEVNX1BJRF9GSUxFPSR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0vcnVuL2RidXMvcGlkCisjZmkKKyMgVE9ETzogZml4IHJlZGhldAoraWYgKFdJTjMyKQorICAjIGJ1cy10ZXN0IGV4cGVjdHMgYSBub24gZW1wdHkgc3RyaW5nCisJc2V0IChEQlVTX1NZU1RFTV9QSURfRklMRSAiL2RidXMtcGlkIikKK2Vsc2UgKFdJTjMyKQorCXNldCAoREJVU19TWVNURU1fUElEX0ZJTEUgJHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfS9ydW4vZGJ1cy9waWQpCitlbmRpZiAoV0lOMzIpCisKKyNBQ19BUkdfV0lUSChzeXN0ZW0tc29ja2V0LCBBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbS1zb2NrZXQ9W2ZpbGVuYW1lXV0sW1VOSVggZG9tYWluIHNvY2tldCBmb3Igc3lzdGVtd2lkZSBkYWVtb25dKSkKKworI0FDX0FSR19XSVRIKGNvbnNvbGUtYXV0aC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtY29uc29sZS1hdXRoLWRpcj1bZGlybmFtZV1dLFtkaXJlY3RvcnkgdG8gY2hlY2sgZm9yIGNvbnNvbGUgb3duZXJoaXBdKSkKKworaWYgKFdJTjMyKQorCXNldCAoREJVU19DT05TT0xFX0FVVEhfRElSICIiKQorZWxzZSAoV0lOMzIpCisJc2V0IChEQlVTX0NPTlNPTEVfQVVUSF9ESVIgIi92YXIvcnVuL2NvbnNvbGUvIikKK2VuZGlmIChXSU4zMikKKworI0FDX0FSR19XSVRIKGRidXNfdXNlciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYnVzLXVzZXI9PHVzZXI+XSxbVXNlciBmb3IgcnVubmluZyB0aGUgREJVUyBkYWVtb24gKG1lc3NhZ2VidXMpXSkpCisKK3NldCAoREJVU19VU0VSICkKKworCitpZiAoV0lOMzIpCisgIHNldCAoREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyAibm9uY2UtdGNwOiIgQ0FDSEUgU1RSSU5HICJzeXN0ZW0gYnVzIGRlZmF1bHQgYWRkcmVzcyIgKQorICBzZXQgKERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTICJub25jZS10Y3A6IiBDQUNIRSBTVFJJTkcgInNlc3Npb24gYnVzIGRlZmF1bHQgYWRkcmVzcyIgKQorCisgIHNldCAoREJVU19TWVNURU1fQ09ORklHX0ZJTEUgImV0Yy9kYnVzLTEvc3lzdGVtLmNvbmYiKQorICBzZXQgKERCVVNfU0VTU0lPTl9DT05GSUdfRklMRSAiZXRjL2RidXMtMS9zZXNzaW9uLmNvbmYiKQorICAjIGJ1cy10ZXN0IGV4cGVjdHMgYSBub24gZW1wdHkgc3RyaW5nCisgIHNldCAoREJVU19VU0VSICJBZG1pbmlzdHJhdG9yIikKK2Vsc2UgKFdJTjMyKQorICBzZXQgKERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MgInVuaXg6dG1wZGlyPSIgQ0FDSEUgU1RSSU5HICJzeXN0ZW0gYnVzIGRlZmF1bHQgYWRkcmVzcyIgKQorICBzZXQgKERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTICJ1bml4OnBhdGg9JHtEQlVTX1NFU1NJT05fU09DS0VUX0RJUn0iIENBQ0hFIFNUUklORyAic2Vzc2lvbiBidXMgZGVmYXVsdCBhZGRyZXNzIiApCisgIHNldCAoc3lzY29uZmRpciAiIikKKyAgc2V0IChjb25maWdkaXIgJHtzeXNjb25mZGlyfS9kYnVzLTEgKQorICBzZXQgKERCVVNfU1lTVEVNX0NPTkZJR19GSUxFICAke2NvbmZpZ2Rpcn0vc3lzdGVtLmNvbmYpCisgIHNldCAoREJVU19TRVNTSU9OX0NPTkZJR19GSUxFICR7Y29uZmlnZGlyfS9zZXNzaW9uLmNvbmYpCisgIHNldCAoREJVU19VU0VSICJyb290IikKK2VuZGlmIChXSU4zMikKKworc2V0KERCVVNfREFFTU9OX05BTUUgZGJ1cy1kYWVtb24gQ0FDSEUgU1RSSU5HICJUaGUgbmFtZSBvZiB0aGUgZGJ1cyBkYWVtb24gZXhlY3V0YWJsZSIpCisKKyMjIyMjIyMjIyMjIGNyZWF0ZSBjb25maWcuaCAjIyMjIyMjIyMjIyMjIyMKKworI2luY2x1ZGUoQ29uZmlndXJlQ2hlY2tzLmNtYWtlKQorCisjIGJldHRlciB1c2UgZmxhZ3MgZm9yIGdjYworaWYgKE1JTkdXKQorCXNldCAoSEFWRV9HTlVDX1ZBUkFSR1MgMSkKK2VuZGlmKE1JTkdXKQorCisjIGNvbXBpbGVyIGRlZmluaXRpb25zCithZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IPTEpCithZGRfZGVmaW5pdGlvbnMoJHtEQlVTX0JVU19DRkxBR1N9IC1EREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0UpCisKKworaWYgKERCVVNfQlVJTERfVEVTVFMpCisgICAgIyBzZXQgdmFyaWFibGVzIHVzZWQgZm9yIHRoZSAuaW4gZmlsZXMgKHN1YnN0aXR1dGVkIGJ5IGNvbmZpZ3VyZV9maWxlKSBpbiB0ZXN0L2RhdGE6CisgICAgc2V0KFRFU1RfVkFMSURfU0VSVklDRV9ESVIgJHtDTUFLRV9CSU5BUllfRElSfS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcykKKyAgICBzZXQoVEVTVF9WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVIgJHtDTUFLRV9CSU5BUllfRElSfS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0pCisgICAgc2V0KFRFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVIgJHtDTUFLRV9CSU5BUllfRElSfS90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbSkKKyAgICBzZXQoVEVTVF9TT0NLRVRfRElSICR7REJVU19TRVNTSU9OX1NPQ0tFVF9ESVJ9ICkKKyAgICBzZXQoVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWSAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCkKKyAgICBzZXQoVEVTVF9QUklWU0VSVkVSX0JJTkFSWSAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3Rlc3QtcHJpdnNlcnZlcikKKyAgICBpZiAoVU5JWCkKKyAgICAgICAgc2V0IChURVNUX0xJU1RFTiAiZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyPC9saXN0ZW4+PGxpc3Rlbj51bml4OnRtcGRpcj0ke1RFU1RfU09DS0VUX0RJUn0iKQorICAgICAgICBzZXQgKFRFU1RfQ09OTkVDVElPTiAiZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyIikKKyAgICBlbmRpZiAoVU5JWCkKKyAgICBpZiAoV0lOMzIpCisgICAgICAgIHNldCAoVEVTVF9MSVNURU4gInRjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTEyNDM2IikKKyAgICAgICAgc2V0IChURVNUX0NPTk5FQ1RJT04gIiR7VEVTVF9MSVNURU59IikKKyAgICBlbmRpZiAoV0lOMzIpCitlbmRpZiAgKERCVVNfQlVJTERfVEVTVFMpCisKK3NldChEQlVTX0xJQlJBUklFUyBkYnVzLTEpCitzZXQoREJVU19JTlRFUk5BTF9MSUJSQVJJRVMgZGJ1cy1pbnRlcm5hbCkKKworIyBzZXR0aW5ncyBmb3IgYnVpbGRpbmcgYW5kIHVzaW5nIHN0YXRpYyBpbnRlcm5hbCBsaWIKKyMgaW1wb3J0YW50IG5vdGU6IERCVVNfSU5URVJOQUxfeHh4eHhfREVGSU5JVElPTlMgbXVzdCAqbm90KiBiZSBzZXQgd2hlbiBidWlsZGluZyBkYnVzLTEgbGlicmFyeQorc2V0IChEQlVTX0lOVEVSTkFMX0FERF9MSUJSQVJZX09QVElPTlMgU1RBVElDKQorc2V0IChEQlVTX0lOVEVSTkFMX0xJQlJBUllfREVGSU5JVElPTlMgIi1EREJVU19TVEFUSUNfQlVJTEQiKQorc2V0IChEQlVTX0lOVEVSTkFMX0NMSUVOVF9ERUZJTklUSU9OUyAiLUREQlVTX1NUQVRJQ19CVUlMRCIpCisKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb25maWcuaC5jbWFrZSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY29uZmlnLmggKQorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RidXMtZW52LmJhdC5jbWFrZSAke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi9kYnVzLWVudi5iYXQgKQoraW5zdGFsbF9maWxlcygvYmluIEZJTEVTICR7Q01BS0VfQklOQVJZX0RJUn0vYmluL2RidXMtZW52LmJhdCkKK2FkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0g9MSkKKworIyMjIyMjIyMjIyMgc3ViZGlycyAjIyMjIyMjIyMjIyMjIyMKKworYWRkX3N1YmRpcmVjdG9yeSggZGJ1cyApCithZGRfc3ViZGlyZWN0b3J5KCBidXMgKQoraWYgKERCVVNfQlVJTERfVEVTVFMpCisJYWRkX3N1YmRpcmVjdG9yeSggdGVzdCApCitlbmRpZiAoREJVU19CVUlMRF9URVNUUykKK2FkZF9zdWJkaXJlY3RvcnkoIHRvb2xzICkKK2FkZF9zdWJkaXJlY3RvcnkoIGRvYyApCisKKworT1BUSU9OKERCVVNfSU5TVEFMTF9TWVNURU1fTElCUyAiaW5zdGFsbCByZXF1aXJlZCBzeXN0ZW0gbGlicmFyaWVzIiBPRkYpCitNRVNTQUdFKCIgIikKK01FU1NBR0UoInNldCAtRERCVVNfSU5TVEFMTF9TWVNURU1fTElCUz0xIHRvIGluc3RhbGwgcnVudGltZSBsaWJyYXJpZXMgdG9vIikKK01FU1NBR0UoInNldCBEQlVTRElSIChlbnZpcm9ubWVudCBvciBjbWFrZSBvcHRpb24pIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBpbnN0YWxsIGRpcmVjdG9yeSAiKQorTUVTU0FHRSgiICIpCitNRVNTQUdFKCIgIikKK0dFVF9GSUxFTkFNRV9DT01QT05FTlQoQ19DT01QSUxFUiAke0NNQUtFX0NfQ09NUElMRVJ9IE5BTUUpCitHRVRfRklMRU5BTUVfQ09NUE9ORU5UKENYWF9DT01QSUxFUiAke0NNQUtFX0NYWF9DT01QSUxFUn0gTkFNRSkKKworbWVzc2FnZSgiICAgICAgICAgICAgICAgICAgRC1CVVMgJHtEQlVTX1ZFUlNJT059ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgICAgICAgICAgICA9PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIHByZWZpeDogICAgICAgICAgICR7cHJlZml4fSAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgZXhlY19wcmVmaXg6ICAgICAgJHtleGVjX3ByZWZpeH0gICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBsaWJkaXI6ICAgICAgICAgICAke0VYUEFOREVEX0xJQkRJUn0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIGJpbmRpcjogICAgICAgICAgICR7RVhQQU5ERURfQklORElSfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgc3lzY29uZmRpcjogICAgICAgJHtFWFBBTkRFRF9TWVNDT05GRElSfSAgICAgICAgICAgICAgIikKKyNtZXNzYWdlKCIgICAgICAgIGluc3RhbGwgbG9jYWxzdGF0ZWRpcjogICAgJHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfSAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBkYXRhZGlyOiAgICAgICAgICAke0VYUEFOREVEX0RBVEFESVJ9ICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBzb3VyY2UgY29kZSBsb2NhdGlvbjogICAgICR7REJVU19TT1VSQ0VfRElSfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGJ1aWxkIGRpcjogICAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgYyBjb21waWxlcjogICAgICAgICAgICAgICAke0NfQ09NUElMRVJ9ICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjZmxhZ3M6ICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ19GTEFHU30gICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGNmbGFncyBkZWJ1ZzogICAgICAgICAgICAgJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY2ZsYWdzIHJlbGVhc2U6ICAgICAgICAgICAke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjeHggY29tcGlsZXI6ICAgICAgICAgICAgICR7Q1hYX0NPTVBJTEVSfSAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGN4eGZsYWdzOiAgICAgICAgICAgICAgICAgJHtDTUFLRV9DWFhfRkxBR1N9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY3h4ZmxhZ3MgZGVidWc6ICAgICAgICAgICAke0NNQUtFX0NYWF9GTEFHU19ERUJVR30gICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjeHhmbGFncyByZWxlYXNlOiAgICAgICAgICR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9ICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIDY0LWJpdCBpbnQ6ICAgICAgICAgICAgICAgJHtEQlVTX0lOVDY0X1RZUEV9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgMzItYml0IGludDogICAgICAgICAgICAgICAke0RCVVNfSU5UMzJfVFlQRX0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICAxNi1iaXQgaW50OiAgICAgICAgICAgICAgICR7REJVU19JTlQxNl9UWVBFfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIERveHlnZW46ICAgICAgICAgICAgICAgICAgJHtET1hZR0VOfSAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgRG9jYm9vayBHZW5lcmF0b3I6ICAgICAgICAke0RPQ0JPT0tfR0VORVJBVE9SX05BTUV9ICAgICAgICAgICAiKQorCisKKyNtZXNzYWdlKCIgICAgICAgIE1haW50YWluZXIgbW9kZTogICAgICAgICAgJHtVU0VfTUFJTlRBSU5FUl9NT0RFfSAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgZ2NjIGNvdmVyYWdlIHByb2ZpbGluZzogICAke0RCVVNfR0NPVl9FTkFCTEVEfSAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyB1bml0IHRlc3RzOiAgICAgICR7REJVU19CVUlMRF9URVNUU30gICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIHZlcmJvc2UgbW9kZTogICAgJHtEQlVTX0VOQUJMRV9WRVJCT1NFX01PREV9ICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgdy9vIGFzc2VydGlvbnM6ICAke0RCVVNfRElTQUJMRV9BU1NFUlRTfSAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyB3L28gY2hlY2tzOiAgICAgICR7REJVU19ESVNBQkxFX0NIRUNLU30gICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGxpbmcgc3lzdGVtIGxpYnM6ICAgJHtEQlVTX0lOU1RBTExfU1lTVEVNX0xJQlN9ICAgICAgICAgIikKKyNtZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIFNFTGludXggc3VwcG9ydDogJHtoYXZlX3NlbGludXh9ICAgICAgICAgICAgICAgICAgICAgIikKKyNtZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIGRub3RpZnkgc3VwcG9ydDogJHtoYXZlX2Rub3RpZnl9ICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgRG94eWdlbiBkb2NzOiAgICAke0RCVVNfRU5BQkxFX0RPWFlHRU5fRE9DU30gICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyBYTUwgZG9jczogICAgICAgICR7REJVU19FTkFCTEVfWE1MX0RPQ1N9ICAgICAgICAgICAgICIpCisjbWVzc2FnZSgiICAgICAgICBHZXR0ZXh0IGxpYnMgKGVtcHR5IE9LKTogICR7SU5UTExJQlN9ICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIFVzaW5nIFhNTCBwYXJzZXI6ICAgICAgICAgJHtYTUxfTElCfSAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgRGFlbW9uIGV4ZWN1dGFibGUgbmFtZTogICAke0RCVVNfREFFTU9OX05BTUV9IikKK2lmIChXSU4zMikKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyBhZGRyZXNzOiAgICAgICAke0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1N9ICAiKQorbWVzc2FnZSgiICAgICAgICBTZXNzaW9uIGJ1cyBhZGRyZXNzOiAgICAgICR7REJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1N9ICIpCitlbHNlIChXSU4zMikKKyNtZXNzYWdlKCIgICAgICAgIEluaXQgc2NyaXB0cyBzdHlsZTogICAgICAgJHt3aXRoX2luaXRfc2NyaXB0c30gICAgICAgICAgICAgICAgIikKKyNtZXNzYWdlKCIgICAgICAgIEFic3RyYWN0IHNvY2tldCBuYW1lczogICAgJHtoYXZlX2Fic3RyYWN0X3NvY2tldHN9ICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyBzb2NrZXQ6ICAgICAgICAke0RCVVNfU1lTVEVNX1NPQ0tFVH0gICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBTeXN0ZW0gYnVzIGFkZHJlc3M6ICAgICAgICR7REJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU30gICIpCittZXNzYWdlKCIgICAgICAgIFN5c3RlbSBidXMgUElEIGZpbGU6ICAgICAgJHtEQlVTX1NZU1RFTV9QSURfRklMRX0gICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgU2Vzc2lvbiBidXMgc29ja2V0IGRpcjogICAke0RCVVNfU0VTU0lPTl9TT0NLRVRfRElSfSAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBDb25zb2xlIGF1dGggZGlyOiAgICAgICAgICR7REJVU19DT05TT0xFX0FVVEhfRElSfSAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIFN5c3RlbSBidXMgdXNlcjogICAgICAgICAgJHtEQlVTX1VTRVJ9ICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgJ21ha2UgY2hlY2snIHNvY2tldCBkaXI6ICAke1RFU1RfU09DS0VUX0RJUn0gICAgICAgICAgICAgICAgICAiKQorZW5kaWYgKFdJTjMyKQorbWVzc2FnZSgiICAgICAgICBUZXN0IGxpc3RlbiBhZGRyZXNzOiAgICAgICR7VEVTVF9MSVNURU59ICAgICAgICAgICAgICAgICAgICAgICIpCitpZiAoTVNWQykKK21lc3NhZ2UoIiAgICAgICAgYnVpbGQgdGltZXN0YW1wOiAgICAgICAgICAke0RCVVNfQlVJTERfVElNRVNUQU1QfSAgICAgICAgICAgICAiKQorZW5kaWYgKE1TVkMpCisKK01FU1NBR0UoIiAiKQoraWYgKERCVVNfQlVJTERfVEVTVFMpCisgICAgbWVzc2FnZSgiTk9URTogYnVpbGRpbmcgd2l0aCB1bml0IHRlc3RzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgYW5kIHJlbmRlcnMgaXQgaW5zZWN1cmUuIikKK2VuZGlmKERCVVNfQlVJTERfVEVTVFMpCisKK2lmIChEQlVTX0JVSUxEX1RFU1RTIEFORCBEQlVTX0RJU0FCTEVfQVNTRVJUUykKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIHVuaXQgdGVzdHMgYnV0IHdpdGhvdXQgYXNzZXJ0aW9ucyBtZWFucyB0ZXN0cyBtYXkgbm90IHByb3Blcmx5IHJlcG9ydCBmYWlsdXJlcyAodGhpcyBjb25maWd1cmF0aW9uIGlzIG9ubHkgdXNlZnVsIHdoZW4gZG9pbmcgc29tZXRoaW5nIGxpa2UgcHJvZmlsaW5nIHRoZSB0ZXN0cykiKQorZW5kaWYoREJVU19CVUlMRF9URVNUUyBBTkQgREJVU19ESVNBQkxFX0FTU0VSVFMpCisKK2lmIChEQlVTX0dDT1ZfRU5BQkxFRCkKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpcyBkZWZpbml0ZWx5IGZvciBkZXZlbG9wZXJzIG9ubHkuIikKK2VuZGlmKERCVVNfR0NPVl9FTkFCTEVEKQorCitpZiAoREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggdmVyYm9zZSBtb2RlIGluY3JlYXNlcyBsaWJyYXJ5IHNpemUsIG1heSBzbGlnaHRseSBpbmNyZWFzZSBzZWN1cml0eSByaXNrLCBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIpCitlbmRpZihEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUpCisKK2lmKE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUUykKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIGFzc2VydGlvbnMgaW5jcmVhc2VzIGxpYnJhcnkgc2l6ZSBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIpCitlbmRpZihOT1QgREJVU19ESVNBQkxFX0FTU0VSVFMpCisKK2lmIChEQlVTX0RJU0FCTEVfQ0hFQ0tTKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGhvdXQgY2hlY2tzIGZvciBhcmd1bWVudHMgcGFzc2VkIHRvIHB1YmxpYyBBUEkgbWFrZXMgaXQgaGFyZGVyIHRvIGRlYnVnIGFwcHMgdXNpbmcgRC1CVVMsIGJ1dCB3aWxsIHNsaWdodGx5IGRlY3JlYXNlIEQtQlVTIGxpYnJhcnkgc2l6ZSBhbmQgX3ZlcnlfIHNsaWdodGx5IGltcHJvdmUgcGVyZm9ybWFuY2UuIikKK2VuZGlmKERCVVNfRElTQUJMRV9DSEVDS1MpCitNRVNTQUdFKCIgIikKKworSU5DTFVERShtb2R1bGVzL0NQYWNrSW5zdGFsbENvbmZpZy5jbWFrZSkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhiNjBkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCkBAIC0wLDAgKzEsMTY0IEBACitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCitpbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQoraW5jbHVkZShDaGVja1N0cnVjdE1lbWJlcikKK2luY2x1ZGUoQ2hlY2tUeXBlU2l6ZSkKKworY2hlY2tfaW5jbHVkZV9maWxlKGRpcmVudC5oICAgICBIQVZFX0RJUkVOVF9IKSAgIyBkYnVzLXN5c2RlcHMtdXRpbC5jCitjaGVja19pbmNsdWRlX2ZpbGUoaW8uaCAgICAgICAgIEhBVkVfSU9fSCkgICAgICAjIGludGVybmFsCitjaGVja19pbmNsdWRlX2ZpbGUoZ3JwLmggICAgICAgIEhBVkVfR1JQX0gpICAgICAjIGRidXMtc3lzZGVwcy11dGlsLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BvbGwuaCAgIEhBVkVfUE9MTCkgICAgICAjIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdGltZS5oICAgSEFWRV9TWVNfVElNRV9IKSMgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3dhaXQuaCAgIEhBVkVfU1lTX1dBSVRfSCkjIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfaW5jbHVkZV9maWxlKHRpbWUuaCAgICAgICBIQVZFX1RJTUVfSCkgICAgIyBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZSh3czJ0Y3BpcC5oICAgSEFWRV9XUzJUQ1BJUF9IKSMgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUod3NwaWFwaS5oICAgIEhBVkVfV1NQSUFQSV9IKSAjIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfaW5jbHVkZV9maWxlKHVuaXN0ZC5oICAgICBIQVZFX1VOSVNURF9IKSAgIyBkYnVzLXN5c2RlcHMtdXRpbC13aW4uYworY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGlvLmggICAgICBIQVZFX1NURElPX0gpICAgIyBkYnVzLXN5c2RlcHMuaAorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zeXNsaW1pdHMuaCAgICBIQVZFX1NZU19TWVNMSU1JVFNfSCkgICAjIGRidXMtc3lzZGVwcy11bml4LmMKK2NoZWNrX2luY2x1ZGVfZmlsZShlcnJuby5oICAgICBIQVZFX0VSUk5PX0gpICAgICMgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShzaWduYWwuaCAgICAgSEFWRV9TSUdOQUxfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShsb2NhbGUuaCAgICAgSEFWRV9MT0NBTEVfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShpbnR0eXBlcy5oICAgICBIQVZFX0lOVFRZUEVTX0gpICAgIyBkYnVzLXBpcGUuaAorY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGludC5oICAgICBIQVZFX1NURElOVF9IKSAgICMgZGJ1cy1waXBlLmgKKworY2hlY2tfc3ltYm9sX2V4aXN0cyhiYWNrdHJhY2UgICAgImV4ZWNpbmZvLmgiICAgICAgIEhBVkVfQkFDS1RSQUNFKSAgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYywgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19zeW1ib2xfZXhpc3RzKGdldGdyb3VwbGlzdCAiZ3JwLmgiICAgICAgICAgICAgSEFWRV9HRVRHUk9VUExJU1QpICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKGdldHBlZXJ1Y3JlZCAidWNyZWQuaCIgICAgICAgICAgSEFWRV9HRVRQRUVSVUNSRUQpICAgICAgICMgIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMobmFub3NsZWVwICAgICJ0aW1lLmgiICAgICAgICAgICBIQVZFX05BTk9TTEVFUCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHduYW1fciAgICJlcnJuby5oIHB3ZC5oIiAgICBIQVZFX1BPU0lYX0dFVFBXTkFNX1IpICAgIyAgZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCitjaGVja19zeW1ib2xfZXhpc3RzKHNldGVudiAgICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9TRVRFTlYpICAgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKHVuc2V0ZW52ICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9VTlNFVEVOVikgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKGNsZWFyZW52ICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9DTEVBUkVOVikgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKHdyaXRldiAgICAgICAic3lzL3Vpby5oIiAgICAgICAgSEFWRV9XUklURVYpICAgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICJzeXMvcmVzb3VyY2UuaCIgICBIQVZFX1NFVFJMSU1JVCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMsIGRidXMtc3lzZGVwcy13aW4uYywgdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0cGFpciAgICJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NPQ0tFVFBBSVIpICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc29ja2xlbl90ICAgICJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NPQ0tMRU5fVCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLXVuaXguYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRsb2NhbGUgICAgImxvY2FsZS5oIiAgICAgICAgIEhBVkVfU0VUTE9DQUxFKSAgICAgICAgICAjICBkYnVzLXRlc3QtbWFpbi5jCitjaGVja19zeW1ib2xfZXhpc3RzKGxvY2FsZWNvbnYgICAibG9jYWxlLmgiICAgICAgICAgSEFWRV9MT0NBTEVDT05WKSAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRvbGwgICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9TVFJUT0xMKSAgICAgICAgICAgICMgIGRidXMtc2VuZC5jCitjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRvdWxsICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9TVFJUT1VMTCkgICAgICAgICAgICMgIGRidXMtc2VuZC5jCisKK2NoZWNrX3N0cnVjdF9tZW1iZXIoY21zZ2NyZWQgY21jcmVkX3BpZCAic3lzL3R5cGVzLmggc3lzL3NvY2tldC5oIiBIQVZFX0NNU0dDUkVEKSAgICMgIGRidXMtc3lzZGVwcy5jCisKKyMgbWlzc2luZzoKKyMgSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisjIERCVVNfSEFWRV9HQ0MzM19HQ09WCisKK2NoZWNrX3R5cGVfc2l6ZSgic2hvcnQiICAgICBTSVpFT0ZfU0hPUlQpCitjaGVja190eXBlX3NpemUoImludCIgICAgICAgU0laRU9GX0lOVCkKK2NoZWNrX3R5cGVfc2l6ZSgibG9uZyIgICAgICBTSVpFT0ZfTE9ORykKK2NoZWNrX3R5cGVfc2l6ZSgibG9uZyBsb25nIiBTSVpFT0ZfTE9OR19MT05HKQorY2hlY2tfdHlwZV9zaXplKCJfX2ludDY0IiAgIFNJWkVPRl9fX0lOVDY0KQorCisjIERCVVNfSU5UNjRfVFlQRQoraWYoU0laRU9GX0lOVCBFUVVBTCA4KQorICAgIHNldCAoREJVU19IQVZFX0lOVDY0IDEpCisgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgImludCIpCitlbHNlKFNJWkVPRl9JTlQgRVFVQUwgOCkKKyAgICBpZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQorICAgICAgICBzZXQgKERCVVNfSEFWRV9JTlQ2NCAxKQorICAgICAgICBzZXQgKERCVVNfSU5UNjRfVFlQRSAibG9uZyIpCisgICAgZWxzZShTSVpFT0ZfTE9ORyBFUVVBTCA4KQorICAgICAgICBpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCisgICAgICAgICAgICBzZXQgKERCVVNfSEFWRV9JTlQ2NCAxKQorICAgICAgICAgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgImxvbmcgbG9uZyIpCisgICAgICAgIGVsc2UoU0laRU9GX0xPTkdfTE9ORyBFUVVBTCA4KQorICAgICAgICAgICAgaWYoU0laRU9GX19fSU5UNjQgRVFVQUwgOCkKKyAgICAgICAgICAgICAgICBzZXQgKERCVVNfSEFWRV9JTlQ2NCAxKQorICAgICAgICAgICAgICAgIHNldCAoREJVU19JTlQ2NF9UWVBFICJfX2ludDY0IikKKyAgICAgICAgICAgIGVuZGlmKFNJWkVPRl9fX0lOVDY0IEVRVUFMIDgpCisgICAgICAgIGVuZGlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKKyAgICBlbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQorZW5kaWYoU0laRU9GX0lOVCBFUVVBTCA4KQorCisjIERCVVNfSU5UMzJfVFlQRQoraWYoU0laRU9GX0lOVCBFUVVBTCA0KQorICAgIHNldCAoREJVU19JTlQzMl9UWVBFICJpbnQiKQorZWxzZShTSVpFT0ZfSU5UIEVRVUFMIDQpCisgICAgaWYoU0laRU9GX0xPTkcgRVFVQUwgNCkKKyAgICAgICAgc2V0IChEQlVTX0lOVDMyX1RZUEUgImxvbmciKQorICAgIGVsc2UoU0laRU9GX0xPTkcgRVFVQUwgNCkKKyAgICAgICAgaWYoU0laRU9GX0xPTkdfTE9ORyBFUVVBTCA0KQorICAgICAgICAgICAgc2V0IChEQlVTX0lOVDMyX1RZUEUgImxvbmcgbG9uZyIpCisgICAgICAgIGVuZGlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgNCkKKyAgICBlbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCA0KQorZW5kaWYoU0laRU9GX0lOVCBFUVVBTCA0KQorCisjIERCVVNfSU5UMTZfVFlQRQoraWYoU0laRU9GX0lOVCBFUVVBTCAyKQorICAgIHNldCAoREJVU19JTlQxNl9UWVBFICJpbnQiKQorZWxzZShTSVpFT0ZfSU5UIEVRVUFMIDIpCisgICAgaWYoU0laRU9GX1NIT1JUIEVRVUFMIDIpCisgICAgICAgIHNldCAoREJVU19JTlQxNl9UWVBFICJzaG9ydCIpCisgICAgZW5kaWYoU0laRU9GX1NIT1JUIEVRVUFMIDIpCitlbmRpZihTSVpFT0ZfSU5UIEVRVUFMIDIpCisKK2ZpbmRfcHJvZ3JhbShET1hZR0VOIGRveHlnZW4pCitmaW5kX3Byb2dyYW0oWE1MVE8geG1sdG8pCisKK2lmKE1TVkMpCisgICBTRVQoREJVU19WQV9DT1BZX0ZVTkMgIl9EQlVTX1ZBX0NPUFlfQVNTSUdOIjspCitlbHNlKE1TVkMpCit3cml0ZV9maWxlKCIke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2NtYWtlX3RyeV9jb21waWxlLmMiICIjaW5jbHVkZSA8c3RkYXJnLmg+CisJI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICBzdGF0aWMgdm9pZCBmIChpbnQgaSwgLi4uKSB7CisJdmFfbGlzdCBhcmdzMSwgYXJnczI7CisJdmFfc3RhcnQgKGFyZ3MxLCBpKTsKKwl2YV9jb3B5IChhcmdzMiwgYXJnczEpOworCWlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICBleGl0ICgxKTsKKwl2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJfQorCWludCBtYWluKCkgeworCSAgZiAoMCwgNDIpOworCSAgcmV0dXJuIDA7CisJfQorIikKK3RyeV9jb21waWxlKERCVVNfSEFWRV9WQV9DT1BZCisgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2NtYWtlX3RyeV9jb21waWxlLmMpCisKK2lmKERCVVNfSEFWRV9WQV9DT1BZKQorICBTRVQoREJVU19WQV9DT1BZX0ZVTkMgdmFfY29weSBDQUNIRSBTVFJJTkcgInZhX2NvcHkgZnVuY3Rpb24iKQorZWxzZShEQlVTX0hBVkVfVkFfQ09QWSkKKyAgd3JpdGVfZmlsZSgiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9jbWFrZV90cnlfY29tcGlsZS5jIiAiI2luY2x1ZGUgPHN0ZGFyZy5oPgorICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKwkgIHN0YXRpYyB2b2lkIGYgKGludCBpLCAuLi4pIHsKKwkgIHZhX2xpc3QgYXJnczEsIGFyZ3MyOworCSAgdmFfc3RhcnQgKGFyZ3MxLCBpKTsKKwkgIF9fdmFfY29weSAoYXJnczIsIGFyZ3MxKTsKKwkgIGlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICAgIGV4aXQgKDEpOworCSAgdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCSAgfQorCSAgaW50IG1haW4oKSB7CisJICAgIGYgKDAsIDQyKTsKKwkgICAgcmV0dXJuIDA7CisJICB9CisgICIpCisgIHRyeV9jb21waWxlKERCVVNfSEFWRV9fX1ZBX0NPUFkKKyAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQorICAgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2NtYWtlX3RyeV9jb21waWxlLmMpCisgIGlmKERCVVNfSEFWRV9fX1ZBX0NPUFkpCisgICAgU0VUKERCVVNfVkFfQ09QWV9GVU5DIF9fdmFfY29weSBDQUNIRSBTVFJJTkcgInZhX2NvcHkgZnVuY3Rpb24iKQorICBlbHNlKERCVVNfSEFWRV9fX1ZBX0NPUFkpCisgICAgU0VUKERCVVNfVkFfQ09QWV9BU19BUlJBWSAiMSIgQ0FDSEUgU1RSSU5HICIndmFfbGlzdHMnIGNhbm5vdCBiZSBjb3BpZXMgYXMgdmFsdWVzIikKKyAgZW5kaWYoREJVU19IQVZFX19fVkFfQ09QWSkKK2VuZGlmKERCVVNfSEFWRV9WQV9DT1BZKQorZW5kaWYoTVNWQykgIyBfbm90XyBNU1ZDCisjIyMjIEFic3RyYWN0IHNvY2tldHMKKworaWYgKERCVVNfRU5BQkxFX0FCU1RSQUNUX1NPQ0tFVFMpCisKKyAgdHJ5X2NvbXBpbGUoSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisgICAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS9tb2R1bGVzL0NoZWNrRm9yQWJzdHJhY3RTb2NrZXRzLmMpCisKK2VuZGlmKERCVVNfRU5BQkxFX0FCU1RSQUNUX1NPQ0tFVFMpCisKK2lmKEhBVkVfQUJTVFJBQ1RfU09DS0VUUykKKyAgc2V0KERCVVNfUEFUSF9PUl9BQlNUUkFDVF9WQUxVRSBhYnN0cmFjdCkKK2Vsc2UoSEFWRV9BQlNUUkFDVF9TT0NLRVRTKQorICBzZXQoREJVU19QQVRIX09SX0FCU1RSQUNUX1ZBTFVFIHBhdGgpCitlbmRpZihIQVZFX0FCU1RSQUNUX1NPQ0tFVFMpCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL0RveHlmaWxlLmNtYWtlIGIvZGJ1cy0xLjQuMTAvY21ha2UvRG94eWZpbGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwOTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NtYWtlL0RveHlmaWxlLmNtYWtlCkBAIC0wLDAgKzEsMTgyIEBACisjIERveHlmaWxlIDAuMQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEdlbmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gRC1CdXMKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSBAVkVSU0lPTkAKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBhcGkKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gTk8KK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gTk8KK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSAKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IFlFUworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUVVJRVQgICAgICAgICAgICAgICAgICA9IFlFUworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworV0FSTl9GT1JNQVQgICAgICAgICAgICA9IAorV0FSTl9MT0dGSUxFICAgICAgICAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOUFVUICAgICAgICAgICAgICAgICAgPSBAdG9wX3NyY2RpckAvZGJ1cworRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmgKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKyNFWENMVURFICAgICAgICAgICAgICAgID0gdGVzdAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUgCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZSAKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gTWFrZWZpbGUuKiBDaGFuZ2VMb2cgQ0hBTkdFUyBDSEFOR0VTLiogUkVBRE1FIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSRUFETUUuKiAqLnBuZyBBVVRIT1JTIERFU0lHTiBERVNJR04uKiAqLmRlc2t0b3AgXAorICAgICAgICAgICAgICAgICAgICAgICAgIERFU0tUT1AqIENPTU1FTlRTIEhPV1RPIG1hZ2ljIE5PVEVTIFRPRE8gVEhBTktTCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciAKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSAKKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gTk8KK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IAorSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorSFRNTF9GT09URVIgICAgICAgICAgICA9IAorSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSAKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBOTworVVNFX1BERkxBVEVYICAgICAgICAgICA9IE5PCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworUlRGX09VVFBVVCAgICAgICAgICAgICA9IAorQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTUFOICAgICAgICAgICA9IFlFUworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zZGJ1cworTUFOX0xJTktTICAgICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMKK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBZRVMKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPSAKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKK1BSRURFRklORUQgICAgICAgICAgICAgPSAiREJVU19CRUdJTl9ERUNMUz0iIAkJCVwKKwkJCSAiREJVU19FTkRfREVDTFM9IiAJCQlcCisJCQkgIkRPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyIgCQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfR05VQ19ERVBSRUNBVEVEPSIgICAgICAgICAgICAgICAgXAorCQkJICJfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sobmFtZSk9IglcCisJCQkgIl9EQlVTX0dOVUNfUFJJTlRGKGZyb20sdG8pPSIgXAorCQkJICJEQlVTX0VYUE9SVD0iCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZHRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcyAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFHRklMRVMgICAgICAgICAgICAgICA9IAorR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCitQRVJMX1BBVEggICAgICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbCAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gWUVTCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCitET1RfUEFUSCAgICAgICAgICAgICAgID0gCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCitNQVhfRE9UX0dSQVBIX1dJRFRIICAgID0gNjQwCitNQVhfRE9UX0dSQVBIX0hFSUdIVCAgID0gMTAyNAorR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGR0aW9ucyByZWxhdGVkIHRvIHRoZSBzZWFyY2ggZW5naW5lICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL2J1cy10ZXN0LmJhdC5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL2J1cy10ZXN0LmJhdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTY4ODcxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvYnVzLXRlc3QuYmF0LmNtYWtlCkBAIC0wLDAgKzEsMTQgQEAKKzo6IGJ1cy10ZXN0IHdyYXBwZXIKK0BlY2hvIG9mZgorCis6OiBzZXNzaW9uIGJ1cyBhZGRyZXNzCitzZXQgREJVU19TVEFSVEVSX0JVUz10Y3A6aG9zdD1sb2NhbGhvc3QscG9ydD0xMjM0CisKK2lmIE5PVCAiJTEiID09ICIiICgKKwlTRVQgREFUQURJUj0lMQorKSBlbHNlICgKKwlTRVQgREFUQURJUj10ZXN0XGRhdGEKKykKKworYmluXGJ1cy10ZXN0LmV4ZSB0ZXN0XGRhdGEKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvYnVzL0NNYWtlTGlzdHMudHh0IGIvZGJ1cy0xLjQuMTAvY21ha2UvYnVzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NmJlODEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9idXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxODEgQEAKK3Byb2plY3QoYnVzKQorCithZGRfZGVmaW5pdGlvbnMoLUREQlVTX0NPTVBJTEFUSU9OKQorCitTRVQoRUZFTkNFICIiKQorU0VUKEJVU19ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9idXMpCisKK3NldCAoY29uZmlnX0RBVEEKKwlzZXNzaW9uLmNvbmYJCQkJCisJc3lzdGVtLmNvbmYKKykKKworIyBjb25maWcgZmlsZXMgZm9yIGluc3RhbGxhdGlvbiAKK0ZPUkVBQ0goZmlsZSAke2NvbmZpZ19EQVRBfSkKKwlDT05GSUdVUkVfRklMRSggIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke2ZpbGV9LmNtYWtlIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7ZmlsZX0iIElNTUVESUFURSBAT05MWSkKK0VOREZPUkVBQ0goZmlsZSkKKworIyBjb3B5IHNlcnZpY2VzIGZvciBsb2NhbCBkYWVtb24gc3RhcnQgdG8gbG9jYWwgc2VydmljZSBkaXIgZGF0YS9kYnVzLTEvc2VydmljZXMKK1NFVCAoU0VSVklDRV9GSUxFUyB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcykKK0ZJTEUoR0xPQiBGSUxFUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi8ke1NFUlZJQ0VfRklMRVN9Lyouc2VydmljZS5pbiIgKQorRk9SRUFDSChGSUxFICR7RklMRVN9KQkKKwlHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEZJTEVOQU1FICR7RklMRX0gTkFNRV9XRSkKKwlTRVQgKFRBUkdFVCAke0NNQUtFX0JJTkFSWV9ESVJ9L2RhdGEvZGJ1cy0xL3NlcnZpY2VzLyR7RklMRU5BTUV9LnNlcnZpY2UpCisJSUYgKENPTkZJR19WRVJCT1NFKQorCQlNRVNTQUdFKCJGUk9NOiAke0ZJTEV9XG5UTzogJHtUQVJHRVR9XG4iKQorCUVORElGIChDT05GSUdfVkVSQk9TRSkKKwljb25maWd1cmVfZmlsZSgke0ZJTEV9ICR7VEFSR0VUfSApCitFTkRGT1JFQUNIKEZJTEUpCisKK2lmKERCVVNfVVNFX0VYUEFUKQorICAgIFNFVCAoWE1MX1NPVVJDRVMgJHtCVVNfRElSfS9jb25maWctbG9hZGVyLWV4cGF0LmMpCitlbHNlKERCVVNfVVNFX0VYUEFUKQorICAgIFNFVCAoWE1MX1NPVVJDRVMgJHtCVVNfRElSfS9jb25maWctbG9hZGVyLWxpYnhtbC5jKQorZW5kaWYgKERCVVNfVVNFX0VYUEFUKQorCisjIGFmdGVyIG5leHQgY3ZzIHVwZGF0ZQorI3NldCAoRElSX1dBVENIX1NPVVJDRSAke0JVU19ESVJ9L2Rpci13YXRjaC1kZWZhdWx0LmMpCitzZXQgKERJUl9XQVRDSF9TT1VSQ0UgKQorCitzZXQgKEJVU19TT1VSQ0VTIAorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5jCQkJCQorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5oCQkJCQorCSR7QlVTX0RJUn0vYnVzLmMJCQkJCQorCSR7QlVTX0RJUn0vYnVzLmgJCQkJCQorCSR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci5jCQkJCQorCSR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci5oCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5oCisjICAgICR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci10cml2aWFsLmMKKwkke0JVU19ESVJ9L2Nvbm5lY3Rpb24uYworCSR7QlVTX0RJUn0vY29ubmVjdGlvbi5oCQkJCQorCSR7QlVTX0RJUn0vZGVza3RvcC1maWxlLmMJCQkJCisJJHtCVVNfRElSfS9kZXNrdG9wLWZpbGUuaAkJCQkKKwkke0JVU19ESVJ9L2Rpci13YXRjaC1kZWZhdWx0LmMJCQkJCisJJHtCVVNfRElSfS9kaXItd2F0Y2guaAkJCQkKKwkke0JVU19ESVJ9L2Rpc3BhdGNoLmMJCQkJCisJJHtCVVNfRElSfS9kaXNwYXRjaC5oCQkJCQorCSR7QlVTX0RJUn0vZHJpdmVyLmMJCQkJCisJJHtCVVNfRElSfS9kcml2ZXIuaAkJCQkKKwkke0JVU19ESVJ9L2V4cGlyZWxpc3QuYwkJCQkKKwkke0JVU19ESVJ9L2V4cGlyZWxpc3QuaAkJCQkKKwkke0JVU19ESVJ9L3BvbGljeS5jCQkJCQorCSR7QlVTX0RJUn0vcG9saWN5LmgJCQkJCisJJHtCVVNfRElSfS9zZWxpbnV4LmgJCQkJCisJJHtCVVNfRElSfS9zZWxpbnV4LmMJCQkJCisJJHtCVVNfRElSfS9zZXJ2aWNlcy5jCQkJCQorCSR7QlVTX0RJUn0vc2VydmljZXMuaAkJCQkKKwkke0JVU19ESVJ9L3NpZ25hbHMuYwkJCQkKKwkke0JVU19ESVJ9L3NpZ25hbHMuaAkJCQkKKwkke0JVU19ESVJ9L3Rlc3QuYwkJCQkJCisJJHtCVVNfRElSfS90ZXN0LmgJCQkJCQorCSR7QlVTX0RJUn0vdXRpbHMuYwkJCQkJCisJJHtCVVNfRElSfS91dGlscy5oCQkJCQkKKwkke1hNTF9TT1VSQ0VTfQorCSR7RElSX1dBVENIX1NPVVJDRX0KKykKKworaW5jbHVkZV9kaXJlY3Rvcmllcygke1hNTF9JTkNMVURFX0RJUn0pCisKK2FkZF9leGVjdXRhYmxlKGRidXMtZGFlbW9uICR7QlVTX1NPVVJDRVN9ICR7QlVTX0RJUn0vbWFpbi5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtZGFlbW9uICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9ICR7WE1MX0xJQlJBUll9KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtZGFlbW9uIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgJHtEQlVTX0RBRU1PTl9OQU1FfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLWRhZW1vbiBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgJHtEQlVTX0lOVEVSTkFMX0NMSUVOVF9ERUZJTklUSU9OU30pCisKK2luc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtZGFlbW9uKQoraW5zdGFsbF9maWxlcygvZXRjL2RidXMtMSBGSUxFUyAke2NvbmZpZ19EQVRBfSkKKworaWYgKERCVVNfU0VSVklDRSkKKwlzZXQgKGRidXNfc2VydmljZV9TT1VSQ0VTIAorCQkke0JVU19ESVJ9L2J1cy1zZXJ2aWNlLXdpbi5jCisJIyBUT0RPOiBhZGQgYWRkaXRpb25hbCBmaWxlcworCSMJJHtCVVNfRElSfS9zZXJ2aWNlLW1haW4uYworCSMJJHtCVVNfU09VUkNFU30gCisJKQorCisJYWRkX2V4ZWN1dGFibGUoZGJ1cy1zZXJ2aWNlICR7ZGJ1c19zZXJ2aWNlX1NPVVJDRVN9ICkKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1zZXJ2aWNlICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9ICR7WE1MX0xJQlJBUll9KQorCXNldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLXNlcnZpY2UgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCWluc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtc2VydmljZSApCitlbmRpZiAoREJVU19TRVJWSUNFKQorCitpZiAoREJVU19CVUlMRF9URVNUUykJCisJYWRkX2V4ZWN1dGFibGUoYnVzLXRlc3QgJHtCVVNfU09VUkNFU30gJHtCVVNfRElSfS90ZXN0LW1haW4uYykKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoYnVzLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0pCisJc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGJ1cy10ZXN0IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TfSkKKwlhZGRfdGVzdChidXMtdGVzdCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L2J1cy10ZXN0ICR7Q01BS0VfQklOQVJZX0RJUn0vdGVzdC9kYXRhKQorZW5kaWYgKERCVVNfQlVJTERfVEVTVFMpCisKK2lmKE1TVkMpCisJcHJvamVjdF9zb3VyY2VfZ3JvdXAoJHtHUk9VUF9DT0RFfSBidXNfdGVzdF9TT1VSQ0VTIGR1bW15KQorZW5kaWYoTVNWQykKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCisjY2xlYW4tbG9jYWw6CisjCS9iaW4vcm0gKi5iYiAqLmJiZyAqLmRhICouZ2NvdiB8fCB0cnVlCisKKyNpbnN0YWxsLWRhdGEtaG9vazoKKyMJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpLyQobG9jYWxzdGF0ZWRpcikvcnVuL2RidXMKKyMJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpLyQoY29uZmlnZGlyKS9zeXN0ZW0uZAorIwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikvJChkYXRhZGlyKS9kYnVzLTEvc2VydmljZXMKKworIyNpbnN0YWxsX2ZpbGUoJHtjb25maWdkaXJ9L3N5c3RlbS5kIEZJTEUKKworCitzZXQoTEFVTkNIX0hFTFBFUl9TT1VSQ0VTICR7WE1MX1NPVVJDRVN9CisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLXRyaXZpYWwuYworICAgICR7QlVTX0RJUn0vZGVza3RvcC1maWxlLmMKKyAgICAke0JVU19ESVJ9L3V0aWxzLmMKKyAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLmMKKworKQorCitpZihOT1QgV0lOMzIpCisjIFRPRE8gUEVORElORyhrZGFiKSBmaXggYnVpbGQgb24gd2luZG93cyAoYWN0aXZhdGlvbi1oZWxwZXIuYykKKyAgIGFkZF9leGVjdXRhYmxlKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICR7QlVTX0RJUn0vYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgKQorICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0gKQorICAgCisgICBhZGRfZXhlY3V0YWJsZShkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLWJpbi5jKQorICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1EQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUIikKKyAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtYTUxfTElCUkFSWX0gKQorICAgCisgICBhZGRfZXhlY3V0YWJsZShidXMtdGVzdC1sYXVuY2gtaGVscGVyICR7TEFVTkNIX0hFTFBFUl9TT1VSQ0VTfSAgJHtCVVNfRElSfS90ZXN0LWxhdW5jaC1oZWxwZXIuYykKKyAgIHNldF90YXJnZXRfcHJvcGVydGllcyhidXMtdGVzdC1sYXVuY2gtaGVscGVyIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QgLURBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTSIpCisgICB0YXJnZXRfbGlua19saWJyYXJpZXMoYnVzLXRlc3QtbGF1bmNoLWhlbHBlciAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke1hNTF9MSUJSQVJZfSApCisgICBhZGRfdGVzdChidXMtdGVzdC1sYXVuY2gtaGVscGVyICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vYnVzLXRlc3QtbGF1bmNoLWhlbHBlciApCisKK2VuZGlmKE5PVCBXSU4zMikKKworIyMjIyBJbml0IHNjcmlwdHMgZnVuCisjU0NSSVBUX0lOX0ZJTEVTPW1lc3NhZ2VidXMuaW4KKyMJCXJjLm1lc3NhZ2VidXMuaW4KKworIyMgUmVkIEhhdCBzdGFydAorI2lmIERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVQKKworI2luaXRkZGlyPSQoc3lzY29uZmRpcikvcmMuZC9pbml0LmQKKworI2luaXRkX1NDUklQVFM9IAkKKyMJbWVzc2FnZWJ1cworCisjZW5kaWYKKyMgIyMgUmVkIEhhdCBlbmQKKworIyMgU2xhY2t3YXJlIHN0YXJ0CisjaWYgREJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFCisKKyNpbml0ZGRpcj0kKHN5c2NvbmZkaXIpL3JjLmQvCisKKyNpbml0ZF9TQ1JJUFRTPSAJCisjCXJjLm1lc3NhZ2VidXMKKworI2VuZGlmCisjIyBTbGFja3dhcmUgZW5kCisKKyNNQU5fSU5fRklMRVM9ZGJ1cy1kYWVtb24uMS5pbgorI21hbl9NQU5TID0gZGJ1cy1kYWVtb24uMQorCisjIyMjIEV4dHJhIGRpc3QgCisKKyNFWFRSQV9ESVNUPSQoQ09ORklHX0lOX0ZJTEVTKSAkKFNDUklQVF9JTl9GSUxFUykgJChtYW5fTUFOUykgJChNQU5fSU5fRklMRVMpCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9idXMvZGJ1cy1kYWVtb24ueG1sIGIvZGJ1cy0xLjQuMTAvY21ha2UvYnVzL2RidXMtZGFlbW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmY0ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvYnVzL2RidXMtZGFlbW9uLnhtbApAQCAtMCwwICsxLDc0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCI+Cis8IS0tIGxpZnRlZCBmcm9tIHRyb2ZmK21hbiBieSBkb2NsaWZ0ZXIgLS0+Cis8cmVmZW50cnkgaWQ9J2RidXMtZGFlbW9uJz4KKzwhLS0gICAtLT4KKzwhLS0gIGRidXNcLWRhZW1vbiBtYW51YWwgcGFnZS4gLS0+Cis8IS0tICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiAtLT4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5kYnVzLWRhZW1vbjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXYgaWQ9J25hbWUnPgorPHJlZm5hbWU+ZGJ1cy1kYWVtb248L3JlZm5hbWU+Cis8cmVmcHVycG9zZT5NZXNzYWdlIGJ1cyBkYWVtb248L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+PC9jbWRzeW5vcHNpcz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tdmVyc2lvbiA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXNlc3Npb24gPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1zeXN0ZW0gPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1jb25maWctZmlsZT08cmVwbGFjZWFibGU+RklMRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXByaW50LWFkZHJlc3MgPC9hcmc+PGFyZyBjaG9pY2U9J29wdCc+PHJlcGxhY2VhYmxlPj1ERVNDUklQVE9SPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcHJpbnQtcGlkIDwvYXJnPjxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT49REVTQ1JJUFRPUjwvcmVwbGFjZWFibGU+PC9hcmc+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1mb3JrIDwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPjxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBpcyB0aGUgRC1CdXMgbWVzc2FnZSBidXMgZGFlbW9uLiBTZWUKKzx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgYmlnIHBpY3R1cmUuIEQtQnVzIGlzIGZpcnN0IGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG9uZS10by1vbmUKK2NvbW11bmljYXRpb24gYmV0d2VlbiBhbnkgdHdvIGFwcGxpY2F0aW9uczsgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+IGlzIGFuCithcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhpcyBsaWJyYXJ5IHRvIGltcGxlbWVudCBhIG1lc3NhZ2UgYnVzCitkYWVtb24uIE11bHRpcGxlIHByb2dyYW1zIGNvbm5lY3QgdG8gdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbiBhbmQgY2FuCitleGNoYW5nZSBtZXNzYWdlcyB3aXRoIG9uZSBhbm90aGVyLjwvcGFyYT4KKworCis8cGFyYT5UaGVyZSBhcmUgdHdvIHN0YW5kYXJkIG1lc3NhZ2UgYnVzIGluc3RhbmNlczogdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMgCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIGluaXQgc2VydmljZSkgYW5kIHRoZSAKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KKzxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBpcyB1c2VkIGZvciBib3RoIG9mIHRoZXNlIGluc3RhbmNlcywgYnV0IHdpdGggCithIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIGZpbGUuPC9wYXJhPgorCisKKzxwYXJhPlRoZSAtLXNlc3Npb24gb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyItLWNvbmZpZy1maWxlPS9ldGMvZGJ1cy0xL3Nlc3Npb24uY29uZiIgYW5kIHRoZSAtLXN5c3RlbQorb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyItLWNvbmZpZy1maWxlPS9ldGMvZGJ1cy0xL3N5c3RlbS5jb25mIi4gQnkgY3JlYXRpbmcgCithZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHVzaW5nIHRoZSAtLWNvbmZpZy1maWxlIG9wdGlvbiwKK2FkZGl0aW9uYWwgc3BlY2lhbC1wdXJwb3NlIG1lc3NhZ2UgYnVzIGRhZW1vbnMgY291bGQgYmUgY3JlYXRlZC48L3BhcmE+CisKKworPHBhcmE+VGhlIHN5c3RlbXdpZGUgZGFlbW9uIGlzIG5vcm1hbGx5IGxhdW5jaGVkIGJ5IGFuIGluaXQgc2NyaXB0LCAKK3N0YW5kYXJkbHkgY2FsbGVkIHNpbXBseSAibWVzc2FnZWJ1cyIuPC9wYXJhPiAKKworCis8cGFyYT5UaGUgc3lzdGVtd2lkZSBkYWVtb24gaXMgbGFyZ2VseSB1c2VkIGZvciBicm9hZGNhc3Rpbmcgc3lzdGVtIGV2ZW50cywgCitzdWNoIGFzIGNoYW5nZXMgdG8gdGhlIHByaW50ZXIgcXVldWUsIG9yIGFkZGluZy9yZW1vdmluZyBkZXZpY2VzLjwvcGFyYT4KKworCis8cGFyYT5UaGUgcGVyLXNlc3Npb24gZGFlbW9uIGlzIHVzZWQgZm9yIHZhcmlvdXMgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gCithbW9uZyBkZXNrdG9wIGFwcGxpY2F0aW9ucyAoaG93ZXZlciwgaXQgaXMgbm90IHRpZWQgdG8gWCBvciB0aGUgR1VJIAoraW4gYW55IHdheSkuPC9wYXJhPgorCisKKzxwYXJhPlNJR0hVUCB3aWxsIGNhdXNlIHRoZSBELUJ1cyBkYWVtb24gdG8gUEFSVElBTExZIHJlbG9hZCBpdHMKK2NvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdG8gZmx1c2ggaXRzIHVzZXIvZ3JvdXAgaW5mb3JtYXRpb24gY2FjaGVzLiBTb21lCitjb25maWd1cmF0aW9uIGNoYW5nZXMgd291bGQgcmVxdWlyZSBraWNraW5nIGFsbCBhcHBzIG9mZiB0aGUgYnVzOyBzbyB0aGV5IHdpbGwKK29ubHkgdGFrZSBlZmZlY3QgaWYgeW91IHJlc3RhcnQgdGhlIGRhZW1vbi4gUG9saWN5IGNoYW5nZXMgc2hvdWxkIHRha2UgZWZmZWN0Cit3aXRoIFNJR0hVUC48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tY29uZmlnLWZpbGU9RklMRTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+VXNlIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWZvcms8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkZvcmNlIHRoZSBtZXNzYWdlIGJ1cyB0byBmb3JrIGFuZCBiZWNvbWUgYSBkYWVtb24sIGV2ZW4gaWYgCit0aGUgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgbm90IHNwZWNpZnkgdGhhdCBpdCBzaG91bGQuCitJbiBtb3N0IGNvbnRleHRzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYWxyZWFkeSBnZXRzIHRoaXMKK3JpZ2h0LCB0aG91Z2guPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXByaW50LWFkZHJlc3NbPURFU0NSSVBUT1JdPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QcmludCB0aGUgYWRkcmVzcyBvZiB0aGUgbWVzc2FnZSBidXMgdG8gc3RhbmRhcmQgb3V0cHV0LCBvciAKK3RvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgaXMgdXNlZCBieSBwcm9ncmFtcyB0aGF0IAorbGF1bmNoIHRoZSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJpbnQtcGlkWz1ERVNDUklQVE9SXTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YW5kYXJkIG91dHB1dCwgb3IgCit0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiBUaGlzIGlzIHVzZWQgYnkgcHJvZ3JhbXMgdGhhdCAKK2xhdW5jaCB0aGUgbWVzc2FnZSBidXMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXNlc3Npb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24gbWVzc2FnZQorYnVzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tdmVyc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHZlcnNpb24gb2YgdGhlIGRhZW1vbi48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nY29uZmlndXJhdGlvbl9maWxlJz48dGl0bGU+Q09ORklHVVJBVElPTiBGSUxFPC90aXRsZT4KKzxwYXJhPkEgbWVzc2FnZSBidXMgZGFlbW9uIGhhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IHNwZWNpYWxpemVzIGl0Citmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgb25lIGNvbmZpZ3VyYXRpb24gCitmaWxlIG1pZ2h0IHNldCB1cCB0aGUgbWVzc2FnZSBidXMgdG8gYmUgYSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzLCAKK3doaWxlIGFub3RoZXIgbWlnaHQgc2V0IGl0IHVwIHRvIGJlIGEgcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBidXMuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgYWxzbyBlc3RhYmxpc2hlcyByZXNvdXJjZSBsaW1pdHMsIHNlY3VyaXR5CitwYXJhbWV0ZXJzLCBhbmQgc28gZm9ydGguPC9wYXJhPgorCisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IHBhcnQgb2YgYW55IGludGVyb3BlcmFiaWxpdHkKK3NwZWNpZmljYXRpb24gYW5kIGl0cyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzIG5vdCBndWFyYW50ZWVkOyB0aGlzCitkb2N1bWVudCBpcyBkb2N1bWVudGF0aW9uLCBub3Qgc3BlY2lmaWNhdGlvbi48L3BhcmE+CisKKworPHBhcmE+VGhlIHN0YW5kYXJkIHN5c3RlbXdpZGUgYW5kIHBlci1zZXNzaW9uIG1lc3NhZ2UgYnVzIHNldHVwcyBhcmUKK2NvbmZpZ3VyZWQgaW4gdGhlIGZpbGVzICIvZXRjL2RidXMtMS9zeXN0ZW0uY29uZiIgYW5kCisiL2V0Yy9kYnVzLTEvc2Vzc2lvbi5jb25mIi4gIFRoZXNlIGZpbGVzIG5vcm1hbGx5CismbHQ7aW5jbHVkZSZndDsgYSBzeXN0ZW0tbG9jYWwuY29uZiBvciBzZXNzaW9uLWxvY2FsLmNvbmY7IHlvdSBjYW4gcHV0IGxvY2FsCitvdmVycmlkZXMgaW4gdGhvc2UgZmlsZXMgdG8gYXZvaWQgbW9kaWZ5aW5nIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24KK2ZpbGVzLjwvcGFyYT4KKworCis8cGFyYT5UaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGFuIFhNTCBkb2N1bWVudC4gSXQgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcKK2RvY3R5cGUgZGVjbGFyYXRpb246PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisKKyAgICZsdDshRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgICAgIjx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZDwvdWxpbms+IiZndDsKKworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5UaGUgZm9sbG93aW5nIGVsZW1lbnRzIG1heSBiZSBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2J1c2NvbmZpZyZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+PC9wYXJhPiAKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+Um9vdCBlbGVtZW50LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDt0eXBlJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5UaGUgd2VsbC1rbm93biB0eXBlIG9mIHRoZSBtZXNzYWdlIGJ1cy4gQ3VycmVudGx5IGtub3duIHZhbHVlcyBhcmUKKyJzeXN0ZW0iIGFuZCAic2Vzc2lvbiI7IGlmIG90aGVyIHZhbHVlcyBhcmUgc2V0LCB0aGV5IHNob3VsZCBiZQorZWl0aGVyIGFkZGVkIHRvIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLCBvciBuYW1lc3BhY2VkLiAgVGhlIGxhc3QKKyZsdDt0eXBlJmd0OyBlbGVtZW50ICJ3aW5zIiAocHJldmlvdXMgdmFsdWVzIGFyZSBpZ25vcmVkKS48L3BhcmE+CisKKworPHBhcmE+RXhhbXBsZTogJmx0O3R5cGUmZ3Q7c2Vzc2lvbiZsdDsvdHlwZSZndDs8L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7aW5jbHVkZSZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+PC9wYXJhPiAKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+SW5jbHVkZSBhIGZpbGUgJmx0O2luY2x1ZGUmZ3Q7ZmlsZW5hbWUuY29uZiZsdDsvaW5jbHVkZSZndDsgYXQgdGhpcyBwb2ludC4gIElmIHRoZQorZmlsZW5hbWUgaXMgcmVsYXRpdmUsIGl0IGlzIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorZG9pbmcgdGhlIGluY2x1ZGluZy48L3BhcmE+CisKKworPHBhcmE+Jmx0O2luY2x1ZGUmZ3Q7IGhhcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgImlnbm9yZV9taXNzaW5nPSh5ZXN8bm8pIgord2hpY2ggZGVmYXVsdHMgdG8gIm5vIiBpZiBub3QgcHJvdmlkZWQuIFRoaXMgYXR0cmlidXRlIAorY29udHJvbHMgd2hldGhlciBpdCdzIGEgZmF0YWwgZXJyb3IgZm9yIHRoZSBpbmNsdWRlZCBmaWxlIAordG8gYmUgYWJzZW50LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtpbmNsdWRlZGlyJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5JbmNsdWRlIGFsbCBmaWxlcyBpbiAmbHQ7aW5jbHVkZWRpciZndDtmb28uZCZsdDsvaW5jbHVkZWRpciZndDsgYXQgdGhpcworcG9pbnQuIEZpbGVzIGluIHRoZSBkaXJlY3RvcnkgYXJlIGluY2x1ZGVkIGluIHVuZGVmaW5lZCBvcmRlci4KK09ubHkgZmlsZXMgZW5kaW5nIGluICIuY29uZiIgYXJlIGluY2x1ZGVkLjwvcGFyYT4KKworCis8cGFyYT5UaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGV4dGVuc2lvbiBvZiB0aGUgc3lzdGVtIGJ1cyBieSBwYXJ0aWN1bGFyCitwYWNrYWdlcy4gRm9yIGV4YW1wbGUsIGlmIENVUFMgd2FudHMgdG8gYmUgYWJsZSB0byBzZW5kIG91dAorbm90aWZpY2F0aW9uIG9mIHByaW50ZXIgcXVldWUgY2hhbmdlcywgaXQgY291bGQgaW5zdGFsbCBhIGZpbGUgdG8KKy9ldGMvZGJ1cy0xL3N5c3RlbS5kIHRoYXQgYWxsb3dlZCBhbGwgYXBwcyB0byByZWNlaXZlCit0aGlzIG1lc3NhZ2UgYW5kIGFsbG93ZWQgdGhlIHByaW50ZXIgZGFlbW9uIHVzZXIgdG8gc2VuZCBpdC48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7dXNlciZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorCis8cGFyYT48L3BhcmE+IDwhLS0gRklYTUU6IGJsYW5rIGxpc3QgaXRlbSAtLT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+VGhlIHVzZXIgYWNjb3VudCB0aGUgZGFlbW9uIHNob3VsZCBydW4gYXMsIGFzIGVpdGhlciBhIHVzZXJuYW1lIG9yIGEKK1VJRC4gSWYgdGhlIGRhZW1vbiBjYW5ub3QgY2hhbmdlIHRvIHRoaXMgVUlEIG9uIHN0YXJ0dXAsIGl0IHdpbGwgZXhpdC4KK0lmIHRoaXMgZWxlbWVudCBpcyBub3QgcHJlc2VudCwgdGhlIGRhZW1vbiB3aWxsIG5vdCBjaGFuZ2Ugb3IgY2FyZQorYWJvdXQgaXRzIFVJRC48L3BhcmE+CisKKworPHBhcmE+VGhlIGxhc3QgJmx0O3VzZXImZ3Q7IGVudHJ5IGluIHRoZSBmaWxlICJ3aW5zIiwgdGhlIG90aGVycyBhcmUgaWdub3JlZC48L3BhcmE+CisKKworPHBhcmE+VGhlIHVzZXIgaXMgY2hhbmdlZCBhZnRlciB0aGUgYnVzIGhhcyBjb21wbGV0ZWQgaW5pdGlhbGl6YXRpb24uICBTbworc29ja2V0cyBldGMuIHdpbGwgYmUgY3JlYXRlZCBiZWZvcmUgY2hhbmdpbmcgdXNlciwgYnV0IG5vIGRhdGEgd2lsbCBiZQorcmVhZCBmcm9tIGNsaWVudHMgYmVmb3JlIGNoYW5naW5nIHVzZXIuIFRoaXMgbWVhbnMgdGhhdCBzb2NrZXRzIAorYW5kIFBJRCBmaWxlcyBjYW4gYmUgY3JlYXRlZCBpbiBhIGxvY2F0aW9uIHRoYXQgcmVxdWlyZXMgcm9vdCAKK3ByaXZpbGVnZXMgZm9yIHdyaXRpbmcuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2ZvcmsmZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPjwvcGFyYT4gICAgCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPklmIHByZXNlbnQsIHRoZSBidXMgZGFlbW9uIGJlY29tZXMgYSByZWFsIGRhZW1vbiAoZm9ya3MgCitpbnRvIHRoZSBiYWNrZ3JvdW5kLCBldGMuKS4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCAKK3JhdGhlciB0aGFuIHRoZSAtLWZvcmsgY29tbWFuZCBsaW5lIG9wdGlvbi48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7bGlzdGVuJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5BZGQgYW4gYWRkcmVzcyB0aGF0IHRoZSBidXMgc2hvdWxkIGxpc3RlbiBvbi4gVGhlIAorYWRkcmVzcyBpcyBpbiB0aGUgc3RhbmRhcmQgRC1CdXMgZm9ybWF0IHRoYXQgY29udGFpbnMgCithIHRyYW5zcG9ydCBuYW1lIHBsdXMgcG9zc2libGUgcGFyYW1ldGVycy9vcHRpb25zLjwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7bGlzdGVuJmd0O3VuaXg6cGF0aD0vdG1wL2ZvbyZsdDsvbGlzdGVuJmd0OzwvcGFyYT4KKworCis8cGFyYT5JZiB0aGVyZSBhcmUgbXVsdGlwbGUgJmx0O2xpc3RlbiZndDsgZWxlbWVudHMsIHRoZW4gdGhlIGJ1cyBsaXN0ZW5zIAorb24gbXVsdGlwbGUgYWRkcmVzc2VzLiBUaGUgYnVzIHdpbGwgcGFzcyBpdHMgYWRkcmVzcyB0byAKK3N0YXJ0ZWQgc2VydmljZXMgb3Igb3RoZXIgaW50ZXJlc3RlZCBwYXJ0aWVzIHdpdGggCit0aGUgbGFzdCBhZGRyZXNzIGdpdmVuIGluICZsdDtsaXN0ZW4mZ3Q7IGZpcnN0LiBUaGF0IGlzLCAKK2FwcHMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byB0aGUgbGFzdCAmbHQ7bGlzdGVuJmd0OyBhZGRyZXNzIGZpcnN0LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthdXRoJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5MaXN0cyBwZXJtaXR0ZWQgYXV0aG9yaXphdGlvbiBtZWNoYW5pc21zLiBJZiB0aGlzIGVsZW1lbnQgZG9lc24ndAorZXhpc3QsIHRoZW4gYWxsIGtub3duIG1lY2hhbmlzbXMgYXJlIGFsbG93ZWQuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyZsdDthdXRoJmd0OyBlbGVtZW50cywgYWxsIHRoZSBsaXN0ZWQgbWVjaGFuaXNtcyBhcmUgYWxsb3dlZC4gIFRoZSBvcmRlciBpbgord2hpY2ggbWVjaGFuaXNtcyBhcmUgbGlzdGVkIGlzIG5vdCBtZWFuaW5nZnVsLjwvcGFyYT4KKyAgICAKKworPHBhcmE+RXhhbXBsZTogJmx0O2F1dGgmZ3Q7RVhURVJOQUwmbHQ7L2F1dGgmZ3Q7PC9wYXJhPgorCisKKzxwYXJhPkV4YW1wbGU6ICZsdDthdXRoJmd0O0RCVVNfQ09PS0lFX1NIQTEmbHQ7L2F1dGgmZ3Q7PC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3NlcnZpY2VkaXImZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKworPHBhcmE+PC9wYXJhPiA8IS0tIEZJWE1FOiBibGFuayBsaXN0IGl0ZW0gLS0+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPkFkZHMgYSBkaXJlY3RvcnkgdG8gc2NhbiBmb3IgLnNlcnZpY2UgZmlsZXMuIERpcmVjdG9yaWVzIGFyZQorc2Nhbm5lZCBzdGFydGluZyB3aXRoIHRoZSBsYXN0IHRvIGFwcGVhciBpbiB0aGUgY29uZmlnIGZpbGUgCisodGhlIGZpcnN0IC5zZXJ2aWNlIGZpbGUgZm91bmQgdGhhdCBwcm92aWRlcyBhIHBhcnRpY3VsYXIgCitzZXJ2aWNlIHdpbGwgYmUgdXNlZCkuPC9wYXJhPgorCisKKzxwYXJhPlNlcnZpY2UgZmlsZXMgdGVsbCB0aGUgYnVzIGhvdyB0byBhdXRvbWF0aWNhbGx5IHN0YXJ0IGEgcHJvZ3JhbS4KK1RoZXkgYXJlIHByaW1hcmlseSB1c2VkIHdpdGggdGhlIHBlci11c2VyLXNlc3Npb24gYnVzLCAKK25vdCB0aGUgc3lzdGVtd2lkZSBidXMuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvJmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT4mbHQ7c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy8mZ3Q7IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhIHNlcmllcworb2YgJmx0O3NlcnZpY2VkaXIvJmd0OyBlbGVtZW50cyBmb3IgZWFjaCBvZiB0aGUgZGF0YSBkaXJlY3RvcmllcyBpbiB0aGUgIlhERworQmFzZSBEaXJlY3RvcnkgU3BlY2lmaWNhdGlvbiIgd2l0aCB0aGUgc3ViZGlyZWN0b3J5ICJkYnVzLTEvc2VydmljZXMiLAorc28gZm9yIGV4YW1wbGUgIi91c3Ivc2hhcmUvZGJ1cy0xL3NlcnZpY2VzIiB3b3VsZCBiZSBhbW9uZyB0aGUKK2RpcmVjdG9yaWVzIHNlYXJjaGVkLjwvcGFyYT4KKworCis8cGFyYT5UaGUgIlhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uIiBjYW4gYmUgZm91bmQgYXQKKzx1bGluayB1cmw9J2h0dHA6Ly9mcmVlZGVza3RvcC5vcmcvd2lraS9TdGFuZGFyZHMvYmFzZWRpci1zcGVjJz5odHRwOi8vZnJlZWRlc2t0b3Aub3JnL3dpa2kvU3RhbmRhcmRzL2Jhc2VkaXItc3BlYzwvdWxpbms+IGlmIGl0IGhhc24ndCBtb3ZlZCwKK290aGVyd2lzZSB0cnkgeW91ciBmYXZvcml0ZSBzZWFyY2ggZW5naW5lLjwvcGFyYT4KKworCis8cGFyYT5UaGUgJmx0O3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvJmd0OyBvcHRpb24gaXMgb25seSByZWxldmFudCB0byB0aGUKK3Blci11c2VyLXNlc3Npb24gYnVzIGRhZW1vbiBkZWZpbmVkIGluCisvZXRjL2RidXMtMS9zZXNzaW9uLmNvbmYuIFB1dHRpbmcgaXQgaW4gYW55IG90aGVyCitjb25maWd1cmF0aW9uIGZpbGUgd291bGQgcHJvYmFibHkgYmUgbm9uc2Vuc2UuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2xpbWl0Jmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT4mbHQ7bGltaXQmZ3Q7IGVzdGFibGlzaGVzIGEgcmVzb3VyY2UgbGltaXQuIEZvciBleGFtcGxlOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICAmbHQ7bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSImZ3Q7NjQmbHQ7L2xpbWl0Jmd0OworICAmbHQ7bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyImZ3Q7NTEyJmx0Oy9saW1pdCZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhlIG5hbWUgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KK0F2YWlsYWJsZSBsaW1pdCBuYW1lcyBhcmU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAgICAibWF4X2luY29taW5nX2J5dGVzIiAgICAgICAgIDogdG90YWwgc2l6ZSBpbiBieXRlcyBvZiBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyb20gYSBzaW5nbGUgY29ubmVjdGlvbgorICAgICAgIm1heF9vdXRnb2luZ19ieXRlcyIgICAgICAgICA6IHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgdXAgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfbWVzc2FnZV9zaXplIiAgICAgICAgICAgOiBtYXggc2l6ZSBvZiBhIHNpbmdsZSBtZXNzYWdlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMKKyAgICAgICJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSB1bnRpbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0YXJ0ZWQgc2VydmljZSBoYXMgdG8gY29ubmVjdAorICAgICAgImF1dGhfdGltZW91dCIgICAgICAgICAgICAgICA6IG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMpIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIGdpdmVuIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlCisgICAgICAibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyIgIDogbWF4IG51bWJlciBvZiBhdXRoZW50aWNhdGVkIGNvbm5lY3Rpb25zICAKKyAgICAgICJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyIgOiBtYXggbnVtYmVyIG9mIHVuYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIiAgIDogbWF4IG51bWJlciBvZiBjb21wbGV0ZWQgY29ubmVjdGlvbnMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHVzZXIKKyAgICAgICJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyIgOiBtYXggbnVtYmVyIG9mIHNlcnZpY2UgbGF1bmNoZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIiAgIDogbWF4IG51bWJlciBvZiBuYW1lcyBhIHNpbmdsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGNhbiBvd24KKyAgICAgICJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iOiBtYXggbnVtYmVyIG9mIG1hdGNoIHJ1bGVzIGZvciBhIHNpbmdsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCisgICAgICAibWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24iIDogbWF4IG51bWJlciBvZiBwZW5kaW5nIG1ldGhvZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWVzIHBlciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bWJlciBvZiBjYWxscy1pbi1wcm9ncmVzcykKKyAgICAgICJyZXBseV90aW1lb3V0IiAgICAgICAgICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCBhIG1ldGhvZCBjYWxsIHRpbWVzIG91dCAgIAorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5UaGUgbWF4IGluY29taW5nL291dGdvaW5nIHF1ZXVlIHNpemVzIGFsbG93IGEgbmV3IG1lc3NhZ2UgdG8gYmUgcXVldWVkCitpZiBvbmUgYnl0ZSByZW1haW5zIGJlbG93IHRoZSBtYXguIFNvIHlvdSBjYW4gaW4gZmFjdCBleGNlZWQgdGhlIG1heAorYnkgbWF4X21lc3NhZ2Vfc2l6ZS48L3BhcmE+CisKKworPHBhcmE+bWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyBkaXZpZGVkIGJ5IG1heF9jb25uZWN0aW9uc19wZXJfdXNlciBpcyB0aGUKK251bWJlciBvZiB1c2VycyB0aGF0IGNhbiB3b3JrIHRvZ2V0aGVyIHRvIGRlbmlhbC1vZi1zZXJ2aWNlIGFsbCBvdGhlciB1c2VycyBieSB1c2luZwordXAgYWxsIGNvbm5lY3Rpb25zIG9uIHRoZSBzeXN0ZW13aWRlIGJ1cy48L3BhcmE+CisKKworPHBhcmE+TGltaXRzIGFyZSBub3JtYWxseSBvbmx5IG9mIGludGVyZXN0IG9uIHRoZSBzeXN0ZW13aWRlIGJ1cywgbm90IHRoZSB1c2VyIHNlc3Npb24gCitidXNlcy48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7cG9saWN5Jmd0OzwvZW1waGFzaXM+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisKKzxwYXJhPjwvcGFyYT4gPCEtLSBGSVhNRTogYmxhbmsgbGlzdCBpdGVtIC0tPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKzwvdmFyaWFibGVsaXN0PgorCis8cGFyYT5UaGUgJmx0O3BvbGljeSZndDsgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgcG9saWN5IHRvIGJlIGFwcGxpZWQgdG8gYSBwYXJ0aWN1bGFyCitzZXQgb2YgY29ubmVjdGlvbnMgdG8gdGhlIGJ1cy4gQSBwb2xpY3kgaXMgbWFkZSB1cCBvZgorJmx0O2FsbG93Jmd0OyBhbmQgJmx0O2RlbnkmZ3Q7IGVsZW1lbnRzLiBQb2xpY2llcyBhcmUgbm9ybWFsbHkgdXNlZCB3aXRoIHRoZSBzeXN0ZW13aWRlIGJ1czsKK3RoZXkgYXJlIGFuYWxvZ291cyB0byBhIGZpcmV3YWxsIGluIHRoYXQgdGhleSBhbGxvdyBleHBlY3RlZCB0cmFmZmljIAorYW5kIHByZXZlbnQgdW5leHBlY3RlZCB0cmFmZmljLjwvcGFyYT4KKworCis8cGFyYT5UaGUgJmx0O3BvbGljeSZndDsgZWxlbWVudCBoYXMgb25lIG9mIHRocmVlIGF0dHJpYnV0ZXM6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgIGNvbnRleHQ9IihkZWZhdWx0fG1hbmRhdG9yeSkiCisgIHVzZXI9InVzZXJuYW1lIG9yIHVzZXJpZCIKKyAgZ3JvdXA9Imdyb3VwIG5hbWUgb3IgZ2lkIgorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT4gCitQb2xpY2llcyBhcmUgYXBwbGllZCB0byBhIGNvbm5lY3Rpb24gYXMgZm9sbG93czo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgIC0gYWxsIGNvbnRleHQ9ImRlZmF1bHQiIHBvbGljaWVzIGFyZSBhcHBsaWVkCisgICAtIGFsbCBncm91cD0iY29ubmVjdGlvbidzIHVzZXIncyBncm91cCIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgICAgaW4gdW5kZWZpbmVkIG9yZGVyCisgICAtIGFsbCB1c2VyPSJjb25uZWN0aW9uJ3MgYXV0aCB1c2VyIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgICBpbiB1bmRlZmluZWQgb3JkZXIKKyAgIC0gYWxsIGNvbnRleHQ9Im1hbmRhdG9yeSIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+UG9saWNpZXMgYXBwbGllZCBsYXRlciB3aWxsIG92ZXJyaWRlIHRob3NlIGFwcGxpZWQgZWFybGllciwgCit3aGVuIHRoZSBwb2xpY2llcyBvdmVybGFwLiBNdWx0aXBsZSBwb2xpY2llcyB3aXRoIHRoZSBzYW1lIAordXNlci9ncm91cC9jb250ZXh0IGFyZSBhcHBsaWVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciAKK2luIHRoZSBjb25maWcgZmlsZS48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7ZGVueSZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7YWxsb3cmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+QSAmbHQ7ZGVueSZndDsgZWxlbWVudCBhcHBlYXJzIGJlbG93IGEgJmx0O3BvbGljeSZndDsgZWxlbWVudCBhbmQgcHJvaGliaXRzIHNvbWUKK2FjdGlvbi4gVGhlICZsdDthbGxvdyZndDsgZWxlbWVudCBtYWtlcyBhbiBleGNlcHRpb24gdG8gcHJldmlvdXMgJmx0O2RlbnkmZ3Q7CitzdGF0ZW1lbnRzLCBhbmQgd29ya3MganVzdCBsaWtlICZsdDtkZW55Jmd0OyBidXQgd2l0aCB0aGUgaW52ZXJzZSBtZWFuaW5nLjwvcGFyYT4KKworCis8cGFyYT5UaGUgcG9zc2libGUgYXR0cmlidXRlcyBvZiB0aGVzZSBlbGVtZW50cyBhcmU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICBzZW5kX2ludGVyZmFjZT0iaW50ZXJmYWNlX25hbWUiCisgICBzZW5kX21lbWJlcj0ibWV0aG9kX29yX3NpZ25hbF9uYW1lIiAKKyAgIHNlbmRfZXJyb3I9ImVycm9yX25hbWUiIAorICAgc2VuZF9kZXN0aW5hdGlvbj0ibmFtZSIgCisgICBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIiB8ICJtZXRob2RfcmV0dXJuIiB8ICJzaWduYWwiIHwgImVycm9yIiAKKyAgIHNlbmRfcGF0aD0iL3BhdGgvbmFtZSIKKworICAgcmVjZWl2ZV9pbnRlcmZhY2U9ImludGVyZmFjZV9uYW1lIgorICAgcmVjZWl2ZV9tZW1iZXI9Im1ldGhvZF9vcl9zaWduYWxfbmFtZSIgCisgICByZWNlaXZlX2Vycm9yPSJlcnJvcl9uYW1lIiAKKyAgIHJlY2VpdmVfc2VuZGVyPSJuYW1lIiAKKyAgIHJlY2VpdmVfdHlwZT0ibWV0aG9kX2NhbGwiIHwgIm1ldGhvZF9yZXR1cm4iIHwgInNpZ25hbCIgfCAiZXJyb3IiCisgICByZWNlaXZlX3BhdGg9Ii9wYXRoL25hbWUiCisKKyAgIHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiB8ICJmYWxzZSIKKyAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiB8ICJmYWxzZSIKKworICAgZWF2ZXNkcm9wPSJ0cnVlIiB8ICJmYWxzZSIKKworICAgb3duPSJuYW1lIgorICAgdXNlcj0idXNlcm5hbWUiCisgICBncm91cD0iZ3JvdXBuYW1lIgorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5FeGFtcGxlczo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDtkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiBzZW5kX21lbWJlcj0iUmVib290Ii8mZ3Q7IAorICAgJmx0O2RlbnkgcmVjZWl2ZV9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iIHJlY2VpdmVfbWVtYmVyPSJSZWJvb3QiLyZndDsKKyAgICZsdDtkZW55IG93bj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvJmd0OworICAgJmx0O2Rlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvJmd0OworICAgJmx0O2RlbnkgcmVjZWl2ZV9zZW5kZXI9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLyZndDsKKyAgICZsdDtkZW55IHVzZXI9ImpvaG4iLyZndDsKKyAgICZsdDtkZW55IGdyb3VwPSJlbmVtaWVzIi8mZ3Q7Cis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoZSAmbHQ7ZGVueSZndDsgZWxlbWVudCdzIGF0dHJpYnV0ZXMgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlbnkgIm1hdGNoZXMiIGEKK3BhcnRpY3VsYXIgYWN0aW9uLiBJZiBpdCBtYXRjaGVzLCB0aGUgYWN0aW9uIGlzIGRlbmllZCAodW5sZXNzIGxhdGVyCitydWxlcyBpbiB0aGUgY29uZmlnIGZpbGUgYWxsb3cgaXQpLjwvcGFyYT4KKworCis8cGFyYT5zZW5kX2Rlc3RpbmF0aW9uIGFuZCByZWNlaXZlX3NlbmRlciBydWxlcyBtZWFuIHRoYXQgbWVzc2FnZXMgbWF5IG5vdCBiZQorc2VudCB0byBvciByZWNlaXZlZCBmcm9tIHRoZSAqb3duZXIqIG9mIHRoZSBnaXZlbiBuYW1lLCBub3QgdGhhdAordGhleSBtYXkgbm90IGJlIHNlbnQgKnRvIHRoYXQgbmFtZSouIFRoYXQgaXMsIGlmIGEgY29ubmVjdGlvbgorb3ducyBzZXJ2aWNlcyBBLCBCLCBDLCBhbmQgc2VuZGluZyB0byBBIGlzIGRlbmllZCwgc2VuZGluZyB0byBCIG9yIEMKK3dpbGwgbm90IHdvcmsgZWl0aGVyLjwvcGFyYT4KKworCis8cGFyYT5UaGUgb3RoZXIgc2VuZF8qIGFuZCByZWNlaXZlXyogYXR0cmlidXRlcyBhcmUgcHVyZWx5IHRleHR1YWwvYnktdmFsdWUKK21hdGNoZXMgYWdhaW5zdCB0aGUgZ2l2ZW4gZmllbGQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyLjwvcGFyYT4KKworCis8cGFyYT4iRWF2ZXNkcm9wcGluZyIgb2NjdXJzIHdoZW4gYW4gYXBwbGljYXRpb24gcmVjZWl2ZXMgYSBtZXNzYWdlIHRoYXQKK3dhcyBleHBsaWNpdGx5IGFkZHJlc3NlZCB0byBhIG5hbWUgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IG93bi4KK0VhdmVzZHJvcHBpbmcgdGh1cyBvbmx5IGFwcGxpZXMgdG8gbWVzc2FnZXMgdGhhdCBhcmUgYWRkcmVzc2VkIHRvCitzZXJ2aWNlcyAoaS5lLiBpdCBkb2VzIG5vdCBhcHBseSB0byBzaWduYWxzKS48L3BhcmE+CisKKworPHBhcmE+Rm9yICZsdDthbGxvdyZndDssIGVhdmVzZHJvcD0idHJ1ZSIgaW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgbWF0Y2hlcyBldmVuIAord2hlbiBlYXZlc2Ryb3BwaW5nLiBlYXZlc2Ryb3A9ImZhbHNlIiBpcyB0aGUgZGVmYXVsdCBhbmQgbWVhbnMgdGhhdCAKK3RoZSBydWxlIG9ubHkgYWxsb3dzIG1lc3NhZ2VzIHRvIGdvIHRvIHRoZWlyIHNwZWNpZmllZCByZWNpcGllbnQuCitGb3IgJmx0O2RlbnkmZ3Q7LCBlYXZlc2Ryb3A9InRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIG1hdGNoZXMgCitvbmx5IHdoZW4gZWF2ZXNkcm9wcGluZy4gZWF2ZXNkcm9wPSJmYWxzZSIgaXMgdGhlIGRlZmF1bHQgZm9yICZsdDtkZW55Jmd0OworYWxzbywgYnV0IGhlcmUgaXQgbWVhbnMgdGhhdCB0aGUgcnVsZSBhcHBsaWVzIGFsd2F5cywgZXZlbiB3aGVuIAorbm90IGVhdmVzZHJvcHBpbmcuIFRoZSBlYXZlc2Ryb3AgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGNvbWJpbmVkIHdpdGgKK3JlY2VpdmUgcnVsZXMgKHdpdGggcmVjZWl2ZV8qIGF0dHJpYnV0ZXMpLjwvcGFyYT4KKworCisKKzxwYXJhPlRoZSBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHkgYXR0cmlidXRlIHdvcmtzIHNpbWlsYXJseSB0byB0aGUgZWF2ZXNkcm9wCithdHRyaWJ1dGUuIEl0IGNvbnRyb2xzIHdoZXRoZXIgdGhlICZsdDtkZW55Jmd0OyBvciAmbHQ7YWxsb3cmZ3Q7IG1hdGNoZXMgYSByZXBseQordGhhdCBpcyBleHBlY3RlZCAoY29ycmVzcG9uZHMgdG8gYSBwcmV2aW91cyBtZXRob2QgY2FsbCBtZXNzYWdlKS4KK1RoaXMgYXR0cmlidXRlIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHJlcGx5IG1lc3NhZ2VzIChlcnJvcnMgYW5kIG1ldGhvZAorcmV0dXJucyksIGFuZCBpcyBpZ25vcmVkIGZvciBvdGhlciBtZXNzYWdlIHR5cGVzLjwvcGFyYT4KKworCis8cGFyYT5Gb3IgJmx0O2FsbG93Jmd0OywgW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBpcyB0aGUgZGVmYXVsdCBhbmQgaW5kaWNhdGVzIHRoYXQKK29ubHkgcmVxdWVzdGVkIHJlcGxpZXMgYXJlIGFsbG93ZWQgYnkgdGhlCitydWxlLiBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9ImZhbHNlIiBtZWFucyB0aGF0IHRoZSBydWxlIGFsbG93cyBhbnkgcmVwbHkKK2V2ZW4gaWYgdW5leHBlY3RlZC48L3BhcmE+CisKKworPHBhcmE+Rm9yICZsdDtkZW55Jmd0OywgW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJmYWxzZSIgaXMgdGhlIGRlZmF1bHQgYnV0IGluZGljYXRlcyB0aGF0Cit0aGUgcnVsZSBtYXRjaGVzIG9ubHkgd2hlbiB0aGUgcmVwbHkgd2FzIG5vdAorcmVxdWVzdGVkLiBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIGFwcGxpZXMKK2Fsd2F5cywgcmVnYXJkbGVzcyBvZiBwZW5kaW5nIHJlcGx5IHN0YXRlLjwvcGFyYT4KKworCis8cGFyYT51c2VyIGFuZCBncm91cCBkZW5pYWxzIG1lYW4gdGhhdCB0aGUgZ2l2ZW4gdXNlciBvciBncm91cCBtYXkgCitub3QgY29ubmVjdCB0byB0aGUgbWVzc2FnZSBidXMuPC9wYXJhPgorCisKKzxwYXJhPkZvciAibmFtZSIsICJ1c2VybmFtZSIsICJncm91cG5hbWUiLCBldGMuCit0aGUgY2hhcmFjdGVyICIqIiBjYW4gYmUgc3Vic3RpdHV0ZWQsIG1lYW5pbmcgImFueS4iIENvbXBsZXggZ2xvYnMKK2xpa2UgImZvby5iYXIuKiIgYXJlbid0IGFsbG93ZWQgZm9yIG5vdyBiZWNhdXNlIHRoZXknZCBiZSB3b3JrIHRvCitpbXBsZW1lbnQgYW5kIG1heWJlIGVuY291cmFnZSBzbG9wcHkgc2VjdXJpdHkgYW55d2F5LjwvcGFyYT4KKworCis8cGFyYT5JdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGRlbnkgYSB1c2VyIG9yIGdyb3VwIGluc2lkZSBhICZsdDtwb2xpY3kmZ3Q7Citmb3IgYSB1c2VyIG9yIGdyb3VwOyB1c2VyL2dyb3VwIGRlbmlhbHMgY2FuIG9ubHkgYmUgaW5zaWRlCitjb250ZXh0PSJkZWZhdWx0IiBvciBjb250ZXh0PSJtYW5kYXRvcnkiIHBvbGljaWVzLjwvcGFyYT4KKworCis8cGFyYT5BIHNpbmdsZSAmbHQ7ZGVueSZndDsgcnVsZSBtYXkgc3BlY2lmeSBjb21iaW5hdGlvbnMgb2YgYXR0cmlidXRlcyBzdWNoIGFzCitzZW5kX2Rlc3RpbmF0aW9uIGFuZCBzZW5kX2ludGVyZmFjZSBhbmQgc2VuZF90eXBlLiBJbiB0aGlzIGNhc2UsIHRoZQorZGVuaWFsIGFwcGxpZXMgb25seSBpZiBib3RoIGF0dHJpYnV0ZXMgbWF0Y2ggdGhlIG1lc3NhZ2UgYmVpbmcgZGVuaWVkLgorZS5nLiAmbHQ7ZGVueSBzZW5kX2ludGVyZmFjZT0iZm9vLmJhciIgc2VuZF9kZXN0aW5hdGlvbj0iZm9vLmJsYWgiLyZndDsgd291bGQKK2RlbnkgbWVzc2FnZXMgd2l0aCB0aGUgZ2l2ZW4gaW50ZXJmYWNlIEFORCB0aGUgZ2l2ZW4gYnVzIG5hbWUuCitUbyBnZXQgYW4gT1IgZWZmZWN0IHlvdSBzcGVjaWZ5IG11bHRpcGxlICZsdDtkZW55Jmd0OyBydWxlcy48L3BhcmE+CisKKworPHBhcmE+WW91IGNhbid0IGluY2x1ZGUgYm90aCBzZW5kXyBhbmQgcmVjZWl2ZV8gYXR0cmlidXRlcyBvbiB0aGUgc2FtZQorcnVsZSwgc2luY2UgIndoZXRoZXIgdGhlIG1lc3NhZ2UgY2FuIGJlIHNlbnQiIGFuZCAid2hldGhlciBpdCBjYW4gYmUKK3JlY2VpdmVkIiBhcmUgZXZhbHVhdGVkIHNlcGFyYXRlbHkuPC9wYXJhPgorCisKKzxwYXJhPkJlIGNhcmVmdWwgd2l0aCBzZW5kX2ludGVyZmFjZS9yZWNlaXZlX2ludGVyZmFjZSwgYmVjYXVzZSB0aGUgCitpbnRlcmZhY2UgZmllbGQgaW4gbWVzc2FnZXMgaXMgb3B0aW9uYWwuPC9wYXJhPgorCis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3NlbGludXgmZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKworPHBhcmE+PC9wYXJhPiA8IS0tIEZJWE1FOiBibGFuayBsaXN0IGl0ZW0gLS0+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPlRoZSAmbHQ7c2VsaW51eCZndDsgZWxlbWVudCBjb250YWlucyBzZXR0aW5ncyByZWxhdGVkIHRvIFNlY3VyaXR5IEVuaGFuY2VkIExpbnV4LgorTW9yZSBkZXRhaWxzIGJlbG93LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthc3NvY2lhdGUmZ3Q7PC9lbXBoYXNpcz48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKworPHBhcmE+PC9wYXJhPiA8IS0tIEZJWE1FOiBibGFuayBsaXN0IGl0ZW0gLS0+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+CisKKzxwYXJhPkFuICZsdDthc3NvY2lhdGUmZ3Q7IGVsZW1lbnQgYXBwZWFycyBiZWxvdyBhbiAmbHQ7c2VsaW51eCZndDsgZWxlbWVudCBhbmQKK2NyZWF0ZXMgYSBtYXBwaW5nLiBSaWdodCBub3cgb25seSBvbmUga2luZCBvZiBhc3NvY2lhdGlvbiBpcyBwb3NzaWJsZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDthc3NvY2lhdGUgb3duPSJvcmcuZnJlZWRlc2t0b3AuRm9vYmFyIiBjb250ZXh0PSJmb29fdCIvJmd0OyAKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhpcyBtZWFucyB0aGF0IGlmIGEgY29ubmVjdGlvbiBhc2tzIHRvIG93biB0aGUgbmFtZQorIm9yZy5mcmVlZGVza3RvcC5Gb29iYXIiIHRoZW4gdGhlIHNvdXJjZSBjb250ZXh0IHdpbGwgYmUgdGhlIGNvbnRleHQKK29mIHRoZSBjb25uZWN0aW9uIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgd2lsbCBiZSAiZm9vX3QiIC0gc2VlIHRoZSAKK3Nob3J0IGRpc2N1c3Npb24gb2YgU0VMaW51eCBiZWxvdy48L3BhcmE+CisKKworPHBhcmE+Tm90ZSwgdGhlIGNvbnRleHQgaGVyZSBpcyB0aGUgdGFyZ2V0IGNvbnRleHQgd2hlbiByZXF1ZXN0aW5nIGEgbmFtZSwKK05PVCB0aGUgY29udGV4dCBvZiB0aGUgY29ubmVjdGlvbiBvd25pbmcgdGhlIG5hbWUuPC9wYXJhPgorCisKKzxwYXJhPlRoZXJlJ3MgY3VycmVudGx5IG5vIHdheSB0byBzZXQgYSBkZWZhdWx0IGZvciBvd25pbmcgYW55IG5hbWUsIGlmCit3ZSBhZGQgdGhpcyBzeW50YXggaXQgd2lsbCBsb29rIGxpa2U6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAmbHQ7YXNzb2NpYXRlIG93bj0iKiIgY29udGV4dD0iZm9vX3QiLyZndDsgCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorPHBhcmE+SWYgeW91IGZpbmQgYSByZWFzb24gdGhpcyBpcyB1c2VmdWwsIGxldCB0aGUgZGV2ZWxvcGVycyBrbm93LgorUmlnaHQgbm93IHRoZSBkZWZhdWx0IHdpbGwgYmUgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIGJ1cyBpdHNlbGYuPC9wYXJhPgorCisKKzxwYXJhPklmIHR3byAmbHQ7YXNzb2NpYXRlJmd0OyBlbGVtZW50cyBzcGVjaWZ5IHRoZSBzYW1lIG5hbWUsIHRoZSBlbGVtZW50CithcHBlYXJpbmcgbGF0ZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIGJlIHVzZWQuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J3NlbGludXgnPjx0aXRsZT5TRUxpbnV4PC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3Lm5zYS5nb3Yvc2VsaW51eC8nPmh0dHA6Ly93d3cubnNhLmdvdi9zZWxpbnV4LzwvdWxpbms+IGZvciBmdWxsIGRldGFpbHMgb24gU0VMaW51eC4gU29tZSB1c2VmdWwgZXhjZXJwdHM6PC9wYXJhPgorCisKKzxwYXJhPkV2ZXJ5IHN1YmplY3QgKHByb2Nlc3MpIGFuZCBvYmplY3QgKGUuZy4gZmlsZSwgc29ja2V0LCBJUEMgb2JqZWN0LAorZXRjKSBpbiB0aGUgc3lzdGVtIGlzIGFzc2lnbmVkIGEgY29sbGVjdGlvbiBvZiBzZWN1cml0eSBhdHRyaWJ1dGVzLAora25vd24gYXMgYSBzZWN1cml0eSBjb250ZXh0LiBBIHNlY3VyaXR5IGNvbnRleHQgY29udGFpbnMgYWxsIG9mIHRoZQorc2VjdXJpdHkgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHN1YmplY3Qgb3Igb2JqZWN0Cit0aGF0IGFyZSByZWxldmFudCB0byB0aGUgc2VjdXJpdHkgcG9saWN5LjwvcGFyYT4KKworCis8cGFyYT5JbiBvcmRlciB0byBiZXR0ZXIgZW5jYXBzdWxhdGUgc2VjdXJpdHkgY29udGV4dHMgYW5kIHRvIHByb3ZpZGUKK2dyZWF0ZXIgZWZmaWNpZW5jeSwgdGhlIHBvbGljeSBlbmZvcmNlbWVudCBjb2RlIG9mIFNFTGludXggdHlwaWNhbGx5CitoYW5kbGVzIHNlY3VyaXR5IGlkZW50aWZpZXJzIChTSURzKSByYXRoZXIgdGhhbiBzZWN1cml0eSBjb250ZXh0cy4gQQorU0lEIGlzIGFuIGludGVnZXIgdGhhdCBpcyBtYXBwZWQgYnkgdGhlIHNlY3VyaXR5IHNlcnZlciB0byBhIHNlY3VyaXR5Citjb250ZXh0IGF0IHJ1bnRpbWUuPC9wYXJhPgorCisKKzxwYXJhPldoZW4gYSBzZWN1cml0eSBkZWNpc2lvbiBpcyByZXF1aXJlZCwgdGhlIHBvbGljeSBlbmZvcmNlbWVudCBjb2RlCitwYXNzZXMgYSBwYWlyIG9mIFNJRHMgKHR5cGljYWxseSB0aGUgU0lEIG9mIGEgc3ViamVjdCBhbmQgdGhlIFNJRCBvZgorYW4gb2JqZWN0LCBidXQgc29tZXRpbWVzIGEgcGFpciBvZiBzdWJqZWN0IFNJRHMgb3IgYSBwYWlyIG9mIG9iamVjdAorU0lEcyksIGFuZCBhbiBvYmplY3Qgc2VjdXJpdHkgY2xhc3MgdG8gdGhlIHNlY3VyaXR5IHNlcnZlci4gVGhlIG9iamVjdAorc2VjdXJpdHkgY2xhc3MgaW5kaWNhdGVzIHRoZSBraW5kIG9mIG9iamVjdCwgZS5nLiBhIHByb2Nlc3MsIGEgcmVndWxhcgorZmlsZSwgYSBkaXJlY3RvcnksIGEgVENQIHNvY2tldCwgZXRjLjwvcGFyYT4KKworCis8cGFyYT5BY2Nlc3MgZGVjaXNpb25zIHNwZWNpZnkgd2hldGhlciBvciBub3QgYSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgZm9yIGEKK2dpdmVuIHBhaXIgb2YgU0lEcyBhbmQgY2xhc3MuIEVhY2ggb2JqZWN0IGNsYXNzIGhhcyBhIHNldCBvZgorYXNzb2NpYXRlZCBwZXJtaXNzaW9ucyBkZWZpbmVkIHRvIGNvbnRyb2wgb3BlcmF0aW9ucyBvbiBvYmplY3RzIHdpdGgKK3RoYXQgY2xhc3MuPC9wYXJhPgorCisKKzxwYXJhPkQtQnVzIHBlcmZvcm1zIFNFTGludXggc2VjdXJpdHkgY2hlY2tzIGluIHR3byBwbGFjZXMuPC9wYXJhPgorCisKKzxwYXJhPkZpcnN0LCBhbnkgdGltZSBhIG1lc3NhZ2UgaXMgcm91dGVkIGZyb20gb25lIGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorY29ubmVjdGlvbiwgdGhlIGJ1cyBkYWVtb24gd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aXRoIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mCit0aGUgZmlyc3QgY29ubmVjdGlvbiBhcyBzb3VyY2UsIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIHNlY29uZCBjb25uZWN0aW9uCithcyB0YXJnZXQsIG9iamVjdCBjbGFzcyAiZGJ1cyIgYW5kIHJlcXVlc3RlZCBwZXJtaXNzaW9uICJzZW5kX21zZyIuPC9wYXJhPgorCisKKzxwYXJhPklmIGEgc2VjdXJpdHkgY29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGZvciBhIGNvbm5lY3Rpb24gCisoaW1wb3NzaWJsZSB3aGVuIHVzaW5nIFVOSVggZG9tYWluIHNvY2tldHMpLCB0aGVuIHRoZSB0YXJnZXQgCitjb250ZXh0IHVzZWQgaXMgdGhlIGNvbnRleHQgb2YgdGhlIGJ1cyBkYWVtb24gaXRzZWxmLgorVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0LCBiZWNhdXNlIHdlJ3JlIAorYXNzdW1pbmcgdGhhdCBvbmx5IFVOSVggZG9tYWluIHNvY2tldHMgd2lsbCBiZSB1c2VkIHRvIAorY29ubmVjdCB0byB0aGUgc3lzdGVtd2lkZSBidXMuIElmIHRoaXMgY2hhbmdlcywgd2UnbGwgCitwcm9iYWJseSBhZGQgYSB3YXkgdG8gc2V0IHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gY29udGV4dC48L3BhcmE+CisKKworPHBhcmE+U2Vjb25kLCBhbnkgdGltZSBhIGNvbm5lY3Rpb24gYXNrcyB0byBvd24gYSBuYW1lLCAKK3RoZSBidXMgZGFlbW9uIHdpbGwgY2hlY2sgcGVybWlzc2lvbnMgd2l0aCB0aGUgc2VjdXJpdHkgCitjb250ZXh0IG9mIHRoZSBjb25uZWN0aW9uIGFzIHNvdXJjZSwgdGhlIHNlY3VyaXR5IGNvbnRleHQgc3BlY2lmaWVkCitmb3IgdGhlIG5hbWUgaW4gdGhlIGNvbmZpZyBmaWxlIGFzIHRhcmdldCwgb2JqZWN0IAorY2xhc3MgImRidXMiIGFuZCByZXF1ZXN0ZWQgcGVybWlzc2lvbiAiYWNxdWlyZV9zdmMiLjwvcGFyYT4KKworCis8cGFyYT5UaGUgc2VjdXJpdHkgY29udGV4dCBmb3IgYSBidXMgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgCismbHQ7YXNzb2NpYXRlJmd0OyBlbGVtZW50IGRlc2NyaWJlZCBlYXJsaWVyIGluIHRoaXMgZG9jdW1lbnQuCitJZiBhIG5hbWUgaGFzIG5vIHNlY3VyaXR5IGNvbnRleHQgYXNzb2NpYXRlZCBpbiB0aGUgCitjb25maWd1cmF0aW9uIGZpbGUsIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBidXMgZGFlbW9uIAoraXRzZWxmIHdpbGwgYmUgdXNlZC48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9idXMvc2VydmljZS5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL2J1cy9zZXJ2aWNlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDE3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9idXMvc2VydmljZS5jbWFrZQpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRla3RvcC5EQnVzLlNlcnZpY2VOYW1lCitFeGVjPW5vdGVwYWQKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL2J1cy9zZXNzaW9uLmNvbmYuY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9idXMvc2Vzc2lvbi5jb25mLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmE5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9idXMvc2Vzc2lvbi5jb25mLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKzwhLS0gVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgY29udHJvbHMgdGhlIHBlci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMuCisgICAgIEFkZCBhIHNlc3Npb24tbG9jYWwuY29uZiBhbmQgZWRpdCB0aGF0IHJhdGhlciB0aGFuIGNoYW5naW5nIHRoaXMgCisgICAgIGZpbGUgZGlyZWN0bHkuIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKworICA8bGlzdGVuPkBEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTU0A8L2xpc3Rlbj4KKworICA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAvPgorCisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHNlbnQgLS0+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gVGhpcyBpcyBpbmNsdWRlZCBsYXN0IHNvIGxvY2FsIGNvbmZpZ3VyYXRpb24gY2FuIG92ZXJyaWRlIHdoYXQncyAKKyAgICAgICBpbiB0aGlzIHN0YW5kYXJkIGZpbGUgLS0+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPnNlc3Npb24tbG9jYWwuY29uZjwvaW5jbHVkZT4KKworICA8aW5jbHVkZSBpZl9zZWxpbnV4X2VuYWJsZWQ9InllcyIgc2VsaW51eF9yb290X3JlbGF0aXZlPSJ5ZXMiPmNvbnRleHRzL2RidXNfY29udGV4dHM8L2luY2x1ZGU+CisKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvYnVzL3N5c3RlbS5jb25mLmNtYWtlIGIvZGJ1cy0xLjQuMTAvY21ha2UvYnVzL3N5c3RlbS5jb25mLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlODVlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9idXMvc3lzdGVtLmNvbmYuY21ha2UKQEAgLTAsMCArMSw2MiBAQAorPCEtLSBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250cm9scyB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cy4KKyAgICAgQWRkIGEgc3lzdGVtLWxvY2FsLmNvbmYgYW5kIGVkaXQgdGhhdCByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGlzIAorICAgICBmaWxlIGRpcmVjdGx5LiAtLT4KKworPCEtLSBOb3RlIHRoYXQgdGhlcmUgYXJlIGFueSBudW1iZXIgb2Ygd2F5cyB5b3UgY2FuIGhvc2UgeW91cnNlbGYKKyAgICAgc2VjdXJpdHktd2lzZSBieSBzY3Jld2luZyB1cCB0aGlzIGZpbGU7IGluIHBhcnRpY3VsYXIsIHlvdQorICAgICBwcm9iYWJseSBkb24ndCB3YW50IHRvIGxpc3RlbiBvbiBhbnkgbW9yZSBhZGRyZXNzZXMsIGFkZCBhbnkgbW9yZQorICAgICBhdXRoIG1lY2hhbmlzbXMsIHJ1biBhcyBhIGRpZmZlcmVudCB1c2VyLCBldGMuIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorCisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvIG5vdCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c3lzdGVtPC90eXBlPgorCisgIDwhLS0gUnVuIGFzIHNwZWNpYWwgdXNlciAtLT4KKyAgPHVzZXI+QERCVVNfVVNFUkA8L3VzZXI+CisKKyAgPCEtLSBGb3JrIGludG8gZGFlbW9uIG1vZGUgLS0+CisgIDxmb3JrLz4KKworICA8IS0tIFdyaXRlIGEgcGlkIGZpbGUgLS0+CisgIDxwaWRmaWxlPkBEQlVTX1NZU1RFTV9QSURfRklMRUA8L3BpZGZpbGU+CisKKyAgPCEtLSBPbmx5IGFsbG93IHNvY2tldC1jcmVkZW50aWFscy1iYXNlZCBhdXRoZW50aWNhdGlvbiAtLT4KKyAgPGF1dGg+RVhURVJOQUw8L2F1dGg+CisKKyAgPCEtLSBPbmx5IGxpc3RlbiBvbiBhIGxvY2FsIHNvY2tldC4gKGFic3RyYWN0PS9wYXRoL3RvL3NvY2tldCAKKyAgICAgICBtZWFucyB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlLCBkb24ndCByZWFsbHkgY3JlYXRlIGZpbGVzeXN0ZW0gCisgICAgICAgZmlsZTsgb25seSBMaW51eCBzdXBwb3J0cyB0aGlzLiBVc2UgcGF0aD0vd2hhdGV2ZXIgb24gb3RoZXIgCisgICAgICAgc3lzdGVtcy4pIC0tPgorICA8bGlzdGVuPkBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTQDwvbGlzdGVuPgorCisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPCEtLSBEZW55IGV2ZXJ5dGhpbmcgdGhlbiBwdW5jaCBob2xlcyAtLT4KKyAgICA8ZGVueSBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxkZW55IHJlY2VpdmVfaW50ZXJmYWNlPSIqIi8+CisgICAgPGRlbnkgb3duPSIqIi8+CisgICAgPCEtLSBCdXQgYWxsb3cgYWxsIHVzZXJzIHRvIGNvbm5lY3QgLS0+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byB0YWxrIHRvIHRoZSBtZXNzYWdlIGJ1cyAtLT4KKyAgICA8IS0tIEZJWE1FIEkgdGhpbmsgY3VycmVudGx5IHRoZXNlIGFsbG93IHJ1bGVzIGFyZSBhbHdheXMgaW1wbGljaXQgCisgICAgICAgICBldmVuIGlmIHRoZXkgYXJlbid0IGluIGhlcmUgLS0+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIi8+CisgICAgPGFsbG93IHJlY2VpdmVfc2VuZGVyPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIvPgorICAgIDwhLS0gdmFsaWQgcmVwbGllcyBhcmUgYWx3YXlzIGFsbG93ZWQgLS0+CisgICAgPGFsbG93IHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIi8+CisgICAgPGFsbG93IHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIi8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gQ29uZmlnIGZpbGVzIGFyZSBwbGFjZWQgaGVyZSB0aGF0IGFtb25nIG90aGVyIHRoaW5ncywgcHVuY2ggCisgICAgICAgaG9sZXMgaW4gdGhlIGFib3ZlIHBvbGljeSBmb3Igc3BlY2lmaWMgc2VydmljZXMuIC0tPgorICA8aW5jbHVkZWRpcj5zeXN0ZW0uZDwvaW5jbHVkZWRpcj4KKworICA8IS0tIFRoaXMgaXMgaW5jbHVkZWQgbGFzdCBzbyBsb2NhbCBjb25maWd1cmF0aW9uIGNhbiBvdmVycmlkZSB3aGF0J3MgCisgICAgICAgaW4gdGhpcyBzdGFuZGFyZCBmaWxlIC0tPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5zeXN0ZW0tbG9jYWwuY29uZjwvaW5jbHVkZT4KKworICA8aW5jbHVkZSBpZl9zZWxpbnV4X2VuYWJsZWQ9InllcyIgc2VsaW51eF9yb290X3JlbGF0aXZlPSJ5ZXMiPmNvbnRleHRzL2RidXNfY29udGV4dHM8L2luY2x1ZGU+CisKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvY29uZmlnLmguY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9jb25maWcuaC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNkNDVhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvY29uZmlnLmguY21ha2UKQEAgLTAsMCArMSwyNTUgQEAKKy8qIGNvbmZpZy5oLiBHZW5lcmF0ZWQgYnkgY21ha2UgZnJvbSBjb25maWcuaC5jbWFrZSAqLworCisjaWZuZGVmIF9EQlVTX0NPTkZJR19ICisjZGVmaW5lIF9EQlVTX0NPTkZJR19ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGluZGljYXRlIHRoYXQgd2UgYXJlIGJ1aWxkaW5nIHdpdGggY21ha2UgKi8KKyNkZWZpbmUgREJVU19DTUFLRSAxCisKKyNjbWFrZWRlZmluZSBIQVZFX0dOVUNfVkFSQVJHUyAxCisKKyNjbWFrZWRlZmluZSBEQlVTX0NPTlNPTEVfQVVUSF9ESVIgIkBEQlVTX0NPTlNPTEVfQVVUSF9ESVJAIgorI2NtYWtlZGVmaW5lIERCVVNfREFUQURJUiAgIkBEQlVTX0RBVEFESVJAIgorI2NtYWtlZGVmaW5lIERCVVNfQklORElSICAgIkBEQlVTX0JJTkRJUkAiCisjY21ha2VkZWZpbmUgREJVU19TWVNURU1fQ09ORklHX0ZJTEUgICJAREJVU19TWVNURU1fQ09ORklHX0ZJTEVAIgorI2NtYWtlZGVmaW5lIERCVVNfU0VTU0lPTl9DT05GSUdfRklMRSAiQERCVVNfU0VTU0lPTl9DT05GSUdfRklMRUAiCisjY21ha2VkZWZpbmUgREJVU19EQUVNT05fTkFNRSAiQERCVVNfREFFTU9OX05BTUVAIgorI2NtYWtlZGVmaW5lIERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MgICJAREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0AiCisjY21ha2VkZWZpbmUgREJVU19NQUNISU5FX1VVSURfRklMRSAiQERCVVNfTUFDSElORV9VVUlEX0ZJTEVAIgorI2NtYWtlZGVmaW5lIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTICJAREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1NAIgorI2NtYWtlZGVmaW5lIERCVVNfREFFTU9ORElSICJAREJVU19EQUVNT05ESVJAIgorI2NtYWtlZGVmaW5lIFBBQ0tBR0UgIkBQQUNLQUdFQCIKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyNjbWFrZWRlZmluZSBEQlVTX01BSk9SX1ZFUlNJT04gQERCVVNfTUFKT1JfVkVSU0lPTkAKKyNjbWFrZWRlZmluZSBEQlVTX01JTk9SX1ZFUlNJT04gQERCVVNfTUlOT1JfVkVSU0lPTkAKKyNjbWFrZWRlZmluZSBEQlVTX01JQ1JPX1ZFUlNJT04gQERCVVNfTUlDUk9fVkVSU0lPTkAKKyNjbWFrZWRlZmluZSBEQlVTX1ZFUlNJT04gKChAREJVU19NQUpPUl9WRVJTSU9OQCA8PCAxNikgfCAoQERCVVNfTUlOT1JfVkVSU0lPTkAgPDwgOCkgfCAoQERCVVNfTUlDUk9fVkVSU0lPTkApKQorI2NtYWtlZGVmaW5lIERCVVNfVkVSU0lPTl9TVFJJTkcgIkBEQlVTX1ZFUlNJT05fU1RSSU5HQCIKKworI2RlZmluZSBWRVJTSU9OIERCVVNfVkVSU0lPTl9TVFJJTkcKKworI2RlZmluZSBURVNUX0xJU1RFTiAgICAgICAiQFRFU1RfTElTVEVOQCIKKyNkZWZpbmUgVEVTVF9DT05ORUNUSU9OICAgIkBURVNUX0NPTk5FQ1RJT05AIgorCisvLyB0ZXN0IGJpbmFyaWVzCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1leGl0IGluIGJ1aWxkZGlyICovCisjZGVmaW5lIFRFU1RfQlVTX0JJTkFSWSAgICAgICAgICAiQFRFU1RfQlVTX0JJTkFSWUAiCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1leGl0IGluIGJ1aWxkZGlyICovCisjZGVmaW5lIFRFU1RfRVhJVF9CSU5BUlkgICAgICAgICAgIkBURVNUX0VYSVRfQklOQVJZQCIKKy8qIEZ1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC90ZXN0LXNlZ2ZhdWx0IGluIGJ1aWxkZGlyICovCisjZGVmaW5lIFRFU1RfU0VHRkFVTFRfQklOQVJZICAgICAgIkBURVNUX1NFR0ZBVUxUX0JJTkFSWUAiCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1zZXJ2aWNlIGluIGJ1aWxkZGlyICovCisjZGVmaW5lIFRFU1RfU0VSVklDRV9CSU5BUlkgICAgICAgIkBURVNUX1NFUlZJQ0VfQklOQVJZQCIKKy8qIEZ1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UgaW4gYnVpbGRkaXIgKi8KKyNkZWZpbmUgVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWSAiQFRFU1RfU0hFTExfU0VSVklDRV9CSU5BUllAIgorLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L3Rlc3Qtc2xlZXAtZm9yZXZlciBpbiBidWlsZGRpciAqLworI2RlZmluZSBURVNUX1NMRUVQX0ZPUkVWRVJfQklOQVJZICJAVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWUAiCisKKy8qIFNvbWUgZGJ1cyBmZWF0dXJlcyAqLworI2NtYWtlZGVmaW5lIERCVVNfQlVJTERfVEVTVFMgMQorI2NtYWtlZGVmaW5lIERCVVNfRU5BQkxFX0FOU0kgMQorI2NtYWtlZGVmaW5lIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAxCisjY21ha2VkZWZpbmUgREJVU19ESVNBQkxFX0FTU0VSVFMgMQorI2NtYWtlZGVmaW5lIERCVVNfRElTQUJMRV9DSEVDS1MgMQorLyogeG1sZG9jcyAqLworLyogZG94eWdlbiAqLworI2NtYWtlZGVmaW5lIERCVVNfR0NPVl9FTkFCTEVEIDEKKworLyogYWJzdHJhY3Qtc29ja2V0cyAqLworCisjY21ha2VkZWZpbmUgSEFWRV9BQlNUUkFDVF9TT0NLRVRTIDEKKworI2NtYWtlZGVmaW5lIERCVVNfUEFUSF9PUl9BQlNUUkFDVF9WQUxVRSAxCisKKyNpZiAoZGVmaW5lZCBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUpCisjZGVmaW5lIERCVVNfUEFUSF9PUl9BQlNUUkFDVCBAREJVU19QQVRIX09SX0FCU1RSQUNUX1ZBTFVFQAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUKKyN1bmRlZiBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RfVkFMVUUKKyNlbmRpZgorCisvKiBzZWxpbnV4ICovCisjY21ha2VkZWZpbmUgREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVggMQorLyoga3F1ZXVlICovCisjY21ha2VkZWZpbmUgSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUgMQorI2RlZmluZSBEQlVTX0NPTlNPTEVfT1dORVJfRklMRSAiQERCVVNfQ09OU09MRV9PV05FUl9GSUxFQCIKKworI2NtYWtlZGVmaW5lIERCVVNfSEFWRV9BVE9NSUNfSU5UIDEKKyNjbWFrZWRlZmluZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiAxCisjaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCisjIGRlZmluZSBEQlVTX0hBVkVfQVRPTUlDX0lOVCAxCisjIGRlZmluZSBEQlVTX1VTRV9BVE9NSUNfSU5UXzQ4NiAxCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfQlVJTERfWDExIDEKKy8qIEZvciB0aGUgbW9tZW50LCB0aGUgY21ha2UgYnVpbGQgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBhbiBlcXVpdmFsZW50IG9mCisgKiB0aGUgYXV0b2NvbmYgYnVpbGQgc3lzdGVtJ3MgLS1kaXNhYmxlLXgxMS1hdXRvbGF1bmNoICovCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyMgZGVmaW5lIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNIIDEKKyNlbmRpZgorCisjZGVmaW5lIF9EQlVTX1ZBX0NPUFlfQVNTSUdOKGExLGEyKSB7IGExID0gYTI7IH0KKworI2NtYWtlZGVmaW5lIERCVVNfVkFfQ09QWV9GVU5DCisjaWYgKGRlZmluZWQgREJVU19WQV9DT1BZX0ZVTkMpCisjIGRlZmluZSBEQlVTX1ZBX0NPUFkgQERCVVNfVkFfQ09QWV9GVU5DQAorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1ZBX0NPUFlfRlVOQworI3VuZGVmIERCVVNfVkFfQ09QWV9GVU5DCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfVkFfQ09QWV9BU19BUlJBWSBAREJVU19WQV9DT1BZX0FTX0FSUkFZQAorCisvLyBoZWFkZXJzCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBkaXJlbnQuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9ESVJFTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGlvLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfSU9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGdycC5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0dSUF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3BvbGwuaCAqLworI2NtYWtlZGVmaW5lICAgIEhBVkVfUE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN5cy90aW1lLmggKi8KKyNjbWFrZWRlZmluZSAgICBIQVZFX1NZU19USU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3dhaXQuaCAqLworI2NtYWtlZGVmaW5lICAgIEhBVkVfU1lTX1dBSVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aW1lLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfVElNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgd3MydGNwaXAuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9XUzJUQ1BJUF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHdzcGlhcGkuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9XU1BJQVBJX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB1bmlzdGQuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0ZGlvLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1RESU9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN5cy9zeXNsaW1pdHMuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TWVNfU1lTTElNSVRTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBlcnJuby5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0VSUk5PX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzaWduYWwuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TSUdOQUxfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGxvY2FsZS5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0xPQ0FMRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgaW50dHlwZXMuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3RkaW50LmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1RESU5UX0ggMQorCisvLyBzeW1ib2xzCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBiYWNrdHJhY2UgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfQkFDS1RSQUNFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZ2V0Z3JvdXBsaXN0ICovCisjY21ha2VkZWZpbmUgICBIQVZFX0dFVEdST1VQTElTVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGdldHBlZXJ1Y3JlZCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9HRVRQRUVSVUNSRUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBuYW5vc2xlZXAgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfTkFOT1NMRUVQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZ2V0cHduYW1fciAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9QT1NJWF9HRVRQV05BTV9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc29ja2V0cGFpciAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TT0NLRVRQQUlSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc2V0ZW52ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NFVEVOViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHVuc2V0ZW52ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1VOU0VURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgY2xlYXJlbnYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfQ0xFQVJFTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB3cml0ZXYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfV1JJVEVWIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc29ja2xlbl90ICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NPQ0tMRU5fVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHNldGxvY2FsZSAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TRVRMT0NBTEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBsb2NhbGVjb252ICovCisjY21ha2VkZWZpbmUgICBIQVZFX0xPQ0FMRUNPTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdHJ0b2xsICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NUUlRPTEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdHJ0b3VsbCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TVFJUT1VMTCAxCisKKy8vIHN0cnVjdHMKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0cnVjdCBjbXNncmVkICovCisjY21ha2VkZWZpbmUgICAgSEFWRV9DTVNHQ1JFRCAxCisKKy8vIHN5c3RlbSB0eXBlIGRlZmluZXMKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpIHx8IGRlZmluZWQgKF9XSU4zMl9XQ0UpCisjIGRlZmluZSBEQlVTX1dJTgorIyBkZWZpbmUgREJVU19XSU5fRklYTUUgMQorIyBpZmRlZiBfV0lOMzJfV0NFCisjICBkZWZpbmUgREJVU19XSU5DRQorIyBlbHNlCisjICBkZWZpbmUgREJVU19XSU4zMgorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIERCVVNfVU5JWAorI2VuZGlmIAorCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorLy8gbWluZ3cgbW9kZV90CisjIGlmZGVmIEhBVkVfU1RESU9fSAorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgZW5kaWYKKyMgaWZuZGVmIF9NU0NfVkVSCisjICBkZWZpbmUgdWlkX3QgaW50CisjICBkZWZpbmUgZ2lkX3QgaW50CisjIGVsc2UKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyAgIHR5cGVkZWYgaW50IG1vZGVfdDsKKyMgIGlmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCisjICAgIGRlZmluZSBzdHJ0b2xsIF9zdHJ0b2k2NAorIyAgICBkZWZpbmUgc3RydG91bGwgX3N0cnRvdWk2NAorIyAgICBkZWZpbmUgSEFWRV9TVFJUT0xMIDEKKyMgICAgZGVmaW5lIEhBVkVfU1RSVE9VTEwgMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgkvLyBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisKKyNpZmRlZiBpbnRlcmZhY2UKKyN1bmRlZiBpbnRlcmZhY2UKKyNlbmRpZgorCisjaWZuZGVmIFNJR0hVUAorI2RlZmluZSBTSUdIVVAJMQorI2VuZGlmCisKKyNjbWFrZWRlZmluZSBEQlVTX1ZFUkJPU0VfQ19TIDEKKyNpZmRlZiBEQlVTX1ZFUkJPU0VfQ19TCisjZGVmaW5lIF9kYnVzX3ZlcmJvc2VfQ19TIHByaW50ZgorI2Vsc2UKKyNkZWZpbmUgX2RidXNfdmVyYm9zZV9DX1MgX2RidXNfdmVyYm9zZQorI2VuZGlmIAorCisjZW5kaWYgIC8vIF9EQlVTX0NPTkZJR19ICmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9jcm9zcy1jb21waWxlLnNoIGIvZGJ1cy0xLjQuMTAvY21ha2UvY3Jvc3MtY29tcGlsZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OWU2NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvY3Jvc3MtY29tcGlsZS5zaApAQCAtMCwwICsxLDExMCBAQAorIyEvYmluL3NoCisjCisjICBjcm9zcyBjb21waWxlIHNjcmlwdCBmb3IgY21ha2UKKyMgCisjIGluaXRpYWwgd3JpdHRlbiBieSBGcmlkcmljaCBTdHJiYQorIyByZWZhY3RvcmVkIHRvIGRlYmlhbi9sZW5ueSBieSBSYWxmIEhhYmFja2VyCisjCisjICByZXBvcnRlZCB0byB3b3JrIGF0IGxlYXN0IG9uIGRlYmlhbi9sZW5ueSAKKyMgCisKK2lmIHRlc3QgLWYgL3Vzci9iaW4vaTY4Ni1wYy1taW5ndzMyLWdjYzsgdGhlbgorICAgIGNyb3NzX2NjPWk2ODYtcGMtbWluZ3czMgorZWxpZiB0ZXN0IC1mIC91c3IvYmluL2k1ODYtbWluZ3czMm1zdmMtZ2NjOyB0aGVuCisgICAgY3Jvc3NfY2M9aTU4Ni1taW5ndzMybXN2YworZWxzZQorICAgIGVjaG8gImNvdWxkIG5vdCBkZXRlcm1pbmUgbWluZ3cgY3Jvc3MgY29tcGlsZXIiCisgICAgZXhpdCAxCitmaQorCitpZiB0ZXN0IC1kIH4vJGNyb3NzX2NjOyB0aGVuCisgICAgY3Jvc3Nfcm9vdD1+LyRjcm9zc19jYworZWxpZiB0ZXN0IC1kIC91c3IvJGNyb3NzX2NjL3N5cy1yb290L21pbmd3OyB0aGVuCisgICAgY3Jvc3Nfcm9vdD0vdXNyLyRjcm9zc19jYy9zeXMtcm9vdC9taW5ndworZWxpZiB0ZXN0IC1kIC91c3IvJGNyb3NzX2NjL2xpYjsgdGhlbgorICAgIGNyb3NzX3Jvb3Q9L3Vzci8kY3Jvc3NfY2MKK2Vsc2UKKyAgICBlY2hvICJjb3VsZCBub3QgZGV0ZXJtaW5lIG1pbmd3IGNyb3NzIGNvbXBpbGVyIHNkayIKKyAgICBleGl0IDEKK2ZpCisKK2lmICEgVEVNUD1gbWt0ZW1wIC0tdG1wZGlyIC1kIGRidXMtY3Jvc3MtY29tcGlsZS5YWFhYWFhgOyB0aGVuCisgICAgZWNobyAibWt0ZW1wIGZhaWxlZCwgdHJ5IHdpdGggY29yZXV0aWxzIDYuMTAgb3IgbGF0ZXI/IiA+JjIKKyAgICBleGl0IDEKK2ZpCisKKyMgbWFrZSBjbWFrZSBoYXBweSAKK2V4cG9ydCBURU1QCisKK0hPU1RfQ0M9Z2NjOyBleHBvcnQgSE9TVF9DQzsKKworaWYgdGVzdCAtZCAkY3Jvc3Nfcm9vdC9saWIvcGtnY29uZmlnOyB0aGVuIAorICAgIFBLR19DT05GSUdfUEFUSD0iJGNyb3NzX3Jvb3QvbGliL3BrZ2NvbmZpZzokY3Jvc3Nfcm9vdC9zaGFyZS9wa2djb25maWciOyBleHBvcnQgUEtHX0NPTkZJR19QQVRIOworZmkgCisKK2lmIHRlc3QgLWQgIiRNSU5HVzMyX0NMQVNTUEFUSCIgfHwgIHRlc3QgLWYgIiRjcm9zc19yb290L3NoYXJlL2phdmEvbGliZ2NqLmphciI7ICB0aGVuIAorICAgIENMQVNTUEFUSD0iJENMQVNTUEFUSDoke01JTkdXMzJfQ0xBU1NQQVRIOi0kY3Jvc3Nfcm9vdC9zaGFyZS9qYXZhL2xpYmdjai5qYXI6JGNyb3NzX3Jvb3Qvc2hhcmUvamF2YS9saWJnY2otdG9vbHMuamFyfSI7IGV4cG9ydCBDTEFTU1BBVEg7CitmaQorCitfUFJFRklYPSIvdXNyL2Jpbi8kY3Jvc3NfY2MtIjsKK2ZvciBpIGluIGBscyAtMSAke19QUkVGSVh9KiB8IGdyZXAgLXYgJ2djYy0nYDsgZG8KKyAgICB4PWBlY2hvICRpfHNlZCAicywke19QUkVGSVh9LCwifHNlZCAicyxcLmF3ayosLCJ8dHIgImEteistIiAiQS1aWF8iYDsKKyAgICBkZWNsYXJlIC14ICR4PSIkaSIgOyBleHBvcnQgJHg7Citkb25lOwordW5zZXQgX1BSRUZJWDsKKworQ0M9IiR7TUlOR1czMl9DQzotJGNyb3NzX2NjLWdjY30iOyBleHBvcnQgQ0M7CitDRkxBR1M9IiR7TUlOR1czMl9DRkxBR1M6LS1PMiAtZyAtcGlwZSAtV2FsbCAtZmV4Y2VwdGlvbnMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIC0tcGFyYW09c3NwLWJ1ZmZlci1zaXplPTQgLW1tcy1iaXRmaWVsZHN9IjsgZXhwb3J0IENGTEFHUzsKK0xERkxBR1M9IiR7TUlOR1czMl9MREZMQUdTOi0tV2wsLS1leGNsdWRlLWxpYnM9bGliaW50bC5hIC1XbCwtLWV4Y2x1ZGUtbGlicz1saWJpY29udi5hfSI7IGV4cG9ydCBMREZMQUdTOworCitpZiBbIC14ICIvdXNyL2Jpbi8kY3Jvc3NfY2MtZysrIiBdOyB0aGVuCisgICAgQ1hYPSIke01JTkdXMzJfQ1hYOi0kY3Jvc3NfY2MtZysrfSI7IGV4cG9ydCBDWFg7CisgICAgQ1hYRkxBR1M9IiR7TUlOR1czMl9DWFhGTEFHUzotLU8yIC1nIC1waXBlIC1XYWxsIC1mZXhjZXB0aW9ucyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgLS1wYXJhbT1zc3AtYnVmZmVyLXNpemU9NCAtbW1zLWJpdGZpZWxkc30iOyBleHBvcnQgQ1hYRkxBR1M7CitlbHNlCisgICAgQ1hYPTsgZXhwb3J0IENYWDsKKyAgICBhY19jdl9wcm9nX0NYWD1ubzsgZXhwb3J0IGFjX2N2X3Byb2dfQ1hYOworICAgIENYWEZMQUdTPTsgZXhwb3J0IENYWEZMQUdTOworZmk7Citmb3IgaSBpbiBgbHMgJGNyb3NzX3Jvb3QvYmluLyp8Z3JlcCAtLSAiLWNvbmZpZyQiYCA7IGRvCisgICAgeD1gYmFzZW5hbWUgJGl8dHIgImEteistIiAiQS1aWF8ifHNlZCAicyxcLiwsImA7CisgICAgZGVjbGFyZSAteCAkeD0iJGkiIDsgZXhwb3J0ICR4OworZG9uZTsKK3Vuc2V0IHggaSA7CisKK2lmICEgdGVzdCAtZiAiJGNyb3NzX3Jvb3QvbGliL2xpYmV4cGF0LmRsbC5hIjsgdGhlbgorICAgIChjZCAkVEVNUCAmJiB3Z2V0IGh0dHA6Ly93d3cud2lua2RlLm9yZy9wdWIva2RlL3BvcnRzL3dpbjMyL3JlcG9zaXRvcnkvd2luMzJsaWJzL2V4cGF0LTIuMC4xLWJpbi56aXApCisgICAgKGNkICRURU1QICYmIHdnZXQgaHR0cDovL3d3dy53aW5rZGUub3JnL3B1Yi9rZGUvcG9ydHMvd2luMzIvcmVwb3NpdG9yeS93aW4zMmxpYnMvZXhwYXQtMi4wLjEtbGliLnppcCkKKyAgICAoY2QgJGNyb3NzX3Jvb3QgJiYgdW56aXAgLXggJFRNUC9leHBhdC0yLjAuMS1iaW4uemlwKQorICAgIChjZCAkY3Jvc3Nfcm9vdCAmJiB1bnppcCAteCAkVE1QL2V4cGF0LTIuMC4xLWxpYi56aXApCitmaSAKKworaWYgdGVzdCAtZiAiJGNyb3NzX3Jvb3QvbGliL2xpYmV4cGF0LmRsbC5hIjsgdGhlbgorICAgIHhtbF9saWJyYXJ5PS1EREJVU19VU0VfRVhQQVQ9T24gLURMSUJFWFBBVF9JTkNMVURFX0RJUjpQQVRIPSRjcm9zc19yb290L2luY2x1ZGUgLURMSUJFWFBBVF9MSUJSQVJJRVM6UEFUSD0kY3Jvc3Nfcm9vdC9saWIvbGliZXhwYXQuZGxsLmEgCitlbHNlCisgICAgZWNobyAiY291bGQgbm90IGZpbmQgYSBjcm9zcyBjb21waWxlIHhtbCBsaWJyYXJheSIKKyAgICBleGl0IDEKK2ZpCisKK2NtYWtlIFwKKyAgICAtRENNQUtFX1NZU1RFTV9OQU1FPSJXaW5kb3dzIiBcCisgICAgLURDTUFLRV9WRVJCT1NFX01BS0VGSUxFPU9OIFwKKyAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYOlBBVEg9JGNyb3NzX3Jvb3QgXAorICAgIC1EQ01BS0VfSU5TVEFMTF9MSUJESVI6UEFUSD0kY3Jvc3Nfcm9vdC9saWIgXAorICAgIC1ESU5DTFVERV9JTlNUQUxMX0RJUjpQQVRIPSRjcm9zc19yb290L2luY2x1ZGUgXAorICAgIC1ETElCX0lOU1RBTExfRElSOlBBVEg9JGNyb3NzX3Jvb3QvbGliIFwKKyAgICAtRFNZU0NPTkZfSU5TVEFMTF9ESVI6UEFUSD0kY3Jvc3Nfcm9vdC9ldGMgXAorICAgIC1EU0hBUkVfSU5TVEFMTF9QUkVGSVg6UEFUSD0kY3Jvc3Nfcm9vdC9zaGFyZSBcCisgICAgLURCVUlMRF9TSEFSRURfTElCUzpCT09MPU9OIFwKKyAgICAtRENNQUtFX0NfQ09NUElMRVI9Ii91c3IvYmluLyRjcm9zc19jYy1nY2MiIFwKKyAgICAtRENNQUtFX0NYWF9DT01QSUxFUj0iL3Vzci9iaW4vJGNyb3NzX2NjLWcrKyIgXAorICAgIC1EQ01BS0VfRklORF9ST09UX1BBVEg9IiRjcm9zc19yb290IiBcCisgICAgLURDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlk9T05MWSBcCisgICAgLURDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREU9T05MWSBcCisgICAgLURDTUFLRV9DWFhfQ09NUElMRVI9Ii91c3IvYmluLyRjcm9zc19jYy1nKysiIFwKKyAgICAtRENNQUtFX0ZJTkRfUk9PVF9QQVRIPSIkY3Jvc3Nfcm9vdCIgXAorICAgIC1EQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZPU9OTFkgXAorICAgIC1EQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFPU9OTFkgXAorICAgICR4bWxfbGlicmFyeSBcCisgICAgLURDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU09TkVWRVIgXAorICAgICQqCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL2RidXMtZW52LmJhdC5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL2RidXMtZW52LmJhdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY3MDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvZGJ1cy1lbnYuYmF0LmNtYWtlCkBAIC0wLDAgKzEsOCBAQAorOjogZW52aXJvbm1lbnQgc2V0dGluZyBmb3IgZGJ1cyBjbGllbnRzCitAZWNobyBvZmYKKworOjogc2Vzc2lvbiBidXMgYWRkcmVzcworc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz1AREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1NACisKKzo6IHN5c3RlbSBidXMgYWRkcmVzcworc2V0IERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1M9QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NAIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQgYi9kYnVzLTEuNC4xMC9jbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTkwODEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzA4IEBACitwcm9qZWN0KGRidXMtbGliKQorCitTRVQoREJVU19ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kYnVzKQorCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGJ1cy1hcmNoLWRlcHMuaC5jbWFrZSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGJ1cy1hcmNoLWRlcHMuaCApCisKK2FkZF9kZWZpbml0aW9ucygtRERCVVNfQ09NUElMQVRJT04pCisKK3NldCAoZGJ1c2luY2x1ZGVfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMuaAorCSR7REJVU19ESVJ9L2RidXMtYWRkcmVzcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1idXMuaAorCSR7REJVU19ESVJ9L2RidXMtY29ubmVjdGlvbi5oCisJJHtEQlVTX0RJUn0vZGJ1cy1lcnJvcnMuaAorCSR7REJVU19ESVJ9L2RidXMtbWFjcm9zLmgKKwkke0RCVVNfRElSfS9kYnVzLW1lbW9yeS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1pc2MuaAorCSR7REJVU19ESVJ9L2RidXMtcGVuZGluZy1jYWxsLmgKKwkke0RCVVNfRElSfS9kYnVzLXByb3RvY29sLmgKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zaGFyZWQuaAorCSR7REJVU19ESVJ9L2RidXMtc2lnbmF0dXJlLmgKKwkke0RCVVNfRElSfS9kYnVzLXRocmVhZHMuaAorCSR7REJVU19ESVJ9L2RidXMtdHlwZXMuaAorCWRidXMtYXJjaC1kZXBzLmgKKykKKworIyMjIHNvdXJjZSBjb2RlIHRoYXQgZ29lcyBpbiB0aGUgaW5zdGFsbGVkIGNsaWVudCBsaWJyYXJ5CisjIyMgYW5kIGlzIHNwZWNpZmljIHRvIGxpYnJhcnkgZnVuY3Rpb25hbGl0eQorc2V0IChEQlVTX0xJQl9TT1VSQ0VTCisJJHtEQlVTX0RJUn0vZGJ1cy1hZGRyZXNzLmMKKwkke0RCVVNfRElSfS9kYnVzLWF1dGguYworCSR7REJVU19ESVJ9L2RidXMtYXV0aC1zY3JpcHQuYworCSR7REJVU19ESVJ9L2RidXMtYnVzLmMKKwkke0RCVVNfRElSfS9kYnVzLWNvbm5lY3Rpb24uYworCSR7REJVU19ESVJ9L2RidXMtY3JlZGVudGlhbHMuYworCSR7REJVU19ESVJ9L2RidXMtZXJyb3JzLmMKKwkke0RCVVNfRElSfS9kYnVzLWtleXJpbmcuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1oZWFkZXIuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1ieXRlc3dhcC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMKKwkke0RCVVNfRElSfS9kYnVzLW1lc3NhZ2UuYworCSR7REJVU19ESVJ9L2RidXMtbWlzYy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1ub25jZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1vYmplY3QtdHJlZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1wZW5kaW5nLWNhbGwuYworCSR7REJVU19ESVJ9L2RidXMtcmVzb3VyY2VzLmMKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXItc29ja2V0LmMKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMKKwkke0RCVVNfRElSfS9kYnVzLXNoYS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zaWduYXR1cmUuYworCSR7REJVU19ESVJ9L2RidXMtdGltZW91dC5jCisJJHtEQlVTX0RJUn0vZGJ1cy10aHJlYWRzLmMKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC5jCisJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMKKwkke0RCVVNfRElSfS9kYnVzLXdhdGNoLmMKKykKKworCitpZihVTklYKQorCXNldCAoREJVU19MSUJfU09VUkNFUyAke0RCVVNfTElCX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC11bml4LmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXItdW5peC5jCisJKQorZWxzZShVTklYKQorCXNldCAoREJVU19MSUJfU09VUkNFUyAke0RCVVNfTElCX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLXNlcnZlci13aW4uYworCSkKK2VuZGlmKFVOSVgpCisKK3NldCAoREJVU19MSUJfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMtYXV0aC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1hdXRoLXNjcmlwdC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgKKwkke0RCVVNfRElSfS9kYnVzLWNyZWRlbnRpYWxzLmgKKwkke0RCVVNfRElSfS9kYnVzLWtleXJpbmcuaAorCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1oZWFkZXIuaAorCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1ieXRlc3dhcC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS1wcml2YXRlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1pc2MuaAorCSR7REJVU19ESVJ9L2RidXMtb2JqZWN0LXRyZWUuaAorCSR7REJVU19ESVJ9L2RidXMtcHJvdG9jb2wuaAorCSR7REJVU19ESVJ9L2RidXMtcmVzb3VyY2VzLmgKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgKKwkke0RCVVNfRElSfS9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaAorCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXVuaXguaAorCSR7REJVU19ESVJ9L2RidXMtc2hhLmgKKwkke0RCVVNfRElSfS9kYnVzLXRpbWVvdXQuaAorCSR7REJVU19ESVJ9L2RidXMtdGhyZWFkcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy10aHJlYWRzLWludGVybmFsLmgKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC5oCisJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgKKwkke0RCVVNfRElSfS9kYnVzLXdhdGNoLmgKKwkke0NNQUtFX0JJTkFSWV9ESVJ9L2NvbmZpZy5oCispCitpZihVTklYKQorCXNldCAoREJVU19MSUJfSEVBREVSUyAke0RCVVNfTElCX0hFQURFUlN9IAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC11bml4LmgKKwkpCitlbHNlKFVOSVgpCisJc2V0IChEQlVTX0xJQl9IRUFERVJTICR7REJVU19MSUJfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXdpbi5oCisJKQorZW5kaWYoVU5JWCkKKworCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBBTkQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZCBieSB0aGUgCisjIyMgZGFlbW9uIG9yIHRlc3QgcHJvZ3JhbXMgKGFsbCBzeW1ib2xzIGluIGhlcmUgc2hvdWxkIAorIyMjIGJlIHVuZGVyc2NvcmUtcHJlZml4ZWQpCitzZXQgKERCVVNfU0hBUkVEX1NPVVJDRVMKKwkke0RCVVNfRElSfS9kYnVzLWRhdGFzbG90LmMKKwkke0RCVVNfRElSfS9kYnVzLWZpbGUuYworCSR7REJVU19ESVJ9L2RidXMtaGFzaC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1pbnRlcm5hbHMuYworCSR7REJVU19ESVJ9L2RidXMtbGlzdC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWJhc2ljLmMKKwkke0RCVVNfRElSfS9kYnVzLW1lbW9yeS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZW1wb29sLmMKKwkke0RCVVNfRElSfS9kYnVzLXN0cmluZy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLmMKKwkke0RCVVNfRElSfS9kYnVzLXBpcGUuYworKQorCitzZXQgKERCVVNfU0hBUkVEX0hFQURFUlMKKwkke0RCVVNfRElSfS9kYnVzLWRhdGFzbG90LmgKKwkke0RCVVNfRElSfS9kYnVzLWZpbGUuaAorCSR7REJVU19ESVJ9L2RidXMtaGFzaC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1pbnRlcm5hbHMuaAorCSR7REJVU19ESVJ9L2RidXMtbGlzdC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWJhc2ljLmgKKwkke0RCVVNfRElSfS9kYnVzLW1lbXBvb2wuaAorCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLmgKKwkke0RCVVNfRElSfS9kYnVzLXN0cmluZy1wcml2YXRlLmgKKwkke0RCVVNfRElSfS9kYnVzLXBpcGUuaAorCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy5oCispCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGlzIGdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IHVzZWQKKyMjIyBieSB0aGUgYnVzIGRhZW1vbiBvciB0ZXN0IGFwcHMsIGJ1dCBpcyBOT1QgaW5jbHVkZWQKKyMjIyBpbiB0aGUgRC1CVVMgY2xpZW50IGxpYnJhcnkgKGFsbCBzeW1ib2xzIGluIGhlcmUgCisjIyMgc2hvdWxkIGJlIHVuZGVyc2NvcmUtcHJlZml4ZWQgYnV0IGRvbid0IHJlYWxseSBuZWVkIAorIyMjIHRvIGJlIHVubGVzcyB0aGV5IG1vdmUgdG8gREJVU19TSEFSRURfU09VUkNFUyBsYXRlcikKK3NldCAoREJVU19VVElMX1NPVVJDRVMKKwkke0RCVVNfRElSfS9kYnVzLWF1dGgtdXRpbC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1haW5sb29wLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYworCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLXNoZWxsLmMKKwkke0RCVVNfRElSfS9kYnVzLXN0cmluZy11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdXRpbC5jCispCisKK2lmIChEQlVTX0JVSUxEX1RFU1RTKQorCXNldCAoREJVU19VVElMX1NPVVJDRVMgCisJCSR7REJVU19VVElMX1NPVVJDRVN9CisJCSR7REJVU19ESVJ9L2RidXMtdGVzdC5jCisJKQorZW5kaWYgKERCVVNfQlVJTERfVEVTVFMpCisKK3NldCAoREJVU19VVElMX0hFQURFUlMKKwkke0RCVVNfRElSfS9kYnVzLW1haW5sb29wLmgKKwkke0RCVVNfRElSfS9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zaGVsbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zcGF3bi5oCisJJHtEQlVTX0RJUn0vZGJ1cy10ZXN0LmgKKykKKworIyMjIHBsYXRmb3JtIHNwZWNpZmljIHNldHRpbmdzCitpZiAoV0lOMzIpCisJc2V0IChEQlVTX1NIQVJFRF9TT1VSQ0VTICR7REJVU19TSEFSRURfU09VUkNFU30gCisJCSR7REJVU19ESVJ9L2RidXMtZmlsZS13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtd2luLmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1waXBlLXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy10aHJlYWQtd2luLmMKKwkpCisJc2V0IChEQlVTX1NIQVJFRF9IRUFERVJTICR7REJVU19TSEFSRURfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtc29ja2V0cy13aW4uaAorCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtd2luLmgKKwkpCisJc2V0IChEQlVTX1VUSUxfU09VUkNFUyAke0RCVVNfVVRJTF9TT1VSQ0VTfQorCQkke0RCVVNfRElSfS9kYnVzLXNwYXduLXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11dGlsLXdpbi5jCisJKQorCWlmKFdJTkNFKQorCXNldCAoREJVU19TSEFSRURfU09VUkNFUyAke0RCVVNfU0hBUkVEX1NPVVJDRVN9CisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKKwkpCisJc2V0IChEQlVTX1NIQVJFRF9IRUFERVJTICR7REJVU19TSEFSRURfSEVBREVSU30KKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaAorCSkKKwllbmRpZihXSU5DRSkKK2Vsc2UgKFdJTjMyKQorCXNldCAoREJVU19TSEFSRURfU09VUkNFUyAke0RCVVNfU0hBUkVEX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLWZpbGUtdW5peC5jCisJCSR7REJVU19ESVJ9L2RidXMtcGlwZS11bml4LmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXVuaXguYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtcHRocmVhZC5jCisJCSR7REJVU19ESVJ9L2RidXMtdXNlcmRiLmMKKyAgICAgICAgJHtEQlVTX0RJUn0vc2QtZGFlbW9uLmMKKwkpCisJc2V0IChEQlVTX1NIQVJFRF9IRUFERVJTICR7REJVU19TSEFSRURfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXVuaXguaAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC11bml4LmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXVuaXguaAorCQkke0RCVVNfRElSfS9kYnVzLXVzZXJkYi5oCisgICAgICAgICR7REJVU19ESVJ9L3NkLWRhZW1vbi5oCisJKQorCXNldCAoREJVU19VVElMX1NPVVJDRVMgJHtEQlVTX1VUSUxfU09VUkNFU30KKwkJJHtEQlVTX0RJUn0vZGJ1cy1zcGF3bi5jCisJCSR7REJVU19ESVJ9L2RidXMtdXNlcmRiLXV0aWwuYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMKKwkpCitlbmRpZiAoV0lOMzIpCisKK3NldChsaWJkYnVzX1NPVVJDRVMKKwkke0RCVVNfTElCX1NPVVJDRVN9CisJJHtEQlVTX1NIQVJFRF9TT1VSQ0VTfQorCSMgZm9yIGRlYnVnZ2luZworCSR7REJVU19VVElMX1NPVVJDRVN9CispCisKK3NldChsaWJkYnVzX0hFQURFUlMgCisJJHtEQlVTX0xJQl9IRUFERVJTfQorCSR7REJVU19TSEFSRURfSEVBREVSU30KKwkjIGZvciBkZWJ1Z2dpbmcKKwkke0RCVVNfVVRJTF9IRUFERVJTfQorKQoraWYgKE1TVkMpCisgICAgc2V0IChCVUlMRF9GSUxFVkVSU0lPTiAke0RCVVNfTUFKT1JfVkVSU0lPTn0sJHtEQlVTX01JTk9SX1ZFUlNJT059LCR7REJVU19NSUNST19WRVJTSU9OfSwke0RCVVNfUEFUQ0hfVkVSU0lPTn0pCisgICAgc2V0IChCVUlMRF9USU1FU1RBTVAgJHtEQlVTX0JVSUxEX1RJTUVTVEFNUH0pCisgICAgCisgICAgY29uZmlndXJlX2ZpbGUoJHtEQlVTX0RJUn0vdmVyc2lvbmluZm8ucmMuaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3ZlcnNpb25pbmZvLnJjKQorICAgIGZpbGUoV1JJVEUgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FmeHJlcy5oICIiKQorICAgIGxpc3QoQVBQRU5EIGxpYmRidXNfU09VUkNFUyB2ZXJzaW9uaW5mby5yYykKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXModmVyc2lvbmluZm8ucmMgQ09NUElMRV9GTEFHUyAiLURfX0xJTkVfXz0xIikKK2VuZGlmIChNU1ZDKQorCitpZihNU1ZDX0lERSkKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfTElCX1NPVVJDRVMgREJVU19MSUJfSEVBREVSUykKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfU0hBUkVEX1NPVVJDRVMgREJVU19TSEFSRURfSEVBREVSUykKKwlwcm9qZWN0X3NvdXJjZV9ncm91cCgke0dST1VQX0NPREV9IERCVVNfVVRJTF9TT1VSQ0VTIERCVVNfVVRJTF9TT1VSQ0VTKQorZW5kaWYoTVNWQ19JREUpCisKKyMjIyBDbGllbnQgbGlicmFyeQorCithZGRfbGlicmFyeShkYnVzLTEgU0hBUkVECisJCQkke2xpYmRidXNfU09VUkNFU30KKwkJCSR7bGliZGJ1c19IRUFERVJTfQorKQoraWYoV0lOMzIpCisgICAgaWYoV0lOQ0UpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLTEgd3MyKQorICAgIGVsc2UoV0lOQ0UpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLTEgd3MyXzMyIGFkdmFwaTMyIG5ldGFwaTMyKQorICAgIGVuZGlmKFdJTkNFKQorZW5kaWYoV0lOMzIpCisKK2luc3RhbGxfdGFyZ2V0cygvbGliIGRidXMtMSApCitpbnN0YWxsX2ZpbGVzKC9pbmNsdWRlL2RidXMgRklMRVMgJHtkYnVzaW5jbHVkZV9IRUFERVJTfSkKKworIyMjIEludGVybmFsIGxpYnJhcnksIHVzZWQgZm9yIHRoZSBkYWVtb24sIHRvb2xzIGFuZCB0ZXN0cywgY29tcGlsZWQgc3RhdGljYWxseS4KKworYWRkX2xpYnJhcnkoZGJ1cy1pbnRlcm5hbCAke0RCVVNfSU5URVJOQUxfQUREX0xJQlJBUllfT1BUSU9OU30KKwkJCSR7REJVU19MSUJfU09VUkNFU30KKwkJCSR7REJVU19MSUJfSEVBREVSU30KKwkJCSR7REJVU19TSEFSRURfU09VUkNFU30KKwkJCSR7REJVU19TSEFSRURfSEVBREVSU30KKwkJCSR7REJVU19VVElMX1NPVVJDRVN9CisJCQkke0RCVVNfVVRJTF9IRUFERVJTfQorKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtaW50ZXJuYWwpCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZGJ1cy1pbnRlcm5hbCBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUllfREVGSU5JVElPTlN9KQoraWYoV0lOMzIpCisgICAgaWYoV0lOQ0UpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWludGVybmFsIHdzMikKKyAgICBlbHNlKFdJTkNFKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCB3czJfMzIgYWR2YXBpMzIgbmV0YXBpMzIpCisgICAgZW5kaWYoV0lOQ0UpCitlbmRpZihXSU4zMikKKworaWYgKERCVVNfQlVJTERfVEVTVFMpCisJc2V0IChURVNUU19FTlZJUk9OTUVOVCAiREJVU19URVNUX0RBVEE9JHtDTUFLRV9TT1VSQ0VfRElSfS90ZXN0L2RhdGEgREJVU19URVNUX0hPTUVESVI9JHtDTUFLRV9CVUlMRF9ESVJ9L2RidXMiKQorCUFERF9FWEVDVVRBQkxFKGRidXMtdGVzdCAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RidXMvZGJ1cy10ZXN0LW1haW4uYykKKwl0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy10ZXN0ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorCWFkZF90ZXN0KGRidXMtdGVzdCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L2RidXMtdGVzdCAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvZGF0YSkKKwlzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZGJ1cy10ZXN0IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TfSkKK0VORElGIChEQlVTX0JVSUxEX1RFU1RTKQorCitpZiAoVU5JWCkKKyMgc2V0IHZlcnNpb24gaW5mbworRU5ESUYgKFVOSVgpCisKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCisjY2xlYW4tbG9jYWw6CisjL2Jpbi9ybSAqLmJiICouYmJnICouZGEgKi5nY292IC5saWJzLyouZGEgLmxpYnMvKi5iYmcgfHwgdHJ1ZQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oLmNtYWtlIGIvZGJ1cy0xLjQuMTAvY21ha2UvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTY2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9kYnVzL2RidXMtYXJjaC1kZXBzLmguY21ha2UKQEAgLTAsMCArMSw1NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSIgLSotICovCisvKiBkYnVzLWFyY2gtZGVwcy5oIEhlYWRlciB3aXRoIGFyY2hpdGVjdHVyZS9jb21waWxlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgaW5zdGFsbGVkIHRvIGxpYmRpcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMAorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0FSQ0hfREVQU19ICisjZGVmaW5lIERCVVNfQVJDSF9ERVBTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKworREJVU19CRUdJTl9ERUNMUzsKKworI2NtYWtlZGVmaW5lIERCVVNfSEFWRV9JTlQ2NCAxCisjaWYgREJVU19IQVZFX0lOVDY0Cit0eXBlZGVmIEBEQlVTX0lOVDY0X1RZUEVAIGRidXNfaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgQERCVVNfSU5UNjRfVFlQRUAgZGJ1c191aW50NjRfdDsKKworI2RlZmluZSBEQlVTX0lOVDY0X0NPTlNUQU5UKHZhbCkgICh2YWwjI0xMKQorI2RlZmluZSBEQlVTX1VJTlQ2NF9DT05TVEFOVCh2YWwpICh2YWwjI1VMTCkKKworI2Vsc2UKKyN1bmRlZiBEQlVTX0hBVkVfSU5UNjQKKyN1bmRlZiBEQlVTX0lOVDY0X0NPTlNUQU5UCisjdW5kZWYgREJVU19VSU5UNjRfQ09OU1RBTlQKKyNlbmRpZgorCit0eXBlZGVmIEBEQlVTX0lOVDMyX1RZUEVAIGRidXNfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgQERCVVNfSU5UMzJfVFlQRUAgZGJ1c191aW50MzJfdDsKKwordHlwZWRlZiBAREJVU19JTlQxNl9UWVBFQCBkYnVzX2ludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIEBEQlVTX0lOVDE2X1RZUEVAIGRidXNfdWludDE2X3Q7CisKK0RCVVNfRU5EX0RFQ0xTOworCisjZW5kaWYgLyogREJVU19BUkNIX0RFUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvZG9jL0NNYWtlTGlzdHMudHh0IGIvZGJ1cy0xLjQuMTAvY21ha2UvZG9jL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmI1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9kb2MvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMjAgQEAKK2ZpbmRfcGFja2FnZShEb3h5Z2VuKQorCitpZihET1hZR0VOX0VYRUNVVEFCTEUpCisgIE9QVElPTihEQlVTX0VOQUJMRV9ET1hZR0VOX0RPQ1MgImJ1aWxkIERPWFlHRU4gZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgRG94eWdlbikiIE9OKQorZW5kaWYoRE9YWUdFTl9FWEVDVVRBQkxFKQorCitpZiAoREJVU19FTkFCTEVfRE9YWUdFTl9ET0NTKQorICAgIHNldCAodG9wX3NyY2RpciAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uKQorICAgIGNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfU09VUkNFX0RJUn0vRG94eWZpbGUuY21ha2UgJHtDTUFLRV9CSU5BUllfRElSfS9Eb3h5ZmlsZSApCisgICAgYWRkX2N1c3RvbV90YXJnZXQoZG9jIAorICAgICAgICBDT01NQU5EICR7RE9YWUdFTl9FWEVDVVRBQkxFfSAke0NNQUtFX0JJTkFSWV9ESVJ9L0RveHlmaWxlCisgICAgKQorZW5kaWYgKERCVVNfRU5BQkxFX0RPWFlHRU5fRE9DUykKKworIworIyBmaW5kIGRvY2Jvb2sgZ2VuZXJhdG9yCisjIAorZmluZF9wcm9ncmFtKE1FSU5QUk9DNF9FWEVDVVRBQkxFIG1laW5wcm9jNCkKKworZmluZF9wcm9ncmFtKFhNTFRPX0VYRUNVVEFCTEUgeG1sdG8pCisKK2lmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSBPUiBYTUxUT19FWEVDVVRBQkxFKQorICBPUFRJT04oREJVU19FTkFCTEVfWE1MX0RPQ1MgImJ1aWxkIFhNTCAgZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgeG1sdG8gb3IgbWVpbnByb2M0KSIgT04pCitlbmRpZiAoTUVJTlBST0M0X0VYRUNVVEFCTEUgT1IgWE1MVE9fRVhFQ1VUQUJMRSkKKworaWYgKE1FSU5QUk9DNF9FWEVDVVRBQkxFKQorCXNldChET0NCT09LX0dFTkVSQVRPUl9OQU1FICJtZWlucHJvYzQiIFBBUkVOVF9TQ09QRSkKKwlzZXQoREJVU19YTUxfRE9DU19FTkFCTEVEIDEpCisJaWYoV0lOMzIpCisJCWdldF9maWxlbmFtZV9jb21wb25lbnQoX2EgJHtNRUlOUFJPQzRfRVhFQ1VUQUJMRX0gUEFUSCkKKwkJZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChfbWVpbnByb2NfaW5zdGFsbF9wYXRoICR7X2F9IFBBVEgpCisJZWxzZShXSU4zMikKKwkJc2V0KF9tZWlucHJvY19pbnN0YWxsX3BhdGggJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0pCisJZW5kaWYoV0lOMzIpCisJc2V0KFNUWUxFU0hFRVQgIiR7X21laW5wcm9jX2luc3RhbGxfcGF0aH0vc2hhcmUvYXBwcy9rc2dtbHRvb2xzMi9kb2Nib29rL3hzbC9odG1sL2RvY2Jvb2sueHNsIikKK2VuZGlmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSkKKyAgCisgCitpZiAoWE1MVE9fRVhFQ1VUQUJMRSkKKwlzZXQgKERPQ0JPT0tfR0VORVJBVE9SX05BTUUgInhtbHRvIiBQQVJFTlRfU0NPUEUpCisJc2V0KERCVVNfWE1MX0RPQ1NfRU5BQkxFRCAxKQorCU1FU1NBR0UoU1RBVFVTICJ4bWx0byBkb2Nib29rIGdlbmVyYXRvciBmb3VuZCIpCitlbmRpZiAoWE1MVE9fRVhFQ1VUQUJMRSkKKworaWYgKERCVVNfRU5BQkxFX1hNTF9ET0NTKQorCittYWNybyAoRE9DQk9PSyBfc291cmNlcyBfb3B0aW9ucykKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChfaW5maWxlICR7X3NvdXJjZXN9IEFCU09MVVRFKQorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9iYXNlbmFtZSAke19pbmZpbGV9IE5BTUVfV0UpCisgIHNldChfb3V0ZmlsZSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtfYmFzZW5hbWV9Lmh0bWwpCisKKyAgaWYgKEVYSVNUUyAke19zb3VyY2VzfSkKKwkgIGlmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSkKKwkJICBBRERfQ1VTVE9NX1RBUkdFVCgke19iYXNlbmFtZX0uaHRtbCBBTEwKKwkJCSR7TUVJTlBST0M0X0VYRUNVVEFCTEV9IC0tc3R5bGVzaGVldCAke1NUWUxFU0hFRVR9IC1vICR7X291dGZpbGV9ICR7X2luZmlsZX0gCisJCQlERVBFTkRTICR7X2luZmlsZX0gCisJCQlXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKwkJKQorCSAgZW5kaWYgKCkKKwkgIGlmIChYTUxUT19FWEVDVVRBQkxFKQorCQkgIEFERF9DVVNUT01fVEFSR0VUKCR7X2Jhc2VuYW1lfS5odG1sIEFMTAorCQkJJHtYTUxUT19FWEVDVVRBQkxFfSAtdnYgJHtfb3B0aW9uc30gJHtfaW5maWxlfSAKKwkJCURFUEVORFMgJHtfaW5maWxlfSAKKwkJCVdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorCQkpCisJICBlbmRpZiAoKQorCSAgaW5zdGFsbChGSUxFUyAke19vdXRmaWxlfSBERVNUSU5BVElPTiBzaGFyZS9kb2MvZGJ1cykKKyAgZWxzZSAoKQorCSAgTUVTU0FHRShTVEFUVVMgInNraXBwaW5nIHhtbCBkb2MgZ2VuZXJhdGluZyBmb3IgJHtfaW5maWxlfSwgZmlsZSBub3QgZm91bmQiKQorICBlbmRpZiAoKQorCSAgCitlbmRtYWNybyAoRE9DQk9PSykKKworIyMjIGNvcHkgdGVzdHMgdG8gYnVpbGRkaXIgc28gdGhhdCBnZW5lcmF0ZWQgdGVzdHMgYW5kIHN0YXRpYyB0ZXN0cyAKKyMjIyBhcmUgYWxsIGluIG9uZSBwbGFjZS4KKyMjIyB0b2RvIGhvdyB0byBhZGQgbW9yZSBmaWxldHlwZXMgCitNQUNSTyAoQ09QWURJUiBfc3JjIF90eXBlKQorICAgIEZPUkVBQ0goRklMRV9UWVBFICR7X3R5cGV9KQorICAgIAlGT1JFQUNIKERJUiAke19zcmN9KQorICAgIAkJRklMRShHTE9CIEZJTEVTICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uLyR7RElSfS8ke0ZJTEVfVFlQRX0iICkKKyAgICAJCUZJTEUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0pCisgICAgCQlGT1JFQUNIKEZJTEUgJHtGSUxFU30pCisgICAgCQkJR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChGSUxFTkFNRSAke0ZJTEV9IE5BTUUpCisgICAgCQkJU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0vJHtGSUxFTkFNRX0pCisgICAgCQkJY29uZmlndXJlX2ZpbGUoJHtGSUxFfSAke1RBUkdFVH0gQ09QWU9OTFkpCisgICAgCQkJSUYgKENPTkZJR19WRVJCT1NFKQorICAgIAkJCQlNRVNTQUdFKCJGUk9NOiAke0ZJTEV9XG5UTzogJHtUQVJHRVR9XG4iKQorICAgIAkJCUVORElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAJCUVOREZPUkVBQ0goRklMRSkKKyAgICAJRU5ERk9SRUFDSChESVIpCisgICAgRU5ERk9SRUFDSChGSUxFX1RZUEUpCitFTkRNQUNSTyAoQ09QWURJUikKKworQ09QWURJUihkb2MgKi5wbmcpCitDT1BZRElSKGRvYyAqLnN2ZykKKworRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy10dXRvcmlhbC54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLWZhcS54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS9idXMvZGJ1cy1kYWVtb24ueG1sIGh0bWwtbm9jaHVua3MpCitET0NCT09LKCR7Q01BS0VfU09VUkNFX0RJUn0vdG9vbHMvZGJ1cy1tb25pdG9yLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9L3Rvb2xzL2RidXMtc2VuZC54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS90b29scy9kYnVzLWxhdW5jaC54bWwgaHRtbC1ub2NodW5rcykKKworIworIyBoYW5kbGUgaHRtbCBpbmRleCBmaWxlCisjCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5kZXguaHRtbC5jbWFrZSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5kZXguaHRtbCApCitpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmRleC5odG1sIERFU1RJTkFUSU9OIHNoYXJlL2RvYy9kYnVzKQorCitzZXQgKEVYVFJBX0RJU1QgCQorCSR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2J1c2NvbmZpZy5kdGQJCQkKKwkke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9pbnRyb3NwZWN0LmR0ZAkJCQorCSR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2ludHJvc3BlY3QueHNsCispCisKK2luc3RhbGwoRklMRVMgJHtFWFRSQV9ESVNUfSBERVNUSU5BVElPTiBzaGFyZS9kb2MvZGJ1cykKKworZW5kaWYoREJVU19FTkFCTEVfWE1MX0RPQ1MpCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9kb2MvaW5kZXguaHRtbC5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL2RvYy9pbmRleC5odG1sLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGQ2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9kb2MvaW5kZXguaHRtbC5jbWFrZQpAQCAtMCwwICsxLDU1IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkQtQnVzIERvY3VtZW50YXRpb24gSW5kZXg8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+RC1CdXMgRG9jdW1lbnRhdGlvbiBJbmRleDwvaDE+Cis8cD5WZXJzaW9uIEBEQlVTX1ZFUlNJT05fU1RSSU5HQDwvcD4KKworPHRhYmxlPgorIDx0cj4KKyAgPHRoIHdpZHRoPTEwJT4KKyAgPC90aD4KKyAgPHRoIHdpZHRoPTMwJSBhbGlnbj1sZWZ0PgorICAgZ2VuZXJpYyBkb2N1bWVudGF0aW9uCisgIDwvdGg+CisgIDx0aCB3aWR0aD0zMCUgYWxpZ249bGVmdD4KK2FwcGxpY2F0aW9uIG1hbnVhbHMKKyAgPC90aD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHZhbGlnbj10b3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wPgorPGEgaHJlZj0iaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnIj5ELUJ1cyBXZWJzaXRlPC9hPgorICA8YnI+CisgIDxicj4KKzxhIGhyZWY9ImRidXMtdHV0b3JpYWwuaHRtbCI+RC1CdXMgVHV0b3JpYWw8L2E+CisgIDxicj4KKyAgPGJyPgorPGEgaHJlZj0iZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwiPkQtQnVzIFNwZWNpZmljYXRpb248L2E+CisgICA8YnI+CisgICA8YnI+Cis8YSBocmVmPSJkYnVzLWZhcS5odG1sIj5ELUJ1cyBGQVE8L2E+CisgICA8YnI+CisgICA8YnI+Cis8YSBocmVmPSJkYnVzLXRlc3QtcGxhbi5odG1sIj5ELUJ1cyBUZXN0IFBsYW48L2E+CisgICA8YnI+CisgICA8YnI+CisgIDwvdGQ+CisgIDx0ZCAgdmFsaWduPXRvcD4KKzxhIGhyZWY9ImRidXMtZGFlbW9uLmh0bWwiPkQtQnVzIERhZW1vbiBtYW51YWw8L2E+CisgICA8YnI+CisgICA8YnI+Cis8YSBocmVmPSJkYnVzLWxhdW5jaC5odG1sIj5ELUJ1cyBsYXVuY2ggbWFudWFsPC9hPgorICAgPGJyPgorICAgPGJyPgorPGEgaHJlZj0iZGJ1cy1zZW5kLmh0bWwiPkQtQnVzIHNlbmQgdG9vbCBtYW51YWw8L2E+CisgICA8YnI+CisgICA8YnI+Cis8YSBocmVmPSJkYnVzLW1vbml0b3IuaHRtbCI+RC1CdXMgbW9uaXRvciBtYW51YWw8L2E+CisgIDwvdGQ+CisgPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0NQYWNrSW5zdGFsbENvbmZpZy5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDczYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0NQYWNrSW5zdGFsbENvbmZpZy5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisKK2lmIChEQlVTX0lOU1RBTExfU1lTVEVNX0xJQlMpCisJaWYgKE1JTkdXKQorCQlpZiAoREJVU19VU0VfRVhQQVQpCisJCQkjIGV4cGF0CisJCQlpbnN0YWxsX2ZpbGVzKC9iaW4gRklMRVMgJHtMSUJFWFBBVF9MSUJSQVJJRVN9KQkKKwkJZWxzZSAoREJVU19VU0VfRVhQQVQpCisJCQkjIHhtbDIKKwkJCWluc3RhbGxfZmlsZXMoL2JpbiBGSUxFUyAke0xJQlhNTDJfTElCUkFSSUVTfSkJCisJCQlpbnN0YWxsX2ZpbGVzKC9iaW4gRklMRVMgJHtMSUJJQ09OVl9MSUJSQVJJRVN9KQkKKwkJZW5kaWYgKERCVVNfVVNFX0VYUEFUKQorCWVsc2UgKE1JTkdXKQorCQlJTkNMVURFKEluc3RhbGxSZXF1aXJlZFN5c3RlbUxpYnJhcmllcykKKwllbmRpZiAoTUlOR1cpCitlbmRpZiAoREJVU19JTlNUQUxMX1NZU1RFTV9MSUJTKQorCitTRVQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9TVU1NQVJZICJELUJVUyBGb3IgV2luZG93cyIpCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRU5ET1IgIkQtQlVTIFdpbmRvd3MgVGVhbSIpCitTRVQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9GSUxFICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL1JFQURNRSIpCitTRVQoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9MSUNFTlNFICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL0NPUFlJTkciKQorIyBkdXBsaWNhdGVkIGZyb20gVkVSU0lPTgorU0VUKENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NQUpPUiAke1ZFUlNJT05fTUFKT1J9KQorU0VUKENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NSU5PUiAke1ZFUlNJT05fTUlOT1J9KQorU0VUKENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9QQVRDSCAke1ZFUlNJT05fUEFUQ0h9KQorI1NFVChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICJkYnVzICR7Q01ha2VfVkVSU0lPTl9NQUpPUn0uJHtDTWFrZV9WRVJTSU9OX01JTk9SfSIpCitTRVQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiZGJ1cyIpCitJRihXSU4zMiBBTkQgTk9UIFVOSVgpCisgIFNFVChDUEFDS19HRU5FUkFUT1IgTlNJUyBaSVApICAgICAjIGNhbiBiZSBOU0lTLCBTVEdaLCBUQloyLCBUR1osIFRaIGFuZCBaSVAKKyAgU0VUKENQQUNLX05TSVNfQ09NUFJFU1NPUiAiL1NPTElEIGx6bWEiKQorICAjIFRoZXJlIGlzIGEgYnVnIGluIE5TSSB0aGF0IGRvZXMgbm90IGhhbmRsZSBmdWxsIHVuaXggcGF0aHMgcHJvcGVybHkuIE1ha2UKKyAgIyBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzZXQgb2YgZm91ciAoNCkgYmFja2xhc3NoZXMuCisjIFNFVChDUEFDS19QQUNLQUdFX0lDT04gIiR7Q01ha2VfU09VUkNFX0RJUn0vVXRpbGl0aWVzL1JlbGVhc2VcXFxcSW5zdGFsbEljb24uYm1wIikKKyAgU0VUKENQQUNLX05TSVNfSU5TVEFMTEVEX0lDT05fTkFNRSAiYmluXFxcXGRidXMtbGF1bmNoLmJhdCIpCisgIFNFVChDUEFDS19OU0lTX0RJU1BMQVlfTkFNRSAiRC1CdXMgZm9yIFdpbmRvd3MiKQorICBTRVQoQ1BBQ0tfTlNJU19IRUxQX0xJTksgImh0dHA6XFxcXFxcXFxzb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZGJ1cyIpCisgIFNFVChDUEFDS19OU0lTX1VSTF9JTkZPX0FCT1VUICJodHRwOlxcXFxcXFxcc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmRidXMiKQorICBTRVQoQ1BBQ0tfTlNJU19DT05UQUNUICJtZUBteS1wZXJzb25hbC1ob21lLXBhZ2UuY29tIikKKyAgU0VUKENQQUNLX05TSVNfTU9ESUZZX1BBVEggT04pCitFTFNFKFdJTjMyIEFORCBOT1QgVU5JWCkKKyAgU0VUKENQQUNLX1NUUklQX0ZJTEVTICJiaW4vTXlFeGVjdXRhYmxlIikKKyAgU0VUKENQQUNLX1NPVVJDRV9TVFJJUF9GSUxFUyAiIikKK0VORElGKFdJTjMyIEFORCBOT1QgVU5JWCkKK1NFVChDUEFDS19QQUNLQUdFX0VYRUNVVEFCTEVTICJkYnVzLWxhdW5jaCIgIkQtQnVzIERhZW1vbiIpCitJTkNMVURFKENQYWNrKQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9DaGVja0ZvckFic3RyYWN0U29ja2V0cy5jIGIvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9DaGVja0ZvckFic3RyYWN0U29ja2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmI4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0NoZWNrRm9yQWJzdHJhY3RTb2NrZXRzLmMKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK2ludCBtYWluKCkgeworICBpbnQgbGlzdGVuX2ZkOworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKworICBsaXN0ZW5fZmQgPSBzb2NrZXQgKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKworICBpZiAobGlzdGVuX2ZkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzb2NrZXQoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBtZW1zZXQgKCZhZGRyLCAnXDAnLCBzaXplb2YgKGFkZHIpKTsKKyAgYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RyY3B5IChhZGRyLnN1bl9wYXRoLCAiWC90bXAvZGJ1cy1mYWtlLXNvY2tldC1wYXRoLXVzZWQtaW4tY29uZmlndXJlLXRlc3QiKTsKKyAgYWRkci5zdW5fcGF0aFswXSA9ICdcMCc7IC8qIHRoaXMgaXMgd2hhdCBtYWtlcyBpdCBhYnN0cmFjdCAqLworCisgIGlmIChiaW5kIChsaXN0ZW5fZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgU1VOX0xFTiAoJmFkZHIpKSA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZSBiaW5kKCkgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZQorICAgIGV4aXQgKDApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvQ2hlY2tQcm90b3R5cGVFeGlzdHMuY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0NoZWNrUHJvdG90eXBlRXhpc3RzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzE5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0NoZWNrUHJvdG90eXBlRXhpc3RzLmNtYWtlCkBAIC0wLDAgKzEsMzUgQEAKKyMgLSBDaGVjayBpZiB0aGUgcHJvdG90eXBlIGZvciBhIGZ1bmN0aW9uIGV4aXN0cy4KKyMgQ0hFQ0tfUFJPVE9UWVBFX0VYSVNUUyAoRlVOQ1RJT04gSEVBREVSIFZBUklBQkxFKQorIworIyAgRlVOQ1RJT04gLSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24geW91IGFyZSBsb29raW5nIGZvcgorIyAgSEVBREVSIC0gdGhlIGhlYWRlcihzKSB3aGVyZSB0aGUgcHJvdG90eXBlIHNob3VsZCBiZSBkZWNsYXJlZAorIyAgVkFSSUFCTEUgLSB2YXJpYWJsZSB0byBzdG9yZSB0aGUgcmVzdWx0CisjCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG1heSBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtYWNybyB0bworIyBtb2RpZnkgdGhlIHdheSB0aGUgY2hlY2sgaXMgcnVuOgorIworIyAgQ01BS0VfUkVRVUlSRURfRkxBR1MgPSBzdHJpbmcgb2YgY29tcGlsZSBjb21tYW5kIGxpbmUgZmxhZ3MKKyMgIENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TID0gbGlzdCBvZiBtYWNyb3MgdG8gZGVmaW5lICgtREZPTz1iYXIpCisjICBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyA9IGxpc3Qgb2YgaW5jbHVkZSBkaXJlY3RvcmllcworCitJTkNMVURFKENoZWNrQ1hYU291cmNlQ29tcGlsZXMpCisKK01BQ1JPIChDSEVDS19QUk9UT1RZUEVfRVhJU1RTIF9TWU1CT0wgX0hFQURFUiBfUkVTVUxUKQorICAgU0VUKF9JTkNMVURFX0ZJTEVTKQorICAgRk9SRUFDSCAoaXQgJHtfSEVBREVSfSkKKyAgICAgIFNFVChfSU5DTFVERV9GSUxFUyAiJHtfSU5DTFVERV9GSUxFU30jaW5jbHVkZSA8JHtpdH0+XG4iKQorICAgRU5ERk9SRUFDSCAoaXQpCisKKyAgIFNFVChfQ0hFQ0tfUFJPVE9fRVhJU1RTX1NPVVJDRV9DT0RFICIKKyR7X0lOQ0xVREVfRklMRVN9CitpbnQgbWFpbigpCit7CisjaWZuZGVmICR7X1NZTUJPTH0KKyAgIGludCBpID0gc2l6ZW9mKCYke19TWU1CT0x9KTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKyIpCisgICBDSEVDS19DWFhfU09VUkNFX0NPTVBJTEVTKCIke19DSEVDS19QUk9UT19FWElTVFNfU09VUkNFX0NPREV9IiAke19SRVNVTFR9KQorRU5ETUFDUk8gKENIRUNLX1BST1RPVFlQRV9FWElTVFMgX1NZTUJPTCBfSEVBREVSIF9SRVNVTFQpCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvQ2hlY2tTdHJ1Y3RNZW1iZXIuY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0NoZWNrU3RydWN0TWVtYmVyLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNWQzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0NoZWNrU3RydWN0TWVtYmVyLmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMgLSBDaGVjayBpZiB0aGUgZ2l2ZW4gc3RydWN0IG9yIGNsYXNzIGhhcyB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YXJpYWJsZQorIyBDSEVDS19TVFJVQ1RfTUVNQkVSIChTVFJVQ1QgTUVNQkVSIEhFQURFUiBWQVJJQUJMRSkKKyMKKyMgIFNUUlVDVCAtIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3Qgb3IgY2xhc3MgeW91IGFyZSBpbnRlcmVzdGVkIGluCisjICBNRU1CRVIgLSB0aGUgbWVtYmVyIHdoaWNoIGV4aXN0ZW5jZSB5b3Ugd2FudCB0byBjaGVjaworIyAgSEVBREVSIC0gdGhlIGhlYWRlcihzKSB3aGVyZSB0aGUgcHJvdG90eXBlIHNob3VsZCBiZSBkZWNsYXJlZAorIyAgVkFSSUFCTEUgLSB2YXJpYWJsZSB0byBzdG9yZSB0aGUgcmVzdWx0CisjCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG1heSBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtYWNybyB0bworIyBtb2RpZnkgdGhlIHdheSB0aGUgY2hlY2sgaXMgcnVuOgorIworIyAgQ01BS0VfUkVRVUlSRURfRkxBR1MgPSBzdHJpbmcgb2YgY29tcGlsZSBjb21tYW5kIGxpbmUgZmxhZ3MKKyMgIENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TID0gbGlzdCBvZiBtYWNyb3MgdG8gZGVmaW5lICgtREZPTz1iYXIpCisjICBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyA9IGxpc3Qgb2YgaW5jbHVkZSBkaXJlY3RvcmllcworCitJTkNMVURFKENoZWNrQ1hYU291cmNlQ29tcGlsZXMpCisKK01BQ1JPIChDSEVDS19TVFJVQ1RfTUVNQkVSIF9TVFJVQ1QgX01FTUJFUiBfSEVBREVSIF9SRVNVTFQpCisgICBTRVQoX0lOQ0xVREVfRklMRVMpCisgICBGT1JFQUNIIChpdCAke19IRUFERVJ9KQorICAgICAgU0VUKF9JTkNMVURFX0ZJTEVTICIke19JTkNMVURFX0ZJTEVTfSNpbmNsdWRlIDwke2l0fT5cbiIpCisgICBFTkRGT1JFQUNIIChpdCkKKworICAgU0VUKF9DSEVDS19TVFJVQ1RfTUVNQkVSX1NPVVJDRV9DT0RFICIKKyR7X0lOQ0xVREVfRklMRVN9CitpbnQgbWFpbigpCit7CisgICAke19TVFJVQ1R9KiB0bXA7CisgICB0bXAtPiR7X01FTUJFUn07CisgIHJldHVybiAwOworfQorIikKKyAgIENIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVMoIiR7X0NIRUNLX1NUUlVDVF9NRU1CRVJfU09VUkNFX0NPREV9IiAke19SRVNVTFR9KQorCitFTkRNQUNSTyAoQ0hFQ0tfU1RSVUNUX01FTUJFUikKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9GaW5kRG94eWdlbi5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvRmluZERveHlnZW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NzkwMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvRmluZERveHlnZW4uY21ha2UKQEAgLTAsMCArMSwzIEBACisKK2ZpbmRfcHJvZ3JhbShET1hZR0VOX0VYRUNVVEFCTEUgTkFNRVMgZG94eWdlbiBET0MgImRveHlnZW4gZXhlY3V0YWJsZSIpCittYXJrX2FzX2FkdmFuY2VkKERPWFlHRU5fRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvRmluZEdMSUIuY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0ZpbmRHTElCLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGFlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0ZpbmRHTElCLmNtYWtlCkBAIC0wLDAgKzEsNDIgQEAKKyMgLSBUcnkgdG8gZmluZCB0aGUgR0xJQiBsaWJyYXJ5CisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBHTElCX0ZPVU5EIC0gc3lzdGVtIGhhcyBHTElCCisjICBHTElCX0lOQ0xVREVTIC0gdGhlIEdMSUIgaW5jbHVkZSBkaXJlY3RvcmllcworIyAgR0xJQl9MSUJSQVJJRVMgLSBUaGUgbGlicmFyaWVzIG5lZWRlZCB0byB1c2UgR0xJQgorCitpZiAoV0lOMzIpCisKK0lOQ0xVREUoTWFjcm9HZXRlbnZXaW5QYXRoKQorCitNQUNST19HRVRFTlZfV0lOX1BBVEgoX3Byb2dyYW1fRklMRVNfRElSIFBST0dSQU1GSUxFUykKKworRklORF9QQVRIKEdMSUJfSU5DTFVERV9ESVIgZ2xpYi5oCisgICAke19wcm9ncmFtX0ZJTEVTX0RJUn0vZ2xpYi9pbmNsdWRlL2dsaWItMi4wCispCisKKworIyBzZWFyY2ggZm9yIEdMSUIgaW4gdGhlIGRlZmF1bHQgaW5zdGFsbCBkaXJlY3RvcnkgZm9yIGFwcGxpY2F0aW9ucyAoZGVmYXVsdCBvZiAobiltYWtlIGluc3RhbGwpCitGSU5EX0xJQlJBUlkoR0xJQl9MSUJSQVJZIE5BTUVTIGdsaWItMi4wCisgICBQQVRIUworICAgJHtfcHJvZ3JhbV9GSUxFU19ESVJ9L2dsaWIvbGliCispCisKK2lmIChHTElCX0xJQlJBUlkgQU5EIEdMSUJfSU5DTFVERV9ESVIpCisgICBzZXQoR0xJQl9GT1VORCBUUlVFKQorICAgc2V0KENNQUtFX0lOQ0xVREVfUEFUSCAke0NNQUtFX0lOQ0xVREVfUEFUSH0gJHtHTElCX0lOQ0xVREVTfSkKKyAgIHNldChDTUFLRV9MSUJSQVJZX1BBVEggJHtDTUFLRV9MSUJSQVJZX1BBVEh9ICR7R0xJQl9MSUJSQVJJRVN9KQorICAgCitlbmRpZiAoR0xJQl9MSUJSQVJZIEFORCBHTElCX0lOQ0xVREVfRElSKQorCitpZiAoR0xJQl9GT1VORCkKKyAgIGlmIChOT1QgR0xJQl9GSU5EX1FVSUVUTFkpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgR0xJQjogJHtHTElCX0xJQlJBUll9IikKKyAgIGVuZGlmIChOT1QgR0xJQl9GSU5EX1FVSUVUTFkpCitlbHNlIChHTElCX0ZPVU5EKQorICAgaWYgKEdMSUJfRklORF9SRVFVSVJFRCkKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIEdMSUIgbGlicmFyeSIpCisgICBlbmRpZiAoR0xJQl9GSU5EX1JFUVVJUkVEKQorZW5kaWYgKEdMSUJfRk9VTkQpCisKK2VuZGlmIChXSU4zMikKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvRmluZExpYkV4cGF0LmNtYWtlIGIvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9GaW5kTGliRXhwYXQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YzhkZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvRmluZExpYkV4cGF0LmNtYWtlCkBAIC0wLDAgKzEsNjEgQEAKKyMgLSBUcnkgdG8gZmluZCBMSUJFWFBBVAorIyBPbmNlIGRvbmUgdGhpcyB3aWxsIGRlZmluZQorIworIyAgTElCRVhQQVRfRk9VTkQgLSBzeXN0ZW0gaGFzIExJQkVYUEFUCisjICBMSUJFWFBBVF9JTkNMVURFX0RJUiAtIHRoZSBMSUJFWFBBVCBpbmNsdWRlIGRpcmVjdG9yeQorIyAgTElCRVhQQVRfTElCUkFSSUVTIC0gdGhlIGxpYnJhcmllcyBuZWVkZWQgdG8gdXNlIExJQkVYUEFUCisjICBMSUJFWFBBVF9ERUZJTklUSU9OUyAtIENvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBMSUJFWFBBVAorCitpZiAoTElCRVhQQVRfSU5DTFVERV9ESVIgQU5EIExJQkVYUEFUX0xJQlJBUklFUykKKworICAgICMgaW4gY2FjaGUgYWxyZWFkeQorICAgIFNFVChMSUJFWFBBVF9GT1VORCBUUlVFKQorCitlbHNlIChMSUJFWFBBVF9JTkNMVURFX0RJUiBBTkQgTElCRVhQQVRfTElCUkFSSUVTKQorCisgICAgSUYgKFdJTjMyKQorCQlmaWxlKFRPX0NNQUtFX1BBVEggIiRFTlZ7UFJPR1JBTUZJTEVTfSIgX3Byb2dGaWxlcykKKwkJZmluZF9GSUxFKExJQkVYUEFUX0RJUiBleHBhdCBTb3VyY2UvbGliL2V4cGF0LmgKKyAgIAkJCVBBVEhTCisgICAJCQkiJHtfcHJvZ0ZpbGVzfSIKKwkJKQorICAgICAgICBpZiAoTElCRVhQQVRfRElSKQorICAgICAgICAgICAgc2V0IChfTElCRVhQQVRJbmNEaXIgICR7TElCRVhQQVRfRElSfS9Tb3VyY2UvbGliKQorICAgICAgICAgICAgc2V0IChfTElCRVhQQVRMaW5rRGlyICR7TElCRVhQQVRfRElSfS9saWJzKQorICAgICAgICBlbmRpZiAoTElCRVhQQVRfRElSKQorICAgIEVMU0UgKFdJTjMyKQorICAgICAgICAjIHVzZSBwa2ctY29uZmlnIHRvIGdldCB0aGUgZGlyZWN0b3JpZXMgYW5kIHRoZW4gdXNlIHRoZXNlIHZhbHVlcworICAgICAgICAjIGluIHRoZSBGSU5EX1BBVEgoKSBhbmQgRklORF9MSUJSQVJZKCkgY2FsbHMKKyAgICAgICAgSU5DTFVERShVc2VQa2dDb25maWcpCisgICAgICAgIFBLR0NPTkZJRyhMSUJFWFBBVC0yLjAgX0xJQkVYUEFUSW5jRGlyIF9MSUJFWFBBVExpbmtEaXIgX0xJQkVYUEFUTGlua0ZsYWdzIF9MaUljb252Q2ZsYWdzKQorICAgICAgICBTRVQoTElCRVhQQVRfREVGSU5JVElPTlMgJHtfTElCRVhQQVRDZmxhZ3N9KQorICAgIEVORElGIChXSU4zMikKKworICAgIEZJTkRfUEFUSChMSUJFWFBBVF9JTkNMVURFX0RJUiBleHBhdC5oCisgICAgICBQQVRIUworICAgICAke19MSUJFWFBBVEluY0Rpcn0KKyAgICAgIFBBVEhfU1VGRklYRVMgTElCRVhQQVQKKyAgICApCisKKyAgICBGSU5EX0xJQlJBUlkoTElCRVhQQVRfTElCUkFSSUVTIE5BTUVTIGV4cGF0IGxpYmV4cGF0CisgICAgICBQQVRIUworICAgICAgJHtfTElCRVhQQVRMaW5rRGlyfQorICAgICkKKworICAgIGlmIChMSUJFWFBBVF9JTkNMVURFX0RJUiBBTkQgTElCRVhQQVRfTElCUkFSSUVTKQorICAgICAgIHNldChMSUJFWFBBVF9GT1VORCBUUlVFKQorICAgIGVuZGlmIChMSUJFWFBBVF9JTkNMVURFX0RJUiBBTkQgTElCRVhQQVRfTElCUkFSSUVTKQorCisgICAgaWYgKExJQkVYUEFUX0ZPVU5EKQorICAgICAgaWYgKE5PVCBMSUJFWFBBVF9GSU5EX1FVSUVUTFkpCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJGb3VuZCBsaWJleHBhdDogJHtMSUJFWFBBVF9MSUJSQVJJRVN9IikKKyAgICAgIGVuZGlmIChOT1QgTElCRVhQQVRfRklORF9RVUlFVExZKQorICAgIGVsc2UgKExJQkVYUEFUX0ZPVU5EKQorICAgICAgaWYgKExJQkVYUEFUX0ZJTkRfUkVRVUlSRUQpCisgICAgICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiQ291bGQgTk9UIGZpbmQgbGliZXhwYXQiKQorICAgICAgZW5kaWYgKExJQkVYUEFUX0ZJTkRfUkVRVUlSRUQpCisgICAgZW5kaWYgKExJQkVYUEFUX0ZPVU5EKQorCisgICAgTUFSS19BU19BRFZBTkNFRChMSUJFWFBBVF9JTkNMVURFX0RJUiBMSUJFWFBBVF9MSUJSQVJJRVMpCisKK2VuZGlmIChMSUJFWFBBVF9JTkNMVURFX0RJUiBBTkQgTElCRVhQQVRfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9GaW5kTGliSWNvbnYuY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL0ZpbmRMaWJJY29udi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWM2MzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9GaW5kTGliSWNvbnYuY21ha2UKQEAgLTAsMCArMSw1MiBAQAorIyAtIFRyeSB0byBmaW5kIExpYkljb252CisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBMSUJJQ09OVl9GT1VORCAtIHN5c3RlbSBoYXMgTGliSWNvbnYKKyMgIExJQklDT05WX0lOQ0xVREVfRElSIC0gdGhlIExpYkljb252IGluY2x1ZGUgZGlyZWN0b3J5CisjICBMSUJJQ09OVl9MSUJSQVJJRVMgLSB0aGUgbGlicmFyaWVzIG5lZWRlZCB0byB1c2UgTGliSWNvbnYKKyMgIExJQklDT05WX0RFRklOSVRJT05TIC0gQ29tcGlsZXIgc3dpdGNoZXMgcmVxdWlyZWQgZm9yIHVzaW5nIExpYkljb252CisKK2lmIChMSUJJQ09OVl9JTkNMVURFX0RJUiBBTkQgTElCSUNPTlZfTElCUkFSSUVTKQorCisgICAgIyBpbiBjYWNoZSBhbHJlYWR5CisgICAgU0VUKExJQklDT05WX0ZPVU5EIFRSVUUpCisKK2Vsc2UgKExJQklDT05WX0lOQ0xVREVfRElSIEFORCBMSUJJQ09OVl9MSUJSQVJJRVMpCisKKyAgICBJRiAoTk9UIFdJTjMyKQorICAgICAgICBNRVNTQUdFKEZBVEFMX0VSUk9SICJQbGVhc2Ugc2V0IHRoaXMgdG8gdGhlIGNvcnJlY3QgdmFsdWVzISIpCisgICAgICAgICMgdXNlIHBrZy1jb25maWcgdG8gZ2V0IHRoZSBkaXJlY3RvcmllcyBhbmQgdGhlbiB1c2UgdGhlc2UgdmFsdWVzCisgICAgICAgICMgaW4gdGhlIEZJTkRfUEFUSCgpIGFuZCBGSU5EX0xJQlJBUlkoKSBjYWxscworICAgICAgICBJTkNMVURFKFVzZVBrZ0NvbmZpZykKKyAgICAgICAgUEtHQ09ORklHKGxpYmljb252LTEuOSBfTGliSWNvbnZJbmNEaXIgX0xpYkljb252TGlua0RpciBfTGliSWNvbnZMaW5rRmxhZ3MgX0xpSWNvbnZDZmxhZ3MpCisgICAgICAgIFNFVChMSUJJQ09OVl9ERUZJTklUSU9OUyAke19MaWJJY29udkNmbGFnc30pCisgICAgRU5ESUYgKE5PVCBXSU4zMikKKworICAgIEZJTkRfUEFUSChMSUJJQ09OVl9JTkNMVURFX0RJUiBpY29udi5oCisgICAgICBQQVRIUworICAgICAke19MaWJJY29udkluY0Rpcn0KKyAgICAgIFBBVEhfU1VGRklYRVMgbGliaWNvbnYKKyAgICApCisKKyAgICBGSU5EX0xJQlJBUlkoTElCSUNPTlZfTElCUkFSSUVTIE5BTUVTIGljb252IGxpYmljb252CisgICAgICBQQVRIUworICAgICAgJHtfTGliSWNvbnZMaW5rRGlyfQorICAgICkKKworICAgIGlmIChMSUJJQ09OVl9JTkNMVURFX0RJUiBBTkQgTElCSUNPTlZfTElCUkFSSUVTKQorICAgICAgIHNldChMSUJJQ09OVl9GT1VORCBUUlVFKQorICAgIGVuZGlmIChMSUJJQ09OVl9JTkNMVURFX0RJUiBBTkQgTElCSUNPTlZfTElCUkFSSUVTKQorCisgICAgaWYgKExJQklDT05WX0ZPVU5EKQorICAgICAgaWYgKE5PVCBMaWJJY29udl9GSU5EX1FVSUVUTFkpCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJGb3VuZCBMaWJJY29udjogJHtMSUJJQ09OVl9MSUJSQVJJRVN9IikKKyAgICAgIGVuZGlmIChOT1QgTGliSWNvbnZfRklORF9RVUlFVExZKQorICAgIGVsc2UgKExJQklDT05WX0ZPVU5EKQorICAgICAgaWYgKExpYkljb252X0ZJTkRfUkVRVUlSRUQpCisgICAgICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiQ291bGQgTk9UIGZpbmQgTGliSWNvbnYiKQorICAgICAgZW5kaWYgKExpYkljb252X0ZJTkRfUkVRVUlSRUQpCisgICAgZW5kaWYgKExJQklDT05WX0ZPVU5EKQorCisgICAgTUFSS19BU19BRFZBTkNFRChMSUJJQ09OVl9JTkNMVURFX0RJUiBMSUJJQ09OVl9MSUJSQVJJRVMpCisKK2VuZGlmIChMSUJJQ09OVl9JTkNMVURFX0RJUiBBTkQgTElCSUNPTlZfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9NYWNyb0dldGVudldpblBhdGguY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL01hY3JvR2V0ZW52V2luUGF0aC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMThmN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9NYWNyb0dldGVudldpblBhdGguY21ha2UKQEAgLTAsMCArMSw1IEBACisKK01BQ1JPIChNQUNST19HRVRFTlZfV0lOX1BBVEggdmFyIG5hbWUpCisgICBzZXQoJHt2YXJ9ICRFTlZ7JHtuYW1lfX0pCisgICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiXFxcXCIgIi8iICR7dmFyfSAiJHske3Zhcn19IikKK0VORE1BQ1JPIChNQUNST19HRVRFTlZfV0lOX1BBVEggdmFyIG5hbWUpCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL01hY3JvTGlicmFyeS5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvTWFjcm9MaWJyYXJ5LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjM1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL01hY3JvTGlicmFyeS5jbWFrZQpAQCAtMCwwICsxLDkgQEAKKyMgLSBpbmNsdWRlIE1hY3JvTGlicmFyeSBvZmZlcnMgYSBjb2xsZWN0aW9uIG9mIG1hY3JvcyB3aGljaCBleHRlbmQgdGhlIGJ1aWx0LWluIGNtYWtlIGNvbW1hbmRzCisjIE9QVElPTkFMX0ZJTkRfUEFDS0FHRSggPG5hbWU+IFtRVUlUXSApCisKK0lOQ0xVREUoTWFjcm9PcHRpb25hbEZpbmRQYWNrYWdlKQorI0lOQ0xVREUoTWFjcm9BZGRpdGlvbmFsQ2xlYW5GaWxlcykKKyNJTkNMVURFKE1hY3JvQWRkRmlsZURlcGVuZGVuY2llcykKKyNJTkNMVURFKE1hY3JvR2V0ZW52V2luUGF0aCkKKyNJTkNMVURFKE1hY3JvRW5zdXJlT3V0T2ZTb3VyY2VCdWlsZCkKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9NYWNyb09wdGlvbmFsRmluZFBhY2thZ2UuY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL01hY3JvT3B0aW9uYWxGaW5kUGFja2FnZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY4MTMxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvbW9kdWxlcy9NYWNyb09wdGlvbmFsRmluZFBhY2thZ2UuY21ha2UKQEAgLTAsMCArMSwyMiBAQAorIyAtIE1BQ1JPX09QVElPTkFMX0ZJTkRfUEFDS0FHRSgpIGNvbWJpbmVzIEZJTkRfUEFDS0FHRSgpIHdpdGggYW4gT1BUSU9OKCkKKyMgTUFDUk9fT1BUSU9OQUxfRklORF9QQUNLQUdFKCA8bmFtZT4gW1FVSVRdICkKKyMgVGhpcyBtYWNybyBpcyBhIGNvbWJpbmF0aW9uIG9mIE9QVElPTigpIGFuZCBGSU5EX1BBQ0tBR0UoKSwgaXQKKyMgd29ya3MgbGlrZSBGSU5EX1BBQ0tBR0UoKSwgYnV0IGFkZGl0aW9uYWxseSBpdCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMKKyMgYW4gb3B0aW9uIG5hbWUgV0lUSF88bmFtZT4sIHdoaWNoIGNhbiBiZSBkaXNhYmxlZCB2aWEgdGhlIGNtYWtlIEdVSS4KKyMgb3IgdmlhIC1EV0lUSF88bmFtZT49T0ZGCisjIFRoZSBzdGFuZGFyZCA8bmFtZT5fRk9VTkQgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheQorIyBhcyB3aGVuIHVzaW5nIHRoZSBub3JtYWwgRklORF9QQUNLQUdFKCkKKworTUFDUk8gKE1BQ1JPX09QVElPTkFMX0ZJTkRfUEFDS0FHRSBfbmFtZSApCisgICBPUFRJT04oV0lUSF8ke19uYW1lfSAiU2VhcmNoIGZvciAke19uYW1lfSBwYWNrYWdlIiBPTikKKyAgIGlmIChXSVRIXyR7X25hbWV9KQorICAgICAgRklORF9QQUNLQUdFKCR7X25hbWV9ICR7QVJHTn0pCisgICBlbHNlIChXSVRIXyR7X25hbWV9KQorICAgICAgc2V0KCR7X25hbWV9X0ZPVU5EKQorICAgICAgc2V0KCR7X25hbWV9X0lOQ0xVREVfRElSKQorICAgICAgc2V0KCR7X25hbWV9X0lOQ0xVREVTKQorICAgICAgc2V0KCR7X25hbWV9X0xJQlJBUlkpCisgICAgICBzZXQoJHtfbmFtZX1fTElCUkFSSUVTKQorICAgZW5kaWYgKFdJVEhfJHtfbmFtZX0pCitFTkRNQUNSTyAoTUFDUk9fT1BUSU9OQUxfRklORF9QQUNLQUdFKQorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL1Byb2plY3RTb3VyY2VHcm91cC5jbWFrZSBiL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvUHJvamVjdFNvdXJjZUdyb3VwLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2E2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL1Byb2plY3RTb3VyY2VHcm91cC5jbWFrZQpAQCAtMCwwICsxLDE4IEBACisjIGZvbGRlcnMgaW4gdGhlIG1zdmMgcHJvamVjdHMKKyMgbW9kZT09ZmxhdCAgOiBoZWFkZXJzIGFuZCBvdXJzZXMgaW4gbm8gZm9sZGVycworIyBtb2RlPT1zcGxpdCA6IHN0YW5kYXJkIGJlaGF2aW9yIG9mIGNtYWtlLCBzcGxpdCBoZWFkZXJzIGFuZCBzb3VyY2VzCisjIG1vZGU9PSA8b3RoZXIgdmFsdWVzIiA6IGNvZGUgaXMgaW4gdGhpcyBmb2xkZXIKK21hY3JvKHByb2plY3Rfc291cmNlX2dyb3VwIG1vZGUgc291cmNlcyBoZWFkZXJzKQorCSNtZXNzYWdlKFNUQVRVUyAke21vZGV9KQorCSNtZXNzYWdlKFNUQVRVUyAke3NvdXJjZXN9ICR7aGVhZGVyc30pCisJaWYoJHttb2RlfSBNQVRDSEVTICJmbGF0IikKKwkJc291cmNlX2dyb3VwKCJTb3VyY2UgRmlsZXMiIEZpbGVzKQorCQlzb3VyY2VfZ3JvdXAoIkhlYWRlciBGaWxlcyIgRmlsZXMpCisJCXNvdXJjZV9ncm91cCgiY21ha2UiIEZJTEVTIENNYWtlTGlzdHMudHh0KQorCWVsc2UoJHttb2RlfSBNQVRDSEVTICJmbGF0IikKKwkJaWYoTk9UICR7bW9kZX0gTUFUQ0hFUyAic3BsaXQiKQorCQkJc291cmNlX2dyb3VwKCIke21vZGV9IiBGSUxFUyAkeyR7c291cmNlc319ICR7JHtoZWFkZXJzfX0pCisJCWVuZGlmKE5PVCAke21vZGV9IE1BVENIRVMgInNwbGl0IikKKwllbmRpZigke21vZGV9IE1BVENIRVMgImZsYXQiKQorZW5kbWFjcm8ocHJvamVjdF9zb3VyY2VfZ3JvdXAgbW9kZSBzb3VyY2VzIGhlYWRlcnMpCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL21vZHVsZXMvV2luMzJNYWNyb3MuY21ha2UgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL1dpbjMyTWFjcm9zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODVjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS9tb2R1bGVzL1dpbjMyTWFjcm9zLmNtYWtlCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgd2luMzIgbWFjcm9zIAorIyAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIFJhbGYgSGFiYWNrZXIKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorIworCitpZiAoV0lOMzIpCisgICAgIworICAgICMgYWRkRXhwbG9yZXJXcmFwcGVyIGNyZWF0ZXMgYmF0Y2ggZmlsZXMgZm9yIGZhc3QgYWNjZXNzIAorICAgICMgdG8gdGhlIGJ1aWxkIGVudmlyb25tZW50IGZyb20gdGhlIHdpbjMyIGV4cGxvcmVyLiAKKyAgICAjIAorICAgICMgRm9yIG1pbmd3IGFuZCBubWFrZSBwcm9qZWN0cyBpdCdzIG9wZW5zIGEgY29tbWFuZCBzaGVsbCwKKyAgICAjIGZvciBWaXN1YWwgU3R1ZGlvIElERSdzIChhdCBsZWFzdCB0ZXN0ZWQgd2l0aCBWUyA4IDIwMDUpIGl0CisgICAgIyBvcGVucyB0aGUgcmVsYXRlZCAuc2xuIGZpbGUgd2l0aCBwYXRocyBzZXR0aW5nIHNwZWNpZmllZCBhdCAKKyAgICAjIGNvbmZpZ3VyZSB0aW1lLiAKKyAgICAjCisgICAgTUFDUk8gKGFkZEV4cGxvcmVyV3JhcHBlciBfcHJvamVjdG5hbWUpCisgICAgICAgICMgd3JpdGUgZXhwbG9yZXIgd3JhcHBlcnMKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChDTUFLRV9CSU5fUEFUSCAke0NNQUtFX0NPTU1BTkR9IFBBVEgpCisgICAgICAgIHNldCAoQUREX1BBVEggIiR7Q01BS0VfQklOX1BBVEh9IikKKworICAgICAgICBpZiAoUVRfUU1BS0VfRVhFQ1VUQUJMRSkKKyAgICAgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoUVRfQklOX1BBVEggJHtRVF9RTUFLRV9FWEVDVVRBQkxFfSBQQVRIKQorICAgICAgICAgICAgc2V0IChBRERfUEFUSCAiJHtBRERfUEFUSH07JHtRVF9CSU5fUEFUSH0iKQorICAgICAgICBlbmRpZiAoUVRfUU1BS0VfRVhFQ1VUQUJMRSkKKyAgICAgICAgCisgICAgICAgICMgYWRkIGhlcmUgbW9yZSBwYXRoZXMgCisgICAgICAgIAorICAgICAgICBpZiAoTUlOR1cpCisgICAgICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KE1JTkdXX0JJTl9QQVRIICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSBQQVRIKQorICAgICAgICAgICAgc2V0IChBRERfUEFUSCAiJHtBRERfUEFUSH07JHtNSU5HV19CSU5fUEFUSH0iKQorICAgICAgICAgICAgd3JpdGVfZmlsZSAoJHtDTUFLRV9CSU5BUllfRElSfS8ke19wcm9qZWN0bmFtZX0tc2hlbGwuYmF0ICJzZXQgUEFUSD0ke0FERF9QQVRIfTslUEFUSCVcbmNtZC5leGUiKQorICAgICAgICBlbHNlIChNSU5HVykKKyAgICAgICAgICAgIGlmIChDTUFLRV9CVUlMRF9UT09MIFNUUkVRVUFMICAibm1ha2UiKQorICAgICAgICAgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoVkNfQklOX1BBVEggJHtDTUFLRV9DWFhfQ09NUElMRVJ9IFBBVEgpCisgICAgICAgICAgICAgICAgd3JpdGVfZmlsZSAoJHtDTUFLRV9CSU5BUllfRElSfS8ke19wcm9qZWN0bmFtZX0tc2hlbGwuYmF0ICJzZXQgUEFUSD0ke0FERF9QQVRIfTslUEFUSCVcbmNhbGwgXCIke1ZDX0JJTl9QQVRIfVxcdmN2YXJzMzIuYmF0XCJcbmNtZC5leGUiKQorICAgICAgICAgICAgZWxzZSAoQ01BS0VfQlVJTERfVE9PTCBTVFJFUVVBTCAgIm5tYWtlIikKKyAgICAgICAgICAgICAgICB3cml0ZV9maWxlICgke0NNQUtFX0JJTkFSWV9ESVJ9LyR7X3Byb2plY3RuYW1lfS1zbG4uYmF0ICJzZXQgUEFUSD0ke0FERF9QQVRIfTslUEFUSCVcbnN0YXJ0ICR7X3Byb2plY3RuYW1lfS5zbG4iKQorICAgICAgICAgICAgZW5kaWYgKENNQUtFX0JVSUxEX1RPT0wgU1RSRVFVQUwgICJubWFrZSIpCisgICAgICAgIGVuZGlmIChNSU5HVykKKyAgICBFTkRNQUNSTyAoYWRkRXhwbG9yZXJXcmFwcGVyKQorZW5kaWYoV0lOMzIpCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS9yZWFkbWUtY21ha2UudHh0IGIvZGJ1cy0xLjQuMTAvY21ha2UvcmVhZG1lLWNtYWtlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU2ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvcmVhZG1lLWNtYWtlLnR4dApAQCAtMCwwICsxLDM5IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBjb25maWd1cmF0aW9uIGZpbGVzIGZvciB0aGUgY21ha2UgYnVpbGQgc3lzdGVtIAorCitSZXF1aXJlbWVudHMgCistLS0tLS0tLS0tLS0KKy0gY21ha2UgdmVyc2lvbiA+PSAyLjQuNCBzZWUgaHR0cDovL3d3dy5jbWFrZS5vcmcgCistIGluc3RhbGxlZCBsaWJ4bWwyIG9yIGxpYmV4cGF0IAorCitCdWlsZGluZyAKKy0tLS0tLS0tCisKK3VuaXgKKzEuIGluc3RhbGwgY21ha2UgYW5kIGxpYnhtbCBvciBsaWJleHBhdCAKKzIuIGdldCBkYnVzIHNvdXJjZXMgCiszLiBta2RpciBkYnVzLWJ1aWxkIAorNC4gY2QgZGJ1cy1idWlsZCAKKzUuIGNtYWtlIDxkYnVzLXNyYy1yb290Pi9jbWFrZSBvciBjbWFrZSAtRERCVVNfVVNFX0VYUEFUPW9uIDxkYnVzLXNyYy1yb290Pi9jbWFrZSBpbiBjYXNlIGxpYmV4cGF0IHNob3VsZCBkZSB1c2VkCis1LiBtYWtlIAorNi4gbWFrZSBpbnN0YWxsCisKK3dpbjMyLW1pbmd3CisxLiBpbnN0YWxsIGNtYWtlIGFuZCBsaWJ4bWwgb3IgbGliZXhwYXQgaW4gPFByb2dyYW1EaXI+XGdudXdpbjMyCisyLiBnZXQgZGJ1cyBzb3VyY2VzIAorMy4gbWtkaXIgZGJ1cy1idWlsZCAKKzQuIGNkIGRidXMtYnVpbGQgCis1LiBjbWFrZSAtRyAiTWluR1cgTWFrZWZpbGVzIiA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKzYuIG1ha2UgCis3LiBtYWtlIGluc3RhbGwKKword2luMzItbXN2YworMS4gaW5zdGFsbCBjbWFrZSBhbmQgbGlieG1sIG9yIGxpYmV4cGF0IGluIDxQcm9ncmFtRGlyPlxnbnV3aW4zMgorMi4gZ2V0IGRidXMgc291cmNlcyAKKzMuIG1rZGlyIGRidXMtYnVpbGQgCis0LiBjZCBkYnVzLWJ1aWxkIAorNS4gY21ha2UgLUcgPG1zdmMgYXZhaWxhYmxlIHRhcmdldCwgc2VlIGNtYWtlIC0taGVscCBmb3IgYSBsaXN0PiA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKzYuIG1ha2UgCis3LiBtYWtlIGluc3RhbGwKKworQSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgYnVpbGQgb3B0aW9ucyBjb3VsZCBiZSBmaW5kIGluIHRoZSBmaWxlIC4uL1JFQURNRS4KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2RidXMtMS40LjEwL2NtYWtlL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyNTlkMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NtYWtlL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNjUgQEAKK3Byb2plY3QodGVzdCkKKworYWRkX2RlZmluaXRpb25zKCR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCithZGRfbGlicmFyeShkYnVzX3Rlc3R1dGlscyBTVEFUSUMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC11dGlscy5oCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtdXRpbHMuYworKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXNfdGVzdHV0aWxzICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorCithZGRfc3ViZGlyZWN0b3J5KCBuYW1lLXRlc3QgKQorCitzZXQgKHRlc3Qtc2VydmljZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3Qtc2VydmljZS5jCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtdXRpbHMuYworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXV0aWxzLmgKKykKKworc2V0ICh0ZXN0LW5hbWVzX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1uYW1lcy5jCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtdXRpbHMuYworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXV0aWxzLmgKKykKKworc2V0IChicmVha19sb2FkZXJfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9icmVhay1sb2FkZXIuYworKQorCitzZXQgKHRlc3Qtc2hlbGwtc2VydmljZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtdXRpbHMuYworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXV0aWxzLmgKKykKKworc2V0IChzaGVsbC10ZXN0X1NPVVJDRVMKKyAgICAgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3NoZWxsLXRlc3QuYworKQorCitzZXQgKHNwYXduLXRlc3RfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9zcGF3bi10ZXN0LmMKKykKKworc2V0ICh0ZXN0LWV4aXRfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LWV4aXQuYworKQorCitzZXQgKHRlc3Qtc2VnZmF1bHRfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKKykKKworc2V0ICh0ZXN0LXNsZWVwLWZvcmV2ZXJfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYworKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LXNlcnZpY2UgJHt0ZXN0LXNlcnZpY2VfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdC1zZXJ2aWNlICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LW5hbWVzICR7dGVzdC1uYW1lc19TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LW5hbWVzICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorCithZGRfZXhlY3V0YWJsZShzaGVsbC10ZXN0ICR7c2hlbGwtdGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhzaGVsbC10ZXN0ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorQUREX1RFU1Qoc2hlbGwtdGVzdCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3NoZWxsLXRlc3Qke0VYVH0pCisKK2FkZF9leGVjdXRhYmxlKHRlc3Qtc2hlbGwtc2VydmljZSAke3Rlc3Qtc2hlbGwtc2VydmljZV9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LXNoZWxsLXNlcnZpY2UgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9leGVjdXRhYmxlKHNwYXduLXRlc3QgJHtzcGF3bi10ZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHNwYXduLXRlc3QgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9leGVjdXRhYmxlKHRlc3QtZXhpdCAke3Rlc3QtZXhpdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LWV4aXQgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9leGVjdXRhYmxlKHRlc3Qtc2VnZmF1bHQgJHt0ZXN0LXNlZ2ZhdWx0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3Qtc2VnZmF1bHQgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9leGVjdXRhYmxlKHRlc3Qtc2xlZXAtZm9yZXZlciAke3Rlc3Qtc2xlZXAtZm9yZXZlcl9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LXNsZWVwLWZvcmV2ZXIgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKKyMjIyBrZWVwIHRoZXNlIGluIGNyZWF0aW9uIG9yZGVyLCBpLmUuIHVwcGVybW9zdCBkaXJzIGZpcnN0IAorc2V0IChURVNURElSUworICAgIHRlc3QvZGF0YQorICAgIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcworICAgIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMKKyAgICB0ZXN0L2RhdGEvYXV0aAorICAgIHRlc3QvZGF0YS9zaGEtMQorICAgIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMKKyAgICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQKKyAgICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5kCisgICAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0KKyAgICB0ZXN0L2RhdGEvdmFsaWQtaW50cm9zcGVjdGlvbi1maWxlcworICAgIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcworICAgIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzCisgICAgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtCisgICAgdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzCisgICAgdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbQorICAgIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0KKyAgICB0ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzCisgICAgdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYworICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMuZAorICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMKKyAgICB0ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2Jhc2ljLmQKKykKK3NldCAoQ09ORklHX1ZFUkJPU0UgMCkKKworIyMjIGNvcHkgdGVzdHMgdG8gYnVpbGRkaXIgc28gdGhhdCBnZW5lcmF0ZWQgdGVzdHMgYW5kIHN0YXRpYyB0ZXN0cyAKKyMjIyBhcmUgYWxsIGluIG9uZSBwbGFjZS4KK01FU1NBR0UoU1RBVFVTICJDb3B5aW5nIHRlc3QgZmlsZXMgdG8gdGVzdCBkaXJlY3RvcnkiKQorRk9SRUFDSChGSUxFX1RZUEUgKi5tZXNzYWdlICoubWVzc2FnZS1yYXcgKi5hdXRoLXNjcmlwdCAqLnNoYTEgKi50eHQgKi5jb25mICouc2VydmljZSkKKyAgICBGT1JFQUNIKERJUiAke1RFU1RESVJTfSkKKyAgICAgICAgRklMRShHTE9CIEZJTEVTICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uLyR7RElSfS8ke0ZJTEVfVFlQRX0iICkKKyAgICAgICAgRklMRShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfSkKKyAgICAgICAgRk9SRUFDSChGSUxFICR7RklMRVN9KQorICAgICAgICAgICAgR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChGSUxFTkFNRSAke0ZJTEV9IE5BTUUpCisgICAgICAgICAgICBTRVQgKFRBUkdFVCAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfS8ke0ZJTEVOQU1FfSkKKyAgICAgICAgICAgIGNvbmZpZ3VyZV9maWxlKCR7RklMRX0gJHtUQVJHRVR9IENPUFlPTkxZKQorICAgICAgICAgICAgSUYgKENPTkZJR19WRVJCT1NFKQorICAgICAgICAgICAgICAgIE1FU1NBR0UoIiR7RklMRX0iKQorICAgICAgICAgICAgRU5ESUYgKENPTkZJR19WRVJCT1NFKQorICAgICAgICBFTkRGT1JFQUNIKEZJTEUpCisgICAgRU5ERk9SRUFDSChESVIpCitFTkRGT1JFQUNIKEZJTEVfVFlQRSkKKworIyMjIGdlbmVyYXRlIHRlc3QgZmlsZXMKK01FU1NBR0UoU1RBVFVTICJHZW5lcmF0aW5nIHRlc3QgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgaW50byB0ZXN0IGRpcmVjdG9yeSIpCisKK0ZPUkVBQ0goRklMRV9UWVBFICouY29uZi5pbiAqLnNlcnZpY2UuaW4pCisgIEZPUkVBQ0goRElSICR7VEVTVERJUlN9KQorICAgIEZJTEUoR0xPQiBGSUxFUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi8ke0RJUn0vJHtGSUxFX1RZUEV9IiApCisgICAgRklMRShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfSkKKyAgICBGT1JFQUNIKEZJTEUgJHtGSUxFU30pCisgICAgICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEZJTEVOQU1FICR7RklMRX0gTkFNRSkKKyAgICAgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcXC5pbiQiICIiIEZJTEVOQU1FICR7RklMRU5BTUV9KQorICAgICAgU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0vJHtGSUxFTkFNRX0pCisgICAgICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiXFwuaW4kIiAiLmNtYWtlIiBfZmlsZSAke0ZJTEV9KQorICAgICAgSUYgKEVYSVNUUyAke19maWxlfSkKKyAgICAgICAgU0VUIChGSUxFICR7X2ZpbGV9KQorICAgICAgRU5ESUYgKEVYSVNUUyAke19maWxlfSkKKyAgICAgIGNvbmZpZ3VyZV9maWxlKCR7RklMRX0gJHtUQVJHRVR9IEBPTkxZIElNTUVESUFURSkKKyAgICAgIElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgTUVTU0FHRSgiJHtGSUxFfSIpCisgICAgICBFTkRJRiAoQ09ORklHX1ZFUkJPU0UpCisgICAgRU5ERk9SRUFDSChGSUxFKQorICBFTkRGT1JFQUNIKERJUikKK0VOREZPUkVBQ0goRklMRV9UWVBFKQorCitNRVNTQUdFKFNUQVRVUyAiQ29weWluZyBnZW5lcmF0ZWQgYnVzIGNvbmZpZyBmaWxlcyB0byB0ZXN0IGRpcmVjdG9yeSIpCitzZXQgKE9VVERJUiAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMpCisKK0ZJTEUoR0xPQiBGSUxFUyAiJHtDTUFLRV9CSU5BUllfRElSfS9idXMvKi5jb25mIiApCitGSUxFKE1BS0VfRElSRUNUT1JZICR7T1VURElSfSkKK0ZPUkVBQ0goRklMRSAke0ZJTEVTfSkKKyAgICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEZJTEVOQU1FICR7RklMRX0gTkFNRSkKKyAgICBTRVQgKFRBUkdFVCAke09VVERJUn0vJHtGSUxFTkFNRX0pCisgICAgY29uZmlndXJlX2ZpbGUoJHtGSUxFfSAke1RBUkdFVH0gQ09QWU9OTFkpCisgICAgSUYgKENPTkZJR19WRVJCT1NFKQorICAgICAgICBNRVNTQUdFKCJGUk9NOiAke0ZJTEV9XG5UTzogJHtUQVJHRVR9XG4iKQorICAgIEVORElGIChDT05GSUdfVkVSQk9TRSkKK0VOREZPUkVBQ0goRklMRSkKKworIyB0b2RvOiBmb3IgaW5zdGFsbGF0aW9uIHRoZSBURVNUXy4uLl9CSU5BUlkgdmFyaWFibGVzIG11c3QgcmVmbGVjdCB0aGUgCisjICAgICAgIGluc3RhbGxhdGlvbiBkaXIgb3IgaGFzIHRvIGJlIGRlZmluZWQgcmVsYXRpdmUKKyMKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NtYWtlL3Rlc3QvbmFtZS10ZXN0L0NNYWtlTGlzdHMudHh0IGIvZGJ1cy0xLjQuMTAvY21ha2UvdGVzdC9uYW1lLXRlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlYzdmNgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NtYWtlL3Rlc3QvbmFtZS10ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzkgQEAKK2lmIChEQlVTX0JVSUxEX1RFU1RTKQorCitzZXQgKE5BTUV0ZXN0LURJUiAuLi8uLi8uLi90ZXN0L25hbWUtdGVzdCkKKworYWRkX2RlZmluaXRpb25zKC1EREJVU19DT01QSUxBVElPTikKKworYWRkX2V4ZWN1dGFibGUodGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2ggJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2ggJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCitBRERfVEVTVCh0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0ICR7TkFNRXRlc3QtRElSfS90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKK0FERF9URVNUKHRlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQgJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LXRocmVhZC1pbml0ICR7TkFNRXRlc3QtRElSfS90ZXN0LXRocmVhZHMtaW5pdC5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3QtdGhyZWFkLWluaXQgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCitBRERfVEVTVCh0ZXN0LXRocmVhZC1pbml0ICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vdGVzdC10aHJlYWQtaW5pdCkKKworYWRkX2V4ZWN1dGFibGUodGVzdC1pZHMgJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtaWRzLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdC1pZHMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCitBRERfVEVTVCh0ZXN0LWlkcyAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3Rlc3QtaWRzKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LXNodXRkb3duICR7TkFNRXRlc3QtRElSfS90ZXN0LXNodXRkb3duLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdC1zaHV0ZG93biAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSBkYnVzX3Rlc3R1dGlscykKK0FERF9URVNUKHRlc3Qtc2h1dGRvd24gJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS90ZXN0LXNodXRkb3duKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0LXByaXZzZXJ2ZXIgJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtcHJpdnNlcnZlci5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3QtcHJpdnNlcnZlciAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSBkYnVzX3Rlc3R1dGlscykKK0FERF9URVNUKHRlc3QtcHJpdnNlcnZlciAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L3Rlc3QtcHJpdnNlcnZlcikKKworYWRkX2V4ZWN1dGFibGUodGVzdC1wcml2c2VydmVyLWNsaWVudCAke05BTUV0ZXN0LURJUn0vdGVzdC1wcml2c2VydmVyLWNsaWVudC5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3QtcHJpdnNlcnZlci1jbGllbnQgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gZGJ1c190ZXN0dXRpbHMpCitBRERfVEVTVCh0ZXN0LXByaXZzZXJ2ZXItY2xpZW50ICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0vdGVzdC1wcml2c2VydmVyLWNsaWVudCkKKworYWRkX2V4ZWN1dGFibGUodGVzdC1hdXRvbGF1bmNoICR7TkFNRXRlc3QtRElSfS90ZXN0LWF1dG9sYXVuY2guYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0LWF1dG9sYXVuY2ggJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gZGJ1c190ZXN0dXRpbHMpCitBRERfVEVTVCh0ZXN0LWF1dG9sYXVuY2ggJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS90ZXN0LWF1dG9sYXVuY2gpCisKK2VuZGlmIChEQlVTX0JVSUxEX1RFU1RTKQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvdG9vbHMvQ01ha2VMaXN0cy50eHQgYi9kYnVzLTEuNC4xMC9jbWFrZS90b29scy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFhNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvdG9vbHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NyBAQAorcHJvamVjdCh0b29scykKKworc2V0IChkYnVzX3NlbmRfU09VUkNFUworCS4uLy4uL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmgJCQkKKwkuLi8uLi90b29scy9kYnVzLXNlbmQuYworKQorCitzZXQgKGRidXNfbW9uaXRvcl9TT1VSQ0VTCisJLi4vLi4vdG9vbHMvZGJ1cy1tb25pdG9yLmMJCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMJCQkKKwkuLi8uLi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaAorKQorCitpZiAoV0lOMzIpCitzZXQgKGRidXNfbGF1bmNoX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLWxhdW5jaC13aW4uYworKQorZWxzZSAoV0lOMzIpCitzZXQgKGRidXNfbGF1bmNoX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLWxhdW5jaC5jCispCitlbmRpZiAoV0lOMzIpCisKK2lmIChEQlVTX0JVSUxEX1gxMSkKK3NldCAoZGJ1c19sYXVuY2hfU09VUkNFUworICAgICAke2RidXNfbGF1bmNoX1NPVVJDRVN9CisgICAgIC4uLy4uL3Rvb2xzL2RidXMtbGF1bmNoLXgxMS5jCispCitlbmRpZihEQlVTX0JVSUxEX1gxMSkKKworc2V0IChkYnVzX2NsZWFudXBfc29ja2V0c19TT1VSQ0VTCisJLi4vLi4vdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYworKQorCitzZXQgKGRidXNfdmlld2VyX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLW5hbWVzLW1vZGVsLmMJCQkKKwkuLi8uLi90b29scy9kYnVzLW5hbWVzLW1vZGVsLmgJCQkKKwkuLi8uLi90b29scy9kYnVzLXRyZWUtdmlldy5jCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy10cmVlLXZpZXcuaAkJCQorCS4uLy4uL3Rvb2xzL2RidXMtdmlld2VyLmMKKykKKworYWRkX2V4ZWN1dGFibGUoZGJ1cy1zZW5kICR7ZGJ1c19zZW5kX1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtc2VuZCAke0RCVVNfTElCUkFSSUVTfSkKK2luc3RhbGxfdGFyZ2V0cygvYmluIGRidXMtc2VuZCApCisKK2FkZF9leGVjdXRhYmxlKGRidXMtbGF1bmNoICR7ZGJ1c19sYXVuY2hfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1sYXVuY2ggKQoraWYgKERCVVNfQlVJTERfWDExKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1sYXVuY2ggJHtYMTFfTElCUkFSSUVTfSApCitlbmRpZiAoREJVU19CVUlMRF9YMTEpCitpbnN0YWxsX3RhcmdldHMoL2JpbiBkYnVzLWxhdW5jaCApCisKK2FkZF9leGVjdXRhYmxlKGRidXMtbW9uaXRvciAke2RidXNfbW9uaXRvcl9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLW1vbml0b3IgJHtEQlVTX0xJQlJBUklFU30pCitpbnN0YWxsX3RhcmdldHMoL2JpbiBkYnVzLW1vbml0b3IgKQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvdG9vbHMvZGJ1cy1sYXVuY2gueG1sIGIvZGJ1cy0xLjQuMTAvY21ha2UvdG9vbHMvZGJ1cy1sYXVuY2gueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMzQ4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9jbWFrZS90b29scy9kYnVzLWxhdW5jaC54bWwKQEAgLTAsMCArMSwyNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiPgorPCEtLSBsaWZ0ZWQgZnJvbSB0cm9mZittYW4gYnkgZG9jbGlmdGVyIC0tPgorPHJlZmVudHJ5IGlkPSdkYnVzbGF1bmNoMSc+Cis8IS0tICAgLS0+Cis8IS0tICBkYnVzXC1sYXVuY2ggbWFudWFsIHBhZ2UuIC0tPgorPCEtLSAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4gLS0+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+ZGJ1cy1sYXVuY2g8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjE8L21hbnZvbG51bT4KKzwvcmVmbWV0YT4KKzxyZWZuYW1lZGl2IGlkPSduYW1lJz4KKzxyZWZuYW1lPmRidXMtbGF1bmNoPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+VXRpbGl0eSB0byBzdGFydCBhIG1lc3NhZ2UgYnVzIGZyb20gYSBzaGVsbCBzY3JpcHQ8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tdmVyc2lvbiA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXNoLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWNzaC1zeW50YXggPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1hdXRvLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWV4aXQtd2l0aC1zZXNzaW9uIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tYXV0b2xhdW5jaD08cmVwbGFjZWFibGU+TUFDSElORUlEPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWNvbmZpZy1maWxlPTxyZXBsYWNlYWJsZT5GSUxFTkFNRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PHJlcGxhY2VhYmxlPlBST0dSQU08L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnIHJlcD0ncmVwZWF0Jz48cmVwbGFjZWFibGU+QVJHUzwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPHNici8+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+VGhlIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiBjb21tYW5kIGlzIHVzZWQgdG8gc3RhcnQgYSBzZXNzaW9uIGJ1cyAKK2luc3RhbmNlIG9mIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1cy1kYWVtb248L2VtcGhhc2lzPiBmcm9tIGEgc2hlbGwgc2NyaXB0LgorSXQgd291bGQgbm9ybWFsbHkgYmUgY2FsbGVkIGZyb20gYSB1c2VyJ3MgbG9naW4KK3NjcmlwdHMuIFVubGlrZSB0aGUgZGFlbW9uIGl0c2VsZiwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGV4aXRzLCBzbworYmFja3RpY2tzIG9yIHRoZSAkKCkgY29uc3RydWN0IGNhbiBiZSB1c2VkIHRvIHJlYWQgaW5mb3JtYXRpb24gZnJvbQorPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+LjwvcGFyYT4KKworPHBhcmE+V2l0aCBubyBhcmd1bWVudHMsIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiB3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzCitpbnN0YW5jZSBhbmQgcHJpbnQgdGhlIGFkZHJlc3MgYW5kIHBpZCBvZiB0aGF0IGluc3RhbmNlIHRvIHN0YW5kYXJkCitvdXRwdXQuPC9wYXJhPgorCis8cGFyYT5Zb3UgbWF5IHNwZWNpZnkgYSBwcm9ncmFtIHRvIGJlIHJ1bjsgaW4gdGhpcyBjYXNlLCA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4KK3dpbGwgbGF1bmNoIGEgc2Vzc2lvbiBidXMgaW5zdGFuY2UsIHNldCB0aGUgYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcyBzbyB0aGUgc3BlY2lmaWVkIHByb2dyYW0gY2FuIGZpbmQgdGhlIGJ1cywgYW5kIHRoZW4gZXhlY3V0ZSB0aGUKK3NwZWNpZmllZCBwcm9ncmFtLCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLiAgU2VlIGJlbG93IGZvcgorZXhhbXBsZXMuPC9wYXJhPgorCis8cGFyYT5JZiB5b3UgbGF1bmNoIGEgcHJvZ3JhbSwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IHdpbGwgbm90IHByaW50IHRoZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBidXMgdG8gc3RhbmRhcmQgb3V0cHV0LjwvcGFyYT4KKworPHBhcmE+V2hlbiA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gcHJpbnRzIGJ1cyBpbmZvcm1hdGlvbiB0byBzdGFuZGFyZCBvdXRwdXQsIGJ5CitkZWZhdWx0IGl0IGlzIGluIGEgc2ltcGxlIGtleS12YWx1ZSBwYWlycyBmb3JtYXQuIEhvd2V2ZXIsIHlvdSBtYXkgCityZXF1ZXN0IHNldmVyYWwgYWx0ZXJuYXRlIHN5bnRheGVzIHVzaW5nIHRoZSAtLXNoLXN5bnRheCwgLS1jc2gtc3ludGF4LAorLS1iaW5hcnktc3ludGF4LCBvcgorLS1hdXRvLXN5bnRheCBvcHRpb25zLiBTZXZlcmFsIG9mIHRoZXNlIGNhdXNlIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiB0byBlbWl0IHNoZWxsIGNvZGUKK3RvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuPC9wYXJhPgorCis8cGFyYT5XaXRoIHRoZSAtLWF1dG8tc3ludGF4IG9wdGlvbiwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGxvb2tzIGF0IHRoZSB2YWx1ZQorb2YgdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSB3aGljaCBzaGVsbCBzeW50YXgKK3Nob3VsZCBiZSB1c2VkLiAgSWYgU0hFTEwgZW5kcyBpbiAiY3NoIiwgdGhlbiBjc2gtY29tcGF0aWJsZSBjb2RlIGlzCitlbWl0dGVkOyBvdGhlcndpc2UgQm91cm5lIHNoZWxsIGNvZGUgaXMgZW1pdHRlZC4gIEluc3RlYWQgb2YgcGFzc2luZworLS1hdXRvLXN5bnRheCwgeW91IG1heSBleHBsaWNpdHkgc3BlY2lmeSBhIHBhcnRpY3VsYXIgb25lIGJ5IHVzaW5nCistLXNoLXN5bnRheCBmb3IgQm91cm5lIHN5bnRheCwgb3IgLS1jc2gtc3ludGF4IGZvciBjc2ggc3ludGF4LgorSW4gc2NyaXB0cywgaXQncyBtb3JlIHJvYnVzdCB0byBhdm9pZCAtLWF1dG8tc3ludGF4IGFuZCB5b3UgaG9wZWZ1bGx5Citrbm93IHdoaWNoIHNoZWxsIHlvdXIgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uPC9wYXJhPgorCisKKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgRC1CdXMuIFNlZSBhbHNvIHRoZSBtYW4gcGFnZSBmb3IgPGVtcGhhc2lzIHJlbWFwPSdJJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+LjwvcGFyYT4KKworCis8cGFyYT5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gd2l0aCBhbiAKK3NoLWNvbXBhdGlibGUgc2hlbGwgdG8gc3RhcnQgdGhlIHBlci1zZXNzaW9uIGJ1cyBkYWVtb246PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisKKyAgIyMgdGVzdCBmb3IgYW4gZXhpc3RpbmcgYnVzIGRhZW1vbiwganVzdCB0byBiZSBzYWZlCisgIGlmIHRlc3QgLXogIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiIDsgdGhlbgorICAgICAgIyMgaWYgbm90IGZvdW5kLCBsYXVuY2ggYSBuZXcgb25lCisgICAgICBldmFsIGBkYnVzLWxhdW5jaCAtLXNoLXN5bnRheCAtLWV4aXQtd2l0aC1zZXNzaW9uYAorICAgICAgZWNobyAiRC1CdXMgcGVyLXNlc3Npb24gZGFlbW9uIGFkZHJlc3MgaXM6ICREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCisgIGZpCisKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+Cis8cGFyYT5Zb3UgbWlnaHQgcnVuIHNvbWV0aGluZyBsaWtlIHRoYXQgaW4geW91ciBsb2dpbiBzY3JpcHRzLjwvcGFyYT4KKworCis8cGFyYT5Bbm90aGVyIHdheSB0byB1c2UgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGlzIHRvIHJ1biB5b3VyIG1haW4gc2Vzc2lvbgorcHJvZ3JhbSwgbGlrZSBzbzo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKworZGJ1cy1sYXVuY2ggZ25vbWUtc2Vzc2lvbgorCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorPHBhcmE+VGhlIGFib3ZlIHdvdWxkIGxpa2VseSBiZSBhcHByb3ByaWF0ZSBmb3Igfi8ueHNlc3Npb24gb3Igfi8uWGNsaWVudHMuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2F1dG9tYXRpY19sYXVuY2hpbmcnPjx0aXRsZT5BVVRPTUFUSUMgTEFVTkNISU5HPC90aXRsZT4KKzxwYXJhPklmIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpcyBub3Qgc2V0IGZvciBhIHByb2Nlc3MgdGhhdCB0cmllcyB0byB1c2UKK0QtQnVzLCBieSBkZWZhdWx0IHRoZSBwcm9jZXNzIHdpbGwgYXR0ZW1wdCB0byBpbnZva2UgZGJ1cy1sYXVuY2ggd2l0aAordGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gdG8gc3RhcnQgdXAgYSBuZXcgc2Vzc2lvbiBidXMgb3IgZmluZCB0aGUgCitleGlzdGluZyBidXMgYWRkcmVzcyBvbiB0aGUgWCBkaXNwbGF5IG9yIGluIGEgZmlsZSBpbgorfi8uZGJ1cy9zZXNzaW9uLWJ1cy88L3BhcmE+CisKKworPHBhcmE+V2hlbmV2ZXIgYW4gYXV0b2xhdW5jaCBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGhhZCB0bworc3RhcnQgYSBuZXcgYnVzIHdpbGwgYmUgaW4gaXRzIG93biBsaXR0bGUgd29ybGQ7IGl0IGNhbiBlZmZlY3RpdmVseQorZW5kIHVwIHN0YXJ0aW5nIGEgd2hvbGUgbmV3IHNlc3Npb24gaWYgaXQgdHJpZXMgdG8gdXNlIGEgbG90IG9mIAorYnVzIHNlcnZpY2VzLiBUaGlzIGNhbiBiZSBzdWJvcHRpbWFsIG9yIGV2ZW4gdG90YWxseSBicm9rZW4sIGRlcGVuZGluZworb24gdGhlIGFwcCBhbmQgd2hhdCBpdCB0cmllcyB0byBkby48L3BhcmE+CisKKworPHBhcmE+VGhlcmUgYXJlIHR3byBjb21tb24gcmVhc29ucyBmb3IgYXV0b2xhdW5jaC4gT25lIGlzIHNzaCB0byBhIHJlbW90ZQorbWFjaGluZS4gVGhlIGlkZWFsIGZpeCBmb3IgdGhhdCB3b3VsZCBiZSBmb3J3YXJkaW5nIG9mCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaW4gdGhlIHNhbWUgd2F5IHRoYXQgRElTUExBWSBpcyBmb3J3YXJkZWQuCitJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gZWRpdCB0aGUgc2Vzc2lvbi5jb25mIGNvbmZpZyBmaWxlIHRvIAoraGF2ZSB5b3VyIHNlc3Npb24gYnVzIGxpc3RlbiBvbiBUQ1AsIGFuZCBtYW51YWxseSBzZXQKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUywgaWYgeW91IGxpa2UuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBzZWNvbmQgY29tbW9uIHJlYXNvbiBmb3IgYXV0b2xhdW5jaCBpcyBhbiBzdSB0byBhbm90aGVyIHVzZXIsIGFuZAorZGlzcGxheSBvZiBYIGFwcGxpY2F0aW9ucyBydW5uaW5nIGFzIHRoZSBzZWNvbmQgdXNlciBvbiB0aGUgZGlzcGxheQorYmVsb25naW5nIHRvIHRoZSBmaXJzdCB1c2VyLiBQZXJoYXBzIHRoZSBpZGVhbCBmaXggaW4gdGhpcyBjYXNlCit3b3VsZCBiZSB0byBhbGxvdyB0aGUgc2Vjb25kIHVzZXIgdG8gY29ubmVjdCB0byB0aGUgc2Vzc2lvbiBidXMgb2YgdGhlCitmaXJzdCB1c2VyLCBqdXN0IGFzIHRoZXkgY2FuIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHVzZXIncyBkaXNwbGF5LgorSG93ZXZlciwgYSBtZWNoYW5pc20gZm9yIHRoYXQgaGFzIG5vdCBiZWVuIGNvZGVkLjwvcGFyYT4KKworCis8cGFyYT5Zb3UgY2FuIGFsd2F5cyBhdm9pZCBhdXRvbGF1bmNoIGJ5IG1hbnVhbGx5IHNldHRpbmcKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUy4gQXV0b2xhdW5jaCBoYXBwZW5zIGJlY2F1c2UgdGhlIGRlZmF1bHQKK2FkZHJlc3MgaWYgbm9uZSBpcyBzZXQgaXMgImF1dG9sYXVuY2g6Iiwgc28gaWYgYW55IG90aGVyIGFkZHJlc3MgaXMKK3NldCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9sYXVuY2guIFlvdSBjYW4gaG93ZXZlciBpbmNsdWRlIGF1dG9sYXVuY2ggaW4KK2FuIGV4cGxpY2l0IHNlc3Npb24gYnVzIGFkZHJlc3MgYXMgYSBmYWxsYmFjaywgZm9yIGV4YW1wbGUKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0ic29tZXRoaW5nOixhdXRvbGF1bmNoOiIgLSBpbiB0aGF0IGNhc2UgaWYKK3RoZSBmaXJzdCBhZGRyZXNzIGRvZXNuJ3Qgd29yaywgcHJvY2Vzc2VzIHdpbGwgYXV0b2xhdW5jaC4gKFRoZSBidXMKK2FkZHJlc3MgdmFyaWFibGUgY29udGFpbnMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhZGRyZXNzZXMgdG8gdHJ5Lik8L3BhcmE+CisKKworPHBhcmE+VGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gaXMgY29uc2lkZXJlZCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgorZGV0YWlsIG9mIGxpYmRidXMsIGFuZCBpbiBmYWN0IHRoZXJlIGFyZSBwbGFucyB0byBjaGFuZ2UgaXQuIFRoZXJlJ3MKK25vIHJlYWwgcmVhc29uIHRvIHVzZSBpdCBvdXRzaWRlIG9mIHRoZSBsaWJkYnVzIGltcGxlbWVudGF0aW9uIGFueWhvdy48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tYXV0by1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkNob29zZSAtLWNzaC1zeW50YXggb3IgLS1zaC1zeW50YXggYmFzZWQgb24gdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlLjwvcGFyYT4KKworPHBhcmE+PG9wdGlvbj4tLWJpbmFyeS1zeW50YXg8L29wdGlvbj4KK1dyaXRlIHRvIHN0ZG91dCBhIG51bC10ZXJtaW5hdGVkIGJ1cyBhZGRyZXNzLCB0aGVuIHRoZSBidXMgUElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKHBpZF90KSwgdGhlbiB0aGUgYnVzIFggd2luZG93IElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKGxvbmcpLiBJbnRlZ2VycyBhcmUgaW4gdGhlIG1hY2hpbmUncworYnl0ZSBvcmRlciwgbm90IG5ldHdvcmsgYnl0ZSBvcmRlciBvciBhbnkgb3RoZXIgY2Fub25pY2FsIGJ5dGUgb3JkZXIuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tY2xvc2Utc3RkZXJyPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5DbG9zZSB0aGUgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IHN0cmVhbSBiZWZvcmUgc3RhcnRpbmcgdGhlIEQtQnVzCitkYWVtb24uIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNhcHR1cmUgZGJ1cy1sYXVuY2ggZXJyb3IKK21lc3NhZ2VzIGJ1dCB5b3UgZG9uJ3Qgd2FudCBkYnVzLWRhZW1vbiB0byBrZWVwIHRoZSBzdHJlYW0gb3BlbiB0bworeW91ciBhcHBsaWNhdGlvbi48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1jb25maWctZmlsZT1GSUxFTkFNRTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UGFzcyAtLWNvbmZpZy1maWxlPUZJTEVOQU1FIHRvIHRoZSBidXMgZGFlbW9uLCBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgCit0aGUgLS1zZXNzaW9uIGFyZ3VtZW50LiBTZWUgdGhlIG1hbiBwYWdlIGZvciBkYnVzLWRhZW1vbjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWNzaC1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkVtaXQgY3NoIGNvbXBhdGlibGUgY29kZSB0byBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWV4aXQtd2l0aC1zZXNzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5JZiB0aGlzIG9wdGlvbiBpcyBwcm92aWRlZCwgYSBwZXJzaXN0ZW50ICJiYWJ5c2l0dGVyIiBwcm9jZXNzIHdpbGwgYmUgCitjcmVhdGVkIHRoYXQgd2F0Y2hlcyBzdGRpbiBmb3IgSFVQIGFuZCB0cmllcyB0byBjb25uZWN0IHRvIHRoZSBYCitzZXJ2ZXIuIElmIHRoaXMgcHJvY2VzcyBnZXRzIGEgSFVQIG9uIHN0ZGluIG9yIGxvc2VzIGl0cyBYIGNvbm5lY3Rpb24sCitpdCBraWxscyB0aGUgbWVzc2FnZSBidXMgZGFlbW9uLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWF1dG9sYXVuY2g9TUFDSElORUlEPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5UaGlzIG9wdGlvbiBpbXBsaWVzIHRoYXQgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IHNob3VsZCBzY2FuIGZvciBhCitwcmV2aW91c2x5LXN0YXJ0ZWQgc2Vzc2lvbiBhbmQgcmV1c2UgdGhlIHZhbHVlcyBmb3VuZCB0aGVyZS4gSWYgbm8KK3Nlc3Npb24gaXMgZm91bmQsIGl0IHdpbGwgc3RhcnQgYSBuZXcgc2Vzc2lvbi4gVGhlCistLWV4aXQtd2l0aC1zZXNzaW9uIG9wdGlvbiBpcyBpbXBsaWVkIGlmIC0tYXV0b2xhdW5jaCBpcyBnaXZlbi4KK1RoaXMgb3B0aW9uIGlzIGZvciB0aGUgZXhjbHVzaXZlIHVzZSBvZiBsaWJkYnVzLCB5b3UgZG8gbm90IHdhbnQgdG8KK3VzZSBpdCBtYW51YWxseS4gSXQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXNoLXN5bnRheDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+RW1pdCBCb3VybmUtc2hlbGwgY29tcGF0aWJsZSBjb2RlIHRvIHNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tdmVyc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHZlcnNpb24gb2YgZGJ1cy1sYXVuY2g8L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jbWFrZS90b29scy9kYnVzLW1vbml0b3IueG1sIGIvZGJ1cy0xLjQuMTAvY21ha2UvdG9vbHMvZGJ1cy1tb25pdG9yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFjYWNlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY21ha2UvdG9vbHMvZGJ1cy1tb25pdG9yLnhtbApAQCAtMCwwICsxLDEyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCI+Cis8IS0tIGxpZnRlZCBmcm9tIHRyb2ZmK21hbiBieSBkb2NsaWZ0ZXIgLS0+Cis8cmVmZW50cnkgaWQ9J2RidXNtb25pdG9yMSc+Cis8IS0tICAgLS0+Cis8IS0tICBkYnVzXC1tb25pdG9yIG1hbnVhbCBwYWdlLiAtLT4KKzwhLS0gIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIC0tPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtbW9uaXRvcjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXYgaWQ9J25hbWUnPgorPHJlZm5hbWU+ZGJ1cy1tb25pdG9yPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+ZGVidWcgcHJvYmUgdG8gcHJpbnQgbWVzc2FnZSBidXMgbWVzc2FnZXM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiAgICAKKyAgICA8Z3JvdXAgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zeXN0ZW0gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXNlc3Npb24gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWFkZHJlc3MgPHJlcGxhY2VhYmxlPkFERFJFU1M8L3JlcGxhY2VhYmxlPjwvYXJnPjwvZ3JvdXA+CisgICAgPGdyb3VwIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcHJvZmlsZSA8L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPi0tbW9uaXRvciA8L2FyZz48L2dyb3VwPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPndhdGNoPC9yZXBsYWNlYWJsZT48L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5leHByZXNzaW9uczwvcmVwbGFjZWFibGU+PC9hcmc+PC9hcmc+CisgICAgPHNici8+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+VGhlIDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gY29tbWFuZCBpcyB1c2VkIHRvIG1vbml0b3IgbWVzc2FnZXMgZ29pbmcKK3Rocm91Z2ggYSBELUJ1cyBtZXNzYWdlIGJ1cy4gIFNlZQorPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBiaWcgcGljdHVyZS48L3BhcmE+CisKKworPHBhcmE+VGhlcmUgYXJlIHR3byB3ZWxsLWtub3duIG1lc3NhZ2UgYnVzZXM6IHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIHNlcnZpY2UpIGFuZCB0aGUKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1RoZSAtLXN5c3RlbSBhbmQgLS1zZXNzaW9uIG9wdGlvbnMgZGlyZWN0IDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gdG8KK21vbml0b3IgdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4gIElmIG5laXRoZXIgaXMKK3NwZWNpZmllZCwgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiBtb25pdG9ycyB0aGUgc2Vzc2lvbiBidXMuPC9wYXJhPgorCisKKzxwYXJhPjxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gaGFzIHR3byBkaWZmZXJlbnQgb3V0cHV0IG1vZGVzLCB0aGUgJ2NsYXNzaWMnLXN0eWxlCittb25pdG9yaW5nIG1vZGUgYW5kIHByb2ZpbGluZyBtb2RlLiBUaGUgcHJvZmlsaW5nIGZvcm1hdCBpcyBhIGNvbXBhY3QKK2Zvcm1hdCB3aXRoIGEgc2luZ2xlIGxpbmUgcGVyIG1lc3NhZ2UgYW5kIG1pY3Jvc2Vjb25kLXJlc29sdXRpb24gdGltaW5nCitpbmZvcm1hdGlvbi4gVGhlIC0tcHJvZmlsZSBhbmQgLS1tb25pdG9yIG9wdGlvbnMgc2VsZWN0IHRoZSBwcm9maWxpbmcKK2FuZCBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQgcmVzcGVjdGl2ZWx5LiBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwKKzxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gdXNlcyB0aGUgbW9uaXRvcmluZyBvdXRwdXQgZm9ybWF0LjwvcGFyYT4KKworCis8cGFyYT5JbiBvcmRlciB0byBnZXQgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiB0byBzZWUgdGhlIG1lc3NhZ2VzIHlvdSBhcmUgaW50ZXJlc3RlZAoraW4sIHlvdSBzaG91bGQgc3BlY2lmeSBhIHNldCBvZiB3YXRjaCBleHByZXNzaW9ucyBhcyB5b3Ugd291bGQgZXhwZWN0IHRvCitiZSBwYXNzZWQgdG8gdGhlIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1c19idXNfYWRkX21hdGNoPC9lbXBoYXNpcz4gZnVuY3Rpb24uPC9wYXJhPgorCisKKzxwYXJhPlRoZSBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIG1heSBrZWVwIDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gZnJvbSBzZWVpbmcKK2FsbCBtZXNzYWdlcywgZXNwZWNpYWxseSBpZiB5b3UgcnVuIHRoZSBtb25pdG9yIGFzIGEgbm9uLXJvb3QgdXNlci48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc3lzdGVtPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Nb25pdG9yIHRoZSBzeXN0ZW0gbWVzc2FnZSBidXMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXNlc3Npb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPk1vbml0b3IgdGhlIHNlc3Npb24gbWVzc2FnZSBidXMuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWFkZHJlc3MgQUREUkVTUzwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+TW9uaXRvciBhbiBhcmJpdHJhcnkgbWVzc2FnZSBidXMgZ2l2ZW4gYXQgQUREUkVTUy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJvZmlsZTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+VXNlIHRoZSBwcm9maWxpbmcgb3V0cHV0IGZvcm1hdC48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tbW9uaXRvcjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+VXNlIHRoZSBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorPC92YXJpYWJsZWxpc3Q+Cis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2V4YW1wbGUnPjx0aXRsZT5FWEFNUExFPC90aXRsZT4KKzxwYXJhPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBkYnVzLW1vbml0b3IgdG8gd2F0Y2ggZm9yIHRoZSBnbm9tZSB0eXBpbmcKK21vbml0b3IgdG8gc2F5IHRoaW5nczwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorCisgIGRidXMtbW9uaXRvciAidHlwZT0nc2lnbmFsJyxzZW5kZXI9J29yZy5nbm9tZS5UeXBpbmdNb25pdG9yJyxpbnRlcmZhY2U9J29yZy5nbm9tZS5UeXBpbmdNb25pdG9yJyIKKworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdhdXRob3InPjx0aXRsZT5BVVRIT1I8L3RpdGxlPgorPHBhcmE+ZGJ1cy1tb25pdG9yIHdhcyB3cml0dGVuIGJ5IFBoaWxpcCBCbHVuZGVsbC4KK1RoZSBwcm9maWxpbmcgb3V0cHV0IG1vZGUgd2FzIGFkZGVkIGJ5IE9sbGkgU2FsbGkuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2J1Z3MnPjx0aXRsZT5CVUdTPC90aXRsZT4KKzxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz48L3BhcmE+Cis8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY21ha2UvdG9vbHMvZGJ1cy1zZW5kLnhtbCBiL2RidXMtMS40LjEwL2NtYWtlL3Rvb2xzL2RidXMtc2VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlZmMwMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NtYWtlL3Rvb2xzL2RidXMtc2VuZC54bWwKQEAgLTAsMCArMSwxNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiPgorPCEtLSBsaWZ0ZWQgZnJvbSB0cm9mZittYW4gYnkgZG9jbGlmdGVyIC0tPgorPHJlZmVudHJ5IGlkPSdkYnVzc2VuZDEnPgorPCEtLSAgIC0tPgorPCEtLSAgZGJ1c1wtc2VuZCBtYW51YWwgcGFnZS4gLS0+Cis8IS0tICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiAtLT4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5kYnVzLXNlbmQ8L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjE8L21hbnZvbG51bT4KKzwvcmVmbWV0YT4KKzxyZWZuYW1lZGl2IGlkPSduYW1lJz4KKzxyZWZuYW1lPmRidXMtc2VuZDwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPlNlbmQgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBidXM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiAgICAKKyAgICA8Z3JvdXAgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zeXN0ZW0gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXNlc3Npb24gPC9hcmc+PC9ncm91cD4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWRlc3Q9PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tcHJpbnQtcmVwbHkgPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS10eXBlPTxyZXBsYWNlYWJsZT5UWVBFPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT4mbHQ7ZGVzdGluYXRpb248L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPm9iamVjdDwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J3BsYWluJz48cmVwbGFjZWFibGU+cGF0aCZndDs8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPiZsdDttZXNzYWdlPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5uYW1lJmd0OzwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCcgcmVwPSdyZXBlYXQnPjxyZXBsYWNlYWJsZT5jb250ZW50czwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPHNici8+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+VGhlIDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gY29tbWFuZCBpcyB1c2VkIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGEgRC1CdXMgbWVzc2FnZQorYnVzLiBTZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmlnIHBpY3R1cmUuPC9wYXJhPgorCisKKzxwYXJhPlRoZXJlIGFyZSB0d28gd2VsbC1rbm93biBtZXNzYWdlIGJ1c2VzOiB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cyAKKyhpbnN0YWxsZWQgb24gbWFueSBzeXN0ZW1zIGFzIHRoZSAibWVzc2FnZWJ1cyIgc2VydmljZSkgYW5kIHRoZSAKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1RoZSAtLXN5c3RlbSBhbmQgLS1zZXNzaW9uIG9wdGlvbnMgZGlyZWN0IDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gdG8gc2VuZAorbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4gIElmIG5laXRoZXIgaXMKK3NwZWNpZmllZCwgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBzZW5kcyB0byB0aGUgc2Vzc2lvbiBidXMuPC9wYXJhPgorCisKKzxwYXJhPk5lYXJseSBhbGwgdXNlcyBvZiA8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IG11c3QgcHJvdmlkZSB0aGUgLS1kZXN0IGFyZ3VtZW50Cit3aGljaCBpcyB0aGUgbmFtZSBvZiBhIGNvbm5lY3Rpb24gb24gdGhlIGJ1cyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBJZgorLS1kZXN0IGlzIG9taXR0ZWQsIG5vIGRlc3RpbmF0aW9uIGlzIHNldC48L3BhcmE+CisKKworPHBhcmE+VGhlIG9iamVjdCBwYXRoIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kIG11c3QgYWx3YXlzIGJlCitzcGVjaWZpZWQuIEZvbGxvd2luZyBhcmd1bWVudHMsIGlmIGFueSwgYXJlIHRoZSBtZXNzYWdlIGNvbnRlbnRzCisobWVzc2FnZSBhcmd1bWVudHMpLiAgVGhlc2UgYXJlIGdpdmVuIGFzIHR5cGUtc3BlY2lmaWVkIHZhbHVlcyBhbmQgCittYXkgaW5jbHVkZSBjb250YWluZXJzIChhcnJheXMsIGRpY3RzLCBhbmQgdmFyaWFudHMpIGFzIGRlc2NyaWJlZCBiZWxvdy48L3BhcmE+CisKKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorJmx0O2NvbnRlbnRzJmd0OyAgIDo6PSAmbHQ7aXRlbSZndDsgfCAmbHQ7Y29udGFpbmVyJmd0OyBbICZsdDtpdGVtJmd0OyB8ICZsdDtjb250YWluZXImZ3Q7Li4uXQorJmx0O2l0ZW0mZ3Q7ICAgICAgIDo6PSAmbHQ7dHlwZSZndDs6Jmx0O3ZhbHVlJmd0OworJmx0O2NvbnRhaW5lciZndDsgIDo6PSAmbHQ7YXJyYXkmZ3Q7IHwgJmx0O2RpY3QmZ3Q7IHwgJmx0O3ZhcmlhbnQmZ3Q7CismbHQ7YXJyYXkmZ3Q7ICAgICAgOjo9IGFycmF5OiZsdDt0eXBlJmd0OzombHQ7dmFsdWUmZ3Q7WywmbHQ7dmFsdWUmZ3Q7Li4uXSAKKyZsdDtkaWN0Jmd0OyAgICAgICA6Oj0gZGljdDombHQ7dHlwZSZndDs6Jmx0O3R5cGUmZ3Q7OiZsdDtrZXkmZ3Q7LCZsdDt2YWx1ZSZndDtbLCZsdDtrZXkmZ3Q7LCZsdDt2YWx1ZSZndDsuLi5dCismbHQ7dmFyaWFudCZndDsgICAgOjo9IHZhcmlhbnQ6Jmx0O3R5cGUmZ3Q7OiZsdDt2YWx1ZSZndDsKKyZsdDt0eXBlJmd0OyAgICAgICA6Oj0gc3RyaW5nIHwgaW50MTYgfCB1aW50IDE2IHwgaW50MzIgfCB1aW50MzIgfCBpbnQ2NCB8IHVpbnQ2NCB8IGRvdWJsZSB8IGJ5dGUgfCBib29sZWFuIHwgb2JqcGF0aAorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworPHBhcmE+RC1CdXMgc3VwcG9ydHMgbW9yZSB0eXBlcyB0aGFuIHRoZXNlLCBidXQgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBjdXJyZW50bHkKK2RvZXMgbm90LiAgQWxzbywgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBkb2VzIG5vdCBwZXJtaXQgZW1wdHkgY29udGFpbmVycworb3IgbmVzdGVkIGNvbnRhaW5lcnMgKGUuZy4gYXJyYXlzIG9mIHZhcmlhbnRzKS48L3BhcmE+CisKKworPHBhcmE+SGVyZSBpcyBhbiBleGFtcGxlIGludm9jYXRpb246PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisKKyAgZGJ1cy1zZW5kIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuRXhhbXBsZU5hbWUgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkV4YW1wbGVJbnRlcmZhY2UuRXhhbXBsZU1ldGhvZCAgIFwKKyAgICAgICAgICAgIGludDMyOjQ3IHN0cmluZzonaGVsbG8gd29ybGQnIGRvdWJsZTo2NS4zMiAgICAgICBcCisgICAgICAgICAgICBhcnJheTpzdHJpbmc6IjFzdCBpdGVtIiwibmV4dCBpdGVtIiwibGFzdCBpdGVtIiAgXAorICAgICAgICAgICAgZGljdDpzdHJpbmc6aW50MzI6Im9uZSIsMSwidHdvIiwyLCJ0aHJlZSIsMyAgICAgIFwKKyAgICAgICAgICAgIHZhcmlhbnQ6aW50MzI6LTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvYmpwYXRoOi9vcmcvZnJlZWRlc2t0b3Avc2FtcGxlL29iamVjdC9uYW1lIAorCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCis8cGFyYT5Ob3RlIHRoYXQgdGhlIGludGVyZmFjZSBpcyBzZXBhcmF0ZWQgZnJvbSBhIG1ldGhvZCBvciBzaWduYWwgCituYW1lIGJ5IGEgZG90LCB0aG91Z2ggaW4gdGhlIGFjdHVhbCBwcm90b2NvbCB0aGUgaW50ZXJmYWNlCithbmQgdGhlIGludGVyZmFjZSBtZW1iZXIgYXJlIHNlcGFyYXRlIGZpZWxkcy48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tZGVzdD1OQU1FPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXByaW50LXJlcGx5PC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5CbG9jayBmb3IgYSByZXBseSB0byB0aGUgbWVzc2FnZSBzZW50LCBhbmQgcHJpbnQgYW55IHJlcGx5IHJlY2VpdmVkLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNlbmQgdG8gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc2Vzc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+U2VuZCB0byB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cy4gIChUaGlzIGlzIHRoZSBkZWZhdWx0Lik8L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tdHlwZT1UWVBFPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5TcGVjaWZ5ICJtZXRob2RfY2FsbCIgb3IgInNpZ25hbCIgKGRlZmF1bHRzIHRvICJzaWduYWwiKS48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPmRidXMtc2VuZCB3YXMgd3JpdHRlbiBieSBQaGlsaXAgQmx1bmRlbGwuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2J1Z3MnPjx0aXRsZT5CVUdTPC90aXRsZT4KKzxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz48L3BhcmE+Cis8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY29tcGlsZSBiL2RidXMtMS40LjEwL2NvbXBpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzAwOTZhNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NvbXBpbGUKQEAgLTAsMCArMSwxNDMgQEAKKyMhIC9iaW4vc2gKKyMgV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kIGAtYyAtbycuCisKK3NjcmlwdHZlcnNpb249MjAwOS0xMC0wNi4yMDsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLgorIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0CisjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKyMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGNvbXBpbGUgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kIGAtYyAtbycuCitSZW1vdmUgYC1vIGRlc3QubycgZnJvbSBBUkdTLCBydW4gUFJPR1JBTSB3aXRoIHRoZSByZW1haW5pbmcKK2FyZ3VtZW50cywgYW5kIHJlbmFtZSB0aGUgb3V0cHV0IGFzIGV4cGVjdGVkLgorCitJZiB5b3UgYXJlIHRyeWluZyB0byBidWlsZCBhIHdob2xlIHBhY2thZ2UgdGhpcyBpcyBub3QgdGhlCityaWdodCBzY3JpcHQgdG8gcnVuOiBwbGVhc2Ugc3RhcnQgYnkgcmVhZGluZyB0aGUgZmlsZSBgSU5TVEFMTCcuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImNvbXBpbGUgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK29maWxlPQorY2ZpbGU9CitlYXQ9CisKK2ZvciBhcmcKK2RvCisgIGlmIHRlc3QgLW4gIiRlYXQiOyB0aGVuCisgICAgZWF0PQorICBlbHNlCisgICAgY2FzZSAkMSBpbgorICAgICAgLW8pCisJIyBjb25maWd1cmUgbWlnaHQgY2hvb3NlIHRvIHJ1biBjb21waWxlIGFzIGBjb21waWxlIGNjIC1vIGZvbyBmb28uYycuCisJIyBTbyB3ZSBzdHJpcCBgLW8gYXJnJyBvbmx5IGlmIGFyZyBpcyBhbiBvYmplY3QuCisJZWF0PTEKKwljYXNlICQyIGluCisJICAqLm8gfCAqLm9iaikKKwkgICAgb2ZpbGU9JDIKKwkgICAgOzsKKwkgICopCisJICAgIHNldCB4ICIkQCIgLW8gIiQyIgorCSAgICBzaGlmdAorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKi5jKQorCWNmaWxlPSQxCisJc2V0IHggIiRAIiAiJDEiCisJc2hpZnQKKwk7OworICAgICAgKikKKwlzZXQgeCAiJEAiICIkMSIKKwlzaGlmdAorCTs7CisgICAgZXNhYworICBmaQorICBzaGlmdAorZG9uZQorCitpZiB0ZXN0IC16ICIkb2ZpbGUiIHx8IHRlc3QgLXogIiRjZmlsZSI7IHRoZW4KKyAgIyBJZiBubyBgLW8nIG9wdGlvbiB3YXMgc2VlbiB0aGVuIHdlIG1pZ2h0IGhhdmUgYmVlbiBpbnZva2VkIGZyb20gYQorICAjIHBhdHRlcm4gcnVsZSB3aGVyZSB3ZSBkb24ndCBuZWVkIG9uZS4gIFRoYXQgaXMgb2sgLS0gdGhpcyBpcyBhCisgICMgbm9ybWFsIGNvbXBpbGF0aW9uIHRoYXQgdGhlIGxvc2luZyBjb21waWxlciBjYW4gaGFuZGxlLiAgSWYgbm8KKyAgIyBgLmMnIGZpbGUgd2FzIHNlZW4gdGhlbiB3ZSBhcmUgcHJvYmFibHkgbGlua2luZy4gIFRoYXQgaXMgYWxzbworICAjIG9rLgorICBleGVjICIkQCIKK2ZpCisKKyMgTmFtZSBvZiBmaWxlIHdlIGV4cGVjdCBjb21waWxlciB0byBjcmVhdGUuCitjb2ZpbGU9YGVjaG8gIiRjZmlsZSIgfCBzZWQgJ3N8Xi4qW1xcL118fDsgc3xeW2EtekEtWl06fHw7IHMvXC5jJC8uby8nYAorCisjIENyZWF0ZSB0aGUgbG9jayBkaXJlY3RvcnkuCisjIE5vdGU6IHVzZSBgWy9cXDouLV0nIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWUKKyMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSAubyBmaWxlLiAgQWxzbywgYmFzZSB0aGUgbmFtZSBvbiB0aGUgZXhwZWN0ZWQKKyMgb2JqZWN0IGZpbGUgbmFtZSwgc2luY2UgdGhhdCBpcyB3aGF0IG1hdHRlcnMgd2l0aCBhIHBhcmFsbGVsIGJ1aWxkLgorbG9ja2Rpcj1gZWNobyAiJGNvZmlsZSIgfCBzZWQgLWUgJ3N8Wy9cXDouLV18X3xnJ2AuZAord2hpbGUgdHJ1ZTsgZG8KKyAgaWYgbWtkaXIgIiRsb2NrZGlyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBicmVhaworICBmaQorICBzbGVlcCAxCitkb25lCisjIEZJWE1FOiByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHVzZXIga2lsbHMgYmV0d2VlbiBta2RpciBhbmQgdHJhcC4KK3RyYXAgInJtZGlyICckbG9ja2Rpcic7IGV4aXQgMSIgMSAyIDE1CisKKyMgUnVuIHRoZSBjb21waWxlLgorIiRAIgorcmV0PSQ/CisKK2lmIHRlc3QgLWYgIiRjb2ZpbGUiOyB0aGVuCisgIHRlc3QgIiRjb2ZpbGUiID0gIiRvZmlsZSIgfHwgbXYgIiRjb2ZpbGUiICIkb2ZpbGUiCitlbGlmIHRlc3QgLWYgIiR7Y29maWxlfWJqIjsgdGhlbgorICB0ZXN0ICIke2NvZmlsZX1iaiIgPSAiJG9maWxlIiB8fCBtdiAiJHtjb2ZpbGV9YmoiICIkb2ZpbGUiCitmaQorCitybWRpciAiJGxvY2tkaXIiCitleGl0ICRyZXQKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NvbmZpZy5ndWVzcyBiL2RidXMtMS40LjEwL2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGVhZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsMTUxNyBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorIyAgIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAxMS0wNS0xMScKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gIFBsZWFzZSBzZW5kIHBhdGNoZXMgKGNvbnRleHQKKyMgZGlmZiBmb3JtYXQpIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBhbmQgaW5jbHVkZSBhIENoYW5nZUxvZworIyBlbnRyeS4KKyMKKyMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bworIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKKyMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKKzIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIC1xIF9fRUxGX18KKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJCW9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpPcGVuQlNEOio6KikKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YGFyY2ggfCBzZWQgJ3MvT3BlbkJTRC4vLydgCisJZWNobyAke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6U29saWRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXNvbGlkYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCisJCTs7CisJZXNhYworCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCisJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKKwkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCisJIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCisJQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAorCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KKwkgICAgIkVWNCAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjQuNSAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNSAoMjExNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7CisJICAgICJFVjUuNiAoMjExNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKKwkgICAgIkVWNS42ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7CisJICAgICJFVjUuNyAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OworCSAgICAiRVY2ICgyMTI2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKKwkgICAgIkVWNi43ICgyMTI2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OworCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44QUwgKDIxMjY0QikiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOENYICgyMTI2NEQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7CisJICAgICJFVjcgKDIxMzY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OworCSAgICAiRVY3LjkgKDIxMzY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CisJZXNhYworCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwkjIFJlc2V0IEVYSVQgdHJhcCBiZWZvcmUgZXhpdGluZyB0byBhdm9pZCBzcHVyaW91cyBub24temVybyBleGl0IGNvZGUuCisJZXhpdGNvZGU9JD8KKwl0cmFwICcnIDAKKwlleGl0ICRleGl0Y29kZSA7OworICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAorCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPworCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgOzsKKyAgICAqOk9TLzM5MDoqOiopCisJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgorCWV4aXQgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDs7CisgICAgKjpPUzQwMDoqOiopCisJZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgOzsKKyAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCisJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKKwllY2hvIGFybS11bmtub3duLXJpc2NvcworCWV4aXQgOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCisJIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KKwlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCisJZWxzZQorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBOSUxFKjoqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKKwllY2hvIHNwYXJjLWljbC1ueDYKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQorCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgorCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7CisJZXNhYyA7OworICAgIHMzOTB4OlN1bk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjRIOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgaTg2cGM6QXVyb3JhVVg6NS4qOiogfCBpODZ4ZW46QXVyb3JhVVg6NS4qOiopCisJZWNobyBpMzg2LXBjLWF1cm9yYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KiB8IGk4NnhlbjpTdW5PUzo1Lio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJU1VOX0FSQ0g9ImkzODYiCisJIyBJZiB0aGVyZSBpcyBhIGNvbXBpbGVyLCBzZWUgaWYgaXQgaXMgY29uZmlndXJlZCBmb3IgNjQtYml0IG9iamVjdHMuCisJIyBOb3RlIHRoYXQgdGhlIFN1biBjYyBkb2VzIG5vdCB0dXJuIF9fTFA2NF9fIGludG8gMSBsaWtlIGdjYyBkb2VzLgorCSMgVGhpcyB0ZXN0IHdvcmtzIGZvciBib3RoIGNvbXBpbGVycy4KKwlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkgICAgaWYgKGVjaG8gJyNpZmRlZiBfX2FtZDY0JzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkgICAgdGhlbgorCQlTVU5fQVJDSD0ieDg2XzY0IgorCSAgICBmaQorCWZpCisJZWNobyAke1NVTl9BUkNIfS1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorCWVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisJZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisJIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKwlVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKwlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDU2N10pCisJSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCisJaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCUlCTV9BUkNIPXJzNjAwMAorCWVsc2UKKwkJSUJNX0FSQ0g9cG93ZXJwYworCWZpCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgOzsKKyAgICAqOkFJWDoqOiopCisJZWNobyByczYwMDAtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKKwllY2hvIHJvbXAtaWJtLWJzZDQuNAorCWV4aXQgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAorCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KKwlleGl0IDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworICAgICo6Qk9TWDoqOiopCisJZWNobyByczYwMDAtYnVsbC1ib3N4CisJZXhpdCA7OworICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCisJZWNobyBtNjhrLWJ1bGwtc3lzdjMKKwlleGl0IDs7CisgICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2QKKwlleGl0IDs7CisgICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKKwllY2hvIG02OGstaHAtYnNkNC40CisJZXhpdCA7OworICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKKwkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OworCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKKwkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KKwkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAorCQkgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisJCSAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKwkJICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCisJCSAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorCQkgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKwkJCWNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorCQkJICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisJCQkgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorCQkJZXNhYyA7OworCQkgICAgZXNhYworCQlmaQorCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KKwkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJICAgIHNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCisJCSNkZWZpbmUgX0hQVVhfU09VUkNFCisJCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwkJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisJCWludCBtYWluICgpCisJCXsKKwkJI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorCQkgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOworCQkjZW5kaWYKKwkJICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisKKwkJICAgIHN3aXRjaCAoY3B1KQorCQkJeworCQkJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MyXzA6CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJCSAgICBzd2l0Y2ggKGJpdHMpCisJCQkJeworCQkJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKKwkJCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7CisJCQkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCQkJfSBicmVhazsKKwkJI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KKwkJCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKwkJI2VuZGlmCisJCQlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKwkJCX0KKwkJICAgIGV4aXQgKDApOworCQl9CitFT0YKKwkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCisJCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCisJCWZpIDs7CisJZXNhYworCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQorCXRoZW4KKwkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCisJICAgICMgaHBwYTIuMHctaHAtaHB1eCogaGFzIGEgNjQtYml0IGtlcm5lbCBhbmQgYSBjb21waWxlciBnZW5lcmF0aW5nCisJICAgICMgMzItYml0IGNvZGUuICBocHBhNjQtaHAtaHB1eCogaGFzIHRoZSBzYW1lIGtlcm5lbCBhbmQgYSBjb21waWxlcgorCSAgICAjIGdlbmVyYXRpbmcgNjQtYml0IGNvZGUuICBHTlUgYW5kIEhQIHVzZSBkaWZmZXJlbnQgbm9tZW5jbGF0dXJlOgorCSAgICAjCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9Y2MgLi9jb25maWcuZ3Vlc3MKKwkgICAgIyA9PiBocHBhMi4wdy1ocC1ocHV4MTEuMjMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD0iY2MgK0RBMi4wdyIgLi9jb25maWcuZ3Vlc3MKKwkgICAgIyA9PiBocHBhNjQtaHAtaHB1eDExLjIzCisKKwkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfAorCQlncmVwIC1xIF9fTFA2NF9fCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKKwkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqU1YxOio6KjoqKQorCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgICo6VU5JQ09TL21wOio6KikKKwllY2hvIGNyYXludi1jcmF5LXVuaWNvc21wJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorCUZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisJZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpGcmVlQlNEOio6KikKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgcGM5OCkKKwkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCA7OworICAgICo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6d2luZG93czMyKjoqKQorCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICB4ODYpCisJCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIGF1dGhlbnRpY2FtZCB8IGdlbnVpbmVpbnRlbCB8IEVNNjRUKQorCQllY2hvIHg4Nl82NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgSUE2NCkKKwkJZWNobyBpYTY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCWVzYWMgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDs7CisgICAgODY2NDpXaW5kb3dzX05UOiopCisJZWNobyB4ODZfNjQtcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhbHBoYTpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KKwkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7CisJICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKKwkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7CisJICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKKwkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OworCWVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIC1xIGxkLnNvLjEKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXworCXRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZWxzZQorCSAgICBpZiBlY2hvIF9fQVJNX1BDU19WRlAgfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQl8IGdyZXAgLXEgX19BUk1fUENTX1ZGUAorCSAgICB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmkKKwkgICAgZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpaGYKKwkgICAgZmkKKwlmaQorCWV4aXQgOzsKKyAgICBhdnIzMio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3Jpc3YzMjpMaW51eDoqOiopCisJZWNobyBjcmlzdjMyLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGZydjpMaW51eDoqOiopCisJZWNobyBmcnYtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpMaW51eDoqOiopCisJTElCQz1nbnUKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaWZkZWYgX19kaWV0bGliY19fCisJTElCQz1kaWV0bGliYworCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15MSUJDJ2AKKwllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iCisJZXhpdCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtMzJyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtaXBzOkxpbnV4Oio6KiB8IG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9CisJI3VuZGVmICR7VU5BTUVfTUFDSElORX1lbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPSR7VU5BTUVfTUFDSElORX1lbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9JHtVTkFNRV9NQUNISU5FfQorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15DUFUnYAorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9CisJOzsKKyAgICBvcjMyOkxpbnV4Oio6KikKKwllY2hvIG9yMzItdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcGFkcmU6TGludXg6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcGFyaXNjNjQ6TGludXg6KjoqIHwgaHBwYTY0OkxpbnV4Oio6KikKKwllY2hvIGhwcGE2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OworCWVzYWMKKwlleGl0IDs7CisgICAgcHBjNjQ6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBwYzpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKKwlleGl0IDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdGlsZSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS10aWxlcmEtbGludXgtZ251CisJZXhpdCA7OworICAgIHZheDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4dGVuc2EqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisJIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorCSMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKwkjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorCSMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisJIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKwkjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDs7CisgICAgaTg2MDoqOjQuKjoqKSAjIGk4NjAtU1ZSNAorCWlmIGdyZXAgU3RhcmRlbnQgL3Vzci9pbmNsdWRlL3N5cy91YWRtaW4uaCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICBlY2hvIGk4NjAtc3RhcmRlbnQtc3lzdiR7VU5BTUVfUkVMRUFTRX0gIyBTdGFyZGVudCBWaXN0cmEgaTg2MC1TVlI0CisJZWxzZSAjIEFkZCBvdGhlciBpODYwLVNWUjQgdmVuZG9ycyBiZWxvdyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLgorCSAgZWNobyBpODYwLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0gICMgVW5rbm93biBpODYwLVNWUjQKKwlmaQorCWV4aXQgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKQkjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorCQkJIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorCWVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCQllY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIGkzODYpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJCSAgdGhlbgorCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKKwkJICBmaQorCQlmaSA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBORU8tPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuZW8tdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisJZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKwlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7CisgICAgaSo4NjpBUk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYXJvcworCWV4aXQgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKwkiNCIKKyNlbHNlCisJIiIKKyNlbmRpZgorCSk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NvbmZpZy5oLmluIGIvZGJ1cy0xLjQuMTAvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4MDI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsNDc3IEBACisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworI3VuZGVmIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorCisvKiBwb2xsIGRvZXNuJ3Qgd29yayBvbiBkZXZpY2VzICovCisjdW5kZWYgQlJPS0VOX1BPTEwKKworLyogRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBiaW5hcmllcyAqLworI3VuZGVmIERCVVNfQklORElSCisKKy8qIEJ1aWxkIHRlc3QgY29kZSAqLworI3VuZGVmIERCVVNfQlVJTERfVEVTVFMKKworLyogRGVmaW5lIHRvIGJ1aWxkIFgxMSBmdW5jdGlvbmFsaXR5ICovCisjdW5kZWYgREJVU19CVUlMRF9YMTEKKworLyogd2hldGhlciAtZXhwb3J0LWR5bmFtaWMgd2FzIHBhc3NlZCB0byBsaWJ0b29sICovCisjdW5kZWYgREJVU19CVUlMVF9SX0RZTkFNSUMKKworLyogVXNlIGRub3RpZnkgb24gTGludXggKi8KKyN1bmRlZiBEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWAorCisvKiBVc2UgaW5vdGlmeSAqLworI3VuZGVmIERCVVNfQlVTX0VOQUJMRV9JTk9USUZZCisKKy8qIFVzZSBrcXVldWUgKi8KKyN1bmRlZiBEQlVTX0JVU19FTkFCTEVfS1FVRVVFCisKKy8qIERpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcCAqLworI3VuZGVmIERCVVNfQ09OU09MRV9BVVRIX0RJUgorCisvKiBGaWxlIHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwICovCisjdW5kZWYgREJVU19DT05TT0xFX09XTkVSX0ZJTEUKKworLyogRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBjeWd3aW4gQVBJIGJhc2VkIHN5c3RlbSAqLworI3VuZGVmIERCVVNfQ1lHV0lOCisKKy8qIERpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgREJVUyBkYWVtb24gKi8KKyN1bmRlZiBEQlVTX0RBRU1PTkRJUgorCisvKiBOYW1lIG9mIGV4ZWN1dGFibGUgKi8KKyN1bmRlZiBEQlVTX0RBRU1PTl9OQU1FCisKKy8qIERpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBEQlVTIGRhdGEgZmlsZXMgKi8KKyN1bmRlZiBEQlVTX0RBVEFESVIKKworLyogRGlzYWJsZSBhc3NlcnRpb24gY2hlY2tpbmcgKi8KKyN1bmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisKKy8qIERpc2FibGUgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmcgKi8KKyN1bmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisKKy8qIFVzZSBsYXVuY2hkIGF1dG9sYXVuY2ggKi8KKyN1bmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECisKKy8qIEJ1aWxkIHdpdGggY2FjaGluZyBvZiB1c2VyIGRhdGEgKi8KKyN1bmRlZiBEQlVTX0VOQUJMRV9VU0VSREJfQ0FDSEUKKworLyogU3VwcG9ydCBhIHZlcmJvc2UgbW9kZSAqLworI3VuZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorCisvKiBEZWZpbmUgdG8gZW5hYmxlIFgxMSBhdXRvLWxhdW5jaCAqLworI3VuZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICisKKy8qIERlZmluZWQgaWYgZ2NvdiBpcyBlbmFibGVkIHRvIGZvcmNlIGEgcmVidWlsZCBkdWUgdG8gY29uZmlnLmggY2hhbmdpbmcgKi8KKyN1bmRlZiBEQlVTX0dDT1ZfRU5BQkxFRAorCisvKiBEZWZpbmUgdG8gcHJpbnRmIG1vZGlmaWVyIGZvciA2NCBiaXQgaW50ZWdlciB0eXBlICovCisjdW5kZWYgREJVU19JTlQ2NF9QUklOVEZfTU9ESUZJRVIKKworLyogRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBsaWJleGVjIGJpbmFyaWVzICovCisjdW5kZWYgREJVU19MSUJFWEVDRElSCisKKy8qIFByZWZpeCBmb3IgaW5zdGFsbGluZyBEQlVTICovCisjdW5kZWYgREJVU19QUkVGSVgKKworLyogV2hlcmUgcGVyLXNlc3Npb24gYnVzIHB1dHMgaXRzIHNvY2tldHMgKi8KKyN1bmRlZiBEQlVTX1NFU1NJT05fU09DS0VUX0RJUgorCisvKiBUaGUgZGVmYXVsdCBELUJ1cyBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gYnVzICovCisjdW5kZWYgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUworCisvKiBUaGUgbmFtZSBvZiB0aGUgc29ja2V0IHRoZSBzeXN0ZW0gYnVzIGxpc3RlbnMgb24gYnkgZGVmYXVsdCAqLworI3VuZGVmIERCVVNfU1lTVEVNX1NPQ0tFVAorCisvKiBGdWxsIHBhdGggdG8gdGhlIGxhdW5jaCBoZWxwZXIgdGVzdCBwcm9ncmFtIGluIHRoZSBidWlsZGRpciAqLworI3VuZGVmIERCVVNfVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWQorCisvKiBXaGVyZSB0byBwdXQgdGVzdCBzb2NrZXRzICovCisjdW5kZWYgREJVU19URVNUX1NPQ0tFVF9ESVIKKworLyogRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBVbml4LWJhc2VkIHN5c3RlbSAqLworI3VuZGVmIERCVVNfVU5JWAorCisvKiBVc2VyIGZvciBydW5uaW5nIHRoZSBzeXN0ZW0gQlVTIGRhZW1vbiAqLworI3VuZGVmIERCVVNfVVNFUgorCisvKiBVc2UgdGhlIGdjYyBfX3N5bmMgZXh0ZW5zaW9uICovCisjdW5kZWYgREJVU19VU0VfU1lOQworCisvKiBBICd2YV9jb3B5JyBzdHlsZSBmdW5jdGlvbiAqLworI3VuZGVmIERCVVNfVkFfQ09QWQorCisvKiAndmFfbGlzdHMnIGNhbm5vdCBiZSBjb3BpZXMgYXMgdmFsdWVzICovCisjdW5kZWYgREJVU19WQV9DT1BZX0FTX0FSUkFZCisKKy8qIERlZmluZWQgaWYgd2UgcnVuIG9uIGEgVzMyIEFQSSBiYXNlZCBzeXN0ZW0gKi8KKyN1bmRlZiBEQlVTX1dJTgorCisvKiBEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFczMiBDRSBBUEkgYmFzZWQgc3lzdGVtICovCisjdW5kZWYgREJVU19XSU5DRQorCisvKiBUaGUgbmFtZSBvZiB0aGUgZ2V0dGV4dCBkb21haW4gKi8KKyN1bmRlZiBHRVRURVhUX1BBQ0tBR0UKKworLyogRGlzYWJsZSBHTGliIGFzc2VydGlvbiBtYWNyb3MgKi8KKyN1bmRlZiBHX0RJU0FCTEVfQVNTRVJUCisKKy8qIERpc2FibGUgR0xpYiBwdWJsaWMgQVBJIHNhbml0eSBjaGVja2luZyAqLworI3VuZGVmIEdfRElTQUJMRV9DSEVDS1MKKworLyogSGF2ZSBhYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlICovCisjdW5kZWYgSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWNjZXB0NCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BQ0NFUFQ0CisKKy8qIEFkdCBhdWRpdCBBUEkgKi8KKyN1bmRlZiBIQVZFX0FEVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJhY2t0cmFjZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9CQUNLVFJBQ0UKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxieXRlc3dhcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0JZVEVTV0FQX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjbGVhcmVudicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9DTEVBUkVOVgorCisvKiBIYXZlIGNtc2djcmVkIHN0cnVjdHVyZSAqLworI3VuZGVmIEhBVkVfQ01TR0NSRUQKKworLyogSGF2ZSBjb25zb2xlIG93bmVyIGZpbGUgKi8KKyN1bmRlZiBIQVZFX0NPTlNPTEVfT1dORVJfRklMRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNydF9leHRlcm5zLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ1JUX0VYVEVSTlNfSAorCisvKiBIYXZlIHRoZSBkZGZkIG1lbWJlciBvZiBESVIgKi8KKyN1bmRlZiBIQVZFX0RERkQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBNU0dfTk9TSUdOQUwnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ESVJFTlRfSAorCisvKiBIYXZlIGRpcmZkIGZ1bmN0aW9uICovCisjdW5kZWYgSEFWRV9ESVJGRAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRVJSTk9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGV4ZWNpbmZvLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRVhFQ0lORk9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGV4cGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRVhQQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZwYXRoY29uZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GUEFUSENPTkYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRncm91cGxpc3QnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUR1JPVVBMSVNUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGVlcmVpZCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRQRUVSRUlECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGVlcnVjcmVkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFBFRVJVQ1JFRAorCisvKiBIYXZlIEdOVS1zdHlsZSB2YXJhcmdzIG1hY3JvcyAqLworI3VuZGVmIEhBVkVfR05VQ19WQVJBUkdTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5vdGlmeV9pbml0MScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9JTk9USUZZX0lOSVQxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIEhhdmUgSVNPIEM5OSB2YXJhcmdzIG1hY3JvcyAqLworI3VuZGVmIEhBVkVfSVNPX1ZBUkFSR1MKKworLyogYXVkaXQgZGFlbW9uIFNFTGludXggc3VwcG9ydCAqLworI3VuZGVmIEhBVkVfTElCQVVESVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuc2wnIGxpYnJhcnkgKC1sbnNsKS4gKi8KKyN1bmRlZiBIQVZFX0xJQk5TTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvY2FsZWNvbnYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTE9DQUxFQ09OVgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIGlmIHdlIGhhdmUgQ0xPQ0tfTU9OT1RPTklDICovCisjdW5kZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuYW5vc2xlZXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTkFOT1NMRUVQCisKKy8qIEhhdmUgbm9uLVBPU0lYIGZ1bmN0aW9uIGdldHB3bmFtX3IgKi8KKyN1bmRlZiBIQVZFX05PTlBPU0lYX0dFVFBXTkFNX1IKKworLyogRGVmaW5lIGlmIHlvdXIgc3lzdGVtIG5lZWRzIF9OU0dldEVudmlyb24gdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudCAqLworI3VuZGVmIEhBVkVfTlNHRVRFTlZJUk9OCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGlwZTInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUElQRTIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb2xsJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BPTEwKKworLyogSGF2ZSBQT1NJWCBmdW5jdGlvbiBnZXRwd25hbV9yICovCisjdW5kZWYgSEFWRV9QT1NJWF9HRVRQV05BTV9SCisKKy8qIFNFTGludXggc3VwcG9ydCAqLworI3VuZGVmIEhBVkVfU0VMSU5VWAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGVudicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRsb2NhbGUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFVFJMSU1JVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NJR05BTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc29ja2V0cGFpcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TT0NLRVRQQUlSCisKKy8qIEhhdmUgc29ja2xlbl90IHR5cGUgKi8KKyN1bmRlZiBIQVZFX1NPQ0tMRU5fVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURElOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2xsJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlRPTEwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b3VsbCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT1VMTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pbm90aWZ5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0lOT1RJRllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N5c2xpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TWVNMSU1JVFNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Vpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19VSU9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIFN1cHBvcnRzIHNlbmRpbmcgVU5JWCBmaWxlIGRlc2NyaXB0b3JzICovCisjdW5kZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1bnNldGVudicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VTlNFVEVOVgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVzbGVlcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9VU0xFRVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2YXNwcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVkFTUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1ZTTlBSSU5URgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdyaXRldicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9XUklURVYKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3czJ0Y3BpcC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1dTMlRDUElQX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3c3BpYXBpLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfV1NQSUFQSV9ICisKKy8qIERlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuCisgICAqLworI3VuZGVmIExUX09CSkRJUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIEMgY29tcGlsZXIgZG9lc24ndCBhY2NlcHQgLWMgYW5kIC1vIHRvZ2V0aGVyLiAqLworI3VuZGVmIE5PX01JTlVTX0NfTUlOVVNfTworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBQQUNLQUdFCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX05BTUUKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1VSTAorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfQ0hBUgorCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9JTlQKKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX0xPTkcKKworLyogVGhlIHNpemUgb2YgYGxvbmcgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTE9OR19MT05HCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfU0hPUlQKKworLyogVGhlIHNpemUgb2YgYHZvaWQgKicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfVk9JRF9QCisKKy8qIFRoZSBzaXplIG9mIGBfX2ludDY0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9fX0lOVDY0CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBGdWxsIHBhdGggdG8gdGhlIGRhZW1vbiBpbiB0aGUgYnVpbGRkaXIgKi8KKyN1bmRlZiBURVNUX0JVU19CSU5BUlkKKworLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L3Rlc3QtZXhpdCBpbiBidWlsZGRpciAqLworI3VuZGVmIFRFU1RfRVhJVF9CSU5BUlkKKworLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzIGluIGJ1aWxkZGlyICovCisjdW5kZWYgVEVTVF9JTlZBTElEX1NFUlZJQ0VfRElSCisKKy8qIEZ1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0gaW4gYnVpbGRkaXIKKyAgICovCisjdW5kZWYgVEVTVF9JTlZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUgorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlciBpbiBidWlsZGRpciAqLworI3VuZGVmIFRFU1RfUFJJVlNFUlZFUl9CSU5BUlkKKworLyogRnVsbCBwYXRoIHRvIHRlc3QgZmlsZSB0ZXN0L3Rlc3Qtc2VnZmF1bHQgaW4gYnVpbGRkaXIgKi8KKyN1bmRlZiBURVNUX1NFR0ZBVUxUX0JJTkFSWQorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1zZXJ2aWNlIGluIGJ1aWxkZGlyICovCisjdW5kZWYgVEVTVF9TRVJWSUNFX0JJTkFSWQorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlIGluIGJ1aWxkZGlyICovCisjdW5kZWYgVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWQorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvdGVzdC1zbGVlcC1mb3JldmVyIGluIGJ1aWxkZGlyICovCisjdW5kZWYgVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWQorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzIGluIGJ1aWxkZGlyICovCisjdW5kZWYgVEVTVF9WQUxJRF9TRVJWSUNFX0RJUgorCisvKiBGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbSBpbiBidWlsZGRpciAqLworI3VuZGVmIFRFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSCisKKy8qIEVuYWJsZSBleHRlbnNpb25zIG9uIEFJWCAzLCBJbnRlcml4LiAgKi8KKyNpZm5kZWYgX0FMTF9TT1VSQ0UKKyMgdW5kZWYgX0FMTF9TT1VSQ0UKKyNlbmRpZgorLyogRW5hYmxlIEdOVSBleHRlbnNpb25zIG9uIHN5c3RlbXMgdGhhdCBoYXZlIHRoZW0uICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyB1bmRlZiBfR05VX1NPVVJDRQorI2VuZGlmCisvKiBFbmFibGUgdGhyZWFkaW5nIGV4dGVuc2lvbnMgb24gU29sYXJpcy4gICovCisjaWZuZGVmIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUworIyB1bmRlZiBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MKKyNlbmRpZgorLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gSFAgTm9uU3RvcC4gICovCisjaWZuZGVmIF9UQU5ERU1fU09VUkNFCisjIHVuZGVmIF9UQU5ERU1fU09VUkNFCisjZW5kaWYKKy8qIEVuYWJsZSBnZW5lcmFsIGV4dGVuc2lvbnMgb24gU29sYXJpcy4gICovCisjaWZuZGVmIF9fRVhURU5TSU9OU19fCisjIHVuZGVmIF9fRVhURU5TSU9OU19fCisjZW5kaWYKKworCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjdW5kZWYgVkVSU0lPTgorCisvKiBEZWZpbmUgV09SRFNfQklHRU5ESUFOIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwpLiAqLworI2lmIGRlZmluZWQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECisjIGlmIGRlZmluZWQgX19CSUdfRU5ESUFOX18KKyMgIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIFdPUkRTX0JJR0VORElBTgorIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOCisjIGVuZGlmCisjZW5kaWYKKworCisJCQkvKiBVc2UgdGhlIGNvbXBpbGVyLXByb3ZpZGVkIGVuZGlhbm5lc3MgZGVmaW5lcyB0byBhbGxvdyB1bml2ZXJzYWwgY29tcGlsaW5nLiAqLworCQkJI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisJCQkjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisJCQkjZW5kaWYKKwkJCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBYIFdpbmRvdyBTeXN0ZW0gaXMgbWlzc2luZyBvciBub3QgYmVpbmcgdXNlZC4gKi8KKyN1bmRlZiBYX0RJU1BMQVlfTUlTU0lORworCisKKyNpZiBkZWZpbmVkKEhBVkVfTlNHRVRFTlZJUk9OKSAmJiBkZWZpbmVkKEhBVkVfQ1JUX0VYVEVSTlNfSCkKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisjZW5kaWYKKworCisvKiBEZWZpbmUgdG8gMSBpZiBvbiBNSU5JWC4gKi8KKyN1bmRlZiBfTUlOSVgKKworLyogRGVmaW5lIHRvIDIgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIFBPU0lYLjEgZmVhdHVyZXMgZXhjZXB0IHdpdGgKKyAgIHRoaXMgZGVmaW5lZC4gKi8KKyN1bmRlZiBfUE9TSVhfMV9TT1VSQ0UKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIGBzdGF0JyBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmVkIHRvIGdldCBuZXdlciBXMzIgQ0UgQVBJcyAqLworI3VuZGVmIF9XSU4zMl9XQ0UKKworLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCisgICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyN1bmRlZiBpbmxpbmUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvY29uZmlnLnN1YiBiL2RidXMtMS40LjEwL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzBmZGNhOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNzYwIEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKyMgICAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMTEtMDMtMjMnCisKKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIEdOVSBDaGFuZ2VMb2cgZW50cnkuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKKzIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDs7CisKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2Nhc2UgJCMgaW4KKyAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKKyAxKSA7OworICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICAgIGV4aXQgMTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWFuZHJvaWQqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgXAorICBsaW51eC11Y2xpYmMqIHwgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBcCisgIGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBcCisgIGtvcGVuc29sYXJpcyotZ251KiB8IFwKKyAgc3Rvcm0tY2hhb3MqIHwgb3MyLWVteCogfCBydG1rLW5vdmEqKQorICAgIG9zPS0kbWF5YmVfb3MKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1ibHVlZ2VuZSopCisJCW9zPS1jbmsKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c3JkYikKKwkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisJfCBiZmluIFwKKwl8IGM0eCB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbG0zMiBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCB8IG1ldGFnIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NG9jdGVvbiB8IG1pcHM2NG9jdGVvbmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjRyNTkwMCB8IG1pcHM2NHI1OTAwZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmRzMzIgfCBuZHMzMmxlIHwgbmRzMzJiZSBcCisJfCBuaW9zIHwgbmlvczIgXAorCXwgbnMxNmsgfCBuczMyayBcCisJfCBvcGVuOCBcCisJfCBvcjMyIFwKKwl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCisJfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgXAorCXwgcHlyYW1pZCBcCisJfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IFwKKwl8IHRhaG9lIHwgdGljNHggfCB0aWM1NHggfCB0aWM1NXggfCB0aWM2eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB1Ymljb20zMiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwljNTR4KQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCTs7CisJYzU1eCkKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQk7OworCWM2eCkKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCTs7CisJbTY4MTEgfCBtNjhoYzExIHwgbTY4MTIgfCBtNjhoYzEyIHwgcGljb2NoaXApCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKwltczEpCisJCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgorCQk7OworCisJc3Ryb25nYXJtIHwgdGh1bWIgfCB4c2NhbGUpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJOzsKKworCXhzY2FsZWViKQorCQliYXNpY19tYWNoaW5lPWFybWViLXVua25vd24KKwkJOzsKKworCXhzY2FsZWVsKQorCQliYXNpY19tYWNoaW5lPWFybWVsLXVua25vd24KKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogfCBhdnIzMi0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbG0zMi0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIHwgbWljcm9ibGF6ZS0qIFwKKwl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKKwl8IG1pcHMxNi0qIFwKKwl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCisJfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKKwl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCisJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCisJfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbW1peC0qIFwKKwl8IG10LSogXAorCXwgbXNwNDMwLSogXAorCXwgbmRzMzItKiB8IG5kczMybGUtKiB8IG5kczMyYmUtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3BlbjgtKiBcCisJfCBvcmlvbi0qIFwKKwl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAorCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJvbXAtKiB8IHJzNjAwMC0qIHwgcngtKiBcCisJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzI0XWFlYi0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKKwl8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIFwKKwl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIFwKKwl8IHRpbGUtKiB8IHRpbGVneC0qIFwKKwl8IHRyb24tKiBcCisJfCB1Ymljb20zMi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EqLSogXAorCXwgeW1wLSogXAorCXwgejhrLSogfCB6ODAtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXJvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1hcm9zCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwlibGFja2ZpbikKKwkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJYmxhY2tmaW4tKikKKwkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCWJsdWVnZW5lKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tY25rCisJCTs7CisJYzU0eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM1NXgtKikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwljNngtKikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY2VnY2MpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LWNlZ2NjCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTYgfCBjcjE2LSopCisJCWJhc2ljX21hY2hpbmU9Y3IxNi11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRpY29zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LWRpY29zCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pY3JvYmxhemUpCisJCWJhc2ljX21hY2hpbmU9bWljcm9ibGF6ZS14aWxpbngKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5ndzMyY2UpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LW1pbmd3MzJjZQorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW1zMS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW5lby10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bmVvLXRhbmRlbQorCQk7OworCW5zZS10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNlLXRhbmRlbQorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcGVucmlzYyB8IG9wZW5yaXNjLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCTs7CisJb3M0MDApCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LW9zNDAwCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGFyaXNjKQorCQliYXNpY19tYWNoaW5lPWhwcGEtdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlwYXJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKwlwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwYzk4KQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJOzsKKwlwYzk4LSopCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bTQpCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtNC0qKQorCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQorCQk7OworCXBwYyB8IHBwY2JlKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qIHwgcHBjYmUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkJOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCisJCTs7CisJcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KKwkJOzsKKwlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcmRvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNkZSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCisJCW9zPS1lbGYKKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDVlbCkKKwkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN0cm9uZ2FybS0qIHwgdGh1bWItKikKKwkJYmFzaWNfbWFjaGluZT1hcm0tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwkjIFRoaXMgbXVzdCBiZSBtYXRjaGVkIGJlZm9yZSB0aWxlKi4KKwl0aWxlZ3gqKQorCQliYXNpY19tYWNoaW5lPXRpbGVneC11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0aWxlKikKKwkJYmFzaWNfbWFjaGluZT10aWxlLXVua25vd24KKwkJb3M9LWxpbnV4LWdudQorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b2FkMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKKwkJb3M9LXRvcHMyMAorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl0cGYpCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCW9zPS10cGYKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKwkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKwkJOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXc2NSopCisJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworCQlvcz0tbm9uZQorCQk7OworCXc4OWstKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJb3M9LXByb2VsZgorCQk7OworCXhib3gpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCXhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJeHNjYWxlLSogfCB4c2NhbGVlW2JsXS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL154c2NhbGUvYXJtLydgCisJCTs7CisJeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwl6ODAtKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4MC11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCW1taXgpCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKwkjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworCSMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLWF1cm9yYXV4KQorCQlvcz0tYXVyb3JhdXgKKwkJOzsKKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLWNuayogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLWF1cm9yYXV4KiB8IC1zb2xhcmlzKiBcCisJICAgICAgfCAtc3ltKiB8IC1rb3BlbnNvbGFyaXMqIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIHwgLWFyb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKKwkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogfCAtY2VnY2MqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1hbmRyb2lkKiBcCisJICAgICAgfCAtbGludXgtbmV3bGliKiB8IC1saW51eC11Y2xpYmMqIFwKKwkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKKwkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKiB8IC1lcyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKwktb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwkta2FvcyopCisJCW9zPS1rYW9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktZGljb3MqKQorCQlvcz0tZGljb3MKKwkJOzsKKwktbmFjbCopCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwlzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisJc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworCWM0eC0qIHwgdGljNHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM2eC0qKQorCQlvcz0tY29mZgorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLWtudXRoKQorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWNuayp8LWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9jb25maWd1cmUgYi9kYnVzLTEuNC4xMC9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjNkYjYyNgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDI0NDE4IEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OCBmb3IgZGJ1cyAxLjQuMTAuCisjCisjIFJlcG9ydCBidWdzIHRvIDxodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1kYnVzPi4KKyMKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorIyAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLgorIworIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgorICBhc19ib3VybmVfY29tcGF0aWJsZT0iaWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKyIKKyAgYXNfcmVxdWlyZWQ9ImFzX2ZuX3JldHVybiAoKSB7IChleGl0IFwkMSk7IH0KK2FzX2ZuX3N1Y2Nlc3MgKCkgeyBhc19mbl9yZXR1cm4gMDsgfQorYXNfZm5fZmFpbHVyZSAoKSB7IGFzX2ZuX3JldHVybiAxOyB9Cithc19mbl9yZXRfc3VjY2VzcyAoKSB7IHJldHVybiAwOyB9Cithc19mbl9yZXRfZmFpbHVyZSAoKSB7IHJldHVybiAxOyB9CisKK2V4aXRjb2RlPTAKK2FzX2ZuX3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fZmFpbHVyZSBzdWNjZWVkZWQuOyB9Cithc19mbl9yZXRfc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X3N1Y2Nlc3MgZmFpbGVkLjsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2lmICggc2V0IHg7IGFzX2ZuX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuIDoKKworZWxzZQorICBleGl0Y29kZT0xOyBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCit0ZXN0IHhcJGV4aXRjb2RlID0geDAgfHwgZXhpdCAxIgorICBhc19zdWdnZXN0ZWQ9IiAgYXNfbGluZW5vXzE9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18xYT1cJExJTkVOTworICBhc19saW5lbm9fMj0iO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkJExJTkVOTzthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCIgYXNfbGluZW5vXzJhPVwkTElORU5PCisgIGV2YWwgJ3Rlc3QgXCJ4XCRhc19saW5lbm9fMSdcJGFzX3J1bidcIiAhPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiICYmCisgIHRlc3QgXCJ4XGBleHByIFwkYXNfbGluZW5vXzEnXCRhc19ydW4nICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yJ1wkYXNfcnVuJ1wiJyB8fCBleGl0IDEKK3Rlc3QgXCQoKCAxICsgMSApKSA9IDIgfHwgZXhpdCAxCisKKyAgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cJHtCQVNIX1ZFUlNJT04rc2V0fVwiIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKyAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITworICAgIEVDSE89XCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgXCJYXGBwcmludGYgJXMgXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiIFxcCisgICAgICB8fCB0ZXN0IFwiWFxgcHJpbnQgLXIgLS0gXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiICkgfHwgZXhpdCAxIgorICBpZiAoZXZhbCAiJGFzX3JlcXVpcmVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBhc19oYXZlX3JlcXVpcmVkPXllcworZWxzZQorICBhc19oYXZlX3JlcXVpcmVkPW5vCitmaQorICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHh5ZXMgJiYgKGV2YWwgIiRhc19zdWdnZXN0ZWQiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorYXNfZm91bmQ9ZmFsc2UKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgYXNfZm91bmQ9OgorICBjYXNlICRhc19kaXIgaW4gIygKKwkgLyopCisJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSAgICAgYXNfc2hlbGw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCisJCSAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkJICAgaWYgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfc3VnZ2VzdGVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYnJlYWsgMgorZmkKK2ZpCisJICAgZG9uZTs7CisgICAgICAgZXNhYworICBhc19mb3VuZD1mYWxzZQorZG9uZQorJGFzX2ZvdW5kIHx8IHsgaWYgeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCisJICAgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRTSEVMTCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitmaTsgfQorSUZTPSRhc19zYXZlX0lGUworCisKKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKKyAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKKwkjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworCSMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisJIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgorCUJBU0hfRU5WPS9kZXYvbnVsbAorCUVOVj0vZGV2L251bGwKKwkodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJY2FzZSAkLSBpbiAjICgoKCgKKwkgICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OworCSAgKnYqICkgYXNfb3B0cz0tdiA7OworCSAgKngqICkgYXNfb3B0cz0teCA7OworCSAgKiApIGFzX29wdHM9IDs7CisJZXNhYworCWV4ZWMgIiRDT05GSUdfU0hFTEwiICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KK2ZpCisKKyAgICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHhubzsgdGhlbiA6CisgICRhc19lY2hvICIkMDogVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCIKKyAgJGFzX2VjaG8gIiQwOiB0aGUgc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4iCisgIGlmIHRlc3QgeCR7WlNIX1ZFUlNJT04rc2V0fSA9IHhzZXQgOyB0aGVuCisgICAgJGFzX2VjaG8gIiQwOiBJbiBwYXJ0aWN1bGFyLCB6c2ggJFpTSF9WRVJTSU9OIGhhcyBidWdzIGFuZCBzaG91bGQiCisgICAgJGFzX2VjaG8gIiQwOiBiZSB1cGdyYWRlZCB0byB6c2ggNC4zLjQgb3IgbGF0ZXIuIgorICBlbHNlCisgICAgJGFzX2VjaG8gIiQwOiBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhbmQKKyQwOiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1kYnVzCiskMDogYWJvdXQgeW91ciBzeXN0ZW0sIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0CiskMDogYmVmb3JlIHRoaXMgbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvcgorJDA6IG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8KKyQwOiBoYXZlIG9uZS4iCisgIGZpCisgIGV4aXQgMQorZmkKK2ZpCitmaQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KK2V4cG9ydCBTSEVMTAorIyBVbnNldCBtb3JlIHZhcmlhYmxlcyBrbm93biB0byBpbnRlcmZlcmUgd2l0aCBiZWhhdmlvciBvZiBjb21tb24gdG9vbHMuCitDTElDT0xPUl9GT1JDRT0gR1JFUF9PUFRJT05TPQordW5zZXQgQ0xJQ09MT1JfRk9SQ0UgR1JFUF9PUFRJT05TCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBTaGVsbCBGdW5jdGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl9ta2Rpcl9wCisjIC0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCisjIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCisjIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKKyMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKKyMgaW1wbGVtZW50YXRpb25zLgoraWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDErPVwkMgorICB9JworZWxzZQorICBhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDE9XCQkMVwkMgorICB9CitmaSAjIGFzX2ZuX2FwcGVuZAorCisjIGFzX2ZuX2FyaXRoIEFSRy4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQorIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCisjIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgoraWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9JCgoICQqICkpCisgIH0nCitlbHNlCisgIGFzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAorICB9CitmaSAjIGFzX2ZuX2FyaXRoCisKKworIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTyBhc19saW5lbm9fMWE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PIGFzX2xpbmVub18yYT0kTElORU5PCisgIGV2YWwgJ3Rlc3QgIngkYXNfbGluZW5vXzEnJGFzX3J1biciICE9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIiAmJgorICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xJyRhc19ydW4nICsgMWAiID0gIngkYXNfbGluZW5vXzInJGFzX3J1biciJyB8fCB7CisgICMgQmxhbWUgTGVlIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBzZWQgLW4gJworICAgIHAKKyAgICAvWyRdTElORU5PLz0KKyAgJyA8JGFzX215c2VsZiB8CisgICAgc2VkICcKKyAgICAgIHMvWyRdTElORU5PLiovJi0vCisgICAgICB0IGxpbmVubworICAgICAgYgorICAgICAgOmxpbmVubworICAgICAgTgorICAgICAgOmxvb3AKKyAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLworICAgICAgdCBsb29wCisgICAgICBzLy1cbi4qLy8KKyAgICAnID4kYXNfbWUubGluZW5vICYmCisgIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAorICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjI7IGFzX2ZuX2V4aXQgMTsgfQorCisgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgorICAuICIuLyRhc19tZS5saW5lbm8iCisgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorICBleGl0Cit9CisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluICMoKCgoKAorLW4qKQorICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgIHh5KSAgRUNIT19DPSdcYyc7OworICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCisgICAgICAgRUNIT19UPScJJzs7CisgIGVzYWM7OworKikKKyAgRUNIT19OPSctbic7OworZXNhYworCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCitmaQoraWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPSdsbiAtcycKKyAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgICBhc19sbl9zPSdjcCAtcCcKKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPWxuCisgIGVsc2UKKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgZmkKK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc190ZXN0X3g9J3Rlc3QgLXgnCitlbHNlCisgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGFzX2xzX0xfb3B0aW9uPUwKKyAgZWxzZQorICAgIGFzX2xzX0xfb3B0aW9uPQorICBmaQorICBhc190ZXN0X3g9JworICAgIGV2YWwgc2ggLWMgJ1wnJworICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCisJdGVzdCAtZCAiJDEvLiI7CisgICAgICBlbHNlCisJY2FzZSAkMSBpbiAjKAorCS0qKXNldCAiLi8kMSI7OworCWVzYWM7CisJY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4gIygoCisJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorICAgICdcJycgc2gKKyAgJworZmkKK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworCit0ZXN0IC1uICIkREpESVIiIHx8IGV4ZWMgNzwmMCA8L2Rldi9udWxsCitleGVjIDY+JjEKKworIyBOYW1lIG9mIHRoZSBob3N0LgorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgb2xkIEdOVS9MaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAorIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCithY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKworIworIyBJbml0aWFsaXphdGlvbnMuCisjCithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCithY19jbGVhbl9maWxlcz0KK2FjX2NvbmZpZ19saWJvYmpfZGlyPS4KK0xJQk9CSlM9Citjcm9zc19jb21waWxpbmc9bm8KK3N1YmRpcnM9CitNRkxBR1M9CitNQUtFRkxBR1M9CisKKyMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgorUEFDS0FHRV9OQU1FPSdkYnVzJworUEFDS0FHRV9UQVJOQU1FPSdkYnVzJworUEFDS0FHRV9WRVJTSU9OPScxLjQuMTAnCitQQUNLQUdFX1NUUklORz0nZGJ1cyAxLjQuMTAnCitQQUNLQUdFX0JVR1JFUE9SVD0naHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9ZGJ1cycKK1BBQ0tBR0VfVVJMPScnCisKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworYWNfc3Vic3RfdmFycz0nYW1fX0VYRUVYVF9GQUxTRQorYW1fX0VYRUVYVF9UUlVFCitMVExJQk9CSlMKK0xJQk9CSlMKK0RCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTCitEQlVTX1NFU1NJT05fU09DS0VUX0RJUgorVEVTVF9TT0NLRVRfRElSCitURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZCitURVNUX0JVU19CSU5BUlkKK1RFU1RfUFJJVlNFUlZFUl9CSU5BUlkKK1RFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkKK1RFU1RfU0VHRkFVTFRfQklOQVJZCitURVNUX0VYSVRfQklOQVJZCitURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZCitURVNUX1NFUlZJQ0VfQklOQVJZCitURVNUX0lOVkFMSURfU0VSVklDRV9TWVNURU1fRElSCitURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUgorVEVTVF9JTlZBTElEX1NFUlZJQ0VfRElSCitURVNUX1ZBTElEX1NFUlZJQ0VfRElSCitEQlVTX0xJQkVYRUNESVIKK0RCVVNfQklORElSCitEQlVTX0RBRU1PTkRJUgorREJVU19EQVRBRElSCitEQlVTX1BSRUZJWAorREJVU19VU0VSCitEQlVTX0NPTlNPTEVfT1dORVJfRklMRQorREJVU19DT05TT0xFX0FVVEhfRElSCitEQlVTX1NZU1RFTV9QSURfRklMRQorREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUworREJVU19TWVNURU1fU09DS0VUCitIQVZFX1NZU1RFTURfRkFMU0UKK0hBVkVfU1lTVEVNRF9UUlVFCitzeXN0ZW1kc3lzdGVtdW5pdGRpcgorREJVU19JTklUX1NDUklQVFNfQ1lHV0lOX0ZBTFNFCitEQlVTX0lOSVRfU0NSSVBUU19DWUdXSU5fVFJVRQorREJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFX0ZBTFNFCitEQlVTX0lOSVRfU0NSSVBUU19TTEFDS1dBUkVfVFJVRQorREJVU19JTklUX1NDUklQVFNfUkVEX0hBVF9GQUxTRQorREJVU19JTklUX1NDUklQVFNfUkVEX0hBVF9UUlVFCitFWFBBTkRFRF9EQVRBRElSCitFWFBBTkRFRF9MSUJFWEVDRElSCitFWFBBTkRFRF9MSUJESVIKK0VYUEFOREVEX0JJTkRJUgorRVhQQU5ERURfU1lTQ09ORkRJUgorRVhQQU5ERURfTE9DQUxTVEFURURJUgorRVhQQU5ERURfUFJFRklYCitEQlVTX0NBTl9VUExPQURfRE9DU19GQUxTRQorREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRQorREJVU19IQVZFX01BTjJIVE1MX0ZBTFNFCitEQlVTX0hBVkVfTUFOMkhUTUxfVFJVRQorTUFOMkhUTUwKK0RCVVNfWE1MX0RPQ1NfRU5BQkxFRF9GQUxTRQorREJVU19YTUxfRE9DU19FTkFCTEVEX1RSVUUKK1hNTFRPCitEQlVTX0hBVkVfWFNMVFBST0NfRkFMU0UKK0RCVVNfSEFWRV9YU0xUUFJPQ19UUlVFCitYU0xUUFJPQworREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9GQUxTRQorREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFCitET1hZR0VOCitTRUNUSU9OX0xERkxBR1MKK0RCVVNfWF9MSUJTCitEQlVTX1hfQ0ZMQUdTCitYX0VYVFJBX0xJQlMKK1hfTElCUworWF9QUkVfTElCUworWF9DRkxBR1MKK1hNS01GCitEQlVTX1RFU1RfTElCUworREJVU19URVNUX0NGTEFHUworREJVU19MQVVOQ0hFUl9MSUJTCitEQlVTX0xBVU5DSEVSX0NGTEFHUworREJVU19CVVNfTElCUworREJVU19CVVNfQ0ZMQUdTCitEQlVTX0NMSUVOVF9MSUJTCitEQlVTX0NMSUVOVF9DRkxBR1MKK0hBVkVfTElCQVVESVRfRkFMU0UKK0hBVkVfTElCQVVESVRfVFJVRQorSEFWRV9DT05TT0xFX09XTkVSX0ZJTEVfRkFMU0UKK0hBVkVfQ09OU09MRV9PV05FUl9GSUxFX1RSVUUKK0xBVU5DSERfQUdFTlRfRElSCitEQlVTX0VOQUJMRV9MQVVOQ0hEX0ZBTFNFCitEQlVTX0VOQUJMRV9MQVVOQ0hEX1RSVUUKK0xBVU5DSENUTAorREJVU19CVVNfRU5BQkxFX0tRVUVVRV9GQUxTRQorREJVU19CVVNfRU5BQkxFX0tRVUVVRV9UUlVFCitEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWF9GQUxTRQorREJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVhfVFJVRQorREJVU19CVVNfRU5BQkxFX0lOT1RJRllfRkFMU0UKK0RCVVNfQlVTX0VOQUJMRV9JTk9USUZZX1RSVUUKK0hBVkVfU0VMSU5VWF9GQUxTRQorSEFWRV9TRUxJTlVYX1RSVUUKK0RCVVNfVVNFX0xJQlhNTF9GQUxTRQorREJVU19VU0VfTElCWE1MX1RSVUUKK0RCVVNfVVNFX0VYUEFUX0ZBTFNFCitEQlVTX1VTRV9FWFBBVF9UUlVFCitMSUJYTUxfTElCUworTElCWE1MX0NGTEFHUworUEtHX0NPTkZJRworREJVU19QQVRIX09SX0FCU1RSQUNUCitEQlVTX0lOVDE2X1RZUEUKK0RCVVNfSU5UMzJfVFlQRQorREJVU19IQVZFX0lOVDY0CitEQlVTX1VJTlQ2NF9DT05TVEFOVAorREJVU19JTlQ2NF9DT05TVEFOVAorREJVU19JTlQ2NF9UWVBFCitSX0RZTkFNSUNfTERGTEFHCitEQlVTX0JVSUxEX1RFU1RTX0ZBTFNFCitEQlVTX0JVSUxEX1RFU1RTX1RSVUUKK0RCVVNfQ1lHV0lOX0ZBTFNFCitEQlVTX0NZR1dJTl9UUlVFCitEQlVTX1VOSVhfRkFMU0UKK0RCVVNfVU5JWF9UUlVFCitEQlVTX1dJTkNFX0ZBTFNFCitEQlVTX1dJTkNFX1RSVUUKK0RCVVNfV0lOX0ZBTFNFCitEQlVTX1dJTl9UUlVFCitXSU5EUkVTCitCVUlMRF9GSUxFVkVSU0lPTgorQlVJTERfVElNRVNUQU1QCitSQworQ1hYQ1BQCitPVE9PTDY0CitPVE9PTAorTElQTworTk1FRElUCitEU1lNVVRJTAorTUFOSUZFU1RfVE9PTAorUkFOTElCCithY19jdF9BUgorQVIKK0RMTFRPT0wKK09CSkRVTVAKK0xOX1MKK05NCithY19jdF9EVU1QQklOCitEVU1QQklOCitMRAorRkdSRVAKK1NFRAorTElCVE9PTAorRUdSRVAKK0dSRVAKK0NQUAorYW1fX2Zhc3RkZXBDWFhfRkFMU0UKK2FtX19mYXN0ZGVwQ1hYX1RSVUUKK0NYWERFUE1PREUKK2FjX2N0X0NYWAorQ1hYRkxBR1MKK0NYWAorYW1fX2Zhc3RkZXBDQ19GQUxTRQorYW1fX2Zhc3RkZXBDQ19UUlVFCitDQ0RFUE1PREUKK0FNREVQQkFDS1NMQVNICitBTURFUF9GQUxTRQorQU1ERVBfVFJVRQorYW1fX3F1b3RlCithbV9faW5jbHVkZQorREVQRElSCitPQkpFWFQKK0VYRUVYVAorYWNfY3RfQ0MKK0NQUEZMQUdTCitMREZMQUdTCitDRkxBR1MKK0NDCitEQlVTX1ZFUlNJT04KK0RCVVNfTUlDUk9fVkVSU0lPTgorREJVU19NSU5PUl9WRVJTSU9OCitEQlVTX01BSk9SX1ZFUlNJT04KK0xUX0FHRQorTFRfUkVWSVNJT04KK0xUX0NVUlJFTlQKK0FNX0JBQ0tTTEFTSAorQU1fREVGQVVMVF9WRVJCT1NJVFkKK01BSU5UCitNQUlOVEFJTkVSX01PREVfRkFMU0UKK01BSU5UQUlORVJfTU9ERV9UUlVFCitHRVRURVhUX1BBQ0tBR0UKK2FtX191bnRhcgorYW1fX3RhcgorQU1UQVIKK2FtX19sZWFkaW5nX2RvdAorU0VUX01BS0UKK0FXSworbWtkaXJfcAorTUtESVJfUAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNCitTVFJJUAoraW5zdGFsbF9zaAorTUFLRUlORk8KK0FVVE9IRUFERVIKK0FVVE9NQUtFCitBVVRPQ09ORgorQUNMT0NBTAorVkVSU0lPTgorUEFDS0FHRQorQ1lHUEFUSF9XCithbV9faXNyYworSU5TVEFMTF9EQVRBCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9QUk9HUkFNCitob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK3RhcmdldF9hbGlhcworaG9zdF9hbGlhcworYnVpbGRfYWxpYXMKK0xJQlMKK0VDSE9fVAorRUNIT19OCitFQ0hPX0MKK0RFRlMKK21hbmRpcgorbG9jYWxlZGlyCitsaWJkaXIKK3BzZGlyCitwZGZkaXIKK2R2aWRpcgoraHRtbGRpcgoraW5mb2RpcgorZG9jZGlyCitvbGRpbmNsdWRlZGlyCitpbmNsdWRlZGlyCitsb2NhbHN0YXRlZGlyCitzaGFyZWRzdGF0ZWRpcgorc3lzY29uZmRpcgorZGF0YWRpcgorZGF0YXJvb3RkaXIKK2xpYmV4ZWNkaXIKK3NiaW5kaXIKK2JpbmRpcgorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorcHJlZml4CitleGVjX3ByZWZpeAorUEFDS0FHRV9VUkwKK1BBQ0tBR0VfQlVHUkVQT1JUCitQQUNLQUdFX1NUUklORworUEFDS0FHRV9WRVJTSU9OCitQQUNLQUdFX1RBUk5BTUUKK1BBQ0tBR0VfTkFNRQorUEFUSF9TRVBBUkFUT1IKK1NIRUxMJworYWNfc3Vic3RfZmlsZXM9JycKK2FjX3VzZXJfb3B0cz0nCitlbmFibGVfb3B0aW9uX2NoZWNraW5nCitlbmFibGVfbWFpbnRhaW5lcl9tb2RlCitlbmFibGVfc2lsZW50X3J1bGVzCitlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZworZW5hYmxlX3NoYXJlZAorZW5hYmxlX3N0YXRpYword2l0aF9waWMKK2VuYWJsZV9mYXN0X2luc3RhbGwKK3dpdGhfZ251X2xkCit3aXRoX3N5c3Jvb3QKK2VuYWJsZV9saWJ0b29sX2xvY2sKK2VuYWJsZV9jb21waWxlcl9jb3ZlcmFnZQorZW5hYmxlX2NvbXBpbGVyX29wdGltaXNhdGlvbnMKK2VuYWJsZV90ZXN0cworZW5hYmxlX2Fuc2kKK2VuYWJsZV92ZXJib3NlX21vZGUKK2VuYWJsZV9hc3NlcnRzCitlbmFibGVfY2hlY2tzCitlbmFibGVfeG1sX2RvY3MKK2VuYWJsZV9kb3h5Z2VuX2RvY3MKK2VuYWJsZV9hYnN0cmFjdF9zb2NrZXRzCitlbmFibGVfc2VsaW51eAorZW5hYmxlX2xpYmF1ZGl0CitlbmFibGVfZG5vdGlmeQorZW5hYmxlX2lub3RpZnkKK2VuYWJsZV9rcXVldWUKK2VuYWJsZV9jb25zb2xlX293bmVyX2ZpbGUKK2VuYWJsZV91c2VyZGJfY2FjaGUKK2VuYWJsZV9sYXVuY2hkCit3aXRoX3htbAord2l0aF9pbml0X3NjcmlwdHMKK3dpdGhfc2Vzc2lvbl9zb2NrZXRfZGlyCit3aXRoX3Rlc3Rfc29ja2V0X2Rpcgord2l0aF9zeXN0ZW1fcGlkX2ZpbGUKK3dpdGhfc3lzdGVtX3NvY2tldAord2l0aF9jb25zb2xlX2F1dGhfZGlyCit3aXRoX2NvbnNvbGVfb3duZXJfZmlsZQord2l0aF9sYXVuY2hkX2FnZW50X2Rpcgord2l0aF9kYnVzX3VzZXIKK3dpdGhfZGJ1c19kYWVtb25kaXIKK2VuYWJsZV94MTFfYXV0b2xhdW5jaAord2l0aF94CitlbmFibGVfV2Vycm9yCitlbmFibGVfZ2Nfc2VjdGlvbnMKK3dpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIKK3dpdGhfZGJ1c190ZXN0X2RpcgorJworICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworQ0MKK0NGTEFHUworTERGTEFHUworTElCUworQ1BQRkxBR1MKK0NYWAorQ1hYRkxBR1MKK0NDQworQ1BQCitDWFhDUFAKK1BLR19DT05GSUcKK0xJQlhNTF9DRkxBR1MKK0xJQlhNTF9MSUJTCitYTUtNRgorTUFOMkhUTUwnCisKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCithY191bnJlY29nbml6ZWRfb3B0cz0KK2FjX3VucmVjb2duaXplZF9zZXA9CisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2RvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCitodG1sZGlyPScke2RvY2Rpcn0nCitkdmlkaXI9JyR7ZG9jZGlyfScKK3BkZmRpcj0nJHtkb2NkaXJ9JworcHNkaXI9JyR7ZG9jZGlyfScKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCittYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKworYWNfcHJldj0KK2FjX2Rhc2hkYXNoPQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisgICo9KSAgIGFjX29wdGFyZz0gOzsKKyAgKikgICAgYWNfb3B0YXJnPXllcyA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisgIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQorICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQorICAgIGFjX3ByZXY9ZG9jZGlyIDs7CisgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKyAgICBhY19wcmV2PWR2aWRpciA7OworICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKyAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCisgIHwgLS1odD0qKQorICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCisgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKyAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCisgICAgYWNfcHJldj1wZGZkaXIgOzsKKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKyAgICBwZGZkaXI9JGFjX29wdGFyZyA7OworCisgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisgICAgYWNfcHJldj1wc2RpciA7OworICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAorICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKKyAgICBlc2FjCisgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKyAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorICAgIG5vKSA7OworICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgorZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAorCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCisJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgKi8gKQorICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworICBlc2FjCisgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisgIGVzYWMKKyAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KKyAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZCIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgorYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKK3Rlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8CiskYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKK2ZpCithY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCithY19hYnNfY29uZmRpcj1gKAorCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCisJcHdkKWAKKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCitpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisgIHNyY2Rpcj0uCitmaQorIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKyMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCitjYXNlICRzcmNkaXIgaW4KKyovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworZXNhYworZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KK2RvbmUKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBkYnVzIDEuNC4xMCB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nIC4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL2RidXNdCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCitfQUNFT0YKKworICBjYXQgPDxcX0FDRU9GCisKK1Byb2dyYW0gbmFtZXM6CisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYICAgICAgICAgICAgcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisKK1ggZmVhdHVyZXM6CisgIC0teC1pbmNsdWRlcz1ESVIgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorICBjYXNlICRhY19pbml0X2hlbHAgaW4KKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIGRidXMgMS40LjEwOiI7OworICAgZXNhYworICBjYXQgPDxcX0FDRU9GCisKK09wdGlvbmFsIEZlYXR1cmVzOgorICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorCQkJICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyCisgIC0tZW5hYmxlLXNpbGVudC1ydWxlcyAgICAgICAgICBsZXNzIHZlcmJvc2UgYnVpbGQgb3V0cHV0ICh1bmRvOiBgbWFrZSBWPTEnKQorICAtLWRpc2FibGUtc2lsZW50LXJ1bGVzICAgICAgICAgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MCcpCisgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKKyAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnMKKyAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCisgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXQorICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdCisgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGF2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcykKKyAgLS1lbmFibGUtY29tcGlsZXItY292ZXJhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIGdlbmVyYXRpb24gb2YgY292ZXJhZ2UgZGF0YQorICAtLWRpc2FibGUtY29tcGlsZXItb3B0aW1pc2F0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIGNvbXBpbGVyIG9wdGltaXNhdGlvbnMKKyAgLS1lbmFibGUtdGVzdHMgICAgICAgICAgZW5hYmxlIHVuaXQgdGVzdCBjb2RlIGluIHRoZSBsaWJyYXJ5IGFuZCBiaW5hcmllcworICAtLWVuYWJsZS1hbnNpICAgICAgICAgICBlbmFibGUgLWFuc2kgLXBlZGFudGljIGdjYyBmbGFncworICAtLWVuYWJsZS12ZXJib3NlLW1vZGUgICBzdXBwb3J0IHZlcmJvc2UgZGVidWcgbW9kZQorICAtLWVuYWJsZS1hc3NlcnRzICAgICAgICBpbmNsdWRlIGFzc2VydGlvbiBjaGVja3MKKyAgLS1lbmFibGUtY2hlY2tzICAgICAgICAgaW5jbHVkZSBzYW5pdHkgY2hlY2tzIG9uIHB1YmxpYyBBUEkKKyAgLS1lbmFibGUteG1sLWRvY3MgICAgICAgYnVpbGQgWE1MIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIHhtbHRvKQorICAtLWVuYWJsZS1kb3h5Z2VuLWRvY3MgICBidWlsZCBET1hZR0VOIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIERveHlnZW4pCisgIC0tZW5hYmxlLWFic3RyYWN0LXNvY2tldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UgKGxpbnV4IG9ubHkpCisgIC0tZW5hYmxlLXNlbGludXggICAgICAgIGJ1aWxkIHdpdGggU0VMaW51eCBzdXBwb3J0CisgIC0tZW5hYmxlLWxpYmF1ZGl0ICAgICAgIGJ1aWxkIGF1ZGl0IGRhZW1vbiBzdXBwb3J0IGZvciBTRUxpbnV4CisgIC0tZW5hYmxlLWRub3RpZnkgICAgICAgIGJ1aWxkIHdpdGggZG5vdGlmeSBzdXBwb3J0IChsaW51eCBvbmx5KQorICAtLWVuYWJsZS1pbm90aWZ5ICAgICAgICBidWlsZCB3aXRoIGlub3RpZnkgc3VwcG9ydCAobGludXggb25seSkKKyAgLS1lbmFibGUta3F1ZXVlICAgICAgICAgYnVpbGQgd2l0aCBrcXVldWUgc3VwcG9ydAorICAtLWVuYWJsZS1jb25zb2xlLW93bmVyLWZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIGNvbnNvbGUgb3duZXIgZmlsZQorICAtLWVuYWJsZS11c2VyZGItY2FjaGUgICBidWlsZCB3aXRoIHVzZXJkYi1jYWNoZSBzdXBwb3J0CisgIC0tZW5hYmxlLWxhdW5jaGQgICAgICAgIGJ1aWxkIHdpdGggbGF1bmNoZCBhdXRvLWxhdW5jaCBzdXBwb3J0CisgIC0tZW5hYmxlLXgxMS1hdXRvbGF1bmNoIGJ1aWxkIHdpdGggWDExIGF1dG8tbGF1bmNoIHN1cHBvcnQKKyAgLS1kaXNhYmxlLVdlcnJvciAgICAgICAgY29tcGlsZSB3aXRob3V0IC1XZXJyb3IgKG5vcm1hbGx5IGVuYWJsZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnQgYnVpbGRzKQorICAtLWRpc2FibGUtZ2Mtc2VjdGlvbnMgICBkaXNhYmxlIC0tZ2Mtc2VjdGlvbnMgdG8gd29yayBhcm91bmQgYnJva2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xjaGFpbnMKKworT3B0aW9uYWwgUGFja2FnZXM6CisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0td2l0aC1waWMgICAgICAgICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoXQorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dCisgIC0td2l0aC1zeXNyb290PURJUiBTZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMgd2l0aGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHRoZSBjb21waWxlcidzIHN5c3Jvb3QgaWYgbm90IHNwZWNpZmllZCkuCisgIC0td2l0aC14bWw9bGlieG1sL2V4cGF0IFhNTCBsaWJyYXJ5IHRvIHVzZSAobGlieG1sIG1heSBiZSBuYW1lZCBsaWJ4bWwyIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgc3lzdGVtcykKKyAgLS13aXRoLWluaXQtc2NyaXB0cz1yZWRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUgb2YgaW5pdCBzY3JpcHRzIHRvIGluc3RhbGwKKyAgLS13aXRoLXNlc3Npb24tc29ja2V0LWRpcj1kaXJuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXJlIHRvIHB1dCBzb2NrZXRzIGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBidXMKKyAgLS13aXRoLXRlc3Qtc29ja2V0LWRpcj1kaXJuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXJlIHRvIHB1dCBzb2NrZXRzIGZvciBtYWtlIGNoZWNrCisgIC0td2l0aC1zeXN0ZW0tcGlkLWZpbGU9cGlkZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICBQSUQgZmlsZSBmb3Igc3lzdGVtd2lkZSBkYWVtb24KKyAgLS13aXRoLXN5c3RlbS1zb2NrZXQ9ZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JWCBkb21haW4gc29ja2V0IGZvciBzeXN0ZW13aWRlIGRhZW1vbgorICAtLXdpdGgtY29uc29sZS1hdXRoLWRpcj1kaXJuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcAorICAtLXdpdGgtY29uc29sZS1vd25lci1maWxlPWZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgd2hvc2Ugb3duZXIgZGV0ZXJtaW5lcyBjdXJyZW50IGNvbnNvbGUgb3duZXIKKyAgLS13aXRoLWxhdW5jaGQtYWdlbnQtZGlyPWRpcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IHRvIHB1dCB0aGUgbGF1bmNoZCBhZ2VudCAoZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgL0xpYnJhcnkvTGF1bmNoQWdlbnRzKQorICAtLXdpdGgtZGJ1cy11c2VyPTx1c2VyPiBVc2VyIGZvciBydW5uaW5nIHRoZSBEQlVTIGRhZW1vbiAobWVzc2FnZWJ1cykKKyAgLS13aXRoLWRidXMtZGFlbW9uZGlyPWRpcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBEQlVTIGRhZW1vbgorICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbQorICAtLXdpdGgtc3lzdGVtZHN5c3RlbXVuaXRkaXI9RElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeSBmb3Igc3lzdGVtZCBzZXJ2aWNlIGZpbGVzCisgIC0td2l0aC1kYnVzLXRlc3QtZGlyPWRpcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCB3aGVyZSB0aGUgdGVzdHMgdG9vbHMgYXJlIGF2YWlsYWJsZQorCitTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKKyAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCisgIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKKyAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCisgICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KKyAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgorICBDUFBGTEFHUyAgICAoT2JqZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCisgICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDWFggICAgICAgICBDKysgY29tcGlsZXIgY29tbWFuZAorICBDWFhGTEFHUyAgICBDKysgY29tcGlsZXIgZmxhZ3MKKyAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKKyAgQ1hYQ1BQICAgICAgQysrIHByZXByb2Nlc3NvcgorICBQS0dfQ09ORklHICBwYXRoIHRvIHBrZy1jb25maWcgdXRpbGl0eQorICBMSUJYTUxfQ0ZMQUdTCisgICAgICAgICAgICAgIEMgY29tcGlsZXIgZmxhZ3MgZm9yIExJQlhNTCwgb3ZlcnJpZGluZyBwa2ctY29uZmlnCisgIExJQlhNTF9MSUJTIGxpbmtlciBmbGFncyBmb3IgTElCWE1MLCBvdmVycmlkaW5nIHBrZy1jb25maWcKKyAgWE1LTUYgICAgICAgUGF0aCB0byB4bWttZiwgTWFrZWZpbGUgZ2VuZXJhdG9yIGZvciBYIFdpbmRvdyBTeXN0ZW0KKyAgTUFOMkhUTUwgICAgUGF0aCB0byBtYW4yaHRtbCAob3B0aW9uYWwpCisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIDxodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1kYnVzPi4KK19BQ0VPRgorYWNfc3RhdHVzPSQ/CitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwKKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorICAgICAgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbHNlCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpIHx8IGFjX3N0YXR1cz0kPworICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKK2RidXMgY29uZmlndXJlIDEuNC4xMAorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4CisKK0NvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdAorZmkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY3h4X3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2N4eF90cnlfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4gY29uZnRlc3QuaSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY3BwCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cywgZ2l2aW5nIGEgd2FybmluZyBpZiBpdCBjYW5ub3QgYmUgY29tcGlsZWQgdXNpbmcKKyMgdGhlIGluY2x1ZGUgZmlsZXMgaW4gSU5DTFVERVMgYW5kIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHVzYWJpbGl0eSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkMiB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHByZXNlbmNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHByZXNlbmNlLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gIygoCisgIHllczpubzogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisoICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBSZXBvcnQgdGhpcyB0byBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1kYnVzICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9XCRhY19oZWFkZXJfY29tcGlsZXIiCitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwKKworIyBhY19mbl9jX3RyeV9ydW4gTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLiBBc3N1bWVzCisjIHRoYXQgZXhlY3V0YWJsZXMgKmNhbiogYmUgcnVuLgorYWNfZm5fY190cnlfcnVuICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCitmaQorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X3J1bgorCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY190cnlfbGluayBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfbGluayAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgorICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCisgICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCisgICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9saW5rCisKKyMgYWNfZm5fY19jaGVja19mdW5jIExJTkVOTyBGVU5DIFZBUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgRlVOQyBleGlzdHMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseQorYWNfZm5fY19jaGVja19mdW5jICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICQyIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJDIuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJDIgaW5ub2N1b3VzXyQyCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICQyICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICQyCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJDIgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl8kMiB8fCBkZWZpbmVkIF9fc3R1Yl9fXyQyCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICQyICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2Z1bmMKKworIyBhY19mbl9jeHhfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2N4eF90cnlfY3BwICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgIGFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2NwcAorCisjIGFjX2ZuX2N4eF90cnlfbGluayBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jeHhfdHJ5X2xpbmsgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgorICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCisgICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCisgICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2xpbmsKKworIyBhY19mbl9jX2NvbXB1dGVfaW50IExJTkVOTyBFWFBSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcmllcyB0byBmaW5kIHRoZSBjb21waWxlLXRpbWUgdmFsdWUgb2YgRVhQUiBpbiBhIHByb2dyYW0gdGhhdCBpbmNsdWRlcworIyBJTkNMVURFUywgc2V0dGluZyBWQVIgYWNjb3JkaW5nbHkuIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgY291bGQgYmUKKyMgY29tcHV0ZWQKK2FjX2ZuX2NfY29tcHV0ZV9pbnQgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgICMgRGVwZW5kaW5nIHVwb24gdGhlIHNpemUsIGNvbXB1dGUgdGhlIGxvIGFuZCBoaSBib3VuZHMuCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfbG89MCBhY19taWQ9MAorICB3aGlsZSA6OyBkbworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAkYWNfbWlkICsgMSAmJiBhY19sbz0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCArIDEgJiYgYWNfbWlkPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgYXNfZm5fYXJpdGggJygnICRhY19taWQgJyknIC0gMSAmJiBhY19oaT0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCAmJiBhY19taWQ9JGFzX3ZhbAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGFjX2xvPSBhY19oaT0KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFzX2ZuX2FyaXRoICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sbyAmJiBhY19taWQ9JGFzX3ZhbAorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgKyAxICYmIGFjX2xvPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluICMoKAorPyopIGV2YWwgIiQzPVwkYWNfbG8iOyBhY19yZXR2YWw9MCA7OworJycpIGFjX3JldHZhbD0xIDs7Citlc2FjCisgIGVsc2UKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKCQyKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoJDIpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgkMikpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CisgICAgfQorICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KKyAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGVjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDMgPGNvbmZ0ZXN0LnZhbDsgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgYWNfcmV0dmFsPTEKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb25mdGVzdC52YWwKKworICBmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX2NvbXB1dGVfaW50CisKKyMgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKKyMgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAorICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CisjaWZuZGVmICRhc19kZWNsX25hbWUKKyNpZmRlZiBfX2NwbHVzcGx1cworICAodm9pZCkgJGFzX2RlY2xfdXNlOworI2Vsc2UKKyAgKHZvaWQpICRhc19kZWNsX25hbWU7CisjZW5kaWYKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2RlY2wKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IGRidXMgJGFzX21lIDEuNC4xMCwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjguICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCit7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Cit7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgorIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisgICAgICBlc2FjCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICMjCisjIyAtLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGNhdCBjb25mZGVmcy5oCisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCithY19zaXRlX2ZpbGUxPU5PTkUKK2FjX3NpdGVfZmlsZTI9Tk9ORQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICAjIFdlIGRvIG5vdCB3YW50IGEgUEFUSCBzZWFyY2ggZm9yIGNvbmZpZy5zaXRlLgorICBjYXNlICRDT05GSUdfU0lURSBpbiAjKCgKKyAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OworICAgICovKikgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEU7OworICAgICopICAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgIGVzYWMKK2VsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgIGFjX3NpdGVfZmlsZTE9JHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitlbHNlCisgIGFjX3NpdGVfZmlsZTE9JGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gIiRhY19zaXRlX2ZpbGUxIiAiJGFjX3NpdGVfZmlsZTIiCitkbworICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIgXAorICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsIGZpbGVzCisgICMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LiAgREpHUFAgZW11bGF0ZXMgaXQgYXMgYSByZWd1bGFyIGZpbGUuCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisgIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCisJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCisJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKwllbHNlCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAorCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CitmaQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KKyAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2J1aWxkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQorYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9CitjYXNlICRhY19jdl9idWlsZCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKK2VzYWMKK2J1aWxkPSRhY19jdl9idWlsZAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2J1aWxkCitzaGlmdAorYnVpbGRfY3B1PSQxCitidWlsZF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CitidWlsZF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9ob3N0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKK2Vsc2UKKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorY2FzZSAkYWNfY3ZfaG9zdCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKKworYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKKworCisKK2FtX19hcGlfdmVyc2lvbj0nMS4xMScKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorIyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZpbGVzLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgJHthY19jdl9wYXRoX2luc3RhbGwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCitjYXNlICRhc19kaXIvIGluICMoKAorICAuLyB8IC4vLyB8IC9bY0NdLyogfCBcCisgIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAorICA/OltcXC9db3MyW1xcL11pbnN0YWxsW1xcL10qIHwgPzpbXFwvXU9TMltcXC9dSU5TVEFMTFtcXC9dKiB8IFwKKyAgL3Vzci91Y2IvKiApIDs7CisgICopCisgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAjIGJ5IGRlZmF1bHQuCisgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisJaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKwkgICAgZWNobyBvbmUgPiBjb25mdGVzdC5vbmUKKwkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKwkgICAgbWtkaXIgY29uZnRlc3QuZGlyCisJICAgIGlmICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtYyBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvICJgcHdkYC9jb25mdGVzdC5kaXIiICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC5vbmUgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC50d28KKwkgICAgdGhlbgorCSAgICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCAtYyIKKwkgICAgICBicmVhayAzCisJICAgIGZpCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIDs7Citlc2FjCisKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSU5TVEFMTCIgPiY1CiskYXNfZWNobyAiJElOU1RBTEwiID4mNjsgfQorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuLi4gIiA+JjY7IH0KKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKKyMgUmVqZWN0IHVuc2FmZSBjaGFyYWN0ZXJzIGluICRzcmNkaXIgb3IgdGhlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5CisjIG5hbWUuICBBY2NlcHQgc3BhY2UgYW5kIHRhYiBvbmx5IGluIHRoZSBsYXR0ZXIuCithbV9sZj0nCisnCitjYXNlIGBwd2RgIGluCisgICpbXFxcIlwjXCRcJlwnXGAkYW1fbGZdKikKKyAgICBhc19mbl9lcnJvciAkPyAidW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWUiICIkTElORU5PIiA1OzsKK2VzYWMKK2Nhc2UgJHNyY2RpciBpbgorICAqW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXCBcCV0qKQorICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnNhZmUgc3JjZGlyIHZhbHVlOiBcYCRzcmNkaXInIiAiJExJTkVOTyIgNTs7Citlc2FjCisKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGVgCisgICBmaQorICAgcm0gLWYgY29uZnRlc3QuZmlsZQorICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKKyAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICBhc19mbl9lcnJvciAkPyAibHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgIiRMSU5FTk8iIDUKKyAgIGZpCisKKyAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0LmZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBhc19mbl9lcnJvciAkPyAibmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgIiRMSU5FTk8iIDUKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXiYkcHJvZ3JhbV9wcmVmaXgmOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZcJCYkcHJvZ3JhbV9zdWZmaXgmOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBEb3VibGUgYW55IFwgb3IgJC4KKyMgQnkgZGVmYXVsdCB3YXMgYHMseCx4JywgcmVtb3ZlIGl0IGlmIHVzZWxlc3MuCithY19zY3JpcHQ9J3MvW1xcJF0vJiYvZztzLztzLHgseCwkLy8nCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPWAkYXNfZWNobyAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiIHwgc2VkICIkYWNfc2NyaXB0ImAKKworIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorCitpZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7CisgICopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7CisgIGVzYWMKK2ZpCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9CitmaQorCitpZiB0ZXN0IHgiJHtpbnN0YWxsX3NofSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAnJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCciIDs7CisgICopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL2luc3RhbGwtc2giCisgIGVzYWMKK2ZpCisKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IG5vOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVFJJUCIgPiY1CiskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9InN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9TVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1NUUklQIiA9IHg7IHRoZW4KKyAgICBTVFJJUD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBTVFJJUD0kYWNfY3RfU1RSSVAKKyAgZmkKK2Vsc2UKKyAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorZmkKKworZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRNS0RJUl9QIjsgdGhlbgorICBpZiAke2FjX2N2X3BhdGhfbWtkaXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL29wdC9zZncvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gbWtkaXIgZ21rZGlyOyBkbworCSBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwkgICB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9IHx8IGNvbnRpbnVlCisJICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAorCSAgICAgJ21rZGlyIChHTlUgY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoY29yZXV0aWxzKSAnKiB8IFwKKwkgICAgICdta2RpciAoZmlsZXV0aWxzKSAnNC4xKikKKwkgICAgICAgYWNfY3ZfcGF0aF9ta2Rpcj0kYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0CisJICAgICAgIGJyZWFrIDM7OworCSAgIGVzYWMKKwkgZG9uZQorICAgICAgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorCisgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX21rZGlyK3NldH0iID0gc2V0OyB0aGVuCisgICAgTUtESVJfUD0iJGFjX2N2X3BhdGhfbWtkaXIgLXAiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgTUtESVJfUCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIE1LRElSX1A9IiRhY19pbnN0YWxsX3NoIC1kIgorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUtESVJfUCIgPiY1CiskYXNfZWNobyAiJE1LRElSX1AiID4mNjsgfQorCitta2Rpcl9wPSIkTUtESVJfUCIKK2Nhc2UgJG1rZGlyX3AgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qKSA7OworICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Citlc2FjCisKK2ZvciBhY19wcm9nIGluIGdhd2sgbWF3ayBuYXdrIGF3aworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0FXSys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIGFjX2N2X3Byb2dfQVdLPSIkQVdLIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVdLPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitBV0s9JGFjX2N2X3Byb2dfQVdLCitpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFXSyIgPiY1CiskYXNfZWNobyAiJEFXSyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRBV0siICYmIGJyZWFrCitkb25lCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2OyB9CitzZXQgeCAke01BS0UtbWFrZX0KK2FjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAoraWYgZXZhbCBcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCitTSEVMTCA9IC9iaW4vc2gKK2FsbDoKKwlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJworX0FDRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitjYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KKyAgKkBAQCUlJT0/Kj1AQEAlJSUqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7CisgICopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OworZXNhYworcm0gLWYgY29uZnRlc3QubWFrZQorZmkKK2lmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICBTRVRfTUFLRT0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCitta2RpciAudHN0IDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC50c3Q7IHRoZW4KKyAgYW1fX2xlYWRpbmdfZG90PS4KK2Vsc2UKKyAgYW1fX2xlYWRpbmdfZG90PV8KK2ZpCitybWRpciAudHN0IDI+L2Rldi9udWxsCisKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KKyAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKKyAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgorICBhbV9faXNyYz0nIC1JJChzcmNkaXIpJworICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAic291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiICIkTElORU5PIiA1CisgIGZpCitmaQorCisjIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKK2lmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCisgIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKKyAgZWxzZQorICAgIENZR1BBVEhfVz1lY2hvCisgIGZpCitmaQorCisKKyMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KKyBQQUNLQUdFPSdkYnVzJworIFZFUlNJT049JzEuNC4xMCcKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKK19BQ0VPRgorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCisKK0FDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KKworCitBVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KKworCitBVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9CisKKworTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9CisKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitBTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9CisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY3JlYXRlIGEgdXN0YXIgdGFyIGFyY2hpdmUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGNyZWF0ZSBhIHVzdGFyIHRhciBhcmNoaXZlLi4uICIgPiY2OyB9CisjIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCitfYW1fdG9vbHM9J2dudXRhciBwbGFpbnRhciBwYXggY3BpbyBub25lJworX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfdXN0YXItJF9hbV90b29sc30KKyMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAorIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgorZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKK2RvCisgIGNhc2UgJF9hbV90b29sIGluCisgIGdudXRhcikKKyAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7CisgICAgZG8KKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRfYW1fdGFyIC0tdmVyc2lvbiIgPiY1CisgICAoJF9hbV90YXIgLS12ZXJzaW9uKSA+JjUgMj4mNQorICAgYWNfc3RhdHVzPSQ/CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiBicmVhaworICAgIGRvbmUKKyAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD11c3RhciAtY2hmIC0gIiciJCR0YXJkaXIiJworICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD11c3RhciAtY2hmIC0gIiciJHRhcmRpciInCisgICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKKyAgICA7OworICBwbGFpbnRhcikKKyAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQorICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCisgICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQorICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCisgICAgOzsKKyAgcGF4KQorICAgIGFtX190YXI9J3BheCAtTCAteCB1c3RhciAtdyAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSdwYXggLUwgLXggdXN0YXIgLXcgIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ncGF4IC1yJworICAgIDs7CisgIGNwaW8pCisgICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggdXN0YXIgLUwnCisgICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggdXN0YXIgLUwnCisgICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IIHVzdGFyIC1kJworICAgIDs7CisgIG5vbmUpCisgICAgYW1fX3Rhcj1mYWxzZQorICAgIGFtX190YXJfPWZhbHNlCisgICAgYW1fX3VudGFyPWZhbHNlCisgICAgOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCisgICMgYW5kIGFtX191bnRhciBzZXQuCisgIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfdXN0YXJ9IiAmJiBicmVhaworCisgICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcworICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHRhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhciIgPiY1CisgICAodGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyKSA+JjUgMj4mNQorICAgYWNfc3RhdHVzPSQ/CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorICBybSAtcmYgY29uZnRlc3QuZGlyCisgIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFtX191bnRhciA8Y29uZnRlc3QudGFyIiA+JjUKKyAgICgkYW1fX3VudGFyIDxjb25mdGVzdC50YXIpID4mNSAyPiY1CisgICBhY19zdGF0dXM9JD8KKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIChleGl0ICRhY19zdGF0dXMpOyB9CisgICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCisgIGZpCitkb25lCitybSAtcmYgY29uZnRlc3QuZGlyCisKK2lmICR7YW1fY3ZfcHJvZ190YXJfdXN0YXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhbV9jdl9wcm9nX3Rhcl91c3Rhcj0kX2FtX3Rvb2wKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfcHJvZ190YXJfdXN0YXIiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9wcm9nX3Rhcl91c3RhciIgPiY2OyB9CisKKworCisKKworCitHRVRURVhUX1BBQ0tBR0U9ZGJ1cy0xCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBHRVRURVhUX1BBQ0tBR0UgIiRHRVRURVhUX1BBQ0tBR0UiCitfQUNFT0YKKworCisgIyMgbXVzdCBjb21lIGJlZm9yZSB3ZSB1c2UgdGhlICRVU0VfTUFJTlRBSU5FUl9NT0RFIHZhcmlhYmxlIGxhdGVyCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMuLi4gIiA+JjY7IH0KKyAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX21haW50YWluZXJfbW9kZTsgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KK2ZpCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVU0VfTUFJTlRBSU5FUl9NT0RFIiA+JjUKKyRhc19lY2hvICIkVVNFX01BSU5UQUlORVJfTU9ERSIgPiY2OyB9CisgICBpZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPQorICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCitlbHNlCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJworICBNQUlOVEFJTkVSX01PREVfRkFMU0U9CitmaQorCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbGVudC1ydWxlcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaWxlbnRfcnVsZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zaWxlbnRfcnVsZXM7CitmaQorCitjYXNlICRlbmFibGVfc2lsZW50X3J1bGVzIGluCit5ZXMpIEFNX0RFRkFVTFRfVkVSQk9TSVRZPTA7Oworbm8pICBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0xOzsKKyopICAgQU1fREVGQVVMVF9WRVJCT1NJVFk9MDs7Citlc2FjCitBTV9CQUNLU0xBU0g9J1wnCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERCVVNfREFFTU9OX05BTUUgImRidXMtZGFlbW9uIgorX0FDRU9GCisKKworIyBsaWJ0b29sIHZlcnNpb25pbmcgLSB0aGlzIGFwcGxpZXMgdG8gbGliZGJ1cworIworIyBTZWUgaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9hdXRvYm9vay9hdXRvYm9vay9hdXRvYm9va185MS5odG1sI1NFQzkxIGZvciBkZXRhaWxzCisjCisKKyMjIGluY3JlbWVudCBpZiB0aGUgaW50ZXJmYWNlIGhhcyBhZGRpdGlvbnMsIGNoYW5nZXMsIHJlbW92YWxzLgorTFRfQ1VSUkVOVD04CisKKyMjIGluY3JlbWVudCBhbnkgdGltZSB0aGUgc291cmNlIGNoYW5nZXM7IHNldCB0bworIyMgIDAgaWYgeW91IGluY3JlbWVudCBDVVJSRU5UCitMVF9SRVZJU0lPTj02CisKKyMjIGluY3JlbWVudCBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQ7IHNldCB0byAwCisjIyBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gY2hhbmdlZCBvciByZW1vdmVkLiByZW1vdmFsIGhhcworIyMgcHJlY2VkZW5jZSBvdmVyIGFkZGluZywgc28gc2V0IHRvIDAgaWYgYm90aCBoYXBwZW5lZC4KK0xUX0FHRT01CisKKworCisKKworREJVU19NQUpPUl9WRVJTSU9OPTEKK0RCVVNfTUlOT1JfVkVSU0lPTj00CitEQlVTX01JQ1JPX1ZFUlNJT049MTAKK0RCVVNfVkVSU0lPTj0xLjQuMTAKKworCisKKworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIGZpCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIHNlZCAnMTBhXAorLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgorICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KK2RvbmUKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKworIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgorYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKworYWNfcm1maWxlcz0KK2ZvciBhY19maWxlIGluICRhY19maWxlcworZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKKyAgZXNhYworZG9uZQorcm0gLWYgJGFjX3JtZmlsZXMKKworaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCisjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCisjIEF1dG9jb25mLgorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCitkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKKwk7OworICAgIFthYl0ub3V0ICkKKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorCSMgY2VydGFpbmx5IHJpZ2h0LgorCWJyZWFrOzsKKyAgICAqLiogKQorCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOworCXRoZW4gOjsgZWxzZQorCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCWZpCisJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90CisJIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCisJIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCisJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCisJIyBhY3R1YWxseSB3b3JraW5nLgorCWJyZWFrOzsKKyAgICAqICkKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKK3Rlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQorCitlbHNlCisgIGFjX2ZpbGU9JycKK2ZpCitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CisKK3JtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KK2lmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOworIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBlbHNlCisJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgIGZpCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X29iamV4dCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2NfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2NjX2c9bm8KKyAgIENGTEFHUz0iLWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBDRkxBR1M9IiIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworCSBDRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19jODk9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCisvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZpbmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisJLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCitkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKKyAgKikKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OworZXNhYworaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKKworZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgorCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCisKKworYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAiID4mNjsgfQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQorcm0gLWYgY29uZmluYyBjb25mbWYKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7CitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKKyAgQU1ERVBCQUNLU0xBU0g9J1wnCitmaQorIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBBTURFUF9UUlVFPQorICBBTURFUF9GQUxTRT0nIycKK2Vsc2UKKyAgQU1ERVBfVFJVRT0nIycKKyAgQU1ERVBfRkFMU0U9CitmaQorCisKKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKK2lmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhbmQgY2MgdW5kZXJzdGFuZCAtYyBhbmQgLW8gdG9nZXRoZXIuLi4gIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGNjIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlci4uLiAiID4mNjsgfQorZmkKK3NldCBkdW1teSAkQ0M7IGFjX2NjPWAkYXNfZWNobyAiJDIiIHwKKwkJICAgICAgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKKyMgTWFrZSBzdXJlIGl0IHdvcmtzIGJvdGggd2l0aCAkQ0MgYW5kIHdpdGggc2ltcGxlIGNjLgorIyBXZSBkbyB0aGUgdGVzdCB0d2ljZSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIHJlZnVzZSB0byBvdmVyd3JpdGUgYW4KKyMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCithY190cnk9JyRDQyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mNScKK3JtIC1mIGNvbmZ0ZXN0Mi4qCitpZiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYKKyAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OwordGhlbgorICBldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPXllcworICBpZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KKyAgICAjIFRlc3QgZmlyc3QgdGhhdCBjYyBleGlzdHMgYXQgYWxsLgorICAgIGlmIHsgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisgICAgICBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1JworICAgICAgcm0gLWYgY29uZnRlc3QyLioKKyAgICAgIGlmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJgorCSB0ZXN0IC1mIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ICYmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsKKyAgICAgIHRoZW4KKwkjIGNjIHdvcmtzIHRvby4KKwk6CisgICAgICBlbHNlCisJIyBjYyBleGlzdHMgYnV0IGRvZXNuJ3QgbGlrZSAtby4KKwlldmFsIGFjX2N2X3Byb2dfY2NfJHthY19jY31fY19vPW5vCisgICAgICBmaQorICAgIGZpCisgIGZpCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0KgorCitmaQoraWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28gPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIE5PX01JTlVTX0NfTUlOVVNfTyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCisjIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KK3NldCBkdW1teSAkQ0MKK2FtX2NjPWBlY2hvICQyIHwgc2VkICdzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ2AKK2V2YWwgYW1fdD1cJGFjX2N2X3Byb2dfY2NfJHthbV9jY31fY19vCitpZiB0ZXN0ICIkYW1fdCIgIT0geWVzOyB0aGVuCisgICAjIExvc2luZyBjb21waWxlciwgc28gb3ZlcnJpZGUgd2l0aCB0aGUgc2NyaXB0LgorICAgIyBGSVhNRTogSXQgaXMgd3JvbmcgdG8gcmV3cml0ZSBDQy4KKyAgICMgQnV0IGlmIHdlIGRvbid0IHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSBvZiBvbmUgc29ydCBvciBhbm90aGVyLgorICAgIyBBIGxvbmdlci10ZXJtIGZpeCB3b3VsZCBiZSB0byBoYXZlIGF1dG9tYWtlIHVzZSBhbV9fQ0MgaW4gdGhpcyBjYXNlLAorICAgIyBhbmQgdGhlbiB3ZSBjb3VsZCBzZXQgYW1fX0NDPSJcJCh0b3Bfc3JjZGlyKS9jb21waWxlIFwkKENDKSIKKyAgIENDPSIkYW1fYXV4X2Rpci9jb21waWxlICRDQyIKK2ZpCisKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRDQ0MiOyB0aGVuCisgICAgQ1hYPSRDQ0MKKyAgZWxzZQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NYWD0kYWNfY3ZfcHJvZ19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYIiA+JjUKKyRhc19lY2hvICIkQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKyAgYWNfY3RfQ1hYPSRDWFgKKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX2N0X0NYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAoraWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DWFgiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DWFgiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ1hYIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ1hYIiA9IHg7IHRoZW4KKyAgICBDWFg9ImcrKyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDWFg9JGFjX2N0X0NYWAorICBmaQorZmkKKworICBmaQorZmkKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHWFg9eWVzCitlbHNlCisgIEdYWD0KK2ZpCithY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorYWNfc2F2ZV9DWFhGTEFHUz0kQ1hYRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jeHhfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnPSRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKyAgIENYWEZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIENYWEZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKKwkgQ1hYRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY3h4X2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCisgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0KKyAgZmkKK2ZpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9CitDWFhERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzOyB0aGVuCisgIGFtX19mYXN0ZGVwQ1hYX1RSVUU9CisgIGFtX19mYXN0ZGVwQ1hYX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENYWF9UUlVFPScjJworICBhbV9fZmFzdGRlcENYWF9GQUxTRT0KK2ZpCisKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlmICR7YWNfY3ZfcHJvZ19DUFArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKworZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAorZWxzZQorICBhY19jdl9wcm9nX0NQUD0kQ1BQCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDUFAiID4mNQorJGFzX2VjaG8gIiRDUFAiID4mNjsgfQorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0dSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9HUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKK2Nhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgorICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQorIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfRUdSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKworICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibWluaXgvY29uZmlnLmgiICJhY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX21pbml4X2NvbmZpZ19oIiA9IHh5ZXM7IHRoZW4gOgorICBNSU5JWD15ZXMKK2Vsc2UKKyAgTUlOSVg9CitmaQorCisKKyAgaWYgdGVzdCAiJE1JTklYIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBfUE9TSVhfU09VUkNFIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIF9QT1NJWF8xX1NPVVJDRSAyIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBfTUlOSVggMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBpdCBpcyBzYWZlIHRvIGRlZmluZSBfX0VYVEVOU0lPTlNfXyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gZGVmaW5lIF9fRVhURU5TSU9OU19fLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCSAgZGVmaW5lIF9fRVhURU5TSU9OU19fIDEKKwkgICRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fPXllcworZWxzZQorICBhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX18iID4mNQorJGFzX2VjaG8gIiRhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXyIgPiY2OyB9CisgIHRlc3QgJGFjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fID0geWVzICYmCisgICAgJGFzX2VjaG8gIiNkZWZpbmUgX19FWFRFTlNJT05TX18gMSIgPj5jb25mZGVmcy5oCisKKyAgJGFzX2VjaG8gIiNkZWZpbmUgX0FMTF9TT1VSQ0UgMSIgPj5jb25mZGVmcy5oCisKKyAgJGFzX2VjaG8gIiNkZWZpbmUgX0dOVV9TT1VSQ0UgMSIgPj5jb25mZGVmcy5oCisKKyAgJGFzX2VjaG8gIiNkZWZpbmUgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTIDEiID4+Y29uZmRlZnMuaAorCisgICRhc19lY2hvICIjZGVmaW5lIF9UQU5ERU1fU09VUkNFIDEiID4+Y29uZmRlZnMuaAorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzdHJlcnJvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHN0cmVycm9yLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9zdHJlcnJvcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHN0cmVycm9yICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc3RyZXJyb3IgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgY3Bvc2l4OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3N0cmVycm9yPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfc3RyZXJyb3IrOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX3N0cmVycm9yKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfc3RyZXJyb3I9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9zdHJlcnJvciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9zdHJlcnJvciIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zdHJlcnJvcgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19pbmxpbmUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGludCBmb29fdDsKK3N0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KKyRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9CisjZW5kaWYKKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfaW5saW5lPSRhY19rdworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICB0ZXN0ICIkYWNfY3ZfY19pbmxpbmUiICE9IG5vICYmIGJyZWFrCitkb25lCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfaW5saW5lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19pbmxpbmUiID4mNjsgfQorCitjYXNlICRhY19jdl9jX2lubGluZSBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgICopCisgICAgY2FzZSAkYWNfY3ZfY19pbmxpbmUgaW4KKyAgICAgIG5vKSBhY192YWw9OzsKKyAgICAgICopIGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7OworICAgIGVzYWMKKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIGlubGluZSAkYWNfdmFsCisjZW5kaWYKK19BQ0VPRgorICAgIDs7Citlc2FjCisKK2Nhc2UgYHB3ZGAgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBMaWJ0b29sIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHdoaXRlc3BhY2UgaW4gXGBwd2RcYCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBMaWJ0b29sIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHdoaXRlc3BhY2UgaW4gXGBwd2RcYCIgPiYyO30gOzsKK2VzYWMKKworCisKK21hY3JvX3ZlcnNpb249JzIuNCcKK21hY3JvX3JldmlzaW9uPScxLjMyOTMnCisKKworCisKKworCisKKworCisKKworCisKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEJhY2tzbGFzaGlmeSBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluCisjIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFsiYCRcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woWyJgXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KK2RlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKK0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHByaW50IHN0cmluZ3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHByaW50IHN0cmluZ3MuLi4gIiA+JjY7IH0KKyMgVGVzdCBwcmludCBmaXJzdCwgYmVjYXVzZSBpdCB3aWxsIGJlIGEgYnVpbHRpbiBpZiBwcmVzZW50LgoraWYgdGVzdCAiWGAoIHByaW50IC1yIC0tIC1uICkgMj4vZGV2L251bGxgIiA9IFgtbiAmJiBcCisgICB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludCAtciAtLScKK2VsaWYgdGVzdCAiWGBwcmludGYgJXMgJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50ZiAlc1xuJworZWxzZQorICAjIFVzZSB0aGlzIGZ1bmN0aW9uIGFzIGEgZmFsbGJhY2sgdGhhdCBhbHdheXMgd29ya3MuCisgIGZ1bmNfZmFsbGJhY2tfZWNobyAoKQorICB7CisgICAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKKyQxCitfTFRFQ0hPX0VPRicKKyAgfQorICBFQ0hPPSdmdW5jX2ZhbGxiYWNrX2VjaG8nCitmaQorCisjIGZ1bmNfZWNob19hbGwgYXJnLi4uCisjIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCitmdW5jX2VjaG9fYWxsICgpCit7CisgICAgJEVDSE8gIiIKK30KKworY2FzZSAiJEVDSE8iIGluCisgIHByaW50ZiopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBwcmludGYiID4mNQorJGFzX2VjaG8gInByaW50ZiIgPiY2OyB9IDs7CisgIHByaW50KikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHByaW50IC1yIiA+JjUKKyRhc19lY2hvICJwcmludCAtciIgPiY2OyB9IDs7CisgICopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjYXQiID4mNQorJGFzX2VjaG8gImNhdCIgPiY2OyB9IDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfU0VEKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICAgICAgIGFjX3NjcmlwdD1zL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYi8KKyAgICAgZm9yIGFjX2kgaW4gMSAyIDMgNCA1IDYgNzsgZG8KKyAgICAgICBhY19zY3JpcHQ9IiRhY19zY3JpcHQkYXNfbmwkYWNfc2NyaXB0IgorICAgICBkb25lCisgICAgIGVjaG8gIiRhY19zY3JpcHQiIDI+L2Rldi9udWxsIHwgc2VkIDk5cSA+Y29uZnRlc3Quc2VkCisgICAgIHsgYWNfc2NyaXB0PTsgdW5zZXQgYWNfc2NyaXB0O30KKyAgICAgaWYgdGVzdCAteiAiJFNFRCI7IHRoZW4KKyAgYWNfcGF0aF9TRURfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9TRUQ9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX1NFRCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfU0VEIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfU0VEIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9TRUQKK2Nhc2UgYCIkYWNfcGF0aF9TRUQiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9TRUQiIGFjX3BhdGhfU0VEX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICcnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfU0VEIiAtZiBjb25mdGVzdC5zZWQgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX1NFRF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9TRUQ9IiRhY19wYXRoX1NFRCIKKyAgICAgIGFjX3BhdGhfU0VEX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfU0VEX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9TRUQiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgc2VkIGNvdWxkIGJlIGZvdW5kIGluIFwkUEFUSCIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9TRUQ9JFNFRAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9TRUQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX1NFRCIgPiY2OyB9CisgU0VEPSIkYWNfY3ZfcGF0aF9TRUQiCisgIHJtIC1mIGNvbmZ0ZXN0LnNlZAorCit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZmdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZncmVwLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfRkdSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvICdhYipjJyB8ICRHUkVQIC1GICdhYipjJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9GR1JFUD0iJEdSRVAgLUYiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRGR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9GR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGZncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9GR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRkdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0ZHUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRkdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0ZHUkVQCitjYXNlIGAiJGFjX3BhdGhfRkdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfRkdSRVA9IiRhY19wYXRoX0ZHUkVQIiBhY19wYXRoX0ZHUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdGR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9GR1JFUCIgRkdSRVAgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0ZHUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0ZHUkVQPSIkYWNfcGF0aF9GR1JFUCIKKyAgICAgIGFjX3BhdGhfRkdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9GR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRkdSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZmdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0ZHUkVQPSRGR1JFUAorZmkKKworICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRkdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0ZHUkVQIiA+JjY7IH0KKyBGR1JFUD0iJGFjX2N2X3BhdGhfRkdSRVAiCisKKwordGVzdCAteiAiJEdSRVAiICYmIEdSRVA9Z3JlcAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9nbnVfbGQ7IHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcworZWxzZQorICB3aXRoX2dudV9sZD1ubworZmkKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQy4uLiAiID4mNjsgfQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtcXC9dKiB8ID86W1xcL10qKQorICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAiID4mNjsgfQorZmkKK2lmICR7bHRfY3ZfcGF0aF9MRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwk7OworICAgICAgKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpCitmaQorCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQiID4mNQorJGFzX2VjaG8gIiRMRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2dudV9sZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KK2Nhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCisgIDs7CisqKQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworICA7OworZXNhYworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2dudV9sZCIgPiY2OyB9Cit3aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlciAobm0pIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX05NKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIDogJHtsdF9jdl9wYXRoX05NPW5vfQorZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3BhdGhfTk0iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wYXRoX05NIiA+JjY7IH0KK2lmIHRlc3QgIiRsdF9jdl9wYXRoX05NIiAhPSAibm8iOyB0aGVuCisgIE5NPSIkbHRfY3ZfcGF0aF9OTSIKK2Vsc2UKKyAgIyBEaWRuJ3QgZmluZCBhbnkgQlNEIGNvbXBhdGlibGUgbmFtZSBsaXN0ZXIsIGxvb2sgZm9yIGR1bXBiaW4uCisgIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbiA6CisgICAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGVsc2UKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGR1bXBiaW4gImxpbmsgLWR1bXAiCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0RVTVBCSU4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19EVU1QQklOPSIkRFVNUEJJTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RVTVBCSU49IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0RVTVBCSU49JGFjX2N2X3Byb2dfRFVNUEJJTgoraWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRFVNUEJJTiIgPiY1CiskYXNfZWNobyAiJERVTVBCSU4iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiREVU1QQklOIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJERVTVBCSU4iOyB0aGVuCisgIGFjX2N0X0RVTVBCSU49JERVTVBCSU4KKyAgZm9yIGFjX3Byb2cgaW4gZHVtcGJpbiAibGluayAtZHVtcCIKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0RVTVBCSU4iOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTj0iJGFjX2N0X0RVTVBCSU4iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9EVU1QQklOPSRhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU4KK2lmIHRlc3QgLW4gIiRhY19jdF9EVU1QQklOIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RVTVBCSU4iID4mNQorJGFzX2VjaG8gIiRhY19jdF9EVU1QQklOIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0RVTVBCSU4iICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9EVU1QQklOIiA9IHg7IHRoZW4KKyAgICBEVU1QQklOPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERVTVBCSU49JGFjX2N0X0RVTVBCSU4KKyAgZmkKK2ZpCisKKyAgICBjYXNlIGAkRFVNUEJJTiAtc3ltYm9scyAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorICAgICpDT0ZGKikKKyAgICAgIERVTVBCSU49IiREVU1QQklOIC1zeW1ib2xzIgorICAgICAgOzsKKyAgICAqKQorICAgICAgRFVNUEJJTj06CisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworICBpZiB0ZXN0ICIkRFVNUEJJTiIgIT0gIjoiOyB0aGVuCisgICAgTk09IiREVU1QQklOIgorICBmaQorZmkKK3Rlc3QgLXogIiROTSIgJiYgTk09bm0KKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X25tX2ludGVyZmFjZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRhY19jb21waWxlXCIiID4mNSkKKyAgKGV2YWwgIiRhY19jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiY1KQorICAoZXZhbCAiJE5NIFwiY29uZnRlc3QuJGFjX29iamV4dFwiIiAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dCkKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86IG91dHB1dFwiIiA+JjUpCisgIGNhdCBjb25mdGVzdC5vdXQgPiY1CisgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgorICBmaQorICBybSAtZiBjb25mdGVzdCoKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X25tX2ludGVyZmFjZSIgPiY1CiskYXNfZWNobyAiJGx0X2N2X25tX2ludGVyZmFjZSIgPiY2OyB9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICIgPiY2OyB9CitMTl9TPSRhc19sbl9zCitpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubywgdXNpbmcgJExOX1MiID4mNQorJGFzX2VjaG8gIm5vLCB1c2luZyAkTE5fUyIgPiY2OyB9CitmaQorCisjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc3lzX21heF9jbWRfbGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbWludCopCisgICAgIyBPbiBNaU5UIHRoaXMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIHJ1biBvdXQgb2YgbWVtb3J5LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQorICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgorICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcworICAgIGZpCisgICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgOzsKKworICBpbnRlcml4KikKKyAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4CisgICAgOzsKKworICBvc2YqKQorICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQorICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90CisgICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KKyAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKKyAgICAjCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KKyAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCisgICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworICBzY28zLjJ2NSopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAorICAgIDs7CisgIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKKyAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbCSBdLy8nYAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YChnZXRjb25mIEFSR19NQVgpIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgZWxzZQorICAgICAgIyBNYWtlIHRlc3RzdHJpbmcgYSBsaXR0bGUgYmlnZ2VyIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyB3aXRoIGl0LgorICAgICAgIyBhIDFLIHN0cmluZyBzaG91bGQgYmUgYSByZWFzb25hYmxlIHN0YXJ0LgorICAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDsgZG8KKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQorICAgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0CisgICAgICAjIHdlIGNhbid0IHRlbGwuCisgICAgICB3aGlsZSB7IHRlc3QgIlgiYGZ1bmNfZmFsbGJhY2tfZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgICBkbworICAgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCisgICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQorICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworCitmaQorCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUiID4mNQorJGFzX2VjaG8gIm5vbmUiID4mNjsgfQorZmkKK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworCisKKworCisKKzogJHtDUD0iY3AgLWYifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHMuLi4gIiA+JjY7IH0KKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkeHNpX3NoZWxsIiA+JjUKKyRhc19lY2hvICIkeHNpX3NoZWxsIiA+JjY7IH0KKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIFwiKz1cIiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBcIis9XCIuLi4gIiA+JjY7IH0KK2x0X3NoZWxsX2FwcGVuZD1ubworKCBmb289YmFyOyBzZXQgZm9vIGJhejsgZXZhbCAiJDErPVwkMiIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9zaGVsbF9hcHBlbmQiID4mNQorJGFzX2VjaG8gIiRsdF9zaGVsbF9hcHBlbmQiID4mNjsgfQorCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKKworCisKKworCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIGx0X1NQMk5MPSd0ciBcMDQwIFwwMTInCisgIGx0X05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgbHRfU1AyTkw9J3RyIFwxMDAgXG4nCisgIGx0X05MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3RvX2hvc3RfZmlsZV9jbWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKKworZmkKKwordG9faG9zdF9maWxlX2NtZD0kbHRfY3ZfdG9faG9zdF9maWxlX2NtZAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl90b19ob3N0X2ZpbGVfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfdG9faG9zdF9maWxlX2NtZCIgPiY2OyB9CisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvIHRvb2xjaGFpbiBmb3JtYXQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfdG9fdG9vbF9maWxlX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCisKK2ZpCisKK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfdG9fdG9vbF9maWxlX2NtZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQiID4mNjsgfQorCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX3JlbG9hZF9mbGFnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY2OyB9CityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9ZmFsc2UKKyAgICBmaQorICAgIDs7CisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vYmpkdW1wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19PQkpEVU1QKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0JKRFVNUD0iJE9CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorT0JKRFVNUD0kYWNfY3ZfcHJvZ19PQkpEVU1QCitpZiB0ZXN0IC1uICIkT0JKRFVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQkpEVU1QIiA+JjUKKyRhc19lY2hvICIkT0JKRFVNUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3RfT0JKRFVNUD0kT0JKRFVNUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG9iamR1bXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X09CSkRVTVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSIkYWNfY3RfT0JKRFVNUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9Im9iamR1bXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfT0JKRFVNUD0kYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QCitpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQkpEVU1QIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0JKRFVNUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X09CSkRVTVAiID0geDsgdGhlbgorICAgIE9CSkRVTVA9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9CSkRVTVA9JGFjX2N0X09CSkRVTVAKKyAgZmkKK2Vsc2UKKyAgT0JKRFVNUD0iJGFjX2N2X3Byb2dfT0JKRFVNUCIKK2ZpCisKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeFs0LTldKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbNDVdKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLAorICAjIHVubGVzcyB3ZSBmaW5kICdmaWxlJywgZm9yIGV4YW1wbGUgYmVjYXVzZSB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLgorICAjIGZ1bmNfd2luMzJfbGliaWQgYXNzdW1lcyBCU0Qgbm0sIHNvIGRpc2FsbG93IGl0IGlmIHVzaW5nIE1TIGR1bXBiaW4uCisgIGlmICggdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiQlNEIG5tIiAmJiBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICBlbHNlCisgICAgIyBLZWVwIHRoaXMgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBmdW5jX3dpbjMyX2xpYmlkLgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIGZpCisgIDs7CisKK2NlZ2NjKikKKyAgIyB1c2UgdGhlIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4gU2VlIG1pbmd3Ki4KKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGUtYXJtLS4qbGl0dGxlKC4qYXJjaGl0ZWN0dXJlOiBhcm0pPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaSo4NiApCisgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgorICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KKyAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pWzMtOV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaGFpa3UqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRlsgLV1bMC05XVswLTldKSgtYml0KT8oIFtMTV1TQik/IHNoYXJlZCBvYmplY3QoIGZpbGUpP1ssIC1dKiBQQS1SSVNDIFswLTldXC5bMC05XScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfFBBLVJJU0NbMC05XVwuWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXhbMy05XSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298XC5hKSQnCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJExEIGluCisgICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKKyAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKKyAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICBlc2FjCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298X3BpY1wuYSkkJworICBmaQorICA7OworCituZXdvczYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK29wZW5ic2QqKQorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCityZG9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVswLTldWzAtOV0qIFZlcnNpb24gWzAtOV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCit0cGYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjY7IH0KKworZmlsZV9tYWdpY19nbG9iPQord2FudF9ub2Nhc2VnbG9iPW5vCitpZiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGlmICggc2hvcHQgfCBncmVwIG5vY2FzZWdsb2IgKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHdhbnRfbm9jYXNlZ2xvYj15ZXMKKyAgICBlbHNlCisgICAgICBmaWxlX21hZ2ljX2dsb2I9YGVjaG8gYUFiQmNDZERlRWZGZ0doSGlJakprS2xMbU1uTm9PcFBxUXJSc1N0VHVVdlZ3V3hYeVl6WiB8ICRTRUQgLWUgInMvXCguLlwpL3NcL1tcMV1cL1tcMV1cL2c7L2ciYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworZmkKKworZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgorICBhY19jdF9ETExUT09MPSRETExUT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9ETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfRExMVE9PTCIgPSB4OyB0aGVuCisgICAgRExMVE9PTD0iZmFsc2UiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAorICBmaQorZWxzZQorICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgorZmkKKwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGFzc29jaWF0ZSBydW50aW1lIGFuZCBsaW5rIGxpYnJhcmllcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSd1bmtub3duJworCitjYXNlICRob3N0X29zIGluCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICMgdHdvIGRpZmZlcmVudCBzaGVsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgIyBkZWNpZGUgd2hpY2ggdG8gdXNlIGJhc2VkIG9uIGNhcGFiaWxpdGllcyBvZiAkRExMVE9PTAorICBjYXNlIGAkRExMVE9PTCAtLWhlbHAgMj4mMWAgaW4KKyAgKi0taWRlbnRpZnktc3RyaWN0KikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIKKyAgICA7OworICAqKQorICAgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPWZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFjaworICAgIDs7CisgIGVzYWMKKyAgOzsKKyopCisgICMgZmFsbGJhY2s6IGFzc3VtZSBsaW5rbGliIElTIHNoYXJlZGxpYgorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0iJEVDSE8iCisgIDs7Citlc2FjCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiID4mNjsgfQorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCit0ZXN0IC16ICIkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiICYmIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRFQ0hPCisKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gYXIKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0FSPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitBUj0kYWNfY3ZfcHJvZ19BUgoraWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFSIiA+JjUKKyRhc19lY2hvICIkQVIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRBUiIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRBUiI7IHRoZW4KKyAgYWNfY3RfQVI9JEFSCisgIGZvciBhY19wcm9nIGluIGFyCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQVIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9BUj0kYWNfY3ZfcHJvZ19hY19jdF9BUgoraWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQVIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQVIiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9BUiIgPSB4OyB0aGVuCisgICAgQVI9ImZhbHNlIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIEFSPSRhY19jdF9BUgorICBmaQorZmkKKworOiAke0FSPWFyfQorOiAke0FSX0ZMQUdTPWNydX0KKworCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhcmNoaXZlciBARklMRSBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhcmNoaXZlciBARklMRSBzdXBwb3J0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X2FyX2F0X2ZpbGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9hcl9hdF9maWxlPW5vCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mNScKKyAgICAgIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRsdF9hcl90cnlcIiI7IH0gPiY1CisgIChldmFsICRsdF9hcl90cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICBpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtZXEgMDsgdGhlbgorCSMgRW5zdXJlIHRoZSBhcmNoaXZlciBmYWlscyB1cG9uIGJvZ3VzIGZpbGUgbmFtZXMuCisJcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBsaWJjb25mdGVzdC5hCisJeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGx0X2FyX3RyeVwiIjsgfSA+JjUKKyAgKGV2YWwgJGx0X2FyX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2FyX2F0X2ZpbGUiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9hcl9hdF9maWxlIiA+JjY7IH0KKworaWYgdGVzdCAieCRsdF9jdl9hcl9hdF9maWxlIiA9IHhubzsgdGhlbgorICBhcmNoaXZlcl9saXN0X3NwZWM9CitlbHNlCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0kbHRfY3ZfYXJfYXRfZmlsZQorZmkKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitTVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKKyRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgorICBhY19jdF9TVFJJUD0kU1RSSVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgorICAgIFNUUklQPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFNUUklQPSRhY19jdF9TVFJJUAorICBmaQorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCit0ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKKworCisKKworCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJBTkxJQiIgPiY1CiskYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KKyAgICBSQU5MSUI9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUkFOTElCPSRhY19jdF9SQU5MSUIKKyAgZmkKK2Vsc2UKKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitmaQorCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgorCisKKworCisKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJG9sZGxpYiIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKK2ZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249eWVzIDs7CisgICopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPW5vIDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbQUJDREVHUlNUXScKKyAgZmkKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tCQ0RFR1FSU1RdJworICA7Oworc29sYXJpcyopCisgIHN5bWNvZGU9J1tCRFJUXScKKyAgOzsKK3NjbzMuMnY1KikKKyAgc3ltY29kZT0nW0RUXScKKyAgOzsKK3N5c3Y0LjJ1dzIqKQorICBzeW1jb2RlPSdbRFRdJworICA7Oworc3lzdjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgc3ltY29kZT0nW0FCRFRdJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tERk5TVFVdJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2Nhc2UgYCROTSAtViAyPiYxYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIHN5bWNvZGU9J1tBQkNER0lSU1RXXScgOzsKK2VzYWMKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbi4KKyMgU29tZSBzeXN0ZW1zIChlc3AuIG9uIGlhNjQpIGxpbmsgZGF0YSBhbmQgY29kZSBzeW1ib2xzIGRpZmZlcmVudGx5LAorIyBzbyB1c2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKVsgXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKVsgXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKGxpYlteIF0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJsaWJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkYnVpbGRfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWAkRUNITyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAorICA7OworZXNhYworCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyc2NvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICAjIFRyYW5zZm9ybSBzeW1jb2RlLCBzeW1wYXQsIGFuZCBzeW1wcmZ4IGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgorICBzeW14ZnJtPSJcXDEgJGFjX3N5bXByZnhcXDIgXFwyIgorCisgICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KKyAgaWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgICAjIEZha2UgaXQgZm9yIGR1bXBiaW4gYW5kIHNheSBUIGZvciBhbnkgbm9uLXN0YXRpYyBmdW5jdGlvbgorICAgICMgYW5kIEQgZm9yIGFueSBnbG9iYWwgdmFyaWFibGUuCisgICAgIyBBbHNvIGZpbmQgQysrIGFuZCBfX2Zhc3RjYWxsIHN5bWJvbHMgZnJvbSBNU1ZDKyssCisgICAgIyB3aGljaCBzdGFydCB3aXRoIEAgb3IgPy4KKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkQVdLICciXAorIiAgICAge2xhc3Rfc2VjdGlvbj1zZWN0aW9uOyBzZWN0aW9uPVwkIDN9OyJcCisiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKKyIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCisiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCisiICAgICB7aWYoaGlkZVtzZWN0aW9uXSkgbmV4dH07IlwKKyIgICAgIHtmPTB9OyBcJCAwfi9cKFwpLipcfC97Zj0xfTsge3ByaW50ZiBmID8gXCJUIFwiIDogXCJEIFwifTsiXAorIiAgICAge3NwbGl0KFwkIDAsIGEsIC9cfHxcci8pOyBzcGxpdChhWzJdLCBzKX07IlwKKyIgICAgIHNbMV1+L15bQD9dL3twcmludCBzWzFdLCBzWzFdOyBuZXh0fTsiXAorIiAgICAgc1sxXX5wcmZ4IHtzcGxpdChzWzFdLHQsXCJAXCIpOyBwcmludCB0WzFdLCBzdWJzdHIodFsxXSxsZW5ndGgocHJmeCkpfSJcCisiICAgICAnIHByZng9XiRhY19zeW1wcmZ4IgorICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsJIF1cKCRzeW1jb2RlJHN5bWNvZGUqXClbCSBdWwkgXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJy8gX19nbnVfbHRvL2QnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK19MVF9FT0YKKworICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdFwiIjsgfSA+JjUKKyAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3QpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgJEdSRVAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiAkR1JFUCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PF9MVF9FT0YgPiBjb25mdGVzdC4kYWNfZXh0CisvKiBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIGJldHdlZW4gbGlidG9vbC5tNCwgbHRtYWluLCBsdF9zeXN0ZW0uaCwgYW5kIHRlc3RzLiAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlIHJ1bnRpbWUKKyAgIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbiBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxzZQorIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QgY29uc3QKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19MVF9FT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCisKKwkgIGNhdCA8PF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCitMVF9ETFNZTV9DT05TVCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICAgICAgICphZGRyZXNzOworfQorbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKKyAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAorX0xUX0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorX0xUX0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfZ2xvYnN5bV9zYXZlX0xJQlM9JExJQlMKKwkgIGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1M9JENGTEFHUworCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZyIKKwkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9JGx0X2dsb2JzeW1fc2F2ZV9MSUJTCisJICBDRkxBR1M9JGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1MKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1CisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogZmFpbGVkIiA+JjUKKyRhc19lY2hvICJmYWlsZWQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogb2siID4mNQorJGFzX2VjaG8gIm9rIiA+JjY7IH0KK2ZpCisKKyMgUmVzcG9uc2UgZmlsZSBzdXBwb3J0LgoraWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitlbGlmICROTSAtLWhlbHAgMj4vZGV2L251bGwgfCBncmVwICdbQF1GSUxFJyA+L2Rldi9udWxsOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN5c3Jvb3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN5c3Jvb3QuLi4gIiA+JjY7IH0KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zeXNyb290IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zeXNyb290K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zeXNyb290OworZWxzZQorICB3aXRoX3N5c3Jvb3Q9bm8KK2ZpCisKKworbHRfc3lzcm9vdD0KK2Nhc2UgJHt3aXRoX3N5c3Jvb3R9IGluICMoCisgeWVzKQorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgbHRfc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKKyAgIGZpCisgICA7OyAjKAorIC8qKQorICAgbHRfc3lzcm9vdD1gZWNobyAiJHdpdGhfc3lzcm9vdCIgfCBzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgOzsgIygKKyBub3wnJykKKyAgIDs7ICMoCisgKikKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke3dpdGhfc3lzcm9vdH0iID4mNQorJGFzX2VjaG8gIiR7d2l0aF9zeXNyb290fSIgPiY2OyB9CisgICBhc19mbl9lcnJvciAkPyAiVGhlIHN5c3Jvb3QgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgIDs7Citlc2FjCisKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHtsdF9zeXNyb290Oi1ub30iID4mNQorJGFzX2VjaG8gIiR7bHRfc3lzcm9vdDotbm99IiA+JjY7IH0KKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2xpYnRvb2xfbG9jazsKK2ZpCisKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAgICpFTEYtMzIqKQorCUhQVVhfSUE2NF9NT0RFPSIzMiIKKwk7OworICAgICAgKkVMRi02NCopCisJSFBVWF9JQTY0X01PREU9IjY0IgorCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJyNsaW5lICckTElORU5PJyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJzbWlwIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYm1pcG4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGY2NGJtaXAiCisJOzsKKyAgICAgIGVzYWMKKyAgICBlbHNlCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTMyIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtNjQiCisJICA7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworeDg2XzY0LSprZnJlZWJzZCotZ251fHg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfCBcCitzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqfHNwYXJjKi0qbGludXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgICAqMzItYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgOzsKKwkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2NjX25lZWRzX2JlbGYrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCitlbHNlCisgIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjY7IH0KKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKK3NwYXJjKi0qc29sYXJpcyopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCisgICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9bXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX01BTklGRVNUX1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MPSIkTUFOSUZFU1RfVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX01BTklGRVNUX1RPT0w9IiR7YWNfdG9vbF9wcmVmaXh9bXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorTUFOSUZFU1RfVE9PTD0kYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MCitpZiB0ZXN0IC1uICIkTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNQU5JRkVTVF9UT09MIiA+JjUKKyRhc19lY2hvICIkTUFOSUZFU1RfVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgYWNfY3RfTUFOSUZFU1RfVE9PTD0kTUFOSUZFU1RfVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9NQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0w9IiRhY19jdF9NQU5JRkVTVF9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTD0ibXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfTUFOSUZFU1RfVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfTUFOSUZFU1RfVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9NQU5JRkVTVF9UT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfTUFOSUZFU1RfVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X01BTklGRVNUX1RPT0wiID0geDsgdGhlbgorICAgIE1BTklGRVNUX1RPT0w9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgTUFOSUZFU1RfVE9PTD0kYWNfY3RfTUFOSUZFU1RfVE9PTAorICBmaQorZWxzZQorICBNQU5JRkVTVF9UT09MPSIkYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MIgorZmkKKwordGVzdCAteiAiJE1BTklGRVNUX1RPT0wiICYmIE1BTklGRVNUX1RPT0w9bXQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJE1BTklGRVNUX1RPT0wgaXMgYSBtYW5pZmVzdCB0b29sIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRNQU5JRkVTVF9UT09MIGlzIGEgbWFuaWZlc3QgdG9vbC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9bm8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86ICRNQU5JRkVTVF9UT09MICctPyciID4mNQorICAkTUFOSUZFU1RfVE9PTCAnLT8nIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0CisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGlmICRHUkVQICdNYW5pZmVzdCBUb29sJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9eWVzCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0KgorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sIiA+JjY7IH0KK2lmIHRlc3QgIngkbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sIiAhPSB4eWVzOyB0aGVuCisgIE1BTklGRVNUX1RPT0w9OgorZmkKKworCisKKworCisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZHN5bXV0aWwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZHN5bXV0aWw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0RTWU1VVElMKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERTWU1VVElMIjsgdGhlbgorICBhY19jdl9wcm9nX0RTWU1VVElMPSIkRFNZTVVUSUwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19EU1lNVVRJTD0iJHthY190b29sX3ByZWZpeH1kc3ltdXRpbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitEU1lNVVRJTD0kYWNfY3ZfcHJvZ19EU1lNVVRJTAoraWYgdGVzdCAtbiAiJERTWU1VVElMIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERTWU1VVElMIiA+JjUKKyRhc19lY2hvICIkRFNZTVVUSUwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RTWU1VVElMIjsgdGhlbgorICBhY19jdF9EU1lNVVRJTD0kRFNZTVVUSUwKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkc3ltdXRpbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZHN5bXV0aWw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0RTWU1VVElMIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMPSIkYWNfY3RfRFNZTVVUSUwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTD0iZHN5bXV0aWwiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfRFNZTVVUSUw9JGFjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUwKK2lmIHRlc3QgLW4gIiRhY19jdF9EU1lNVVRJTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9EU1lNVVRJTCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0RTWU1VVElMIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfRFNZTVVUSUwiID0geDsgdGhlbgorICAgIERTWU1VVElMPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIERTWU1VVElMPSRhY19jdF9EU1lNVVRJTAorICBmaQorZWxzZQorICBEU1lNVVRJTD0iJGFjX2N2X3Byb2dfRFNZTVVUSUwiCitmaQorCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW5tZWRpdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTk1FRElUKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE5NRURJVCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19OTUVESVQ9IiROTUVESVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19OTUVESVQ9IiR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK05NRURJVD0kYWNfY3ZfcHJvZ19OTUVESVQKK2lmIHRlc3QgLW4gIiROTUVESVQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTk1FRElUIiA+JjUKKyRhc19lY2hvICIkTk1FRElUIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19OTUVESVQiOyB0aGVuCisgIGFjX2N0X05NRURJVD0kTk1FRElUCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibm1lZGl0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBubWVkaXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X05NRURJVCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9OTUVESVQiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUPSIkYWNfY3RfTk1FRElUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUPSJubWVkaXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfTk1FRElUPSRhY19jdl9wcm9nX2FjX2N0X05NRURJVAoraWYgdGVzdCAtbiAiJGFjX2N0X05NRURJVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9OTUVESVQiID4mNQorJGFzX2VjaG8gIiRhY19jdF9OTUVESVQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9OTUVESVQiID0geDsgdGhlbgorICAgIE5NRURJVD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBOTUVESVQ9JGFjX2N0X05NRURJVAorICBmaQorZWxzZQorICBOTUVESVQ9IiRhY19jdl9wcm9nX05NRURJVCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1saXBvIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWxpcG87IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0xJUE8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTElQTyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19MSVBPPSIkTElQTyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0xJUE89IiR7YWNfdG9vbF9wcmVmaXh9bGlwbyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitMSVBPPSRhY19jdl9wcm9nX0xJUE8KK2lmIHRlc3QgLW4gIiRMSVBPIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExJUE8iID4mNQorJGFzX2VjaG8gIiRMSVBPIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MSVBPIjsgdGhlbgorICBhY19jdF9MSVBPPSRMSVBPCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibGlwbyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbGlwbzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTElQTys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9MSVBPIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0xJUE89IiRhY19jdF9MSVBPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfTElQTz0ibGlwbyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9MSVBPPSRhY19jdl9wcm9nX2FjX2N0X0xJUE8KK2lmIHRlc3QgLW4gIiRhY19jdF9MSVBPIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0xJUE8iID4mNQorJGFzX2VjaG8gIiRhY19jdF9MSVBPIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfTElQTyIgPSB4OyB0aGVuCisgICAgTElQTz0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBMSVBPPSRhY19jdF9MSVBPCisgIGZpCitlbHNlCisgIExJUE89IiRhY19jdl9wcm9nX0xJUE8iCitmaQorCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX09UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX09UT09MPSIkT1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PVE9PTD0iJHthY190b29sX3ByZWZpeH1vdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitPVE9PTD0kYWNfY3ZfcHJvZ19PVE9PTAoraWYgdGVzdCAtbiAiJE9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9UT09MIiA+JjUKKyRhc19lY2hvICIkT1RPT0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09UT09MIjsgdGhlbgorICBhY19jdF9PVE9PTD0kT1RPT0wKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb3Rvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X09UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09UT09MPSIkYWNfY3RfT1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PVE9PTD0ib3Rvb2wiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfT1RPT0w9JGFjX2N2X3Byb2dfYWNfY3RfT1RPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9PVE9PTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PVE9PTCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfT1RPT0wiID0geDsgdGhlbgorICAgIE9UT09MPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9UT09MPSRhY19jdF9PVE9PTAorICBmaQorZWxzZQorICBPVE9PTD0iJGFjX2N2X3Byb2dfT1RPT0wiCitmaQorCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w2NCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vdG9vbDY0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19PVE9PTDY0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9UT09MNjQiOyB0aGVuCisgIGFjX2N2X3Byb2dfT1RPT0w2ND0iJE9UT09MNjQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PVE9PTDY0PSIke2FjX3Rvb2xfcHJlZml4fW90b29sNjQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorT1RPT0w2ND0kYWNfY3ZfcHJvZ19PVE9PTDY0CitpZiB0ZXN0IC1uICIkT1RPT0w2NCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPVE9PTDY0IiA+JjUKKyRhc19lY2hvICIkT1RPT0w2NCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT1RPT0w2NCI7IHRoZW4KKyAgYWNfY3RfT1RPT0w2ND0kT1RPT0w2NAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sNjQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG90b29sNjQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X09UT09MNjQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0w2NCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0PSIkYWNfY3RfT1RPT0w2NCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09UT09MNjQ9Im90b29sNjQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfT1RPT0w2ND0kYWNfY3ZfcHJvZ19hY19jdF9PVE9PTDY0CitpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0w2NCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PVE9PTDY0IiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT1RPT0w2NCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X09UT09MNjQiID0geDsgdGhlbgorICAgIE9UT09MNjQ9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT1RPT0w2ND0kYWNfY3RfT1RPT0w2NAorICBmaQorZWxzZQorICBPVE9PTDY0PSIkYWNfY3ZfcHJvZ19PVE9PTDY0IgorZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAgIGlmIHRlc3QgLXogIiR7TFRfTVVMVElfTU9EVUxFfSI7IHRoZW4KKwkjIEJ5IGRlZmF1bHQgd2Ugd2lsbCBhZGQgdGhlIC1zaW5nbGVfbW9kdWxlIGZsYWcuIFlvdSBjYW4gb3ZlcnJpZGUKKwkjIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVF9NVUxUSV9NT0RVTEUKKwkjIG5vbi1lbXB0eSBhdCBjb25maWd1cmUgdGltZSwgb3IgYnkgYWRkaW5nIC1tdWx0aV9tb2R1bGUgdG8gdGhlCisJIyBsaW5rIGZsYWdzLgorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwllY2hvICJpbnQgZm9vKHZvaWQpe3JldHVybiAxO30iID4gY29uZnRlc3QuYworCWVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCistZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyIgPiY1CisJJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKwkgIC1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIDI+Y29uZnRlc3QuZXJyCisgICAgICAgIF9sdF9yZXN1bHQ9JD8KKwlpZiB0ZXN0IC1mIGxpYmNvbmZ0ZXN0LmR5bGliICYmIHRlc3QgISAtcyBjb25mdGVzdC5lcnIgJiYgdGVzdCAkX2x0X3Jlc3VsdCA9IDA7IHRoZW4KKwkgIGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKwlmaQorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwlybSAtZiBjb25mdGVzdC4qCisgICAgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID4mNjsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWcuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD15ZXMKK2Vsc2UKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID4mNjsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAtZm9yY2VfbG9hZCBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9sZF9mb3JjZV9sb2FkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfZm9yY2VfbG9hZD1ubworICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgZm9yY2VkX2xvYWRlZCgpIHsgcmV0dXJuIDI7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyIgPiY1CisgICAgICAkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIDI+JjUKKyAgICAgIGVjaG8gIiRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIiA+JjUKKyAgICAgICRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIDI+JjUKKyAgICAgIGVjaG8gIiRSQU5MSUIgbGliY29uZnRlc3QuYSIgPiY1CisgICAgICAkUkFOTElCIGxpYmNvbmZ0ZXN0LmEgMj4mNQorICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSIgPiY1CisgICAgICAkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIDI+Y29uZnRlc3QuZXJyCisgICAgICBfbHRfcmVzdWx0PSQ/CisgICAgICBpZiB0ZXN0IC1mIGNvbmZ0ZXN0ICYmIHRlc3QgISAtcyBjb25mdGVzdC5lcnIgJiYgdGVzdCAkX2x0X3Jlc3VsdCA9IDAgJiYgJEdSRVAgZm9yY2VkX2xvYWQgY29uZnRlc3QgMj4mMSA+L2Rldi9udWxsOyB0aGVuCisJbHRfY3ZfbGRfZm9yY2VfbG9hZD15ZXMKKyAgICAgIGVsc2UKKwljYXQgY29uZnRlc3QuZXJyID4mNQorICAgICAgZmkKKyAgICAgICAgcm0gLWYgY29uZnRlc3QuZXJyIGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QgY29uZnRlc3QuYworICAgICAgICBybSAtcmYgY29uZnRlc3QuZFNZTQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9mb3JjZV9sb2FkIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPiY2OyB9CisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luMS4qKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbiopICMgZGFyd2luIDUueCBvbgorICAgICAgIyBpZiBydW5uaW5nIG9uIDEwLjUgb3IgbGF0ZXIsIHRoZSBkZXBsb3ltZW50IHRhcmdldCBkZWZhdWx0cworICAgICAgIyB0byB0aGUgT1MgdmVyc2lvbiwgaWYgb24geDg2LCBhbmQgMTAuNCwgdGhlIGRlcGxveW1lbnQKKyAgICAgICMgdGFyZ2V0IGRlZmF1bHRzIHRvIDEwLjQuIERvbid0IHlvdSBsb3ZlIGl0PworICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSwkaG9zdCBpbgorCTEwLjAsKjg2Ki1kYXJ3aW44KnwxMC4wLCotZGFyd2luWzkxXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisJMTAuWzAxMl0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworCTEwLiopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisgICAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX3NpbmdsZV9tb2Q9JyRzaW5nbGVfbW9kdWxlJworICAgIGZpCisgICAgaWYgdGVzdCAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nICR7d2x9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltJworICAgIGVsc2UKKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9J34kTk1FRElUIC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiIgJiYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gIm5vIjsgdGhlbgorICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKKyAgICBlbHNlCisgICAgICBfbHRfZHN5bXV0aWw9CisgICAgZmkKKyAgICA7OworICBlc2FjCisKK2ZvciBhY19oZWFkZXIgaW4gZGxmY24uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisKK2Z1bmNfc3RyaXBuYW1lX2NuZiAoKQoreworICBjYXNlICR7Mn0gaW4KKyAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJSR7Mn1cJCUlImA7OworICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWVfY25mCisKKworCisKKworIyBTZXQgb3B0aW9ucworCisKKworICAgICAgICBlbmFibGVfZGxvcGVuPW5vCisKKworICBlbmFibGVfd2luMzJfZGxsPW5vCisKKworICAgICAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zaGFyZWQ7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OworICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc2hhcmVkPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfc2hhcmVkPXllcworZmkKKworCisKKworCisKKworCisKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9eWVzCitmaQorCisKKworCisKKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9waWM7IHBpY19tb2RlPSIkd2l0aHZhbCIKK2Vsc2UKKyAgcGljX21vZGU9ZGVmYXVsdAorZmkKKworCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKKworCisKKworCisKKworICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbDsgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCitmaQorCisKKworCisKKworCisKKworCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGx0bWFpbiIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X29iamRpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHJtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1CiskYXNfZWNobyAiJGx0X2N2X29iamRpciIgPiY2OyB9CitvYmpkaXI9JGx0X2N2X29iamRpcgorCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTFRfT0JKRElSICIkbHRfY3Zfb2JqZGlyLyIKK19BQ0VPRgorCisKKworCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBHbG9iYWwgdmFyaWFibGVzOgorb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX01BR0lDX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGU7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0CisKK2x0X3NhdmVfQ0M9IiRDQyIKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0PSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCisKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBudmNjKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1YY29tcGlsZXIgLWZuby1idWlsdGluJyA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCisgICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCisKKworCisKKworICBsdF9wcm9nX2NvbXBpbGVyX3dsPQorbHRfcHJvZ19jb21waWxlcl9waWM9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KKworCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbMy05XSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVhsaW5rZXIgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1YY29tcGlsZXIgLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWM9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisgICAgICBlY2MqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBpY2MgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisgICAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KKyAgICAgIGljYyogfCBpZm9ydCopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIExhaGV5IEZvcnRyYW4gOC4xLgorICAgICAgbGY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLS1zaGFyZWQnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy0tc3RhdGljJworCTs7CisgICAgICBuYWdmb3IqKQorCSMgTkFHIEZvcnRyYW4gY29tcGlsZXIKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsLVdsLCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1QSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCTs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZnBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqIHwgYmd4bCogfCBiZ2YqIHwgbXBpeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSwgMTEuMSBvbiBQUEMgYW5kIEJsdWVHZW5lCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXFwaWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1xc3RhdGljbGluaycKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBGKiB8ICpTdW4qRm9ydHJhbiopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPScnCisJICA7OworCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgcmRvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZjc3KiB8IGY5MCogfCBmOTUqIHwgc3VuZjc3KiB8IHN1bmY5MCogfCBzdW5mOTUqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS2NvbmZvcm1fcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKKyAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWM9JGx0X3Byb2dfY29tcGlsZXJfcGljCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljIiA+JjY7IH0KK2x0X3Byb2dfY29tcGlsZXJfcGljPSRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3M9bm8KKyAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpYyBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljIiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworZmkKKworZmkKKworCisKKworCisKKworCisKKworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgorICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KK2ZpCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNjsgfQorCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkUk0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICAkUk0gLXIgY29uZnRlc3QKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2OyB9CisKKworCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQorICBoYXJkX2xpbmtzPXllcworICAkUk0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisKKyAgcnVucGF0aF92YXI9CisgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQorICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgYXJjaGl2ZV9jbWRzPQorICBhcmNoaXZlX2V4cHN5bV9jbWRzPQorICBjb21waWxlcl9uZWVkc19vYmplY3Q9bm8KKyAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubworICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CisgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgaGFyZGNvZGVfYXV0b21hdGljPW5vCisgIGhhcmRjb2RlX2RpcmVjdD1ubworICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9bm8KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0KKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKyAgaGFyZGNvZGVfbWludXNfTD1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCisgIGluaGVyaXRfcnBhdGg9bm8KKyAgbGlua19hbGxfZGVwbGlicz11bmtub3duCisgIG1vZHVsZV9jbWRzPQorICBtb2R1bGVfZXhwc3ltX2NtZHM9CisgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9CisgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQorICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9CisgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIGluY2x1ZGVfZXhwc3ltcz0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBleGNsdWRlX2V4cHN5bXM9J19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKicKKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgbGludXgqIHwgaypic2QqLWdudSB8IGdudSopCisgICAgbGlua19hbGxfZGVwbGlicz1ubworICAgIDs7CisgIGVzYWMKKworICBsZF9zaGxpYnM9eWVzCisKKyAgIyBPbiBzb21lIHRhcmdldHMsIEdOVSBsZCBpcyBjb21wYXRpYmxlIGVub3VnaCB3aXRoIHRoZSBuYXRpdmUgbGlua2VyCisgICMgdGhhdCB3ZSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBuYXRpdmUgaW50ZXJmYWNlIGZvciBib3RoLgorICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT1ubworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKwkjIFRoZSBBSVggcG9ydCBvZiBHTlUgbGQgaGFzIGFsd2F5cyBhc3BpcmVkIHRvIGNvbXBhdGliaWxpdHkKKwkjIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIuICBIb3dldmVyLCBhcyB0aGUgd2FybmluZyBpbiB0aGUgR05VIGxkCisJIyBibG9jayBzYXlzLCB2ZXJzaW9ucyBiZWZvcmUgMi4xOS41KiBjb3VsZG4ndCByZWFsbHkgY3JlYXRlIHdvcmtpbmcKKwkjIHNoYXJlZCBsaWJyYXJpZXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGludGVyZmFjZSB1c2VkLgorCWNhc2UgYCRMRCAtdiAyPiYxYCBpbgorCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuMTkuNSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi5bMi05XSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgWzMtOV0qKSA7OworCSAgKikKKwkgICAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqKQorCWx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCTs7CisgICAgZXNhYworICBmaQorCisgIGlmIHRlc3QgIiRsdF91c2VfZ251X2xkX2ludGVyZmFjZSIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGVsc2UKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAqR05VXCBnb2xkKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeFszLTldKikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi4xOSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIGJpbnV0aWxzCisqKiogMi4yMCBvciBhYm92ZSwgb3IgbW9kaWZ5IHlvdXIgUEFUSCBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQuCisqKiogWW91IHdpbGwgdGhlbiBuZWVkIHRvIHJlc3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4KKworX0xUX0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz1ubworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxIERBVEEvO3MvXi4qWyBdX19ubV9fXChbXiBdKlwpWyBdW14gXSovXDEgREFUQS87L15JWyBdL2Q7L15bQUlUV11bIF0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICAgIGV4Y2x1ZGVfZXhwc3ltcz0nW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJYXJjaGl2ZV9leHBzeW1fY21kcz0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgICAgOzsKKworICAgIGludGVyaXhbMy05XSopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICB0bXBfZGlldD1ubworICAgICAgaWYgdGVzdCAiJGhvc3Rfb3MiID0gbGludXgtZGlldGxpYmM7IHRoZW4KKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZGlldFwgKikgdG1wX2RpZXQ9eWVzOzsJIyBsaW51eC1kaWV0bGliYyB3aXRoIHN0YXRpYyBsaW5raW5nICghZGlldC1keW4pCisJZXNhYworICAgICAgZmkKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRFR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsIFwKKwkgJiYgdGVzdCAiJHRtcF9kaWV0IiA9IG5vCisgICAgICB0aGVuCisJdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnCisJY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCisgICAgICAgIHBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorCQkJCQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7CisJZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7CisJZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKKwlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgorCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKKwlsZjk1KikJCQkJIyBMYWhleSBGb3J0cmFuIDguMQorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisJICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7CisJeGxbY0NdKiB8IGJneGxbY0NdKiB8IG1waXhsW2NDXSopICMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKKwkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJworCSAgdG1wX2FkZGZsYWc9IDs7CisJbnZjYyopCSMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCisJICA7OworCWVzYWMKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBDKikJCQkjIFN1biBDIDUuOQorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBjb21waWxlcl9uZWVkc19vYmplY3Q9eWVzCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJKlN1blwgRiopCQkJIyBTdW4gRm9ydHJhbiA4LjMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwllc2FjCisJYXJjaGl2ZV9jbWRzPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisgICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgICBmaQorCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwl4bGYqIHwgYmdmKiB8IGJneGxmKiB8IG1waXhsZiopCisJICAjIElCTSBYTCBGb3J0cmFuIDEwLjEgb24gUFBDIGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnMgaXRzZWxmCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSctcnBhdGggJGxpYmRpcicKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLW8gJGxpYicKKwkgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLXZlcnNpb24tc2NyaXB0ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCSAgZmkKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90CisqKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKwk7OworCSopCisJICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCisJICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQorCSAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KKwkgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIGxkX3NobGlicz1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0gbm87IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgIGZpCisgIGVsc2UKKyAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFs0LTldKikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsCisJIyBkZWZpbmVkIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgorCWlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4WzUtOV0qKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kcz0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICBmaWxlX2xpc3Rfc3BlYz0nJHt3bH0tZiwnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKwkgIGZpCisJICA7OworCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCWZpCisJbGlua19hbGxfZGVwbGlicz1ubworICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nLWJlcm9rJworICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKyAgICAgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgICBpZiB0ZXN0ICIke2x0X2N2X2FpeF9saWJwYXRoK3NldH0iID0gc2V0OyB0aGVuCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aAorZWxzZQorICBpZiAke2x0X2N2X2FpeF9saWJwYXRoXys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJICAvXjAvIHsKKwkgICAgICBzL14wICAqXChbXiBdKlwpICokL1wxLworCSAgICAgIHAKKwkgIH0KKyAgICAgIH0nCisgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfCitmaQorCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ii16IG5vZGVmcyIKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisJZWxzZQorCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKwkgIyBlbXB0eSBleGVjdXRhYmxlLgorCSBpZiB0ZXN0ICIke2x0X2N2X2FpeF9saWJwYXRoK3NldH0iID0gc2V0OyB0aGVuCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aAorZWxzZQorICBpZiAke2x0X2N2X2FpeF9saWJwYXRoXys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nCisgICAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJICAvXjAvIHsKKwkgICAgICBzL14wICAqXChbXiBdKlwpICokL1wxLworCSAgICAgIHAKKwkgIH0KKyAgICAgIH0nCisgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoXz0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfCitmaQorCisJIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVyb2snCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGVsc2UKKwkgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSckY29udmVuaWVuY2UnCisJICBmaQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVs0NV0qKQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjbCopCisJIyBOYXRpdmUgTVNWQworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKwlhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJZmlsZV9saXN0X3NwZWM9J0AnCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwlsaWJleHQ9bGliCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJc2hyZXh0X2NtZHM9Ii5kbGwiCisJIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCWFyY2hpdmVfY21kcz0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJYXJjaGl2ZV9leHBzeW1fY21kcz0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgc2VkIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGVsc2UKKwkgICAgc2VkIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGZpfgorCSAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgbGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICk9J3RydWUnCisJZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKwlleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU11bIF0vcy8uKlsgXVwoW14gXSpcKS9cMSxEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXVsgXS9zLy4qWyBdLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisJIyBEb24ndCB1c2UgcmFubGliCisJb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworCXBvc3RsaW5rX2NtZHM9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICouZXhlfCouRVhFKSA7OworCSAgICAqKQorCSAgICAgIGx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICBsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCSAgICAgIDs7CisJICBlc2FjfgorCSAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICBmaScKKwk7OworICAgICAgKikKKwkjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworCWFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwlsaWJleHQ9bGliCisJIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJc2hyZXh0X2NtZHM9Ii5kbGwiCisJIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorCWFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBmdW5jX2VjaG9fYWxsICIkZGVwbGlicyIgfCAkU0VEICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKwlvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSd0cnVlJworCSMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisJb2xkX2FyY2hpdmVfY21kcz0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworCWVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorCisKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgaGFyZGNvZGVfZGlyZWN0PW5vCisgIGhhcmRjb2RlX2F1dG9tYXRpYz15ZXMKKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAieWVzIjsgdGhlbgorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSdgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UgJHt3bH0tZm9yY2VfbG9hZCwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCcKKyAgZWxzZQorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScnCisgIGZpCisgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisgICAgYXJjaGl2ZV9jbWRzPSJcJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAkX2x0X2Rhcl9zaW5nbGVfbW9kJHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9jbWRzPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9leHBzeW1fY21kcz0ic2VkIC1lICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorCisgIGVsc2UKKyAgbGRfc2hsaWJzPW5vCisgIGZpCisKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPScrYiAkbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCWhhcmRjb2RlX2RpcmVjdD15ZXMKKwloYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKworCSAgIyBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgMTEuMDAgY29tcGlsZXIgZG8gbm90IHVuZGVyc3RhbmQgLWIgeWV0CisJICAjIChIUDkyNDUzLTAxIEEuMTEuMDEuMjAgZG9lc24ndCwgSFA5MjQ1My0wMSBCLjExLlguMzUxNzUtMzUxNzYuR1AgZG9lcykKKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJENDIHVuZGVyc3RhbmRzIC1iIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRDQyB1bmRlcnN0YW5kcyAtYi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX19iKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9fYj1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTIC1iIgorICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX19iIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX19iIiA9IHh5ZXM7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworZWxzZQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKK2ZpCisKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIGhhcmRjb2RlX2RpcmVjdD1ubworCSAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfZGlyZWN0PXllcworCSAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSMgVHJ5IHRvIHVzZSB0aGUgLWV4cG9ydGVkX3N5bWJvbCBsZCBvcHRpb24sIGlmIGl0IGRvZXMgbm90CisJIyB3b3JrLCBhc3N1bWUgdGhhdCAtZXhwb3J0c19maWxlIGRvZXMgbm90IHdvcmsgZWl0aGVyIGFuZAorCSMgaW1wbGljaXRseSBleHBvcnQgYWxsIHN5bWJvbHMuCisJIyBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgYWxsIGxhbmd1YWdlcywgc28gbm8gcGVyLXRhZyBjYWNoZSB2YXJpYWJsZS4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRob3N0X29zIGxpbmtlciBhY2NlcHRzIC1leHBvcnRlZF9zeW1ib2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGhvc3Rfb3MgbGlua2VyIGFjY2VwdHMgLWV4cG9ydGVkX3N5bWJvbC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisJICAgTERGTEFHUz0iJExERkxBR1MgLXNoYXJlZCAke3dsfS1leHBvcnRlZF9zeW1ib2wgJHt3bH1mb28gJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9L2Rldi9udWxsIgorCSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2ludCBmb28gKHZvaWQpIHsgcmV0dXJuIDA7IH0KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXMKK2Vsc2UKKyAgbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2w9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgICAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPiY2OyB9CisJaWYgdGVzdCAiJGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sIiA9IHllczsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtZXhwb3J0c19maWxlICRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSdubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaW5oZXJpdF9ycGF0aD15ZXMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJaGFyZGNvZGVfZGlyZWN0PXllcworCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwloYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorCSAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworCSAgICAgOzsKKwkgICAqKQorCSAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICAgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHM9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IHByaW50ZiAiJXNcXG4iICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAkY29tcGlsZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JFJNICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSdubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisgICAgICBlbHNlCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJDb21waWxlcnMgNS4wIiopCisJICB3bGFyYz0nJworCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJKikKKwkgIHdsYXJjPScke3dsfScKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikKKwkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKKwkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KKwkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQorJGFzX2VjaG8gIiRsZF9zaGxpYnMiID4mNjsgfQordGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorCisKKworCisKKworCisKKworCisKKworCisKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAkUk0gY29uZnRlc3QqCisJZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKwlpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisJICBzb25hbWU9Y29uZnRlc3QKKwkgIGxpYj1jb25mdGVzdAorCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisJICBkZXBsaWJzPQorCSAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKKwkgIHBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworCSAgY29tcGlsZXJfZmxhZ3M9LXYKKwkgIGxpbmtlcl9mbGFncz0tdgorCSAgdmVyc3RyaW5nPQorCSAgb3V0cHV0X29iamRpcj0uCisJICBsaWJuYW1lPWNvbmZ0ZXN0CisJICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisJICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorCSAgdGhlbgorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworCSAgZWxzZQorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgIGZpCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorCWZpCisJJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWRfc3RyaXBfZXE9InMsPVwoW0EtWmEtel06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAorICAgIDs7CisgICopCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgOzsKKyAgZXNhYworICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtsdF9mb29dKys7IH0KKyAgaWYgKGx0X2ZyZXFbbHRfZm9vXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQorfSdgCisgICMgQVdLIHByb2dyYW0gYWJvdmUgZXJyb25lb3VzbHkgcHJlcGVuZHMgJy8nIHRvIEM6L2Rvcy9wYXRocworICAjIGZvciB0aGVzZSBob3N0cy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8XAorICAgICAgJFNFRCAncywvXChbQS1aYS16XTpcKSxcMSxnJ2AgOzsKKyAgZXNhYworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4WzQtOV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xpYi93MzJhcGkiCisgICAgICA7OworICAgIG1pbmd3KiB8IGNlZ2NjKikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisKKyAgKixjbCopCisgICAgIyBOYXRpdmUgTVNWQworICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5kbGwubGliJworCisgICAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgICBtaW5ndyopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9CisgICAgICBsdF9zYXZlX2lmcz0kSUZTCisgICAgICBJRlM9JzsnCisgICAgICBmb3IgbHRfcGF0aCBpbiAkTElCCisgICAgICBkbworICAgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAgICMgTGV0IERPUyB2YXJpYWJsZSBleHBhbnNpb24gcHJpbnQgdGhlIHNob3J0IDguMyBzdHlsZSBmaWxlIG5hbWUuCisgICAgICAgIGx0X3BhdGg9YGNkICIkbHRfcGF0aCIgMj4vZGV2L251bGwgJiYgY21kIC8vQyAiZm9yICVpIGluICgiLiIpIGRvIEBlY2hvICV+c2kiYAorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgJGx0X3BhdGgiCisgICAgICBkb25lCisgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAjIENvbnZlcnQgdG8gTVNZUyBzdHlsZS4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgc2VkIC1lICdzfFxcXFx8L3xnJyAtZSAnc3wgXFwoW2EtekEtWl1cXCk6fCAvXFwxfGcnIC1lICdzfF4gfHwnYAorICAgICAgOzsKKyAgICBjeWd3aW4qKQorICAgICAgIyBDb252ZXJ0IHRvIHVuaXggZm9ybSwgdGhlbiB0byBkb3MgZm9ybSwgdGhlbiBiYWNrIHRvIHVuaXggZm9ybQorICAgICAgIyBidXQgdGhpcyB0aW1lIGRvcyBzdHlsZSAobm8gc3BhY2VzISkgc28gdGhhdCB0aGUgdW5peCBmb3JtIGxvb2tzCisgICAgICAjIGxpa2UgL2N5Z2RyaXZlL2MvUFJPR1JBfjE6L2N5Z2RyLi4uCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJExJQiJgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tZG9zICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiAyPi9kZXYvbnVsbGAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICA7OworICAgICopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRMSUIiCisgICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkR1JFUCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgICMgRklYTUU6IGZpbmQgdGhlIHNob3J0IG5hbWUgb3IgdGhlIHBhdGggY29tcG9uZW50cywgYXMgc3BhY2VzIGFyZQorICAgICAgIyBjb21tb24uIChlLmcuICJQcm9ncmFtIEZpbGVzIiAtPiAiUFJPR1JBfjEiKQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGluay5leGUnCisgICAgOzsKKworICAqKQorICAgICMgQXNzdW1lIE1TVkMgd3JhcHBlcgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKyAgZXNhYworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCisKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaGFpa3UqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NSwgLi4uCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICAjIG9yIGZhaWxzIG91dHJpZ2h0LCBzbyBvdmVycmlkZSBhdG9taWNhbGx5OgorICBpbnN0YWxsX292ZXJyaWRlX21vZGU9NTU1CisgIDs7CisKK2ludGVyaXhbMy05XSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgaWYgJHtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICBzYXZlX2xpYmRpcj0kbGliZGlyCisgICAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJGx0X3Byb2dfY29tcGlsZXJfd2xcIjsgXAorCSBMREZMQUdTPVwiXCRMREZMQUdTICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIiCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGlmICAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGw7IHRoZW4gOgorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCitmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgICAgbGliZGlyPSRzYXZlX2xpYmRpcgorCitmaQorCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMgMj4vZGV2L251bGwiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsJIF0qaHdjYXBbCSBdL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7cy8iLy9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2RlbGYqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworcmRvcyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordHBmKikKKyAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KK2hhcmRjb2RlX2FjdGlvbj0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiB8fAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQorJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb24iID4mNjsgfQorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluayB8fAorICAgdGVzdCAiJGluaGVyaXRfcnBhdGgiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKworCisKKworICBpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgICA7OworCisgICopCisgICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2hsX2xvYWQiICJhY19jdl9mdW5jX3NobF9sb2FkIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzaGxfbG9hZCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCitlbHNlCisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImRsb3BlbiIgImFjX2N2X2Z1bmNfZGxvcGVuIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbGRfZGxkX2xpbmsrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxkX2xpbmsgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbGRfbGluayAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPXllcworZWxzZQorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9kbG9wZW5fc2VsZis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9CitfTFRfRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mNSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZj1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKKworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjY7IH0KKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKKyAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQoraW50IGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOworI2VuZGlmCisKK2ludCBmbm9yZCAoKSB7IHJldHVybiA0MjsgfQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZQorICAgICAgICB7CisJICBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSAgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAgICAgZWxzZSBwdXRzIChkbGVycm9yICgpKTsKKwl9CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICByZXR1cm4gc3RhdHVzOworfQorX0xUX0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9CisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgZmkKKyAgICA7OworICAqKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgIDs7CisgIGVzYWMKK2ZpCisKKworCisKKworCisKKworCisKKworCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbNC05XSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9CisKKworCisKK2ZpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworICAgICAgaWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKKyAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKKyAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KKyAgYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkQ1hYQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1hYQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENYWENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDWFhDUFAgaW4gIiRDWFggLUUiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKKworZmkKKyAgQ1hYQ1BQPSRhY19jdl9wcm9nX0NYWENQUAorZWxzZQorICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDWFhDUFAiID4mNQorJGFzX2VjaG8gIiRDWFhDUFAiID4mNjsgfQorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQysrIHByZXByb2Nlc3NvciBcIiRDWFhDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2Vsc2UKKyAgX2x0X2NhdWdodF9DWFhfZXJyb3I9eWVzCitmaQorCithY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCithcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KK2FsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0KK2Fsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9bm8KK2FyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPQorY29tcGlsZXJfbmVlZHNfb2JqZWN0X0NYWD1ubworZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0KK2hhcmRjb2RlX2RpcmVjdF9DWFg9bm8KK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9bm8KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPQoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFg9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KK2hhcmRjb2RlX21pbnVzX0xfQ1hYPW5vCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD11bnN1cHBvcnRlZAoraGFyZGNvZGVfYXV0b21hdGljX0NYWD1ubworaW5oZXJpdF9ycGF0aF9DWFg9bm8KK21vZHVsZV9jbWRzX0NYWD0KK21vZHVsZV9leHBzeW1fY21kc19DWFg9CitsaW5rX2FsbF9kZXBsaWJzX0NYWD11bmtub3duCitvbGRfYXJjaGl2ZV9jbWRzX0NYWD0kb2xkX2FyY2hpdmVfY21kcworcmVsb2FkX2ZsYWdfQ1hYPSRyZWxvYWRfZmxhZworcmVsb2FkX2NtZHNfQ1hYPSRyZWxvYWRfY21kcworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPQorZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9DWFg9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBDWFggY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW10pIHsgcmV0dXJuKDApOyB9JworCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKworCisKKworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSAtciBjb25mdGVzdCoKKworCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9JENDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgbHRfc2F2ZV9MRD0kTEQKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBHQ0M9JEdYWAorICBsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorICBsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCisgIGZpCisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wYXRoX0xECisgIGZpCisgIHRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCisgIENDPSR7Q1hYLSJjKysifQorICBDRkxBR1M9JENYWEZMQUdTCisgIGNvbXBpbGVyPSRDQworICBjb21waWxlcl9DWFg9JENDCisgIGZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCisKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisgICAgIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQorICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9JyAtZm5vLWJ1aWx0aW4nCisgICAgZWxzZQorICAgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9CitmaQoraWYgJHtsdF9jdl9wYXRoX0xEKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1CiskYXNfZWNobyAiJExEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQordGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfZ251X2xkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKKworCisKKworCisgICAgICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKKyAgICAgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDICRwaWNfZmxhZyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgICAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8CisJICAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9CisgICAgICAgIGZpCisgICAgICBlbHNlCisgICAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICAgIHdsYXJjPQorCisgICAgICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBmaQorCisgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCisgICAgZWxzZQorICAgICAgR1hYPW5vCisgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgd2xhcmM9CisgICAgZmkKKworICAgICMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworICAgICAgYWl4WzQtOV0qKQorICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeFs1LTldKikKKwkgICAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICAgICAgY2FzZSAkbGRfZmxhZyBpbgorCSAgICAgICotYnJ0bCopCisJICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICAgICAgYnJlYWsKKwkgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIDs7CisgICAgICAgICAgZXNhYworCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICAgIGZpCisKKyAgICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJworICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgICAgICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYPXllcworICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0nOicKKyAgICAgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisgICAgICAgIGZpbGVfbGlzdF9zcGVjX0NYWD0nJHt3bH0tZiwnCisKKyAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1MJGxpYmRpcicKKwkgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgaWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgaWYgJHtsdF9jdl9haXhfbGlicGF0aF9fQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworICBsdF9haXhfbGlicGF0aF9zZWQ9JworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9JworICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF9fQ1hYIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgdGVzdCAteiAiJGx0X2N2X2FpeF9saWJwYXRoX19DWFgiOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKworZmkKKworICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWAorZmkKKworICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0iLXogbm9kZWZzIgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgICAgICBlbHNlCisJICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisJICAgIGlmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIGlmICR7bHRfY3ZfYWl4X2xpYnBhdGhfX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkbHRfY3ZfYWl4X2xpYnBhdGhfX0NYWCI7IHRoZW4KKyAgICBsdF9jdl9haXhfbGlicGF0aF9fQ1hYPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF9fQ1hYIjsgdGhlbgorICAgIGx0X2N2X2FpeF9saWJwYXRoX19DWFg9Ii91c3IvbGliOi9saWIiCisgIGZpCisKK2ZpCisKKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoX19DWFgKK2ZpCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tYmVybm90b2snCisJICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm9rJworCSAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICBlbHNlCisJICAgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSckY29udmVuaWVuY2UnCisJICAgIGZpCisJICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgICAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkCisJICAgICMgbGlicmFyaWVzLgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIDs7CisKKyAgICAgIGJlb3MqKQorCWlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorCSAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWVsc2UKKwkgIGxkX3NobGlic19DWFg9bm8KKwlmaQorCTs7CisKKyAgICAgIGNob3J1cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgKikKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgbGRfc2hsaWJzX0NYWD1ubworCSAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJY2FzZSAkR1hYLCRjY19iYXNlbmFtZSBpbgorCSxjbCogfCBubyxjbCopCisJICAjIE5hdGl2ZSBNU1ZDCisJICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisJICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyAnCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9dW5zdXBwb3J0ZWQKKwkgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9eWVzCisJICBmaWxlX2xpc3Rfc3BlY19DWFg9J0AnCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCSAgbGliZXh0PWxpYgorCSAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJICBzaHJleHRfY21kcz0iLmRsbCIKKwkgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgJFNFRCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICAgIGVsc2UKKwkgICAgICAkU0VEIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZml+CisJICAgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgICAgbGlua25hbWVzPScKKwkgICMgVGhlIGxpbmtlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgc3RhdGljIGxpYiBpZiB3ZSBidWlsZCBhIERMTC4KKwkgICMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCBDWFgpPSd0cnVlJworCSAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFg9eWVzCisJICAjIERvbid0IHVzZSByYW5saWIKKwkgIG9sZF9wb3N0aW5zdGFsbF9jbWRzX0NYWD0nY2htb2QgNjQ0ICRvbGRsaWInCisJICBwb3N0bGlua19jbWRzX0NYWD0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICAgKikKKwkJbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCQlsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCQk7OworCSAgICBlc2FjfgorCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGx0X291dHB1dGZpbGUifgorCSAgICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICAgIGZpJworCSAgOzsKKwkqKQorCSAgIyBnKysKKwkgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCBDWFgpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorCSAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctTCRsaWJkaXInCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPXVuc3VwcG9ydGVkCisJICBhbHdheXNfZXhwb3J0X3N5bWJvbHNfQ1hYPW5vCisJICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD15ZXMKKworCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBlbHNlCisJICAgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgZml+CisJICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgIGVsc2UKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgZmkKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorCisKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgaGFyZGNvZGVfYXV0b21hdGljX0NYWD15ZXMKKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKKyAgaWYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gInllcyI7IHRoZW4KKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworICBlbHNlCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScnCisgIGZpCisgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9IiRfbHRfZGFyX2FsbG93X3VuZGVmaW5lZCIKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgaWZvcnQqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9eWVzIDs7CisgICAgICopIF9sdF9kYXJfY2FuX3NoYXJlZD0kR0NDIDs7CisgIGVzYWMKKyAgaWYgdGVzdCAiJF9sdF9kYXJfY2FuX3NoYXJlZCIgPSAieWVzIjsgdGhlbgorICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKKyAgICBhcmNoaXZlX2NtZHNfQ1hYPSJcJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAkX2x0X2Rhcl9zaW5nbGVfbW9kJHtfbHRfZHN5bXV0aWx9IgorICAgIG1vZHVsZV9jbWRzX0NYWD0iXCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZHN5bXV0aWx9IgorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICR7X2x0X2Rhcl9zaW5nbGVfbW9kfSR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWD0ic2VkIC1lICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiAhPSAieWVzIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0iXCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2RzeW11dGlsfSIKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIGZpCisKKyAgZWxzZQorICBsZF9zaGxpYnNfQ1hYPW5vCisgIGZpCisKKwk7OworCisgICAgICBkZ3V4KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBlYysrKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2RbMTJdKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQorCSMgc3dpdGNoIHRvIEVMRgorICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QtZWxmKikKKyAgICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAgICAgIyBjb252ZW50aW9ucworICAgICAgICBsZF9zaGxpYnNfQ1hYPXllcworICAgICAgICA7OworCisgICAgICBnbnUqKQorICAgICAgICA7OworCisgICAgICBoYWlrdSopCisgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDkqKQorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKyAgICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgICAgaGFyZGNvZGVfbWludXNfTF9DWFg9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkgICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKyAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBhQ0MqKQorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBocHV4MTAqfGhwdXgxMSopCisgICAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworICAgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisJICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCisgICAgICAgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9DWFg9eWVzCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICAgIGFDQyopCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgaHBwYSo2NCopCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgIGlhNjQqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICBpYTY0KikKKwkgICAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgICopCisJICAgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICBlc2FjCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBpbnRlcml4WzMtOV0qKQorCWhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBsaW5rX2FsbF9kZXBsaWJzX0NYWD15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisgICAgICAgIGluaGVyaXRfcnBhdGhfQ1hYPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqICkKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgd2l0aF9nbnVfbGQ9eWVzCisJICAgICMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJICAgICMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJICAgICMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJICAgIGNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSAgICAgICoiVmVyc2lvbiA3LiIqKQorCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgICAqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgICAgICAgdG1wX2lkeW49CisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCQkgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkJZXNhYworCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICBlc2FjCisJICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICA7OworICAgICAgICAgIHBnQ0MqIHwgcGdjcHAqKQorICAgICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgY2FzZSBgJENDIC1WYCBpbgorCSAgICAqcGdDQ1wgWzEtNV0uKiB8ICpwZ2NwcFwgWzEtNV0uKikKKwkgICAgICBwcmVsaW5rX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2JqcyAkbGlib2JqcyAkY29tcGlsZV9kZXBsaWJzfgorCQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAiJworCSAgICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2xkb2JqcyRvbGRfZGVwbGlic34KKwkJJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGB+CisJCSRSQU5MSUIgJG9sZGxpYicKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgc29ydCB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgKikgIyBWZXJzaW9uIDYgYW5kIGFib3ZlIHVzZSB3ZWFrIHN5bWJvbHMKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICBlc2FjCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCisKKwkgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1ycGF0aCAkbGliZGlyJworCSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkImA7IHRlbXBsaXN0PWBmdW5jX2VjaG9fYWxsICIkdGVtcGxpc3QiIHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisJICB4bCogfCBtcGl4bCogfCBiZ3hsKikKKwkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQywgd2l0aCBHTlUgbGQKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQljYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQkkQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgICAgZmkKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMnCisJICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwkgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgICAgY29tcGlsZXJfbmVlZHNfb2JqZWN0X0NYWD15ZXMKKworCSAgICAgICMgTm90IHN1cmUgd2hldGhlciBzb21ldGhpbmcgYmFzZWQgb24KKwkgICAgICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCisJICAgICAgIyB3b3VsZCBiZSBiZXR0ZXIuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbHlueG9zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisKKyAgICAgIG04OGsqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworCTs7CisKKyAgICAgIG12cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgY3h4KikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKwkgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIG5ldGJzZCopCisgICAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKwkgIHdsYXJjPQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWZpCisJIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKwk7OworCisgICAgICAqbnRvKiB8ICpxbngqKQorICAgICAgICBsZF9zaGxpYnNfQ1hYPXllcworCTs7CisKKyAgICAgIG9wZW5ic2QyKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgorCWxkX3NobGlic19DWFg9bm8KKwk7OworCisgICAgICBvcGVuYnNkKikKKwlpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCSAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYPXllcworCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworCSAgZmkKKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKKwllbHNlCisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworCisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwkgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKSBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgICAgKikgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICBlc2FjCisJICAgIDs7CisgICAgICAgICAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICBjeHgqKQorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopCisJICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCQk7OworCSAgICAgICopCisJICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgICAgICAgICAkUk0gJGxpYi5leHAnCisJICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLXJwYXRoICRsaWJkaXInCisJCTs7CisJICAgIGVzYWMKKworCSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICBvc2YzKikKKwkgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgICAqKQorCSAgICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICBlc2FjCisKKwkgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPToKKworCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBwc29zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICAgICAgOzsKKworICAgICAgc3Vub3M0KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBsZF9zaGxpYnNfQ1hYPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBzb2xhcmlzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyogfCBzdW5DQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgICAgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisJICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPW5vCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJICAgICAgKikKKwkJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4KKwkgICAgICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJICAgICMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCSAgICBvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0teiAke3dsfWRlZnMnCisJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGVsc2UKKwkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgICAgICMgcGxhdGZvcm0uCisJICAgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisJICAgICAgZmkKKworCSAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SICR3bCRsaWJkaXInCisJICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCQlzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJCSopCisJCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJCSAgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgICBub191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgQ0MqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorCSMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisJIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworCSMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorCSMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKwkjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKwkjIGFzIC16IGRlZnMuCisJbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LHRleHQnCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LG5vZGVmcycKKwlhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1SLCRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCisJbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tQmV4cG9ydCcKKwlydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIG9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJG9sZG9ianN+CisJICAgICAgJyIkb2xkX2FyY2hpdmVfY21kc19DWFgiCisJICAgIHJlbG9hZF9jbWRzX0NYWD0nJENDIC1UcHJlbGlua19vYmplY3RzICRyZWxvYWRfb2Jqc34KKwkgICAgICAnIiRyZWxvYWRfY21kc19DWFgiCisJICAgIDs7CisJICAqKQorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJZXNhYworICAgICAgOzsKKworICAgICAgdGFuZGVtKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIGxkX3NobGlic19DWFg9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgbGRfc2hsaWJzX0NYWD1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHZ4d29ya3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgICA7OworICAgIGVzYWMKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGRfc2hsaWJzX0NYWCIgPiY1CiskYXNfZWNobyAiJGxkX3NobGlic19DWFgiID4mNjsgfQorICAgIHRlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworICAgIEdDQ19DWFg9IiRHWFgiCisgICAgTERfQ1hYPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICAjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorcHJlZGVwX29iamVjdHNfQ1hYPQorcG9zdGRlcF9vYmplY3RzX0NYWD0KK3ByZWRlcHNfQ1hYPQorcG9zdGRlcHNfQ1hYPQorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0KKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK19MVF9FT0YKKworCitfbHRfbGliZGVwc19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitjYXNlICIkQ0MgJENGTEFHUyAiIGluICMoCisqXCAtZmx0bypcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLWx0byIgOzsKKypcIC1md2hvcHIqXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby13aG9wciIgOzsKK2VzYWMKKworaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHtwcmV2fSR7cH0gaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgIyBFeHBhbmQgdGhlIHN5c3Jvb3QgdG8gZWFzZSBleHRyYWN0aW5nIHRoZSBkaXJlY3RvcmllcyBsYXRlci4KKyAgICAgICBpZiB0ZXN0IC16ICIkcHJldiI7IHRoZW4KKyAgICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWVfY25mICctTCcgJycgIiRwIjsgcHJldj0tTDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLVInICcnICIkcCI7IHByZXY9LVI7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLWwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1sJyAnJyAiJHAiOyBwcmV2PS1sOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBmaQorICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICA9KikgZnVuY19zdHJpcG5hbWVfY25mICc9JyAnJyAiJHAiOyBwPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICR7cHJldn0gaW4KKwkgLUwgfCAtUikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCI7IHRoZW4KKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFg9IiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJHBvc3RkZXBzX0NYWCI7IHRoZW4KKwkgICBwb3N0ZGVwc19DWFg9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgcG9zdGRlcHNfQ1hYPSIke3Bvc3RkZXBzX0NYWH0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICBwcmV2PQorICAgICAgIDs7CisKKyAgICAqLmx0by4kb2JqZXh0KSA7OyAjIElnbm9yZSBHQ0MgTFRPIG9iamVjdHMKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRwcmVkZXBfb2JqZWN0c19DWFgiOyB0aGVuCisJICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcCIKKwkgZWxzZQorCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHByZWRlcF9vYmplY3RzX0NYWCAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRwb3N0ZGVwX29iamVjdHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwIgorCSBlbHNlCisJICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHBvc3RkZXBfb2JqZWN0c19DWFggJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgQ1hYIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRSTSAtZiBjb25mZXN0LiRvYmpleHQKK0NGTEFHUz0kX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1MKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXhbMy05XSopCisgICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KKyAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KKyAgcHJlZGVwX29iamVjdHNfQ1hYPQorICBwb3N0ZGVwX29iamVjdHNfQ1hYPQorICBwb3N0ZGVwc19DWFg9CisgIDs7CisKK2xpbnV4KikKKyAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisgICpTdW5cIEMqKQorICAgICMgU3VuIEMrKyA1LjkKKworICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgcG9zdGRlcHNfQ1hYPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyogfCBzdW5DQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIHBvc3RkZXBzX0NYWD0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworCisKK2Nhc2UgIiAkcG9zdGRlcHNfQ1hYICIgaW4KKyoiIC1sYyAiKikgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vIDs7Citlc2FjCisgY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD0KK2lmIHRlc3QgLW4gIiR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0iOyB0aGVuCisgY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD1gZWNobyAiICR7Y29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWH0iIHwgJHtTRUR9IC1lICdzISAtTCEgIWcnIC1lICdzIV4gISEnYAorZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPQorbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorCisKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICAgIDs7CisgICAgaGFpa3UqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIEhhaWt1LgorICAgICAgIyBUaGUgIi1zdGF0aWMiIGZsYWcgZXhpc3RzLCBidXQgaXMgYnJva2VuLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorICAgICAgOzsKKyAgICBpbnRlcml4WzMtOV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqcW54KiB8ICpudG8qKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeFs0LTldKikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCWVsc2UKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgQ1hYKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisJIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworCSMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisJbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctRERMTF9FWFBPUlQnCisJOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKKwk7OworICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCisJICAgIGZpCisJICAgIDs7CisJICBhQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCp8aWE2NCopCisJICAgICAgIyArWiB0aGUgZGVmYXVsdAorCSAgICAgIDs7CisJICAgICopCisJICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPScrWicKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgaW50ZXJpeCopCisJIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCisJIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PworCTs7CisgICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgorCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgOzsKKwkgIGVjcGMqICkKKwkgICAgIyBvbGQgSW50ZWwgQysrIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgaWNwYyogKQorCSAgICAjIEludGVsIEMrKywgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisJICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyogfCBwZ2NwcCopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mcGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICB4bGMqIHwgeGxDKiB8IGJneGxbY0NdKiB8IG1waXhsW2NDXSopCisJICAgICMgSUJNIFhMIDguMCwgOS4wIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXFwaWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLXFzdGF0aWNsaW5rJworCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1Rb3B0aW9uIGxkICcKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1LUElDJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0NYWD1ubworCTs7CisgICAgZXNhYworICBmaQorCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKKyAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX0NYWD0kbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgiID4mNjsgfQorbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY19DWFgKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9bm8KKyAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjY7IH0KKworaWYgdGVzdCB4IiRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID0geHllczsgdGhlbgorICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIDs7CisgICAgIGVzYWMKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KK2ZpCisKK2ZpCisKKworCisKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWFwiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICRsdF90bXBfc3RhdGljX2ZsYWciCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPQorZmkKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNjsgfQorCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWD1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JjUKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNjsgfQorCisKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICIgPiY2OyB9CisgIGhhcmRfbGlua3M9eWVzCisgICRSTSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CiskYXNfZWNobyAiJGhhcmRfbGlua3MiID4mNjsgfQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAiID4mNjsgfQorCisgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGV4Y2x1ZGVfZXhwc3ltc19DWFg9J19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKicKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbNC05XSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgICMgQWxzbywgQUlYIG5tIHRyZWF0cyB3ZWFrIGRlZmluZWQgc3ltYm9scyBsaWtlIG90aGVyIGdsb2JhbCBkZWZpbmVkCisgICAgIyBzeW1ib2xzLCB3aGVyZWFzIEdOVSBubSBtYXJrcyB0aGVtIGFzICJXIi4KKyAgICBpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikgfHwgKFwkIDIgPT0gIlciKSkgJiYgKHN1YnN0cihcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSIkbHRkbGxfY21kcyIKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgY2wqKSA7OworICAgICopCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS87cy9eLipbIF1fX25tX19cKFteIF0qXClbIF1bXiBdKi9cMSBEQVRBLzsvXklbIF0vZDsvXltBSVRXXVsgXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgZXhjbHVkZV9leHBzeW1zX0NYWD0nW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbGludXgqIHwgaypic2QqLWdudSB8IGdudSopCisgICAgbGlua19hbGxfZGVwbGlic19DWFg9bm8KKyAgICA7OworICAqKQorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgOzsKKyAgZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxkX3NobGlic19DWFgiID4mNQorJGFzX2VjaG8gIiRsZF9zaGxpYnNfQ1hYIiA+JjY7IH0KK3Rlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKword2l0aF9nbnVfbGRfQ1hYPSR3aXRoX2dudV9sZAorCisKKworCisKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19DWFggaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgJFJNIGNvbmZ0ZXN0KgorCWVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisJaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorCSAgc29uYW1lPWNvbmZ0ZXN0CisJICBsaWI9Y29uZnRlc3QKKwkgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorCSAgZGVwbGlicz0KKwkgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAorCSAgcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorCSAgY29tcGlsZXJfZmxhZ3M9LXYKKwkgIGxpbmtlcl9mbGFncz0tdgorCSAgdmVyc3RyaW5nPQorCSAgb3V0cHV0X29iamRpcj0uCisJICBsaWJuYW1lPWNvbmZ0ZXN0CisJICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0KKwkgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhcmNoaXZlX2NtZHNfQ1hYIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKwkgIHRoZW4KKwkgICAgbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisJICBlbHNlCisJICAgIGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkgIGZpCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKwlmaQorCSRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiA+JjY7IH0KKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD0kbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAiID4mNjsgfQorCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4WzQtOV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY2VnY2MqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKworICAqLGNsKikKKyAgICAjIE5hdGl2ZSBNU1ZDCisgICAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbYS16QS1aXVxcKTp8IC9cXDF8ZycgLWUgJ3N8XiB8fCdgCisgICAgICA7OworICAgIGN5Z3dpbiopCisgICAgICAjIENvbnZlcnQgdG8gdW5peCBmb3JtLCB0aGVuIHRvIGRvcyBmb3JtLCB0aGVuIGJhY2sgdG8gdW5peCBmb3JtCisgICAgICAjIGJ1dCB0aGlzIHRpbWUgZG9zIHN0eWxlIChubyBzcGFjZXMhKSBzbyB0aGF0IHRoZSB1bml4IGZvcm0gbG9va3MKKyAgICAgICMgbGlrZSAvY3lnZHJpdmUvYy9QUk9HUkF+MTovY3lnZHIuLi4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTElCImAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS1kb3MgIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIDI+L2Rldi9udWxsYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJExJQiIKKyAgICAgIGlmICRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRILgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgIyBGSVhNRTogZmluZCB0aGUgc2hvcnQgbmFtZSBvciB0aGUgcGF0aCBjb21wb25lbnRzLCBhcyBzcGFjZXMgYXJlCisgICAgICAjIGNvbW1vbi4gKGUuZy4gIlByb2dyYW0gRmlsZXMiIC0+ICJQUk9HUkF+MSIpCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsaW5rLmV4ZScKKyAgICA7OworCisgICopCisgICAgIyBBc3N1bWUgTVNWQyB3cmFwcGVyCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworICBlc2FjCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaGFpa3UqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgcnVudGltZV9sb2FkZXIiCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL2Jvb3QvaG9tZS9jb25maWcvbGliIC9ib290L2NvbW1vbi9saWIgL2Jvb3Qvc3lzdGVtL2xpYicKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NSwgLi4uCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICAjIG9yIGZhaWxzIG91dHJpZ2h0LCBzbyBvdmVycmlkZSBhdG9taWNhbGx5OgorICBpbnN0YWxsX292ZXJyaWRlX21vZGU9NTU1CisgIDs7CisKK2ludGVyaXhbMy05XSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgaWYgJHtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICBzYXZlX2xpYmRpcj0kbGliZGlyCisgICAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYXCI7IFwKKwkgTERGTEFHUz1cIlwkTERGTEFHUyAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFhcIiIKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBpZiAgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsOyB0aGVuIDoKKyAgbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIExERkxBR1M9JHNhdmVfTERGTEFHUworICAgIGxpYmRpcj0kc2F2ZV9saWJkaXIKKworZmkKKworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87L15bCSBdKmh3Y2FwWwkgXS9kO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nO3MvIi8vZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKworbmV0YnNkZWxmKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKyAgICBzaWVtZW5zKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKKyRhc19lY2hvICIkZHluYW1pY19saW5rZXIiID4mNjsgfQordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKwordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCitmaQorCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYytzZXR9IiA9IHNldDsgdGhlbgorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCitmaQoraWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYytzZXR9IiA9IHNldDsgdGhlbgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIgorZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KK2hhcmRjb2RlX2FjdGlvbl9DWFg9CitpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgiIHx8CisgICB0ZXN0IC1uICIkcnVucGF0aF92YXJfQ1hYIiB8fAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RlbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfQ1hYIiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBDWFgpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9DWFgiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBoYXJkY29kZV9hY3Rpb25fQ1hYPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb25fQ1hYPXVuc3VwcG9ydGVkCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjUKKyRhc19lY2hvICIkaGFyZGNvZGVfYWN0aW9uX0NYWCIgPiY2OyB9CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fQ1hYIiA9IHJlbGluayB8fAorICAgdGVzdCAiJGluaGVyaXRfcnBhdGhfQ1hYIiA9IHllczsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAorICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcworZmkKKworCisKKworCisKKworICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBDQz0kbHRfc2F2ZV9DQworICBDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCisgIExEQ1hYPSRMRAorICBMRD0kbHRfc2F2ZV9MRAorICBHQ0M9JGx0X3NhdmVfR0NDCisgIHdpdGhfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCisgIGx0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKKyAgbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECisgIGx0X2N2X3Byb2dfZ251X2xkY3h4PSRsdF9jdl9wcm9nX2dudV9sZAorICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorZmkgIyB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllcworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCisKKworCisKKworCisKKworCisKKyAgICAgICAgYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGxpYnRvb2wiCisKKworCisKKyMgT25seSBleHBhbmQgb25jZToKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21waWxlci1jb3ZlcmFnZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jb21waWxlcl9jb3ZlcmFnZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2NvbXBpbGVyX2NvdmVyYWdlOyBpZiB0ZXN0ICJ4JGVuYWJsZV9jb21waWxlcl9jb3ZlcmFnZSIgPSAieHllcyI7IHRoZW4KKwlpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKwkJQ0ZMQUdTPSIkQ0ZMQUdTIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKwlmaQorZmkKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21waWxlci1vcHRpbWlzYXRpb25zIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NvbXBpbGVyX29wdGltaXNhdGlvbnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9jb21waWxlcl9vcHRpbWlzYXRpb25zOyBpZiB0ZXN0ICJ4JGVuYWJsZV9jb21waWxlcl9vcHRpbWlzYXRpb25zIiA9ICJ4bm8iOyB0aGVuCisJQ0ZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAtZSAicy8gLU9bMS05XSpcYi8gLU8wL2ciYAorZmkKK2ZpCisKKworIyBJbml0aWFsaXplIGxpYnRvb2wKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH13aW5kcmVzOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19SQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQz0iJFJDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkM9IiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQz0kYWNfY3ZfcHJvZ19SQworaWYgdGVzdCAtbiAiJFJDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJDIiA+JjUKKyRhc19lY2hvICIkUkMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JDIjsgdGhlbgorICBhY19jdF9SQz0kUkMKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ3aW5kcmVzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB3aW5kcmVzOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9SQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQz0iJGFjX2N0X1JDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkM9IndpbmRyZXMiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUkM9JGFjX2N2X3Byb2dfYWNfY3RfUkMKK2lmIHRlc3QgLW4gIiRhY19jdF9SQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfUkMiID0geDsgdGhlbgorICAgIFJDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUkM9JGFjX2N0X1JDCisgIGZpCitlbHNlCisgIFJDPSIkYWNfY3ZfcHJvZ19SQyIKK2ZpCisKKworCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9cmMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitvYmpleHRfUkM9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9JworCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisKKworCisKKworCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCisKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK2x0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0KK0NDPSR7UkMtIndpbmRyZXMifQorQ0ZMQUdTPQorY29tcGlsZXI9JENDCitjb21waWxlcl9SQz0kQ0MKK2ZvciBjY190ZW1wIGluICRjb21waWxlciIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbXFwvXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1xcL11jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbXFwvXWRpc3RjYyB8IHB1cmlmeSB8ICpbXFwvXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRFQ0hPICIkY2NfdGVtcCIgfCAkU0VEICJzJS4qLyUlOyBzJV4kaG9zdF9hbGlhcy0lJSJgCisKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDPXllcworCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIDoKKworCisKK2ZpCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKKworCisjIFNldCBzb21lIGludGVybmFsIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIGZvciBsYXRlciB1c2UuCitkYnVzX3dpbj1ubworZGJ1c19jeWd3aW49bm8KK2RidXNfdW5peD1ubworY2FzZSAiJHtob3N0fSIgaW4KKyAgICAqLW1pbmd3MzJjZSopCisgICAgICAgIGRidXNfd2luPXllcworICAgICAgICBkYnVzX3dpbmNlPXllcworICAgICAgICA7OworICAgICotbWluZ3czMiopCisgICAgICAgIGRidXNfd2luPXllcworICAgICAgICA7OworICAgICotY3lnd2luKikKKyAgICAgICAgZGJ1c19jeWd3aW49eWVzCisgICAgICAgIGRidXNfdW5peD15ZXMKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBkYnVzX3VuaXg9eWVzCisgICAgICAgOzsKK2VzYWMKKworIyBTcGVjaWFsIGRlZmluZXMgZm9yIGNlcnRhaW4gcGxhdGZvcm1zCitpZiB0ZXN0ICIkZGJ1c193aW4iID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIERCVVNfV0lOIDEiID4+Y29uZmRlZnMuaAorCisgICAgQlVJTERfVElNRVNUQU1QPWBkYXRlIC0taXNvLTg2MDE9bWludXRlc2AKKworICAgICMgQXNzdW1lIERCVVNfVkVSU0lPTiBpcyBhbHdheXMgdGhyZWUgbnVtYmVycworICAgIEJVSUxEX0ZJTEVWRVJTSU9OPWBlY2hvICIkREJVU19WRVJTSU9OIiB8IHNlZCAtZSAncy9cLi8sL2cnYCwwCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH13aW5kcmVzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXdpbmRyZXM7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1dJTkRSRVMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkV0lORFJFUyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19XSU5EUkVTPSIkV0lORFJFUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1dJTkRSRVM9IiR7YWNfdG9vbF9wcmVmaXh9d2luZHJlcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitXSU5EUkVTPSRhY19jdl9wcm9nX1dJTkRSRVMKK2lmIHRlc3QgLW4gIiRXSU5EUkVTIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFdJTkRSRVMiID4mNQorJGFzX2VjaG8gIiRXSU5EUkVTIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19XSU5EUkVTIjsgdGhlbgorICBhY19jdF9XSU5EUkVTPSRXSU5EUkVTCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAid2luZHJlcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgd2luZHJlczsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfV0lORFJFUys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9XSU5EUkVTIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1dJTkRSRVM9IiRhY19jdF9XSU5EUkVTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfV0lORFJFUz0id2luZHJlcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9XSU5EUkVTPSRhY19jdl9wcm9nX2FjX2N0X1dJTkRSRVMKK2lmIHRlc3QgLW4gIiRhY19jdF9XSU5EUkVTIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1dJTkRSRVMiID4mNQorJGFzX2VjaG8gIiRhY19jdF9XSU5EUkVTIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfV0lORFJFUyIgPSB4OyB0aGVuCisgICAgV0lORFJFUz0ibm8iCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgV0lORFJFUz0kYWNfY3RfV0lORFJFUworICBmaQorZWxzZQorICBXSU5EUkVTPSIkYWNfY3ZfcHJvZ19XSU5EUkVTIgorZmkKKworICAgIGlmIHRlc3QgIiRXSU5EUkVTIiA9IG5vOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiKioqIENvdWxkIG5vdCBmaW5kIGFuIGltcGxlbWVudGF0aW9uIG9mIHdpbmRyZXMgaW4geW91ciBQQVRILiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICAgIGlmIHRlc3QgIiRkYnVzX3dpbmNlIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX1dJTkNFIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIF9XSU4zMl9XQ0UgMHgwNTAyIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIERCVVNfVU5JWCAxIiA+PmNvbmZkZWZzLmgKKworZmkKK2lmIHRlc3QgIiRkYnVzX2N5Z3dpbiIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgREJVU19DWUdXSU4gMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyBpZiB0ZXN0ICIkZGJ1c193aW4iID0geWVzOyB0aGVuCisgIERCVVNfV0lOX1RSVUU9CisgIERCVVNfV0lOX0ZBTFNFPScjJworZWxzZQorICBEQlVTX1dJTl9UUlVFPScjJworICBEQlVTX1dJTl9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0ICIkZGJ1c193aW5jZSIgPSB5ZXM7IHRoZW4KKyAgREJVU19XSU5DRV9UUlVFPQorICBEQlVTX1dJTkNFX0ZBTFNFPScjJworZWxzZQorICBEQlVTX1dJTkNFX1RSVUU9JyMnCisgIERCVVNfV0lOQ0VfRkFMU0U9CitmaQorCisgaWYgdGVzdCAiJGRidXNfdW5peCIgPSB5ZXM7IHRoZW4KKyAgREJVU19VTklYX1RSVUU9CisgIERCVVNfVU5JWF9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19VTklYX1RSVUU9JyMnCisgIERCVVNfVU5JWF9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0ICIkZGJ1c19jeWd3aW4iID0geWVzOyB0aGVuCisgIERCVVNfQ1lHV0lOX1RSVUU9CisgIERCVVNfQ1lHV0lOX0ZBTFNFPScjJworZWxzZQorICBEQlVTX0NZR1dJTl9UUlVFPScjJworICBEQlVTX0NZR1dJTl9GQUxTRT0KK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3Rlc3RzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdGVzdHM7IGVuYWJsZV90ZXN0cz0kZW5hYmxldmFsCitlbHNlCisgIGVuYWJsZV90ZXN0cz0kVVNFX01BSU5UQUlORVJfTU9ERQorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWFuc2kgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYW5zaStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Fuc2k7IGVuYWJsZV9hbnNpPSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX2Fuc2k9bm8KK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12ZXJib3NlLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdmVyYm9zZV9tb2RlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdmVyYm9zZV9tb2RlOyBlbmFibGVfdmVyYm9zZV9tb2RlPSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX3ZlcmJvc2VfbW9kZT0kVVNFX01BSU5UQUlORVJfTU9ERQorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWFzc2VydHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYXNzZXJ0cytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Fzc2VydHM7IGVuYWJsZV9hc3NlcnRzPSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX2Fzc2VydHM9JFVTRV9NQUlOVEFJTkVSX01PREUKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jaGVja3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY2hlY2tzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfY2hlY2tzOyBlbmFibGVfY2hlY2tzPSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX2NoZWNrcz15ZXMKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS14bWwtZG9jcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV94bWxfZG9jcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3htbF9kb2NzOyBlbmFibGVfeG1sX2RvY3M9JGVuYWJsZXZhbAorZWxzZQorICBlbmFibGVfeG1sX2RvY3M9YXV0bworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRveHlnZW4tZG9jcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kb3h5Z2VuX2RvY3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kb3h5Z2VuX2RvY3M7IGVuYWJsZV9kb3h5Z2VuX2RvY3M9JGVuYWJsZXZhbAorZWxzZQorICBlbmFibGVfZG94eWdlbl9kb2NzPWF1dG8KK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1hYnN0cmFjdC1zb2NrZXRzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Fic3RyYWN0X3NvY2tldHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzOyBlbmFibGVfYWJzdHJhY3Rfc29ja2V0cz0kZW5hYmxldmFsCitlbHNlCisgIGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzPWF1dG8KK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zZWxpbnV4IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NlbGludXgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zZWxpbnV4OyBlbmFibGVfc2VsaW51eD0kZW5hYmxldmFsCitlbHNlCisgIGVuYWJsZV9zZWxpbnV4PWF1dG8KK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJhdWRpdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJhdWRpdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2xpYmF1ZGl0OyBlbmFibGVfbGliYXVkaXQ9JGVuYWJsZXZhbAorZWxzZQorICBlbmFibGVfbGliYXVkaXQ9YXV0bworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRub3RpZnkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZG5vdGlmeStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Rub3RpZnk7IGVuYWJsZV9kbm90aWZ5PSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX2Rub3RpZnk9YXV0bworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWlub3RpZnkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfaW5vdGlmeStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2lub3RpZnk7IGVuYWJsZV9pbm90aWZ5PSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX2lub3RpZnk9YXV0bworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWtxdWV1ZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9rcXVldWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9rcXVldWU7IGVuYWJsZV9rcXVldWU9JGVuYWJsZXZhbAorZWxzZQorICBlbmFibGVfa3F1ZXVlPWF1dG8KK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb25zb2xlLW93bmVyLWZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY29uc29sZV9vd25lcl9maWxlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfY29uc29sZV9vd25lcl9maWxlOyBlbmFibGVfY29uc29sZV9vd25lcl9maWxlPSRlbmFibGV2YWwKK2Vsc2UKKyAgZW5hYmxlX2NvbnNvbGVfb3duZXJfZmlsZT1hdXRvCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdXNlcmRiLWNhY2hlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3VzZXJkYl9jYWNoZStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3VzZXJkYl9jYWNoZTsgZW5hYmxlX3VzZXJkYl9jYWNoZT0kZW5hYmxldmFsCitlbHNlCisgIGVuYWJsZV91c2VyZGJfY2FjaGU9eWVzCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGF1bmNoZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9sYXVuY2hkK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGF1bmNoZDsgZW5hYmxlX2xhdW5jaGQ9JGVuYWJsZXZhbAorZWxzZQorICBlbmFibGVfbGF1bmNoZD1hdXRvCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC14bWwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3htbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfeG1sOworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluaXQtc2NyaXB0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5pdF9zY3JpcHRzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9pbml0X3NjcmlwdHM7CitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc2Vzc2lvbi1zb2NrZXQtZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zZXNzaW9uX3NvY2tldF9kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3Nlc3Npb25fc29ja2V0X2RpcjsKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC10ZXN0LXNvY2tldC1kaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3Rlc3Rfc29ja2V0X2RpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdGVzdF9zb2NrZXRfZGlyOworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXN5c3RlbS1waWQtZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3lzdGVtX3BpZF9maWxlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zeXN0ZW1fcGlkX2ZpbGU7CitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzdGVtLXNvY2tldCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3lzdGVtX3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc3lzdGVtX3NvY2tldDsKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jb25zb2xlLWF1dGgtZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jb25zb2xlX2F1dGhfZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9jb25zb2xlX2F1dGhfZGlyOworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWNvbnNvbGUtb3duZXItZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY29uc29sZV9vd25lcl9maWxlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9jb25zb2xlX293bmVyX2ZpbGU7CitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGF1bmNoZC1hZ2VudC1kaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2xhdW5jaGRfYWdlbnRfZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9sYXVuY2hkX2FnZW50X2RpcjsKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kYnVzX3VzZXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RidXNfdXNlcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGJ1c191c2VyOworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRidXNfZGFlbW9uZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9kYnVzX2RhZW1vbmRpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGJ1c19kYWVtb25kaXI7CitmaQorCisKKyBpZiB0ZXN0IHgkZW5hYmxlX3Rlc3RzID0geHllczsgdGhlbgorICBEQlVTX0JVSUxEX1RFU1RTX1RSVUU9CisgIERCVVNfQlVJTERfVEVTVFNfRkFMU0U9JyMnCitlbHNlCisgIERCVVNfQlVJTERfVEVTVFNfVFJVRT0nIycKKyAgREJVU19CVUlMRF9URVNUU19GQUxTRT0KK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfdGVzdHMgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIERCVVNfQlVJTERfVEVTVFMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfdmVyYm9zZV9tb2RlID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfYXNzZXJ0cyA9IHhubzsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX0RJU0FCTEVfQVNTRVJUIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEdfRElTQUJMRV9BU1NFUlQgMSIgPj5jb25mZGVmcy5oCisKKyAgICBSX0RZTkFNSUNfTERGTEFHPSIiCitlbHNlCisgICAgIyAtcmR5bmFtaWMgaXMgbmVlZGVkIGZvciBnbGliYydzIGJhY2t0cmFjZV9zeW1ib2xzIHRvIHdvcmsuCisgICAgIyBObyBjbHVlIGhvdyBtdWNoIG92ZXJoZWFkIHRoaXMgYWRkcywgYnV0IGl0J3MgdXNlZnVsCisgICAgIyB0byBkbyB0aGlzIG9uIGFueSBhc3NlcnRpb24gZmFpbHVyZSwKKyAgICAjIHNvIGZvciBub3cgaXQncyBlbmFibGVkIGFueXRpbWUgYXNzZXJ0cyBhcmUgKGN1cnJlbnRseSBub3QKKyAgICAjIGluIHByb2R1Y3Rpb24gYnVpbGRzKS4KKworICAgICMgVG8gZ2V0IC1yZHluYW1pYyB5b3UgcGFzcyAtZXhwb3J0LWR5bmFtaWMgdG8gbGlidG9vbC4KKworJGFzX2VjaG8gIiNkZWZpbmUgREJVU19CVUlMVF9SX0RZTkFNSUMgMSIgPj5jb25mZGVmcy5oCisKKyAgICBSX0RZTkFNSUNfTERGTEFHPS1leHBvcnQtZHluYW1pYworZmkKKworCitpZiB0ZXN0IHgkZW5hYmxlX2NoZWNrcyA9IHhubzsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX0RJU0FCTEVfQ0hFQ0tTIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEdfRElTQUJMRV9DSEVDS1MgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfdXNlcmRiX2NhY2hlID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX0VOQUJMRV9VU0VSREJfQ0FDSEUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfY29tcGlsZXJfY292ZXJhZ2UgPSB4eWVzOyB0aGVuCisgICAgICMjIHNvIHRoYXQgY29uZmlnLmggY2hhbmdlcyB3aGVuIHlvdSB0b2dnbGUgZ2NvdiBzdXBwb3J0CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREJVU19HQ09WX0VOQUJMRUQgMQorX0FDRU9GCisKK2ZpCisKKyMgZ2xpYmMyMS5tNCBzZXJpYWwgMworCisjIFRlc3QgZm9yIHRoZSBHTlUgQyBMaWJyYXJ5LCB2ZXJzaW9uIDIuMSBvciBuZXdlci4KKyMgRnJvbSBCcnVubyBIYWlibGUuCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnkgMi4xIG9yIG5ld2VyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5IDIuMSBvciBuZXdlci4uLiAiID4mNjsgfQoraWYgJHthY19jdl9nbnVfbGlicmFyeV8yXzErOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmZGVmIF9fR05VX0xJQlJBUllfXworICNpZiAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpIHx8IChfX0dMSUJDX18gPiAyKQorICBMdWNreSBHTlUgdXNlcgorICNlbmRpZgorI2VuZGlmCisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIkx1Y2t5IEdOVSB1c2VyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBhY19jdl9nbnVfbGlicmFyeV8yXzE9eWVzCitlbHNlCisgIGFjX2N2X2dudV9saWJyYXJ5XzJfMT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZ251X2xpYnJhcnlfMl8xIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZ251X2xpYnJhcnlfMl8xIiA+JjY7IH0KKworIyMjIyBJbnRlZ2VyIHNpemVzCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgY2hhciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGNoYXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX2NoYXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChjaGFyKSkiICJhY19jdl9zaXplb2ZfY2hhciIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2NoYXIiID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoY2hhcikKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9jaGFyPTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfY2hhciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9jaGFyIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX0NIQVIgJGFjX2N2X3NpemVvZl9jaGFyCitfQUNFT0YKKworCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygc2hvcnQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX3Nob3J0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoc2hvcnQpKSIgImFjX2N2X3NpemVvZl9zaG9ydCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3Nob3J0IiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfc2hvcnQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfU0hPUlQgJGFjX2N2X3NpemVvZl9zaG9ydAorX0FDRU9GCisKKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2ZfbG9uZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGxvbmcpKSIgImFjX2N2X3NpemVvZl9sb25nIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmc9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfTE9ORyAkYWNfY3Zfc2l6ZW9mX2xvbmcKK19BQ0VPRgorCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChpbnQpKSIgImFjX2N2X3NpemVvZl9pbnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnQiID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2ludD0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9pbnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfSU5UICRhY19jdl9zaXplb2ZfaW50CitfQUNFT0YKKworCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHZvaWQgKiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHZvaWQgKi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2Zfdm9pZF9wKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAodm9pZCAqKSkiICJhY19jdl9zaXplb2Zfdm9pZF9wIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfdm9pZF9wIiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHZvaWQgKikKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl92b2lkX3A9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl92b2lkX3AiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2Zfdm9pZF9wIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX1ZPSURfUCAkYWNfY3Zfc2l6ZW9mX3ZvaWRfcAorX0FDRU9GCisKKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGxvbmcgbG9uZykpIiAiYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nX2xvbmcKK19BQ0VPRgorCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgX19pbnQ2NCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIF9faW50NjQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX19faW50NjQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChfX2ludDY0KSkiICJhY19jdl9zaXplb2ZfX19pbnQ2NCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX19faW50NjQiID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoX19pbnQ2NCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9fX2ludDY0PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfX19pbnQ2NCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9fX2ludDY0IiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX19fSU5UNjQgJGFjX2N2X3NpemVvZl9fX2ludDY0CitfQUNFT0YKKworCisKKyMjIyBTZWUgd2hhdCBvdXIgNjQgYml0IHR5cGUgaXMgY2FsbGVkCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIDY0LWJpdCBpbnRlZ2VyIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgNjQtYml0IGludGVnZXIgdHlwZS4uLiAiID4mNjsgfQorCitjYXNlIDggaW4KKyRhY19jdl9zaXplb2ZfaW50KQorICBkYnVzaW50NjQ9aW50CisgIGRidXNpbnQ2NF9jb25zdGFudD0nKHZhbCknCisgIGRidXN1aW50NjRfY29uc3RhbnQ9Jyh2YWwpJworICBkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyPSciIicKKyAgOzsKKyRhY19jdl9zaXplb2ZfbG9uZykKKyAgZGJ1c2ludDY0PWxvbmcKKyAgZGJ1c2ludDY0X2NvbnN0YW50PScodmFsIyNMKScKKyAgZGJ1c3VpbnQ2NF9jb25zdGFudD0nKHZhbCMjVUwpJworICBkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyPScibCInCisgIDs7CiskYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZykKKyAgZGJ1c2ludDY0PSdsb25nIGxvbmcnCisgIGRidXNpbnQ2NF9jb25zdGFudD0nKHZhbCMjTEwpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsIyNVTEwpJworICAjIElkZWFsbHkgd2UgZGlzY292ZXIgd2hhdCB0aGUgZm9ybWF0IGlzLCBidXQgdGhpcyBpcworICAjIG9ubHkgdXNlZCBpbiB2ZXJib3NlIG1vZGUsIHNvIGVoLi4uCisgIGlmIHRlc3QgeCIkYWNfY3ZfZ251X2xpYnJhcnlfMl8xIiA9IHh5ZXM7IHRoZW4KKyAgICBkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyPScibGwiJworICBmaQorICA7OworJGFjX2N2X3NpemVvZl9fX2ludDY0KQorICBkYnVzaW50NjQ9X19pbnQ2NAorICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwjI2k2NCknCisgIGRidXN1aW50NjRfY29uc3RhbnQ9Jyh2YWwjI3VpNjQpJworICAjIFNlZSBhYm92ZSBjYXNlCisgIGlmIHRlc3QgeCIkYWNfY3ZfZ251X2xpYnJhcnlfMl8xIiA9IHh5ZXM7IHRoZW4KKyAgICBkYnVzaW50NjRfcHJpbnRmX21vZGlmaWVyPScibGwiJworICBmaQorICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGJ1c2ludDY0IiA7IHRoZW4KKyAgICAgICAgREJVU19JTlQ2NF9UWVBFPSJub19pbnQ2NF90eXBlX2RldGVjdGVkIgorICAgICAgICBEQlVTX0hBVkVfSU5UNjQ9MAorICAgICAgICBEQlVTX0lOVDY0X0NPTlNUQU5UPQorICAgICAgICBEQlVTX1VJTlQ2NF9DT05TVEFOVD0KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgZm91bmQiID4mNQorJGFzX2VjaG8gIm5vbmUgZm91bmQiID4mNjsgfQorZWxzZQorICAgICAgICBEQlVTX0lOVDY0X1RZUEU9IiRkYnVzaW50NjQiCisgICAgICAgIERCVVNfSEFWRV9JTlQ2ND0xCisgICAgICAgIERCVVNfSU5UNjRfQ09OU1RBTlQ9IiRkYnVzaW50NjRfY29uc3RhbnQiCisgICAgICAgIERCVVNfVUlOVDY0X0NPTlNUQU5UPSIkZGJ1c3VpbnQ2NF9jb25zdGFudCIKKwlpZiB0ZXN0IHgiJGRidXNpbnQ2NF9wcmludGZfbW9kaWZpZXIiICE9IHg7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAkZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcgorX0FDRU9GCisKKwlmaQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERCVVNfSU5UNjRfVFlQRSIgPiY1CiskYXNfZWNobyAiJERCVVNfSU5UNjRfVFlQRSIgPiY2OyB9CitmaQorCisKKworCisKKworIyMjIHNlZSB3aGF0IDMyLWJpdCBpbnQgaXMgY2FsbGVkCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIDMyLWJpdCBpbnRlZ2VyIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgMzItYml0IGludGVnZXIgdHlwZS4uLiAiID4mNjsgfQorCitjYXNlIDQgaW4KKyRhY19jdl9zaXplb2Zfc2hvcnQpCisgIGRidXNpbnQzMj1zaG9ydAorICA7OworJGFjX2N2X3NpemVvZl9pbnQpCisgIGRidXNpbnQzMj1pbnQKKyAgOzsKKyRhY19jdl9zaXplb2ZfbG9uZykKKyAgZGJ1c2ludDMyPWxvbmcKKyAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRidXNpbnQzMiIgOyB0aGVuCisgICAgICAgIERCVVNfSU5UMzJfVFlQRT0ibm9faW50MzJfdHlwZV9kZXRlY3RlZCIKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIk5vIDMyLWJpdCBpbnRlZ2VyIHR5cGUgZm91bmQiICIkTElORU5PIiA1CitlbHNlCisgICAgICAgIERCVVNfSU5UMzJfVFlQRT0iJGRidXNpbnQzMiIKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICREQlVTX0lOVDMyX1RZUEUiID4mNQorJGFzX2VjaG8gIiREQlVTX0lOVDMyX1RZUEUiID4mNjsgfQorZmkKKworCisKKyMjIyBzZWUgd2hhdCAxNi1iaXQgaW50IGlzIGNhbGxlZAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAxNi1iaXQgaW50ZWdlciB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIDE2LWJpdCBpbnRlZ2VyIHR5cGUuLi4gIiA+JjY7IH0KKworY2FzZSAyIGluCiskYWNfY3Zfc2l6ZW9mX3Nob3J0KQorICBkYnVzaW50MTY9c2hvcnQKKyAgOzsKKyRhY19jdl9zaXplb2ZfaW50KQorICBkYnVzaW50MTY9aW50CisgIDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRkYnVzaW50MTYiIDsgdGhlbgorICAgICAgICBEQlVTX0lOVDE2X1RZUEU9Im5vX2ludDE2X3R5cGVfZGV0ZWN0ZWQiCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJObyAxNi1iaXQgaW50ZWdlciB0eXBlIGZvdW5kIiAiJExJTkVOTyIgNQorZWxzZQorICAgICAgICBEQlVTX0lOVDE2X1RZUEU9IiRkYnVzaW50MTYiCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkREJVU19JTlQxNl9UWVBFIiA+JjUKKyRhc19lY2hvICIkREJVU19JTlQxNl9UWVBFIiA+JjY7IH0KK2ZpCisKKworCisjIyBieXRlIG9yZGVyCitjYXNlICRob3N0X29zIGluCisJZGFyd2luKikKKwkJIyBjaGVjayBhdCBjb21waWxlLXRpbWUsIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdW5pdmVyc2FsCisJCSMgKHdpdGggbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyBhdCBvbmNlIG9uIHRoZSBjb21waWxlIGxpbmUpCisKKwkJOzsKKwkqKQorCQkgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19BUFBMRV9DQ19fCisJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisJICAgICAjZW5kaWYKKwkgICAgIHR5cGVkZWYgaW50IGR1bW15OworCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCisJIyB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIC1hcmNoIGZsYWdzIHdpdGggZGlmZmVyZW50IHZhbHVlcy4KKwlhY19hcmNoPQorCWFjX3ByZXY9CisJZm9yIGFjX3dvcmQgaW4gJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTOyBkbworCSBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKwkgICBjYXNlICRhY193b3JkIGluCisJICAgICBpPzg2IHwgeDg2XzY0IHwgcHBjIHwgcHBjNjQpCisJICAgICAgIGlmIHRlc3QgLXogIiRhY19hcmNoIiB8fCB0ZXN0ICIkYWNfYXJjaCIgPSAiJGFjX3dvcmQiOyB0aGVuCisJCSBhY19hcmNoPSRhY193b3JkCisJICAgICAgIGVsc2UKKwkJIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbAorCQkgYnJlYWsKKwkgICAgICAgZmkKKwkgICAgICAgOzsKKwkgICBlc2FjCisJICAgYWNfcHJldj0KKwkgZWxpZiB0ZXN0ICJ4JGFjX3dvcmQiID0gIngtYXJjaCI7IHRoZW4KKwkgICBhY19wcmV2PWFyY2gKKwkgZmkKKyAgICAgICBkb25lCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAgICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZiAhIChkZWZpbmVkIEJZVEVfT1JERVIgJiYgZGVmaW5lZCBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKKwkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2ludAorbWFpbiAoKQoreworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorCQkgbm90IGJpZyBlbmRpYW4KKwkJI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBmaQorICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCSBub3QgYmlnIGVuZGlhbgorCQkjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitzaG9ydCBpbnQgYXNjaWlfbW1bXSA9CisJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisJCXNob3J0IGludCBhc2NpaV9paVtdID0KKwkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKwkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKKwkJfQorCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OworCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKKwkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworCQl9CisJCWV4dGVybiBpbnQgZm9vOworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KKwkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKwkgICAgZmkKKwkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCisJCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisJICAgICAgZWxzZQorCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KKwkJYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorCSAgICAgIGZpCisJICAgIGZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworCSAgICAgdW5pb24KKwkgICAgIHsKKwkgICAgICAgbG9uZyBpbnQgbDsKKwkgICAgICAgY2hhciBjW3NpemVvZiAobG9uZyBpbnQpXTsKKwkgICAgIH0gdTsKKwkgICAgIHUubCA9IDE7CisJICAgICByZXR1cm4gdS5jW3NpemVvZiAobG9uZyBpbnQpIC0gMV0gPT0gMTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KKyBjYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbiAjKAorICAgeWVzKQorICAgICAkYXNfZWNobyAiI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMSIgPj5jb25mZGVmcy5oCis7OyAjKAorICAgbm8pCisgICAgICA7OyAjKAorICAgdW5pdmVyc2FsKQorCiskYXNfZWNobyAiI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgOzsgIygKKyAgICopCisgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bmtub3duIGVuZGlhbm5lc3MKKyBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgIiRMSU5FTk8iIDUgOzsKKyBlc2FjCisKKwkJOzsKK2VzYWMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYW4gaW1wbGVtZW50YXRpb24gb2YgdmFfY29weSgpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiB2YV9jb3B5KCkuLi4gIiA+JjY7IH0KK2lmICR7ZGJ1c19jdl92YV9jb3B5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwlzdGF0aWMgdm9pZCBmIChpbnQgaSwgLi4uKSB7CisJdmFfbGlzdCBhcmdzMSwgYXJnczI7CisJdmFfc3RhcnQgKGFyZ3MxLCBpKTsKKwl2YV9jb3B5IChhcmdzMiwgYXJnczEpOworCWlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICBleGl0ICgxKTsKKwl2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJfQorCWludCBtYWluKCkgeworCSAgZiAoMCwgNDIpOworCSAgcmV0dXJuIDA7CisJfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRidXNfY3ZfdmFfY29weT15ZXMKK2Vsc2UKKyAgZGJ1c19jdl92YV9jb3B5PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZGJ1c19jdl92YV9jb3B5IiA+JjUKKyRhc19lY2hvICIkZGJ1c19jdl92YV9jb3B5IiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIF9fdmFfY29weSgpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBfX3ZhX2NvcHkoKS4uLiAiID4mNjsgfQoraWYgJHtkYnVzX2N2X19fdmFfY29weSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJX192YV9jb3B5IChhcmdzMiwgYXJnczEpOworCWlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICBleGl0ICgxKTsKKwl2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJfQorCWludCBtYWluKCkgeworCSAgZiAoMCwgNDIpOworCSAgcmV0dXJuIDA7CisJfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRidXNfY3ZfX192YV9jb3B5PXllcworZWxzZQorICBkYnVzX2N2X19fdmFfY29weT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGRidXNfY3ZfX192YV9jb3B5IiA+JjUKKyRhc19lY2hvICIkZGJ1c19jdl9fX3ZhX2NvcHkiID4mNjsgfQorCitpZiB0ZXN0ICJ4JGRidXNfY3ZfdmFfY29weSIgPSAieHllcyI7IHRoZW4KKyAgZGJ1c192YV9jb3B5X2Z1bmM9dmFfY29weQorZWxzZSBpZiB0ZXN0ICJ4JGRidXNfY3ZfX192YV9jb3B5IiA9ICJ4eWVzIjsgdGhlbgorICBkYnVzX3ZhX2NvcHlfZnVuYz1fX3ZhX2NvcHkKK2ZpCitmaQorCitpZiB0ZXN0IC1uICIkZGJ1c192YV9jb3B5X2Z1bmMiOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREJVU19WQV9DT1BZICRkYnVzX3ZhX2NvcHlfZnVuYworX0FDRU9GCisKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHZhX2xpc3RzIGNhbiBiZSBjb3BpZWQgYnkgdmFsdWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB2YV9saXN0cyBjYW4gYmUgY29waWVkIGJ5IHZhbHVlLi4uICIgPiY2OyB9CitpZiAke2RidXNfY3ZfdmFfdmFsX2NvcHkrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGRidXNfY3ZfdmFfdmFsX2NvcHk9eWVzCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworCSNpbmNsdWRlIDxzdGRhcmcuaD4KKwkjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludAorbWFpbiAoKQoreworCisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJYXJnczIgPSBhcmdzMTsKKwlpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgZXhpdCAoMSk7CisJdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCX0KKwlpbnQgbWFpbigpIHsKKwkgIGYgKDAsIDQyKTsKKwkgIHJldHVybiAwOworCX0KKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgZGJ1c19jdl92YV92YWxfY29weT15ZXMKK2Vsc2UKKyAgZGJ1c19jdl92YV92YWxfY29weT1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZGJ1c19jdl92YV92YWxfY29weSIgPiY1CiskYXNfZWNobyAiJGRidXNfY3ZfdmFfdmFsX2NvcHkiID4mNjsgfQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK2lmIHRlc3QgIngkZGJ1c19jdl92YV92YWxfY29weSIgPSAieG5vIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX1ZBX0NPUFlfQVNfQVJSQVkgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworIyMjIyBBdG9taWMgaW50ZWdlcnMKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBrbm93cyBfX3N5bmNfc3ViX2FuZF9mZXRjaCgpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGtub3dzIF9fc3luY19zdWJfYW5kX2ZldGNoKCkuLi4gIiA+JjY7IH0KK2lmICR7ZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2grOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKworaW50CittYWluICgpCit7CitpbnQgYSA9IDQ7IGludCBiID0gX19zeW5jX3N1Yl9hbmRfZmV0Y2goJmEsIDQpOyBleGl0KGIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRidXNfY3Zfc3luY19zdWJfYW5kX2ZldGNoPXllcworZWxzZQorICBkYnVzX2N2X3N5bmNfc3ViX2FuZF9mZXRjaD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGRidXNfY3Zfc3luY19zdWJfYW5kX2ZldGNoIiA+JjUKKyRhc19lY2hvICIkZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2giID4mNjsgfQorCitpZiB0ZXN0ICJ4JGRidXNfY3Zfc3luY19zdWJfYW5kX2ZldGNoIiA9ICJ4eWVzIiA7IHRoZW4KKyAgIGhhdmVfc3luYz0xCitlbHNlCisgICBoYXZlX3N5bmM9MAorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERCVVNfVVNFX1NZTkMgJGhhdmVfc3luYworX0FDRU9GCisKKworIyMjIyBWYXJpb3VzIGZ1bmN0aW9ucworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNvY2tldCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNvY2tldC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfc29ja2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc29ja2V0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc29ja2V0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHNvY2tldCBuZXR3b3JrOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3NvY2tldD0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX3NvY2tldCs6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfc29ja2V0Kzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfc29ja2V0PW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc29ja2V0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3NvY2tldCIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zb2NrZXQKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworZmkKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0aG9zdGJ5bmFtZSIgImFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxuc2wgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGhvc3RieW5hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQk5TTCAxCitfQUNFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZmkKKworZmkKKworCitmb3IgYWNfZnVuYyBpbiB2c25wcmludGYgdmFzcHJpbnRmIG5hbm9zbGVlcCB1c2xlZXAgc2V0ZW52IGNsZWFyZW52IHVuc2V0ZW52IHNvY2tldHBhaXIgZ2V0Z3JvdXBsaXN0IGZwYXRoY29uZiBzZXRybGltaXQgcG9sbCBzZXRsb2NhbGUgbG9jYWxlY29udiBzdHJ0b2xsIHN0cnRvdWxsCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCisjIyMjIENoZWNrIGZvciBicm9rZW4gcG9sbDsgdGFrZW4gZnJvbSBHbGliJ3MgY29uZmlndXJlCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGJyb2tlbiBwb2xsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBicm9rZW4gcG9sbC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBicm9rZW5fcG9sbD0ibm8gKGNyb3NzIGNvbXBpbGluZykiCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8ZmNudGwuaD4KKyAgICAjaW5jbHVkZSA8cG9sbC5oPgorICAgICNpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyAgICAjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyAgICAjZW5kaWYKKyAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICBzdHJ1Y3QgcG9sbGZkIGZkc1sxXTsKKyAgICAgIGludCBmZDsKKyAgICAgIGZkID0gb3BlbigiL2Rldi9udWxsIiwgMSk7CisgICAgICBmZHNbMF0uZmQgPSBmZDsKKyAgICAgIGZkc1swXS5ldmVudHMgPSBQT0xMSU47CisgICAgICBmZHNbMF0ucmV2ZW50cyA9IDA7CisgICAgICBpZiAocG9sbChmZHMsIDEsIDApIDwgMCB8fCAoZmRzWzBdLnJldmVudHMgJiBQT0xMTlZBTCkgIT0gMCkgeworICAgICAgICAgICAgZXhpdCgxKTsgIC8qIERvZXMgbm90IHdvcmsgZm9yIGRldmljZXMgLS0gZmFpbCAqLworICAgICAgfQorICAgICAgZXhpdCgwKTsKKyAgICB9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBicm9rZW5fcG9sbD1ubworZWxzZQorICBicm9rZW5fcG9sbD15ZXMKKworJGFzX2VjaG8gIiNkZWZpbmUgQlJPS0VOX1BPTEwgMSIgPj5jb25mZGVmcy5oCisKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGJyb2tlbl9wb2xsIiA+JjUKKyRhc19lY2hvICIkYnJva2VuX3BvbGwiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkaXJmZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGlyZmQuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCitpbnQKK21haW4gKCkKK3sKKworRElSICpkaXJwOworZGlycCA9IG9wZW5kaXIoIi4iKTsKK2RpcmZkKGRpcnApOworY2xvc2VkaXIoZGlycCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBkYnVzX2hhdmVfZGlyZmQ9eWVzCitlbHNlCisgIGRidXNfaGF2ZV9kaXJmZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGRidXNfaGF2ZV9kaXJmZCIgPiY1CiskYXNfZWNobyAiJGRidXNfaGF2ZV9kaXJmZCIgPiY2OyB9CitpZiB0ZXN0ICIkZGJ1c19oYXZlX2RpcmZkIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RJUkZEIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgRElSICpkaXJwLT5kZF9mZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgRElSICpkaXJwLT5kZF9mZC4uLiAiID4mNjsgfQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCitpbnQKK21haW4gKCkKK3sKKworRElSICpkaXJwOworaW50IGZkOworZGlycCA9IG9wZW5kaXIoIi4iKTsKK2ZkID0gZGlycC0+ZGRfZmQ7CitjbG9zZWRpcihkaXJwKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGRidXNfaGF2ZV9kZGZkPXllcworZWxzZQorICBkYnVzX2hhdmVfZGRmZD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkYnVzX2hhdmVfZGRmZCIgPiY1CiskYXNfZWNobyAiJGRidXNfaGF2ZV9kZGZkIiA+JjY7IH0KKwlpZiB0ZXN0ICIkZGJ1c19oYXZlX2RkZmQiID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfRERGRCAxIiA+PmNvbmZkZWZzLmgKKworCWZpCitmaQorCitmb3IgYWNfaGVhZGVyIGluIHN5cy9yZXNvdXJjZS5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvcmVzb3VyY2UuaCIgImFjX2N2X2hlYWRlcl9zeXNfcmVzb3VyY2VfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX3Jlc291cmNlX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TWVNfUkVTT1VSQ0VfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gZGlyZW50LmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImRpcmVudC5oIiAiYWNfY3ZfaGVhZGVyX2RpcmVudF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kaXJlbnRfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RJUkVOVF9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworZm9yIGFjX2hlYWRlciBpbiBleGVjaW5mby5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJleGVjaW5mby5oIiAiYWNfY3ZfaGVhZGVyX2V4ZWNpbmZvX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2V4ZWNpbmZvX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9FWEVDSU5GT19IIDEKK19BQ0VPRgorIGZvciBhY19mdW5jIGluIGJhY2t0cmFjZQorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJiYWNrdHJhY2UiICJhY19jdl9mdW5jX2JhY2t0cmFjZSIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19iYWNrdHJhY2UiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9CQUNLVFJBQ0UgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIGVycm5vLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImVycm5vLmgiICJhY19jdl9oZWFkZXJfZXJybm9faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZXJybm9faCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0VSUk5PX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIHNpZ25hbC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzaWduYWwuaCIgImFjX2N2X2hlYWRlcl9zaWduYWxfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc2lnbmFsX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gbG9jYWxlLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxvY2FsZS5oIiAiYWNfY3ZfaGVhZGVyX2xvY2FsZV9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sb2NhbGVfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xPQ0FMRV9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworZm9yIGFjX2hlYWRlciBpbiBieXRlc3dhcC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJieXRlc3dhcC5oIiAiYWNfY3ZfaGVhZGVyX2J5dGVzd2FwX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2J5dGVzd2FwX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9CWVRFU1dBUF9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworZm9yIGFjX2hlYWRlciBpbiB1bmlzdGQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidW5pc3RkLmgiICJhY19jdl9oZWFkZXJfdW5pc3RkX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3VuaXN0ZF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIHdzMnRjcGlwLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIndzMnRjcGlwLmgiICJhY19jdl9oZWFkZXJfd3MydGNwaXBfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfd3MydGNwaXBfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1dTMlRDUElQX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIHdzcGlhcGkuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAid3NwaWFwaS5oIiAiYWNfY3ZfaGVhZGVyX3dzcGlhcGlfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfd3NwaWFwaV9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfV1NQSUFQSV9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworIyBBZGQgLURfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgaWYgb24gU29sYXJpcworIworY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMqKQorICAgICAgIENGTEFHUz0iJENGTEFHUyAtRF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyIgOzsKK2VzYWMKKworIyBjaGVja2luZyBmb3IgYSBwb3NpeCB2ZXJzaW9uIG9mIGdldHB3bmFtX3IKKyMgaWYgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyBhbmQgY2FuIG5vdCBydW4gdGhlIHRlc3QKKyMgYXNzdW1lIGdldHB3bmFtX3IgaXMgdGhlIHBvc2l4IHZlcnNpb24KKyMgaXQgaXMgdXAgdG8gdGhlIHBlcnNvbiBjcm9zcyBjb21waWxpbmcgdG8gY2hhbmdlCisjIHRoaXMgYmVoYXZpb3IgaWYgZGVzaXJlZAorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwb3NpeCBnZXRwd25hbV9yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwb3NpeCBnZXRwd25hbV9yLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yPXllcworCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHdkLmg+CisKK2ludAorbWFpbiAoKQoreworCisgICAgY2hhciBidWZmZXJbMTAwMDBdOworICAgIHN0cnVjdCBwYXNzd2QgcHdkLCAqcHdwdHIgPSAmcHdkOworICAgIGludCBlcnJvcjsKKyAgICBlcnJubyA9IDA7CisgICAgZXJyb3IgPSBnZXRwd25hbV9yICgiIiwgJnB3ZCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChidWZmZXIpLCAmcHdwdHIpOworICAgcmV0dXJuIChlcnJvciA8IDAgJiYgZXJybm8gPT0gRU5PU1lTKQorCSAgIHx8IGVycm9yID09IEVOT1NZUzsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yPXllcworZWxzZQorICBhY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3I9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3IiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3IiID4mNjsgfQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK2lmIHRlc3QgIiRhY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3IiID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfUE9TSVhfR0VUUFdOQU1fUiAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub25wb3NpeCBnZXRwd25hbV9yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBub25wb3NpeCBnZXRwd25hbV9yLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfbm9ucG9zaXhfZ2V0cHduYW1fcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwd2QuaD4KK2ludAorbWFpbiAoKQoreworY2hhciBidWZmZXJbMTAwMDBdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhc3N3ZCBwd2Q7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRwd25hbV9yICgiIiwgJnB3ZCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoYnVmZmVyKSk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yPXllcworZWxzZQorICBhY19jdl9mdW5jX25vbnBvc2l4X2dldHB3bmFtX3I9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX05PTlBPU0lYX0dFVFBXTkFNX1IgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgZmkKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBzb2NrbGVuX3QgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHNvY2tsZW5fdCBpcyBkZWZpbmVkLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworaW50CittYWluICgpCit7CisKK3NvY2tsZW5fdCBmb287Citmb28gPSAxOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZGJ1c19oYXZlX3NvY2tsZW5fdD15ZXMKK2Vsc2UKKyAgZGJ1c19oYXZlX3NvY2tsZW5fdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkYnVzX2hhdmVfc29ja2xlbl90IiA+JjUKKyRhc19lY2hvICIkZGJ1c19oYXZlX3NvY2tsZW5fdCIgPiY2OyB9CisKK2lmIHRlc3QgIngkZGJ1c19oYXZlX3NvY2tsZW5fdCIgPSAieHllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TT0NLTEVOX1QgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3Vpby5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvdWlvLmgiICJhY19jdl9oZWFkZXJfc3lzX3Vpb19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfdWlvX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TWVNfVUlPX0ggMQorX0FDRU9GCisgZm9yIGFjX2Z1bmMgaW4gd3JpdGV2CitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIndyaXRldiIgImFjX2N2X2Z1bmNfd3JpdGV2IgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3dyaXRldiIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1dSSVRFViAxCitfQUNFT0YKKworZmkKK2RvbmUKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3N5c2xpbWl0cy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvc3lzbGltaXRzLmgiICJhY19jdl9oZWFkZXJfc3lzX3N5c2xpbWl0c19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfc3lzbGltaXRzX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TWVNfU1lTTElNSVRTX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJNU0dfTk9TSUdOQUwiICJhY19jdl9oYXZlX2RlY2xfTVNHX05PU0lHTkFMIiAiICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9NU0dfTk9TSUdOQUwiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgSVNPIEM5OSB2YXJhcmdzIG1hY3JvcyBpbiBDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBJU08gQzk5IHZhcmFyZ3MgbWFjcm9zIGluIEMuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKK2ludCBhKGludCBwMSwgaW50IHAyLCBpbnQgcDMpOworI2RlZmluZSBjYWxsX2EoLi4uKSBhKDEsX19WQV9BUkdTX18pCitjYWxsX2EoMiwzKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGRidXNfaGF2ZV9pc29fY192YXJhcmdzPXllcworZWxzZQorICBkYnVzX2hhdmVfaXNvX2NfdmFyYXJncz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRkYnVzX2hhdmVfaXNvX2NfdmFyYXJncyIgPiY1CiskYXNfZWNobyAiJGRidXNfaGF2ZV9pc29fY192YXJhcmdzIiA+JjY7IH0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VQyB2YXJhcmdzIG1hY3JvcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VQyB2YXJhcmdzIG1hY3Jvcy4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworaW50IGEoaW50IHAxLCBpbnQgcDIsIGludCBwMyk7CisjZGVmaW5lIGNhbGxfYShwYXJhbXMuLi4pIGEoMSxwYXJhbXMpCitjYWxsX2EoMiwzKTsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGRidXNfaGF2ZV9nbnVjX3ZhcmFyZ3M9eWVzCitlbHNlCisgIGRidXNfaGF2ZV9nbnVjX3ZhcmFyZ3M9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZGJ1c19oYXZlX2dudWNfdmFyYXJncyIgPiY1CiskYXNfZWNobyAiJGRidXNfaGF2ZV9nbnVjX3ZhcmFyZ3MiID4mNjsgfQorCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3MgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSVNPX1ZBUkFSR1MgMSIgPj5jb25mZGVmcy5oCisKK2ZpCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2dudWNfdmFyYXJncyA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HTlVDX1ZBUkFSR1MgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0cnVjdCBjbXNnY3JlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RydWN0IGNtc2djcmVkLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKK2ludAorbWFpbiAoKQoreworCitzdHJ1Y3QgY21zZ2NyZWQgY3JlZDsKKworY3JlZC5jbWNyZWRfcGlkID0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGRidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQ9eWVzCitlbHNlCisgIGRidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZCIgPiY1CiskYXNfZWNobyAiJGRidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQiID4mNjsgfQorCitpZiB0ZXN0IHgkZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZCA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9DTVNHQ1JFRCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGVlcnVjcmVkIGdldHBlZXJlaWQKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKK2ZvciBhY19mdW5jIGluIHBpcGUyIGFjY2VwdDQKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKKyMjIyMgQWJzdHJhY3Qgc29ja2V0cworCitpZiB0ZXN0IHgkZW5hYmxlX2Fic3RyYWN0X3NvY2tldHMgPSB4YXV0bzsgdGhlbgorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCit3YXJuX29uX3hjb21waWxlPW5vCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisKKyAgICAgICAgICAgICAgICBhY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHM9bm8KKyAgICAgICAgICAgICAgICB3YXJuX29uX3hjb21waWxlPXllcworCisKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworaW50CittYWluICgpCit7CisKKyAgc2l6ZV90IHNsZW47CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworCisgIGxpc3Rlbl9mZCA9IHNvY2tldCAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCisgIGlmIChsaXN0ZW5fZmQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInNvY2tldCgpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1lbXNldCAoJmFkZHIsICdcMCcsIHNpemVvZiAoYWRkcikpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBzdHJjcHkgKGFkZHIuc3VuX3BhdGgsICJYL3RtcC9kYnVzLWZha2Utc29ja2V0LXBhdGgtdXNlZC1pbi1jb25maWd1cmUtdGVzdCIpOworICAvKiBTVU5fTEVOIHVzZXMgc3RybGVuKCkgc28gbmVlZCB0byBjYWxjdWxhdGUgaXQgYmVmb3JlIGFkZGluZyBcMCBhdCB0aGUKKyAgICogYmVnaW5uaW5nLgorICAgKi8KKyAgc2xlbiA9IFNVTl9MRU4oJmFkZHIpOworICBhZGRyLnN1bl9wYXRoWzBdID0gJ1wwJzsgLyogdGhpcyBpcyB3aGF0IG1ha2VzIGl0IGFic3RyYWN0ICovCisKKyAgaWYgKGJpbmQgKGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCBzbGVuKSA8IDApCisgICAgeworICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UgYmluZCgpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgZXhpdCAoMCk7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cz15ZXMKK2Vsc2UKKyAgYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzIiA+JjY7IH0KK2lmIHRlc3QgeCR3YXJuX29uX3hjb21waWxlID0geHllcyA7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBDYW5ub3QgY2hlY2sgZm9yIGFic3RyYWN0IHNvY2tldHMgd2hlbiBjcm9zcy1jb21waWxpbmcsIHBsZWFzZSB1c2UgLS1lbmFibGUtYWJzdHJhY3Qtc29ja2V0cyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYW5ub3QgY2hlY2sgZm9yIGFic3RyYWN0IHNvY2tldHMgd2hlbiBjcm9zcy1jb21waWxpbmcsIHBsZWFzZSB1c2UgLS1lbmFibGUtYWJzdHJhY3Qtc29ja2V0cyIgPiYyO30KK2ZpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfYWJzdHJhY3Rfc29ja2V0cyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzID0geG5vOyB0aGVuCisJYXNfZm5fZXJyb3IgJD8gIkFic3RyYWN0IHNvY2tldHMgZXhwbGljaXRseSByZXF1aXJlZCwgYW5kIHN1cHBvcnQgbm90IGRldGVjdGVkLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV9hYnN0cmFjdF9zb2NrZXRzID0geG5vOyB0aGVuCisgICBhY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHM9bm87CitmaQorCitpZiB0ZXN0IHgkYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzID0geHllcyA7IHRoZW4KKyAgIERCVVNfUEFUSF9PUl9BQlNUUkFDVD1hYnN0cmFjdAorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgIERCVVNfUEFUSF9PUl9BQlNUUkFDVD1wYXRoCitmaQorCisjIHRoaXMgaXMgdXNlZCBpbiBhZGRyZXNzZXMgdG8gcHJlZmVyIGFic3RyYWN0LCBlLmcuCisjIHVuaXg6cGF0aD0vZm9vIG9yIHVuaXg6YWJzdHJhY3Q9L2ZvbworCisKKworCitpZiB0ZXN0ICJ4JGFjX2N2X2Vudl9QS0dfQ09ORklHX3NldCIgIT0gInhzZXQiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9QS0dfQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUEtHX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1BLR19DT05GSUc9JGFjX2N2X3BhdGhfUEtHX0NPTkZJRworaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUEtHX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJFBLR19DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wYXRoX1BLR19DT05GSUciOyB0aGVuCisgIGFjX3B0X1BLR19DT05GSUc9JFBLR19DT05GSUcKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwa2ctY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkYWNfcHRfUEtHX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYWNfcHRfUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK2FjX3B0X1BLR19DT05GSUc9JGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRworaWYgdGVzdCAtbiAiJGFjX3B0X1BLR19DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfUEtHX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJGFjX3B0X1BLR19DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19wdF9QS0dfQ09ORklHIiA9IHg7IHRoZW4KKyAgICBQS0dfQ09ORklHPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUEtHX0NPTkZJRz0kYWNfcHRfUEtHX0NPTkZJRworICBmaQorZWxzZQorICBQS0dfQ09ORklHPSIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIgorZmkKKworZmkKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorCV9wa2dfbWluX3ZlcnNpb249MC45LjAKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24uLi4gIiA+JjY7IH0KKwlpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb247IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwllbHNlCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlQS0dfQ09ORklHPSIiCisJZmkKKworZmkKKworIyMjIyBTb3J0IG91dCBYTUwgbGlicmFyeQorCisjIHNlZSB3aGF0IHdlIGhhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFhNTF9QYXJzZXJDcmVhdGVfTU0gaW4gLWxleHBhdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgWE1MX1BhcnNlckNyZWF0ZV9NTSBpbiAtbGV4cGF0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9leHBhdF9YTUxfUGFyc2VyQ3JlYXRlX01NKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxleHBhdCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgWE1MX1BhcnNlckNyZWF0ZV9NTSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIFhNTF9QYXJzZXJDcmVhdGVfTU0gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2V4cGF0X1hNTF9QYXJzZXJDcmVhdGVfTU09eWVzCitlbHNlCisgIGFjX2N2X2xpYl9leHBhdF9YTUxfUGFyc2VyQ3JlYXRlX01NPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9leHBhdF9YTUxfUGFyc2VyQ3JlYXRlX01NIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2V4cGF0X1hNTF9QYXJzZXJDcmVhdGVfTU0iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZXhwYXRfWE1MX1BhcnNlckNyZWF0ZV9NTSIgPSB4eWVzOyB0aGVuIDoKKyAgIGZvciBhY19oZWFkZXIgaW4gZXhwYXQuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiZXhwYXQuaCIgImFjX2N2X2hlYWRlcl9leHBhdF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9leHBhdF9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfRVhQQVRfSCAxCitfQUNFT0YKKyBoYXZlX2V4cGF0PXRydWUKK2Vsc2UKKyAgaGF2ZV9leHBhdD1mYWxzZQorZmkKKworZG9uZQorCitlbHNlCisgIGhhdmVfZXhwYXQ9ZmFsc2UKK2ZpCisKKworIyBzZWUgd2hhdCB3ZSB3YW50IHRvIHVzZQorZGJ1c191c2VfbGlieG1sPWZhbHNlCitkYnVzX3VzZV9leHBhdD1mYWxzZQoraWYgdGVzdCB4JHdpdGhfeG1sID0geGV4cGF0OyB0aGVuCisgICAgICAgIGlmICEgJGhhdmVfZXhwYXQgOyB0aGVuCisgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJFeHBsaWNpdGx5IHJlcXVlc3RlZCBleHBhdCBidXQgZXhwYXQgbm90IGZvdW5kIiAiJExJTkVOTyIgNQorICAgICAgICBmaQorICAgICAgICBkYnVzX3VzZV9leHBhdD10cnVlCitlbGlmIHRlc3QgeCR3aXRoX3htbCA9IHhsaWJ4bWw7IHRoZW4KKworcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgTElCWE1MIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBMSUJYTUwuLi4gIiA+JjY7IH0KKworaWYgdGVzdCAtbiAiJExJQlhNTF9DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X0xJQlhNTF9DRkxBR1M9IiRMSUJYTUxfQ0ZMQUdTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwibGlieG1sLTIuMCA+PSAyLjYuMFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJsaWJ4bWwtMi4wID49IDIuNi4wIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgcGtnX2N2X0xJQlhNTF9DRkxBR1M9YCRQS0dfQ09ORklHIC0tY2ZsYWdzICJsaWJ4bWwtMi4wID49IDIuNi4wIiAyPi9kZXYvbnVsbGAKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKK2lmIHRlc3QgLW4gIiRMSUJYTUxfTElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfTElCWE1MX0xJQlM9IiRMSUJYTUxfTElCUyIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImxpYnhtbC0yLjAgPj0gMi42LjBcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAibGlieG1sLTIuMCA+PSAyLjYuMCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9MSUJYTUxfTElCUz1gJFBLR19DT05GSUcgLS1saWJzICJsaWJ4bWwtMi4wID49IDIuNi4wIiAyPi9kZXYvbnVsbGAKK2Vsc2UKKyAgcGtnX2ZhaWxlZD15ZXMKK2ZpCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmkKKworCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKworaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uIDAuMjA7IHRoZW4KKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcworZWxzZQorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9bm8KK2ZpCisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgTElCWE1MX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzICJsaWJ4bWwtMi4wID49IDIuNi4wIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICBMSUJYTUxfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgImxpYnhtbC0yLjAgPj0gMi42LjAiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJExJQlhNTF9QS0dfRVJST1JTIiA+JjUKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgICAgICAgICAgICAgIGhhdmVfbGlieG1sPWZhbHNlCitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisJaGF2ZV9saWJ4bWw9ZmFsc2UKK2Vsc2UKKwlMSUJYTUxfQ0ZMQUdTPSRwa2dfY3ZfTElCWE1MX0NGTEFHUworCUxJQlhNTF9MSUJTPSRwa2dfY3ZfTElCWE1MX0xJQlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwloYXZlX2xpYnhtbD10cnVlCitmaQorICAgICAgICBpZiAhICRoYXZlX2xpYnhtbCA7IHRoZW4KKyAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkV4cGxpY2l0bHkgcmVxdWVzdGVkIGxpYnhtbCBidXQgbGlieG1sIG5vdCBmb3VuZCIgIiRMSU5FTk8iIDUKKyAgICAgICAgZmkKKyAgICAgICAgZGJ1c191c2VfbGlieG1sPXRydWUKK2Vsc2UKKyAgICAgICAgIyMjIGV4cGF0IGlzIHRoZSBkZWZhdWx0IGJlY2F1c2UgbGlieG1sIGNhbid0IGN1cnJlbnRseSBzdXJ2aXZlCisgICAgICAgICMjIyBvdXIgYnJ1dGFsIE9PTS1oYW5kbGluZyB1bml0IHRlc3Qgc2V0dXAuCisgICAgICAgICMjIyBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDkzNjgKKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfZXhwYXQgPSB4ZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGZpbmQgZXhwYXQuaCwgY2hlY2sgY29uZmlnLmxvZyBmb3IgZmFpbGVkIGF0dGVtcHRzIiAiJExJTkVOTyIgNQorICAgICAgICBmaQorCSMjIyBCeSBkZWZhdWx0LCBvbmx5IHVzZSBFeHBhdCBzaW5jZSBpdCdzIHRlc3RlZCBhbmQga25vd24gdG8gd29yay4gIElmIHlvdSdyZSBhCisJIyMjIGdlbmVyYWwtcHVycG9zZSBPUyB2ZW5kb3IsIHBsZWFzZSBkb24ndCBlbmFibGUgbGlieG1sLiAgRm9yIGVtYmVkZGVkIHVzZQorCSMjIyBpZiB5b3VyIE9TIGlzIGJ1aWx0IGFyb3VuZCBsaWJ4bWwsIHRoYXQncyBhbm90aGVyIGNhc2UuCisJZGJ1c191c2VfZXhwYXQ9dHJ1ZQorZmkKKworIGlmICRkYnVzX3VzZV9leHBhdDsgdGhlbgorICBEQlVTX1VTRV9FWFBBVF9UUlVFPQorICBEQlVTX1VTRV9FWFBBVF9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19VU0VfRVhQQVRfVFJVRT0nIycKKyAgREJVU19VU0VfRVhQQVRfRkFMU0U9CitmaQorCisgaWYgJGRidXNfdXNlX2xpYnhtbDsgdGhlbgorICBEQlVTX1VTRV9MSUJYTUxfVFJVRT0KKyAgREJVU19VU0VfTElCWE1MX0ZBTFNFPScjJworZWxzZQorICBEQlVTX1VTRV9MSUJYTUxfVFJVRT0nIycKKyAgREJVU19VU0VfTElCWE1MX0ZBTFNFPQorZmkKKworCitpZiAkZGJ1c191c2VfZXhwYXQ7IHRoZW4KKyAgIFhNTF9MSUJTPS1sZXhwYXQKKyAgIFhNTF9DRkxBR1M9CitmaQoraWYgJGRidXNfdXNlX2xpYnhtbDsgdGhlbgorICAgWE1MX0xJQlM9JExJQlhNTF9MSUJTCisgICBYTUxfQ0ZMQUdTPSRMSUJYTUxfQ0ZMQUdTCitmaQorCisjIFRocmVhZCBsaWIgZGV0ZWN0aW9uCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJwdGhyZWFkX2NvbmRfdGltZWR3YWl0IiAiYWNfY3ZfZnVuY19wdGhyZWFkX2NvbmRfdGltZWR3YWl0IgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3B0aHJlYWRfY29uZF90aW1lZHdhaXQiID0geHllczsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfY29uZF90aW1lZHdhaXQgaW4gLWxwdGhyZWFkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2NvbmRfdGltZWR3YWl0IGluIC1scHRocmVhZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2NvbmRfdGltZWR3YWl0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxwdGhyZWFkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwdGhyZWFkX2NvbmRfdGltZWR3YWl0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcHRocmVhZF9jb25kX3RpbWVkd2FpdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2NvbmRfdGltZWR3YWl0PXllcworZWxzZQorICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2NvbmRfdGltZWR3YWl0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfY29uZF90aW1lZHdhaXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2NvbmRfdGltZWR3YWl0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9jb25kX3RpbWVkd2FpdCIgPSB4eWVzOyB0aGVuIDoKKyAgVEhSRUFEX0xJQlM9Ii1scHRocmVhZCIKK2ZpCisKK2ZpCisKK3NhdmVfbGlicz0iJExJQlMiCitMSUJTPSIkTElCUyAkVEhSRUFEX0xJQlMiCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJwdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrIiAiYWNfY3ZfZnVuY19wdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3B0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2siID0geHllczsgdGhlbiA6CisgIGhhdmVfcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jaz10cnVlCitlbHNlCisgIGhhdmVfcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jaz1mYWxzZQorZmkKKworaWYgdGVzdCB4JGhhdmVfcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jayA9IHh0cnVlOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGNsb2NrX2dldHJlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGNsb2NrX2dldHJlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zZWFyY2hfY2xvY2tfZ2V0cmVzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgY2xvY2tfZ2V0cmVzICgpOworaW50CittYWluICgpCit7CityZXR1cm4gY2xvY2tfZ2V0cmVzICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHJ0OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX2Nsb2NrX2dldHJlcz0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmICR7YWNfY3Zfc2VhcmNoX2Nsb2NrX2dldHJlcys6fSBmYWxzZTsgdGhlbiA6CisgIGJyZWFrCitmaQorZG9uZQoraWYgJHthY19jdl9zZWFyY2hfY2xvY2tfZ2V0cmVzKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfY2xvY2tfZ2V0cmVzPW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfY2xvY2tfZ2V0cmVzIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX2Nsb2NrX2dldHJlcyIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9jbG9ja19nZXRyZXMKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKyAgVEhSRUFEX0xJQlM9IiRUSFJFQURfTElCUyAtbHJ0IgorZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIENMT0NLX01PTk9UT05JQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQ0xPQ0tfTU9OT1RPTklDLi4uICIgPiY2OyB9CisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK2ludAorbWFpbiAoKQoreworCitzdHJ1Y3QgdGltZXNwZWMgbW9ub3RvbmljX3RpbWVyOworcHRocmVhZF9jb25kYXR0cl90IGF0dHI7CitwdGhyZWFkX2NvbmRhdHRyX2luaXQgKCZhdHRyKTsKK3B0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sgKCZhdHRyLCBDTE9DS19NT05PVE9OSUMpOworY2xvY2tfZ2V0cmVzIChDTE9DS19NT05PVE9OSUMsJm1vbm90b25pY190aW1lcik7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBoYXZlX2Nsb2NrX21vbm90b25pYz10cnVlCitlbHNlCisgIGhhdmVfY2xvY2tfbW9ub3RvbmljPWZhbHNlCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IHgkaGF2ZV9jbG9ja19tb25vdG9uaWMgPSB4dHJ1ZTsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmb3VuZCIgPiY1CiskYXNfZWNobyAiZm91bmQiID4mNjsgfQorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX01PTk9UT05JQ19DTE9DSyAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgZm91bmQiID4mNQorJGFzX2VjaG8gIm5vdCBmb3VuZCIgPiY2OyB9CitmaQorZmkKK0xJQlM9IiRzYXZlX2xpYnMiCisKKyMgU0VMaW51eCBkZXRlY3Rpb24KK2lmIHRlc3QgeCRlbmFibGVfc2VsaW51eCA9IHhubyA7IHRoZW4KKyAgICBoYXZlX3NlbGludXg9bm87CitlbHNlCisgICAgIyBTZWUgaWYgd2UgaGF2ZSBTRUxpbnV4IGxpYnJhcnkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpc19zZWxpbnV4X2VuYWJsZWQgaW4gLWxzZWxpbnV4IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpc19zZWxpbnV4X2VuYWJsZWQgaW4gLWxzZWxpbnV4Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sc2VsaW51eCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgaXNfc2VsaW51eF9lbmFibGVkICgpOworaW50CittYWluICgpCit7CityZXR1cm4gaXNfc2VsaW51eF9lbmFibGVkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3NlbGludXhfaXNfc2VsaW51eF9lbmFibGVkPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zZWxpbnV4X2lzX3NlbGludXhfZW5hYmxlZCIgPSB4eWVzOyB0aGVuIDoKKyAgaGF2ZV9zZWxpbnV4PXllcworZWxzZQorICBoYXZlX3NlbGludXg9bm8KK2ZpCisKKworICAgICMgc2VlIGlmIHdlIGhhdmUgdGhlIFNFTGludXggaGVhZGVyIHdpdGggdGhlIG5ldyBELUJ1cyBzdHVmZiBpbiBpdAorICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4eWVzIDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBEQlVTIEZsYXNrIHBlcm1pc3Npb25zIGluIHNlbGludXgvYXZfcGVybWlzc2lvbnMuaCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgREJVUyBGbGFzayBwZXJtaXNzaW9ucyBpbiBzZWxpbnV4L2F2X3Blcm1pc3Npb25zLmguLi4gIiA+JjY7IH0KKyAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHNlbGludXgvYXZfcGVybWlzc2lvbnMuaD4KK2ludAorbWFpbiAoKQoreworI2lmZGVmIERCVVNfX0FDUVVJUkVfU1ZDIHJldHVybiAwOworCQkJICAgICNlbHNlCisJCQkgICAgI2Vycm9yIERCVVNfX0FDUVVJUkVfU1ZDIG5vdCBkZWZpbmVkCisJCQkgICAgI2VuZGlmCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgaGF2ZV9zZWxpbnV4PXllcworZWxzZQorICBoYXZlX3NlbGludXg9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhdmVfc2VsaW51eCIgPiY1CiskYXNfZWNobyAiJGhhdmVfc2VsaW51eCIgPiY2OyB9CisgICAgZmkKKworICAgIGlmIHRlc3QgeCRlbmFibGVfc2VsaW51eCA9IHhhdXRvIDsgdGhlbgorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geG5vIDsgdGhlbgorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogU3VmZmljaWVudGx5IG5ldyBTRUxpbnV4IGxpYnJhcnkgbm90IGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFN1ZmZpY2llbnRseSBuZXcgU0VMaW51eCBsaWJyYXJ5IG5vdCBmb3VuZCIgPiYyO30KKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4bm8gOyB0aGVuCisgICAgICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlNFbGludXggZXhwbGljaXRseSByZXF1aXJlZCwgYW5kIFNFTGludXggbGlicmFyeSBub3QgZm91bmQiICIkTElORU5PIiA1CisgICAgICAgIGZpCisgICAgZmkKK2ZpCisKKyBpZiB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geHllczsgdGhlbgorICBIQVZFX1NFTElOVVhfVFJVRT0KKyAgSEFWRV9TRUxJTlVYX0ZBTFNFPScjJworZWxzZQorICBIQVZFX1NFTElOVVhfVFJVRT0nIycKKyAgSEFWRV9TRUxJTlVYX0ZBTFNFPQorZmkKKworCitpZiB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geHllcyA7IHRoZW4KKyAgICAjIHRoZSBzZWxpbnV4IGNvZGUgY3JlYXRlcyB0aHJlYWRzCisgICAgIyB3aGljaCByZXF1aXJlcyBsaWJwdGhyZWFkIGV2ZW4gb24gbGludXgKKyAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJwdGhyZWFkX2NyZWF0ZSIgImFjX2N2X2Z1bmNfcHRocmVhZF9jcmVhdGUiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfcHRocmVhZF9jcmVhdGUiID0geHllczsgdGhlbiA6CisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2NyZWF0ZSBpbiAtbHB0aHJlYWQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9jcmVhdGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHB0aHJlYWQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHB0aHJlYWRfY3JlYXRlICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcHRocmVhZF9jcmVhdGUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9jcmVhdGU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfY3JlYXRlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfY3JlYXRlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9jcmVhdGUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2NyZWF0ZSIgPSB4eWVzOyB0aGVuIDoKKyAgU0VMSU5VWF9USFJFQURfTElCUz0iLWxwdGhyZWFkIgorZmkKKworZmkKKworCisgICAgU0VMSU5VWF9MSUJTPSItbHNlbGludXggJFNFTElOVVhfVEhSRUFEX0xJQlMiCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU0VMSU5VWCAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAgIFNFTElOVVhfTElCUz0KK2ZpCisKKyMgaW5vdGlmeSBjaGVja3MKK2lmIHRlc3QgeCRlbmFibGVfaW5vdGlmeSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2lub3RpZnk9bm87CitlbHNlCisgICAgZm9yIGFjX2hlYWRlciBpbiBzeXMvaW5vdGlmeS5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvaW5vdGlmeS5oIiAiYWNfY3ZfaGVhZGVyX3N5c19pbm90aWZ5X2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c19pbm90aWZ5X2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TWVNfSU5PVElGWV9IIDEKK19BQ0VPRgorIGhhdmVfaW5vdGlmeT15ZXMKK2Vsc2UKKyAgaGF2ZV9pbm90aWZ5PW5vCitmaQorCitkb25lCisKK2ZpCisKK2lmIHRlc3QgeCRoYXZlX2lub3RpZnkgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIERCVVNfQlVTX0VOQUJMRV9JTk9USUZZIDEiID4+Y29uZmRlZnMuaAorCisgICBmb3IgYWNfZnVuYyBpbiBpbm90aWZ5X2luaXQxCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImlub3RpZnlfaW5pdDEiICJhY19jdl9mdW5jX2lub3RpZnlfaW5pdDEiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfaW5vdGlmeV9pbml0MSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0lOT1RJRllfSU5JVDEgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2ZpCisKKyBpZiB0ZXN0IHgkaGF2ZV9pbm90aWZ5ID0geHllczsgdGhlbgorICBEQlVTX0JVU19FTkFCTEVfSU5PVElGWV9UUlVFPQorICBEQlVTX0JVU19FTkFCTEVfSU5PVElGWV9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19CVVNfRU5BQkxFX0lOT1RJRllfVFJVRT0nIycKKyAgREJVU19CVVNfRU5BQkxFX0lOT1RJRllfRkFMU0U9CitmaQorCisKKyMgZG5vdGlmeSBjaGVja3MKK2lmIHRlc3QgeCRlbmFibGVfZG5vdGlmeSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2Rub3RpZnk9bm87CitlbHNlCisgICAgaWYgdGVzdCB4JGhhdmVfaW5vdGlmeSA9IHhubyAtYSB4JGhvc3Rfb3MgPSB4bGludXgtZ251IC1vIHgkaG9zdF9vcyA9IHhsaW51eDsgdGhlbgorICAgICAgICBoYXZlX2Rub3RpZnk9eWVzOworICAgIGVsc2UKKyAgICAgICAgaGF2ZV9kbm90aWZ5PW5vOworICAgIGZpCitmaQorCitpZiB0ZXN0IHgkaGF2ZV9kbm90aWZ5ID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIGlmIHRlc3QgeCRoYXZlX2Rub3RpZnkgPSB4eWVzOyB0aGVuCisgIERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYX1RSVUU9CisgIERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYX0ZBTFNFPScjJworZWxzZQorICBEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWF9UUlVFPScjJworICBEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWF9GQUxTRT0KK2ZpCisKKworIyBrcXVldWUgY2hlY2tzCitpZiB0ZXN0IHgkZW5hYmxlX2txdWV1ZSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2txdWV1ZT1ubworZWxzZQorICAgIGhhdmVfa3F1ZXVlPXllcworICAgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvZXZlbnQuaCIgImFjX2N2X2hlYWRlcl9zeXNfZXZlbnRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX2V2ZW50X2giID0geHllczsgdGhlbiA6CisKK2Vsc2UKKyAgaGF2ZV9rcXVldWU9bm8KK2ZpCisKKworICAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImtxdWV1ZSIgImFjX2N2X2Z1bmNfa3F1ZXVlIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2txdWV1ZSIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorICBoYXZlX2txdWV1ZT1ubworZmkKKworCisgICAgaWYgdGVzdCB4JGVuYWJsZV9rcXVldWUgPSB4eWVzIC1hIHgkaGF2ZV9rcXVldWUgPSB4bm87IHRoZW4KKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gImtxdWV1ZSBzdXBwb3J0IGV4cGxpY2l0bHkgZW5hYmxlZCBidXQgbm90IGF2YWlsYWJsZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGhhdmVfa3F1ZXVlID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX0JVU19FTkFCTEVfS1FVRVVFIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisgaWYgdGVzdCB4JGhhdmVfa3F1ZXVlID0geHllczsgdGhlbgorICBEQlVTX0JVU19FTkFCTEVfS1FVRVVFX1RSVUU9CisgIERCVVNfQlVTX0VOQUJMRV9LUVVFVUVfRkFMU0U9JyMnCitlbHNlCisgIERCVVNfQlVTX0VOQUJMRV9LUVVFVUVfVFJVRT0nIycKKyAgREJVU19CVVNfRU5BQkxFX0tRVUVVRV9GQUxTRT0KK2ZpCisKKworIyBsYXVuY2hkIGNoZWNrcworaWYgdGVzdCB4JGVuYWJsZV9sYXVuY2hkID0geG5vIDsgdGhlbgorICAgIGhhdmVfbGF1bmNoZD1ubworZWxzZQorICAgIGhhdmVfbGF1bmNoZD15ZXMKKyAgICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGF1bmNoLmgiICJhY19jdl9oZWFkZXJfbGF1bmNoX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xhdW5jaF9oIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgIGhhdmVfbGF1bmNoZD1ubworZmkKKworCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsYXVuY2hjdGwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGxhdW5jaGN0bDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfTEFVTkNIQ1RMKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTEFVTkNIQ1RMIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0xBVU5DSENUTD0iJExBVU5DSENUTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfTEFVTkNIQ1RMPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorTEFVTkNIQ1RMPSRhY19jdl9wYXRoX0xBVU5DSENUTAoraWYgdGVzdCAtbiAiJExBVU5DSENUTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMQVVOQ0hDVEwiID4mNQorJGFzX2VjaG8gIiRMQVVOQ0hDVEwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIGlmIHRlc3QgIngkTEFVTkNIQ1RMIiA9ICJ4IjsgdGhlbgorICAgICAgICBoYXZlX2xhdW5jaGQ9bm8KKyAgICBmaQorCisgICAgaWYgdGVzdCB4JGVuYWJsZV9sYXVuY2hkID0geHllcyAmJiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geG5vIDsgdGhlbgorICAgICAgICBhc19mbl9lcnJvciAkPyAibGF1bmNoZCBzdXBwb3J0IGV4cGxpY2l0bHkgZW5hYmxlZCBidXQgbm90IGF2YWlsYWJsZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGhhdmVfbGF1bmNoZCA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgREJVU19FTkFCTEVfTEFVTkNIRCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIGlmIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4eWVzOyB0aGVuCisgIERCVVNfRU5BQkxFX0xBVU5DSERfVFJVRT0KKyAgREJVU19FTkFCTEVfTEFVTkNIRF9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19FTkFCTEVfTEFVTkNIRF9UUlVFPScjJworICBEQlVTX0VOQUJMRV9MQVVOQ0hEX0ZBTFNFPQorZmkKKworCisjIyMjIERpcmVjdG9yeSB0byBwbGFjZSBsYXVuY2hkIGFnZW50IGZpbGUKK2lmIHRlc3QgIngkd2l0aF9sYXVuY2hkX2FnZW50X2RpciIgPSAieCI7IHRoZW4KKyAgIExBVU5DSERfQUdFTlRfRElSPSIvTGlicmFyeS9MYXVuY2hBZ2VudHMiCitlbHNlCisgICBMQVVOQ0hEX0FHRU5UX0RJUj0iJHdpdGhfbGF1bmNoZF9hZ2VudF9kaXIiCitmaQorCisKKworaWYgdGVzdCB4JGVuYWJsZV9jb25zb2xlX293bmVyX2ZpbGUgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9jb25zb2xlX293bmVyX2ZpbGU9bm87CitlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMqKQorICAgICAgICBoYXZlX2NvbnNvbGVfb3duZXJfZmlsZT15ZXM7CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQ09OU09MRV9PV05FUl9GSUxFIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgaGF2ZV9jb25zb2xlX293bmVyX2ZpbGU9bm87OworICAgIGVzYWMKK2ZpCisKKyBpZiB0ZXN0IHgkaGF2ZV9jb25zb2xlX293bmVyX2ZpbGUgPSB4eWVzOyB0aGVuCisgIEhBVkVfQ09OU09MRV9PV05FUl9GSUxFX1RSVUU9CisgIEhBVkVfQ09OU09MRV9PV05FUl9GSUxFX0ZBTFNFPScjJworZWxzZQorICBIQVZFX0NPTlNPTEVfT1dORVJfRklMRV9UUlVFPScjJworICBIQVZFX0NPTlNPTEVfT1dORVJfRklMRV9GQUxTRT0KK2ZpCisKKworIyBsaWJhdWRpdCBkZXRlY3Rpb24KK2lmIHRlc3QgeCRlbmFibGVfbGliYXVkaXQgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9saWJhdWRpdD1ubzsKK2Vsc2UKKyAgICAjIFNlZSBpZiB3ZSBoYXZlIGF1ZGl0IGRhZW1vbiAmIGNhcGFiaWxpdGllcyBsaWJyYXJ5CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYXVkaXRfbG9nX3VzZXJfYXZjX21lc3NhZ2UgaW4gLWxhdWRpdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYXVkaXRfbG9nX3VzZXJfYXZjX21lc3NhZ2UgaW4gLWxhdWRpdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfYXVkaXRfYXVkaXRfbG9nX3VzZXJfYXZjX21lc3NhZ2UrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGF1ZGl0ICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBhdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGF1ZGl0X2xvZ191c2VyX2F2Y19tZXNzYWdlICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9hdWRpdF9hdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2F1ZGl0X2F1ZGl0X2xvZ191c2VyX2F2Y19tZXNzYWdlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9hdWRpdF9hdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9hdWRpdF9hdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9hdWRpdF9hdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZSIgPSB4eWVzOyB0aGVuIDoKKyAgaGF2ZV9saWJhdWRpdD15ZXMKK2Vsc2UKKyAgaGF2ZV9saWJhdWRpdD1ubworZmkKKworICAgIGlmIHRlc3QgeCRoYXZlX2xpYmF1ZGl0ID0geHllcyA7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY2FwbmdfY2xlYXIgaW4gLWxjYXAtbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNhcG5nX2NsZWFyIGluIC1sY2FwLW5nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9jYXBfbmdfY2FwbmdfY2xlYXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGNhcC1uZyAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgY2FwbmdfY2xlYXIgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBjYXBuZ19jbGVhciAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfY2FwX25nX2NhcG5nX2NsZWFyPXllcworZWxzZQorICBhY19jdl9saWJfY2FwX25nX2NhcG5nX2NsZWFyPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9jYXBfbmdfY2FwbmdfY2xlYXIiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfY2FwX25nX2NhcG5nX2NsZWFyIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2NhcF9uZ19jYXBuZ19jbGVhciIgPSB4eWVzOyB0aGVuIDoKKyAgaGF2ZV9saWJhdWRpdD15ZXMKK2Vsc2UKKyAgaGF2ZV9saWJhdWRpdD1ubworZmkKKworICAgIGZpCitmaQorCisgaWYgdGVzdCB4JGhhdmVfbGliYXVkaXQgPSB4eWVzOyB0aGVuCisgIEhBVkVfTElCQVVESVRfVFJVRT0KKyAgSEFWRV9MSUJBVURJVF9GQUxTRT0nIycKK2Vsc2UKKyAgSEFWRV9MSUJBVURJVF9UUlVFPScjJworICBIQVZFX0xJQkFVRElUX0ZBTFNFPQorZmkKKworCitpZiB0ZXN0IHgkaGF2ZV9saWJhdWRpdCA9IHh5ZXMgOyB0aGVuCisgICAgU0VMSU5VWF9MSUJTPSIkU0VMSU5VWF9MSUJTIC1sYXVkaXQgLWxjYXAtbmciCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCQVVESVQgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyMgQ2hlY2sgZm9yIEFEVCBBUEkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFEVCBBUEkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFEVCBBUEkuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPGJzbS9hZHQuaD4KK2FkdF91c2VyX2NvbnRleHQgPSBBRFRfVVNFUjsKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAgY2hlY2tfYWR0X2F1ZGl0PXllcworZWxzZQorICAgY2hlY2tfYWR0X2F1ZGl0PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJHtjaGVja19hZHRfYXVkaXR9ID0geWVzCit0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQURUIC8qKi8iID4+Y29uZmRlZnMuaAorCisgICBBRFRfTElCUz0iLWxic20iCisgICBMSUJTPSItbGJzbSAkTElCUyIKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyMgQ2hlY2sgZm9yIFNDTV9SSUdIVFMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFNDTV9SSUdIVFMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFNDTV9SSUdIVFMuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KK3N0YXRpYyBpbnQgeCA9IFNDTV9SSUdIVFM7CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBzdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gInN1cHBvcnRlZCIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVU5JWF9GRF9QQVNTSU5HIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm90IHN1cHBvcnRlZCIgPiY1CiskYXNfZWNobyAibm90IHN1cHBvcnRlZCIgPiY2OyB9CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK05FVFdPUktfbGlicz0KK2lmIHRlc3QgeCRkYnVzX3dpbiA9IHh5ZXMgOyB0aGVuCisgIGlmIHRlc3QgeCRkYnVzX3dpbmNlID0geHllcyA7IHRoZW4KKyAgICBORVRXT1JLX2xpYnM9Ii1sd3MyIgorICBlbHNlCisgICAgTkVUV09SS19saWJzPSItbHdzMl8zMiIKKyAgZmkKK2ZpCisKKyMjIyMgU2V0IHVwIGZpbmFsIGZsYWdzCitEQlVTX0NMSUVOVF9DRkxBR1M9CitEQlVTX0NMSUVOVF9MSUJTPSIkVEhSRUFEX0xJQlMgJE5FVFdPUktfbGlicyIKKworCisKK0RCVVNfQlVTX0NGTEFHUz0iJFhNTF9DRkxBR1MiCitEQlVTX0JVU19MSUJTPSIkWE1MX0xJQlMgJFNFTElOVVhfTElCUyAkVEhSRUFEX0xJQlMgJEFEVF9MSUJTICRORVRXT1JLX2xpYnMiCisKKworCitEQlVTX0xBVU5DSEVSX0NGTEFHUz0iJFhNTF9DRkxBR1MiCitEQlVTX0xBVU5DSEVSX0xJQlM9IiRYTUxfTElCUyAkVEhSRUFEX0xJQlMgJE5FVFdPUktfbGlicyIKKworCisKK0RCVVNfVEVTVF9DRkxBR1M9CitEQlVTX1RFU1RfTElCUz0iJFRIUkVBRF9MSUJTICRORVRXT1JLX2xpYnMiCisKKworCisjIyMgWDExIGRldGVjdGlvbgorREJVU19YX0xJQlM9CitEQlVTX1hfQ0ZMQUdTPQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUteDExLWF1dG9sYXVuY2ggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfeDExX2F1dG9sYXVuY2grc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV94MTFfYXV0b2xhdW5jaDsKK2Vsc2UKKyAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPWF1dG8KK2ZpCisKKworaWYgdGVzdCAieCRkYnVzX3dpbiIgPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giID0geHllczsgdGhlbgorICAgICAgICBhc19mbl9lcnJvciAkPyAiWDExIGF1dG8tbGF1bmNoIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPW5vCisgICAgaGF2ZV94MTE9bm8KK2Vsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBYIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBYLi4uICIgPiY2OyB9CisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC14IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF94OworZmkKKworIyAkaGF2ZV94IGlzIGB5ZXMnLCBgbm8nLCBgZGlzYWJsZWQnLCBvciBlbXB0eSB3aGVuIHdlIGRvIG5vdCB5ZXQga25vdy4KK2lmIHRlc3QgIngkd2l0aF94IiA9IHhubzsgdGhlbgorICAjIFRoZSB1c2VyIGV4cGxpY2l0bHkgZGlzYWJsZWQgWC4KKyAgaGF2ZV94PWRpc2FibGVkCitlbHNlCisgIGNhc2UgJHhfaW5jbHVkZXMsJHhfbGlicmFyaWVzIGluICMoCisgICAgKlwnKikgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCB1c2UgWCBkaXJlY3RvcnkgbmFtZXMgY29udGFpbmluZyAnIiAiJExJTkVOTyIgNTs7ICMoCisgICAgKixOT05FIHwgTk9ORSwqKSBpZiAke2FjX2N2X2hhdmVfeCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICMgT25lIG9yIGJvdGggb2YgdGhlIHZhcnMgYXJlIG5vdCBzZXQsIGFuZCB0aGVyZSBpcyBubyBjYWNoZWQgdmFsdWUuCithY194X2luY2x1ZGVzPW5vIGFjX3hfbGlicmFyaWVzPW5vCitybSAtZiAtciBjb25mdGVzdC5kaXIKK2lmIG1rZGlyIGNvbmZ0ZXN0LmRpcjsgdGhlbgorICBjZCBjb25mdGVzdC5kaXIKKyAgY2F0ID5JbWFrZWZpbGUgPDwnX0FDRU9GJworaW5jcm9vdDoKKwlAZWNobyBpbmNyb290PScke0lOQ1JPT1R9JwordXNybGliZGlyOgorCUBlY2hvIHVzcmxpYmRpcj0nJHtVU1JMSUJESVJ9JworbGliZGlyOgorCUBlY2hvIGxpYmRpcj0nJHtMSUJESVJ9JworX0FDRU9GCisgIGlmIChleHBvcnQgQ0M7ICR7WE1LTUYteG1rbWZ9KSA+L2Rldi9udWxsIDI+L2Rldi9udWxsICYmIHRlc3QgLWYgTWFrZWZpbGU7IHRoZW4KKyAgICAjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCisgICAgZm9yIGFjX3ZhciBpbiBpbmNyb290IHVzcmxpYmRpciBsaWJkaXI7IGRvCisgICAgICBldmFsICJhY19pbV8kYWNfdmFyPVxgXCR7TUFLRS1tYWtlfSAkYWNfdmFyIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzL14kYWNfdmFyPS8vcCdcYCIKKyAgICBkb25lCisgICAgIyBPcGVuIFdpbmRvd3MgeG1rbWYgcmVwb3J0ZWRseSBzZXRzIExJQkRJUiBpbnN0ZWFkIG9mIFVTUkxJQkRJUi4KKyAgICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2wgZHlsaWIgbGEgZGxsOyBkbworICAgICAgaWYgdGVzdCAhIC1mICIkYWNfaW1fdXNybGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIiAmJgorCSB0ZXN0IC1mICIkYWNfaW1fbGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIjsgdGhlbgorCWFjX2ltX3VzcmxpYmRpcj0kYWNfaW1fbGliZGlyOyBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgIyBTY3JlZW4gb3V0IGJvZ3VzIHZhbHVlcyBmcm9tIHRoZSBpbWFrZSBjb25maWd1cmF0aW9uLiAgVGhleSBhcmUKKyAgICAjIGJvZ3VzIGJvdGggYmVjYXVzZSB0aGV5IGFyZSB0aGUgZGVmYXVsdCBhbnl3YXksIGFuZCBiZWNhdXNlCisgICAgIyB1c2luZyB0aGVtIHdvdWxkIGJyZWFrIGdjYyBvbiBzeXN0ZW1zIHdoZXJlIGl0IG5lZWRzIGZpeGVkIGluY2x1ZGVzLgorICAgIGNhc2UgJGFjX2ltX2luY3Jvb3QgaW4KKwkvdXNyL2luY2x1ZGUpIGFjX3hfaW5jbHVkZXM9IDs7CisJKikgdGVzdCAtZiAiJGFjX2ltX2luY3Jvb3QvWDExL1hvcy5oIiAmJiBhY194X2luY2x1ZGVzPSRhY19pbV9pbmNyb290OzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfaW1fdXNybGliZGlyIGluCisJL3Vzci9saWIgfCAvdXNyL2xpYjY0IHwgL2xpYiB8IC9saWI2NCkgOzsKKwkqKSB0ZXN0IC1kICIkYWNfaW1fdXNybGliZGlyIiAmJiBhY194X2xpYnJhcmllcz0kYWNfaW1fdXNybGliZGlyIDs7CisgICAgZXNhYworICBmaQorICBjZCAuLgorICBybSAtZiAtciBjb25mdGVzdC5kaXIKK2ZpCisKKyMgU3RhbmRhcmQgc2V0IG9mIGNvbW1vbiBkaXJlY3RvcmllcyBmb3IgWCBoZWFkZXJzLgorIyBDaGVjayBYMTEgYmVmb3JlIFgxMVJuIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBzeW1saW5rIHRvIHRoZSBjdXJyZW50IHJlbGVhc2UuCithY194X2hlYWRlcl9kaXJzPScKKy91c3IvWDExL2luY2x1ZGUKKy91c3IvWDExUjcvaW5jbHVkZQorL3Vzci9YMTFSNi9pbmNsdWRlCisvdXNyL1gxMVI1L2luY2x1ZGUKKy91c3IvWDExUjQvaW5jbHVkZQorCisvdXNyL2luY2x1ZGUvWDExCisvdXNyL2luY2x1ZGUvWDExUjcKKy91c3IvaW5jbHVkZS9YMTFSNgorL3Vzci9pbmNsdWRlL1gxMVI1CisvdXNyL2luY2x1ZGUvWDExUjQKKworL3Vzci9sb2NhbC9YMTEvaW5jbHVkZQorL3Vzci9sb2NhbC9YMTFSNy9pbmNsdWRlCisvdXNyL2xvY2FsL1gxMVI2L2luY2x1ZGUKKy91c3IvbG9jYWwvWDExUjUvaW5jbHVkZQorL3Vzci9sb2NhbC9YMTFSNC9pbmNsdWRlCisKKy91c3IvbG9jYWwvaW5jbHVkZS9YMTEKKy91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNworL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI2CisvdXNyL2xvY2FsL2luY2x1ZGUvWDExUjUKKy91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNAorCisvdXNyL1gzODYvaW5jbHVkZQorL3Vzci94Mzg2L2luY2x1ZGUKKy91c3IvWEZyZWU4Ni9pbmNsdWRlL1gxMQorCisvdXNyL2luY2x1ZGUKKy91c3IvbG9jYWwvaW5jbHVkZQorL3Vzci91bnN1cHBvcnRlZC9pbmNsdWRlCisvdXNyL2F0aGVuYS9pbmNsdWRlCisvdXNyL2xvY2FsL3gxMXI1L2luY2x1ZGUKKy91c3IvbHBwL1hhbXBsZXMvaW5jbHVkZQorCisvdXNyL29wZW53aW4vaW5jbHVkZQorL3Vzci9vcGVud2luL3NoYXJlL2luY2x1ZGUnCisKK2lmIHRlc3QgIiRhY194X2luY2x1ZGVzIiA9IG5vOyB0aGVuCisgICMgR3Vlc3Mgd2hlcmUgdG8gZmluZCBpbmNsdWRlIGZpbGVzLCBieSBsb29raW5nIGZvciBYbGliLmguCisgICMgRmlyc3QsIHRyeSB1c2luZyB0aGF0IGZpbGUgd2l0aCBubyBzcGVjaWFsIGRpcmVjdG9yeSBzcGVjaWZpZWQuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBXZSBjYW4gY29tcGlsZSB1c2luZyBYIGhlYWRlcnMgd2l0aCBubyBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5LgorYWNfeF9pbmNsdWRlcz0KK2Vsc2UKKyAgZm9yIGFjX2RpciBpbiAkYWNfeF9oZWFkZXJfZGlyczsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX2Rpci9YMTEvWGxpYi5oIjsgdGhlbgorICAgIGFjX3hfaW5jbHVkZXM9JGFjX2RpcgorICAgIGJyZWFrCisgIGZpCitkb25lCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorZmkgIyAkYWNfeF9pbmNsdWRlcyA9IG5vCisKK2lmIHRlc3QgIiRhY194X2xpYnJhcmllcyIgPSBubzsgdGhlbgorICAjIENoZWNrIGZvciB0aGUgbGlicmFyaWVzLgorICAjIFNlZSBpZiB3ZSBmaW5kIHRoZW0gd2l0aG91dCBhbnkgc3BlY2lhbCBvcHRpb25zLgorICAjIERvbid0IGFkZCB0byAkTElCUyBwZXJtYW5lbnRseS4KKyAgYWNfc2F2ZV9MSUJTPSRMSUJTCisgIExJQlM9Ii1sWDExICRMSUJTIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KK2ludAorbWFpbiAoKQoreworWHJtSW5pdGlhbGl6ZSAoKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIExJQlM9JGFjX3NhdmVfTElCUworIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCithY194X2xpYnJhcmllcz0KK2Vsc2UKKyAgTElCUz0kYWNfc2F2ZV9MSUJTCitmb3IgYWNfZGlyIGluIGAkYXNfZWNobyAiJGFjX3hfaW5jbHVkZXMgJGFjX3hfaGVhZGVyX2RpcnMiIHwgc2VkIHMvaW5jbHVkZS9saWIvZ2AKK2RvCisgICMgRG9uJ3QgZXZlbiBhdHRlbXB0IHRoZSBoYWlyIG9mIHRyeWluZyB0byBsaW5rIGFuIFggcHJvZ3JhbSEKKyAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsIGR5bGliIGxhIGRsbDsgZG8KKyAgICBpZiB0ZXN0IC1yICIkYWNfZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIjsgdGhlbgorICAgICAgYWNfeF9saWJyYXJpZXM9JGFjX2RpcgorICAgICAgYnJlYWsgMgorICAgIGZpCisgIGRvbmUKK2RvbmUKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkgIyAkYWNfeF9saWJyYXJpZXMgPSBubworCitjYXNlICRhY194X2luY2x1ZGVzLCRhY194X2xpYnJhcmllcyBpbiAjKAorICBubywqIHwgKixubyB8ICpcJyopCisgICAgIyBEaWRuJ3QgZmluZCBYLCBvciBhIGRpcmVjdG9yeSBoYXMgIiciIGluIGl0cyBuYW1lLgorICAgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PW5vIjs7ICMoCisgICopCisgICAgIyBSZWNvcmQgd2hlcmUgd2UgZm91bmQgWCBmb3IgdGhlIGNhY2hlLgorICAgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllc1wKKwlhY194X2luY2x1ZGVzPSckYWNfeF9pbmNsdWRlcydcCisJYWNfeF9saWJyYXJpZXM9JyRhY194X2xpYnJhcmllcyciCitlc2FjCitmaQorOzsgIygKKyAgICAqKSBoYXZlX3g9eWVzOzsKKyAgZXNhYworICBldmFsICIkYWNfY3ZfaGF2ZV94IgorZmkgIyAkd2l0aF94ICE9IG5vCisKK2lmIHRlc3QgIiRoYXZlX3giICE9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhdmVfeCIgPiY1CiskYXNfZWNobyAiJGhhdmVfeCIgPiY2OyB9CisgIG5vX3g9eWVzCitlbHNlCisgICMgSWYgZWFjaCBvZiB0aGUgdmFsdWVzIHdhcyBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCBvdmVycmlkZXMgZWFjaCBndWVzcy4KKyAgdGVzdCAieCR4X2luY2x1ZGVzIiA9IHhOT05FICYmIHhfaW5jbHVkZXM9JGFjX3hfaW5jbHVkZXMKKyAgdGVzdCAieCR4X2xpYnJhcmllcyIgPSB4Tk9ORSAmJiB4X2xpYnJhcmllcz0kYWNfeF9saWJyYXJpZXMKKyAgIyBVcGRhdGUgdGhlIGNhY2hlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGNvbW1hbmQgbGluZSB2YWx1ZXMuCisgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllc1wKKwlhY194X2luY2x1ZGVzPSckeF9pbmNsdWRlcydcCisJYWNfeF9saWJyYXJpZXM9JyR4X2xpYnJhcmllcyciCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBsaWJyYXJpZXMgJHhfbGlicmFyaWVzLCBoZWFkZXJzICR4X2luY2x1ZGVzIiA+JjUKKyRhc19lY2hvICJsaWJyYXJpZXMgJHhfbGlicmFyaWVzLCBoZWFkZXJzICR4X2luY2x1ZGVzIiA+JjY7IH0KK2ZpCisKK2lmIHRlc3QgIiRub194IiA9IHllczsgdGhlbgorICAjIE5vdCBhbGwgcHJvZ3JhbXMgbWF5IHVzZSB0aGlzIHN5bWJvbCwgYnV0IGl0IGRvZXMgbm90IGh1cnQgdG8gZGVmaW5lIGl0LgorCiskYXNfZWNobyAiI2RlZmluZSBYX0RJU1BMQVlfTUlTU0lORyAxIiA+PmNvbmZkZWZzLmgKKworICBYX0NGTEFHUz0gWF9QUkVfTElCUz0gWF9MSUJTPSBYX0VYVFJBX0xJQlM9CitlbHNlCisgIGlmIHRlc3QgLW4gIiR4X2luY2x1ZGVzIjsgdGhlbgorICAgIFhfQ0ZMQUdTPSIkWF9DRkxBR1MgLUkkeF9pbmNsdWRlcyIKKyAgZmkKKworICAjIEl0IHdvdWxkIGFsc28gYmUgbmljZSB0byBkbyB0aGlzIGZvciBhbGwgLUwgb3B0aW9ucywgbm90IGp1c3QgdGhpcyBvbmUuCisgIGlmIHRlc3QgLW4gIiR4X2xpYnJhcmllcyI7IHRoZW4KKyAgICBYX0xJQlM9IiRYX0xJQlMgLUwkeF9saWJyYXJpZXMiCisgICAgIyBGb3IgU29sYXJpczsgc29tZSB2ZXJzaW9ucyBvZiBTdW4gQ0MgcmVxdWlyZSBhIHNwYWNlIGFmdGVyIC1SIGFuZAorICAgICMgb3RoZXJzIHJlcXVpcmUgbm8gc3BhY2UuICBXb3JkcyBhcmUgbm90IHN1ZmZpY2llbnQgLiAuIC4gLgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UuLi4gIiA+JjY7IH0KKyAgICBhY194c2F2ZV9MSUJTPSRMSUJTOyBMSUJTPSIkTElCUyAtUiR4X2xpYnJhcmllcyIKKyAgICBhY194c2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgWF9MSUJTPSIkWF9MSUJTIC1SJHhfbGlicmFyaWVzIgorZWxzZQorICBMSUJTPSIkYWNfeHNhdmVfTElCUyAtUiAkeF9saWJyYXJpZXMiCisgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJICBYX0xJQlM9IiRYX0xJQlMgLVIgJHhfbGlicmFyaWVzIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbmVpdGhlciB3b3JrcyIgPiY1CiskYXNfZWNobyAibmVpdGhlciB3b3JrcyIgPiY2OyB9CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3hzYXZlX2Nfd2Vycm9yX2ZsYWcKKyAgICBMSUJTPSRhY194c2F2ZV9MSUJTCisgIGZpCisKKyAgIyBDaGVjayBmb3Igc3lzdGVtLWRlcGVuZGVudCBsaWJyYXJpZXMgWCBwcm9ncmFtcyBtdXN0IGxpbmsgd2l0aC4KKyAgIyBEbyB0aGlzIGJlZm9yZSBjaGVja2luZyBmb3IgdGhlIHN5c3RlbS1pbmRlcGVuZGVudCBSNiBsaWJyYXJpZXMKKyAgIyAoLWxJQ0UpLCBzaW5jZSB3ZSBtYXkgbmVlZCAtbHNvY2tldCBvciB3aGF0ZXZlciBmb3IgWCBsaW5raW5nLgorCisgIGlmIHRlc3QgIiRJU0MiID0geWVzOyB0aGVuCisgICAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sbnNsX3MgLWxpbmV0IgorICBlbHNlCisgICAgIyBNYXJ0eW4gSm9obnNvbiBzYXlzIHRoaXMgaXMgbmVlZGVkIGZvciBVbHRyaXgsIGlmIHRoZSBYCisgICAgIyBsaWJyYXJpZXMgd2VyZSBidWlsdCB3aXRoIERFQ25ldCBzdXBwb3J0LiAgQW5kIEthcmwgQmVycnkgc2F5cworICAgICMgdGhlIEFscGhhIG5lZWRzIGRuZXRfc3R1YiAoZG5ldCBkb2VzIG5vdCBleGlzdCkuCisgICAgYWNfeHNhdmVfTElCUz0iJExJQlMiOyBMSUJTPSIkTElCUyAkWF9MSUJTIC1sWDExIgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBYT3BlbkRpc3BsYXkgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBYT3BlbkRpc3BsYXkgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZG5ldCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZG5ldF9udG9hICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZG5ldF9udG9hICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RuZXRfZG5ldF9udG9hPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSIgPSB4eWVzOyB0aGVuIDoKKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sZG5ldCIKK2ZpCisKKyAgICBpZiB0ZXN0ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EgPSBubzsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0X3N0dWIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2ErOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRuZXRfc3R1YiAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZG5ldF9udG9hICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZG5ldF9udG9hICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hPXllcworZWxzZQorICBhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZG5ldF9zdHViX2RuZXRfbnRvYSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbmV0X3N0dWJfZG5ldF9udG9hIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RuZXRfc3R1Yl9kbmV0X250b2EiID0geHllczsgdGhlbiA6CisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXRfc3R1YiIKK2ZpCisKKyAgICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgTElCUz0iJGFjX3hzYXZlX0xJQlMiCisKKyAgICAjIG1zaEBjaXMudWZsLmVkdSBzYXlzIC1sbnNsIChhbmQgLWxzb2NrZXQpIGFyZSBuZWVkZWQgZm9yIGhpcyAzODYvQVQsCisgICAgIyB0byBnZXQgdGhlIFN5c1YgdHJhbnNwb3J0IGZ1bmN0aW9ucy4KKyAgICAjIENoYWQgUi4gTGFyc29uIHNheXMgdGhlIFB5cmFtaXMgTUlTLUVTIHJ1bm5pbmcgREMvT1N4IChTVlI0KQorICAgICMgbmVlZHMgLWxuc2wuCisgICAgIyBUaGUgbnNsIGxpYnJhcnkgcHJldmVudHMgcHJvZ3JhbXMgZnJvbSBvcGVuaW5nIHRoZSBYIGRpc3BsYXkKKyAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gVC5FLiBEaWNrZXkuCisgICAgIyBUaGUgZnVuY3Rpb25zIGdldGhvc3RieW5hbWUsIGdldHNlcnZieW5hbWUsIGFuZCBpbmV0X2FkZHIgYXJlCisgICAgIyBpbiAtbGJzZCBvbiBMeW54T1MgMy4wLjEvaTM4NiwgYWNjb3JkaW5nIHRvIExhcnMgSGVja2luZy4KKyAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRob3N0YnluYW1lIiAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUiID0geHllczsgdGhlbiA6CisKK2ZpCisKKyAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPXllcworZWxzZQorICBhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgorICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxuc2wiCitmaQorCisgICAgICBpZiB0ZXN0ICRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxic2QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxic2QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxic2QgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGhvc3RieW5hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2JzZF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9ic2RfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sYnNkIgorZmkKKworICAgICAgZmkKKyAgICBmaQorCisgICAgIyBsaWVkZXJAc2t5bGVyLm1hdmQuaG9uZXl3ZWxsLmNvbSBzYXlzIHdpdGhvdXQgLWxzb2NrZXQsCisgICAgIyBzb2NrZXQvc2V0c29ja29wdCBhbmQgb3RoZXIgcm91dGluZXMgYXJlIHVuZGVmaW5lZCB1bmRlciBTQ08gT0RUCisgICAgIyAyLjAuICBCdXQgLWxzb2NrZXQgaXMgYnJva2VuIG9uIElSSVggNS4yIChhbmQgaXMgbm90IG5lY2Vzc2FyeQorICAgICMgb24gbGF0ZXIgdmVyc2lvbnMpLCBzYXlzIFNpbW9uIExlaW5lbjogaXQgY29udGFpbnMgZ2V0aG9zdGJ5KgorICAgICMgdmFyaWFudHMgdGhhdCBkb24ndCB1c2UgdGhlIG5hbWUgc2VydmVyIChvciBzb21ldGhpbmcpLiAgLWxzb2NrZXQKKyAgICAjIG11c3QgYmUgZ2l2ZW4gYmVmb3JlIC1sbnNsIGlmIGJvdGggYXJlIG5lZWRlZC4gIFdlIGFzc3VtZSB0aGF0CisgICAgIyBpZiBjb25uZWN0IG5lZWRzIC1sbnNsLCBzbyBkb2VzIGdldGhvc3RieW5hbWUuCisgICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiY29ubmVjdCIgImFjX2N2X2Z1bmNfY29ubmVjdCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19jb25uZWN0IiA9IHh5ZXM7IHRoZW4gOgorCitmaQorCisgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19jb25uZWN0ID0gbm87IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3NvY2tldF9jb25uZWN0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzb2NrZXQgJFhfRVhUUkFfTElCUyAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBjb25uZWN0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gY29ubmVjdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfc29ja2V0X2Nvbm5lY3Q9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9zb2NrZXRfY29ubmVjdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X2Nvbm5lY3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfc29ja2V0X2Nvbm5lY3QiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfc29ja2V0X2Nvbm5lY3QiID0geHllczsgdGhlbiA6CisgIFhfRVhUUkFfTElCUz0iLWxzb2NrZXQgJFhfRVhUUkFfTElCUyIKK2ZpCisKKyAgICBmaQorCisgICAgIyBHdWlsbGVybW8gR29tZXogc2F5cyAtbHBvc2l4IGlzIG5lY2Vzc2FyeSBvbiBBL1VYLgorICAgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInJlbW92ZSIgImFjX2N2X2Z1bmNfcmVtb3ZlIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3JlbW92ZSIgPSB4eWVzOyB0aGVuIDoKKworZmkKKworICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcmVtb3ZlID0gbm87IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfcG9zaXhfcmVtb3ZlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxwb3NpeCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcmVtb3ZlICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcmVtb3ZlICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9wb3NpeF9yZW1vdmU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9wb3NpeF9yZW1vdmU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3Bvc2l4X3JlbW92ZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9wb3NpeF9yZW1vdmUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfcG9zaXhfcmVtb3ZlIiA9IHh5ZXM7IHRoZW4gOgorICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxwb3NpeCIKK2ZpCisKKyAgICBmaQorCisgICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KKyAgICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzaG1hdCIgImFjX2N2X2Z1bmNfc2htYXQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc2htYXQiID0geHllczsgdGhlbiA6CisKK2ZpCisKKyAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NobWF0ID0gbm87IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfaXBjX3NobWF0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxpcGMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNobWF0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc2htYXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2lwY19zaG1hdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2lwY19zaG1hdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaXBjX3NobWF0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2lwY19zaG1hdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9pcGNfc2htYXQiID0geHllczsgdGhlbiA6CisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGlwYyIKK2ZpCisKKyAgICBmaQorICBmaQorCisgICMgQ2hlY2sgZm9yIGxpYnJhcmllcyB0aGF0IFgxMVI2IFh0L1hhdyBwcm9ncmFtcyBuZWVkLgorICBhY19zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgdGVzdCAtbiAiJHhfbGlicmFyaWVzIiAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCR4X2xpYnJhcmllcyIKKyAgIyBTTSBuZWVkcyBJQ0UgdG8gKGR5bmFtaWNhbGx5KSBsaW5rIHVuZGVyIFN1bk9TIDQueCAoc28gd2UgaGF2ZSB0bworICAjIGNoZWNrIGZvciBJQ0UgZmlyc3QpLCBidXQgd2UgbXVzdCBsaW5rIGluIHRoZSBvcmRlciAtbFNNIC1sSUNFIG9yCisgICMgd2UgZ2V0IHVuZGVmaW5lZCBzeW1ib2xzLiAgU28gYXNzdW1lIHdlIGhhdmUgU00gaWYgd2UgaGF2ZSBJQ0UuCisgICMgVGhlc2UgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCBiZWZvcmUgLWxYMTEsIHVubGlrZSB0aGUgb3RoZXIKKyAgIyBsaWJyYXJpZXMgd2UgY2hlY2sgZm9yIGJlbG93LCBzbyB1c2UgYSBkaWZmZXJlbnQgdmFyaWFibGUuCisgICMgSm9obiBJbnRlcnJhbnRlLCBLYXJsIEJlcnJ5CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX0lDRV9JY2VDb25uZWN0aW9uTnVtYmVyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxJQ0UgJFhfRVhUUkFfTElCUyAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBJY2VDb25uZWN0aW9uTnVtYmVyICgpOworaW50CittYWluICgpCit7CityZXR1cm4gSWNlQ29ubmVjdGlvbk51bWJlciAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXI9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9JQ0VfSWNlQ29ubmVjdGlvbk51bWJlcj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfSUNFX0ljZUNvbm5lY3Rpb25OdW1iZXIiID0geHllczsgdGhlbiA6CisgIFhfUFJFX0xJQlM9IiRYX1BSRV9MSUJTIC1sU00gLWxJQ0UiCitmaQorCisgIExERkxBR1M9JGFjX3NhdmVfTERGTEFHUworCitmaQorCisKKyAgICBpZiB0ZXN0ICJ4JG5vX3giID0geHllczsgdGhlbgorICAgICAgICBoYXZlX3gxMT1ubworICAgIGVsc2UKKyAgICAgICAgaGF2ZV94MTE9eWVzCisgICAgICAgIERCVVNfWF9MSUJTPSIkWF9MSUJTICRYX1BSRV9MSUJTIC1sWDExICRYX0VYVFJBX0xJQlMiCisgICAgICAgIERCVVNfWF9DRkxBR1M9IiRYX0NGTEFHUyIKKyAgICBmaQorZmkKKworaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2gsJGhhdmVfeDExIiA9IHh5ZXMsbm87IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiWDExIGF1dG8tbGF1bmNoIHJlcXVpcmVzIFggaGVhZGVycy9saWJyYXJpZXMiICIkTElORU5PIiA1CitlbHNlCisgICAgIyBtb3ZlIGZyb20gImF1dG8iIHRvICJ5ZXMiIG9yICJubyIgaWYgbmVjZXNzYXJ5CisgICAgaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giICE9IHhubzsgdGhlbgorICAgICAgICBlbmFibGVfeDExX2F1dG9sYXVuY2g9IiRoYXZlX3gxMSIKKyAgICBmaQorZmkKKworaWYgdGVzdCAieCRoYXZlX3gxMSIgPSB4eWVzIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQlVTX0JVSUxEX1gxMSAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giID0geHllcyA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0ggMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworCisKKyMjIyMgZ2NjIHdhcm5pbmcgZmxhZ3MKKworY2Nfc3VwcG9ydHNfZmxhZygpIHsKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBzdXBwb3J0cyBcIiQqXCIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0Mgc3VwcG9ydHMgXCIkKlwiLi4uICIgPiY2OyB9CisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiQqIgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgcmM9eWVzCitlbHNlCisgIHJjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHJjIiA+JjUKKyRhc19lY2hvICIkcmMiID4mNjsgfQorICB0ZXN0ICJ4JHJjIiA9IHh5ZXMKK30KKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0byBzZWUgaWYgY29tcGlsZXIgdW5kZXJzdGFuZHMgIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAuLi4gIiA+JjY7IH0KKworICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgIgorICBDWFhGTEFHUz0iJENYWEZMQUdTICIKKworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZmxhZ19vaz15ZXMKK2Vsc2UKKyAgZmxhZ19vaz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgorCisgIGlmIHRlc3QgIlgkZmxhZ19vayIgPSBYeWVzIDsgdGhlbgorCisgICAgdHJ1ZQorICBlbHNlCisKKyAgICB0cnVlCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZmxhZ19vayIgPiY1CiskYXNfZWNobyAiJGZsYWdfb2siID4mNjsgfQorCisKKworICB0cF93YXJuaW5ncz0iIgorICBmb3IgdHBfZmxhZyBpbiAgIGFsbCBcCisgICBjaGFyLXN1YnNjcmlwdHMgXAorICAgbWlzc2luZy1kZWNsYXJhdGlvbnMgXAorICAgbWlzc2luZy1wcm90b3R5cGVzIFwKKyAgIG5lc3RlZC1leHRlcm5zIFwKKyAgIHBvaW50ZXItYXJpdGggXAorICAgY2FzdC1hbGlnbiBcCisgICBuby1hZGRyZXNzIFwKKyAgIGZsb2F0LWVxdWFsIFwKKyAgIGRlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCBcCisgIDsgZG8KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtVyR0cF9mbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtVyR0cF9mbGFnLi4uICIgPiY2OyB9CisKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIHNhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XJHRwX2ZsYWciCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLVckdHBfZmxhZyIKKworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZmxhZ19vaz15ZXMKK2Vsc2UKKyAgZmxhZ19vaz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgorCisgIGlmIHRlc3QgIlgkZmxhZ19vayIgPSBYeWVzIDsgdGhlbgorICAgIHRwX3dhcm5pbmdzPSIkdHBfd2FybmluZ3MgLVckdHBfZmxhZyIKKyAgICB0cnVlCisgIGVsc2UKKworICAgIHRydWUKKyAgZmkKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRmbGFnX29rIiA+JjUKKyRhc19lY2hvICIkZmxhZ19vayIgPiY2OyB9CisKKyAgZG9uZQorCisgIHRwX2Vycm9yX2ZsYWdzPSItV2Vycm9yIgorCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdG8gc2VlIGlmIGNvbXBpbGVyIHVuZGVyc3RhbmRzIC1XZXJyb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdG8gc2VlIGlmIGNvbXBpbGVyIHVuZGVyc3RhbmRzIC1XZXJyb3IuLi4gIiA+JjY7IH0KKworICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciIKKyAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtV2Vycm9yIgorCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBmbGFnX29rPXllcworZWxzZQorICBmbGFnX29rPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICBDWFhGTEFHUz0iJHNhdmVfQ1hYRkxBR1MiCisKKyAgaWYgdGVzdCAiWCRmbGFnX29rIiA9IFh5ZXMgOyB0aGVuCisgICAgdHBfd2Vycm9yPXllcworICAgIHRydWUKKyAgZWxzZQorICAgIHRwX3dlcnJvcj1ubworICAgIHRydWUKKyAgZmkKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRmbGFnX29rIiA+JjUKKyRhc19lY2hvICIkZmxhZ19vayIgPiY2OyB9CisKKworICBmb3IgdHBfZmxhZyBpbiAgICAgICB1bnVzZWQgXAorICAgc2lnbi1jb21wYXJlIFwKKyAgIHBvaW50ZXItc2lnbiBcCisgIDsgZG8KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtV25vLSR0cF9mbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtV25vLSR0cF9mbGFnLi4uICIgPiY2OyB9CisKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIHNhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xbm8tJHRwX2ZsYWciCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLVduby0kdHBfZmxhZyIKKworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZmxhZ19vaz15ZXMKK2Vsc2UKKyAgZmxhZ19vaz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgorCisgIGlmIHRlc3QgIlgkZmxhZ19vayIgPSBYeWVzIDsgdGhlbgorICAgIHRwX3dhcm5pbmdzPSIkdHBfd2FybmluZ3MgLVduby0kdHBfZmxhZyIKKyAgICB0cnVlCisgIGVsc2UKKworICAgIHRydWUKKyAgZmkKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRmbGFnX29rIiA+JjUKKyRhc19lY2hvICIkZmxhZ19vayIgPiY2OyB9CisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtV25vLWVycm9yPSR0cF9mbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtV25vLWVycm9yPSR0cF9mbGFnLi4uICIgPiY2OyB9CisKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIHNhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xbm8tZXJyb3I9JHRwX2ZsYWciCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLVduby1lcnJvcj0kdHBfZmxhZyIKKworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZmxhZ19vaz15ZXMKK2Vsc2UKKyAgZmxhZ19vaz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgorCisgIGlmIHRlc3QgIlgkZmxhZ19vayIgPSBYeWVzIDsgdGhlbgorICAgIHRwX2Vycm9yX2ZsYWdzPSIkdHBfZXJyb3JfZmxhZ3MgLVduby1lcnJvcj0kdHBfZmxhZyIKKyAgICB0cnVlCisgIGVsc2UKKyAgICB0cF93ZXJyb3I9bm8KKyAgICB0cnVlCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZmxhZ19vayIgPiY1CiskYXNfZWNobyAiJGZsYWdfb2siID4mNjsgfQorCisgIGRvbmUKKworICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtV2Vycm9yIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX1dlcnJvcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX1dlcnJvcjsgdHBfd2Vycm9yPSRlbmFibGV2YWwKK2Vsc2UKKyAgOgorZmkKKworCisgIGlmIHRlc3QgIngkdHBfd2Vycm9yIiA9IHh5ZXMgJiYgICAgICAgICB0ZXN0IHgkZGJ1c193aW4gIT0geHllcyAtYSB4JGRidXNfY3lnd2luICE9IHh5ZXMgLWEgeCRVU0VfTUFJTlRBSU5FUl9NT0RFID0geHllczsgdGhlbgorICAgIFdBUk5JTkdfQ0ZMQUdTPSIkdHBfZXJyb3JfZmxhZ3MgJHRwX3dhcm5pbmdzIgorICBlbHNlCisgICAgV0FSTklOR19DRkxBR1M9IiR0cF93YXJuaW5ncyIKKyAgZmkKKworCisKK2lmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorICAjIFdlJ3JlIHRyZWF0aW5nIC1mbm8tY29tbW9uIGxpa2UgYSB3YXJuaW5nOiBpdCBtYWtlcyB0aGUgbGlua2VyIG1vcmUKKyAgIyBzdHJpY3QsIGJlY2F1c2Ugb24gc29tZSBzeXN0ZW1zIHRoZSBsaW5rZXIgaXMgKmFsd2F5cyogdGhpcyBzdHJpY3QKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdG8gc2VlIGlmIGNvbXBpbGVyIHVuZGVyc3RhbmRzIC1mbm8tY29tbW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtZm5vLWNvbW1vbi4uLiAiID4mNjsgfQorCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBzYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtZm5vLWNvbW1vbiIKKyAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZm5vLWNvbW1vbiIKKworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZmxhZ19vaz15ZXMKK2Vsc2UKKyAgZmxhZ19vaz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgorCisgIGlmIHRlc3QgIlgkZmxhZ19vayIgPSBYeWVzIDsgdGhlbgorICAgIFdBUk5JTkdfQ0ZMQUdTPSIkV0FSTklOR19DRkxBR1MgLWZuby1jb21tb24iCisgICAgdHJ1ZQorICBlbHNlCisKKyAgICB0cnVlCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZmxhZ19vayIgPiY1CiskYXNfZWNobyAiJGZsYWdfb2siID4mNjsgfQorCisKKworICAjIGh0dHA6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA1OTkKKworCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdG8gc2VlIGlmIGNvbXBpbGVyIHVuZGVyc3RhbmRzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAtZm5vLXN0cmljdC1hbGlhc2luZy4uLiAiID4mNjsgfQorCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBzYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtZm5vLXN0cmljdC1hbGlhc2luZyIKKyAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZm5vLXN0cmljdC1hbGlhc2luZyIKKworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZmxhZ19vaz15ZXMKK2Vsc2UKKyAgZmxhZ19vaz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQ1hYRkxBR1M9IiRzYXZlX0NYWEZMQUdTIgorCisgIGlmIHRlc3QgIlgkZmxhZ19vayIgPSBYeWVzIDsgdGhlbgorICAgIFdBUk5JTkdfQ0ZMQUdTPSIkV0FSTklOR19DRkxBR1MgLWZuby1zdHJpY3QtYWxpYXNpbmciCisgICAgdHJ1ZQorICBlbHNlCisKKyAgICB0cnVlCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZmxhZ19vayIgPiY1CiskYXNfZWNobyAiJGZsYWdfb2siID4mNjsgfQorCisKKworICBpZiB0ZXN0ICJ4JGVuYWJsZV9hbnNpIiA9ICJ4eWVzIjsgdGhlbgorCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0byBzZWUgaWYgY29tcGlsZXIgdW5kZXJzdGFuZHMgLWFuc2kgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9CU0RfU09VUkNFIC1wZWRhbnRpYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0byBzZWUgaWYgY29tcGlsZXIgdW5kZXJzdGFuZHMgLWFuc2kgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtRF9CU0RfU09VUkNFIC1wZWRhbnRpYy4uLiAiID4mNjsgfQorCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBzYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYW5zaSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLXBlZGFudGljIgorICBDWFhGTEFHUz0iJENYWEZMQUdTIC1hbnNpIC1EX1BPU0lYX0NfU09VUkNFPTE5OTMwOUwgLURfQlNEX1NPVVJDRSAtcGVkYW50aWMiCisKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGZsYWdfb2s9eWVzCitlbHNlCisgIGZsYWdfb2s9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgIENYWEZMQUdTPSIkc2F2ZV9DWFhGTEFHUyIKKworICBpZiB0ZXN0ICJYJGZsYWdfb2siID0gWHllcyA7IHRoZW4KKyAgICBXQVJOSU5HX0NGTEFHUz0iJFdBUk5JTkdfQ0ZMQUdTIC1hbnNpIC1EX1BPU0lYX0NfU09VUkNFPTE5OTMwOUwgLURfQlNEX1NPVVJDRSAtcGVkYW50aWMiCisgICAgdHJ1ZQorICBlbHNlCisKKyAgICB0cnVlCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZmxhZ19vayIgPiY1CiskYXNfZWNobyAiJGZsYWdfb2siID4mNjsgfQorCisKKyAgZmkKK2ZpCisKK0NGTEFHUz0iJFdBUk5JTkdfQ0ZMQUdTICRDRkxBR1MiCisKKyMgRGlzYWJsaW5nIGdjLXNlY3Rpb25zIG1ha2VzIG91ciBiaW5hcmllcyBiaWdnZXIsIGJ1dCBzb21lIHRvb2xjaGFpbnMKKyMgaGF2ZSBrbm93bi1icm9rZW4gc3VwcG9ydCBmb3IgaXQgd2hpY2ggZGlzY2FyZHMgc2VjdGlvbnMgdGhhdCBhcmUgbmVlZGVkLgorIyBTZWUgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NjYKK1NFQ1RJT05fTERGTEFHUz0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1nYy1zZWN0aW9ucyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9nY19zZWN0aW9ucytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2djX3NlY3Rpb25zOyBlbmFibGVfZ2Nfc2VjdGlvbnM9JGVuYWJsZXZhbAorZWxzZQorICBlbmFibGVfZ2Nfc2VjdGlvbnM9eWVzCitmaQorCitpZiB0ZXN0ICJ4JEdDQywkZW5hYmxlX2djX3NlY3Rpb25zLCRkYnVzX3dpbiIgPSB4eWVzLHllcyxubzsgdGhlbgorICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYWJpbGl0eSB0byBsaW5rIHdpdGggLS1nYy1zZWN0aW9ucyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYWJpbGl0eSB0byBsaW5rIHdpdGggLS1nYy1zZWN0aW9ucy4uLiAiID4mNjsgfQorICBDRkxBR1M9Ii1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIgorICBMREZMQUdTPSItV2wsLS1nYy1zZWN0aW9ucyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIHJjPXllcworZWxzZQorICByYz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkcmMiID4mNQorJGFzX2VjaG8gIiRyYyIgPiY2OyB9CisgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICBpZiB0ZXN0ICJ4JHJjIiA9IHh5ZXM7IHRoZW4KKyAgICBTRUNUSU9OX0xERkxBR1M9Ii1XbCwtLWdjLXNlY3Rpb25zIgorICAgIENGTEFHUz0iLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMgJENGTEFHUyIKKyAgZmkKK2ZpCisKKworY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMqKQorICAgICAgICAjIFNvbGFyaXMnIEMgbGlicmFyeSBhcHBhcmVudGx5IG5lZWRzIHRoZXNlIHJ1bmVzIHRvIGJlIHRocmVhZHNhZmUuLi4KKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTIC1EX1JFRU5UUkFOVCIKK2VzYWMKKworIyMjIERveHlnZW4gRG9jdW1lbnRhdGlvbgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRveHlnZW4iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRveHlnZW47IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0RPWFlHRU4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRET1hZR0VOIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0RPWFlHRU49IiRET1hZR0VOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9ET1hZR0VOPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0RPWFlHRU4iICYmIGFjX2N2X3BhdGhfRE9YWUdFTj0ibm8iCisgIDs7Citlc2FjCitmaQorRE9YWUdFTj0kYWNfY3ZfcGF0aF9ET1hZR0VOCitpZiB0ZXN0IC1uICIkRE9YWUdFTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRET1hZR0VOIiA+JjUKKyRhc19lY2hvICIkRE9YWUdFTiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBEb3h5Z2VuIGRvY3VtZW50YXRpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBEb3h5Z2VuIGRvY3VtZW50YXRpb24uLi4gIiA+JjY7IH0KKworaWYgdGVzdCB4JERPWFlHRU4gPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9kb3h5Z2VuPW5vCitlbHNlCisgICAgaGF2ZV9kb3h5Z2VuPXllcworZmkKKworaWYgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4YXV0byA7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV9kb3h5Z2VuID0geG5vIDsgdGhlbgorICAgICAgICBlbmFibGVfZG94eWdlbl9kb2NzPW5vCisgICAgZWxzZQorICAgICAgICBlbmFibGVfZG94eWdlbl9kb2NzPXllcworICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX2RveHlnZW5fZG9jcyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV9kb3h5Z2VuID0geG5vOyB0aGVuCisJYXNfZm5fZXJyb3IgJD8gIkJ1aWxkaW5nIERveHlnZW4gZG9jcyBleHBsaWNpdGx5IHJlcXVpcmVkLCBidXQgRG94eWdlbiBub3QgZm91bmQiICIkTElORU5PIiA1CisgICAgZmkKK2ZpCisKKyBpZiB0ZXN0IHgkZW5hYmxlX2RveHlnZW5fZG9jcyA9IHh5ZXM7IHRoZW4KKyAgREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFPQorICBEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX0ZBTFNFPScjJworZWxzZQorICBEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX1RSVUU9JyMnCisgIERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRURfRkFMU0U9CitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGVuYWJsZV9kb3h5Z2VuX2RvY3MiID4mNQorJGFzX2VjaG8gIiRlbmFibGVfZG94eWdlbl9kb2NzIiA+JjY7IH0KKworWFNMVFBST0M9ZmFsc2UKK2ZvciBhY19wcm9nIGluIHhzbHRwcm9jCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfWFNMVFBST0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkWFNMVFBST0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfWFNMVFBST0M9IiRYU0xUUFJPQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1hTTFRQUk9DPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitYU0xUUFJPQz0kYWNfY3ZfcHJvZ19YU0xUUFJPQworaWYgdGVzdCAtbiAiJFhTTFRQUk9DIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFhTTFRQUk9DIiA+JjUKKyRhc19lY2hvICIkWFNMVFBST0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkWFNMVFBST0MiICYmIGJyZWFrCitkb25lCisKKyBpZiB0ZXN0ICIkWFNMVFBST0MiICE9IGZhbHNlOyB0aGVuCisgIERCVVNfSEFWRV9YU0xUUFJPQ19UUlVFPQorICBEQlVTX0hBVkVfWFNMVFBST0NfRkFMU0U9JyMnCitlbHNlCisgIERCVVNfSEFWRV9YU0xUUFJPQ19UUlVFPScjJworICBEQlVTX0hBVkVfWFNMVFBST0NfRkFMU0U9CitmaQorCisKKyMjIyBYTUwgRG9jdW1lbnRhdGlvbgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhtbHRvIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4bWx0bzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfWE1MVE8rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRYTUxUTyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9YTUxUTz0iJFhNTFRPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9YTUxUTz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YTUxUTyIgJiYgYWNfY3ZfcGF0aF9YTUxUTz0ibm8iCisgIDs7Citlc2FjCitmaQorWE1MVE89JGFjX2N2X3BhdGhfWE1MVE8KK2lmIHRlc3QgLW4gIiRYTUxUTyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRYTUxUTyIgPiY1CiskYXNfZWNobyAiJFhNTFRPIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIFhNTCBkb2N1bWVudGF0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgWE1MIGRvY3VtZW50YXRpb24uLi4gIiA+JjY7IH0KKworaWYgdGVzdCB4JFhNTFRPID0geG5vIDsgdGhlbgorICAgIGhhdmVfeG1sdG89bm8KK2Vsc2UKKyAgICBoYXZlX3htbHRvPXllcworZmkKKworaWYgdGVzdCB4JGVuYWJsZV94bWxfZG9jcyA9IHhhdXRvIDsgdGhlbgorICAgIGlmIHRlc3QgeCRoYXZlX3htbHRvID0geG5vIDsgdGhlbgorICAgICAgICBlbmFibGVfeG1sX2RvY3M9bm8KKyAgICBlbHNlCisgICAgICAgIGVuYWJsZV94bWxfZG9jcz15ZXMKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV94bWxfZG9jcyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV94bWx0byA9IHhubzsgdGhlbgorCWFzX2ZuX2Vycm9yICQ/ICJCdWlsZGluZyBYTUwgZG9jcyBleHBsaWNpdGx5IHJlcXVpcmVkLCBidXQgeG1sdG8gbm90IGZvdW5kIiAiJExJTkVOTyIgNQorICAgIGZpCitmaQorCisgaWYgdGVzdCB4JGVuYWJsZV94bWxfZG9jcyA9IHh5ZXM7IHRoZW4KKyAgREJVU19YTUxfRE9DU19FTkFCTEVEX1RSVUU9CisgIERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19YTUxfRE9DU19FTkFCTEVEX1RSVUU9JyMnCisgIERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9GQUxTRT0KK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZW5hYmxlX3htbF9kb2NzIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3htbF9kb2NzIiA+JjY7IH0KKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtYW4yaHRtbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbWFuMmh0bWw7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX01BTjJIVE1MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTUFOMkhUTUwgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfTUFOMkhUTUw9IiRNQU4ySFRNTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfTUFOMkhUTUw9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitNQU4ySFRNTD0kYWNfY3ZfcGF0aF9NQU4ySFRNTAoraWYgdGVzdCAtbiAiJE1BTjJIVE1MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTjJIVE1MIiA+JjUKKyRhc19lY2hvICIkTUFOMkhUTUwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworCisgaWYgdGVzdCB4JE1BTjJIVE1MICE9IHg7IHRoZW4KKyAgREJVU19IQVZFX01BTjJIVE1MX1RSVUU9CisgIERCVVNfSEFWRV9NQU4ySFRNTF9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19IQVZFX01BTjJIVE1MX1RSVUU9JyMnCisgIERCVVNfSEFWRV9NQU4ySFRNTF9GQUxTRT0KK2ZpCisKKworIGlmIHRlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geHllcyAtYSB4JGVuYWJsZV94bWxfZG9jcyA9IHh5ZXMgLWEgXAorICAgICAgICAgeCRNQU4ySFRNTCAhPSB4OyB0aGVuCisgIERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUU9CisgIERCVVNfQ0FOX1VQTE9BRF9ET0NTX0ZBTFNFPScjJworZWxzZQorICBEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFPScjJworICBEQlVTX0NBTl9VUExPQURfRE9DU19GQUxTRT0KK2ZpCisKKworIyMjIyBIYXZlIHRvIGdvICRsb2NhbHN0YXRlZGlyLT4kcHJlZml4L3Zhci0+L3Vzci9sb2NhbC92YXIKKworIyMjIyBmaW5kIHRoZSBhY3R1YWwgdmFsdWUgZm9yICRwcmVmaXggdGhhdCB3ZSdsbCBlbmQgdXAgd2l0aAorIyMgICAoSSBrbm93IHRoaXMgaXMgYnJva2VuIGFuZCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgTWFrZWZpbGUsIGJ1dAorIyMgICAgdGhhdCdzIGEgbWFqb3IgcGFpbiBhbmQgYWxtb3N0IG5vYm9keSBhY3R1YWxseSBzZWVtcyB0byBjYXJlKQorCisgIEVYUF9WQVI9RVhQQU5ERURfUFJFRklYCisgIEZST01fVkFSPSIkcHJlZml4IgorCisgICAgcHJlZml4X3NhdmU9JHByZWZpeAorICBleGVjX3ByZWZpeF9zYXZlPSRleGVjX3ByZWZpeAorCisgICAgaWYgdGVzdCAieCRwcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIHByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorICBmaQorICAgIGlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIGV4ZWNfcHJlZml4PSRwcmVmaXgKKyAgZmkKKworICBmdWxsX3Zhcj0iJEZST01fVkFSIgorICAgIHdoaWxlIHRydWU7IGRvCisgICAgbmV3X2Z1bGxfdmFyPSJgZXZhbCBlY2hvICRmdWxsX3ZhcmAiCisgICAgaWYgdGVzdCAieCRuZXdfZnVsbF92YXIiID0gIngkZnVsbF92YXIiOyB0aGVuIGJyZWFrOyBmaQorICAgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgZG9uZQorCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBFWFBBTkRFRF9QUkVGSVg9IiRmdWxsX3ZhciIKKworCisgICAgcHJlZml4PSRwcmVmaXhfc2F2ZQorICBleGVjX3ByZWZpeD0kZXhlY19wcmVmaXhfc2F2ZQorCisKKyAgRVhQX1ZBUj1FWFBBTkRFRF9MT0NBTFNUQVRFRElSCisgIEZST01fVkFSPSIkbG9jYWxzdGF0ZWRpciIKKworICAgIHByZWZpeF9zYXZlPSRwcmVmaXgKKyAgZXhlY19wcmVmaXhfc2F2ZT0kZXhlY19wcmVmaXgKKworICAgIGlmIHRlc3QgIngkcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KKyAgICBwcmVmaXg9IiRhY19kZWZhdWx0X3ByZWZpeCIKKyAgZmkKKyAgICBpZiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KKyAgICBleGVjX3ByZWZpeD0kcHJlZml4CisgIGZpCisKKyAgZnVsbF92YXI9IiRGUk9NX1ZBUiIKKyAgICB3aGlsZSB0cnVlOyBkbworICAgIG5ld19mdWxsX3Zhcj0iYGV2YWwgZWNobyAkZnVsbF92YXJgIgorICAgIGlmIHRlc3QgIngkbmV3X2Z1bGxfdmFyIiA9ICJ4JGZ1bGxfdmFyIjsgdGhlbiBicmVhazsgZmkKKyAgICBmdWxsX3Zhcj0kbmV3X2Z1bGxfdmFyCisgIGRvbmUKKworICAgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgRVhQQU5ERURfTE9DQUxTVEFURURJUj0iJGZ1bGxfdmFyIgorCisKKyAgICBwcmVmaXg9JHByZWZpeF9zYXZlCisgIGV4ZWNfcHJlZml4PSRleGVjX3ByZWZpeF9zYXZlCisKKworICBFWFBfVkFSPUVYUEFOREVEX1NZU0NPTkZESVIKKyAgRlJPTV9WQVI9IiRzeXNjb25mZGlyIgorCisgICAgcHJlZml4X3NhdmU9JHByZWZpeAorICBleGVjX3ByZWZpeF9zYXZlPSRleGVjX3ByZWZpeAorCisgICAgaWYgdGVzdCAieCRwcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIHByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorICBmaQorICAgIGlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIGV4ZWNfcHJlZml4PSRwcmVmaXgKKyAgZmkKKworICBmdWxsX3Zhcj0iJEZST01fVkFSIgorICAgIHdoaWxlIHRydWU7IGRvCisgICAgbmV3X2Z1bGxfdmFyPSJgZXZhbCBlY2hvICRmdWxsX3ZhcmAiCisgICAgaWYgdGVzdCAieCRuZXdfZnVsbF92YXIiID0gIngkZnVsbF92YXIiOyB0aGVuIGJyZWFrOyBmaQorICAgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgZG9uZQorCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBFWFBBTkRFRF9TWVNDT05GRElSPSIkZnVsbF92YXIiCisKKworICAgIHByZWZpeD0kcHJlZml4X3NhdmUKKyAgZXhlY19wcmVmaXg9JGV4ZWNfcHJlZml4X3NhdmUKKworCisgIEVYUF9WQVI9RVhQQU5ERURfQklORElSCisgIEZST01fVkFSPSIkYmluZGlyIgorCisgICAgcHJlZml4X3NhdmU9JHByZWZpeAorICBleGVjX3ByZWZpeF9zYXZlPSRleGVjX3ByZWZpeAorCisgICAgaWYgdGVzdCAieCRwcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIHByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorICBmaQorICAgIGlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIGV4ZWNfcHJlZml4PSRwcmVmaXgKKyAgZmkKKworICBmdWxsX3Zhcj0iJEZST01fVkFSIgorICAgIHdoaWxlIHRydWU7IGRvCisgICAgbmV3X2Z1bGxfdmFyPSJgZXZhbCBlY2hvICRmdWxsX3ZhcmAiCisgICAgaWYgdGVzdCAieCRuZXdfZnVsbF92YXIiID0gIngkZnVsbF92YXIiOyB0aGVuIGJyZWFrOyBmaQorICAgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgZG9uZQorCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBFWFBBTkRFRF9CSU5ESVI9IiRmdWxsX3ZhciIKKworCisgICAgcHJlZml4PSRwcmVmaXhfc2F2ZQorICBleGVjX3ByZWZpeD0kZXhlY19wcmVmaXhfc2F2ZQorCisKKyAgRVhQX1ZBUj1FWFBBTkRFRF9MSUJESVIKKyAgRlJPTV9WQVI9IiRsaWJkaXIiCisKKyAgICBwcmVmaXhfc2F2ZT0kcHJlZml4CisgIGV4ZWNfcHJlZml4X3NhdmU9JGV4ZWNfcHJlZml4CisKKyAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgPSAieE5PTkUiOyB0aGVuCisgICAgcHJlZml4PSIkYWNfZGVmYXVsdF9wcmVmaXgiCisgIGZpCisgICAgaWYgdGVzdCAieCRleGVjX3ByZWZpeCIgPSAieE5PTkUiOyB0aGVuCisgICAgZXhlY19wcmVmaXg9JHByZWZpeAorICBmaQorCisgIGZ1bGxfdmFyPSIkRlJPTV9WQVIiCisgICAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBuZXdfZnVsbF92YXI9ImBldmFsIGVjaG8gJGZ1bGxfdmFyYCIKKyAgICBpZiB0ZXN0ICJ4JG5ld19mdWxsX3ZhciIgPSAieCRmdWxsX3ZhciI7IHRoZW4gYnJlYWs7IGZpCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBkb25lCisKKyAgICBmdWxsX3Zhcj0kbmV3X2Z1bGxfdmFyCisgIEVYUEFOREVEX0xJQkRJUj0iJGZ1bGxfdmFyIgorCisKKyAgICBwcmVmaXg9JHByZWZpeF9zYXZlCisgIGV4ZWNfcHJlZml4PSRleGVjX3ByZWZpeF9zYXZlCisKKworICBFWFBfVkFSPUVYUEFOREVEX0xJQkVYRUNESVIKKyAgRlJPTV9WQVI9IiRsaWJleGVjZGlyIgorCisgICAgcHJlZml4X3NhdmU9JHByZWZpeAorICBleGVjX3ByZWZpeF9zYXZlPSRleGVjX3ByZWZpeAorCisgICAgaWYgdGVzdCAieCRwcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIHByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorICBmaQorICAgIGlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIGV4ZWNfcHJlZml4PSRwcmVmaXgKKyAgZmkKKworICBmdWxsX3Zhcj0iJEZST01fVkFSIgorICAgIHdoaWxlIHRydWU7IGRvCisgICAgbmV3X2Z1bGxfdmFyPSJgZXZhbCBlY2hvICRmdWxsX3ZhcmAiCisgICAgaWYgdGVzdCAieCRuZXdfZnVsbF92YXIiID0gIngkZnVsbF92YXIiOyB0aGVuIGJyZWFrOyBmaQorICAgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgZG9uZQorCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBFWFBBTkRFRF9MSUJFWEVDRElSPSIkZnVsbF92YXIiCisKKworICAgIHByZWZpeD0kcHJlZml4X3NhdmUKKyAgZXhlY19wcmVmaXg9JGV4ZWNfcHJlZml4X3NhdmUKKworCisgIEVYUF9WQVI9RVhQQU5ERURfREFUQURJUgorICBGUk9NX1ZBUj0iJGRhdGFkaXIiCisKKyAgICBwcmVmaXhfc2F2ZT0kcHJlZml4CisgIGV4ZWNfcHJlZml4X3NhdmU9JGV4ZWNfcHJlZml4CisKKyAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgPSAieE5PTkUiOyB0aGVuCisgICAgcHJlZml4PSIkYWNfZGVmYXVsdF9wcmVmaXgiCisgIGZpCisgICAgaWYgdGVzdCAieCRleGVjX3ByZWZpeCIgPSAieE5PTkUiOyB0aGVuCisgICAgZXhlY19wcmVmaXg9JHByZWZpeAorICBmaQorCisgIGZ1bGxfdmFyPSIkRlJPTV9WQVIiCisgICAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBuZXdfZnVsbF92YXI9ImBldmFsIGVjaG8gJGZ1bGxfdmFyYCIKKyAgICBpZiB0ZXN0ICJ4JG5ld19mdWxsX3ZhciIgPSAieCRmdWxsX3ZhciI7IHRoZW4gYnJlYWs7IGZpCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBkb25lCisKKyAgICBmdWxsX3Zhcj0kbmV3X2Z1bGxfdmFyCisgIEVYUEFOREVEX0RBVEFESVI9IiRmdWxsX3ZhciIKKworCisgICAgcHJlZml4PSRwcmVmaXhfc2F2ZQorICBleGVjX3ByZWZpeD0kZXhlY19wcmVmaXhfc2F2ZQorCisKKyMjIyMgQ2hlY2sgb3VyIG9wZXJhdGluZyBzeXN0ZW0KK29wZXJhdGluZ19zeXN0ZW09dW5rbm93bgoraWYgdGVzdCAtZiAvZXRjL3JlZGhhdC1yZWxlYXNlIHx8IHRlc3QgLWYgJEVYUEFOREVEX1NZU0NPTkZESVIvcmVkaGF0LXJlbGVhc2UgOyB0aGVuCisgICBvcGVyYXRpbmdfc3lzdGVtPXJlZGhhdAorZmkKKworaWYgdGVzdCAtZiAvZXRjL3NsYWNrd2FyZS12ZXJzaW9uIHx8IHRlc3QgLWYgJEVYUEFOREVEX1NZU0NPTkZESVIvc2xhY2t3YXJlLXZlcnNpb24gOyB0aGVuCisgICBvcGVyYXRpbmdfc3lzdGVtPXNsYWNrd2FyZQorZmkKKworaWYgdGVzdCAtZiAvdXNyL2Jpbi9jeWd3aW4xLmRsbCB8fCB0ZXN0IC1mICRFWFBBTkRFRF9CSU5ESVIvY3lnd2luMS5kbGwgOyB0aGVuCisgICBvcGVyYXRpbmdfc3lzdGVtPWN5Z3dpbgorZmkKKworIyMjIyBTb3J0IG91dCBpbml0IHNjcmlwdHMKKworaWYgdGVzdCB4JHdpdGhfaW5pdF9zY3JpcHRzID0geDsgdGhlbgorICAgIGNhc2UgeCRvcGVyYXRpbmdfc3lzdGVtIGluCisgICAgICAgIHhyZWRoYXQpCXdpdGhfaW5pdF9zY3JpcHRzPXJlZGhhdCA7OworICAgICAgICB4c2xhY2t3YXJlKQl3aXRoX2luaXRfc2NyaXB0cz1zbGFja3dhcmUgOzsKKyAgICAgICAgeGN5Z3dpbikJd2l0aF9pbml0X3NjcmlwdHM9Y3lnd2luIDs7CisgICAgICAgICopCQkJd2l0aF9pbml0X3NjcmlwdHM9bm9uZSA7OworICAgIGVzYWMKK2ZpCisKKyBpZiB0ZXN0IHgkd2l0aF9pbml0X3NjcmlwdHMgPSB4cmVkaGF0OyB0aGVuCisgIERCVVNfSU5JVF9TQ1JJUFRTX1JFRF9IQVRfVFJVRT0KKyAgREJVU19JTklUX1NDUklQVFNfUkVEX0hBVF9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19JTklUX1NDUklQVFNfUkVEX0hBVF9UUlVFPScjJworICBEQlVTX0lOSVRfU0NSSVBUU19SRURfSEFUX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHhzbGFja3dhcmU7IHRoZW4KKyAgREJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFX1RSVUU9CisgIERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRV9GQUxTRT0nIycKK2Vsc2UKKyAgREJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFX1RSVUU9JyMnCisgIERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRV9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkd2l0aF9pbml0X3NjcmlwdHMgPSB4Y3lnd2luOyB0aGVuCisgIERCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTl9UUlVFPQorICBEQlVTX0lOSVRfU0NSSVBUU19DWUdXSU5fRkFMU0U9JyMnCitlbHNlCisgIERCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTl9UUlVFPScjJworICBEQlVTX0lOSVRfU0NSSVBUU19DWUdXSU5fRkFMU0U9CitmaQorCisKKyMjIyMjIHN5c3RlbWQgdW5pdCBmaWxlcworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXI7CitlbHNlCisgIHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXI9JCgkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXN5c3RlbWRzeXN0ZW11bml0ZGlyIHN5c3RlbWQpCitmaQorCitpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIiICE9IHhubzsgdGhlbgorICAgc3lzdGVtZHN5c3RlbXVuaXRkaXI9JHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIKKworZmkKKyBpZiB0ZXN0IC1uICIkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgLWEgIngkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgIT0geG5vIDsgdGhlbgorICBIQVZFX1NZU1RFTURfVFJVRT0KKyAgSEFWRV9TWVNURU1EX0ZBTFNFPScjJworZWxzZQorICBIQVZFX1NZU1RFTURfVFJVRT0nIycKKyAgSEFWRV9TWVNURU1EX0ZBTFNFPQorZmkKKworCisjIyMjIyBTZXQgdXAgbG9jYXRpb24gZm9yIHN5c3RlbSBidXMgc29ja2V0CitpZiAhIHRlc3QgLXogIiR3aXRoX3N5c3RlbV9zb2NrZXQiOyB0aGVuCisgICBEQlVTX1NZU1RFTV9TT0NLRVQ9JHdpdGhfc3lzdGVtX3NvY2tldAorZWxzZQorICAgREJVU19TWVNURU1fU09DS0VUPSR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0vcnVuL2RidXMvc3lzdGVtX2J1c19zb2NrZXQKK2ZpCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERCVVNfU1lTVEVNX1NPQ0tFVCAiJERCVVNfU1lTVEVNX1NPQ0tFVCIKK19BQ0VPRgorCisKKyMjIHN5c3RlbSBidXMgb25seSBsaXN0ZW5zIG9uIGxvY2FsIGRvbWFpbiBzb2NrZXRzLCBhbmQgbmV2ZXIKKyMjIG9uIGFuIGFic3RyYWN0IHNvY2tldCAoc28gb25seSByb290IGNhbiBjcmVhdGUgdGhlIHNvY2tldCkKK0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1M9InVuaXg6cGF0aD0kREJVU19TWVNURU1fU09DS0VUIgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyAiJERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MiCitfQUNFT0YKKworCisjIyMjIFNldCB1cCB0aGUgcGlkIGZpbGUKK2lmICEgdGVzdCAteiAiJHdpdGhfc3lzdGVtX3BpZF9maWxlIjsgdGhlbgorICAgREJVU19TWVNURU1fUElEX0ZJTEU9JHdpdGhfc3lzdGVtX3BpZF9maWxlCitlbGlmIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHhyZWRoYXQgOyB0aGVuCisgICBEQlVTX1NZU1RFTV9QSURfRklMRT0ke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9L3J1bi9tZXNzYWdlYnVzLnBpZAorZWxzZQorICAgREJVU19TWVNURU1fUElEX0ZJTEU9JHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfS9ydW4vZGJ1cy9waWQKK2ZpCisKKworCisjIyMjIERpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcnNoaXAKK2lmICEgdGVzdCAteiAiJHdpdGhfY29uc29sZV9hdXRoX2RpciI7IHRoZW4KKyAgIERCVVNfQ09OU09MRV9BVVRIX0RJUj0kd2l0aF9jb25zb2xlX2F1dGhfZGlyCitlbHNlCisgICBEQlVTX0NPTlNPTEVfQVVUSF9ESVI9L3Zhci9ydW4vY29uc29sZS8KK2ZpCisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERCVVNfQ09OU09MRV9BVVRIX0RJUiAiJERCVVNfQ09OU09MRV9BVVRIX0RJUiIKK19BQ0VPRgorCisKKyMjIyMgRmlsZSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcnNoaXAKK2lmIHRlc3QgeCRoYXZlX2NvbnNvbGVfb3duZXJfZmlsZSA9IHh5ZXM7IHRoZW4KKyAgIGlmICEgdGVzdCAteiAiJHdpdGhfY29uc29sZV9vd25lcl9maWxlIjsgdGhlbgorICAgICAgREJVU19DT05TT0xFX09XTkVSX0ZJTEU9JHdpdGhfY29uc29sZV9vd25lcl9maWxlCisgICBlbHNlCisgICAgICBEQlVTX0NPTlNPTEVfT1dORVJfRklMRT0vZGV2L2NvbnNvbGUKKyAgIGZpCitlbHNlCisgIERCVVNfQ09OU09MRV9PV05FUl9GSUxFPQorZmkKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREJVU19DT05TT0xFX09XTkVSX0ZJTEUgIiREQlVTX0NPTlNPTEVfT1dORVJfRklMRSIKK19BQ0VPRgorCisKKyMjIyMgVXNlciB0byBzdGFydCB0aGUgc3lzdGVtIGJ1cyBhcworaWYgdGVzdCAteiAiJHdpdGhfZGJ1c191c2VyIiA7IHRoZW4KKyAgICBEQlVTX1VTRVI9bWVzc2FnZWJ1cworZWxzZQorICAgIERCVVNfVVNFUj0kd2l0aF9kYnVzX3VzZXIKK2ZpCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBEQlVTX1VTRVIgIiREQlVTX1VTRVIiCitfQUNFT0YKKworCisjIyMjIFByZWZpeCB0byBpbnN0YWxsIGludG8KK0RCVVNfUFJFRklYPSRFWFBBTkRFRF9QUkVGSVgKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERCVVNfUFJFRklYICIkREJVU19QUkVGSVgiCitfQUNFT0YKKworCisjIyMjIERpcmVjb3RyeSB0byBpbnN0YWxsIGRhdGEgZmlsZXMgaW50bworREJVU19EQVRBRElSPSRFWFBBTkRFRF9EQVRBRElSCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBEQlVTX0RBVEFESVIgIiREQlVTX0RBVEFESVIiCitfQUNFT0YKKworCisjIyMjIERpcmVjdG9yeSB0byBpbnN0YWxsIGRidXMtZGFlbW9uCitpZiB0ZXN0IC16ICIkd2l0aF9kYnVzX2RhZW1vbmRpciIgOyB0aGVuCisgICAgREJVU19EQUVNT05ESVI9JEVYUEFOREVEX0JJTkRJUgorZWxzZQorICAgIERCVVNfREFFTU9ORElSPSR3aXRoX2RidXNfZGFlbW9uZGlyCitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREJVU19EQUVNT05ESVIgIiREQlVTX0RBRU1PTkRJUiIKK19BQ0VPRgorCisKKyMjIyMgRGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIG90aGVyIGJpbmFyaWVzCitEQlVTX0JJTkRJUj0iJEVYUEFOREVEX0JJTkRJUiIKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIERCVVNfQklORElSICIkREJVU19CSU5ESVIiCitfQUNFT0YKKworCisjIyMjIERpcmVjdG9yeSB0byBpbnN0YWxsIHRoZSBsaWJleGVjIGJpbmFyaWVzCitEQlVTX0xJQkVYRUNESVI9IiRFWFBBTkRFRF9MSUJFWEVDRElSIgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREJVU19MSUJFWEVDRElSICIkREJVU19MSUJFWEVDRElSIgorX0FDRU9GCisKKworIyMjIyBUZWxsIHRlc3RzIHdoZXJlIHRvIGZpbmQgY2VydGFpbiBzdHVmZiBpbiBidWlsZGRpcgorCitEQlVTX1BXRD1gcHdkYAorIyBVc2VmdWwgaW4gYSBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudCwgd2hlcmUgdGhlIHRlc3RzIGFyZSBydW4gb24gdGhlIGhvc3Qgc3lzdGVtLgorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRidXMtdGVzdC1kaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RidXNfdGVzdF9kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2RidXNfdGVzdF9kaXI7IERCVVNfUFdEPSR3aXRodmFsCitmaQorCisKKworCisKK1RFU1RfVkFMSURfU0VSVklDRV9ESVI9JHtEQlVTX1BXRH0vdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBURVNUX1ZBTElEX1NFUlZJQ0VfRElSICIkVEVTVF9WQUxJRF9TRVJWSUNFX0RJUiIKK19BQ0VPRgorCisKKworCitURVNUX0lOVkFMSURfU0VSVklDRV9ESVI9JHtEQlVTX1BXRH0vdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFRFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUiAiJFRFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUiIKK19BQ0VPRgorCisKKworCitURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUj0ke0RCVVNfUFdEfS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUiAiJFRFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSIgorX0FDRU9GCisKKworCisKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVI9JHtEQlVTX1BXRH0vdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBURVNUX0lOVkFMSURfU0VSVklDRV9TWVNURU1fRElSICIkVEVTVF9JTlZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUiIKK19BQ0VPRgorCisKKworCitURVNUX1NFUlZJQ0VfQklOQVJZPSR7REJVU19QV0R9L3Rlc3QvdGVzdC1zZXJ2aWNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVEVTVF9TRVJWSUNFX0JJTkFSWSAiJFRFU1RfU0VSVklDRV9CSU5BUlkkRVhFRVhUIgorX0FDRU9GCisKKworCisKK1RFU1RfU0hFTExfU0VSVklDRV9CSU5BUlk9JHtEQlVTX1BXRH0vdGVzdC90ZXN0LXNoZWxsLXNlcnZpY2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZICIkVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWSRFWEVFWFQiCitfQUNFT0YKKworCisKKworVEVTVF9FWElUX0JJTkFSWT0ke0RCVVNfUFdEfS90ZXN0L3Rlc3QtZXhpdAorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFRFU1RfRVhJVF9CSU5BUlkgIiRURVNUX0VYSVRfQklOQVJZJEVYRUVYVCIKK19BQ0VPRgorCisKKworCitURVNUX1NFR0ZBVUxUX0JJTkFSWT0ke0RCVVNfUFdEfS90ZXN0L3Rlc3Qtc2VnZmF1bHQKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBURVNUX1NFR0ZBVUxUX0JJTkFSWSAiJFRFU1RfU0VHRkFVTFRfQklOQVJZJEVYRUVYVCIKK19BQ0VPRgorCisKKworCitURVNUX1NMRUVQX0ZPUkVWRVJfQklOQVJZPSR7REJVU19QV0R9L3Rlc3QvdGVzdC1zbGVlcC1mb3JldmVyCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWSAiJFRFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkkRVhFRVhUIgorX0FDRU9GCisKKworCisKK1RFU1RfUFJJVlNFUlZFUl9CSU5BUlk9JHtEQlVTX1BXRH0vdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVEVTVF9QUklWU0VSVkVSX0JJTkFSWSAiJFRFU1RfUFJJVlNFUlZFUl9CSU5BUlkkRVhFRVhUIgorX0FDRU9GCisKKworCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBURVNUX0JVU19CSU5BUlkgIiREQlVTX1BXRC9idXMvZGJ1cy1kYWVtb24kRVhFRVhUIgorX0FDRU9GCisKKworCisjIyBFeHBvcnQgdGhlIG5vbi1zZXR1aWQgZXh0ZXJuYWwgaGVscGVyCitURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZPSIkREJVU19QV0QvYnVzL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCRFWEVFWFQiCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBEQlVTX1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkgIiRURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZIgorX0FDRU9GCisKKworIyMjIyBGaW5kIHNvY2tldCBkaXJlY3RvcmllcworaWYgISB0ZXN0IC16ICIkVE1QRElSIiA7IHRoZW4KKyAgIERFRkFVTFRfU09DS0VUX0RJUj0kVE1QRElSCitlbGlmICEgdGVzdCAteiAiJFRFTVAiIDsgdGhlbgorICAgREVGQVVMVF9TT0NLRVRfRElSPSRURU1QCitlbGlmICEgdGVzdCAteiAiJFRNUCIgOyB0aGVuCisgICBERUZBVUxUX1NPQ0tFVF9ESVI9JFRNUAorZWxzZQorICAgREVGQVVMVF9TT0NLRVRfRElSPS90bXAKK2ZpCisKK0RFRkFVTFRfU09DS0VUX0RJUj1gZWNobyAkREVGQVVMVF9TT0NLRVRfRElSIHwgc2VkICdzLysvJTJCL2cnYAorCitpZiAhIHRlc3QgLXogIiR3aXRoX3Rlc3Rfc29ja2V0X2RpciIgOyB0aGVuCisgICBURVNUX1NPQ0tFVF9ESVI9IiR3aXRoX3Rlc3Rfc29ja2V0X2RpciIKK2Vsc2UKKyAgIFRFU1RfU09DS0VUX0RJUj0kREVGQVVMVF9TT0NLRVRfRElSCitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREJVU19URVNUX1NPQ0tFVF9ESVIgIiRURVNUX1NPQ0tFVF9ESVIiCitfQUNFT0YKKworCitpZiAhIHRlc3QgLXogIiR3aXRoX3Nlc3Npb25fc29ja2V0X2RpciIgOyB0aGVuCisgICBEQlVTX1NFU1NJT05fU09DS0VUX0RJUj0iJHdpdGhfc2Vzc2lvbl9zb2NrZXRfZGlyIgorZWxzZQorICAgREJVU19TRVNTSU9OX1NPQ0tFVF9ESVI9JERFRkFVTFRfU09DS0VUX0RJUgorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAiJERCVVNfU0VTU0lPTl9TT0NLRVRfRElSIgorX0FDRU9GCisKKworCitpZiB0ZXN0IHgkZGJ1c193aW4gPSB4eWVzOyB0aGVuCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTPSJub25jZS10Y3A6IgorZWxpZiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllczsgdGhlbgorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUz0ibGF1bmNoZDplbnY9REJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCIKK2Vsc2UKKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1M9InVuaXg6dG1wZGlyPSREQlVTX1NFU1NJT05fU09DS0VUX0RJUiIKK2ZpCisKKworIyBkYXJ3aW4gbmVlZHMgdGhpcyB0byBpbml0aWFsaXplIHRoZSBlbnZpcm9ubWVudAorZm9yIGFjX2hlYWRlciBpbiBjcnRfZXh0ZXJucy5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJjcnRfZXh0ZXJucy5oIiAiYWNfY3ZfaGVhZGVyX2NydF9leHRlcm5zX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2NydF9leHRlcm5zX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9DUlRfRVhURVJOU19IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIl9OU0dldEVudmlyb24iICJhY19jdl9mdW5jX19OU0dldEVudmlyb24iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfX05TR2V0RW52aXJvbiIgPSB4eWVzOyB0aGVuIDoKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9OU0dFVEVOVklST04gMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgRG94eWZpbGUgZGJ1cy92ZXJzaW9uaW5mby5yYyBkYnVzL2RidXMtYXJjaC1kZXBzLmggYnVzL3N5c3RlbS5jb25mIGJ1cy9zZXNzaW9uLmNvbmYgYnVzL21lc3NhZ2VidXMgYnVzL21lc3NhZ2VidXMtY29uZmlnIGJ1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0IGJ1cy9yYy5tZXNzYWdlYnVzIGJ1cy9kYnVzLnNlcnZpY2UgYnVzL2RidXMuc29ja2V0IE1ha2VmaWxlIGRidXMvTWFrZWZpbGUgYnVzL01ha2VmaWxlIHRvb2xzL01ha2VmaWxlIHRlc3QvTWFrZWZpbGUgdGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUgZG9jL01ha2VmaWxlIGRvYy9kYnVzLWRhZW1vbi4xIGRidXMtMS5wYyBkYnVzLTEtdW5pbnN0YWxsZWQucGMgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZSB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZSB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZSB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlIHRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlIHRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vVXNlci5zZXJ2aWNlIHRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlIgorCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAorIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzOiBkb3VibGUtcXVvdGUKKyAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwuCisgICAgICBzZWQgLW4gXAorCSJzLycvJ1xcXFwnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCisgICAgICA7OworICAgIGVzYWMgfAorICAgIHNvcnQKKykgfAorICBzZWQgJworICAgICAvXmFjX2N2X2Vudl8vYiBlbmQKKyAgICAgdCBjbGVhcgorICAgICA6Y2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKyAgICAgOmVuZCcgPj5jb25mY2FjaGUKK2lmIGRpZmYgIiRjYWNoZV9maWxlIiBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KKwljYXQgY29uZmNhY2hlID4iJGNhY2hlX2ZpbGUiCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4gIygKKyAgICAgICAgKi8qIHwgPzoqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIkJCAmJgorCSAgbXYgLWYgIiRjYWNoZV9maWxlIiQkICIkY2FjaGVfZmlsZSIgOzsgIygKKyAgICAgICAgKikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiIDs7CisJZXNhYworICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9CitVPQorZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCisgIGFjX2k9YCRhc19lY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAorICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCisgICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgorICBhc19mbl9hcHBlbmQgYWNfbGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorICBhc19mbl9hcHBlbmQgYWNfbHRsaWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKK2RvbmUKK0xJQk9CSlM9JGFjX2xpYm9ianMKKworTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKKworCisgaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KKyAgYW1fX0VYRUVYVF9UUlVFPQorICBhbV9fRVhFRVhUX0ZBTFNFPScjJworZWxzZQorICBhbV9fRVhFRVhUX1RSVUU9JyMnCisgIGFtX19FWEVFWFRfRkFMU0U9CitmaQorCitpZiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9UUlVFfSIgJiYgdGVzdCAteiAiJHtNQUlOVEFJTkVSX01PREVfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJNQUlOVEFJTkVSX01PREVcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ1hYX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDWFhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0RCVVNfV0lOX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfV0lOX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiREJVU19XSU5cIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0RCVVNfV0lOQ0VfVFJVRX0iICYmIHRlc3QgLXogIiR7REJVU19XSU5DRV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfV0lOQ0VcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0RCVVNfVU5JWF9UUlVFfSIgJiYgdGVzdCAteiAiJHtEQlVTX1VOSVhfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJEQlVTX1VOSVhcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0RCVVNfQ1lHV0lOX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfQ1lHV0lOX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiREJVU19DWUdXSU5cIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCitpZiB0ZXN0IC16ICIke0RCVVNfQlVJTERfVEVTVFNfVFJVRX0iICYmIHRlc3QgLXogIiR7REJVU19CVUlMRF9URVNUU19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfQlVJTERfVEVTVFNcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgIiRMSU5FTk8iIDUKK2ZpCisKK2lmIHRlc3QgLXogIiR7REJVU19VU0VfRVhQQVRfVFJVRX0iICYmIHRlc3QgLXogIiR7REJVU19VU0VfRVhQQVRfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJEQlVTX1VTRV9FWFBBVFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19VU0VfTElCWE1MX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfVVNFX0xJQlhNTF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfVVNFX0xJQlhNTFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7SEFWRV9TRUxJTlVYX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfU0VMSU5VWF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfU0VMSU5VWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19CVVNfRU5BQkxFX0lOT1RJRllfVFJVRX0iICYmIHRlc3QgLXogIiR7REJVU19CVVNfRU5BQkxFX0lOT1RJRllfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJEQlVTX0JVU19FTkFCTEVfSU5PVElGWVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVhfVFJVRX0iICYmIHRlc3QgLXogIiR7REJVU19CVVNfRU5BQkxFX0ROT1RJRllfT05fTElOVVhfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJEQlVTX0JVU19FTkFCTEVfRE5PVElGWV9PTl9MSU5VWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19CVVNfRU5BQkxFX0tRVUVVRV9UUlVFfSIgJiYgdGVzdCAteiAiJHtEQlVTX0JVU19FTkFCTEVfS1FVRVVFX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiREJVU19CVVNfRU5BQkxFX0tRVUVVRVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19FTkFCTEVfTEFVTkNIRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtEQlVTX0VOQUJMRV9MQVVOQ0hEX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiREJVU19FTkFCTEVfTEFVTkNIRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7SEFWRV9DT05TT0xFX09XTkVSX0ZJTEVfVFJVRX0iICYmIHRlc3QgLXogIiR7SEFWRV9DT05TT0xFX09XTkVSX0ZJTEVfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJIQVZFX0NPTlNPTEVfT1dORVJfRklMRVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7SEFWRV9MSUJBVURJVF9UUlVFfSIgJiYgdGVzdCAteiAiJHtIQVZFX0xJQkFVRElUX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSEFWRV9MSUJBVURJVFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFfSIgJiYgdGVzdCAteiAiJHtEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19IQVZFX1hTTFRQUk9DX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfSEFWRV9YU0xUUFJPQ19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfSEFWRV9YU0xUUFJPQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19YTUxfRE9DU19FTkFCTEVEX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfWE1MX0RPQ1NfRU5BQkxFRF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfWE1MX0RPQ1NfRU5BQkxFRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19IQVZFX01BTjJIVE1MX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfSEFWRV9NQU4ySFRNTF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfSEFWRV9NQU4ySFRNTFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRX0iICYmIHRlc3QgLXogIiR7REJVU19DQU5fVVBMT0FEX0RPQ1NfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJEQlVTX0NBTl9VUExPQURfRE9DU1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19JTklUX1NDUklQVFNfUkVEX0hBVF9UUlVFfSIgJiYgdGVzdCAteiAiJHtEQlVTX0lOSVRfU0NSSVBUU19SRURfSEFUX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiREJVU19JTklUX1NDUklQVFNfUkVEX0hBVFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19JTklUX1NDUklQVFNfU0xBQ0tXQVJFX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7REJVU19JTklUX1NDUklQVFNfQ1lHV0lOX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTl9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkRCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7SEFWRV9TWVNURU1EX1RSVUV9IiAmJiB0ZXN0IC16ICIke0hBVkVfU1lTVEVNRF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkhBVkVfU1lTVEVNRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKKworOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCithY193cml0ZV9mYWlsPTAKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2FzX3dyaXRlX2ZhaWw9MAorY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2RlYnVnPWZhbHNlCithY19jc19yZWNoZWNrPWZhbHNlCithY19jc19zaWxlbnQ9ZmFsc2UKKworU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK2V4cG9ydCBTSEVMTAorX0FTRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gIygKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyAjKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gIygKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQorY2FzZSAkMCBpbiAjKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl91bnNldCBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tCisjIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisjIGFzX2ZuX2FwcGVuZCBWQVIgVkFMVUUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4gVkFSLiBUYWtlCisjIGFkdmFudGFnZSBvZiBhbnkgc2hlbGwgb3B0aW1pemF0aW9ucyB0aGF0IGFsbG93IGFtb3J0aXplZCBsaW5lYXIgZ3Jvd3RoIG92ZXIKKyMgcmVwZWF0ZWQgYXBwZW5kcywgaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCBxdWFkcmF0aWMgZ3Jvd3RoIHByZXNlbnQgaW4gbmFpdmUKKyMgaW1wbGVtZW50YXRpb25zLgoraWYgKGV2YWwgImFzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeFwkYXNfdmFyID0geDEyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDErPVwkMgorICB9JworZWxzZQorICBhc19mbl9hcHBlbmQgKCkKKyAgeworICAgIGV2YWwgJDE9XCQkMVwkMgorICB9CitmaSAjIGFzX2ZuX2FwcGVuZAorCisjIGFzX2ZuX2FyaXRoIEFSRy4uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGVyZm9ybSBhcml0aG1ldGljIGV2YWx1YXRpb24gb24gdGhlIEFSR3MsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZQorIyBnbG9iYWwgJGFzX3ZhbC4gVGFrZSBhZHZhbnRhZ2Ugb2Ygc2hlbGxzIHRoYXQgY2FuIGF2b2lkIGZvcmtzLiBUaGUgYXJndW1lbnRzCisjIG11c3QgYmUgcG9ydGFibGUgYWNyb3NzICQoKCkpIGFuZCBleHByLgoraWYgKGV2YWwgInRlc3QgXCQoKCAxICsgMSApKSA9IDIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9JCgoICQqICkpCisgIH0nCitlbHNlCisgIGFzX2ZuX2FyaXRoICgpCisgIHsKKyAgICBhc192YWw9YGV4cHIgIiRAIiB8fCB0ZXN0ICQ/IC1lcSAxYAorICB9CitmaSAjIGFzX2ZuX2FyaXRoCisKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluICMoKCgoKAorLW4qKQorICBjYXNlIGBlY2hvICd4eVxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgIHh5KSAgRUNIT19DPSdcYyc7OworICAqKSAgIGVjaG8gYGVjaG8ga3NoODggYnVnIG9uIEFJWCA2LjFgID4gL2Rldi9udWxsCisgICAgICAgRUNIT19UPScJJzs7CisgIGVzYWM7OworKikKKyAgRUNIT19OPSctbic7OworZXNhYworCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCitmaQoraWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPSdsbiAtcycKKyAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgICBhc19sbl9zPSdjcCAtcCcKKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPWxuCisgIGVsc2UKKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgZmkKK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAoraWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworZXhlYyA2PiYxCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mICRDT05GSUdfU1RBVFVTIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNFT0YKK3Rlc3QgJGFzX3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICQwIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgorIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KK2FjX2xvZz0iCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IGRidXMgJGFzX21lIDEuNC4xMCwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjguICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKyIKKworX0FDRU9GCisKK2Nhc2UgJGFjX2NvbmZpZ19maWxlcyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfZmlsZXM7IHNoaWZ0OyBhY19jb25maWdfZmlsZXM9JCo7OworZXNhYworCitjYXNlICRhY19jb25maWdfaGVhZGVycyBpbiAqIgorIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSQqOzsKK2VzYWMKKworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKK2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCitjb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMiCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBhY3Rpb25zCitmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gIFVubGVzcyB0aGUgZmlsZXMKK2FuZCBhY3Rpb25zIGFyZSBzcGVjaWZpZWQgYXMgVEFHcywgYWxsIGFyZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtUQUddLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKKyAgICAgIC0tY29uZmlnICAgICBwcmludCBjb25maWd1cmF0aW9uLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50CisgICAgICAgICAgICAgICAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCisgIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisgICAgICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCisgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGhlYWRlcnM6CiskY29uZmlnX2hlYWRlcnMKKworQ29uZmlndXJhdGlvbiBjb21tYW5kczoKKyRjb25maWdfY29tbWFuZHMKKworUmVwb3J0IGJ1Z3MgdG8gPGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PWRidXM+LiIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCithY19jc192ZXJzaW9uPSJcXAorZGJ1cyBjb25maWcuc3RhdHVzIDEuNC4xMAorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LAorICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKKworQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK01LRElSX1A9JyRNS0RJUl9QJworQVdLPSckQVdLJwordGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCithY19uZWVkX2RlZmF1bHRzPToKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKyAgY2FzZSAkMSBpbgorICAtLSo9PyopCisgICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgIC0tKj0pCisgICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9CisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgICopCisgICAgYWNfb3B0aW9uPSQxCisgICAgYWNfb3B0YXJnPSQyCisgICAgYWNfc2hpZnQ9c2hpZnQKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGFjX2NzX3JlY2hlY2s9OiA7OworICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCisgICAgJGFzX2VjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OworICAtLWNvbmZpZyB8IC0tY29uZmkgfCAtLWNvbmYgfCAtLWNvbiB8IC0tY28gfCAtLWMgKQorICAgICRhc19lY2hvICIkYWNfY3NfY29uZmlnIjsgZXhpdCA7OworICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQorICAgIGRlYnVnPTogOzsKKyAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICcnKSBhc19mbl9lcnJvciAkPyAibWlzc2luZyBmaWxlIGFyZ3VtZW50IiA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0ZJTEVTICIgJyRhY19vcHRhcmcnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19IRUFERVJTICIgJyRhY19vcHRhcmcnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgYXNfZm5fZXJyb3IgJD8gImFtYmlndW91cyBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiI7OworICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCisgICAgYWNfY3Nfc2lsZW50PTogOzsKKworICAjIFRoaXMgaXMgYW4gZXJyb3IuCisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkMScKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA7OworCisgICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWdfdGFyZ2V0cyAiICQxIgorICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7CisKKyAgZXNhYworICBzaGlmdAorZG9uZQorCithY19jb25maWd1cmVfZXh0cmFfYXJncz0KKworaWYgJGFjX2NzX3NpbGVudDsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCisgIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQoraWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCisgIHNldCBYICckU0hFTEwnICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKyAgc2hpZnQKKyAgXCRhc19lY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgXCQqIiA+JjYKKyAgQ09ORklHX1NIRUxMPSckU0hFTEwnCisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgZXhlYyAiXCRAIgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKKyAgJGFzX2VjaG8gIiRhY19sb2ciCit9ID4mNQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIworIyBJTklULUNPTU1BTkRTCisjCitBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCisKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JworZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKK21hY3JvX3ZlcnNpb249J2AkRUNITyAiJG1hY3JvX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbWFjcm9fcmV2aXNpb249J2AkRUNITyAiJG1hY3JvX3JldmlzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWQ9J2AkRUNITyAiJGVuYWJsZV9zaGFyZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3N0YXRpYz0nYCRFQ0hPICIkZW5hYmxlX3N0YXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwaWNfbW9kZT0nYCRFQ0hPICIkcGljX21vZGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Zhc3RfaW5zdGFsbD0nYCRFQ0hPICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTSEVMTD0nYCRFQ0hPICIkU0hFTEwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRUNITz0nYCRFQ0hPICIkRUNITyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitob3N0X2FsaWFzPSdgJEVDSE8gIiRob3N0X2FsaWFzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hvc3Q9J2AkRUNITyAiJGhvc3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaG9zdF9vcz0nYCRFQ0hPICIkaG9zdF9vcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitidWlsZF9hbGlhcz0nYCRFQ0hPICIkYnVpbGRfYWxpYXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYnVpbGQ9J2AkRUNITyAiJGJ1aWxkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2J1aWxkX29zPSdgJEVDSE8gIiRidWlsZF9vcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTRUQ9J2AkRUNITyAiJFNFRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitYc2VkPSdgJEVDSE8gIiRYc2VkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dSRVA9J2AkRUNITyAiJEdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRUdSRVA9J2AkRUNITyAiJEVHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0ZHUkVQPSdgJEVDSE8gIiRGR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitMRD0nYCRFQ0hPICIkTEQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTk09J2AkRUNITyAiJE5NIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xOX1M9J2AkRUNITyAiJExOX1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbWF4X2NtZF9sZW49J2AkRUNITyAiJG1heF9jbWRfbGVuIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FjX29iamV4dD0nYCRFQ0hPICIkYWNfb2JqZXh0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4ZWV4dD0nYCRFQ0hPICIkZXhlZXh0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Vuc2V0PSdgJEVDSE8gIiRsdF91bnNldCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9TUDJOTD0nYCRFQ0hPICIkbHRfU1AyTkwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfTkwyU1A9J2AkRUNITyAiJGx0X05MMlNQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9J2AkRUNITyAiJGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD0nYCRFQ0hPICIkbHRfY3ZfdG9fdG9vbF9maWxlX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCityZWxvYWRfZmxhZz0nYCRFQ0hPICIkcmVsb2FkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2NtZHM9J2AkRUNITyAiJHJlbG9hZF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK09CSkRVTVA9J2AkRUNITyAiJE9CSkRVTVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZGVwbGlic19jaGVja19tZXRob2Q9J2AkRUNITyAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbWFnaWNfY21kPSdgJEVDSE8gIiRmaWxlX21hZ2ljX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitmaWxlX21hZ2ljX2dsb2I9J2AkRUNITyAiJGZpbGVfbWFnaWNfZ2xvYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit3YW50X25vY2FzZWdsb2I9J2AkRUNITyAiJHdhbnRfbm9jYXNlZ2xvYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitETExUT09MPSdgJEVDSE8gIiRETExUT09MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSdgJEVDSE8gIiRzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitBUj0nYCRFQ0hPICIkQVIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQVJfRkxBR1M9J2AkRUNITyAiJEFSX0ZMQUdTIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVyX2xpc3Rfc3BlYz0nYCRFQ0hPICIkYXJjaGl2ZXJfbGlzdF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1NUUklQPSdgJEVDSE8gIiRTVFJJUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitSQU5MSUI9J2AkRUNITyAiJFJBTkxJQiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nYCRFQ0hPICIkb2xkX3Bvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0nYCRFQ0hPICIkb2xkX3Bvc3R1bmluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9jbWRzPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj0nYCRFQ0hPICIkbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0NDPSdgJEVDSE8gIiRDQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitDRkxBR1M9J2AkRUNITyAiJENGTEFHUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcj0nYCRFQ0hPICIkY29tcGlsZXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworR0NDPSdgJEVDSE8gIiRHQ0MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm1fZmlsZV9saXN0X3NwZWM9J2AkRUNITyAiJG5tX2ZpbGVfbGlzdF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3N5c3Jvb3Q9J2AkRUNITyAiJGx0X3N5c3Jvb3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2JqZGlyPSdgJEVDSE8gIiRvYmpkaXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTUFHSUNfQ01EPSdgJEVDSE8gIiRNQUdJQ19DTUQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfcGljPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3dsPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3dsIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz0nYCRFQ0hPICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF9sb2Nrcz0nYCRFQ0hPICIkbmVlZF9sb2NrcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitNQU5JRkVTVF9UT09MPSdgJEVDSE8gIiRNQU5JRkVTVF9UT09MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0RTWU1VVElMPSdgJEVDSE8gIiREU1lNVVRJTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitOTUVESVQ9J2AkRUNITyAiJE5NRURJVCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitMSVBPPSdgJEVDSE8gIiRMSVBPIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK09UT09MPSdgJEVDSE8gIiRPVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitPVE9PTDY0PSdgJEVDSE8gIiRPVE9PTDY0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpYmV4dD0nYCRFQ0hPICIkbGliZXh0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NocmV4dF9jbWRzPSdgJEVDSE8gIiRzaHJleHRfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHRyYWN0X2V4cHN5bXNfY21kcz0nYCRFQ0hPICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9jbWRzX25lZWRfbGM9J2AkRUNITyAiJGFyY2hpdmVfY21kc19uZWVkX2xjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9J2AkRUNITyAiJGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSdgJEVDSE8gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9J2AkRUNITyAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX25lZWRzX29iamVjdD0nYCRFQ0hPICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kcz0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfZXhwc3ltX2NtZHM9J2AkRUNITyAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbW9kdWxlX2NtZHM9J2AkRUNITyAiJG1vZHVsZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9leHBzeW1fY21kcz0nYCRFQ0hPICIkbW9kdWxlX2V4cHN5bV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dpdGhfZ251X2xkPSdgJEVDSE8gIiR3aXRoX2dudV9sZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithbGxvd191bmRlZmluZWRfZmxhZz0nYCRFQ0hPICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm9fdW5kZWZpbmVkX2ZsYWc9J2AkRUNITyAiJG5vX3VuZGVmaW5lZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nYCRFQ0hPICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdD0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX21pbnVzX0w9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWM9J2AkRUNITyAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmhlcml0X3JwYXRoPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpbmtfYWxsX2RlcGxpYnM9J2AkRUNITyAiJGxpbmtfYWxsX2RlcGxpYnMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSdgJEVDSE8gIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X3N5bWJvbHNfY21kcz0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGV4Y2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVsaW5rX2NtZHM9J2AkRUNITyAiJHByZWxpbmtfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0bGlua19jbWRzPSdgJEVDSE8gIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRmaWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0nYCRFQ0hPICIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF9saWJfcHJlZml4PSdgJEVDSE8gIiRuZWVkX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF92ZXJzaW9uPSdgJEVDSE8gIiRuZWVkX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwordmVyc2lvbl90eXBlPSdgJEVDSE8gIiR2ZXJzaW9uX3R5cGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcnVucGF0aF92YXI9J2AkRUNITyAiJHJ1bnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NobGlicGF0aF92YXI9J2AkRUNITyAiJHNobGlicGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSdgJEVDSE8gIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlibmFtZV9zcGVjPSdgJEVDSE8gIiRsaWJuYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlicmFyeV9uYW1lc19zcGVjPSdgJEVDSE8gIiRsaWJyYXJ5X25hbWVzX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc29uYW1lX3NwZWM9J2AkRUNITyAiJHNvbmFtZV9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luc3RhbGxfb3ZlcnJpZGVfbW9kZT0nYCRFQ0hPICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRwb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmluaXNoX2NtZHM9J2AkRUNITyAiJGZpbmlzaF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbmlzaF9ldmFsPSdgJEVDSE8gIiRmaW5pc2hfZXZhbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9pbnRvX2xpYnM9J2AkRUNITyAiJGhhcmRjb2RlX2ludG9fbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9J2AkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfYWN0aW9uPSdgJEVDSE8gIiRoYXJkY29kZV9hY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Rsb3Blbj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3BlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGY9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9zdHJpcGxpYj0nYCRFQ0hPICIkb2xkX3N0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N0cmlwbGliPSdgJEVDSE8gIiRzdHJpcGxpYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9J2AkRUNITyAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0cz0nYCRFQ0hPICIkcHJlZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGRlcF9vYmplY3RzPSdgJEVDSE8gIiRwb3N0ZGVwX29iamVjdHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcHJlZGVwcz0nYCRFQ0hPICIkcHJlZGVwcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwcz0nYCRFQ0hPICIkcG9zdGRlcHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSdgJEVDSE8gIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTERfQ1hYPSdgJEVDSE8gIiRMRF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTERfUkM9J2AkRUNITyAiJExEX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3JlbG9hZF9mbGFnX0NYWD0nYCRFQ0hPICIkcmVsb2FkX2ZsYWdfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3JlbG9hZF9mbGFnX1JDPSdgJEVDSE8gIiRyZWxvYWRfZmxhZ19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCityZWxvYWRfY21kc19DWFg9J2AkRUNITyAiJHJlbG9hZF9jbWRzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCityZWxvYWRfY21kc19SQz0nYCRFQ0hPICIkcmVsb2FkX2NtZHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfY21kc19DWFg9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2NtZHNfUkM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2NtZHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfQ1hYPSdgJEVDSE8gIiRjb21waWxlcl9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfUkM9J2AkRUNITyAiJGNvbXBpbGVyX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dDQ19DWFg9J2AkRUNITyAiJEdDQ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworR0NDX1JDPSdgJEVDSE8gIiRHQ0NfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfUkM9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfcGljX1JDPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpY19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl93bF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl93bF9SQz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl93bF9SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19SQz0nYCRFQ0hPICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPSdgJEVDSE8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkM9J2AkRUNITyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19uZWVkX2xjX1JDPSdgJEVDSE8gIiRhcmNoaXZlX2NtZHNfbmVlZF9sY19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD0nYCRFQ0hPICIkZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19SQz0nYCRFQ0hPICIkZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPSdgJEVDSE8gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19SQz0nYCRFQ0hPICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nYCRFQ0hPICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX1JDPSdgJEVDSE8gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYPSdgJEVDSE8gIiRjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX25lZWRzX29iamVjdF9SQz0nYCRFQ0hPICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0X1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0NYWD0nYCRFQ0hPICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX1JDPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2NtZHNfQ1hYPSdgJEVDSE8gIiRhcmNoaXZlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kc19SQz0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdgJEVDSE8gIiRhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithcmNoaXZlX2V4cHN5bV9jbWRzX1JDPSdgJEVDSE8gIiRhcmNoaXZlX2V4cHN5bV9jbWRzX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9jbWRzX0NYWD0nYCRFQ0hPICIkbW9kdWxlX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9jbWRzX1JDPSdgJEVDSE8gIiRtb2R1bGVfY21kc19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSdgJEVDSE8gIiRtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9leHBzeW1fY21kc19SQz0nYCRFQ0hPICIkbW9kdWxlX2V4cHN5bV9jbWRzX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dpdGhfZ251X2xkX0NYWD0nYCRFQ0hPICIkd2l0aF9nbnVfbGRfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dpdGhfZ251X2xkX1JDPSdgJEVDSE8gIiR3aXRoX2dudV9sZF9SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithbGxvd191bmRlZmluZWRfZmxhZ19DWFg9J2AkRUNITyAiJGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithbGxvd191bmRlZmluZWRfZmxhZ19SQz0nYCRFQ0hPICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWdfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPSdgJEVDSE8gIiRub191bmRlZmluZWRfZmxhZ19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm9fdW5kZWZpbmVkX2ZsYWdfUkM9J2AkRUNITyAiJG5vX3VuZGVmaW5lZF9mbGFnX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX1JDPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX1JDPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2RpcmVjdF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfZGlyZWN0X1JDPSdgJEVDSE8gIiRoYXJkY29kZV9kaXJlY3RfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlX0NYWD0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfUkM9J2AkRUNITyAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9taW51c19MX0NYWD0nYCRFQ0hPICIkaGFyZGNvZGVfbWludXNfTF9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbWludXNfTF9SQz0nYCRFQ0hPICIkaGFyZGNvZGVfbWludXNfTF9SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9SQz0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPSdgJEVDSE8gIiRoYXJkY29kZV9hdXRvbWF0aWNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2F1dG9tYXRpY19SQz0nYCRFQ0hPICIkaGFyZGNvZGVfYXV0b21hdGljX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luaGVyaXRfcnBhdGhfQ1hYPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmhlcml0X3JwYXRoX1JDPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpbmtfYWxsX2RlcGxpYnNfQ1hYPSdgJEVDSE8gIiRsaW5rX2FsbF9kZXBsaWJzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsaW5rX2FsbF9kZXBsaWJzX1JDPSdgJEVDSE8gIiRsaW5rX2FsbF9kZXBsaWJzX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2Fsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9J2AkRUNITyAiJGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzX1JDPSdgJEVDSE8gIiRhbHdheXNfZXhwb3J0X3N5bWJvbHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9J2AkRUNITyAiJGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4cG9ydF9zeW1ib2xzX2NtZHNfUkM9J2AkRUNITyAiJGV4cG9ydF9zeW1ib2xzX2NtZHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhjbHVkZV9leHBzeW1zX0NYWD0nYCRFQ0hPICIkZXhjbHVkZV9leHBzeW1zX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGNsdWRlX2V4cHN5bXNfUkM9J2AkRUNITyAiJGV4Y2x1ZGVfZXhwc3ltc19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXNfQ1hYPSdgJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luY2x1ZGVfZXhwc3ltc19SQz0nYCRFQ0hPICIkaW5jbHVkZV9leHBzeW1zX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3ByZWxpbmtfY21kc19DWFg9J2AkRUNITyAiJHByZWxpbmtfY21kc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcHJlbGlua19jbWRzX1JDPSdgJEVDSE8gIiRwcmVsaW5rX2NtZHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGxpbmtfY21kc19DWFg9J2AkRUNITyAiJHBvc3RsaW5rX2NtZHNfQ1hYIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RsaW5rX2NtZHNfUkM9J2AkRUNITyAiJHBvc3RsaW5rX2NtZHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9saXN0X3NwZWNfQ1hYPSdgJEVDSE8gIiRmaWxlX2xpc3Rfc3BlY19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmlsZV9saXN0X3NwZWNfUkM9J2AkRUNITyAiJGZpbGVfbGlzdF9zcGVjX1JDIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2FjdGlvbl9DWFg9J2AkRUNITyAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfYWN0aW9uX1JDPSdgJEVDSE8gIiRoYXJkY29kZV9hY3Rpb25fUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnNfUkM9J2AkRUNITyAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0c19DWFg9J2AkRUNITyAiJHByZWRlcF9vYmplY3RzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBfb2JqZWN0c19SQz0nYCRFQ0hPICIkcHJlZGVwX29iamVjdHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdGRlcF9vYmplY3RzX0NYWD0nYCRFQ0hPICIkcG9zdGRlcF9vYmplY3RzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwX29iamVjdHNfUkM9J2AkRUNITyAiJHBvc3RkZXBfb2JqZWN0c19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVkZXBzX0NYWD0nYCRFQ0hPICIkcHJlZGVwc19DWFgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcHJlZGVwc19SQz0nYCRFQ0hPICIkcHJlZGVwc19SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwc19DWFg9J2AkRUNITyAiJHBvc3RkZXBzX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0ZGVwc19SQz0nYCRFQ0hPICIkcG9zdGRlcHNfUkMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0nYCRFQ0hPICIkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfUkM9J2AkRUNITyAiJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9SQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCisKK0xUQ0M9JyRMVENDJworTFRDRkxBR1M9JyRMVENGTEFHUycKK2NvbXBpbGVyPSckY29tcGlsZXJfREVGQVVMVCcKKworIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCitcJDEKK19MVEVDSE9fRU9GJworfQorCisjIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBTSEVMTCBcCitFQ0hPIFwKK1NFRCBcCitHUkVQIFwKK0VHUkVQIFwKK0ZHUkVQIFwKK0xEIFwKK05NIFwKK0xOX1MgXAorbHRfU1AyTkwgXAorbHRfTkwyU1AgXAorcmVsb2FkX2ZsYWcgXAorT0JKRFVNUCBcCitkZXBsaWJzX2NoZWNrX21ldGhvZCBcCitmaWxlX21hZ2ljX2NtZCBcCitmaWxlX21hZ2ljX2dsb2IgXAord2FudF9ub2Nhc2VnbG9iIFwKK0RMTFRPT0wgXAorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQgXAorQVIgXAorQVJfRkxBR1MgXAorYXJjaGl2ZXJfbGlzdF9zcGVjIFwKK1NUUklQIFwKK1JBTkxJQiBcCitDQyBcCitDRkxBR1MgXAorY29tcGlsZXIgXAorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IFwKK25tX2ZpbGVfbGlzdF9zcGVjIFwKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIFwKK2x0X3Byb2dfY29tcGlsZXJfcGljIFwKK2x0X3Byb2dfY29tcGlsZXJfd2wgXAorbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgXAorbHRfY3ZfcHJvZ19jb21waWxlcl9jX28gXAorbmVlZF9sb2NrcyBcCitNQU5JRkVTVF9UT09MIFwKK0RTWU1VVElMIFwKK05NRURJVCBcCitMSVBPIFwKK09UT09MIFwKK09UT09MNjQgXAorc2hyZXh0X2NtZHMgXAorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjIFwKK2NvbXBpbGVyX25lZWRzX29iamVjdCBcCit3aXRoX2dudV9sZCBcCithbGxvd191bmRlZmluZWRfZmxhZyBcCitub191bmRlZmluZWRfZmxhZyBcCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQgXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCitleGNsdWRlX2V4cHN5bXMgXAoraW5jbHVkZV9leHBzeW1zIFwKK2ZpbGVfbGlzdF9zcGVjIFwKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIFwKK2xpYm5hbWVfc3BlYyBcCitsaWJyYXJ5X25hbWVzX3NwZWMgXAorc29uYW1lX3NwZWMgXAoraW5zdGFsbF9vdmVycmlkZV9tb2RlIFwKK2ZpbmlzaF9ldmFsIFwKK29sZF9zdHJpcGxpYiBcCitzdHJpcGxpYiBcCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgXAorcHJlZGVwX29iamVjdHMgXAorcG9zdGRlcF9vYmplY3RzIFwKK3ByZWRlcHMgXAorcG9zdGRlcHMgXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoIFwKK0xEX0NYWCBcCitMRF9SQyBcCityZWxvYWRfZmxhZ19DWFggXAorcmVsb2FkX2ZsYWdfUkMgXAorY29tcGlsZXJfQ1hYIFwKK2NvbXBpbGVyX1JDIFwKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWCBcCitsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19SQyBcCitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggXAorbHRfcHJvZ19jb21waWxlcl9waWNfUkMgXAorbHRfcHJvZ19jb21waWxlcl93bF9DWFggXAorbHRfcHJvZ19jb21waWxlcl93bF9SQyBcCitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFggXAorbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfUkMgXAorbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIFwKK2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDIFwKK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFggXAorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDIFwKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWCBcCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQyBcCitjb21waWxlcl9uZWVkc19vYmplY3RfQ1hYIFwKK2NvbXBpbGVyX25lZWRzX29iamVjdF9SQyBcCit3aXRoX2dudV9sZF9DWFggXAord2l0aF9nbnVfbGRfUkMgXAorYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYIFwKK2FsbG93X3VuZGVmaW5lZF9mbGFnX1JDIFwKK25vX3VuZGVmaW5lZF9mbGFnX0NYWCBcCitub191bmRlZmluZWRfZmxhZ19SQyBcCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWCBcCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfQ1hYIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfUkMgXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFggXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9SQyBcCitleGNsdWRlX2V4cHN5bXNfQ1hYIFwKK2V4Y2x1ZGVfZXhwc3ltc19SQyBcCitpbmNsdWRlX2V4cHN5bXNfQ1hYIFwKK2luY2x1ZGVfZXhwc3ltc19SQyBcCitmaWxlX2xpc3Rfc3BlY19DWFggXAorZmlsZV9saXN0X3NwZWNfUkMgXAorY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzX0NYWCBcCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnNfUkMgXAorcHJlZGVwX29iamVjdHNfQ1hYIFwKK3ByZWRlcF9vYmplY3RzX1JDIFwKK3Bvc3RkZXBfb2JqZWN0c19DWFggXAorcG9zdGRlcF9vYmplY3RzX1JDIFwKK3ByZWRlcHNfQ1hYIFwKK3ByZWRlcHNfUkMgXAorcG9zdGRlcHNfQ1hYIFwKK3Bvc3RkZXBzX1JDIFwKK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFggXAorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX1JDOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiByZWxvYWRfY21kcyBcCitvbGRfcG9zdGluc3RhbGxfY21kcyBcCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKK29sZF9hcmNoaXZlX2NtZHMgXAorZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBcCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyBcCithcmNoaXZlX2NtZHMgXAorYXJjaGl2ZV9leHBzeW1fY21kcyBcCittb2R1bGVfY21kcyBcCittb2R1bGVfZXhwc3ltX2NtZHMgXAorZXhwb3J0X3N5bWJvbHNfY21kcyBcCitwcmVsaW5rX2NtZHMgXAorcG9zdGxpbmtfY21kcyBcCitwb3N0aW5zdGFsbF9jbWRzIFwKK3Bvc3R1bmluc3RhbGxfY21kcyBcCitmaW5pc2hfY21kcyBcCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgXAorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorcmVsb2FkX2NtZHNfQ1hYIFwKK3JlbG9hZF9jbWRzX1JDIFwKK29sZF9hcmNoaXZlX2NtZHNfQ1hYIFwKK29sZF9hcmNoaXZlX2NtZHNfUkMgXAorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFggXAorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQyBcCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggXAorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMgXAorYXJjaGl2ZV9jbWRzX0NYWCBcCithcmNoaXZlX2NtZHNfUkMgXAorYXJjaGl2ZV9leHBzeW1fY21kc19DWFggXAorYXJjaGl2ZV9leHBzeW1fY21kc19SQyBcCittb2R1bGVfY21kc19DWFggXAorbW9kdWxlX2NtZHNfUkMgXAorbW9kdWxlX2V4cHN5bV9jbWRzX0NYWCBcCittb2R1bGVfZXhwc3ltX2NtZHNfUkMgXAorZXhwb3J0X3N5bWJvbHNfY21kc19DWFggXAorZXhwb3J0X3N5bWJvbHNfY21kc19SQyBcCitwcmVsaW5rX2NtZHNfQ1hYIFwKK3ByZWxpbmtfY21kc19SQyBcCitwb3N0bGlua19jbWRzX0NYWCBcCitwb3N0bGlua19jbWRzX1JDOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInCit4c2lfc2hlbGw9JyR4c2lfc2hlbGwnCitsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnCisKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCisKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJworCisKKworCisKKworCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisKKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCitkbworICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisgICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICAgImxpYnRvb2wiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgbGlidG9vbCIgOzsKKyAgICAiRG94eWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgRG94eWZpbGUiIDs7CisgICAgImRidXMvdmVyc2lvbmluZm8ucmMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZGJ1cy92ZXJzaW9uaW5mby5yYyIgOzsKKyAgICAiZGJ1cy9kYnVzLWFyY2gtZGVwcy5oIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRidXMvZGJ1cy1hcmNoLWRlcHMuaCIgOzsKKyAgICAiYnVzL3N5c3RlbS5jb25mIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGJ1cy9zeXN0ZW0uY29uZiIgOzsKKyAgICAiYnVzL3Nlc3Npb24uY29uZiIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBidXMvc2Vzc2lvbi5jb25mIiA7OworICAgICJidXMvbWVzc2FnZWJ1cyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBidXMvbWVzc2FnZWJ1cyIgOzsKKyAgICAiYnVzL21lc3NhZ2VidXMtY29uZmlnIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGJ1cy9tZXNzYWdlYnVzLWNvbmZpZyIgOzsKKyAgICAiYnVzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgYnVzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QiIDs7CisgICAgImJ1cy9yYy5tZXNzYWdlYnVzIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGJ1cy9yYy5tZXNzYWdlYnVzIiA7OworICAgICJidXMvZGJ1cy5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGJ1cy9kYnVzLnNlcnZpY2UiIDs7CisgICAgImJ1cy9kYnVzLnNvY2tldCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBidXMvZGJ1cy5zb2NrZXQiIDs7CisgICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworICAgICJkYnVzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRidXMvTWFrZWZpbGUiIDs7CisgICAgImJ1cy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBidXMvTWFrZWZpbGUiIDs7CisgICAgInRvb2xzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL01ha2VmaWxlIiA7OworICAgICJ0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvTWFrZWZpbGUiIDs7CisgICAgInRlc3QvbmFtZS10ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvbmFtZS10ZXN0L01ha2VmaWxlIiA7OworICAgICJkb2MvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZG9jL01ha2VmaWxlIiA7OworICAgICJkb2MvZGJ1cy1kYWVtb24uMSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkb2MvZGJ1cy1kYWVtb24uMSIgOzsKKyAgICAiZGJ1cy0xLnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRidXMtMS5wYyIgOzsKKyAgICAiZGJ1cy0xLXVuaW5zdGFsbGVkLnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRidXMtMS11bmluc3RhbGxlZC5wYyIgOzsKKyAgICAidGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZiIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mIiA7OworICAgICJ0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mIiA7OworICAgICJ0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYiIDs7CisgICAgInRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZiIgOzsKKyAgICAidGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlci5zZXJ2aWNlIiA7OworICAgICJ0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UiIDs7CisgICAgInRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlIiA7OworICAgICJ0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZSIgOzsKKyAgICAidGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlIiA7OworICAgICJ0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UiIDs7CisgICAgInRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlIiA7OworICAgICJ0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlIiA7OworICAgICJ0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZSIgOzsKKyAgICAidGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UiIDs7CisgICAgInRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlIiA7OworICAgICJ0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZSIgOzsKKyAgICAidGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9TZXJ2aWNlLnNlcnZpY2UiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9TZXJ2aWNlLnNlcnZpY2UiIDs7CisKKyAgKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgYXJndW1lbnQ6IFxgJGFjX2NvbmZpZ190YXJnZXQnIiAiJExJTkVOTyIgNTs7CisgIGVzYWMKK2RvbmUKKworCisjIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCisjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKyMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKKyMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCitpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcworICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycworICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcworZmkKKworIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCisjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6CisjIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KKyRkZWJ1ZyB8fAoreworICB0bXA9IGFjX3RtcD0KKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgOiAiJHthY190bXA6PSR0bXB9IgorICB7IHRlc3QgISAtZCAiJGFjX3RtcCIgfHwgcm0gLWZyICIkYWNfdG1wIjsgfSAmJiBleGl0ICRleGl0X3N0YXR1cworJyAwCisgIHRyYXAgJ2FzX2ZuX2V4aXQgMScgMSAyIDEzIDE1Cit9CisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKworeworICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKKyAgdGVzdCAtZCAiJHRtcCIKK30gIHx8Cit7CisgIHRtcD0uL2NvbmYkJC0kUkFORE9NCisgICh1bWFzayAwNzcgJiYgbWtkaXIgIiR0bXAiKQorfSB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gLiIgIiRMSU5FTk8iIDUKK2FjX3RtcD0kdG1wCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCisKKworYWNfY3I9YGVjaG8gWCB8IHRyIFggJ1wwMTUnYAorIyBPbiBjeWd3aW4sIGJhc2ggY2FuIGVhdCBcciBpbnNpZGUgYGAgaWYgdGhlIHVzZXIgcmVxdWVzdGVkIGlnbmNyLgorIyBCdXQgd2Uga25vdyBvZiBubyBvdGhlciBzaGVsbCB3aGVyZSBhY19jciB3b3VsZCBiZSBlbXB0eSBhdCB0aGlzCisjIHBvaW50LCBzbyB3ZSBjYW4gdXNlIGEgYmFzaGlzbSBhcyBhIGZhbGxiYWNrLgoraWYgdGVzdCAieCRhY19jciIgPSB4OyB0aGVuCisgIGV2YWwgYWNfY3I9XCRcJ1xcclwnCitmaQorYWNfY3NfYXdrX2NyPWAkQVdLICdCRUdJTiB7IHByaW50ICJhXHJiIiB9JyA8L2Rldi9udWxsIDI+L2Rldi9udWxsYAoraWYgdGVzdCAiJGFjX2NzX2F3a19jciIgPSAiYSR7YWNfY3J9YiI7IHRoZW4KKyAgYWNfY3NfYXdrX2NyPSdcXHInCitlbHNlCisgIGFjX2NzX2F3a19jcj0kYWNfY3IKK2ZpCisKK2VjaG8gJ0JFR0lOIHsnID4iJGFjX3RtcC9zdWJzMS5hd2siICYmCitfQUNFT0YKKworCit7CisgIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCisgIGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IHNlZCAncy8uKi8mISQmJGFjX2RlbGltLycgJiYKKyAgZWNobyAiX0FDRU9GIgorfSA+Y29uZiQkc3Vicy5zaCB8fAorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CithY19kZWxpbV9udW09YGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IGdyZXAgLWMgJ14nYAorYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworICAuIC4vY29uZiQkc3Vicy5zaCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAorICBpZiB0ZXN0ICRhY19kZWxpbV9uID0gJGFjX2RlbGltX251bTsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKK3JtIC1mIGNvbmYkJHN1YnMuc2gKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmCitfQUNFT0YKK3NlZCAtbiAnCitoCitzL14vU1siLzsgcy8hLiovIl09LworcAorZworcy9eW14hXSohLy8KKzpyZXBsCit0IHJlcGwKK3MvJyIkYWNfZGVsaW0iJyQvLwordCBkZWxpbQorOm5sCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcbiJcXC8KK3AKK24KK2IgcmVwbAorOm1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCitwCitnCitzLy5cezE0OFx9Ly8KK3QgbmwKKzpkZWxpbQoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iLworcAorYgorOm1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCitwCitnCitzLy5cezE0OFx9Ly8KK3QgZGVsaW0KKycgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKKy9eW14iIl0veworICBOCisgIHMvXG4vLworfQorJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorcm0gLWYgY29uZiQkc3Vicy5hd2sKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorX0FDQVdLCitjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorICBmb3IgKGtleSBpbiBTKSBTX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorCit9Cit7CisgIGxpbmUgPSAkIDAKKyAgbmZpZWxkcyA9IHNwbGl0KGxpbmUsIGZpZWxkLCAiQCIpCisgIHN1YnN0ZWQgPSAwCisgIGxlbiA9IGxlbmd0aChmaWVsZFsxXSkKKyAgZm9yIChpID0gMjsgaSA8IG5maWVsZHM7IGkrKykgeworICAgIGtleSA9IGZpZWxkW2ldCisgICAga2V5bGVuID0gbGVuZ3RoKGtleSkKKyAgICBpZiAoU19pc19zZXRba2V5XSkgeworICAgICAgdmFsdWUgPSBTW2tleV0KKyAgICAgIGxpbmUgPSBzdWJzdHIobGluZSwgMSwgbGVuKSAiIiB2YWx1ZSAiIiBzdWJzdHIobGluZSwgbGVuICsga2V5bGVuICsgMykKKyAgICAgIGxlbiArPSBsZW5ndGgodmFsdWUpICsgbGVuZ3RoKGZpZWxkWysraV0pCisgICAgICBzdWJzdGVkID0gMQorICAgIH0gZWxzZQorICAgICAgbGVuICs9IDEgKyBrZXlsZW4KKyAgfQorCisgIHByaW50IGxpbmUKK30KKworX0FDQVdLCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIHNlZCAicy8kYWNfY3IvLyIgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICBzZWQgInMvJGFjX2NyXCQvLzsgcy8kYWNfY3IvJGFjX2NzX2F3a19jci9nIgorZWxzZQorICBjYXQKK2ZpIDwgIiRhY190bXAvc3ViczEuYXdrIiA+ICIkYWNfdG1wL3N1YnMuYXdrIiBcCisgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK19BQ0VPRgorCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlIHNvbGUgJChzcmNkaXIpLAorIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGVudHJpZXMgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj1bCSBdKi97CitoCitzLy8vCitzL14vOi8KK3MvWwkgXSokLzovCitzLzpcJChzcmNkaXIpOi86L2cKK3MvOlwke3NyY2Rpcn06LzovZworcy86QHNyY2RpckA6LzovZworcy9eOiovLworcy86KiQvLworeAorcy9cKD1bCSBdKlwpLiovXDEvCitHCitzL1xuLy8KK3MvXltePV0qPVsJIF0qJC8vCit9JworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfSEVBREVSUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgTWFrZWZpbGUnLgoraWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorY2F0ID4iJGFjX3RtcC9kZWZpbmVzLmF3ayIgPDxcX0FDQVdLIHx8CitCRUdJTiB7CitfQUNFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGFuIGF3ayBzY3JpcHQgYGRlZmluZXMuYXdrJywgZW1iZWRkZWQgYXMKKyMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKyMgY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4KKworIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQorIyBoYW5kbGluZyBvZiBsb25nIGxpbmVzLgorYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbworICBhY190dD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCisgIGlmIHRlc3QgLXogIiRhY190dCI7IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorCisjIEZvciB0aGUgYXdrIHNjcmlwdCwgRCBpcyBhbiBhcnJheSBvZiBtYWNybyB2YWx1ZXMga2V5ZWQgYnkgbmFtZSwKKyMgbGlrZXdpc2UgUCBjb250YWlucyBtYWNybyBwYXJhbWV0ZXJzIGlmIGFueS4gIFByZXNlcnZlIGJhY2tzbGFzaAorIyBuZXdsaW5lIHNlcXVlbmNlcy4KKworYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKK3NlZCAtbiAnCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgcnNldAorOnJzZXQKK3MvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qLyAvCit0IGRlZgorZAorOmRlZgorcy9cXCQvLwordCBic25sCitzL1siXFxdL1xcJi9nCitzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKK0RbIlwxIl09IiBcMyIvcAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDIiL3AKK2QKKzpic25sCitzL1siXFxdL1xcJi9nCitzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKK0RbIlwxIl09IiBcM1xcXFxcXG4iXFwvcAordCBjb250CitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMlxcXFxcXG4iXFwvcAordCBjb250CitkCis6Y29udAorbgorcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IGNsZWFyCis6Y2xlYXIKK3MvXFwkLy8KK3QgYnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvcAorZAorOmJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXFxcXFxuIlxcL3AKK2IgY29udAorJyA8Y29uZmRlZnMuaCB8IHNlZCAnCitzLyciJGFjX2RlbGltIicvIlxcXAorIi9nJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgZm9yIChrZXkgaW4gRCkgRF9pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKK30KKy9eW1x0IF0qI1tcdCBdKihkZWZpbmV8dW5kZWYpW1x0IF0rJGFjX3dvcmRfcmUoW1x0IChdfFwkKS8geworICBsaW5lID0gXCQgMAorICBzcGxpdChsaW5lLCBhcmcsICIgIikKKyAgaWYgKGFyZ1sxXSA9PSAiIyIpIHsKKyAgICBkZWZ1bmRlZiA9IGFyZ1syXQorICAgIG1hYzEgPSBhcmdbM10KKyAgfSBlbHNlIHsKKyAgICBkZWZ1bmRlZiA9IHN1YnN0cihhcmdbMV0sIDIpCisgICAgbWFjMSA9IGFyZ1syXQorICB9CisgIHNwbGl0KG1hYzEsIG1hYzIsICIoIikgIykKKyAgbWFjcm8gPSBtYWMyWzFdCisgIHByZWZpeCA9IHN1YnN0cihsaW5lLCAxLCBpbmRleChsaW5lLCBkZWZ1bmRlZikgLSAxKQorICBpZiAoRF9pc19zZXRbbWFjcm9dKSB7CisgICAgIyBQcmVzZXJ2ZSB0aGUgd2hpdGUgc3BhY2Ugc3Vycm91bmRpbmcgdGhlICIjIi4KKyAgICBwcmludCBwcmVmaXggImRlZmluZSIsIG1hY3JvIFBbbWFjcm9dIERbbWFjcm9dCisgICAgbmV4dAorICB9IGVsc2UgeworICAgICMgUmVwbGFjZSAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSwKKyAgICAjIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisgICAgIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCisgICAgaWYgKGRlZnVuZGVmID09ICJ1bmRlZiIpIHsKKyAgICAgIHByaW50ICIvKiIsIHByZWZpeCBkZWZ1bmRlZiwgbWFjcm8sICIqLyIKKyAgICAgIG5leHQKKyAgICB9CisgIH0KK30KK3sgcHJpbnQgfQorX0FDQVdLCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitmaSAjIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyIKKworCitldmFsIHNldCBYICIgIDpGICRDT05GSUdfRklMRVMgIDpIICRDT05GSUdfSEVBREVSUyAgICA6QyAkQ09ORklHX0NPTU1BTkRTIgorc2hpZnQKK2ZvciBhY190YWcKK2RvCisgIGNhc2UgJGFjX3RhZyBpbgorICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKKyAgZXNhYworICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorICA6W0ZITF0qOiopOzsKKyAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNTs7CisgIDpbRkhdLSkgYWNfdGFnPS06LTs7CisgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisgIGVzYWMKKyAgYWNfc2F2ZV9JRlM9JElGUworICBJRlM9OgorICBzZXQgeCAkYWNfdGFnCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgc2hpZnQKKyAgYWNfZmlsZT0kMQorICBzaGlmdAorCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkwpIGFjX3NvdXJjZT0kMTs7CisgIDpbRkhdKQorICAgIGFjX2ZpbGVfaW5wdXRzPQorICAgIGZvciBhY19mCisgICAgZG8KKyAgICAgIGNhc2UgJGFjX2YgaW4KKyAgICAgIC0pIGFjX2Y9IiRhY190bXAvc3RkaW4iOzsKKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAorCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorCSB0ZXN0IC1mICIkYWNfZiIgfHwKKwkgICBjYXNlICRhY19mIGluCisJICAgW1xcLyRdKikgZmFsc2U7OworCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKwkgICBlc2FjIHx8CisJICAgYXNfZm5fZXJyb3IgMSAiY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogXGAkYWNfZiciICIkTElORU5PIiA1OzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX2YgaW4gKlwnKikgYWNfZj1gJGFzX2VjaG8gIiRhY19mIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7IGVzYWMKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19maWxlX2lucHV0cyAiICckYWNfZiciCisgICAgZG9uZQorCisgICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgICBjb25maWd1cmVfaW5wdXQ9J0dlbmVyYXRlZCBmcm9tICdgCisJICAkYXNfZWNobyAiJCoiIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZycKKwlgJyBieSBjb25maWd1cmUuJworICAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBmaQorICAgICMgTmV1dHJhbGl6ZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW50ZXJwcmV0ZWQgYnkgc2VkIGluIHJlcGxhY2VtZW50IHN0cmluZ3MuCisgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCisgICAgKlwmKiB8ICpcfCogfCAqXFwqICkKKyAgICAgICBhY19zZWRfY29uZl9pbnB1dD1gJGFzX2VjaG8gIiRjb25maWd1cmVfaW5wdXQiIHwKKyAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKyAgICAqKSBhY19zZWRfY29uZl9pbnB1dD0kY29uZmlndXJlX2lucHV0OzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRhY190YWcgaW4KKyAgICAqOi06KiB8ICo6LSkgY2F0ID4iJGFjX3RtcC9zdGRpbiIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1IDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKworICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIGFzX2Rpcj0iJGFjX2RpciI7IGFzX2ZuX21rZGlyX3AKKyAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAorICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CisgIGVzYWMgOzsKK2VzYWMKK2FjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAorYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK2FjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKK2VzYWMKK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKworCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkYpCisgICMKKyAgIyBDT05GSUdfRklMRQorICAjCisKKyAgY2FzZSAkSU5TVEFMTCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CisgICopIGFjX0lOU1RBTEw9JGFjX3RvcF9idWlsZF9wcmVmaXgkSU5TVEFMTCA7OworICBlc2FjCisgIGFjX01LRElSX1A9JE1LRElSX1AKKyAgY2FzZSAkTUtESVJfUCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSA7OworICAqLyopIGFjX01LRElSX1A9JGFjX3RvcF9idWlsZF9wcmVmaXgkTUtESVJfUCA7OworICBlc2FjCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCithY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KK2FjX3NlZF9kYXRhcm9vdD0nCisvZGF0YXJvb3RkaXIvIHsKKyAgcAorICBxCit9CisvQGRhdGFkaXJAL3AKKy9AZG9jZGlyQC9wCisvQGluZm9kaXJAL3AKKy9AbG9jYWxlZGlyQC9wCisvQG1hbmRpckAvcCcKK2Nhc2UgYGV2YWwgInNlZCAtbiBcIlwkYWNfc2VkX2RhdGFyb290XCIgJGFjX2ZpbGVfaW5wdXRzImAgaW4KKypkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKypAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mMjt9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhY19kYXRhcm9vdGRpcl9oYWNrPScKKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworICBzJkBkb2NkaXJAJiRkb2NkaXImZworICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCisgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisgIHMmQG1hbmRpckAmJG1hbmRpciZnCisgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Citlc2FjCitfQUNFT0YKKworIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisjIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/CitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX3NlZF9leHRyYT0iJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3N8QGNvbmZpZ3VyZV9pbnB1dEB8JGFjX3NlZF9jb25mX2lucHV0fDt0IHQKK3MmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAorcyZAdG9wX2J1aWxkX3ByZWZpeEAmJGFjX3RvcF9idWlsZF9wcmVmaXgmO3QgdAorcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKK3MmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0CitzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAorcyZATUtESVJfUEAmJGFjX01LRElSX1AmO3QgdAorJGFjX2RhdGFyb290ZGlyX2hhY2sKKyIKK2V2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siIFwKKyAgPiRhY190bXAvb3V0IHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorCit0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkYWNfdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyBcCisgICAgICAiJGFjX3RtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiYyO30KKworICBybSAtZiAiJGFjX3RtcC9zdGRpbiIKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtKSBjYXQgIiRhY190bXAvb3V0IiAmJiBybSAtZiAiJGFjX3RtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJGFjX3RtcC9vdXQiICIkYWNfZmlsZSI7OworICBlc2FjIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgOzsKKyAgOkgpCisgICMKKyAgIyBDT05GSUdfSEVBREVSCisgICMKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsKKyAgICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCisgICAgfSA+IiRhY190bXAvY29uZmlnLmgiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgcm0gLWYgIiRhY19maWxlIgorICAgICAgbXYgIiRhY190bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAorCXx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAtIiAiJExJTkVOTyIgNQorICBmaQorIyBDb21wdXRlICIkYWNfZmlsZSIncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCitfYW1fYXJnPSIkYWNfZmlsZSIKK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YCRhc19kaXJuYW1lIC0tICIkX2FtX2FyZyIgfHwKKyRhc19leHByIFgiJF9hbV9hcmciIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJF9hbV9hcmciIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJF9hbV9hcmciIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJF9hbV9hcmciIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkX2FtX2FyZyIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgL3N0YW1wLWgkX2FtX3N0YW1wX2NvdW50CisgOzsKKworICA6QykgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KKyA7OworICBlc2FjCisKKworICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KKyAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IHsKKyAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKKyAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAorICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KKyAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCisgICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7CisgICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OworICBlc2FjCisgIHNoaWZ0CisgIGZvciBtZgorICBkbworICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKKyAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KKyAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAorJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkbWYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgIGVsc2UKKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAorICAgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgICAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICAgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgICAjIGV4cGFuc2lvbi4KKyAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8CiskYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyOyBhc19mbl9ta2Rpcl9wCisgICAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgICAgZG9uZQorICBkb25lCit9CisgOzsKKyAgICAibGlidG9vbCI6QykKKworICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgICBmaQorCisgICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgorICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICAgJFJNICIkY2ZnZmlsZSIKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgICAgICAgICAgICAgICBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgorIworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgorIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9IkNYWCBSQyAiCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkPworbWFjcm9fdmVyc2lvbj0kbWFjcm9fdmVyc2lvbgorbWFjcm9fcmV2aXNpb249JG1hY3JvX3JldmlzaW9uCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkLgorcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzLgorRUNITz0kbHRfRUNITworCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEEgc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuCitTRUQ9JGx0X1NFRAorCisjIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgorWHNlZD0iXCRTRUQgLWUgMXMvXlgvLyIKKworIyBBIGdyZXAgcHJvZ3JhbSB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcy4KK0dSRVA9JGx0X0dSRVAKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIEEgbGl0ZXJhbCBzdHJpbmcgbWF0Y2hlci4KK0ZHUkVQPSRsdF9GR1JFUAorCisjIEEgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyLgorTk09JGx0X05NCisKKyMgV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbWF4X2NtZF9sZW4KKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9JGFjX29iamV4dAorCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0kZXhlZXh0CisKKyMgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgInVuc2V0Ii4KK2x0X3Vuc2V0PSRsdF91bnNldAorCisjIHR1cm4gc3BhY2VzIGludG8gbmV3bGluZXMuCitTUDJOTD0kbHRfbHRfU1AyTkwKKworIyB0dXJuIG5ld2xpbmVzIGludG8gc3BhY2VzLgorTkwyU1A9JGx0X2x0X05MMlNQCisKKyMgY29udmVydCBcJGJ1aWxkIGZpbGUgbmFtZXMgdG8gXCRob3N0IGZvcm1hdC4KK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKKworIyBjb252ZXJ0IFwkYnVpbGQgZmlsZXMgdG8gdG9vbGNoYWluIGZvcm1hdC4KK3RvX3Rvb2xfZmlsZV9jbWQ9JGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQKKworIyBBbiBvYmplY3Qgc3ltYm9sIGR1bXBlci4KK09CSkRVTVA9JGx0X09CSkRVTVAKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyIuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBIb3cgdG8gZmluZCBwb3RlbnRpYWwgZmlsZXMgd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIi4KK2ZpbGVfbWFnaWNfZ2xvYj0kbHRfZmlsZV9tYWdpY19nbG9iCisKKyMgRmluZCBwb3RlbnRpYWwgZmlsZXMgdXNpbmcgbm9jYXNlZ2xvYiB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiLgord2FudF9ub2Nhc2VnbG9iPSRsdF93YW50X25vY2FzZWdsb2IKKworIyBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9JGx0X0RMTFRPT0wKKworIyBDb21tYW5kIHRvIGFzc29jaWF0ZSBzaGFyZWQgYW5kIGxpbmsgbGlicmFyaWVzLgorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCisKKyMgRmxhZ3MgdG8gY3JlYXRlIGFuIGFyY2hpdmUuCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXIuCithcmNoaXZlcl9saXN0X3NwZWM9JGx0X2FyY2hpdmVyX2xpc3Rfc3BlYworCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtLgorU1RSSVA9JGx0X1NUUklQCisKKyMgQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIFdoZXRoZXIgdG8gdXNlIGEgbG9jayBmb3Igb2xkIGFyY2hpdmUgZXh0cmFjdGlvbi4KK2xvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj0kbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0NGTEFHUworCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIuCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkLgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4CisKKyMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzIGZvciBcJE5NLgorbm1fZmlsZV9saXN0X3NwZWM9JGx0X25tX2ZpbGVfbGlzdF9zcGVjCisKKyMgVGhlIHJvb3Qgd2hlcmUgdG8gc2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzLGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuCitsdF9zeXNyb290PSRsdF9zeXNyb290CisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiLgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBNYW5pZmVzdCB0b29sLgorTUFOSUZFU1RfVE9PTD0kbHRfTUFOSUZFU1RfVE9PTAorCisjIFRvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFguCitEU1lNVVRJTD0kbHRfRFNZTVVUSUwKKworIyBUb29sIHRvIGNoYW5nZSBnbG9iYWwgdG8gbG9jYWwgc3ltYm9scyBvbiBNYWMgT1MgWC4KK05NRURJVD0kbHRfTk1FRElUCisKKyMgVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWC4KK0xJUE89JGx0X0xJUE8KKworIyBsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWC4KK09UT09MPSRsdF9PVE9PTAorCisjIGxkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40LgorT1RPT0w2ND0kbHRfT1RPT0w2NAorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0kbGliZXh0CisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0kbHRfc2hyZXh0X2NtZHMKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IGxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSRsdF92YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaworCisjIERvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIFNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRQorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIFBlcm1pc3Npb24gbW9kZSBvdmVycmlkZSBmb3IgaW5zdGFsbGF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMuCitpbnN0YWxsX292ZXJyaWRlX21vZGU9JGx0X2luc3RhbGxfb3ZlcnJpZGVfbW9kZQorCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIGluc3RhbGxhdGlvbiBvZiBhIHNoYXJlZCBhcmNoaXZlLgorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworCisjIENvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIEFzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorIyBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMuCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzLgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRAorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2NfbworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYy4KK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIFdoZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5LgorY29tcGlsZXJfbmVlZHNfb2JqZWN0PSRsdF9jb21waWxlcl9uZWVkc19vYmplY3QKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworIyBhIHNoYXJlZCBhcmNoaXZlLgorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kcworCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeQorIyBkdXJpbmcgbGlua2luZy4gIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUVcJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyMgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyMgImFic29sdXRlIixpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyBcJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyMgbGlicmFyeSBpcyByZWxvY2F0ZWQuCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9JGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZQorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyMgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljCisKKyMgU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyMgdG8gcnVudGltZSBwYXRoIGxpc3QuCitpbmhlcml0X3JwYXRoPSRpbmhlcml0X3JwYXRoCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlicworCisjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcworCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzLgorcHJlbGlua19jbWRzPSRsdF9wcmVsaW5rX2NtZHMKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zLgorcG9zdGxpbmtfY21kcz0kbHRfcG9zdGxpbmtfY21kcworCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcy4KK2ZpbGVfbGlzdF9zcGVjPSRsdF9maWxlX2xpc3Rfc3BlYworCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KKworIyBUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlycworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworIyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0cworcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHMKK3ByZWRlcHM9JGx0X3ByZWRlcHMKK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwcworCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aAorCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX0xUX0VPRgorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK19MVF9FT0YKKyAgICA7OworICBlc2FjCisKKworbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCisKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgaWYgdGVzdCB4IiR4c2lfc2hlbGwiID0geHllczsgdGhlbgorICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lICgpJC8sL159ICMgZnVuY19kaXJuYW1lIC9jXAorZnVuY19kaXJuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfYmFzZW5hbWUgL2NcCitmdW5jX2Jhc2VuYW1lICgpXAore1wKK1wgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Jhc2VuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgL2NcCitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCitcICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3RyaXBuYW1lICgpJC8sL159ICMgZnVuY19zdHJpcG5hbWUgL2NcCitmdW5jX3N0cmlwbmFtZSAoKVwKK3tcCitcICAgICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmVcCitcICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC5cCitcICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9XAorXCAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifVwKK1wgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zdHJpcG5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3NwbGl0X2xvbmdfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9sb25nX29wdCAvY1wKK2Z1bmNfc3BsaXRfbG9uZ19vcHQgKClcCit7XAorXCAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9JHsxJSU9Kn1cCitcICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPSR7MSMqPX1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zcGxpdF9sb25nX29wdCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3BsaXRfc2hvcnRfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9zaG9ydF9vcHQgL2NcCitmdW5jX3NwbGl0X3Nob3J0X29wdCAoKVwKK3tcCitcICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZz0kezEjPz99XAorXCAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19sbzJvICgpJC8sL159ICMgZnVuY19sbzJvIC9jXAorZnVuY19sbzJvICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICoubG8pIGZ1bmNfbG8yb19yZXN1bHQ9JHsxJS5sb30uJHtvYmpleHR9IDs7XAorXCAgICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7O1wKK1wgICAgZXNhY1wKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xvMm8gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3hmb3JtICgpJC8sL159ICMgZnVuY194Zm9ybSAvY1wKK2Z1bmNfeGZvcm0gKClcCit7XAorICAgIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG9cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY194Zm9ybSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfYXJpdGggKCkkLywvXn0gIyBmdW5jX2FyaXRoIC9jXAorZnVuY19hcml0aCAoKVwKK3tcCisgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICQqICkpXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXJpdGggaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2xlbiAoKSQvLC9efSAjIGZ1bmNfbGVuIC9jXAorZnVuY19sZW4gKClcCit7XAorICAgIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xlbiBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCitmaQorCitpZiB0ZXN0IHgiJGx0X3NoZWxsX2FwcGVuZCIgPSB4eWVzOyB0aGVuCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZCAoKSQvLC9efSAjIGZ1bmNfYXBwZW5kIC9jXAorZnVuY19hcHBlbmQgKClcCit7XAorICAgIGV2YWwgIiR7MX0rPVxcJHsyfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZF9xdW90ZWQgKCkkLywvXn0gIyBmdW5jX2FwcGVuZF9xdW90ZWQgL2NcCitmdW5jX2FwcGVuZF9xdW90ZWQgKClcCit7XAorXCAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IlwKK1wgICAgZXZhbCAiJHsxfSs9XFxcXCBcXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmRfcXVvdGVkIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgd2hlcmUgcG9zc2libGUgYnkgZGlyZWN0IHVzZSBvZiAnKz0nCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFthLXpBLVpfXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW2EtekEtWl9dXHsxLFx9XCkgIiVcMT0iJFwxJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitmaQorCitpZiB0ZXN0IHgiJF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWwiID0geCI6IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFVuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogVW5hYmxlIHRvIHN1YnN0aXR1dGUgZXh0ZW5kZWQgc2hlbGwgZnVuY3Rpb25zIGluICRvZmlsZSIgPiYyO30KK2ZpCisKKworICAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCisgIGNobW9kICt4ICIkb2ZpbGUiCisKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRvZmlsZSIKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBDWFgKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xEX0NYWAorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWdfQ1hYCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfQ1hYCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9DWFgKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0NfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0NYWAorCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9DWFgKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljLgorYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYCisKKyMgV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHkuCitjb21waWxlcl9uZWVkc19vYmplY3Q9JGx0X2NvbXBpbGVyX25lZWRzX29iamVjdF9DWFgKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFgKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfQ1hYCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0NYWAorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgaWYgZGlmZmVyZW50IGZyb20gYnVpbGRpbmcKKyMgYSBzaGFyZWQgYXJjaGl2ZS4KK21vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19DWFgKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX0NYWAorCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZF9DWFgKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19DWFgKKworIyBGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWAorCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkKKyMgZHVyaW5nIGxpbmtpbmcuICBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9DWFgKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUVcJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyMgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9DWFgKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUVcJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyMgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkgYW5kIHRoZSByZXN1bHRpbmcgbGlicmFyeSBkZXBlbmRlbmN5IGlzCisjICJhYnNvbHV0ZSIsaS5lIGltcG9zc2libGUgdG8gY2hhbmdlIGJ5IHNldHRpbmcgXCR7c2hsaWJwYXRoX3Zhcn0gaWYgdGhlCisjIGxpYnJhcnkgaXMgcmVsb2NhdGVkLgoraGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPSRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVfQ1hYCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfQ1hYCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYCisKKyMgU2V0IHRvICJ5ZXMiIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIGxpYnJhcnkgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkCisjIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19DWFgKKworIyBTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcworIyB0byBydW50aW1lIHBhdGggbGlzdC4KK2luaGVyaXRfcnBhdGg9JGluaGVyaXRfcnBhdGhfQ1hYCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19DWFgKKworIyBTZXQgdG8gInllcyIgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFgKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19DWFgKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfQ1hYCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfQ1hYCisKKyMgQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXMuCitwcmVsaW5rX2NtZHM9JGx0X3ByZWxpbmtfY21kc19DWFgKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zLgorcG9zdGxpbmtfY21kcz0kbHRfcG9zdGxpbmtfY21kc19DWFgKKworIyBTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXMuCitmaWxlX2xpc3Rfc3BlYz0kbHRfZmlsZV9saXN0X3NwZWNfQ1hYCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9DWFgKKworIyBUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc19DWFgKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8KKyMgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfQ1hYCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19DWFgKK3ByZWRlcHM9JGx0X3ByZWRlcHNfQ1hYCitwb3N0ZGVwcz0kbHRfcG9zdGRlcHNfQ1hYCisKKyMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyMgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWAorCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBDWFgKK19MVF9FT0YKKworCisgICAgY2F0IDw8X0xUX0VPRiA+PiAiJG9maWxlIgorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IFJDCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRF9SQworCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWdfUkMKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kc19SQworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX1JDCisKKyMgQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9SQworCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19SQworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX1JDCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX1JDCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX1JDCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX1JDCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX1JDCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYy4KK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19SQworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19SQworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19SQworCisjIFdoZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5LgorY29tcGlsZXJfbmVlZHNfb2JqZWN0PSRsdF9jb21waWxlcl9uZWVkc19vYmplY3RfUkMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX1JDCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX1JDCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworIyBhIHNoYXJlZCBhcmNoaXZlLgorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX1JDCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19SQworCisjIFdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdC4KK3dpdGhfZ251X2xkPSRsdF93aXRoX2dudV9sZF9SQworCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX1JDCisKKyMgRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX1JDCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDCisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeQorIyBkdXJpbmcgbGlua2luZy4gIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX1JDCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfUkMKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUVcJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyMgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9SQworCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyMgImFic29sdXRlIixpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyBcJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyMgbGlicmFyeSBpcyByZWxvY2F0ZWQuCitoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9JGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV9SQworCisjIFNldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisjIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX1JDCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfUkMKKworIyBTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyMgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX1JDCisKKyMgU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyMgdG8gcnVudGltZSBwYXRoIGxpc3QuCitpbmhlcml0X3JwYXRoPSRpbmhlcml0X3JwYXRoX1JDCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19SQworCisjIFNldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX1JDCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfUkMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfUkMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19SQworCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzLgorcHJlbGlua19jbWRzPSRsdF9wcmVsaW5rX2NtZHNfUkMKKworIyBDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zLgorcG9zdGxpbmtfY21kcz0kbHRfcG9zdGxpbmtfY21kc19SQworCisjIFNwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcy4KK2ZpbGVfbGlzdF9zcGVjPSRsdF9maWxlX2xpc3Rfc3BlY19SQworCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fUkMKKworIyBUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX2RpcnM9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc19SQworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworIyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19SQworcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfUkMKK3ByZWRlcHM9JGx0X3ByZWRlcHNfUkMKK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19SQworCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9SQworCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBSQworX0xUX0VPRgorCisgOzsKKworICBlc2FjCitkb25lICMgZm9yIGFjX3RhZworCisKK2FzX2ZuX2V4aXQgMAorX0FDRU9GCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCit0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAorICBhc19mbl9lcnJvciAkPyAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCisjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKyMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCisjIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisjIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCisjIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgYWNfY3Nfc3VjY2Vzcz06CisgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAxCitmaQoraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9CitmaQorCisKK2VjaG8gIgorICAgICAgICAgICAgICAgICAgICBELUJ1cyAkVkVSU0lPTgorICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT0KKworCXByZWZpeDogICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9QUkVGSVh9CisJZXhlY19wcmVmaXg6ICAgICAgICAgICAgICAke2V4ZWNfcHJlZml4fQorICAgICAgICBsaWJkaXI6ICAgICAgICAgICAgICAgICAgICR7RVhQQU5ERURfTElCRElSfQorICAgICAgICBsaWJleGVjZGlyOiAgICAgICAgICAgICAgICR7RVhQQU5ERURfTElCRVhFQ0RJUn0KKyAgICAgICAgYmluZGlyOiAgICAgICAgICAgICAgICAgICAke0VYUEFOREVEX0JJTkRJUn0KKyAgICAgICAgc3lzY29uZmRpcjogICAgICAgICAgICAgICAke0VYUEFOREVEX1NZU0NPTkZESVJ9CisgICAgICAgIGxvY2Fsc3RhdGVkaXI6ICAgICAgICAgICAgJHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfQorCWRhdGFkaXI6ICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9EQVRBRElSfQorCXNvdXJjZSBjb2RlIGxvY2F0aW9uOgkgICR7c3JjZGlyfQorCWNvbXBpbGVyOgkJICAke0NDfQorCWNmbGFnczoJCSAgICAgICAgICAke0NGTEFHU30KKwljcHBmbGFnczoJCSAgJHtDUFBGTEFHU30KKwljeHhmbGFnczoJCSAgJHtDWFhGTEFHU30KKwk2NC1iaXQgaW50OgkJICAke0RCVVNfSU5UNjRfVFlQRX0KKwkzMi1iaXQgaW50OgkJICAke0RCVVNfSU5UMzJfVFlQRX0KKwkxNi1iaXQgaW50OgkJICAke0RCVVNfSU5UMTZfVFlQRX0KKyAgICAgICAgRG94eWdlbjogICAgICAgICAgICAgICAgICAke0RPWFlHRU46LW5vdCBmb3VuZH0KKyAgICAgICAgeG1sdG86ICAgICAgICAgICAgICAgICAgICAke1hNTFRPOi1ub3QgZm91bmR9CisgICAgICAgIG1hbjJodG1sOiAgICAgICAgICAgICAgICAgJHtNQU4ySFRNTDotbm90IGZvdW5kfSIKKworZWNobyAiCisgICAgICAgIE1haW50YWluZXIgbW9kZTogICAgICAgICAgJHtVU0VfTUFJTlRBSU5FUl9NT0RFfQorICAgICAgICBnY2MgY292ZXJhZ2UgcHJvZmlsaW5nOiAgICR7ZW5hYmxlX2NvbXBpbGVyX2NvdmVyYWdlfQorICAgICAgICBCdWlsZGluZyB1bml0IHRlc3RzOiAgICAgICR7ZW5hYmxlX3Rlc3RzfQorICAgICAgICBCdWlsZGluZyB2ZXJib3NlIG1vZGU6ICAgICR7ZW5hYmxlX3ZlcmJvc2VfbW9kZX0KKyAgICAgICAgQnVpbGRpbmcgYXNzZXJ0aW9uczogICAgICAke2VuYWJsZV9hc3NlcnRzfQorICAgICAgICBCdWlsZGluZyBjaGVja3M6ICAgICAgICAgICR7ZW5hYmxlX2NoZWNrc30KKyAgICAgICAgQnVpbGRpbmcgU0VMaW51eCBzdXBwb3J0OiAke2hhdmVfc2VsaW51eH0KKyAgICAgICAgQnVpbGRpbmcgaW5vdGlmeSBzdXBwb3J0OiAke2hhdmVfaW5vdGlmeX0KKyAgICAgICAgQnVpbGRpbmcgZG5vdGlmeSBzdXBwb3J0OiAke2hhdmVfZG5vdGlmeX0KKyAgICAgICAgQnVpbGRpbmcga3F1ZXVlIHN1cHBvcnQ6ICAke2hhdmVfa3F1ZXVlfQorICAgICAgICBCdWlsZGluZyBYMTEgY29kZTogICAgICAgICR7ZW5hYmxlX3gxMX0KKyAgICAgICAgQnVpbGRpbmcgRG94eWdlbiBkb2NzOiAgICAke2VuYWJsZV9kb3h5Z2VuX2RvY3N9CisgICAgICAgIEJ1aWxkaW5nIFhNTCBkb2NzOiAgICAgICAgJHtlbmFibGVfeG1sX2RvY3N9CisgICAgICAgIEJ1aWxkaW5nIGNhY2hlIHN1cHBvcnQ6ICAgJHtlbmFibGVfdXNlcmRiX2NhY2hlfQorICAgICAgICBCdWlsZGluZyBsYXVuY2hkIHN1cHBvcnQ6ICR7aGF2ZV9sYXVuY2hkfQorICAgICAgICBVc2luZyBYTUwgcGFyc2VyOiAgICAgICAgICR7d2l0aF94bWx9CisgICAgICAgIEluaXQgc2NyaXB0cyBzdHlsZTogICAgICAgJHt3aXRoX2luaXRfc2NyaXB0c30KKyAgICAgICAgQWJzdHJhY3Qgc29ja2V0IG5hbWVzOiAgICAke2FjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0c30KKyAgICAgICAgU3lzdGVtIGJ1cyBzb2NrZXQ6ICAgICAgICAke0RCVVNfU1lTVEVNX1NPQ0tFVH0KKyAgICAgICAgU3lzdGVtIGJ1cyBhZGRyZXNzOiAgICAgICAke0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1N9CisgICAgICAgIFN5c3RlbSBidXMgUElEIGZpbGU6ICAgICAgJHtEQlVTX1NZU1RFTV9QSURfRklMRX0KKyAgICAgICAgU2Vzc2lvbiBidXMgYWRkcmVzczogICAgICAke0RCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTfQorICAgICAgICBDb25zb2xlIGF1dGggZGlyOiAgICAgICAgICR7REJVU19DT05TT0xFX0FVVEhfRElSfQorICAgICAgICBDb25zb2xlIG93bmVyIGZpbGU6ICAgICAgICR7aGF2ZV9jb25zb2xlX293bmVyX2ZpbGV9CisgICAgICAgIENvbnNvbGUgb3duZXIgZmlsZSBwYXRoOiAgJHtEQlVTX0NPTlNPTEVfT1dORVJfRklMRX0KKwlTeXN0ZW0gYnVzIHVzZXI6ICAgICAgICAgICR7REJVU19VU0VSfQorCVNlc3Npb24gYnVzIHNlcnZpY2VzIGRpcjogJHtFWFBBTkRFRF9EQVRBRElSfS9kYnVzLTEvc2VydmljZXMKKyAgICAgICAgJ21ha2UgY2hlY2snIHNvY2tldCBkaXI6ICAke1RFU1RfU09DS0VUX0RJUn0KKyIKK2lmIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIiAgICAgICAgbGF1bmNoZCBhZ2VudCBkaXI6ICAgICAgICAke0xBVU5DSERfQUdFTlRfRElSfSIKK2ZpCitlY2hvCisKK2lmIHRlc3QgeCRlbmFibGVfdGVzdHMgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggdW5pdCB0ZXN0cyBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGFuZCByZW5kZXJzIGl0IGluc2VjdXJlLiIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX3Rlc3RzID0geHllcyAtYSB4JGVuYWJsZV9hc3NlcnRzID0geG5vOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggdW5pdCB0ZXN0cyBidXQgd2l0aG91dCBhc3NlcnRpb25zIG1lYW5zIHRlc3RzIG1heSBub3QgcHJvcGVybHkgcmVwb3J0IGZhaWx1cmVzICh0aGlzIGNvbmZpZ3VyYXRpb24gaXMgb25seSB1c2VmdWwgd2hlbiBkb2luZyBzb21ldGhpbmcgbGlrZSBwcm9maWxpbmcgdGhlIHRlc3RzKSIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX2NvbXBpbGVyX2NvdmVyYWdlID0geHllczsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpcyBkZWZpbml0ZWx5IGZvciBkZXZlbG9wZXJzIG9ubHkuIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfdmVyYm9zZV9tb2RlID0geHllczsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRoIHZlcmJvc2UgbW9kZSBpbmNyZWFzZXMgbGlicmFyeSBzaXplLCBtYXkgc2xpZ2h0bHkgaW5jcmVhc2Ugc2VjdXJpdHkgcmlzaywgYW5kIGRlY3JlYXNlcyBwZXJmb3JtYW5jZS4iCitmaQoraWYgdGVzdCB4JGVuYWJsZV9hc3NlcnRzID0geHllczsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRoIGFzc2VydGlvbnMgaW5jcmVhc2VzIGxpYnJhcnkgc2l6ZSBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX2NoZWNrcyA9IHhubzsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRob3V0IGNoZWNrcyBmb3IgYXJndW1lbnRzIHBhc3NlZCB0byBwdWJsaWMgQVBJIG1ha2VzIGl0IGhhcmRlciB0byBkZWJ1ZyBhcHBzIHVzaW5nIEQtQnVzLCBidXQgd2lsbCBzbGlnaHRseSBkZWNyZWFzZSBELUJ1cyBsaWJyYXJ5IHNpemUgYW5kIF92ZXJ5XyBzbGlnaHRseSBpbXByb3ZlIHBlcmZvcm1hbmNlLiIKK2ZpCitpZiB0ZXN0IHgkZGJ1c191c2VfbGlieG1sID0geHRydWU7IHRoZW4KKyAgICAgICAgZWNobworCWVjaG8gIldBUk5JTkc6IFlvdSBoYXZlIGNob3NlbiB0byB1c2UgbGlieG1sIGFzIHlvdXIgeG1sIHBhcnNlciBob3dldmVyIHRoaXMgY29kZSBwYXRoIGlzIG5vdCBtYWludGFpbmVkIGJ5IHRoZSBELUJ1cyBkZXZlbG9wZXJzIGFuZCBpZiBpdCBicmVha3MgeW91IGdldCB0byBrZWVwIHRoZSBwaWVjZXMuICBJZiB5b3UgaGF2ZSBzZWxlY3RlZCB0aGlzIG9wdGlvbiBpbiBlcnIgcGxlYXNlIHJlY29uZmlndXJlIHdpdGggZXhwYXQgKGUuZy4gLS13aXRoLXhtbD1leHBhdCkuIgorZmkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2NvbmZpZ3VyZS5hYyBiL2RidXMtMS40LjEwL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmYzMmM0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsMTYyOCBAQAorZG5sIC0qLSBtb2RlOiBtNCAtKi0KK0FDX1BSRVJFUShbMi42M10pCisKK200X2RlZmluZShbZGJ1c19tYWpvcl92ZXJzaW9uXSwgWzFdKQorbTRfZGVmaW5lKFtkYnVzX21pbm9yX3ZlcnNpb25dLCBbNF0pCittNF9kZWZpbmUoW2RidXNfbWljcm9fdmVyc2lvbl0sIFsxMF0pCittNF9kZWZpbmUoW2RidXNfdmVyc2lvbl0sCisgICAgICAgICAgW2RidXNfbWFqb3JfdmVyc2lvbi5kYnVzX21pbm9yX3ZlcnNpb24uZGJ1c19taWNyb192ZXJzaW9uXSkKK0FDX0lOSVQoW2RidXNdLFtkYnVzX3ZlcnNpb25dLFtodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1kYnVzXSxbZGJ1c10pCisKK0FDX0NBTk9OSUNBTF9IT1NUCisKK0FDX0NPTkZJR19IRUFERVJTKFtjb25maWcuaF0pCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCisKK0FNX0lOSVRfQVVUT01BS0UoWzEuMTAgdGFyLXVzdGFyIC1Xbm8tcG9ydGFiaWxpdHldKQorCitHRVRURVhUX1BBQ0tBR0U9ZGJ1cy0xCitBQ19TVUJTVChHRVRURVhUX1BBQ0tBR0UpCitBQ19ERUZJTkVfVU5RVU9URUQoR0VUVEVYVF9QQUNLQUdFLCIkR0VUVEVYVF9QQUNLQUdFIixbVGhlIG5hbWUgb2YgdGhlIGdldHRleHQgZG9tYWluXSkKKworICMjIG11c3QgY29tZSBiZWZvcmUgd2UgdXNlIHRoZSAkVVNFX01BSU5UQUlORVJfTU9ERSB2YXJpYWJsZSBsYXRlcgorQU1fTUFJTlRBSU5FUl9NT0RFCisKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLFtBTV9TSUxFTlRfUlVMRVMoW3llc10pXSkKKworQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfREFFTU9OX05BTUUsImRidXMtZGFlbW9uIixbTmFtZSBvZiBleGVjdXRhYmxlXSkKKworIyBsaWJ0b29sIHZlcnNpb25pbmcgLSB0aGlzIGFwcGxpZXMgdG8gbGliZGJ1cworIworIyBTZWUgaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9hdXRvYm9vay9hdXRvYm9vay9hdXRvYm9va185MS5odG1sI1NFQzkxIGZvciBkZXRhaWxzCisjCisKKyMjIGluY3JlbWVudCBpZiB0aGUgaW50ZXJmYWNlIGhhcyBhZGRpdGlvbnMsIGNoYW5nZXMsIHJlbW92YWxzLgorTFRfQ1VSUkVOVD04CisKKyMjIGluY3JlbWVudCBhbnkgdGltZSB0aGUgc291cmNlIGNoYW5nZXM7IHNldCB0bworIyMgIDAgaWYgeW91IGluY3JlbWVudCBDVVJSRU5UCitMVF9SRVZJU0lPTj02CisKKyMjIGluY3JlbWVudCBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQ7IHNldCB0byAwCisjIyBpZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gY2hhbmdlZCBvciByZW1vdmVkLiByZW1vdmFsIGhhcworIyMgcHJlY2VkZW5jZSBvdmVyIGFkZGluZywgc28gc2V0IHRvIDAgaWYgYm90aCBoYXBwZW5lZC4KK0xUX0FHRT01CisKK0FDX1NVQlNUKExUX0NVUlJFTlQpCitBQ19TVUJTVChMVF9SRVZJU0lPTikKK0FDX1NVQlNUKExUX0FHRSkKKworREJVU19NQUpPUl9WRVJTSU9OPWRidXNfbWFqb3JfdmVyc2lvbgorREJVU19NSU5PUl9WRVJTSU9OPWRidXNfbWlub3JfdmVyc2lvbgorREJVU19NSUNST19WRVJTSU9OPWRidXNfbWljcm9fdmVyc2lvbgorREJVU19WRVJTSU9OPWRidXNfbWFqb3JfdmVyc2lvbi5kYnVzX21pbm9yX3ZlcnNpb24uZGJ1c19taWNyb192ZXJzaW9uCisKK0FDX1NVQlNUKERCVVNfTUFKT1JfVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfTUlOT1JfVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfTUlDUk9fVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfVkVSU0lPTikKKworQUNfUFJPR19DQworQU1fUFJPR19DQ19DX08KK0FDX1BST0dfQ1hYCitBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlMKK0FDX0lTQ19QT1NJWAorQUNfSEVBREVSX1NUREMKK0FDX0NfSU5MSU5FCitBTV9QUk9HX0xJQlRPT0wKK0FDX1BST0dfTUtESVJfUAorQ09NUElMRVJfQ09WRVJBR0UKK0NPTVBJTEVSX09QVElNSVNBVElPTlMKKworIyBJbml0aWFsaXplIGxpYnRvb2wKK0xUX0lOSVQoW3dpbjMyLWRsbF0pCitMVF9MQU5HKFtXaW5kb3dzIFJlc291cmNlXSkKKworIyBTZXQgc29tZSBpbnRlcm5hbCB2YXJpYWJsZXMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSBmb3IgbGF0ZXIgdXNlLgorZGJ1c193aW49bm8KK2RidXNfY3lnd2luPW5vCitkYnVzX3VuaXg9bm8KK2Nhc2UgIiR7aG9zdH0iIGluCisgICAgKi1taW5ndzMyY2UqKQorICAgICAgICBkYnVzX3dpbj15ZXMKKyAgICAgICAgZGJ1c193aW5jZT15ZXMKKyAgICAgICAgOzsKKyAgICAqLW1pbmd3MzIqKQorICAgICAgICBkYnVzX3dpbj15ZXMKKyAgICAgICAgOzsKKyAgICAqLWN5Z3dpbiopCisgICAgICAgIGRidXNfY3lnd2luPXllcworICAgICAgICBkYnVzX3VuaXg9eWVzCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgZGJ1c191bml4PXllcworICAgICAgIDs7Citlc2FjCisKKyMgU3BlY2lhbCBkZWZpbmVzIGZvciBjZXJ0YWluIHBsYXRmb3JtcworaWYgdGVzdCAiJGRidXNfd2luIiA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX1dJTiwxLFtEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFczMiBBUEkgYmFzZWQgc3lzdGVtXSkKKyAgICBCVUlMRF9USU1FU1RBTVA9YGRhdGUgLS1pc28tODYwMT1taW51dGVzYAorICAgIEFDX1NVQlNUKEJVSUxEX1RJTUVTVEFNUCkKKyAgICAjIEFzc3VtZSBEQlVTX1ZFUlNJT04gaXMgYWx3YXlzIHRocmVlIG51bWJlcnMKKyAgICBCVUlMRF9GSUxFVkVSU0lPTj1gZWNobyAiJERCVVNfVkVSU0lPTiIgfCBzZWQgLWUgJ3MvXC4vLC9nJ2AsMAorICAgIEFDX1NVQlNUKEJVSUxEX0ZJTEVWRVJTSU9OKQorICAgIEFDX0NIRUNLX1RPT0woV0lORFJFUywgd2luZHJlcywgbm8pCisgICAgaWYgdGVzdCAiJFdJTkRSRVMiID0gbm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbKioqIENvdWxkIG5vdCBmaW5kIGFuIGltcGxlbWVudGF0aW9uIG9mIHdpbmRyZXMgaW4geW91ciBQQVRILl0pCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkZGJ1c193aW5jZSIgPSB5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShEQlVTX1dJTkNFLDEsW0RlZmluZWQgaWYgd2UgcnVuIG9uIGEgVzMyIENFIEFQSSBiYXNlZCBzeXN0ZW1dKQorICAgICAgQUNfREVGSU5FKF9XSU4zMl9XQ0UsIDB4MDUwMiwgW0RlZmluZWQgdG8gZ2V0IG5ld2VyIFczMiBDRSBBUElzXSkKKyAgICBmaQorZWxzZQorICAgIEFDX0RFRklORShEQlVTX1VOSVgsMSxbRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBVbml4LWJhc2VkIHN5c3RlbV0pCitmaQoraWYgdGVzdCAiJGRidXNfY3lnd2luIiA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX0NZR1dJTiwxLFtEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIGN5Z3dpbiBBUEkgYmFzZWQgc3lzdGVtXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfV0lOLCB0ZXN0ICIkZGJ1c193aW4iID0geWVzKQorQU1fQ09ORElUSU9OQUwoREJVU19XSU5DRSwgdGVzdCAiJGRidXNfd2luY2UiID0geWVzKQorQU1fQ09ORElUSU9OQUwoREJVU19VTklYLCB0ZXN0ICIkZGJ1c191bml4IiA9IHllcykKK0FNX0NPTkRJVElPTkFMKERCVVNfQ1lHV0lOLCB0ZXN0ICIkZGJ1c19jeWd3aW4iID0geWVzKQorCitBQ19BUkdfRU5BQkxFKHRlc3RzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdGVzdHNdLFtlbmFibGUgdW5pdCB0ZXN0IGNvZGUgaW4gdGhlIGxpYnJhcnkgYW5kIGJpbmFyaWVzXSksZW5hYmxlX3Rlc3RzPSRlbmFibGV2YWwsZW5hYmxlX3Rlc3RzPSRVU0VfTUFJTlRBSU5FUl9NT0RFKQorQUNfQVJHX0VOQUJMRShhbnNpLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtYW5zaV0sW2VuYWJsZSAtYW5zaSAtcGVkYW50aWMgZ2NjIGZsYWdzXSksZW5hYmxlX2Fuc2k9JGVuYWJsZXZhbCxlbmFibGVfYW5zaT1ubykKK0FDX0FSR19FTkFCTEUodmVyYm9zZS1tb2RlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdmVyYm9zZS1tb2RlXSxbc3VwcG9ydCB2ZXJib3NlIGRlYnVnIG1vZGVdKSxlbmFibGVfdmVyYm9zZV9tb2RlPSRlbmFibGV2YWwsZW5hYmxlX3ZlcmJvc2VfbW9kZT0kVVNFX01BSU5UQUlORVJfTU9ERSkKK0FDX0FSR19FTkFCTEUoYXNzZXJ0cywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFzc2VydHNdLFtpbmNsdWRlIGFzc2VydGlvbiBjaGVja3NdKSxlbmFibGVfYXNzZXJ0cz0kZW5hYmxldmFsLGVuYWJsZV9hc3NlcnRzPSRVU0VfTUFJTlRBSU5FUl9NT0RFKQorQUNfQVJHX0VOQUJMRShjaGVja3MsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jaGVja3NdLFtpbmNsdWRlIHNhbml0eSBjaGVja3Mgb24gcHVibGljIEFQSV0pLGVuYWJsZV9jaGVja3M9JGVuYWJsZXZhbCxlbmFibGVfY2hlY2tzPXllcykKK0FDX0FSR19FTkFCTEUoeG1sLWRvY3MsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS14bWwtZG9jc10sW2J1aWxkIFhNTCBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyB4bWx0byldKSxlbmFibGVfeG1sX2RvY3M9JGVuYWJsZXZhbCxlbmFibGVfeG1sX2RvY3M9YXV0bykKK0FDX0FSR19FTkFCTEUoZG94eWdlbi1kb2NzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZG94eWdlbi1kb2NzXSxbYnVpbGQgRE9YWUdFTiBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyBEb3h5Z2VuKV0pLGVuYWJsZV9kb3h5Z2VuX2RvY3M9JGVuYWJsZXZhbCxlbmFibGVfZG94eWdlbl9kb2NzPWF1dG8pCitBQ19BUkdfRU5BQkxFKGFic3RyYWN0LXNvY2tldHMsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hYnN0cmFjdC1zb2NrZXRzXSxbdXNlIGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UgKGxpbnV4IG9ubHkpXSksZW5hYmxlX2Fic3RyYWN0X3NvY2tldHM9JGVuYWJsZXZhbCxlbmFibGVfYWJzdHJhY3Rfc29ja2V0cz1hdXRvKQorQUNfQVJHX0VOQUJMRShzZWxpbnV4LCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc2VsaW51eF0sW2J1aWxkIHdpdGggU0VMaW51eCBzdXBwb3J0XSksZW5hYmxlX3NlbGludXg9JGVuYWJsZXZhbCxlbmFibGVfc2VsaW51eD1hdXRvKQorQUNfQVJHX0VOQUJMRShsaWJhdWRpdCxBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGliYXVkaXRdLFtidWlsZCBhdWRpdCBkYWVtb24gc3VwcG9ydCBmb3IgU0VMaW51eF0pLGVuYWJsZV9saWJhdWRpdD0kZW5hYmxldmFsLGVuYWJsZV9saWJhdWRpdD1hdXRvKQorQUNfQVJHX0VOQUJMRShkbm90aWZ5LCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZG5vdGlmeV0sW2J1aWxkIHdpdGggZG5vdGlmeSBzdXBwb3J0IChsaW51eCBvbmx5KV0pLGVuYWJsZV9kbm90aWZ5PSRlbmFibGV2YWwsZW5hYmxlX2Rub3RpZnk9YXV0bykKK0FDX0FSR19FTkFCTEUoaW5vdGlmeSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWlub3RpZnldLFtidWlsZCB3aXRoIGlub3RpZnkgc3VwcG9ydCAobGludXggb25seSldKSxlbmFibGVfaW5vdGlmeT0kZW5hYmxldmFsLGVuYWJsZV9pbm90aWZ5PWF1dG8pCitBQ19BUkdfRU5BQkxFKGtxdWV1ZSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWtxdWV1ZV0sW2J1aWxkIHdpdGgga3F1ZXVlIHN1cHBvcnRdKSxlbmFibGVfa3F1ZXVlPSRlbmFibGV2YWwsZW5hYmxlX2txdWV1ZT1hdXRvKQorQUNfQVJHX0VOQUJMRShjb25zb2xlLW93bmVyLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jb25zb2xlLW93bmVyLWZpbGVdLFtlbmFibGUgY29uc29sZSBvd25lciBmaWxlXSksZW5hYmxlX2NvbnNvbGVfb3duZXJfZmlsZT0kZW5hYmxldmFsLGVuYWJsZV9jb25zb2xlX293bmVyX2ZpbGU9YXV0bykKK0FDX0FSR19FTkFCTEUodXNlcmRiLWNhY2hlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdXNlcmRiLWNhY2hlXSxbYnVpbGQgd2l0aCB1c2VyZGItY2FjaGUgc3VwcG9ydF0pLGVuYWJsZV91c2VyZGJfY2FjaGU9JGVuYWJsZXZhbCxlbmFibGVfdXNlcmRiX2NhY2hlPXllcykKK0FDX0FSR19FTkFCTEUobGF1bmNoZCwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxhdW5jaGRdLFtidWlsZCB3aXRoIGxhdW5jaGQgYXV0by1sYXVuY2ggc3VwcG9ydF0pLGVuYWJsZV9sYXVuY2hkPSRlbmFibGV2YWwsZW5hYmxlX2xhdW5jaGQ9YXV0bykKKworQUNfQVJHX1dJVEgoeG1sLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXhtbD1bbGlieG1sL2V4cGF0XV0sW1hNTCBsaWJyYXJ5IHRvIHVzZSAobGlieG1sIG1heSBiZSBuYW1lZCBsaWJ4bWwyIG9uIHNvbWUgc3lzdGVtcyldKSkKK0FDX0FSR19XSVRIKGluaXQtc2NyaXB0cywgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1pbml0LXNjcmlwdHM9W3JlZGhhdF1dLFtTdHlsZSBvZiBpbml0IHNjcmlwdHMgdG8gaW5zdGFsbF0pKQorQUNfQVJHX1dJVEgoc2Vzc2lvbi1zb2NrZXQtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXNlc3Npb24tc29ja2V0LWRpcj1bZGlybmFtZV1dLFtXaGVyZSB0byBwdXQgc29ja2V0cyBmb3IgdGhlIHBlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzXSkpCitBQ19BUkdfV0lUSCh0ZXN0LXNvY2tldC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtdGVzdC1zb2NrZXQtZGlyPVtkaXJuYW1lXV0sW1doZXJlIHRvIHB1dCBzb2NrZXRzIGZvciBtYWtlIGNoZWNrXSkpCitBQ19BUkdfV0lUSChzeXN0ZW0tcGlkLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtc3lzdGVtLXBpZC1maWxlPVtwaWRmaWxlXV0sW1BJRCBmaWxlIGZvciBzeXN0ZW13aWRlIGRhZW1vbl0pKQorQUNfQVJHX1dJVEgoc3lzdGVtLXNvY2tldCwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW0tc29ja2V0PVtmaWxlbmFtZV1dLFtVTklYIGRvbWFpbiBzb2NrZXQgZm9yIHN5c3RlbXdpZGUgZGFlbW9uXSkpCitBQ19BUkdfV0lUSChjb25zb2xlLWF1dGgtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWNvbnNvbGUtYXV0aC1kaXI9W2Rpcm5hbWVdXSxbZGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkpCitBQ19BUkdfV0lUSChjb25zb2xlLW93bmVyLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtY29uc29sZS1vd25lci1maWxlPVtmaWxlbmFtZV1dLFtmaWxlIHdob3NlIG93bmVyIGRldGVybWluZXMgY3VycmVudCBjb25zb2xlIG93bmVyXSkpCitBQ19BUkdfV0lUSChsYXVuY2hkLWFnZW50LWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1sYXVuY2hkLWFnZW50LWRpcj1bZGlybmFtZV1dLFtkaXJlY3RvcnkgdG8gcHV0IHRoZSBsYXVuY2hkIGFnZW50IChkZWZhdWx0OiAvTGlicmFyeS9MYXVuY2hBZ2VudHMpXSkpCitBQ19BUkdfV0lUSChkYnVzX3VzZXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy11c2VyPTx1c2VyPl0sW1VzZXIgZm9yIHJ1bm5pbmcgdGhlIERCVVMgZGFlbW9uIChtZXNzYWdlYnVzKV0pKQorQUNfQVJHX1dJVEgoZGJ1c19kYWVtb25kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy1kYWVtb25kaXI9W2Rpcm5hbWVdXSxbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBEQlVTIGRhZW1vbl0pKQorCitkbmwgREJVU19CVUlMRF9URVNUUyBjb250cm9scyB1bml0IHRlc3RzIGJ1aWx0IGluIHRvIC5jIGZpbGVzCitkbmwgYW5kIGFsc28gc29tZSBzdHVmZiBpbiB0aGUgdGVzdC8gc3ViZGlyCitBTV9DT05ESVRJT05BTChEQlVTX0JVSUxEX1RFU1RTLCB0ZXN0IHgkZW5hYmxlX3Rlc3RzID0geHllcykKK2lmIHRlc3QgeCRlbmFibGVfdGVzdHMgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfQlVJTERfVEVTVFMsMSxbQnVpbGQgdGVzdCBjb2RlXSkKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfdmVyYm9zZV9tb2RlID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUsMSxbU3VwcG9ydCBhIHZlcmJvc2UgbW9kZV0pCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX2Fzc2VydHMgPSB4bm87IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19ESVNBQkxFX0FTU0VSVCwxLFtEaXNhYmxlIGFzc2VydGlvbiBjaGVja2luZ10pCisgICAgQUNfREVGSU5FKEdfRElTQUJMRV9BU1NFUlQsMSxbRGlzYWJsZSBHTGliIGFzc2VydGlvbiBtYWNyb3NdKQorICAgIFJfRFlOQU1JQ19MREZMQUc9IiIKK2Vsc2UKKyAgICAjIC1yZHluYW1pYyBpcyBuZWVkZWQgZm9yIGdsaWJjJ3MgYmFja3RyYWNlX3N5bWJvbHMgdG8gd29yay4KKyAgICAjIE5vIGNsdWUgaG93IG11Y2ggb3ZlcmhlYWQgdGhpcyBhZGRzLCBidXQgaXQncyB1c2VmdWwKKyAgICAjIHRvIGRvIHRoaXMgb24gYW55IGFzc2VydGlvbiBmYWlsdXJlLAorICAgICMgc28gZm9yIG5vdyBpdCdzIGVuYWJsZWQgYW55dGltZSBhc3NlcnRzIGFyZSAoY3VycmVudGx5IG5vdAorICAgICMgaW4gcHJvZHVjdGlvbiBidWlsZHMpLgorCisgICAgIyBUbyBnZXQgLXJkeW5hbWljIHlvdSBwYXNzIC1leHBvcnQtZHluYW1pYyB0byBsaWJ0b29sLgorICAgIEFDX0RFRklORShEQlVTX0JVSUxUX1JfRFlOQU1JQywxLFt3aGV0aGVyIC1leHBvcnQtZHluYW1pYyB3YXMgcGFzc2VkIHRvIGxpYnRvb2xdKQorICAgIFJfRFlOQU1JQ19MREZMQUc9LWV4cG9ydC1keW5hbWljCitmaQorQUNfU1VCU1QoUl9EWU5BTUlDX0xERkxBRykKKworaWYgdGVzdCB4JGVuYWJsZV9jaGVja3MgPSB4bm87IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19ESVNBQkxFX0NIRUNLUywxLFtEaXNhYmxlIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nXSkKKyAgICBBQ19ERUZJTkUoR19ESVNBQkxFX0NIRUNLUywxLFtEaXNhYmxlIEdMaWIgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmddKQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV91c2VyZGJfY2FjaGUgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfRU5BQkxFX1VTRVJEQl9DQUNIRSwxLFtCdWlsZCB3aXRoIGNhY2hpbmcgb2YgdXNlciBkYXRhXSkKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfY29tcGlsZXJfY292ZXJhZ2UgPSB4eWVzOyB0aGVuCisgICAgICMjIHNvIHRoYXQgY29uZmlnLmggY2hhbmdlcyB3aGVuIHlvdSB0b2dnbGUgZ2NvdiBzdXBwb3J0CisgICAgIEFDX0RFRklORV9VTlFVT1RFRChEQlVTX0dDT1ZfRU5BQkxFRCwgMSwgW0RlZmluZWQgaWYgZ2NvdiBpcyBlbmFibGVkIHRvIGZvcmNlIGEgcmVidWlsZCBkdWUgdG8gY29uZmlnLmggY2hhbmdpbmddKQorZmkKKworIyBnbGliYzIxLm00IHNlcmlhbCAzCitkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2RubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUZXN0IGZvciB0aGUgR05VIEMgTGlicmFyeSwgdmVyc2lvbiAyLjEgb3IgbmV3ZXIuCisjIEZyb20gQnJ1bm8gSGFpYmxlLgorCitBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSAyLjEgb3IgbmV3ZXIsCisgIGFjX2N2X2dudV9saWJyYXJ5XzJfMSwKKyAgW0FDX0VHUkVQX0NQUChbTHVja3kgR05VIHVzZXJdLAorICAgIFsKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmZGVmIF9fR05VX0xJQlJBUllfXworICNpZiAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpIHx8IChfX0dMSUJDX18gPiAyKQorICBMdWNreSBHTlUgdXNlcgorICNlbmRpZgorI2VuZGlmCisgICAgXSwKKyAgICBhY19jdl9nbnVfbGlicmFyeV8yXzE9eWVzLAorICAgIGFjX2N2X2dudV9saWJyYXJ5XzJfMT1ubykKKyAgXQorKQorCisjIyMjIEludGVnZXIgc2l6ZXMKKworQUNfQ0hFQ0tfU0laRU9GKGNoYXIpCitBQ19DSEVDS19TSVpFT0Yoc2hvcnQpCitBQ19DSEVDS19TSVpFT0YobG9uZykKK0FDX0NIRUNLX1NJWkVPRihpbnQpCitBQ19DSEVDS19TSVpFT0Yodm9pZCAqKQorQUNfQ0hFQ0tfU0laRU9GKGxvbmcgbG9uZykKK0FDX0NIRUNLX1NJWkVPRihfX2ludDY0KQorCisjIyMgU2VlIHdoYXQgb3VyIDY0IGJpdCB0eXBlIGlzIGNhbGxlZAorQUNfTVNHX0NIRUNLSU5HKFs2NC1iaXQgaW50ZWdlciB0eXBlXSkKKworY2FzZSA4IGluCiskYWNfY3Zfc2l6ZW9mX2ludCkKKyAgZGJ1c2ludDY0PWludAorICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsKScKKyAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nIiInCisgIDs7CiskYWNfY3Zfc2l6ZW9mX2xvbmcpCisgIGRidXNpbnQ2ND1sb25nCisgIGRidXNpbnQ2NF9jb25zdGFudD0nKHZhbCMjTCknCisgIGRidXN1aW50NjRfY29uc3RhbnQ9Jyh2YWwjI1VMKScKKyAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nImwiJworICA7OworJGFjX2N2X3NpemVvZl9sb25nX2xvbmcpCisgIGRidXNpbnQ2ND0nbG9uZyBsb25nJworICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwjI0xMKScKKyAgZGJ1c3VpbnQ2NF9jb25zdGFudD0nKHZhbCMjVUxMKScKKyAgIyBJZGVhbGx5IHdlIGRpc2NvdmVyIHdoYXQgdGhlIGZvcm1hdCBpcywgYnV0IHRoaXMgaXMKKyAgIyBvbmx5IHVzZWQgaW4gdmVyYm9zZSBtb2RlLCBzbyBlaC4uLgorICBpZiB0ZXN0IHgiJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIgPSB4eWVzOyB0aGVuCisgICAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nImxsIicKKyAgZmkKKyAgOzsKKyRhY19jdl9zaXplb2ZfX19pbnQ2NCkKKyAgZGJ1c2ludDY0PV9faW50NjQKKyAgZGJ1c2ludDY0X2NvbnN0YW50PScodmFsIyNpNjQpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsIyN1aTY0KScKKyAgIyBTZWUgYWJvdmUgY2FzZQorICBpZiB0ZXN0IHgiJGFjX2N2X2dudV9saWJyYXJ5XzJfMSIgPSB4eWVzOyB0aGVuCisgICAgZGJ1c2ludDY0X3ByaW50Zl9tb2RpZmllcj0nImxsIicKKyAgZmkKKyAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRidXNpbnQ2NCIgOyB0aGVuCisgICAgICAgIERCVVNfSU5UNjRfVFlQRT0ibm9faW50NjRfdHlwZV9kZXRlY3RlZCIKKyAgICAgICAgREJVU19IQVZFX0lOVDY0PTAKKyAgICAgICAgREJVU19JTlQ2NF9DT05TVEFOVD0KKyAgICAgICAgREJVU19VSU5UNjRfQ09OU1RBTlQ9CisgICAgICAgIEFDX01TR19SRVNVTFQoW25vbmUgZm91bmRdKQorZWxzZQorICAgICAgICBEQlVTX0lOVDY0X1RZUEU9IiRkYnVzaW50NjQiCisgICAgICAgIERCVVNfSEFWRV9JTlQ2ND0xCisgICAgICAgIERCVVNfSU5UNjRfQ09OU1RBTlQ9IiRkYnVzaW50NjRfY29uc3RhbnQiCisgICAgICAgIERCVVNfVUlOVDY0X0NPTlNUQU5UPSIkZGJ1c3VpbnQ2NF9jb25zdGFudCIKKwlpZiB0ZXN0IHgiJGRidXNpbnQ2NF9wcmludGZfbW9kaWZpZXIiICE9IHg7IHRoZW4KKwkJQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSLCBbJGRidXNpbnQ2NF9wcmludGZfbW9kaWZpZXJdLCBbRGVmaW5lIHRvIHByaW50ZiBtb2RpZmllciBmb3IgNjQgYml0IGludGVnZXIgdHlwZV0pCisJZmkKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkREJVU19JTlQ2NF9UWVBFKQorZmkKKworQUNfU1VCU1QoREJVU19JTlQ2NF9UWVBFKQorQUNfU1VCU1QoREJVU19JTlQ2NF9DT05TVEFOVCkKK0FDX1NVQlNUKERCVVNfVUlOVDY0X0NPTlNUQU5UKQorQUNfU1VCU1QoREJVU19IQVZFX0lOVDY0KQorCisjIyMgc2VlIHdoYXQgMzItYml0IGludCBpcyBjYWxsZWQKK0FDX01TR19DSEVDS0lORyhbMzItYml0IGludGVnZXIgdHlwZV0pCisKK2Nhc2UgNCBpbgorJGFjX2N2X3NpemVvZl9zaG9ydCkKKyAgZGJ1c2ludDMyPXNob3J0CisgIDs7CiskYWNfY3Zfc2l6ZW9mX2ludCkKKyAgZGJ1c2ludDMyPWludAorICA7OworJGFjX2N2X3NpemVvZl9sb25nKQorICBkYnVzaW50MzI9bG9uZworICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGJ1c2ludDMyIiA7IHRoZW4KKyAgICAgICAgREJVU19JTlQzMl9UWVBFPSJub19pbnQzMl90eXBlX2RldGVjdGVkIgorICAgICAgICBBQ19NU0dfRVJST1IoW05vIDMyLWJpdCBpbnRlZ2VyIHR5cGUgZm91bmRdKQorZWxzZQorICAgICAgICBEQlVTX0lOVDMyX1RZUEU9IiRkYnVzaW50MzIiCisgICAgICAgIEFDX01TR19SRVNVTFQoJERCVVNfSU5UMzJfVFlQRSkKK2ZpCisKK0FDX1NVQlNUKERCVVNfSU5UMzJfVFlQRSkKKworIyMjIHNlZSB3aGF0IDE2LWJpdCBpbnQgaXMgY2FsbGVkCitBQ19NU0dfQ0hFQ0tJTkcoWzE2LWJpdCBpbnRlZ2VyIHR5cGVdKQorCitjYXNlIDIgaW4KKyRhY19jdl9zaXplb2Zfc2hvcnQpCisgIGRidXNpbnQxNj1zaG9ydAorICA7OworJGFjX2N2X3NpemVvZl9pbnQpCisgIGRidXNpbnQxNj1pbnQKKyAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRidXNpbnQxNiIgOyB0aGVuCisgICAgICAgIERCVVNfSU5UMTZfVFlQRT0ibm9faW50MTZfdHlwZV9kZXRlY3RlZCIKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtObyAxNi1iaXQgaW50ZWdlciB0eXBlIGZvdW5kXSkKK2Vsc2UKKyAgICAgICAgREJVU19JTlQxNl9UWVBFPSIkZGJ1c2ludDE2IgorICAgICAgICBBQ19NU0dfUkVTVUxUKCREQlVTX0lOVDE2X1RZUEUpCitmaQorCitBQ19TVUJTVChEQlVTX0lOVDE2X1RZUEUpCisKKyMjIGJ5dGUgb3JkZXIKK2Nhc2UgJGhvc3Rfb3MgaW4KKwlkYXJ3aW4qKQorCQkjIGNoZWNrIGF0IGNvbXBpbGUtdGltZSwgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB1bml2ZXJzYWwKKwkJIyAod2l0aCBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIGF0IG9uY2Ugb24gdGhlIGNvbXBpbGUgbGluZSkKKwkJQUhfVkVSQkFUSU0oW1dPUkRTX0JJR0VORElBTl9EQVJXSU5dLCBbCisJCQkvKiBVc2UgdGhlIGNvbXBpbGVyLXByb3ZpZGVkIGVuZGlhbm5lc3MgZGVmaW5lcyB0byBhbGxvdyB1bml2ZXJzYWwgY29tcGlsaW5nLiAqLworCQkJI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisJCQkjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisJCQkjZW5kaWYKKwkJXSkKKwkJOzsKKwkqKQorCQlBQ19DX0JJR0VORElBTgorCQk7OworZXNhYworCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sICoqKiB2YV9jb3B5IGNoZWNrcyAoZnJvbSBHTGliKSAqKioKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgd2UgY3VycmVudGx5IGNoZWNrIGZvciBhbGwgdGhyZWUgdmFfY29weSBwb3NzaWJpbGl0aWVzLCBzbyB3ZSBnZXQKK2RubCBhbGwgcmVzdWx0cyBpbiBjb25maWcubG9nIGZvciBidWcgcmVwb3J0cy4KK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYW4gaW1wbGVtZW50YXRpb24gb2YgdmFfY29weSgpXSxkYnVzX2N2X3ZhX2NvcHksWworCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCXN0YXRpYyB2b2lkIGYgKGludCBpLCAuLi4pIHsKKwl2YV9saXN0IGFyZ3MxLCBhcmdzMjsKKwl2YV9zdGFydCAoYXJnczEsIGkpOworCXZhX2NvcHkgKGFyZ3MyLCBhcmdzMSk7CisJaWYgKHZhX2FyZyAoYXJnczIsIGludCkgIT0gNDIgfHwgdmFfYXJnIChhcmdzMSwgaW50KSAhPSA0MikKKwkgIGV4aXQgKDEpOworCXZhX2VuZCAoYXJnczEpOyB2YV9lbmQgKGFyZ3MyKTsKKwl9CisJaW50IG1haW4oKSB7CisJICBmICgwLCA0Mik7CisJICByZXR1cm4gMDsKKwl9XSldLAorCVtkYnVzX2N2X3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV9jb3B5PW5vXSkKK10pCitBQ19DQUNIRV9DSEVDSyhbZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIF9fdmFfY29weSgpXSxkYnVzX2N2X19fdmFfY29weSxbCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFsjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJX192YV9jb3B5IChhcmdzMiwgYXJnczEpOworCWlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICBleGl0ICgxKTsKKwl2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJfQorCWludCBtYWluKCkgeworCSAgZiAoMCwgNDIpOworCSAgcmV0dXJuIDA7CisJfV0pXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9bm9dKQorXSkKKworaWYgdGVzdCAieCRkYnVzX2N2X3ZhX2NvcHkiID0gInh5ZXMiOyB0aGVuCisgIGRidXNfdmFfY29weV9mdW5jPXZhX2NvcHkKK2Vsc2UgaWYgdGVzdCAieCRkYnVzX2N2X19fdmFfY29weSIgPSAieHllcyI7IHRoZW4KKyAgZGJ1c192YV9jb3B5X2Z1bmM9X192YV9jb3B5CitmaQorZmkKKworaWYgdGVzdCAtbiAiJGRidXNfdmFfY29weV9mdW5jIjsgdGhlbgorICBBQ19ERUZJTkVfVU5RVU9URUQoREJVU19WQV9DT1BZLCRkYnVzX3ZhX2NvcHlfZnVuYyxbQSAndmFfY29weScgc3R5bGUgZnVuY3Rpb25dKQorZmkKKworQUNfTEFOR19QVVNIKEMpCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB2YV9saXN0cyBjYW4gYmUgY29waWVkIGJ5IHZhbHVlXSwKKwlkYnVzX2N2X3ZhX3ZhbF9jb3B5LAorCVtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCitbWworCSNpbmNsdWRlIDxzdGRhcmcuaD4KKwkjaW5jbHVkZSA8c3RkbGliLmg+CitdXSwKK1tbCisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJYXJnczIgPSBhcmdzMTsKKwlpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgZXhpdCAoMSk7CisJdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCX0KKwlpbnQgbWFpbigpIHsKKwkgIGYgKDAsIDQyKTsKKwkgIHJldHVybiAwOworCX0KK11dKV0sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV92YWxfY29weT1ub10sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSkKK10pCitBQ19MQU5HX1BPUChDKQorCitpZiB0ZXN0ICJ4JGRidXNfY3ZfdmFfdmFsX2NvcHkiID0gInhubyI7IHRoZW4KKyAgQUNfREVGSU5FKERCVVNfVkFfQ09QWV9BU19BUlJBWSwxLCBbJ3ZhX2xpc3RzJyBjYW5ub3QgYmUgY29waWVzIGFzIHZhbHVlc10pCitmaQorCisKKyMjIyMgQXRvbWljIGludGVnZXJzCisKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRDQyBrbm93cyBfX3N5bmNfc3ViX2FuZF9mZXRjaCgpXSwKKyAgZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2gsCisgIFtBQ19MSU5LX0lGRUxTRShbCisgICAgIEFDX0xBTkdfUFJPR1JBTShbW11dLCBbW2ludCBhID0gNDsgaW50IGIgPSBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmYSwgNCk7IGV4aXQoYik7IF1dKV0sCisgICAgIFtkYnVzX2N2X3N5bmNfc3ViX2FuZF9mZXRjaD15ZXNdLAorICAgICBbZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2g9bm9dKQorICBdKQorCitpZiB0ZXN0ICJ4JGRidXNfY3Zfc3luY19zdWJfYW5kX2ZldGNoIiA9ICJ4eWVzIiA7IHRoZW4KKyAgIGhhdmVfc3luYz0xCitlbHNlCisgICBoYXZlX3N5bmM9MAorZmkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX1VTRV9TWU5DXSwgWyRoYXZlX3N5bmNdLCBbVXNlIHRoZSBnY2MgX19zeW5jIGV4dGVuc2lvbl0pCisKKyMjIyMgVmFyaW91cyBmdW5jdGlvbnMKK0FDX1NFQVJDSF9MSUJTKHNvY2tldCxbc29ja2V0IG5ldHdvcmtdKQorQUNfQ0hFQ0tfRlVOQyhnZXRob3N0YnluYW1lLCxbQUNfQ0hFQ0tfTElCKG5zbCxnZXRob3N0YnluYW1lKV0pCisKK0FDX0NIRUNLX0ZVTkNTKHZzbnByaW50ZiB2YXNwcmludGYgbmFub3NsZWVwIHVzbGVlcCBzZXRlbnYgY2xlYXJlbnYgdW5zZXRlbnYgc29ja2V0cGFpciBnZXRncm91cGxpc3QgZnBhdGhjb25mIHNldHJsaW1pdCBwb2xsIHNldGxvY2FsZSBsb2NhbGVjb252IHN0cnRvbGwgc3RydG91bGwpCisKKyMjIyMgQ2hlY2sgZm9yIGJyb2tlbiBwb2xsOyB0YWtlbiBmcm9tIEdsaWIncyBjb25maWd1cmUKKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgYnJva2VuIHBvbGxdKQorQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1sKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgI2luY2x1ZGUgPGZjbnRsLmg+CisgICAgI2luY2x1ZGUgPHBvbGwuaD4KKyAgICAjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisgICAgI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisgICAgI2VuZGlmCisgICAgaW50IG1haW4odm9pZCkgeworICAgICAgc3RydWN0IHBvbGxmZCBmZHNbMV07CisgICAgICBpbnQgZmQ7CisgICAgICBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIDEpOworICAgICAgZmRzWzBdLmZkID0gZmQ7CisgICAgICBmZHNbMF0uZXZlbnRzID0gUE9MTElOOworICAgICAgZmRzWzBdLnJldmVudHMgPSAwOworICAgICAgaWYgKHBvbGwoZmRzLCAxLCAwKSA8IDAgfHwgKGZkc1swXS5yZXZlbnRzICYgUE9MTE5WQUwpICE9IDApIHsKKyAgICAgICAgICAgIGV4aXQoMSk7ICAvKiBEb2VzIG5vdCB3b3JrIGZvciBkZXZpY2VzIC0tIGZhaWwgKi8KKyAgICAgIH0KKyAgICAgIGV4aXQoMCk7CisgICAgfV1dKV0sCisgIFticm9rZW5fcG9sbD1ub10sCisgIFticm9rZW5fcG9sbD15ZXMKKyAgIEFDX0RFRklORShCUk9LRU5fUE9MTCwxLFtwb2xsIGRvZXNuJ3Qgd29yayBvbiBkZXZpY2VzXSldLAorICBbYnJva2VuX3BvbGw9Im5vIChjcm9zcyBjb21waWxpbmcpIl0pCitBQ19NU0dfUkVTVUxUKCRicm9rZW5fcG9sbCkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBkaXJmZCkKK0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KK11dLCBbWworRElSICpkaXJwOworZGlycCA9IG9wZW5kaXIoIi4iKTsKK2RpcmZkKGRpcnApOworY2xvc2VkaXIoZGlycCk7CitdXSldLAorW2RidXNfaGF2ZV9kaXJmZD15ZXNdLAorW2RidXNfaGF2ZV9kaXJmZD1ub10pCitBQ19NU0dfUkVTVUxUKCRkYnVzX2hhdmVfZGlyZmQpCitpZiB0ZXN0ICIkZGJ1c19oYXZlX2RpcmZkIiA9IHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0RJUkZELDEsW0hhdmUgZGlyZmQgZnVuY3Rpb25dKQorZWxzZQorCUFDX01TR19DSEVDS0lORyhmb3IgRElSICpkaXJwLT5kZF9mZCkKKwlBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisJXV0sIFtbCitESVIgKmRpcnA7CitpbnQgZmQ7CitkaXJwID0gb3BlbmRpcigiLiIpOworZmQgPSBkaXJwLT5kZF9mZDsKK2Nsb3NlZGlyKGRpcnApOworICAgICAgICBdXSldLAorICAgICAgICBbZGJ1c19oYXZlX2RkZmQ9eWVzXSwKKyAgICAgICAgW2RidXNfaGF2ZV9kZGZkPW5vXSkKKwlBQ19NU0dfUkVTVUxUKCRkYnVzX2hhdmVfZGRmZCkKKwlpZiB0ZXN0ICIkZGJ1c19oYXZlX2RkZmQiID0geWVzOyB0aGVuCisJCUFDX0RFRklORShIQVZFX0RERkQsMSxbSGF2ZSB0aGUgZGRmZCBtZW1iZXIgb2YgRElSXSkKKwlmaQorZmkKKworQUNfQ0hFQ0tfSEVBREVSUyhzeXMvcmVzb3VyY2UuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhkaXJlbnQuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhleGVjaW5mby5oLCBbQUNfQ0hFQ0tfRlVOQ1MoYmFja3RyYWNlKV0pCisKK0FDX0NIRUNLX0hFQURFUlMoZXJybm8uaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhzaWduYWwuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhsb2NhbGUuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhieXRlc3dhcC5oKQorCitBQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKQorCitBQ19DSEVDS19IRUFERVJTKHdzMnRjcGlwLmgpCisKK0FDX0NIRUNLX0hFQURFUlMod3NwaWFwaS5oKQorCisjIEFkZCAtRF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyBpZiBvbiBTb2xhcmlzCisjCitjYXNlICRob3N0X29zIGluCisgICAgc29sYXJpcyopCisgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTIiA7OworZXNhYworCisjIGNoZWNraW5nIGZvciBhIHBvc2l4IHZlcnNpb24gb2YgZ2V0cHduYW1fcgorIyBpZiB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIGFuZCBjYW4gbm90IHJ1biB0aGUgdGVzdAorIyBhc3N1bWUgZ2V0cHduYW1fciBpcyB0aGUgcG9zaXggdmVyc2lvbgorIyBpdCBpcyB1cCB0byB0aGUgcGVyc29uIGNyb3NzIGNvbXBpbGluZyB0byBjaGFuZ2UKKyMgdGhpcyBiZWhhdmlvciBpZiBkZXNpcmVkCitBQ19MQU5HX1BVU0goQykKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgcG9zaXggZ2V0cHduYW1fcl0sCisJCWFjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fciwKKwkJW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKK1tbCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwd2QuaD4KK11dLAorW1sKKyAgICBjaGFyIGJ1ZmZlclsxMDAwMF07CisgICAgc3RydWN0IHBhc3N3ZCBwd2QsICpwd3B0ciA9ICZwd2Q7CisgICAgaW50IGVycm9yOworICAgIGVycm5vID0gMDsKKyAgICBlcnJvciA9IGdldHB3bmFtX3IgKCIiLCAmcHdkLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGJ1ZmZlciksICZwd3B0cik7CisgICByZXR1cm4gKGVycm9yIDwgMCAmJiBlcnJubyA9PSBFTk9TWVMpCisJICAgfHwgZXJyb3IgPT0gRU5PU1lTOworXV0pXSwKKwlbYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yPXllc10sCisJW2FjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fcj1ub10sCisgICAgICAgIFthY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3I9eWVzXQorKV0pCitBQ19MQU5HX1BPUChDKQorCitpZiB0ZXN0ICIkYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yIiA9IHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoSEFWRV9QT1NJWF9HRVRQV05BTV9SLDEsCisgICAgICAgICAgICAgICAgW0hhdmUgUE9TSVggZnVuY3Rpb24gZ2V0cHduYW1fcl0pCitlbHNlCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3Igbm9ucG9zaXggZ2V0cHduYW1fcl0sCisgICAgICAgICAgICAgICAgYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yLAorICAgICAgICAgICAgICAgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHB3ZC5oPl1dLCBbW2NoYXIgYnVmZmVyWzEwMDAwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYXNzd2QgcHdkOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cHduYW1fciAoIiIsICZwd2QsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGJ1ZmZlcikpO11dKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yPXllc10sCisgICAgICAgICAgICAgICAgICAgICAgICBbYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yPW5vXSldKQorICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRhY19jdl9mdW5jX25vbnBvc2l4X2dldHB3bmFtX3IiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUiwxLAorICAgICAgICAgICAgICAgICAgICAgICAgW0hhdmUgbm9uLVBPU0lYIGZ1bmN0aW9uIGdldHB3bmFtX3JdKQorICAgICAgICBmaQorZmkKKworZG5sIGNoZWNrIGZvciBzb2NrbGVuX3QKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHNvY2tsZW5fdCBpcyBkZWZpbmVkKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorXV0sIFtbCitzb2NrbGVuX3QgZm9vOworZm9vID0gMTsKK11dKV0sCitbZGJ1c19oYXZlX3NvY2tsZW5fdD15ZXNdLAorW2RidXNfaGF2ZV9zb2NrbGVuX3Q9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX3NvY2tsZW5fdCkKKworaWYgdGVzdCAieCRkYnVzX2hhdmVfc29ja2xlbl90IiA9ICJ4eWVzIjsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX1NPQ0tMRU5fVCwxLFtIYXZlIHNvY2tsZW5fdCB0eXBlXSkKK2ZpCisKK2RubCBjaGVjayBmb3Igd3JpdGV2IGhlYWRlciBhbmQgd3JpdGV2IGZ1bmN0aW9uIHNvIHdlJ3JlCitkbmwgZ29vZCB0byBnbyBpZiBIQVZFX1dSSVRFViBnZXRzIGRlZmluZWQuCitBQ19DSEVDS19IRUFERVJTKHN5cy91aW8uaCwgW0FDX0NIRUNLX0ZVTkNTKHdyaXRldildKQorCitkbmwgbmVlZGVkIG9uIGRhcndpbiBmb3IgTkFNRV9NQVgKK0FDX0NIRUNLX0hFQURFUlMoc3lzL3N5c2xpbWl0cy5oKQorCitkbmwgTWFrZSBpdCBlYXN5IHRvIGNoZWNrIGlmIHdlIGhhdmUgTVNHX05PU0lHTkFMIHdpdGhvdXQgYWN0dWFsbHkgaGF2aW5nIHRvIGluY2x1ZGUgc3lzL3NvY2tldC5oCitBQ19DSEVDS19ERUNMUyhbTVNHX05PU0lHTkFMXSwgW10sIFtdLCBbWyAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiBdXSkKKworZG5sIGNoZWNrIGZvciBmbGF2b3VycyBvZiB2YXJhcmdzIG1hY3JvcyAodGVzdCBmcm9tIEdMaWIpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIElTTyBDOTkgdmFyYXJncyBtYWNyb3MgaW4gQykKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1sKK2ludCBhKGludCBwMSwgaW50IHAyLCBpbnQgcDMpOworI2RlZmluZSBjYWxsX2EoLi4uKSBhKDEsX19WQV9BUkdTX18pCitjYWxsX2EoMiwzKTsKK11dKV0sCitbZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3M9eWVzXSwKK1tkYnVzX2hhdmVfaXNvX2NfdmFyYXJncz1ub10pCitBQ19NU0dfUkVTVUxUKCRkYnVzX2hhdmVfaXNvX2NfdmFyYXJncykKKworQUNfTVNHX0NIRUNLSU5HKGZvciBHTlVDIHZhcmFyZ3MgbWFjcm9zKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLCBbWworaW50IGEoaW50IHAxLCBpbnQgcDIsIGludCBwMyk7CisjZGVmaW5lIGNhbGxfYShwYXJhbXMuLi4pIGEoMSxwYXJhbXMpCitjYWxsX2EoMiwzKTsKK11dKV0sCitbZGJ1c19oYXZlX2dudWNfdmFyYXJncz15ZXNdLAorW2RidXNfaGF2ZV9nbnVjX3ZhcmFyZ3M9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2dudWNfdmFyYXJncykKKworZG5sIE91dHB1dCB2YXJhcmdzIHRlc3RzCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3MgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSVNPX1ZBUkFSR1MsMSxbSGF2ZSBJU08gQzk5IHZhcmFyZ3MgbWFjcm9zXSkKK2ZpCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2dudWNfdmFyYXJncyA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9HTlVDX1ZBUkFSR1MsMSxbSGF2ZSBHTlUtc3R5bGUgdmFyYXJncyBtYWNyb3NdKQorZmkKKworZG5sIENoZWNrIGZvciB2YXJpb3VzIGNyZWRlbnRpYWxzLgorQUNfTVNHX0NIRUNLSU5HKGZvciBzdHJ1Y3QgY21zZ2NyZWQpCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorXV0sIFtbCitzdHJ1Y3QgY21zZ2NyZWQgY3JlZDsKKworY3JlZC5jbWNyZWRfcGlkID0gMDsKK11dKV0sCitbZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZD15ZXNdLAorW2RidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQ9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZCkKKworaWYgdGVzdCB4JGRidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfQ01TR0NSRUQsMSxbSGF2ZSBjbXNnY3JlZCBzdHJ1Y3R1cmVdKQorZmkKKworQUNfQ0hFQ0tfRlVOQ1MoZ2V0cGVlcnVjcmVkIGdldHBlZXJlaWQpCisKK0FDX0NIRUNLX0ZVTkNTKHBpcGUyIGFjY2VwdDQpCisKKyMjIyMgQWJzdHJhY3Qgc29ja2V0cworCitpZiB0ZXN0IHgkZW5hYmxlX2Fic3RyYWN0X3NvY2tldHMgPSB4YXV0bzsgdGhlbgorQUNfTEFOR19QVVNIKEMpCit3YXJuX29uX3hjb21waWxlPW5vCitBQ19DQUNIRV9DSEVDSyhbYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZV0sCisJCWFjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cywKKwkJW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKK1tbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KK11dLAorW1sKKyAgc2l6ZV90IHNsZW47CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworCisgIGxpc3Rlbl9mZCA9IHNvY2tldCAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCisgIGlmIChsaXN0ZW5fZmQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInNvY2tldCgpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1lbXNldCAoJmFkZHIsICdcMCcsIHNpemVvZiAoYWRkcikpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBzdHJjcHkgKGFkZHIuc3VuX3BhdGgsICJYL3RtcC9kYnVzLWZha2Utc29ja2V0LXBhdGgtdXNlZC1pbi1jb25maWd1cmUtdGVzdCIpOworICAvKiBTVU5fTEVOIHVzZXMgc3RybGVuKCkgc28gbmVlZCB0byBjYWxjdWxhdGUgaXQgYmVmb3JlIGFkZGluZyBcMCBhdCB0aGUKKyAgICogYmVnaW5uaW5nLgorICAgKi8KKyAgc2xlbiA9IFNVTl9MRU4oJmFkZHIpOworICBhZGRyLnN1bl9wYXRoWzBdID0gJ1wwJzsgLyogdGhpcyBpcyB3aGF0IG1ha2VzIGl0IGFic3RyYWN0ICovCisKKyAgaWYgKGJpbmQgKGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCBzbGVuKSA8IDApCisgICAgeworICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UgYmluZCgpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgZXhpdCAoMCk7CitdXSldLAorICAgICAgICAgICAgICBbYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzPXllc10sCisgICAgICAgICAgICAgIFthY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHM9bm9dLAorICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzPW5vCisgICAgICAgICAgICAgICAgd2Fybl9vbl94Y29tcGlsZT15ZXMKKyAgICAgICAgICAgICAgXQorKV0pCitpZiB0ZXN0IHgkd2Fybl9vbl94Y29tcGlsZSA9IHh5ZXMgOyB0aGVuCisgIEFDX01TR19XQVJOKFtDYW5ub3QgY2hlY2sgZm9yIGFic3RyYWN0IHNvY2tldHMgd2hlbiBjcm9zcy1jb21waWxpbmcsIHBsZWFzZSB1c2UgLS1lbmFibGUtYWJzdHJhY3Qtc29ja2V0c10pCitmaQorQUNfTEFOR19QT1AoQykKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfYWJzdHJhY3Rfc29ja2V0cyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzID0geG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtBYnN0cmFjdCBzb2NrZXRzIGV4cGxpY2l0bHkgcmVxdWlyZWQsIGFuZCBzdXBwb3J0IG5vdCBkZXRlY3RlZC5dKQorICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX2Fic3RyYWN0X3NvY2tldHMgPSB4bm87IHRoZW4KKyAgIGFjX2N2X2hhdmVfYWJzdHJhY3Rfc29ja2V0cz1ubzsKK2ZpCisKK2lmIHRlc3QgeCRhY19jdl9oYXZlX2Fic3RyYWN0X3NvY2tldHMgPSB4eWVzIDsgdGhlbgorICAgREJVU19QQVRIX09SX0FCU1RSQUNUPWFic3RyYWN0CisgICBBQ19ERUZJTkUoSEFWRV9BQlNUUkFDVF9TT0NLRVRTLDEsW0hhdmUgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZV0pCitlbHNlCisgICBEQlVTX1BBVEhfT1JfQUJTVFJBQ1Q9cGF0aAorZmkKKworIyB0aGlzIGlzIHVzZWQgaW4gYWRkcmVzc2VzIHRvIHByZWZlciBhYnN0cmFjdCwgZS5nLgorIyB1bml4OnBhdGg9L2ZvbyBvciB1bml4OmFic3RyYWN0PS9mb28KK0FDX1NVQlNUKERCVVNfUEFUSF9PUl9BQlNUUkFDVCkKKworUEtHX1BST0dfUEtHX0NPTkZJRworCisjIyMjIFNvcnQgb3V0IFhNTCBsaWJyYXJ5CisKKyMgc2VlIHdoYXQgd2UgaGF2ZQorQUNfQ0hFQ0tfTElCKGV4cGF0LCBYTUxfUGFyc2VyQ3JlYXRlX01NLAorICAgICAgICAgICAgIFsgQUNfQ0hFQ0tfSEVBREVSUyhleHBhdC5oLCBoYXZlX2V4cGF0PXRydWUsIGhhdmVfZXhwYXQ9ZmFsc2UpIF0sCisgICAgICAgICAgICAgaGF2ZV9leHBhdD1mYWxzZSkKKworIyBzZWUgd2hhdCB3ZSB3YW50IHRvIHVzZQorZGJ1c191c2VfbGlieG1sPWZhbHNlCitkYnVzX3VzZV9leHBhdD1mYWxzZQoraWYgdGVzdCB4JHdpdGhfeG1sID0geGV4cGF0OyB0aGVuCisgICAgICAgIGlmICEgJGhhdmVfZXhwYXQgOyB0aGVuCisgICAgICAgICAgIEFDX01TR19FUlJPUihbRXhwbGljaXRseSByZXF1ZXN0ZWQgZXhwYXQgYnV0IGV4cGF0IG5vdCBmb3VuZF0pCisgICAgICAgIGZpCisgICAgICAgIGRidXNfdXNlX2V4cGF0PXRydWUKK2VsaWYgdGVzdCB4JHdpdGhfeG1sID0geGxpYnhtbDsgdGhlbgorICAgICAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJYTUwsIGxpYnhtbC0yLjAgPj0gMi42LjAsIGhhdmVfbGlieG1sPXRydWUsIGhhdmVfbGlieG1sPWZhbHNlKQorICAgICAgICBpZiAhICRoYXZlX2xpYnhtbCA7IHRoZW4KKyAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtFeHBsaWNpdGx5IHJlcXVlc3RlZCBsaWJ4bWwgYnV0IGxpYnhtbCBub3QgZm91bmRdKQorICAgICAgICBmaQorICAgICAgICBkYnVzX3VzZV9saWJ4bWw9dHJ1ZQorZWxzZQorICAgICAgICAjIyMgZXhwYXQgaXMgdGhlIGRlZmF1bHQgYmVjYXVzZSBsaWJ4bWwgY2FuJ3QgY3VycmVudGx5IHN1cnZpdmUKKyAgICAgICAgIyMjIG91ciBicnV0YWwgT09NLWhhbmRsaW5nIHVuaXQgdGVzdCBzZXR1cC4KKyAgICAgICAgIyMjIGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTEwOTM2OAorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9leHBhdCA9IHhmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgZXhwYXQuaCwgY2hlY2sgY29uZmlnLmxvZyBmb3IgZmFpbGVkIGF0dGVtcHRzXSkKKyAgICAgICAgZmkKKwkjIyMgQnkgZGVmYXVsdCwgb25seSB1c2UgRXhwYXQgc2luY2UgaXQncyB0ZXN0ZWQgYW5kIGtub3duIHRvIHdvcmsuICBJZiB5b3UncmUgYQorCSMjIyBnZW5lcmFsLXB1cnBvc2UgT1MgdmVuZG9yLCBwbGVhc2UgZG9uJ3QgZW5hYmxlIGxpYnhtbC4gIEZvciBlbWJlZGRlZCB1c2UKKwkjIyMgaWYgeW91ciBPUyBpcyBidWlsdCBhcm91bmQgbGlieG1sLCB0aGF0J3MgYW5vdGhlciBjYXNlLgorCWRidXNfdXNlX2V4cGF0PXRydWUKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfVVNFX0VYUEFULCAkZGJ1c191c2VfZXhwYXQpCitBTV9DT05ESVRJT05BTChEQlVTX1VTRV9MSUJYTUwsICRkYnVzX3VzZV9saWJ4bWwpCisKK2lmICRkYnVzX3VzZV9leHBhdDsgdGhlbgorICAgWE1MX0xJQlM9LWxleHBhdAorICAgWE1MX0NGTEFHUz0KK2ZpCitpZiAkZGJ1c191c2VfbGlieG1sOyB0aGVuCisgICBYTUxfTElCUz0kTElCWE1MX0xJQlMKKyAgIFhNTF9DRkxBR1M9JExJQlhNTF9DRkxBR1MKK2ZpCisKKyMgVGhyZWFkIGxpYiBkZXRlY3Rpb24KK0FDX0NIRUNLX0ZVTkMocHRocmVhZF9jb25kX3RpbWVkd2FpdCxbQUNfQ0hFQ0tfTElCKHB0aHJlYWQscHRocmVhZF9jb25kX3RpbWVkd2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVEhSRUFEX0xJQlM9Ii1scHRocmVhZCJdKV0pCitzYXZlX2xpYnM9IiRMSUJTIgorTElCUz0iJExJQlMgJFRIUkVBRF9MSUJTIgorQUNfQ0hFQ0tfRlVOQyhwdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrLGhhdmVfcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jaz10cnVlLGhhdmVfcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jaz1mYWxzZSkKK2lmIHRlc3QgeCRoYXZlX3B0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sgPSB4dHJ1ZTsgdGhlbgorICAgIEFDX1NFQVJDSF9MSUJTKFtjbG9ja19nZXRyZXNdLFtydF0sW1RIUkVBRF9MSUJTPSIkVEhSRUFEX0xJQlMgLWxydCJdKQorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIENMT0NLX01PTk9UT05JQ10pCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorXV0sIFtbCitzdHJ1Y3QgdGltZXNwZWMgbW9ub3RvbmljX3RpbWVyOworcHRocmVhZF9jb25kYXR0cl90IGF0dHI7CitwdGhyZWFkX2NvbmRhdHRyX2luaXQgKCZhdHRyKTsKK3B0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sgKCZhdHRyLCBDTE9DS19NT05PVE9OSUMpOworY2xvY2tfZ2V0cmVzIChDTE9DS19NT05PVE9OSUMsJm1vbm90b25pY190aW1lcik7CitdXSldLAorW2hhdmVfY2xvY2tfbW9ub3RvbmljPXRydWVdLAorW2hhdmVfY2xvY2tfbW9ub3RvbmljPWZhbHNlXSkKK2lmIHRlc3QgeCRoYXZlX2Nsb2NrX21vbm90b25pYyA9IHh0cnVlOyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVChbZm91bmRdKQorICAgIEFDX0RFRklORShIQVZFX01PTk9UT05JQ19DTE9DSywgMSwgW0RlZmluZSBpZiB3ZSBoYXZlIENMT0NLX01PTk9UT05JQ10pCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbbm90IGZvdW5kXSkKK2ZpCitmaQorTElCUz0iJHNhdmVfbGlicyIKKworIyBTRUxpbnV4IGRldGVjdGlvbgoraWYgdGVzdCB4JGVuYWJsZV9zZWxpbnV4ID0geG5vIDsgdGhlbgorICAgIGhhdmVfc2VsaW51eD1ubzsKK2Vsc2UKKyAgICAjIFNlZSBpZiB3ZSBoYXZlIFNFTGludXggbGlicmFyeQorICAgIEFDX0NIRUNLX0xJQihzZWxpbnV4LCBpc19zZWxpbnV4X2VuYWJsZWQsCisgICAgICAgICAgICAgICAgIGhhdmVfc2VsaW51eD15ZXMsIGhhdmVfc2VsaW51eD1ubykKKworICAgICMgc2VlIGlmIHdlIGhhdmUgdGhlIFNFTGludXggaGVhZGVyIHdpdGggdGhlIG5ldyBELUJ1cyBzdHVmZiBpbiBpdAorICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4eWVzIDsgdGhlbgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBEQlVTIEZsYXNrIHBlcm1pc3Npb25zIGluIHNlbGludXgvYXZfcGVybWlzc2lvbnMuaF0pCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8c2VsaW51eC9hdl9wZXJtaXNzaW9ucy5oPl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbWyNpZmRlZiBEQlVTX19BQ1FVSVJFX1NWQyByZXR1cm4gMDsKKwkJCSAgICAjZWxzZQorCQkJICAgICNlcnJvciBEQlVTX19BQ1FVSVJFX1NWQyBub3QgZGVmaW5lZAorCQkJICAgICNlbmRpZl1dKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3NlbGludXg9eWVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhdmVfc2VsaW51eD1ub10pCisJQUNfTVNHX1JFU1VMVCgkaGF2ZV9zZWxpbnV4KQorICAgIGZpCisKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX3NlbGludXggPSB4YXV0byA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4JGhhdmVfc2VsaW51eCA9IHhubyA7IHRoZW4KKyAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihbU3VmZmljaWVudGx5IG5ldyBTRUxpbnV4IGxpYnJhcnkgbm90IGZvdW5kXSkKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4bm8gOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtTRWxpbnV4IGV4cGxpY2l0bHkgcmVxdWlyZWQsIGFuZCBTRUxpbnV4IGxpYnJhcnkgbm90IGZvdW5kXSkKKyAgICAgICAgZmkKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoSEFWRV9TRUxJTlVYLCB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geHllcykKKworaWYgdGVzdCB4JGhhdmVfc2VsaW51eCA9IHh5ZXMgOyB0aGVuCisgICAgIyB0aGUgc2VsaW51eCBjb2RlIGNyZWF0ZXMgdGhyZWFkcworICAgICMgd2hpY2ggcmVxdWlyZXMgbGlicHRocmVhZCBldmVuIG9uIGxpbnV4CisgICAgQUNfQ0hFQ0tfRlVOQyhwdGhyZWFkX2NyZWF0ZSwsW0FDX0NIRUNLX0xJQihwdGhyZWFkLHB0aHJlYWRfY3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NFTElOVVhfVEhSRUFEX0xJQlM9Ii1scHRocmVhZCJdKV0pCisKKyAgICBTRUxJTlVYX0xJQlM9Ii1sc2VsaW51eCAkU0VMSU5VWF9USFJFQURfTElCUyIKKyAgICBBQ19ERUZJTkUoSEFWRV9TRUxJTlVYLDEsW1NFTGludXggc3VwcG9ydF0pCitlbHNlCisgICAgU0VMSU5VWF9MSUJTPQorZmkKKworIyBpbm90aWZ5IGNoZWNrcworaWYgdGVzdCB4JGVuYWJsZV9pbm90aWZ5ID0geG5vIDsgdGhlbgorICAgIGhhdmVfaW5vdGlmeT1ubzsKK2Vsc2UKKyAgICBBQ19DSEVDS19IRUFERVJTKHN5cy9pbm90aWZ5LmgsIGhhdmVfaW5vdGlmeT15ZXMsIGhhdmVfaW5vdGlmeT1ubykKK2ZpCisKK2RubCBjaGVjayBpZiBpbm90aWZ5IGJhY2tlbmQgaXMgZW5hYmxlZAoraWYgdGVzdCB4JGhhdmVfaW5vdGlmeSA9IHh5ZXM7IHRoZW4KKyAgIEFDX0RFRklORShEQlVTX0JVU19FTkFCTEVfSU5PVElGWSwxLFtVc2UgaW5vdGlmeV0pCisgICBBQ19DSEVDS19GVU5DUyhpbm90aWZ5X2luaXQxKQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19CVVNfRU5BQkxFX0lOT1RJRlksIHRlc3QgeCRoYXZlX2lub3RpZnkgPSB4eWVzKQorCisjIGRub3RpZnkgY2hlY2tzCitpZiB0ZXN0IHgkZW5hYmxlX2Rub3RpZnkgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9kbm90aWZ5PW5vOworZWxzZQorICAgIGlmIHRlc3QgeCRoYXZlX2lub3RpZnkgPSB4bm8gLWEgeCRob3N0X29zID0geGxpbnV4LWdudSAtbyB4JGhvc3Rfb3MgPSB4bGludXg7IHRoZW4KKyAgICAgICAgaGF2ZV9kbm90aWZ5PXllczsKKyAgICBlbHNlCisgICAgICAgIGhhdmVfZG5vdGlmeT1ubzsKKyAgICBmaQorZmkKKworZG5sIGNoZWNrIGlmIGRub3RpZnkgYmFja2VuZCBpcyBlbmFibGVkCitpZiB0ZXN0IHgkaGF2ZV9kbm90aWZ5ID0geHllczsgdGhlbgorICAgQUNfREVGSU5FKERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYLDEsW1VzZSBkbm90aWZ5IG9uIExpbnV4XSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfQlVTX0VOQUJMRV9ETk9USUZZX09OX0xJTlVYLCB0ZXN0IHgkaGF2ZV9kbm90aWZ5ID0geHllcykKKworIyBrcXVldWUgY2hlY2tzCitpZiB0ZXN0IHgkZW5hYmxlX2txdWV1ZSA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2txdWV1ZT1ubworZWxzZQorICAgIGhhdmVfa3F1ZXVlPXllcworICAgIEFDX0NIRUNLX0hFQURFUihzeXMvZXZlbnQuaCwgLCBoYXZlX2txdWV1ZT1ubykKKyAgICBBQ19DSEVDS19GVU5DKGtxdWV1ZSwgLCBoYXZlX2txdWV1ZT1ubykKKworICAgIGlmIHRlc3QgeCRlbmFibGVfa3F1ZXVlID0geHllcyAtYSB4JGhhdmVfa3F1ZXVlID0geG5vOyB0aGVuCisgICAgICAgIEFDX01TR19FUlJPUihrcXVldWUgc3VwcG9ydCBleHBsaWNpdGx5IGVuYWJsZWQgYnV0IG5vdCBhdmFpbGFibGUpCisgICAgZmkKK2ZpCisKK2RubCBjaGVjayBpZiBrcXVldWUgYmFja2VuZCBpcyBlbmFibGVkCitpZiB0ZXN0IHgkaGF2ZV9rcXVldWUgPSB4eWVzOyB0aGVuCisgICBBQ19ERUZJTkUoREJVU19CVVNfRU5BQkxFX0tRVUVVRSwxLFtVc2Uga3F1ZXVlXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfQlVTX0VOQUJMRV9LUVVFVUUsIHRlc3QgeCRoYXZlX2txdWV1ZSA9IHh5ZXMpCisKKyMgbGF1bmNoZCBjaGVja3MKK2lmIHRlc3QgeCRlbmFibGVfbGF1bmNoZCA9IHhubyA7IHRoZW4KKyAgICBoYXZlX2xhdW5jaGQ9bm8KK2Vsc2UKKyAgICBoYXZlX2xhdW5jaGQ9eWVzCisgICAgQUNfQ0hFQ0tfSEVBREVSKFtsYXVuY2guaF0sICwgaGF2ZV9sYXVuY2hkPW5vKQorICAgIEFDX1BBVEhfUFJPRyhbTEFVTkNIQ1RMXSwgW2xhdW5jaGN0bF0pCisgICAgaWYgdGVzdCAieCRMQVVOQ0hDVEwiID0gIngiOyB0aGVuCisgICAgICAgIGhhdmVfbGF1bmNoZD1ubworICAgIGZpCisKKyAgICBpZiB0ZXN0IHgkZW5hYmxlX2xhdW5jaGQgPSB4eWVzICYmIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4bm8gOyB0aGVuCisgICAgICAgIEFDX01TR19FUlJPUihbbGF1bmNoZCBzdXBwb3J0IGV4cGxpY2l0bHkgZW5hYmxlZCBidXQgbm90IGF2YWlsYWJsZV0pCisgICAgZmkKK2ZpCisKK2RubCBjaGVjayBpZiBsYXVuY2hkIGlzIGVuYWJsZWQKK2lmIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKERCVVNfRU5BQkxFX0xBVU5DSEQsMSxbVXNlIGxhdW5jaGQgYXV0b2xhdW5jaF0pCitmaQorCitBTV9DT05ESVRJT05BTChEQlVTX0VOQUJMRV9MQVVOQ0hELCB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllcykKKworIyMjIyBEaXJlY3RvcnkgdG8gcGxhY2UgbGF1bmNoZCBhZ2VudCBmaWxlCitpZiB0ZXN0ICJ4JHdpdGhfbGF1bmNoZF9hZ2VudF9kaXIiID0gIngiOyB0aGVuCisgICBMQVVOQ0hEX0FHRU5UX0RJUj0iL0xpYnJhcnkvTGF1bmNoQWdlbnRzIgorZWxzZQorICAgTEFVTkNIRF9BR0VOVF9ESVI9IiR3aXRoX2xhdW5jaGRfYWdlbnRfZGlyIgorZmkKKworQUNfU1VCU1QoTEFVTkNIRF9BR0VOVF9ESVIpCisKK2RubCBjb25zb2xlIG93bmVyIGZpbGUKK2lmIHRlc3QgeCRlbmFibGVfY29uc29sZV9vd25lcl9maWxlID0geG5vIDsgdGhlbgorICAgIGhhdmVfY29uc29sZV9vd25lcl9maWxlPW5vOworZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBzb2xhcmlzKikKKyAgICAgICAgaGF2ZV9jb25zb2xlX293bmVyX2ZpbGU9eWVzOworICAgICAgICBBQ19ERUZJTkUoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUsMSxbSGF2ZSBjb25zb2xlIG93bmVyIGZpbGVdKQorICAgICAgICA7OworICAgICopCisgICAgICAgIGhhdmVfY29uc29sZV9vd25lcl9maWxlPW5vOzsKKyAgICBlc2FjCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0NPTlNPTEVfT1dORVJfRklMRSwgdGVzdCB4JGhhdmVfY29uc29sZV9vd25lcl9maWxlID0geHllcykKKworIyBsaWJhdWRpdCBkZXRlY3Rpb24KK2lmIHRlc3QgeCRlbmFibGVfbGliYXVkaXQgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9saWJhdWRpdD1ubzsKK2Vsc2UKKyAgICAjIFNlZSBpZiB3ZSBoYXZlIGF1ZGl0IGRhZW1vbiAmIGNhcGFiaWxpdGllcyBsaWJyYXJ5CisgICAgQUNfQ0hFQ0tfTElCKGF1ZGl0LCBhdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgaGF2ZV9saWJhdWRpdD15ZXMsIGhhdmVfbGliYXVkaXQ9bm8pCisgICAgaWYgdGVzdCB4JGhhdmVfbGliYXVkaXQgPSB4eWVzIDsgdGhlbgorICAgICAgICBBQ19DSEVDS19MSUIoY2FwLW5nLCBjYXBuZ19jbGVhciwKKyAgICAgICAgICAgICAgICAgaGF2ZV9saWJhdWRpdD15ZXMsIGhhdmVfbGliYXVkaXQ9bm8pCisgICAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfTElCQVVESVQsIHRlc3QgeCRoYXZlX2xpYmF1ZGl0ID0geHllcykKKworaWYgdGVzdCB4JGhhdmVfbGliYXVkaXQgPSB4eWVzIDsgdGhlbgorICAgIFNFTElOVVhfTElCUz0iJFNFTElOVVhfTElCUyAtbGF1ZGl0IC1sY2FwLW5nIgorICAgIEFDX0RFRklORShIQVZFX0xJQkFVRElULDEsW2F1ZGl0IGRhZW1vbiBTRUxpbnV4IHN1cHBvcnRdKQorZmkKKworIyBDaGVjayBmb3IgQURUIEFQSQorQUNfTVNHX0NIRUNLSU5HKGZvciBBRFQgQVBJKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPGJzbS9hZHQuaD4KK2FkdF91c2VyX2NvbnRleHQgPSBBRFRfVVNFUjsKK11dLCBbW11dKV0sIFsgY2hlY2tfYWR0X2F1ZGl0PXllcyBdLCBbIGNoZWNrX2FkdF9hdWRpdD1ubyBdKQorCitpZiB0ZXN0ICR7Y2hlY2tfYWR0X2F1ZGl0fSA9IHllcwordGhlbgorICAgQUNfREVGSU5FKFtIQVZFX0FEVF0sIFtdLCBbQWR0IGF1ZGl0IEFQSV0pCisgICBBRFRfTElCUz0iLWxic20iCisgICBMSUJTPSItbGJzbSAkTElCUyIKKyAgIEFDX01TR19SRVNVTFQoeWVzKQorZWxzZQorICAgQUNfTVNHX1JFU1VMVChubykKK2ZpCisKKyMgQ2hlY2sgZm9yIFNDTV9SSUdIVFMKK0FDX01TR19DSEVDS0lORyhbZm9yIFNDTV9SSUdIVFNdKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KK3N0YXRpYyBpbnQgeCA9IFNDTV9SSUdIVFM7CitdXSwgW1tdXSldLAorWyBBQ19NU0dfUkVTVUxUKFtzdXBwb3J0ZWRdKQorICBBQ19ERUZJTkUoW0hBVkVfVU5JWF9GRF9QQVNTSU5HXSwgWzFdLCBbU3VwcG9ydHMgc2VuZGluZyBVTklYIGZpbGUgZGVzY3JpcHRvcnNdKSBdLAorWyBBQ19NU0dfUkVTVUxUKFtub3Qgc3VwcG9ydGVkXSkgXSkKKworTkVUV09SS19saWJzPQoraWYgdGVzdCB4JGRidXNfd2luID0geHllcyA7IHRoZW4KKyAgaWYgdGVzdCB4JGRidXNfd2luY2UgPSB4eWVzIDsgdGhlbgorICAgIE5FVFdPUktfbGlicz0iLWx3czIiCisgIGVsc2UKKyAgICBORVRXT1JLX2xpYnM9Ii1sd3MyXzMyIgorICBmaQorZmkKKworIyMjIyBTZXQgdXAgZmluYWwgZmxhZ3MKK0RCVVNfQ0xJRU5UX0NGTEFHUz0KK0RCVVNfQ0xJRU5UX0xJQlM9IiRUSFJFQURfTElCUyAkTkVUV09SS19saWJzIgorQUNfU1VCU1QoREJVU19DTElFTlRfQ0ZMQUdTKQorQUNfU1VCU1QoREJVU19DTElFTlRfTElCUykKKworREJVU19CVVNfQ0ZMQUdTPSIkWE1MX0NGTEFHUyIKK0RCVVNfQlVTX0xJQlM9IiRYTUxfTElCUyAkU0VMSU5VWF9MSUJTICRUSFJFQURfTElCUyAkQURUX0xJQlMgJE5FVFdPUktfbGlicyIKK0FDX1NVQlNUKERCVVNfQlVTX0NGTEFHUykKK0FDX1NVQlNUKERCVVNfQlVTX0xJQlMpCisKK0RCVVNfTEFVTkNIRVJfQ0ZMQUdTPSIkWE1MX0NGTEFHUyIKK0RCVVNfTEFVTkNIRVJfTElCUz0iJFhNTF9MSUJTICRUSFJFQURfTElCUyAkTkVUV09SS19saWJzIgorQUNfU1VCU1QoREJVU19MQVVOQ0hFUl9DRkxBR1MpCitBQ19TVUJTVChEQlVTX0xBVU5DSEVSX0xJQlMpCisKK0RCVVNfVEVTVF9DRkxBR1M9CitEQlVTX1RFU1RfTElCUz0iJFRIUkVBRF9MSUJTICRORVRXT1JLX2xpYnMiCitBQ19TVUJTVChEQlVTX1RFU1RfQ0ZMQUdTKQorQUNfU1VCU1QoREJVU19URVNUX0xJQlMpCisKKyMjIyBYMTEgZGV0ZWN0aW9uCitEQlVTX1hfTElCUz0KK0RCVVNfWF9DRkxBR1M9CisKK0FDX0FSR19FTkFCTEUoW3gxMS1hdXRvbGF1bmNoXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXgxMS1hdXRvbGF1bmNoXSwgW2J1aWxkIHdpdGggWDExIGF1dG8tbGF1bmNoIHN1cHBvcnRdKSwKKyAgW10sIFtlbmFibGVfeDExX2F1dG9sYXVuY2g9YXV0b10pCisKK2lmIHRlc3QgIngkZGJ1c193aW4iID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0VSUk9SKFtYMTEgYXV0by1sYXVuY2ggaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzXSkKKyAgICBmaQorCisgICAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPW5vCisgICAgaGF2ZV94MTE9bm8KK2Vsc2UKKyAgICBBQ19QQVRIX1hUUkEKKworICAgIGlmIHRlc3QgIngkbm9feCIgPSB4eWVzOyB0aGVuCisgICAgICAgIGhhdmVfeDExPW5vCisgICAgZWxzZQorICAgICAgICBoYXZlX3gxMT15ZXMKKyAgICAgICAgREJVU19YX0xJQlM9IiRYX0xJQlMgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyIKKyAgICAgICAgREJVU19YX0NGTEFHUz0iJFhfQ0ZMQUdTIgorICAgIGZpCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV94MTFfYXV0b2xhdW5jaCwkaGF2ZV94MTEiID0geHllcyxubzsgdGhlbgorICAgIEFDX01TR19FUlJPUihbWDExIGF1dG8tbGF1bmNoIHJlcXVpcmVzIFggaGVhZGVycy9saWJyYXJpZXNdKQorZWxzZQorICAgICMgbW92ZSBmcm9tICJhdXRvIiB0byAieWVzIiBvciAibm8iIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoIiAhPSB4bm87IHRoZW4KKyAgICAgICAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPSIkaGF2ZV94MTEiCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgIngkaGF2ZV94MTEiID0geHllcyA7IHRoZW4KKyAgIEFDX0RFRklORShbREJVU19CVUlMRF9YMTFdLCBbMV0sIFtEZWZpbmUgdG8gYnVpbGQgWDExIGZ1bmN0aW9uYWxpdHldKQorZmkKKworaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giID0geHllcyA7IHRoZW4KKyAgIEFDX0RFRklORShbREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0hdLCBbMV0sIFtEZWZpbmUgdG8gZW5hYmxlIFgxMSBhdXRvLWxhdW5jaF0pCitmaQorCitBQ19TVUJTVChbREJVU19YX0NGTEFHU10pCitBQ19TVUJTVChbREJVU19YX0xJQlNdKQorCisjIyMjIGdjYyB3YXJuaW5nIGZsYWdzCisKK2NjX3N1cHBvcnRzX2ZsYWcoKSB7CisgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyICRDQyBzdXBwb3J0cyAiJCoiKQorICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkKiIKKyAgQUNfVFJZX0NPTVBJTEUoW10sIFtdLCBbcmM9eWVzXSwgW3JjPW5vXSkKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgIEFDX01TR19SRVNVTFQoWyRyY10pCisgIHRlc3QgIngkcmMiID0geHllcworfQorCitUUF9DT01QSUxFUl9XQVJOSU5HUyhbV0FSTklOR19DRkxBR1NdLAorICBkbmwgVXNlIC1XZXJyb3IgYnkgZGVmYXVsdCBpZjoKKyAgZG5sIC0gd2UncmUgbm90IG9uIFdpbmRvd3MgKHRvbyBtYW55IHdhcm5pbmdzKSwgYW5kCisgIGRubCAtIHdlJ3JlIGluIG1haW50YWluZXIgbW9kZSAoYSBELUJ1cyBkZXZlbG9wZXIsIG5vdCBhIGRpc3RybyBvciBlbmQtdXNlcikKKyAgZG5sIE92ZXJyaWRlIHdpdGggLS1lbmFibGUtV2Vycm9yIG9yIC0tZGlzYWJsZS1XZXJyb3IKKyAgW3Rlc3QgeCRkYnVzX3dpbiAhPSB4eWVzIC1hIHgkZGJ1c19jeWd3aW4gIT0geHllcyAtYSB4JFVTRV9NQUlOVEFJTkVSX01PREUgPSB4eWVzXSwKKworICBkbmwgZW5hYmxlIHRoZXNlIHdhcm5pbmdzIGlmIHBvc3NpYmxlOgorICBbYWxsIFwKKyAgIGNoYXItc3Vic2NyaXB0cyBcCisgICBtaXNzaW5nLWRlY2xhcmF0aW9ucyBcCisgICBtaXNzaW5nLXByb3RvdHlwZXMgXAorICAgbmVzdGVkLWV4dGVybnMgXAorICAgcG9pbnRlci1hcml0aCBcCisgICBjYXN0LWFsaWduIFwKKyAgIG5vLWFkZHJlc3MgXAorICAgZmxvYXQtZXF1YWwgXAorICAgZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IFwKKyAgXSwKKworICBkbmwgZGlzYWJsZSB0aGVzZSB3YXJuaW5ncyBpZiBwb3NzaWJsZSwgbWFrZSB0aGVtIG5vbi1mYXRhbCBpZiBwb3NzaWJsZSwKKyAgZG5sIGFuZCBkb24ndCBlbmFibGUgLVdlcnJvciB1bmxlc3Mgd2Ugc3VjY2VlZGVkOgorICBkbmwgKHVudXNlZCBpcyBieSBkZXNpZ24sIHNpZ24tY29tcGFyZSBhbmQgcG9pbnRlci1zaWduIGFyZSBmZC5vICMxNzQzMykKKyAgW3VudXNlZCBcCisgICBzaWduLWNvbXBhcmUgXAorICAgcG9pbnRlci1zaWduIFwKKyAgXSkKKworaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisgICMgV2UncmUgdHJlYXRpbmcgLWZuby1jb21tb24gbGlrZSBhIHdhcm5pbmc6IGl0IG1ha2VzIHRoZSBsaW5rZXIgbW9yZQorICAjIHN0cmljdCwgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgdGhlIGxpbmtlciBpcyAqYWx3YXlzKiB0aGlzIHN0cmljdAorICBUUF9BRERfQ09NUElMRVJfRkxBRyhbV0FSTklOR19DRkxBR1NdLCBbLWZuby1jb21tb25dKQorCisgICMgaHR0cDovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDU5OQorICBUUF9BRERfQ09NUElMRVJfRkxBRyhbV0FSTklOR19DRkxBR1NdLCBbLWZuby1zdHJpY3QtYWxpYXNpbmddKQorCisgIGlmIHRlc3QgIngkZW5hYmxlX2Fuc2kiID0gInh5ZXMiOyB0aGVuCisgICAgVFBfQUREX0NPTVBJTEVSX0ZMQUcoW1dBUk5JTkdfQ0ZMQUdTXSwKKyAgICAgIFstYW5zaSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLXBlZGFudGljXSkKKyAgZmkKK2ZpCisKK2RubCBJbiBwcmluY2lwbGUgd2Ugc2hvdWxkIHB1dCBXQVJOSU5HX0NGTEFHUyBpbiBlYWNoIE1ha2VmaWxlLmFtIGxpa2UKK2RubCB0ZWxlcGF0aHktZ2xpYiBkb2VzLCBzaW5jZSBDRkxBR1MgaXMgbWVhbnQgdG8gYmUgcmVzZXJ2ZWQgZm9yIHRoZSB1c2VyLi4uCitkbmwgYnV0IHByZXBlbmRpbmcgdG8gQ0ZMQUdTIChzbyB0aGUgdXNlciBjYW4gb3ZlcnJpZGUgaXQgd2l0aCBsYXRlciBDRkxBR1MpCitkbmwgaXMgdGhlIG5leHQgYmVzdCB0aGluZworQ0ZMQUdTPSIkV0FSTklOR19DRkxBR1MgJENGTEFHUyIKKworIyBEaXNhYmxpbmcgZ2Mtc2VjdGlvbnMgbWFrZXMgb3VyIGJpbmFyaWVzIGJpZ2dlciwgYnV0IHNvbWUgdG9vbGNoYWlucworIyBoYXZlIGtub3duLWJyb2tlbiBzdXBwb3J0IGZvciBpdCB3aGljaCBkaXNjYXJkcyBzZWN0aW9ucyB0aGF0IGFyZSBuZWVkZWQuCisjIFNlZSBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzQ2NgorU0VDVElPTl9MREZMQUdTPQorQUNfQVJHX0VOQUJMRShbZ2Mtc2VjdGlvbnNdLAorICBbQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1nYy1zZWN0aW9uc10sCisgICAgW2Rpc2FibGUgLS1nYy1zZWN0aW9ucyB0byB3b3JrIGFyb3VuZCBicm9rZW4gdG9vbGNoYWluc10pXSwKKyAgW2VuYWJsZV9nY19zZWN0aW9ucz0kZW5hYmxldmFsXSwKKyAgW2VuYWJsZV9nY19zZWN0aW9ucz15ZXNdKQoraWYgdGVzdCAieCRHQ0MsJGVuYWJsZV9nY19zZWN0aW9ucywkZGJ1c193aW4iID0geHllcyx5ZXMsbm87IHRoZW4KKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGFiaWxpdHkgdG8gbGluayB3aXRoIC0tZ2Mtc2VjdGlvbnNdKQorICBDRkxBR1M9Ii1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIgorICBMREZMQUdTPSItV2wsLS1nYy1zZWN0aW9ucyIKKyAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwgW10pXSwKKyAgICBbcmM9eWVzXSwKKyAgICBbcmM9bm9dKQorICBBQ19NU0dfUkVTVUxUKFskcmNdKQorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgaWYgdGVzdCAieCRyYyIgPSB4eWVzOyB0aGVuCisgICAgU0VDVElPTl9MREZMQUdTPSItV2wsLS1nYy1zZWN0aW9ucyIKKyAgICBDRkxBR1M9Ii1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zICRDRkxBR1MiCisgIGZpCitmaQorQUNfU1VCU1QoW1NFQ1RJT05fTERGTEFHU10pCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgICBzb2xhcmlzKikKKyAgICAgICAgIyBTb2xhcmlzJyBDIGxpYnJhcnkgYXBwYXJlbnRseSBuZWVkcyB0aGVzZSBydW5lcyB0byBiZSB0aHJlYWRzYWZlLi4uCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtRF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyAtRF9SRUVOVFJBTlQiCitlc2FjCisKKyMjIyBEb3h5Z2VuIERvY3VtZW50YXRpb24KKworQUNfUEFUSF9QUk9HKERPWFlHRU4sIGRveHlnZW4sIG5vKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgRG94eWdlbiBkb2N1bWVudGF0aW9uXSkKKworaWYgdGVzdCB4JERPWFlHRU4gPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9kb3h5Z2VuPW5vCitlbHNlCisgICAgaGF2ZV9kb3h5Z2VuPXllcworZmkKKworaWYgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4YXV0byA7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV9kb3h5Z2VuID0geG5vIDsgdGhlbgorICAgICAgICBlbmFibGVfZG94eWdlbl9kb2NzPW5vCisgICAgZWxzZQorICAgICAgICBlbmFibGVfZG94eWdlbl9kb2NzPXllcworICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX2RveHlnZW5fZG9jcyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV9kb3h5Z2VuID0geG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtCdWlsZGluZyBEb3h5Z2VuIGRvY3MgZXhwbGljaXRseSByZXF1aXJlZCwgYnV0IERveHlnZW4gbm90IGZvdW5kXSkKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRCwgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4eWVzKQorQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2RveHlnZW5fZG9jcykKKworWFNMVFBST0M9ZmFsc2UKK0FDX0NIRUNLX1BST0dTKFtYU0xUUFJPQ10sIFt4c2x0cHJvY10pCitBTV9DT05ESVRJT05BTChEQlVTX0hBVkVfWFNMVFBST0MsIHRlc3QgIiRYU0xUUFJPQyIgIT0gZmFsc2UpCisKKyMjIyBYTUwgRG9jdW1lbnRhdGlvbgorCitBQ19QQVRIX1BST0coWE1MVE8sIHhtbHRvLCBubykKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIFhNTCBkb2N1bWVudGF0aW9uXSkKKworaWYgdGVzdCB4JFhNTFRPID0geG5vIDsgdGhlbgorICAgIGhhdmVfeG1sdG89bm8KK2Vsc2UKKyAgICBoYXZlX3htbHRvPXllcworZmkKKworaWYgdGVzdCB4JGVuYWJsZV94bWxfZG9jcyA9IHhhdXRvIDsgdGhlbgorICAgIGlmIHRlc3QgeCRoYXZlX3htbHRvID0geG5vIDsgdGhlbgorICAgICAgICBlbmFibGVfeG1sX2RvY3M9bm8KKyAgICBlbHNlCisgICAgICAgIGVuYWJsZV94bWxfZG9jcz15ZXMKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV94bWxfZG9jcyA9IHh5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgkaGF2ZV94bWx0byA9IHhubzsgdGhlbgorCUFDX01TR19FUlJPUihbQnVpbGRpbmcgWE1MIGRvY3MgZXhwbGljaXRseSByZXF1aXJlZCwgYnV0IHhtbHRvIG5vdCBmb3VuZF0pCisgICAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfWE1MX0RPQ1NfRU5BQkxFRCwgdGVzdCB4JGVuYWJsZV94bWxfZG9jcyA9IHh5ZXMpCitBQ19NU0dfUkVTVUxUKCRlbmFibGVfeG1sX2RvY3MpCisKK0FDX1BBVEhfUFJPRyhbTUFOMkhUTUxdLCBbbWFuMmh0bWxdKQorQUNfQVJHX1ZBUihbTUFOMkhUTUxdLCBbUGF0aCB0byBtYW4yaHRtbCAob3B0aW9uYWwpXSkKK0FNX0NPTkRJVElPTkFMKERCVVNfSEFWRV9NQU4ySFRNTCwgdGVzdCB4JE1BTjJIVE1MICE9IHgpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfQ0FOX1VQTE9BRF9ET0NTLAorICAgIHRlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geHllcyAtYSB4JGVuYWJsZV94bWxfZG9jcyA9IHh5ZXMgLWEgXAorICAgICAgICAgeCRNQU4ySFRNTCAhPSB4KQorCisjIyMjIEhhdmUgdG8gZ28gJGxvY2Fsc3RhdGVkaXItPiRwcmVmaXgvdmFyLT4vdXNyL2xvY2FsL3ZhcgorCisjIyMjIGZpbmQgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgJHByZWZpeCB0aGF0IHdlJ2xsIGVuZCB1cCB3aXRoCisjIyAgIChJIGtub3cgdGhpcyBpcyBicm9rZW4gYW5kIHNob3VsZCBiZSBkb25lIGluIHRoZSBNYWtlZmlsZSwgYnV0CisjIyAgICB0aGF0J3MgYSBtYWpvciBwYWluIGFuZCBhbG1vc3Qgbm9ib2R5IGFjdHVhbGx5IHNlZW1zIHRvIGNhcmUpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfUFJFRklYLCAiJHByZWZpeCIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfTE9DQUxTVEFURURJUiwgIiRsb2NhbHN0YXRlZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9TWVNDT05GRElSLCAiJHN5c2NvbmZkaXIiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX0JJTkRJUiwgIiRiaW5kaXIiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX0xJQkRJUiwgIiRsaWJkaXIiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX0xJQkVYRUNESVIsICIkbGliZXhlY2RpciIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfREFUQURJUiwgIiRkYXRhZGlyIikKKworIyMjIyBDaGVjayBvdXIgb3BlcmF0aW5nIHN5c3RlbQorb3BlcmF0aW5nX3N5c3RlbT11bmtub3duCitpZiB0ZXN0IC1mIC9ldGMvcmVkaGF0LXJlbGVhc2UgfHwgdGVzdCAtZiAkRVhQQU5ERURfU1lTQ09ORkRJUi9yZWRoYXQtcmVsZWFzZSA7IHRoZW4KKyAgIG9wZXJhdGluZ19zeXN0ZW09cmVkaGF0CitmaQorCitpZiB0ZXN0IC1mIC9ldGMvc2xhY2t3YXJlLXZlcnNpb24gfHwgdGVzdCAtZiAkRVhQQU5ERURfU1lTQ09ORkRJUi9zbGFja3dhcmUtdmVyc2lvbiA7IHRoZW4KKyAgIG9wZXJhdGluZ19zeXN0ZW09c2xhY2t3YXJlCitmaQorCitpZiB0ZXN0IC1mIC91c3IvYmluL2N5Z3dpbjEuZGxsIHx8IHRlc3QgLWYgJEVYUEFOREVEX0JJTkRJUi9jeWd3aW4xLmRsbCA7IHRoZW4KKyAgIG9wZXJhdGluZ19zeXN0ZW09Y3lnd2luCitmaQorCisjIyMjIFNvcnQgb3V0IGluaXQgc2NyaXB0cworCitpZiB0ZXN0IHgkd2l0aF9pbml0X3NjcmlwdHMgPSB4OyB0aGVuCisgICAgY2FzZSB4JG9wZXJhdGluZ19zeXN0ZW0gaW4KKyAgICAgICAgeHJlZGhhdCkJd2l0aF9pbml0X3NjcmlwdHM9cmVkaGF0IDs7CisgICAgICAgIHhzbGFja3dhcmUpCXdpdGhfaW5pdF9zY3JpcHRzPXNsYWNrd2FyZSA7OworICAgICAgICB4Y3lnd2luKQl3aXRoX2luaXRfc2NyaXB0cz1jeWd3aW4gOzsKKyAgICAgICAgKikJCQl3aXRoX2luaXRfc2NyaXB0cz1ub25lIDs7CisgICAgZXNhYworZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19JTklUX1NDUklQVFNfUkVEX0hBVCwgdGVzdCB4JHdpdGhfaW5pdF9zY3JpcHRzID0geHJlZGhhdCkKK0FNX0NPTkRJVElPTkFMKERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRSwgdGVzdCB4JHdpdGhfaW5pdF9zY3JpcHRzID0geHNsYWNrd2FyZSkKK0FNX0NPTkRJVElPTkFMKERCVVNfSU5JVF9TQ1JJUFRTX0NZR1dJTiwgdGVzdCB4JHdpdGhfaW5pdF9zY3JpcHRzID0geGN5Z3dpbikKKworIyMjIyMgc3lzdGVtZCB1bml0IGZpbGVzCitBQ19BUkdfV0lUSChbc3lzdGVtZHN5c3RlbXVuaXRkaXJdLAorQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW1kc3lzdGVtdW5pdGRpcj1ESVJdLCBbRGlyZWN0b3J5IGZvciBzeXN0ZW1kIHNlcnZpY2UgZmlsZXNdKSwKKyAgICAgICAgW10sIFt3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyPSQoJFBLR19DT05GSUcgLS12YXJpYWJsZT1zeXN0ZW1kc3lzdGVtdW5pdGRpciBzeXN0ZW1kKV0pCitpZiB0ZXN0ICJ4JHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIiICE9IHhubzsgdGhlbgorICAgQUNfU1VCU1QoW3N5c3RlbWRzeXN0ZW11bml0ZGlyXSwgWyR3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyXSkKK2ZpCitBTV9DT05ESVRJT05BTChIQVZFX1NZU1RFTUQsIFt0ZXN0IC1uICIkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgLWEgIngkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgIT0geG5vIF0pCisKKyMjIyMjIFNldCB1cCBsb2NhdGlvbiBmb3Igc3lzdGVtIGJ1cyBzb2NrZXQKK2lmICEgdGVzdCAteiAiJHdpdGhfc3lzdGVtX3NvY2tldCI7IHRoZW4KKyAgIERCVVNfU1lTVEVNX1NPQ0tFVD0kd2l0aF9zeXN0ZW1fc29ja2V0CitlbHNlCisgICBEQlVTX1NZU1RFTV9TT0NLRVQ9JHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfS9ydW4vZGJ1cy9zeXN0ZW1fYnVzX3NvY2tldAorZmkKKworQUNfU1VCU1QoREJVU19TWVNURU1fU09DS0VUKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfU1lTVEVNX1NPQ0tFVCwiJERCVVNfU1lTVEVNX1NPQ0tFVCIsW1RoZSBuYW1lIG9mIHRoZSBzb2NrZXQgdGhlIHN5c3RlbSBidXMgbGlzdGVucyBvbiBieSBkZWZhdWx0XSkKKworIyMgc3lzdGVtIGJ1cyBvbmx5IGxpc3RlbnMgb24gbG9jYWwgZG9tYWluIHNvY2tldHMsIGFuZCBuZXZlcgorIyMgb24gYW4gYWJzdHJhY3Qgc29ja2V0IChzbyBvbmx5IHJvb3QgY2FuIGNyZWF0ZSB0aGUgc29ja2V0KQorREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUz0idW5peDpwYXRoPSREQlVTX1NZU1RFTV9TT0NLRVQiCitBQ19TVUJTVChEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MsICIkREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyIsW1RoZSBkZWZhdWx0IEQtQnVzIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBidXNdKQorCisjIyMjIFNldCB1cCB0aGUgcGlkIGZpbGUKK2lmICEgdGVzdCAteiAiJHdpdGhfc3lzdGVtX3BpZF9maWxlIjsgdGhlbgorICAgREJVU19TWVNURU1fUElEX0ZJTEU9JHdpdGhfc3lzdGVtX3BpZF9maWxlCitlbGlmIHRlc3QgeCR3aXRoX2luaXRfc2NyaXB0cyA9IHhyZWRoYXQgOyB0aGVuCisgICBEQlVTX1NZU1RFTV9QSURfRklMRT0ke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9L3J1bi9tZXNzYWdlYnVzLnBpZAorZWxzZQorICAgREJVU19TWVNURU1fUElEX0ZJTEU9JHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfS9ydW4vZGJ1cy9waWQKK2ZpCisKK0FDX1NVQlNUKERCVVNfU1lTVEVNX1BJRF9GSUxFKQorCisjIyMjIERpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcnNoaXAKK2lmICEgdGVzdCAteiAiJHdpdGhfY29uc29sZV9hdXRoX2RpciI7IHRoZW4KKyAgIERCVVNfQ09OU09MRV9BVVRIX0RJUj0kd2l0aF9jb25zb2xlX2F1dGhfZGlyCitlbHNlCisgICBEQlVTX0NPTlNPTEVfQVVUSF9ESVI9L3Zhci9ydW4vY29uc29sZS8KK2ZpCisKK0FDX1NVQlNUKERCVVNfQ09OU09MRV9BVVRIX0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0NPTlNPTEVfQVVUSF9ESVIsICIkREJVU19DT05TT0xFX0FVVEhfRElSIiwgW0RpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcF0pCisKKyMjIyMgRmlsZSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcnNoaXAKK2lmIHRlc3QgeCRoYXZlX2NvbnNvbGVfb3duZXJfZmlsZSA9IHh5ZXM7IHRoZW4KKyAgIGlmICEgdGVzdCAteiAiJHdpdGhfY29uc29sZV9vd25lcl9maWxlIjsgdGhlbgorICAgICAgREJVU19DT05TT0xFX09XTkVSX0ZJTEU9JHdpdGhfY29uc29sZV9vd25lcl9maWxlCisgICBlbHNlCisgICAgICBEQlVTX0NPTlNPTEVfT1dORVJfRklMRT0vZGV2L2NvbnNvbGUKKyAgIGZpCitlbHNlCisgIERCVVNfQ09OU09MRV9PV05FUl9GSUxFPQorZmkKKworQUNfU1VCU1QoREJVU19DT05TT0xFX09XTkVSX0ZJTEUpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19DT05TT0xFX09XTkVSX0ZJTEUsICIkREJVU19DT05TT0xFX09XTkVSX0ZJTEUiLCBbRmlsZSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcF0pCisKKyMjIyMgVXNlciB0byBzdGFydCB0aGUgc3lzdGVtIGJ1cyBhcworaWYgdGVzdCAteiAiJHdpdGhfZGJ1c191c2VyIiA7IHRoZW4KKyAgICBEQlVTX1VTRVI9bWVzc2FnZWJ1cworZWxzZQorICAgIERCVVNfVVNFUj0kd2l0aF9kYnVzX3VzZXIKK2ZpCitBQ19TVUJTVChEQlVTX1VTRVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19VU0VSLCIkREJVU19VU0VSIiwgW1VzZXIgZm9yIHJ1bm5pbmcgdGhlIHN5c3RlbSBCVVMgZGFlbW9uXSkKKworIyMjIyBQcmVmaXggdG8gaW5zdGFsbCBpbnRvCitEQlVTX1BSRUZJWD0kRVhQQU5ERURfUFJFRklYCitBQ19TVUJTVChEQlVTX1BSRUZJWCkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1BSRUZJWCwiJERCVVNfUFJFRklYIiwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBEQlVTXSkKKworIyMjIyBEaXJlY290cnkgdG8gaW5zdGFsbCBkYXRhIGZpbGVzIGludG8KK0RCVVNfREFUQURJUj0kRVhQQU5ERURfREFUQURJUgorQUNfU1VCU1QoREJVU19EQVRBRElSKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfREFUQURJUiwiJERCVVNfREFUQURJUiIsIFtEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgREJVUyBkYXRhIGZpbGVzXSkKKworIyMjIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCBkYnVzLWRhZW1vbgoraWYgdGVzdCAteiAiJHdpdGhfZGJ1c19kYWVtb25kaXIiIDsgdGhlbgorICAgIERCVVNfREFFTU9ORElSPSRFWFBBTkRFRF9CSU5ESVIKK2Vsc2UKKyAgICBEQlVTX0RBRU1PTkRJUj0kd2l0aF9kYnVzX2RhZW1vbmRpcgorZmkKK0FDX1NVQlNUKERCVVNfREFFTU9ORElSKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfREFFTU9ORElSLCIkREJVU19EQUVNT05ESVIiLCBbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBEQlVTIGRhZW1vbl0pCisKKyMjIyMgRGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIG90aGVyIGJpbmFyaWVzCitEQlVTX0JJTkRJUj0iJEVYUEFOREVEX0JJTkRJUiIKK0FDX1NVQlNUKERCVVNfQklORElSKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfQklORElSLCIkREJVU19CSU5ESVIiLCBbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBiaW5hcmllc10pCisKKyMjIyMgRGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIGxpYmV4ZWMgYmluYXJpZXMKK0RCVVNfTElCRVhFQ0RJUj0iJEVYUEFOREVEX0xJQkVYRUNESVIiCitBQ19TVUJTVChEQlVTX0xJQkVYRUNESVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19MSUJFWEVDRElSLCIkREJVU19MSUJFWEVDRElSIiwgW0RpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgbGliZXhlYyBiaW5hcmllc10pCisKKyMjIyMgVGVsbCB0ZXN0cyB3aGVyZSB0byBmaW5kIGNlcnRhaW4gc3R1ZmYgaW4gYnVpbGRkaXIKKworREJVU19QV0Q9YHB3ZGAKKyMgVXNlZnVsIGluIGEgY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnQsIHdoZXJlIHRoZSB0ZXN0cyBhcmUgcnVuIG9uIHRoZSBob3N0IHN5c3RlbS4KK0FDX0FSR19XSVRIKGRidXMtdGVzdC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy10ZXN0LWRpcj1bZGlybmFtZV1dLFtwYXRoIHdoZXJlIHRoZSB0ZXN0cyB0b29scyBhcmUgYXZhaWxhYmxlXSksCisJCQkgICBEQlVTX1BXRD0kd2l0aHZhbCkKK0FDX0RFRlVOKFtURVNUX1BBVEhdLCBbCitURVNUXyQxPSR7REJVU19QV0R9L3Rlc3QvJDIKK0FDX0RFRklORV9VTlFVT1RFRChURVNUXyQxLCAiJFRFU1RfJDEiLAorICAgICAgICAgICAgICAgICAgIFtGdWxsIHBhdGggdG8gdGVzdCBmaWxlIHRlc3QvJDIgaW4gYnVpbGRkaXJdKQorQUNfU1VCU1QoVEVTVF8kMSkKK10pCitBQ19ERUZVTihbVEVTVF9QUk9HXSwgWworVEVTVF8kMT0ke0RCVVNfUFdEfS90ZXN0LyQyCitBQ19ERUZJTkVfVU5RVU9URUQoVEVTVF8kMSwgIiRURVNUXyQxJEVYRUVYVCIsCisgICAgICAgICAgICAgICAgICAgW0Z1bGwgcGF0aCB0byB0ZXN0IGZpbGUgdGVzdC8kMiBpbiBidWlsZGRpcl0pCitBQ19TVUJTVChURVNUXyQxKQorXSkKKworVEVTVF9QQVRIKFZBTElEX1NFUlZJQ0VfRElSLCBkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMpCitURVNUX1BBVEgoSU5WQUxJRF9TRVJWSUNFX0RJUiwgZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMpCitURVNUX1BBVEgoVkFMSURfU0VSVklDRV9TWVNURU1fRElSLCBkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtKQorVEVTVF9QQVRIKElOVkFMSURfU0VSVklDRV9TWVNURU1fRElSLCBkYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0pCitURVNUX1BST0coU0VSVklDRV9CSU5BUlksIHRlc3Qtc2VydmljZSkKK1RFU1RfUFJPRyhTSEVMTF9TRVJWSUNFX0JJTkFSWSwgdGVzdC1zaGVsbC1zZXJ2aWNlKQorVEVTVF9QUk9HKEVYSVRfQklOQVJZLCB0ZXN0LWV4aXQpCitURVNUX1BST0coU0VHRkFVTFRfQklOQVJZLCB0ZXN0LXNlZ2ZhdWx0KQorVEVTVF9QUk9HKFNMRUVQX0ZPUkVWRVJfQklOQVJZLCB0ZXN0LXNsZWVwLWZvcmV2ZXIpCitURVNUX1BST0coUFJJVlNFUlZFUl9CSU5BUlksIG5hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXIpCisKK0FDX0RFRklORV9VTlFVT1RFRChURVNUX0JVU19CSU5BUlksICIkREJVU19QV0QvYnVzL2RidXMtZGFlbW9uJEVYRUVYVCIsCisgICAgICAgICAgICAgICAgICAgW0Z1bGwgcGF0aCB0byB0aGUgZGFlbW9uIGluIHRoZSBidWlsZGRpcl0pCitBQ19TVUJTVChURVNUX0JVU19CSU5BUlkpCisKKyMjIEV4cG9ydCB0aGUgbm9uLXNldHVpZCBleHRlcm5hbCBoZWxwZXIKK1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlk9IiREQlVTX1BXRC9idXMvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0JEVYRUVYVCIKK0FDX1NVQlNUKFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19URVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZLCAiJFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkiLAorICAgICAgICAgICAgICAgICAgIFtGdWxsIHBhdGggdG8gdGhlIGxhdW5jaCBoZWxwZXIgdGVzdCBwcm9ncmFtIGluIHRoZSBidWlsZGRpcl0pCisKKyMjIyMgRmluZCBzb2NrZXQgZGlyZWN0b3JpZXMKK2lmICEgdGVzdCAteiAiJFRNUERJUiIgOyB0aGVuCisgICBERUZBVUxUX1NPQ0tFVF9ESVI9JFRNUERJUgorZWxpZiAhIHRlc3QgLXogIiRURU1QIiA7IHRoZW4KKyAgIERFRkFVTFRfU09DS0VUX0RJUj0kVEVNUAorZWxpZiAhIHRlc3QgLXogIiRUTVAiIDsgdGhlbgorICAgREVGQVVMVF9TT0NLRVRfRElSPSRUTVAKK2Vsc2UKKyAgIERFRkFVTFRfU09DS0VUX0RJUj0vdG1wCitmaQorCitERUZBVUxUX1NPQ0tFVF9ESVI9YGVjaG8gJERFRkFVTFRfU09DS0VUX0RJUiB8IHNlZCAncy8rLyUyQi9nJ2AKKworaWYgISB0ZXN0IC16ICIkd2l0aF90ZXN0X3NvY2tldF9kaXIiIDsgdGhlbgorICAgVEVTVF9TT0NLRVRfRElSPSIkd2l0aF90ZXN0X3NvY2tldF9kaXIiCitlbHNlCisgICBURVNUX1NPQ0tFVF9ESVI9JERFRkFVTFRfU09DS0VUX0RJUgorZmkKK0FDX1NVQlNUKFRFU1RfU09DS0VUX0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1RFU1RfU09DS0VUX0RJUiwgIiRURVNUX1NPQ0tFVF9ESVIiLCBbV2hlcmUgdG8gcHV0IHRlc3Qgc29ja2V0c10pCisKK2lmICEgdGVzdCAteiAiJHdpdGhfc2Vzc2lvbl9zb2NrZXRfZGlyIiA7IHRoZW4KKyAgIERCVVNfU0VTU0lPTl9TT0NLRVRfRElSPSIkd2l0aF9zZXNzaW9uX3NvY2tldF9kaXIiCitlbHNlCisgICBEQlVTX1NFU1NJT05fU09DS0VUX0RJUj0kREVGQVVMVF9TT0NLRVRfRElSCitmaQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfU0VTU0lPTl9TT0NLRVRfRElSLCAiJERCVVNfU0VTU0lPTl9TT0NLRVRfRElSIiwgW1doZXJlIHBlci1zZXNzaW9uIGJ1cyBwdXRzIGl0cyBzb2NrZXRzXSkKK0FDX1NVQlNUKERCVVNfU0VTU0lPTl9TT0NLRVRfRElSKQorCitpZiB0ZXN0IHgkZGJ1c193aW4gPSB4eWVzOyB0aGVuCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTPSJub25jZS10Y3A6IgorZWxpZiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllczsgdGhlbgorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUz0ibGF1bmNoZDplbnY9REJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCIKK2Vsc2UKKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1M9InVuaXg6dG1wZGlyPSREQlVTX1NFU1NJT05fU09DS0VUX0RJUiIKK2ZpCitBQ19TVUJTVChEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUykKKworIyBkYXJ3aW4gbmVlZHMgdGhpcyB0byBpbml0aWFsaXplIHRoZSBlbnZpcm9ubWVudAorQUNfQ0hFQ0tfSEVBREVSUyhjcnRfZXh0ZXJucy5oKQorQUNfQ0hFQ0tfRlVOQyhfTlNHZXRFbnZpcm9uLCBbQUNfREVGSU5FKEhBVkVfTlNHRVRFTlZJUk9OLCAxLCBbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIG5lZWRzIF9OU0dldEVudmlyb24gdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudF0pXSkKK0FIX1ZFUkJBVElNKF9EQVJXSU5fRU5WSVJPTiwKK1sKKyNpZiBkZWZpbmVkKEhBVkVfTlNHRVRFTlZJUk9OKSAmJiBkZWZpbmVkKEhBVkVfQ1JUX0VYVEVSTlNfSCkKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisjZW5kaWYKK10pCisKK0FDX0NPTkZJR19GSUxFUyhbCitEb3h5ZmlsZQorZGJ1cy92ZXJzaW9uaW5mby5yYworZGJ1cy9kYnVzLWFyY2gtZGVwcy5oCitidXMvc3lzdGVtLmNvbmYKK2J1cy9zZXNzaW9uLmNvbmYKK2J1cy9tZXNzYWdlYnVzCitidXMvbWVzc2FnZWJ1cy1jb25maWcKK2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CitidXMvcmMubWVzc2FnZWJ1cworYnVzL2RidXMuc2VydmljZQorYnVzL2RidXMuc29ja2V0CitNYWtlZmlsZQorZGJ1cy9NYWtlZmlsZQorYnVzL01ha2VmaWxlCit0b29scy9NYWtlZmlsZQordGVzdC9NYWtlZmlsZQordGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUKK2RvYy9NYWtlZmlsZQorZG9jL2RidXMtZGFlbW9uLjEKK2RidXMtMS5wYworZGJ1cy0xLXVuaW5zdGFsbGVkLnBjCit0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mCit0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYKK3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYKK3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1mYWlsLmNvbmYKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlCit0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZQordGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UKK3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlCit0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZQordGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyLnNlcnZpY2UKK3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlCitdKQorQUNfT1VUUFVUCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZWNobyAiCisgICAgICAgICAgICAgICAgICAgIEQtQnVzICRWRVJTSU9OCisgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PQorCisJcHJlZml4OiAgICAgICAgICAgICAgICAgICAke0VYUEFOREVEX1BSRUZJWH0KKwlleGVjX3ByZWZpeDogICAgICAgICAgICAgICR7ZXhlY19wcmVmaXh9CisgICAgICAgIGxpYmRpcjogICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9MSUJESVJ9CisgICAgICAgIGxpYmV4ZWNkaXI6ICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9MSUJFWEVDRElSfQorICAgICAgICBiaW5kaXI6ICAgICAgICAgICAgICAgICAgICR7RVhQQU5ERURfQklORElSfQorICAgICAgICBzeXNjb25mZGlyOiAgICAgICAgICAgICAgICR7RVhQQU5ERURfU1lTQ09ORkRJUn0KKyAgICAgICAgbG9jYWxzdGF0ZWRpcjogICAgICAgICAgICAke0VYUEFOREVEX0xPQ0FMU1RBVEVESVJ9CisJZGF0YWRpcjogICAgICAgICAgICAgICAgICAke0VYUEFOREVEX0RBVEFESVJ9CisJc291cmNlIGNvZGUgbG9jYXRpb246CSAgJHtzcmNkaXJ9CisJY29tcGlsZXI6CQkgICR7Q0N9CisJY2ZsYWdzOgkJICAgICAgICAgICR7Q0ZMQUdTfQorCWNwcGZsYWdzOgkJICAke0NQUEZMQUdTfQorCWN4eGZsYWdzOgkJICAke0NYWEZMQUdTfQorCTY0LWJpdCBpbnQ6CQkgICR7REJVU19JTlQ2NF9UWVBFfQorCTMyLWJpdCBpbnQ6CQkgICR7REJVU19JTlQzMl9UWVBFfQorCTE2LWJpdCBpbnQ6CQkgICR7REJVU19JTlQxNl9UWVBFfQorICAgICAgICBEb3h5Z2VuOiAgICAgICAgICAgICAgICAgICR7RE9YWUdFTjotbm90IGZvdW5kfQorICAgICAgICB4bWx0bzogICAgICAgICAgICAgICAgICAgICR7WE1MVE86LW5vdCBmb3VuZH0KKyAgICAgICAgbWFuMmh0bWw6ICAgICAgICAgICAgICAgICAke01BTjJIVE1MOi1ub3QgZm91bmR9IgorCitlY2hvICIKKyAgICAgICAgTWFpbnRhaW5lciBtb2RlOiAgICAgICAgICAke1VTRV9NQUlOVEFJTkVSX01PREV9CisgICAgICAgIGdjYyBjb3ZlcmFnZSBwcm9maWxpbmc6ICAgJHtlbmFibGVfY29tcGlsZXJfY292ZXJhZ2V9CisgICAgICAgIEJ1aWxkaW5nIHVuaXQgdGVzdHM6ICAgICAgJHtlbmFibGVfdGVzdHN9CisgICAgICAgIEJ1aWxkaW5nIHZlcmJvc2UgbW9kZTogICAgJHtlbmFibGVfdmVyYm9zZV9tb2RlfQorICAgICAgICBCdWlsZGluZyBhc3NlcnRpb25zOiAgICAgICR7ZW5hYmxlX2Fzc2VydHN9CisgICAgICAgIEJ1aWxkaW5nIGNoZWNrczogICAgICAgICAgJHtlbmFibGVfY2hlY2tzfQorICAgICAgICBCdWlsZGluZyBTRUxpbnV4IHN1cHBvcnQ6ICR7aGF2ZV9zZWxpbnV4fQorICAgICAgICBCdWlsZGluZyBpbm90aWZ5IHN1cHBvcnQ6ICR7aGF2ZV9pbm90aWZ5fQorICAgICAgICBCdWlsZGluZyBkbm90aWZ5IHN1cHBvcnQ6ICR7aGF2ZV9kbm90aWZ5fQorICAgICAgICBCdWlsZGluZyBrcXVldWUgc3VwcG9ydDogICR7aGF2ZV9rcXVldWV9CisgICAgICAgIEJ1aWxkaW5nIFgxMSBjb2RlOiAgICAgICAgJHtlbmFibGVfeDExfQorICAgICAgICBCdWlsZGluZyBEb3h5Z2VuIGRvY3M6ICAgICR7ZW5hYmxlX2RveHlnZW5fZG9jc30KKyAgICAgICAgQnVpbGRpbmcgWE1MIGRvY3M6ICAgICAgICAke2VuYWJsZV94bWxfZG9jc30KKyAgICAgICAgQnVpbGRpbmcgY2FjaGUgc3VwcG9ydDogICAke2VuYWJsZV91c2VyZGJfY2FjaGV9CisgICAgICAgIEJ1aWxkaW5nIGxhdW5jaGQgc3VwcG9ydDogJHtoYXZlX2xhdW5jaGR9CisgICAgICAgIFVzaW5nIFhNTCBwYXJzZXI6ICAgICAgICAgJHt3aXRoX3htbH0KKyAgICAgICAgSW5pdCBzY3JpcHRzIHN0eWxlOiAgICAgICAke3dpdGhfaW5pdF9zY3JpcHRzfQorICAgICAgICBBYnN0cmFjdCBzb2NrZXQgbmFtZXM6ICAgICR7YWNfY3ZfaGF2ZV9hYnN0cmFjdF9zb2NrZXRzfQorICAgICAgICBTeXN0ZW0gYnVzIHNvY2tldDogICAgICAgICR7REJVU19TWVNURU1fU09DS0VUfQorICAgICAgICBTeXN0ZW0gYnVzIGFkZHJlc3M6ICAgICAgICR7REJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU30KKyAgICAgICAgU3lzdGVtIGJ1cyBQSUQgZmlsZTogICAgICAke0RCVVNfU1lTVEVNX1BJRF9GSUxFfQorICAgICAgICBTZXNzaW9uIGJ1cyBhZGRyZXNzOiAgICAgICR7REJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1N9CisgICAgICAgIENvbnNvbGUgYXV0aCBkaXI6ICAgICAgICAgJHtEQlVTX0NPTlNPTEVfQVVUSF9ESVJ9CisgICAgICAgIENvbnNvbGUgb3duZXIgZmlsZTogICAgICAgJHtoYXZlX2NvbnNvbGVfb3duZXJfZmlsZX0KKyAgICAgICAgQ29uc29sZSBvd25lciBmaWxlIHBhdGg6ICAke0RCVVNfQ09OU09MRV9PV05FUl9GSUxFfQorCVN5c3RlbSBidXMgdXNlcjogICAgICAgICAgJHtEQlVTX1VTRVJ9CisJU2Vzc2lvbiBidXMgc2VydmljZXMgZGlyOiAke0VYUEFOREVEX0RBVEFESVJ9L2RidXMtMS9zZXJ2aWNlcworICAgICAgICAnbWFrZSBjaGVjaycgc29ja2V0IGRpcjogICR7VEVTVF9TT0NLRVRfRElSfQorIgoraWYgdGVzdCB4JGhhdmVfbGF1bmNoZCA9IHh5ZXM7IHRoZW4KKyAgICAgICAgZWNobyAiICAgICAgICBsYXVuY2hkIGFnZW50IGRpcjogICAgICAgICR7TEFVTkNIRF9BR0VOVF9ESVJ9IgorZmkKK2VjaG8KKworaWYgdGVzdCB4JGVuYWJsZV90ZXN0cyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgZWNobyAiTk9URTogYnVpbGRpbmcgd2l0aCB1bml0IHRlc3RzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgYW5kIHJlbmRlcnMgaXQgaW5zZWN1cmUuIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfdGVzdHMgPSB4eWVzIC1hIHgkZW5hYmxlX2Fzc2VydHMgPSB4bm87IHRoZW4KKyAgICAgICAgZWNobyAiTk9URTogYnVpbGRpbmcgd2l0aCB1bml0IHRlc3RzIGJ1dCB3aXRob3V0IGFzc2VydGlvbnMgbWVhbnMgdGVzdHMgbWF5IG5vdCBwcm9wZXJseSByZXBvcnQgZmFpbHVyZXMgKHRoaXMgY29uZmlndXJhdGlvbiBpcyBvbmx5IHVzZWZ1bCB3aGVuIGRvaW5nIHNvbWV0aGluZyBsaWtlIHByb2ZpbGluZyB0aGUgdGVzdHMpIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfY29tcGlsZXJfY292ZXJhZ2UgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggY292ZXJhZ2UgcHJvZmlsaW5nIGlzIGRlZmluaXRlbHkgZm9yIGRldmVsb3BlcnMgb25seS4iCitmaQoraWYgdGVzdCB4JGVuYWJsZV92ZXJib3NlX21vZGUgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggdmVyYm9zZSBtb2RlIGluY3JlYXNlcyBsaWJyYXJ5IHNpemUsIG1heSBzbGlnaHRseSBpbmNyZWFzZSBzZWN1cml0eSByaXNrLCBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX2Fzc2VydHMgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggYXNzZXJ0aW9ucyBpbmNyZWFzZXMgbGlicmFyeSBzaXplIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfY2hlY2tzID0geG5vOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGhvdXQgY2hlY2tzIGZvciBhcmd1bWVudHMgcGFzc2VkIHRvIHB1YmxpYyBBUEkgbWFrZXMgaXQgaGFyZGVyIHRvIGRlYnVnIGFwcHMgdXNpbmcgRC1CdXMsIGJ1dCB3aWxsIHNsaWdodGx5IGRlY3JlYXNlIEQtQnVzIGxpYnJhcnkgc2l6ZSBhbmQgX3ZlcnlfIHNsaWdodGx5IGltcHJvdmUgcGVyZm9ybWFuY2UuIgorZmkKK2lmIHRlc3QgeCRkYnVzX3VzZV9saWJ4bWwgPSB4dHJ1ZTsgdGhlbgorICAgICAgICBlY2hvCisJZWNobyAiV0FSTklORzogWW91IGhhdmUgY2hvc2VuIHRvIHVzZSBsaWJ4bWwgYXMgeW91ciB4bWwgcGFyc2VyIGhvd2V2ZXIgdGhpcyBjb2RlIHBhdGggaXMgbm90IG1haW50YWluZWQgYnkgdGhlIEQtQnVzIGRldmVsb3BlcnMgYW5kIGlmIGl0IGJyZWFrcyB5b3UgZ2V0IHRvIGtlZXAgdGhlIHBpZWNlcy4gIElmIHlvdSBoYXZlIHNlbGVjdGVkIHRoaXMgb3B0aW9uIGluIGVyciBwbGVhc2UgcmVjb25maWd1cmUgd2l0aCBleHBhdCAoZS5nLiAtLXdpdGgteG1sPWV4cGF0KS4iCitmaQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy0xLXVuaW5zdGFsbGVkLnBjLmluIGIvZGJ1cy0xLjQuMTAvZGJ1cy0xLXVuaW5zdGFsbGVkLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjIyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzLTEtdW5pbnN0YWxsZWQucGMuaW4KQEAgLTAsMCArMSwxNyBAQAorYWJzX3RvcF9idWlsZGRpcj1AYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyPUBhYnNfdG9wX3NyY2RpckAKK3ByZWZpeD0KK2V4ZWNfcHJlZml4PQorc3lzdGVtX2J1c19kZWZhdWx0X2FkZHJlc3M9QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitzeXNjb25mZGlyPUBFWFBBTkRFRF9TWVNDT05GRElSQAorc2Vzc2lvbl9idXNfc2VydmljZXNfZGlyPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc2VydmljZXMKK3N5c3RlbV9idXNfc2VydmljZXNfZGlyPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzCitpbnRlcmZhY2VzX2Rpcj1ARVhQQU5ERURfREFUQURJUkAvZGJ1cy0xL2ludGVyZmFjZXMKK2RhZW1vbmRpcj1AREJVU19EQUVNT05ESVJACisKK05hbWU6IGRidXMKK0Rlc2NyaXB0aW9uOiBGcmVlIGRlc2t0b3AgbWVzc2FnZSBidXMgKHVuaW5zdGFsbGVkIGNvcHkpCitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6ICR7YWJzX3RvcF9idWlsZGRpcn0vZGJ1cy9saWJkYnVzLTEubGEKK0xpYnMucHJpdmF0ZTogQERCVVNfQ0xJRU5UX0xJQlNACitDZmxhZ3M6IC1JJHthYnNfdG9wX3NyY2Rpcn0KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMtMS5wYy5pbiBiL2RidXMtMS40LjEwL2RidXMtMS5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2U2M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy0xLnBjLmluCkBAIC0wLDAgKzEsMTYgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorc3lzdGVtX2J1c19kZWZhdWx0X2FkZHJlc3M9QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitzeXNjb25mZGlyPUBFWFBBTkRFRF9TWVNDT05GRElSQAorc2Vzc2lvbl9idXNfc2VydmljZXNfZGlyPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc2VydmljZXMKK3N5c3RlbV9idXNfc2VydmljZXNfZGlyPUBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzCitpbnRlcmZhY2VzX2Rpcj1ARVhQQU5ERURfREFUQURJUkAvZGJ1cy0xL2ludGVyZmFjZXMKK2RhZW1vbmRpcj1AREJVU19EQUVNT05ESVJACisKK05hbWU6IGRidXMKK0Rlc2NyaXB0aW9uOiBGcmVlIGRlc2t0b3AgbWVzc2FnZSBidXMKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxkYnVzLTEgQERCVVNfQ0xJRU5UX0xJQlNACitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS9kYnVzLTEuMCAtSSR7bGliZGlyfS9kYnVzLTEuMC9pbmNsdWRlCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL01ha2VmaWxlLmFtIGIvZGJ1cy0xLjQuMTAvZGJ1cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTZjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5OCBAQAorCitjb25maWdkaXI9JChzeXNjb25mZGlyKS9kYnVzLTEKKworSU5DTFVERVMgPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19DTElFTlRfQ0ZMQUdTKSBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwktRERCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIiJChsb2NhbHN0YXRlZGlyKS9saWIvZGJ1cy9tYWNoaW5lLWlkIlwiIFwKKwktRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiIiQoY29uZmlnZGlyKS9zeXN0ZW0uY29uZiJcIiBcCisJLUREQlVTX1NFU1NJT05fQ09ORklHX0ZJTEU9XCIiJChjb25maWdkaXIpL3Nlc3Npb24uY29uZiJcIgorCitkYnVzaW5jbHVkZWRpcj0kKGluY2x1ZGVkaXIpL2RidXMtMS4wL2RidXMKK2RidXNhcmNoaW5jbHVkZWRpcj0kKGxpYmRpcikvZGJ1cy0xLjAvaW5jbHVkZS9kYnVzCisKK2xpYl9MVExJQlJBUklFUz1saWJkYnVzLTEubGEKKworIworIyBEZWFsIHdpdGggVzMyIC5kZWYgYW5kIHZlcnNpb24taW5mby5yYyBzdHVmZgorIworaWYgREJVU19XSU4KKworU1VGRklYRVMgPSByYworCisucmMubzoKKwkkKFdJTkRSRVMpICQ8IC1vICRACisKK2RidXNfcmVzID0gdmVyc2lvbmluZm8ubworZGJ1c19yZXNfbGRmbGFnID0gLVdsLCQoZGJ1c19yZXMpCitub191bmRlZmluZWQgPSAtbm8tdW5kZWZpbmVkCitleHBvcnRfc3ltYm9scyA9CitleHBvcnRfc3ltdm9sc19pbnRlcm5hbCA9CisKK2xpYmRidXNfMV9sYV9ERVBFTkRFTkNJRVMgPSAkKGRidXNfcmVzKQoraW50bGxpYnMgPQorCitlbHNlCitkYnVzX3JlcyA9CitkYnVzX3Jlc19sZGZsYWcgPQorbm9fdW5kZWZpbmVkID0KKyMjIGRvbid0IGV4cG9ydCBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCAiXyIgKHdlIHVzZSB0aGlzCisjIyBjb252ZW50aW9uIGZvciBpbnRlcm5hbCBzeW1ib2xzKQorZXhwb3J0X3N5bWJvbHMgPSAtZXhwb3J0LXN5bWJvbHMtcmVnZXggIl5bXl9dLioiCitleHBvcnRfc3ltYm9sc19pbnRlcm5hbCA9CisKK2ludGxsaWJzID0gQExUTElCSU5UTEAKKworZW5kaWYKKworCisjCisjIFBsYXRmb3JtLWRlcGVuZGVudCBzb3VyY2VzOgorIworaWYgREJVU19XSU4KK0RCVVNfTElCX2FyY2hfc291cmNlcyA9IAkJCVwKKwlkYnVzLXNlcnZlci13aW4uYyAJCQlcCisJZGJ1cy1zZXJ2ZXItd2luLmgKKworaWYgREJVU19XSU5DRQord2luY2Vfc291cmNlID0gZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCBkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCitlbHNlCit3aW5jZV9zb3VyY2UgPQorZW5kaWYKKworREJVU19TSEFSRURfYXJjaF9zb3VyY2VzID0gCQkJXAorCSQod2luY2Vfc291cmNlKQkJCQlcCisJZGJ1cy1maWxlLXdpbi5jIAkJCVwKKwlkYnVzLXBpcGUtd2luLmMgCQkJXAorCWRidXMtc29ja2V0cy13aW4uaAkJCVwKKwlkYnVzLXN5c2RlcHMtd2luLmMgCQkJXAorCWRidXMtc3lzZGVwcy13aW4uaAkJCVwKKwlkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCQlcCisJZGJ1cy10cmFuc3BvcnQtd2luLmMJCQlcCisJZGJ1cy10cmFuc3BvcnQtd2luLmgKKworREJVU19VVElMX2FyY2hfc291cmNlcyA9CQkJXAorCWRidXMtc3lzZGVwcy11dGlsLXdpbi5jCQkJXAorCWRidXMtc3Bhd24td2luLmMKK2Vsc2UKKworaWYgREJVU19FTkFCTEVfTEFVTkNIRAorbGF1bmNoZF9zb3VyY2UgPSBkYnVzLXNlcnZlci1sYXVuY2hkLmggZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCitlbHNlCitsYXVuY2hkX3NvdXJjZSA9CitlbmRpZgorCitEQlVTX0xJQl9hcmNoX3NvdXJjZXMgPSAJCQlcCisJZGJ1cy11dWlkZ2VuLmMJCQkJXAorCWRidXMtdXVpZGdlbi5oCQkJCVwKKwlkYnVzLXNlcnZlci11bml4LmMgCQkJXAorCWRidXMtc2VydmVyLXVuaXguaAorCitEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMgPSAJCQlcCisJJChsYXVuY2hkX3NvdXJjZSkJCQlcCisJZGJ1cy1maWxlLXVuaXguYyAJCQlcCisJZGJ1cy1waXBlLXVuaXguYyAJCQlcCisJZGJ1cy1zeXNkZXBzLXVuaXguYyAJCQlcCisJZGJ1cy1zeXNkZXBzLXVuaXguaAkJCVwKKwlkYnVzLXN5c2RlcHMtcHRocmVhZC5jCQkJXAorCWRidXMtdHJhbnNwb3J0LXVuaXguYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC11bml4LmgJCQlcCisJZGJ1cy11c2VyZGIuYwkJCQlcCisJZGJ1cy11c2VyZGIuaCAJCQkJXAorCXNkLWRhZW1vbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc2QtZGFlbW9uLmgKKworREJVU19VVElMX2FyY2hfc291cmNlcyA9IAkJCVwKKwlkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMJCVwKKwlkYnVzLXVzZXJkYi11dGlsLmMJCQlcCisJZGJ1cy1zcGF3bi5jCitlbmRpZgorCitkYnVzaW5jbHVkZV9IRUFERVJTPQkJCQlcCisJZGJ1cy5oCQkJCQlcCisJZGJ1cy1hZGRyZXNzLmgJCQkJXAorCWRidXMtYnVzLmgJCQkJXAorCWRidXMtY29ubmVjdGlvbi5oCQkJXAorCWRidXMtZXJyb3JzLmgJCQkJXAorCWRidXMtbWFjcm9zLmgJCQkJXAorCWRidXMtbWVtb3J5LmgJCQkJXAorCWRidXMtbWVzc2FnZS5oCQkJCVwKKwlkYnVzLW1pc2MuaAkJCQlcCisJZGJ1cy1wZW5kaW5nLWNhbGwuaAkJCVwKKwlkYnVzLXByb3RvY29sLmgJCQkJXAorCWRidXMtc2VydmVyLmgJCQkJXAorCWRidXMtc2hhcmVkLmgJCQkJXAorCWRidXMtc2lnbmF0dXJlLmgJCQlcCisJZGJ1cy10aHJlYWRzLmgJCQkJXAorCWRidXMtdHlwZXMuaAorCisKK25vZGlzdF9kYnVzYXJjaGluY2x1ZGVfSEVBREVSUz0JCQlcCisJZGJ1cy1hcmNoLWRlcHMuaAorCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBhbmQgaXMgc3BlY2lmaWMgdG8gbGlicmFyeSBmdW5jdGlvbmFsaXR5CitEQlVTX0xJQl9TT1VSQ0VTPQkJCQlcCisJZGJ1cy1hZGRyZXNzLmMJCQkJXAorCWRidXMtYXV0aC5jCQkJCVwKKwlkYnVzLWF1dGguaAkJCQlcCisJZGJ1cy1hdXRoLXNjcmlwdC5jCQkJXAorCWRidXMtYXV0aC1zY3JpcHQuaAkJCVwKKwlkYnVzLWJ1cy5jCQkJCVwKKwlkYnVzLWNvbm5lY3Rpb24uYwkJCVwKKwlkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaAkJXAorCWRidXMtY3JlZGVudGlhbHMuYwkJCVwKKwlkYnVzLWNyZWRlbnRpYWxzLmgJCQlcCisJZGJ1cy1lcnJvcnMuYwkJCQlcCisJZGJ1cy1rZXlyaW5nLmMJCQkJXAorCWRidXMta2V5cmluZy5oCQkJCVwKKwlkYnVzLW1hcnNoYWwtaGVhZGVyLmMJCQlcCisJZGJ1cy1tYXJzaGFsLWhlYWRlci5oCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC5jCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC5oCQkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYwkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaAkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS5jCQkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS5oCQkJXAorCWRidXMtbWVzc2FnZS5jCQkJCVwKKwlkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaAkJCVwKKwlkYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oCQkJXAorCWRidXMtbWlzYy5jCQkJCVwKKwlkYnVzLW5vbmNlLmgJCQkJXAorCWRidXMtbm9uY2UuYwkJCQlcCisJZGJ1cy1vYmplY3QtdHJlZS5jCQkJXAorCWRidXMtb2JqZWN0LXRyZWUuaAkJCVwKKwlkYnVzLXBlbmRpbmctY2FsbC5jCQkJXAorCWRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgJCVwKKwlkYnVzLXJlc291cmNlcy5jCQkJXAorCWRidXMtcmVzb3VyY2VzLmgJCQlcCisJZGJ1cy1zZXJ2ZXIuYwkJCQlcCisJZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCQlcCisJZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oCQlcCisJZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgJCQlcCisJZGJ1cy1zZXJ2ZXItc29ja2V0LmMJCQlcCisJZGJ1cy1zZXJ2ZXItc29ja2V0LmgJCQlcCisJJChEQlVTX0xJQl9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zaGEuYwkJCQlcCisJZGJ1cy1zaGEuaAkJCQlcCisJZGJ1cy1zaWduYXR1cmUuYwkJCVwKKwlkYnVzLXRpbWVvdXQuYwkJCQlcCisJZGJ1cy10aW1lb3V0LmgJCQkJXAorCWRidXMtdGhyZWFkcy1pbnRlcm5hbC5oCQkJXAorCWRidXMtdGhyZWFkcy5jCQkJCVwKKwlkYnVzLXRyYW5zcG9ydC5jCQkJXAorCWRidXMtdHJhbnNwb3J0LmgJCQlcCisJZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgJCVwKKwlkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaAkJCVwKKwlkYnVzLXdhdGNoLmMJCQkJXAorCWRidXMtd2F0Y2guaAorCisjIwlkYnVzLW1kNS5jCQkJCVwKKyMjCWRidXMtbWQ1LmgJCQkJXAorCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBBTkQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZCBieSB0aGUKKyMjIyBkYWVtb24gb3IgdGVzdCBwcm9ncmFtcyAoYWxsIHN5bWJvbHMgaW4gaGVyZSBzaG91bGQKKyMjIyBiZSB1bmRlcnNjb3JlLXByZWZpeGVkKQorREJVU19TSEFSRURfU09VUkNFUz0JCQkJXAorCWRidXMtZGF0YXNsb3QuYwkJCQlcCisJZGJ1cy1kYXRhc2xvdC5oCQkJCVwKKwlkYnVzLWZpbGUuYyAgICAgICAgICAgICAgICAgXAorCWRidXMtZmlsZS5oICAgICAgICAgICAgICAgICBcCisJZGJ1cy1oYXNoLmMJCQkJXAorCWRidXMtaGFzaC5oCQkJCVwKKwlkYnVzLWludGVybmFscy5jCQkJXAorCWRidXMtaW50ZXJuYWxzLmgJCQlcCisJZGJ1cy1saXN0LmMJCQkJXAorCWRidXMtbGlzdC5oCQkJCVwKKwlkYnVzLW1hcnNoYWwtYmFzaWMuYwkJCVwKKwlkYnVzLW1hcnNoYWwtYmFzaWMuaAkJCVwKKwlkYnVzLW1lbW9yeS5jCQkJCVwKKwlkYnVzLW1lbXBvb2wuYwkJCQlcCisJZGJ1cy1tZW1wb29sLmgJCQkJXAorCWRidXMtcGlwZS5jICAgICAgICAgICAgICAgICBcCisJZGJ1cy1waXBlLmggICAgICAgICAgICAgICAgIFwKKwlkYnVzLXN0cmluZy5jCQkJCVwKKwlkYnVzLXN0cmluZy5oCQkJCVwKKwlkYnVzLXN0cmluZy1wcml2YXRlLmgJCQlcCisJJChEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zeXNkZXBzLmMJCQkJXAorCWRidXMtc3lzZGVwcy5oCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGlzIGdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IHVzZWQKKyMjIyBieSB0aGUgYnVzIGRhZW1vbiBvciB0ZXN0IGFwcHMsIGJ1dCBpcyBOT1QgaW5jbHVkZWQKKyMjIyBpbiB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgKGFsbCBzeW1ib2xzIGluIGhlcmUKKyMjIyBzaG91bGQgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCBidXQgZG9uJ3QgcmVhbGx5IG5lZWQKKyMjIyB0byBiZSB1bmxlc3MgdGhleSBtb3ZlIHRvIERCVVNfU0hBUkVEX1NPVVJDRVMgbGF0ZXIpCitEQlVTX1VUSUxfU09VUkNFUz0JCQkJXAorCWRidXMtYXV0aC11dGlsLmMJCQlcCisJZGJ1cy1jcmVkZW50aWFscy11dGlsLmMJCQlcCisJZGJ1cy1tYWlubG9vcC5jCQkJCVwKKwlkYnVzLW1haW5sb29wLmgJCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMJCVwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYwkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMJCVwKKwlkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCQkJXAorCWRidXMtbWVzc2FnZS1mYWN0b3J5LmgJCQlcCisJZGJ1cy1tZXNzYWdlLXV0aWwuYwkJCVwKKwlkYnVzLXNoZWxsLmMJCQkJXAorCWRidXMtc2hlbGwuaAkJCQlcCisJJChEQlVTX1VUSUxfYXJjaF9zb3VyY2VzKQkJXAorCWRidXMtc3Bhd24uaAkJCQlcCisJZGJ1cy1zdHJpbmctdXRpbC5jCQkJXAorCWRidXMtc3lzZGVwcy11dGlsLmMJCQlcCisJZGJ1cy10ZXN0LmMJCQkJXAorCWRidXMtdGVzdC5oCisKK2xpYmRidXNfMV9sYV9TT1VSQ0VTPQkJCQlcCisJJChEQlVTX0xJQl9TT1VSQ0VTKQkJCVwKKwkkKERCVVNfU0hBUkVEX1NPVVJDRVMpCisKK2xpYmRidXNfaW50ZXJuYWxfbGFfU09VUkNFUz0JCQlcCisJJChEQlVTX0xJQl9TT1VSQ0VTKQkJCVwKKwkkKERCVVNfU0hBUkVEX1NPVVJDRVMpCQkJXAorCSQoREJVU19VVElMX1NPVVJDRVMpCisKK0JVSUxUX1NPVVJDRVM9JChub2Rpc3RfZGJ1c2FyY2hpbmNsdWRlX0hFQURFUlMpCitFWFRSQV9ESVNUPWRidXMtYXJjaC1kZXBzLmguaW4KKworIyMgdGhpcyBsaWJyYXJ5IGlzIHRoZSBzYW1lIGFzIGxpYmRidXMsIGJ1dCBleHBvcnRzIGFsbCB0aGUgc3ltYm9scworIyMgYW5kIGlzIG9ubHkgdXNlZCBmb3Igc3RhdGljIGxpbmtpbmcgd2l0aGluIHRoZSBkYnVzIHBhY2thZ2UuCitub2luc3RfTFRMSUJSQVJJRVM9bGliZGJ1cy1pbnRlcm5hbC5sYQorCitsaWJkYnVzXzFfbGFfQ1BQRkxBR1M9IC1EZGJ1c18xX0VYUE9SVFMKK2xpYmRidXNfMV9sYV9MSUJBREQ9ICQoREJVU19DTElFTlRfTElCUykKK2xpYmRidXNfMV9sYV9MREZMQUdTPSAkKGV4cG9ydF9zeW1ib2xzKSAtdmVyc2lvbi1pbmZvICQoTFRfQ1VSUkVOVCk6JChMVF9SRVZJU0lPTik6JChMVF9BR0UpIC1uby11bmRlZmluZWQgQFJfRFlOQU1JQ19MREZMQUdACisKK2xpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MgPSAtRERCVVNfU1RBVElDX0JVSUxECitsaWJkYnVzX2ludGVybmFsX2xhX0xJQkFERD0kKERCVVNfQ0xJRU5UX0xJQlMpCitsaWJkYnVzX2ludGVybmFsX2xhX0xERkxBR1M9JChleHBvcnRfc3ltYm9sc19pbnRlcm5hbCkgQFJfRFlOQU1JQ19MREZMQUdACisKKyMjIG5vdGUgdGhhdCBURVNUUyBoYXMgc3BlY2lhbCBtZWFuaW5nIChzdHVmZiB0byB1c2UgaW4gbWFrZSBjaGVjaykKKyMjIHNvIGlmIGFkZGluZyB0ZXN0cyBub3QgdG8gYmUgcnVuIGluIG1ha2UgY2hlY2ssIGRvbid0IGFkZCB0aGVtIHRvCisjIyBURVNUUworaWYgREJVU19CVUlMRF9URVNUUworVEVTVFNfRU5WSVJPTk1FTlQ9REJVU19URVNUX0RBVEE9JCh0b3BfYnVpbGRkaXIpL3Rlc3QvZGF0YSBEQlVTX1RFU1RfSE9NRURJUj0kKHRvcF9idWlsZGRpcikvZGJ1cworVEVTVFM9ZGJ1cy10ZXN0CitlbHNlCitURVNUUz0KK2VuZGlmCisKKyMjIHdlIHVzZSBub2luc3RfUFJPR1JBTVMgbm90IGNoZWNrX1BST0dSQU1TIHNvIHRoYXQgd2UgYnVpbGQKKyMjIGV2ZW4gd2hlbiBub3QgZG9pbmcgIm1ha2UgY2hlY2siCitub2luc3RfUFJPR1JBTVM9JChURVNUUykKKworZGJ1c190ZXN0X1NPVVJDRVM9CQkJCVwKKwlkYnVzLXRlc3QtbWFpbi5jCisKK2RidXNfdGVzdF9MREFERD1saWJkYnVzLWludGVybmFsLmxhICQoREJVU19URVNUX0xJQlMpCitkYnVzX3Rlc3RfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKworIyMgbW9wIHVwIHRoZSBnY292IGZpbGVzCitjbGVhbi1sb2NhbDoKKwkvYmluL3JtICouYmIgKi5iYmcgKi5kYSAqLmdjb3YgLmxpYnMvKi5kYSAubGlicy8qLmJiZyB8fCB0cnVlCisKK3VwZGF0ZS1zeXN0ZW1kOgorCWN1cmwgaHR0cDovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL3N5c3RlbWQvcGxhaW4vc3JjL3NkLWRhZW1vbi5jID4gc2QtZGFlbW9uLmMKKwljdXJsIGh0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9zeXN0ZW1kL3BsYWluL3NyYy9zZC1kYWVtb24uaCA+IHNkLWRhZW1vbi5oCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL01ha2VmaWxlLmluIGIvZGJ1cy0xLjQuMTAvZGJ1cy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDEyNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI0MzkgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitAREJVU19XSU5fRkFMU0VAbGliZGJ1c18xX2xhX0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18xKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUBURVNUUyA9IGRidXMtdGVzdCQoRVhFRVhUKQorbm9pbnN0X1BST0dSQU1TID0gJChhbV9fRVhFRVhUXzEpCitzdWJkaXIgPSBkYnVzCitESVNUX0NPTU1PTiA9ICQoZGJ1c2luY2x1ZGVfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2RidXMtYXJjaC1kZXBzLmguaW4gXAorCSQoc3JjZGlyKS92ZXJzaW9uaW5mby5yYy5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvYXMtYWMtZXhwYW5kLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2NvbXBpbGVyLm00ICQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCAkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L3BrZy5tNCAkKHRvcF9zcmNkaXIpL200L3RwLWNvbXBpbGVyLWZsYWcubTQgXAorCSQodG9wX3NyY2RpcikvbTQvdHAtY29tcGlsZXItd2FybmluZ3MubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSB2ZXJzaW9uaW5mby5yYyBkYnVzLWFyY2gtZGVwcy5oCitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChkYnVzaW5jbHVkZWRpcikiIFwKKwkiJChERVNURElSKSQoZGJ1c2FyY2hpbmNsdWRlZGlyKSIKK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpICQobm9pbnN0X0xUTElCUkFSSUVTKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK2FtX19saWJkYnVzXzFfbGFfU09VUkNFU19ESVNUID0gZGJ1cy1hZGRyZXNzLmMgZGJ1cy1hdXRoLmMgZGJ1cy1hdXRoLmggXAorCWRidXMtYXV0aC1zY3JpcHQuYyBkYnVzLWF1dGgtc2NyaXB0LmggZGJ1cy1idXMuYyBcCisJZGJ1cy1jb25uZWN0aW9uLmMgZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmggXAorCWRidXMtY3JlZGVudGlhbHMuYyBkYnVzLWNyZWRlbnRpYWxzLmggZGJ1cy1lcnJvcnMuYyBcCisJZGJ1cy1rZXlyaW5nLmMgZGJ1cy1rZXlyaW5nLmggZGJ1cy1tYXJzaGFsLWhlYWRlci5jIFwKKwlkYnVzLW1hcnNoYWwtaGVhZGVyLmggZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMgXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyBcCisJZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIGRidXMtbWFyc2hhbC12YWxpZGF0ZS5jIFwKKwlkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCBkYnVzLW1lc3NhZ2UuYyBkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaCBcCisJZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCBkYnVzLW1pc2MuYyBkYnVzLW5vbmNlLmggZGJ1cy1ub25jZS5jIFwKKwlkYnVzLW9iamVjdC10cmVlLmMgZGJ1cy1vYmplY3QtdHJlZS5oIGRidXMtcGVuZGluZy1jYWxsLmMgXAorCWRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmggZGJ1cy1yZXNvdXJjZXMuYyBkYnVzLXJlc291cmNlcy5oIFwKKwlkYnVzLXNlcnZlci5jIGRidXMtc2VydmVyLWRlYnVnLXBpcGUuYyBcCisJZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oIGRidXMtc2VydmVyLXByb3RlY3RlZC5oIFwKKwlkYnVzLXNlcnZlci1zb2NrZXQuYyBkYnVzLXNlcnZlci1zb2NrZXQuaCBkYnVzLXV1aWRnZW4uYyBcCisJZGJ1cy11dWlkZ2VuLmggZGJ1cy1zZXJ2ZXItdW5peC5jIGRidXMtc2VydmVyLXVuaXguaCBcCisJZGJ1cy1zZXJ2ZXItd2luLmMgZGJ1cy1zZXJ2ZXItd2luLmggZGJ1cy1zaGEuYyBkYnVzLXNoYS5oIFwKKwlkYnVzLXNpZ25hdHVyZS5jIGRidXMtdGltZW91dC5jIGRidXMtdGltZW91dC5oIFwKKwlkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCBkYnVzLXRocmVhZHMuYyBkYnVzLXRyYW5zcG9ydC5jIFwKKwlkYnVzLXRyYW5zcG9ydC5oIGRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIFwKKwlkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyBkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCBkYnVzLXdhdGNoLmMgXAorCWRidXMtd2F0Y2guaCBkYnVzLWRhdGFzbG90LmMgZGJ1cy1kYXRhc2xvdC5oIGRidXMtZmlsZS5jIFwKKwlkYnVzLWZpbGUuaCBkYnVzLWhhc2guYyBkYnVzLWhhc2guaCBkYnVzLWludGVybmFscy5jIFwKKwlkYnVzLWludGVybmFscy5oIGRidXMtbGlzdC5jIGRidXMtbGlzdC5oIGRidXMtbWFyc2hhbC1iYXNpYy5jIFwKKwlkYnVzLW1hcnNoYWwtYmFzaWMuaCBkYnVzLW1lbW9yeS5jIGRidXMtbWVtcG9vbC5jIFwKKwlkYnVzLW1lbXBvb2wuaCBkYnVzLXBpcGUuYyBkYnVzLXBpcGUuaCBkYnVzLXN0cmluZy5jIFwKKwlkYnVzLXN0cmluZy5oIGRidXMtc3RyaW5nLXByaXZhdGUuaCBkYnVzLXNlcnZlci1sYXVuY2hkLmggXAorCWRidXMtc2VydmVyLWxhdW5jaGQuYyBkYnVzLWZpbGUtdW5peC5jIGRidXMtcGlwZS11bml4LmMgXAorCWRidXMtc3lzZGVwcy11bml4LmMgZGJ1cy1zeXNkZXBzLXVuaXguaCBkYnVzLXN5c2RlcHMtcHRocmVhZC5jIFwKKwlkYnVzLXRyYW5zcG9ydC11bml4LmMgZGJ1cy10cmFuc3BvcnQtdW5peC5oIGRidXMtdXNlcmRiLmMgXAorCWRidXMtdXNlcmRiLmggc2QtZGFlbW9uLmMgc2QtZGFlbW9uLmggXAorCWRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmggZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYyBcCisJZGJ1cy1maWxlLXdpbi5jIGRidXMtcGlwZS13aW4uYyBkYnVzLXNvY2tldHMtd2luLmggXAorCWRidXMtc3lzZGVwcy13aW4uYyBkYnVzLXN5c2RlcHMtd2luLmggXAorCWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmMgZGJ1cy10cmFuc3BvcnQtd2luLmMgXAorCWRidXMtdHJhbnNwb3J0LXdpbi5oIGRidXMtc3lzZGVwcy5jIGRidXMtc3lzZGVwcy5oCitAREJVU19XSU5fRkFMU0VAYW1fX29iamVjdHNfMSA9IGxpYmRidXNfMV9sYS1kYnVzLXV1aWRnZW4ubG8gXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItdW5peC5sbworQERCVVNfV0lOX1RSVUVAYW1fX29iamVjdHNfMSA9IGxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci13aW4ubG8KK2FtX19vYmplY3RzXzIgPSBsaWJkYnVzXzFfbGEtZGJ1cy1hZGRyZXNzLmxvIGxpYmRidXNfMV9sYS1kYnVzLWF1dGgubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLWF1dGgtc2NyaXB0LmxvIGxpYmRidXNfMV9sYS1kYnVzLWJ1cy5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtY29ubmVjdGlvbi5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtY3JlZGVudGlhbHMubG8gbGliZGJ1c18xX2xhLWRidXMtZXJyb3JzLmxvIFwKKwlsaWJkYnVzXzFfbGEtZGJ1cy1rZXlyaW5nLmxvIFwKKwlsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWhlYWRlci5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLW1lc3NhZ2UubG8gbGliZGJ1c18xX2xhLWRidXMtbWlzYy5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtbm9uY2UubG8gbGliZGJ1c18xX2xhLWRidXMtb2JqZWN0LXRyZWUubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLXBlbmRpbmctY2FsbC5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtcmVzb3VyY2VzLmxvIGxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWRlYnVnLXBpcGUubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1zb2NrZXQubG8gJChhbV9fb2JqZWN0c18xKSBcCisJbGliZGJ1c18xX2xhLWRidXMtc2hhLmxvIGxpYmRidXNfMV9sYS1kYnVzLXNpZ25hdHVyZS5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtdGltZW91dC5sbyBsaWJkYnVzXzFfbGEtZGJ1cy10aHJlYWRzLmxvIFwKKwlsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC1zb2NrZXQubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLXdhdGNoLmxvCitAREJVU19FTkFCTEVfTEFVTkNIRF9UUlVFQEBEQlVTX1dJTl9GQUxTRUBhbV9fb2JqZWN0c18zID0gbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWxhdW5jaGQubG8KK0BEQlVTX1dJTkNFX1RSVUVAQERCVVNfV0lOX1RSVUVAYW1fX29iamVjdHNfNCA9IGxpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5sbworQERCVVNfV0lOX0ZBTFNFQGFtX19vYmplY3RzXzUgPSAkKGFtX19vYmplY3RzXzMpIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c18xX2xhLWRidXMtZmlsZS11bml4LmxvIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c18xX2xhLWRidXMtcGlwZS11bml4LmxvIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy11bml4LmxvIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLmxvIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXVuaXgubG8gXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzXzFfbGEtZGJ1cy11c2VyZGIubG8gXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzXzFfbGEtc2QtZGFlbW9uLmxvCitAREJVU19XSU5fVFJVRUBhbV9fb2JqZWN0c181ID0gJChhbV9fb2JqZWN0c180KSBcCitAREJVU19XSU5fVFJVRUAJbGliZGJ1c18xX2xhLWRidXMtZmlsZS13aW4ubG8gXAorQERCVVNfV0lOX1RSVUVACWxpYmRidXNfMV9sYS1kYnVzLXBpcGUtd2luLmxvIFwKK0BEQlVTX1dJTl9UUlVFQAlsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbi5sbyBcCitAREJVU19XSU5fVFJVRUAJbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvIFwKK0BEQlVTX1dJTl9UUlVFQAlsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtd2luLmxvCithbV9fb2JqZWN0c182ID0gbGliZGJ1c18xX2xhLWRidXMtZGF0YXNsb3QubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLWZpbGUubG8gbGliZGJ1c18xX2xhLWRidXMtaGFzaC5sbyBcCisJbGliZGJ1c18xX2xhLWRidXMtaW50ZXJuYWxzLmxvIGxpYmRidXNfMV9sYS1kYnVzLWxpc3QubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYmFzaWMubG8gbGliZGJ1c18xX2xhLWRidXMtbWVtb3J5LmxvIFwKKwlsaWJkYnVzXzFfbGEtZGJ1cy1tZW1wb29sLmxvIGxpYmRidXNfMV9sYS1kYnVzLXBpcGUubG8gXAorCWxpYmRidXNfMV9sYS1kYnVzLXN0cmluZy5sbyAkKGFtX19vYmplY3RzXzUpIFwKKwlsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLmxvCithbV9saWJkYnVzXzFfbGFfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMikgJChhbV9fb2JqZWN0c182KQorbGliZGJ1c18xX2xhX09CSkVDVFMgPSAkKGFtX2xpYmRidXNfMV9sYV9PQkpFQ1RTKQorQU1fVl9sdCA9ICQoYW1fX3ZfbHRfJChWKSkKK2FtX192X2x0XyA9ICQoYW1fX3ZfbHRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9sdF8wID0gLS1zaWxlbnQKK2xpYmRidXNfMV9sYV9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChsaWJkYnVzXzFfbGFfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorbGliZGJ1c19pbnRlcm5hbF9sYV9ERVBFTkRFTkNJRVMgPSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2FtX19saWJkYnVzX2ludGVybmFsX2xhX1NPVVJDRVNfRElTVCA9IGRidXMtYWRkcmVzcy5jIGRidXMtYXV0aC5jIFwKKwlkYnVzLWF1dGguaCBkYnVzLWF1dGgtc2NyaXB0LmMgZGJ1cy1hdXRoLXNjcmlwdC5oIGRidXMtYnVzLmMgXAorCWRidXMtY29ubmVjdGlvbi5jIGRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIFwKKwlkYnVzLWNyZWRlbnRpYWxzLmMgZGJ1cy1jcmVkZW50aWFscy5oIGRidXMtZXJyb3JzLmMgXAorCWRidXMta2V5cmluZy5jIGRidXMta2V5cmluZy5oIGRidXMtbWFyc2hhbC1oZWFkZXIuYyBcCisJZGJ1cy1tYXJzaGFsLWhlYWRlci5oIGRidXMtbWFyc2hhbC1ieXRlc3dhcC5jIFwKKwlkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyBcCisJZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmggZGJ1cy1tZXNzYWdlLmMgZGJ1cy1tZXNzYWdlLWludGVybmFsLmggXAorCWRidXMtbWVzc2FnZS1wcml2YXRlLmggZGJ1cy1taXNjLmMgZGJ1cy1ub25jZS5oIGRidXMtbm9uY2UuYyBcCisJZGJ1cy1vYmplY3QtdHJlZS5jIGRidXMtb2JqZWN0LXRyZWUuaCBkYnVzLXBlbmRpbmctY2FsbC5jIFwKKwlkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIGRidXMtcmVzb3VyY2VzLmMgZGJ1cy1yZXNvdXJjZXMuaCBcCisJZGJ1cy1zZXJ2ZXIuYyBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgXAorCWRidXMtc2VydmVyLWRlYnVnLXBpcGUuaCBkYnVzLXNlcnZlci1wcm90ZWN0ZWQuaCBcCisJZGJ1cy1zZXJ2ZXItc29ja2V0LmMgZGJ1cy1zZXJ2ZXItc29ja2V0LmggZGJ1cy11dWlkZ2VuLmMgXAorCWRidXMtdXVpZGdlbi5oIGRidXMtc2VydmVyLXVuaXguYyBkYnVzLXNlcnZlci11bml4LmggXAorCWRidXMtc2VydmVyLXdpbi5jIGRidXMtc2VydmVyLXdpbi5oIGRidXMtc2hhLmMgZGJ1cy1zaGEuaCBcCisJZGJ1cy1zaWduYXR1cmUuYyBkYnVzLXRpbWVvdXQuYyBkYnVzLXRpbWVvdXQuaCBcCisJZGJ1cy10aHJlYWRzLWludGVybmFsLmggZGJ1cy10aHJlYWRzLmMgZGJ1cy10cmFuc3BvcnQuYyBcCisJZGJ1cy10cmFuc3BvcnQuaCBkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCBcCisJZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMgZGJ1cy10cmFuc3BvcnQtc29ja2V0LmggZGJ1cy13YXRjaC5jIFwKKwlkYnVzLXdhdGNoLmggZGJ1cy1kYXRhc2xvdC5jIGRidXMtZGF0YXNsb3QuaCBkYnVzLWZpbGUuYyBcCisJZGJ1cy1maWxlLmggZGJ1cy1oYXNoLmMgZGJ1cy1oYXNoLmggZGJ1cy1pbnRlcm5hbHMuYyBcCisJZGJ1cy1pbnRlcm5hbHMuaCBkYnVzLWxpc3QuYyBkYnVzLWxpc3QuaCBkYnVzLW1hcnNoYWwtYmFzaWMuYyBcCisJZGJ1cy1tYXJzaGFsLWJhc2ljLmggZGJ1cy1tZW1vcnkuYyBkYnVzLW1lbXBvb2wuYyBcCisJZGJ1cy1tZW1wb29sLmggZGJ1cy1waXBlLmMgZGJ1cy1waXBlLmggZGJ1cy1zdHJpbmcuYyBcCisJZGJ1cy1zdHJpbmcuaCBkYnVzLXN0cmluZy1wcml2YXRlLmggZGJ1cy1zZXJ2ZXItbGF1bmNoZC5oIFwKKwlkYnVzLXNlcnZlci1sYXVuY2hkLmMgZGJ1cy1maWxlLXVuaXguYyBkYnVzLXBpcGUtdW5peC5jIFwKKwlkYnVzLXN5c2RlcHMtdW5peC5jIGRidXMtc3lzZGVwcy11bml4LmggZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyBcCisJZGJ1cy10cmFuc3BvcnQtdW5peC5jIGRidXMtdHJhbnNwb3J0LXVuaXguaCBkYnVzLXVzZXJkYi5jIFwKKwlkYnVzLXVzZXJkYi5oIHNkLWRhZW1vbi5jIHNkLWRhZW1vbi5oIFwKKwlkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oIGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMgXAorCWRidXMtZmlsZS13aW4uYyBkYnVzLXBpcGUtd2luLmMgZGJ1cy1zb2NrZXRzLXdpbi5oIFwKKwlkYnVzLXN5c2RlcHMtd2luLmMgZGJ1cy1zeXNkZXBzLXdpbi5oIFwKKwlkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jIGRidXMtdHJhbnNwb3J0LXdpbi5jIFwKKwlkYnVzLXRyYW5zcG9ydC13aW4uaCBkYnVzLXN5c2RlcHMuYyBkYnVzLXN5c2RlcHMuaCBcCisJZGJ1cy1hdXRoLXV0aWwuYyBkYnVzLWNyZWRlbnRpYWxzLXV0aWwuYyBkYnVzLW1haW5sb29wLmMgXAorCWRidXMtbWFpbmxvb3AuaCBkYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jIFwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYyBkYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jIFwKKwlkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIGRidXMtbWVzc2FnZS1mYWN0b3J5LmggXAorCWRidXMtbWVzc2FnZS11dGlsLmMgZGJ1cy1zaGVsbC5jIGRidXMtc2hlbGwuaCBcCisJZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIGRidXMtdXNlcmRiLXV0aWwuYyBkYnVzLXNwYXduLmMgXAorCWRidXMtc3lzZGVwcy11dGlsLXdpbi5jIGRidXMtc3Bhd24td2luLmMgZGJ1cy1zcGF3bi5oIFwKKwlkYnVzLXN0cmluZy11dGlsLmMgZGJ1cy1zeXNkZXBzLXV0aWwuYyBkYnVzLXRlc3QuYyBkYnVzLXRlc3QuaAorQERCVVNfV0lOX0ZBTFNFQGFtX19vYmplY3RzXzcgPSBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdXVpZGdlbi5sbyBcCitAREJVU19XSU5fRkFMU0VACWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItdW5peC5sbworQERCVVNfV0lOX1RSVUVAYW1fX29iamVjdHNfNyA9IGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItd2luLmxvCithbV9fb2JqZWN0c184ID0gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWFkZHJlc3MubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtYXV0aC1zY3JpcHQubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1idXMubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jb25uZWN0aW9uLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY3JlZGVudGlhbHMubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1lcnJvcnMubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1rZXlyaW5nLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1oZWFkZXIubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1pc2MubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1ub25jZS5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW9iamVjdC10cmVlLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGVuZGluZy1jYWxsLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtcmVzb3VyY2VzLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLWRlYnVnLXBpcGUubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LmxvICQoYW1fX29iamVjdHNfNykgXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaGEubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaWduYXR1cmUubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10aW1lb3V0LmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGhyZWFkcy5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC1zb2NrZXQubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy13YXRjaC5sbworQERCVVNfRU5BQkxFX0xBVU5DSERfVFJVRUBAREJVU19XSU5fRkFMU0VAYW1fX29iamVjdHNfOSA9IGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5sbworQERCVVNfV0lOQ0VfVFJVRUBAREJVU19XSU5fVFJVRUBhbV9fb2JqZWN0c18xMCA9IGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUubG8KK0BEQlVTX1dJTl9GQUxTRUBhbV9fb2JqZWN0c18xMSA9ICQoYW1fX29iamVjdHNfOSkgXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS11bml4LmxvIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUtdW5peC5sbyBcCitAREJVU19XSU5fRkFMU0VACWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXVuaXgubG8gXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLmxvIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC11bml4LmxvIFwKK0BEQlVTX1dJTl9GQUxTRUAJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi5sbyBcCitAREJVU19XSU5fRkFMU0VACWxpYmRidXNfaW50ZXJuYWxfbGEtc2QtZGFlbW9uLmxvCitAREJVU19XSU5fVFJVRUBhbV9fb2JqZWN0c18xMSA9ICQoYW1fX29iamVjdHNfMTApIFwKK0BEQlVTX1dJTl9UUlVFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS13aW4ubG8gXAorQERCVVNfV0lOX1RSVUVACWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXdpbi5sbyBcCitAREJVU19XSU5fVFJVRUAJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtd2luLmxvIFwKK0BEQlVTX1dJTl9UUlVFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvIFwKK0BEQlVTX1dJTl9UUlVFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXdpbi5sbworYW1fX29iamVjdHNfMTIgPSBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZGF0YXNsb3QubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtaGFzaC5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWludGVybmFscy5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWxpc3QubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJhc2ljLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtb3J5LmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtcG9vbC5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zdHJpbmcubG8gJChhbV9fb2JqZWN0c18xMSkgXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLmxvCitAREJVU19XSU5fRkFMU0VAYW1fX29iamVjdHNfMTMgPSAgXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLXVuaXgubG8gXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdXNlcmRiLXV0aWwubG8gXAorQERCVVNfV0lOX0ZBTFNFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24ubG8KK0BEQlVTX1dJTl9UUlVFQGFtX19vYmplY3RzXzEzID0gIFwKK0BEQlVTX1dJTl9UUlVFQAlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLXdpbi5sbyBcCitAREJVU19XSU5fVFJVRUAJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNwYXduLXdpbi5sbworYW1fX29iamVjdHNfMTQgPSBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtYXV0aC11dGlsLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY3JlZGVudGlhbHMtdXRpbC5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1haW5sb29wLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmxvIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtZmFjdG9yeS5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtdXRpbC5sbyBcCisJbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNoZWxsLmxvICQoYW1fX29iamVjdHNfMTMpIFwKKwlsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3RyaW5nLXV0aWwubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwubG8gXAorCWxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10ZXN0LmxvCithbV9saWJkYnVzX2ludGVybmFsX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzgpICQoYW1fX29iamVjdHNfMTIpIFwKKwkkKGFtX19vYmplY3RzXzE0KQorbGliZGJ1c19pbnRlcm5hbF9sYV9PQkpFQ1RTID0gJChhbV9saWJkYnVzX2ludGVybmFsX2xhX09CSkVDVFMpCitsaWJkYnVzX2ludGVybmFsX2xhX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAYW1fX0VYRUVYVF8xID0gZGJ1cy10ZXN0JChFWEVFWFQpCitQUk9HUkFNUyA9ICQobm9pbnN0X1BST0dSQU1TKQorYW1fZGJ1c190ZXN0X09CSkVDVFMgPSBkYnVzLXRlc3QtbWFpbi4kKE9CSkVYVCkKK2RidXNfdGVzdF9PQkpFQ1RTID0gJChhbV9kYnVzX3Rlc3RfT0JKRUNUUykKK2RidXNfdGVzdF9ERVBFTkRFTkNJRVMgPSBsaWJkYnVzLWludGVybmFsLmxhICQoYW1fX0RFUEVOREVOQ0lFU18xKQorZGJ1c190ZXN0X0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKGRidXNfdGVzdF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSBcCisJJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQU1fVl9DQyA9ICQoYW1fX3ZfQ0NfJChWKSkKK2FtX192X0NDXyA9ICQoYW1fX3ZfQ0NfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgIiAkQDsKK0FNX1ZfYXQgPSAkKGFtX192X2F0XyQoVikpCithbV9fdl9hdF8gPSAkKGFtX192X2F0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfYXRfMCA9IEAKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEXyQoVikpCithbV9fdl9DQ0xEXyA9ICQoYW1fX3ZfQ0NMRF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X0NDTERfMCA9IEBlY2hvICIgIENDTEQgICIgJEA7CitBTV9WX0dFTiA9ICQoYW1fX3ZfR0VOXyQoVikpCithbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7CitTT1VSQ0VTID0gJChsaWJkYnVzXzFfbGFfU09VUkNFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX1NPVVJDRVMpIFwKKwkkKGRidXNfdGVzdF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChhbV9fbGliZGJ1c18xX2xhX1NPVVJDRVNfRElTVCkgXAorCSQoYW1fX2xpYmRidXNfaW50ZXJuYWxfbGFfU09VUkNFU19ESVNUKSAkKGRidXNfdGVzdF9TT1VSQ0VTKQorSEVBREVSUyA9ICQoZGJ1c2luY2x1ZGVfSEVBREVSUykgJChub2Rpc3RfZGJ1c2FyY2hpbmNsdWRlX0hFQURFUlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCithbV9fdHR5X2NvbG9ycyA9IFwKK3JlZD07IGdybj07IGxnbj07IGJsdT07IHN0ZD0KK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JVSUxEX0ZJTEVWRVJTSU9OID0gQEJVSUxEX0ZJTEVWRVJTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RCVVNfQklORElSID0gQERCVVNfQklORElSQAorREJVU19CVVNfQ0ZMQUdTID0gQERCVVNfQlVTX0NGTEFHU0AKK0RCVVNfQlVTX0xJQlMgPSBAREJVU19CVVNfTElCU0AKK0RCVVNfQ0xJRU5UX0NGTEFHUyA9IEBEQlVTX0NMSUVOVF9DRkxBR1NACitEQlVTX0NMSUVOVF9MSUJTID0gQERCVVNfQ0xJRU5UX0xJQlNACitEQlVTX0NPTlNPTEVfQVVUSF9ESVIgPSBAREJVU19DT05TT0xFX0FVVEhfRElSQAorREJVU19DT05TT0xFX09XTkVSX0ZJTEUgPSBAREJVU19DT05TT0xFX09XTkVSX0ZJTEVACitEQlVTX0RBRU1PTkRJUiA9IEBEQlVTX0RBRU1PTkRJUkAKK0RCVVNfREFUQURJUiA9IEBEQlVTX0RBVEFESVJACitEQlVTX0hBVkVfSU5UNjQgPSBAREJVU19IQVZFX0lOVDY0QAorREJVU19JTlQxNl9UWVBFID0gQERCVVNfSU5UMTZfVFlQRUAKK0RCVVNfSU5UMzJfVFlQRSA9IEBEQlVTX0lOVDMyX1RZUEVACitEQlVTX0lOVDY0X0NPTlNUQU5UID0gQERCVVNfSU5UNjRfQ09OU1RBTlRACitEQlVTX0lOVDY0X1RZUEUgPSBAREJVU19JTlQ2NF9UWVBFQAorREJVU19MQVVOQ0hFUl9DRkxBR1MgPSBAREJVU19MQVVOQ0hFUl9DRkxBR1NACitEQlVTX0xBVU5DSEVSX0xJQlMgPSBAREJVU19MQVVOQ0hFUl9MSUJTQAorREJVU19MSUJFWEVDRElSID0gQERCVVNfTElCRVhFQ0RJUkAKK0RCVVNfTUFKT1JfVkVSU0lPTiA9IEBEQlVTX01BSk9SX1ZFUlNJT05ACitEQlVTX01JQ1JPX1ZFUlNJT04gPSBAREJVU19NSUNST19WRVJTSU9OQAorREJVU19NSU5PUl9WRVJTSU9OID0gQERCVVNfTUlOT1JfVkVSU0lPTkAKK0RCVVNfUEFUSF9PUl9BQlNUUkFDVCA9IEBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RACitEQlVTX1BSRUZJWCA9IEBEQlVTX1BSRUZJWEAKK0RCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTQAorREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgPSBAREJVU19TRVNTSU9OX1NPQ0tFVF9ESVJACitEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitEQlVTX1NZU1RFTV9QSURfRklMRSA9IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKK0RCVVNfU1lTVEVNX1NPQ0tFVCA9IEBEQlVTX1NZU1RFTV9TT0NLRVRACitEQlVTX1RFU1RfQ0ZMQUdTID0gQERCVVNfVEVTVF9DRkxBR1NACitEQlVTX1RFU1RfTElCUyA9IEBEQlVTX1RFU1RfTElCU0AKK0RCVVNfVUlOVDY0X0NPTlNUQU5UID0gQERCVVNfVUlOVDY0X0NPTlNUQU5UQAorREJVU19VU0VSID0gQERCVVNfVVNFUkAKK0RCVVNfVkVSU0lPTiA9IEBEQlVTX1ZFUlNJT05ACitEQlVTX1hfQ0ZMQUdTID0gQERCVVNfWF9DRkxBR1NACitEQlVTX1hfTElCUyA9IEBEQlVTX1hfTElCU0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitET1hZR0VOID0gQERPWFlHRU5ACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0VYUEFOREVEX0JJTkRJUiA9IEBFWFBBTkRFRF9CSU5ESVJACitFWFBBTkRFRF9EQVRBRElSID0gQEVYUEFOREVEX0RBVEFESVJACitFWFBBTkRFRF9MSUJESVIgPSBARVhQQU5ERURfTElCRElSQAorRVhQQU5ERURfTElCRVhFQ0RJUiA9IEBFWFBBTkRFRF9MSUJFWEVDRElSQAorRVhQQU5ERURfTE9DQUxTVEFURURJUiA9IEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQAorRVhQQU5ERURfUFJFRklYID0gQEVYUEFOREVEX1BSRUZJWEAKK0VYUEFOREVEX1NZU0NPTkZESVIgPSBARVhQQU5ERURfU1lTQ09ORkRJUkAKK0ZHUkVQID0gQEZHUkVQQAorR0VUVEVYVF9QQUNLQUdFID0gQEdFVFRFWFRfUEFDS0FHRUAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEFVTkNIQ1RMID0gQExBVU5DSENUTEAKK0xBVU5DSERfQUdFTlRfRElSID0gQExBVU5DSERfQUdFTlRfRElSQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJYTUxfQ0ZMQUdTID0gQExJQlhNTF9DRkxBR1NACitMSUJYTUxfTElCUyA9IEBMSUJYTUxfTElCU0AKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitMVF9BR0UgPSBATFRfQUdFQAorTFRfQ1VSUkVOVCA9IEBMVF9DVVJSRU5UQAorTFRfUkVWSVNJT04gPSBATFRfUkVWSVNJT05ACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOMkhUTUwgPSBATUFOMkhUTUxACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSQyA9IEBSQ0AKK1JfRFlOQU1JQ19MREZMQUcgPSBAUl9EWU5BTUlDX0xERkxBR0AKK1NFQ1RJT05fTERGTEFHUyA9IEBTRUNUSU9OX0xERkxBR1NACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVEVTVF9CVVNfQklOQVJZID0gQFRFU1RfQlVTX0JJTkFSWUAKK1RFU1RfRVhJVF9CSU5BUlkgPSBAVEVTVF9FWElUX0JJTkFSWUAKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUiA9IEBURVNUX0lOVkFMSURfU0VSVklDRV9ESVJACitURVNUX0lOVkFMSURfU0VSVklDRV9TWVNURU1fRElSID0gQFRFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVJACitURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZID0gQFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllACitURVNUX1BSSVZTRVJWRVJfQklOQVJZID0gQFRFU1RfUFJJVlNFUlZFUl9CSU5BUllACitURVNUX1NFR0ZBVUxUX0JJTkFSWSA9IEBURVNUX1NFR0ZBVUxUX0JJTkFSWUAKK1RFU1RfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0hFTExfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkgPSBAVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWUAKK1RFU1RfU09DS0VUX0RJUiA9IEBURVNUX1NPQ0tFVF9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfRElSID0gQFRFU1RfVkFMSURfU0VSVklDRV9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUiA9IEBURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJTkRSRVMgPSBAV0lORFJFU0AKK1hNS01GID0gQFhNS01GQAorWE1MVE8gPSBAWE1MVE9ACitYU0xUUFJPQyA9IEBYU0xUUFJPQ0AKK1hfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAorWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKK1hfTElCUyA9IEBYX0xJQlNACitYX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3N5c3RlbWRzeXN0ZW11bml0ZGlyID0gQHN5c3RlbWRzeXN0ZW11bml0ZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitjb25maWdkaXIgPSAkKHN5c2NvbmZkaXIpL2RidXMtMQorSU5DTFVERVMgPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19DTElFTlRfQ0ZMQUdTKSBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwktRERCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIiJChsb2NhbHN0YXRlZGlyKS9saWIvZGJ1cy9tYWNoaW5lLWlkIlwiIFwKKwktRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiIiQoY29uZmlnZGlyKS9zeXN0ZW0uY29uZiJcIiBcCisJLUREQlVTX1NFU1NJT05fQ09ORklHX0ZJTEU9XCIiJChjb25maWdkaXIpL3Nlc3Npb24uY29uZiJcIgorCitkYnVzaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvZGJ1cy0xLjAvZGJ1cworZGJ1c2FyY2hpbmNsdWRlZGlyID0gJChsaWJkaXIpL2RidXMtMS4wL2luY2x1ZGUvZGJ1cworbGliX0xUTElCUkFSSUVTID0gbGliZGJ1cy0xLmxhCisKKyMKKyMgRGVhbCB3aXRoIFczMiAuZGVmIGFuZCB2ZXJzaW9uLWluZm8ucmMgc3R1ZmYKKyMKK0BEQlVTX1dJTl9UUlVFQFNVRkZJWEVTID0gcmMKK0BEQlVTX1dJTl9GQUxTRUBkYnVzX3JlcyA9IAorQERCVVNfV0lOX1RSVUVAZGJ1c19yZXMgPSB2ZXJzaW9uaW5mby5vCitAREJVU19XSU5fRkFMU0VAZGJ1c19yZXNfbGRmbGFnID0gCitAREJVU19XSU5fVFJVRUBkYnVzX3Jlc19sZGZsYWcgPSAtV2wsJChkYnVzX3JlcykKK0BEQlVTX1dJTl9GQUxTRUBub191bmRlZmluZWQgPSAKK0BEQlVTX1dJTl9UUlVFQG5vX3VuZGVmaW5lZCA9IC1uby11bmRlZmluZWQKK0BEQlVTX1dJTl9GQUxTRUBleHBvcnRfc3ltYm9scyA9IC1leHBvcnQtc3ltYm9scy1yZWdleCAiXlteX10uKiIKK0BEQlVTX1dJTl9UUlVFQGV4cG9ydF9zeW1ib2xzID0gCitAREJVU19XSU5fVFJVRUBleHBvcnRfc3ltdm9sc19pbnRlcm5hbCA9IAorQERCVVNfV0lOX1RSVUVAbGliZGJ1c18xX2xhX0RFUEVOREVOQ0lFUyA9ICQoZGJ1c19yZXMpCitAREJVU19XSU5fRkFMU0VAaW50bGxpYnMgPSBATFRMSUJJTlRMQAorQERCVVNfV0lOX1RSVUVAaW50bGxpYnMgPSAKK0BEQlVTX1dJTl9GQUxTRUBleHBvcnRfc3ltYm9sc19pbnRlcm5hbCA9IAorQERCVVNfV0lOX0ZBTFNFQERCVVNfTElCX2FyY2hfc291cmNlcyA9IFwKK0BEQlVTX1dJTl9GQUxTRUAJZGJ1cy11dWlkZ2VuLmMJCQkJXAorQERCVVNfV0lOX0ZBTFNFQAlkYnVzLXV1aWRnZW4uaAkJCQlcCitAREJVU19XSU5fRkFMU0VACWRidXMtc2VydmVyLXVuaXguYyAJCQlcCitAREJVU19XSU5fRkFMU0VACWRidXMtc2VydmVyLXVuaXguaAorCisKKyMKKyMgUGxhdGZvcm0tZGVwZW5kZW50IHNvdXJjZXM6CisjCitAREJVU19XSU5fVFJVRUBEQlVTX0xJQl9hcmNoX3NvdXJjZXMgPSBcCitAREJVU19XSU5fVFJVRUAJZGJ1cy1zZXJ2ZXItd2luLmMgCQkJXAorQERCVVNfV0lOX1RSVUVACWRidXMtc2VydmVyLXdpbi5oCisKK0BEQlVTX1dJTkNFX0ZBTFNFQEBEQlVTX1dJTl9UUlVFQHdpbmNlX3NvdXJjZSA9IAorQERCVVNfV0lOQ0VfVFJVRUBAREJVU19XSU5fVFJVRUB3aW5jZV9zb3VyY2UgPSBkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oIGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKK0BEQlVTX1dJTl9GQUxTRUBEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMgPSBcCitAREJVU19XSU5fRkFMU0VACSQobGF1bmNoZF9zb3VyY2UpCQkJXAorQERCVVNfV0lOX0ZBTFNFQAlkYnVzLWZpbGUtdW5peC5jIAkJCVwKK0BEQlVTX1dJTl9GQUxTRUAJZGJ1cy1waXBlLXVuaXguYyAJCQlcCitAREJVU19XSU5fRkFMU0VACWRidXMtc3lzZGVwcy11bml4LmMgCQkJXAorQERCVVNfV0lOX0ZBTFNFQAlkYnVzLXN5c2RlcHMtdW5peC5oCQkJXAorQERCVVNfV0lOX0ZBTFNFQAlkYnVzLXN5c2RlcHMtcHRocmVhZC5jCQkJXAorQERCVVNfV0lOX0ZBTFNFQAlkYnVzLXRyYW5zcG9ydC11bml4LmMJCQlcCitAREJVU19XSU5fRkFMU0VACWRidXMtdHJhbnNwb3J0LXVuaXguaAkJCVwKK0BEQlVTX1dJTl9GQUxTRUAJZGJ1cy11c2VyZGIuYwkJCQlcCitAREJVU19XSU5fRkFMU0VACWRidXMtdXNlcmRiLmggCQkJCVwKK0BEQlVTX1dJTl9GQUxTRUAJc2QtZGFlbW9uLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0BEQlVTX1dJTl9GQUxTRUAJc2QtZGFlbW9uLmgKKworQERCVVNfV0lOX1RSVUVAREJVU19TSEFSRURfYXJjaF9zb3VyY2VzID0gXAorQERCVVNfV0lOX1RSVUVACSQod2luY2Vfc291cmNlKQkJCQlcCitAREJVU19XSU5fVFJVRUAJZGJ1cy1maWxlLXdpbi5jIAkJCVwKK0BEQlVTX1dJTl9UUlVFQAlkYnVzLXBpcGUtd2luLmMgCQkJXAorQERCVVNfV0lOX1RSVUVACWRidXMtc29ja2V0cy13aW4uaAkJCVwKK0BEQlVTX1dJTl9UUlVFQAlkYnVzLXN5c2RlcHMtd2luLmMgCQkJXAorQERCVVNfV0lOX1RSVUVACWRidXMtc3lzZGVwcy13aW4uaAkJCVwKK0BEQlVTX1dJTl9UUlVFQAlkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCQlcCitAREJVU19XSU5fVFJVRUAJZGJ1cy10cmFuc3BvcnQtd2luLmMJCQlcCitAREJVU19XSU5fVFJVRUAJZGJ1cy10cmFuc3BvcnQtd2luLmgKKworQERCVVNfV0lOX0ZBTFNFQERCVVNfVVRJTF9hcmNoX3NvdXJjZXMgPSBcCitAREJVU19XSU5fRkFMU0VACWRidXMtc3lzZGVwcy11dGlsLXVuaXguYwkJXAorQERCVVNfV0lOX0ZBTFNFQAlkYnVzLXVzZXJkYi11dGlsLmMJCQlcCitAREJVU19XSU5fRkFMU0VACWRidXMtc3Bhd24uYworCitAREJVU19XSU5fVFJVRUBEQlVTX1VUSUxfYXJjaF9zb3VyY2VzID0gXAorQERCVVNfV0lOX1RSVUVACWRidXMtc3lzZGVwcy11dGlsLXdpbi5jCQkJXAorQERCVVNfV0lOX1RSVUVACWRidXMtc3Bhd24td2luLmMKKworQERCVVNfRU5BQkxFX0xBVU5DSERfRkFMU0VAQERCVVNfV0lOX0ZBTFNFQGxhdW5jaGRfc291cmNlID0gCitAREJVU19FTkFCTEVfTEFVTkNIRF9UUlVFQEBEQlVTX1dJTl9GQUxTRUBsYXVuY2hkX3NvdXJjZSA9IGRidXMtc2VydmVyLWxhdW5jaGQuaCBkYnVzLXNlcnZlci1sYXVuY2hkLmMKK2RidXNpbmNsdWRlX0hFQURFUlMgPSBcCisJZGJ1cy5oCQkJCQlcCisJZGJ1cy1hZGRyZXNzLmgJCQkJXAorCWRidXMtYnVzLmgJCQkJXAorCWRidXMtY29ubmVjdGlvbi5oCQkJXAorCWRidXMtZXJyb3JzLmgJCQkJXAorCWRidXMtbWFjcm9zLmgJCQkJXAorCWRidXMtbWVtb3J5LmgJCQkJXAorCWRidXMtbWVzc2FnZS5oCQkJCVwKKwlkYnVzLW1pc2MuaAkJCQlcCisJZGJ1cy1wZW5kaW5nLWNhbGwuaAkJCVwKKwlkYnVzLXByb3RvY29sLmgJCQkJXAorCWRidXMtc2VydmVyLmgJCQkJXAorCWRidXMtc2hhcmVkLmgJCQkJXAorCWRidXMtc2lnbmF0dXJlLmgJCQlcCisJZGJ1cy10aHJlYWRzLmgJCQkJXAorCWRidXMtdHlwZXMuaAorCitub2Rpc3RfZGJ1c2FyY2hpbmNsdWRlX0hFQURFUlMgPSBcCisJZGJ1cy1hcmNoLWRlcHMuaAorCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGdvZXMgaW4gdGhlIGluc3RhbGxlZCBjbGllbnQgbGlicmFyeQorIyMjIGFuZCBpcyBzcGVjaWZpYyB0byBsaWJyYXJ5IGZ1bmN0aW9uYWxpdHkKK0RCVVNfTElCX1NPVVJDRVMgPSBcCisJZGJ1cy1hZGRyZXNzLmMJCQkJXAorCWRidXMtYXV0aC5jCQkJCVwKKwlkYnVzLWF1dGguaAkJCQlcCisJZGJ1cy1hdXRoLXNjcmlwdC5jCQkJXAorCWRidXMtYXV0aC1zY3JpcHQuaAkJCVwKKwlkYnVzLWJ1cy5jCQkJCVwKKwlkYnVzLWNvbm5lY3Rpb24uYwkJCVwKKwlkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaAkJXAorCWRidXMtY3JlZGVudGlhbHMuYwkJCVwKKwlkYnVzLWNyZWRlbnRpYWxzLmgJCQlcCisJZGJ1cy1lcnJvcnMuYwkJCQlcCisJZGJ1cy1rZXlyaW5nLmMJCQkJXAorCWRidXMta2V5cmluZy5oCQkJCVwKKwlkYnVzLW1hcnNoYWwtaGVhZGVyLmMJCQlcCisJZGJ1cy1tYXJzaGFsLWhlYWRlci5oCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC5jCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC5oCQkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYwkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaAkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS5jCQkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS5oCQkJXAorCWRidXMtbWVzc2FnZS5jCQkJCVwKKwlkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaAkJCVwKKwlkYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oCQkJXAorCWRidXMtbWlzYy5jCQkJCVwKKwlkYnVzLW5vbmNlLmgJCQkJXAorCWRidXMtbm9uY2UuYwkJCQlcCisJZGJ1cy1vYmplY3QtdHJlZS5jCQkJXAorCWRidXMtb2JqZWN0LXRyZWUuaAkJCVwKKwlkYnVzLXBlbmRpbmctY2FsbC5jCQkJXAorCWRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgJCVwKKwlkYnVzLXJlc291cmNlcy5jCQkJXAorCWRidXMtcmVzb3VyY2VzLmgJCQlcCisJZGJ1cy1zZXJ2ZXIuYwkJCQlcCisJZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCQlcCisJZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oCQlcCisJZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgJCQlcCisJZGJ1cy1zZXJ2ZXItc29ja2V0LmMJCQlcCisJZGJ1cy1zZXJ2ZXItc29ja2V0LmgJCQlcCisJJChEQlVTX0xJQl9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zaGEuYwkJCQlcCisJZGJ1cy1zaGEuaAkJCQlcCisJZGJ1cy1zaWduYXR1cmUuYwkJCVwKKwlkYnVzLXRpbWVvdXQuYwkJCQlcCisJZGJ1cy10aW1lb3V0LmgJCQkJXAorCWRidXMtdGhyZWFkcy1pbnRlcm5hbC5oCQkJXAorCWRidXMtdGhyZWFkcy5jCQkJCVwKKwlkYnVzLXRyYW5zcG9ydC5jCQkJXAorCWRidXMtdHJhbnNwb3J0LmgJCQlcCisJZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgJCVwKKwlkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaAkJCVwKKwlkYnVzLXdhdGNoLmMJCQkJXAorCWRidXMtd2F0Y2guaAorCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGdvZXMgaW4gdGhlIGluc3RhbGxlZCBjbGllbnQgbGlicmFyeQorIyMjIEFORCBpcyBnZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IHRoZQorIyMjIGRhZW1vbiBvciB0ZXN0IHByb2dyYW1zIChhbGwgc3ltYm9scyBpbiBoZXJlIHNob3VsZAorIyMjIGJlIHVuZGVyc2NvcmUtcHJlZml4ZWQpCitEQlVTX1NIQVJFRF9TT1VSQ0VTID0gXAorCWRidXMtZGF0YXNsb3QuYwkJCQlcCisJZGJ1cy1kYXRhc2xvdC5oCQkJCVwKKwlkYnVzLWZpbGUuYyAgICAgICAgICAgICAgICAgXAorCWRidXMtZmlsZS5oICAgICAgICAgICAgICAgICBcCisJZGJ1cy1oYXNoLmMJCQkJXAorCWRidXMtaGFzaC5oCQkJCVwKKwlkYnVzLWludGVybmFscy5jCQkJXAorCWRidXMtaW50ZXJuYWxzLmgJCQlcCisJZGJ1cy1saXN0LmMJCQkJXAorCWRidXMtbGlzdC5oCQkJCVwKKwlkYnVzLW1hcnNoYWwtYmFzaWMuYwkJCVwKKwlkYnVzLW1hcnNoYWwtYmFzaWMuaAkJCVwKKwlkYnVzLW1lbW9yeS5jCQkJCVwKKwlkYnVzLW1lbXBvb2wuYwkJCQlcCisJZGJ1cy1tZW1wb29sLmgJCQkJXAorCWRidXMtcGlwZS5jICAgICAgICAgICAgICAgICBcCisJZGJ1cy1waXBlLmggICAgICAgICAgICAgICAgIFwKKwlkYnVzLXN0cmluZy5jCQkJCVwKKwlkYnVzLXN0cmluZy5oCQkJCVwKKwlkYnVzLXN0cmluZy1wcml2YXRlLmgJCQlcCisJJChEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zeXNkZXBzLmMJCQkJXAorCWRidXMtc3lzZGVwcy5oCisKKworIyMjIHNvdXJjZSBjb2RlIHRoYXQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZAorIyMjIGJ5IHRoZSBidXMgZGFlbW9uIG9yIHRlc3QgYXBwcywgYnV0IGlzIE5PVCBpbmNsdWRlZAorIyMjIGluIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSAoYWxsIHN5bWJvbHMgaW4gaGVyZQorIyMjIHNob3VsZCBiZSB1bmRlcnNjb3JlLXByZWZpeGVkIGJ1dCBkb24ndCByZWFsbHkgbmVlZAorIyMjIHRvIGJlIHVubGVzcyB0aGV5IG1vdmUgdG8gREJVU19TSEFSRURfU09VUkNFUyBsYXRlcikKK0RCVVNfVVRJTF9TT1VSQ0VTID0gXAorCWRidXMtYXV0aC11dGlsLmMJCQlcCisJZGJ1cy1jcmVkZW50aWFscy11dGlsLmMJCQlcCisJZGJ1cy1tYWlubG9vcC5jCQkJCVwKKwlkYnVzLW1haW5sb29wLmgJCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMJCVwKKwlkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYwkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMJCVwKKwlkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCQkJXAorCWRidXMtbWVzc2FnZS1mYWN0b3J5LmgJCQlcCisJZGJ1cy1tZXNzYWdlLXV0aWwuYwkJCVwKKwlkYnVzLXNoZWxsLmMJCQkJXAorCWRidXMtc2hlbGwuaAkJCQlcCisJJChEQlVTX1VUSUxfYXJjaF9zb3VyY2VzKQkJXAorCWRidXMtc3Bhd24uaAkJCQlcCisJZGJ1cy1zdHJpbmctdXRpbC5jCQkJXAorCWRidXMtc3lzZGVwcy11dGlsLmMJCQlcCisJZGJ1cy10ZXN0LmMJCQkJXAorCWRidXMtdGVzdC5oCisKK2xpYmRidXNfMV9sYV9TT1VSQ0VTID0gXAorCSQoREJVU19MSUJfU09VUkNFUykJCQlcCisJJChEQlVTX1NIQVJFRF9TT1VSQ0VTKQorCitsaWJkYnVzX2ludGVybmFsX2xhX1NPVVJDRVMgPSBcCisJJChEQlVTX0xJQl9TT1VSQ0VTKQkJCVwKKwkkKERCVVNfU0hBUkVEX1NPVVJDRVMpCQkJXAorCSQoREJVU19VVElMX1NPVVJDRVMpCisKK0JVSUxUX1NPVVJDRVMgPSAkKG5vZGlzdF9kYnVzYXJjaGluY2x1ZGVfSEVBREVSUykKK0VYVFJBX0RJU1QgPSBkYnVzLWFyY2gtZGVwcy5oLmluCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJkYnVzLWludGVybmFsLmxhCitsaWJkYnVzXzFfbGFfQ1BQRkxBR1MgPSAtRGRidXNfMV9FWFBPUlRTCitsaWJkYnVzXzFfbGFfTElCQUREID0gJChEQlVTX0NMSUVOVF9MSUJTKQorbGliZGJ1c18xX2xhX0xERkxBR1MgPSAkKGV4cG9ydF9zeW1ib2xzKSAtdmVyc2lvbi1pbmZvICQoTFRfQ1VSUkVOVCk6JChMVF9SRVZJU0lPTik6JChMVF9BR0UpIC1uby11bmRlZmluZWQgQFJfRFlOQU1JQ19MREZMQUdACitsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTID0gLUREQlVTX1NUQVRJQ19CVUlMRAorbGliZGJ1c19pbnRlcm5hbF9sYV9MSUJBREQgPSAkKERCVVNfQ0xJRU5UX0xJQlMpCitsaWJkYnVzX2ludGVybmFsX2xhX0xERkxBR1MgPSAkKGV4cG9ydF9zeW1ib2xzX2ludGVybmFsKSBAUl9EWU5BTUlDX0xERkxBR0AKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAVEVTVFNfRU5WSVJPTk1FTlQgPSBEQlVTX1RFU1RfREFUQT0kKHRvcF9idWlsZGRpcikvdGVzdC9kYXRhIERCVVNfVEVTVF9IT01FRElSPSQodG9wX2J1aWxkZGlyKS9kYnVzCitkYnVzX3Rlc3RfU09VUkNFUyA9IFwKKwlkYnVzLXRlc3QtbWFpbi5jCisKK2RidXNfdGVzdF9MREFERCA9IGxpYmRidXMtaW50ZXJuYWwubGEgJChEQlVTX1RFU1RfTElCUykKK2RidXNfdGVzdF9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACithbGw6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiByYyAuYyAubG8gLm8gLm9iaiAucmMKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGRidXMvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgZGJ1cy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKK3ZlcnNpb25pbmZvLnJjOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvdmVyc2lvbmluZm8ucmMuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQAorZGJ1cy1hcmNoLWRlcHMuaDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2RidXMtYXJjaC1kZXBzLmguaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQAoraW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChsaWJkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChsaWJkaXIpIgorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCisJbGlzdDI9OyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgbGlzdDI9IiQkbGlzdDIgJCRwIjsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWRvbmU7IFwKKwl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAnJChERVNURElSKSQobGliZGlyKSciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAiJChERVNURElSKSQobGliZGlyKSI7IFwKKwl9CisKK3VuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAkKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQobGliZGlyKS8kJGYnIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgIiQoREVTVERJUikkKGxpYmRpcikvJCRmIjsgXAorCWRvbmUKKworY2xlYW4tbGliTFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorCitjbGVhbi1ub2luc3RMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MVExJQlJBUklFUykKKwlAbGlzdD0nJChub2luc3RfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCisJICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKKwkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKKwkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKKwlkb25lCitsaWJkYnVzLTEubGE6ICQobGliZGJ1c18xX2xhX09CSkVDVFMpICQobGliZGJ1c18xX2xhX0RFUEVOREVOQ0lFUykgCisJJChBTV9WX0NDTEQpJChsaWJkYnVzXzFfbGFfTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYmRidXNfMV9sYV9PQkpFQ1RTKSAkKGxpYmRidXNfMV9sYV9MSUJBREQpICQoTElCUykKK2xpYmRidXMtaW50ZXJuYWwubGE6ICQobGliZGJ1c19pbnRlcm5hbF9sYV9PQkpFQ1RTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfREVQRU5ERU5DSUVTKSAKKwkkKEFNX1ZfQ0NMRCkkKGxpYmRidXNfaW50ZXJuYWxfbGFfTElOSykgICQobGliZGJ1c19pbnRlcm5hbF9sYV9PQkpFQ1RTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfTElCQUREKSAkKExJQlMpCisKK2NsZWFuLW5vaW5zdFBST0dSQU1TOgorCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCisJdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKKwlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QKK2RidXMtdGVzdCQoRVhFRVhUKTogJChkYnVzX3Rlc3RfT0JKRUNUUykgJChkYnVzX3Rlc3RfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZGJ1cy10ZXN0JChFWEVFWFQpCisJJChBTV9WX0NDTEQpJChkYnVzX3Rlc3RfTElOSykgJChkYnVzX3Rlc3RfT0JKRUNUUykgJChkYnVzX3Rlc3RfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXMtdGVzdC1tYWluLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hZGRyZXNzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtYXV0aC1zY3JpcHQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hdXRoLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtYnVzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtY29ubmVjdGlvbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWNyZWRlbnRpYWxzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtZGF0YXNsb3QuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1lcnJvcnMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1maWxlLXVuaXguUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1maWxlLXdpbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWZpbGUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1oYXNoLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtaW50ZXJuYWxzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMta2V5cmluZy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWxpc3QuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWJhc2ljLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWVtb3J5LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWVtcG9vbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1lc3NhZ2UuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1taXNjLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbm9uY2UuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1vYmplY3QtdHJlZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXBlbmRpbmctY2FsbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXBpcGUtdW5peC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXBpcGUtd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtcGlwZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXJlc291cmNlcy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWxhdW5jaGQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXVuaXguUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2hhLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2lnbmF0dXJlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3RyaW5nLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy11bml4LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy13aW4uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdGhyZWFkcy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRpbWVvdXQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXVuaXguUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdXNlcmRiLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdXVpZGdlbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXdhdGNoLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c18xX2xhLXNkLWRhZW1vbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hZGRyZXNzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtc2NyaXB0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtdXRpbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWJ1cy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jb25uZWN0aW9uLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLXV0aWwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtY3JlZGVudGlhbHMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZGF0YXNsb3QuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZXJyb3JzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWZpbGUtdW5peC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLXdpbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWhhc2guUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtaW50ZXJuYWxzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWtleXJpbmcuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbGlzdC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYWlubG9vcC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJhc2ljLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtb3J5LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lbXBvb2wuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS1mYWN0b3J5LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtdXRpbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1pc2MuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbm9uY2UuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtb2JqZWN0LXRyZWUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGVuZGluZy1jYWxsLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUtdW5peC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXdpbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXJlc291cmNlcy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci11bml4LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci13aW4uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNoYS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaGVsbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaWduYXR1cmUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24td2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNwYXduLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy11dGlsLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXB0aHJlYWQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdW5peC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwtd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10ZXN0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRocmVhZHMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGltZW91dC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC11bml4LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC13aW4uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi11dGlsLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11dWlkZ2VuLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXdhdGNoLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1zZC1kYWVtb24uUGxvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK2xpYmRidXNfMV9sYS1kYnVzLWFkZHJlc3MubG86IGRidXMtYWRkcmVzcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1hZGRyZXNzLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hZGRyZXNzLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1hZGRyZXNzLmxvIGB0ZXN0IC1mICdkYnVzLWFkZHJlc3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1hZGRyZXNzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWFkZHJlc3MuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hZGRyZXNzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtYWRkcmVzcy5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLWFkZHJlc3MubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtYWRkcmVzcy5sbyBgdGVzdCAtZiAnZGJ1cy1hZGRyZXNzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtYWRkcmVzcy5jCisKK2xpYmRidXNfMV9sYS1kYnVzLWF1dGgubG86IGRidXMtYXV0aC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1hdXRoLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hdXRoLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1hdXRoLmxvIGB0ZXN0IC1mICdkYnVzLWF1dGguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1hdXRoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWF1dGguVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hdXRoLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtYXV0aC5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLWF1dGgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtYXV0aC5sbyBgdGVzdCAtZiAnZGJ1cy1hdXRoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtYXV0aC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLWF1dGgtc2NyaXB0LmxvOiBkYnVzLWF1dGgtc2NyaXB0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLWF1dGgtc2NyaXB0LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hdXRoLXNjcmlwdC5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtYXV0aC1zY3JpcHQubG8gYHRlc3QgLWYgJ2RidXMtYXV0aC1zY3JpcHQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1hdXRoLXNjcmlwdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1hdXRoLXNjcmlwdC5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWF1dGgtc2NyaXB0LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtYXV0aC1zY3JpcHQuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1hdXRoLXNjcmlwdC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1hdXRoLXNjcmlwdC5sbyBgdGVzdCAtZiAnZGJ1cy1hdXRoLXNjcmlwdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWF1dGgtc2NyaXB0LmMKKworbGliZGJ1c18xX2xhLWRidXMtYnVzLmxvOiBkYnVzLWJ1cy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1idXMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWJ1cy5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtYnVzLmxvIGB0ZXN0IC1mICdkYnVzLWJ1cy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWJ1cy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1idXMuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1idXMuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1idXMuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1idXMubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtYnVzLmxvIGB0ZXN0IC1mICdkYnVzLWJ1cy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWJ1cy5jCisKK2xpYmRidXNfMV9sYS1kYnVzLWNvbm5lY3Rpb24ubG86IGRidXMtY29ubmVjdGlvbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1jb25uZWN0aW9uLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1jb25uZWN0aW9uLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1jb25uZWN0aW9uLmxvIGB0ZXN0IC1mICdkYnVzLWNvbm5lY3Rpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1jb25uZWN0aW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWNvbm5lY3Rpb24uVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1jb25uZWN0aW9uLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtY29ubmVjdGlvbi5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLWNvbm5lY3Rpb24ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtY29ubmVjdGlvbi5sbyBgdGVzdCAtZiAnZGJ1cy1jb25uZWN0aW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtY29ubmVjdGlvbi5jCisKK2xpYmRidXNfMV9sYS1kYnVzLWNyZWRlbnRpYWxzLmxvOiBkYnVzLWNyZWRlbnRpYWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLWNyZWRlbnRpYWxzLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1jcmVkZW50aWFscy5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtY3JlZGVudGlhbHMubG8gYHRlc3QgLWYgJ2RidXMtY3JlZGVudGlhbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1jcmVkZW50aWFscy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1jcmVkZW50aWFscy5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWNyZWRlbnRpYWxzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtY3JlZGVudGlhbHMuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1jcmVkZW50aWFscy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1jcmVkZW50aWFscy5sbyBgdGVzdCAtZiAnZGJ1cy1jcmVkZW50aWFscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWNyZWRlbnRpYWxzLmMKKworbGliZGJ1c18xX2xhLWRidXMtZXJyb3JzLmxvOiBkYnVzLWVycm9ycy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1lcnJvcnMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWVycm9ycy5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtZXJyb3JzLmxvIGB0ZXN0IC1mICdkYnVzLWVycm9ycy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWVycm9ycy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1lcnJvcnMuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1lcnJvcnMuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1lcnJvcnMuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1lcnJvcnMubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtZXJyb3JzLmxvIGB0ZXN0IC1mICdkYnVzLWVycm9ycy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWVycm9ycy5jCisKK2xpYmRidXNfMV9sYS1kYnVzLWtleXJpbmcubG86IGRidXMta2V5cmluZy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1rZXlyaW5nLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1rZXlyaW5nLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1rZXlyaW5nLmxvIGB0ZXN0IC1mICdkYnVzLWtleXJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1rZXlyaW5nLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWtleXJpbmcuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1rZXlyaW5nLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMta2V5cmluZy5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLWtleXJpbmcubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMta2V5cmluZy5sbyBgdGVzdCAtZiAnZGJ1cy1rZXlyaW5nLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMta2V5cmluZy5jCisKK2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLmxvOiBkYnVzLW1hcnNoYWwtaGVhZGVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWhlYWRlci5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1oZWFkZXIubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC1oZWFkZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLWhlYWRlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWhlYWRlci5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWFyc2hhbC1oZWFkZXIuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWhlYWRlci5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWhlYWRlci5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLWhlYWRlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtaGVhZGVyLmMKKworbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5sbzogZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC1ieXRlc3dhcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmxvIGB0ZXN0IC1mICdkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMKKworbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUubG86IGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmxvIGB0ZXN0IC1mICdkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmxvOiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC12YWxpZGF0ZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1tZXNzYWdlLmxvOiBkYnVzLW1lc3NhZ2UuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtbWVzc2FnZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWVzc2FnZS5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbWVzc2FnZS5sbyBgdGVzdCAtZiAnZGJ1cy1tZXNzYWdlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWVzc2FnZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tZXNzYWdlLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWVzc2FnZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW1lc3NhZ2UuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1tZXNzYWdlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLW1lc3NhZ2UubG8gYHRlc3QgLWYgJ2RidXMtbWVzc2FnZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1lc3NhZ2UuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1taXNjLmxvOiBkYnVzLW1pc2MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtbWlzYy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWlzYy5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbWlzYy5sbyBgdGVzdCAtZiAnZGJ1cy1taXNjLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWlzYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1taXNjLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWlzYy5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW1pc2MuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1taXNjLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLW1pc2MubG8gYHRlc3QgLWYgJ2RidXMtbWlzYy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1pc2MuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1ub25jZS5sbzogZGJ1cy1ub25jZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1ub25jZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbm9uY2UuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLW5vbmNlLmxvIGB0ZXN0IC1mICdkYnVzLW5vbmNlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbm9uY2UuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbm9uY2UuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1ub25jZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW5vbmNlLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtbm9uY2UubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbm9uY2UubG8gYHRlc3QgLWYgJ2RidXMtbm9uY2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1ub25jZS5jCisKK2xpYmRidXNfMV9sYS1kYnVzLW9iamVjdC10cmVlLmxvOiBkYnVzLW9iamVjdC10cmVlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLW9iamVjdC10cmVlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1vYmplY3QtdHJlZS5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtb2JqZWN0LXRyZWUubG8gYHRlc3QgLWYgJ2RidXMtb2JqZWN0LXRyZWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1vYmplY3QtdHJlZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1vYmplY3QtdHJlZS5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW9iamVjdC10cmVlLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtb2JqZWN0LXRyZWUuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1vYmplY3QtdHJlZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1vYmplY3QtdHJlZS5sbyBgdGVzdCAtZiAnZGJ1cy1vYmplY3QtdHJlZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW9iamVjdC10cmVlLmMKKworbGliZGJ1c18xX2xhLWRidXMtcGVuZGluZy1jYWxsLmxvOiBkYnVzLXBlbmRpbmctY2FsbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1wZW5kaW5nLWNhbGwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXBlbmRpbmctY2FsbC5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtcGVuZGluZy1jYWxsLmxvIGB0ZXN0IC1mICdkYnVzLXBlbmRpbmctY2FsbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXBlbmRpbmctY2FsbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1wZW5kaW5nLWNhbGwuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1wZW5kaW5nLWNhbGwuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1wZW5kaW5nLWNhbGwuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1wZW5kaW5nLWNhbGwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtcGVuZGluZy1jYWxsLmxvIGB0ZXN0IC1mICdkYnVzLXBlbmRpbmctY2FsbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXBlbmRpbmctY2FsbC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXJlc291cmNlcy5sbzogZGJ1cy1yZXNvdXJjZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtcmVzb3VyY2VzLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1yZXNvdXJjZXMuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXJlc291cmNlcy5sbyBgdGVzdCAtZiAnZGJ1cy1yZXNvdXJjZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1yZXNvdXJjZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtcmVzb3VyY2VzLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtcmVzb3VyY2VzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtcmVzb3VyY2VzLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtcmVzb3VyY2VzLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXJlc291cmNlcy5sbyBgdGVzdCAtZiAnZGJ1cy1yZXNvdXJjZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1yZXNvdXJjZXMuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXIubG86IGRidXMtc2VydmVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXIubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNlcnZlci5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXIubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLmMKKworbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWRlYnVnLXBpcGUubG86IGRidXMtc2VydmVyLWRlYnVnLXBpcGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWRlYnVnLXBpcGUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWRlYnVnLXBpcGUuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmxvIGB0ZXN0IC1mICdkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLWRlYnVnLXBpcGUuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LmxvOiBkYnVzLXNlcnZlci1zb2NrZXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXNvY2tldC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXNvY2tldC5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXNvY2tldC5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItc29ja2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLXNvY2tldC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXNvY2tldC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNlcnZlci1zb2NrZXQuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1zb2NrZXQubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLXNvY2tldC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci1zb2NrZXQuYworCitsaWJkYnVzXzFfbGEtZGJ1cy11dWlkZ2VuLmxvOiBkYnVzLXV1aWRnZW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtdXVpZGdlbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdXVpZGdlbi5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtdXVpZGdlbi5sbyBgdGVzdCAtZiAnZGJ1cy11dWlkZ2VuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdXVpZGdlbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy11dWlkZ2VuLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdXVpZGdlbi5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXV1aWRnZW4uYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy11dWlkZ2VuLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXV1aWRnZW4ubG8gYHRlc3QgLWYgJ2RidXMtdXVpZGdlbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXV1aWRnZW4uYworCitsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItdW5peC5sbzogZGJ1cy1zZXJ2ZXItdW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItdW5peC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXVuaXguVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXNlcnZlci11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXVuaXguVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItdW5peC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNlcnZlci11bml4LmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXVuaXgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXVuaXgubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLXVuaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zZXJ2ZXItdW5peC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci13aW4ubG86IGRidXMtc2VydmVyLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItd2luLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItd2luLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItd2luLmxvIGB0ZXN0IC1mICdkYnVzLXNlcnZlci13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zZXJ2ZXItd2luLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci13aW4uVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItd2luLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc2VydmVyLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXNlcnZlci13aW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLXdpbi5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXNoYS5sbzogZGJ1cy1zaGEuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtc2hhLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zaGEuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXNoYS5sbyBgdGVzdCAtZiAnZGJ1cy1zaGEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zaGEuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2hhLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2hhLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc2hhLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtc2hhLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXNoYS5sbyBgdGVzdCAtZiAnZGJ1cy1zaGEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zaGEuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1zaWduYXR1cmUubG86IGRidXMtc2lnbmF0dXJlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXNpZ25hdHVyZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2lnbmF0dXJlLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zaWduYXR1cmUubG8gYHRlc3QgLWYgJ2RidXMtc2lnbmF0dXJlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2lnbmF0dXJlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNpZ25hdHVyZS5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXNpZ25hdHVyZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNpZ25hdHVyZS5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXNpZ25hdHVyZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zaWduYXR1cmUubG8gYHRlc3QgLWYgJ2RidXMtc2lnbmF0dXJlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2lnbmF0dXJlLmMKKworbGliZGJ1c18xX2xhLWRidXMtdGltZW91dC5sbzogZGJ1cy10aW1lb3V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXRpbWVvdXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRpbWVvdXQuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXRpbWVvdXQubG8gYHRlc3QgLWYgJ2RidXMtdGltZW91dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRpbWVvdXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdGltZW91dC5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRpbWVvdXQuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy10aW1lb3V0LmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtdGltZW91dC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy10aW1lb3V0LmxvIGB0ZXN0IC1mICdkYnVzLXRpbWVvdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10aW1lb3V0LmMKKworbGliZGJ1c18xX2xhLWRidXMtdGhyZWFkcy5sbzogZGJ1cy10aHJlYWRzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXRocmVhZHMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRocmVhZHMuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXRocmVhZHMubG8gYHRlc3QgLWYgJ2RidXMtdGhyZWFkcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRocmVhZHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdGhyZWFkcy5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRocmVhZHMuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy10aHJlYWRzLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtdGhyZWFkcy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy10aHJlYWRzLmxvIGB0ZXN0IC1mICdkYnVzLXRocmVhZHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10aHJlYWRzLmMKKworbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LmxvOiBkYnVzLXRyYW5zcG9ydC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LmxvIGB0ZXN0IC1mICdkYnVzLXRyYW5zcG9ydC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRyYW5zcG9ydC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy10cmFuc3BvcnQuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LmxvIGB0ZXN0IC1mICdkYnVzLXRyYW5zcG9ydC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRyYW5zcG9ydC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC1zb2NrZXQubG86IGRidXMtdHJhbnNwb3J0LXNvY2tldC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LmxvIGB0ZXN0IC1mICdkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC1zb2NrZXQuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdHJhbnNwb3J0LXNvY2tldC5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC1zb2NrZXQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXNvY2tldC5sbyBgdGVzdCAtZiAnZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdHJhbnNwb3J0LXNvY2tldC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXdhdGNoLmxvOiBkYnVzLXdhdGNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXdhdGNoLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy13YXRjaC5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtd2F0Y2gubG8gYHRlc3QgLWYgJ2RidXMtd2F0Y2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy13YXRjaC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy13YXRjaC5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXdhdGNoLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtd2F0Y2guYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy13YXRjaC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy13YXRjaC5sbyBgdGVzdCAtZiAnZGJ1cy13YXRjaC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXdhdGNoLmMKKworbGliZGJ1c18xX2xhLWRidXMtZGF0YXNsb3QubG86IGRidXMtZGF0YXNsb3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtZGF0YXNsb3QubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWRhdGFzbG90LlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1kYXRhc2xvdC5sbyBgdGVzdCAtZiAnZGJ1cy1kYXRhc2xvdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWRhdGFzbG90LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWRhdGFzbG90LlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtZGF0YXNsb3QuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1kYXRhc2xvdC5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLWRhdGFzbG90LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLWRhdGFzbG90LmxvIGB0ZXN0IC1mICdkYnVzLWRhdGFzbG90LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtZGF0YXNsb3QuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1maWxlLmxvOiBkYnVzLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtZmlsZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtZmlsZS5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtZmlsZS5sbyBgdGVzdCAtZiAnZGJ1cy1maWxlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1maWxlLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtZmlsZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLWZpbGUuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1maWxlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLWZpbGUubG8gYHRlc3QgLWYgJ2RidXMtZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWZpbGUuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1oYXNoLmxvOiBkYnVzLWhhc2guYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtaGFzaC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtaGFzaC5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtaGFzaC5sbyBgdGVzdCAtZiAnZGJ1cy1oYXNoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtaGFzaC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1oYXNoLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtaGFzaC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLWhhc2guYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1oYXNoLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLWhhc2gubG8gYHRlc3QgLWYgJ2RidXMtaGFzaC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWhhc2guYworCitsaWJkYnVzXzFfbGEtZGJ1cy1pbnRlcm5hbHMubG86IGRidXMtaW50ZXJuYWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLWludGVybmFscy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtaW50ZXJuYWxzLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1pbnRlcm5hbHMubG8gYHRlc3QgLWYgJ2RidXMtaW50ZXJuYWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtaW50ZXJuYWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWludGVybmFscy5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWludGVybmFscy5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLWludGVybmFscy5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLWludGVybmFscy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1pbnRlcm5hbHMubG8gYHRlc3QgLWYgJ2RidXMtaW50ZXJuYWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtaW50ZXJuYWxzLmMKKworbGliZGJ1c18xX2xhLWRidXMtbGlzdC5sbzogZGJ1cy1saXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLWxpc3QubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWxpc3QuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLWxpc3QubG8gYHRlc3QgLWYgJ2RidXMtbGlzdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWxpc3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbGlzdC5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWxpc3QuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1saXN0LmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtbGlzdC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1saXN0LmxvIGB0ZXN0IC1mICdkYnVzLWxpc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1saXN0LmMKKworbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1iYXNpYy5sbzogZGJ1cy1tYXJzaGFsLWJhc2ljLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYmFzaWMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYmFzaWMuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYmFzaWMubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC1iYXNpYy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtYmFzaWMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1iYXNpYy5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1hcnNoYWwtYmFzaWMuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1tYXJzaGFsLWJhc2ljLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtbWFyc2hhbC1iYXNpYy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1tYXJzaGFsLWJhc2ljLmxvIGB0ZXN0IC1mICdkYnVzLW1hcnNoYWwtYmFzaWMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLWJhc2ljLmMKKworbGliZGJ1c18xX2xhLWRidXMtbWVtb3J5LmxvOiBkYnVzLW1lbW9yeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1tZW1vcnkubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1lbW9yeS5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbWVtb3J5LmxvIGB0ZXN0IC1mICdkYnVzLW1lbW9yeS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1lbW9yeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tZW1vcnkuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tZW1vcnkuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1tZW1vcnkuYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1tZW1vcnkubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbWVtb3J5LmxvIGB0ZXN0IC1mICdkYnVzLW1lbW9yeS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1lbW9yeS5jCisKK2xpYmRidXNfMV9sYS1kYnVzLW1lbXBvb2wubG86IGRidXMtbWVtcG9vbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1tZW1wb29sLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tZW1wb29sLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1tZW1wb29sLmxvIGB0ZXN0IC1mICdkYnVzLW1lbXBvb2wuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tZW1wb29sLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLW1lbXBvb2wuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1tZW1wb29sLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWVtcG9vbC5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLW1lbXBvb2wubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtbWVtcG9vbC5sbyBgdGVzdCAtZiAnZGJ1cy1tZW1wb29sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWVtcG9vbC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXBpcGUubG86IGRidXMtcGlwZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1waXBlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1waXBlLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1waXBlLmxvIGB0ZXN0IC1mICdkYnVzLXBpcGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1waXBlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXBpcGUuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1waXBlLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtcGlwZS5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXBpcGUubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtcGlwZS5sbyBgdGVzdCAtZiAnZGJ1cy1waXBlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcGlwZS5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXN0cmluZy5sbzogZGJ1cy1zdHJpbmcuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtc3RyaW5nLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zdHJpbmcuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXN0cmluZy5sbyBgdGVzdCAtZiAnZGJ1cy1zdHJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zdHJpbmcuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3RyaW5nLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3RyaW5nLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3RyaW5nLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtc3RyaW5nLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXN0cmluZy5sbyBgdGVzdCAtZiAnZGJ1cy1zdHJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zdHJpbmcuYworCitsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5sbzogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWxhdW5jaGQuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXNlcnZlci1sYXVuY2hkLmxvIGB0ZXN0IC1mICdkYnVzLXNlcnZlci1sYXVuY2hkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLWxhdW5jaGQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWxhdW5jaGQuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNlcnZlci1sYXVuY2hkLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWxhdW5jaGQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc2VydmVyLWxhdW5jaGQubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLWxhdW5jaGQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLWZpbGUtdW5peC5sbzogZGJ1cy1maWxlLXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtZmlsZS11bml4LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1maWxlLXVuaXguVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLWZpbGUtdW5peC5sbyBgdGVzdCAtZiAnZGJ1cy1maWxlLXVuaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1maWxlLXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtZmlsZS11bml4LlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtZmlsZS11bml4LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtZmlsZS11bml4LmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtZmlsZS11bml4LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLWZpbGUtdW5peC5sbyBgdGVzdCAtZiAnZGJ1cy1maWxlLXVuaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1maWxlLXVuaXguYworCitsaWJkYnVzXzFfbGEtZGJ1cy1waXBlLXVuaXgubG86IGRidXMtcGlwZS11bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXBpcGUtdW5peC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtcGlwZS11bml4LlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1waXBlLXVuaXgubG8gYHRlc3QgLWYgJ2RidXMtcGlwZS11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcGlwZS11bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXBpcGUtdW5peC5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXBpcGUtdW5peC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXBpcGUtdW5peC5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXBpcGUtdW5peC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1waXBlLXVuaXgubG8gYHRlc3QgLWYgJ2RidXMtcGlwZS11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcGlwZS11bml4LmMKKworbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy11bml4LmxvOiBkYnVzLXN5c2RlcHMtdW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXVuaXgubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtdW5peC5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtdW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtdW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXVuaXguVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXVuaXguUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zeXNkZXBzLXVuaXguYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXVuaXgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtdW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtdW5peC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtcHRocmVhZC5sbzogZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXB0aHJlYWQuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtcHRocmVhZC5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3lzZGVwcy1wdGhyZWFkLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtcHRocmVhZC5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYworCitsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtdW5peC5sbzogZGJ1cy10cmFuc3BvcnQtdW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtdW5peC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXVuaXguVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXRyYW5zcG9ydC11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdHJhbnNwb3J0LXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXVuaXguVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtdW5peC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXRyYW5zcG9ydC11bml4LmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXVuaXgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXVuaXgubG8gYHRlc3QgLWYgJ2RidXMtdHJhbnNwb3J0LXVuaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10cmFuc3BvcnQtdW5peC5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXVzZXJkYi5sbzogZGJ1cy11c2VyZGIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtdXNlcmRiLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy11c2VyZGIuVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXVzZXJkYi5sbyBgdGVzdCAtZiAnZGJ1cy11c2VyZGIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy11c2VyZGIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdXNlcmRiLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtdXNlcmRiLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdXNlcmRiLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtdXNlcmRiLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXVzZXJkYi5sbyBgdGVzdCAtZiAnZGJ1cy11c2VyZGIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy11c2VyZGIuYworCitsaWJkYnVzXzFfbGEtc2QtZGFlbW9uLmxvOiBzZC1kYWVtb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLXNkLWRhZW1vbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLXNkLWRhZW1vbi5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLXNkLWRhZW1vbi5sbyBgdGVzdCAtZiAnc2QtZGFlbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNkLWRhZW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtc2QtZGFlbW9uLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLXNkLWRhZW1vbi5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZC1kYWVtb24uYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtc2QtZGFlbW9uLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1zZC1kYWVtb24ubG8gYHRlc3QgLWYgJ3NkLWRhZW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzZC1kYWVtb24uYworCitsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUubG86IGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy13aW5jZS1nbHVlLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUubG8gYHRlc3QgLWYgJ2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUubG8gYHRlc3QgLWYgJ2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKKworbGliZGJ1c18xX2xhLWRidXMtZmlsZS13aW4ubG86IGRidXMtZmlsZS13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c18xX2xhLWRidXMtZmlsZS13aW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWZpbGUtd2luLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1maWxlLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1maWxlLXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWZpbGUtd2luLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLWZpbGUtd2luLlRwbyAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtZmlsZS13aW4uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1maWxlLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLWZpbGUtd2luLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLWZpbGUtd2luLmxvIGB0ZXN0IC1mICdkYnVzLWZpbGUtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtZmlsZS13aW4uYworCitsaWJkYnVzXzFfbGEtZGJ1cy1waXBlLXdpbi5sbzogZGJ1cy1waXBlLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1waXBlLXdpbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtcGlwZS13aW4uVHBvIC1jIC1vIGxpYmRidXNfMV9sYS1kYnVzLXBpcGUtd2luLmxvIGB0ZXN0IC1mICdkYnVzLXBpcGUtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcGlwZS13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c18xX2xhLWRidXMtcGlwZS13aW4uVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1waXBlLXdpbi5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXBpcGUtd2luLmMnIG9iamVjdD0nbGliZGJ1c18xX2xhLWRidXMtcGlwZS13aW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtcGlwZS13aW4ubG8gYHRlc3QgLWYgJ2RidXMtcGlwZS13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1waXBlLXdpbi5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luLmxvOiBkYnVzLXN5c2RlcHMtd2luLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbi5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy13aW4ubG8gYHRlc3QgLWYgJ2RidXMtc3lzZGVwcy13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbi5UcG8gJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtd2luLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3lzZGVwcy13aW4uYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfMV9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtd2luLmMKKworbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvOiBkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5UcG8gLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYycgb2JqZWN0PSdsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC13aW4ubG86IGRidXMtdHJhbnNwb3J0LXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtd2luLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtd2luLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtd2luLmxvIGB0ZXN0IC1mICdkYnVzLXRyYW5zcG9ydC13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10cmFuc3BvcnQtd2luLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC13aW4uVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy10cmFuc3BvcnQtd2luLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdHJhbnNwb3J0LXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXRyYW5zcG9ydC13aW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtdHJhbnNwb3J0LXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy10cmFuc3BvcnQtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdHJhbnNwb3J0LXdpbi5jCisKK2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMubG86IGRidXMtc3lzZGVwcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c18xX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLlRwbyAtYyAtbyBsaWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMuVHBvICQoREVQRElSKS9saWJkYnVzXzFfbGEtZGJ1cy1zeXNkZXBzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3lzZGVwcy5jJyBvYmplY3Q9J2xpYmRidXNfMV9sYS1kYnVzLXN5c2RlcHMubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzXzFfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c18xX2xhLWRidXMtc3lzZGVwcy5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hZGRyZXNzLmxvOiBkYnVzLWFkZHJlc3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hZGRyZXNzLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtYWRkcmVzcy5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWFkZHJlc3MubG8gYHRlc3QgLWYgJ2RidXMtYWRkcmVzcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWFkZHJlc3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWFkZHJlc3MuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtYWRkcmVzcy5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLWFkZHJlc3MuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtYWRkcmVzcy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWFkZHJlc3MubG8gYHRlc3QgLWYgJ2RidXMtYWRkcmVzcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWFkZHJlc3MuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtYXV0aC5sbzogZGJ1cy1hdXRoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtYXV0aC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGguVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLmxvIGB0ZXN0IC1mICdkYnVzLWF1dGguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1hdXRoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGguUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1hdXRoLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLmxvIGB0ZXN0IC1mICdkYnVzLWF1dGguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1hdXRoLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtc2NyaXB0LmxvOiBkYnVzLWF1dGgtc2NyaXB0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtYXV0aC1zY3JpcHQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLXNjcmlwdC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtc2NyaXB0LmxvIGB0ZXN0IC1mICdkYnVzLWF1dGgtc2NyaXB0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtYXV0aC1zY3JpcHQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtc2NyaXB0LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtc2NyaXB0LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtYXV0aC1zY3JpcHQuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtYXV0aC1zY3JpcHQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLXNjcmlwdC5sbyBgdGVzdCAtZiAnZGJ1cy1hdXRoLXNjcmlwdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWF1dGgtc2NyaXB0LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWJ1cy5sbzogZGJ1cy1idXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1idXMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1idXMuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1idXMubG8gYHRlc3QgLWYgJ2RidXMtYnVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtYnVzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1idXMuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtYnVzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtYnVzLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWJ1cy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWJ1cy5sbyBgdGVzdCAtZiAnZGJ1cy1idXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1idXMuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY29ubmVjdGlvbi5sbzogZGJ1cy1jb25uZWN0aW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY29ubmVjdGlvbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNvbm5lY3Rpb24uVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jb25uZWN0aW9uLmxvIGB0ZXN0IC1mICdkYnVzLWNvbm5lY3Rpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1jb25uZWN0aW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jb25uZWN0aW9uLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNvbm5lY3Rpb24uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1jb25uZWN0aW9uLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNvbm5lY3Rpb24ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jb25uZWN0aW9uLmxvIGB0ZXN0IC1mICdkYnVzLWNvbm5lY3Rpb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1jb25uZWN0aW9uLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLmxvOiBkYnVzLWNyZWRlbnRpYWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY3JlZGVudGlhbHMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jcmVkZW50aWFscy5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLmxvIGB0ZXN0IC1mICdkYnVzLWNyZWRlbnRpYWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtY3JlZGVudGlhbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtY3JlZGVudGlhbHMuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY3JlZGVudGlhbHMubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jcmVkZW50aWFscy5sbyBgdGVzdCAtZiAnZGJ1cy1jcmVkZW50aWFscy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWNyZWRlbnRpYWxzLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWVycm9ycy5sbzogZGJ1cy1lcnJvcnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1lcnJvcnMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1lcnJvcnMuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1lcnJvcnMubG8gYHRlc3QgLWYgJ2RidXMtZXJyb3JzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtZXJyb3JzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1lcnJvcnMuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZXJyb3JzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtZXJyb3JzLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWVycm9ycy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWVycm9ycy5sbyBgdGVzdCAtZiAnZGJ1cy1lcnJvcnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1lcnJvcnMuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMta2V5cmluZy5sbzogZGJ1cy1rZXlyaW5nLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMta2V5cmluZy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWtleXJpbmcuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1rZXlyaW5nLmxvIGB0ZXN0IC1mICdkYnVzLWtleXJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1rZXlyaW5nLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1rZXlyaW5nLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWtleXJpbmcuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1rZXlyaW5nLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWtleXJpbmcubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1rZXlyaW5nLmxvIGB0ZXN0IC1mICdkYnVzLWtleXJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1rZXlyaW5nLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLmxvOiBkYnVzLW1hcnNoYWwtaGVhZGVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1oZWFkZXIubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWhlYWRlci5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLmxvIGB0ZXN0IC1mICdkYnVzLW1hcnNoYWwtaGVhZGVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC1oZWFkZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtaGVhZGVyLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWFyc2hhbC1oZWFkZXIuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1oZWFkZXIubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWhlYWRlci5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLWhlYWRlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtaGVhZGVyLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAubG86IGRidXMtbWFyc2hhbC1ieXRlc3dhcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC1ieXRlc3dhcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWFyc2hhbC1ieXRlc3dhcC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC1ieXRlc3dhcC5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5sbzogZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmxvOiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS5sbzogZGJ1cy1tZXNzYWdlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLmxvIGB0ZXN0IC1mICdkYnVzLW1lc3NhZ2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tZXNzYWdlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1tZXNzYWdlLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLmxvIGB0ZXN0IC1mICdkYnVzLW1lc3NhZ2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tZXNzYWdlLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1pc2MubG86IGRidXMtbWlzYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1pc2MubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1taXNjLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWlzYy5sbyBgdGVzdCAtZiAnZGJ1cy1taXNjLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWlzYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWlzYy5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1taXNjLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWlzYy5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1taXNjLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWlzYy5sbyBgdGVzdCAtZiAnZGJ1cy1taXNjLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWlzYy5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1ub25jZS5sbzogZGJ1cy1ub25jZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW5vbmNlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbm9uY2UuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1ub25jZS5sbyBgdGVzdCAtZiAnZGJ1cy1ub25jZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW5vbmNlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1ub25jZS5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1ub25jZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW5vbmNlLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW5vbmNlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbm9uY2UubG8gYHRlc3QgLWYgJ2RidXMtbm9uY2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1ub25jZS5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1vYmplY3QtdHJlZS5sbzogZGJ1cy1vYmplY3QtdHJlZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW9iamVjdC10cmVlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtb2JqZWN0LXRyZWUuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1vYmplY3QtdHJlZS5sbyBgdGVzdCAtZiAnZGJ1cy1vYmplY3QtdHJlZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW9iamVjdC10cmVlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1vYmplY3QtdHJlZS5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1vYmplY3QtdHJlZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW9iamVjdC10cmVlLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW9iamVjdC10cmVlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtb2JqZWN0LXRyZWUubG8gYHRlc3QgLWYgJ2RidXMtb2JqZWN0LXRyZWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1vYmplY3QtdHJlZS5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1wZW5kaW5nLWNhbGwubG86IGRidXMtcGVuZGluZy1jYWxsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGVuZGluZy1jYWxsLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGVuZGluZy1jYWxsLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGVuZGluZy1jYWxsLmxvIGB0ZXN0IC1mICdkYnVzLXBlbmRpbmctY2FsbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXBlbmRpbmctY2FsbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGVuZGluZy1jYWxsLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBlbmRpbmctY2FsbC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXBlbmRpbmctY2FsbC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1wZW5kaW5nLWNhbGwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1wZW5kaW5nLWNhbGwubG8gYHRlc3QgLWYgJ2RidXMtcGVuZGluZy1jYWxsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcGVuZGluZy1jYWxsLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXJlc291cmNlcy5sbzogZGJ1cy1yZXNvdXJjZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1yZXNvdXJjZXMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1yZXNvdXJjZXMuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1yZXNvdXJjZXMubG8gYHRlc3QgLWYgJ2RidXMtcmVzb3VyY2VzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcmVzb3VyY2VzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1yZXNvdXJjZXMuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcmVzb3VyY2VzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtcmVzb3VyY2VzLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXJlc291cmNlcy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXJlc291cmNlcy5sbyBgdGVzdCAtZiAnZGJ1cy1yZXNvdXJjZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1yZXNvdXJjZXMuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLmxvOiBkYnVzLXNlcnZlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zZXJ2ZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXIuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zZXJ2ZXIuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLmxvIGB0ZXN0IC1mICdkYnVzLXNlcnZlci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5sbzogZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLWRlYnVnLXBpcGUuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLWRlYnVnLXBpcGUubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LmxvOiBkYnVzLXNlcnZlci1zb2NrZXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItc29ja2V0LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXNvY2tldC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci1zb2NrZXQubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLXNvY2tldC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci1zb2NrZXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci1zb2NrZXQuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXNvY2tldC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNlcnZlci1zb2NrZXQuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXNvY2tldC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci1zb2NrZXQubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLXNvY2tldC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci1zb2NrZXQuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdXVpZGdlbi5sbzogZGJ1cy11dWlkZ2VuLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdXVpZGdlbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXV1aWRnZW4uVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11dWlkZ2VuLmxvIGB0ZXN0IC1mICdkYnVzLXV1aWRnZW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy11dWlkZ2VuLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11dWlkZ2VuLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXV1aWRnZW4uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy11dWlkZ2VuLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXV1aWRnZW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11dWlkZ2VuLmxvIGB0ZXN0IC1mICdkYnVzLXV1aWRnZW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy11dWlkZ2VuLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci11bml4LmxvOiBkYnVzLXNlcnZlci11bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXVuaXgubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItdW5peC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXNlcnZlci11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci11bml4LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci11bml4LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc2VydmVyLXVuaXguYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXVuaXgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItdW5peC5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItdW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci11bml4LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci13aW4ubG86IGRidXMtc2VydmVyLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci13aW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItd2luLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXdpbi5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItd2luLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc2VydmVyLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItd2luLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2VydmVyLXdpbi5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaGEubG86IGRidXMtc2hhLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2hhLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2hhLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2hhLmxvIGB0ZXN0IC1mICdkYnVzLXNoYS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNoYS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2hhLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNoYS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNoYS5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaGEubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaGEubG8gYHRlc3QgLWYgJ2RidXMtc2hhLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2hhLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNpZ25hdHVyZS5sbzogZGJ1cy1zaWduYXR1cmUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaWduYXR1cmUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaWduYXR1cmUuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaWduYXR1cmUubG8gYHRlc3QgLWYgJ2RidXMtc2lnbmF0dXJlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2lnbmF0dXJlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaWduYXR1cmUuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2lnbmF0dXJlLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc2lnbmF0dXJlLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNpZ25hdHVyZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNpZ25hdHVyZS5sbyBgdGVzdCAtZiAnZGJ1cy1zaWduYXR1cmUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zaWduYXR1cmUuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGltZW91dC5sbzogZGJ1cy10aW1lb3V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGltZW91dC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRpbWVvdXQuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10aW1lb3V0LmxvIGB0ZXN0IC1mICdkYnVzLXRpbWVvdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10aW1lb3V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10aW1lb3V0LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRpbWVvdXQuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy10aW1lb3V0LmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRpbWVvdXQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10aW1lb3V0LmxvIGB0ZXN0IC1mICdkYnVzLXRpbWVvdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10aW1lb3V0LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRocmVhZHMubG86IGRidXMtdGhyZWFkcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRocmVhZHMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10aHJlYWRzLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGhyZWFkcy5sbyBgdGVzdCAtZiAnZGJ1cy10aHJlYWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdGhyZWFkcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGhyZWFkcy5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10aHJlYWRzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdGhyZWFkcy5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10aHJlYWRzLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGhyZWFkcy5sbyBgdGVzdCAtZiAnZGJ1cy10aHJlYWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdGhyZWFkcy5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQubG86IGRidXMtdHJhbnNwb3J0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LmxvIGB0ZXN0IC1mICdkYnVzLXRyYW5zcG9ydC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRyYW5zcG9ydC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXRyYW5zcG9ydC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQubG8gYHRlc3QgLWYgJ2RidXMtdHJhbnNwb3J0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdHJhbnNwb3J0LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC1zb2NrZXQubG86IGRidXMtdHJhbnNwb3J0LXNvY2tldC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC1zb2NrZXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXNvY2tldC5sbyBgdGVzdCAtZiAnZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdHJhbnNwb3J0LXNvY2tldC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXNvY2tldC5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdHJhbnNwb3J0LXNvY2tldC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtc29ja2V0LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXNvY2tldC5sbyBgdGVzdCAtZiAnZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdHJhbnNwb3J0LXNvY2tldC5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy13YXRjaC5sbzogZGJ1cy13YXRjaC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXdhdGNoLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtd2F0Y2guVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy13YXRjaC5sbyBgdGVzdCAtZiAnZGJ1cy13YXRjaC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXdhdGNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy13YXRjaC5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy13YXRjaC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXdhdGNoLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXdhdGNoLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtd2F0Y2gubG8gYHRlc3QgLWYgJ2RidXMtd2F0Y2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy13YXRjaC5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1kYXRhc2xvdC5sbzogZGJ1cy1kYXRhc2xvdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWRhdGFzbG90LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZGF0YXNsb3QuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1kYXRhc2xvdC5sbyBgdGVzdCAtZiAnZGJ1cy1kYXRhc2xvdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWRhdGFzbG90LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1kYXRhc2xvdC5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1kYXRhc2xvdC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLWRhdGFzbG90LmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWRhdGFzbG90LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZGF0YXNsb3QubG8gYHRlc3QgLWYgJ2RidXMtZGF0YXNsb3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1kYXRhc2xvdC5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLmxvOiBkYnVzLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWZpbGUubG8gYHRlc3QgLWYgJ2RidXMtZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWZpbGUuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLWZpbGUuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWZpbGUubG8gYHRlc3QgLWYgJ2RidXMtZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWZpbGUuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtaGFzaC5sbzogZGJ1cy1oYXNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtaGFzaC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWhhc2guVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1oYXNoLmxvIGB0ZXN0IC1mICdkYnVzLWhhc2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1oYXNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1oYXNoLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWhhc2guUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1oYXNoLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWhhc2gubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1oYXNoLmxvIGB0ZXN0IC1mICdkYnVzLWhhc2guYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1oYXNoLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWludGVybmFscy5sbzogZGJ1cy1pbnRlcm5hbHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1pbnRlcm5hbHMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1pbnRlcm5hbHMuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1pbnRlcm5hbHMubG8gYHRlc3QgLWYgJ2RidXMtaW50ZXJuYWxzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtaW50ZXJuYWxzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1pbnRlcm5hbHMuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtaW50ZXJuYWxzLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtaW50ZXJuYWxzLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWludGVybmFscy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWludGVybmFscy5sbyBgdGVzdCAtZiAnZGJ1cy1pbnRlcm5hbHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1pbnRlcm5hbHMuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbGlzdC5sbzogZGJ1cy1saXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbGlzdC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWxpc3QuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1saXN0LmxvIGB0ZXN0IC1mICdkYnVzLWxpc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1saXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1saXN0LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWxpc3QuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1saXN0LmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWxpc3QubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1saXN0LmxvIGB0ZXN0IC1mICdkYnVzLWxpc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1saXN0LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYmFzaWMubG86IGRidXMtbWFyc2hhbC1iYXNpYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYmFzaWMubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJhc2ljLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1iYXNpYy5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLWJhc2ljLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC1iYXNpYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1iYXNpYy5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJhc2ljLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWFyc2hhbC1iYXNpYy5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJhc2ljLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1iYXNpYy5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLWJhc2ljLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC1iYXNpYy5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZW1vcnkubG86IGRidXMtbWVtb3J5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtb3J5LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtb3J5LlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtb3J5LmxvIGB0ZXN0IC1mICdkYnVzLW1lbW9yeS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1lbW9yeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtb3J5LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lbW9yeS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW1lbW9yeS5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZW1vcnkubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZW1vcnkubG8gYHRlc3QgLWYgJ2RidXMtbWVtb3J5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWVtb3J5LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lbXBvb2wubG86IGRidXMtbWVtcG9vbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lbXBvb2wubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZW1wb29sLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtcG9vbC5sbyBgdGVzdCAtZiAnZGJ1cy1tZW1wb29sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWVtcG9vbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtcG9vbC5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZW1wb29sLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWVtcG9vbC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZW1wb29sLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVtcG9vbC5sbyBgdGVzdCAtZiAnZGJ1cy1tZW1wb29sLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWVtcG9vbC5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLmxvOiBkYnVzLXBpcGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUubG8gYHRlc3QgLWYgJ2RidXMtcGlwZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXBpcGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXBpcGUuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUubG8gYHRlc3QgLWYgJ2RidXMtcGlwZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXBpcGUuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3RyaW5nLmxvOiBkYnVzLXN0cmluZy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy5sbyBgdGVzdCAtZiAnZGJ1cy1zdHJpbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zdHJpbmcuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zdHJpbmcuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zdHJpbmcuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3RyaW5nLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3RyaW5nLmxvIGB0ZXN0IC1mICdkYnVzLXN0cmluZy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN0cmluZy5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5sbzogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci1sYXVuY2hkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLWxhdW5jaGQuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5sbyBgdGVzdCAtZiAnZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNlcnZlci1sYXVuY2hkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zZXJ2ZXItbGF1bmNoZC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNlcnZlci1sYXVuY2hkLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNlcnZlci1sYXVuY2hkLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2VydmVyLWxhdW5jaGQubG8gYHRlc3QgLWYgJ2RidXMtc2VydmVyLWxhdW5jaGQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLXVuaXgubG86IGRidXMtZmlsZS11bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS11bml4LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS11bml4LlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS11bml4LmxvIGB0ZXN0IC1mICdkYnVzLWZpbGUtdW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLWZpbGUtdW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS11bml4LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWZpbGUtdW5peC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLWZpbGUtdW5peC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLXVuaXgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLXVuaXgubG8gYHRlc3QgLWYgJ2RidXMtZmlsZS11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtZmlsZS11bml4LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUtdW5peC5sbzogZGJ1cy1waXBlLXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXVuaXgubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXVuaXguVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXVuaXgubG8gYHRlc3QgLWYgJ2RidXMtcGlwZS11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcGlwZS11bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXVuaXguVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS11bml4LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtcGlwZS11bml4LmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUtdW5peC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUtdW5peC5sbyBgdGVzdCAtZiAnZGJ1cy1waXBlLXVuaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1waXBlLXVuaXguYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11bml4LmxvOiBkYnVzLXN5c2RlcHMtdW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdW5peC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdW5peC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdW5peC5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXVuaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdW5peC5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXVuaXguUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zeXNkZXBzLXVuaXguYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11bml4LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtdW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtdW5peC5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXB0aHJlYWQubG86IGRidXMtc3lzZGVwcy1wdGhyZWFkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtcHRocmVhZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtcHRocmVhZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy1wdGhyZWFkLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtcHRocmVhZC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXN5c2RlcHMtcHRocmVhZC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXB0aHJlYWQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXB0aHJlYWQubG8gYHRlc3QgLWYgJ2RidXMtc3lzZGVwcy1wdGhyZWFkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy1wdGhyZWFkLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC11bml4LmxvOiBkYnVzLXRyYW5zcG9ydC11bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXVuaXgubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtdW5peC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXRyYW5zcG9ydC11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdHJhbnNwb3J0LXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC11bml4LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC11bml4LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdHJhbnNwb3J0LXVuaXguYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXVuaXgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtdW5peC5sbyBgdGVzdCAtZiAnZGJ1cy10cmFuc3BvcnQtdW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRyYW5zcG9ydC11bml4LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi5sbzogZGJ1cy11c2VyZGIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11c2VyZGIubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11c2VyZGIuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11c2VyZGIubG8gYHRlc3QgLWYgJ2RidXMtdXNlcmRiLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdXNlcmRiLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11c2VyZGIuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdXNlcmRiLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdXNlcmRiLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi5sbyBgdGVzdCAtZiAnZGJ1cy11c2VyZGIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy11c2VyZGIuYworCitsaWJkYnVzX2ludGVybmFsX2xhLXNkLWRhZW1vbi5sbzogc2QtZGFlbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLXNkLWRhZW1vbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1zZC1kYWVtb24uVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtc2QtZGFlbW9uLmxvIGB0ZXN0IC1mICdzZC1kYWVtb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2QtZGFlbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtc2QtZGFlbW9uLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1zZC1kYWVtb24uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2QtZGFlbW9uLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1zZC1kYWVtb24ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtc2QtZGFlbW9uLmxvIGB0ZXN0IC1mICdzZC1kYWVtb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2QtZGFlbW9uLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5sbzogZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUubG8gYHRlc3QgLWYgJ2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy13aW5jZS1nbHVlLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS13aW4ubG86IGRidXMtZmlsZS13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLXdpbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWZpbGUtd2luLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS13aW4ubG8gYHRlc3QgLWYgJ2RidXMtZmlsZS13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1maWxlLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS13aW4uVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtZmlsZS13aW4uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1maWxlLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1maWxlLXdpbi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWZpbGUtd2luLmxvIGB0ZXN0IC1mICdkYnVzLWZpbGUtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtZmlsZS13aW4uYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS13aW4ubG86IGRidXMtcGlwZS13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXdpbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUtd2luLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS13aW4ubG8gYHRlc3QgLWYgJ2RidXMtcGlwZS13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1waXBlLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS13aW4uVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtcGlwZS13aW4uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1waXBlLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1waXBlLXdpbi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXBpcGUtd2luLmxvIGB0ZXN0IC1mICdkYnVzLXBpcGUtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtcGlwZS13aW4uYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy13aW4ubG86IGRidXMtc3lzZGVwcy13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtd2luLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy13aW4ubG8gYHRlc3QgLWYgJ2RidXMtc3lzZGVwcy13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy13aW4uVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy13aW4uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zeXNkZXBzLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXdpbi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtd2luLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy13aW4uYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvOiBkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtd2luLmxvOiBkYnVzLXRyYW5zcG9ydC13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10cmFuc3BvcnQtd2luLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXdpbi5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC13aW4ubG8gYHRlc3QgLWYgJ2RidXMtdHJhbnNwb3J0LXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRyYW5zcG9ydC13aW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC13aW4uVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXdpbi5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXRyYW5zcG9ydC13aW4uYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdHJhbnNwb3J0LXdpbi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRyYW5zcG9ydC13aW4ubG8gYHRlc3QgLWYgJ2RidXMtdHJhbnNwb3J0LXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXRyYW5zcG9ydC13aW4uYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy5sbzogZGJ1cy1zeXNkZXBzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1zeXNkZXBzLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtdXRpbC5sbzogZGJ1cy1hdXRoLXV0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLXV0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLXV0aWwuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLXV0aWwubG8gYHRlc3QgLWYgJ2RidXMtYXV0aC11dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtYXV0aC11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1hdXRoLXV0aWwuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtYXV0aC11dGlsLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtYXV0aC11dGlsLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtdXRpbC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWF1dGgtdXRpbC5sbyBgdGVzdCAtZiAnZGJ1cy1hdXRoLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1hdXRoLXV0aWwuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY3JlZGVudGlhbHMtdXRpbC5sbzogZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtY3JlZGVudGlhbHMtdXRpbC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLXV0aWwuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jcmVkZW50aWFscy11dGlsLmxvIGB0ZXN0IC1mICdkYnVzLWNyZWRlbnRpYWxzLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jcmVkZW50aWFscy11dGlsLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLXV0aWwuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1jcmVkZW50aWFscy11dGlsLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLWNyZWRlbnRpYWxzLXV0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1jcmVkZW50aWFscy11dGlsLmxvIGB0ZXN0IC1mICdkYnVzLWNyZWRlbnRpYWxzLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1haW5sb29wLmxvOiBkYnVzLW1haW5sb29wLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFpbmxvb3AubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYWlubG9vcC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1haW5sb29wLmxvIGB0ZXN0IC1mICdkYnVzLW1haW5sb29wLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFpbmxvb3AuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1haW5sb29wLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1haW5sb29wLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWFpbmxvb3AuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFpbmxvb3AubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYWlubG9vcC5sbyBgdGVzdCAtZiAnZGJ1cy1tYWlubG9vcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1haW5sb29wLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5sbzogZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5sbzogZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmxvIGB0ZXN0IC1mICdkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmxvIGB0ZXN0IC1mICdkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5sbzogZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwubG8gYHRlc3QgLWYgJ2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5sbyBgdGVzdCAtZiAnZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS1mYWN0b3J5LmxvOiBkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtZmFjdG9yeS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtZmFjdG9yeS5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtZmFjdG9yeS5sbyBgdGVzdCAtZiAnZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtZmFjdG9yeS5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLWZhY3RvcnkuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS1mYWN0b3J5LmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS1mYWN0b3J5LmxvIGB0ZXN0IC1mICdkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLXV0aWwubG86IGRidXMtbWVzc2FnZS11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS11dGlsLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS11dGlsLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS11dGlsLmxvIGB0ZXN0IC1mICdkYnVzLW1lc3NhZ2UtdXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLW1lc3NhZ2UtdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtbWVzc2FnZS11dGlsLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLW1lc3NhZ2UtdXRpbC5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLW1lc3NhZ2UtdXRpbC5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLXV0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1tZXNzYWdlLXV0aWwubG8gYHRlc3QgLWYgJ2RidXMtbWVzc2FnZS11dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtbWVzc2FnZS11dGlsLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNoZWxsLmxvOiBkYnVzLXNoZWxsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2hlbGwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaGVsbC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNoZWxsLmxvIGB0ZXN0IC1mICdkYnVzLXNoZWxsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc2hlbGwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNoZWxsLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNoZWxsLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc2hlbGwuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc2hlbGwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zaGVsbC5sbyBgdGVzdCAtZiAnZGJ1cy1zaGVsbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNoZWxsLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC11bml4LmxvOiBkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLXVuaXgubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC11bml4LmxvIGB0ZXN0IC1mICdkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy11dGlsLXVuaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC11bml4LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC11bml4LlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3lzZGVwcy11dGlsLXVuaXguYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLXVuaXgubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi11dGlsLmxvOiBkYnVzLXVzZXJkYi11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdXNlcmRiLXV0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11c2VyZGItdXRpbC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi11dGlsLmxvIGB0ZXN0IC1mICdkYnVzLXVzZXJkYi11dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtdXNlcmRiLXV0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi11dGlsLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXVzZXJkYi11dGlsLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtdXNlcmRiLXV0aWwuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdXNlcmRiLXV0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy11c2VyZGItdXRpbC5sbyBgdGVzdCAtZiAnZGJ1cy11c2VyZGItdXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXVzZXJkYi11dGlsLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNwYXduLmxvOiBkYnVzLXNwYXduLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zcGF3bi5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNwYXduLmxvIGB0ZXN0IC1mICdkYnVzLXNwYXduLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3Bhd24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNwYXduLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNwYXduLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3Bhd24uYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zcGF3bi5sbyBgdGVzdCAtZiAnZGJ1cy1zcGF3bi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNwYXduLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC13aW4ubG86IGRidXMtc3lzZGVwcy11dGlsLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC13aW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwtd2luLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy11dGlsLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLXdpbi5UcG8gJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwtd2luLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3lzZGVwcy11dGlsLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGliZGJ1c19pbnRlcm5hbF9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLXdpbi5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy11dGlsLXdpbi5jCisKK2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zcGF3bi13aW4ubG86IGRidXMtc3Bhd24td2luLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24td2luLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24td2luLlRwbyAtYyAtbyBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24td2luLmxvIGB0ZXN0IC1mICdkYnVzLXNwYXduLXdpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXNwYXduLXdpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3Bhd24td2luLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXNwYXduLXdpbi5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYnVzLXNwYXduLXdpbi5jJyBvYmplY3Q9J2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zcGF3bi13aW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zcGF3bi13aW4ubG8gYHRlc3QgLWYgJ2RidXMtc3Bhd24td2luLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3Bhd24td2luLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy11dGlsLmxvOiBkYnVzLXN0cmluZy11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3RyaW5nLXV0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zdHJpbmctdXRpbC5UcG8gLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy11dGlsLmxvIGB0ZXN0IC1mICdkYnVzLXN0cmluZy11dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3RyaW5nLXV0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy11dGlsLlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN0cmluZy11dGlsLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3RyaW5nLXV0aWwuYycgb2JqZWN0PSdsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3RyaW5nLXV0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zdHJpbmctdXRpbC5sbyBgdGVzdCAtZiAnZGJ1cy1zdHJpbmctdXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYnVzLXN0cmluZy11dGlsLmMKKworbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC5sbzogZGJ1cy1zeXNkZXBzLXV0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwubG8gYHRlc3QgLWYgJ2RidXMtc3lzZGVwcy11dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRidXMtc3lzZGVwcy11dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy1zeXNkZXBzLXV0aWwuVHBvICQoREVQRElSKS9saWJkYnVzX2ludGVybmFsX2xhLWRidXMtc3lzZGVwcy11dGlsLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RidXMtc3lzZGVwcy11dGlsLmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYmRidXNfaW50ZXJuYWxfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXN5c2RlcHMtdXRpbC5sbyBgdGVzdCAtZiAnZGJ1cy1zeXNkZXBzLXV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy1zeXNkZXBzLXV0aWwuYworCitsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGVzdC5sbzogZGJ1cy10ZXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkYnVzX2ludGVybmFsX2xhLWRidXMtdGVzdC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRlc3QuVHBvIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10ZXN0LmxvIGB0ZXN0IC1mICdkYnVzLXRlc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10ZXN0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL2xpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10ZXN0LlRwbyAkKERFUERJUikvbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRlc3QuUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGJ1cy10ZXN0LmMnIG9iamVjdD0nbGliZGJ1c19pbnRlcm5hbF9sYS1kYnVzLXRlc3QubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJkYnVzX2ludGVybmFsX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRidXNfaW50ZXJuYWxfbGEtZGJ1cy10ZXN0LmxvIGB0ZXN0IC1mICdkYnVzLXRlc3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGJ1cy10ZXN0LmMKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtZGJ1c2luY2x1ZGVIRUFERVJTOiAkKGRidXNpbmNsdWRlX0hFQURFUlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChkYnVzaW5jbHVkZWRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGRidXNpbmNsdWRlZGlyKSIKKwlAbGlzdD0nJChkYnVzaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQoZGJ1c2luY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IFwKKwlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0hFQURFUikgJCRmaWxlcyAnJChERVNURElSKSQoZGJ1c2luY2x1ZGVkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgIiQoREVTVERJUikkKGRidXNpbmNsdWRlZGlyKSIgfHwgZXhpdCAkJD87IFwKKwlkb25lCisKK3VuaW5zdGFsbC1kYnVzaW5jbHVkZUhFQURFUlM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChkYnVzaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQoZGJ1c2luY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCisJdGVzdCAtbiAiJCRmaWxlcyIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKGRidXNpbmNsdWRlZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKGRidXNpbmNsdWRlZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworaW5zdGFsbC1ub2Rpc3RfZGJ1c2FyY2hpbmNsdWRlSEVBREVSUzogJChub2Rpc3RfZGJ1c2FyY2hpbmNsdWRlX0hFQURFUlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChkYnVzYXJjaGluY2x1ZGVkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChkYnVzYXJjaGluY2x1ZGVkaXIpIgorCUBsaXN0PSckKG5vZGlzdF9kYnVzYXJjaGluY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGRidXNhcmNoaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgXAorCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJGZpbGVzICckKERFU1RESVIpJChkYnVzYXJjaGluY2x1ZGVkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgIiQoREVTVERJUikkKGRidXNhcmNoaW5jbHVkZWRpcikiIHx8IGV4aXQgJCQ/OyBcCisJZG9uZQorCit1bmluc3RhbGwtbm9kaXN0X2RidXNhcmNoaW5jbHVkZUhFQURFUlM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChub2Rpc3RfZGJ1c2FyY2hpbmNsdWRlX0hFQURFUlMpJzsgdGVzdCAtbiAiJChkYnVzYXJjaGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRwOyBkb25lIHwgc2VkIC1lICdzfF4uKi98fCdgOyBcCisJdGVzdCAtbiAiJCRmaWxlcyIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKGRidXNhcmNoaW5jbHVkZWRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChkYnVzYXJjaGluY2x1ZGVkaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2NoZWNrLVRFU1RTOiAkKFRFU1RTKQorCUBmYWlsZWQ9MDsgYWxsPTA7IHhmYWlsPTA7IHhwYXNzPTA7IHNraXA9MDsgXAorCXNyY2Rpcj0kKHNyY2Rpcik7IGV4cG9ydCBzcmNkaXI7IFwKKwlsaXN0PScgJChURVNUUykgJzsgXAorCSQoYW1fX3R0eV9jb2xvcnMpOyBcCisJaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBmb3IgdHN0IGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mIC4vJCR0c3Q7IHRoZW4gZGlyPS4vOyBcCisJICAgIGVsaWYgdGVzdCAtZiAkJHRzdDsgdGhlbiBkaXI9OyBcCisJICAgIGVsc2UgZGlyPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgICAgaWYgJChURVNUU19FTlZJUk9OTUVOVCkgJCR7ZGlyfSQkdHN0OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhwYXNzPWBleHByICQkeHBhc3MgKyAxYDsgXAorCQlmYWlsZWQ9YGV4cHIgJCRmYWlsZWQgKyAxYDsgXAorCQljb2w9JCRyZWQ7IHJlcz1YUEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWNvbD0kJGdybjsgcmVzPVBBU1M7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbGlmIHRlc3QgJCQ/IC1uZSA3NzsgdGhlbiBcCisJICAgICAgYWxsPWBleHByICQkYWxsICsgMWA7IFwKKwkgICAgICBjYXNlICIgJChYRkFJTF9URVNUUykgIiBpbiBcCisJICAgICAgKltcIFwJXSQkdHN0W1wgXAldKikgXAorCQl4ZmFpbD1gZXhwciAkJHhmYWlsICsgMWA7IFwKKwkJY29sPSQkbGduOyByZXM9WEZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgKikgXAorCQlmYWlsZWQ9YGV4cHIgJCRmYWlsZWQgKyAxYDsgXAorCQljb2w9JCRyZWQ7IHJlcz1GQUlMOyBcCisJICAgICAgOzsgXAorCSAgICAgIGVzYWM7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcD1gZXhwciAkJHNraXAgKyAxYDsgXAorCSAgICAgIGNvbD0kJGJsdTsgcmVzPVNLSVA7IFwKKwkgICAgZmk7IFwKKwkgICAgZWNobyAiJCR7Y29sfSQkcmVzJCR7c3RkfTogJCR0c3QiOyBcCisJICBkb25lOyBcCisJICBpZiB0ZXN0ICIkJGFsbCIgLWVxIDE7IHRoZW4gXAorCSAgICB0ZXN0cz0idGVzdCI7IFwKKwkgICAgQWxsPSIiOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdHM9InRlc3RzIjsgXAorCSAgICBBbGw9IkFsbCAiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCR4ZmFpbCIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIHBhc3NlZCI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgaWYgdGVzdCAiJCR4ZmFpbCIgLWVxIDE7IHRoZW4gZmFpbHVyZXM9ZmFpbHVyZTsgZWxzZSBmYWlsdXJlcz1mYWlsdXJlczsgZmk7IFwKKwkgICAgICBiYW5uZXI9IiQkQWxsJCRhbGwgJCR0ZXN0cyBiZWhhdmVkIGFzIGV4cGVjdGVkICgkJHhmYWlsIGV4cGVjdGVkICQkZmFpbHVyZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZWxzZSBcCisJICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAwOyB0aGVuIFwKKwkgICAgICBiYW5uZXI9IiQkZmFpbGVkIG9mICQkYWxsICQkdGVzdHMgZmFpbGVkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhwYXNzIiAtZXEgMTsgdGhlbiBwYXNzZXM9cGFzczsgZWxzZSBwYXNzZXM9cGFzc2VzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBkaWQgbm90IGJlaGF2ZSBhcyBleHBlY3RlZCAoJCR4cGFzcyB1bmV4cGVjdGVkICQkcGFzc2VzKSI7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9IiQkYmFubmVyIjsgXAorCSAgc2tpcHBlZD0iIjsgXAorCSAgaWYgdGVzdCAiJCRza2lwIiAtbmUgMDsgdGhlbiBcCisJICAgIGlmIHRlc3QgIiQkc2tpcCIgLWVxIDE7IHRoZW4gXAorCSAgICAgIHNraXBwZWQ9IigkJHNraXAgdGVzdCB3YXMgbm90IHJ1bikiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHNraXBwZWQ9IigkJHNraXAgdGVzdHMgd2VyZSBub3QgcnVuKSI7IFwKKwkgICAgZmk7IFwKKwkgICAgdGVzdCBgZWNobyAiJCRza2lwcGVkIiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHNraXBwZWQiOyBcCisJICBmaTsgXAorCSAgcmVwb3J0PSIiOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLW5lIDAgJiYgdGVzdCAtbiAiJChQQUNLQUdFX0JVR1JFUE9SVCkiOyB0aGVuIFwKKwkgICAgcmVwb3J0PSJQbGVhc2UgcmVwb3J0IHRvICQoUEFDS0FHRV9CVUdSRVBPUlQpIjsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHJlcG9ydCIgfCB3YyAtY2AgLWxlIGBlY2hvICIkJGJhbm5lciIgfCB3YyAtY2AgfHwgXAorCSAgICAgIGRhc2hlcz0iJCRyZXBvcnQiOyBcCisJICBmaTsgXAorCSAgZGFzaGVzPWBlY2hvICIkJGRhc2hlcyIgfCBzZWQgcy8uLz0vZ2A7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgdGhlbiBcCisJICAgIGVjaG8gIiQkZ3JuJCRkYXNoZXMiOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAiJCRyZWQkJGRhc2hlcyI7IFwKKwkgIGZpOyBcCisJICBlY2hvICIkJGJhbm5lciI7IFwKKwkgIHRlc3QgLXogIiQkc2tpcHBlZCIgfHwgZWNobyAiJCRza2lwcGVkIjsgXAorCSAgdGVzdCAteiAiJCRyZXBvcnQiIHx8IGVjaG8gIiQkcmVwb3J0IjsgXAorCSAgZWNobyAiJCRkYXNoZXMkJHN0ZCI7IFwKKwkgIHRlc3QgIiQkZmFpbGVkIiAtZXEgMDsgXAorCWVsc2UgOjsgZmkKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stVEVTVFMKK2NoZWNrOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChMVExJQlJBUklFUykgJChQUk9HUkFNUykgJChIRUFERVJTKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGRidXNpbmNsdWRlZGlyKSIgIiQoREVTVERJUikkKGRidXNhcmNoaW5jbHVkZWRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoQlVJTFRfU09VUkNFUykiIHx8IHJtIC1mICQoQlVJTFRfU09VUkNFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIGNsZWFuLWxvY2FsIFwKKwljbGVhbi1ub2luc3RMVExJQlJBUklFUyBjbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1kYnVzaW5jbHVkZUhFQURFUlMgXAorCWluc3RhbGwtbm9kaXN0X2RidXNhcmNoaW5jbHVkZUhFQURFUlMKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtZGJ1c2luY2x1ZGVIRUFERVJTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCisJdW5pbnN0YWxsLW5vZGlzdF9kYnVzYXJjaGluY2x1ZGVIRUFERVJTCisKKy5NQUtFOiBhbGwgY2hlY2sgY2hlY2stYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLVRFU1RTIGNoZWNrLWFtIGNsZWFuIFwKKwljbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgY2xlYW4tbG9jYWwgXAorCWNsZWFuLW5vaW5zdExUTElCUkFSSUVTIGNsZWFuLW5vaW5zdFBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBcCisJaW5zdGFsbC1kYnVzaW5jbHVkZUhFQURFUlMgaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKKwlpbnN0YWxsLW1hbiBpbnN0YWxsLW5vZGlzdF9kYnVzYXJjaGluY2x1ZGVIRUFERVJTIGluc3RhbGwtcGRmIFwKKwlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtZGJ1c2luY2x1ZGVIRUFERVJTIFwKKwl1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAorCXVuaW5zdGFsbC1ub2Rpc3RfZGJ1c2FyY2hpbmNsdWRlSEVBREVSUworCisKK0BEQlVTX1dJTl9UUlVFQC5yYy5vOgorQERCVVNfV0lOX1RSVUVACSQoV0lORFJFUykgJDwgLW8gJEAKKworY2xlYW4tbG9jYWw6CisJL2Jpbi9ybSAqLmJiICouYmJnICouZGEgKi5nY292IC5saWJzLyouZGEgLmxpYnMvKi5iYmcgfHwgdHJ1ZQorCit1cGRhdGUtc3lzdGVtZDoKKwljdXJsIGh0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9zeXN0ZW1kL3BsYWluL3NyYy9zZC1kYWVtb24uYyA+IHNkLWRhZW1vbi5jCisJY3VybCBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvc3lzdGVtZC9wbGFpbi9zcmMvc2QtZGFlbW9uLmggPiBzZC1kYWVtb24uaAorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYWRkcmVzcy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWFkZHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDQ4NGRjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWFkZHJlc3MuYwpAQCAtMCwwICsxLDgyNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWFkZHJlc3MuYyAgU2VydmVyIGFkZHJlc3MgcGFyc2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWFkZHJlc3MuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQWRkcmVzc0ludGVybmFscyBBZGRyZXNzIHBhcnNpbmcKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgcGFyc2luZyBhZGRyZXNzZXMgb2YgRC1CdXMgc2VydmVycy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogSW50ZXJuYWxzIG9mIERCdXNBZGRyZXNzRW50cnkgCisgKi8KK3N0cnVjdCBEQnVzQWRkcmVzc0VudHJ5Cit7CisgIERCdXNTdHJpbmcgbWV0aG9kOyAvKio8IFRoZSBhZGRyZXNzIHR5cGUgKHVuaXgsIHRjcCwgZXRjLikgKi8KKworICBEQnVzTGlzdCAqa2V5czsgICAgLyoqPCBMaXN0IG9mIGtleXMgKi8KKyAgREJ1c0xpc3QgKnZhbHVlczsgIC8qKjwgTGlzdCBvZiB2YWx1ZXMgKi8KK307CisKKworLyoqCisgKgorICogU2V0cyAjREJVU19FUlJPUl9CQURfQUREUkVTUy4KKyAqIElmIGFkZHJlc3NfcHJvYmxlbV90eXBlIGFuZCBhZGRyZXNzX3Byb2JsZW1fZmllbGQgYXJlIG5vdCAjTlVMTCwKKyAqIHNldHMgYW4gZXJyb3IgbWVzc2FnZSBhYm91dCBob3cgdGhlIGZpZWxkIGlzIG5vIGdvb2QuIE90aGVyd2lzZSwgc2V0cworICogYWRkcmVzc19wcm9ibGVtX290aGVyIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICogCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHRvIHNldAorICogQHBhcmFtIGFkZHJlc3NfcHJvYmxlbV90eXBlIHRoZSBhZGRyZXNzIHR5cGUgb2YgdGhlIGJhZCBhZGRyZXNzIG9yICNOVUxMCisgKiBAcGFyYW0gYWRkcmVzc19wcm9ibGVtX2ZpZWxkIHRoZSBtaXNzaW5nIGZpZWxkIG9mIHRoZSBiYWQgYWRkcmVzcyBvciAjTlVMTAorICogQHBhcmFtIGFkZHJlc3NfcHJvYmxlbV9vdGhlciBhbnkgb3RoZXIgZXJyb3IgbWVzc2FnZSBvciAjTlVMTAorICovCit2b2lkCitfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKERCdXNFcnJvciAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzX3Byb2JsZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzc19wcm9ibGVtX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzX3Byb2JsZW1fb3RoZXIpCit7CisgIGlmIChhZGRyZXNzX3Byb2JsZW1fdHlwZSAhPSBOVUxMKQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBhZGRyZXNzIG9mIHR5cGUgJXMgd2FzIG1pc3NpbmcgYXJndW1lbnQgJXMiLAorICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3Byb2JsZW1fdHlwZSwgYWRkcmVzc19wcm9ibGVtX2ZpZWxkKTsKKyAgZWxzZQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBzZXJ2ZXIgYWRkcmVzczogJXMiLAorICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3Byb2JsZW1fb3RoZXIpOworfQorCisvKioKKyAqICNUUlVFIGlmIHRoZSBieXRlIG5lZWQgbm90IGJlIGVzY2FwZWQgd2hlbiBmb3VuZCBpbiBhIGRidXMgYWRkcmVzcy4KKyAqIEFsbCBvdGhlciBieXRlcyBhcmUgcmVxdWlyZWQgdG8gYmUgZXNjYXBlZCBpbiBhIHZhbGlkIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgX0RCVVNfQUREUkVTU19PUFRJT05BTExZX0VTQ0FQRURfQllURShiKSAgICAgICAgXAorICAgICAgICAgKCgoYikgPj0gJ2EnICYmIChiKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKChiKSA+PSAnQScgJiYgKGIpIDw9ICdaJykgfHwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoKGIpID49ICcwJyAmJiAoYikgPD0gJzknKSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnLScgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICdfJyB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoYikgPT0gJy8nIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnXFwnIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICcqJyB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnLicpCisKKy8qKgorICogQXBwZW5kcyBhbiBlc2NhcGVkIHZlcnNpb24gb2Ygb25lIHN0cmluZyB0byBhbm90aGVyIHN0cmluZywKKyAqIHVzaW5nIHRoZSBELUJ1cyBhZGRyZXNzIGVzY2FwaW5nIG1lY2hhbmlzbQorICoKKyAqIEBwYXJhbSBlc2NhcGVkIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcGFyYW0gdW5lc2NhcGVkIHRoZSBzdHJpbmcgdG8gZXNjYXBlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkIChEQnVzU3RyaW5nICAgICAgICplc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdW5lc2NhcGVkKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICplbmQ7CisgIGRidXNfYm9vbF90IHJldDsKKyAgaW50IG9yaWdfbGVuOworCisgIHJldCA9IEZBTFNFOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVzY2FwZWQpOworICBwID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1bmVzY2FwZWQpOworICBlbmQgPSBwICsgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHVuZXNjYXBlZCk7CisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoX0RCVVNfQUREUkVTU19PUFRJT05BTExZX0VTQ0FQRURfQllURSAoKnApKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGVzY2FwZWQsICpwKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZXNjYXBlZCwgJyUnKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlX2FzX2hleCAoZXNjYXBlZCwgKnApKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytwOworICAgIH0KKworICByZXQgPSBUUlVFOworICAKKyBvdXQ6CisgIGlmICghcmV0KQorICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChlc2NhcGVkLCBvcmlnX2xlbik7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzICovCisKK3N0YXRpYyB2b2lkCitkYnVzX2FkZHJlc3NfZW50cnlfZnJlZSAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnkpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeS0+bWV0aG9kKTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJ5LT5rZXlzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZW50cnktPmtleXMsIGxpbmspOworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJmVudHJ5LT5rZXlzKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPnZhbHVlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJ5LT52YWx1ZXMsIGxpbmspOworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJmVudHJ5LT52YWx1ZXMpOworICAKKyAgZGJ1c19mcmVlIChlbnRyeSk7Cit9CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNBZGRyZXNzIEFkZHJlc3MgcGFyc2luZworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBQYXJzaW5nIGFkZHJlc3NlcyBvZiBELUJ1cyBzZXJ2ZXJzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBGcmVlcyBhICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgYWRkcmVzcyBlbnRyaWVzLgorICoKKyAqIEBwYXJhbSBlbnRyaWVzIHRoZSBhcnJheS4KKyAqLwordm9pZAorZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJpZXMpCit7CisgIGludCBpOworICAKKyAgZm9yIChpID0gMDsgZW50cmllc1tpXSAhPSBOVUxMOyBpKyspCisgICAgZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUgKGVudHJpZXNbaV0pOworICBkYnVzX2ZyZWUgKGVudHJpZXMpOworfQorCitzdGF0aWMgREJ1c0FkZHJlc3NFbnRyeSAqCitjcmVhdGVfZW50cnkgKHZvaWQpCit7CisgIERCdXNBZGRyZXNzRW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gZGJ1c19uZXcwIChEQnVzQWRkcmVzc0VudHJ5LCAxKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW50cnktPm1ldGhvZCkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChlbnRyeSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGVudHJ5OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG1ldGhvZCBzdHJpbmcgb2YgYW4gYWRkcmVzcyBlbnRyeS4gIEZvciBleGFtcGxlLCBnaXZlbgorICogdGhlIGFkZHJlc3MgZW50cnkgInRjcDpob3N0PWV4YW1wbGUuY29tIiBpdCB3b3VsZCByZXR1cm4gdGhlIHN0cmluZworICogInRjcCIKKyAqCisgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5LgorICogQHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWV0aG9kLiBUaGlzIHN0cmluZworICogbXVzdCBub3QgYmUgZnJlZWQuCisgKi8KK2NvbnN0IGNoYXIgKgorZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5KQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZW50cnktPm1ldGhvZCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHZhbHVlIGZyb20gYSBrZXkgb2YgYW4gZW50cnkuIEZvciBleGFtcGxlLAorICogZ2l2ZW4gdGhlIGFkZHJlc3MgInRjcDpob3N0PWV4YW1wbGUuY29tLHBvcnQ9ODA3MyIgaWYgeW91IGFza2VkCisgKiBmb3IgdGhlIGtleSAiaG9zdCIgeW91IHdvdWxkIGdldCB0aGUgdmFsdWUgImV4YW1wbGUuY29tIgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHJlYWR5IHVuZXNjYXBlZC4KKyAqIAorICogQHBhcmFtIGVudHJ5IHRoZSBlbnRyeS4KKyAqIEBwYXJhbSBrZXkgdGhlIGtleS4KKyAqIEByZXR1cm5zIHRoZSBrZXkgdmFsdWUuIFRoaXMgc3RyaW5nIG11c3Qgbm90IGJlIGZyZWVkLgorICovCitjb25zdCBjaGFyICoKK2RidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorCQkJICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KQoreworICBEQnVzTGlzdCAqdmFsdWVzLCAqa2V5czsKKworICBrZXlzID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJ5LT5rZXlzKTsKKyAgdmFsdWVzID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJ5LT52YWx1ZXMpOworCisgIHdoaWxlIChrZXlzICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZXMgIT0gTlVMTCk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKGtleXMtPmRhdGEsIGtleSkpCisgICAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHZhbHVlcy0+ZGF0YSk7CisKKyAgICAgIGtleXMgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyeS0+a2V5cywga2V5cyk7CisgICAgICB2YWx1ZXMgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyeS0+dmFsdWVzLCB2YWx1ZXMpOworICAgIH0KKyAgCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF91bmVzY2FwZWRfdmFsdWUgKERCdXNTdHJpbmcgICAgICAgKnVuZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlc2NhcGVkX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZXNjYXBlZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqcDsKKyAgY29uc3QgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXQ7CisgIAorICByZXQgPSBGQUxTRTsKKworICBwID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChlc2NhcGVkKSArIGVzY2FwZWRfc3RhcnQ7CisgIGVuZCA9IHAgKyBlc2NhcGVkX2xlbjsKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmIChfREJVU19BRERSRVNTX09QVElPTkFMTFlfRVNDQVBFRF9CWVRFICgqcCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodW5lc2NhcGVkLCAqcCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoKnAgPT0gJyUnKQorICAgICAgICB7CisgICAgICAgICAgLyogRWZmaWNpZW5jeSBpcyBraW5nICovCisgICAgICAgICAgY2hhciBidWZbM107CisgICAgICAgICAgREJ1c1N0cmluZyBoZXg7CisgICAgICAgICAgaW50IGhleF9lbmQ7CisgICAgICAgICAgCisgICAgICAgICAgKytwOworCisgICAgICAgICAgaWYgKChwICsgMikgPiBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBELUJ1cyBhZGRyZXNzLCBwZXJjZW50IGNoYXJhY3RlciB3YXMgbm90IGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgYnVmWzBdID0gKnA7CisgICAgICAgICAgKytwOworICAgICAgICAgIGJ1ZlsxXSA9ICpwOworICAgICAgICAgIGJ1ZlsyXSA9ICdcMCc7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmhleCwgYnVmKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKCZoZXgsIDAsICZoZXhfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodW5lc2NhcGVkKSkpCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgIGlmIChoZXhfZW5kICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBELUJ1cyBhZGRyZXNzLCBwZXJjZW50IGNoYXJhY3RlciB3YXMgZm9sbG93ZWQgYnkgY2hhcmFjdGVycyBvdGhlciB0aGFuIGhleCBkaWdpdHMiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIEVycm9yLCBzaG91bGQgaGF2ZSBiZWVuIGVzY2FwZWQgKi8KKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBELUJ1cyBhZGRyZXNzLCBjaGFyYWN0ZXIgJyVjJyBzaG91bGQgaGF2ZSBiZWVuIGVzY2FwZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICpwKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK3A7CisgICAgfQorCisgIHJldCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXQgJiYgZXJyb3IgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIF9kYnVzX2Fzc2VydCAocmV0IHx8IGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisgIAorICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFBhcnNlcyBhbiBhZGRyZXNzIHN0cmluZyBvZiB0aGUgZm9ybToKKyAqCisgKiBtZXRob2Q6a2V5PXZhbHVlLGtleT12YWx1ZTttZXRob2Q6a2V5PXZhbHVlCisgKgorICogU2VlIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGZvciBjb21wbGV0ZSBkb2NzIG9uIHRoZSBmb3JtYXQuCisgKgorICogV2hlbiBjb25uZWN0aW5nIHRvIGFuIGFkZHJlc3MsIHRoZSBmaXJzdCBhZGRyZXNzIGVudHJpZXMKKyAqIGluIHRoZSBzZW1pY29sb24tc2VwYXJhdGVkIGxpc3Qgc2hvdWxkIGJlIHRyaWVkIGZpcnN0LgorICogCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcy4KKyAqIEBwYXJhbSBlbnRyeSByZXR1cm4gbG9jYXRpb24gdG8gYW4gYXJyYXkgb2YgZW50cmllcy4KKyAqIEBwYXJhbSBhcnJheV9sZW4gcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBsZW5ndGguCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0Ugb3RoZXJ3aXNlLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19wYXJzZV9hZGRyZXNzIChjb25zdCBjaGFyICAgICAgICAgKmFkZHJlc3MsCisJCSAgICBEQnVzQWRkcmVzc0VudHJ5ICoqKmVudHJ5LAorCQkgICAgaW50ICAgICAgICAgICAgICAgICphcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgcG9zLCBlbmRfcG9zLCBsZW4sIGk7CisgIERCdXNMaXN0ICplbnRyaWVzLCAqbGluazsKKyAgREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJ5X2FycmF5OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGFkZHJlc3MpOworCisgIGVudHJpZXMgPSBOVUxMOworICBwb3MgPSAwOworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgaWYgKGxlbiA9PSAwKQorICB7CisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAiRW1wdHkgYWRkcmVzcyAnJXMnIiwgYWRkcmVzcyk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICAKKyAgd2hpbGUgKHBvcyA8IGxlbikKKyAgICB7CisgICAgICBEQnVzQWRkcmVzc0VudHJ5ICplbnRyeTsKKworICAgICAgaW50IGZvdW5kX3BvczsKKworICAgICAgZW50cnkgPSBjcmVhdGVfZW50cnkgKCk7CisgICAgICBpZiAoIWVudHJ5KQorCXsKKwkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCisJICBnb3RvIGVycm9yOworCX0KKyAgICAgIAorICAgICAgLyogQXBwZW5kIHRoZSBlbnRyeSAqLworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVudHJpZXMsIGVudHJ5KSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkgIGRidXNfYWRkcmVzc19lbnRyeV9mcmVlIChlbnRyeSk7CisJICBnb3RvIGVycm9yOworCX0KKyAgICAgIAorICAgICAgLyogTG9vayBmb3IgYSBzZW1pLWNvbG9uICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCBwb3MsICI7IiwgJmVuZF9wb3MpKQorCWVuZF9wb3MgPSBsZW47CisgICAgICAKKyAgICAgIC8qIExvb2sgZm9yIHRoZSBjb2xvbiA6ICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX3RvICgmc3RyLCBwb3MsIGVuZF9wb3MsICI6IiwgJmZvdW5kX3BvcykpCisJeworCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLCAiQWRkcmVzcyBkb2VzIG5vdCBjb250YWluIGEgY29sb24iKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJnN0ciwgcG9zLCBmb3VuZF9wb3MgLSBwb3MsICZlbnRyeS0+bWV0aG9kLCAwKSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorCSAgCisgICAgICBwb3MgPSBmb3VuZF9wb3MgKyAxOworCisgICAgICB3aGlsZSAocG9zIDwgZW5kX3BvcykKKwl7CisJICBpbnQgY29tbWFfcG9zLCBlcXVhbHNfcG9zOworCisJICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX3RvICgmc3RyLCBwb3MsIGVuZF9wb3MsICIsIiwgJmNvbW1hX3BvcykpCisJICAgIGNvbW1hX3BvcyA9IGVuZF9wb3M7CisJICAKKwkgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfdG8gKCZzdHIsIHBvcywgY29tbWFfcG9zLCAiPSIsICZlcXVhbHNfcG9zKSB8fAorCSAgICAgIGVxdWFsc19wb3MgPT0gcG9zIHx8IGVxdWFsc19wb3MgKyAxID09IGNvbW1hX3BvcykKKwkgICAgeworCSAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInPScgY2hhcmFjdGVyIG5vdCBmb3VuZCBvciBoYXMgbm8gdmFsdWUgZm9sbG93aW5nIGl0Iik7CisgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIERCdXNTdHJpbmcgKmtleTsKKwkgICAgICBEQnVzU3RyaW5nICp2YWx1ZTsKKworCSAgICAgIGtleSA9IGRidXNfbmV3MCAoREJ1c1N0cmluZywgMSk7CisKKwkgICAgICBpZiAoIWtleSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgICB2YWx1ZSA9IGRidXNfbmV3MCAoREJ1c1N0cmluZywgMSk7CisJICAgICAgaWYgKCF2YWx1ZSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgICAgCisJICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoa2V5KSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsKKwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgICAgCisJICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAodmFsdWUpKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKGtleSk7CisKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKworCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmc3RyLCBwb3MsIGVxdWFsc19wb3MgLSBwb3MsIGtleSwgMCkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoa2V5KTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAodmFsdWUpOworCisJCSAgZGJ1c19mcmVlIChrZXkpOworCQkgIGRidXNfZnJlZSAodmFsdWUpOwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgICBpZiAoIWFwcGVuZF91bmVzY2FwZWRfdmFsdWUgKHZhbHVlLCAmc3RyLCBlcXVhbHNfcG9zICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYV9wb3MgLSBlcXVhbHNfcG9zIC0gMSwgZXJyb3IpKQorCQl7CisgICAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKGtleSk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKHZhbHVlKTsKKworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsJCSAgCisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVudHJ5LT5rZXlzLCBrZXkpKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CQkgIAorCQkgIF9kYnVzX3N0cmluZ19mcmVlIChrZXkpOworCQkgIF9kYnVzX3N0cmluZ19mcmVlICh2YWx1ZSk7CisKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKworCSAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbnRyeS0+dmFsdWVzLCB2YWx1ZSkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsJCSAgCisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKHZhbHVlKTsKKworCQkgIGRidXNfZnJlZSAodmFsdWUpOworCQkgIGdvdG8gZXJyb3I7CQkgIAorCQl9CisJICAgIH0KKworCSAgcG9zID0gY29tbWFfcG9zICsgMTsKKwl9CisKKyAgICAgIHBvcyA9IGVuZF9wb3MgKyAxOworICAgIH0KKworICAqYXJyYXlfbGVuID0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmZW50cmllcyk7CisgIAorICBlbnRyeV9hcnJheSA9IGRidXNfbmV3IChEQnVzQWRkcmVzc0VudHJ5ICosICphcnJheV9sZW4gKyAxKTsKKworICBpZiAoIWVudHJ5X2FycmF5KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgCisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgCisgIGVudHJ5X2FycmF5IFsqYXJyYXlfbGVuXSA9IE5VTEw7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZlbnRyaWVzKTsKKyAgaSA9IDA7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgZW50cnlfYXJyYXlbaV0gPSBsaW5rLT5kYXRhOworICAgICAgaSsrOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJpZXMsIGxpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmZW50cmllcyk7CisgICplbnRyeSA9IGVudHJ5X2FycmF5OworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfYWRkcmVzc19lbnRyeV9mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyaWVzLCBsaW5rKTsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmVudHJpZXMpOworICAKKyAgcmV0dXJuIEZBTFNFOworICAKK30KKworLyoqCisgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSB2YWx1ZSBpbiBhIGtleT12YWx1ZSBwYWlyCisgKiBmb3IgYSBELUJ1cyBhZGRyZXNzLgorICoKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdW5lc2NhcGVkIHZhbHVlCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgZXNjYXBlZCB2YWx1ZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworY2hhcioKK2RidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgKGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBEQnVzU3RyaW5nIGVzY2FwZWQ7CisgIERCdXNTdHJpbmcgdW5lc2NhcGVkOworICBjaGFyICpyZXQ7CisKKyAgcmV0ID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnVuZXNjYXBlZCwgdmFsdWUpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVzY2FwZWQpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmVzY2FwZWQsICZ1bmVzY2FwZWQpKQorICAgIGdvdG8gb3V0OworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmVzY2FwZWQsICZyZXQpKQorICAgIGdvdG8gb3V0OworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVzY2FwZWQpOworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFVuZXNjYXBlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgdmFsdWUgaW4gYSBrZXk9dmFsdWUgcGFpcgorICogZm9yIGEgRC1CdXMgYWRkcmVzcy4gTm90ZSB0aGF0IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUoKQorICogcmV0dXJucyBhbiBhbHJlYWR5LXVuZXNjYXBlZCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdmFsdWUgdGhlIGVzY2FwZWQgdmFsdWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBzZXQgaWYgdGhlIHVuZXNjYXBpbmcgZmFpbHMKKyAqIEByZXR1cm5zIG5ld2x5LWFsbG9jYXRlZCB1bmVzY2FwZWQgdmFsdWUgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK2NoYXIqCitkYnVzX2FkZHJlc3NfdW5lc2NhcGVfdmFsdWUgKGNvbnN0IGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyB1bmVzY2FwZWQ7CisgIERCdXNTdHJpbmcgZXNjYXBlZDsKKyAgY2hhciAqcmV0OworICAKKyAgcmV0ID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmVzY2FwZWQsIHZhbHVlKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1bmVzY2FwZWQpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghYXBwZW5kX3VuZXNjYXBlZF92YWx1ZSAoJnVuZXNjYXBlZCwgJmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZlc2NhcGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmdW5lc2NhcGVkLCAmcmV0KSkKKyAgICBnb3RvIG91dDsKKworIG91dDoKKyAgaWYgKHJldCA9PSBOVUxMICYmIGVycm9yICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKworICBfZGJ1c19hc3NlcnQgKHJldCAhPSBOVUxMIHx8IGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVuZXNjYXBlZCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgcHVibGljIEFQSSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKmVzY2FwZWQ7CisgIGNvbnN0IGNoYXIgKnVuZXNjYXBlZDsKK30gRXNjYXBlVGVzdDsKKworc3RhdGljIGNvbnN0IEVzY2FwZVRlc3QgZXNjYXBlX3Rlc3RzW10gPSB7CisgIHsgImFiY2RlIiwgImFiY2RlIiB9LAorICB7ICIiLCAiIiB9LAorICB7ICIlMjAlMjAiLCAiICAiIH0sCisgIHsgIiUyNCIsICIkIiB9LAorICB7ICIlMjUiLCAiJSIgfSwKKyAgeyAiYWJjJTI0IiwgImFiYyQiIH0sCisgIHsgIiUyNGFiYyIsICIkYWJjIiB9LAorICB7ICJhYmMlMjRhYmMiLCAiYWJjJGFiYyIgfSwKKyAgeyAiLyIsICIvIiB9LAorICB7ICItIiwgIi0iIH0sCisgIHsgIl8iLCAiXyIgfSwKKyAgeyAiQSIsICJBIiB9LAorICB7ICJJIiwgIkkiIH0sCisgIHsgIloiLCAiWiIgfSwKKyAgeyAiYSIsICJhIiB9LAorICB7ICJpIiwgImkiIH0sCisgIHsgInoiLCAieiIgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGludmFsaWRfZXNjYXBlZF92YWx1ZXNbXSA9IHsKKyAgIiVhIiwKKyAgIiVxIiwKKyAgIiVheiIsCisgICIlJSIsCisgICIlJCQiLAorICAiYWJjJWEiLAorICAiJWF4eXoiLAorICAiJSIsCisgICIkIiwKKyAgIiAiLAorfTsKKworZGJ1c19ib29sX3QKK19kYnVzX2FkZHJlc3NfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJpZXM7CisgIGludCBsZW47CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoZXNjYXBlX3Rlc3RzKSkKKyAgICB7CisgICAgICBjb25zdCBFc2NhcGVUZXN0ICp0ZXN0ID0gJmVzY2FwZV90ZXN0c1tpXTsKKyAgICAgIGNoYXIgKmVzY2FwZWQ7CisgICAgICBjaGFyICp1bmVzY2FwZWQ7CisKKyAgICAgIGVzY2FwZWQgPSBkYnVzX2FkZHJlc3NfZXNjYXBlX3ZhbHVlICh0ZXN0LT51bmVzY2FwZWQpOworICAgICAgaWYgKGVzY2FwZWQgPT0gTlVMTCkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGlmIChzdHJjbXAgKGVzY2FwZWQsIHRlc3QtPmVzY2FwZWQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXNjYXBlZCAnJXMnIGFzICclcycgc2hvdWxkIGhhdmUgYmVlbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHRlc3QtPnVuZXNjYXBlZCwgZXNjYXBlZCwgdGVzdC0+ZXNjYXBlZCk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGRidXNfZnJlZSAoZXNjYXBlZCk7CisKKyAgICAgIHVuZXNjYXBlZCA9IGRidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAodGVzdC0+ZXNjYXBlZCwgJmVycm9yKTsKKyAgICAgIGlmICh1bmVzY2FwZWQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gdW5lc2NhcGUgJyVzJzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdC0+ZXNjYXBlZCwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHVuZXNjYXBlZCwgdGVzdC0+dW5lc2NhcGVkKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXNjYXBlZCAnJXMnIGFzICclcycgc2hvdWxkIGhhdmUgYmVlbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHRlc3QtPmVzY2FwZWQsIHVuZXNjYXBlZCwgdGVzdC0+dW5lc2NhcGVkKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZGJ1c19mcmVlICh1bmVzY2FwZWQpOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfZXNjYXBlZF92YWx1ZXMpKQorICAgIHsKKyAgICAgIGNoYXIgKnVuZXNjYXBlZDsKKworICAgICAgdW5lc2NhcGVkID0gZGJ1c19hZGRyZXNzX3VuZXNjYXBlX3ZhbHVlIChpbnZhbGlkX2VzY2FwZWRfdmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgaWYgKHVuZXNjYXBlZCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlNob3VsZCBub3QgaGF2ZSBzdWNjZXNzZnVsbHkgdW5lc2NhcGVkICclcycgdG8gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX2VzY2FwZWRfdmFsdWVzW2ldLCB1bmVzY2FwZWQpOworICAgICAgICAgIGRidXNfZnJlZSAodW5lc2NhcGVkKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgKytpOworICAgIH0KKyAgCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzICgidW5peDpwYXRoPS90bXAvZm9vO2RlYnVnOm5hbWU9dGVzdCxzbGlmZj1zbG9mZjsiLAorCQkJICAgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHBhcnNlIGFkZHJlc3MiKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPT0gMik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzBdLCAicGF0aCIpLCAiL3RtcC9mb28iKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMV0sICJuYW1lIiksICJ0ZXN0IikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzFdLCAic2xpZmYiKSwgInNsb2ZmIikgPT0gMCk7CisgIAorICBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlIChlbnRyaWVzKTsKKworICAvKiBEaWZmZXJlbnQgcG9zc2libGUgZXJyb3JzICovCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCIiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbyIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286YmFyIiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpiYXIsYmF6IiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpiYXI9Zm9vLGJheiIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286YmFyPWZvbztiYXoiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOj1mb28iLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOmZvbz0iLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpmb28sYmFyPWJheiIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYWRkcmVzcy5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWFkZHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTFlZjBhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWFkZHJlc3MuaApAQCAtMCwwICsxLDY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYWRkcmVzcy5oICBTZXJ2ZXIgYWRkcmVzcyBwYXJzZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19BRERSRVNTX0gKKyNkZWZpbmUgREJVU19BRERSRVNTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNBZGRyZXNzCisgKiBAeworICovCisKKy8qKiBPcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgb25lIG9mIHRoZSBzZW1pY29sb24tc2VwYXJhdGVkIGl0ZW1zIGluIGFuIGFkZHJlc3MgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNBZGRyZXNzRW50cnkgREJ1c0FkZHJlc3NFbnRyeTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfcGFyc2VfYWRkcmVzcyAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgKmFkZHJlc3MsCisJCQkJCSAgIERCdXNBZGRyZXNzRW50cnkgKioqZW50cnksCisJCQkJCSAgIGludCAgICAgICAgICAgICAgICAqYXJyYXlfbGVuLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyICpkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlICAoREJ1c0FkZHJlc3NFbnRyeSAgICplbnRyeSwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgICAgICprZXkpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIgKmRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChEQnVzQWRkcmVzc0VudHJ5ICAgKmVudHJ5KTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlICAgICAoREJ1c0FkZHJlc3NFbnRyeSAgKiplbnRyaWVzKTsKKworREJVU19FWFBPUlQKK2NoYXIqIGRidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgICAoY29uc3QgY2hhciAqdmFsdWUpOworREJVU19FWFBPUlQKK2NoYXIqIGRidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAoY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0FERFJFU1NfSCAqLworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXJjaC1kZXBzLmguaW4gYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXJjaC1kZXBzLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5NTJjZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbgpAQCAtMCwwICsxLDY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IiAtKi0gKi8KKy8qIGRidXMtYXJjaC1kZXBzLmggSGVhZGVyIHdpdGggYXJjaGl0ZWN0dXJlL2NvbXBpbGVyIHNwZWNpZmljIGluZm9ybWF0aW9uLCBpbnN0YWxsZWQgdG8gbGliZGlyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4wCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfQVJDSF9ERVBTX0gKKyNkZWZpbmUgREJVU19BUkNIX0RFUFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKyNpZiBAREJVU19IQVZFX0lOVDY0QAorI2RlZmluZSBEQlVTX0hBVkVfSU5UNjQgMQorX0RCVVNfR05VQ19FWFRFTlNJT04gdHlwZWRlZiBAREJVU19JTlQ2NF9UWVBFQCBkYnVzX2ludDY0X3Q7CitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIHVuc2lnbmVkIEBEQlVTX0lOVDY0X1RZUEVAIGRidXNfdWludDY0X3Q7CisKKyNkZWZpbmUgREJVU19JTlQ2NF9DT05TVEFOVCh2YWwpICAoX0RCVVNfR05VQ19FWFRFTlNJT04gQERCVVNfSU5UNjRfQ09OU1RBTlRAKQorI2RlZmluZSBEQlVTX1VJTlQ2NF9DT05TVEFOVCh2YWwpIChfREJVU19HTlVDX0VYVEVOU0lPTiBAREJVU19VSU5UNjRfQ09OU1RBTlRAKQorCisjZWxzZQorI3VuZGVmIERCVVNfSEFWRV9JTlQ2NAorI3VuZGVmIERCVVNfSU5UNjRfQ09OU1RBTlQKKyN1bmRlZiBEQlVTX1VJTlQ2NF9DT05TVEFOVAorI2VuZGlmCisKK3R5cGVkZWYgQERCVVNfSU5UMzJfVFlQRUAgZGJ1c19pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBAREJVU19JTlQzMl9UWVBFQCBkYnVzX3VpbnQzMl90OworCit0eXBlZGVmIEBEQlVTX0lOVDE2X1RZUEVAIGRidXNfaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgQERCVVNfSU5UMTZfVFlQRUAgZGJ1c191aW50MTZfdDsKKworLyogVGhpcyBpcyBub3QgcmVhbGx5IGFyY2gtZGVwZW5kZW50LCBidXQgaXQncyBub3Qgd29ydGgKKyAqIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgZ2VuZXJhdGVkIGhlYWRlciBqdXN0IGZvciB0aGlzCisgKi8KKyNkZWZpbmUgREJVU19NQUpPUl9WRVJTSU9OIEBEQlVTX01BSk9SX1ZFUlNJT05ACisjZGVmaW5lIERCVVNfTUlOT1JfVkVSU0lPTiBAREJVU19NSU5PUl9WRVJTSU9OQAorI2RlZmluZSBEQlVTX01JQ1JPX1ZFUlNJT04gQERCVVNfTUlDUk9fVkVSU0lPTkAKKworI2RlZmluZSBEQlVTX1ZFUlNJT05fU1RSSU5HICJAREJVU19WRVJTSU9OQCIKKworI2RlZmluZSBEQlVTX1ZFUlNJT04gKChAREJVU19NQUpPUl9WRVJTSU9OQCA8PCAxNikgfCAoQERCVVNfTUlOT1JfVkVSU0lPTkAgPDwgOCkgfCAoQERCVVNfTUlDUk9fVkVSU0lPTkApKSAKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQVJDSF9ERVBTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4NWUzYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5jCkBAIC0wLDAgKzEsODAzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYXV0aC1zY3JpcHQuYyBUZXN0IERCdXNBdXRoIHVzaW5nIGEgc3BlY2lhbCBzY3JpcHQgZmlsZSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKyNpbmNsdWRlICJkYnVzLWF1dGgtc2NyaXB0LmgiCisjaW5jbHVkZSAiZGJ1cy1hdXRoLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0F1dGhTY3JpcHQgY29kZSBmb3IgcnVubmluZyB1bml0IHRlc3Qgc2NyaXB0cyBmb3IgREJ1c0F1dGgKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0F1dGggdW5pdCB0ZXN0IHNjcmlwdGluZworICoKKyAqIFRoZSBjb2RlIGluIGhlcmUgaXMgdXNlZCBmb3IgdW5pdCB0ZXN0aW5nLCBpdCBsb2FkcworICogdXAgYSBzY3JpcHQgdGhhdCB0ZXN0cyBEQnVzQXV0aC4KKyAqCisgKiBAeworICovCisKKy8qIHRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIGFwcGVuZF9xdW90ZWRfc3RyaW5nCisgKiBpbiBkYnVzLW1lc3NhZ2UtYnVpbGRlci5jCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX3F1b3RlZF9zdHJpbmcgKERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqcXVvdGVkKQoreworICBkYnVzX2Jvb2xfdCBpbl9xdW90ZXMgPSBGQUxTRTsKKyAgZGJ1c19ib29sX3QgaW5fYmFja3NsYXNoID0gRkFMU0U7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChxdW90ZWQpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYjsKKworICAgICAgYiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocXVvdGVkLCBpKTsKKworICAgICAgaWYgKGluX2JhY2tzbGFzaCkKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoYiA9PSAncicpCisgICAgICAgICAgICBhID0gJ1xyJzsKKyAgICAgICAgICBlbHNlIGlmIChiID09ICduJykKKyAgICAgICAgICAgIGEgPSAnXG4nOworICAgICAgICAgIGVsc2UgaWYgKGIgPT0gJ1xcJykKKyAgICAgICAgICAgIGEgPSAnXFwnOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImJhZCBiYWNrc2xhc2hlZCBieXRlICVjXG4iLCBiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRlc3QsIGEpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIAorICAgICAgICAgIGluX2JhY2tzbGFzaCA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChiID09ICdcXCcpCisgICAgICAgIHsKKyAgICAgICAgICBpbl9iYWNrc2xhc2ggPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChpbl9xdW90ZXMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYiA9PSAnXCcnKQorICAgICAgICAgICAgaW5fcXVvdGVzID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZGVzdCwgYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYiA9PSAnXCcnKQorICAgICAgICAgICAgaW5fcXVvdGVzID0gVFJVRTsKKyAgICAgICAgICBlbHNlIGlmIChiID09ICcgJyB8fCBiID09ICdcbicgfHwgYiA9PSAnXHQnKQorICAgICAgICAgICAgYnJlYWs7IC8qIGVuZCBvbiB3aGl0ZXNwYWNlIGlmIG5vdCBxdW90ZWQgKi8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChkZXN0LCBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzYW1lX2ZpcnN0X3dvcmQgKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmIpCit7CisgIGludCBmaXJzdF9hX2JsYW5rLCBmaXJzdF9iX2JsYW5rOworCisgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChhLCAwLCAmZmlyc3RfYV9ibGFuayk7CisgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChiLCAwLCAmZmlyc3RfYl9ibGFuayk7CisKKyAgaWYgKGZpcnN0X2FfYmxhbmsgIT0gZmlyc3RfYl9ibGFuaykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19lcXVhbF9sZW4gKGEsIGIsIGZpcnN0X2FfYmxhbmspOworfQorCitzdGF0aWMgREJ1c0F1dGhTdGF0ZQorYXV0aF9zdGF0ZV9mcm9tX3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAqc3RyKQoreyAKKyAgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiV0FJVElOR19GT1JfSU5QVVQiKSkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUOworICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKHN0ciwgIldBSVRJTkdfRk9SX01FTU9SWSIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZOworICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKHN0ciwgIkhBVkVfQllURVNfVE9fU0VORCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOworICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKHN0ciwgIk5FRURfRElTQ09OTkVDVCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfTkVFRF9ESVNDT05ORUNUOworICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKHN0ciwgIkFVVEhFTlRJQ0FURUQiKSkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQ7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgorYXV0aF9zdGF0ZV90b19zdHJpbmcgKERCdXNBdXRoU3RhdGUgc3RhdGUpCit7CisgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUOgorICAgICAgcmV0dXJuICJXQUlUSU5HX0ZPUl9JTlBVVCI7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZOgorICAgICAgcmV0dXJuICJXQUlUSU5HX0ZPUl9NRU1PUlkiOworICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX0hBVkVfQllURVNfVE9fU0VORDoKKyAgICAgIHJldHVybiAiSEFWRV9CWVRFU19UT19TRU5EIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q6CisgICAgICByZXR1cm4gIk5FRURfRElTQ09OTkVDVCI7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDoKKyAgICAgIHJldHVybiAiQVVUSEVOVElDQVRFRCI7CisgICAgfQorCisgIHJldHVybiAidW5rbm93biI7Cit9CisKK3N0YXRpYyBjaGFyICoqCitzcGxpdF9zdHJpbmcgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgaW50IGksIGosIGssIGNvdW50LCBlbmQ7CisgIGNoYXIgKiphcnJheTsKKworICBlbmQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpID0gMDsKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgaSwgJmkpOworICBmb3IgKGNvdW50ID0gMDsgaSA8IGVuZDsgY291bnQrKykKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoc3RyLCBpLCAmaSk7CisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBpLCAmaSk7CisgICAgfQorCisgIGFycmF5ID0gZGJ1c19uZXcwIChjaGFyICosIGNvdW50ICsgMSk7CisgIGlmIChhcnJheSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGkgPSAwOworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBpLCAmaSk7CisgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChzdHIsIGksICZqKTsKKworICAgICAgYXJyYXlba10gPSBkYnVzX21hbGxvYyAoaiAtIGkgKyAxKTsKKyAgICAgIGlmIChhcnJheVtrXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJyYXkpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICBtZW1jcHkgKGFycmF5W2tdLAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIGksIGogLSBpKSwgaiAtIGkpOworICAgICAgYXJyYXlba11baiAtIGldID0gJ1wwJzsKKworICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgaiwgJmkpOworICAgIH0KKyAgYXJyYXlba10gPSBOVUxMOworCisgIHJldHVybiBhcnJheTsKK30KKworc3RhdGljIHZvaWQKK2F1dGhfc2V0X3VuaXhfY3JlZGVudGlhbHMoREJ1c0F1dGggICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCBwaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7CisKKyAgY3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChjcmVkZW50aWFscyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkIChjcmVkZW50aWFscywgdWlkKTsKKyAgaWYgKHBpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF9waWQgKGNyZWRlbnRpYWxzLCBwaWQpOworCisgIF9kYnVzX2F1dGhfc2V0X2NyZWRlbnRpYWxzIChhdXRoLCBjcmVkZW50aWFscyk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKK30KKworLyoqCisgKiBSdW5zIGFuICJhdXRoIHNjcmlwdCIgd2hpY2ggaXMgYSBzY3JpcHQgZm9yIHRlc3RpbmcgdGhlCisgKiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbC4gU2NyaXB0cyBzZW5kIGFuZCByZWNlaXZlIGRhdGEsIGFuZCB0aGVuCisgKiBpbmNsdWRlIGFzc2VydGlvbnMgYWJvdXQgdGhlIHN0YXRlIG9mIGJvdGggZW5kcyBvZiB0aGUgY29ubmVjdGlvbgorICogYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZGF0YS4gQSBzY3JpcHQgc3VjY2VlZHMgaWYgdGhlc2UgYXNzZXJ0aW9ucworICogaG9sZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHRvIHJ1bgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHNjcmlwdCBzdWNjZWVkcywgI0ZBTFNFIG90aGVyd2lzZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zY3JpcHRfcnVuIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgREJ1c1N0cmluZyBmaWxlOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIERCdXNTdHJpbmcgbGluZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgbGluZV9ubzsKKyAgREJ1c0F1dGggKmF1dGg7CisgIERCdXNTdHJpbmcgZnJvbV9hdXRoOworICBEQnVzQXV0aFN0YXRlIHN0YXRlOworICBEQnVzU3RyaW5nIGNvbnRleHQ7CisgIERCdXNTdHJpbmcgZ3VpZDsKKyAgCisgIHJldHZhbCA9IEZBTFNFOworICBhdXRoID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmd1aWQsICI1ZmEwMWY0MjAyY2Q4Mzc3MDlhMzI3NGNhMGRmOWQwMCIpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJvcmdfZnJlZWRlc2t0b3BfdGVzdCIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZyb21fYXV0aCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZmaWxlLCBmaWxlbmFtZSwgJmVycm9yKSkgICAgeworICAgICAgX2RidXNfd2FybiAoIkdldHRpbmcgY29udGVudHMgb2YgJXMgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBzdGF0ZSA9IERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q7CisgIGxpbmVfbm8gPSAwOworCisgbmV4dF9pdGVyYXRpb246CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZmaWxlLCAmbGluZSkpCisgICAgeyAgICAgIAorICAgICAgbGluZV9ubyArPSAxOworCisgICAgICAvKiBfZGJ1c193YXJuICgiJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsgKi8KKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoJmxpbmUpOworCisgICAgICBpZiAoYXV0aCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUgKChzdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAoYXV0aCkpID09CisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnRtcDsKKyAgICAgICAgICAgICAgaWYgKF9kYnVzX2F1dGhfZ2V0X2J5dGVzX3RvX3NlbmQgKGF1dGgsICZ0bXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh0bXApOworCisgICAgICAgICAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2NvcHkgKHRtcCwgMCwgJmZyb21fYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZmcm9tX2F1dGgpKSkKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfYXV0aF9ieXRlc19zZW50IChhdXRoLCBjb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBlbXB0eSBsaW5lICovCisgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElnbm9yZSB0aGlzIGNvbW1lbnQgKi8KKyAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICB9CisjaWZkZWYgREJVU19XSU4KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSU5fT05MWSIpKQorICAgICAgICB7CisgICAgICAgICAgLyogSWdub3JlIHRoaXMgbGluZSAqLworICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklYX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNraXAgdGhpcyBmaWxlICovCisgICAgICAgICAgX2RidXNfd2FybiAoInNraXBwaW5nIHVuaXggb25seSBhdXRoIHNjcmlwdFxuIik7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgREJVU19VTklYCisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5JWF9PTkxZIikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZ25vcmUgdGhpcyBsaW5lICovCisgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJTl9PTkxZIikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBza2lwIHRoaXMgZmlsZSAqLworICAgICAgICAgIF9kYnVzX3dhcm4gKCJza2lwcGluZyB3aW5kb3dzIG9ubHkgYXV0aCBzY3JpcHRcbiIpOworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNMSUVOVCIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoYXV0aCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiYWxyZWFkeSBjcmVhdGVkIGEgREJ1c0F1dGggKENMSUVOVCBvciBTRVJWRVIgZ2l2ZW4gdHdpY2UpXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBhdXRoID0gX2RidXNfYXV0aF9jbGllbnRfbmV3ICgpOworICAgICAgICAgIGlmIChhdXRoID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgdG8gY3JlYXRlIERCdXNBdXRoXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiB0ZXN0IHJlZi91bnJlZiAqLworICAgICAgICAgIF9kYnVzX2F1dGhfcmVmIChhdXRoKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKworICAgICAgICAgIGNyZWRzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgICAgICAgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciBjcmVkZW50aWFsc1xuIik7CisgICAgICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgICAgICAgICBhdXRoID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgKGF1dGgsIGNyZWRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3Igc2V0dGluZyBjcmVkZW50aWFsc1xuIik7CisgICAgICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgICAgICAgICBhdXRoID0gTlVMTDsKKyAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFUlZFUiIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoYXV0aCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiYWxyZWFkeSBjcmVhdGVkIGEgREJ1c0F1dGggKENMSUVOVCBvciBTRVJWRVIgZ2l2ZW4gdHdpY2UpXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBhdXRoID0gX2RidXNfYXV0aF9zZXJ2ZXJfbmV3ICgmZ3VpZCk7CisgICAgICAgICAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBjcmVhdGUgREJ1c0F1dGhcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIHRlc3QgcmVmL3VucmVmICovCisgICAgICAgICAgX2RidXNfYXV0aF9yZWYgKGF1dGgpOworICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworCisgICAgICAgICAgY3JlZHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCk7CisgICAgICAgICAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIGNyZWRlbnRpYWxzXG4iKTsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgICAgIGF1dGggPSBOVUxMOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAoYXV0aCwgY3JlZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciBzZXR0aW5nIGNyZWRlbnRpYWxzXG4iKTsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgICAgIGF1dGggPSBOVUxMOworICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworCisgICAgICAgICAgX2RidXNfYXV0aF9zZXRfY29udGV4dCAoYXV0aCwgJmNvbnRleHQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChhdXRoID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgibXVzdCBzcGVjaWZ5IENMSUVOVCBvciBTRVJWRVJcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOT19DUkVERU5USUFMUyIpKQorICAgICAgICB7CisgICAgICAgICAgYXV0aF9zZXRfdW5peF9jcmVkZW50aWFscyAoYXV0aCwgREJVU19VSURfVU5TRVQsIERCVVNfUElEX1VOU0VUKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJPT1RfQ1JFREVOVElBTFMiKSkKKyAgICAgICAgeworICAgICAgICAgIGF1dGhfc2V0X3VuaXhfY3JlZGVudGlhbHMgKGF1dGgsIDAsIERCVVNfUElEX1VOU0VUKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNJTExZX0NSRURFTlRJQUxTIikpCisgICAgICAgIHsKKyAgICAgICAgICBhdXRoX3NldF91bml4X2NyZWRlbnRpYWxzIChhdXRoLCA0MzEyLCBEQlVTX1BJRF9VTlNFVCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBTExPV0VEX01FQ0hTIikpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICoqbWVjaHM7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKyAgICAgICAgICBtZWNocyA9IHNwbGl0X3N0cmluZyAoJmxpbmUpOworICAgICAgICAgIF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMgKGF1dGgsIChjb25zdCBjaGFyICoqKSBtZWNocyk7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAobWVjaHMpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VORCIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyB0b19zZW5kOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoJmxpbmUpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRvX3NlbmQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IHRvIGFsbG9jYXRlIHN0cmluZ1xuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFhcHBlbmRfcXVvdGVkX3N0cmluZyAoJnRvX3NlbmQsICZsaW5lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImZhaWxlZCB0byBhcHBlbmQgcXVvdGVkIHN0cmluZyBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyAnJXMnXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0b19zZW5kKSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmdG9fc2VuZCwgIlxyXG4iKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImZhaWxlZCB0byBhcHBlbmQgXHJcbiBmcm9tIGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFJlcGxhY2UgVVNFUklEX0hFWCB3aXRoIG91ciB1c2VybmFtZSBpbiBoZXggKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hlcmU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnRvX3NlbmQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVU0VSSURfSEVYIiwgJndoZXJlKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgdXNlcm5hbWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXNlcm5hbWUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciB1c2VyaWRcbiIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZ1c2VybmFtZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHVzZXJpZFxuIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZ0b19zZW5kLCB3aGVyZSwgc3RybGVuICgiVVNFUklEX0hFWCIpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmdXNlcm5hbWUsIDAsCisJCQkJCSAgICAgICZ0b19zZW5kLCB3aGVyZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgdG8gc3Vic3QgVVNFUklEX0hFWFxuIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnRvX3NlbmQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTRVJOQU1FX0hFWCIsICZ3aGVyZSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VybmFtZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHVzZXJuYW1lXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzICgmdXNlcm5hbWUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciB1c2VybmFtZVxuIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZ0b19zZW5kLCB3aGVyZSwgc3RybGVuICgiVVNFUk5BTUVfSEVYIikpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ1c2VybmFtZSwgMCwKKwkJCQkJICAgICAgJnRvX3NlbmQsIHdoZXJlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBzdWJzdCBVU0VSTkFNRV9IRVhcbiIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHsKKyAgICAgICAgICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKworICAgICAgICAgICAgX2RidXNfYXV0aF9nZXRfYnVmZmVyIChhdXRoLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0b19zZW5kLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm90IGVub3VnaCBtZW1vcnkgdG8gY2FsbCBieXRlc19yZWNlaXZlZCwgb3IgY2FuJ3QgYWRkIGJ5dGVzIHRvIGF1dGggb2JqZWN0IGFscmVhZHkgaW4gZW5kIHN0YXRlXG4iKTsKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAoYXV0aCwgYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfZGJ1c19hdXRoX3JldHVybl9idWZmZXIgKGF1dGgsIGJ1ZmZlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0b19zZW5kKSk7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1RfU1RBVEUiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNBdXRoU3RhdGUgZXhwZWN0ZWQ7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisKKyAgICAgICAgICBleHBlY3RlZCA9IGF1dGhfc3RhdGVfZnJvbV9zdHJpbmcgKCZsaW5lKTsKKyAgICAgICAgICBpZiAoZXhwZWN0ZWQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiYmFkIGF1dGggc3RhdGUgZ2l2ZW4gdG8gRVhQRUNUX1NUQVRFXG4iKTsKKyAgICAgICAgICAgICAgZ290byBwYXJzZV9mYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gc3RhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJleHBlY3RlZCBhdXRoIHN0YXRlICVzIGJ1dCBnb3QgJXMgb24gbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9zdGF0ZV90b19zdHJpbmcgKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9zdGF0ZV90b19zdHJpbmcgKHN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX0NPTU1BTkQiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgcmVjZWl2ZWQ7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVjZWl2ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtIHRvIGFsbG9jYXRlIHN0cmluZyByZWNlaXZlZFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZmcm9tX2F1dGgsICZyZWNlaXZlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBsaW5lIHBvcHBlZCBmcm9tIHRoZSBEQnVzQXV0aCBiZWluZyB0ZXN0ZWQsIGV4cGVjdGVkIGNvbW1hbmQgJXMgb24gbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbGluZSksIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlY2VpdmVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXNhbWVfZmlyc3Rfd29yZCAoJnJlY2VpdmVkLCAmbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJsaW5lICVkIGV4cGVjdGVkIGNvbW1hbmQgJyVzJyBhbmQgZ290ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZWNlaXZlZCkpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlY2VpdmVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZWNlaXZlZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1RfVU5VU0VEIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGV4cGVjdGVkOworICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVudXNlZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZleHBlY3RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW0gdG8gYWxsb2NhdGUgc3RyaW5nIGV4cGVjdGVkXG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWFwcGVuZF9xdW90ZWRfc3RyaW5nICgmZXhwZWN0ZWQsICZsaW5lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImZhaWxlZCB0byBhcHBlbmQgcXVvdGVkIHN0cmluZyBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzIChhdXRoLCAmdW51c2VkKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsICgmZXhwZWN0ZWQsIHVudXNlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2F1dGhfZGVsZXRlX3VudXNlZF9ieXRlcyAoYXV0aCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHVudXNlZCBieXRlcyAnJXMnIGFuZCBoYXZlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1bnVzZWQpKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqYXV0aG9yaXplZF9pZGVudGl0eTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRob3JpemVkX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKGF1dGgpOworICAgICAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aG9yaXplZF9pZGVudGl0eSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBhbm9ueW1vdXMgbG9naW4gb3IgZmFpbGVkIGxvZ2luLCBidXQgc29tZSBjcmVkZW50aWFscyB3ZXJlIGF1dGhvcml6ZWRcbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYUEVDVF9IQVZFX1NPTUVfQ1JFREVOVElBTFMiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqYXV0aG9yaXplZF9pZGVudGl0eTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRob3JpemVkX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKGF1dGgpOworICAgICAgICAgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChhdXRob3JpemVkX2lkZW50aXR5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHRvIGhhdmUgc29tZSBjcmVkZW50aWFscywgYnV0IHdlIGRvbid0XG4iKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1QiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZXhwZWN0ZWQ7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXhwZWN0ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtIHRvIGFsbG9jYXRlIHN0cmluZyBleHBlY3RlZFxuIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFhcHBlbmRfcXVvdGVkX3N0cmluZyAoJmV4cGVjdGVkLCAmbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJmYWlsZWQgdG8gYXBwZW5kIHF1b3RlZCBzdHJpbmcgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfbGVuICgmZXhwZWN0ZWQsICZmcm9tX2F1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZXhwZWN0ZWQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmZyb21fYXV0aCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZleHBlY3RlZCkpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBleGFjdCBzdHJpbmcgJyVzJyBhbmQgaGF2ZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZyb21fYXV0aCkpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgZ290byBwYXJzZV9mYWlsZWQ7CisKKyAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247IC8qIHNraXAgcGFyc2VfZmFpbGVkICovCisgICAgICAKKyAgICBwYXJzZV9mYWlsZWQ6CisgICAgICB7CisgICAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBwcm9jZXNzIGxpbmUgJWQgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICBsaW5lX25vLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgICAgfQorICAgIH0KKworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJBdXRoIHNjcmlwdCBpcyBib2d1cywgZGlkIG5vdCBldmVuIGhhdmUgQ0xJRU5UIG9yIFNFUlZFUlxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UgaWYgKHN0YXRlID09IERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVEKQorICAgIHsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVudXNlZDsKKworICAgICAgX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzIChhdXRoLCAmdW51c2VkKTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1bnVzZWQpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJkaWQgbm90IGV4cGVjdCB1bnVzZWQgYnl0ZXMgKHNjcmlwdHMgbXVzdCBzcGVjaWZ5IGV4cGxpY2l0bHkgaWYgdGhleSBhcmUgZXhwZWN0ZWQpXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZmcm9tX2F1dGgpID4gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgic2NyaXB0IGRpZCBub3QgaGF2ZSBFWFBFQ1RfIHN0YXRlbWVudHMgZm9yIGFsbCB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBEQnVzQXV0aFxuIik7CisgICAgICBfZGJ1c193YXJuICgiTGVmdG92ZXIgZGF0YTogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZyb21fYXV0aCkpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBpZiAoYXV0aCkKKyAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxpbmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZyb21fYXV0aCk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCisvKiogQH0gKi8KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXV0aC1zY3JpcHQuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXV0aC1zY3JpcHQuaApAQCAtMCwwICsxLDM3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYXV0aC1zY3JpcHQuaCBUZXN0IERCdXNBdXRoIHVzaW5nIGEgc3BlY2lhbCBzY3JpcHQgZmlsZSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19BVVRIX1NDUklQVF9ICisjZGVmaW5lIERCVVNfQVVUSF9TQ1JJUFRfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKworREJVU19CRUdJTl9ERUNMUworCitkYnVzX2Jvb2xfdCBfZGJ1c19hdXRoX3NjcmlwdF9ydW4gKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQVVUSF9TQ1JJUFRfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWF1dGgtdXRpbC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWF1dGgtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmU4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXV0aC11dGlsLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hdXRoLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLWF1dGguYywgYnV0IG9ubHkgdXNlZCBmb3IgdGVzdHMvYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLWF1dGguaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQXV0aAorICogQHsKKyAqLworCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLWF1dGgtc2NyaXB0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3Rfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICp0ZXN0X2Jhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqc3ViZGlyKQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGlyID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0X2RpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIHRlc3RfZGlyZWN0b3J5XG4iKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBzdWJkaXIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKyAgCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RfZGlyZWN0b3J5LCAmZmlsZW5hbWUpKSAgICAKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nXG4iKTsKKworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHByaW50ZiAoIlRlc3RpbmcgJXM6XG4iLCBzdWJkaXIpOworICAKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnRlc3RfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZpbGVuYW1lLCAiLmF1dGgtc2NyaXB0IikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5hdXRoLXNjcmlwdCBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19hdXRoX3NjcmlwdF9ydW4gKCZmdWxsX3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBmYWlsZWQ6CisKKyAgaWYgKGRpcikKKyAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGRpcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdF9kaXJlY3RvcnkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF9kaXJzIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRlc3RfZGlyZWN0b3J5LCB0ZXN0X2RhdGFfZGlyKTsKKworICBpZiAoIXByb2Nlc3NfdGVzdF9zdWJkaXIgKCZ0ZXN0X2RpcmVjdG9yeSwgImF1dGgiKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZXR2YWwgPSBUUlVFOworICAKKyBmYWlsZWQ6CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF90ZXN0IChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICAKKyAgaWYgKHRlc3RfZGF0YV9kaXIgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X2RpcnMgKHRlc3RfZGF0YV9kaXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1hdXRoLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MGQ4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXV0aC5jCkBAIC0wLDAgKzEsMjgxMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGguYyBBdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtYXV0aC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWtleXJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXNoYS5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNBdXRoIEF1dGhlbnRpY2F0aW9uCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNBdXRoIG9iamVjdAorICoKKyAqIERCdXNBdXRoIG1hbmFnZXMgdGhlIGF1dGhlbnRpY2F0aW9uIG5lZ290aWF0aW9uIHdoZW4gYSBjb25uZWN0aW9uCisgKiBpcyBmaXJzdCBlc3RhYmxpc2hlZCwgYW5kIGFsc28gbWFuYWdlIGFueSBlbmNyeXB0aW9uIHVzZWQgb3ZlciBhCisgKiBjb25uZWN0aW9uLgorICoKKyAqIEB0b2RvIHNvbWUgU0FTTCBwcm9maWxlcyByZXF1aXJlIHNlbmRpbmcgdGhlIGVtcHR5IHN0cmluZyBhcyBhCisgKiBjaGFsbGVuZ2UvcmVzcG9uc2UsIGJ1dCB3ZSBkb24ndCBjdXJyZW50bHkgYWxsb3cgdGhhdCBpbiBvdXIKKyAqIHByb3RvY29sLgorICoKKyAqIEB0b2RvIHJpZ2h0IG5vdyBzb21ldGltZXMgYm90aCBlbmRzIHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgaW5wdXQKKyAqIGZyb20gdGhlIG90aGVyIGVuZCwgZS5nLiBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZworICogREJVU19DT09LSUVfU0hBMS4KKyAqCisgKiBAdG9kbyB0aGUgY29va2llIGtleXJpbmcgbmVlZHMgdG8gYmUgY2FjaGVkIGdsb2JhbGx5IG5vdCBqdXN0CisgKiBwZXItYXV0aCAod2hpY2ggcmFpc2VzIHRocmVhZHNhZmV0eSBpc3N1ZXMgdG9vKQorICogCisgKiBAdG9kbyBncmVwIEZJWE1FIGluIGRidXMtYXV0aC5jCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0F1dGhJbnRlcm5hbHMgQXV0aGVudGljYXRpb24gaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzQXV0aCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogUHJpdmF0ZSBkZXRhaWxzIG9mIGF1dGhlbnRpY2F0aW9uIGNvZGUuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyBhbiBpbml0aWFsIGNsaWVudCByZXNwb25zZSB0byB0aGUgZ2l2ZW4gc3RyaW5nCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0luaXRpYWxSZXNwb25zZUZ1bmN0aW9uKSAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpyZXNwb25zZSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSBibG9jayBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIuCisgKiBpLmUuIGhhbmRsZXMgYSBEQVRBIGNvbW1hbmQuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0F1dGhEYXRhRnVuY3Rpb24pICAgICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBwZWVyLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBdXRoRW5jb2RlRnVuY3Rpb24pICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmVuY29kZWQpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgcGVlci4KKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzQXV0aERlY29kZUZ1bmN0aW9uKSAgIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZWNvZGVkKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBtZWNoYW5pc20gaXMgYWJhbmRvbmVkLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNBdXRoU2h1dGRvd25GdW5jdGlvbikgKERCdXNBdXRoICAgICAgICphdXRoKTsKKworLyoqCisgKiBWaXJ0dWFsIHRhYmxlIHJlcHJlc2VudGluZyBhIHBhcnRpY3VsYXIgYXV0aCBtZWNoYW5pc20uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKm1lY2hhbmlzbTsgLyoqPCBOYW1lIG9mIHRoZSBtZWNoYW5pc20gKi8KKyAgREJ1c0F1dGhEYXRhRnVuY3Rpb24gc2VydmVyX2RhdGFfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSBmb3IgREFUQSAqLworICBEQnVzQXV0aEVuY29kZUZ1bmN0aW9uIHNlcnZlcl9lbmNvZGVfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSB0byBlbmNvZGUgKi8KKyAgREJ1c0F1dGhEZWNvZGVGdW5jdGlvbiBzZXJ2ZXJfZGVjb2RlX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gc2VydmVyIHNpZGUgdG8gZGVjb2RlICovCisgIERCdXNBdXRoU2h1dGRvd25GdW5jdGlvbiBzZXJ2ZXJfc2h1dGRvd25fZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSB0byBzaHV0IGRvd24gKi8KKyAgREJ1c0luaXRpYWxSZXNwb25zZUZ1bmN0aW9uIGNsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gY2xpZW50IHNpZGUgdG8gaGFuZGxlIGluaXRpYWwgcmVzcG9uc2UgKi8KKyAgREJ1c0F1dGhEYXRhRnVuY3Rpb24gY2xpZW50X2RhdGFfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBjbGllbnQgc2lkZSBmb3IgREFUQSAqLworICBEQnVzQXV0aEVuY29kZUZ1bmN0aW9uIGNsaWVudF9lbmNvZGVfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBjbGllbnQgc2lkZSBmb3IgZW5jb2RlICovCisgIERCdXNBdXRoRGVjb2RlRnVuY3Rpb24gY2xpZW50X2RlY29kZV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBkZWNvZGUgKi8KKyAgREJ1c0F1dGhTaHV0ZG93bkZ1bmN0aW9uIGNsaWVudF9zaHV0ZG93bl9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBzaHV0ZG93biAqLworfSBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXI7CisKKy8qKgorICogRW51bWVyYXRpb24gZm9yIHRoZSBrbm93biBhdXRoZW50aWNhdGlvbiBjb21tYW5kcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgREJVU19BVVRIX0NPTU1BTkRfQVVUSCwKKyAgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMLAorICBEQlVTX0FVVEhfQ09NTUFORF9EQVRBLAorICBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTiwKKyAgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQsCisgIERCVVNfQVVUSF9DT01NQU5EX09LLAorICBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUiwKKyAgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTiwKKyAgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQsCisgIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQKK30gREJ1c0F1dGhDb21tYW5kOworCisvKioKKyAqIEF1dGggc3RhdGUgZnVuY3Rpb24sIGRldGVybWluZXMgdGhlIHJlYWN0aW9uIHRvIGluY29taW5nIGV2ZW50cyBmb3IKKyAqIGEgcGFydGljdWxhciBzdGF0ZS4gUmV0dXJucyB3aGV0aGVyIHdlIGhhZCBlbm91Z2ggbWVtb3J5IHRvCisgKiBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBdXRoU3RhdGVGdW5jdGlvbikgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgYXV0aCBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHN0YXRlICovCisgIERCdXNBdXRoU3RhdGVGdW5jdGlvbiBoYW5kbGVyOyAgLyoqPCBTdGF0ZSBmdW5jdGlvbiBmb3IgdGhpcyBzdGF0ZSAqLworfSBEQnVzQXV0aFN0YXRlRGF0YTsKKworLyoqCisgKiBJbnRlcm5hbCBtZW1iZXJzIG9mIERCdXNBdXRoLgorICovCitzdHJ1Y3QgREJ1c0F1dGgKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgLyoqPCByZWZlcmVuY2UgY291bnQgKi8KKyAgY29uc3QgY2hhciAqc2lkZTsgICAgICAgLyoqPCBDbGllbnQgb3Igc2VydmVyICovCisKKyAgREJ1c1N0cmluZyBpbmNvbWluZzsgICAgLyoqPCBJbmNvbWluZyBkYXRhIGJ1ZmZlciAqLworICBEQnVzU3RyaW5nIG91dGdvaW5nOyAgICAvKio8IE91dGdvaW5nIGRhdGEgYnVmZmVyICovCisgIAorICBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSAqc3RhdGU7ICAgICAgICAgLyoqPCBDdXJyZW50IHByb3RvY29sIHN0YXRlICovCisKKyAgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyICptZWNoOyAgIC8qKjwgQ3VycmVudCBhdXRoIG1lY2hhbmlzbSAqLworCisgIERCdXNTdHJpbmcgaWRlbnRpdHk7ICAgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBpZGVudGl0eSB3ZSdyZSBhdXRob3JpemluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGFzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7ICAgICAgICAgIC8qKjwgQ3JlZGVudGlhbHMgcmVhZCBmcm9tIHNvY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhvcml6ZWRfaWRlbnRpdHk7IC8qKjwgQ3JlZGVudGlhbHMgdGhhdCBhcmUgYXV0aG9yaXplZCAqLworCisgIERCdXNDcmVkZW50aWFscyAqZGVzaXJlZF9pZGVudGl0eTsgICAgLyoqPCBJZGVudGl0eSBjbGllbnQgaGFzIHJlcXVlc3RlZCAqLworICAKKyAgREJ1c1N0cmluZyBjb250ZXh0OyAgICAgICAgICAgICAgIC8qKjwgQ29va2llIHNjb3BlICovCisgIERCdXNLZXlyaW5nICprZXlyaW5nOyAgICAgICAgICAgICAvKio8IEtleXJpbmcgZm9yIGNvb2tpZSBtZWNoYW5pc20uICovCisgIGludCBjb29raWVfaWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IElEIG9mIGNvb2tpZSB0byB1c2UgKi8KKyAgREJ1c1N0cmluZyBjaGFsbGVuZ2U7ICAgICAgICAgICAgIC8qKjwgQ2hhbGxlbmdlIHNlbnQgdG8gY2xpZW50ICovCisKKyAgY2hhciAqKmFsbG93ZWRfbWVjaHM7ICAgICAgICAgICAgIC8qKjwgTWVjaGFuaXNtcyB3ZSdyZSBhbGxvd2VkIHRvIHVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yICNOVUxMIGlmIHdlIGNhbiB1c2UgYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIHVuc2lnbmVkIGludCBuZWVkZWRfbWVtb3J5IDogMTsgICAvKio8IFdlIG5lZWRlZCBtZW1vcnkgdG8gY29udGludWUgc2luY2UgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3VjY2Vzc2Z1bCBnZXR0aW5nIHNvbWV0aGluZyBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGFscmVhZHlfZ290X21lY2hhbmlzbXMgOiAxOyAgICAgICAvKio8IENsaWVudCBhbHJlYWR5IGdvdCBtZWNoIGxpc3QgKi8KKyAgdW5zaWduZWQgaW50IGFscmVhZHlfYXNrZWRfZm9yX2luaXRpYWxfcmVzcG9uc2UgOiAxOyAvKio8IEFscmVhZHkgc2VudCBhIGJsYW5rIGNoYWxsZW5nZSB0byBnZXQgYW4gaW5pdGlhbCByZXNwb25zZSAqLworICB1bnNpZ25lZCBpbnQgYnVmZmVyX291dHN0YW5kaW5nIDogMTsgLyoqPCBCdWZmZXIgaXMgImNoZWNrZWQgb3V0IiBmb3IgcmVhZGluZyBkYXRhIGludG8gKi8KKworICB1bnNpZ25lZCBpbnQgdW5peF9mZF9wb3NzaWJsZSA6IDE7ICAvKio8IFRoaXMgc2lkZSBjb3VsZCBkbyB1bml4IGZkIHBhc3NpbmcgKi8KKyAgdW5zaWduZWQgaW50IHVuaXhfZmRfbmVnb3RpYXRlZCA6IDE7IC8qKjwgVW5peCBmZCB3YXMgc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQgKi8KK307CisKKy8qKgorICogIlN1YmNsYXNzIiBvZiBEQnVzQXV0aCBmb3IgY2xpZW50IHNpZGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0F1dGggYmFzZTsgICAgLyoqPCBQYXJlbnQgY2xhc3MgKi8KKworICBEQnVzTGlzdCAqbWVjaHNfdG9fdHJ5OyAvKio8IE1lY2hhbmlzbXMgd2UgZ290IGZyb20gdGhlIHNlcnZlciB0aGF0IHdlJ3JlIGdvaW5nIHRvIHRyeSB1c2luZyAqLworCisgIERCdXNTdHJpbmcgZ3VpZF9mcm9tX3NlcnZlcjsgLyoqPCBHVUlEIHJlY2VpdmVkIGZyb20gc2VydmVyICovCisgIAorfSBEQnVzQXV0aENsaWVudDsKKworLyoqCisgKiAiU3ViY2xhc3MiIG9mIERCdXNBdXRoIGZvciBzZXJ2ZXIgc2lkZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0F1dGggYmFzZTsgICAgLyoqPCBQYXJlbnQgY2xhc3MgKi8KKworICBpbnQgZmFpbHVyZXM7ICAgICAvKio8IE51bWJlciBvZiB0aW1lcyBjbGllbnQgaGFzIGJlZW4gcmVqZWN0ZWQgKi8KKyAgaW50IG1heF9mYWlsdXJlczsgLyoqPCBOdW1iZXIgb2YgdGltZXMgd2UgcmVqZWN0IGJlZm9yZSBkaXNjb25uZWN0ICovCisKKyAgREJ1c1N0cmluZyBndWlkOyAgLyoqPCBPdXIgZ2xvYmFsbHkgdW5pcXVlIElEIGluIGhleCBlbmNvZGluZyAqLworICAKK30gREJ1c0F1dGhTZXJ2ZXI7CisKK3N0YXRpYyB2b2lkICAgICAgICBnb3RvX3N0YXRlICAgICAgICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgICAgICAgICpuZXdfc3RhdGUpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfYXV0aCAgICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlciAqbWVjaCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9kYXRhICAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqZGF0YSk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9yZWplY3RlZCAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfZXJyb3IgICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfb2sgICAgICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2JlZ2luICAgICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9jYW5jZWwgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfbmVnb3RpYXRlX3VuaXhfZmQgICAgKERCdXNBdXRoICphdXRoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2FncmVlX3VuaXhfZmQgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CisKKy8qKgorICogQ2xpZW50IHN0YXRlcworICovCisgCitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CisgIAorc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIHNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoID0geworICAiV2FpdGluZ0ZvckF1dGgiLCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGgKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgPSB7CisgICJXYWl0aW5nRm9yRGF0YSIsIGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YQorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4gPSB7CisgICJXYWl0aW5nRm9yQmVnaW4iLCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luCit9OworICAKKy8qKgorICogQ2xpZW50IHN0YXRlcworICovCisgCitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sgICAgIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9hZ3JlZV91bml4X2ZkIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKKworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNsaWVudF9zdGF0ZV9uZWVkX3NlbmRfYXV0aCA9IHsKKyAgIk5lZWRTZW5kQXV0aCIsIE5VTEwKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgPSB7CisgICJXYWl0aW5nRm9yRGF0YSIsIGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfZGF0YQorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sgPSB7CisgICJXYWl0aW5nRm9yT0siLCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX29rCit9Oworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9yZWplY3QgPSB7CisgICJXYWl0aW5nRm9yUmVqZWN0IiwgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9yZWplY3QKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQgPSB7CisgICJXYWl0aW5nRm9yQWdyZWVVbml4RkQiLCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQKK307CisKKy8qKgorICogQ29tbW9uIHRlcm1pbmFsIHN0YXRlcy4gIFRlcm1pbmFsIHN0YXRlcyBoYXZlIGhhbmRsZXIgPT0gTlVMTC4KKyAqLworCitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQgPSB7CisgICJBdXRoZW50aWNhdGVkIiwgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0ID0geworICAiTmVlZERpc2Nvbm5lY3QiLCAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYXV0aF9zaWRlX2NsaWVudFtdID0gImNsaWVudCI7CitzdGF0aWMgY29uc3QgY2hhciBhdXRoX3NpZGVfc2VydmVyW10gPSAic2VydmVyIjsKKy8qKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgY29udmVyc2F0aW9uIGlzIHRoZSBzZXJ2ZXIgc2lkZQorICovCisjZGVmaW5lIERCVVNfQVVUSF9JU19TRVJWRVIoYXV0aCkgKChhdXRoKS0+c2lkZSA9PSBhdXRoX3NpZGVfc2VydmVyKQorLyoqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjb252ZXJzYXRpb24gaXMgdGhlIGNsaWVudCBzaWRlCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX0lTX0NMSUVOVChhdXRoKSAoKGF1dGgpLT5zaWRlID09IGF1dGhfc2lkZV9jbGllbnQpCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgYXV0aCBjYXN0IHRvIERCdXNBdXRoQ2xpZW50CisgKi8KKyNkZWZpbmUgREJVU19BVVRIX0NMSUVOVChhdXRoKSAgICAoKERCdXNBdXRoQ2xpZW50KikoYXV0aCkpCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgYXV0aCBjYXN0IHRvIERCdXNBdXRoU2VydmVyCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX1NFUlZFUihhdXRoKSAgICAoKERCdXNBdXRoU2VydmVyKikoYXV0aCkpCisKKy8qKgorICogVGhlIG5hbWUgb2YgdGhlIGF1dGggKCJjbGllbnQiIG9yICJzZXJ2ZXIiKQorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyBhIHN0cmluZworICovCisjZGVmaW5lIERCVVNfQVVUSF9OQU1FKGF1dGgpICAgICAgKChhdXRoKS0+c2lkZSkKKworc3RhdGljIERCdXNBdXRoKgorX2RidXNfYXV0aF9uZXcgKGludCBzaXplKQoreworICBEQnVzQXV0aCAqYXV0aDsKKyAgCisgIGF1dGggPSBkYnVzX21hbGxvYzAgKHNpemUpOworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgYXV0aC0+cmVmY291bnQgPSAxOworICAKKyAgYXV0aC0+a2V5cmluZyA9IE5VTEw7CisgIGF1dGgtPmNvb2tpZV9pZCA9IC0xOworICAKKyAgLyogbm90ZSB0aGF0IHdlIGRvbid0IHVzZSB0aGUgbWF4IHN0cmluZyBsZW5ndGggZmVhdHVyZSwKKyAgICogYmVjYXVzZSB5b3UgY2FuJ3QgdXNlIHRoYXQgZmVhdHVyZSBpZiB5b3UncmUgZ29pbmcgdG8KKyAgICogdHJ5IHRvIHJlY292ZXIgZnJvbSBvdXQtb2YtbWVtb3J5IChpdCBjcmVhdGVzCisgICAqIHdoYXQgbG9va3MgbGlrZSB1bnJlY292ZXJhYmxlIGluYWJpbGl0eSB0byBhbGxvYworICAgKiBtb3JlIHNwYWNlIGluIHRoZSBzdHJpbmcpLiBCdXQgd2UgZG8gaGFuZGxlCisgICAqIG92ZXJsb25nIGJ1ZmZlcnMgaW4gX2RidXNfYXV0aF9kb193b3JrKCkuCisgICAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmluY29taW5nKSkKKyAgICBnb3RvIGVub21lbV8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoLT5vdXRnb2luZykpCisgICAgZ290byBlbm9tZW1fMTsKKyAgICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmlkZW50aXR5KSkKKyAgICBnb3RvIGVub21lbV8yOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoLT5jb250ZXh0KSkKKyAgICBnb3RvIGVub21lbV8zOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoLT5jaGFsbGVuZ2UpKQorICAgIGdvdG8gZW5vbWVtXzQ7CisKKyAgLyogZGVmYXVsdCBjb250ZXh0IGlmIG5vbmUgaXMgc3BlY2lmaWVkICovCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPmNvbnRleHQsICJvcmdfZnJlZWRlc2t0b3BfZ2VuZXJhbCIpKQorICAgIGdvdG8gZW5vbWVtXzU7CisKKyAgYXV0aC0+Y3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChhdXRoLT5jcmVkZW50aWFscyA9PSBOVUxMKQorICAgIGdvdG8gZW5vbWVtXzY7CisgIAorICBhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5ID0gX2RidXNfY3JlZGVudGlhbHNfbmV3ICgpOworICBpZiAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSA9PSBOVUxMKQorICAgIGdvdG8gZW5vbWVtXzc7CisKKyAgYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkgPT0gTlVMTCkKKyAgICBnb3RvIGVub21lbV84OworICAKKyAgcmV0dXJuIGF1dGg7CisKKyNpZiAwCisgZW5vbWVtXzk6CisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKyNlbmRpZgorIGVub21lbV84OgorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSk7CisgZW5vbWVtXzc6CisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5jcmVkZW50aWFscyk7CisgZW5vbWVtXzY6CisgLyogbGFzdCBhbGxvYyB3YXMgYW4gYXBwZW5kIHRvIGNvbnRleHQsIHdoaWNoIGlzIGZyZWVkIGFscmVhZHkgYmVsb3cgKi8gOworIGVub21lbV81OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPmNoYWxsZW5nZSk7CisgZW5vbWVtXzQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+Y29udGV4dCk7CisgZW5vbWVtXzM6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+aWRlbnRpdHkpOworIGVub21lbV8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPm91dGdvaW5nKTsKKyBlbm9tZW1fMToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pbmNvbWluZyk7CisgZW5vbWVtXzA6CisgIGRidXNfZnJlZSAoYXV0aCk7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorc2h1dGRvd25fbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIC8qIENhbmNlbCBhbnkgYXV0aCAqLworICBhdXRoLT5hbHJlYWR5X2Fza2VkX2Zvcl9pbml0aWFsX3Jlc3BvbnNlID0gRkFMU0U7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHksIDApOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5KTsKKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpOworICAKKyAgaWYgKGF1dGgtPm1lY2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFNodXR0aW5nIGRvd24gbWVjaGFuaXNtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBhdXRoLT5tZWNoLT5tZWNoYW5pc20pOworICAgICAgCisgICAgICBpZiAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpCisgICAgICAgICgqIGF1dGgtPm1lY2gtPmNsaWVudF9zaHV0ZG93bl9mdW5jKSAoYXV0aCk7CisgICAgICBlbHNlCisgICAgICAgICgqIGF1dGgtPm1lY2gtPnNlcnZlcl9zaHV0ZG93bl9mdW5jKSAoYXV0aCk7CisgICAgICAKKyAgICAgIGF1dGgtPm1lY2ggPSBOVUxMOworICAgIH0KK30KKworLyoKKyAqIERCVVNfQ09PS0lFX1NIQTEgbWVjaGFuaXNtCisgKi8KKworLyogUmV0dXJucyBUUlVFIGJ1dCB3aXRoIGFuIGVtcHR5IHN0cmluZyBoYXNoIGlmIHRoZQorICogY29va2llX2lkIGlzbid0IGtub3duLiBBcyB3aXRoIGFsbCB0aGlzIGNvZGUKKyAqIFRSVUUganVzdCBtZWFucyB3ZSBoYWQgZW5vdWdoIG1lbW9yeS4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitzaGExX2NvbXB1dGVfaGFzaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb29raWVfaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmVyX2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmhhc2gpCit7CisgIERCdXNTdHJpbmcgY29va2llOworICBEQnVzU3RyaW5nIHRvX2hhc2g7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+a2V5cmluZyAhPSBOVUxMKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb29raWUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2tleXJpbmdfZ2V0X2hleF9rZXkgKGF1dGgtPmtleXJpbmcsIGNvb2tpZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29va2llKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvb2tpZSkgPT0gMCkKKyAgICB7CisgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRvX2hhc2gpKQorICAgIGdvdG8gb3V0XzA7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChzZXJ2ZXJfY2hhbGxlbmdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9faGFzaCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0b19oYXNoKSkpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0b19oYXNoLCAiOiIpKQorICAgIGdvdG8gb3V0XzE7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChjbGllbnRfY2hhbGxlbmdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9faGFzaCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0b19oYXNoKSkpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0b19oYXNoLCAiOiIpKQorICAgIGdvdG8gb3V0XzE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvb2tpZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2hhc2gsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG9faGFzaCkpKQorICAgIGdvdG8gb3V0XzE7CisKKyAgaWYgKCFfZGJ1c19zaGFfY29tcHV0ZSAoJnRvX2hhc2gsIGhhc2gpKQorICAgIGdvdG8gb3V0XzE7CisgIAorICByZXR2YWwgPSBUUlVFOworCisgb3V0XzE6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmdG9faGFzaCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9faGFzaCk7Cisgb3V0XzA6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmY29va2llKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb29raWUpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjgzMS50eHQgc3VnZ2VzdHMgYXQgbGVhc3QgNjQgYml0cyBvZgorICogZW50cm9weSwgd2UgdXNlIDEyOC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByYW5kb20KKyAqIGNoYWxsZW5nZS4KKyAqLworI2RlZmluZSBOX0NIQUxMRU5HRV9CWVRFUyAoMTI4LzgpCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2hhMV9oYW5kbGVfZmlyc3RfY2xpZW50X3Jlc3BvbnNlIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAvKiBXZSBoYXZlbid0IHNlbnQgYSBjaGFsbGVuZ2UgeWV0LCB3ZSdyZSBleHBlY3RpbmcgYSBkZXNpcmVkCisgICAqIHVzZXJuYW1lIGZyb20gdGhlIGNsaWVudC4KKyAgICovCisgIERCdXNTdHJpbmcgdG1wOworICBEQnVzU3RyaW5nIHRtcDI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICAKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5jaGFsbGVuZ2UsIDApOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA+IDApCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyaWVkIHRvIHNlbmQgdHdvIGF1dGggaWRlbnRpdGllcywgd3RmICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBjbGllbnQgdHJpZWQgdG8gc2VuZCBhdXRoIGlkZW50aXR5LCBidXQgd2UgYWxyZWFkeSBoYXZlIG9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogdGhpcyBpcyBvdXIgYXV0aCBpZGVudGl0eSAqLworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGRhdGEsIDAsICZhdXRoLT5pZGVudGl0eSwgMCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgICAKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VyIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5LCBkYXRhKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IERpZCBub3QgZ2V0IGEgdmFsaWQgdXNlcm5hbWUgZnJvbSBjbGllbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgICAgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRtcDIpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogd2UgY2FjaGUgdGhlIGtleXJpbmcgZm9yIHNwZWVkLCBzbyBoZXJlIHdlIGRyb3AgaXQgaWYgaXQncyB0aGUKKyAgICogd3Jvbmcgb25lLiBGSVhNRSBjYWNoaW5nIHRoZSBrZXlyaW5nIGhlcmUgaXMgdXNlbGVzcyBzaW5jZSB3ZSB1c2UKKyAgICogYSBkaWZmZXJlbnQgREJ1c0F1dGggZm9yIGV2ZXJ5IGNvbm5lY3Rpb24uCisgICAqLworICBpZiAoYXV0aC0+a2V5cmluZyAmJgorICAgICAgIV9kYnVzX2tleXJpbmdfaXNfZm9yX2NyZWRlbnRpYWxzIChhdXRoLT5rZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5KSkKKyAgICB7CisgICAgICBfZGJ1c19rZXlyaW5nX3VucmVmIChhdXRoLT5rZXlyaW5nKTsKKyAgICAgIGF1dGgtPmtleXJpbmcgPSBOVUxMOworICAgIH0KKyAgCisgIGlmIChhdXRoLT5rZXlyaW5nID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAgICAgYXV0aC0+a2V5cmluZyA9IF9kYnVzX2tleXJpbmdfbmV3X2Zvcl9jcmVkZW50aWFscyAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRoLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKworICAgICAgaWYgKGF1dGgtPmtleXJpbmcgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRXJyb3IgbG9hZGluZyBrZXlyaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7IC8qIHJldHZhbCBpcyBvbmx5IGFib3V0IG1lbSAqLworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5rZXlyaW5nICE9IE5VTEwpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgYXV0aC0+Y29va2llX2lkID0gX2RidXNfa2V5cmluZ19nZXRfYmVzdF9rZXkgKGF1dGgtPmtleXJpbmcsICZlcnJvcik7CisgIGlmIChhdXRoLT5jb29raWVfaWQgPCAwKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IENvdWxkIG5vdCBnZXQgYSBjb29raWUgSUQgdG8gc2VuZCB0byBjbGllbnQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGlmIChzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmF1dGgtPmNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcDIpKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0bXAyLCAiICIpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZ0bXAyLCBhdXRoLT5jb29raWVfaWQpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcDIsICIgIikpCisgICAgZ290byBvdXQ7ICAKKyAgCisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmdG1wLCBOX0NIQUxMRU5HRV9CWVRFUykpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5jaGFsbGVuZ2UsIDApOworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmdG1wLCAwLCAmYXV0aC0+Y2hhbGxlbmdlLCAwKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ0bXAsIDAsICZ0bXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcDIpKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIXNlbmRfZGF0YSAoYXV0aCwgJnRtcDIpKQorICAgIGdvdG8gb3V0OworICAgICAgCisgIGdvdG9fc3RhdGUgKGF1dGgsICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSk7CisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0bXApOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7CisgIF9kYnVzX3N0cmluZ196ZXJvICgmdG1wMik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wMik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzaGExX2hhbmRsZV9zZWNvbmRfY2xpZW50X3Jlc3BvbnNlIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgLyogV2UgYXJlIGV4cGVjdGluZyBhIHJlc3BvbnNlIHdoaWNoIGlzIHRoZSBoZXgtZW5jb2RlZCBjbGllbnQKKyAgICogY2hhbGxlbmdlLCBzcGFjZSwgdGhlbiBTSEEtMSBoYXNoIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIG91cgorICAgKiBjaGFsbGVuZ2UsICI6IiwgY2xpZW50IGNoYWxsZW5nZSwgIjoiLCBzZWNyZXQga2V5LCBhbGwKKyAgICogaGV4LWVuY29kZWQuCisgICAqLworICBpbnQgaTsKKyAgREJ1c1N0cmluZyBjbGllbnRfY2hhbGxlbmdlOworICBEQnVzU3RyaW5nIGNsaWVudF9oYXNoOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNTdHJpbmcgY29ycmVjdF9oYXNoOworICAKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChkYXRhLCAwLCAmaSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBubyBzcGFjZSBzZXBhcmF0b3IgaW4gY2xpZW50IHJlc3BvbnNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY2xpZW50X2NoYWxsZW5nZSkpCisgICAgZ290byBvdXRfMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY2xpZW50X2hhc2gpKQorICAgIGdvdG8gb3V0XzE7ICAKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGF0YSwgMCwgaSwgJmNsaWVudF9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICBnb3RvIG91dF8yOworCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChkYXRhLCBpLCAmaSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGF0YSwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICBnb3RvIG91dF8yOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNsaWVudF9jaGFsbGVuZ2UpID09IDAgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY2xpZW50X2hhc2gpID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiB6ZXJvLWxlbmd0aCBjbGllbnQgY2hhbGxlbmdlIG9yIGhhc2hcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMjsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvcnJlY3RfaGFzaCkpCisgICAgZ290byBvdXRfMjsKKworICBpZiAoIXNoYTFfY29tcHV0ZV9oYXNoIChhdXRoLCBhdXRoLT5jb29raWVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRoLT5jaGFsbGVuZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50X2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcnJlY3RfaGFzaCkpCisgICAgZ290byBvdXRfMzsKKworICAvKiBpZiBjb29raWVfaWQgd2FzIGludmFsaWQsIHRoZW4gd2UgZ2V0IGFuIGVtcHR5IGhhc2ggKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29ycmVjdF9oYXNoKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzM7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZjbGllbnRfaGFzaCwgJmNvcnJlY3RfaGFzaCkpCisgICAgeworICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5KSkKKyAgICBnb3RvIG91dF8zOworCisgIC8qIENvcHkgcHJvY2VzcyBJRCBmcm9tIHRoZSBzb2NrZXQgY3JlZGVudGlhbHMgaWYgaXQncyB0aGVyZQorICAgKi8KKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgIGdvdG8gb3V0XzM7CisgIAorICBpZiAoIXNlbmRfb2sgKGF1dGgpKQorICAgIGdvdG8gb3V0XzM7CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzOiBhdXRoZW50aWNhdGVkIGNsaWVudCB1c2luZyBEQlVTX0NPT0tJRV9TSEExXG4iLAorICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0XzM6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmY29ycmVjdF9oYXNoKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb3JyZWN0X2hhc2gpOworIG91dF8yOgorICBfZGJ1c19zdHJpbmdfemVybyAoJmNsaWVudF9oYXNoKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbGllbnRfaGFzaCk7Cisgb3V0XzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY2xpZW50X2NoYWxsZW5nZSk7Cisgb3V0XzA6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3NlcnZlcl9kYXRhX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgaWYgKGF1dGgtPmNvb2tpZV9pZCA8IDApCisgICAgcmV0dXJuIHNoYTFfaGFuZGxlX2ZpcnN0X2NsaWVudF9yZXNwb25zZSAoYXV0aCwgZGF0YSk7CisgIGVsc2UKKyAgICByZXR1cm4gc2hhMV9oYW5kbGVfc2Vjb25kX2NsaWVudF9yZXNwb25zZSAoYXV0aCwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfc2VydmVyX3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICphdXRoKQoreworICBhdXRoLT5jb29raWVfaWQgPSAtMTsgIAorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqcmVzcG9uc2UpCit7CisgIERCdXNTdHJpbmcgdXNlcm5hbWU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXNlcm5hbWUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZ1c2VybmFtZSkpCisgICAgZ290byBvdXRfMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmdXNlcm5hbWUsIDAsCisJCQkJcmVzcG9uc2UsCisJCQkJX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHJlc3BvbnNlKSkpCisgICAgZ290byBvdXRfMDsKKworICByZXR2YWwgPSBUUlVFOworICAKKyBvdXRfMDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfZGF0YV9jb29raWVfc2hhMV9tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIC8qIFRoZSBkYXRhIHdlIGdldCBmcm9tIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHRoZSBjb29raWUgY29udGV4dAorICAgKiBuYW1lLCB0aGUgY29va2llIElELCBhbmQgdGhlIHNlcnZlciBjaGFsbGVuZ2UsIHNlcGFyYXRlZCBieQorICAgKiBzcGFjZXMuIFdlIHNlbmQgYmFjayBvdXIgY2hhbGxlbmdlIHN0cmluZyBhbmQgdGhlIGNvcnJlY3QgaGFzaC4KKyAgICovCisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c1N0cmluZyBjb250ZXh0OworICBEQnVzU3RyaW5nIGNvb2tpZV9pZF9zdHI7CisgIERCdXNTdHJpbmcgc2VydmVyX2NoYWxsZW5nZTsKKyAgREJ1c1N0cmluZyBjbGllbnRfY2hhbGxlbmdlOworICBEQnVzU3RyaW5nIGNvcnJlY3RfaGFzaDsKKyAgREJ1c1N0cmluZyB0bXA7CisgIGludCBpLCBqOworICBsb25nIHZhbDsKKyAgCisgIHJldHZhbCA9IEZBTFNFOyAgICAgICAgICAgICAgICAgCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChkYXRhLCAwLCAmaSkpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBkaWQgbm90IHNlbmQgY29udGV4dC9JRC9jaGFsbGVuZ2UgcHJvcGVybHkiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzA7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZXh0KSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCAwLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsIDApKQorICAgIGdvdG8gb3V0XzE7CisgIAorICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoZGF0YSwgaSwgJmkpOworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChkYXRhLCBpLCAmaikpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBkaWQgbm90IHNlbmQgY29udGV4dC9JRC9jaGFsbGVuZ2UgcHJvcGVybHkiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzE7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb29raWVfaWRfc3RyKSkKKyAgICBnb3RvIG91dF8xOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGRhdGEsIGksIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvb2tpZV9pZF9zdHIsIDApKQorICAgIGdvdG8gb3V0XzI7ICAKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmVyX2NoYWxsZW5nZSkpCisgICAgZ290byBvdXRfMjsKKworICBpID0gajsKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGRhdGEsIGksICZpKTsKKyAgaiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGF0YSwgaSwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyX2NoYWxsZW5nZSwgMCkpCisgICAgZ290byBvdXRfMzsKKworICBpZiAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKQorICAgIHsKKyAgICAgIGlmIChzZW5kX2Vycm9yIChhdXRoLCAiU2VydmVyIHNlbnQgaW52YWxpZCBjb29raWUgY29udGV4dCIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmY29va2llX2lkX3N0ciwgMCwgJnZhbCwgTlVMTCkpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJDb3VsZCBub3QgcGFyc2UgY29va2llIElEIGFzIGFuIGludGVnZXIiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzM7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNlcnZlcl9jaGFsbGVuZ2UpID09IDApCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJFbXB0eSBzZXJ2ZXIgY2hhbGxlbmdlIHN0cmluZyIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKGF1dGgtPmtleXJpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgICAgIGF1dGgtPmtleXJpbmcgPSBfZGJ1c19rZXlyaW5nX25ld19mb3JfY3JlZGVudGlhbHMgKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisKKyAgICAgIGlmIChhdXRoLT5rZXlyaW5nID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXRfMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBFcnJvciBsb2FkaW5nIGtleXJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJDb3VsZCBub3QgbG9hZCBjb29raWUgZmlsZSIpKQorICAgICAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7IC8qIHJldHZhbCBpcyBvbmx5IGFib3V0IG1lbSAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dF8zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgIH0KKyAgICB9CisgIAorICBfZGJ1c19hc3NlcnQgKGF1dGgtPmtleXJpbmcgIT0gTlVMTCk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wKSkKKyAgICBnb3RvIG91dF8zOworICAKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZ0bXAsIE5fQ0hBTExFTkdFX0JZVEVTKSkKKyAgICBnb3RvIG91dF80OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbGllbnRfY2hhbGxlbmdlKSkKKyAgICBnb3RvIG91dF80OworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ0bXAsIDAsICZjbGllbnRfY2hhbGxlbmdlLCAwKSkKKyAgICBnb3RvIG91dF81OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb3JyZWN0X2hhc2gpKQorICAgIGdvdG8gb3V0XzU7CisgIAorICBpZiAoIXNoYTFfY29tcHV0ZV9oYXNoIChhdXRoLCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXJfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50X2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcnJlY3RfaGFzaCkpCisgICAgZ290byBvdXRfNjsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb3JyZWN0X2hhc2gpID09IDApCisgICAgeworICAgICAgLyogY291bGRuJ3QgZmluZCB0aGUgY29va2llIElEIG9yIHNvbWV0aGluZyAqLworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJEb24ndCBoYXZlIHRoZSByZXF1ZXN0ZWQgY29va2llIElEIikpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF82OworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmdG1wLCAwKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZjbGllbnRfY2hhbGxlbmdlLCAwLCAmdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCkpKQorICAgIGdvdG8gb3V0XzY7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmdG1wLCAiICIpKQorICAgIGdvdG8gb3V0XzY7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvcnJlY3RfaGFzaCwgMCwgJnRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0bXApKSkKKyAgICBnb3RvIG91dF82OworCisgIGlmICghc2VuZF9kYXRhIChhdXRoLCAmdG1wKSkKKyAgICBnb3RvIG91dF82OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXRfNjoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZjb3JyZWN0X2hhc2gpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvcnJlY3RfaGFzaCk7Cisgb3V0XzU6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY2xpZW50X2NoYWxsZW5nZSk7Cisgb3V0XzQ6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmdG1wKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXApOworIG91dF8zOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZlcl9jaGFsbGVuZ2UpOworIG91dF8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvb2tpZV9pZF9zdHIpOworIG91dF8xOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRleHQpOworIG91dF8wOgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2NsaWVudF9zaHV0ZG93bl9jb29raWVfc2hhMV9tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgYXV0aC0+Y29va2llX2lkID0gLTE7ICAKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5jaGFsbGVuZ2UsIDApOworfQorCisvKgorICogRVhURVJOQUwgbWVjaGFuaXNtCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX2RhdGFfZXh0ZXJuYWxfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogbm8gY3JlZGVudGlhbHMsIG1lY2hhbmlzbSBFWFRFUk5BTCBjYW4ndCBhdXRoZW50aWNhdGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgPiAwKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPmlkZW50aXR5KSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUcmllZCB0byBzZW5kIHR3byBhdXRoIGlkZW50aXRpZXMsIHd0ZiAqLworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogY2xpZW50IHRyaWVkIHRvIHNlbmQgYXV0aCBpZGVudGl0eSwgYnV0IHdlIGFscmVhZHkgaGF2ZSBvbmVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHRoaXMgaXMgb3VyIGF1dGggaWRlbnRpdHkgKi8KKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChkYXRhLCAwLCAmYXV0aC0+aWRlbnRpdHksIDApKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIC8qIFBva2UgY2xpZW50IGZvciBhbiBhdXRoIGlkZW50aXR5LCBpZiBub25lIGdpdmVuICovCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPmlkZW50aXR5KSA9PSAwICYmCisgICAgICAhYXV0aC0+YWxyZWFkeV9hc2tlZF9mb3JfaW5pdGlhbF9yZXNwb25zZSkKKyAgICB7CisgICAgICBpZiAoc2VuZF9kYXRhIChhdXRoLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogc2VuZGluZyBlbXB0eSBjaGFsbGVuZ2UgYXNraW5nIGNsaWVudCBmb3IgYXV0aCBpZGVudGl0eVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgICAgIGF1dGgtPmFscmVhZHlfYXNrZWRfZm9yX2luaXRpYWxfcmVzcG9uc2UgPSBUUlVFOworICAgICAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSk7CisgIAorICAvKiBJZiBhdXRoLT5pZGVudGl0eSBpcyBzdGlsbCBlbXB0eSBoZXJlLCB0aGVuIGNsaWVudAorICAgKiByZXNwb25kZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYWZ0ZXIgd2UgcG9rZWQgaXQgZm9yCisgICAqIGFuIGluaXRpYWwgcmVzcG9uc2UuIFRoaXMgbWVhbnMgdG8gdHJ5IHRvIGF1dGggdGhlCisgICAqIGlkZW50aXR5IHByb3ZpZGVkIGluIHRoZSBjcmVkZW50aWFscy4KKyAgICovCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPmlkZW50aXR5KSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWxzIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmNyZWRlbnRpYWxzKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsgLyogT09NICovCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX3VzZXIgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRoLT5pZGVudGl0eSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGNvdWxkIG5vdCBnZXQgY3JlZGVudGlhbHMgZnJvbSB1aWQgc3RyaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgICAgICB9CisgICAgfQorCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGRlc2lyZWQgdXNlciAlcyBpcyBubyBnb29kXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYXV0aC0+aWRlbnRpdHkpKTsKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICB9CisgIAorICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChhdXRoLT5jcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSkpCisgICAgeworICAgICAgLyogY2xpZW50IGhhcyBhdXRoZW50aWNhdGVkICovCisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBhbHNvIGNvcHkgcHJvY2VzcyBJRCBmcm9tIHRoZSBzb2NrZXQgY3JlZGVudGlhbHMKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogYWxzbyBjb3B5IGF1ZGl0IGRhdGEgZnJvbSB0aGUgc29ja2V0IGNyZWRlbnRpYWxzCisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfQURUX0FVRElUX0RBVEFfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKCFzZW5kX29rIChhdXRoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGF1dGhlbnRpY2F0ZWQgY2xpZW50IGJhc2VkIG9uIHNvY2tldCBjcmVkZW50aWFsc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogZGVzaXJlZCBpZGVudGl0eSBub3QgZm91bmQgaW4gc29ja2V0IGNyZWRlbnRpYWxzXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfc2VydmVyX3NodXRkb3duX2V4dGVybmFsX21lY2ggKERCdXNBdXRoICphdXRoKQoreworCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2V4dGVybmFsX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcmVzcG9uc2UpCit7CisgIC8qIFdlIGFsd2F5cyBhcHBlbmQgb3VyIFVJRCBhcyBhbiBpbml0aWFsIHJlc3BvbnNlLCBzbyB0aGUgc2VydmVyCisgICAqIGRvZXNuJ3QgaGF2ZSB0byBzZW5kIGJhY2sgYW4gZW1wdHkgY2hhbGxlbmdlIHRvIGNoZWNrIHdoZXRoZXIgd2UKKyAgICogd2FudCB0byBzcGVjaWZ5IGFuIGlkZW50aXR5LiBpLmUuIHRoaXMgYXZvaWRzIGEgcm91bmQgdHJpcCB0aGF0CisgICAqIHRoZSBzcGVjIGZvciB0aGUgRVhURVJOQUwgbWVjaGFuaXNtIG90aGVyd2lzZSByZXF1aXJlcy4KKyAgICovCisgIERCdXNTdHJpbmcgcGxhaW50ZXh0OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwbGFpbnRleHQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzICgmcGxhaW50ZXh0KSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmcGxhaW50ZXh0LCAwLAorCQkJCXJlc3BvbnNlLAorCQkJCV9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZXNwb25zZSkpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBsYWludGV4dCk7CisgIHJldHVybiBGQUxTRTsgIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfZGF0YV9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9jbGllbnRfc2h1dGRvd25fZXh0ZXJuYWxfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisKK30KKworLyoKKyAqIEFOT05ZTU9VUyBtZWNoYW5pc20KKyAqLworCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9zZXJ2ZXJfZGF0YV9hbm9ueW1vdXNfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID4gMCkKKyAgICB7CisgICAgICAvKiBDbGllbnQgaXMgYWxsb3dlZCB0byBzZW5kICJ0cmFjZSIgZGF0YSwgdGhlIG9ubHkgZGVmaW5lZAorICAgICAgICogbWVhbmluZyBpcyB0aGF0IGlmIGl0IGNvbnRhaW5zICdAJyBpdCBpcyBhbiBlbWFpbCBhZGRyZXNzLAorICAgICAgICogYW5kIG90aGVyd2lzZSBpdCBpcyBhbnl0aGluZyBlbHNlLCBhbmQgaXQncyBzdXBwb3NlZCB0byBiZQorICAgICAgICogVVRGLTgKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoZGF0YSwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogUmVjZWl2ZWQgaW52YWxpZCBVVEYtOCB0cmFjZSBkYXRhIGZyb20gQU5PTllNT1VTIGNsaWVudFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEFOT05ZTU9VUyBjbGllbnQgc2VudCB0cmFjZSBzdHJpbmc6ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRhdGEpKTsKKyAgICB9CisKKyAgLyogV2Ugd2FudCB0byBiZSBhbm9ueW1vdXMgKGNsZWFyIGluIGNhc2Ugc29tZSBvdGhlciBwcm90b2NvbCBnb3QgbWlkd2F5IHRocm91Z2ggSSBndWVzcykgKi8KKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpOworCisgIC8qIENvcHkgcHJvY2VzcyBJRCBmcm9tIHRoZSBzb2NrZXQgY3JlZGVudGlhbHMKKyAgICovCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmNyZWRlbnRpYWxzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICAvKiBBbm9ueW1vdXMgaXMgYWx3YXlzIGFsbG93ZWQgKi8KKyAgaWYgKCFzZW5kX29rIChhdXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzOiBhdXRoZW50aWNhdGVkIGNsaWVudCBhcyBhbm9ueW1vdXNcbiIsCisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfc2VydmVyX3NodXRkb3duX2Fub255bW91c19tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Fub255bW91c19tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpyZXNwb25zZSkKK3sKKyAgLyogT3VyIGluaXRpYWwgcmVzcG9uc2UgaXMgYSAidHJhY2UiIHN0cmluZyB3aGljaCBtdXN0IGJlIHZhbGlkIFVURi04CisgICAqIGFuZCBtdXN0IGJlIGFuIGVtYWlsIGFkZHJlc3MgaWYgaXQgY29udGFpbnMgJ0AnLgorICAgKiBXZSBqdXN0IHNlbmQgdGhlIGRidXMgaW1wbGVtZW50YXRpb24gaW5mbywgbGlrZSBhIHVzZXItYWdlbnQgb3IKKyAgICogc29tZXRoaW5nLCBiZWNhdXNlLi4uIHdoeSBub3QuIFRoZXJlJ3Mgbm90aGluZyBndWFyYW50ZWVkIGhlcmUKKyAgICogdGhvdWdoLCB3ZSBjb3VsZCBjaGFuZ2UgaXQgbGF0ZXIuCisgICAqLworICBEQnVzU3RyaW5nIHBsYWludGV4dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGxhaW50ZXh0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWJkYnVzICIgREJVU19WRVJTSU9OX1NUUklORykpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnBsYWludGV4dCwgMCwKKwkJCQlyZXNwb25zZSwKKwkJCQlfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzcG9uc2UpKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBsYWludGV4dCk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICByZXR1cm4gRkFMU0U7ICAKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2RhdGFfYW5vbnltb3VzX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2NsaWVudF9zaHV0ZG93bl9hbm9ueW1vdXNfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIAorfQorCisvKiBQdXQgbWVjaGFuaXNtcyBoZXJlIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCisgKiBSaWdodCBub3cgd2UgaGF2ZToKKyAqCisgKiAtIEVYVEVSTkFMIGNoZWNrcyBzb2NrZXQgY3JlZGVudGlhbHMgKG9yIGluIHRoZSBmdXR1cmUsIG90aGVyIGluZm8gZnJvbSB0aGUgT1MpCisgKiAtIERCVVNfQ09PS0lFX1NIQTEgdXNlcyBhIGNvb2tpZSBpbiB0aGUgaG9tZSBkaXJlY3RvcnksIGxpa2UgeGF1dGggb3IgSUNFCisgKiAtIEFOT05ZTU9VUyBjaGVja3Mgbm90aGluZyBidXQgZG9lc24ndCBhdXRoIHRoZSBwZXJzb24gYXMgYSB1c2VyCisgKgorICogV2UgbWlnaHQgaWRlYWxseSBhZGQgYSBtZWNoYW5pc20gdG8gY2hhaW4gdG8gQ3lydXMgU0FTTCBzbyB3ZSBjYW4KKyAqIHVzZSBpdHMgbWVjaGFuaXNtcyBhcyB3ZWxsLgorICogCisgKi8KK3N0YXRpYyBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIKK2FsbF9tZWNoYW5pc21zW10gPSB7CisgIHsgIkVYVEVSTkFMIiwKKyAgICBoYW5kbGVfc2VydmVyX2RhdGFfZXh0ZXJuYWxfbWVjaCwKKyAgICBOVUxMLCBOVUxMLAorICAgIGhhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fZXh0ZXJuYWxfbWVjaCwKKyAgICBoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZXh0ZXJuYWxfbWVjaCwKKyAgICBoYW5kbGVfY2xpZW50X2RhdGFfZXh0ZXJuYWxfbWVjaCwKKyAgICBOVUxMLCBOVUxMLAorICAgIGhhbmRsZV9jbGllbnRfc2h1dGRvd25fZXh0ZXJuYWxfbWVjaCB9LAorICB7ICJEQlVTX0NPT0tJRV9TSEExIiwKKyAgICBoYW5kbGVfc2VydmVyX2RhdGFfY29va2llX3NoYTFfbWVjaCwKKyAgICBOVUxMLCBOVUxMLAorICAgIGhhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fY29va2llX3NoYTFfbWVjaCwKKyAgICBoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfY29va2llX3NoYTFfbWVjaCwKKyAgICBoYW5kbGVfY2xpZW50X2RhdGFfY29va2llX3NoYTFfbWVjaCwKKyAgICBOVUxMLCBOVUxMLAorICAgIGhhbmRsZV9jbGllbnRfc2h1dGRvd25fY29va2llX3NoYTFfbWVjaCB9LAorICB7ICJBTk9OWU1PVVMiLAorICAgIGhhbmRsZV9zZXJ2ZXJfZGF0YV9hbm9ueW1vdXNfbWVjaCwKKyAgICBOVUxMLCBOVUxMLAorICAgIGhhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fYW5vbnltb3VzX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Fub255bW91c19tZWNoLAorICAgIGhhbmRsZV9jbGllbnRfZGF0YV9hbm9ueW1vdXNfbWVjaCwKKyAgICBOVUxMLCBOVUxMLAorICAgIGhhbmRsZV9jbGllbnRfc2h1dGRvd25fYW5vbnltb3VzX21lY2ggfSwgIAorICB7IE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlcioKK2ZpbmRfbWVjaCAoY29uc3QgREJ1c1N0cmluZyAgKm5hbWUsCisgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKiphbGxvd2VkX21lY2hzKQoreworICBpbnQgaTsKKyAgCisgIGlmIChhbGxvd2VkX21lY2hzICE9IE5VTEwgJiYKKyAgICAgICFfZGJ1c19zdHJpbmdfYXJyYXlfY29udGFpbnMgKChjb25zdCBjaGFyKiopIGFsbG93ZWRfbWVjaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKG5hbWUpKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGkgPSAwOworICB3aGlsZSAoYWxsX21lY2hhbmlzbXNbaV0ubWVjaGFuaXNtICE9IE5VTEwpCisgICAgeyAgICAgIAorICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9tZWNoYW5pc21zW2ldLm1lY2hhbmlzbSkpCisKKyAgICAgICAgcmV0dXJuICZhbGxfbWVjaGFuaXNtc1tpXTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKyAgCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfYXV0aCAoREJ1c0F1dGggKmF1dGgsIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlciAqbWVjaCkKK3sKKyAgREJ1c1N0cmluZyBhdXRoX2NvbW1hbmQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGhfY29tbWFuZCkpCisgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGhfY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVVUSCAiKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoX2NvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVjaC0+bWVjaGFuaXNtKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtZWNoLT5jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9mdW5jICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aF9jb21tYW5kLCAiICIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoISgqIG1lY2gtPmNsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Z1bmMpIChhdXRoLCAmYXV0aF9jb21tYW5kKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoX2NvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG4iKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZhdXRoX2NvbW1hbmQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICBzaHV0ZG93bl9tZWNoIChhdXRoKTsKKyAgYXV0aC0+bWVjaCA9IG1lY2g7ICAgICAgCisgIGdvdG9fc3RhdGUgKGF1dGgsICZjbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9kYXRhIChEQnVzQXV0aCAqYXV0aCwgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgaW50IG9sZF9sZW47CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgPT0gMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiREFUQVxyXG4iKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG9sZF9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiREFUQSAiKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKGRhdGEsIDAsICZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiXHJcbiIpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBvdXQ6CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nLCBvbGRfbGVuKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX3JlamVjdGVkIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgREJ1c1N0cmluZyBjb21tYW5kOworICBEQnVzQXV0aFNlcnZlciAqc2VydmVyX2F1dGg7CisgIGludCBpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbW1hbmQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFSkVDVEVEIikpCisgICAgZ290byBub21lbTsKKworICBpID0gMDsKKyAgd2hpbGUgKGFsbF9tZWNoYW5pc21zW2ldLm1lY2hhbmlzbSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIikpCisgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9tZWNoYW5pc21zW2ldLm1lY2hhbmlzbSkpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCAiXHJcbiIpKQorICAgIGdvdG8gbm9tZW07CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvbW1hbmQsIDAsICZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykpKQorICAgIGdvdG8gbm9tZW07CisKKyAgc2h1dGRvd25fbWVjaCAoYXV0aCk7CisgIAorICBfZGJ1c19hc3NlcnQgKERCVVNfQVVUSF9JU19TRVJWRVIgKGF1dGgpKTsKKyAgc2VydmVyX2F1dGggPSBEQlVTX0FVVEhfU0VSVkVSIChhdXRoKTsKKyAgc2VydmVyX2F1dGgtPmZhaWx1cmVzICs9IDE7CisKKyAgaWYgKHNlcnZlcl9hdXRoLT5mYWlsdXJlcyA+PSBzZXJ2ZXJfYXV0aC0+bWF4X2ZhaWx1cmVzKQorICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgZWxzZQorICAgIGdvdG9fc3RhdGUgKGF1dGgsICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYXV0aCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgCisgIHJldHVybiBUUlVFOworCisgbm9tZW06CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2Vycm9yIChEQnVzQXV0aCAqYXV0aCwgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIFwiJXNcIlxyXG4iLCBtZXNzYWdlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX29rIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgaW50IG9yaWdfbGVuOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZyk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiT0sgIikgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19jb3B5ICgmIERCVVNfQVVUSF9TRVJWRVIgKGF1dGgpLT5ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpKSAmJgorICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiXHJcbiIpKQorICAgIHsKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZywgb3JpZ19sZW4pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2JlZ2luIChEQnVzQXV0aCAgICAgICAgICphdXRoKQoreworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCRUdJTlxyXG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19vayhEQnVzQXV0aCAqYXV0aCwKKyAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzX2Zyb21fb2spIHsKKworICBpbnQgZW5kX29mX2hleDsKKyAgCisgIC8qICJhcmdzX2Zyb21fb2siIHNob3VsZCBiZSB0aGUgR1VJRCwgd2hpdGVzcGFjZSBhbHJlYWR5IHB1bGxlZCBvZmYgdGhlIGZyb250ICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIpID09IDApOworCisgIC8qIFdlIGRlY29kZSB0aGUgaGV4IHN0cmluZyB0byBiaW5hcnksIHVzaW5nIGd1aWRfZnJvbV9zZXJ2ZXIgYXMgc2NyYXRjaC4uLiAqLworICAKKyAgZW5kX29mX2hleCA9IDA7CisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKGFyZ3NfZnJvbV9vaywgMCwgJmVuZF9vZl9oZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIsIDApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBub3cgY2xlYXIgb3V0IHRoZSBzY3JhdGNoICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyLCAwKTsKKyAgCisgIGlmIChlbmRfb2ZfaGV4ICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhcmdzX2Zyb21fb2spIHx8CisgICAgICBlbmRfb2ZfaGV4ID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkJhZCBHVUlEIGZyb20gc2VydmVyLCBwYXJzZWQgJWQgYnl0ZXMgYW5kIGhhZCAlZCBieXRlcyBmcm9tIHNlcnZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9oZXgsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhcmdzX2Zyb21fb2spKTsKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChhcmdzX2Zyb21fb2ssIDAsICZEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciwgMCkpIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyLCAwKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJHb3QgR1VJRCAnJXMnIGZyb20gdGhlIHNlcnZlclxuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyKSk7CisKKyAgaWYgKGF1dGgtPnVuaXhfZmRfcG9zc2libGUpCisgICAgcmV0dXJuIHNlbmRfbmVnb3RpYXRlX3VuaXhfZmQoYXV0aCk7CisKKyAgX2RidXNfdmVyYm9zZSgiTm90IG5lZ290aWF0aW5nIHVuaXggZmQgcGFzc2luZywgc2luY2Ugbm90IHBvc3NpYmxlXG4iKTsKKyAgcmV0dXJuIHNlbmRfYmVnaW4gKGF1dGgpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfY2FuY2VsIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIkNBTkNFTFxyXG4iKSkKKyAgICB7CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19kYXRhIChEQnVzQXV0aCAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKmFyZ3MsCisgICAgICAgICAgICAgIERCdXNBdXRoRGF0YUZ1bmN0aW9uICBkYXRhX2Z1bmMpCit7CisgIGludCBlbmQ7CisgIERCdXNTdHJpbmcgZGVjb2RlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGVjb2RlZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKGFyZ3MsIDAsICZlbmQsICZkZWNvZGVkLCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3MpICE9IGVuZCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICAgICAgaWYgKCFzZW5kX2Vycm9yIChhdXRoLCAiSW52YWxpZCBoZXggZW5jb2RpbmciKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgaWYgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoJmRlY29kZWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCkpKQorICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogZGF0YTogJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZGVjb2RlZCkpOworI2VuZGlmCisgICAgICAKKyAgaWYgKCEoKiBkYXRhX2Z1bmMpIChhdXRoLCAmZGVjb2RlZCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9uZWdvdGlhdGVfdW5peF9mZCAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJORUdPVElBVEVfVU5JWF9GRFxyXG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ290b19zdGF0ZSAoYXV0aCwgJmNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9hZ3JlZV91bml4X2ZkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9hZ3JlZV91bml4X2ZkIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgX2RidXNfYXNzZXJ0KGF1dGgtPnVuaXhfZmRfcG9zc2libGUpOworCisgIGF1dGgtPnVuaXhfZmRfbmVnb3RpYXRlZCA9IFRSVUU7CisgIF9kYnVzX3ZlcmJvc2UoIkFncmVlZCB0byBVTklYIEZEIHBhc3NpbmdcbiIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBR1JFRV9VTklYX0ZEXHJcbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnb3RvX3N0YXRlIChhdXRoLCAmc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2F1dGggKERCdXNBdXRoICphdXRoLCBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3MpID09IDApCisgICAgeworICAgICAgLyogTm8gYXJncyB0byB0aGUgYXV0aCwgc2VuZCBtZWNoYW5pc21zICovCisgICAgICBpZiAoIXNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgREJ1c1N0cmluZyBtZWNoOworICAgICAgREJ1c1N0cmluZyBoZXhfcmVzcG9uc2U7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChhcmdzLCAwLCAmaSk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZtZWNoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmaGV4X3Jlc3BvbnNlKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbWVjaCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChhcmdzLCAwLCBpLCAmbWVjaCwgMCkpCisgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoYXJncywgaSwgJmkpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoYXJncywgaSwgJmhleF9yZXNwb25zZSwgMCkpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAKKyAgICAgIGF1dGgtPm1lY2ggPSBmaW5kX21lY2ggKCZtZWNoLCBhdXRoLT5hbGxvd2VkX21lY2hzKTsKKyAgICAgIGlmIChhdXRoLT5tZWNoICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFRyeWluZyBtZWNoYW5pc20gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPm1lY2gtPm1lY2hhbmlzbSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFwcm9jZXNzX2RhdGEgKGF1dGgsICZoZXhfcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPm1lY2gtPnNlcnZlcl9kYXRhX2Z1bmMpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFVuc3VwcG9ydGVkIG1lY2hhbmlzbSAqLworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogVW5zdXBwb3J0ZWQgbWVjaGFuaXNtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZtZWNoKSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbWVjaCk7ICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhleF9yZXNwb25zZSk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgCisgICAgZmFpbGVkOgorICAgICAgYXV0aC0+bWVjaCA9IE5VTEw7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm1lY2gpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZoZXhfcmVzcG9uc2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGggIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgICAgcmV0dXJuIGhhbmRsZV9hdXRoIChhdXRoLCBhcmdzKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiTm90IGN1cnJlbnRseSBpbiBhbiBhdXRoIGNvbnZlcnNhdGlvbiIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIk5lZWQgdG8gYXV0aGVudGljYXRlIGZpcnN0Iik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJVbmtub3duIGNvbW1hbmQiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiU2VudCBBVVRIIHdoaWxlIGFub3RoZXIgQVVUSCBpbiBwcm9ncmVzcyIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICAgIHJldHVybiBwcm9jZXNzX2RhdGEgKGF1dGgsIGFyZ3MsIGF1dGgtPm1lY2gtPnNlcnZlcl9kYXRhX2Z1bmMpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiTmVlZCB0byBhdXRoZW50aWNhdGUgZmlyc3QiKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJTZW50IEFVVEggd2hpbGUgZXhwZWN0aW5nIEJFR0lOIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlNlbnQgREFUQSB3aGlsZSBleHBlY3RpbmcgQkVHSU4iKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpOworICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgICAgaWYgKGF1dGgtPnVuaXhfZmRfcG9zc2libGUpCisgICAgICAgIHJldHVybiBzZW5kX2FncmVlX3VuaXhfZmQoYXV0aCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzZW5kX2Vycm9yKGF1dGgsICJVbml4IEZEIHBhc3Npbmcgbm90IHN1cHBvcnRlZCwgbm90IGF1dGhlbnRpY2F0ZWQgb3Igb3RoZXJ3aXNlIG5vdCBwb3NzaWJsZSIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KK30KKworLyogcmV0dXJuIEZBTFNFIGlmIG5vIG1lbW9yeSwgVFJVRSBpZiBhbGwgT0sgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X3dvcmQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICBpbnQgICAgICAgICAgICAgICpzdGFydCwKKyAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp3b3JkKQoreworICBpbnQgaTsKKworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCAqc3RhcnQsIHN0YXJ0KTsKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKHN0ciwgKnN0YXJ0LCAmaSk7CisgIAorICBpZiAoaSA+ICpzdGFydCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoc3RyLCAqc3RhcnQsIGkgLSAqc3RhcnQsIHdvcmQsIDApKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICpzdGFydCA9IGk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlY29yZF9tZWNoYW5pc21zIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIGludCBuZXh0OworICBpbnQgbGVuOworCisgIGlmIChhdXRoLT5hbHJlYWR5X2dvdF9tZWNoYW5pc21zKQorICAgIHJldHVybiBUUlVFOworICAKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3MpOworICAKKyAgbmV4dCA9IDA7CisgIHdoaWxlIChuZXh0IDwgbGVuKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgbTsKKyAgICAgIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlciAqbWVjaDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm0pKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgCisgICAgICBpZiAoIWdldF93b3JkIChhcmdzLCAmbmV4dCwgJm0pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtKTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisKKyAgICAgIG1lY2ggPSBmaW5kX21lY2ggKCZtLCBhdXRoLT5hbGxvd2VkX21lY2hzKTsKKworICAgICAgaWYgKG1lY2ggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZJWE1FIHJpZ2h0IG5vdyB3ZSB0cnkgbWVjaGFuaXNtcyBpbiB0aGUgb3JkZXIKKyAgICAgICAgICAgKiB0aGUgc2VydmVyIGxpc3RzIHRoZW07IHNob3VsZCB3ZSBkbyB0aGVtIGluCisgICAgICAgICAgICogc29tZSBtb3JlIGRldGVybWluaXN0aWMgb3JkZXI/CisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBQcm9iYWJseSBpbiBhbGxfbWVjaGFuaXNtcyBvcmRlciwgb3VyIG9yZGVyIG9mCisgICAgICAgICAgICogcHJlZmVyZW5jZS4gT2YgY291cnNlIHdoZW4gdGhlIHNlcnZlciBpcyB1cywKKyAgICAgICAgICAgKiBpdCBsaXN0cyB0aGluZ3MgaW4gdGhhdCBvcmRlciBhbnlob3cuCisgICAgICAgICAgICovCisKKyAgICAgICAgICBpZiAobWVjaCAhPSAmYWxsX21lY2hhbmlzbXNbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQWRkaW5nIG1lY2hhbmlzbSAlcyB0byBsaXN0IHdlIHdpbGwgdHJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIG1lY2gtPm1lY2hhbmlzbSk7CisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBtZWNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm0pOworICAgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEFscmVhZHkgdHJpZWQgbWVjaGFuaXNtICVzOyBub3QgYWRkaW5nIHRvIGxpc3Qgd2Ugd2lsbCB0cnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwgbWVjaC0+bWVjaGFuaXNtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBTZXJ2ZXIgb2ZmZXJlZCBtZWNoYW5pc20gXCIlc1wiIHRoYXQgd2UgZG9uJ3Qga25vdyBob3cgdG8gdXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZtKSk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtKTsKKyAgICB9CisgIAorICBhdXRoLT5hbHJlYWR5X2dvdF9tZWNoYW5pc21zID0gVFJVRTsKKyAgCisgIHJldHVybiBUUlVFOworCisgbm9tZW06CisgIF9kYnVzX2xpc3RfY2xlYXIgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSk7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19yZWplY3RlZCAoREJ1c0F1dGggKmF1dGgsIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlciAqbWVjaDsKKyAgREJ1c0F1dGhDbGllbnQgKmNsaWVudDsKKworICBjbGllbnQgPSBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKTsKKworICBpZiAoIWF1dGgtPmFscmVhZHlfZ290X21lY2hhbmlzbXMpCisgICAgeworICAgICAgaWYgKCFyZWNvcmRfbWVjaGFuaXNtcyAoYXV0aCwgYXJncykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1lY2ggPSBjbGllbnQtPm1lY2hzX3RvX3RyeS0+ZGF0YTsKKworICAgICAgaWYgKCFzZW5kX2F1dGggKGF1dGgsIG1lY2gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmY2xpZW50LT5tZWNoc190b190cnkpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFRyeWluZyBtZWNoYW5pc20gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICBtZWNoLT5tZWNoYW5pc20pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEdpdmUgdXAgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRGlzY29ubmVjdGluZyBiZWNhdXNlIHdlIGFyZSBvdXQgb2YgbWVjaGFuaXNtcyB0byB0cnkgdXNpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QpOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGgtPm1lY2ggIT0gTlVMTCk7CisgCisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgICAgcmV0dXJuIHByb2Nlc3NfZGF0YSAoYXV0aCwgYXJncywgYXV0aC0+bWVjaC0+Y2xpZW50X2RhdGFfZnVuYyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgICAgcmV0dXJuIHByb2Nlc3NfcmVqZWN0ZWQgKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICAgIHJldHVybiBwcm9jZXNzX29rKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX2NhbmNlbCAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgICAgcmV0dXJuIHByb2Nlc3NfcmVqZWN0ZWQgKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICAgIHJldHVybiBwcm9jZXNzX29rKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgICByZXR1cm4gc2VuZF9jYW5jZWwgKGF1dGgpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICAgIHJldHVybiBwcm9jZXNzX3JlamVjdGVkIChhdXRoLCBhcmdzKTsKKyAgICAgIAorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9hZ3JlZV91bml4X2ZkKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICAgIF9kYnVzX2Fzc2VydChhdXRoLT51bml4X2ZkX3Bvc3NpYmxlKTsKKyAgICAgIGF1dGgtPnVuaXhfZmRfbmVnb3RpYXRlZCA9IFRSVUU7CisgICAgICBfZGJ1c192ZXJib3NlKCJTdWNlc3NmdWxseSBuZWdvdGlhdGVkIFVOSVggRkQgcGFzc2luZ1xuIik7CisgICAgICByZXR1cm4gc2VuZF9iZWdpbiAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgX2RidXNfYXNzZXJ0KGF1dGgtPnVuaXhfZmRfcG9zc2libGUpOworICAgICAgYXV0aC0+dW5peF9mZF9uZWdvdGlhdGVkID0gRkFMU0U7CisgICAgICBfZGJ1c192ZXJib3NlKCJGYWlsZWQgdG8gbmVnb3RpYXRlIFVOSVggRkQgcGFzc2luZ1xuIik7CisgICAgICByZXR1cm4gc2VuZF9iZWdpbiAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworLyoqCisgKiBNYXBwaW5nIGZyb20gY29tbWFuZCBuYW1lIHRvIGVudW0KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBjb21tYW5kICovCisgIERCdXNBdXRoQ29tbWFuZCBjb21tYW5kOyAvKio8IENvcnJlc3BvbmRpbmcgZW51bSAqLworfSBEQnVzQXV0aENvbW1hbmROYW1lOworCitzdGF0aWMgY29uc3QgREJ1c0F1dGhDb21tYW5kTmFtZSBhdXRoX2NvbW1hbmRfbmFtZXNbXSA9IHsKKyAgeyAiQVVUSCIsICAgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9BVVRIIH0sCisgIHsgIkNBTkNFTCIsICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMIH0sCisgIHsgIkRBVEEiLCAgICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfREFUQSB9LAorICB7ICJCRUdJTiIsICAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX0JFR0lOIH0sCisgIHsgIlJFSkVDVEVEIiwgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQgfSwKKyAgeyAiT0siLCAgICAgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9PSyB9LAorICB7ICJFUlJPUiIsICAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SIH0sCisgIHsgIk5FR09USUFURV9VTklYX0ZEIiwgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQgfSwKKyAgeyAiQUdSRUVfVU5JWF9GRCIsICAgICBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEIH0KK307CisKK3N0YXRpYyBEQnVzQXV0aENvbW1hbmQKK2xvb2t1cF9jb21tYW5kX2Zyb21fbmFtZSAoREJ1c1N0cmluZyAqY29tbWFuZCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IF9EQlVTX05fRUxFTUVOVFMgKGF1dGhfY29tbWFuZF9uYW1lcyk7IGkrKykKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9jb21tYW5kX25hbWVzW2ldLm5hbWUpKQorICAgICAgICByZXR1cm4gYXV0aF9jb21tYW5kX25hbWVzW2ldLmNvbW1hbmQ7CisgICAgfQorCisgIHJldHVybiBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOworfQorCitzdGF0aWMgdm9pZAorZ290b19zdGF0ZSAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSAqc3RhdGUpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCIlczogZ29pbmcgZnJvbSBzdGF0ZSAlcyB0byBzdGF0ZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICBhdXRoLT5zdGF0ZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgc3RhdGUtPm5hbWUpOworCisgIGF1dGgtPnN0YXRlID0gc3RhdGU7Cit9CisKKy8qIHJldHVybnMgd2hldGhlciB0byBjYWxsIGl0IGFnYWluIHJpZ2h0IGF3YXkgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19jb21tYW5kIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgREJ1c0F1dGhDb21tYW5kIGNvbW1hbmQ7CisgIERCdXNTdHJpbmcgbGluZTsKKyAgREJ1c1N0cmluZyBhcmdzOworICBpbnQgZW9sOworICBpbnQgaSwgajsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIC8qIF9kYnVzX3ZlcmJvc2UgKCIlczogICB0cnlpbmcgcHJvY2Vzc19jb21tYW5kKClcbiIpOyAqLworICAKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBlb2wgPSAwOworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmYXV0aC0+aW5jb21pbmcsIDAsICJcclxuIiwgJmVvbCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxpbmUpKQorICAgIHsKKyAgICAgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBUUlVFOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXJncykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgICAgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBUUlVFOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmYXV0aC0+aW5jb21pbmcsIDAsIGVvbCwgJmxpbmUsIDApKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpICgmbGluZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQ29tbWFuZCBjb250YWluZWQgbm9uLUFTQ0lJIGNoYXJzIG9yIGVtYmVkZGVkIG51bFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICBpZiAoIXNlbmRfZXJyb3IgKGF1dGgsICJDb21tYW5kIGNvbnRhaW5lZCBub24tQVNDSUkiKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gbmV4dF9jb21tYW5kOworICAgIH0KKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCIlczogZ290IGNvbW1hbmQgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rICgmbGluZSwgMCwgJmkpOworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoJmxpbmUsIGksICZqKTsKKworICBpZiAoaiA+IGkpCisgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmxpbmUsIGksIGogLSBpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZsaW5lLCBpLCAmYXJncywgMCkpCisgICAgZ290byBvdXQ7CisKKyAgLyogRklYTUUgMS4wIHdlIHNob3VsZCBwcm9iYWJseSB2YWxpZGF0ZSB0aGF0IG9ubHkgdGhlIGFsbG93ZWQKKyAgICogY2hhcnMgYXJlIGluIHRoZSBjb21tYW5kIG5hbWUKKyAgICovCisgIAorICBjb21tYW5kID0gbG9va3VwX2NvbW1hbmRfZnJvbV9uYW1lICgmbGluZSk7CisgIGlmICghKCogYXV0aC0+c3RhdGUtPmhhbmRsZXIpIChhdXRoLCBjb21tYW5kLCAmYXJncykpCisgICAgZ290byBvdXQ7CisKKyBuZXh0X2NvbW1hbmQ6CisgIAorICAvKiBXZSd2ZSBzdWNjZWVkZWQgaW4gcHJvY2Vzc2luZyB0aGUgd2hvbGUgY29tbWFuZCBzbyBkcm9wIGl0IG91dAorICAgKiBvZiB0aGUgaW5jb21pbmcgYnVmZmVyIGFuZCByZXR1cm4gVFJVRSB0byB0cnkgYW5vdGhlciBjb21tYW5kLgorICAgKi8KKworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYXV0aC0+aW5jb21pbmcsIDAsIGVvbCk7CisgIAorICAvKiBraWxsIHRoZSBcclxuICovCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZhdXRoLT5pbmNvbWluZywgMCwgMik7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFyZ3MpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxpbmUpOworCisgIGlmICghcmV0dmFsKQorICAgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBUUlVFOworICBlbHNlCisgICAgYXV0aC0+bmVlZGVkX21lbW9yeSA9IEZBTFNFOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQXV0aAorICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgYXV0aCBjb252ZXJzYXRpb24gb2JqZWN0IGZvciB0aGUgc2VydmVyIHNpZGUuCisgKiBTZWUgZG9jL2RidXMtc2FzbC1wcm9maWxlLnR4dCBmb3IgZnVsbCBkZXRhaWxzIG9uIHdoYXQKKyAqIHRoaXMgb2JqZWN0IGRvZXMuCisgKgorICogQHJldHVybnMgdGhlIG5ldyBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNBdXRoKgorX2RidXNfYXV0aF9zZXJ2ZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICpndWlkKQoreworICBEQnVzQXV0aCAqYXV0aDsKKyAgREJ1c0F1dGhTZXJ2ZXIgKnNlcnZlcl9hdXRoOworICBEQnVzU3RyaW5nIGd1aWRfY29weTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZ3VpZF9jb3B5KSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChndWlkLCAwLCAmZ3VpZF9jb3B5LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmd1aWRfY29weSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgYXV0aCA9IF9kYnVzX2F1dGhfbmV3IChzaXplb2YgKERCdXNBdXRoU2VydmVyKSk7CisgIGlmIChhdXRoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZndWlkX2NvcHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgYXV0aC0+c2lkZSA9IGF1dGhfc2lkZV9zZXJ2ZXI7CisgIGF1dGgtPnN0YXRlID0gJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoOworCisgIHNlcnZlcl9hdXRoID0gREJVU19BVVRIX1NFUlZFUiAoYXV0aCk7CisKKyAgc2VydmVyX2F1dGgtPmd1aWQgPSBndWlkX2NvcHk7CisgIAorICAvKiBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHBlci1tZWNoYW5pc20gd2l0aCBhIGxvd2VyCisgICAqIG1heAorICAgKi8KKyAgc2VydmVyX2F1dGgtPmZhaWx1cmVzID0gMDsKKyAgc2VydmVyX2F1dGgtPm1heF9mYWlsdXJlcyA9IDY7CisgIAorICByZXR1cm4gYXV0aDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGF1dGggY29udmVyc2F0aW9uIG9iamVjdCBmb3IgdGhlIGNsaWVudCBzaWRlLgorICogU2VlIGRvYy9kYnVzLXNhc2wtcHJvZmlsZS50eHQgZm9yIGZ1bGwgZGV0YWlscyBvbiB3aGF0CisgKiB0aGlzIG9iamVjdCBkb2VzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQXV0aCoKK19kYnVzX2F1dGhfY2xpZW50X25ldyAodm9pZCkKK3sKKyAgREJ1c0F1dGggKmF1dGg7CisgIERCdXNTdHJpbmcgZ3VpZF9zdHI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmd1aWRfc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBhdXRoID0gX2RidXNfYXV0aF9uZXcgKHNpemVvZiAoREJ1c0F1dGhDbGllbnQpKTsKKyAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmd1aWRfc3RyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciA9IGd1aWRfc3RyOworCisgIGF1dGgtPnNpZGUgPSBhdXRoX3NpZGVfY2xpZW50OworICBhdXRoLT5zdGF0ZSA9ICZjbGllbnRfc3RhdGVfbmVlZF9zZW5kX2F1dGg7CisKKyAgLyogU3RhcnQgdGhlIGF1dGggY29udmVyc2F0aW9uIGJ5IHNlbmRpbmcgQVVUSCBmb3Igb3VyIGRlZmF1bHQKKyAgICogbWVjaGFuaXNtICovCisgIGlmICghc2VuZF9hdXRoIChhdXRoLCAmYWxsX21lY2hhbmlzbXNbMF0pKQorICAgIHsKKyAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmV0dXJuIGF1dGg7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmY291bnQgb2YgYW4gYXV0aCBvYmplY3QuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqLworREJ1c0F1dGggKgorX2RidXNfYXV0aF9yZWYgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIAorICBhdXRoLT5yZWZjb3VudCArPSAxOworICAKKyAgcmV0dXJuIGF1dGg7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmY291bnQgb2YgYW4gYXV0aCBvYmplY3QuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfdW5yZWYgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+cmVmY291bnQgPiAwKTsKKworICBhdXRoLT5yZWZjb3VudCAtPSAxOworICBpZiAoYXV0aC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBzaHV0ZG93bl9tZWNoIChhdXRoKTsKKworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIpOworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoREJVU19BVVRIX0lTX1NFUlZFUiAoYXV0aCkpOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCYgREJVU19BVVRIX1NFUlZFUiAoYXV0aCktPmd1aWQpOworICAgICAgICB9CisKKyAgICAgIGlmIChhdXRoLT5rZXlyaW5nKQorICAgICAgICBfZGJ1c19rZXlyaW5nX3VucmVmIChhdXRoLT5rZXlyaW5nKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5jb250ZXh0KTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+Y2hhbGxlbmdlKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+aWRlbnRpdHkpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pbmNvbWluZyk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPm91dGdvaW5nKTsKKworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXV0aC0+YWxsb3dlZF9tZWNocyk7CisKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5jcmVkZW50aWFscyk7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSk7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYXV0aCk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgYW4gYXJyYXkgb2YgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIG5hbWVzCisgKiB0aGF0IHdlIGFyZSB3aWxsaW5nIHRvIHVzZS4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBtZWNoYW5pc21zICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWVjaGFuaXNtIG5hbWVzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX3NldF9tZWNoYW5pc21zIChEQnVzQXV0aCAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiptZWNoYW5pc21zKQoreworICBjaGFyICoqY29weTsKKworICBpZiAobWVjaGFuaXNtcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvcHkgPSBfZGJ1c19kdXBfc3RyaW5nX2FycmF5IChtZWNoYW5pc21zKTsKKyAgICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICBjb3B5ID0gTlVMTDsKKyAgCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGF1dGgtPmFsbG93ZWRfbWVjaHMpOworCisgIGF1dGgtPmFsbG93ZWRfbWVjaHMgPSBjb3B5OworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlJ3JlIGluIGEgZmluYWwgc3RhdGUKKyAqLworI2RlZmluZSBEQlVTX0FVVEhfSU5fRU5EX1NUQVRFKGF1dGgpICgoYXV0aCktPnN0YXRlLT5oYW5kbGVyID09IE5VTEwpCisKKy8qKgorICogQW5hbHl6ZXMgYnVmZmVyZWQgaW5wdXQgYW5kIG1vdmVzIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBmb3J3YXJkLAorICogcmV0dXJuaW5nIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGF1dGggY29udmVyc2F0aW9uLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgdGhlIG5ldyBzdGF0ZQorICovCitEQnVzQXV0aFN0YXRlCitfZGJ1c19hdXRoX2RvX3dvcmsgKERCdXNBdXRoICphdXRoKQoreworICBhdXRoLT5uZWVkZWRfbWVtb3J5ID0gRkFMU0U7CisKKyAgLyogTWF4IGFtb3VudCB3ZSdsbCBidWZmZXIgdXAgYmVmb3JlIGRlY2lkaW5nIHNvbWVvbmUncyBvbiBjcmFjayAqLworI2RlZmluZSBNQVhfQlVGRkVSICgxNiAqIF9EQlVTX09ORV9LSUxPQllURSkKKworICBkbworICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSU5fRU5EX1NUQVRFIChhdXRoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPmluY29taW5nKSA+IE1BWF9CVUZGRVIgfHwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSA+IE1BWF9CVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBEaXNjb25uZWN0aW5nIGR1ZSB0byBleGNlc3NpdmUgZGF0YSBidWZmZXJlZCBpbiBhdXRoIHBoYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIHdoaWxlIChwcm9jZXNzX2NvbW1hbmQgKGF1dGgpKTsKKworICBpZiAoYXV0aC0+bmVlZGVkX21lbW9yeSkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWTsKKyAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykgPiAwKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOworICBlbHNlIGlmIChhdXRoLT5zdGF0ZSA9PSAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCkKKyAgICByZXR1cm4gREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDsKKyAgZWxzZSBpZiAoYXV0aC0+c3RhdGUgPT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgZWxzZSByZXR1cm4gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUOworfQorCisvKioKKyAqIEdldHMgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIHBlZXIgd2UncmUgY29udmVyc2luZyB3aXRoLgorICogQWZ0ZXIgd3JpdGluZyBzb21lIGJ5dGVzLCBfZGJ1c19hdXRoX2J5dGVzX3NlbnQoKSBtdXN0IGJlIGNhbGxlZAorICogdG8gbm90aWZ5IHRoZSBhdXRoIG9iamVjdCB0aGF0IHRoZXkgd2VyZSB3cml0dGVuLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIHN0ciByZXR1cm4gbG9jYXRpb24gZm9yIGEgcmVmIHRvIHRoZSBidWZmZXIgdG8gc2VuZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdGhpbmcgdG8gc2VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAoREJ1c0F1dGggICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqc3RyKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyICE9IE5VTEwpOworCisgICpzdHIgPSBOVUxMOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgICpzdHIgPSAmYXV0aC0+b3V0Z29pbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTm90aWZpZXMgdGhlIGF1dGggY29udmVyc2F0aW9uIG9iamVjdCB0aGF0CisgKiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBvdXRnb2luZyBidWZmZXIKKyAqIGhhdmUgYmVlbiB3cml0dGVuIG91dC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBieXRlc19zZW50IG51bWJlciBvZiBieXRlcyB3cml0dGVuIG91dAorICovCit2b2lkCitfZGJ1c19hdXRoX2J5dGVzX3NlbnQgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgYnl0ZXNfc2VudCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIiVzOiBTZW50ICVkIGJ5dGVzIG9mOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICBieXRlc19zZW50LAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhdXRoLT5vdXRnb2luZykpOworICAKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBieXRlc19zZW50KTsKK30KKworLyoqCisgKiBHZXQgYSBidWZmZXIgdG8gYmUgdXNlZCBmb3IgcmVhZGluZyBieXRlcyBmcm9tIHRoZSBwZWVyIHdlJ3JlIGNvbnZlcnNpbmcKKyAqIHdpdGguIEJ5dGVzIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGlzIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBidWZmZXIgcmV0dXJuIGxvY2F0aW9uIGZvciBidWZmZXIgdG8gYXBwZW5kIGJ5dGVzIHRvCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfZ2V0X2J1ZmZlciAoREJ1c0F1dGggICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICoqYnVmZmVyKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIWF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisgIAorICAqYnVmZmVyID0gJmF1dGgtPmluY29taW5nOworCisgIGF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyA9IFRSVUU7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGJ1ZmZlciB3aXRoIG5ldyBkYXRhIHJlYWQgaW50byBpdC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBiZWluZyByZXR1cm5lZAorICogQHBhcmFtIGJ5dGVzX3JlYWQgbnVtYmVyIG9mIG5ldyBieXRlcyBhZGRlZAorICovCit2b2lkCitfZGJ1c19hdXRoX3JldHVybl9idWZmZXIgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIgPT0gJmF1dGgtPmluY29taW5nKTsKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5idWZmZXJfb3V0c3RhbmRpbmcpOworCisgIGF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyA9IEZBTFNFOworfQorCisvKioKKyAqIFJldHVybnMgbGVmdG92ZXIgYnl0ZXMgdGhhdCB3ZXJlIG5vdCB1c2VkIGFzIHBhcnQgb2YgdGhlIGF1dGgKKyAqIGNvbnZlcnNhdGlvbi4gIFRoZXNlIGJ5dGVzIHdpbGwgYmUgcGFydCBvZiB0aGUgbWVzc2FnZSBzdHJlYW0KKyAqIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgdW50aWwgYXV0aGVudGljYXRpb24gaGFzCisgKiBzdWNjZWVkZWQuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gc3RyIHJldHVybiBsb2NhdGlvbiBmb3IgcG9pbnRlciB0byBzdHJpbmcgb2YgdW51c2VkIGJ5dGVzCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAoREJ1c0F1dGggICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqc3RyKQoreworICBpZiAoIURCVVNfQVVUSF9JTl9FTkRfU1RBVEUgKGF1dGgpKQorICAgIHJldHVybjsKKworICAqc3RyID0gJmF1dGgtPmluY29taW5nOworfQorCisKKy8qKgorICogR2V0cyByaWQgb2YgdW51c2VkIGJ5dGVzIHJldHVybmVkIGJ5IF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcygpCisgKiBhZnRlciB3ZSd2ZSBnb3R0ZW4gdGhlbSBhbmQgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRoZW0gZWxzZXdoZXJlLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICovCit2b2lkCitfZGJ1c19hdXRoX2RlbGV0ZV91bnVzZWRfYnl0ZXMgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoIURCVVNfQVVUSF9JTl9FTkRfU1RBVEUgKGF1dGgpKQorICAgIHJldHVybjsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmluY29taW5nLCAwKTsKK30KKworLyoqCisgKiBDYWxsZWQgcG9zdC1hdXRoZW50aWNhdGlvbiwgaW5kaWNhdGVzIHdoZXRoZXIgd2UgbmVlZCB0byBlbmNvZGUKKyAqIHRoZSBtZXNzYWdlIHN0cmVhbSB3aXRoIF9kYnVzX2F1dGhfZW5jb2RlX2RhdGEoKSBwcmlvciB0bworICogc2VuZGluZyBpdCB0byB0aGUgcGVlci4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIG5lZWQgdG8gZW5jb2RlIHRoZSBzdHJlYW0KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfbmVlZHNfZW5jb2RpbmcgKERCdXNBdXRoICphdXRoKQoreworICBpZiAoYXV0aC0+c3RhdGUgIT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChhdXRoLT5tZWNoICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICByZXR1cm4gYXV0aC0+bWVjaC0+Y2xpZW50X2VuY29kZV9mdW5jICE9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZW5jb2RlX2Z1bmMgIT0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGVuY29kZXMgYSBibG9jayBvZiBieXRlcyBmb3Igc2VuZGluZyB0bworICogdGhlIHBlZXIuIElmIG5vIGVuY29kaW5nIHdhcyBuZWdvdGlhdGVkLCBqdXN0IGNvcGllcyB0aGUgYnl0ZXMKKyAqICh5b3UgY2FuIGF2b2lkIHRoaXMgYnkgY2hlY2tpbmcgX2RidXNfYXV0aF9uZWVkc19lbmNvZGluZygpKS4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBwbGFpbnRleHQgdGhlIHBsYWluIHRleHQgZGF0YQorICogQHBhcmFtIGVuY29kZWQgaW5pdGlhbGl6ZWQgc3RyaW5nIHRvIHdoZXJlIGVuY29kZWQgZGF0YSBpcyBhcHBlbmRlZAorICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkgYW5kIHN1Y2Nlc3NmdWxseSBlbmNvZGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX2VuY29kZV9kYXRhIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChwbGFpbnRleHQgIT0gZW5jb2RlZCk7CisgIAorICBpZiAoYXV0aC0+c3RhdGUgIT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChfZGJ1c19hdXRoX25lZWRzX2VuY29kaW5nIChhdXRoKSkKKyAgICB7CisgICAgICBpZiAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpCisgICAgICAgIHJldHVybiAoKiBhdXRoLT5tZWNoLT5jbGllbnRfZW5jb2RlX2Z1bmMpIChhdXRoLCBwbGFpbnRleHQsIGVuY29kZWQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKCogYXV0aC0+bWVjaC0+c2VydmVyX2VuY29kZV9mdW5jKSAoYXV0aCwgcGxhaW50ZXh0LCBlbmNvZGVkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKHBsYWludGV4dCwgMCwgZW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVuY29kZWQpKTsKKyAgICB9Cit9CisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGluZGljYXRlcyB3aGV0aGVyIHdlIG5lZWQgdG8gZGVjb2RlCisgKiB0aGUgbWVzc2FnZSBzdHJlYW0gd2l0aCBfZGJ1c19hdXRoX2RlY29kZV9kYXRhKCkgYWZ0ZXIKKyAqIHJlY2VpdmluZyBpdCBmcm9tIHRoZSBwZWVyLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgbmVlZCB0byBlbmNvZGUgdGhlIHN0cmVhbQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAgIAorICBpZiAoYXV0aC0+bWVjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgcmV0dXJuIGF1dGgtPm1lY2gtPmNsaWVudF9kZWNvZGVfZnVuYyAhPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYXV0aC0+bWVjaC0+c2VydmVyX2RlY29kZV9mdW5jICE9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKgorICogQ2FsbGVkIHBvc3QtYXV0aGVudGljYXRpb24sIGRlY29kZXMgYSBibG9jayBvZiBieXRlcyByZWNlaXZlZCBmcm9tCisgKiB0aGUgcGVlci4gSWYgbm8gZW5jb2Rpbmcgd2FzIG5lZ290aWF0ZWQsIGp1c3QgY29waWVzIHRoZSBieXRlcyAoeW91CisgKiBjYW4gYXZvaWQgdGhpcyBieSBjaGVja2luZyBfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nKCkpLgorICoKKyAqIEB0b2RvIDEuMD8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoICJvdXQgb2YgbWVtb3J5IiBlcnJvcgorICogZnJvbSAidGhlIGRhdGEgaXMgaG9zZWQiIGVycm9yLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGVuY29kZWQgdGhlIGVuY29kZWQgZGF0YQorICogQHBhcmFtIHBsYWludGV4dCBpbml0aWFsaXplZCBzdHJpbmcgd2hlcmUgZGVjb2RlZCBkYXRhIGlzIGFwcGVuZGVkCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBoYWQgZW5vdWdoIG1lbW9yeSBhbmQgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfZGVjb2RlX2RhdGEgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICplbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcGxhaW50ZXh0KQoreworICBfZGJ1c19hc3NlcnQgKHBsYWludGV4dCAhPSBlbmNvZGVkKTsKKyAgCisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKF9kYnVzX2F1dGhfbmVlZHNfZGVjb2RpbmcgKGF1dGgpKQorICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgcmV0dXJuICgqIGF1dGgtPm1lY2gtPmNsaWVudF9kZWNvZGVfZnVuYykgKGF1dGgsIGVuY29kZWQsIHBsYWludGV4dCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoKiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZGVjb2RlX2Z1bmMpIChhdXRoLCBlbmNvZGVkLCBwbGFpbnRleHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weSAoZW5jb2RlZCwgMCwgcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocGxhaW50ZXh0KSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgY3JlZGVudGlhbHMgcmVjZWl2ZWQgdmlhIHJlbGlhYmxlIG1lYW5zIGZyb20gdGhlIG9wZXJhdGluZworICogc3lzdGVtLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBjcmVkZW50aWFscyByZWNlaXZlZAorICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICAgICAqY3JlZGVudGlhbHMpCit7CisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5jcmVkZW50aWFscyk7CisgIHJldHVybiBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGF1dGgtPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaWRlbnRpdHkgd2UgYXV0aG9yaXplZCB0aGUgY2xpZW50IGFzLiAgQXBwcyBtYXkgaGF2ZQorICogZGlmZmVyZW50IHBvbGljaWVzIGFzIHRvIHdoYXQgaWRlbnRpdGllcyB0aGV5IGFsbG93LgorICoKKyAqIFJldHVybmVkIGNyZWRlbnRpYWxzIGFyZSBub3QgYSBjb3B5IGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyB0aGUgY3JlZGVudGlhbHMgd2UndmUgYXV0aG9yaXplZCBCWSBSRUZFUkVOQ0UgZG8gbm90IG1vZGlmeQorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCkKK3sKKyAgaWYgKGF1dGgtPnN0YXRlID09ICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCkKKyAgICB7CisgICAgICByZXR1cm4gYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGSVhNRSBpbnN0ZWFkIG9mIHRoaXMsIGtlZXAgYW4gZW1wdHkgY3JlZGVudGlhbCBhcm91bmQgdGhhdAorICAgICAgICogZG9lc24ndCByZXF1aXJlIGFsbG9jYXRpb24gb3Igc29tZXRoaW5nCisgICAgICAgKi8KKyAgICAgIC8qIHJldHVybiBlbXB0eSBjcmVkZW50aWFscyAqLworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHkpKTsKKyAgICAgIHJldHVybiBhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5OworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSBHVUlEIGZyb20gdGhlIHNlcnZlciBpZiB3ZSd2ZSBhdXRoZW50aWNhdGVkOyBnZXRzCisgKiAjTlVMTCBvdGhlcndpc2UuCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBvYmplY3QKKyAqIEByZXR1cm5zIHRoZSBHVUlEIGluIEFTQ0lJIGhleCBmb3JtYXQKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIgKERCdXNBdXRoICphdXRoKQoreworICBfZGJ1c19hc3NlcnQgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKTsKKyAgCisgIGlmIChhdXRoLT5zdGF0ZSA9PSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlcik7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBTZXRzIHRoZSAiYXV0aGVudGljYXRpb24gY29udGV4dCIgd2hpY2ggc2NvcGVzIGNvb2tpZXMKKyAqIHdpdGggdGhlIERCVVNfQ09PS0lFX1NIQTEgYXV0aCBtZWNoYW5pc20gZm9yIGV4YW1wbGUuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9zZXRfY29udGV4dCAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmNvbnRleHQpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKGNvbnRleHQsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNvbnRleHQsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSk7Cit9CisKKy8qKgorICogU2V0cyB3aGV0aGVyIHVuaXggZmQgcGFzc2luZyBpcyBwb3RlbnRpYWxseSBvbiB0aGUgdHJhbnNwb3J0IGFuZAorICogaGVuY2Ugc2hhbGwgYmUgbmVnb3RpYXRlZC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBiIFRSVUUgd2hlbiB1bml4IGZkIHBhc3Npbmcgc2hhbGwgYmUgbmVnb3RpYXRlZCwgb3RoZXJ3aXNlIEZBTFNFCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfc2V0X3VuaXhfZmRfcG9zc2libGUoREJ1c0F1dGggKmF1dGgsIGRidXNfYm9vbF90IGIpCit7CisgIGF1dGgtPnVuaXhfZmRfcG9zc2libGUgPSBiOworfQorCisvKioKKyAqIFF1ZXJpZXMgd2hldGhlciB1bml4IGZkIHBhc3Npbmcgd2FzIHN1Y2Vzc2Z1bGx5IG5lZ290aWF0ZWQuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2lvbgorICogQHJldHVybnMgI1RSVUUgd2hlbiB1bml4IGZkIHBhc3Npbmcgd2FzIG5lZ290aWF0ZWQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX2dldF91bml4X2ZkX25lZ290aWF0ZWQoREJ1c0F1dGggKmF1dGgpCit7CisgIHJldHVybiBhdXRoLT51bml4X2ZkX25lZ290aWF0ZWQ7Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLWF1dGgtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtYXV0aC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWF1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTNmMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWF1dGguaApAQCAtMCwwICsxLDgzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYXV0aC5oIEF1dGhlbnRpY2F0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19BVVRIX0gKKyNkZWZpbmUgREJVU19BVVRIX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0F1dGggREJ1c0F1dGg7CisKK3R5cGVkZWYgZW51bQoreworICBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQsCisgIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlksCisgIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQsCisgIERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1QsCisgIERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVECit9IERCdXNBdXRoU3RhdGU7CisKK0RCdXNBdXRoKiAgICAgX2RidXNfYXV0aF9zZXJ2ZXJfbmV3ICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICpndWlkKTsKK0RCdXNBdXRoKiAgICAgX2RidXNfYXV0aF9jbGllbnRfbmV3ICAgICAgICAgICh2b2lkKTsKK0RCdXNBdXRoKiAgICAgX2RidXNfYXV0aF9yZWYgICAgICAgICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAgICAgICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9zZXRfbWVjaGFuaXNtcyAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqKm1lY2hhbmlzbXMpOworREJ1c0F1dGhTdGF0ZSBfZGJ1c19hdXRoX2RvX3dvcmsgICAgICAgICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX2dldF9ieXRlc190b19zZW5kICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICoqc3RyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9ieXRlc19zZW50ICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3NlbnQpOwordm9pZCAgICAgICAgICBfZGJ1c19hdXRoX2dldF9idWZmZXIgICAgICAgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICoqYnVmZmVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9yZXR1cm5fYnVmZmVyICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkKTsKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqKnN0cik7Cit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfZGVsZXRlX3VudXNlZF9ieXRlcyAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfbmVlZHNfZW5jb2RpbmcgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfZW5jb2RlX2RhdGEgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICpwbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICAqZW5jb2RlZCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfbmVlZHNfZGVjb2RpbmcgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfZGVjb2RlX2RhdGEgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICplbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAgKnBsYWludGV4dCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfc2V0X2NyZWRlbnRpYWxzICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgICAgICpjcmVkZW50aWFscyk7CitEQnVzQ3JlZGVudGlhbHMqIF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfc2V0X2NvbnRleHQgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICpjb250ZXh0KTsKK2NvbnN0IGNoYXIqICAgX2RidXNfYXV0aF9nZXRfZ3VpZF9mcm9tX3NlcnZlcihEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKKwordm9pZCAgICAgICAgICBfZGJ1c19hdXRoX3NldF91bml4X2ZkX3Bvc3NpYmxlKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsIGRidXNfYm9vbF90IGIpOworZGJ1c19ib29sX3QgICBfZGJ1c19hdXRoX2dldF91bml4X2ZkX25lZ290aWF0ZWQoREJ1c0F1dGggICAgICAgICAgICAgKmF1dGgpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19BVVRIX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1idXMuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2I4MmViCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWJ1cy5jCkBAIC0wLDAgKzEsMTU4OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWJ1cy5jICBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgYnVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1idXMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQnVzIE1lc3NhZ2UgYnVzIEFQSXMKKyAqIEBpbmdyb3VwIERCdXMKKyAqIEBicmllZiBGdW5jdGlvbnMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgbWVzc2FnZSBidXMKKyAqCisgKiBkYnVzX2J1c19nZXQoKSBhbGxvd3MgYWxsIG1vZHVsZXMgYW5kIGxpYnJhcmllcyBpbiBhIGdpdmVuCisgKiBwcm9jZXNzIHRvIHNoYXJlIHRoZSBzYW1lIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cyBkYWVtb24gYnkgc3RvcmluZworICogdGhlIGNvbm5lY3Rpb24gZ2xvYmFsbHkuCisgKgorICogQWxsIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhcmUganVzdCBjb252ZW5pZW5jZSBmdW5jdGlvbnM7CisgKiBtb3N0IG9mIHRoZW0gaW52b2tlIG1ldGhvZHMgb24gdGhlIGJ1cyBkYWVtb24sIGJ5IHNlbmRpbmcgbWV0aG9kCisgKiBjYWxsIG1lc3NhZ2VzIHRvICNEQlVTX1NFUlZJQ0VfREJVUy4gVGhlc2UgY29udmVuaWVuY2UgZnVuY3Rpb25zCisgKiBvZnRlbiBtYWtlIGJsb2NraW5nIG1ldGhvZCBjYWxscy4gSWYgeW91IGRvbid0IHdhbnQgdG8gYmxvY2ssCisgKiB5b3UgY2FuIHNlbmQgdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2VzIG1hbnVhbGx5IGluIHRoZSBzYW1lIHdheQorICogeW91IHdvdWxkIGFueSBvdGhlciBtZXRob2QgY2FsbCBtZXNzYWdlLgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIHRoZSBvbmx5IG9uZSBpbiBsaWJkYnVzIHRoYXQncyBzcGVjaWZpYyB0bworICogY29tbXVuaWNhdGluZyB3aXRoIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24uIFRoZSByZXN0IG9mIHRoZSBBUEkgY2FuCisgKiBhbHNvIGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiBkaXJlY3RseS4KKyAqIAorICogQHRvZG8gcmlnaHQgbm93IHRoZSBkZWZhdWx0IGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBidXMgaXMgaGFyZGNvZGVkLAorICogc28gaWYgeW91IGNoYW5nZSBpdCBpbiB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlIHN1ZGRlbmx5IHlvdSBoYXZlIHRvCisgKiBzZXQgREJVU19TWVNURU1fQlVTX0FERFJFU1MgZW52IHZhcmlhYmxlLiAgTWlnaHQgYmUgbmljZSBpZiB0aGUKKyAqIGNsaWVudCBsaWIgc29tZWhvdyByZWFkIHRoZSBjb25maWcgZmlsZSwgb3IgaWYgdGhlIGJ1cyBvbiBzdGFydHVwCisgKiBzb21laG93IHdyb3RlIG91dCBpdHMgYWRkcmVzcyB0byBhIHdlbGwta25vd24gc3BvdCwgYnV0IG1pZ2h0IGFsc28KKyAqIG5vdCBiZSB3b3J0aCBpdC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQnVzSW50ZXJuYWxzIE1lc3NhZ2UgYnVzIEFQSXMgaW50ZXJuYWxzCisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIGZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBtZXNzYWdlIGJ1cworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBCbG9jayBvZiBtZXNzYWdlLWJ1cy1yZWxhdGVkIGRhdGEgd2UgYXR0YWNoIHRvIGVhY2gKKyAqICNEQnVzQ29ubmVjdGlvbiB1c2VkIHdpdGggdGhlc2UgY29udmVuaWVuY2UgZnVuY3Rpb25zLgorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247IC8qKjwgQ29ubmVjdGlvbiB3ZSdyZSBhc3NvY2lhdGVkIHdpdGggKi8KKyAgY2hhciAqdW5pcXVlX25hbWU7IC8qKjwgVW5pcXVlIG5hbWUgb2YgdGhpcyBjb25uZWN0aW9uICovCisKKyAgdW5zaWduZWQgaW50IGlzX3dlbGxfa25vd24gOiAxOyAvKio8IElzIG9uZSBvZiB0aGUgd2VsbC1rbm93biBjb25uZWN0aW9ucyBpbiBvdXIgZ2xvYmFsIGFycmF5ICovCit9IEJ1c0RhdGE7CisKKy8qKiBUaGUgc2xvdCB3ZSBoYXZlIHJlc2VydmVkIHRvIHN0b3JlIEJ1c0RhdGEuCisgKi8KK3N0YXRpYyBkYnVzX2ludDMyX3QgYnVzX2RhdGFfc2xvdCA9IC0xOworCisvKiogTnVtYmVyIG9mIGJ1cyB0eXBlcyAqLworI2RlZmluZSBOX0JVU19UWVBFUyAzCisKK3N0YXRpYyBEQnVzQ29ubmVjdGlvbiAqYnVzX2Nvbm5lY3Rpb25zW05fQlVTX1RZUEVTXTsKK3N0YXRpYyBjaGFyICpidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbTl9CVVNfVFlQRVNdID0geyBOVUxMLCBOVUxMLCBOVUxMIH07CisKK3N0YXRpYyBEQnVzQnVzVHlwZSBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU1RBUlRFUjsKKworc3RhdGljIGRidXNfYm9vbF90IGluaXRpYWxpemVkID0gRkFMU0U7CisKKy8qKgorICogTG9jayBmb3IgZ2xvYmFscyBpbiB0aGlzIGZpbGUKKyAqLworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChidXMpOworCisvKioKKyAqIEdsb2JhbCBsb2NrIGNvdmVyaW5nIGFsbCBCdXNEYXRhIG9uIGFueSBjb25uZWN0aW9uLiBUaGUgYmV0IGlzCisgKiB0aGF0IHNvbWUgbG9jayBjb250ZW50aW9uIGlzIGJldHRlciB0aGFuIG1vcmUgbWVtb3J5CisgKiBmb3IgYSBwZXItY29ubmVjdGlvbiBsb2NrLCBidXQgaXQncyB0b3VnaCB0byBpbWFnaW5lIGl0IG1hdHRlcmluZworICogZWl0aGVyIHdheS4KKyAqLworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChidXNfZGF0YXMpOworCitzdGF0aWMgdm9pZAorYWRkcmVzc2VzX3NodXRkb3duX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fQlVTX1RZUEVTKQorICAgIHsKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbnNbaV0gIT0gTlVMTCkKKyAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzX3NodXRkb3duKCkgY2FsbGVkIGJ1dCBjb25uZWN0aW9ucyB3ZXJlIHN0aWxsIGxpdmUuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhlIGFwcGxpY2F0aW9uIGRpZCBub3QgZHJvcCBhbGwgaXRzIHJlZmVyZW5jZXMgdG8gYnVzIGNvbm5lY3Rpb25zLlxuIik7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW2ldKTsKKyAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tpXSA9IE5VTEw7CisgICAgICArK2k7CisgICAgfQorCisgIGFjdGl2YXRpb25fYnVzX3R5cGUgPSBEQlVTX0JVU19TVEFSVEVSOworCisgIGluaXRpYWxpemVkID0gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X2Zyb21fZW52IChjaGFyICAgICAgICAgICAqKmNvbm5lY3Rpb25fcCwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICplbnZfdmFyKQoreworICBjb25zdCBjaGFyICpzOworICAKKyAgX2RidXNfYXNzZXJ0ICgqY29ubmVjdGlvbl9wID09IE5VTEwpOworICAKKyAgcyA9IF9kYnVzX2dldGVudiAoZW52X3Zhcik7CisgIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKKyAgICByZXR1cm4gVFJVRTsgLyogc3VjY2Vzc2Z1bGx5IGRpZG4ndCB1c2UgdGhlIGVudiB2YXIgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgICpjb25uZWN0aW9uX3AgPSBfZGJ1c19zdHJkdXAgKHMpOworICAgICAgcmV0dXJuICpjb25uZWN0aW9uX3AgIT0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5pdF9zZXNzaW9uX2FkZHJlc3MgKHZvaWQpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogRmlyc3QsIGxvb2sgaW4gdGhlIGVudmlyb25tZW50LiAgVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2Ugb24gCisgICAqIGZyZWVkZXNrdG9wLm9yZy9Vbml4IHN5c3RlbXMuICovCisgIGdldF9mcm9tX2VudiAoJmJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSwKKyAgICAgICAgICAgICAgICAgICAgICJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiKTsKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IHN1cHBvcnRlZDsKKyAgICAgIERCdXNTdHJpbmcgYWRkcjsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHN1cHBvcnRlZCA9IEZBTFNFOworICAgICAgLyogU28gaXQncyBub3QgaW4gdGhlIGVudmlyb25tZW50IC0gbGV0J3MgdHJ5IGEgcGxhdGZvcm0tc3BlY2lmaWMgbWV0aG9kLgorICAgICAgICogT24gTWFjT1MsIHRoaXMgaW52b2x2ZXMgYXNraW5nIGxhdW5jaGQuICBPbiBXaW5kb3dzIChub3Qgc3BlY2lmaWVkIHlldCkKKyAgICAgICAqIHdlIG1pZ2h0IGRvIGEgQ09NIGxvb2t1cC4KKyAgICAgICAqIElnbm9yZSBlcnJvcnMgLSBpZiB3ZSBmYWlsZWQsIGZhbGwgYmFjayB0byBhdXRvbGF1bmNoLiAqLworICAgICAgcmV0dmFsID0gX2RidXNfbG9va3VwX3Nlc3Npb25fYWRkcmVzcyAoJnN1cHBvcnRlZCwgJmFkZHIsICZlcnJvcik7CisgICAgICBpZiAoc3VwcG9ydGVkICYmIHJldHZhbCkKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9X2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZhZGRyLCAmYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3VwcG9ydGVkICYmICFyZXR2YWwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycm9yKSkKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEeW5hbWljIHNlc3Npb24gbG9va3VwIHN1cHBvcnRlZCBidXQgZmFpbGVkOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2FybiAoIkR5bmFtaWMgc2Vzc2lvbiBsb29rdXAgc3VwcG9ydGVkIGJ1dCBmYWlsZWQgc2lsZW50bHlcbiIpOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHIpOworICAgIH0KKyAgZWxzZQorICAgIHJldHZhbCA9IFRSVUU7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFRoZSBEQlVTX1NFU1NJT05fQlVTX0RFRkFVTFRfQUREUkVTUyBzaG91bGQgaGF2ZSByZWFsbHkgYmVlbiBuYW1lZAorICAgKiBEQlVTX1NFU1NJT05fQlVTX0ZBTExCQUNLX0FERFJFU1MuIAorICAgKi8KKyAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA9PSBOVUxMKQorICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA9CisgICAgICBfZGJ1c19zdHJkdXAgKERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTKTsKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpbml0X2Nvbm5lY3Rpb25zX3VubG9ja2VkICh2b2lkKQoreworICBpZiAoIWluaXRpYWxpemVkKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBpbnQgaTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IE5fQlVTX1RZUEVTKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25zW2ldID0gTlVMTDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgLyogRG9uJ3QgaW5pdCB0aGVzZSB0d2ljZSwgd2UgbWF5IHJ1biB0aGlzIGNvZGUgdHdpY2UgaWYKKyAgICAgICAqIGluaXRfY29ubmVjdGlvbnNfdW5sb2NrZWQoKSBmYWlscyBtaWR3YXkgdGhyb3VnaC4KKyAgICAgICAqIEluIHByYWN0aWNlLCBlYWNoIGJsb2NrIGJlbG93IHNob3VsZCBjb250YWluIG9ubHkgb25lCisgICAgICAgKiAicmV0dXJuIEZBTFNFIiBvciBydW5uaW5nIHRocm91Z2ggdHdpY2UgbWF5IG5vdAorICAgICAgICogd29yayByaWdodC4KKyAgICAgICAqLworICAgICAgCisgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaWxsaW5nIGluIHN5c3RlbSBidXMgYWRkcmVzcy4uLlxuIik7CisgICAgICAgICAgIAorICAgICAgICAgICBpZiAoIWdldF9mcm9tX2VudiAoJmJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1lTVEVNX0JVU19BRERSRVNTIikpCisgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAKKyAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0gPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgLyogVXNlIGRlZmF1bHQgc3lzdGVtIGJ1cyBhZGRyZXNzIGlmIG5vbmUgc2V0IGluIGVudmlyb25tZW50ICovCisgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dID0KKyAgICAgICAgICAgICBfZGJ1c19zdHJkdXAgKERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MpOworCisgICAgICAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSA9PSBOVUxMKQorICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgCisgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHVzZWQgZGVmYXVsdCBzeXN0ZW0gYnVzIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0pOworICAgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHVzZWQgZW52IHZhciBzeXN0ZW0gYnVzIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dKTsKKyAgICAgICAgICAKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaWxsaW5nIGluIHNlc3Npb24gYnVzIGFkZHJlc3MuLi5cbiIpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghaW5pdF9zZXNzaW9uX2FkZHJlc3MgKCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBcIiVzXCJcbiIsIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dIDogIm5vbmUgc2V0Iik7CisgICAgICAgIH0KKworICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZpbGxpbmcgaW4gYWN0aXZhdGlvbiBidXMgYWRkcmVzcy4uLlxuIik7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFnZXRfZnJvbV9lbnYgKCZidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQlVTX1NUQVJURVJfQUREUkVTUyIpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIFwiJXNcIlxuIiwgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0gOiAibm9uZSBzZXQiKTsKKyAgICAgICAgfQorCisKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHMgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1NUQVJURVJfQlVTX1RZUEUiKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKHMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkJ1cyBhY3RpdmF0aW9uIHR5cGUgd2FzIHNldCB0byBcIiVzXCJcbiIsIHMpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChzdHJjbXAgKHMsICJzeXN0ZW0iKSA9PSAwKQorICAgICAgICAgICAgICAgIGFjdGl2YXRpb25fYnVzX3R5cGUgPSBEQlVTX0JVU19TWVNURU07CisgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgInNlc3Npb24iKSA9PSAwKQorICAgICAgICAgICAgICAgIGFjdGl2YXRpb25fYnVzX3R5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBzZXNzaW9uIGJ1cyBpbnN0ZWFkIGlmIGF2YWlsYWJsZSAqLworICAgICAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdID0KKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJkdXAgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSk7CisgICAgICAgICAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogSWYgd2UgcmV0dXJuIEZBTFNFIHdlIGhhdmUgdG8gYmUgc3VyZSB0aGF0IHJlc3RhcnRpbmcKKyAgICAgICAqIHRoZSBhYm92ZSBjb2RlIHdpbGwgd29yayByaWdodAorICAgICAgICovCisgICAgICAKKyAgICAgIGlmICghX2RidXNfc2V0ZW52ICgiREJVU19BQ1RJVkFUSU9OX0FERFJFU1MiLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3NldGVudiAoIkRCVVNfQUNUSVZBVElPTl9CVVNfVFlQRSIsIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoYWRkcmVzc2VzX3NodXRkb3duX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGluaXRpYWxpemVkID0gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIGluaXRpYWxpemVkOworfQorCitzdGF0aWMgdm9pZAorYnVzX2RhdGFfZnJlZSAodm9pZCAqZGF0YSkKK3sKKyAgQnVzRGF0YSAqYmQgPSBkYXRhOworICAKKyAgaWYgKGJkLT5pc193ZWxsX2tub3duKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgX0RCVVNfTE9DSyAoYnVzKTsKKyAgICAgIC8qIFdlIG1heSBiZSBzdG9yZWQgaW4gbW9yZSB0aGFuIG9uZSBzbG90ICovCisgICAgICAvKiBUaGlzIHNob3VsZCBub3cgYmUgaW1wb3NzaWJsZSAtIHRoZXNlIHNsb3RzIGFyZSBzdXBwb3NlZCB0bworICAgICAgICogYmUgY2xlYXJlZCBvbiBkaXNjb25uZWN0LCBzbyBzaG91bGQgbm90IG5lZWQgdG8gYmUgY2xlYXJlZCBvbgorICAgICAgICogZmluYWxpemUKKyAgICAgICAqLworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IE5fQlVTX1RZUEVTKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uc1tpXSA9PSBiZC0+Y29ubmVjdGlvbikKKyAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc1tpXSA9IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICBfREJVU19VTkxPQ0sgKGJ1cyk7CisgICAgfQorICAKKyAgZGJ1c19mcmVlIChiZC0+dW5pcXVlX25hbWUpOworICBkYnVzX2ZyZWUgKGJkKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZidXNfZGF0YV9zbG90KTsKK30KKworc3RhdGljIEJ1c0RhdGEqCitlbnN1cmVfYnVzX2RhdGEgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNEYXRhICpiZDsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZidXNfZGF0YV9zbG90KSkKKyAgICByZXR1cm4gTlVMTDsKKworICBiZCA9IGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSAoY29ubmVjdGlvbiwgYnVzX2RhdGFfc2xvdCk7CisgIGlmIChiZCA9PSBOVUxMKQorICAgIHsgICAgICAKKyAgICAgIGJkID0gZGJ1c19uZXcwIChCdXNEYXRhLCAxKTsKKyAgICAgIGlmIChiZCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgYmQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSAoY29ubmVjdGlvbiwgYnVzX2RhdGFfc2xvdCwgYmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2RhdGFfZnJlZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGJkKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZidXNfZGF0YV9zbG90KTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAvKiBEYXRhIHNsb3QgcmVmY291bnQgbm93IGhlbGQgYnkgdGhlIEJ1c0RhdGEgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZidXNfZGF0YV9zbG90KTsKKyAgICB9CisKKyAgcmV0dXJuIGJkOworfQorCisvKioKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRvIHNlZSBpZiB0aGlzCisgKiBpcyBhIHNoYXJlZCBjb25uZWN0aW9uIG93bmVkIGJ5IHRoZSBidXMgYW5kIGlmIGl0IGlzIHVucmVmIGl0LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGEgY29ubmVjdGlvbiB0aGF0IGhhcyBiZWVuIGRpc2Nvbm5lY3RlZC4KKyAqLwordm9pZAorX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBpbnQgaTsKKyAgCisgIF9EQlVTX0xPQ0sgKGJ1cyk7CisKKyAgLyogV2UgYXJlIGV4cGVjdGluZyB0byBoYXZlIHRoZSBjb25uZWN0aW9uIHNhdmVkIGluIG9ubHkgb25lIG9mIHRoZXNlCisgICAqIHNsb3RzLCBidXQgc29tZW9uZSBjb3VsZCBpbiBhIHBhdGhvbG9naWNhbCBjYXNlIHNldCBzeXN0ZW0gYW5kIHNlc3Npb24KKyAgICogYnVzIHRvIHRoZSBzYW1lIGJ1cyBvciBzb21ldGhpbmcuIE9yIHNldCBvbmUgb2YgdGhlbSB0byB0aGUgc3RhcnRlcgorICAgKiBidXMgd2l0aG91dCBzZXR0aW5nIHRoZSBzdGFydGVyIGJ1cyB0eXBlIGluIHRoZSBlbnYgdmFyaWFibGUuCisgICAqIFNvIHdlIGRvbid0IGJyZWFrIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIG1hdGNoLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5fQlVTX1RZUEVTOyArK2kpCisgICAgeworICAgICAgaWYgKGJ1c19jb25uZWN0aW9uc1tpXSA9PSBjb25uZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25zW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBfREJVU19VTkxPQ0sgKGJ1cyk7Cit9CisKK3N0YXRpYyBEQnVzQ29ubmVjdGlvbiAqCitpbnRlcm5hbF9idXNfZ2V0IChEQnVzQnVzVHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBwcml2YXRlLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICphZGRyZXNzOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgQnVzRGF0YSAqYmQ7CisgIERCdXNCdXNUeXBlIGFkZHJlc3NfdHlwZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHR5cGUgPj0gMCAmJiB0eXBlIDwgTl9CVVNfVFlQRVMsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIE5VTEwpOworCisgIF9EQlVTX0xPQ0sgKGJ1cyk7CisKKyAgaWYgKCFpbml0X2Nvbm5lY3Rpb25zX3VubG9ja2VkICgpKQorICAgIHsKKyAgICAgIF9EQlVTX1VOTE9DSyAoYnVzKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgYWN0aXZhdGlvbiBhZGRyZXNzIGV2ZW4gaWYgdGhlCisgICAqIGFjdGl2YXRpbmcgYnVzIGlzIHRoZSBzZXNzaW9uIG9yIHN5c3RlbSBidXMsCisgICAqIHBlciB0aGUgc3BlYy4KKyAgICovCisgIGFkZHJlc3NfdHlwZSA9IHR5cGU7CisgIAorICAvKiBVc2UgdGhlIHJlYWwgdHlwZSBvZiB0aGUgYWN0aXZhdGlvbiBidXMgZm9yIGdldHRpbmcgaXRzCisgICAqIGNvbm5lY3Rpb24sIGJ1dCBvbmx5IGlmIHRoZSByZWFsIHR5cGUncyBhZGRyZXNzIGlzIGF2YWlsYWJsZS4gKElmCisgICAqIHRoZSBhY3RpdmF0aW5nIGJ1cyBpc24ndCBhIHdlbGwta25vd24gYnVzIHRoZW4KKyAgICogYWN0aXZhdGlvbl9idXNfdHlwZSA9PSBEQlVTX0JVU19TVEFSVEVSKQorICAgKi8KKyAgaWYgKHR5cGUgPT0gREJVU19CVVNfU1RBUlRFUiAmJgorICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW2FjdGl2YXRpb25fYnVzX3R5cGVdICE9IE5VTEwpCisgICAgdHlwZSA9IGFjdGl2YXRpb25fYnVzX3R5cGU7CisgIAorICBpZiAoIXByaXZhdGUgJiYgYnVzX2Nvbm5lY3Rpb25zW3R5cGVdICE9IE5VTEwpCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGJ1c19jb25uZWN0aW9uc1t0eXBlXTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICAgICAgCisgICAgICBfREJVU19VTkxPQ0sgKGJ1cyk7CisgICAgICByZXR1cm4gY29ubmVjdGlvbjsKKyAgICB9CisKKyAgYWRkcmVzcyA9IGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1thZGRyZXNzX3R5cGVdOworICBpZiAoYWRkcmVzcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2UgYnVzICh0cnkgJ21hbiBkYnVzLWxhdW5jaCcgYW5kICdtYW4gZGJ1cy1kYWVtb24nIGZvciBoZWxwKSIpOworICAgICAgX0RCVVNfVU5MT0NLIChidXMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChwcml2YXRlKQorICAgIGNvbm5lY3Rpb24gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChhZGRyZXNzLCBlcnJvcik7CisgIGVsc2UKKyAgICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKGFkZHJlc3MsIGVycm9yKTsKKyAgCisgIGlmICghY29ubmVjdGlvbikKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfREJVU19VTkxPQ0sgKGJ1cyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2J1c19yZWdpc3RlciAoY29ubmVjdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIF9EQlVTX1VOTE9DSyAoYnVzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIXByaXZhdGUpCisgICAgeworICAgICAgLyogc3RvcmUgYSB3ZWFrIHJlZiB0byB0aGUgY29ubmVjdGlvbiAoZGJ1cy1jb25uZWN0aW9uLmMgaXMKKyAgICAgICAqIHN1cHBvc2VkIHRvIGhhdmUgYSBzdHJvbmcgcmVmIHRoYXQgaXQgZHJvcHMgb24gZGlzY29ubmVjdCwKKyAgICAgICAqIHNpbmNlIHRoaXMgaXMgYSBzaGFyZWQgY29ubmVjdGlvbikKKyAgICAgICAqLworICAgICAgYnVzX2Nvbm5lY3Rpb25zW3R5cGVdID0gY29ubmVjdGlvbjsKKyAgICB9CisKKyAgLyogQnkgZGVmYXVsdCB3ZSdyZSBib3VuZCB0byB0aGUgbGlmZWN5Y2xlIG9mCisgICAqIHRoZSBtZXNzYWdlIGJ1cy4KKyAgICovCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0IChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgCisgIF9EQlVTX0xPQ0sgKGJ1c19kYXRhcyk7CisgIGJkID0gZW5zdXJlX2J1c19kYXRhIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChiZCAhPSBOVUxMKTsgLyogaXQgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyLCBzbyBPT00gbm90IHBvc3NpYmxlICovCisgIGJkLT5pc193ZWxsX2tub3duID0gVFJVRTsKKyAgX0RCVVNfVU5MT0NLIChidXNfZGF0YXMpOworCisgIAorICBfREJVU19VTkxPQ0sgKGJ1cyk7CisKKyAgLyogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsZXIgKi8KKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9CisKKworLyoqIEB9ICovIC8qIGVuZCBvZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGRvY3MgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQnVzCisgKiBAeworICovCisKKy8qKgorICogQ29ubmVjdHMgdG8gYSBidXMgZGFlbW9uIGFuZCByZWdpc3RlcnMgdGhlIGNsaWVudCB3aXRoIGl0LiAgSWYgYQorICogY29ubmVjdGlvbiB0byB0aGUgYnVzIGFscmVhZHkgZXhpc3RzLCB0aGVuIHRoYXQgY29ubmVjdGlvbiBpcworICogcmV0dXJuZWQuICBUaGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gb3ducyBhIHJlZmVyZW5jZSB0byB0aGUgYnVzLgorICoKKyAqIFRoZSBjYWxsZXIgbWF5IE5PVCBjYWxsIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIG9uIHRoaXMgY29ubmVjdGlvbjsKKyAqIHNlZSBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGFuZCBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSBmb3IgZGV0YWlscworICogb24gdGhhdC4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIG9idGFpbnMgYSBuZXcgY29ubmVjdGlvbiBvYmplY3QgbmV2ZXIgYmVmb3JlCisgKiByZXR1cm5lZCBmcm9tIGRidXNfYnVzX2dldCgpLCBpdCB3aWxsIGNhbGwKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCksIHNvIHRoZSBhcHBsaWNhdGlvbgorICogd2lsbCBleGl0IGlmIHRoZSBjb25uZWN0aW9uIGNsb3Nlcy4gWW91IGNhbiB1bmRvIHRoaXMKKyAqIGJ5IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QoKSB5b3Vyc2VsZgorICogYWZ0ZXIgeW91IGdldCB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBkYnVzX2J1c19nZXQoKSBjYWxscyBkYnVzX2J1c19yZWdpc3RlcigpIGZvciB5b3UuCisgKiAKKyAqIElmIHJldHVybmluZyBhIG5ld2x5LWNyZWF0ZWQgY29ubmVjdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrCisgKiB1bnRpbCBhdXRoZW50aWNhdGlvbiBhbmQgYnVzIHJlZ2lzdHJhdGlvbiBhcmUgY29tcGxldGUuCisgKiAKKyAqIEBwYXJhbSB0eXBlIGJ1cyB0eXBlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBhICNEQnVzQ29ubmVjdGlvbiB3aXRoIG5ldyByZWYKKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorZGJ1c19idXNfZ2V0IChEQnVzQnVzVHlwZSAgdHlwZSwKKwkgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisgIHJldHVybiBpbnRlcm5hbF9idXNfZ2V0ICh0eXBlLCBGQUxTRSwgZXJyb3IpOworfQorCisvKioKKyAqIENvbm5lY3RzIHRvIGEgYnVzIGRhZW1vbiBhbmQgcmVnaXN0ZXJzIHRoZSBjbGllbnQgd2l0aCBpdCBhcyB3aXRoCisgKiBkYnVzX2J1c19yZWdpc3RlcigpLiAgVW5saWtlIGRidXNfYnVzX2dldCgpLCBhbHdheXMgY3JlYXRlcyBhIG5ldworICogY29ubmVjdGlvbi4gVGhpcyBjb25uZWN0aW9uIHdpbGwgbm90IGJlIHNhdmVkIG9yIHJlY3ljbGVkIGJ5CisgKiBsaWJkYnVzLiBDYWxsZXIgb3ducyBhIHJlZmVyZW5jZSB0byB0aGUgYnVzIGFuZCBtdXN0IGVpdGhlciBjbG9zZQorICogaXQgb3Iga25vdyBpdCB0byBiZSBjbG9zZWQgcHJpb3IgdG8gcmVsZWFzaW5nIHRoaXMgcmVmZXJlbmNlLgorICoKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkgZm9yIG1vcmUgZGV0YWlscyBvbiB3aGVuIHRvCisgKiBjbG9zZSBhbmQgdW5yZWYgdGhpcyBjb25uZWN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCkgb24gdGhlIG5ldyBjb25uZWN0aW9uLCBzbyB0aGUgYXBwbGljYXRpb24KKyAqIHdpbGwgZXhpdCBpZiB0aGUgY29ubmVjdGlvbiBjbG9zZXMuIFlvdSBjYW4gdW5kbyB0aGlzCisgKiBieSBjYWxsaW5nIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCkgeW91cnNlbGYKKyAqIGFmdGVyIHlvdSBnZXQgdGhlIGNvbm5lY3Rpb24uCisgKgorICogZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSBjYWxscyBkYnVzX2J1c19yZWdpc3RlcigpIGZvciB5b3UuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGF1dGhlbnRpY2F0aW9uIGFuZCBidXMgcmVnaXN0cmF0aW9uCisgKiBhcmUgY29tcGxldGUuCisgKgorICogQHBhcmFtIHR5cGUgYnVzIHR5cGUKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgREJ1c0Nvbm5lY3Rpb24gd2l0aCBuZXcgcmVmCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK2RidXNfYnVzX2dldF9wcml2YXRlIChEQnVzQnVzVHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisgIHJldHVybiBpbnRlcm5hbF9idXNfZ2V0ICh0eXBlLCBUUlVFLCBlcnJvcik7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBidXMuIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QKKyAqIHRoaW5nIGFuIGFwcGxpY2F0aW9uIGRvZXMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBtZXNzYWdlIGJ1cy4KKyAqIElmIHJlZ2lzdHJhdGlvbiBzdWNjZWVkcywgdGhlIHVuaXF1ZSBuYW1lIHdpbGwgYmUgc2V0LAorICogYW5kIGNhbiBiZSBvYnRhaW5lZCB1c2luZyBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUoKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgcmVnaXN0cmF0aW9uIGlzIGNvbXBsZXRlLgorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGhhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnVzCisgKiAoZGV0ZXJtaW5lZCBieSBjaGVja2luZyB3aGV0aGVyIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSgpCisgKiByZXR1cm5zIGEgbm9uLSNOVUxMIHZhbHVlKSwgdGhlbiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4KKyAqCisgKiBJZiB5b3UgdXNlIGRidXNfYnVzX2dldCgpIG9yIGRidXNfYnVzX2dldF9wcml2YXRlKCkgdGhpcworICogZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIHlvdS4KKyAqIAorICogQG5vdGUgSnVzdCB1c2UgZGJ1c19idXNfZ2V0KCkgb3IgZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSBpbnN0ZWFkIG9mCisgKiBkYnVzX2J1c19yZWdpc3RlcigpIGFuZCBzYXZlIHlvdXJzZWxmIHNvbWUgcGFpbi4gVXNpbmcKKyAqIGRidXNfYnVzX3JlZ2lzdGVyKCkgbWFudWFsbHkgaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgeW91cgorICogb3duIGN1c3RvbSBtZXNzYWdlIGJ1cyBub3QgZm91bmQgaW4gI0RCdXNCdXNUeXBlLgorICoKKyAqIElmIHlvdSBvcGVuIGEgYnVzIGNvbm5lY3Rpb24gd2l0aCBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkgeW91IHdpbGwgaGF2ZSB0byBkYnVzX2J1c19yZWdpc3RlcigpCisgKiB5b3Vyc2VsZiwgb3IgbWFrZSB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0cmF0aW9uIG1ldGhvZCBjYWxscworICogeW91cnNlbGYuIElmIHlvdSBzZW5kIHRoZSBtZXRob2QgY2FsbHMgeW91cnNlbGYsIGNhbGwKKyAqIGRidXNfYnVzX3NldF91bmlxdWVfbmFtZSgpIHdpdGggdGhlIHVuaXF1ZSBidXMgbmFtZSB5b3UgZ2V0IGZyb20KKyAqIHRoZSBidXMuCisgKgorICogRm9yIHNoYXJlZCBjb25uZWN0aW9ucyAoY3JlYXRlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9vcGVuKCkpIGluIGEKKyAqIG11bHRpdGhyZWFkZWQgYXBwbGljYXRpb24sIHlvdSBjYW4ndCByZWFsbHkgbWFrZSB0aGUgcmVnaXN0cmF0aW9uCisgKiBjYWxscyB5b3Vyc2VsZiwgYmVjYXVzZSB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyIHNvbWUgb3RoZXIgdGhyZWFkIGlzCisgKiBhbHNvIHJlZ2lzdGVyaW5nLCBhbmQgdGhlIGJ1cyB3aWxsIGtpY2sgeW91IG9mZiBpZiB5b3Ugc2VuZCB0d28KKyAqIHJlZ2lzdHJhdGlvbiBtZXNzYWdlcy4KKyAqCisgKiBJZiB5b3UgdXNlIGRidXNfYnVzX3JlZ2lzdGVyKCkgaG93ZXZlciwgdGhlcmUgaXMgYSBsb2NrIHRoYXQKKyAqIGtlZXBzIGJvdGggYXBwcyBmcm9tIHJlZ2lzdGVyaW5nIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogVGhlIHJ1bGUgaW4gYSBtdWx0aXRocmVhZGVkIGFwcCwgdGhlbiwgaXMgdGhhdCBkYnVzX2J1c19yZWdpc3RlcigpCisgKiBtdXN0IGJlIHVzZWQgdG8gcmVnaXN0ZXIsIG9yIHlvdSBuZWVkIHRvIGhhdmUgeW91ciBvd24gbG9ja3MgdGhhdAorICogYWxsIHRocmVhZHMgaW4gdGhlIGFwcCB3aWxsIHJlc3BlY3QuCisgKgorICogSW4gYSBzaW5nbGUtdGhyZWFkZWQgYXBwbGljYXRpb24geW91IGNhbiByZWdpc3RlciBieSBoYW5kIGluc3RlYWQKKyAqIG9mIHVzaW5nIGRidXNfYnVzX3JlZ2lzdGVyKCksIGFzIGxvbmcgYXMgeW91IGNoZWNrCisgKiBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUoKSB0byBzZWUgaWYgYSB1bmlxdWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuCisgKiBzdG9yZWQgYnkgYW5vdGhlciB0aHJlYWQgYmVmb3JlIHlvdSBzZW5kIHRoZSByZWdpc3RyYXRpb24gbWVzc2FnZXMuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZXJyb3IgcGxhY2UgdG8gc3RvcmUgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2J1c19yZWdpc3RlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwgKnJlcGx5OworICBjaGFyICpuYW1lOworICBCdXNEYXRhICpiZDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIF9EQlVTX0xPQ0sgKGJ1c19kYXRhcyk7CisKKyAgYmQgPSBlbnN1cmVfYnVzX2RhdGEgKGNvbm5lY3Rpb24pOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfREJVU19VTkxPQ0sgKGJ1c19kYXRhcyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChiZC0+dW5pcXVlX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiSWdub3JpbmcgYXR0ZW1wdCB0byByZWdpc3RlciB0aGUgc2FtZSBEQnVzQ29ubmVjdGlvbiAlcyB3aXRoIHRoZSBtZXNzYWdlIGJ1cyBhIHNlY29uZCB0aW1lLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGJkLT51bmlxdWVfbmFtZSk7CisgICAgICBfREJVU19VTkxPQ0sgKGJ1c19kYXRhcyk7CisKKyAgICAgIC8qIFN1Y2Nlc3MhICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsgCisKKyAgaWYgKCFtZXNzYWdlKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKworICAgICAgX0RCVVNfVU5MT0NLIChidXNfZGF0YXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLCBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICBlbHNlIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgZ290byBvdXQ7CisgIGVsc2UgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGJkLT51bmlxdWVfbmFtZSA9IF9kYnVzX3N0cmR1cCAobmFtZSk7CisgIGlmIChiZC0+dW5pcXVlX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBpZiAoIXJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgX0RCVVNfVU5MT0NLIChidXNfZGF0YXMpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKioKKyAqIFNldHMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uLCBhcyBhc3NpZ25lZCBieSB0aGUgbWVzc2FnZQorICogYnVzLiAgQ2FuIG9ubHkgYmUgdXNlZCBpZiB5b3UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgbWFudWFsbHkKKyAqIChpLmUuIGlmIHlvdSBkaWQgbm90IGNhbGwgZGJ1c19idXNfcmVnaXN0ZXIoKSkuIENhbiBvbmx5IGJlIGNhbGxlZAorICogb25jZSBwZXIgY29ubmVjdGlvbi4gIEFmdGVyIHRoZSB1bmlxdWUgbmFtZSBpcyBzZXQsIHlvdSBjYW4gZ2V0IGl0CisgKiB3aXRoIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSgpLgorICoKKyAqIFRoZSBvbmx5IHJlYXNvbiB0byB1c2UgdGhpcyBmdW5jdGlvbiBpcyB0byByZS1pbXBsZW1lbnQgdGhlCisgKiBlcXVpdmFsZW50IG9mIGRidXNfYnVzX3JlZ2lzdGVyKCkgeW91cnNlbGYuIE9uZSAocHJvYmFibHkgdW51c3VhbCkKKyAqIHJlYXNvbiB0byBkbyB0aGF0IG1pZ2h0IGJlIHRvIGRvIHRoZSBidXMgcmVnaXN0cmF0aW9uIGNhbGwKKyAqIGFzeW5jaHJvbm91c2x5IGluc3RlYWQgb2Ygc3luY2hyb25vdXNseS4KKyAqCisgKiBAbm90ZSBKdXN0IHVzZSBkYnVzX2J1c19nZXQoKSBvciBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpLCBvciB3b3JzdAorICogY2FzZSBkYnVzX2J1c19yZWdpc3RlcigpLCBpbnN0ZWFkIG9mIG1lc3Npbmcgd2l0aCB0aGlzCisgKiBmdW5jdGlvbi4gVGhlcmUncyByZWFsbHkgbm8gcG9pbnQgY3JlYXRpbmcgcGFpbiBmb3IgeW91cnNlbGYgYnkKKyAqIGRvaW5nIHRoaW5ncyBtYW51YWxseS4KKyAqCisgKiBJdCdzIGhhcmQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gc2FmZWx5IG9uIHNoYXJlZCBjb25uZWN0aW9ucworICogKGNyZWF0ZWQgYnkgZGJ1c19jb25uZWN0aW9uX29wZW4oKSkgaW4gYSBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9uLAorICogYmVjYXVzZSBvbmx5IG9uZSByZWdpc3RyYXRpb24gYXR0ZW1wdCBjYW4gYmUgc2VudCB0byB0aGUgYnVzLiBJZgorICogdHdvIHRocmVhZHMgYXJlIGJvdGggc2VuZGluZyB0aGUgcmVnaXN0cmF0aW9uIG1lc3NhZ2UsIHRoZXJlIGlzIG5vCisgKiBtZWNoYW5pc20gaW4gbGliZGJ1cyBpdHNlbGYgdG8gYXZvaWQgc2VuZGluZyBpdCB0d2ljZS4KKyAqCisgKiBUaHVzLCB5b3UgbmVlZCBhIHdheSB0byBjb29yZGluYXRlIHdoaWNoIHRocmVhZCBzZW5kcyB0aGUKKyAqIHJlZ2lzdHJhdGlvbiBhdHRlbXB0OyB3aGljaCBhbHNvIG1lYW5zIHlvdSBrbm93IHdoaWNoIHRocmVhZAorICogd2lsbCBjYWxsIGRidXNfYnVzX3NldF91bmlxdWVfbmFtZSgpLiBJZiB5b3UgZG9uJ3Qga25vdworICogYWJvdXQgYWxsIHRocmVhZHMgaW4gdGhlIGFwcCAoZm9yIGV4YW1wbGUsIGlmIHNvbWUgbGlicmFyaWVzCisgKiB5b3UncmUgdXNpbmcgbWlnaHQgc3RhcnQgbGliZGJ1cy11c2luZyB0aHJlYWRzKSwgdGhlbiB5b3UKKyAqIG5lZWQgdG8gYXZvaWQgdXNpbmcgdGhpcyBmdW5jdGlvbiBvbiBzaGFyZWQgY29ubmVjdGlvbnMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB1bmlxdWVfbmFtZSB0aGUgdW5pcXVlIG5hbWUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnVuaXF1ZV9uYW1lKQoreworICBCdXNEYXRhICpiZDsKKyAgZGJ1c19ib29sX3Qgc3VjY2VzcyA9IEZBTFNFOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodW5pcXVlX25hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9EQlVTX0xPQ0sgKGJ1c19kYXRhcyk7CisgIAorICBiZCA9IGVuc3VyZV9idXNfZGF0YSAoY29ubmVjdGlvbik7CisgIGlmIChiZCA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoYmQtPnVuaXF1ZV9uYW1lID09IE5VTEwpOworICAKKyAgYmQtPnVuaXF1ZV9uYW1lID0gX2RidXNfc3RyZHVwICh1bmlxdWVfbmFtZSk7CisgIHN1Y2Nlc3MgPSBiZC0+dW5pcXVlX25hbWUgIT0gTlVMTDsKKworb3V0OgorICBfREJVU19VTkxPQ0sgKGJ1c19kYXRhcyk7CisgIAorICByZXR1cm4gc3VjY2VzczsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiBhcyBhc3NpZ25lZCBieSB0aGUgbWVzc2FnZQorICogYnVzLiBPbmx5IHBvc3NpYmxlIGFmdGVyIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aAorICogdGhlIG1lc3NhZ2UgYnVzLiBBbGwgY29ubmVjdGlvbnMgcmV0dXJuZWQgYnkgZGJ1c19idXNfZ2V0KCkgb3IKKyAqIGRidXNfYnVzX2dldF9wcml2YXRlKCkgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLgorICoKKyAqIFRoZSBuYW1lIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgZnJlZWQsIGFuZAorICogc2hvdWxkIG5vdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIE90aGVyIHRoYW4gZGJ1c19idXNfZ2V0KCksIHRoZXJlIGFyZSB0d28gd2F5cyB0byBzZXQgdGhlIHVuaXF1ZQorICogbmFtZTsgb25lIGlzIGRidXNfYnVzX3JlZ2lzdGVyKCksIHRoZSBvdGhlciBpcworICogZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lKCkuICBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgKiBkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUoKSBpZiB5b3UgcmVnaXN0ZXIgYnkgaGFuZCBpbnN0ZWFkIG9mIHVzaW5nCisgKiBkYnVzX2J1c19yZWdpc3RlcigpLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNEYXRhICpiZDsKKyAgY29uc3QgY2hhciAqdW5pcXVlX25hbWUgPSBOVUxMOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBfREJVU19MT0NLIChidXNfZGF0YXMpOworICAKKyAgYmQgPSBlbnN1cmVfYnVzX2RhdGEgKGNvbm5lY3Rpb24pOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB1bmlxdWVfbmFtZSA9IGJkLT51bmlxdWVfbmFtZTsKKworb3V0OgorICBfREJVU19VTkxPQ0sgKGJ1c19kYXRhcyk7CisKKyAgcmV0dXJuIHVuaXF1ZV9uYW1lOworfQorCisvKioKKyAqIEFza3MgdGhlIGJ1cyB0byByZXR1cm4gdGhlIFVJRCB0aGUgbmFtZWQgY29ubmVjdGlvbiBhdXRoZW50aWNhdGVkCisgKiBhcywgaWYgYW55LiAgT25seSB3b3JrcyBvbiBVTklYOyBvbmx5IHdvcmtzIGZvciBjb25uZWN0aW9ucyBvbiB0aGUKKyAqIHNhbWUgbWFjaGluZSBhcyB0aGUgYnVzLiBJZiB5b3UgYXJlIG5vdCBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIHRoZQorICogYnVzLCB0aGVuIGNhbGxpbmcgdGhpcyBpcyBwcm9iYWJseSBhIGJhZCBpZGVhLCBzaW5jZSB0aGUgVUlEIHdpbGwKKyAqIG1lYW4gbGl0dGxlIHRvIHlvdXIgYXBwbGljYXRpb24uCisgKgorICogRm9yIHRoZSBzeXN0ZW0gbWVzc2FnZSBidXMgeW91J3JlIGd1YXJhbnRlZWQgdG8gYmUgb24gdGhlIHNhbWUKKyAqIG1hY2hpbmUgc2luY2UgaXQgb25seSBsaXN0ZW5zIG9uIGEgVU5JWCBkb21haW4gc29ja2V0IChhdCBsZWFzdCwKKyAqIGFzIHNoaXBwZWQgYnkgZGVmYXVsdCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIGZvciBjb25uZWN0aW9ucyB0aGF0IGF1dGhlbnRpY2F0ZWQgYXMKKyAqIGEgVU5JWCB1c2VyLCByaWdodCBub3cgdGhhdCBpbmNsdWRlcyBhbGwgYnVzIGNvbm5lY3Rpb25zLCBidXQKKyAqIGl0J3MgdmVyeSBwb3NzaWJsZSB0byBoYXZlIGNvbm5lY3Rpb25zIHdpdGggbm8gYXNzb2NpYXRlZCBVSUQuCisgKiBTbyBjaGVjayBmb3IgZXJyb3JzIGFuZCBkbyBzb21ldGhpbmcgc2Vuc2libGUgaWYgdGhleSBoYXBwZW4uCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIG9uIFdpbmRvd3MuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbmFtZSBhIG5hbWUgb3duZWQgYnkgdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSB0aGUgZXJyb3IKKyAqIEByZXR1cm5zIHRoZSB1bml4IHVzZXIgaWQsIG9yICgodW5zaWduZWQpLTEpIGlmIGVycm9yIGlzIHNldAorICovIAordW5zaWduZWQgbG9uZworZGJ1c19idXNfZ2V0X3VuaXhfdXNlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgZGJ1c191aW50MzJfdCB1aWQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBEQlVTX1VJRF9VTlNFVCk7CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfQorIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKwkJCQkgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisJCQkJIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworICAgIH0gIAorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfQorICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gREJVU19VSURfVU5TRVQ7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSB1aWQ7Cit9CisKKy8qKgorICogQXNrcyB0aGUgYnVzIHRvIHJldHVybiBpdHMgZ2xvYmFsbHkgdW5pcXVlIElELCBhcyBkZXNjcmliZWQgaW4gdGhlCisgKiBELUJ1cyBzcGVjaWZpY2F0aW9uLiBGb3IgdGhlIHNlc3Npb24gYnVzLCB0aGlzIGlzIHVzZWZ1bCBhcyBhIHdheQorICogdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCB1c2VyIHNlc3Npb24uIEZvciB0aGUgc3lzdGVtIGJ1cywKKyAqIHByb2JhYmx5IHRoZSBidXMgSUQgaXMgbm90IHVzZWZ1bDsgaW5zdGVhZCwgdXNlIHRoZSBtYWNoaW5lIElECisgKiBzaW5jZSBpdCdzIGFjY2Vzc2libGUgd2l0aG91dCBuZWNlc3NhcmlseSBjb25uZWN0aW5nIHRvIHRoZSBidXMgYW5kCisgKiBtYXkgYmUgcGVyc2lzdGVudCBiZXlvbmQgYSBzaW5nbGUgYnVzIGluc3RhbmNlIChhY3Jvc3MgcmVib290cyBmb3IKKyAqIGV4YW1wbGUpLiBTZWUgZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCgpLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIGFuIElEIGZvciBlYWNoIGJ1cyBhbmQgYW4gSUQgZm9yIGVhY2ggbWFjaGluZSwgdGhlcmUgaXMKKyAqIGFuIElEIGZvciBlYWNoIGFkZHJlc3MgdGhhdCB0aGUgYnVzIGlzIGxpc3RlbmluZyBvbjsgdGhhdCBjYW4KKyAqIGJlIHJldHJpZXZlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9nZXRfc2VydmVyX2lkKCksIHRob3VnaCBpdCBpcworICogcHJvYmFibHkgbm90IHZlcnkgdXNlZnVsLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlcnJvcgorICogQHJldHVybnMgdGhlIGJ1cyBJRCBvciAjTlVMTCBpZiBlcnJvciBpcyBzZXQKKyAqLyAKK2NoYXIqCitkYnVzX2J1c19nZXRfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGNoYXIgKmlkOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0SWQiKTsKKyAgCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbWVzc2FnZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIAorICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9ICAKKworICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChlcnJvciwgcmVwbHkpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHZfU1RSSU5HID0gTlVMTDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZCA9IF9kYnVzX3N0cmR1cCAodl9TVFJJTkcpOyAvKiBtYXkgYmUgTlVMTCAqLworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgaWYgKGlkID09IE5VTEwpCisgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIC8qIEZJWE1FIGl0IG1pZ2h0IGJlIG5pY2UgdG8gY2FjaGUgdGhlIElEIGxvY2FsbHkgKi8KKyAgCisgIHJldHVybiBpZDsKK30KKworLyoqCisgKiBBc2tzIHRoZSBidXMgdG8gYXNzaWduIHRoZSBnaXZlbiBuYW1lIHRvIHRoaXMgY29ubmVjdGlvbiBieSBpbnZva2luZworICogdGhlIFJlcXVlc3ROYW1lIG1ldGhvZCBvbiB0aGUgYnVzLiBUaGlzIG1ldGhvZCBpcyBmdWxseSBkb2N1bWVudGVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4gRm9yIHF1aWNrIHJlZmVyZW5jZSwgdGhlIGZsYWdzIGFuZAorICogcmVzdWx0IGNvZGVzIGFyZSBkaXNjdXNzZWQgaGVyZSwgYnV0IHRoZSBzcGVjaWZpY2F0aW9uIGlzIHRoZQorICogY2Fub25pY2FsIHZlcnNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBGaXJzdCB5b3Ugc2hvdWxkIGtub3cgdGhhdCBmb3IgZWFjaCBidXMgbmFtZSwgdGhlIGJ1cyBzdG9yZXMKKyAqIGEgcXVldWUgb2YgY29ubmVjdGlvbnMgdGhhdCB3b3VsZCBsaWtlIHRvIG93biBpdC4gT25seQorICogb25lIG93bnMgaXQgYXQgYSB0aW1lIC0gY2FsbGVkIHRoZSBwcmltYXJ5IG93bmVyLiBJZiB0aGUgcHJpbWFyeQorICogb3duZXIgcmVsZWFzZXMgdGhlIG5hbWUgb3IgZGlzY29ubmVjdHMsIHRoZW4gdGhlIG5leHQgb3duZXIgaW4gdGhlCisgKiBxdWV1ZSBhdG9taWNhbGx5IHRha2VzIG92ZXIuCisgKgorICogU28gZm9yIGV4YW1wbGUgaWYgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gb3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3IKKyAqIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgaXQgY2FuIGJlIHJ1biwgeW91IGNhbiBoYXZlIGFsbCBvZiB0aGVtCisgKiBzaXR0aW5nIGluIHRoZSBxdWV1ZS4gVGhlIGZpcnN0IG9uZSB0byBzdGFydCB1cCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMKKyAqIHNlbnQgdG8gb3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3IsIGJ1dCBpZiB0aGF0IG9uZSBleGl0cyBhbm90aGVyCisgKiB3aWxsIGJlY29tZSB0aGUgcHJpbWFyeSBvd25lciBhbmQgcmVjZWl2ZSBtZXNzYWdlcy4KKyAqCisgKiBUaGUgcXVldWUgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gbWFudWFsbHkgd2F0Y2ggZm9yIHRoZSBjdXJyZW50IG93bmVyIHRvCisgKiBkaXNhcHBlYXIgYW5kIHRoZW4gcmVxdWVzdCB0aGUgbmFtZSBhZ2Fpbi4KKyAqCisgKiBXaGVuIHJlcXVlc3RpbmcgYSBuYW1lLCB5b3UgY2FuIHNwZWNpZnkgc2V2ZXJhbCBmbGFncy4KKyAqIAorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIGFuZCAjREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgKiBhcmUgcHJvcGVydGllcyBzdG9yZWQgYnkgdGhlIGJ1cyBmb3IgdGhpcyBjb25uZWN0aW9uIHdpdGggcmVzcGVjdCB0bworICogZWFjaCByZXF1ZXN0ZWQgYnVzIG5hbWUuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBldmVuIGlmIHRoZQorICogY29ubmVjdGlvbiBpcyBxdWV1ZWQgYW5kIGRvZXMgbm90IGJlY29tZSB0aGUgcHJpbWFyeSBvd25lci4KKyAqIFlvdSBjYW4gdXBkYXRlIHRoZXNlIGZsYWdzIGJ5IGNhbGxpbmcgUmVxdWVzdE5hbWUgYWdhaW4gKGV2ZW4gaWYKKyAqIHlvdSBhbHJlYWR5IG93biB0aGUgbmFtZSkuCisgKgorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG1lYW5zIHRoYXQgYW5vdGhlciByZXF1ZXN0b3Igb2YgdGhlCisgKiBuYW1lIGNhbiB0YWtlIGl0IGF3YXkgZnJvbSB5b3UgYnkgc3BlY2lmeWluZyAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAqCisgKiAjREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIG1lYW5zIHRoYXQgaWYgeW91IGFyZW4ndCB0aGUgcHJpbWFyeSBvd25lciwKKyAqIHlvdSBkb24ndCB3YW50IHRvIGJlIHF1ZXVlZCB1cCAtIHlvdSBvbmx5IGNhcmUgYWJvdXQgYmVpbmcgdGhlCisgKiBwcmltYXJ5IG93bmVyLgorICoKKyAqIFVubGlrZSB0aGUgb3RoZXIgdHdvIGZsYWdzLCAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBpcyBhIHByb3BlcnR5CisgKiBvZiB0aGUgaW5kaXZpZHVhbCBSZXF1ZXN0TmFtZSBjYWxsLCBpLmUuIHRoZSBidXMgZG9lcyBub3QgcGVyc2lzdGVudGx5CisgKiBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgY29ubmVjdGlvbi1uYW1lIHBhaXIuIElmIGEgUmVxdWVzdE5hbWUgY2FsbCBpbmNsdWRlcworICogdGhlICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGZsYWcsIGFuZCB0aGUgY3VycmVudCBwcmltYXJ5CisgKiBvd25lciBoYXMgI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHNldCwgdGhlbiB0aGUgY3VycmVudCBwcmltYXJ5CisgKiBvd25lciB3aWxsIGJlIGtpY2tlZCBvZmYuCisgKgorICogSWYgbm8gZmxhZ3MgYXJlIGdpdmVuLCBhbiBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHJlcXVlc3RlZAorICogbmFtZSBvbmx5IGlmIHRoZSBuYW1lIGlzIGN1cnJlbnRseSB1bm93bmVkOyBhbmQgaXQgd2lsbCBOT1QgZ2l2ZQorICogdXAgdGhlIG5hbWUgaWYgYW5vdGhlciBhcHBsaWNhdGlvbiBhc2tzIHRvIHRha2UgaXQgb3ZlciB1c2luZworICogI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzdWx0IGNvZGUuIFRoZSBwb3NzaWJsZSByZXN1bHQgY29kZXMKKyAqIGFyZSBhcyBmb2xsb3dzLgorICogCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUiBtZWFucyB0aGF0IHRoZSBuYW1lIGhhZCBubworICogZXhpc3Rpbmcgb3duZXIsIGFuZCB0aGUgY2FsbGVyIGlzIG5vdyB0aGUgcHJpbWFyeSBvd25lcjsgb3IgdGhhdAorICogdGhlIG5hbWUgaGFkIGFuIG93bmVyLCBhbmQgdGhlIGNhbGxlciBzcGVjaWZpZWQKKyAqICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLCBhbmQgdGhlIGN1cnJlbnQgb3duZXIKKyAqIHNwZWNpZmllZCAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQuCisgKgorICogI0RCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0lOX1FVRVVFIGhhcHBlbnMgb25seSBpZiB0aGUgY2FsbGVyIGRvZXMgTk9UCisgKiBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgYW5kIGVpdGhlciB0aGUgY3VycmVudCBvd25lcgorICogZGlkIE5PVCBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBvciB0aGUgY2FsbGVyIGRpZCBOT1QKKyAqIHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGVuZHMgdXAgCisgKiBpbiBhIHF1ZXVlIHRvIG93biB0aGUgbmFtZSBhZnRlciB0aGUgY3VycmVudCBvd25lciBnaXZlcyBpdCB1cC4KKyAqCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfRVhJU1RTIGhhcHBlbnMgaWYgdGhlIG5hbWUgaGFzIGFuIG93bmVyCisgKiBhbHJlYWR5IGFuZCB0aGUgY2FsbGVyIHNwZWNpZmllcyAjREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgKiBhbmQgZWl0aGVyIHRoZSBjdXJyZW50IG93bmVyIGhhcyBOT1Qgc3BlY2lmaWVkIAorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG9yIHRoZSBjYWxsZXIgZGlkIE5PVCBzcGVjaWZ5IAorICogI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuCisgKgorICogI0RCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0FMUkVBRFlfT1dORVIgaGFwcGVucyBpZiBhbiBhcHBsaWNhdGlvbgorICogcmVxdWVzdHMgYSBuYW1lIGl0IGFscmVhZHkgb3ducy4gKFJlLXJlcXVlc3RpbmcgYSBuYW1lIGlzIHVzZWZ1bCBpZgorICogeW91IHdhbnQgdG8gY2hhbmdlIHRoZSAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgb3IKKyAqICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgc2V0dGluZ3MuKQorICoKKyAqIFdoZW4gYSBzZXJ2aWNlIHJlcHJlc2VudHMgYW4gYXBwbGljYXRpb24sIHNheSAidGV4dCBlZGl0b3IsIiB0aGVuCisgKiBpdCBzaG91bGQgc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgaWYgaXQgd2FudHMKKyAqIHRoZSBsYXN0IGVkaXRvciBzdGFydGVkIHRvIGJlIHRoZSB1c2VyJ3MgZWRpdG9yIHZzLiB0aGUgZmlyc3Qgb25lCisgKiBzdGFydGVkLiAgVGhlbiBhbnkgZWRpdG9yIHRoYXQgY2FuIGJlIHRoZSB1c2VyJ3MgZWRpdG9yIHNob3VsZAorICogc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyB0byBlaXRoZXIgdGFrZSBvdmVyCisgKiAobGFzdC1zdGFydGVkLXdpbnMpIG9yIGJlIHF1ZXVlZCB1cCAoZmlyc3Qtc3RhcnRlZC13aW5zKSBhY2NvcmRpbmcKKyAqIHRvIHdoZXRoZXIgI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHdhcyBnaXZlbi4KKyAqCisgKiBDb252ZW50aW9uYWxseSwgc2luZ2xlLWluc3RhbmNlIGFwcGxpY2F0aW9ucyBvZnRlbiBvZmZlciBhIGNvbW1hbmQKKyAqIGxpbmUgb3B0aW9uIGNhbGxlZCAtLXJlcGxhY2Ugd2hpY2ggbWVhbnMgdG8gcmVwbGFjZSB0aGUgY3VycmVudAorICogaW5zdGFuY2UuICBUbyBpbXBsZW1lbnQgdGhpcywgYWx3YXlzIHNldAorICogI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHdoZW4geW91IHJlcXVlc3QgeW91cgorICogYXBwbGljYXRpb24ncyBidXMgbmFtZS4gIFdoZW4geW91IGxvc2Ugb3duZXJzaGlwIG9mIHlvdXIgYnVzIG5hbWUsCisgKiB5b3UgbmVlZCB0byBleGl0LiAgTG9vayBmb3IgdGhlIHNpZ25hbCAiTmFtZUxvc3QiIGZyb20KKyAqICNEQlVTX1NFUlZJQ0VfREJVUyBhbmQgI0RCVVNfSU5URVJGQUNFX0RCVVMgKHRoZSBzaWduYWwncyBmaXJzdAorICogYXJndW1lbnQgaXMgdGhlIGJ1cyBuYW1lIHRoYXQgd2FzIGxvc3QpLiAgSWYgc3RhcnRpbmcgdXAgd2l0aG91dAorICogLS1yZXBsYWNlLCBkbyBub3Qgc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORywgYW5kCisgKiBleGl0IGlmIHlvdSBmYWlsIHRvIGJlY29tZSB0aGUgYnVzIG5hbWUgb3duZXIuIElmIC0tcmVwbGFjZSBpcworICogZ2l2ZW4sIGFzayB0byByZXBsYWNlIHRoZSBvbGQgb3duZXIuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHJlcXVlc3QKKyAqIEBwYXJhbSBmbGFncyBmbGFncworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlcnJvcgorICogQHJldHVybnMgYSByZXN1bHQgY29kZSwgLTEgaWYgZXJyb3IgaXMgc2V0CisgKi8gCitpbnQKK2RidXNfYnVzX3JlcXVlc3RfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgZGJ1c191aW50MzJfdCByZXN1bHQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKG5hbWUpLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCAwKTsKKyAgCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorCQkJCSBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisJCQkJIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0gIAorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIEFza3MgdGhlIGJ1cyB0byB1bmFzc2lnbiB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoaXMgY29ubmVjdGlvbiBieQorICogaW52b2tpbmcgdGhlIFJlbGVhc2VOYW1lIG1ldGhvZCBvbiB0aGUgYnVzLiBUaGUgIlJlbGVhc2VOYW1lIgorICogbWV0aG9kIGlzIGNhbm9uaWNhbGx5IGRvY3VtZW50ZWQgaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogUG9zc2libGUgcmVzdWx0cyBhcmU6ICNEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9SRUxFQVNFRAorICogd2hpY2ggbWVhbnMgeW91IG93bmVkIHRoZSBuYW1lIG9yIHdlcmUgaW4gdGhlIHF1ZXVlIHRvIG93biBpdCwKKyAqIGFuZCBhbmQgbm93IHlvdSBkb24ndCBvd24gaXQgYW5kIGFyZW4ndCBpbiB0aGUgcXVldWUuCisgKiAjREJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9UX09XTkVSIHdoaWNoIG1lYW5zIHNvbWVvbmUgZWxzZQorICogb3ducyB0aGUgbmFtZSBzbyB5b3UgY2FuJ3QgcmVsZWFzZSBpdC4KKyAqICNEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT05fRVhJU1RFTlQKKyAqIHdoaWNoIG1lYW5zIG5vYm9keSBvd25lZCB0aGUgbmFtZS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHJlbW92ZSAKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSB0aGUgZXJyb3IKKyAqIEByZXR1cm5zIGEgcmVzdWx0IGNvZGUsIC0xIGlmIGVycm9yIGlzIHNldAorICovIAoraW50CitkYnVzX2J1c19yZWxlYXNlX25hbWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwgKnJlcGx5OworICBkYnVzX3VpbnQzMl90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIDApOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWxlYXNlTmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChyZXBseSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEFza3MgdGhlIGJ1cyB3aGV0aGVyIGEgY2VydGFpbiBuYW1lIGhhcyBhbiBvd25lci4KKyAqCisgKiBVc2luZyB0aGlzIGNhbiBlYXNpbHkgcmVzdWx0IGluIGEgcmFjZSBjb25kaXRpb24sCisgKiBzaW5jZSBhbiBvd25lciBjYW4gYXBwZWFyIG9yIGRpc2FwcGVhciBhZnRlciB5b3UKKyAqIGNhbGwgdGhpcy4KKyAqCisgKiBJZiB5b3Ugd2FudCB0byByZXF1ZXN0IGEgbmFtZSwganVzdCByZXF1ZXN0IGl0OworICogaWYgeW91IHdhbnQgdG8gYXZvaWQgcmVwbGFjaW5nIGEgY3VycmVudCBvd25lciwKKyAqIGRvbid0IHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgYW5kCisgKiB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgaWYgdGhlcmUncyBhbHJlYWR5IGFuIG93bmVyLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBhbnkgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbmFtZSBleGlzdHMsICNGQUxTRSBpZiBub3Qgb3Igb24gZXJyb3IKKyAqLworZGJ1c19ib29sX3QKK2RidXNfYnVzX25hbWVfaGFzX293bmVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGRidXNfYm9vbF90IGV4aXN0czsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChuYW1lKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKyAgCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lSGFzT3duZXIiKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorCQkJCSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtZXNzYWdlLCAtMSwgZXJyb3IpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9CT09MRUFOLCAmZXhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gZXhpc3RzOworfQorCisvKioKKyAqIFN0YXJ0cyBhIHNlcnZpY2UgdGhhdCB3aWxsIHJlcXVlc3Qgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBuYW1lLgorICogVGhlIHJldHVybmVkIHJlc3VsdCB3aWxsIGJlIG9uZSBvZiBiZSBvbmUgb2YKKyAqICNEQlVTX1NUQVJUX1JFUExZX1NVQ0NFU1Mgb3IgI0RCVVNfU1RBUlRfUkVQTFlfQUxSRUFEWV9SVU5OSU5HIGlmCisgKiBzdWNjZXNzZnVsLiAgUGFzcyAjTlVMTCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0LgorICogCisgKiBUaGUgZmxhZ3MgcGFyYW1ldGVyIGlzIGZvciBmdXR1cmUgZXhwYW5zaW9uLCBjdXJyZW50bHkgeW91IHNob3VsZAorICogc3BlY2lmeSAwLgorICoKKyAqIEl0J3Mgb2Z0ZW4gZWFzaWVyIHRvIGF2b2lkIGV4cGxpY2l0bHkgc3RhcnRpbmcgc2VydmljZXMsIGFuZAorICoganVzdCBzZW5kIGEgbWV0aG9kIGNhbGwgdG8gdGhlIHNlcnZpY2UncyBidXMgbmFtZSBpbnN0ZWFkLgorICogTWV0aG9kIGNhbGxzIHN0YXJ0IGEgc2VydmljZSB0byBoYW5kbGUgdGhlbSBieSBkZWZhdWx0CisgKiB1bmxlc3MgeW91IGNhbGwgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0KCkgdG8gZGlzYWJsZSB0aGlzCisgKiBiZWhhdmlvci4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHdlIHdhbnQgdGhlIG5ldyBzZXJ2aWNlIHRvIHJlcXVlc3QKKyAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MgKHNob3VsZCBhbHdheXMgYmUgMCBmb3Igbm93KQorICogQHBhcmFtIHJlc3VsdCBhIHBsYWNlIHRvIHN0b3JlIHRoZSByZXN1bHQgb3IgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBhbnkgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYWN0aXZhdGlvbiBzdWNjZWVkZWQsICNGQUxTRSBpZiBub3QKKyAqLworZGJ1c19ib29sX3QKK2RidXNfYnVzX3N0YXJ0X3NlcnZpY2VfYnlfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1zZzsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKG5hbWUpLCBGQUxTRSk7CisgIAorICBtc2cgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKwkJCSAgCSBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIGVycm9yKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHJlc3VsdCAhPSBOVUxMICYmCisgICAgICAhZGJ1c19tZXNzYWdlX2dldF9hcmdzIChyZXBseSwgZXJyb3IsIERCVVNfVFlQRV9VSU5UMzIsCisJICAgICAgCQkgICAgICByZXN1bHQsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX25vX3JldHVybl92YWx1ZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGlmIChlcnJvcikKKyAgICB7CisgICAgICAvKiBCbG9jayB0byBjaGVjayBzdWNjZXNzIGNvZGVwYXRoICovCisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAKKyAgICAgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBlcnJvcik7CisgICAgICAKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNpbGVudGx5LWZhaWwgbm9uYmxvY2tpbmcgY29kZXBhdGggKi8KKyAgICAgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1zZywgVFJVRSk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbXNnLCBOVUxMKTsKKyAgICB9Cit9CisKKy8qKgorICogQWRkcyBhIG1hdGNoIHJ1bGUgdG8gbWF0Y2ggbWVzc2FnZXMgZ29pbmcgdGhyb3VnaCB0aGUgbWVzc2FnZSBidXMuCisgKiBUaGUgInJ1bGUiIGFyZ3VtZW50IGlzIHRoZSBzdHJpbmcgZm9ybSBvZiBhIG1hdGNoIHJ1bGUuCisgKgorICogSWYgeW91IHBhc3MgI05VTEwgZm9yIHRoZSBlcnJvciwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorICogYmxvY2s7IHRoZSBtYXRjaCB0aHVzIHdvbid0IGJlIGFkZGVkIHVudGlsIHlvdSBmbHVzaCB0aGUKKyAqIGNvbm5lY3Rpb24sIGFuZCBpZiB0aGVyZSdzIGFuIGVycm9yIGFkZGluZyB0aGUgbWF0Y2gKKyAqIChvbmx5IHBvc3NpYmxlIGVycm9yIGlzIGxhY2sgb2YgcmVzb3VyY2VzIGluIHRoZSBidXMpLAorICogeW91IHdvbid0IGZpbmQgb3V0IGFib3V0IGl0LgorICoKKyAqIElmIHlvdSBwYXNzIG5vbi0jTlVMTCBmb3IgdGhlIGVycm9yIHRoaXMgZnVuY3Rpb24gd2lsbAorICogYmxvY2sgdW50aWwgaXQgZ2V0cyBhIHJlcGx5LgorICoKKyAqIE5vcm1hbCBBUEkgY29udmVudGlvbnMgd291bGQgaGF2ZSB0aGUgZnVuY3Rpb24gcmV0dXJuCisgKiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlcnJvciB3YXMgc2V0LAorICogYnV0IHRoYXQgd291bGQgcmVxdWlyZSBibG9ja2luZyBhbHdheXMgdG8gZGV0ZXJtaW5lCisgKiB0aGUgcmV0dXJuIHZhbHVlLgorICoKKyAqIFRoZSBBZGRNYXRjaCBtZXRob2QgaXMgZnVsbHkgZG9jdW1lbnRlZCBpbiB0aGUgRC1CdXMgCisgKiBzcGVjaWZpY2F0aW9uLiBGb3IgcXVpY2sgcmVmZXJlbmNlLCB0aGUgZm9ybWF0IG9mIHRoZSAKKyAqIG1hdGNoIHJ1bGVzIGlzIGRpc2N1c3NlZCBoZXJlLCBidXQgdGhlIHNwZWNpZmljYXRpb24gCisgKiBpcyB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSdWxlcyBhcmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCAKKyAqIGtleS92YWx1ZSBwYWlycy4gQW4gZXhhbXBsZSBpcyAKKyAqICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nb3JnLmZyZWVkZXNrdG9wLkRCdXMnLAorICogaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLAorICogcGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JyIKKyAqCisgKiBQb3NzaWJsZSBrZXlzIHlvdSBjYW4gbWF0Y2ggb24gYXJlIHR5cGUsIHNlbmRlciwgCisgKiBpbnRlcmZhY2UsIG1lbWJlciwgcGF0aCwgZGVzdGluYXRpb24gYW5kIG51bWJlcmVkCisgKiBrZXlzIHRvIG1hdGNoIG1lc3NhZ2UgYXJncyAoa2V5cyBhcmUgJ2FyZzAnLCAnYXJnMScsIGV0Yy4pLgorICogT21pdHRpbmcgYSBrZXkgZnJvbSB0aGUgcnVsZSBpbmRpY2F0ZXMgCisgKiBhIHdpbGRjYXJkIG1hdGNoLiAgRm9yIGluc3RhbmNlIG9taXR0aW5nCisgKiB0aGUgbWVtYmVyIGZyb20gYSBtYXRjaCBydWxlIGJ1dCBhZGRpbmcgYSBzZW5kZXIgd291bGQKKyAqIGxldCBhbGwgbWVzc2FnZXMgZnJvbSB0aGF0IHNlbmRlciB0aHJvdWdoIHJlZ2FyZGxlc3Mgb2YKKyAqIHRoZSBtZW1iZXIuCisgKgorICogTWF0Y2hlcyBhcmUgaW5jbHVzaXZlIG5vdCBleGNsdXNpdmUgc28gYXMgbG9uZyBhcyBvbmUgCisgKiBydWxlIG1hdGNoZXMgdGhlIG1lc3NhZ2Ugd2lsbCBnZXQgdGhyb3VnaC4gIEl0IGlzIGltcG9ydGFudAorICogdG8gbm90ZSB0aGlzIGJlY2F1c2UgZXZlcnkgdGltZSBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgdGhlIAorICogYXBwbGljYXRpb24gd2lsbCBiZSBwYWdlZCBpbnRvIG1lbW9yeSB0byBwcm9jZXNzIGl0LiAgVGhpcworICogY2FuIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIHN1Y2ggYXMgZHJhaW5pbmcgYmF0dGVyaWVzCisgKiBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMuCisgKgorICogSWYgeW91IG1hdGNoIG1lc3NhZ2UgYXJncyAoJ2FyZzAnLCAnYXJnMScsIGFuZCBzbyBmb3J0aCkKKyAqIG9ubHkgc3RyaW5nIGFyZ3VtZW50cyB3aWxsIG1hdGNoLiBUaGF0IGlzLCBhcmcwPSc1JyBtZWFucworICogbWF0Y2ggdGhlIHN0cmluZyAiNSIgbm90IHRoZSBpbnRlZ2VyIDUuCisgKgorICogQ3VycmVudGx5IHRoZXJlIGlzIG5vIHdheSB0byBtYXRjaCBhZ2FpbnN0IG5vbi1zdHJpbmcgYXJndW1lbnRzLgorICoKKyAqIEEgc3BlY2lhbGlzZWQgZm9ybSBvZiB3aWxkY2FyZCBtYXRjaGluZyBvbiBhcmd1bWVudHMgaXMKKyAqIHN1cHBvcnRlZCBmb3IgcGF0aC1saWtlIG5hbWVzcGFjZXMuICBJZiB5b3VyIGFyZ3VtZW50IG1hdGNoIGhhcworICogYSAncGF0aCcgc3VmZml4IChlZzogImFyZzBwYXRoPScvc29tZS9wYXRoLyciKSB0aGVuIGl0IGlzCisgKiBjb25zaWRlcmVkIGEgbWF0Y2ggaWYgdGhlIGFyZ3VtZW50IGV4YWN0bHkgbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAqIHN0cmluZyBvciBpZiBvbmUgb2YgdGhlbSBlbmRzIGluIGEgJy8nIGFuZCBpcyBhIHByZWZpeCBvZiB0aGUKKyAqIG90aGVyLgorICoKKyAqIE1hdGNoaW5nIG9uIGludGVyZmFjZSBpcyB0cmlja3kgYmVjYXVzZSBtZXRob2QgY2FsbAorICogbWVzc2FnZXMgb25seSBvcHRpb25hbGx5IHNwZWNpZnkgdGhlIGludGVyZmFjZS4KKyAqIElmIGEgbWVzc2FnZSBvbWl0cyB0aGUgaW50ZXJmYWNlLCB0aGVuIGl0IHdpbGwgTk9UIG1hdGNoCisgKiBpZiB0aGUgcnVsZSBzcGVjaWZpZXMgYW4gaW50ZXJmYWNlIG5hbWUuIFRoaXMgbWVhbnMgbWF0Y2gKKyAqIHJ1bGVzIG9uIG1ldGhvZCBjYWxscyBzaG91bGQgbm90IHVzdWFsbHkgZ2l2ZSBhbiBpbnRlcmZhY2UuCisgKgorICogSG93ZXZlciwgc2lnbmFsIG1lc3NhZ2VzIGFyZSByZXF1aXJlZCB0byBpbmNsdWRlIHRoZSBpbnRlcmZhY2UKKyAqIHNvIHdoZW4gbWF0Y2hpbmcgc2lnbmFscyB1c3VhbGx5IHlvdSBzaG91bGQgc3BlY2lmeSB0aGUgaW50ZXJmYWNlCisgKiBpbiB0aGUgbWF0Y2ggcnVsZS4KKyAqIAorICogRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHlvdSBjYW4gbWF0Y2ggYXJndW1lbnRzIG9ubHkgdXAgdG8KKyAqICNEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9BUkdfTlVNQkVSLgorICoKKyAqIE1hdGNoIHJ1bGVzIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAjREJVU19NQVhJTVVNX01BVENIX1JVTEVfTEVOR1RICisgKiBieXRlcy4KKyAqCisgKiBCb3RoIG9mIHRoZXNlIG1heGltdW1zIGFyZSBtdWNoIGhpZ2hlciB0aGFuIHlvdSdyZSBsaWtlbHkgdG8gbmVlZCwKKyAqIHRoZXkgb25seSBleGlzdCBiZWNhdXNlIHRoZSBELUJ1cyBidXMgZGFlbW9uIGhhcyBmaXhlZCBsaW1pdHMgb24KKyAqIGFsbCByZXNvdXJjZSB1c2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBjb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cworICogQHBhcmFtIHJ1bGUgdGV4dHVhbCBmb3JtIG9mIG1hdGNoIHJ1bGUKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBhbnkgZXJyb3JzCisgKi8KK3ZvaWQKK2RidXNfYnVzX2FkZF9tYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptc2c7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHJ1bGUgIT0gTlVMTCk7CisKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRkTWF0Y2giKTsKKworICBpZiAobXNnID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoY29ubmVjdGlvbiwgbXNnLCBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBwcmV2aW91c2x5LWFkZGVkIG1hdGNoIHJ1bGUgImJ5IHZhbHVlIiAodGhlIG1vc3QKKyAqIHJlY2VudGx5LWFkZGVkIGlkZW50aWNhbCBydWxlIGdldHMgcmVtb3ZlZCkuICBUaGUgInJ1bGUiIGFyZ3VtZW50CisgKiBpcyB0aGUgc3RyaW5nIGZvcm0gb2YgYSBtYXRjaCBydWxlLgorICoKKyAqIFRoZSBidXMgY29tcGFyZXMgbWF0Y2ggcnVsZXMgc2VtYW50aWNhbGx5LCBub3QgdGV4dHVhbGx5LCBzbworICogd2hpdGVzcGFjZSBhbmQgb3JkZXJpbmcgZG9uJ3QgaGF2ZSB0byBiZSBpZGVudGljYWwgdG8KKyAqIHRoZSBydWxlIHlvdSBwYXNzZWQgdG8gZGJ1c19idXNfYWRkX21hdGNoKCkuCisgKiAKKyAqIElmIHlvdSBwYXNzICNOVUxMIGZvciB0aGUgZXJyb3IsIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKKyAqIGJsb2NrOyBvdGhlcndpc2UgaXQgd2lsbC4gU2VlIGRldGFpbGVkIGV4cGxhbmF0aW9uIGluCisgKiBkb2NzIGZvciBkYnVzX2J1c19hZGRfbWF0Y2goKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gY29ubmVjdGlvbiB0byB0aGUgbWVzc2FnZSBidXMKKyAqIEBwYXJhbSBydWxlIHRleHR1YWwgZm9ybSBvZiBtYXRjaCBydWxlCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgYW55IGVycm9ycworICovCit2b2lkCitkYnVzX2J1c19yZW1vdmVfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbXNnOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChydWxlICE9IE5VTEwpOworICAKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3ZlTWF0Y2giKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoY29ubmVjdGlvbiwgbXNnLCBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1idXMuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE5NTcxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWJ1cy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1idXMuaCAgQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0JVU19ICisjZGVmaW5lIERCVVNfQlVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQnVzCisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiAqZGJ1c19idXNfZ2V0ICAgICAgICAgICAgICAoREJ1c0J1c1R5cGUgICAgIHR5cGUsCisJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24gKmRidXNfYnVzX2dldF9wcml2YXRlICAgICAgKERCdXNCdXNUeXBlICAgICB0eXBlLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfYnVzX3JlZ2lzdGVyICAgICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKnVuaXF1ZV9uYW1lKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgICAgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3Vuc2lnbmVkIGxvbmcgICBkYnVzX2J1c19nZXRfdW5peF91c2VyICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgICAgICBkYnVzX2J1c19nZXRfaWQgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2ludCAgICAgICAgICAgICBkYnVzX2J1c19yZXF1ZXN0X25hbWUgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisJCQkJCSAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKwkJCQkJICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19idXNfcmVsZWFzZV9uYW1lICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX2J1c19uYW1lX2hhc19vd25lciAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19idXNfc3RhcnRfc2VydmljZV9ieV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2ggICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjNmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTIxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIERCdXNDb25uZWN0aW9uIGludGVybmFsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX0NPTk5FQ1RJT05fSU5URVJOQUxfSAorI2RlZmluZSBEQlVTX0NPTk5FQ1RJT05fSU5URVJOQUxfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZGF0YXNsb3QuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORyA9IDEgPDwgMCwgLyoqPCBXcml0ZSBtZXNzYWdlcyBvdXQuICovCisgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgPSAxIDw8IDEsIC8qKjwgUmVhZCBtZXNzYWdlcyBpbi4gKi8KKyAgREJVU19JVEVSQVRJT05fQkxPQ0sgICAgICA9IDEgPDwgMiAgLyoqPCBCbG9jayBpZiBub3RoaW5nIHRvIGRvLiAqLworfSBEQnVzSXRlcmF0aW9uRmxhZ3M7CisKKy8qKiBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgd2hlbiB3YWl0aW5nIGZvciBhIG1lc3NhZ2UgcmVwbHksIDI1IHNlY29uZHMgKi8KKyNkZWZpbmUgX0RCVVNfREVGQVVMVF9USU1FT1VUX1ZBTFVFICgyNSAqIDEwMDApCisKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitEQnVzQ29ubmVjdGlvbiAqICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmsgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgKmxpbmspOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK0RCdXNNZXNzYWdlKiAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X21lc3NhZ2VfdG9fc2VuZCAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnQgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV93YXRjaF91bmxvY2tlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICBlbmFibGVkKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoICAgICAgICAgICAgICAgIChEQnVzV2F0Y2ggICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0X3VubG9ja2VkICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGVuYWJsZWQpOworREJ1c0Nvbm5lY3Rpb24qICAgX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaWZfb25seV9vbmVfcmVmICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworCitEQnVzUGVuZGluZ0NhbGwqICBfZGJ1c19wZW5kaW5nX2NhbGxfbmV3ICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyICB0aW1lb3V0X2hhbmRsZXIpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX25vdGlmeSAgICAgICAgICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9wZW5kaW5nX2NhbGwgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9jb21wbGV0ZV9hbmRfdW5sb2NrICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAqY2xpZW50X3NlcmlhbCk7CisKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfc3ludGhlc2l6ZWRfbWVzc2FnZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbGluayk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAqKmRpc3BhdGNoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggKippb19wYXRoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAqKmRpc3BhdGNoX2NvbmRfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICoqaW9fcGF0aF9jb25kX2xvYyk7CisKKy8qIFRoaXMgX2RidXNfYnVzXyogc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBkYnVzLWJ1cy1pbnRlcm5hbC5oIHNlZW1zCisgKiBzaWxseSBmb3Igb25lIGZ1bmN0aW9uCisgKi8KKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0J1c0ludGVybmFscworICogQHsKKyAqLworCit2b2lkICAgICAgICAgICBfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisvKiogQH0gKi8KKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19DT05ORUNUSU9OX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1jb25uZWN0aW9uLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY29ubmVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYWNhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsNjIxOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNvbm5lY3Rpb24uYyBEQnVzQ29ubmVjdGlvbiBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNoYXJlZC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtdGltZW91dC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1kYXRhc2xvdC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wZW5kaW5nLWNhbGwuaCIKKyNpbmNsdWRlICJkYnVzLW9iamVjdC10cmVlLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1idXMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKworI2lmZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyNkZWZpbmUgVE9PS19MT0NLX0NIRUNLKGNvbm5lY3Rpb24pCisjZGVmaW5lIFJFTEVBU0lOR19MT0NLX0NIRUNLKGNvbm5lY3Rpb24pCisjZGVmaW5lIEhBVkVfTE9DS19DSEVDSyhjb25uZWN0aW9uKQorI2Vsc2UKKyNkZWZpbmUgVE9PS19MT0NLX0NIRUNLKGNvbm5lY3Rpb24pIGRvIHsgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoIShjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2spOyBcCisgICAgKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jayA9IFRSVUU7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVMRUFTSU5HX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikgZG8geyAgICAgICAgICAgIFwKKyAgICBfZGJ1c19hc3NlcnQgKChjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2spOyAgIFwKKyAgICAoY29ubmVjdGlvbiktPmhhdmVfY29ubmVjdGlvbl9sb2NrID0gRkFMU0U7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKGNvbm5lY3Rpb24pICAgICAgICBfZGJ1c19hc3NlcnQgKChjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2spCisvKiBBICJET19OT1RfSEFWRV9MT0NLX0NIRUNLIiBpcyBpbXBvc3NpYmxlIHNpbmNlIHdlIG5lZWQgdGhlIGxvY2sgdG8gY2hlY2sgdGhlIGZsYWcgKi8KKyNlbmRpZgorCisjZGVmaW5lIFRSQUNFX0xPQ0tTIDEKKworI2RlZmluZSBDT05ORUNUSU9OX0xPQ0soY29ubmVjdGlvbikgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRSQUNFX0xPQ0tTKSB7IF9kYnVzX3ZlcmJvc2UgKCJMT0NLXG4iKTsgfSAgIFwKKyAgICBfZGJ1c19tdXRleF9sb2NrICgoY29ubmVjdGlvbiktPm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUT09LX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTk5FQ1RJT05fVU5MT0NLKGNvbm5lY3Rpb24pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUUkFDRV9MT0NLUykgeyBfZGJ1c192ZXJib3NlICgiVU5MT0NLXG4iKTsgIH0gICAgICAgIFwKKyAgICBSRUxFQVNJTkdfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfbXV0ZXhfdW5sb2NrICgoY29ubmVjdGlvbiktPm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTTE9UU19MT0NLKGNvbm5lY3Rpb24pIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfbXV0ZXhfbG9jayAoKGNvbm5lY3Rpb24pLT5zbG90X211dGV4KTsgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTTE9UU19VTkxPQ0soY29ubmVjdGlvbikgZG8geyAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfbXV0ZXhfdW5sb2NrICgoY29ubmVjdGlvbiktPnNsb3RfbXV0ZXgpOyAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBESVNQQVRDSF9TVEFUVVNfTkFNRShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChzKSA9PSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFID8gImNvbXBsZXRlIiA6ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIChzKSA9PSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyA/ICJkYXRhIHJlbWFpbnMiIDogXAorICAgICAgICAgICAgICAgICAgICAgIChzKSA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZID8gIm5lZWQgbWVtb3J5IiA6ICAgXAorICAgICAgICAgICAgICAgICAgICAgICI/Pz8iKQorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ29ubmVjdGlvbiBEQnVzQ29ubmVjdGlvbgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBDb25uZWN0aW9uIHRvIGFub3RoZXIgYXBwbGljYXRpb24KKyAqCisgKiBBIERCdXNDb25uZWN0aW9uIHJlcHJlc2VudHMgYSBjb25uZWN0aW9uIHRvIGFub3RoZXIKKyAqIGFwcGxpY2F0aW9uLiBNZXNzYWdlcyBjYW4gYmUgc2VudCBhbmQgcmVjZWl2ZWQgdmlhIHRoaXMgY29ubmVjdGlvbi4KKyAqIFRoZSBvdGhlciBhcHBsaWNhdGlvbiBtYXkgYmUgYSBtZXNzYWdlIGJ1czsgZm9yIGNvbnZlbmllbmNlLCB0aGUKKyAqIGZ1bmN0aW9uIGRidXNfYnVzX2dldCgpIGlzIHByb3ZpZGVkIHRvIGF1dG9tYXRpY2FsbHkgb3BlbiBhCisgKiBjb25uZWN0aW9uIHRvIHRoZSB3ZWxsLWtub3duIG1lc3NhZ2UgYnVzZXMuCisgKiAKKyAqIEluIGJyaWVmIGEgREJ1c0Nvbm5lY3Rpb24gaXMgYSBtZXNzYWdlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCBzb21lCisgKiBtZXNzYWdlIHRyYW5zcG9ydCBtZWNoYW5pc20gc3VjaCBhcyBhIHNvY2tldC4gIFRoZSBjb25uZWN0aW9uCisgKiBtYWludGFpbnMgYSBxdWV1ZSBvZiBpbmNvbWluZyBtZXNzYWdlcyBhbmQgYSBxdWV1ZSBvZiBvdXRnb2luZworICogbWVzc2FnZXMuCisgKgorICogU2V2ZXJhbCBmdW5jdGlvbnMgdXNlIHRoZSBmb2xsb3dpbmcgdGVybXM6CisgKiA8dWw+CisgKiA8bGk+PGI+cmVhZDwvYj4gbWVhbnMgdG8gZmlsbCB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSBieSByZWFkaW5nIGZyb20gdGhlIHNvY2tldDwvbGk+CisgKiA8bGk+PGI+d3JpdGU8L2I+IG1lYW5zIHRvIGRyYWluIHRoZSBvdXRnb2luZyBxdWV1ZSBieSB3cml0aW5nIHRvIHRoZSBzb2NrZXQ8L2xpPgorICogPGxpPjxiPmRpc3BhdGNoPC9iPiBtZWFucyB0byBkcmFpbiB0aGUgaW5jb21pbmcgcXVldWUgYnkgaW52b2tpbmcgYXBwbGljYXRpb24tcHJvdmlkZWQgbWVzc2FnZSBoYW5kbGVyczwvbGk+CisgKiA8L3VsPgorICoKKyAqIFRoZSBmdW5jdGlvbiBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpIGZvciBleGFtcGxlIGRvZXMgYWxsCisgKiB0aHJlZSBvZiB0aGVzZSB0aGluZ3MsIG9mZmVyaW5nIGEgc2ltcGxlIGFsdGVybmF0aXZlIHRvIGEgbWFpbiBsb29wLgorICoKKyAqIEluIGFuIGFwcGxpY2F0aW9uIHdpdGggYSBtYWluIGxvb3AsIHRoZSByZWFkL3dyaXRlL2Rpc3BhdGNoCisgKiBvcGVyYXRpb25zIGFyZSB1c3VhbGx5IHNlcGFyYXRlLgorICoKKyAqIFRoZSBjb25uZWN0aW9uIHByb3ZpZGVzICNEQnVzV2F0Y2ggYW5kICNEQnVzVGltZW91dCBvYmplY3RzIHRvCisgKiB0aGUgbWFpbiBsb29wLiBUaGVzZSBhcmUgdXNlZCB0byBrbm93IHdoZW4gcmVhZGluZywgd3JpdGluZywgb3IKKyAqIGRpc3BhdGNoaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgKiAKKyAqIEluY29taW5nIG1lc3NhZ2VzIGFyZSBwcm9jZXNzZWQKKyAqIGJ5IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpCisgKiBydW5zIGFueSBoYW5kbGVycyByZWdpc3RlcmVkIGZvciB0aGUgdG9wbW9zdCBtZXNzYWdlIGluIHRoZSBtZXNzYWdlCisgKiBxdWV1ZSwgdGhlbiBkaXNjYXJkcyB0aGUgbWVzc2FnZSwgdGhlbiByZXR1cm5zLgorICogCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cygpIGluZGljYXRlcyB3aGV0aGVyCisgKiBtZXNzYWdlcyBhcmUgY3VycmVudGx5IGluIHRoZSBxdWV1ZSB0aGF0IG5lZWQgZGlzcGF0Y2hpbmcuCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbigpIGFsbG93cworICogeW91IHRvIHNldCBhIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgZGlzcGF0Y2ggc3RhdHVzLgorICogCisgKiBJZiB5b3UncmUgdXNpbmcgR0xpYiBvciBRdCBhZGQtb24gbGlicmFyaWVzIGZvciBELUJ1cywgdGhlcmUgYXJlCisgKiBzcGVjaWFsIGNvbnZlbmllbmNlIEFQSXMgaW4gdGhvc2UgbGlicmFyaWVzIHRoYXQgaGlkZQorICogYWxsIHRoZSBkZXRhaWxzIG9mIGRpc3BhdGNoIGFuZCB3YXRjaC90aW1lb3V0IG1vbml0b3JpbmcuCisgKiBGb3IgZXhhbXBsZSwgZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKCkuCisgKgorICogSWYgeW91IGFyZW4ndCB1c2luZyB0aGVzZSBhZGQtb24gbGlicmFyaWVzLCBidXQgd2FudCB0byBwcm9jZXNzCisgKiBtZXNzYWdlcyBhc3luY2hyb25vdXNseSwgeW91IG11c3QgbWFudWFsbHkgY2FsbAorICogZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24oKSwKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCksCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkgcHJvdmlkaW5nIGFwcHJvcHJpYXRlCisgKiBmdW5jdGlvbnMgdG8gaW50ZWdyYXRlIHRoZSBjb25uZWN0aW9uIHdpdGggeW91ciBhcHBsaWNhdGlvbidzIG1haW4KKyAqIGxvb3AuIFRoaXMgY2FuIGJlIHRyaWNreSB0byBnZXQgcmlnaHQ7IG1haW4gbG9vcHMgYXJlIG5vdCBzaW1wbGUuCisgKgorICogSWYgeW91IGRvbid0IG5lZWQgdG8gYmUgYXN5bmNocm9ub3VzLCB5b3UgY2FuIGlnbm9yZSAjREJ1c1dhdGNoLAorICogI0RCdXNUaW1lb3V0LCBhbmQgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuICBJbnN0ZWFkLAorICogZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goKSBjYW4gYmUgdXNlZC4KKyAqCisgKiBPciwgaW4gPGVtPnZlcnk8L2VtPiBzaW1wbGUgYXBwbGljYXRpb25zLAorICogZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCkgbWF5IGJlIGFsbCB5b3UgbmVlZCwgYWxsb3dpbmcgeW91IHRvCisgKiBhdm9pZCBzZXR0aW5nIHVwIGFueSBoYW5kbGVyIGZ1bmN0aW9ucyAoc2VlCisgKiBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlcigpLAorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkgZm9yIG1vcmUgb24gaGFuZGxlcnMpLgorICogCisgKiBXaGVuIHlvdSB1c2UgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSBvciBvbmUgb2YgaXRzIHZhcmlhbnRzIHRvIHNlbmQKKyAqIGEgbWVzc2FnZSwgdGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIG91dGdvaW5nIHF1ZXVlLiAgSXQncworICogYWN0dWFsbHkgd3JpdHRlbiB0byB0aGUgbmV0d29yayBsYXRlcjsgZWl0aGVyIGluCisgKiBkYnVzX3dhdGNoX2hhbmRsZSgpIGludm9rZWQgYnkgeW91ciBtYWluIGxvb3AsIG9yIGluCisgKiBkYnVzX2Nvbm5lY3Rpb25fZmx1c2goKSB3aGljaCBibG9ja3MgdW50aWwgaXQgY2FuIHdyaXRlIG91dCB0aGUKKyAqIGVudGlyZSBvdXRnb2luZyBxdWV1ZS4gVGhlIEdMaWIvUXQgYWRkLW9uIGxpYnJhcmllcyBhZ2FpbgorICogaGFuZGxlIHRoZSBkZXRhaWxzIGhlcmUgZm9yIHlvdSBieSBzZXR0aW5nIHVwIHdhdGNoIGZ1bmN0aW9ucy4KKyAqCisgKiBXaGVuIGEgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsIHlvdSBhcmUgZ3VhcmFudGVlZCB0byBnZXQgYQorICogc2lnbmFsICJEaXNjb25uZWN0ZWQiIGZyb20gdGhlIGludGVyZmFjZQorICogI0RCVVNfSU5URVJGQUNFX0xPQ0FMLCBwYXRoCisgKiAjREJVU19QQVRIX0xPQ0FMLgorICoKKyAqIFlvdSBtYXkgbm90IGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgI0RCdXNDb25uZWN0aW9uCisgKiB1bnRpbCB0aGF0IGNvbm5lY3Rpb24gaGFzIGJlZW4gZGlzY29ubmVjdGVkLgorICoKKyAqIFlvdSBtYXkgZGlzcGF0Y2ggdGhlIHVucHJvY2Vzc2VkIGluY29taW5nIG1lc3NhZ2UgcXVldWUgZXZlbiBpZiB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLiBIb3dldmVyLCAiRGlzY29ubmVjdGVkIiB3aWxsIGFsd2F5cyBiZQorICogdGhlIGxhc3QgbWVzc2FnZSBpbiB0aGUgcXVldWUgKG9idmlvdXNseSBubyBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQKKyAqIGFmdGVyIGRpc2Nvbm5lY3Rpb24pLgorICoKKyAqIEFmdGVyIGNhbGxpbmcgZGJ1c190aHJlYWRzX2luaXQoKSwgI0RCdXNDb25uZWN0aW9uIGhhcyB0aHJlYWQKKyAqIGxvY2tzIGFuZCBkcm9wcyB0aGVtIHdoZW4gaW52b2tpbmcgdXNlciBjYWxsYmFja3MsIHNvIGluIGdlbmVyYWwgaXMKKyAqIHRyYW5zcGFyZW50bHkgdGhyZWFkc2FmZS4gSG93ZXZlciwgI0RCdXNNZXNzYWdlIGRvZXMgTk9UIGhhdmUKKyAqIHRocmVhZCBsb2NrczsgeW91IG11c3Qgbm90IHNlbmQgdGhlIHNhbWUgbWVzc2FnZSB0byBtdWx0aXBsZQorICogI0RCdXNDb25uZWN0aW9uIGlmIHRob3NlIGNvbm5lY3Rpb25zIHdpbGwgYmUgdXNlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzLAorICogZm9yIGV4YW1wbGUuCisgKgorICogQWxzbywgaWYgeW91IGRpc3BhdGNoIG9yIHBvcCBtZXNzYWdlcyBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGl0CisgKiBtYXkgd29yayBpbiB0aGUgc2Vuc2UgdGhhdCBpdCB3b24ndCBjcmFzaCwgYnV0IGl0J3MgdG91Z2ggdG8gaW1hZ2luZQorICogc2FuZSByZXN1bHRzOyBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgdW5wcmVkaWN0YWJsZSB3aGljaCBtZXNzYWdlcworICogZ28gdG8gd2hpY2ggdGhyZWFkcy4KKyAqCisgKiBJdCdzIHJlY29tbWVuZGVkIHRvIGRpc3BhdGNoIGZyb20gYSBzaW5nbGUgdGhyZWFkLgorICoKKyAqIFRoZSBtb3N0IHVzZWZ1bCBmdW5jdGlvbiB0byBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhdCBvbmNlCisgKiBpcyBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpLiBUaGF0IGlzLAorICogbXVsdGlwbGUgdGhyZWFkcyBjYW4gbWFrZSBtZXRob2QgY2FsbHMgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiBJZiB5b3UgYXJlbid0IHVzaW5nIHRocmVhZHMsIHlvdSBjYW4gdXNlIGEgbWFpbiBsb29wIGFuZAorICogZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSgpIHRvIGFjaGlldmUgYSBzaW1pbGFyIHJlc3VsdC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ29ubmVjdGlvbkludGVybmFscyBEQnVzQ29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c0Nvbm5lY3Rpb24KKyAqCisgKiBAeworICovCisKKy8qKgorICogSW50ZXJuYWwgc3RydWN0IHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZmlsdGVyIGZ1bmN0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVzc2FnZUZpbHRlciBEQnVzTWVzc2FnZUZpbHRlcjsKKworLyoqCisgKiBJbnRlcm5hbCBzdHJ1Y3QgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSBmaWx0ZXIgZnVuY3Rpb24gCisgKi8KK3N0cnVjdCBEQnVzTWVzc2FnZUZpbHRlcgoreworICBEQnVzQXRvbWljIHJlZmNvdW50OyAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uIGZ1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGNhbGwgdG8gZmlsdGVyICovCisgIHZvaWQgKnVzZXJfZGF0YTsgLyoqPCBVc2VyIGRhdGEgZm9yIHRoZSBmdW5jdGlvbiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgdGhlIHVzZXIgZGF0YSAqLworfTsKKworCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzUHJlYWxsb2NhdGVkU2VuZAorICovCitzdHJ1Y3QgREJ1c1ByZWFsbG9jYXRlZFNlbmQKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247IC8qKjwgQ29ubmVjdGlvbiB3ZSdkIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKi8KKyAgREJ1c0xpc3QgKnF1ZXVlX2xpbms7ICAgICAgIC8qKjwgUHJlYWxsb2NhdGVkIGxpbmsgaW4gdGhlIHF1ZXVlICovCisgIERCdXNMaXN0ICpjb3VudGVyX2xpbms7ICAgICAvKio8IFByZWFsbG9jYXRlZCBsaW5rIGluIHRoZSByZXNvdXJjZSBjb3VudGVyICovCit9OworCisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorc3RhdGljIGRidXNfYm9vbF90IF9kYnVzX21vZGlmeV9zaWdwaXBlID0gRkFMU0U7CisjZWxzZQorc3RhdGljIGRidXNfYm9vbF90IF9kYnVzX21vZGlmeV9zaWdwaXBlID0gVFJVRTsKKyNlbmRpZgorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c0Nvbm5lY3Rpb24uIEFsbCBmaWVsZHMgYXJlIHByaXZhdGUuCisgKi8KK3N0cnVjdCBEQnVzQ29ubmVjdGlvbgoreworICBEQnVzQXRvbWljIHJlZmNvdW50OyAvKio8IFJlZmVyZW5jZSBjb3VudC4gKi8KKworICBEQnVzTXV0ZXggKm11dGV4OyAvKio8IExvY2sgb24gdGhlIGVudGlyZSBEQnVzQ29ubmVjdGlvbiAqLworCisgIERCdXNNdXRleCAqZGlzcGF0Y2hfbXV0ZXg7ICAgICAvKio8IFByb3RlY3RzIGRpc3BhdGNoX2FjcXVpcmVkICovCisgIERCdXNDb25kVmFyICpkaXNwYXRjaF9jb25kOyAgICAvKio8IE5vdGlmeSB3aGVuIGRpc3BhdGNoX2FjcXVpcmVkIGlzIGF2YWlsYWJsZSAqLworICBEQnVzTXV0ZXggKmlvX3BhdGhfbXV0ZXg7ICAgICAgLyoqPCBQcm90ZWN0cyBpb19wYXRoX2FjcXVpcmVkICovCisgIERCdXNDb25kVmFyICppb19wYXRoX2NvbmQ7ICAgICAvKio8IE5vdGlmeSB3aGVuIGlvX3BhdGhfYWNxdWlyZWQgaXMgYXZhaWxhYmxlICovCisgIAorICBEQnVzTGlzdCAqb3V0Z29pbmdfbWVzc2FnZXM7IC8qKjwgUXVldWUgb2YgbWVzc2FnZXMgd2UgbmVlZCB0byBzZW5kLCBzZW5kIHRoZSBlbmQgb2YgdGhlIGxpc3QgZmlyc3QuICovCisgIERCdXNMaXN0ICppbmNvbWluZ19tZXNzYWdlczsgLyoqPCBRdWV1ZSBvZiBtZXNzYWdlcyB3ZSBoYXZlIHJlY2VpdmVkLCBlbmQgb2YgdGhlIGxpc3QgcmVjZWl2ZWQgbW9zdCByZWNlbnRseS4gKi8KKworICBEQnVzTWVzc2FnZSAqbWVzc2FnZV9ib3Jyb3dlZDsgLyoqPCBGaWxsZWQgaW4gaWYgdGhlIGZpcnN0IGluY29taW5nIG1lc3NhZ2UgaGFzIGJlZW4gYm9ycm93ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRpc3BhdGNoX2FjcXVpcmVkIHdpbGwgYmUgc2V0IGJ5IHRoZSBib3Jyb3dlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICBpbnQgbl9vdXRnb2luZzsgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIG91dGdvaW5nIHF1ZXVlLiAqLworICBpbnQgbl9pbmNvbWluZzsgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIGluY29taW5nIHF1ZXVlLiAqLworCisgIERCdXNDb3VudGVyICpvdXRnb2luZ19jb3VudGVyOyAvKio8IENvdW50cyBzaXplIG9mIG91dGdvaW5nIG1lc3NhZ2VzLiAqLworICAKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OyAgICAvKio8IE9iamVjdCB0aGF0IHNlbmRzL3JlY2VpdmVzIG1lc3NhZ2VzIG92ZXIgbmV0d29yay4gKi8KKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsgICAgICAvKio8IFN0b3JlcyBhY3RpdmUgd2F0Y2hlcy4gKi8KKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0czsgICAvKio8IFN0b3JlcyBhY3RpdmUgdGltZW91dHMuICovCisgIAorICBEQnVzTGlzdCAqZmlsdGVyX2xpc3Q7ICAgICAgICAvKio8IExpc3Qgb2YgZmlsdGVycy4gKi8KKworICBEQnVzTXV0ZXggKnNsb3RfbXV0ZXg7ICAgICAgICAvKio8IExvY2sgb24gc2xvdF9saXN0IHNvIG92ZXJhbGwgY29ubmVjdGlvbiBsb2NrIG5lZWQgbm90IGJlIHRha2VuICovCisgIERCdXNEYXRhU2xvdExpc3Qgc2xvdF9saXN0OyAgIC8qKjwgRGF0YSBzdG9yZWQgYnkgYWxsb2NhdGVkIGludGVnZXIgSUQgKi8KKworICBEQnVzSGFzaFRhYmxlICpwZW5kaW5nX3JlcGxpZXM7ICAvKio8IEhhc2ggb2YgbWVzc2FnZSBzZXJpYWxzIHRvICNEQnVzUGVuZGluZ0NhbGwuICovICAKKyAgCisgIGRidXNfdWludDMyX3QgY2xpZW50X3NlcmlhbDsgICAgICAgLyoqPCBDbGllbnQgc2VyaWFsLiBJbmNyZW1lbnRzIGVhY2ggdGltZSBhIG1lc3NhZ2UgaXMgc2VudCAgKi8KKyAgREJ1c0xpc3QgKmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rOyAvKio8IFByZWFsbG9jYXRlZCBsaXN0IG5vZGUgZm9yIHF1ZXVlaW5nIHRoZSBkaXNjb25uZWN0aW9uIG1lc3NhZ2UgKi8KKworICBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uIHdha2V1cF9tYWluX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIHdha2UgdXAgdGhlIG1haW5sb29wICAqLworICB2b2lkICp3YWtldXBfbWFpbl9kYXRhOyAvKio8IEFwcGxpY2F0aW9uIGRhdGEgZm9yIHdha2V1cF9tYWluX2Z1bmN0aW9uICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV93YWtldXBfbWFpbl9kYXRhOyAvKio8IGZyZWUgd2FrZXVwX21haW5fZGF0YSAqLworCisgIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uIGRpc3BhdGNoX3N0YXR1c19mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiBvbiBkaXNwYXRjaCBzdGF0dXMgY2hhbmdlcyAgKi8KKyAgdm9pZCAqZGlzcGF0Y2hfc3RhdHVzX2RhdGE7IC8qKjwgQXBwbGljYXRpb24gZGF0YSBmb3IgZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kaXNwYXRjaF9zdGF0dXNfZGF0YTsgLyoqPCBmcmVlIGRpc3BhdGNoX3N0YXR1c19kYXRhICovCisKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIGxhc3RfZGlzcGF0Y2hfc3RhdHVzOyAvKio8IFRoZSBsYXN0IGRpc3BhdGNoIHN0YXR1cyB3ZSByZXBvcnRlZCB0byB0aGUgYXBwbGljYXRpb24uICovCisKKyAgREJ1c0xpc3QgKmxpbmtfY2FjaGU7IC8qKjwgQSBjYWNoZSBvZiBsaW5rZWQgbGlzdCBsaW5rcyB0byBwcmV2ZW50IGNvbnRlbnRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZm9yIHRoZSBnbG9iYWwgbGlua2VkIGxpc3QgbWVtcG9vbCBsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c09iamVjdFRyZWUgKm9iamVjdHM7IC8qKjwgT2JqZWN0IHBhdGggaGFuZGxlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY29ubmVjdGlvbiAqLworCisgIGNoYXIgKnNlcnZlcl9ndWlkOyAvKio8IEdVSUQgb2Ygc2VydmVyIGlmIHdlIGFyZSBpbiBzaGFyZWRfY29ubmVjdGlvbnMsICNOVUxMIGlmIHNlcnZlciBHVUlEIGlzIHVua25vd24gb3IgY29ubmVjdGlvbiBpcyBwcml2YXRlICovCisKKyAgLyogVGhlc2UgdHdvIE1VU1QgYmUgYm9vbHMgYW5kIG5vdCBiaXRmaWVsZHMsIGJlY2F1c2UgdGhleSBhcmUgcHJvdGVjdGVkIGJ5IGEgc2VwYXJhdGUgbG9jaworICAgKiBmcm9tIGNvbm5lY3Rpb24tPm11dGV4IGFuZCBhbGwgYml0ZmllbGRzIGluIGEgd29yZCBoYXZlIHRvIGJlIHJlYWQvd3JpdHRlbiB0b2dldGhlci4KKyAgICogU28geW91IGNhbid0IGhhdmUgYSBkaWZmZXJlbnQgbG9jayBmb3IgZGlmZmVyZW50IGJpdGZpZWxkcyBpbiB0aGUgc2FtZSB3b3JkLgorICAgKi8KKyAgZGJ1c19ib29sX3QgZGlzcGF0Y2hfYWNxdWlyZWQ7IC8qKjwgU29tZW9uZSBoYXMgZGlzcGF0Y2ggcGF0aCAoY2FuIGRyYWluIGluY29taW5nIHF1ZXVlKSAqLworICBkYnVzX2Jvb2xfdCBpb19wYXRoX2FjcXVpcmVkOyAgLyoqPCBTb21lb25lIGhhcyB0cmFuc3BvcnQgaW8gcGF0aCAoY2FuIHVzZSB0aGUgdHJhbnNwb3J0IHRvIHJlYWQvd3JpdGUgbWVzc2FnZXMpICovCisgIAorICB1bnNpZ25lZCBpbnQgc2hhcmVhYmxlIDogMTsgLyoqPCAjVFJVRSBpZiBsaWJkYnVzIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24gYW5kIGNhbiByZXR1cm4gaXQgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIG1vcmUgdGhhbiBvbmNlICovCisgIAorICB1bnNpZ25lZCBpbnQgZXhpdF9vbl9kaXNjb25uZWN0IDogMTsgLyoqPCBJZiAjVFJVRSwgZXhpdCBhZnRlciBoYW5kbGluZyBkaXNjb25uZWN0IHNpZ25hbCAqLworCisgIHVuc2lnbmVkIGludCByb3V0ZV9wZWVyX21lc3NhZ2VzIDogMTsgLyoqPCBJZiAjVFJVRSwgaWYgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciBtZXNzYWdlcyBoYXZlIGEgYnVzIG5hbWUsIGRvbid0IGhhbmRsZSB0aGVtIGF1dG9tYXRpY2FsbHkgKi8KKworICB1bnNpZ25lZCBpbnQgZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZCA6IDE7ICAgLyoqPCBXZSBwb3BwZWQgb3IgYXJlIGRpc3BhdGNoaW5nIHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIHRoZSBkaXNjb25uZWN0X21lc3NhZ2VfbGluayBpcyBOVUxMIHRoZW4gd2UgcXVldWVkIGl0LCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgZmxhZyBpcyB3aGV0aGVyIGl0IGdvdCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZCA6IDE7IC8qKjwgV2UgZGlkIG91ciBkZWZhdWx0IGhhbmRsaW5nIG9mIHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1Y2ggYXMgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICB1bnNpZ25lZCBpbnQgaGF2ZV9jb25uZWN0aW9uX2xvY2sgOiAxOyAvKio8IFVzZWQgdG8gY2hlY2sgbG9ja2luZyAqLworI2VuZGlmCisgIAorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGludCBnZW5lcmF0aW9uOyAvKio8IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiB0aGF0IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoaXMgY29ubmVjdGlvbiAqLworI2VuZGlmIAorfTsKKworc3RhdGljIERCdXNEaXNwYXRjaFN0YXR1cyBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyAgbmV3X3N0YXR1cyk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbGFzdF91bnJlZiAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgREJ1c0Rpc3BhdGNoU3RhdHVzIF9kYnVzX2Nvbm5lY3Rpb25fZmx1c2hfdW5sb2NrZWQgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZF9hbmRfdW5sb2NrICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcGVla19mb3JfcmVwbHlfdW5sb2NrZWQgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIGNsaWVudF9zZXJpYWwpOworCitzdGF0aWMgREJ1c01lc3NhZ2VGaWx0ZXIgKgorX2RidXNfbWVzc2FnZV9maWx0ZXJfcmVmIChEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyKQoreworICBfZGJ1c19hc3NlcnQgKGZpbHRlci0+cmVmY291bnQudmFsdWUgPiAwKTsKKyAgX2RidXNfYXRvbWljX2luYyAoJmZpbHRlci0+cmVmY291bnQpOworCisgIHJldHVybiBmaWx0ZXI7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19tZXNzYWdlX2ZpbHRlcl91bnJlZiAoREJ1c01lc3NhZ2VGaWx0ZXIgKmZpbHRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChmaWx0ZXItPnJlZmNvdW50LnZhbHVlID4gMCk7CisKKyAgaWYgKF9kYnVzX2F0b21pY19kZWMgKCZmaWx0ZXItPnJlZmNvdW50KSA9PSAxKQorICAgIHsKKyAgICAgIGlmIChmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uKQorICAgICAgICAoKiBmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uKSAoZmlsdGVyLT51c2VyX2RhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGZpbHRlcik7CisgICAgfQorfQorCisvKioKKyAqIEFjcXVpcmVzIHRoZSBjb25uZWN0aW9uIGxvY2suCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fbG9jayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogUmVsZWFzZXMgdGhlIGNvbm5lY3Rpb24gbG9jay4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogV2FrZXMgdXAgdGhlIG1haW4gbG9vcCBpZiBpdCBpcyBzbGVlcGluZworICogTmVlZGVkIGlmIHdlJ3JlIGUuZy4gcXVldWVpbmcgb3V0Z29pbmcgbWVzc2FnZXMKKyAqIG9uIGEgdGhyZWFkIHdoaWxlIHRoZSBtYWlubG9vcCBzbGVlcHMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGlmIChjb25uZWN0aW9uLT53YWtldXBfbWFpbl9mdW5jdGlvbikKKyAgICAoKmNvbm5lY3Rpb24tPndha2V1cF9tYWluX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZGF0YSk7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKiBGb3Igbm93IHRoaXMgZnVuY3Rpb24gaXNuJ3QgdXNlZCAqLworLyoqCisgKiBBZGRzIGEgbWVzc2FnZSB0byB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwgcmV0dXJuaW5nICNGQUxTRQorICogaWYgdGhlcmUncyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHF1ZXVlIHRoZSBtZXNzYWdlLgorICogRG9lcyBub3QgdGFrZSBvdmVyIHJlZmNvdW50IG9mIHRoZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gcXVldWUuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKG1lc3NhZ2UpOworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKyAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmsgKGNvbm5lY3Rpb24sIGxpbmspOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIGxvY2tzIHNvIHdlIGNhbiBleGFtaW5lIHRoZW0KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBtdXRleF9sb2MgcmV0dXJuIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlIG1haW4gbXV0ZXggcG9pbnRlcgorICogQHBhcmFtIGRpc3BhdGNoX211dGV4X2xvYyByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGRpc3BhdGNoIG11dGV4IHBvaW50ZXIKKyAqIEBwYXJhbSBpb19wYXRoX211dGV4X2xvYyByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGlvX3BhdGggbXV0ZXggcG9pbnRlcgorICogQHBhcmFtIGRpc3BhdGNoX2NvbmRfbG9jIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZGlzcGF0Y2ggY29uZGl0aW9uYWwgCisgKiAgICAgICAgdmFyaWFibGUgcG9pbnRlcgorICogQHBhcmFtIGlvX3BhdGhfY29uZF9sb2MgcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBpb19wYXRoIGNvbmRpdGlvbmFsIAorICogICAgICAgIHZhcmlhYmxlIHBvaW50ZXIKKyAqLyAKK3ZvaWQgCitfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICAgKiptdXRleF9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAgICoqZGlzcGF0Y2hfbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgICAqKmlvX3BhdGhfbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvbmRWYXIgICAqKmRpc3BhdGNoX2NvbmRfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvbmRWYXIgICAqKmlvX3BhdGhfY29uZF9sb2MpCit7CisgICptdXRleF9sb2MgPSBjb25uZWN0aW9uLT5tdXRleDsKKyAgKmRpc3BhdGNoX211dGV4X2xvYyA9IGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4OworICAqaW9fcGF0aF9tdXRleF9sb2MgPSBjb25uZWN0aW9uLT5pb19wYXRoX211dGV4OyAKKyAgKmRpc3BhdGNoX2NvbmRfbG9jID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZDsKKyAgKmlvX3BhdGhfY29uZF9sb2MgPSBjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQ7Cit9CisjZW5kaWYKKworLyoqCisgKiBBZGRzIGEgbWVzc2FnZS1jb250YWluaW5nIGxpc3QgbGluayB0byB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwKKyAqIHRha2luZyBvd25lcnNoaXAgb2YgdGhlIGxpbmsgYW5kIHRoZSBtZXNzYWdlJ3MgY3VycmVudCByZWZjb3VudC4KKyAqIENhbm5vdCBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBsaW5rIHRoZSBtZXNzYWdlIGxpbmsgdG8gcXVldWUuCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICpsaW5rKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKTsKKyAgCisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgIG1lc3NhZ2UgPSBsaW5rLT5kYXRhOworCisgIC8qIElmIHRoaXMgaXMgYSByZXBseSB3ZSdyZSB3YWl0aW5nIG9uLCByZW1vdmUgdGltZW91dCBmb3IgaXQgKi8KKyAgcmVwbHlfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworICBpZiAocmVwbHlfc2VyaWFsICE9IDApCisgICAgeworICAgICAgcGVuZGluZyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfc2VyaWFsKTsKKyAgICAgIGlmIChwZW5kaW5nICE9IE5VTEwpCisJeworCSAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKworCSAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7CisJfQorICAgIH0KKyAgCisgIAorCisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgKz0gMTsKKworICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCAoJXMgJXMgJXMgJXMgJyVzJyByZXBseSB0byAldSkgYWRkZWQgdG8gaW5jb21pbmcgcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7fQorCisvKioKKyAqIEFkZHMgYSBsaW5rICsgbWVzc2FnZSB0byB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqIENhbid0IGZhaWwuIFRha2VzIG93bmVyc2hpcCBvZiBib3RoIGxpbmsgYW5kIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gbGluayB0aGUgbGlzdCBub2RlIGFuZCBtZXNzYWdlIHRvIHF1ZXVlLgorICoKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9zeW50aGVzaXplZF9tZXNzYWdlX2xpbmsgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkJIERCdXNMaXN0ICpsaW5rKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKworICBjb25uZWN0aW9uLT5uX2luY29taW5nICs9IDE7CisKKyAgX2RidXNfY29ubmVjdGlvbl93YWtldXBfbWFpbmxvb3AgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoIlN5bnRoZXNpemVkIG1lc3NhZ2UgJXAgYWRkZWQgdG8gaW5jb21pbmcgcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICBsaW5rLT5kYXRhLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKK30KKworCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGFyZSBtZXNzYWdlcyBpbiB0aGUgb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqIENhbGxlZCB3aXRoIGNvbm5lY3Rpb24gbG9jayBoZWxkLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG91dGdvaW5nIHF1ZXVlIGlzIG5vbi1lbXB0eS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMgIT0gTlVMTDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBhcmUgbWVzc2FnZXMgaW4gdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUuCisgKiBVc2UgZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkgdG8gYmxvY2sgdW50aWwgYWxsIG91dGdvaW5nCisgKiBtZXNzYWdlcyBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAqIChzdWNoIGFzIGEgc29ja2V0KS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgb3V0Z29pbmcgcXVldWUgaXMgbm9uLWVtcHR5LgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgdjsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgdiA9IF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbmV4dCBvdXRnb2luZyBtZXNzYWdlLiBUaGUgbWVzc2FnZSByZW1haW5zIGluIHRoZQorICogcXVldWUsIGFuZCB0aGUgY2FsbGVyIGRvZXMgbm90IG93biBhIHJlZmVyZW5jZSB0byBpdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQuCisgKi8gCitEQnVzTWVzc2FnZSoKK19kYnVzX2Nvbm5lY3Rpb25fZ2V0X21lc3NhZ2VfdG9fc2VuZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gX2RidXNfbGlzdF9nZXRfbGFzdCAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzKTsKK30KKworLyoqCisgKiBOb3RpZmllcyB0aGUgY29ubmVjdGlvbiB0aGF0IGEgbWVzc2FnZSBoYXMgYmVlbiBzZW50LCBzbyB0aGUKKyAqIG1lc3NhZ2UgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0Z29pbmcgcXVldWUuCisgKiBDYWxsZWQgd2l0aCB0aGUgY29ubmVjdGlvbiBsb2NrIGhlbGQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0aGF0IHdhcyBzZW50LgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICAvKiBUaGlzIGNhbiBiZSBjYWxsZWQgYmVmb3JlIHdlIGV2ZW4gY29tcGxldGUgYXV0aGVudGljYXRpb24sIHNpbmNlCisgICAqIGl0J3MgY2FsbGVkIG9uIGRpc2Nvbm5lY3QgdG8gY2xlYW4gdXAgdGhlIG91dGdvaW5nIHF1ZXVlLgorICAgKiBJdCdzIGFsc28gY2FsbGVkIGFzIHdlIHN1Y2Nlc3NmdWxseSBzZW5kIGVhY2ggbWVzc2FnZS4KKyAgICovCisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMpOworICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGluay0+ZGF0YSA9PSBtZXNzYWdlKTsKKworICAvKiBTYXZlIHRoaXMgbGluayBpbiB0aGUgbGluayBjYWNoZSAqLworICBfZGJ1c19saXN0X3VubGluayAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+bGlua19jYWNoZSwgbGluayk7CisgIAorICBjb25uZWN0aW9uLT5uX291dGdvaW5nIC09IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzICclcycpIHJlbW92ZWQgZnJvbSBvdXRnb2luZyBxdWV1ZSAlcCwgJWQgbGVmdCB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcpOworCisgIC8qIFNhdmUgdGhpcyBsaW5rIGluIHRoZSBsaW5rIGNhY2hlIGFsc28gKi8KKyAgX2RidXNfbWVzc2FnZV9yZW1vdmVfY291bnRlciAobWVzc2FnZSwgY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmspOworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmNvbm5lY3Rpb24tPmxpbmtfY2FjaGUsIGxpbmspOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKK30KKworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEFkZEZ1bmN0aW9uKSAgICAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoKTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzV2F0Y2hSZW1vdmVGdW5jdGlvbikgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoVG9nZ2xlRnVuY3Rpb24pICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGVuYWJsZWQpOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKERCdXNDb25uZWN0aW9uICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEFkZEZ1bmN0aW9uICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIFRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3YXMgdG8gaG9sZCBhCisgICAqIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBsb2NrLCB0aGVuCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAuICBUaGlzIHdhcyBhIGJyb2tlbiBoYWNrIHRoYXQgZGlkIG5vdAorICAgKiB3b3JrLCBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgaW4gYSBob3NlZCBzdGF0ZSAobm8gV2F0Y2hMaXN0CisgICAqIGZpZWxkKSB3aGlsZSBjYWxsaW5nIG91dC4KKyAgICoKKyAgICogU28gZm9yIG5vdyB3ZSdsbCBqdXN0IGtlZXAgdGhlIGxvY2sgd2hpbGUgY2FsbGluZyBvdXQuIFRoaXMgbWVhbnMKKyAgICogYXBwcyBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCBEQnVzQ29ubmVjdGlvbiBtZXRob2RzIGluc2lkZSBhCisgICAqIHdhdGNoIGZ1bmN0aW9uIG9yIHRoZXkgd2lsbCBkZWFkbG9jay4KKyAgICoKKyAgICogVGhlICJyZWFsIGZpeCIgaXMgdG8gdXNlIHRoZSBfYW5kX3VubG9jaygpIHBhdHRlcm4gZm91bmQKKyAgICogZWxzZXdoZXJlIGluIHRoZSBjb2RlLCB0byBkZWZlciBjYWxsaW5nIG91dCB0byB0aGUgYXBwIHVudGlsCisgICAqIHdlJ3JlIGFib3V0IHRvIGRyb3AgbG9ja3MgYW5kIHJldHVybiBmbG93IG9mIGNvbnRyb2wgdG8gdGhlIGFwcAorICAgKiBhbnl3YXkuCisgICAqCisgICAqIFNlZSBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNy1KdWx5L3RocmVhZC5odG1sIzgxNDQKKyAgICovCisKKyAgaWYgKGNvbm5lY3Rpb24tPndhdGNoZXMpCisgICAgeworICAgICAgaWYgKGFkZF9mdW5jdGlvbikKKyAgICAgICAgcmV0dmFsID0gKCogYWRkX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2F0Y2hlcywgd2F0Y2gpOworICAgICAgZWxzZSBpZiAocmVtb3ZlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pIChjb25uZWN0aW9uLT53YXRjaGVzLCB3YXRjaCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogdG9nZ2xlX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2F0Y2hlcywgd2F0Y2gsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKyAgICAgCisKKy8qKgorICogQWRkcyBhIHdhdGNoIHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c0FkZFdhdGNoRnVuY3Rpb24gaWYKKyAqIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIHJlY29yZHMgdGhlIHdhdGNoIHRvIGJlIGFkZGVkIHdoZW4gc2FpZAorICogZnVuY3Rpb24gaXMgYXZhaWxhYmxlLiBBbHNvIHJlLWFkZHMgdGhlIHdhdGNoIGlmIHRoZQorICogREJ1c0FkZFdhdGNoRnVuY3Rpb24gY2hhbmdlcy4gTWF5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byBhZGQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCkKK3sKKyAgcmV0dXJuIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKGNvbm5lY3Rpb24sIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHdhdGNoIHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24KKyAqIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSB3YXRjaAorICogdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKiBDb25uZWN0aW9uIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoY29ubmVjdGlvbiwgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogVG9nZ2xlcyBhIHdhdGNoIGFuZCBub3RpZmllcyBhcHAgdmlhIGNvbm5lY3Rpb24ncworICogREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIG9uIGEgd2F0Y2ggdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKiBDb25uZWN0aW9uIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZW5hYmxlZCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCAhPSBOVUxMKTsKKworICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChjb25uZWN0aW9uLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOworfQorCisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGltZW91dEFkZEZ1bmN0aW9uKSAgICAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24pIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbikgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgZW5hYmxlZCk7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRBZGRGdW5jdGlvbiAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24gcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICBlbmFibGVkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBUaGUgb3JpZ2luYWwgcHVycG9zZSBvZiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3YXMgdG8gaG9sZCBhCisgICAqIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBsb2NrLCB0aGVuCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAuICBUaGlzIHdhcyBhIGJyb2tlbiBoYWNrIHRoYXQgZGlkIG5vdAorICAgKiB3b3JrLCBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgaW4gYSBob3NlZCBzdGF0ZSAobm8gVGltZW91dExpc3QKKyAgICogZmllbGQpIHdoaWxlIGNhbGxpbmcgb3V0LgorICAgKgorICAgKiBTbyBmb3Igbm93IHdlJ2xsIGp1c3Qga2VlcCB0aGUgbG9jayB3aGlsZSBjYWxsaW5nIG91dC4gVGhpcyBtZWFucworICAgKiBhcHBzIGFyZSBub3QgYWxsb3dlZCB0byBjYWxsIERCdXNDb25uZWN0aW9uIG1ldGhvZHMgaW5zaWRlIGEKKyAgICogdGltZW91dCBmdW5jdGlvbiBvciB0aGV5IHdpbGwgZGVhZGxvY2suCisgICAqCisgICAqIFRoZSAicmVhbCBmaXgiIGlzIHRvIHVzZSB0aGUgX2FuZF91bmxvY2soKSBwYXR0ZXJuIGZvdW5kCisgICAqIGVsc2V3aGVyZSBpbiB0aGUgY29kZSwgdG8gZGVmZXIgY2FsbGluZyBvdXQgdG8gdGhlIGFwcCB1bnRpbAorICAgKiB3ZSdyZSBhYm91dCB0byBkcm9wIGxvY2tzIGFuZCByZXR1cm4gZmxvdyBvZiBjb250cm9sIHRvIHRoZSBhcHAKKyAgICogYW55d2F5LgorICAgKgorICAgKiBTZWUgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDctSnVseS90aHJlYWQuaHRtbCM4MTQ0CisgICAqLworCisgIGlmIChjb25uZWN0aW9uLT50aW1lb3V0cykKKyAgICB7CisgICAgICBpZiAoYWRkX2Z1bmN0aW9uKQorICAgICAgICByZXR2YWwgPSAoKiBhZGRfZnVuY3Rpb24pIChjb25uZWN0aW9uLT50aW1lb3V0cywgdGltZW91dCk7CisgICAgICBlbHNlIGlmIChyZW1vdmVfZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHJlbW92ZV9mdW5jdGlvbikgKGNvbm5lY3Rpb24tPnRpbWVvdXRzLCB0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiB0b2dnbGVfZnVuY3Rpb24pIChjb25uZWN0aW9uLT50aW1lb3V0cywgdGltZW91dCwgZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFkZHMgYSB0aW1lb3V0IHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBpZgorICogYXZhaWxhYmxlLiBPdGhlcndpc2UgcmVjb3JkcyB0aGUgdGltZW91dCB0byBiZSBhZGRlZCB3aGVuIHNhaWQKKyAqIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZS4gQWxzbyByZS1hZGRzIHRoZSB0aW1lb3V0IGlmIHRoZQorICogREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBjaGFuZ2VzLiBNYXkgZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgKiBUaGUgdGltZW91dCB3aWxsIGZpcmUgcmVwZWF0ZWRseSB1bnRpbCByZW1vdmVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gYWRkLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fYWRkX3RpbWVvdXRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQpCit7CisgIHJldHVybiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKGNvbm5lY3Rpb24sIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9hZGRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB0aW1lb3V0IHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbgorICogaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhIHRpbWVvdXQKKyAqIHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICp0aW1lb3V0KQoreworICBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKGNvbm5lY3Rpb24sIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFRvZ2dsZXMgYSB0aW1lb3V0IGFuZCBub3RpZmllcyBhcHAgdmlhIGNvbm5lY3Rpb24ncworICogREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gb24gYSB0aW1lb3V0IHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGVuYWJsZWQpCit7CisgIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoY29ubmVjdGlvbiwgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF90b2dnbGVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2F0dGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICByZXBseV9zZXJpYWwgPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAocGVuZGluZyk7CisKKyAgX2RidXNfYXNzZXJ0IChyZXBseV9zZXJpYWwgIT0gMCk7CisKKyAgdGltZW91dCA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZyk7CisKKyAgaWYgKHRpbWVvdXQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLCB0aW1lb3V0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHRpbWVvdXQpOworCisgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7CisgICAgICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBUUlVFKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcGVuZGluZ19jYWxsX29uX2hhc2hfcmVtb3ZhbCAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb247CisgIAorICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBwZW5kaW5nID0gZGF0YTsKKworICBjb25uZWN0aW9uID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX3VubG9ja2VkIChwZW5kaW5nKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgICAgICAKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworICAgIH0KKworICAvKiBGSVhNRSAxLjA/IHRoaXMgaXMgc29ydCBvZiBkYW5nZXJvdXMgYW5kIHVuZGVzaXJhYmxlIHRvIGRyb3AgdGhlIGxvY2sgCisgICAqIGhlcmUsIGJ1dCB0aGUgcGVuZGluZyBjYWxsIGZpbmFsaXplciBjb3VsZCBpbiBwcmluY2lwbGUgY2FsbCBvdXQgdG8gCisgICAqIGFwcGxpY2F0aW9uIGNvZGUgc28gd2UgcHJldHR5IG11Y2ggaGF2ZSB0by4uLiBzb21lIGxhcmdlciBjb2RlIHJlb3JnIAorICAgKiBtaWdodCBiZSBuZWVkZWQuCisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICAvKiBUaGlzIGVuZHMgdXAgdW5sb2NraW5nIHRvIGNhbGwgdGhlIHBlbmRpbmcgY2FsbCBmaW5hbGl6ZXIsIHdoaWNoIGlzIHVuZXhwZWN0ZWQgdG8KKyAgICogc2F5IHRoZSBsZWFzdC4KKyAgICovCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgLyogVGhlIGlkZWEgaGVyZSBpcyB0byBhdm9pZCBmaW5hbGl6aW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAgICogd2l0aCB0aGUgbG9jayBoZWxkLCBzaW5jZSB0aGVyZSdzIGEgZGVzdHJveSBub3RpZmllcgorICAgKiBpbiBwZW5kaW5nIGNhbGwgdGhhdCBnb2VzIG91dCB0byBhcHBsaWNhdGlvbiBjb2RlLgorICAgKgorICAgKiBUaGVyZSdzIGFuIGV4dHJhIHVubG9jayBpbnNpZGUgdGhlIGhhc2ggdGFibGUKKyAgICogImZyZWUgcGVuZGluZyBjYWxsIiBmdW5jdGlvbiBGSVhNRS4uLgorICAgKi8KKyAgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAocGVuZGluZyk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSk7CisKKyAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZykpOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgcGVuZGluZyBjYWxsIGZyb20gdGhlIGNvbm5lY3Rpb24sIHN1Y2ggdGhhdAorICogdGhlIHBlbmRpbmcgcmVwbHkgd2lsbCBiZSBpZ25vcmVkLiBNYXkgZHJvcCB0aGUgbGFzdAorICogcmVmZXJlbmNlIHRvIHRoZSBwZW5kaW5nIGNhbGwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfcGVuZGluZ19jYWxsIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHBlbmRpbmcpOworfQorCisvKioKKyAqIEFjcXVpcmUgdGhlIHRyYW5zcG9ydGVyIEkvTyBwYXRoLiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAqIGRvaW5nIGFueSBJL08gaW4gdGhlIHRyYW5zcG9ydGVyLiBNYXkgc2xlZXAgYW5kIGRyb3AgdGhlCisgKiBJTyBwYXRoIG11dGV4IHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBJL08gcGF0aC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBtYXhpbXVtIGJsb2NraW5nIHRpbWUsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIEkvTyBwYXRoIHdhcyBhY3F1aXJlZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIGRidXNfYm9vbF90IHdlX2FjcXVpcmVkOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBXZSBkb24ndCB3YW50IHRoZSBjb25uZWN0aW9uIHRvIHZhbmlzaCAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogV2Ugd2lsbCBvbmx5IHRvdWNoIGlvX3BhdGhfYWNxdWlyZWQgd2hpY2ggaXMgcHJvdGVjdGVkIGJ5IG91ciBtdXRleCAqLworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgibG9ja2luZyBpb19wYXRoX211dGV4XG4iKTsKKyAgX2RidXNfbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0IGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQgPSAlZCB0aW1lb3V0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKworICB3ZV9hY3F1aXJlZCA9IEZBTFNFOworICAKKyAgaWYgKGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpCisgICAgeworICAgICAgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIndhaXRpbmcgJWQgZm9yIElPIHBhdGggdG8gYmUgYWNxdWlyYWJsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2NvbmR2YXJfd2FpdF90aW1lb3V0IChjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdlIHRpbWVkIG91dCBiZWZvcmUgYW55b25lIHNpZ25hbGVkLiAqLworICAgICAgICAgICAgICAvKiAod3JpdGluZyB0aGUgbG9vcCB0byBoYW5kbGUgdGhlICF0aW1lZG91dCBjYXNlIGJ5CisgICAgICAgICAgICAgICAqIHdhaXRpbmcgbG9uZ2VyIGlmIG5lZWRlZCBpcyBhIHBhaW4gc2luY2UgZGJ1cworICAgICAgICAgICAgICAgKiB3cmFwcyBwdGhyZWFkX2NvbmRfdGltZWR3YWl0IHRvIHRha2UgYSByZWxhdGl2ZQorICAgICAgICAgICAgICAgKiB0aW1lIGluc3RlYWQgb2YgYWJzb2x1dGUsIHNvbWV0aGluZyBraW5kIG9mIHN0dXBpZAorICAgICAgICAgICAgICAgKiBvbiBvdXIgcGFydC4gZm9yIG5vdyBpdCBkb2Vzbid0IG1hdHRlciwgd2Ugd2lsbCBqdXN0CisgICAgICAgICAgICAgICAqIGVuZCB1cCBiYWNrIGhlcmUgZXZlbnR1YWxseS4pCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3aGlsZSAoY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIndhaXRpbmcgZm9yIElPIHBhdGggdG8gYmUgYWNxdWlyYWJsZVxuIik7CisgICAgICAgICAgICAgIF9kYnVzX2NvbmR2YXJfd2FpdCAoY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgCisgIGlmICghY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCkKKyAgICB7CisgICAgICB3ZV9hY3F1aXJlZCA9IFRSVUU7CisgICAgICBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gVFJVRTsKKyAgICB9CisgIAorICBfZGJ1c192ZXJib3NlICgiZW5kIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQgPSAlZCB3ZV9hY3F1aXJlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkLCB3ZV9hY3F1aXJlZCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInVubG9ja2luZyBpb19wYXRoX211dGV4XG4iKTsKKyAgX2RidXNfbXV0ZXhfdW5sb2NrIChjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiB3ZV9hY3F1aXJlZDsKK30KKworLyoqCisgKiBSZWxlYXNlIHRoZSBJL08gcGF0aCB3aGVuIHlvdSdyZSBkb25lIHdpdGggaXQuIE9ubHkgY2FsbAorICogYWZ0ZXIgeW91J3ZlIGFjcXVpcmVkIHRoZSBJL08uIFdha2VzIHVwIGF0IG1vc3Qgb25lIHRocmVhZAorICogY3VycmVudGx5IHdhaXRpbmcgdG8gYWNxdWlyZSB0aGUgSS9PIHBhdGguCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfaW9fcGF0aCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgibG9ja2luZyBpb19wYXRoX211dGV4XG4iKTsKKyAgX2RidXNfbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgIAorICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydCBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpOworICAKKyAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9IEZBTFNFOworICBfZGJ1c19jb25kdmFyX3dha2Vfb25lIChjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tpbmcgaW9fcGF0aF9tdXRleFxuIik7CisgIF9kYnVzX211dGV4X3VubG9jayAoY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7Cit9CisKKy8qKgorICogUXVldWVzIGluY29taW5nIG1lc3NhZ2VzIGFuZCBzZW5kcyBvdXRnb2luZyBtZXNzYWdlcyBmb3IgdGhpcworICogY29ubmVjdGlvbiwgb3B0aW9uYWxseSBibG9ja2luZyBpbiB0aGUgcHJvY2Vzcy4gRWFjaCBjYWxsIHRvCisgKiBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCgpIHdpbGwgY2FsbCBzZWxlY3QoKSBvciBwb2xsKCkgb25lCisgKiB0aW1lIGFuZCB0aGVuIHJlYWQgb3Igd3JpdGUgZGF0YSBpZiBwb3NzaWJsZS4KKyAqCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGFibGUgdG8gZmx1c2ggb3V0Z29pbmcKKyAqIG1lc3NhZ2VzIG9yIHF1ZXVlIHVwIGluY29taW5nIG1lc3NhZ2VzIHdpdGhvdXQgcmV0dXJuaW5nCisgKiBjb250cm9sIHRvIHRoZSBhcHBsaWNhdGlvbiBhbmQgY2F1c2luZyByZWVudHJhbmN5IHdlaXJkbmVzcy4KKyAqCisgKiBUaGUgZmxhZ3MgcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGV0aGVyIHRvCisgKiByZWFkIGluY29taW5nIG1lc3NhZ2VzLCB3cml0ZSBvdXRnb2luZyBtZXNzYWdlcywgb3IgYm90aCwKKyAqIGFuZCB3aGV0aGVyIHRvIGJsb2NrIGlmIG5vIGltbWVkaWF0ZSBhY3Rpb24gaXMgcG9zc2libGUuCisgKgorICogVGhlIHRpbWVvdXRfbWlsbGlzZWNvbmRzIHBhcmFtZXRlciBkb2VzIG5vdGhpbmcgdW5sZXNzIHRoZQorICogaXRlcmF0aW9uIGlzIGJsb2NraW5nLgorICoKKyAqIElmIHRoZXJlIGFyZSBubyBvdXRnb2luZyBtZXNzYWdlcyBhbmQgREJVU19JVEVSQVRJT05fRE9fUkVBRElORworICogd2Fzbid0IHNwZWNpZmllZCwgdGhlbiBpdCdzIGltcG9zc2libGUgdG8gYmxvY2ssIGV2ZW4gaWYKKyAqIHlvdSBzcGVjaWZ5IERCVVNfSVRFUkFUSU9OX0JMT0NLOyBpbiB0aGF0IGNhc2UgdGhlIGZ1bmN0aW9uCisgKiByZXR1cm5zIGltbWVkaWF0ZWx5LgorICoKKyAqIElmIHBlbmRpbmcgaXMgbm90IE5VTEwgdGhlbiBhIGNoZWNrIGlzIG1hZGUgaWYgdGhlIHBlbmRpbmcgY2FsbAorICogaXMgY29tcGxldGVkIGFmdGVyIHRoZSBpbyBwYXRoIGhhcyBiZWVuIHJlcXVpcmVkLiBJZiB0aGUgY2FsbAorICogaGFzIGJlZW4gY29tcGxldGVkIG5vdGhpbmcgaXMgZG9uZS4gVGhpcyBtdXN0IGJlIGRvbmUgc2luY2UKKyAqIHRoZSBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCByZWxlYXNlcyB0aGUgY29ubmVjdGlvbgorICogbG9jayBmb3IgYSB3aGlsZS4KKyAqCisgKiBDYWxsZWQgd2l0aCBjb25uZWN0aW9uIGxvY2sgaGVsZC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgb3IgTlVMTAorICogQHBhcmFtIGZsYWdzIGl0ZXJhdGlvbiBmbGFncy4KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBtYXhpbXVtIGJsb2NraW5nIHRpbWUsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIGlmIChjb25uZWN0aW9uLT5uX291dGdvaW5nID09IDApCisgICAgZmxhZ3MgJj0gfkRCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkc7CisKKyAgaWYgKF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoIChjb25uZWN0aW9uLAorCQkJCQkoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9CTE9DSykgPyB0aW1lb3V0X21pbGxpc2Vjb25kcyA6IDApKQorICAgIHsKKyAgICAgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIGlmICggKHBlbmRpbmcgIT0gTlVMTCkgJiYgX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQocGVuZGluZykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicGVuZGluZyBjYWxsIGNvbXBsZXRlZCB3aGlsZSBhY3F1aXJpbmcgSS9PIHBhdGgiKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIChwZW5kaW5nICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9wZWVrX2Zvcl9yZXBseV91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAocGVuZGluZykpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInBlbmRpbmcgY2FsbCBjb21wbGV0ZWQgd2hpbGUgYWNxdWlyaW5nIEkvTyBwYXRoIChyZXBseSBmb3VuZCBpbiBxdWV1ZSkiKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2RvX2l0ZXJhdGlvbiAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2lvX3BhdGggKGNvbm5lY3Rpb24pOworICAgIH0KKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhlIGdpdmVuIHRyYW5zcG9ydC4gIEEgdHJhbnNwb3J0CisgKiByZXByZXNlbnRzIGEgbWVzc2FnZSBzdHJlYW0gdGhhdCB1c2VzIHNvbWUgY29uY3JldGUgbWVjaGFuaXNtLCBzdWNoCisgKiBhcyBVTklYIGRvbWFpbiBzb2NrZXRzLiBNYXkgcmV0dXJuICNOVUxMIGlmIGluc3VmZmljaWVudAorICogbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHJldHVybnMgdGhlIG5ldyBjb25uZWN0aW9uLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzQ29ubmVjdGlvbioKK19kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNXYXRjaExpc3QgKndhdGNoX2xpc3Q7CisgIERCdXNUaW1lb3V0TGlzdCAqdGltZW91dF9saXN0OworICBEQnVzSGFzaFRhYmxlICpwZW5kaW5nX3JlcGxpZXM7CisgIERCdXNMaXN0ICpkaXNjb25uZWN0X2xpbms7CisgIERCdXNNZXNzYWdlICpkaXNjb25uZWN0X21lc3NhZ2U7CisgIERCdXNDb3VudGVyICpvdXRnb2luZ19jb3VudGVyOworICBEQnVzT2JqZWN0VHJlZSAqb2JqZWN0czsKKyAgCisgIHdhdGNoX2xpc3QgPSBOVUxMOworICBjb25uZWN0aW9uID0gTlVMTDsKKyAgcGVuZGluZ19yZXBsaWVzID0gTlVMTDsKKyAgdGltZW91dF9saXN0ID0gTlVMTDsKKyAgZGlzY29ubmVjdF9saW5rID0gTlVMTDsKKyAgZGlzY29ubmVjdF9tZXNzYWdlID0gTlVMTDsKKyAgb3V0Z29pbmdfY291bnRlciA9IE5VTEw7CisgIG9iamVjdHMgPSBOVUxMOworICAKKyAgd2F0Y2hfbGlzdCA9IF9kYnVzX3dhdGNoX2xpc3RfbmV3ICgpOworICBpZiAod2F0Y2hfbGlzdCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisKKyAgdGltZW91dF9saXN0ID0gX2RidXNfdGltZW91dF9saXN0X25ldyAoKTsKKyAgaWYgKHRpbWVvdXRfbGlzdCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7ICAKKworICBwZW5kaW5nX3JlcGxpZXMgPQorICAgIF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfSU5ULAorCQkJICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZyZWVGdW5jdGlvbilmcmVlX3BlbmRpbmdfY2FsbF9vbl9oYXNoX3JlbW92YWwpOworICBpZiAocGVuZGluZ19yZXBsaWVzID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKyAgCisgIGNvbm5lY3Rpb24gPSBkYnVzX25ldzAgKERCdXNDb25uZWN0aW9uLCAxKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX211dGV4X25ld19hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPm11dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPm11dGV4ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19tdXRleF9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX211dGV4X25ld19hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKyAgCisgIF9kYnVzX2NvbmR2YXJfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCk7CisgIGlmIChjb25uZWN0aW9uLT5kaXNwYXRjaF9jb25kID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKyAgCisgIF9kYnVzX2NvbmR2YXJfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kKTsKKyAgaWYgKGNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisKKyAgX2RidXNfbXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+c2xvdF9tdXRleCk7CisgIGlmIChjb25uZWN0aW9uLT5zbG90X211dGV4ID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBkaXNjb25uZWN0X21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIik7CisgIAorICBpZiAoZGlzY29ubmVjdF9tZXNzYWdlID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBkaXNjb25uZWN0X2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGRpc2Nvbm5lY3RfbWVzc2FnZSk7CisgIGlmIChkaXNjb25uZWN0X2xpbmsgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIG91dGdvaW5nX2NvdW50ZXIgPSBfZGJ1c19jb3VudGVyX25ldyAoKTsKKyAgaWYgKG91dGdvaW5nX2NvdW50ZXIgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIG9iamVjdHMgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKGNvbm5lY3Rpb24pOworICBpZiAob2JqZWN0cyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBpZiAoX2RidXNfbW9kaWZ5X3NpZ3BpcGUpCisgICAgX2RidXNfZGlzYWJsZV9zaWdwaXBlICgpOworICAKKyAgY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUgPSAxOworICBjb25uZWN0aW9uLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgIGNvbm5lY3Rpb24tPndhdGNoZXMgPSB3YXRjaF9saXN0OworICBjb25uZWN0aW9uLT50aW1lb3V0cyA9IHRpbWVvdXRfbGlzdDsKKyAgY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzID0gcGVuZGluZ19yZXBsaWVzOworICBjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyID0gb3V0Z29pbmdfY291bnRlcjsKKyAgY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QgPSBOVUxMOworICBjb25uZWN0aW9uLT5sYXN0X2Rpc3BhdGNoX3N0YXR1cyA9IERCVVNfRElTUEFUQ0hfQ09NUExFVEU7IC8qIHNvIHdlJ3JlIG5vdGlmaWVkIGZpcnN0IHRpbWUgdGhlcmUncyBkYXRhICovCisgIGNvbm5lY3Rpb24tPm9iamVjdHMgPSBvYmplY3RzOworICBjb25uZWN0aW9uLT5leGl0X29uX2Rpc2Nvbm5lY3QgPSBGQUxTRTsKKyAgY29ubmVjdGlvbi0+c2hhcmVhYmxlID0gRkFMU0U7CisgIGNvbm5lY3Rpb24tPnJvdXRlX3BlZXJfbWVzc2FnZXMgPSBGQUxTRTsKKyAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZCA9IEZBTFNFOworICBjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQgPSBGQUxTRTsKKyAgCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbjsKKyNlbmRpZgorICAKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCk7CisKKyAgY29ubmVjdGlvbi0+Y2xpZW50X3NlcmlhbCA9IDE7CisKKyAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgPSBkaXNjb25uZWN0X2xpbms7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIGlmICghX2RidXNfdHJhbnNwb3J0X3NldF9jb25uZWN0aW9uICh0cmFuc3BvcnQsIGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gY29ubmVjdGlvbjsKKyAgCisgZXJyb3I6CisgIGlmIChkaXNjb25uZWN0X21lc3NhZ2UgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGRpc2Nvbm5lY3RfbWVzc2FnZSk7CisgIAorICBpZiAoZGlzY29ubmVjdF9saW5rICE9IE5VTEwpCisgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGRpc2Nvbm5lY3RfbGluayk7CisgIAorICBpZiAoY29ubmVjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2NvbmR2YXJfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCk7CisgICAgICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9jb25kKTsKKyAgICAgIF9kYnVzX211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5tdXRleCk7CisgICAgICBfZGJ1c19tdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgICAgICBfZGJ1c19tdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAgICAgX2RidXNfbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPnNsb3RfbXV0ZXgpOworICAgICAgZGJ1c19mcmVlIChjb25uZWN0aW9uKTsKKyAgICB9CisgIGlmIChwZW5kaW5nX3JlcGxpZXMpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocGVuZGluZ19yZXBsaWVzKTsKKyAgCisgIGlmICh3YXRjaF9saXN0KQorICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAod2F0Y2hfbGlzdCk7CisKKyAgaWYgKHRpbWVvdXRfbGlzdCkKKyAgICBfZGJ1c190aW1lb3V0X2xpc3RfZnJlZSAodGltZW91dF9saXN0KTsKKworICBpZiAob3V0Z29pbmdfY291bnRlcikKKyAgICBfZGJ1c19jb3VudGVyX3VucmVmIChvdXRnb2luZ19jb3VudGVyKTsKKworICBpZiAob2JqZWN0cykKKyAgICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAob2JqZWN0cyk7CisgIAorICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzQ29ubmVjdGlvbi4KKyAqIFJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBhbHJlYWR5IGhvbGRzIHRoZSBjb25uZWN0aW9uIGxvY2suCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyB0aGUgY29ubmVjdGlvbi4KKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisjaWZkZWYgREJVU19IQVZFX0FUT01JQ19JTlQKKyAgX2RidXNfYXRvbWljX2luYyAoJmNvbm5lY3Rpb24tPnJlZmNvdW50KTsKKyNlbHNlCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUgPiAwKTsKKyAgY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUgKz0gMTsKKyNlbmRpZgorCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNDb25uZWN0aW9uLgorICogUmVxdWlyZXMgdGhhdCB0aGUgY2FsbGVyIGFscmVhZHkgaG9sZHMgdGhlIGNvbm5lY3Rpb24gbG9jay4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfYm9vbF90IGxhc3RfdW5yZWY7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICAvKiBUaGUgY29ubmVjdGlvbiBsb2NrIGlzIGJldHRlciB0aGFuIHRoZSBnbG9iYWwKKyAgICogbG9jayBpbiB0aGUgYXRvbWljIGluY3JlbWVudCBmYWxsYmFjaworICAgKi8KKyAgCisjaWZkZWYgREJVU19IQVZFX0FUT01JQ19JTlQKKyAgbGFzdF91bnJlZiA9IChfZGJ1c19hdG9taWNfZGVjICgmY29ubmVjdGlvbi0+cmVmY291bnQpID09IDEpOworI2Vsc2UKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5yZWZjb3VudC52YWx1ZSA+IDApOworCisgIGNvbm5lY3Rpb24tPnJlZmNvdW50LnZhbHVlIC09IDE7CisgIGxhc3RfdW5yZWYgPSAoY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUgPT0gMCk7ICAKKyNpZiAwCisgIHByaW50ZiAoInVucmVmX3VubG9ja2VkKCkgY29ubmVjdGlvbiAlcCBjb3VudCA9ICVkXG4iLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5yZWZjb3VudC52YWx1ZSk7CisjZW5kaWYKKyNlbmRpZgorICAKKyAgaWYgKGxhc3RfdW5yZWYpCisgICAgX2RidXNfY29ubmVjdGlvbl9sYXN0X3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfdWludDMyX3QKK19kYnVzX2Nvbm5lY3Rpb25fZ2V0X25leHRfY2xpZW50X3NlcmlhbCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIHNlcmlhbCA9IGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwrKzsKKworICBpZiAoY29ubmVjdGlvbi0+Y2xpZW50X3NlcmlhbCA9PSAwKQorICAgIGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwgPSAxOworCisgIHJldHVybiBzZXJpYWw7Cit9CisKKy8qKgorICogQSBjYWxsYmFjayBmb3IgdXNlIHdpdGggZGJ1c193YXRjaF9uZXcoKSB0byBjcmVhdGUgYSBEQnVzV2F0Y2guCisgKiAKKyAqIEB0b2RvIFRoaXMgaXMgYmFzaWNhbGx5IGEgaGFjayAtIHdlIGNvdWxkIGRlbGV0ZSBfZGJ1c190cmFuc3BvcnRfaGFuZGxlX3dhdGNoKCkKKyAqIGFuZCB0aGUgdmlydHVhbCBoYW5kbGVfd2F0Y2ggaW4gREJ1c1RyYW5zcG9ydCBpZiB3ZSBnb3QgcmlkIG9mIGl0LgorICogVGhlIHJlYXNvbiB0aGlzIGlzIHNvbWUgd29yayBpcyB0aHJlYWRpbmcsIHNlZSB0aGUgX2RidXNfY29ubmVjdGlvbl9oYW5kbGVfd2F0Y2goKQorICogaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaC4KKyAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGN1cnJlbnQgY29uZGl0aW9uIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGJlaW5nIHdhdGNoZWQuCisgKiBAcGFyYW0gZGF0YSBtdXN0IGJlIGEgcG9pbnRlciB0byBhICNEQnVzQ29ubmVjdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBJTyBjb25kaXRpb24gbWF5IG5vdCBoYXZlIGJlZW4gZnVsbHkgaGFuZGxlZCBkdWUgdG8gbGFjayBvZiBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBjb25uZWN0aW9uID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoIChjb25uZWN0aW9uLCAxKSkKKyAgICB7CisgICAgICAvKiBhbm90aGVyIHRocmVhZCBpcyBoYW5kbGluZyB0aGUgbWVzc2FnZSAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIHJldHZhbCA9IF9kYnVzX3RyYW5zcG9ydF9oYW5kbGVfd2F0Y2ggKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGNvbmRpdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2lvX3BhdGggKGNvbm5lY3Rpb24pOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIAorICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHRoaXMgY2FsbHMgb3V0IHRvIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKK3N0YXRpYyBEQnVzSGFzaFRhYmxlICpzaGFyZWRfY29ubmVjdGlvbnMgPSBOVUxMOworc3RhdGljIERCdXNMaXN0ICpzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitjbG9zZV9jb25uZWN0aW9uX29uX3NodXRkb3duIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkIChjb25uZWN0aW9uKTsKKworICAvKiBDaHVybiB0aHJvdWdoIHRvIHRoZSBEaXNjb25uZWN0ZWQgbWVzc2FnZSAqLworICB3aGlsZSAoKG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKGNvbm5lY3Rpb24pKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgIH0KKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3NoYXJlZF9jb25uZWN0aW9uc19zaHV0ZG93biAodm9pZCAqZGF0YSkKK3sKKyAgaW50IG5fZW50cmllczsKKyAgCisgIF9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgIAorICAvKiBUaGlzIGlzIGEgbGl0dGxlIGJpdCB1bnBsZWFzYW50Li4uIGJldHRlciBpZGVhcz8gKi8KKyAgd2hpbGUgKChuX2VudHJpZXMgPSBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHNoYXJlZF9jb25uZWN0aW9ucykpID4gMCkKKyAgICB7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoc2hhcmVkX2Nvbm5lY3Rpb25zLCAmaXRlcik7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpOworICAgICAgIAorICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgY2xvc2VfY29ubmVjdGlvbl9vbl9zaHV0ZG93biAoY29ubmVjdGlvbik7CisgICAgICBfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworCisgICAgICAvKiBUaGUgY29ubmVjdGlvbiBzaG91bGQgbm93IGJlIGRlYWQgYW5kIG5vdCBpbiBvdXIgaGFzaCAuLi4gKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChzaGFyZWRfY29ubmVjdGlvbnMpIDwgbl9lbnRyaWVzKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHNoYXJlZF9jb25uZWN0aW9ucykgPT0gMCk7CisgIAorICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChzaGFyZWRfY29ubmVjdGlvbnMpOworICBzaGFyZWRfY29ubmVjdGlvbnMgPSBOVUxMOworCisgIGlmIChzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQpOworICAgICAgd2hpbGUgKGNvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uX29uX3NodXRkb3duIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIGNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJnNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICBzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCA9IE5VTEw7CisgIAorICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY29ubmVjdGlvbl9sb29rdXBfc2hhcmVkIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKipyZXN1bHQpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja2luZyBmb3IgZXhpc3RpbmcgY29ubmVjdGlvblxuIik7CisgIAorICAqcmVzdWx0ID0gTlVMTDsKKyAgCisgIF9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisKKyAgaWYgKHNoYXJlZF9jb25uZWN0aW9ucyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjcmVhdGluZyBzaGFyZWRfY29ubmVjdGlvbnMgaGFzaCB0YWJsZVxuIik7CisgICAgICAKKyAgICAgIHNoYXJlZF9jb25uZWN0aW9ucyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmIChzaGFyZWRfY29ubmVjdGlvbnMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChzaGFyZWRfY29ubmVjdGlvbnNfc2h1dGRvd24sIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgICBzaGFyZWRfY29ubmVjdGlvbnMgPSBOVUxMOworICAgICAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2hhcmVkX2Nvbm5lY3Rpb25zXG4iKTsKKyAgICAgIAorICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgcmV0dXJuIFRSVUU7IC8qIG5vIHBvaW50IGxvb2tpbmcgdXAgaW4gdGhlIGhhc2ggd2UganVzdCBtYWRlICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgY2hhciAqZ3VpZDsKKworICAgICAgZ3VpZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZ3VpZCIpOworICAgICAgCisgICAgICBpZiAoZ3VpZCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgICAgICAgICAgCisgICAgICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoc2hhcmVkX2Nvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWQpOworCisgICAgICAgICAgaWYgKGNvbm5lY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFRoZSBEQnVzQ29ubmVjdGlvbiBjYW4ndCBiZSBmaW5hbGl6ZWQgd2l0aG91dCB0YWtpbmcKKyAgICAgICAgICAgICAgICogdGhlIHNoYXJlZF9jb25uZWN0aW9ucyBsb2NrIHRvIHJlbW92ZSBpdCBmcm9tIHRoZQorICAgICAgICAgICAgICAgKiBoYXNoLiAgU28gaXQncyBzYWZlIHRvIHJlZiB0aGUgY29ubmVjdGlvbiBoZXJlLgorICAgICAgICAgICAgICAgKiBIb3dldmVyLCBpdCBtYXkgYmUgZGlzY29ubmVjdGVkIGlmIHRoZSBEaXNjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICogbWVzc2FnZSBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LCBpbiB3aGljaCBjYXNlIHdlCisgICAgICAgICAgICAgICAqIHdhbnQgdG8gcHJldGVuZCBpdCBpc24ndCBpbiB0aGUgaGFzaCBhbmQgYXZvaWQKKyAgICAgICAgICAgICAgICogcmV0dXJuaW5nIGl0LgorICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgKiBUaGUgaWRlYSBpcyB0byBhdm9pZCBldmVyIHJldHVybmluZyBhIGRpc2Nvbm5lY3RlZCBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAqIGZyb20gZGJ1c19jb25uZWN0aW9uX29wZW4oKS4gV2UgY291bGQganVzdCBzeW5jaHJvbm91c2x5CisgICAgICAgICAgICAgICAqIGRyb3Agb3VyIHNoYXJlZCByZWYgdG8gdGhlIGNvbm5lY3Rpb24gb24gY29ubmVjdGlvbiBkaXNjb25uZWN0LAorICAgICAgICAgICAgICAgKiBhbmQgdGhlbiBhc3NlcnQgaGVyZSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RlZCwgYnV0CisgICAgICAgICAgICAgICAqIHRoYXQgY2F1c2VzIHJlZW50cmFuY3kgaGVhZGFjaGVzLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgaWYgKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibG9va2VkIHVwIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gc2VydmVyIGd1aWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibG9va2VkIHVwIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gc2VydmVyIGd1aWQgJXMgYnV0IGl0IHdhcyBkaXNjb25uZWN0ZWQgc28gaWdub3JpbmcgaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY29ubmVjdGlvbl9yZWNvcmRfc2hhcmVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmd1aWQpCit7CisgIGNoYXIgKmd1aWRfa2V5OworICBjaGFyICpndWlkX2luX2Nvbm5lY3Rpb247CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5zaGFyZWFibGUpOworCisgIC8qIGdldCBhIGhhcmQgcmVmIG9uIHRoaXMgY29ubmVjdGlvbiwgZXZlbiBpZgorICAgKiB3ZSB3b24ndCBpbiBmYWN0IHN0b3JlIGl0IGluIHRoZSBoYXNoLCB3ZSBzdGlsbAorICAgKiBuZWVkIHRvIGhvbGQgYSByZWYgb24gaXQgdW50aWwgaXQncyBkaXNjb25uZWN0ZWQuCisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgaWYgKGd1aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworCisgICAgICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJnNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkLCBjb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgcmV0dXJuIFRSVUU7IC8qIGRvbid0IHN0b3JlIGluIHRoZSBoYXNoICovCisgICAgfQorICAKKyAgLyogQSBzZXBhcmF0ZSBjb3B5IG9mIHRoZSBrZXkgaXMgcmVxdWlyZWQgaW4gdGhlIGhhc2ggdGFibGUsIGJlY2F1c2UKKyAgICogd2UgZG9uJ3QgaGF2ZSBhIGxvY2sgb24gdGhlIGNvbm5lY3Rpb24gd2hlbiB3ZSBhcmUgZG9pbmcgYSBoYXNoCisgICAqIGxvb2t1cC4KKyAgICovCisgIAorICBndWlkX2tleSA9IF9kYnVzX3N0cmR1cCAoZ3VpZCk7CisgIGlmIChndWlkX2tleSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBndWlkX2luX2Nvbm5lY3Rpb24gPSBfZGJ1c19zdHJkdXAgKGd1aWQpOworICBpZiAoZ3VpZF9pbl9jb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChndWlkX2tleSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX0RCVVNfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgX2RidXNfYXNzZXJ0IChzaGFyZWRfY29ubmVjdGlvbnMgIT0gTlVMTCk7CisgIAorICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoc2hhcmVkX2Nvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZF9rZXksIGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZ3VpZF9rZXkpOworICAgICAgZGJ1c19mcmVlIChndWlkX2luX2Nvbm5lY3Rpb24pOworICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCA9IGd1aWRfaW5fY29ubmVjdGlvbjsKKworICBfZGJ1c192ZXJib3NlICgic3RvcmVkIGNvbm5lY3Rpb24gdG8gJXMgdG8gYmUgc2hhcmVkXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCk7CisgIAorICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY29ubmVjdGlvbl9mb3JnZXRfc2hhcmVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBpZiAoIWNvbm5lY3Rpb24tPnNoYXJlYWJsZSkKKyAgICByZXR1cm47CisgIAorICBfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgCisgIGlmIChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkcm9wcGluZyBjb25uZWN0aW9uIHRvICVzIG91dCBvZiB0aGUgc2hhcmVkIHRhYmxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+c2VydmVyX2d1aWQpOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoc2hhcmVkX2Nvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY29ubmVjdGlvbiB3YXMgbm90IGluIHRoZSBzaGFyZWQgdGFibGUiKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCk7CisgICAgICBjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCwgY29ubmVjdGlvbik7CisgICAgfQorCisgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgCisgIC8qIHJlbW92ZSBvdXIgcmVmZXJlbmNlIGhlbGQgb24gYWxsIHNoYXJlYWJsZSBjb25uZWN0aW9ucyAqLworICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIERCdXNDb25uZWN0aW9uKgorY29ubmVjdGlvbl90cnlfZnJvbV9hZGRyZXNzX2VudHJ5IChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X29wZW4gKGVudHJ5LCBlcnJvcik7CisKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBjb25uZWN0aW9uID0gX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAodHJhbnNwb3J0KTsKKworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisgIAorICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIF9kYnVzX2Fzc2VydCAoIWNvbm5lY3Rpb24tPmhhdmVfY29ubmVjdGlvbl9sb2NrKTsKKyNlbmRpZgorICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworLyoKKyAqIElmIHRoZSBzaGFyZWQgcGFyYW1ldGVyIGlzIHRydWUsIHRoZW4gYW55IGV4aXN0aW5nIGNvbm5lY3Rpb24gd2lsbAorICogYmUgdXNlZCAoYW5kIGlmIGEgbmV3IGNvbm5lY3Rpb24gaXMgY3JlYXRlZCwgaXQgd2lsbCBiZSBhdmFpbGFibGUKKyAqIGZvciB1c2UgYnkgb3RoZXJzKS4gSWYgdGhlIHNoYXJlZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIGEgbmV3CisgKiBjb25uZWN0aW9uIHdpbGwgYWx3YXlzIGJlIGNyZWF0ZWQsIGFuZCB0aGUgbmV3IGNvbm5lY3Rpb24gd2lsbAorICogbmV2ZXIgYmUgcmV0dXJuZWQgdG8gb3RoZXIgY2FsbGVycy4KKyAqCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcworICogQHBhcmFtIHNoYXJlZCB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIHNoYXJlZCBvciBwcml2YXRlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyB0aGUgY29ubmVjdGlvbiBvciAjTlVMTCBvbiBlcnJvcgorICovCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24qCitfZGJ1c19jb25uZWN0aW9uX29wZW5faW50ZXJuYWwgKGNvbnN0IGNoYXIgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgc2hhcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzQWRkcmVzc0VudHJ5ICoqZW50cmllczsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c0Vycm9yIGZpcnN0X2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICBpbnQgbGVuLCBpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJvcGVuaW5nICVzIGNvbm5lY3Rpb24gdG86ICVzXG4iLAorICAgICAgICAgICAgICAgICBzaGFyZWQgPyAic2hhcmVkIiA6ICJwcml2YXRlIiwgYWRkcmVzcyk7CisgIAorICBpZiAoIWRidXNfcGFyc2VfYWRkcmVzcyAoYWRkcmVzcywgJmVudHJpZXMsICZsZW4sIGVycm9yKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGNvbm5lY3Rpb24gPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBpZiAoc2hhcmVkKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFjb25uZWN0aW9uX2xvb2t1cF9zaGFyZWQgKGVudHJpZXNbaV0sICZjb25uZWN0aW9uKSkKKyAgICAgICAgICAgIF9EQlVTX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworICAgICAgICB9CisKKyAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbl90cnlfZnJvbV9hZGRyZXNzX2VudHJ5IChlbnRyaWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpOworCisgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gTlVMTCAmJiBzaGFyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmd1aWQ7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY29ubmVjdGlvbi0+c2hhcmVhYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAvKiBndWlkIG1heSBiZSBOVUxMICovCisgICAgICAgICAgICAgIGd1aWQgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzW2ldLCAiZ3VpZCIpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghY29ubmVjdGlvbl9yZWNvcmRfc2hhcmVkX3VubG9ja2VkIChjb25uZWN0aW9uLCBndWlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfREJVU19TRVRfT09NICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoY29ubmVjdGlvbikKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgCisgICAgICBpZiAoaSA9PSAwKQorICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsICZmaXJzdF9lcnJvcik7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgfQorICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisgIAorICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZmaXJzdF9lcnJvcik7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZmaXJzdF9lcnJvciwgZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmZpcnN0X2Vycm9yKTsKKyAgCisgIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUgKGVudHJpZXMpOworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworLyoqCisgKiBDbG9zZXMgYSBzaGFyZWQgT1IgcHJpdmF0ZSBjb25uZWN0aW9uLCB3aGlsZSBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSBjYW4KKyAqIG9ubHkgYmUgdXNlZCBvbiBwcml2YXRlIGNvbm5lY3Rpb25zLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlCisgKiBkYnVzIGNvZGUgdGhhdCBvd25zIHRoZSBjb25uZWN0aW9uIC0gYW4gb3duZXIgbXVzdCBiZSBrbm93biwKKyAqIHRoZSBvcGVuL2Nsb3NlIHN0YXRlIGlzIGxpa2UgbWFsbG9jL2ZyZWUsIG5vdCBsaWtlIHJlZi91bnJlZi4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c1ByZWFsbG9jYXRlZFNlbmQqCitfZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBwcmVhbGxvY2F0ZWQgPSBkYnVzX25ldyAoREJ1c1ByZWFsbG9jYXRlZFNlbmQsIDEpOworICBpZiAocHJlYWxsb2NhdGVkID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGNvbm5lY3Rpb24tPmxpbmtfY2FjaGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmsgPQorICAgICAgICBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmY29ubmVjdGlvbi0+bGlua19jYWNoZSk7CisgICAgICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmstPmRhdGEgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByZWFsbG9jYXRlZC0+cXVldWVfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoTlVMTCk7CisgICAgICBpZiAocHJlYWxsb2NhdGVkLT5xdWV1ZV9saW5rID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbGVkXzA7CisgICAgfQorICAKKyAgaWYgKGNvbm5lY3Rpb24tPmxpbmtfY2FjaGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9CisgICAgICAgIF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9uLT5saW5rX2NhY2hlKTsKKyAgICAgIHByZWFsbG9jYXRlZC0+Y291bnRlcl9saW5rLT5kYXRhID0gY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgICAgICBpZiAocHJlYWxsb2NhdGVkLT5jb3VudGVyX2xpbmsgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsZWRfMTsKKyAgICB9CisKKyAgX2RidXNfY291bnRlcl9yZWYgKHByZWFsbG9jYXRlZC0+Y291bnRlcl9saW5rLT5kYXRhKTsKKworICBwcmVhbGxvY2F0ZWQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAKKyAgcmV0dXJuIHByZWFsbG9jYXRlZDsKKyAgCisgZmFpbGVkXzE6CisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHByZWFsbG9jYXRlZCk7CisgIAorICByZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkLCBkb2VzIG5vdCB1cGRhdGUgZGlzcGF0Y2ggc3RhdHVzICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIHByZWFsbG9jYXRlZC0+cXVldWVfbGluay0+ZGF0YSA9IG1lc3NhZ2U7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworCisgIF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayk7CisKKyAgZGJ1c19mcmVlIChwcmVhbGxvY2F0ZWQpOworICBwcmVhbGxvY2F0ZWQgPSBOVUxMOworICAKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisgIAorICBjb25uZWN0aW9uLT5uX291dGdvaW5nICs9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzICclcycpIGZvciAlcyBhZGRlZCB0byBvdXRnb2luZyBxdWV1ZSAlcCwgJWQgcGVuZGluZyB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibnVsbCIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSkgPT0gMCkKKyAgICB7CisgICAgICBzZXJpYWwgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9uZXh0X2NsaWVudF9zZXJpYWwgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIHNlcmlhbCk7CisgICAgICBpZiAoY2xpZW50X3NlcmlhbCkKKyAgICAgICAgKmNsaWVudF9zZXJpYWwgPSBzZXJpYWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGNsaWVudF9zZXJpYWwpCisgICAgICAgICpjbGllbnRfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCBzZXJpYWwgaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKSk7CisgIAorICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyAgLyogTm93IHdlIG5lZWQgdG8gcnVuIGFuIGl0ZXJhdGlvbiB0byBob3BlZnVsbHkganVzdCB3cml0ZSB0aGUgbWVzc2FnZXMKKyAgICogb3V0IGltbWVkaWF0ZWx5LCBhbmQgb3RoZXJ3aXNlIGdldCB0aGVtIHF1ZXVlZCB1cAorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKworICAvKiBJZiBzdHVmZiBpcyBzdGlsbCBxdWV1ZWQgdXAsIGJlIHN1cmUgd2Ugd2FrZSB1cCB0aGUgbWFpbiBsb29wICovCisgIGlmIChjb25uZWN0aW9uLT5uX291dGdvaW5nID4gMCkKKyAgICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorCQkJCQkgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCwKKwkJCQkJICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgY2xpZW50X3NlcmlhbCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworfQorCisvKioKKyAqIExpa2UgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSwgYnV0IGFzc3VtZXMgdGhlIGNvbm5lY3Rpb24KKyAqIGlzIGFscmVhZHkgbG9ja2VkIG9uIGZ1bmN0aW9uIGVudHJ5LCBhbmQgdW5sb2NrcyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gY2xpZW50X3NlcmlhbCByZXR1cm4gbG9jYXRpb24gZm9yIGNsaWVudCBzZXJpYWwgb2Ygc2VudCBtZXNzYWdlCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gb3V0LW9mLW1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJICBkYnVzX3VpbnQzMl90ICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbiwKKwkJCQkJCSBwcmVhbGxvY2F0ZWQsCisJCQkJCQkgbWVzc2FnZSwKKwkJCQkJCSBjbGllbnRfc2VyaWFsKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVXNlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSB0aGUgc2VtYW50aWNzIG9mIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbigpLgorICogSWYgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXMgbm90IHJlZiB0aGUgY29ubmVjdGlvbiwgd2Ugd2FudCB0byBjbG9zZSBpdC4KKyAqCisgKiBBIGJpdCBvZiBhIGhhY2ssIHByb2JhYmx5IHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHZhbHVlCisgKiBmb3Igd2hldGhlciB0byBjbG9zZSwgb3Igc2hvdWxkIGhhdmUgaGFkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGl0c2VsZiBpZiBpdAorICogZGlkbid0IHdhbnQgaXQuCisgKgorICogQnV0LCB0aGlzIHdvcmtzIE9LIGFzIGxvbmcgYXMgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcKKyAqIGNyYXp5IGxpa2Uga2VlcCB0aGUgY29ubmVjdGlvbiBhcm91bmQgd2l0aG91dCByZWYnaW5nIGl0LgorICoKKyAqIFdlIGhhdmUgdG8gbG9jayB0aGUgY29ubmVjdGlvbiBhY3Jvc3MgcmVmY291bnQgY2hlY2sgYW5kIGNsb3NlIGluIGNhc2UKKyAqIHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzcGF3bnMgYSB0aHJlYWQgdGhhdCBjbG9zZXMgYW5kIHVucmVmcy4KKyAqIEluIHRoYXQgY2FzZSwgaWYgdGhlIGFwcCB0aHJlYWQKKyAqIGNsb3NlcyBhbmQgdW5yZWZzIGZpcnN0LCB3ZSdsbCBoYXJtbGVzc2x5IGNsb3NlIGFnYWluOyBpZiB0aGUgYXBwIHRocmVhZAorICogc3RpbGwgaGFzIHRoZSByZWYsIHdlJ2xsIGNsb3NlIGFuZCB0aGVuIHRoZSBhcHAgd2lsbCBjbG9zZSBoYXJtbGVzc2x5LgorICogSWYgdGhlIGFwcCB1bnJlZnMgd2l0aG91dCBjbG9zaW5nLCB0aGUgYXBwIGlzIGJyb2tlbiBzaW5jZSBpZiB0aGUKKyAqIGFwcCByZWZzIGZyb20gdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGl0IGlzIHN1cHBvc2VkIHRvIGFsc28gY2xvc2UuCisgKgorICogSWYgd2UgZGlkbid0IGF0b21pY2FsbHkgY2hlY2sgdGhlIHJlZmNvdW50IGFuZCBjbG9zZSB3aXRoIHRoZSBsb2NrIGhlbGQKKyAqIHRob3VnaCwgd2UgY291bGQgc2NyZXcgdGhpcyB1cC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5yZWZjb3VudC52YWx1ZSA+IDApOworCisgIGlmIChjb25uZWN0aW9uLT5yZWZjb3VudC52YWx1ZSA9PSAxKQorICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24pOworICBlbHNlCisgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisKKy8qKgorICogV2hlbiBhIGZ1bmN0aW9uIHRoYXQgYmxvY2tzIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGEgdGltZW91dCwgYW5kIHdlCisgKiBydW4gb3V0IG9mIG1lbW9yeSwgdGhlIHRpbWUgdG8gd2FpdCBmb3IgbWVtb3J5IGlzIGJhc2VkIG9uIHRoZQorICogdGltZW91dC4gSWYgdGhlIGNhbGxlciB3YXMgd2lsbGluZyB0byBibG9jayBhIGxvbmcgdGltZSB3ZSB3YWl0IGEKKyAqIHJlbGF0aXZlbHkgbG9uZyB0aW1lIGZvciBtZW1vcnksIGlmIHRoZXkgd2VyZSBvbmx5IHdpbGxpbmcgdG8gYmxvY2sKKyAqIGJyaWVmbHkgdGhlbiB3ZSByZXRyeSBmb3IgbWVtb3J5IGF0IGEgcmFwaWQgcmF0ZS4KKyAqCisgKiBAdGltZW91dF9taWxsaXNlY29uZHMgdGhlIHRpbWVvdXQgcmVxdWVzdGVkIGZvciBibG9ja2luZworICovCitzdGF0aWMgdm9pZAorX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKGludCB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xKQorICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwMCk7CisgIGVsc2UgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMTAwKQorICAgIDsgLyoganVzdCBidXN5IGxvb3AgKi8KKyAgZWxzZSBpZiAodGltZW91dF9taWxsaXNlY29uZHMgPD0gMTAwMCkKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMyk7CisgIGVsc2UKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKDEwMDApOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKgorZ2VuZXJhdGVfbG9jYWxfZXJyb3JfbWVzc2FnZSAoZGJ1c191aW50MzJfdCBzZXJpYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXJyb3JfbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICplcnJvcl9tc2cpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBpZiAoIW1lc3NhZ2UpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsIGVycm9yX25hbWUpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgIGdvdG8gb3V0OyAKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7IAorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9tc2cpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKwkgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoKKyAqIFBlZWsgdGhlIGluY29taW5nIHF1ZXVlIHRvIHNlZSBpZiB3ZSBnb3QgcmVwbHkgZm9yIGEgc3BlY2lmaWMgc2VyaWFsCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9wZWVrX2Zvcl9yZXBseV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKHJlcGx5KSA9PSBjbGllbnRfc2VyaWFsKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzIHJlcGx5IHRvICVkIGZvdW5kIGluIHF1ZXVlXG4iLCBfREJVU19GVU5DVElPTl9OQU1FLCBjbGllbnRfc2VyaWFsKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBUaGlzIGlzIHNsaWdodGx5IHN0cmFuZ2Ugc2luY2Ugd2UgY2FuIHBvcCBhIG1lc3NhZ2UgaGVyZSB3aXRob3V0CisgKiB0aGUgZGlzcGF0Y2ggbG9jay4KKyAqLworc3RhdGljIERCdXNNZXNzYWdlKgorY2hlY2tfZm9yX3JlcGx5X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgIGNsaWVudF9zZXJpYWwpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzKTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICpyZXBseSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAocmVwbHkpID09IGNsaWVudF9zZXJpYWwpCisJeworCSAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKwkgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgIC09IDE7CisJICByZXR1cm4gcmVwbHk7CisJfQorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgIC8qIFdlIGNhbid0IGl0ZXJhdGUgb3ZlciB0aGUgaGFzaCBpbiB0aGUgbm9ybWFsIHdheSBzaW5jZSB3ZSdsbCBiZQorICAgICogZHJvcHBpbmcgdGhlIGxvY2sgZm9yIGVhY2ggaXRlbS4gU28gd2UgcmVzdGFydCB0aGUKKyAgICAqIGl0ZXIgZWFjaCB0aW1lIGFzIHdlIGRyYWluIHRoZSBoYXNoIHRhYmxlLgorICAgICovCisgICAKKyAgIHdoaWxlIChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcykgPiAwKQorICAgIHsKKyAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZzsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLCAmaXRlcik7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpOworICAgICAgIAorICAgICAgcGVuZGluZyA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOworICAgICAgIAorICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKHBlbmRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworCisgICAgICBpZiAoX2RidXNfcGVuZGluZ19jYWxsX2lzX3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcpKQorICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKHBlbmRpbmcsIEZBTFNFKTsgICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorY29tcGxldGVfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlKQoreworICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3VubG9ja2VkIChwZW5kaW5nLCBtZXNzYWdlKTsKKyAgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAocGVuZGluZyk7IC8qIGluIGNhc2UgdGhlcmUncyBubyBhcHAgd2l0aCBhIHJlZiBoZWxkICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fZGV0YWNoX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nKTsKKyAKKyAgLyogTXVzdCBiZSBjYWxsZWQgdW5sb2NrZWQgc2luY2UgaXQgaW52b2tlcyBhcHAgY2FsbGJhY2sgKi8KKyAgX2RidXNfcGVuZGluZ19jYWxsX2NvbXBsZXRlIChwZW5kaW5nKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgcmVwbHkgPSBjaGVja19mb3JfcmVwbHlfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNoZWNrZWQgZm9yIHJlcGx5XG4iKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IGdvdCByZXBseVxuIik7CisKKyAgICAgIGNvbXBsZXRlX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nLCByZXBseSk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBCbG9ja3MgdW50aWwgYSBwZW5kaW5nIGNhbGwgdGltZXMgb3V0IG9yIGdldHMgYSByZXBseS4KKyAqCisgKiBEb2VzIG5vdCByZS1lbnRlciB0aGUgbWFpbiBsb29wIG9yIHJ1biBmaWx0ZXIvcGF0aC1yZWdpc3RlcmVkCisgKiBjYWxsYmFja3MuIFRoZSByZXBseSB0byB0aGUgbWVzc2FnZSB3aWxsIG5vdCBiZSBzZWVuIGJ5CisgKiBmaWx0ZXIgY2FsbGJhY2tzLgorICoKKyAqIFJldHVybnMgaW1tZWRpYXRlbHkgaWYgcGVuZGluZyBjYWxsIGFscmVhZHkgZ290IGEgcmVwbHkuCisgKiAKKyAqIEB0b2RvIGNvdWxkIHVzZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgKGl0IGtlZXBzIHNjYW5uaW5nCisgKiB0aGUgd2hvbGUgbWVzc2FnZSBxdWV1ZSBmb3IgZXhhbXBsZSkKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsIHdlIGJsb2NrIGZvciBhIHJlcGx5IG9uCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGxvbmcgc3RhcnRfdHZfc2VjLCBzdGFydF90dl91c2VjOworICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGRidXNfdWludDMyX3QgY2xpZW50X3NlcmlhbDsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisgIGludCB0aW1lb3V0X21pbGxpc2Vjb25kcywgZWxhcHNlZF9taWxsaXNlY29uZHM7CisKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nICE9IE5VTEwpOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwZW5kaW5nKSkKKyAgICByZXR1cm47CisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfcmVmIChwZW5kaW5nKTsgLyogbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGNhbGwgY291bGQgYmUgY2FuY2VsZWQgKi8KKworICBjb25uZWN0aW9uID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX2FuZF9sb2NrIChwZW5kaW5nKTsKKyAgCisgIC8qIEZsdXNoIG1lc3NhZ2UgcXVldWUgLSBub3RlLCBjYW4gYWZmZWN0IGRpc3BhdGNoIHN0YXR1cyAqLworICBfZGJ1c19jb25uZWN0aW9uX2ZsdXNoX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBjbGllbnRfc2VyaWFsID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIC8qIG5vdGUgdGhhdCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpcyBsaW1pdGVkIHRvIGEgc21hbGxpc2ggdmFsdWUKKyAgICogaW4gX2RidXNfcGVuZGluZ19jYWxsX25ldygpIHNvIG92ZXJmbG93cyBhcmVuJ3QgcG9zc2libGUKKyAgICogYmVsb3cKKyAgICovCisgIHRpbWVvdXQgPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpOworICBfZGJ1c19nZXRfY3VycmVudF90aW1lICgmc3RhcnRfdHZfc2VjLCAmc3RhcnRfdHZfdXNlYyk7CisgIGlmICh0aW1lb3V0KQorICAgIHsKKyAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzID0gZGJ1c190aW1lb3V0X2dldF9pbnRlcnZhbCAodGltZW91dCk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiB3aWxsIGJsb2NrICVkIG1pbGxpc2Vjb25kcyBmb3IgcmVwbHkgc2VyaWFsICV1IGZyb20gJWxkIHNlYyAlbGQgdXNlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgY2xpZW50X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3R2X3NlYywgc3RhcnRfdHZfdXNlYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGltZW91dF9taWxsaXNlY29uZHMgPSAtMTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IHdpbGwgYmxvY2sgZm9yIHJlcGx5IHNlcmlhbCAldVxuIiwgY2xpZW50X3NlcmlhbCk7CisgICAgfQorCisgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGdvdCB0aGUgZGF0YSBvZmYgdGhlIHNvY2tldCAqLworICAvKiBmcm9tIGFub3RoZXIgYmxvY2tlZCBwZW5kaW5nIGNhbGwgKi8KKyAgaWYgKGNoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkIChjb25uZWN0aW9uLCBwZW5kaW5nKSkKKyAgICByZXR1cm47CisKKyAgLyogTm93IHdlIHdhaXQuLi4gKi8KKyAgLyogYWx3YXlzIGJsb2NrIGF0IGxlYXN0IG9uY2UgYXMgd2Uga25vdyB3ZSBkb24ndCBoYXZlIHRoZSByZXBseSB5ZXQgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKworIHJlY2hlY2tfc3RhdHVzOgorCisgIF9kYnVzX3ZlcmJvc2UgKCJ0b3Agb2YgcmVjaGVja1xuIik7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgLyogcXVldWUgbWVzc2FnZXMgYW5kIGdldCBzdGF0dXMgKi8KKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHRoZSBnZXRfY29tcGxldGVkKCkgaXMgaW4gY2FzZSBhIGRpc3BhdGNoKCkgd2hpbGUgd2Ugd2VyZSBibG9ja2luZworICAgKiBnb3QgdGhlIHJlcGx5IGluc3RlYWQgb2YgdXMuCisgICAqLworICBpZiAoX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQgKHBlbmRpbmcpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJQZW5kaW5nIGNhbGwgY29tcGxldGVkIGJ5IGRpc3BhdGNoXG4iKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgeworICAgICAgaWYgKGNoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkIChjb25uZWN0aW9uLCBwZW5kaW5nKSkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKyAgZWxhcHNlZF9taWxsaXNlY29uZHMgPSAodHZfc2VjIC0gc3RhcnRfdHZfc2VjKSAqIDEwMDAgKworCSAgKHR2X3VzZWMgLSBzdGFydF90dl91c2VjKSAvIDEwMDA7CisgIAorICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKmVycm9yX21zZzsKKworICAgICAgZXJyb3JfbXNnID0gZ2VuZXJhdGVfbG9jYWxfZXJyb3JfbWVzc2FnZSAoY2xpZW50X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRElTQ09OTkVDVEVELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWQgYmVmb3JlIGEgcmVwbHkgd2FzIHJlY2VpdmVkIik7IAorCisgICAgICAvKiBvbiBPT00gZXJyb3JfbXNnIGlzIHNldCB0byBOVUxMICovCisgICAgICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgZXJyb3JfbXNnKTsKKyAgICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rID09IE5VTEwpCisgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IGRpc2Nvbm5lY3RlZFxuIik7CisgIGVsc2UgaWYgKHRpbWVvdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgICAgICB7CisgICAgICAgICAgLyogVHJ5IHNsZWVwaW5nIGEgYml0LCBhcyB3ZSBhcmVuJ3Qgc3VyZSB3ZSBuZWVkIHRvIGJsb2NrIGZvciByZWFkaW5nLAorICAgICAgICAgICAqIHdlIG1heSBhbHJlYWR5IGhhdmUgYSByZXBseSBpbiB0aGUgYnVmZmVyIGFuZCBqdXN0IGNhbid0IHByb2Nlc3MKKyAgICAgICAgICAgKiBpdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSB3YWl0aW5nIGZvciBtb3JlIG1lbW9yeVxuIik7CisKKyAgICAgICAgICBfZGJ1c19tZW1vcnlfcGF1c2VfYmFzZWRfb25fdGltZW91dCAodGltZW91dF9taWxsaXNlY29uZHMgLSBlbGFwc2VkX21pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAKKyAgICAgICAgICAvKiBibG9jayBhZ2Fpbiwgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVwbHkgYnVmZmVyZWQgeWV0LiAqLworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisKKyAgICAgIGdvdG8gcmVjaGVja19zdGF0dXM7CisgICAgfQorICBlbHNlIGlmICh0dl9zZWMgPCBzdGFydF90dl9zZWMpCisgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IGNsb2NrIHNldCBiYWNrd2FyZFxuIik7CisgIGVsc2UgaWYgKGVsYXBzZWRfbWlsbGlzZWNvbmRzIDwgdGltZW91dF9taWxsaXNlY29uZHMpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6ICVkIG1pbGxpc2Vjb25kcyByZW1haW5cbiIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgCisgICAgICBpZiAoc3RhdHVzID09IERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUcnkgc2xlZXBpbmcgYSBiaXQsIGFzIHdlIGFyZW4ndCBzdXJlIHdlIG5lZWQgdG8gYmxvY2sgZm9yIHJlYWRpbmcsCisgICAgICAgICAgICogd2UgbWF5IGFscmVhZHkgaGF2ZSBhIHJlcGx5IGluIHRoZSBidWZmZXIgYW5kIGp1c3QgY2FuJ3QgcHJvY2VzcworICAgICAgICAgICAqIGl0LgorICAgICAgICAgICAqLworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpIHdhaXRpbmcgZm9yIG1vcmUgbWVtb3J5XG4iKTsKKworICAgICAgICAgIF9kYnVzX21lbW9yeV9wYXVzZV9iYXNlZF9vbl90aW1lb3V0ICh0aW1lb3V0X21pbGxpc2Vjb25kcyAtIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgIAorICAgICAgICAgIC8qIGJsb2NrIGFnYWluLCB3ZSBkb24ndCBoYXZlIHRoZSByZXBseSBidWZmZXJlZCB5ZXQuICovCisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMgLSBlbGFwc2VkX21pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKworICAgICAgZ290byByZWNoZWNrX3N0YXR1czsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IFdhaXRlZCAlZCBtaWxsaXNlY29uZHMgYW5kIGdvdCBubyByZXBseVxuIiwKKyAgICAgICAgICAgICAgICAgZWxhcHNlZF9taWxsaXNlY29uZHMpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkX3VubG9ja2VkIChwZW5kaW5nKSk7CisgIAorICAvKiB1bmxvY2sgYW5kIGNhbGwgdXNlciBjb2RlICovCisgIGNvbXBsZXRlX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nLCBOVUxMKTsKKworICAvKiB1cGRhdGUgdXNlciBjb2RlIG9uIGRpc3BhdGNoIHN0YXR1cyAqLworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQ29ubmVjdGlvbgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBHZXRzIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhZGRyZXNzLiBJZiBhIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuCisgKiBhZGRyZXNzIGFscmVhZHkgZXhpc3RzLCByZXR1cm5zIHRoZSBleGlzdGluZyBjb25uZWN0aW9uIHdpdGggaXRzCisgKiByZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuICBPdGhlcndpc2UsIHJldHVybnMgYSBuZXcgY29ubmVjdGlvbgorICogYW5kIHNhdmVzIHRoZSBuZXcgY29ubmVjdGlvbiBmb3IgcG9zc2libGUgcmUtdXNlIGlmIGEgZnV0dXJlIGNhbGwKKyAqIHRvIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgYXNrcyB0byBjb25uZWN0IHRvIHRoZSBzYW1lIHNlcnZlci4KKyAqCisgKiBVc2UgZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpIHRvIGdldCBhIGRlZGljYXRlZCBjb25uZWN0aW9uCisgKiBub3Qgc2hhcmVkIHdpdGggb3RoZXIgY2FsbGVycyBvZiBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpLgorICoKKyAqIElmIHRoZSBvcGVuIGZhaWxzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAjTlVMTCwgYW5kIHByb3ZpZGVzIGEKKyAqIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgaW4gdGhlIGVycm9yIHBhcmFtZXRlci4gUGFzcyAjTlVMTCBmb3IgdGhlCisgKiBlcnJvciBwYXJhbWV0ZXIgaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSByZWFzb24gZm9yCisgKiBmYWlsdXJlLgorICoKKyAqIEJlY2F1c2UgdGhpcyBjb25uZWN0aW9uIGlzIHNoYXJlZCwgbm8gdXNlciBvZiB0aGUgY29ubmVjdGlvbgorICogbWF5IGNhbGwgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkuIEhvd2V2ZXIsIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhlCisgKiBjb25uZWN0aW9uIHlvdSBzaG91bGQgY2FsbCBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYoKS4KKyAqCisgKiBAbm90ZSBQcmVmZXIgZGJ1c19jb25uZWN0aW9uX29wZW4oKSB0byBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkKKyAqIHVubGVzcyB5b3UgaGF2ZSBnb29kIHJlYXNvbjsgY29ubmVjdGlvbnMgYXJlIGV4cGVuc2l2ZSBlbm91Z2gKKyAqIHRoYXQgaXQncyB3YXN0ZWZ1bCB0byBjcmVhdGUgbG90cyBvZiBjb25uZWN0aW9ucyB0byB0aGUgc2FtZQorICogc2VydmVyLgorICogCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcy4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIG5ldyBjb25uZWN0aW9uLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzQ29ubmVjdGlvbioKK2RidXNfY29ubmVjdGlvbl9vcGVuIChjb25zdCBjaGFyICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoYWRkcmVzcyAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKworICBjb25uZWN0aW9uID0gX2RidXNfY29ubmVjdGlvbl9vcGVuX2ludGVybmFsIChhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9CisKKy8qKgorICogT3BlbnMgYSBuZXcsIGRlZGljYXRlZCBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGFkZHJlc3MuIFVubGlrZQorICogZGJ1c19jb25uZWN0aW9uX29wZW4oKSwgYWx3YXlzIGNyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbi4KKyAqIFRoaXMgY29ubmVjdGlvbiB3aWxsIG5vdCBiZSBzYXZlZCBvciByZWN5Y2xlZCBieSBsaWJkYnVzLgorICoKKyAqIElmIHRoZSBvcGVuIGZhaWxzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAjTlVMTCwgYW5kIHByb3ZpZGVzIGEKKyAqIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgaW4gdGhlIGVycm9yIHBhcmFtZXRlci4gUGFzcyAjTlVMTCBmb3IgdGhlCisgKiBlcnJvciBwYXJhbWV0ZXIgaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSByZWFzb24gZm9yCisgKiBmYWlsdXJlLgorICoKKyAqIFdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjb25uZWN0aW9uLCB5b3UgbXVzdAorICogZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgdG8gZGlzY29ubmVjdCBpdCwKKyAqIGFuZCBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYoKSB0byBmcmVlIHRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIAorICogKFRoZSBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSBjYW4gYmUgc2tpcHBlZCBpZiB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBrbm93biB0byBiZSBkaXNjb25uZWN0ZWQsIGZvciBleGFtcGxlCisgKiBpZiB5b3UgYXJlIGluc2lkZSBhIGhhbmRsZXIgZm9yIHRoZSBEaXNjb25uZWN0ZWQgc2lnbmFsLikKKyAqCisgKiBAbm90ZSBQcmVmZXIgZGJ1c19jb25uZWN0aW9uX29wZW4oKSB0byBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkKKyAqIHVubGVzcyB5b3UgaGF2ZSBnb29kIHJlYXNvbjsgY29ubmVjdGlvbnMgYXJlIGV4cGVuc2l2ZSBlbm91Z2gKKyAqIHRoYXQgaXQncyB3YXN0ZWZ1bCB0byBjcmVhdGUgbG90cyBvZiBjb25uZWN0aW9ucyB0byB0aGUgc2FtZQorICogc2VydmVyLgorICoKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgbmV3IGNvbm5lY3Rpb24sIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNDb25uZWN0aW9uKgorZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoYWRkcmVzcyAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKworICBjb25uZWN0aW9uID0gX2RidXNfY29ubmVjdGlvbl9vcGVuX2ludGVybmFsIChhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNDb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24uCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK2RidXNfY29ubmVjdGlvbl9yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24sIE5VTEwpOworICAKKyAgLyogVGhlIGNvbm5lY3Rpb24gbG9jayBpcyBiZXR0ZXIgdGhhbiB0aGUgZ2xvYmFsCisgICAqIGxvY2sgaW4gdGhlIGF0b21pYyBpbmNyZW1lbnQgZmFsbGJhY2sKKyAgICoKKyAgICogKEZJWE1FIGJ1dCBmb3Igbm93IHdlIGFsd2F5cyB1c2UgdGhlIGF0b21pYyB2ZXJzaW9uLAorICAgKiB0byBhdm9pZCB0YWtpbmcgdGhlIGNvbm5lY3Rpb24gbG9jaywgZHVlIHRvCisgICAqIHRoZSBtZXNzIHdpdGggc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkvc2V0X3dhdGNoX2Z1bmN0aW9ucygpCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAgd2l0aG91dCBkcm9wcGluZyBsb2NrcykKKyAgICovCisgIAorI2lmIDEKKyAgX2RidXNfYXRvbWljX2luYyAoJmNvbm5lY3Rpb24tPnJlZmNvdW50KTsKKyNlbHNlCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUgPiAwKTsKKworICBjb25uZWN0aW9uLT5yZWZjb3VudC52YWx1ZSArPSAxOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisjZW5kaWYKKworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfb3V0Z29pbmdfbWVzc2FnZSAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBlbGVtZW50OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbWVzc2FnZV9yZW1vdmVfY291bnRlciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7Cit9CisKKy8qIFRoaXMgaXMgcnVuIHdpdGhvdXQgdGhlIG11dGV4IGhlbGQsIGJ1dCBhZnRlciB0aGUgbGFzdCByZWZlcmVuY2UKKyAqIHRvIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRyb3BwZWQgd2Ugc2hvdWxkIGhhdmUgbm8gdGhyZWFkLXJlbGF0ZWQKKyAqIHByb2JsZW1zCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2xhc3RfdW5yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c192ZXJib3NlICgiRmluYWxpemluZyBjb25uZWN0aW9uICVwXG4iLCBjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUgPT0gMCk7CisgIAorICAvKiBZb3UgaGF2ZSB0byBkaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uIGJlZm9yZSB1bnJlZjppbmcgaXQuIE90aGVyd2lzZQorICAgKiB5b3Ugd29uJ3QgZ2V0IHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZS4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCA9PSBOVUxMKTsKKyAgCisgIC8qIC0tLS0gV2UncmUgZ29pbmcgdG8gY2FsbCB2YXJpb3VzIGFwcGxpY2F0aW9uIGNhbGxiYWNrcyBoZXJlLCBob3BlIGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcuLi4gKi8KKyAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKGNvbm5lY3Rpb24tPm9iamVjdHMpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICAKKyAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChjb25uZWN0aW9uLT53YXRjaGVzKTsKKyAgY29ubmVjdGlvbi0+d2F0Y2hlcyA9IE5VTEw7CisgIAorICBfZGJ1c190aW1lb3V0X2xpc3RfZnJlZSAoY29ubmVjdGlvbi0+dGltZW91dHMpOworICBjb25uZWN0aW9uLT50aW1lb3V0cyA9IE5VTEw7CisKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCk7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsIGxpbmspOworCisgICAgICBmaWx0ZXItPmZ1bmN0aW9uID0gTlVMTDsKKyAgICAgIF9kYnVzX21lc3NhZ2VfZmlsdGVyX3VucmVmIChmaWx0ZXIpOyAvKiBjYWxscyBhcHAgY2FsbGJhY2sgKi8KKyAgICAgIGxpbmstPmRhdGEgPSBOVUxMOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCk7CisgIAorICAvKiAtLS0tIERvbmUgd2l0aCBzdHVmZiB0aGF0IGludm9rZXMgYXBwbGljYXRpb24gY2FsbGJhY2tzICovCisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKGNvbm5lY3Rpb24tPm9iamVjdHMpOyAgCisKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzKTsKKyAgY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzID0gTlVMTDsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCk7CisgIAorICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlX291dGdvaW5nX21lc3NhZ2UsCisJCSAgICAgIGNvbm5lY3Rpb24pOworICBfZGJ1c19saXN0X2NsZWFyICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMpOworICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsCisJCSAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX21lc3NhZ2VfdW5yZWYsCisJCSAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMpOworCisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKworICBpZiAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmspCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluay0+ZGF0YTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmY29ubmVjdGlvbi0+bGlua19jYWNoZSk7CisgIAorICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9jb25kKTsKKyAgX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kKTsKKworICBfZGJ1c19tdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgIF9kYnVzX211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7CisKKyAgX2RidXNfbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPnNsb3RfbXV0ZXgpOworCisgIF9kYnVzX211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5tdXRleCk7CisgIAorICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNDb25uZWN0aW9uLCBhbmQgZmluYWxpemVzCisgKiBpdCBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIE5vdGU6IGl0IGlzIGEgYnVnIHRvIGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgY29ubmVjdGlvbiB0aGF0CisgKiBpcyBzdGlsbCBjb25uZWN0ZWQuCisgKgorICogRm9yIHNoYXJlZCBjb25uZWN0aW9ucywgbGliZGJ1cyB3aWxsIG93biBhIHJlZmVyZW5jZQorICogYXMgbG9uZyBhcyB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQsIHNvIHlvdSBjYW4ga25vdyB0aGF0IGVpdGhlcgorICogeW91IGRvbid0IGhhdmUgdGhlIGxhc3QgcmVmZXJlbmNlLCBvciBpdCdzIE9LIHRvIGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlLgorICogTW9zdCBjb25uZWN0aW9ucyBhcmUgc2hhcmVkLiBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGFuZCBkYnVzX2J1c19nZXQoKQorICogcmV0dXJuIHNoYXJlZCBjb25uZWN0aW9ucy4KKyAqCisgKiBGb3IgcHJpdmF0ZSBjb25uZWN0aW9ucywgdGhlIGNyZWF0b3Igb2YgdGhlIGNvbm5lY3Rpb24gbXVzdCBhcnJhbmdlIGZvcgorICogZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgdG8gYmUgY2FsbGVkIHByaW9yIHRvIGRyb3BwaW5nIHRoZSBsYXN0IHJlZmVyZW5jZS4KKyAqIFByaXZhdGUgY29ubmVjdGlvbnMgY29tZSBmcm9tIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSBvciBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCBsYXN0X3VucmVmOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworICAKKyAgLyogVGhlIGNvbm5lY3Rpb24gbG9jayBpcyBiZXR0ZXIgdGhhbiB0aGUgZ2xvYmFsCisgICAqIGxvY2sgaW4gdGhlIGF0b21pYyBpbmNyZW1lbnQgZmFsbGJhY2sKKyAgICoKKyAgICogKEZJWE1FIGJ1dCBmb3Igbm93IHdlIGFsd2F5cyB1c2UgdGhlIGF0b21pYyB2ZXJzaW9uLAorICAgKiB0byBhdm9pZCB0YWtpbmcgdGhlIGNvbm5lY3Rpb24gbG9jaywgZHVlIHRvCisgICAqIHRoZSBtZXNzIHdpdGggc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkvc2V0X3dhdGNoX2Z1bmN0aW9ucygpCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAgd2l0aG91dCBkcm9wcGluZyBsb2NrcykKKyAgICovCisgIAorI2lmIDEKKyAgbGFzdF91bnJlZiA9IChfZGJ1c19hdG9taWNfZGVjICgmY29ubmVjdGlvbi0+cmVmY291bnQpID09IDEpOworI2Vsc2UKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUgPiAwKTsKKworICBjb25uZWN0aW9uLT5yZWZjb3VudC52YWx1ZSAtPSAxOworICBsYXN0X3VucmVmID0gKGNvbm5lY3Rpb24tPnJlZmNvdW50LnZhbHVlID09IDApOworCisjaWYgMAorICBwcmludGYgKCJ1bnJlZigpIGNvbm5lY3Rpb24gJXAgY291bnQgPSAlZFxuIiwgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+cmVmY291bnQudmFsdWUpOworI2VuZGlmCisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisjZW5kaWYKKyAgCisgIGlmIChsYXN0X3VucmVmKQorICAgIHsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICAgICAgaWYgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJUaGUgbGFzdCByZWZlcmVuY2Ugb24gYSBjb25uZWN0aW9uIHdhcyBkcm9wcGVkIHdpdGhvdXQgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4gVGhpcyBpcyBhIGJ1ZyBpbiBhbiBhcHBsaWNhdGlvbi4gU2VlIGRidXNfY29ubmVjdGlvbl91bnJlZigpIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuXG4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPnNoYXJlYWJsZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3N0IGxpa2VseSwgdGhlIGFwcGxpY2F0aW9uIGNhbGxlZCB1bnJlZigpIHRvbyBtYW55IHRpbWVzIGFuZCByZW1vdmVkIGEgcmVmZXJlbmNlIGJlbG9uZ2luZyB0byBsaWJkYnVzLCBzaW5jZSB0aGlzIGlzIGEgc2hhcmVkIGNvbm5lY3Rpb24uXG4iIDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9zdCBsaWtlbHksIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3VwcG9zZWQgdG8gY2FsbCBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSwgc2luY2UgdGhpcyBpcyBhIHByaXZhdGUgY29ubmVjdGlvbi5cbiIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICBfZGJ1c19jb25uZWN0aW9uX2xhc3RfdW5yZWYgKGNvbm5lY3Rpb24pOworICAgIH0KK30KKworLyoKKyAqIE5vdGUgdGhhdCB0aGUgdHJhbnNwb3J0IGNhbiBkaXNjb25uZWN0IGl0c2VsZiAob3RoZXIgZW5kIGRyb3BzIHVzKQorICogYW5kIGluIHRoYXQgY2FzZSB0aGlzIGZ1bmN0aW9uIG5ldmVyIHJ1bnMuIFNvIHRoaXMgZnVuY3Rpb24gbXVzdAorICogbm90IGRvIGFueXRoaW5nIG1vcmUgdGhhbiBkaXNjb25uZWN0IHRoZSB0cmFuc3BvcnQgYW5kIHVwZGF0ZSB0aGUKKyAqIGRpc3BhdGNoIHN0YXR1cy4KKyAqIAorICogSWYgdGhlIHRyYW5zcG9ydCBzZWxmLWRpc2Nvbm5lY3RzLCB0aGVuIHdlIGFzc3VtZSBzb21lb25lIHdpbGwKKyAqIGRpc3BhdGNoIHRoZSBjb25uZWN0aW9uIHRvIGNhdXNlIHRoZSBkaXNwYXRjaCBzdGF0dXMgdXBkYXRlLgorICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJEaXNjb25uZWN0aW5nICVwXG4iLCBjb25uZWN0aW9uKTsKKworICAvKiBXZSBuZWVkIHRvIHJlZiBiZWNhdXNlIHVwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayB3aWxsIHVucmVmCisgICAqIHRoZSBjb25uZWN0aW9uIGlmIGl0IHdhcyBzaGFyZWQgYW5kIGxpYmRidXMgd2FzIHRoZSBvbmx5IHJlbWFpbmluZworICAgKiByZWZjb3VudCBob2xkZXIuCisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKworICAvKiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgcXVldWluZyB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGxpbmsKKyAgICogKHVubGVzcyB3ZSBkb24ndCBoYXZlIGVub3VnaCBtZW1vcnksIHBvc3NpYmx5LCBzbyBkb24ndCBhc3NlcnQgaXQpLgorICAgKiBBZnRlciB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGxpbmsgaXMgcXVldWVkLCBkYnVzX2J1c19nZXQvZGJ1c19jb25uZWN0aW9uX29wZW4KKyAgICogc2hvdWxkIG5ldmVyIGFnYWluIHJldHVybiB0aGUgbmV3bHktZGlzY29ubmVjdGVkIGNvbm5lY3Rpb24uCisgICAqCisgICAqIEhvd2V2ZXIsIHdlIG9ubHkgdW5yZWYgdGhlIHNoYXJlZCBjb25uZWN0aW9uIGFuZCBleGl0X29uX2Rpc2Nvbm5lY3Qgd2hlbgorICAgKiB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIHJlYWNoZXMgdGhlIGhlYWQgb2YgdGhlIG1lc3NhZ2UgcXVldWUsCisgICAqIE5PVCB3aGVuIGl0J3MgZmlyc3QgcXVldWVkLgorICAgKi8KKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAvKiBUaGlzIGNhbGxzIG91dCB0byB1c2VyIGNvZGUgKi8KKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisKKyAgLyogQ291bGQgYWxzbyBjYWxsIG91dCB0byB1c2VyIGNvZGUgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBDbG9zZXMgYSBwcml2YXRlIGNvbm5lY3Rpb24sIHNvIG5vIGZ1cnRoZXIgZGF0YSBjYW4gYmUgc2VudCBvciByZWNlaXZlZC4KKyAqIFRoaXMgZGlzY29ubmVjdHMgdGhlIHRyYW5zcG9ydCAoc3VjaCBhcyBhIHNvY2tldCkgdW5kZXJseWluZyB0aGUKKyAqIGNvbm5lY3Rpb24uCisgKgorICogQXR0ZW1wdHMgdG8gc2VuZCBtZXNzYWdlcyBhZnRlciBjbG9zaW5nIGEgY29ubmVjdGlvbiBhcmUgc2FmZSwgYnV0IHdpbGwgcmVzdWx0IGluCisgKiBlcnJvciByZXBsaWVzIGdlbmVyYXRlZCBsb2NhbGx5IGluIGxpYmRidXMuCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBjb25uZWN0aW9uJ3MgcmVmZXJlbmNlIGNvdW50LiAgSXQncworICogc2FmZSB0byBjbG9zZSBhIGNvbm5lY3Rpb24gbW9yZSB0aGFuIG9uY2U7IGFsbCBjYWxscyBhZnRlciB0aGUKKyAqIGZpcnN0IGRvIG5vdGhpbmcuIEl0J3MgaW1wb3NzaWJsZSB0byAicmVvcGVuIiBhIGNvbm5lY3Rpb24sIGEKKyAqIG5ldyBjb25uZWN0aW9uIG11c3QgYmUgY3JlYXRlZC4gVGhpcyBmdW5jdGlvbiBtYXkgcmVzdWx0IGluIGEgY2FsbAorICogdG8gdGhlIERCdXNEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uIHNldCB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbigpLCBhcyB0aGUgZGlzY29ubmVjdAorICogbWVzc2FnZSBpdCBnZW5lcmF0ZXMgbmVlZHMgdG8gYmUgZGlzcGF0Y2hlZC4KKyAqCisgKiBJZiBhIGNvbm5lY3Rpb24gaXMgZHJvcHBlZCBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uLCBpdCB3aWxsCisgKiBjbG9zZSBpdHNlbGYuIAorICogCisgKiBZb3UgbXVzdCBjbG9zZSBhIGNvbm5lY3Rpb24gcHJpb3IgdG8gcmVsZWFzaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSB0bworICogdGhlIGNvbm5lY3Rpb24uIElmIHlvdSBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYoKSBmb3IgdGhlIGxhc3QgdGltZQorICogd2l0aG91dCBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLCB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkOyBpdAorICogaXMgYSBidWcgaW4geW91ciBwcm9ncmFtIGFuZCBsaWJkYnVzIHdpbGwgdHJ5IHRvIHByaW50IGEgd2FybmluZy4KKyAqCisgKiBZb3UgbWF5IG5vdCBjbG9zZSBhIHNoYXJlZCBjb25uZWN0aW9uLiBDb25uZWN0aW9ucyBjcmVhdGVkIHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgb3IgZGJ1c19idXNfZ2V0KCkgYXJlIHNoYXJlZC4KKyAqIFRoZXNlIGNvbm5lY3Rpb25zIGFyZSBvd25lZCBieSBsaWJkYnVzLCBhbmQgYXBwbGljYXRpb25zIHNob3VsZAorICogb25seSB1bnJlZiB0aGVtLCBuZXZlciBjbG9zZSB0aGVtLiBBcHBsaWNhdGlvbnMgY2FuIGtub3cgaXQgaXMKKyAqIHNhZmUgdG8gdW5yZWYgdGhlc2UgY29ubmVjdGlvbnMgYmVjYXVzZSBsaWJkYnVzIHdpbGwgYmUgaG9sZGluZyBhCisgKiByZWZlcmVuY2UgYXMgbG9uZyBhcyB0aGUgY29ubmVjdGlvbiBpcyBvcGVuLiBUaHVzLCBlaXRoZXIgdGhlCisgKiBjb25uZWN0aW9uIGlzIGNsb3NlZCBhbmQgaXQgaXMgT0sgdG8gZHJvcCB0aGUgbGFzdCByZWZlcmVuY2UsCisgKiBvciB0aGUgY29ubmVjdGlvbiBpcyBvcGVuIGFuZCB0aGUgYXBwIGtub3dzIGl0IGRvZXMgbm90IGhhdmUgdGhlCisgKiBsYXN0IHJlZmVyZW5jZS4KKyAqCisgKiBDb25uZWN0aW9ucyBjcmVhdGVkIHdpdGggZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpIG9yCisgKiBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpIGFyZSBub3Qga2VwdCB0cmFjayBvZiBvciByZWZlcmVuY2VkIGJ5CisgKiBsaWJkYnVzLiBUaGUgY3JlYXRvciBvZiB0aGVzZSBjb25uZWN0aW9ucyBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgcHJpb3IgdG8gcmVsZWFzaW5nIHRoZSBsYXN0CisgKiByZWZlcmVuY2UsIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhbHJlYWR5IGRpc2Nvbm5lY3RlZC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgcHJpdmF0ZSAodW5zaGFyZWQpIGNvbm5lY3Rpb24gdG8gY2xvc2UKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmIChjb25uZWN0aW9uLT5zaGFyZWFibGUpCisgICAgeworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIkFwcGxpY2F0aW9ucyBtdXN0IG5vdCBjbG9zZSBzaGFyZWQgY29ubmVjdGlvbnMgLSBzZWUgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgZG9jcy4gVGhpcyBpcyBhIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24uXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgCisgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIHJldHVybiBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKK30KKworLyoqCisgKiBHZXRzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IG9wZW4uICBBIGNvbm5lY3Rpb24gbWF5CisgKiBiZWNvbWUgZGlzY29ubmVjdGVkIHdoZW4gdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiBjbG9zZXMgaXRzIGVuZCwgb3IKKyAqIGV4aXRzOyBhIGNvbm5lY3Rpb24gbWF5IGFsc28gYmUgZGlzY29ubmVjdGVkIHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpLgorICogCisgKiBUaGVyZSBhcmUgbm90IHNlcGFyYXRlIHN0YXRlcyBmb3IgImNsb3NlZCIgYW5kICJkaXNjb25uZWN0ZWQsIiB0aGUgdHdvCisgKiB0ZXJtcyBhcmUgc3lub255bW91cy4gVGhpcyBmdW5jdGlvbiBzaG91bGQgcmVhbGx5IGJlIGNhbGxlZAorICogZ2V0X2lzX29wZW4oKSBidXQgZm9yIGhpc3RvcmljYWwgcmVhc29ucyBpcyBub3QuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBhbGl2ZS4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEdldHMgd2hldGhlciB0aGUgY29ubmVjdGlvbiB3YXMgYXV0aGVudGljYXRlZC4gKE5vdGUgdGhhdAorICogaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGF1dGhlbnRpY2F0ZWQgdGhlbiBkaXNjb25uZWN0ZWQsCisgKiB0aGlzIGZ1bmN0aW9uIHN0aWxsIHJldHVybnMgI1RSVUUpCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjb25uZWN0aW9uIHdhcyBldmVyIGF1dGhlbnRpY2F0ZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfaXNfYXV0aGVudGljYXRlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEdldHMgd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBub3QgYXV0aGVudGljYXRlZCBhcyBhIHNwZWNpZmljCisgKiB1c2VyLiAgSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGF1dGhlbnRpY2F0ZWQsIHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgI1RSVUUsIGFuZCBpZiBpdCBpcyBhdXRoZW50aWNhdGVkIGJ1dCBhcyBhbiBhbm9ueW1vdXMgdXNlciwKKyAqIGl0IHJldHVybnMgI1RSVUUuICBJZiBpdCBpcyBhdXRoZW50aWNhdGVkIGFzIGEgc3BlY2lmaWMgdXNlciwgdGhlbgorICogdGhpcyByZXR1cm5zICNGQUxTRS4gKE5vdGUgdGhhdCBpZiB0aGUgY29ubmVjdGlvbiB3YXMgYXV0aGVudGljYXRlZAorICogYXMgYW5vbnltb3VzIHRoZW4gZGlzY29ubmVjdGVkLCB0aGlzIGZ1bmN0aW9uIHN0aWxsIHJldHVybnMgI1RSVUUuKQorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhbm9ueW1vdXMsIHlvdSBjYW4gdXNlCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlcigpIGFuZAorICogZGJ1c19jb25uZWN0aW9uX2dldF93aW5kb3dzX3VzZXIoKSB0byBzZWUgd2hvIGl0J3MgYXV0aG9yaXplZCBhcy4KKyAqCisgKiBJZiB5b3Ugd2FudCB0byBwcmV2ZW50IG5vbi1hbm9ueW1vdXMgYXV0aG9yaXphdGlvbiwgdXNlCisgKiBkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zKCkgdG8gcmVtb3ZlIHRoZSBtZWNoYW5pc21zIHRoYXQKKyAqIGFsbG93IHByb3ZpbmcgdXNlciBpZGVudGl0eSAoaS5lLiBvbmx5IGFsbG93IHRoZSBBTk9OWU1PVVMKKyAqIG1lY2hhbmlzbSkuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiBub3QgYXV0aGVudGljYXRlZCBvciBhdXRoZW50aWNhdGVkIGFzIGFub255bW91cyAKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfaXNfYW5vbnltb3VzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Fub255bW91cyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBHZXRzIHRoZSBJRCBvZiB0aGUgc2VydmVyIGFkZHJlc3Mgd2UgYXJlIGF1dGhlbnRpY2F0ZWQgdG8sIGlmIHRoaXMKKyAqIGNvbm5lY3Rpb24gaXMgb24gdGhlIGNsaWVudCBzaWRlLiBJZiB0aGUgY29ubmVjdGlvbiBpcyBvbiB0aGUKKyAqIHNlcnZlciBzaWRlLCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiAjTlVMTCAtIHVzZSBkYnVzX3NlcnZlcl9nZXRfaWQoKQorICogdG8gZ2V0IHRoZSBJRCBvZiB5b3VyIG93biBzZXJ2ZXIsIGlmIHlvdSBhcmUgdGhlIHNlcnZlciBzaWRlLgorICogCisgKiBJZiBhIGNsaWVudC1zaWRlIGNvbm5lY3Rpb24gaXMgbm90IGF1dGhlbnRpY2F0ZWQgeWV0LCB0aGUgSUQgbWF5IGJlCisgKiBhdmFpbGFibGUgaWYgaXQgd2FzIGluY2x1ZGVkIGluIHRoZSBzZXJ2ZXIgYWRkcmVzcywgYnV0IG1heSBub3QgYmUKKyAqIGF2YWlsYWJsZS4gVGhlIG9ubHkgd2F5IHRvIGJlIHN1cmUgdGhlIHNlcnZlciBJRCBpcyBhdmFpbGFibGUKKyAqIGlzIHRvIHdhaXQgZm9yIGF1dGhlbnRpY2F0aW9uIHRvIGNvbXBsZXRlLgorICoKKyAqIEluIGdlbmVyYWwsIGVhY2ggbW9kZSBvZiBjb25uZWN0aW5nIHRvIGEgZ2l2ZW4gc2VydmVyIHdpbGwgaGF2ZQorICogaXRzIG93biBJRC4gU28gZm9yIGV4YW1wbGUsIGlmIHRoZSBzZXNzaW9uIGJ1cyBkYWVtb24gaXMgbGlzdGVuaW5nCisgKiBvbiBVTklYIGRvbWFpbiBzb2NrZXRzIGFuZCBvbiBUQ1AsIHRoZW4gZWFjaCBvZiB0aG9zZSBtb2RhbGl0aWVzCisgKiB3aWxsIGhhdmUgaXRzIG93biBzZXJ2ZXIgSUQuCisgKgorICogSWYgeW91IHdhbnQgYW4gSUQgdGhhdCBpZGVudGlmaWVzIGFuIGVudGlyZSBzZXNzaW9uIGJ1cywgbG9vayBhdAorICogZGJ1c19idXNfZ2V0X2lkKCkgaW5zdGVhZCAod2hpY2ggaXMganVzdCBhIGNvbnZlbmllbmNlIHdyYXBwZXIKKyAqIGFyb3VuZCB0aGUgb3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQgbWV0aG9kIGludm9rZWQgb24gdGhlIGJ1cykuCisgKgorICogWW91IGNhbiBhbHNvIGdldCBhIG1hY2hpbmUgSUQ7IHNlZSBkYnVzX2dldF9sb2NhbF9tYWNoaW5lX2lkKCkgdG8KKyAqIGdldCB0aGUgbWFjaGluZSB5b3UgYXJlIG9uLiAgVGhlcmUgaXNuJ3QgYSBjb252ZW5pZW5jZSB3cmFwcGVyLCBidXQKKyAqIHlvdSBjYW4gaW52b2tlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuR2V0TWFjaGluZUlkIG9uIGFueSBwZWVyCisgKiB0byBnZXQgdGhlIG1hY2hpbmUgSUQgb24gdGhlIG90aGVyIGVuZC4KKyAqIAorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIHRoZSBzZXJ2ZXIgSUQgYW5kIG90aGVyIElEcyBpbiBhCisgKiBiaXQgbW9yZSBkZXRhaWwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBzZXJ2ZXIgSUQgb3IgI05VTEwgaWYgbm8gbWVtb3J5IG9yIHRoZSBjb25uZWN0aW9uIGlzIHNlcnZlci1zaWRlCisgKi8KK2NoYXIqCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlcnZlcl9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGNoYXIgKmlkOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBpZCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfdHJhbnNwb3J0X2dldF9zZXJ2ZXJfaWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgYSBjZXJ0YWluIHR5cGUgY2FuIGJlIHNlbmQgdmlhIHRoZSBjb25uZWN0aW9uLiBUaGlzCisgKiB3aWxsIGFsd2F5cyByZXR1cm4gVFJVRSBmb3IgYWxsIHR5cGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YKKyAqIERCVVNfVFlQRV9VTklYX0ZELiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gVFJVRSBmb3IKKyAqIERCVVNfVFlQRV9VTklYX0ZEIG9ubHkgb24gc3lzdGVtcyB0aGF0IGtub3cgVW5peCBmaWxlIGRlc2NyaXB0b3JzCisgKiBhbmQgY2FuIHNlbmQgdGhlbSB2aWEgdGhlIGNob3NlbiB0cmFuc3BvcnQgYW5kIHdoZW4gdGhlIHJlbW90ZSBzaWRlCisgKiBzdXBwb3J0cyB0aGlzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZG8gcnVudGltZSBjaGVja2luZyBmb3IgdHlwZXMgdGhhdAorICogbWlnaHQgYmUgdW5rbm93biB0byB0aGUgc3BlY2lmaWMgRC1CdXMgY2xpZW50IGltcGxlbWVudGF0aW9uCisgKiB2ZXJzaW9uLCBpLmUuIGl0IHdpbGwgcmV0dXJuIEZBTFNFIGZvciBhbGwgdHlwZXMgdGhpcworICogaW1wbGVtZW50YXRpb24gZG9lcyBub3Qga25vdywgaW5jbHVkaW5nIGludmFsaWQgb3IgcmVzZXJ2ZWQgdHlwZXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIGNoZWNrCisgKiBAcmV0dXJucyBUUlVFIGlmIHRoZSB0eXBlIG1heSBiZSBzZW5kIHZpYSB0aGUgY29ubmVjdGlvbgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKCFfZGJ1c190eXBlX2lzX3ZhbGlkKHR5cGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCkKKyAgICByZXR1cm4gVFJVRTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHsKKyAgICBkYnVzX2Jvb2xfdCBiOworCisgICAgQ09OTkVDVElPTl9MT0NLKGNvbm5lY3Rpb24pOworICAgIGIgPSBfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICAgIENPTk5FQ1RJT05fVU5MT0NLKGNvbm5lY3Rpb24pOworCisgICAgcmV0dXJuIGI7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZXQgd2hldGhlciBfZXhpdCgpIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiByZWNlaXZlcyBhCisgKiBkaXNjb25uZWN0IHNpZ25hbC4gVGhlIGNhbGwgdG8gX2V4aXQoKSBjb21lcyBhZnRlciBhbnkgaGFuZGxlcnMgZm9yCisgKiB0aGUgZGlzY29ubmVjdCBzaWduYWwgcnVuOyBoYW5kbGVycyBjYW4gY2FuY2VsIHRoZSBleGl0IGJ5IGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogQnkgZGVmYXVsdCwgZXhpdF9vbl9kaXNjb25uZWN0IGlzICNGQUxTRTsgYnV0IGZvciBtZXNzYWdlIGJ1cworICogY29ubmVjdGlvbnMgcmV0dXJuZWQgZnJvbSBkYnVzX2J1c19nZXQoKSBpdCB3aWxsIGJlIHRvZ2dsZWQgb24KKyAqIGJ5IGRlZmF1bHQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBleGl0X29uX2Rpc2Nvbm5lY3QgI1RSVUUgaWYgX2V4aXQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgZGlzY29ubmVjdCBzaWduYWwKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBleGl0X29uX2Rpc2Nvbm5lY3QpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIGNvbm5lY3Rpb24tPmV4aXRfb25fZGlzY29ubmVjdCA9IGV4aXRfb25fZGlzY29ubmVjdCAhPSBGQUxTRTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIFByZWFsbG9jYXRlcyByZXNvdXJjZXMgbmVlZGVkIHRvIHNlbmQgYSBtZXNzYWdlLCBhbGxvd2luZyB0aGUgbWVzc2FnZSAKKyAqIHRvIGJlIHNlbnQgd2l0aG91dCB0aGUgcG9zc2liaWxpdHkgb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KKyAqIEFsbG93cyBhcHBzIHRvIGNyZWF0ZSBhIGZ1dHVyZSBndWFyYW50ZWUgdGhhdCB0aGV5IGNhbiBzZW5kCisgKiBhIG1lc3NhZ2UgcmVnYXJkbGVzcyBvZiBtZW1vcnkgc2hvcnRhZ2VzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIHdlJ3JlIHByZWFsbG9jYXRpbmcgZm9yLgorICogQHJldHVybnMgdGhlIHByZWFsbG9jYXRlZCByZXNvdXJjZXMsIG9yICNOVUxMCisgKi8KK0RCdXNQcmVhbGxvY2F0ZWRTZW5kKgorZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcHJlYWxsb2NhdGVkID0KKyAgICBfZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcHJlYWxsb2NhdGVkOworfQorCisvKioKKyAqIEZyZWVzIHByZWFsbG9jYXRlZCBtZXNzYWdlLXNlbmRpbmcgcmVzb3VyY2VzIGZyb20KKyAqIGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKCkuIFNob3VsZCBvbmx5CisgKiBiZSBjYWxsZWQgaWYgdGhlIHByZWFsbG9jYXRlZCByZXNvdXJjZXMgYXJlIG5vdCB1c2VkCisgKiB0byBzZW5kIGEgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHByZWFsbG9jYXRlZCB0aGUgcmVzb3VyY2VzCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsgIAorICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiA9PSBwcmVhbGxvY2F0ZWQtPmNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworICBfZGJ1c19jb3VudGVyX3VucmVmIChwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluay0+ZGF0YSk7CisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayk7CisgIGRidXNfZnJlZSAocHJlYWxsb2NhdGVkKTsKK30KKworLyoqCisgKiBTZW5kcyBhIG1lc3NhZ2UgdXNpbmcgcHJlYWxsb2NhdGVkIHJlc291cmNlcy4gVGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbC4KKyAqIEl0IHdvcmtzIGlkZW50aWNhbGx5IHRvIGRidXNfY29ubmVjdGlvbl9zZW5kKCkgaW4gb3RoZXIgcmVzcGVjdHMuCisgKiBQcmVhbGxvY2F0ZWQgcmVzb3VyY2VzIGNvbWVzIGZyb20gZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQoKS4KKyAqIFRoaXMgZnVuY3Rpb24gImNvbnN1bWVzIiB0aGUgcHJlYWxsb2NhdGVkIHJlc291cmNlcywgdGhleSBuZWVkIG5vdAorICogYmUgZnJlZWQgc2VwYXJhdGVseS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHByZWFsbG9jYXRlZCB0aGUgcHJlYWxsb2NhdGVkIHJlc291cmNlcworICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2VuZAorICogQHBhcmFtIGNsaWVudF9zZXJpYWwgcmV0dXJuIGxvY2F0aW9uIGZvciBjbGllbnQgc2VyaWFsIGFzc2lnbmVkIHRvIHRoZSBtZXNzYWdlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwcmVhbGxvY2F0ZWQgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocHJlYWxsb2NhdGVkLT5jb25uZWN0aW9uID09IGNvbm5lY3Rpb24pOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSAhPSBOVUxMKSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpICYmCisgICAgICBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICAvKiBSZWZ1c2UgdG8gc2VuZCBmZHMgb24gYSBjb25uZWN0aW9uIHRoYXQgY2Fubm90IGhhbmRsZQorICAgICAgICAgdGhlbS4gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgcmV0dXJuIGEgcHJvcGVyIGVycm9yIGhlcmUsIHNvCisgICAgICAgICB0aGUgYmVzdCB3ZSBjYW4gaXMganVzdCByZXR1cm4uICovCisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm47CisgICAgfQorCisjZW5kaWYKKworICBfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sCisJCQkJCQkgcHJlYWxsb2NhdGVkLAorCQkJCQkJIG1lc3NhZ2UsIGNsaWVudF9zZXJpYWwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X3NlcmlhbCk7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZHMgYSBtZXNzYWdlIHRvIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlLiBEb2VzIG5vdCBibG9jayB0bworICogd3JpdGUgdGhlIG1lc3NhZ2UgdG8gdGhlIG5ldHdvcms7IHRoYXQgaGFwcGVucyBhc3luY2hyb25vdXNseS4gVG8KKyAqIGZvcmNlIHRoZSBtZXNzYWdlIHRvIGJlIHdyaXR0ZW4sIGNhbGwgZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkgaG93ZXZlcgorICogaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIGRidXNfY29ubmVjdGlvbl9mbHVzaCgpIGJ5IGhhbmQ7IHRoZSAKKyAqIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgdGhlIG1haW4gbG9vcCBpcyBydW4uIAorICogZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCwgZm9yIGV4YW1wbGUsIGlmCisgKiB0aGUgYXBwbGljYXRpb24gd2FzIGV4cGVjdGVkIHRvIGV4aXQgYmVmb3JlIHJ1bm5pbmcgdGhlIG1haW4gbG9vcC4KKyAqCisgKiBCZWNhdXNlIHRoaXMgb25seSBxdWV1ZXMgdGhlIG1lc3NhZ2UsIHRoZSBvbmx5IHJlYXNvbiBpdCBjYW4KKyAqIGZhaWwgaXMgbGFjayBvZiBtZW1vcnkuIEV2ZW4gaWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLAorICogbm8gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgCisgKiBpdCByZXR1cm5zICNGQUxTRS4gVGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgZmFpbCBmb3Igb3RoZXIgcmVhc29uczsgZXZlbiAKKyAqIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCwgeW91IGNhbiBxdWV1ZSBhbiBvdXRnb2luZyBtZXNzYWdlLAorICogdGhvdWdoIG9idmlvdXNseSBpdCB3b24ndCBiZSBzZW50LgorICoKKyAqIFRoZSBtZXNzYWdlIHNlcmlhbCBpcyB1c2VkIGJ5IHRoZSByZW1vdGUgYXBwbGljYXRpb24gdG8gc2VuZCBhCisgKiByZXBseTsgc2VlIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsKCkgb3IgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogZGJ1c19tZXNzYWdlX3VucmVmKCkgY2FuIGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoaXMgbWV0aG9kIHJldHVybnMKKyAqIGFzIHRoZSBtZXNzYWdlIHF1ZXVlIHdpbGwgaG9sZCBpdHMgb3duIHJlZiB1bnRpbCB0aGUgbWVzc2FnZSBpcyBzZW50LgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHdyaXRlLgorICogQHBhcmFtIHNlcmlhbCByZXR1cm4gbG9jYXRpb24gZm9yIG1lc3NhZ2Ugc2VyaWFsLCBvciAjTlVMTCBpZiB5b3UgZG9uJ3QgY2FyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZW5kIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqc2VyaWFsKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSAmJgorICAgICAgbWVzc2FnZS0+bl91bml4X2ZkcyA+IDApCisgICAgeworICAgICAgLyogUmVmdXNlIHRvIHNlbmQgZmRzIG9uIGEgY29ubmVjdGlvbiB0aGF0IGNhbm5vdCBoYW5kbGUKKyAgICAgICAgIHRoZW0uIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHJldHVybiBhIHByb3BlciBlcnJvciBoZXJlLCBzbworICAgICAgICAgdGhlIGJlc3Qgd2UgY2FuIGlzIGp1c3QgcmV0dXJuLiAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2VuZGlmCisKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLAorCQkJCQkgICBtZXNzYWdlLAorCQkJCQkgICBzZXJpYWwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlcGx5X2hhbmRsZXJfdGltZW91dCAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZyA9IGRhdGE7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAocGVuZGluZyk7CisKKyAgX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKHBlbmRpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisJCQkJICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJtaWRkbGVcbiIpOworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIFVubG9ja3MsIGFuZCBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUXVldWVzIGEgbWVzc2FnZSB0byBzZW5kLCBhcyB3aXRoIGRidXNfY29ubmVjdGlvbl9zZW5kKCksCisgKiBidXQgYWxzbyByZXR1cm5zIGEgI0RCdXNQZW5kaW5nQ2FsbCB1c2VkIHRvIHJlY2VpdmUgYSByZXBseSB0byB0aGUKKyAqIG1lc3NhZ2UuIElmIG5vIHJlcGx5IGlzIHJlY2VpdmVkIGluIHRoZSBnaXZlbiB0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAqIHRoaXMgZnVuY3Rpb24gZXhwaXJlcyB0aGUgcGVuZGluZyByZXBseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGhldGljCisgKiBlcnJvciByZXBseSAoZ2VuZXJhdGVkIGluLXByb2Nlc3MsIG5vdCBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uKQorICogaW5kaWNhdGluZyB0aGF0IGEgdGltZW91dCBvY2N1cnJlZC4KKyAqCisgKiBBICNEQnVzUGVuZGluZ0NhbGwgd2lsbCBzZWUgYSByZXBseSBtZXNzYWdlIGJlZm9yZSBhbnkgZmlsdGVycyBvcgorICogcmVnaXN0ZXJlZCBvYmplY3QgcGF0aCBoYW5kbGVycy4gU2VlIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIGZvcgorICogZGV0YWlscyBvbiB3aGVuIGhhbmRsZXJzIGFyZSBydW4uCisgKgorICogQSAjREJ1c1BlbmRpbmdDYWxsIHdpbGwgYWx3YXlzIHNlZSBleGFjdGx5IG9uZSByZXBseSBtZXNzYWdlLAorICogdW5sZXNzIGl0J3MgY2FuY2VsbGVkIHdpdGggZGJ1c19wZW5kaW5nX2NhbGxfY2FuY2VsKCkuCisgKiAKKyAqIElmICNOVUxMIGlzIHBhc3NlZCBmb3IgdGhlIHBlbmRpbmdfcmV0dXJuLCB0aGUgI0RCdXNQZW5kaW5nQ2FsbAorICogd2lsbCBzdGlsbCBiZSBnZW5lcmF0ZWQgaW50ZXJuYWxseSwgYW5kIHVzZWQgdG8gdHJhY2sKKyAqIHRoZSBtZXNzYWdlIHJlcGx5IHRpbWVvdXQuIFRoaXMgbWVhbnMgYSB0aW1lb3V0IGVycm9yIHdpbGwKKyAqIG9jY3VyIGlmIG5vIHJlcGx5IGFycml2ZXMsIHVubGlrZSB3aXRoIGRidXNfY29ubmVjdGlvbl9zZW5kKCkuCisgKgorICogSWYgLTEgaXMgcGFzc2VkIGZvciB0aGUgdGltZW91dCwgYSBzYW5lIGRlZmF1bHQgdGltZW91dCBpcyB1c2VkLiAtMQorICogaXMgdHlwaWNhbGx5IHRoZSBiZXN0IHZhbHVlIGZvciB0aGUgdGltZW91dCBmb3IgdGhpcyByZWFzb24sIHVubGVzcworICogeW91IHdhbnQgYSB2ZXJ5IHNob3J0IG9yIHZlcnkgbG9uZyB0aW1lb3V0LiAgSWYgSU5UX01BWCBpcyBwYXNzZWQgZm9yCisgKiB0aGUgdGltZW91dCwgbm8gdGltZW91dCB3aWxsIGJlIHNldCBhbmQgdGhlIGNhbGwgd2lsbCBibG9jayBmb3JldmVyLgorICoKKyAqIEB3YXJuaW5nIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCBvciB5b3UgdHJ5IHRvIHNlbmQgVW5peAorICogZmlsZSBkZXNjcmlwdG9ycyBvbiBhIGNvbm5lY3Rpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZW0sIHRoZQorICogI0RCdXNQZW5kaW5nQ2FsbCB3aWxsIGJlIHNldCB0byAjTlVMTCwgc28gYmUgY2FyZWZ1bCB3aXRoIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNlbmQKKyAqIEBwYXJhbSBwZW5kaW5nX3JldHVybiByZXR1cm4gbG9jYXRpb24gZm9yIGEgI0RCdXNQZW5kaW5nQ2FsbAorICogb2JqZWN0LCBvciAjTlVMTCBpZiBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCBvciB3aGVuIHlvdSB0cnkgdG8KKyAqIHNlbmQgVW5peCBmaWxlIGRlc2NyaXB0b3JzIG9uIGEgY29ubmVjdGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQKKyAqIHRoZW0uCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIC0xIGZvciBkZWZhdWx0IG9yIElOVF9NQVggZm9yIG5vIHRpbWVvdXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnksICNUUlVFIG90aGVyd2lzZS4KKyAqCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgICAqKnBlbmRpbmdfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBkYnVzX2ludDMyX3Qgc2VyaWFsID0gLTE7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lb3V0X21pbGxpc2Vjb25kcyA+PSAwIHx8IHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xLCBGQUxTRSk7CisKKyAgaWYgKHBlbmRpbmdfcmV0dXJuKQorICAgICpwZW5kaW5nX3JldHVybiA9IE5VTEw7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpICYmCisgICAgICBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICAvKiBSZWZ1c2UgdG8gc2VuZCBmZHMgb24gYSBjb25uZWN0aW9uIHRoYXQgY2Fubm90IGhhbmRsZQorICAgICAgICAgdGhlbS4gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgcmV0dXJuIGEgcHJvcGVyIGVycm9yIGhlcmUsIHNvCisgICAgICAgICB0aGUgYmVzdCB3ZSBjYW4gZG8gaXMgcmV0dXJuIFRSVUUgYnV0IGxlYXZlICpwZW5kaW5nX3JldHVybgorICAgICAgICAgYXMgTlVMTC4gKi8KKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworI2VuZGlmCisKKyAgIGlmICghX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBwZW5kaW5nID0gX2RidXNfcGVuZGluZ19jYWxsX25ld191bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfaGFuZGxlcl90aW1lb3V0KTsKKworICBpZiAocGVuZGluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogQXNzaWduIGEgc2VyaWFsIHRvIHRoZSBtZXNzYWdlICovCisgIHNlcmlhbCA9IGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKTsKKyAgaWYgKHNlcmlhbCA9PSAwKQorICAgIHsKKyAgICAgIHNlcmlhbCA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X25leHRfY2xpZW50X3NlcmlhbCAoY29ubmVjdGlvbik7CisgICAgICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAobWVzc2FnZSwgc2VyaWFsKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKHBlbmRpbmcsIG1lc3NhZ2UsIHNlcmlhbCkpCisgICAgZ290byBlcnJvcjsKKyAgICAKKyAgLyogSW5zZXJ0IHRoZSBzZXJpYWwgaW4gdGhlIHBlbmRpbmcgcmVwbGllcyBoYXNoOworICAgKiBoYXNoIHRha2VzIGEgcmVmY291bnQgb24gREJ1c1BlbmRpbmdDYWxsLgorICAgKiBBbHNvLCBhZGQgdGhlIHRpbWVvdXQuCisgICAqLworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYXR0YWNoX3BlbmRpbmdfY2FsbF91bmxvY2tlZCAoY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgIHBlbmRpbmcpKQorICAgIGdvdG8gZXJyb3I7CisgCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgbWVzc2FnZSwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sCisJCQkJCQkgICAgICAgcGVuZGluZyk7CisgICAgICBnb3RvIGVycm9yX3VubG9ja2VkOworICAgIH0KKworICBpZiAocGVuZGluZ19yZXR1cm4pCisgICAgKnBlbmRpbmdfcmV0dXJuID0gcGVuZGluZzsgLyogaGFuZCBvZmYgcmVmY291bnQgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZGV0YWNoX3BlbmRpbmdfY2FsbF91bmxvY2tlZCAoY29ubmVjdGlvbiwgcGVuZGluZyk7CisgICAgICAvKiB3ZSBzdGlsbCBoYXZlIGEgcmVmIHRvIHRoZSBwZW5kaW5nIGNhbGwgaW4gdGhpcyBjYXNlLCB3ZSB1bnJlZgorICAgICAgICogYWZ0ZXIgdW5sb2NraW5nLCBiZWxvdworICAgICAgICovCisgICAgfQorCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIGlmIChwZW5kaW5nX3JldHVybiA9PSBOVUxMKQorICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKKyAgCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyBlcnJvcl91bmxvY2tlZDoKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VuZHMgYSBtZXNzYWdlIGFuZCBibG9ja3MgYSBjZXJ0YWluIHRpbWUgcGVyaW9kIHdoaWxlIHdhaXRpbmcgZm9yCisgKiBhIHJlcGx5LiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWVudGVyIHRoZSBtYWluIGxvb3AsCisgKiBpLmUuIG1lc3NhZ2VzIG90aGVyIHRoYW4gdGhlIHJlcGx5IGFyZSBxdWV1ZWQgdXAgYnV0IG5vdAorICogcHJvY2Vzc2VkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW52b2tlIG1ldGhvZCBjYWxscyBvbiBhCisgKiByZW1vdGUgb2JqZWN0LgorICogCisgKiBJZiBhIG5vcm1hbCByZXBseSBpcyByZWNlaXZlZCwgaXQgaXMgcmV0dXJuZWQsIGFuZCByZW1vdmVkIGZyb20gdGhlCisgKiBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLiBJZiBpdCBpcyBub3QgcmVjZWl2ZWQsICNOVUxMIGlzIHJldHVybmVkCisgKiBhbmQgdGhlIGVycm9yIGlzIHNldCB0byAjREJVU19FUlJPUl9OT19SRVBMWS4gIElmIGFuIGVycm9yIHJlcGx5IGlzCisgKiByZWNlaXZlZCwgaXQgaXMgY29udmVydGVkIHRvIGEgI0RCdXNFcnJvciBhbmQgcmV0dXJuZWQgYXMgYW4gZXJyb3IsCisgKiB0aGVuIHRoZSByZXBseSBtZXNzYWdlIGlzIGRlbGV0ZWQgYW5kICNOVUxMIGlzIHJldHVybmVkLiBJZgorICogc29tZXRoaW5nIGVsc2UgZ29lcyB3cm9uZywgcmVzdWx0IGlzIHNldCB0byB3aGF0ZXZlciBpcworICogYXBwcm9wcmlhdGUsIHN1Y2ggYXMgI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAjREJVU19FUlJPUl9ESVNDT05ORUNURUQuCisgKgorICogQHdhcm5pbmcgV2hpbGUgdGhpcyBmdW5jdGlvbiBibG9ja3MgdGhlIGNhbGxpbmcgdGhyZWFkIHdpbGwgbm90IGJlCisgKiBwcm9jZXNzaW5nIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLiBUaGlzIG1lYW5zIHlvdSBjYW4gZW5kIHVwCisgKiBkZWFkbG9ja2VkIGlmIHRoZSBhcHBsaWNhdGlvbiB5b3UncmUgdGFsa2luZyB0byBuZWVkcyB5b3UgdG8gcmVwbHkKKyAqIHRvIGEgbWV0aG9kLiBUbyBzb2x2ZSB0aGlzLCBlaXRoZXIgYXZvaWQgdGhlIHNpdHVhdGlvbiwgYmxvY2sgaW4gYQorICogc2VwYXJhdGUgdGhyZWFkIGZyb20gdGhlIG1haW4gY29ubmVjdGlvbi1kaXNwYXRjaGluZyB0aHJlYWQsIG9yIHVzZQorICogZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSgpIHRvIGF2b2lkIGJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIC0xIGZvciBkZWZhdWx0IG9yIElOVF9NQVggZm9yIG5vIHRpbWVvdXQuCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGlzIHRoZSByZXBseSBvciAjTlVMTCB3aXRoIGFuIGVycm9yIGNvZGUgaWYgdGhlCisgKiBmdW5jdGlvbiBmYWlscy4KKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIE5VTEwpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkgJiYKKyAgICAgIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkNhbm5vdCBzZW5kIGZpbGUgZGVzY3JpcHRvcnMgb24gdGhpcyBjb25uZWN0aW9uLiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyNlbmRpZgorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoY29ubmVjdGlvbiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZywgdGltZW91dF9taWxsaXNlY29uZHMpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAocGVuZGluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9ESVNDT05ORUNURUQsICJDb25uZWN0aW9uIGlzIGNsb3NlZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKHBlbmRpbmcpOworCisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisKKyAgLyogY2FsbF9jb21wbGV0ZV9hbmRfdW5sb2NrKCkgY2FsbGVkIGZyb20gcGVuZGluZ19jYWxsX2Jsb2NrKCkgc2hvdWxkCisgICAqIGFsd2F5cyBmaWxsIHRoaXMgaW4uCisgICAqLworICBfZGJ1c19hc3NlcnQgKHJlcGx5ICE9IE5VTEwpOworICAKKyAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gcmVwbHk7Cit9CisKKy8qKgorICogQmxvY2tzIHVudGlsIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlIGlzIGVtcHR5LgorICogQXNzdW1lcyBjb25uZWN0aW9uIGxvY2sgYWxyZWFkeSBoZWxkLgorICoKKyAqIElmIHlvdSBjYWxsIHRoaXMsIHlvdSBNVVNUIGNhbGwgdXBkYXRlX2Rpc3BhdGNoX3N0YXR1cyBhZnRlcndvcmQuLi4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyBEQnVzRGlzcGF0Y2hTdGF0dXMKK19kYnVzX2Nvbm5lY3Rpb25fZmx1c2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICAvKiBXZSBoYXZlIHRvIHNwZWNpZnkgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyBoZXJlIGJlY2F1c2UKKyAgICogb3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgdHdvIGFwcHMgZGVhZGxvY2sgaWYgdGhleSBhcmUgYm90aCBkb2luZworICAgKiBhIGZsdXNoKCksIGFuZCB0aGUga2VybmVsIGJ1ZmZlcnMgZmlsbCB1cC4gVGhpcyBjb3VsZCBjaGFuZ2UgdGhlCisgICAqIGRpc3BhdGNoIHN0YXR1cy4KKyAgICovCisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIHdoaWxlIChjb25uZWN0aW9uLT5uX291dGdvaW5nID4gMCAmJgorICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZG9pbmcgaXRlcmF0aW9uIGluXG4iKTsKKyAgICAgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKyAgICB9CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBCbG9ja3MgdW50aWwgdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9mbHVzaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIFdlIGhhdmUgdG8gc3BlY2lmeSBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIGhlcmUgYmVjYXVzZQorICAgKiBvdGhlcndpc2Ugd2UgY291bGQgaGF2ZSB0d28gYXBwcyBkZWFkbG9jayBpZiB0aGV5IGFyZSBib3RoIGRvaW5nCisgICAqIGEgZmx1c2goKSwgYW5kIHRoZSBrZXJuZWwgYnVmZmVycyBmaWxsIHVwLiBUaGlzIGNvdWxkIGNoYW5nZSB0aGUKKyAgICogZGlzcGF0Y2ggc3RhdHVzLgorICAgKi8KKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9mbHVzaF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAvKiBVbmxvY2tzIGFuZCBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpIGFuZAorICogZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoKSAodGhleSBwYXNzIGEgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUKKyAqIGRpc3BhdGNoIHBhcmFtZXRlcikuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbWF4IHRpbWUgdG8gYmxvY2sgb3IgLTEgZm9yIGluZmluaXRlCisgKiBAcGFyYW0gZGlzcGF0Y2ggZGlzcGF0Y2ggbmV3IG1lc3NhZ2VzIG9yIGxlYXZlIHRoZW0gb24gdGhlIGluY29taW5nIHF1ZXVlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGhhcyBub3QgYmVlbiBwcm9jZXNzZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGRpc3BhdGNoKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgZHN0YXR1czsKKyAgZGJ1c19ib29sX3QgcHJvZ3Jlc3NfcG9zc2libGU7CisKKyAgLyogTmVlZCB0byBncmFiIGEgcmVmIGhlcmUgaW4gY2FzZSB3ZSdyZSBhIHByaXZhdGUgY29ubmVjdGlvbiBhbmQKKyAgICogdGhlIHVzZXIgZHJvcHMgdGhlIGxhc3QgcmVmIGluIGEgaGFuZGxlciB3ZSBjYWxsOyBzZWUgYnVnIAorICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYzNQorICAgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgIGRzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbik7CisKKyAgaWYgKGRpc3BhdGNoICYmIGRzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRvaW5nIGRpc3BhdGNoXG4iKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisgICAgICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAgIH0KKyAgZWxzZSBpZiAoZHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwYXVzaW5nIGZvciBtZW1vcnlcbiIpOworICAgICAgX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRvaW5nIGl0ZXJhdGlvblxuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19XUklUSU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIC8qIElmIHdlIGNhbiBkaXNwYXRjaCwgd2UgY2FuIG1ha2UgcHJvZ3Jlc3MgdW50aWwgdGhlIERpc2Nvbm5lY3RlZCBtZXNzYWdlCisgICAqIGhhcyBiZWVuIHByb2Nlc3NlZDsgaWYgd2UgY2FuIG9ubHkgcmVhZC93cml0ZSwgd2UgY2FuIG1ha2UgcHJvZ3Jlc3MKKyAgICogYXMgbG9uZyBhcyB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAqLworICBpZiAoZGlzcGF0Y2gpCisgICAgcHJvZ3Jlc3NfcG9zc2libGUgPSBjb25uZWN0aW9uLT5uX2luY29taW5nICE9IDAgfHwKKyAgICAgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rICE9IE5VTEw7CisgIGVsc2UKKyAgICBwcm9ncmVzc19wb3NzaWJsZSA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHByb2dyZXNzX3Bvc3NpYmxlOyAvKiBUUlVFIGlmIHdlIGNhbiBtYWtlIG1vcmUgcHJvZ3Jlc3MgKi8KK30KKworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQKKyAqIHRvIHdyaXRlIGEgbWFpbiBsb29wIGFuZCBkZWFsIHdpdGggI0RCdXNXYXRjaCBhbmQgI0RCdXNUaW1lb3V0LiBBbgorICogZXhhbXBsZSB1c2FnZSB3b3VsZCBiZToKKyAqIAorICogQGNvZGUKKyAqICAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIChjb25uZWN0aW9uLCAtMSkpCisgKiAgICAgOyAvLyBlbXB0eSBsb29wIGJvZHkKKyAqIEBlbmRjb2RlCisgKiAKKyAqIEluIHRoaXMgdXNhZ2UgeW91IHdvdWxkIG5vcm1hbGx5IGhhdmUgc2V0IHVwIGEgZmlsdGVyIGZ1bmN0aW9uIHRvIGxvb2sKKyAqIGF0IGVhY2ggbWVzc2FnZSBhcyBpdCBpcyBkaXNwYXRjaGVkLiBUaGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4gdGhlIGxhc3QKKyAqIG1lc3NhZ2UgZnJvbSB0aGUgY29ubmVjdGlvbiAodGhlIGRpc2Nvbm5lY3RlZCBzaWduYWwpIGlzIHByb2Nlc3NlZC4KKyAqIAorICogSWYgdGhlcmUgYXJlIG1lc3NhZ2VzIHRvIGRpc3BhdGNoLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIG9uY2UsIGFuZCByZXR1cm4uIElmIHRoZXJlIGFyZSBubworICogbWVzc2FnZXMgdG8gZGlzcGF0Y2gsIHRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCBpdCBjYW4gcmVhZCBvcgorICogd3JpdGUsIHRoZW4gcmVhZCBvciB3cml0ZSwgdGhlbiByZXR1cm4uCisgKgorICogVGhlIHdheSB0byB0aGluayBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaXQgZWl0aGVyIG1ha2VzIHNvbWUgc29ydAorICogb2YgcHJvZ3Jlc3MsIG9yIGl0IGJsb2Nrcy4gTm90ZSB0aGF0LCB3aGlsZSBpdCBpcyBibG9ja2VkIG9uIEkvTywgaXQKKyAqIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCAoZXZlbiBieSBvdGhlciB0aHJlYWRzKSwgd2hpY2ggbWFrZXMgdGhpcyBmdW5jdGlvbgorICogdW5zdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgZG8gbW9yZSB0aGFuIGp1c3QgcmVhY3QgdG8gcmVjZWl2ZWQKKyAqIG1lc3NhZ2VzLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBoYXMgYmVlbgorICogcHJvY2Vzc2VkLCBOT1Qgd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQuIFRoaXMgaXMKKyAqIGltcG9ydGFudCBiZWNhdXNlIGV2ZW4gYWZ0ZXIgZGlzY29ubmVjdGluZywgeW91IHdhbnQgdG8gcHJvY2VzcyBhbnkKKyAqIG1lc3NhZ2VzIHlvdSByZWNlaXZlZCBwcmlvciB0byB0aGUgZGlzY29ubmVjdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIG1heCB0aW1lIHRvIGJsb2NrIG9yIC0xIGZvciBpbmZpbml0ZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEsIEZBTFNFKTsKKyAgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goY29ubmVjdGlvbiwgdGltZW91dF9taWxsaXNlY29uZHMsIFRSVUUpOworfQorCisvKiogCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvCisgKiB3cml0ZSBhIG1haW4gbG9vcCBhbmQgZGVhbCB3aXRoICNEQnVzV2F0Y2ggYW5kICNEQnVzVGltZW91dC4gU2VlIGFsc28KKyAqIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKCkuCisgKiAKKyAqIEFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbiwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGl0IGNhbgorICogcmVhZCBvciB3cml0ZSwgdGhlbiByZWFkIG9yIHdyaXRlLCB0aGVuIHJldHVybiAjVFJVRS4KKyAqCisgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQsIHRoZSBmdW5jdGlvbiByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHJlYWRpbmcgb3Igd3JpdGluZyBpcyBzdGlsbAorICogcG9zc2libGUsIGkuZS4gd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQuCisgKgorICogTm90ZSB0aGF0IGV2ZW4gYWZ0ZXIgZGlzY29ubmVjdGlvbiwgbWVzc2FnZXMgbWF5IHJlbWFpbiBpbiB0aGUKKyAqIGluY29taW5nIHF1ZXVlIHRoYXQgbmVlZCB0byBiZQorICogcHJvY2Vzc2VkLiBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpIGRpc3BhdGNoZXMKKyAqIGluY29taW5nIG1lc3NhZ2VzIGZvciB5b3U7IHdpdGggZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoKSB5b3UKKyAqIGhhdmUgdG8gYXJyYW5nZSB0byBkcmFpbiB0aGUgaW5jb21pbmcgcXVldWUgeW91cnNlbGYuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIAorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIG1heCB0aW1lIHRvIGJsb2NrIG9yIC0xIGZvciBpbmZpbml0ZSAKKyAqIEByZXR1cm5zICNUUlVFIGlmIHN0aWxsIGNvbm5lY3RlZAorICovCitkYnVzX2Jvb2xfdCAKK2RidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKSAKK3sgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodGltZW91dF9taWxsaXNlY29uZHMgPj0gMCB8fCB0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSwgRkFMU0UpOworICAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaChjb25uZWN0aW9uLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgRkFMU0UpOworfQorCisvKiBXZSBuZWVkIHRvIGNhbGwgdGhpcyBhbnl0aW1lIHdlIHBvcCB0aGUgaGVhZCBvZiB0aGUgcXVldWUsIGFuZCB0aGVuCisgKiB1cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyd2FyZAorICogd2hpY2ggd2lsbCAicHJvY2VzcyIgdGhlIGRpc2Nvbm5lY3RlZCBtZXNzYWdlIGFuZCBzZXQKKyAqIGRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZC4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2Rpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmhlYWRfb2ZfcXVldWUpCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgLyogY2hlY2tpbmcgdGhhdCB0aGUgbGluayBpcyBOVUxMIGlzIGFuIG9wdGltaXphdGlvbiB0byBhdm9pZCB0aGUgaXNfc2lnbmFsIGNhbGwgKi8KKyAgaWYgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rID09IE5VTEwgJiYKKyAgICAgIGRidXNfbWVzc2FnZV9pc19zaWduYWwgKGhlYWRfb2ZfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICBjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkID0gVFJVRTsKKyAgICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgZmlyc3QtcmVjZWl2ZWQgbWVzc2FnZSBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLAorICogbGVhdmluZyBpdCBpbiB0aGUgcXVldWUuIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgcmV0dXJucyAjTlVMTC4KKyAqIAorICogVGhlIGNhbGxlciBkb2VzIG5vdCBvd24gYSByZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkIG1lc3NhZ2UsIGFuZAorICogbXVzdCBlaXRoZXIgcmV0dXJuIGl0IHVzaW5nIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSgpIG9yCisgKiBrZWVwIGl0IGFmdGVyIGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX3N0ZWFsX2JvcnJvd2VkX21lc3NhZ2UoKS4gTm8KKyAqIG9uZSBjYW4gZ2V0IGF0IHRoZSBtZXNzYWdlIHdoaWxlIGl0cyBib3Jyb3dlZCwgc28gcmV0dXJuIGl0IGFzCisgKiBxdWlja2x5IGFzIHBvc3NpYmxlIGFuZCBkb24ndCBrZWVwIGEgcmVmZXJlbmNlIHRvIGl0IGFmdGVyCisgKiByZXR1cm5pbmcgaXQuIElmIHlvdSBuZWVkIHRvIGtlZXAgdGhlIG1lc3NhZ2UsIG1ha2UgYSBjb3B5IG9mIGl0LgorICoKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHdpbGwgYmxvY2sgaWYgY2FsbGVkIHdoaWxlIGEgYm9ycm93ZWQKKyAqIG1lc3NhZ2UgaXMgb3V0c3RhbmRpbmc7IG9ubHkgb25lIHBpZWNlIG9mIGNvZGUgY2FuIGJlIHBsYXlpbmcgd2l0aAorICogdGhlIGluY29taW5nIHF1ZXVlIGF0IGEgdGltZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIGlmIGNhbGxlZAorICogZHVyaW5nIGEgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyBuZXh0IG1lc3NhZ2UgaW4gdGhlIGluY29taW5nIHF1ZXVlLgorICovCitEQnVzTWVzc2FnZSoKK2RidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgLyogdGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGl0IHF1ZXVlcworICAgKiB1cCBhbnkgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAqLworICBzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbik7CisgIGlmIChzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisKKyAgLyogV2hpbGUgYSBtZXNzYWdlIGlzIG91dHN0YW5kaW5nLCB0aGUgZGlzcGF0Y2ggbG9jayBpcyBoZWxkICovCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9PSBOVUxMKTsKKworICBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisgIAorICBtZXNzYWdlID0gY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZDsKKworICBjaGVja19kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkX3VubG9ja2VkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgCisgIC8qIE5vdGUgdGhhdCB3ZSBLRUVQIHRoZSBkaXNwYXRjaCBsb2NrIHVudGlsIHRoZSBtZXNzYWdlIGlzIHJldHVybmVkICovCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgLyogV2UgZG9uJ3QgdXBkYXRlIGRpc3BhdGNoIHN0YXR1cyB1bnRpbCBpdCdzIHJldHVybmVkIG9yIHN0b2xlbiAqLworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogVXNlZCB0byByZXR1cm4gYSBtZXNzYWdlIGFmdGVyIHBlZWtpbmcgYXQgaXQgdXNpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSgpLiBPbmx5IGNhbGxlZCBpZgorICogbWVzc2FnZSBmcm9tIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSgpIHdhcyBub24tI05VTEwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGZyb20gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlKCkKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQlEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgPT0gY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlID09IGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQpOworICAKKyAgY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9IE5VTEw7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsgCisKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7Cit9CisKKy8qKgorICogVXNlZCB0byBrZWVwIGEgbWVzc2FnZSBhZnRlciBwZWVraW5nIGF0IGl0IHVzaW5nCisgKiBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKS4gQmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHNlZQorICogdGhlIGNhdmVhdHMvd2FybmluZ3MgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc3RlYWxfYm9ycm93ZWRfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCURCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqcG9wX21lc3NhZ2U7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSA9PSBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSA9PSBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkKTsKKworICBwb3BfbWVzc2FnZSA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgPT0gcG9wX21lc3NhZ2UpOworICAKKyAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyAtPSAxOworIAorICBfZGJ1c192ZXJib3NlICgiSW5jb21pbmcgbWVzc2FnZSAlcCBzdG9sZW4gZnJvbSBxdWV1ZSwgJWQgaW5jb21pbmdcbiIsCisJCSBtZXNzYWdlLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKKyAKKyAgY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9IE5VTEw7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKK30KKworLyogU2VlIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSwgYnV0IHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gb3duCisgKiB0aGUgbG9jayBiZWZvcmUgY2FsbGluZy4gTWF5IGRyb3AgdGhlIGxvY2sgd2hpbGUgcnVubmluZy4KKyAqLworc3RhdGljIERCdXNMaXN0KgorX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV9saW5rX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9PSBOVUxMKTsKKyAgCisgIGlmIChjb25uZWN0aW9uLT5uX2luY29taW5nID4gMCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisgICAgICBjb25uZWN0aW9uLT5uX2luY29taW5nIC09IDE7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJNZXNzYWdlICVwICglcyAlcyAlcyAlcyAnJXMnKSByZW1vdmVkIGZyb20gaW5jb21pbmcgcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChsaW5rLT5kYXRhKSksCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGxpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAgICAgIm5vIHBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKGxpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChsaW5rLT5kYXRhKSA6CisgICAgICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChsaW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobGluay0+ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKKworICAgICAgY2hlY2tfZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZF91bmxvY2tlZCAoY29ubmVjdGlvbiwgbGluay0+ZGF0YSk7CisgICAgICAKKyAgICAgIHJldHVybiBsaW5rOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBTZWUgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlLCBidXQgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBvd24KKyAqIHRoZSBsb2NrIGJlZm9yZSBjYWxsaW5nLiBNYXkgZHJvcCB0aGUgbG9jayB3aGlsZSBydW5uaW5nLgorICovCitzdGF0aWMgREJ1c01lc3NhZ2UqCitfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIGlmIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBsaW5rLT5kYXRhOworICAgICAgCisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgICAKKyAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9wdXRiYWNrX21lc3NhZ2VfbGlua191bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbWVzc2FnZV9saW5rKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2xpbmsgIT0gTlVMTCk7CisgIC8qIFlvdSBjYW4ndCBib3Jyb3cgYSBtZXNzYWdlIHdoaWxlIGEgbGluayBpcyBvdXRzdGFuZGluZyAqLworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQgPT0gTlVMTCk7CisgIC8qIFdlIGhhZCB0byBoYXZlIHRoZSBkaXNwYXRjaCBsb2NrIGFjcm9zcyB0aGUgcG9wL3B1dGJhY2sgKi8KKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisKKyAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbGluayk7CisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgKz0gMTsKKworICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCAoJXMgJXMgJXMgJyVzJykgcHV0IGJhY2sgaW50byBxdWV1ZSAlcCwgJWQgaW5jb21pbmdcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2VfbGluay0+ZGF0YSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZV9saW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlX2xpbmstPmRhdGEpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlX2xpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2VfbGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAibm8gbWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2VfbGluay0+ZGF0YSksCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPm5faW5jb21pbmcpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0LXJlY2VpdmVkIG1lc3NhZ2UgZnJvbSB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwKKyAqIHJlbW92aW5nIGl0IGZyb20gdGhlIHF1ZXVlLiBUaGUgY2FsbGVyIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlCisgKiByZXR1cm5lZCBtZXNzYWdlLiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHJldHVybnMgI05VTEwuCisgKgorICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBhbnkgbWVzc2FnZSBoYW5kbGVycyB0aGF0IGFyZSByZWdpc3RlcmVkLAorICogYW5kIHNvIHVzaW5nIGl0IGlzIHVzdWFsbHkgd3JvbmcuIEluc3RlYWQsIGxldCB0aGUgbWFpbiBsb29wIGludm9rZQorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIFBvcHBpbmcgbWVzc2FnZXMgbWFudWFsbHkgaXMgb25seQorICogdXNlZnVsIGluIHZlcnkgc2ltcGxlIHByb2dyYW1zIHRoYXQgZG9uJ3Qgc2hhcmUgYSAjREJ1c0Nvbm5lY3Rpb24KKyAqIHdpdGggYW55IGxpYnJhcmllcyBvciBvdGhlciBtb2R1bGVzLgorICoKKyAqIFRoZXJlIGlzIGEgbG9jayB0aGF0IGNvdmVycyBhbGwgd2F5cyBvZiBhY2Nlc3NpbmcgdGhlIGluY29taW5nIG1lc3NhZ2UKKyAqIHF1ZXVlLCBzbyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSwgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCksCisgKiBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKSwgZXRjLiB3aWxsIGFsbCBibG9jayB3aGlsZSBvbmUgb2YgdGhlIG90aGVycworICogaW4gdGhlIGdyb3VwIGlzIHJ1bm5pbmcuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgbmV4dCBtZXNzYWdlIGluIHRoZSBpbmNvbWluZyBxdWV1ZS4KKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgLyogdGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGl0IHF1ZXVlcworICAgKiB1cCBhbnkgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAqLworICBzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbik7CisgIGlmIChzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbWVzc2FnZSA9IF9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZXR1cm5pbmcgcG9wcGVkIG1lc3NhZ2UgJXBcbiIsIG1lc3NhZ2UpOyAgICAKKworICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQWNxdWlyZSB0aGUgZGlzcGF0Y2hlci4gVGhpcyBpcyBhIHNlcGFyYXRlIGxvY2sgc28gdGhlIG1haW4KKyAqIGNvbm5lY3Rpb24gbG9jayBjYW4gYmUgZHJvcHBlZCB0byBjYWxsIG91dCB0byBhcHBsaWNhdGlvbiBkaXNwYXRjaAorICogaGFuZGxlcnMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2tpbmcgZGlzcGF0Y2hfbXV0ZXhcbiIpOworICBfZGJ1c19tdXRleF9sb2NrIChjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7CisKKyAgd2hpbGUgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3YWl0aW5nIGZvciBkaXNwYXRjaCB0byBiZSBhY3F1aXJhYmxlXG4iKTsKKyAgICAgIF9kYnVzX2NvbmR2YXJfd2FpdCAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKyAgICB9CisgIAorICBfZGJ1c19hc3NlcnQgKCFjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisKKyAgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQgPSBUUlVFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tpbmcgZGlzcGF0Y2hfbXV0ZXhcbiIpOworICBfZGJ1c19tdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIGRpc3BhdGNoZXIgd2hlbiB5b3UncmUgZG9uZSB3aXRoIGl0LiBPbmx5IGNhbGwKKyAqIGFmdGVyIHlvdSd2ZSBhY3F1aXJlZCB0aGUgZGlzcGF0Y2hlci4gV2FrZXMgdXAgYXQgbW9zdCBvbmUKKyAqIHRocmVhZCBjdXJyZW50bHkgd2FpdGluZyB0byBhY3F1aXJlIHRoZSBkaXNwYXRjaGVyLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJsb2NraW5nIGRpc3BhdGNoX211dGV4XG4iKTsKKyAgX2RidXNfbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisKKyAgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQgPSBGQUxTRTsKKyAgX2RidXNfY29uZHZhcl93YWtlX29uZSAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInVubG9ja2luZyBkaXNwYXRjaF9tdXRleFxuIik7CisgIF9kYnVzX211dGV4X3VubG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9mYWlsZWRfcG9wIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgREJ1c0xpc3QgICAgICAgKm1lc3NhZ2VfbGluaykKK3sKKyAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywKKwkJCSAgIG1lc3NhZ2VfbGluayk7CisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgKz0gMTsKK30KKworLyogTm90ZSB0aGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgc2luY2Ugd2UgZG9uJ3QgdHJhY2sgd2hldGhlciB3ZSBhbHJlYWR5IGRpZCBpdCAqLworc3RhdGljIHZvaWQKK25vdGlmeV9kaXNjb25uZWN0ZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIFNldCB0aGUgd2Vha3JlZiBpbiBkYnVzLWJ1cy5jIHRvIE5VTEwsIHNvIG5vYm9keSB3aWxsIGdldCBhIGRpc2Nvbm5lY3RlZAorICAgKiBjb25uZWN0aW9uIGZyb20gZGJ1c19idXNfZ2V0KCkuIFdlIG1ha2UgdGhlIHNhbWUgZ3VhcmFudGVlIGZvcgorICAgKiBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGJ1dCBpbiBhIGRpZmZlcmVudCB3YXkgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0bworICAgKiB1bnJlZiByaWdodCBoZXJlOyB3ZSBpbnN0ZWFkIGNoZWNrIGZvciBjb25uZWN0ZWRuZXNzIGJlZm9yZSByZXR1cm5pbmcKKyAgICogdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgaGFzaC4KKyAgICovCisgIF9kYnVzX2J1c19ub3RpZnlfc2hhcmVkX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAvKiBEdW1wIHRoZSBvdXRnb2luZyBxdWV1ZSwgd2UgYXJlbid0IGdvaW5nIHRvIGJlIGFibGUgdG8KKyAgICogc2VuZCBpdCBub3csIGFuZCB3ZSdkIGxpa2UgYWNjZXNzb3JzIGxpa2UKKyAgICogZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ19zaXplKCkgdG8gYmUgYWNjdXJhdGUuCisgICAqLworICBpZiAoY29ubmVjdGlvbi0+bl9vdXRnb2luZyA+IDApCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEcm9wcGluZyAlZCBvdXRnb2luZyBtZXNzYWdlcyBzaW5jZSB3ZSdyZSBkaXNjb25uZWN0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5uX291dGdvaW5nKTsKKyAgICAgIAorICAgICAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50IChjb25uZWN0aW9uLCBsaW5rLT5kYXRhKTsKKyAgICAgICAgfQorICAgIH0gCit9CisKKy8qIE5vdGUgdGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHNpbmNlIHdlIGRvbid0IHRyYWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBkaWQgaXQgKi8KK3N0YXRpYyBEQnVzRGlzcGF0Y2hTdGF0dXMKK25vdGlmeV9kaXNjb25uZWN0ZWRfYW5kX2Rpc3BhdGNoX2NvbXBsZXRlX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIGlmIChjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nIGRpc2Nvbm5lY3QgbWVzc2FnZVxuIik7CisgICAgICAKKyAgICAgIC8qIElmIHdlIGhhdmUgcGVuZGluZyBjYWxscywgcXVldWUgdGhlaXIgdGltZW91dHMgLSB3ZSB3YW50IHRoZSBEaXNjb25uZWN0ZWQKKyAgICAgICAqIHRvIGJlIHRoZSBsYXN0IG1lc3NhZ2UsIGFmdGVyIHRoZXNlIHRpbWVvdXRzLgorICAgICAgICovCisgICAgICBjb25uZWN0aW9uX3RpbWVvdXRfYW5kX2NvbXBsZXRlX2FsbF9wZW5kaW5nX2NhbGxzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgLyogV2UgaGF2ZW4ndCBzZW50IHRoZSBkaXNjb25uZWN0IG1lc3NhZ2UgYWxyZWFkeSwKKyAgICAgICAqIGFuZCBhbGwgcmVhbCBtZXNzYWdlcyBoYXZlIGJlZW4gcXVldWVkIHVwLgorICAgICAgICovCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayk7CisgICAgICBjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayA9IE5VTEw7CisKKyAgICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUzsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfRElTUEFUQ0hfQ09NUExFVEU7Cit9CisKK3N0YXRpYyBEQnVzRGlzcGF0Y2hTdGF0dXMKK19kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoY29ubmVjdGlvbi0+bl9pbmNvbWluZyA+IDApCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TOworICBlbHNlIGlmICghX2RidXNfdHJhbnNwb3J0X3F1ZXVlX21lc3NhZ2VzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworICBlbHNlCisgICAgeworICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgICAgIGRidXNfYm9vbF90IGlzX2Nvbm5lY3RlZDsKKyAgICAgIAorICAgICAgc3RhdHVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgICAgICBpc19jb25uZWN0ZWQgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRpc3BhdGNoIHN0YXR1cyA9ICVzIGlzX2Nvbm5lY3RlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgRElTUEFUQ0hfU1RBVFVTX05BTUUgKHN0YXR1cyksIGlzX2Nvbm5lY3RlZCk7CisgICAgICAKKyAgICAgIGlmICghaXNfY29ubmVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgLyogSXQncyBwb3NzaWJsZSB0aGlzIHdvdWxkIGJlIGJldHRlciBkb25lIGJ5IGhhdmluZyBhbiBleHBsaWNpdAorICAgICAgICAgICAqIG5vdGlmaWNhdGlvbiBmcm9tIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0KCkgdGhhdCB3b3VsZAorICAgICAgICAgICAqIHN5bmNocm9ub3VzbHkgZG8gdGhpcywgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbmV4dCBkaXNwYXRjaAorICAgICAgICAgICAqIHN0YXR1cyBjaGVjay4gSG93ZXZlciwgcHJvYmFibHkgbm90IGdvb2QgdG8gY2hhbmdlIHVudGlsIGl0IGNhdXNlcworICAgICAgICAgICAqIGEgcHJvYmxlbS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBub3RpZnlfZGlzY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAgICAgICAgIC8qIEknbSBub3Qgc3VyZSB0aGlzIGlzIG5lZWRlZDsgdGhlIGlkZWEgaXMgdGhhdCB3ZSB3YW50IHRvCisgICAgICAgICAgICogcXVldWUgdGhlIERpc2Nvbm5lY3RlZCBvbmx5IGFmdGVyIHdlJ3ZlIHJlYWQgYWxsIHRoZQorICAgICAgICAgICAqIG1lc3NhZ2VzLCBidXQgaWYgd2UncmUgZGlzY29ubmVjdGVkIG1heWJlIHdlIGFyZSBndWFyYW50ZWVkCisgICAgICAgICAgICogdG8gaGF2ZSByZWFkIHRoZW0gYWxsID8KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoc3RhdHVzID09IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgICAgICAgICBzdGF0dXMgPSBub3RpZnlfZGlzY29ubmVjdGVkX2FuZF9kaXNwYXRjaF9jb21wbGV0ZV91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHN0YXR1cyAhPSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFKQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgZWxzZSBpZiAoY29ubmVjdGlvbi0+bl9pbmNvbWluZyA+IDApCisgICAgICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUzsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfQ09NUExFVEU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBuZXdfc3RhdHVzKQoreworICBkYnVzX2Jvb2xfdCBjaGFuZ2VkOworICBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiBmdW5jdGlvbjsKKyAgdm9pZCAqZGF0YTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBjaGFuZ2VkID0gbmV3X3N0YXR1cyAhPSBjb25uZWN0aW9uLT5sYXN0X2Rpc3BhdGNoX3N0YXR1czsKKworICBjb25uZWN0aW9uLT5sYXN0X2Rpc3BhdGNoX3N0YXR1cyA9IG5ld19zdGF0dXM7CisKKyAgZnVuY3Rpb24gPSBjb25uZWN0aW9uLT5kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb247CisgIGRhdGEgPSBjb25uZWN0aW9uLT5kaXNwYXRjaF9zdGF0dXNfZGF0YTsKKworICBpZiAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdGVkX21lc3NhZ2VfYXJyaXZlZCAmJgorICAgICAgIWNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZCkKKyAgICB7CisgICAgICBjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQgPSBUUlVFOworICAgICAgCisgICAgICAvKiB0aGlzIGRvZXMgYW4gdW5yZWYsIGJ1dCB3ZSBoYXZlIGEgcmVmCisgICAgICAgKiBzbyB3ZSBzaG91bGQgbm90IHJ1biB0aGUgZmluYWxpemVyIGhlcmUKKyAgICAgICAqIGluc2lkZSB0aGUgbG9jay4KKyAgICAgICAqLworICAgICAgY29ubmVjdGlvbl9mb3JnZXRfc2hhcmVkX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAgICAgaWYgKGNvbm5lY3Rpb24tPmV4aXRfb25fZGlzY29ubmVjdCkKKyAgICAgICAgeworICAgICAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsgICAgICAgICAgICAKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRXhpdGluZyBvbiBEaXNjb25uZWN0ZWQgc2lnbmFsXG4iKTsKKyAgICAgICAgICBfZGJ1c19leGl0ICgxKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJDYWxsIHRvIGV4aXQoKSByZXR1cm5lZCIpOworICAgICAgICB9CisgICAgfQorICAKKyAgLyogV2UgZHJvcCB0aGUgbG9jayAqLworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoY2hhbmdlZCAmJiBmdW5jdGlvbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm90aWZ5aW5nIG9mIGNoYW5nZSB0byBkaXNwYXRjaCBzdGF0dXMgb2YgJXAgbm93ICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBuZXdfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgRElTUEFUQ0hfU1RBVFVTX05BTUUgKG5ld19zdGF0dXMpKTsKKyAgICAgICgqIGZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgbmV3X3N0YXR1cywgZGF0YSk7ICAgICAgCisgICAgfQorICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLgorICogI0RCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TIGluZGljYXRlcyB0aGF0IHRoZSBtZXNzYWdlIHF1ZXVlCisgKiBtYXkgY29udGFpbiBtZXNzYWdlcy4gI0RCVVNfRElTUEFUQ0hfQ09NUExFVEUgaW5kaWNhdGVzIHRoYXQgdGhlCisgKiBpbmNvbWluZyBxdWV1ZSBpcyBlbXB0eS4gI0RCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkgaW5kaWNhdGVzIHRoYXQKKyAqIHRoZXJlIGNvdWxkIGJlIGRhdGEsIGJ1dCB3ZSBjYW4ndCBrbm93IGZvciBzdXJlIHdpdGhvdXQgbW9yZQorICogbWVtb3J5LgorICoKKyAqIFRvIHByb2Nlc3MgdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUsIHVzZSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKQorICogb3IgKGluIHJhcmUgY2FzZXMpIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSgpLgorICoKKyAqIE5vdGUsICNEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyByZWFsbHkgbWVhbnMgdGhhdCBlaXRoZXIgd2UKKyAqIGhhdmUgbWVzc2FnZXMgaW4gdGhlIHF1ZXVlLCBvciB3ZSBoYXZlIHJhdyBieXRlcyBidWZmZXJlZCB1cAorICogdGhhdCBuZWVkIHRvIGJlIHBhcnNlZC4gV2hlbiB0aGVzZSBieXRlcyBhcmUgcGFyc2VkLCB0aGV5CisgKiBtYXkgbm90IGFkZCB1cCB0byBhbiBlbnRpcmUgbWVzc2FnZS4gVGh1cywgaXQncyBwb3NzaWJsZQorICogdG8gc2VlIGEgc3RhdHVzIG9mICNEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyBidXQgbm90CisgKiBoYXZlIGEgbWVzc2FnZSB5ZXQuCisgKgorICogSW4gcGFydGljdWxhciB0aGlzIGhhcHBlbnMgb24gaW5pdGlhbCBjb25uZWN0aW9uLCBiZWNhdXNlIGFsbCBzb3J0cworICogb2YgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgc3R1ZmYgaGFzIHRvIGJlIHBhcnNlZCBiZWZvcmUgdGhlCisgKiBmaXJzdCBtZXNzYWdlIGFycml2ZXMuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgY3VycmVudCBkaXNwYXRjaCBzdGF0dXMKKyAqLworREJ1c0Rpc3BhdGNoU3RhdHVzCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIERCVVNfRElTUEFUQ0hfQ09NUExFVEUpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBGaWx0ZXIgZnVudGlvbiBmb3IgaGFuZGxpbmcgdGhlIFBlZXIgc3RhbmRhcmQgaW50ZXJmYWNlLgorICovCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK19kYnVzX2Nvbm5lY3Rpb25fcGVlcl9maWx0ZXJfdW5sb2NrZWRfbm9fdXBkYXRlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgaWYgKGNvbm5lY3Rpb24tPnJvdXRlX3BlZXJfbWVzc2FnZXMgJiYgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGlzIG1lYW5zIHdlJ3JlIGxldHRpbmcgdGhlIGJ1cyByb3V0ZSB0aGlzIG1lc3NhZ2UgKi8KKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9QRUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaW5nIikpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJldDsKKyAgICAgIGRidXNfYm9vbF90IHNlbnQ7CisgICAgICAKKyAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgICAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAKKyAgICAgIHNlbnQgPSBfZGJ1c19jb25uZWN0aW9uX3NlbmRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLCByZXQsIE5VTEwpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJldCk7CisKKyAgICAgIGlmICghc2VudCkKKyAgICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgICAKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfUEVFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0TWFjaGluZUlkIikpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJldDsKKyAgICAgIGRidXNfYm9vbF90IHNlbnQ7CisgICAgICBEQnVzU3RyaW5nIHV1aWQ7CisgICAgICAKKyAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgICAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworCisgICAgICBzZW50ID0gRkFMU0U7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdCAoJnV1aWQpOworICAgICAgaWYgKF9kYnVzX2dldF9sb2NhbF9tYWNoaW5lX3V1aWRfZW5jb2RlZCAoJnV1aWQpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ1dWlkKTsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2VudCA9IF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIHJldCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgICAgICAKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmV0KTsKKworICAgICAgaWYgKCFzZW50KQorICAgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9oYXNfaW50ZXJmYWNlIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9QRUVSKSkKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIGJvdW5jZSBhbnl0aGluZyBlbHNlIHdpdGggdGhpcyBpbnRlcmZhY2UsIG90aGVyd2lzZSBhcHBzCisgICAgICAgKiBjb3VsZCBzdGFydCBleHRlbmRpbmcgdGhlIGludGVyZmFjZSBhbmQgd2hlbiB3ZSBhZGRlZCBleHRlbnNpb25zCisgICAgICAgKiBoZXJlIHRvIERCdXNDb25uZWN0aW9uIHdlJ2QgYnJlYWsgdGhvc2UgYXBwcy4KKyAgICAgICAqLworICAgICAgCisgICAgICBEQnVzTWVzc2FnZSAqcmV0OworICAgICAgZGJ1c19ib29sX3Qgc2VudDsKKyAgICAgIAorICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBtZXRob2QgaW52b2tlZCBvbiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIGludGVyZmFjZSIpOworICAgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgIAorICAgICAgc2VudCA9IF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIHJldCwgTlVMTCk7CisgICAgICAKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmV0KTsKKyAgICAgIAorICAgICAgaWYgKCFzZW50KQorICAgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorfQorCisvKioKKyogUHJvY2Vzc2VzIGFsbCBidWlsdGluIGZpbHRlciBmdW5jdGlvbnMKKyoKKyogSWYgdGhlIHNwZWMgc3BlY2lmaWVzIGEgc3RhbmRhcmQgaW50ZXJmYWNlCisqIHRoZXkgc2hvdWxkIGJlIHByb2Nlc3NlZCBmcm9tIHRoaXMgbWV0aG9kCisqKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorX2RidXNfY29ubmVjdGlvbl9ydW5fYnVpbHRpbl9maWx0ZXJzX3VubG9ja2VkX25vX3VwZGF0ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICAvKiBXZSBqdXN0IHJ1biBvbmUgZmlsdGVyIGZvciBub3cgYnV0IGhhdmUgdGhlIG9wdGlvbiB0byBydW4gbW9yZQorICAgICBpZiB0aGUgc3BlYyBjYWxscyBmb3IgaXQgaW4gdGhlIGZ1dHVyZSAqLworCisgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3BlZXJfZmlsdGVyX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7Cit9CisKKy8qKgorICogUHJvY2Vzc2VzIGFueSBpbmNvbWluZyBkYXRhLgorICoKKyAqIElmIHRoZXJlJ3MgaW5jb21pbmcgcmF3IGRhdGEgdGhhdCBoYXMgbm90IHlldCBiZWVuIHBhcnNlZCwgaXQgaXMKKyAqIHBhcnNlZCwgd2hpY2ggbWF5IG9yIG1heSBub3QgcmVzdWx0IGluIGFkZGluZyBtZXNzYWdlcyB0byB0aGUKKyAqIGluY29taW5nIHF1ZXVlLgorICoKKyAqIFRoZSBpbmNvbWluZyBkYXRhIGJ1ZmZlciBpcyBmaWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiByZWFkcyBmcm9tCisgKiBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQgKHN1Y2ggYXMgYSBzb2NrZXQpLiAgUmVhZGluZyB1c3VhbGx5CisgKiBoYXBwZW5zIGluIGRidXNfd2F0Y2hfaGFuZGxlKCkgb3IgZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoKS4KKyAqIAorICogSWYgdGhlcmUgYXJlIGNvbXBsZXRlIG1lc3NhZ2VzIGluIHRoZSBpbmNvbWluZyBxdWV1ZSwKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHJlbW92ZXMgb25lIG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUgYW5kCisgKiBwcm9jZXNzZXMgaXQuIFByb2Nlc3NpbmcgaGFzIHRocmVlIHN0ZXBzLgorICoKKyAqIEZpcnN0LCBhbnkgbWV0aG9kIHJlcGxpZXMgYXJlIHBhc3NlZCB0byAjREJ1c1BlbmRpbmdDYWxsIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpIGluIG9yZGVyIHRvCisgKiBjb21wbGV0ZSB0aGUgcGVuZGluZyBtZXRob2QgY2FsbC4KKyAqIAorICogU2Vjb25kLCBhbnkgZmlsdGVycyByZWdpc3RlcmVkIHdpdGggZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIoKQorICogYXJlIHJ1bi4gSWYgYW55IGZpbHRlciByZXR1cm5zICNEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQKKyAqIHRoZW4gcHJvY2Vzc2luZyBzdG9wcyBhZnRlciB0aGF0IGZpbHRlci4KKyAqCisgKiBUaGlyZCwgaWYgdGhlIG1lc3NhZ2UgaXMgYSBtZXRob2QgY2FsbCBpdCBpcyBmb3J3YXJkZWQgdG8KKyAqIGFueSByZWdpc3RlcmVkIG9iamVjdCBwYXRoIGhhbmRsZXJzIGFkZGVkIHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2soKS4KKyAqCisgKiBBIHNpbmdsZSBjYWxsIHRvIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHdpbGwgcHJvY2VzcyBhdCBtb3N0CisgKiBvbmUgbWVzc2FnZTsgaXQgd2lsbCBub3QgY2xlYXIgdGhlIGVudGlyZSBtZXNzYWdlIHF1ZXVlLgorICoKKyAqIEJlIGNhcmVmdWwgYWJvdXQgY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBmcm9tIGluc2lkZSBhCisgKiBtZXNzYWdlIGhhbmRsZXIsIGkuZS4gY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKQorICogcmVjdXJzaXZlbHkuICBJZiB0aHJlYWRzIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIGEgcmVjdXJzaXZlCisgKiBtdXRleCBmdW5jdGlvbiwgdGhlbiB0aGlzIHdpbGwgbm90IGRlYWRsb2NrOyBob3dldmVyLCBpdCBjYW4KKyAqIGNlcnRhaW5seSBjb25mdXNlIHlvdXIgYXBwbGljYXRpb24uCisgKiAKKyAqIEB0b2RvIHNvbWUgRklYTUUgaW4gaGVyZSBhYm91dCBoYW5kbGluZyBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyBkaXNwYXRjaCBzdGF0dXMsIHNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cygpCisgKi8KK0RCdXNEaXNwYXRjaFN0YXR1cworZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNMaXN0ICpsaW5rLCAqZmlsdGVyX2xpc3RfY29weSwgKm1lc3NhZ2VfbGluazsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIGRidXNfaW50MzJfdCByZXBseV9zZXJpYWw7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIERCVVNfRElTUEFUQ0hfQ09NUExFVEUpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgaWYgKHN0YXR1cyAhPSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUykKKyAgICB7CisgICAgICAvKiB1bmxvY2tzIGFuZCBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAKKyAgLyogV2UgbmVlZCB0byByZWYgdGhlIGNvbm5lY3Rpb24gc2luY2UgdGhlIGNhbGxiYWNrIGNvdWxkIHBvdGVudGlhbGx5CisgICAqIGRyb3AgdGhlIGxhc3QgcmVmIHRvIGl0CisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlX2xpbmsgPSBfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZV9saW5rID09IE5VTEwpCisgICAgeworICAgICAgLyogYW5vdGhlciB0aHJlYWQgZGlzcGF0Y2hlZCBvdXIgc3R1ZmYgKi8KKworICAgICAgX2RidXNfdmVyYm9zZSAoImFub3RoZXIgdGhyZWFkIGRpc3BhdGNoZWQgbWVzc2FnZSAoZHVyaW5nIGFjcXVpcmVfZGlzcGF0Y2ggYWJvdmUpXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICAgICAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgICAgICAKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgIG1lc3NhZ2UgPSBtZXNzYWdlX2xpbmstPmRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoIiBkaXNwYXRjaGluZyBtZXNzYWdlICVwICglcyAlcyAlcyAnJXMnKVxuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkpOworCisgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAKKyAgLyogUGVuZGluZyBjYWxsIGhhbmRsaW5nIG11c3QgYmUgZmlyc3QsIGJlY2F1c2UgaWYgeW91IGRvCisgICAqIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCkgb3IKKyAgICogZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2soKSB0aGVuIG5vIGhhbmRsZXJzL2ZpbHRlcnMgd2lsbCBiZSBydW4gb24KKyAgICogdGhlIHJlcGx5LiBXZSB3YW50IGNvbnNpc3RlbnQgc2VtYW50aWNzIGluIHRoZSBjYXNlIHdoZXJlIHdlCisgICAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHRoZSByZXBseS4KKyAgICovCisgIAorICByZXBseV9zZXJpYWwgPSBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgIHBlbmRpbmcgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfc2VyaWFsKTsKKyAgaWYgKHBlbmRpbmcpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc3BhdGNoaW5nIGEgcGVuZGluZyByZXBseVxuIik7CisgICAgICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgbWVzc2FnZSk7CisgICAgICBwZW5kaW5nID0gTlVMTDsgLyogaXQncyBwcm9iYWJseSB1bnJlZidkICovCisgICAgICAKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c192ZXJib3NlICgicGVuZGluZyBjYWxsIGNvbXBsZXRlZCBpbiBkaXNwYXRjaFxuIik7CisgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmVzdWx0ID0gX2RidXNfY29ubmVjdGlvbl9ydW5fYnVpbHRpbl9maWx0ZXJzX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGlmIChyZXN1bHQgIT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisgICAgZ290byBvdXQ7CisgCisgIGlmICghX2RidXNfbGlzdF9jb3B5ICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsICZmaWx0ZXJfbGlzdF9jb3B5KSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgX2RidXNfY29ubmVjdGlvbl9mYWlsZWRfcG9wIChjb25uZWN0aW9uLCBtZXNzYWdlX2xpbmspOworCisgICAgICAvKiB1bmxvY2tzIGFuZCBjYWxscyB1c2VyIGNvZGUgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmZmlsdGVyX2xpc3RfY29weSwKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pX2RidXNfbWVzc2FnZV9maWx0ZXJfcmVmLAorCQkgICAgICBOVUxMKTsKKworICAvKiBXZSdyZSBzdGlsbCBwcm90ZWN0ZWQgZnJvbSBkaXNwYXRjaCgpIHJlZW50cmFuY3kgaGVyZQorICAgKiBzaW5jZSB3ZSBhY3F1aXJlZCB0aGUgZGlzcGF0Y2hlcgorICAgKi8KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZmaWx0ZXJfbGlzdF9jb3B5KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZmlsdGVyX2xpc3RfY29weSwgbGluayk7CisKKyAgICAgIGlmIChmaWx0ZXItPmZ1bmN0aW9uID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBmaWx0ZXIgd2FzIHJlbW92ZWQgaW4gYSBjYWxsYmFjayBmdW5jdGlvblxuIik7CisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgcnVubmluZyBmaWx0ZXIgb24gbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisgICAgICByZXN1bHQgPSAoKiBmaWx0ZXItPmZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgbWVzc2FnZSwgZmlsdGVyLT51c2VyX2RhdGEpOworCisgICAgICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorCWJyZWFrOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmZmlsdGVyX2xpc3RfY29weSwKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYsCisJCSAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmZmlsdGVyX2xpc3RfY29weSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmlsdGVyIGhhbmRsZWQgbWVzc2FnZSBpbiBkaXNwYXRjaFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogV2UncmUgc3RpbGwgcHJvdGVjdGVkIGZyb20gZGlzcGF0Y2goKSByZWVudHJhbmN5IGhlcmUKKyAgICogc2luY2Ugd2UgYWNxdWlyZWQgdGhlIGRpc3BhdGNoZXIKKyAgICovCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHJ1bm5pbmcgb2JqZWN0IHBhdGggZGlzcGF0Y2ggb24gbWVzc2FnZSAlcCAoJXMgJXMgJXMgJyVzJylcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gbWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICByZXN1bHQgPSBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLT5vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKHJlc3VsdCAhPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgib2JqZWN0IHRyZWUgaGFuZGxlZCBtZXNzYWdlIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHNlbmRpbmcgZXJyb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgZm9yIGVycm9yIHN0cmluZyBpbiBkaXNwYXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBcIiVzXCIgd2l0aCBzaWduYXR1cmUgXCIlc1wiIG9uIGludGVyZmFjZSBcIiVzXCIgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciBzdHJpbmcgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9VTktOT1dOX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciByZXBseSBpbiBkaXNwYXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcHJlYWxsb2NhdGVkID0gX2RidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAgICAgaWYgKHByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciBzZW5kIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LCBOVUxMKTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAKKyAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIAorICBfZGJ1c192ZXJib3NlICgiICBkb25lIGRpc3BhdGNoaW5nICVwICglcyAlcyAlcyAnJXMnKSBvbiBjb25uZWN0aW9uICVwXG4iLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisgIAorIG91dDoKKyAgaWYgKHJlc3VsdCA9PSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgIAorICAgICAgLyogUHV0IG1lc3NhZ2UgYmFjaywgYW5kIHdlJ2xsIHN0YXJ0IG92ZXIuCisgICAgICAgKiBZZXMgdGhpcyBtZWFucyBoYW5kbGVycyBtdXN0IGJlIGlkZW1wb3RlbnQgaWYgdGhleQorICAgICAgICogZG9uJ3QgcmV0dXJuIEhBTkRMRUQ7IGMnZXN0IGxhIHZpZS4KKyAgICAgICAqLworICAgICAgX2RidXNfY29ubmVjdGlvbl9wdXRiYWNrX21lc3NhZ2VfbGlua191bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbGluayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAuLi4gZG9uZSBkaXNwYXRjaGluZ1xuIik7CisgICAgICAKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChtZXNzYWdlX2xpbmspOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsgLyogZG9uJ3Qgd2FudCB0aGUgbWVzc2FnZSB0byBjb3VudCBpbiBtYXggbWVzc2FnZSBsaW1pdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIGNvbXB1dGluZyBkaXNwYXRjaCBzdGF0dXMgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIH0KKyAgCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfdmVyYm9zZSAoImJlZm9yZSBmaW5hbCBzdGF0dXMgdXBkYXRlXG4iKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAvKiB1bmxvY2tzIGFuZCBjYWxscyB1c2VyIGNvZGUgKi8KKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBTZXRzIHRoZSB3YXRjaCBmdW5jdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGVzZSBmdW5jdGlvbnMgYXJlCisgKiByZXNwb25zaWJsZSBmb3IgbWFraW5nIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gbG9vcCBhd2FyZSBvZiBmaWxlCisgKiBkZXNjcmlwdG9ycyB0aGF0IG5lZWQgdG8gYmUgbW9uaXRvcmVkIGZvciBldmVudHMsIHVzaW5nIHNlbGVjdCgpIG9yCisgKiBwb2xsKCkuIFdoZW4gdXNpbmcgUXQsIHR5cGljYWxseSB0aGUgREJ1c0FkZFdhdGNoRnVuY3Rpb24gd291bGQKKyAqIGNyZWF0ZSBhIFFTb2NrZXROb3RpZmllci4gV2hlbiB1c2luZyBHTGliLCB0aGUgREJ1c0FkZFdhdGNoRnVuY3Rpb24KKyAqIGNvdWxkIGNhbGwgZ19pb19hZGRfd2F0Y2goKSwgb3IgY291bGQgYmUgdXNlZCBhcyBwYXJ0IG9mIGEgbW9yZQorICogZWxhYm9yYXRlIEdTb3VyY2UuIE5vdGUgdGhhdCB3aGVuIGEgd2F0Y2ggaXMgYWRkZWQsIGl0IG1heQorICogbm90IGJlIGVuYWJsZWQuCisgKgorICogVGhlIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiBub3RpZmllcyB0aGUgYXBwbGljYXRpb24gdGhhdCB0aGUKKyAqIHdhdGNoIGhhcyBiZWVuIGVuYWJsZWQgb3IgZGlzYWJsZWQuIENhbGwgZGJ1c193YXRjaF9nZXRfZW5hYmxlZCgpCisgKiB0byBjaGVjayB0aGlzLiBBIGRpc2FibGVkIHdhdGNoIHNob3VsZCBoYXZlIG5vIGVmZmVjdCwgYW5kIGVuYWJsZWQKKyAqIHdhdGNoIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbWFpbiBsb29wLiBUaGlzIGZlYXR1cmUgaXMgdXNlZAorICogaW5zdGVhZCBvZiBzaW1wbHkgYWRkaW5nL3JlbW92aW5nIHRoZSB3YXRjaCBiZWNhdXNlCisgKiBlbmFibGluZy9kaXNhYmxpbmcgY2FuIGJlIGRvbmUgd2l0aG91dCBtZW1vcnkgYWxsb2NhdGlvbi4gIFRoZQorICogdG9nZ2xlZCBmdW5jdGlvbiBtYXkgYmUgTlVMTCBpZiBhIG1haW4gbG9vcCByZS1xdWVyaWVzCisgKiBkYnVzX3dhdGNoX2dldF9lbmFibGVkKCkgZXZlcnkgdGltZSBhbnl3YXkuCisgKiAKKyAqIFRoZSBEQnVzV2F0Y2ggY2FuIGJlIHF1ZXJpZWQgZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd2F0Y2ggdXNpbmcKKyAqIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKSBvciBkYnVzX3dhdGNoX2dldF9zb2NrZXQoKSwgYW5kIGZvciB0aGUKKyAqIGV2ZW50cyB0byB3YXRjaCBmb3IgdXNpbmcgZGJ1c193YXRjaF9nZXRfZmxhZ3MoKS4gVGhlIGZsYWdzCisgKiByZXR1cm5lZCBieSBkYnVzX3dhdGNoX2dldF9mbGFncygpIHdpbGwgb25seSBjb250YWluCisgKiBEQlVTX1dBVENIX1JFQURBQkxFIGFuZCBEQlVTX1dBVENIX1dSSVRBQkxFLCBuZXZlcgorICogREJVU19XQVRDSF9IQU5HVVAgb3IgREJVU19XQVRDSF9FUlJPUjsgYWxsIHdhdGNoZXMgaW1wbGljaXRseQorICogaW5jbHVkZSBhIHdhdGNoIGZvciBoYW5ndXBzLCBlcnJvcnMsIGFuZCBvdGhlciBleGNlcHRpb25hbAorICogY29uZGl0aW9ucy4KKyAqCisgKiBPbmNlIGEgZmlsZSBkZXNjcmlwdG9yIGJlY29tZXMgcmVhZGFibGUgb3Igd3JpdGFibGUsIG9yIGFuIGV4Y2VwdGlvbgorICogb2NjdXJzLCBkYnVzX3dhdGNoX2hhbmRsZSgpIHNob3VsZCBiZSBjYWxsZWQgdG8KKyAqIG5vdGlmeSB0aGUgY29ubmVjdGlvbiBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yJ3MgY29uZGl0aW9uLgorICoKKyAqIGRidXNfd2F0Y2hfaGFuZGxlKCkgY2Fubm90IGJlIGNhbGxlZCBkdXJpbmcgdGhlCisgKiBEQnVzQWRkV2F0Y2hGdW5jdGlvbiwgYXMgdGhlIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgcmVhZHkgdG8gaGFuZGxlCisgKiB0aGF0IHdhdGNoIHlldC4KKyAqIAorICogSXQgaXMgbm90IGFsbG93ZWQgdG8gcmVmZXJlbmNlIGEgREJ1c1dhdGNoIGFmdGVyIGl0IGhhcyBiZWVuIHBhc3NlZAorICogdG8gcmVtb3ZlX2Z1bmN0aW9uLgorICoKKyAqIElmICNGQUxTRSBpcyByZXR1cm5lZCBkdWUgdG8gbGFjayBvZiBtZW1vcnksIHRoZSBmYWlsdXJlIG1heSBiZSBkdWUKKyAqIHRvIGEgI0ZBTFNFIHJldHVybiBmcm9tIHRoZSBuZXcgYWRkX2Z1bmN0aW9uLiBJZiBzbywgdGhlCisgKiBhZGRfZnVuY3Rpb24gbWF5IGhhdmUgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5IG9uZSBvciBtb3JlIHRpbWVzLAorICogYnV0IHRoZSByZW1vdmVfZnVuY3Rpb24gd2lsbCBhbHNvIGhhdmUgYmVlbiBjYWxsZWQgdG8gcmVtb3ZlIGFueQorICogc3VjY2Vzc2Z1bCBhZGRzLiBpLmUuIGlmICNGQUxTRSBpcyByZXR1cm5lZCB0aGUgbmV0IHJlc3VsdAorICogc2hvdWxkIGJlIHRoYXQgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBoYXMgbm8gZWZmZWN0LAorICogYnV0IHRoZSBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbiBtYXkgaGF2ZSBiZWVuIGNhbGxlZC4KKyAqCisgKiBAbm90ZSBUaGUgdGhyZWFkIGxvY2sgb24gREJ1c0Nvbm5lY3Rpb24gaXMgaGVsZCB3aGlsZQorICogd2F0Y2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkLCBzbyBpbnNpZGUgdGhlc2UgZnVuY3Rpb25zIHlvdQorICogbWF5IG5vdCBpbnZva2UgYW55IG1ldGhvZHMgb24gREJ1c0Nvbm5lY3Rpb24gb3IgaXQgd2lsbCBkZWFkbG9jay4KKyAqIFNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGNvZGUgb3IgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDctSnVseS90cmVhZC5odG1sIzgxNDQKKyAqIGlmIHlvdSBlbmNvdW50ZXIgdGhpcyBpc3N1ZSBhbmQgd2FudCB0byBhdHRlbXB0IHdyaXRpbmcgYSBwYXRjaC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlZ2luIG1vbml0b3JpbmcgYSBuZXcgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gc3RvcCBtb25pdG9yaW5nIGEgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIG5vdGlmeSBvZiBlbmFibGUvZGlzYWJsZQorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGFkZF9mdW5jdGlvbiBhbmQgcmVtb3ZlX2Z1bmN0aW9uLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlIChubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR2YWwgPSBfZGJ1c193YXRjaF9saXN0X3NldF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24tPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLCByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBmcmVlX2RhdGFfZnVuY3Rpb24pOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFNldHMgdGhlIHRpbWVvdXQgZnVuY3Rpb25zIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlc2UgZnVuY3Rpb25zIGFyZQorICogcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgYXBwbGljYXRpb24ncyBtYWluIGxvb3AgYXdhcmUgb2YgdGltZW91dHMuCisgKiBXaGVuIHVzaW5nIFF0LCB0eXBpY2FsbHkgdGhlIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gd291bGQgY3JlYXRlIGEKKyAqIFFUaW1lci4gV2hlbiB1c2luZyBHTGliLCB0aGUgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiB3b3VsZCBjYWxsCisgKiBnX3RpbWVvdXRfYWRkLgorICogCisgKiBUaGUgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gbm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlCisgKiB0aW1lb3V0IGhhcyBiZWVuIGVuYWJsZWQgb3IgZGlzYWJsZWQuIENhbGwKKyAqIGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCgpIHRvIGNoZWNrIHRoaXMuIEEgZGlzYWJsZWQgdGltZW91dCBzaG91bGQKKyAqIGhhdmUgbm8gZWZmZWN0LCBhbmQgZW5hYmxlZCB0aW1lb3V0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbWFpbgorICogbG9vcC4gVGhpcyBmZWF0dXJlIGlzIHVzZWQgaW5zdGVhZCBvZiBzaW1wbHkgYWRkaW5nL3JlbW92aW5nIHRoZQorICogdGltZW91dCBiZWNhdXNlIGVuYWJsaW5nL2Rpc2FibGluZyBjYW4gYmUgZG9uZSB3aXRob3V0IG1lbW9yeQorICogYWxsb2NhdGlvbi4gV2l0aCBRdCwgUVRpbWVyOjpzdGFydCgpIGFuZCBRVGltZXI6OnN0b3AoKSBjYW4gYmUgdXNlZAorICogdG8gZW5hYmxlIGFuZCBkaXNhYmxlLiBUaGUgdG9nZ2xlZCBmdW5jdGlvbiBtYXkgYmUgTlVMTCBpZiBhIG1haW4KKyAqIGxvb3AgcmUtcXVlcmllcyBkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQoKSBldmVyeSB0aW1lIGFueXdheS4KKyAqIFdoZW5ldmVyIGEgdGltZW91dCBpcyB0b2dnbGVkLCBpdHMgaW50ZXJ2YWwgbWF5IGNoYW5nZS4KKyAqCisgKiBUaGUgREJ1c1RpbWVvdXQgY2FuIGJlIHF1ZXJpZWQgZm9yIHRoZSB0aW1lciBpbnRlcnZhbCB1c2luZworICogZGJ1c190aW1lb3V0X2dldF9pbnRlcnZhbCgpLiBkYnVzX3RpbWVvdXRfaGFuZGxlKCkgc2hvdWxkIGJlIGNhbGxlZAorICogcmVwZWF0ZWRseSwgZWFjaCB0aW1lIHRoZSBpbnRlcnZhbCBlbGFwc2VzLCBzdGFydGluZyBhZnRlciBpdCBoYXMKKyAqIGVsYXBzZWQgb25jZS4gVGhlIHRpbWVvdXQgc3RvcHMgZmlyaW5nIHdoZW4gaXQgaXMgcmVtb3ZlZCB3aXRoIHRoZQorICogZ2l2ZW4gcmVtb3ZlX2Z1bmN0aW9uLiAgVGhlIHRpbWVyIGludGVydmFsIG1heSBjaGFuZ2Ugd2hlbmV2ZXIgdGhlCisgKiB0aW1lb3V0IGlzIGFkZGVkLCByZW1vdmVkLCBvciB0b2dnbGVkLgorICoKKyAqIEBub3RlIFRoZSB0aHJlYWQgbG9jayBvbiBEQnVzQ29ubmVjdGlvbiBpcyBoZWxkIHdoaWxlCisgKiB0aW1lb3V0IGZ1bmN0aW9ucyBhcmUgaW52b2tlZCwgc28gaW5zaWRlIHRoZXNlIGZ1bmN0aW9ucyB5b3UKKyAqIG1heSBub3QgaW52b2tlIGFueSBtZXRob2RzIG9uIERCdXNDb25uZWN0aW9uIG9yIGl0IHdpbGwgZGVhZGxvY2suCisgKiBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBjb2RlIG9yIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA3LUp1bHkvdGhyZWFkLmh0bWwjODE0NAorICogaWYgeW91IGVuY291bnRlciB0aGlzIGlzc3VlIGFuZCB3YW50IHRvIGF0dGVtcHQgd3JpdGluZyBhIHBhdGNoLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIGFkZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBhZGQgYSB0aW1lb3V0LgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byByZW1vdmUgYSB0aW1lb3V0LgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IG9mIGVuYWJsZS9kaXNhYmxlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKwkJCQkJIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKwkJCQkJIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gdG9nZ2xlZF9mdW5jdGlvbiwKKwkJCQkJIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJCSBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR2YWwgPSBfZGJ1c190aW1lb3V0X2xpc3Rfc2V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbi0+dGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZnVuY3Rpb24sIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBmcmVlX2RhdGFfZnVuY3Rpb24pOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFNldHMgdGhlIG1haW5sb29wIHdha2V1cCBmdW5jdGlvbiBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoaXMgZnVuY3Rpb24KKyAqIGlzIHJlc3BvbnNpYmxlIGZvciB3YWtpbmcgdXAgdGhlIG1haW4gbG9vcCAoaWYgaXRzIHNsZWVwaW5nIGluCisgKiBhbm90aGVyIHRocmVhZCkgd2hlbiBzb21lIHNvbWUgY2hhbmdlIGhhcyBoYXBwZW5lZCB0byB0aGUKKyAqIGNvbm5lY3Rpb24gdGhhdCB0aGUgbWFpbmxvb3AgbmVlZHMgdG8gcmVjb25zaWRlciAoZS5nLiBhIG1lc3NhZ2UKKyAqIGhhcyBiZWVuIHF1ZXVlZCBmb3Igd3JpdGluZykuICBXaGVuIHVzaW5nIFF0LCB0aGlzIHR5cGljYWxseQorICogcmVzdWx0cyBpbiBhIGNhbGwgdG8gUUV2ZW50TG9vcDo6d2FrZVVwKCkuICBXaGVuIHVzaW5nIEdMaWIsIGl0CisgKiB3b3VsZCBjYWxsIGdfbWFpbl9jb250ZXh0X3dha2V1cCgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHdha2V1cF9tYWluX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHdha2UgdXAgdGhlIG1haW5sb29wCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3Mgd2FrZXVwX21haW5fZnVuY3Rpb24KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfd2FrZXVwX21haW5fZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisJCQkJCSAgREJ1c1dha2V1cE1haW5GdW5jdGlvbiAgICAgd2FrZXVwX21haW5fZnVuY3Rpb24sCisJCQkJCSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkJICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIHZvaWQgKm9sZF9kYXRhOworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2RhdGE7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBvbGRfZGF0YSA9IGNvbm5lY3Rpb24tPndha2V1cF9tYWluX2RhdGE7CisgIG9sZF9mcmVlX2RhdGEgPSBjb25uZWN0aW9uLT5mcmVlX3dha2V1cF9tYWluX2RhdGE7CisKKyAgY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZnVuY3Rpb24gPSB3YWtldXBfbWFpbl9mdW5jdGlvbjsKKyAgY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZGF0YSA9IGRhdGE7CisgIGNvbm5lY3Rpb24tPmZyZWVfd2FrZXVwX21haW5fZGF0YSA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKyAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICAvKiBDYWxsYmFjayBvdXRzaWRlIHRoZSBsb2NrICovCisgIGlmIChvbGRfZnJlZV9kYXRhKQorICAgICgqb2xkX2ZyZWVfZGF0YSkgKG9sZF9kYXRhKTsKK30KKworLyoqCisgKiBTZXQgYSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGRpc3BhdGNoIHN0YXR1cyBjaGFuZ2VzLgorICogSWYgdGhlIGRpc3BhdGNoIHN0YXR1cyBpcyAjREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMsIHRoZW4KKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIG5lZWRzIHRvIGJlIGNhbGxlZCB0byBwcm9jZXNzIGluY29taW5nCisgKiBtZXNzYWdlcy4gSG93ZXZlciwgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgTVVTVCBOT1QgQkUgQ0FMTEVECisgKiBmcm9tIGluc2lkZSB0aGUgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24uIEluZGVlZCwgYWxtb3N0CisgKiBhbnkgcmVlbnRyYW5jeSBpbiB0aGlzIGZ1bmN0aW9uIGlzIGEgYmFkIGlkZWEuIEluc3RlYWQsCisgKiB0aGUgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24gc2hvdWxkIHNpbXBseSBzYXZlIGFuIGluZGljYXRpb24KKyAqIHRoYXQgbWVzc2FnZXMgc2hvdWxkIGJlIGRpc3BhdGNoZWQgbGF0ZXIsIHdoZW4gdGhlIG1haW4gbG9vcAorICogaXMgcmUtZW50ZXJlZC4KKyAqCisgKiBJZiB5b3UgZG9uJ3Qgc2V0IGEgZGlzcGF0Y2ggc3RhdHVzIGZ1bmN0aW9uLCB5b3UgaGF2ZSB0byBiZSBzdXJlIHRvCisgKiBkaXNwYXRjaCBvbiBldmVyeSBpdGVyYXRpb24gb2YgeW91ciBtYWluIGxvb3AsIGVzcGVjaWFsbHkgaWYKKyAqIGRidXNfd2F0Y2hfaGFuZGxlKCkgb3IgZGJ1c190aW1lb3V0X2hhbmRsZSgpIHdlcmUgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZnVuY3Rpb24gZnVuY3Rpb24gdG8gY2FsbCBvbiBkaXNwYXRjaCBzdGF0dXMgY2hhbmdlcworICogQHBhcmFtIGRhdGEgZGF0YSBmb3IgZnVuY3Rpb24KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnJlZSB0aGUgZnVuY3Rpb24gZGF0YQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIHZvaWQgKm9sZF9kYXRhOworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2RhdGE7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBvbGRfZGF0YSA9IGNvbm5lY3Rpb24tPmRpc3BhdGNoX3N0YXR1c19kYXRhOworICBvbGRfZnJlZV9kYXRhID0gY29ubmVjdGlvbi0+ZnJlZV9kaXNwYXRjaF9zdGF0dXNfZGF0YTsKKworICBjb25uZWN0aW9uLT5kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2RhdGEgPSBkYXRhOworICBjb25uZWN0aW9uLT5mcmVlX2Rpc3BhdGNoX3N0YXR1c19kYXRhID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIENhbGxiYWNrIG91dHNpZGUgdGhlIGxvY2sgKi8KKyAgaWYgKG9sZF9mcmVlX2RhdGEpCisgICAgKCpvbGRfZnJlZV9kYXRhKSAob2xkX2RhdGEpOworfQorCisvKioKKyAqIEdldCB0aGUgVU5JWCBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGNvbm5lY3Rpb24sIGlmIGFueS4gIFRoaXMgY2FuCisgKiBiZSB1c2VkIGZvciBTRUxpbnV4IGFjY2VzcyBjb250cm9sIGNoZWNrcyB3aXRoIGdldHBlZXJjb24oKSBmb3IKKyAqIGV4YW1wbGUuIERPIE5PVCByZWFkIG9yIHdyaXRlIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG9yIHRyeSB0bworICogc2VsZWN0KCkgb24gaXQ7IHVzZSBEQnVzV2F0Y2ggZm9yIG1haW4gbG9vcCBpbnRlZ3JhdGlvbi4gTm90IGFsbAorICogY29ubmVjdGlvbnMgd2lsbCBoYXZlIGEgZmlsZSBkZXNjcmlwdG9yLiBTbyBmb3IgYWRkaW5nIGRlc2NyaXB0b3JzCisgKiB0byB0aGUgbWFpbiBsb29wLCB1c2UgZGJ1c193YXRjaF9nZXRfdW5peF9mZCgpIGFuZCBzbyBmb3J0aC4KKyAqCisgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBzb2NrZXQtYmFzZWQsIHlvdSBjYW4gYWxzbyB1c2UKKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0KCksIHdoaWNoIHdpbGwgd29yayBvbiBXaW5kb3dzIHRvby4KKyAqIFRoaXMgZnVuY3Rpb24gYWx3YXlzIGZhaWxzIG9uIFdpbmRvd3MuCisgKgorICogUmlnaHQgbm93IHRoZSByZXR1cm5lZCBkZXNjcmlwdG9yIGlzIGFsd2F5cyBhIHNvY2tldCwgYnV0CisgKiB0aGF0IGlzIG5vdCBndWFyYW50ZWVkLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZkIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqIEByZXR1cm5zICNUUlVFIGlmIGZkIGlzIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZC4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfdW5peF9mZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpmZCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uLT50cmFuc3BvcnQgIT0gTlVMTCwgRkFMU0UpOworCisjaWZkZWYgREJVU19XSU4KKyAgLyogRklYTUUgZG8gdGhpcyBvbiBhIGxvd2VyIGxldmVsICovCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIGRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0KGNvbm5lY3Rpb24sIGZkKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIFdpbmRvd3Mgb3IgVU5JWCBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgKiBvZiB0aGUgY29ubmVjdGlvbiwgaWYgYW55LiBETyBOT1QgcmVhZCBvciB3cml0ZSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLCBvciB0cnkgdG8KKyAqIHNlbGVjdCgpIG9uIGl0OyB1c2UgREJ1c1dhdGNoIGZvciBtYWluIGxvb3AgaW50ZWdyYXRpb24uIE5vdCBhbGwKKyAqIGNvbm5lY3Rpb25zIHdpbGwgaGF2ZSBhIHNvY2tldC4gU28gZm9yIGFkZGluZyBkZXNjcmlwdG9ycworICogdG8gdGhlIG1haW4gbG9vcCwgdXNlIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCgpIGFuZCBzbyBmb3J0aC4KKyAqCisgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3Qgc29ja2V0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEZBTFNFLAorICogZXZlbiBpZiB0aGUgY29ubmVjdGlvbiBkb2VzIGhhdmUgYSBmaWxlIGRlc2NyaXB0b3Igb2Ygc29tZSBraW5kLgorICogaS5lLiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIHNwZWNpZmljYWxseSBhIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZmQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHJldHVybnMgI1RSVUUgaWYgZmQgaXMgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICpmZCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0ICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIAorICByZXR2YWwgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X3NvY2tldF9mZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKgorICogR2V0cyB0aGUgVU5JWCB1c2VyIElEIG9mIHRoZSBjb25uZWN0aW9uIGlmIGtub3duLiAgUmV0dXJucyAjVFJVRSBpZgorICogdGhlIHVpZCBpcyBmaWxsZWQgaW4uICBBbHdheXMgcmV0dXJucyAjRkFMU0Ugb24gbm9uLVVOSVggcGxhdGZvcm1zCisgKiBmb3Igbm93LCB0aG91Z2ggaW4gdGhlb3J5IHNvbWVvbmUgY291bGQgaG9vayBXaW5kb3dzIHRvIE5JUyBvcgorICogc29tZXRoaW5nLiAgQWx3YXlzIHJldHVybnMgI0ZBTFNFIHByaW9yIHRvIGF1dGhlbnRpY2F0aW5nIHRoZQorICogY29ubmVjdGlvbi4KKyAqCisgKiBUaGUgVUlEIGlzIG9ubHkgcmVhZCBieSBzZXJ2ZXJzIGZyb20gY2xpZW50czsgY2xpZW50cyBjYW4ndCB1c3VhbGx5CisgKiBnZXQgdGhlIFVJRCBvZiBzZXJ2ZXJzLCBiZWNhdXNlIHNlcnZlcnMgZG8gbm90IGF1dGhlbnRpY2F0ZSB0bworICogY2xpZW50cy4gIFRoZSByZXR1cm5lZCBVSUQgaXMgdGhlIFVJRCB0aGUgY29ubmVjdGlvbiBhdXRoZW50aWNhdGVkCisgKiBhcy4KKyAqCisgKiBUaGUgbWVzc2FnZSBidXMgaXMgYSBzZXJ2ZXIgYW5kIHRoZSBhcHBzIGNvbm5lY3RpbmcgdG8gdGhlIGJ1cworICogYXJlIGNsaWVudHMuCisgKgorICogWW91IGNhbiBhc2sgdGhlIGJ1cyB0byB0ZWxsIHlvdSB0aGUgVUlEIG9mIGFub3RoZXIgY29ubmVjdGlvbiB0aG91Z2gKKyAqIGlmIHlvdSBsaWtlOyB0aGlzIGlzIGRvbmUgd2l0aCBkYnVzX2J1c19nZXRfdW5peF91c2VyKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB1aWQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdWlkIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgdXNlciBJRAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICp1aWQpCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHVpZCAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgIHJlc3VsdCA9IEZBTFNFOworICBlbHNlCisgICAgcmVzdWx0ID0gX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3VzZXIgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKKworI2lmZGVmIERCVVNfV0lOCisgIF9kYnVzX2Fzc2VydCAoIXJlc3VsdCk7CisjZW5kaWYKKyAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEdldHMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGNvbm5lY3Rpb24gaWYgYW55LgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgcGlkIGlzIGZpbGxlZCBpbi4KKyAqIEFsd2F5cyByZXR1cm5zICNGQUxTRSBwcmlvciB0byBhdXRoZW50aWNhdGluZyB0aGUKKyAqIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwaWQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgcHJvY2VzcyBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdWlkIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgcHJvY2VzcyBJRAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyAgKnBpZCkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGlkICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIGVsc2UKKyAgICByZXN1bHQgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorCQkJCQkJICBwaWQpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEdldHMgdGhlIEFEVCBhdWRpdCBkYXRhIG9mIHRoZSBjb25uZWN0aW9uIGlmIGFueS4KKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIHN0cnVjdHVyZSBwb2ludGVyIGlzIHJldHVybmVkLgorICogQWx3YXlzIHJldHVybnMgI0ZBTFNFIHByaW9yIHRvIGF1dGhlbnRpY2F0aW5nIHRoZQorICogY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGRhdGEgcmV0dXJuIGxvY2F0aW9uIGZvciBhdWRpdCBkYXRhIAorICogQHJldHVybnMgI1RSVUUgaWYgYXVkaXQgZGF0YSBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHVjcmVkIHBvaW50ZXIKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICB2b2lkICAgICAgICAgICoqZGF0YSwKKwkJCQkJICAgIGRidXNfaW50MzJfdCAgICpkYXRhX3NpemUpCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRhdGEgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRhdGFfc2l6ZSAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgIHJlc3VsdCA9IEZBTFNFOworICBlbHNlCisgICAgcmVzdWx0ID0gX2RidXNfdHJhbnNwb3J0X2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisJCQkJCSAgICAJICAgICAgICAgZGF0YSwKKwkJCSAgCQkJICAgICAgICAgZGF0YV9zaXplKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBJRAorICogaXMgYWxsb3dlZCB0byBjb25uZWN0LiBXaGVuIGFuIGluY29taW5nIGNvbm5lY3Rpb24gaGFzCisgKiBhdXRoZW50aWNhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVzZXIgSUQsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkOworICogaWYgaXQgcmV0dXJucyAjVFJVRSwgdGhlIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBwcm9jZWVkLAorICogb3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZC4KKyAqCisgKiBJZiB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICNOVUxMIChhcyBpdCBpcyBieSBkZWZhdWx0KSwgdGhlbgorICogb25seSB0aGUgc2FtZSBVSUQgYXMgdGhlIHNlcnZlciBwcm9jZXNzIHdpbGwgYmUgYWxsb3dlZCB0bworICogY29ubmVjdC4gQWxzbywgcm9vdCBpcyBhbHdheXMgYWxsb3dlZCB0byBjb25uZWN0LgorICoKKyAqIE9uIFdpbmRvd3MsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHNldCBhbmQgaXRzIGZyZWVfZGF0YV9mdW5jdGlvbiB3aWxsCisgKiBiZSBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZnJlZWQgb3IgYSBuZXcgZnVuY3Rpb24gaXMgc2V0LgorICogSG93ZXZlciwgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIHRoZXJlIGFyZQorICogbm8gVU5JWCB1c2VyIGlkcyB0byBwYXNzIHRvIGl0LCBvciBhdCBsZWFzdCBub25lIG9mIHRoZSBleGlzdGluZworICogYXV0aCBwcm90b2NvbHMgd291bGQgYWxsb3cgYXV0aGVudGljYXRpbmcgYXMgYSBVTklYIHVzZXIgb24gV2luZG93cy4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGEgPSBOVUxMOworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmN0aW9uID0gTlVMTDsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9kYXRhLCAmb2xkX2ZyZWVfZnVuY3Rpb24pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKG9sZF9mcmVlX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogb2xkX2ZyZWVfZnVuY3Rpb24pIChvbGRfZGF0YSk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgV2luZG93cyB1c2VyIFNJRCBvZiB0aGUgY29ubmVjdGlvbiBpZiBrbm93bi4gIFJldHVybnMKKyAqICNUUlVFIGlmIHRoZSBJRCBpcyBmaWxsZWQgaW4uICBBbHdheXMgcmV0dXJucyAjRkFMU0Ugb24gbm9uLVdpbmRvd3MKKyAqIHBsYXRmb3JtcyBmb3Igbm93LCB0aG91Z2ggaW4gdGhlb3J5IHNvbWVvbmUgY291bGQgaG9vayBVTklYIHRvCisgKiBBY3RpdmUgRGlyZWN0b3J5IG9yIHNvbWV0aGluZy4gIEFsd2F5cyByZXR1cm5zICNGQUxTRSBwcmlvciB0bworICogYXV0aGVudGljYXRpbmcgdGhlIGNvbm5lY3Rpb24uCisgKgorICogVGhlIHVzZXIgaXMgb25seSByZWFkIGJ5IHNlcnZlcnMgZnJvbSBjbGllbnRzOyBjbGllbnRzIGNhbid0IHVzdWFsbHkKKyAqIGdldCB0aGUgdXNlciBvZiBzZXJ2ZXJzLCBiZWNhdXNlIHNlcnZlcnMgZG8gbm90IGF1dGhlbnRpY2F0ZSB0bworICogY2xpZW50cy4gVGhlIHJldHVybmVkIHVzZXIgaXMgdGhlIHVzZXIgdGhlIGNvbm5lY3Rpb24gYXV0aGVudGljYXRlZAorICogYXMuCisgKgorICogVGhlIG1lc3NhZ2UgYnVzIGlzIGEgc2VydmVyIGFuZCB0aGUgYXBwcyBjb25uZWN0aW5nIHRvIHRoZSBidXMKKyAqIGFyZSBjbGllbnRzLgorICoKKyAqIFRoZSByZXR1cm5lZCB1c2VyIHN0cmluZyBoYXMgdG8gYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIFNJRCBpcyBhdmFpbGFibGU7CisgKiBpZiBpdCdzIGF2YWlsYWJsZSBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgbWVtb3J5IHRvIGNvcHkgaXQsCisgKiB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgI1RSVUUgYW5kICNOVUxMIGlzIGdpdmVuIGFzIHRoZSBTSUQuCisgKiAKKyAqIEB0b2RvIFdlIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBzYXkgIllvdSBjYW4gYXNrIHRoZSBidXMgdG8gdGVsbAorICogeW91IHRoZSB1c2VyIG9mIGFub3RoZXIgY29ubmVjdGlvbiB0aG91Z2ggaWYgeW91IGxpa2U7IHRoaXMgaXMgZG9uZQorICogd2l0aCBkYnVzX2J1c19nZXRfd2luZG93c191c2VyKCkuIiBCdXQgdGhpcyBoYXMgdG8gYmUgaW1wbGVtZW50ZWQKKyAqIGluIGJ1cy9kcml2ZXIuYyBhbmQgZGJ1cy9kYnVzLWJ1cy5jLCBhbmQgaXMgcG9pbnRsZXNzIGFueXdheQorICogc2luY2Ugb24gV2luZG93cyB3ZSBvbmx5IHVzZSB0aGUgc2Vzc2lvbiBidXMgZm9yIG5vdy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHdpbmRvd3Nfc2lkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBhbGxvY2F0ZWQgY29weSBvZiB0aGUgdXNlciBJRCwgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VyIGlzIGF2YWlsYWJsZSAocmV0dXJuZWQgdmFsdWUgbWF5IGJlICNOVUxMIGFueXdheSBpZiBubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdpbmRvd3Nfc2lkX3AgIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgZWxzZQorICAgIHJlc3VsdCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfd2luZG93c191c2VyIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3Nfc2lkX3ApOworCisjaWZkZWYgREJVU19VTklYCisgIF9kYnVzX2Fzc2VydCAoIXJlc3VsdCk7CisjZW5kaWYKKyAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFNldHMgYSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIHVzZXIgSUQKKyAqIGlzIGFsbG93ZWQgdG8gY29ubmVjdC4gV2hlbiBhbiBpbmNvbWluZyBjb25uZWN0aW9uIGhhcworICogYXV0aGVudGljYXRlZCB3aXRoIGEgcGFydGljdWxhciB1c2VyIElELCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZDsKKyAqIGlmIGl0IHJldHVybnMgI1RSVUUsIHRoZSBjb25uZWN0aW9uIGlzIGFsbG93ZWQgdG8gcHJvY2VlZCwKKyAqIG90aGVyd2lzZSB0aGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQuCisgKgorICogSWYgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAjTlVMTCAoYXMgaXQgaXMgYnkgZGVmYXVsdCksIHRoZW4KKyAqIG9ubHkgdGhlIHNhbWUgdXNlciBvd25pbmcgdGhlIHNlcnZlciBwcm9jZXNzIHdpbGwgYmUgYWxsb3dlZCB0bworICogY29ubmVjdC4KKyAqCisgKiBPbiBVTklYLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBzZXQgYW5kIGl0cyBmcmVlX2RhdGFfZnVuY3Rpb24gd2lsbAorICogYmUgaW52b2tlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGZyZWVkIG9yIGEgbmV3IGZ1bmN0aW9uIGlzIHNldC4KKyAqIEhvd2V2ZXIsIHRoZSBmdW5jdGlvbiB3aWxsIG5ldmVyIGJlIGNhbGxlZCwgYmVjYXVzZSB0aGVyZSBpcyBubworICogd2F5IHJpZ2h0IG5vdyB0byBhdXRoZW50aWNhdGUgYXMgYSBXaW5kb3dzIHVzZXIgb24gVU5JWC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIHZvaWQgKm9sZF9kYXRhID0gTlVMTDsKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jdGlvbiA9IE5VTEw7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGRhdGEsIGZyZWVfZGF0YV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZGF0YSwgJm9sZF9mcmVlX2Z1bmN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmIChvbGRfZnJlZV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIG9sZF9mcmVlX2Z1bmN0aW9uKSAob2xkX2RhdGEpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb24gdGhlIHNlcnZlciBzaWRlIG9mIGEgY29ubmVjdGlvbiB3aGVuIHRoZQorICogY29ubmVjdGlvbiBpcyBmaXJzdCBzZWVuIGluIHRoZSAjREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbi4gSWYgc2V0IHRvCisgKiAjVFJVRSAodGhlIGRlZmF1bHQgaXMgI0ZBTFNFKSwgdGhlbiB0aGUgY29ubmVjdGlvbiBjYW4gcHJvY2VlZCBldmVuIGlmCisgKiB0aGUgY2xpZW50IGRvZXMgbm90IGF1dGhlbnRpY2F0ZSBhcyBzb21lIHVzZXIgaWRlbnRpdHksIGkuZS4gY2xpZW50cworICogY2FuIGNvbm5lY3QgYW5vbnltb3VzbHkuCisgKiAKKyAqIFRoaXMgc2V0dGluZyBpbnRlcmFjdHMgd2l0aCB0aGUgYXZhaWxhYmxlIGF1dGhvcml6YXRpb24gbWVjaGFuaXNtcworICogKHNlZSBkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zKCkpLiBOYW1lbHksIGFuIGF1dGggbWVjaGFuaXNtCisgKiBzdWNoIGFzIEFOT05ZTU9VUyB0aGF0IHN1cHBvcnRzIGFub255bW91cyBhdXRoIG11c3QgYmUgaW5jbHVkZWQgaW4KKyAqIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtZWNoYW5pc21zIGZvciBhbm9ueW1vdXMgbG9naW4gdG8gd29yay4KKyAqCisgKiBUaGlzIHNldHRpbmcgYWxzbyBjaGFuZ2VzIHRoZSBkZWZhdWx0IHJ1bGUgZm9yIGNvbm5lY3Rpb25zCisgKiBhdXRob3JpemVkIGFzIGEgdXNlcjsgbm9ybWFsbHksIGlmIGEgY29ubmVjdGlvbiBhdXRob3JpemVzIGFzCisgKiBhIHVzZXIgaWRlbnRpdHksIGl0IGlzIHBlcm1pdHRlZCBpZiB0aGUgdXNlciBpZGVudGl0eSBpcworICogcm9vdCBvciB0aGUgdXNlciBpZGVudGl0eSBtYXRjaGVzIHRoZSB1c2VyIGlkZW50aXR5IG9mIHRoZSBzZXJ2ZXIKKyAqIHByb2Nlc3MuIElmIGFub255bW91cyBjb25uZWN0aW9ucyBhcmUgYWxsb3dlZCwgaG93ZXZlciwKKyAqIHRoZW4gYW55IHVzZXIgaWRlbnRpdHkgaXMgYWxsb3dlZC4KKyAqCisgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBydWxlcyBmb3IgY29ubmVjdGlvbnMgYXV0aG9yaXplZCBhcyBhCisgKiB1c2VyIGlkZW50aXR5IHdpdGggZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24oKQorICogYW5kIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uKCkuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdmFsdWUgd2hldGhlciB0byBhbGxvdyBhdXRoZW50aWNhdGlvbiBhcyBhbiBhbm9ueW1vdXMgdXNlcgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgIHZhbHVlKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfYWxsb3dfYW5vbnltb3VzIChjb25uZWN0aW9uLT50cmFuc3BvcnQsIHZhbHVlKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqCisgKiBOb3JtYWxseSAjREJ1c0Nvbm5lY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGFsbCBtZXNzYWdlcyB0byB0aGUKKyAqIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgaW50ZXJmYWNlLiBIb3dldmVyLCB0aGUgbWVzc2FnZSBidXMgd2FudHMKKyAqIHRvIGJlIGFibGUgdG8gcm91dGUgbWV0aG9kcyBvbiB0aGF0IGludGVyZmFjZSB0aHJvdWdoIHRoZSBidXMgYW5kCisgKiB0byBvdGhlciBhcHBsaWNhdGlvbnMuIElmIHJvdXRpbmcgcGVlciBtZXNzYWdlcyBpcyBlbmFibGVkLCB0aGVuCisgKiBtZXNzYWdlcyB3aXRoIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIGludGVyZmFjZSB0aGF0IGFsc28KKyAqIGhhdmUgYSBidXMgZGVzdGluYXRpb24gbmFtZSBzZXQgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQorICogaGFuZGxlZCBieSB0aGUgI0RCdXNDb25uZWN0aW9uIGFuZCBpbnN0ZWFkIHdpbGwgYmUgZGlzcGF0Y2hlZAorICogbm9ybWFsbHkgdG8gdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIElmIGEgbm9ybWFsIGFwcGxpY2F0aW9uIHNldHMgdGhpcyBmbGFnLCBpdCBjYW4gYnJlYWsgdGhpbmdzIGJhZGx5LgorICogU28gZG9uJ3Qgc2V0IHRoaXMgdW5sZXNzIHlvdSBhcmUgdGhlIG1lc3NhZ2UgYnVzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdmFsdWUgI1RSVUUgdG8gcGFzcyB0aHJvdWdoIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgbWVzc2FnZXMgd2l0aCBhIGJ1cyBuYW1lIHNldAorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgY29ubmVjdGlvbi0+cm91dGVfcGVlcl9tZXNzYWdlcyA9IFRSVUU7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBBZGRzIGEgbWVzc2FnZSBmaWx0ZXIuIEZpbHRlcnMgYXJlIGhhbmRsZXJzIHRoYXQgYXJlIHJ1biBvbiBhbGwKKyAqIGluY29taW5nIG1lc3NhZ2VzLCBwcmlvciB0byB0aGUgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpLiAgRmlsdGVycyBhcmUgcnVuIGluIHRoZQorICogb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWRkZWQuICBUaGUgc2FtZSBoYW5kbGVyIGNhbiBiZSBhZGRlZCBhcyBhCisgKiBmaWx0ZXIgbW9yZSB0aGFuIG9uY2UsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBydW4gbW9yZSB0aGFuIG9uY2UuCisgKiBGaWx0ZXJzIGFkZGVkIGR1cmluZyBhIGZpbHRlciBjYWxsYmFjayB3b24ndCBiZSBydW4gb24gdGhlIG1lc3NhZ2UKKyAqIGJlaW5nIHByb2Nlc3NlZC4KKyAqCisgKiBAdG9kbyB3ZSBkb24ndCBydW4gZmlsdGVycyBvbiBtZXNzYWdlcyB3aGlsZSBibG9ja2luZyB3aXRob3V0CisgKiBlbnRlcmluZyB0aGUgbWFpbiBsb29wLCBzaW5jZSBmaWx0ZXJzIGFyZSBydW4gYXMgcGFydCBvZgorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIFRoaXMgaXMgcHJvYmFibHkgYSBmZWF0dXJlLCBhcyBmaWx0ZXJzCisgKiBjb3VsZCBjcmVhdGUgYXJiaXRyYXJ5IHJlZW50cmFuY3kuIEJ1dCBraW5kIG9mIHN1Y2tzIGlmIHlvdSdyZQorICogdHJ5aW5nIHRvIGZpbHRlciBNRVRIT0RfUkVUVVJOIGZvciBzb21lIHJlYXNvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGZ1bmN0aW9uIGZ1bmN0aW9uIHRvIGhhbmRsZSBtZXNzYWdlcworICogQHBhcmFtIHVzZXJfZGF0YSB1c2VyIGRhdGEgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gdXNlIGZvciBmcmVlaW5nIHVzZXIgZGF0YQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhbmRsZU1lc3NhZ2VGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c01lc3NhZ2VGaWx0ZXIgKmZpbHRlcjsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZnVuY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworCisgIGZpbHRlciA9IGRidXNfbmV3MCAoREJ1c01lc3NhZ2VGaWx0ZXIsIDEpOworICBpZiAoZmlsdGVyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZpbHRlci0+cmVmY291bnQudmFsdWUgPSAxOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcikpCisgICAgeworICAgICAgX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYgKGZpbHRlcik7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZpbGwgaW4gZmlsdGVyIGFmdGVyIGFsbCBtZW1vcnkgYWxsb2NhdGVkLAorICAgKiBzbyB3ZSBkb24ndCBydW4gdGhlIGZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uCisgICAqIGlmIHRoZSBhZGRfZmlsdGVyKCkgZmFpbHMKKyAgICovCisgIAorICBmaWx0ZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247CisgIGZpbHRlci0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICAgICAgICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgcHJldmlvdXNseS1hZGRlZCBtZXNzYWdlIGZpbHRlci4gSXQgaXMgYSBwcm9ncmFtbWluZworICogZXJyb3IgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhIGhhbmRsZXIgdGhhdCBoYXMgbm90IGJlZW4gYWRkZWQKKyAqIGFzIGEgZmlsdGVyLiBJZiB0aGUgZ2l2ZW4gaGFuZGxlciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIG9ubHkKKyAqIG9uZSBpbnN0YW5jZSBvZiBpdCB3aWxsIGJlIHJlbW92ZWQgKHRoZSBtb3N0IHJlY2VudGx5LWFkZGVkCisgKiBpbnN0YW5jZSkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgaGFuZGxlciB0byByZW1vdmUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgdXNlciBkYXRhIGZvciB0aGUgaGFuZGxlciB0byByZW1vdmUKKyAqCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNNZXNzYWdlRmlsdGVyICpmaWx0ZXI7CisgIAorICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGZ1bmN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBmaWx0ZXIgPSBOVUxMOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBmaWx0ZXIgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoZmlsdGVyLT5mdW5jdGlvbiA9PSBmdW5jdGlvbiAmJgorICAgICAgICAgIGZpbHRlci0+dXNlcl9kYXRhID09IHVzZXJfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCwgbGluayk7CisgICAgICAgICAgZmlsdGVyLT5mdW5jdGlvbiA9IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsIGxpbmspOworICAgICAgZmlsdGVyID0gTlVMTDsKKyAgICB9CisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoZmlsdGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBdHRlbXB0IHRvIHJlbW92ZSBmaWx0ZXIgZnVuY3Rpb24gJXAgdXNlciBkYXRhICVwLCBidXQgbm8gc3VjaCBmaWx0ZXIgaGFzIGJlZW4gYWRkZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIHVzZXJfZGF0YSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgIAorICAvKiBDYWxsIGFwcGxpY2F0aW9uIGNvZGUgKi8KKyAgaWYgKGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24pCisgICAgKCogZmlsdGVyLT5mcmVlX3VzZXJfZGF0YV9mdW5jdGlvbikgKGZpbHRlci0+dXNlcl9kYXRhKTsKKworICBmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uID0gTlVMTDsKKyAgZmlsdGVyLT51c2VyX2RhdGEgPSBOVUxMOworICAKKyAgX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYgKGZpbHRlcik7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBnaXZlbiBwYXRoIGluIHRoZSBvYmplY3QgaGllcmFyY2h5LgorICogVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIHNlbnQgdG8gZXhhY3RseSB0aGUgZ2l2ZW4gcGF0aC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggYSAnLycgZGVsaW1pdGVkIHN0cmluZyBvZiBwYXRoIGVsZW1lbnRzCisgKiBAcGFyYW0gdnRhYmxlIHRoZSB2aXJ0dWFsIHRhYmxlCisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbnMgaW4gdGhlIHZ0YWJsZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfQUREUkVTU19JTl9VU0UpIGlzIHJlcG9ydGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAqKmRlY29tcG9zZWRfcGF0aDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZ0YWJsZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAocGF0aCwgc3RybGVuIChwYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKGNvbm5lY3Rpb24tPm9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgsIHZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSwgZXJyb3IpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkX3BhdGgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBnaXZlbiBwYXRoIGluIHRoZSBvYmplY3QgaGllcmFyY2h5LgorICogVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIHNlbnQgdG8gZXhhY3RseSB0aGUgZ2l2ZW4gcGF0aC4KKyAqCisgKiBJdCBpcyBhIGJ1ZyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIG9iamVjdCBwYXRocyB3aGljaCBhbHJlYWR5CisgKiBoYXZlIGEgaGFuZGxlci4gVXNlIGRidXNfY29ubmVjdGlvbl90cnlfcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKSBpZiB0aGlzCisgKiBtaWdodCBiZSB0aGUgY2FzZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggYSAnLycgZGVsaW1pdGVkIHN0cmluZyBvZiBwYXRoIGVsZW1lbnRzCisgKiBAcGFyYW0gdnRhYmxlIHRoZSB2aXJ0dWFsIHRhYmxlCisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbnMgaW4gdGhlIHZ0YWJsZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGNoYXIgKipkZWNvbXBvc2VkX3BhdGg7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHBhdGgsIHN0cmxlbiAocGF0aCksICZkZWNvbXBvc2VkX3BhdGgsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyIChjb25uZWN0aW9uLT5vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgZGVjb21wb3NlZF9wYXRoLCB2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEsICZlcnJvcik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWRfcGF0aCk7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBmYWxsYmFjayBoYW5kbGVyIGZvciBhIGdpdmVuIHN1YnNlY3Rpb24gb2YgdGhlIG9iamVjdAorICogaGllcmFyY2h5LiAgVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIGF0IG9yIGJlbG93IHRoZSBnaXZlbgorICogcGF0aC4gWW91IGNhbiB1c2UgdGhpcyB0byBlc3RhYmxpc2ggYSBkZWZhdWx0IG1lc3NhZ2UgaGFuZGxpbmcKKyAqIHBvbGljeSBmb3IgYSB3aG9sZSAic3ViZGlyZWN0b3J5LiIKKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggYSAnLycgZGVsaW1pdGVkIHN0cmluZyBvZiBwYXRoIGVsZW1lbnRzCisgKiBAcGFyYW0gdnRhYmxlIHRoZSB2aXJ0dWFsIHRhYmxlCisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbnMgaW4gdGhlIHZ0YWJsZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfQUREUkVTU19JTl9VU0UpIGlzIHJlcG9ydGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX2ZhbGxiYWNrIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAqKmRlY29tcG9zZWRfcGF0aDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHBhdGgsIHN0cmxlbiAocGF0aCksICZkZWNvbXBvc2VkX3BhdGgsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyIChjb25uZWN0aW9uLT5vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgsIHZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSwgZXJyb3IpOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkX3BhdGgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmVnaXN0ZXJzIGEgZmFsbGJhY2sgaGFuZGxlciBmb3IgYSBnaXZlbiBzdWJzZWN0aW9uIG9mIHRoZSBvYmplY3QKKyAqIGhpZXJhcmNoeS4gIFRoZSBnaXZlbiB2dGFibGUgaGFuZGxlcyBtZXNzYWdlcyBhdCBvciBiZWxvdyB0aGUgZ2l2ZW4KKyAqIHBhdGguIFlvdSBjYW4gdXNlIHRoaXMgdG8gZXN0YWJsaXNoIGEgZGVmYXVsdCBtZXNzYWdlIGhhbmRsaW5nCisgKiBwb2xpY3kgZm9yIGEgd2hvbGUgInN1YmRpcmVjdG9yeS4iCisgKgorICogSXQgaXMgYSBidWcgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBvYmplY3QgcGF0aHMgd2hpY2ggYWxyZWFkeQorICogaGF2ZSBhIGhhbmRsZXIuIFVzZSBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX2ZhbGxiYWNrKCkgaWYgdGhpcworICogbWlnaHQgYmUgdGhlIGNhc2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHBhcmFtIHZ0YWJsZSB0aGUgdmlydHVhbCB0YWJsZQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGluIHRoZSB2dGFibGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBjaGFyICoqZGVjb21wb3NlZF9wYXRoOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGggIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGhbMF0gPT0gJy8nLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodnRhYmxlICE9IE5VTEwsIEZBTFNFKTsKKworICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChwYXRoLCBzdHJsZW4gKHBhdGgpLCAmZGVjb21wb3NlZF9wYXRoLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR2YWwgPSBfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlciAoY29ubmVjdGlvbi0+b2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisJCQkJICAgICAgIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgsIHZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSwgJmVycm9yKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZF9wYXRoKTsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX0FERFJFU1NfSU5fVVNFKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFVucmVnaXN0ZXJzIHRoZSBoYW5kbGVyIHJlZ2lzdGVyZWQgd2l0aCBleGFjdGx5IHRoZSBnaXZlbiBwYXRoLgorICogSXQncyBhIGJ1ZyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGEgcGF0aCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuCisgKiBDYW4gdW5yZWdpc3RlciBib3RoIGZhbGxiYWNrIHBhdGhzIGFuZCBvYmplY3QgcGF0aHMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fdW5yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCkKK3sKKyAgY2hhciAqKmRlY29tcG9zZWRfcGF0aDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGggIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGhbMF0gPT0gJy8nLCBGQUxTRSk7CisKKyAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAocGF0aCwgc3RybGVuIChwYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24tPm9iamVjdHMsIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgpOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWRfcGF0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdXNlciBkYXRhIHBhc3NlZCB0byBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKQorICogb3IgZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrKCkuIElmIG5vdGhpbmcgd2FzIHJlZ2lzdGVyZWQKKyAqIGF0IHRoaXMgcGF0aCwgdGhlIGRhdGEgaXMgZmlsbGVkIGluIHdpdGggI05VTEwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHlvdSByZWdpc3RlcmVkIHdpdGgKKyAqIEBwYXJhbSBkYXRhX3AgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHVzZXIgZGF0YSwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKipkYXRhX3ApCit7CisgIGNoYXIgKipkZWNvbXBvc2VkX3BhdGg7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYXRhX3AgIT0gTlVMTCwgRkFMU0UpOworCisgICpkYXRhX3AgPSBOVUxMOworICAKKyAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAocGF0aCwgc3RybGVuIChwYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICAqZGF0YV9wID0gX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAoY29ubmVjdGlvbi0+b2JqZWN0cywgKGNvbnN0IGNoYXIqKikgZGVjb21wb3NlZF9wYXRoKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZF9wYXRoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMaXN0cyB0aGUgcmVnaXN0ZXJlZCBmYWxsYmFjayBoYW5kbGVycyBhbmQgb2JqZWN0IHBhdGggaGFuZGxlcnMgYXQKKyAqIHRoZSBnaXZlbiBwYXJlbnRfcGF0aC4gVGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXJlbnRfcGF0aCB0aGUgcGF0aCB0byBsaXN0IHRoZSBjaGlsZCBoYW5kbGVycyBvZgorICogQHBhcmFtIGNoaWxkX2VudHJpZXMgcmV0dXJucyAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIGNoaWxkcmVuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBjaGlsZCBlbnRyaWVzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fbGlzdF9yZWdpc3RlcmVkIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKipjaGlsZF9lbnRyaWVzKQoreworICBjaGFyICoqZGVjb21wb3NlZF9wYXRoOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGFyZW50X3BhdGggIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhcmVudF9wYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHBhcmVudF9wYXRoLCBzdHJsZW4gKHBhcmVudF9wYXRoKSwgJmRlY29tcG9zZWRfcGF0aCwgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24tPm9iamVjdHMsCisJCQkJCQkJIChjb25zdCBjaGFyICoqKSBkZWNvbXBvc2VkX3BhdGgsCisJCQkJCQkJIGNoaWxkX2VudHJpZXMpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkX3BhdGgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBEQnVzRGF0YVNsb3RBbGxvY2F0b3Igc2xvdF9hbGxvY2F0b3I7CitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKGNvbm5lY3Rpb25fc2xvdHMpOworCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIGRhdGEgb24gYW55IERCdXNDb25uZWN0aW9uLiBUaGUgYWxsb2NhdGVkIElEIG1heSB0aGVuIGJlIHVzZWQKKyAqIHdpdGggZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCkgYW5kIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpLgorICogVGhlIHBhc3NlZC1pbiBzbG90IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCBpcyBmaWxsZWQgaW4KKyAqIHdpdGggdGhlIHNsb3QgSUQuIElmIHRoZSBwYXNzZWQtaW4gc2xvdCBpcyBub3QgLTEsIGl0J3MgYXNzdW1lZAorICogdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBpdHMgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQuCisgKiAKKyAqIFRoZSBhbGxvY2F0ZWQgc2xvdCBpcyBnbG9iYWwsIGkuZS4gYWxsIERCdXNDb25uZWN0aW9uIG9iamVjdHMgd2lsbAorICogaGF2ZSBhIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gaW50ZWdlciBJRCByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgYSBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgc2xvdAorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICByZXR1cm4gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9EQlVTX0xPQ0tfTkFNRSAoY29ubmVjdGlvbl9zbG90cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X3ApOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGEgZ2xvYmFsIElEIGZvciBjb25uZWN0aW9uIGRhdGEgc2xvdHMuCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoKSBhbmQgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCkgbWF5IG5vCisgKiBsb25nZXIgYmUgdXNlZCB3aXRoIHRoaXMgc2xvdC4gIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uIGV4aXN0aW5nCisgKiBEQnVzQ29ubmVjdGlvbiBvYmplY3RzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcworICogZmluYWxpemVkLCBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZSByZXBsYWNlZCBpZgorICogc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4gIFdoZW4gdGhlIHJlZmNvdW50IG9uIHRoZQorICogcGFzc2VkLWluIHNsb3QgcmVhY2hlcyAwLCBpdCBpcyBzZXQgdG8gLTEuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIHN0b3JpbmcgdGhlIHNsb3QgdG8gZGVhbGxvY2F0ZQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoKnNsb3RfcCA+PSAwKTsKKyAgCisgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJnNsb3RfYWxsb2NhdG9yLCBzbG90X3ApOworfQorCisvKioKKyAqIFN0b3JlcyBhIHBvaW50ZXIgb24gYSBEQnVzQ29ubmVjdGlvbiwgYWxvbmcKKyAqIHdpdGggYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZnJlZWluZworICogdGhlIGRhdGEgd2hlbiB0aGUgZGF0YSBpcyBzZXQgYWdhaW4sIG9yIHdoZW4KKyAqIHRoZSBjb25uZWN0aW9uIGlzIGZpbmFsaXplZC4gVGhlIHNsb3QgbnVtYmVyCisgKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90KCkuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIHRoZQorICogbWFpbiB0aHJlYWQgbG9jayBvbiBEQnVzQ29ubmVjdGlvbiwgd2hpY2ggYWxsb3dzIGl0IHRvIGJlCisgKiB1c2VkIGZyb20gaW5zaWRlIHdhdGNoIGFuZCB0aW1lb3V0IGZ1bmN0aW9ucy4gKFNlZSB0aGUKKyAqIG5vdGUgaW4gZG9jcyBmb3IgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKS4pCisgKiBBIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZXJlJ3MKKyAqIGEgcmVmZXJlbmNlIGhlbGQgb24gdGhlIGNvbm5lY3Rpb24gd2hpbGUgaW52b2tpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpLCBvciB0aGUgY29ubmVjdGlvbiBjb3VsZCBiZQorICogZmluYWxpemVkIGR1cmluZyBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgbnVtYmVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byBzdG9yZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jIGZpbmFsaXplciBmdW5jdGlvbiBmb3IgdGhlIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIHdhcyBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBkYXRhCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKQoreworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmM7CisgIHZvaWQgKm9sZF9kYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzbG90ID49IDAsIEZBTFNFKTsKKyAgCisgIFNMT1RTX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uZWN0aW9uLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSk7CisgIAorICBTTE9UU19VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgLyogRG8gdGhlIGFjdHVhbCBmcmVlIG91dHNpZGUgdGhlIGNvbm5lY3Rpb24gbG9jayAqLworICAgICAgaWYgKG9sZF9mcmVlX2Z1bmMpCisgICAgICAgICgqIG9sZF9mcmVlX2Z1bmMpIChvbGRfZGF0YSk7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0cmlldmVzIGRhdGEgcHJldmlvdXNseSBzZXQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEoKS4KKyAqIFRoZSBzbG90IG11c3Qgc3RpbGwgYmUgYWxsb2NhdGVkIChtdXN0IG5vdCBoYXZlIGJlZW4gZnJlZWQpLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUKKyAqIG1haW4gdGhyZWFkIGxvY2sgb24gREJ1c0Nvbm5lY3Rpb24sIHdoaWNoIGFsbG93cyBpdCB0byBiZQorICogdXNlZCBmcm9tIGluc2lkZSB3YXRjaCBhbmQgdGltZW91dCBmdW5jdGlvbnMuIChTZWUgdGhlCisgKiBub3RlIGluIGRvY3MgZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuKQorICogQSBzaWRlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgeW91IG5lZWQgdG8ga25vdyB0aGVyZSdzCisgKiBhIHJlZmVyZW5jZSBoZWxkIG9uIHRoZSBjb25uZWN0aW9uIHdoaWxlIGludm9raW5nCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoKSwgb3IgdGhlIGNvbm5lY3Rpb24gY291bGQgYmUKKyAqIGZpbmFsaXplZCBkdXJpbmcgZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IHRvIGdldCBkYXRhIGZyb20KKyAqIEByZXR1cm5zIHRoZSBkYXRhLCBvciAjTlVMTCBpZiBub3QgZm91bmQKKyAqLwordm9pZCoKK2RidXNfY29ubmVjdGlvbl9nZXRfZGF0YSAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCkKK3sKKyAgdm9pZCAqcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKyAgCisgIFNMT1RTX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJlcyA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uZWN0aW9uLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCk7CisgIAorICBTTE9UU19VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGEgZ2xvYmFsIGZsYWcgZm9yIHdoZXRoZXIgZGJ1c19jb25uZWN0aW9uX25ldygpCisgKiB3aWxsIHNldCBTSUdQSVBFIGJlaGF2aW9yIHRvIFNJR19JR04uCisgKgorICogQHBhcmFtIHdpbGxfbW9kaWZ5X3NpZ3BpcGUgI1RSVUUgdG8gYWxsb3cgc2lncGlwZSB0byBiZSBzZXQgdG8gU0lHX0lHTgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X2NoYW5nZV9zaWdwaXBlIChkYnVzX2Jvb2xfdCB3aWxsX21vZGlmeV9zaWdwaXBlKQoreyAgCisgIF9kYnVzX21vZGlmeV9zaWdwaXBlID0gd2lsbF9tb2RpZnlfc2lncGlwZSAhPSBGQUxTRTsKK30KKworLyoqCisgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBtZXNzYWdlIHRoaXMgY29ubmVjdGlvbiBpcyBhbGxvd2VkIHRvCisgKiByZWNlaXZlLiBMYXJnZXIgbWVzc2FnZXMgd2lsbCByZXN1bHQgaW4gZGlzY29ubmVjdGluZyB0aGUKKyAqIGNvbm5lY3Rpb24uCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGEgI0RCdXNDb25uZWN0aW9uCisgKiBAcGFyYW0gc2l6ZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSB0aGUgY29ubmVjdGlvbiBjYW4gcmVjZWl2ZSwgaW4gYnl0ZXMKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIHNpemUpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfbWVzc2FnZV9zaXplIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBzZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV9zaXplKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBtYXggc2l6ZSBvZiBhIHNpbmdsZSBtZXNzYWdlCisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW5peCBmZHMgYSBtZXNzYWdlIG9uIHRoaXMKKyAqIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byByZWNlaXZlLiBNZXNzYWdlcyB3aXRoIG1vcmUgdW5peCBmZHMgd2lsbAorICogcmVzdWx0IGluIGRpc2Nvbm5lY3RpbmcgdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gYSAjREJ1c0Nvbm5lY3Rpb24KKyAqIEBwYXJhbSBzaXplIG1heGltdW0gbWVzc2FnZSB1bml4IGZkcyB0aGUgY29ubmVjdGlvbiBjYW4gcmVjZWl2ZQorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBuKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgc2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG1heCBudW1lciBvZiB1bml4IGZkcyBvZiBhIHNpbmdsZSBtZXNzYWdlCisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGFsbCBtZXNzYWdlcworICogcmVjZWl2ZWQgb24gdGhpcyBjb25uZWN0aW9uLiBNZXNzYWdlcyBjb3VudCB0b3dhcmQgdGhlIG1heGltdW0gdW50aWwKKyAqIHRoZXkgYXJlIGZpbmFsaXplZC4gV2hlbiB0aGUgbWF4aW11bSBpcyByZWFjaGVkLCB0aGUgY29ubmVjdGlvbiB3aWxsCisgKiBub3QgcmVhZCBtb3JlIGRhdGEgdW50aWwgc29tZSBtZXNzYWdlcyBhcmUgZmluYWxpemVkLgorICoKKyAqIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIG1heGltdW0gYXJlOiBpZiBvdXRzdGFuZGluZyBtZXNzYWdlcyBhcmUKKyAqIGFscmVhZHkgYWJvdmUgdGhlIG1heGltdW0sIGFkZGl0aW9uYWwgbWVzc2FnZXMgd2lsbCBub3QgYmUgcmVhZC4KKyAqIFRoZSBzZW1hbnRpY3MgYXJlIG5vdDogaWYgdGhlIG5leHQgbWVzc2FnZSB3b3VsZCBjYXVzZSB1cyB0byBleGNlZWQKKyAqIHRoZSBtYXhpbXVtLCB3ZSBkb24ndCByZWFkIGl0LiBUaGUgcmVhc29uIGlzIHRoYXQgd2UgZG9uJ3Qga25vdyB0aGUKKyAqIHNpemUgb2YgYSBtZXNzYWdlIHVudGlsIGFmdGVyIHdlIHJlYWQgaXQuCisgKgorICogVGh1cywgdGhlIG1heCBsaXZlIG1lc3NhZ2VzIHNpemUgY2FuIGFjdHVhbGx5IGJlIGV4Y2VlZGVkCisgKiBieSB1cCB0byB0aGUgbWF4aW11bSBzaXplIG9mIGEgc2luZ2xlIG1lc3NhZ2UuCisgKiAKKyAqIEFsc28sIGlmIHdlIHJlYWQgc2F5IDEwMjQgYnl0ZXMgb2ZmIHRoZSB3aXJlIGluIGEgc2luZ2xlIHJlYWQoKSwKKyAqIGFuZCB0aGF0IGNvbnRhaW5zIGEgaGFsZi1kb3plbiBzbWFsbCBtZXNzYWdlcywgd2UgbWF5IGV4Y2VlZCB0aGUKKyAqIHNpemUgbWF4IGJ5IHRoYXQgYW1vdW50LiBCdXQgdGhpcyBzaG91bGQgYmUgaW5jb25zZXF1ZW50aWFsLgorICoKKyAqIFRoaXMgZG9lcyBpbXBseSB0aGF0IHdlIGNhbid0IGNhbGwgcmVhZCgpIHdpdGggYSBidWZmZXIgbGFyZ2VyCisgKiB0aGFuIHdlJ3JlIHdpbGxpbmcgdG8gZXhjZWVkIHRoaXMgbGltaXQgYnkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBzaXplIHRoZSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgYWxsIG91dHN0YW5kaW5nIG1lc3NhZ2VzCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIHNpemUpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIHNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF9zaXplKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBtYXggc2l6ZSBvZiBhbGwgbGl2ZSBtZXNzYWdlcworICovCitsb25nCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgbG9uZyByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIHVuaXggZmRzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGFsbCBtZXNzYWdlcworICogcmVjZWl2ZWQgb24gdGhpcyBjb25uZWN0aW9uLiBNZXNzYWdlcyBjb3VudCB0b3dhcmQgdGhlIG1heGltdW0gdW50aWwKKyAqIHRoZXkgYXJlIGZpbmFsaXplZC4gV2hlbiB0aGUgbWF4aW11bSBpcyByZWFjaGVkLCB0aGUgY29ubmVjdGlvbiB3aWxsCisgKiBub3QgcmVhZCBtb3JlIGRhdGEgdW50aWwgc29tZSBtZXNzYWdlcyBhcmUgZmluYWxpemVkLgorICoKKyAqIFRoZSBzZW1hbnRpY3MgYXJlIGFuYWxvZ291cyB0byB0aG9zZSBvZiBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF9zaXplKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBzaXplIHRoZSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgYWxsIG91dHN0YW5kaW5nIG1lc3NhZ2VzCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgbikKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgc2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBtYXggdW5peCBmZHMgb2YgYWxsIGxpdmUgbWVzc2FnZXMKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBHZXRzIHRoZSBhcHByb3hpbWF0ZSBzaXplIGluIGJ5dGVzIG9mIGFsbCBtZXNzYWdlcyBpbiB0aGUgb3V0Z29pbmcKKyAqIG1lc3NhZ2UgcXVldWUuIFRoZSBzaXplIGlzIGFwcHJveGltYXRlIGluIHRoYXQgeW91IHNob3VsZG4ndCB1c2UKKyAqIGl0IHRvIGRlY2lkZSBob3cgbWFueSBieXRlcyB0byByZWFkIG9mZiB0aGUgbmV0d29yayBvciBhbnl0aGluZworICogb2YgdGhhdCBuYXR1cmUsIGFzIG9wdGltaXphdGlvbnMgbWF5IGNob29zZSB0byB0ZWxsIHNtYWxsIHdoaXRlIGxpZXMKKyAqIHRvIGF2b2lkIHBlcmZvcm1hbmNlIG92ZXJoZWFkLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCB1cCBidXQgbm90IHNlbnQKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9vdXRnb2luZ19zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgbG9uZyByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogR2V0cyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIHVuaSBmZHMgb2YgYWxsIG1lc3NhZ2VzIGluIHRoZQorICogb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiB1bml4IGZkcyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXAgYnV0IG5vdCBzZW50CisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY29ubmVjdGlvbi5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJhN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDQ5NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNvbm5lY3Rpb24uaCBEQnVzQ29ubmVjdGlvbiBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19DT05ORUNUSU9OX0gKKyNkZWZpbmUgREJVU19DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2hhcmVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQ29ubmVjdGlvbgorICogQHsKKyAqLworCisvKiBkb2N1bWVudGVkIGluIGRidXMtd2F0Y2guYyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1dhdGNoIERCdXNXYXRjaDsKKy8qIGRvY3VtZW50ZWQgaW4gZGJ1cy10aW1lb3V0LmMgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNUaW1lb3V0IERCdXNUaW1lb3V0OworLyoqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBwcmVhbGxvY2F0ZWQgcmVzb3VyY2VzIHNvIGEgbWVzc2FnZSBjYW4gYmUgc2VudCB3aXRob3V0IGZ1cnRoZXIgbWVtb3J5IGFsbG9jYXRpb24uICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUHJlYWxsb2NhdGVkU2VuZCBEQnVzUHJlYWxsb2NhdGVkU2VuZDsKKy8qKiBPcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYSBtZXRob2QgY2FsbCB0aGF0IGhhcyBub3QgeWV0IHJlY2VpdmVkIGEgcmVwbHkuICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUGVuZGluZ0NhbGwgREJ1c1BlbmRpbmdDYWxsOworLyoqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgYXBwbGljYXRpb24gYW5kIGFzc29jaWF0ZWQgaW5jb21pbmcvb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZXMuICovCit0eXBlZGVmIHN0cnVjdCBEQnVzQ29ubmVjdGlvbiBEQnVzQ29ubmVjdGlvbjsKKy8qKiBTZXQgb2YgZnVuY3Rpb25zIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBoYW5kbGUgbWVzc2FnZXMgc2VudCB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IHBhdGguICovCit0eXBlZGVmIHN0cnVjdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSBEQnVzT2JqZWN0UGF0aFZUYWJsZTsKKworLyoqCisgKiBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBhICNEQnVzV2F0Y2guCisgKi8KK3R5cGVkZWYgZW51bQoreworICBEQlVTX1dBVENIX1JFQURBQkxFID0gMSA8PCAwLCAvKio8IEFzIGluIFBPTExJTiAqLworICBEQlVTX1dBVENIX1dSSVRBQkxFID0gMSA8PCAxLCAvKio8IEFzIGluIFBPTExPVVQgKi8KKyAgREJVU19XQVRDSF9FUlJPUiAgICA9IDEgPDwgMiwgLyoqPCBBcyBpbiBQT0xMRVJSIChjYW4ndCB3YXRjaCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGlzLCBidXQgY2FuIGJlIHByZXNlbnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjdXJyZW50IHN0YXRlIHBhc3NlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRidXNfd2F0Y2hfaGFuZGxlKCkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJVU19XQVRDSF9IQU5HVVAgICA9IDEgPDwgMyAgLyoqPCBBcyBpbiBQT0xMSFVQIChjYW4ndCB3YXRjaCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpdCwgYnV0IGNhbiBiZSBwcmVzZW50IGluIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzdGF0ZSBwYXNzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkYnVzX3dhdGNoX2hhbmRsZSgpKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IERCdXNXYXRjaEZsYWdzOworCisvKioKKyAqIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIGluY29taW5nIGRhdGEgb24gYSAjREJ1c0Nvbm5lY3Rpb24uIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBuZWVkcyB0byBiZSBjYWxsZWQuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUywgIC8qKjwgVGhlcmUgaXMgbW9yZSBkYXRhIHRvIHBvdGVudGlhbGx5IGNvbnZlcnQgdG8gbWVzc2FnZXMuICovCisgIERCVVNfRElTUEFUQ0hfQ09NUExFVEUsICAgICAgLyoqPCBBbGwgY3VycmVudGx5IGF2YWlsYWJsZSBkYXRhIGhhcyBiZWVuIHByb2Nlc3NlZC4gKi8KKyAgREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSAgICAvKio8IE1vcmUgbWVtb3J5IGlzIG5lZWRlZCB0byBjb250aW51ZS4gKi8KK30gREJ1c0Rpc3BhdGNoU3RhdHVzOworCisvKiogQ2FsbGVkIHdoZW4gbGliZGJ1cyBuZWVkcyBhIG5ldyB3YXRjaCB0byBiZSBtb25pdG9yZWQgYnkgdGhlIG1haW4KKyAqIGxvb3AuIFJldHVybnMgI0ZBTFNFIGlmIGl0IGxhY2tzIGVub3VnaCBtZW1vcnkgdG8gYWRkIHRoZQorICogd2F0Y2guIFNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FkZFdhdGNoRnVuY3Rpb24pICAgICAgIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworLyoqIENhbGxlZCB3aGVuIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQoKSBtYXkgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlCisgKiAgdGhhbiBpdCBkaWQgYmVmb3JlLiAgU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkKKyAqICBvciBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uKSAgIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworLyoqIENhbGxlZCB3aGVuIGxpYmRidXMgbm8gbG9uZ2VyIG5lZWRzIGEgd2F0Y2ggdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZQorICogbWFpbiBsb29wLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uKSAgICAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBsaWJkYnVzIG5lZWRzIGEgbmV3IHRpbWVvdXQgdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZSBtYWluCisgKiBsb29wLiBSZXR1cm5zICNGQUxTRSBpZiBpdCBsYWNrcyBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0aGUKKyAqIHdhdGNoLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzQWRkVGltZW91dEZ1bmN0aW9uKSAgICAgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQoKSBtYXkgcmV0dXJuIGEgZGlmZmVyZW50CisgKiB2YWx1ZSB0aGFuIGl0IGRpZCBiZWZvcmUuCisgKiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbikgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBsaWJkYnVzIG5vIGxvbmdlciBuZWVkcyBhIHRpbWVvdXQgdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZQorICogbWFpbiBsb29wLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uKSAgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGRidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzKCkKKyAqIG1heSBoYXZlIGNoYW5nZWQuIFNldCB3aXRoIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24pIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgbmV3X3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBtYWluIGxvb3AncyB0aHJlYWQgc2hvdWxkIGJlIG5vdGlmaWVkIHRoYXQgdGhlcmUncyBub3cgd29yaworICogdG8gZG8uIFNldCB3aXRoIGRidXNfY29ubmVjdGlvbl9zZXRfd2FrZXVwX21haW5fZnVuY3Rpb24oKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uKSAgICAgKHZvaWQgICAgICAgICAgICpkYXRhKTsKKworLyoqCisgKiBDYWxsZWQgZHVyaW5nIGF1dGhlbnRpY2F0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFVOSVggdXNlcgorICogSUQgaXMgYWxsb3dlZCB0byBjb25uZWN0LCBpZiB0aGUgY2xpZW50IHRyaWVkIHRvIGF1dGggYXMgYSBVTklYCisgKiB1c2VyIElELiBOb3JtYWxseSBvbiBXaW5kb3dzIHRoaXMgd291bGQgbmV2ZXIgaGFwcGVuLiBTZXQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24oKS4KKyAqLyAKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbikgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKworLyoqCisgKiBDYWxsZWQgZHVyaW5nIGF1dGhlbnRpY2F0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFdpbmRvd3MgdXNlcgorICogSUQgaXMgYWxsb3dlZCB0byBjb25uZWN0LCBpZiB0aGUgY2xpZW50IHRyaWVkIHRvIGF1dGggYXMgYSBXaW5kb3dzCisgKiB1c2VyIElELiBOb3JtYWxseSBvbiBVTklYIHRoaXMgd291bGQgbmV2ZXIgaGFwcGVuLiBTZXQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24oKS4KKyAqLyAKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbikgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqdXNlcl9zaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworCisKKy8qKgorICogQ2FsbGVkIHdoZW4gYSBwZW5kaW5nIGNhbGwgbm93IGhhcyBhIHJlcGx5IGF2YWlsYWJsZS4gU2V0IHdpdGgKKyAqIGRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkoKS4KKyAqLwordHlwZWRlZiB2b2lkICgqIERCdXNQZW5kaW5nQ2FsbE5vdGlmeUZ1bmN0aW9uKSAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisvKioKKyAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBuZWVkcyB0byBiZSBoYW5kbGVkLiBUaGUgcmVzdWx0IGluZGljYXRlcyB3aGV0aGVyIG9yCisgKiBub3QgbW9yZSBoYW5kbGVycyBzaG91bGQgYmUgcnVuLiBTZXQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlcigpLgorICovCit0eXBlZGVmIERCdXNIYW5kbGVyUmVzdWx0ICgqIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24pIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24qICAgIGRidXNfY29ubmVjdGlvbl9vcGVuICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiogICAgZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK0RCdXNDb25uZWN0aW9uKiAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Fub255bW91cyAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlcnZlcl9pZCAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZSAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICBleGl0X29uX2Rpc2Nvbm5lY3QpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogICAgICAgZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zdGVhbF9ib3Jyb3dlZF9tZXNzYWdlICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK0RCdXNEaXNwYXRjaFN0YXR1cyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK0RCdXNEaXNwYXRjaFN0YXR1cyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmQgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAgICAgICAqY2xpZW50X3NlcmlhbCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgKipwZW5kaW5nX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSAqICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93YWtldXBfbWFpbl9mdW5jdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uICAgICAgd2FrZXVwX21haW5fZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqdWlkKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqcGlkKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbiAgIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApOyAKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgIHZhbHVlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpOworCisKKy8qIEZpbHRlcnMgKi8KKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisKKworLyogT3RoZXIgKi8KK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAgICAgKGRidXNfaW50MzJfdCAgICAgKnNsb3RfcCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90KTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfY2hhbmdlX3NpZ3BpcGUgKGRidXNfYm9vbF90ICAgICAgIHdpbGxfbW9kaWZ5X3NpZ3BpcGUpOyAKKworREJVU19FWFBPUlQKK3ZvaWQgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV9zaXplICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKTsKK0RCVVNfRVhQT1JUCitsb25nIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSk7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgbik7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyhEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3NpemUgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK0RCVVNfRVhQT1JUCitEQnVzUHJlYWxsb2NhdGVkU2VuZCogZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpOworCisKKy8qIE9iamVjdCB0cmVlIGZ1bmN0aW9uYWxpdHkgKi8KKworLyoqCisgKiBDYWxsZWQgd2hlbiBhICNEQnVzT2JqZWN0UGF0aFZUYWJsZSBpcyB1bnJlZ2lzdGVyZWQgKG9yIGl0cyBjb25uZWN0aW9uIGlzIGZyZWVkKS4KKyAqIEZvdW5kIGluICNEQnVzT2JqZWN0UGF0aFZUYWJsZS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICAgICAoKiBEQnVzT2JqZWN0UGF0aFVucmVnaXN0ZXJGdW5jdGlvbikgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisvKioKKyAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IHRvIGEgcmVnaXN0ZXJlZCBvYmplY3QgcGF0aC4gRm91bmQgaW4KKyAqICNEQnVzT2JqZWN0UGF0aFZUYWJsZSB3aGljaCBpcyByZWdpc3RlcmVkIHdpdGggZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkKKyAqIG9yIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9mYWxsYmFjaygpLgorICovCit0eXBlZGVmIERCdXNIYW5kbGVyUmVzdWx0ICgqIERCdXNPYmplY3RQYXRoTWVzc2FnZUZ1bmN0aW9uKSAgICAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisKKy8qKgorICogVmlydHVhbCB0YWJsZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gaGFuZGxlIGEgcG9ydGlvbiBvZiB0aGUKKyAqIG9iamVjdCBwYXRoIGhpZXJhcmNoeS4gQXR0YWNoIHRoZSB2dGFibGUgdG8gYSBwYXJ0aWN1bGFyIHBhdGggdXNpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2soKS4KKyAqLworc3RydWN0IERCdXNPYmplY3RQYXRoVlRhYmxlCit7CisgIERCdXNPYmplY3RQYXRoVW5yZWdpc3RlckZ1bmN0aW9uICAgdW5yZWdpc3Rlcl9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoaXMgaGFuZGxlciAqLworICBEQnVzT2JqZWN0UGF0aE1lc3NhZ2VGdW5jdGlvbiAgICAgIG1lc3NhZ2VfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gdG8gaGFuZGxlIG1lc3NhZ2VzICovCisgIAorICB2b2lkICgqIGRidXNfaW50ZXJuYWxfcGFkMSkgKHZvaWQgKik7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBkYnVzX2ludGVybmFsX3BhZDIpICh2b2lkICopOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogZGJ1c19pbnRlcm5hbF9wYWQzKSAodm9pZCAqKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIGRidXNfaW50ZXJuYWxfcGFkNCkgKHZvaWQgKik7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KK307CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX2ZhbGxiYWNrIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2sgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3VucmVnaXN0ZXJfb2JqZWN0X3BhdGggKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKipkYXRhX3ApOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2xpc3RfcmVnaXN0ZXJlZCAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKioqY2hpbGRfZW50cmllcyk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZmQgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAqZmQpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0ICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICpmZCk7CisKKy8qKiBAfSAqLworCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1dhdGNoCisgKiBAeworICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQKK0RCVVNfRVhQT1JUCitEQlVTX0RFUFJFQ0FURUQgaW50IGRidXNfd2F0Y2hfZ2V0X2ZkICAgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKKyNlbmRpZgorCitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgZGJ1c193YXRjaF9nZXRfc29ja2V0ICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOworREJVU19FWFBPUlQKK3Vuc2lnbmVkIGludCBkYnVzX3dhdGNoX2dldF9mbGFncyAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX0VYUE9SVAordm9pZCogICAgICAgIGRidXNfd2F0Y2hfZ2V0X2RhdGEgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgZGJ1c193YXRjaF9zZXRfZGF0YSAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3dhdGNoX2hhbmRsZSAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBmbGFncyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1RpbWVvdXQKKyAqIEB7CisgKi8KKworREJVU19FWFBPUlQKK2ludCAgICAgICAgIGRidXNfdGltZW91dF9nZXRfaW50ZXJ2YWwgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfdGltZW91dF9nZXRfZGF0YSAgICAgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfdGltZW91dF9zZXRfZGF0YSAgICAgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3RpbWVvdXRfaGFuZGxlICAgICAgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLXV0aWwuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3NzE5NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1jcmVkZW50aWFscy11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy1jcmVkZW50aWFscy5jLCBidXQgb25seSB1c2VkIGZvciB0ZXN0cy9idXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQ3JlZGVudGlhbHMKKyAqIEB7CisgKi8KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIERCdXNDcmVkZW50aWFscyoKK21ha2VfY3JlZGVudGlhbHMoZGJ1c191aWRfdCAgdW5peF91aWQsCisgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgIHVuaXhfcGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aW5kb3dzX3NpZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsKKworICBjcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKworICBpZiAodW5peF91aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCB1bml4X3VpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIGlmICh1bml4X3BpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3BpZCAoY3JlZGVudGlhbHMsIHVuaXhfcGlkKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHdpbmRvd3Nfc2lkICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLCB3aW5kb3dzX3NpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBjcmVkZW50aWFsczsKK30KKworI2RlZmluZSBTQU1QTEVfU0lEICJ3aGF0ZXZlciBhIHdpbmRvd3Mgc2lkIGxvb2tzIGxpa2UiCisjZGVmaW5lIE9USEVSX1NBTVBMRV9TSUQgIndoYXRldmVyIGVsc2UiCisKK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc190ZXN0IChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzMjsKKyAgCisgIGlmICh0ZXN0X2RhdGFfZGlyID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgY3JlZHMgPSBtYWtlX2NyZWRlbnRpYWxzICgxMiwgNTExLCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgLyogdGVzdCByZWZjb3VudGluZyAqLworICBfZGJ1c19jcmVkZW50aWFsc19yZWYgKGNyZWRzKTsKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMsIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGNyZWRzLCBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoY3JlZHMpID09IDEyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF9waWQgKGNyZWRzKSA9PSA1MTEpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChjcmVkcyksIFNBTVBMRV9TSUQpID09IDApOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9lbXB0eSAoY3JlZHMpKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoY3JlZHMpKTsKKworICAvKiBUZXN0IGNvcHkgKi8KKyAgY3JlZHMyID0gX2RidXNfY3JlZGVudGlhbHNfY29weSAoY3JlZHMpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkczIsIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkczIsIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkczIsIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChjcmVkczIpID09IDEyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF9waWQgKGNyZWRzMikgPT0gNTExKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoY3JlZHMyKSwgU0FNUExFX1NJRCkgPT0gMCk7ICAKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisgIAorICAvKiBTYW1lIHVzZXIgaWYgYm90aCB1bml4IGFuZCB3aW5kb3dzIGFyZSB0aGUgc2FtZSAqLworICBjcmVkczIgPSBtYWtlX2NyZWRlbnRpYWxzICgxMiwgREJVU19QSURfVU5TRVQsIFNBTVBMRV9TSUQpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKworICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKworICAvKiBOb3QgdGhlIHNhbWUgdXNlciBpZiBXaW5kb3dzIGlzIG1pc3NpbmcgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoMTIsIERCVVNfUElEX1VOU0VULCBOVUxMKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogTm90IHRoZSBzYW1lIHVzZXIgaWYgV2luZG93cyBpcyBkaWZmZXJlbnQgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoMTIsIERCVVNfUElEX1VOU0VULCBPVEhFUl9TQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIE5vdCB0aGUgc2FtZSB1c2VyIGlmIFVuaXggaXMgbWlzc2luZyAqLworICBjcmVkczIgPSBtYWtlX2NyZWRlbnRpYWxzIChEQlVTX1VJRF9VTlNFVCwgREJVU19QSURfVU5TRVQsIFNBTVBMRV9TSUQpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChjcmVkcywgY3JlZHMyKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChjcmVkcywgY3JlZHMyKSk7CisgIAorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKworICAvKiBOb3QgdGhlIHNhbWUgdXNlciBpZiBVbml4IGlzIGRpZmZlcmVudCAqLworICBjcmVkczIgPSBtYWtlX2NyZWRlbnRpYWxzICgxNSwgREJVU19QSURfVU5TRVQsIFNBTVBMRV9TSUQpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChjcmVkcywgY3JlZHMyKSk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogTm90IHRoZSBzYW1lIHVzZXIgaWYgYm90aCBhcmUgbWlzc2luZyAqLworICBjcmVkczIgPSBtYWtlX2NyZWRlbnRpYWxzIChEQlVTX1VJRF9VTlNFVCwgREJVU19QSURfVU5TRVQsIE5VTEwpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChjcmVkcywgY3JlZHMyKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChjcmVkcywgY3JlZHMyKSk7CisgIAorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKworICAvKiBDbGVhcmluZyBjcmVkZW50aWFscyB3b3JrcyAqLworICBfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoY3JlZHMpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGNyZWRzLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGNyZWRzLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGNyZWRzLCBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoY3JlZHMpID09IERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF9waWQgKGNyZWRzKSA9PSBEQlVTX1BJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChjcmVkcykgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKGNyZWRzKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoY3JlZHMpKTsKKworICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY3JlZGVudGlhbHMuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1jcmVkZW50aWFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjlmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY3JlZGVudGlhbHMuYwpAQCAtMCwwICsxLDU1MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNyZWRlbnRpYWxzLmMgQ3JlZGVudGlhbHMgcHJvdmFibGUgdGhyb3VnaCBhdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0NyZWRlbnRpYWxzIENyZWRlbnRpYWxzIHByb3ZhYmxlIHRocm91Z2ggYXV0aGVudGljYXRpb24KKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0NyZWRlbnRpYWxzIG9iamVjdAorICoKKyAqIENyZWRlbnRpYWxzIGFyZSB3aGF0IHlvdSBoYXZlIHRvIHByb3ZlIHlvdSBoYXZlIGluIG9yZGVyIHRvCisgKiBhdXRoZW50aWNhdGUuICBUaGUgbWFpbiBjcmVkZW50aWFscyByaWdodCBub3cgYXJlIGEgdW5peCB1c2VyCisgKiBhY2NvdW50LCBhIFdpbmRvd3MgdXNlciBhY2NvdW50LCBvciBhIFVOSVggcHJvY2VzcyBJRC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ3JlZGVudGlhbHNJbnRlcm5hbHMgQ3JlZGVudGlhbHMgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzQ3JlZGVudGlhbHMgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFByaXZhdGUgZGV0YWlscyBvZiBjcmVkZW50aWFscyBjb2RlLgorICoKKyAqIEB7CisgKi8KKworc3RydWN0IERCdXNDcmVkZW50aWFscyB7CisgIGludCByZWZjb3VudDsKKyAgZGJ1c191aWRfdCB1bml4X3VpZDsKKyAgZGJ1c19waWRfdCB1bml4X3BpZDsKKyAgY2hhciAqd2luZG93c19zaWQ7CisgIHZvaWQgKmFkdF9hdWRpdF9kYXRhOworICBkYnVzX2ludDMyX3QgYWR0X2F1ZGl0X2RhdGFfc2l6ZTsKK307CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNDcmVkZW50aWFscworICogQHsKKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY3JlZGVudGlhbHMgb2JqZWN0LgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgb2JqZWN0IG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19jcmVkZW50aWFsc19uZXcgKHZvaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisKKyAgY3JlZHMgPSBkYnVzX25ldyAoREJ1c0NyZWRlbnRpYWxzLCAxKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBjcmVkcy0+cmVmY291bnQgPSAxOworICBjcmVkcy0+dW5peF91aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgY3JlZHMtPnVuaXhfcGlkID0gREJVU19QSURfVU5TRVQ7CisgIGNyZWRzLT53aW5kb3dzX3NpZCA9IE5VTEw7CisgIGNyZWRzLT5hZHRfYXVkaXRfZGF0YSA9IE5VTEw7CisgIGNyZWRzLT5hZHRfYXVkaXRfZGF0YV9zaXplID0gMDsKKworICByZXR1cm4gY3JlZHM7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCBjcmVkZW50aWFscyAodXNlciBJRCBhbmQgcHJvY2VzcyBJRCkgZnJvbSB0aGUgY3VycmVudCBwcm9jZXNzLgorICogQHJldHVybnMgdGhlIG5ldyBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNDcmVkZW50aWFscyoKK19kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAodm9pZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKworICBjcmVkcyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNyZWRzKSkKKyAgICB7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmV0dXJuIGNyZWRzOworfQorCisvKioKKyAqIEluY3JlbWVudCByZWZjb3VudCBvbiBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICovCit2b2lkCitfZGJ1c19jcmVkZW50aWFsc19yZWYgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMtPnJlZmNvdW50ID4gMCk7CisgIGNyZWRlbnRpYWxzLT5yZWZjb3VudCArPSAxOworfQorCisvKioKKyAqIERlY3JlbWVudCByZWZjb3VudCBvbiBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICovCit2b2lkCitfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgX2RidXNfYXNzZXJ0IChjcmVkZW50aWFscy0+cmVmY291bnQgPiAwKTsKKworICBjcmVkZW50aWFscy0+cmVmY291bnQgLT0gMTsKKyAgaWYgKGNyZWRlbnRpYWxzLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKTsKKyAgICAgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhKTsKKyAgICAgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMpOworICAgIH0KK30KKworLyoqCisgKiBBZGQgYSBVTklYIHByb2Nlc3MgSUQgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gcGlkIHRoZSBwcm9jZXNzIElECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF9waWQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgICAgcGlkKQoreworICBjcmVkZW50aWFscy0+dW5peF9waWQgPSBwaWQ7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZCBhIFVOSVggdXNlciBJRCB0byB0aGUgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB1aWQgdGhlIHVzZXIgSUQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgdWlkKQoreworICBjcmVkZW50aWFscy0+dW5peF91aWQgPSB1aWQ7CisgIHJldHVybiBUUlVFOworCit9CisKKy8qKgorICogQWRkIGEgV2luZG93cyB1c2VyIFNJRCB0byB0aGUgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB3aW5kb3dzX3NpZCB0aGUgdXNlciBTSUQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgY2hhciAqY29weTsKKworICBjb3B5ID0gX2RidXNfc3RyZHVwICh3aW5kb3dzX3NpZCk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKTsKKyAgY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkID0gY29weTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGQgQURUIGF1ZGl0IGRhdGEgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gYXVkaXRfZGF0YSB0aGUgYXVkaXQgZGF0YQorICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCBvZiBhdWRpdCBkYXRhCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfYWR0X2F1ZGl0X2RhdGEgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqYXVkaXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgICBzaXplKQoreworICB2b2lkICpjb3B5OworICBjb3B5ID0gX2RidXNfbWVtZHVwIChhdWRpdF9kYXRhLCBzaXplKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZGJ1c19mcmVlIChjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEpOworICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgPSBjb3B5OworICBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGFfc2l6ZSA9IHNpemU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGNyZWRlbnRpYWwgaXMgcHJlc2VudC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHR5cGUgdGhlIGNyZWRlbnRpYWwgdG8gY2hlY2sgZm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgY3JlZGVudGlhbCBpcyBwcmVzZW50CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxUeXBlICB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRDoKKyAgICAgIHJldHVybiBjcmVkZW50aWFscy0+dW5peF9waWQgIT0gREJVU19QSURfVU5TRVQ7CisgICAgY2FzZSBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEOgorICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzLT51bml4X3VpZCAhPSBEQlVTX1VJRF9VTlNFVDsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRDoKKyAgICAgIHJldHVybiBjcmVkZW50aWFscy0+d2luZG93c19zaWQgIT0gTlVMTDsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRDoKKyAgICAgIHJldHVybiBjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgIT0gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVW5rbm93biBjcmVkZW50aWFsIGVudW0gdmFsdWUiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdldHMgdGhlIFVOSVggcHJvY2VzcyBJRCBpbiB0aGUgY3JlZGVudGlhbHMsIG9yICNEQlVTX1BJRF9VTlNFVCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gYSBwcm9jZXNzIElELgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBVTklYIHByb2Nlc3MgSUQKKyAqLworZGJ1c19waWRfdAorX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfcGlkIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPnVuaXhfcGlkOworfQorCisvKioKKyAqIEdldHMgdGhlIFVOSVggdXNlciBJRCBpbiB0aGUgY3JlZGVudGlhbHMsIG9yICNEQlVTX1VJRF9VTlNFVCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gYSB1c2VyIElELgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBVTklYIHVzZXIgSUQKKyAqLworZGJ1c191aWRfdAorX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPnVuaXhfdWlkOworfQorCisvKioKKyAqIEdldHMgdGhlIFdpbmRvd3MgdXNlciBTSUQgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAjTlVMTCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gYSBXaW5kb3dzIHVzZXIgU0lELgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBXaW5kb3dzIHVzZXIgU0lECisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBjcmVkZW50aWFscy0+d2luZG93c19zaWQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgQURUIGF1ZGl0IGRhdGEgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAjTlVMTCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gQURUIGF1ZGl0IGRhdGEuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zIFNvbGFyaXMgQURUIGF1ZGl0IGRhdGEgCisgKi8KK3ZvaWQgKgorX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhOworfQorCisvKioKKyAqIEdldHMgdGhlIEFEVCBhdWRpdCBkYXRhIHNpemUgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAwIGlmCisgKiB0aGUgY3JlZGVudGlhbHMgb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBBRFQgYXVkaXQgZGF0YS4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgU29sYXJpcyBBRFQgYXVkaXQgZGF0YSBzaXplCisgKi8KK2RidXNfaW50MzJfdCAKK19kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YV9zaXplIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpcnN0IGNyZWRlbnRpYWxzIG9iamVjdCBjb250YWlucworICogYWxsIHRoZSBjcmVkZW50aWFscyBmb3VuZCBpbiB0aGUgc2Vjb25kIGNyZWRlbnRpYWxzIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHBvc3NpYmxlX3N1YnNldCBzZWUgaWYgY3JlZGVudGlhbHMgaW4gaGVyZSBhcmUgYWxzbyBpbiB0aGUgZmlyc3QgYXJnCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzZWNvbmQgYXJnIGlzIGNvbnRhaW5lZCBpbiBmaXJzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKnBvc3NpYmxlX3N1YnNldCkKK3sKKyAgcmV0dXJuCisgICAgKHBvc3NpYmxlX3N1YnNldC0+dW5peF9waWQgPT0gREJVU19QSURfVU5TRVQgfHwKKyAgICAgcG9zc2libGVfc3Vic2V0LT51bml4X3BpZCA9PSBjcmVkZW50aWFscy0+dW5peF9waWQpICYmCisgICAgKHBvc3NpYmxlX3N1YnNldC0+dW5peF91aWQgPT0gREJVU19VSURfVU5TRVQgfHwKKyAgICAgcG9zc2libGVfc3Vic2V0LT51bml4X3VpZCA9PSBjcmVkZW50aWFscy0+dW5peF91aWQpICYmCisgICAgKHBvc3NpYmxlX3N1YnNldC0+d2luZG93c19zaWQgPT0gTlVMTCB8fAorICAgICAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICYmIHN0cmNtcCAocG9zc2libGVfc3Vic2V0LT53aW5kb3dzX3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkgPT0gMCkpICYmCisgICAgKHBvc3NpYmxlX3N1YnNldC0+YWR0X2F1ZGl0X2RhdGEgPT0gTlVMTCB8fAorICAgICAoY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhICYmIG1lbWNtcCAocG9zc2libGVfc3Vic2V0LT5hZHRfYXVkaXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YV9zaXplKSA9PSAwKSk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBjcmVkZW50aWFscyBvYmplY3QgY29udGFpbnMgYW55dGhpbmcuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBhcmUgbm8gY3JlZGVudGlhbHMgaW4gdGhlIG9iamVjdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYXJlX2VtcHR5IChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4KKyAgICBjcmVkZW50aWFscy0+dW5peF9waWQgPT0gREJVU19QSURfVU5TRVQgJiYKKyAgICBjcmVkZW50aWFscy0+dW5peF91aWQgPT0gREJVU19VSURfVU5TRVQgJiYKKyAgICBjcmVkZW50aWFscy0+d2luZG93c19zaWQgPT0gTlVMTCAmJgorICAgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSA9PSBOVUxMOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgY3JlZGVudGlhbHMgb2JqZWN0IGNvbnRhaW5zIGEgdXNlciBpZGVudGl0eS4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGFyZSBubyB1c2VyIGlkZW50aXRpZXMgaW4gdGhlIG9iamVjdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuCisgICAgY3JlZGVudGlhbHMtPnVuaXhfdWlkID09IERCVVNfVUlEX1VOU0VUICYmCisgICAgY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkID09IE5VTEw7Cit9CisKKy8qKgorICogTWVyZ2UgYWxsIGNyZWRlbnRpYWxzIGZvdW5kIGluIHRoZSBzZWNvbmQgb2JqZWN0IGludG8gdGhlIGZpcnN0IG9iamVjdCwKKyAqIG92ZXJ3cml0aW5nIHRoZSBmaXJzdCBvYmplY3QgaWYgdGhlcmUgYXJlIGFueSBvdmVybGFwcy4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSBvdGhlcl9jcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBtZXJnZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWxzIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKQoreworICByZXR1cm4KKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzKSAmJgorICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMpICYmCisgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfQURUX0FVRElUX0RBVEFfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzKSAmJgorICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscyk7Cit9CisKKy8qKgorICogTWVyZ2UgdGhlIGdpdmVuIGNyZWRlbnRpYWwgZm91bmQgaW4gdGhlIHNlY29uZCBvYmplY3QgaW50byB0aGUgZmlyc3Qgb2JqZWN0LAorICogb3ZlcndyaXRpbmcgdGhlIGZpcnN0IG9iamVjdCdzIHZhbHVlIGZvciB0aGF0IGNyZWRlbnRpYWwuCisgKgorICogRG9lcyBub3RoaW5nIGlmIHRoZSBzZWNvbmQgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBjcmVkZW50aWFsLgorICogaS5lLiwgd2lsbCBuZXZlciBkZWxldGUgYSBjcmVkZW50aWFsIGZyb20gdGhlIGZpcnN0IG9iamVjdC4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB3aGljaCB0aGUgY3JlZGVudGlhbCB0byBvdmVyd3JpdGUKKyAqIEBwYXJhbSBvdGhlcl9jcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBtZXJnZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxUeXBlICB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKQoreworICBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCAmJgorICAgICAgb3RoZXJfY3JlZGVudGlhbHMtPnVuaXhfcGlkICE9IERCVVNfUElEX1VOU0VUKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfcGlkIChjcmVkZW50aWFscywgb3RoZXJfY3JlZGVudGlhbHMtPnVuaXhfcGlkKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCAmJgorICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscy0+dW5peF91aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCBvdGhlcl9jcmVkZW50aWFscy0+dW5peF91aWQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmICh3aGljaCA9PSBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQgJiYKKyAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLCBvdGhlcl9jcmVkZW50aWFscy0+d2luZG93c19zaWQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAKKyAgZWxzZSBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lEICYmCisgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSAhPSBOVUxMKSAKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9hZHRfYXVkaXRfZGF0YSAoY3JlZGVudGlhbHMsIG90aGVyX2NyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSwgb3RoZXJfY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENsZWFyIGFsbCBjcmVkZW50aWFscyBpbiB0aGUgb2JqZWN0LgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICovCit2b2lkCitfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgY3JlZGVudGlhbHMtPnVuaXhfcGlkID0gREJVU19QSURfVU5TRVQ7CisgIGNyZWRlbnRpYWxzLT51bml4X3VpZCA9IERCVVNfVUlEX1VOU0VUOworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCk7CisgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCA9IE5VTEw7CisgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhKTsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhID0gTlVMTDsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemUgPSAwOworfQorCisvKioKKyAqIENvcHkgYSBjcmVkZW50aWFscyBvYmplY3QuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgY29weSBvciAjTlVMTAorICovCitEQnVzQ3JlZGVudGlhbHMqCitfZGJ1c19jcmVkZW50aWFsc19jb3B5IChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmNvcHk7CisKKyAgY29weSA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoY29weSwgY3JlZGVudGlhbHMpKQorICAgIHsKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjb3B5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIHRoZSB1c2VyLWlkZW50aWZ5aW5nIGNyZWRlbnRpYWxzIGluIHR3byBjcmVkZW50aWFscworICogb2JqZWN0cyBhcmUgaWRlbnRpY2FsLiBDcmVkZW50aWFscyB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byB0aGUKKyAqIHVzZXIgYXJlIGlnbm9yZWQsIGJ1dCBhbnkga2luZCBvZiB1c2VyIElEIGNyZWRlbnRpYWxzIG11c3QgYmUgdGhlCisgKiBzYW1lIChVTklYIHVzZXIgSUQsIFdpbmRvd3MgdXNlciBTSUQsIGV0Yy4pIGFuZCBwcmVzZW50IGluIGJvdGgKKyAqIG9iamVjdHMgZm9yIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gI1RSVUUuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gb3RoZXJfY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gY29tcGFyZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHR3byBjcmVkZW50aWFscyByZWZlciB0byB0aGUgc2FtZSB1c2VyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpCit7CisgIC8qIGJvdGggd2luZG93cyBhbmQgdW5peCB1c2VyIG11c3QgYmUgdGhlIHNhbWUgKHRob3VnaCBwcmV0dHkgbXVjaAorICAgKiBpbiBhbGwgY29uY2VpdmFibGUgY2FzZXMsIG9uZSB3aWxsIGJlIHVuc2V0KQorICAgKi8KKyAgcmV0dXJuIGNyZWRlbnRpYWxzLT51bml4X3VpZCA9PSBvdGhlcl9jcmVkZW50aWFscy0+dW5peF91aWQgJiYKKyAgICAoKCEoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkIHx8IG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkpIHx8CisgICAgIChjcmVkZW50aWFscy0+d2luZG93c19zaWQgJiYgb3RoZXJfY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICYmCisgICAgICBzdHJjbXAgKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCwgb3RoZXJfY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKSA9PSAwKSk7Cit9CisKKy8qKgorICogQ29udmVydCB0aGUgY3JlZGVudGlhbHMgaW4gdGhpcyBvYmplY3QgdG8gYSBodW1hbi1yZWFkYWJsZQorICogc3RyaW5nIGZvcm1hdCwgYW5kIGFwcGVuZCB0byB0aGUgZ2l2ZW4gc3RyaW5nLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gc3RyaW5nIGFwcGVuZCB0byB0aGlzIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfdG9fc3RyaW5nX2FwcGVuZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAqc3RyaW5nKQoreworICBkYnVzX2Jvb2xfdCBqb2luOworCisgIGpvaW4gPSBGQUxTRTsKKyAgaWYgKGNyZWRlbnRpYWxzLT51bml4X3VpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHJpbmcsICJ1aWQ9IiBEQlVTX1VJRF9GT1JNQVQsIGNyZWRlbnRpYWxzLT51bml4X3VpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgam9pbiA9IFRSVUU7CisgICAgfQorICBpZiAoY3JlZGVudGlhbHMtPnVuaXhfcGlkICE9IERCVVNfUElEX1VOU0VUKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHN0cmluZywgIiVzcGlkPSIgREJVU19QSURfRk9STUFULCBqb2luID8gIiAiIDogIiIsIGNyZWRlbnRpYWxzLT51bml4X3BpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgam9pbiA9IFRSVUU7CisgICAgfQorICBlbHNlCisgICAgam9pbiA9IEZBTFNFOworICBpZiAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyaW5nLCAiJXNzaWQ9JXMiLCBqb2luID8gIiAiIDogIiIsIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgam9pbiA9IFRSVUU7CisgICAgfQorICBlbHNlCisgICAgam9pbiA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworb29tOgorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLWNyZWRlbnRpYWxzLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtY3JlZGVudGlhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjYxMjRmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmgKQEAgLTAsMCArMSw3OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNyZWRlbnRpYWxzLmggQ3JlZGVudGlhbHMgcHJvdmFibGUgdGhyb3VnaCBhdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19DUkVERU5USUFMU19ICisjZGVmaW5lIERCVVNfQ1JFREVOVElBTFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0geworICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lELAorICBEQlVTX0NSRURFTlRJQUxfQURUX0FVRElUX0RBVEFfSUQsCisgIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRAorfSBEQnVzQ3JlZGVudGlhbFR5cGU7CisKK0RCdXNDcmVkZW50aWFscyogX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICh2b2lkKTsKK0RCdXNDcmVkZW50aWFscyogX2RidXNfY3JlZGVudGlhbHNfbmV3ICAgICAgICAgICAgICAgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfcmVmICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfcGlkICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgICAgcGlkKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgdWlkKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX3dpbmRvd3Nfc2lkICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqd2luZG93c19zaWQpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfYWR0X2F1ZGl0X2RhdGEgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICphdWRpdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgc2l6ZSk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgICAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbFR5cGUgIHR5cGUpOworZGJ1c19waWRfdCAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF9waWQgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworZGJ1c191aWRfdCAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworY29uc3QgY2hhciogICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOwordm9pZCAqICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfYWR0X2F1ZGl0X2RhdGEgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworZGJ1c19pbnQzMl90ICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfYWR0X2F1ZGl0X2RhdGFfc2l6ZSAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpwb3NzaWJsZV9zdWJzZXQpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpvdGhlcl9jcmVkZW50aWFscyk7CisvKiBtdXN0IHNpbGVudGx5IGFsbG93ICd3aGljaCcgdG8gbm90IGV4aXN0ICovCitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbFR5cGUgIHdoaWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpOwordm9pZCAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19jbGVhciAgICAgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworREJ1c0NyZWRlbnRpYWxzKiBfZGJ1c19jcmVkZW50aWFsc19jb3B5ICAgICAgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgICAgICAgICAgICAgICAgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpvdGhlcl9jcmVkZW50aWFscyk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3RvX3N0cmluZ19hcHBlbmQgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgKnN0cmluZyk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0NSRURFTlRJQUxTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1kYXRhc2xvdC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWRhdGFzbG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyNWM0MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1kYXRhc2xvdC5jCkBAIC0wLDAgKzEsNDc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZGF0YXNsb3QuYyAgc3RvcmluZyBkYXRhIG9uIG9iamVjdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1kYXRhc2xvdC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy1pbnRlcm5hbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzRGF0YVNsb3QgRGF0YSBzbG90cworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBTdG9yaW5nIGRhdGEgYnkgSUQKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gc3RvcmluZyBkYXRhIGJ5IGFuCisgKiBhbGxvY2F0ZWQgSUQuIFRoaXMgaXMgdXNlZCBmb3IgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCksCisgKiBkYnVzX3NlcnZlcl9zZXRfZGF0YSgpLCBldGMuIAorICogQHsKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIGEgZGF0YSBzbG90IGFsbG9jYXRvciBvYmplY3QsIHVzZWQgdG8gYXNzaWduCisgKiBpbnRlZ2VyIElEcyBmb3IgZGF0YSBzbG90cy4KKyAqCisgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBhbGxvY2F0b3IgdG8gaW5pdGlhbGl6ZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9pbml0IChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgKmFsbG9jYXRvcikKK3sKKyAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMgPSBOVUxMOworICBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzID0gMDsKKyAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgPSAwOworICBhbGxvY2F0b3ItPmxvY2tfbG9jID0gTlVMTDsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgZGF0YQorICogaW4gYSAjREJ1c0RhdGFTbG90TGlzdC4gSWYgdGhlIHZhbHVlIGF0ICpzbG90X2lkX3AgaXMKKyAqIG5vdCAtMSwgdGhpcyBmdW5jdGlvbiBqdXN0IGluY3JlbWVudHMgdGhlIHJlZmNvdW50IGZvcgorICogdGhlIGV4aXN0aW5nIHNsb3QgSUQuIElmIHRoZSB2YWx1ZSBpcyAtMSwgYSBuZXcgc2xvdCBJRAorICogaXMgYWxsb2NhdGVkIGFuZCBzdG9yZWQgYXQgKnNsb3RfaWRfcC4KKyAqIAorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yCisgKiBAcGFyYW0gbXV0ZXhfbG9jIHRoZSBsb2NhdGlvbiBsb2NrIGZvciB0aGlzIGFsbG9jYXRvcgorICogQHBhcmFtIHNsb3RfaWRfcCBhZGRyZXNzIHRvIGZpbGwgd2l0aCB0aGUgc2xvdCBJRAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAgICAgICAgICAgKiptdXRleF9sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgICAgKnNsb3RfaWRfcCkKK3sKKyAgZGJ1c19pbnQzMl90IHNsb3Q7CisKKyAgX2RidXNfbXV0ZXhfbG9jayAoKm11dGV4X2xvYyk7CisKKyAgaWYgKGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+bG9ja19sb2MgPT0gTlVMTCk7CisgICAgICBhbGxvY2F0b3ItPmxvY2tfbG9jID0gbXV0ZXhfbG9jOworICAgIH0KKyAgZWxzZSBpZiAoYWxsb2NhdG9yLT5sb2NrX2xvYyAhPSBtdXRleF9sb2MpCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJELUJ1cyB0aHJlYWRzIHdlcmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgZmlyc3QgdXNpbmcgdGhlIEQtQnVzIGxpYnJhcnkuIElmIHlvdXIgYXBwbGljYXRpb24gZG9lcyBub3QgZGlyZWN0bHkgaW5pdGlhbGl6ZSB0aHJlYWRzIG9yIHVzZSBELUJ1cywga2VlcCBpbiBtaW5kIHRoYXQgc29tZSBsaWJyYXJ5IG9yIHBsdWdpbiBtYXkgaGF2ZSB1c2VkIEQtQnVzIG9yIGluaXRpYWxpemVkIHRocmVhZHMgYmVoaW5kIHlvdXIgYmFjay4gWW91IGNhbiBvZnRlbiBmaXggdGhpcyBwcm9ibGVtIGJ5IGNhbGxpbmcgZGJ1c19pbml0X3RocmVhZHMoKSBvciBkYnVzX2dfdGhyZWFkc19pbml0KCkgZWFybHkgaW4geW91ciBtYWluKCkgbWV0aG9kLCBiZWZvcmUgRC1CdXMgaXMgdXNlZC5cbiIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZXhpdGluZyIpOworICAgIH0KKworICBpZiAoKnNsb3RfaWRfcCA+PSAwKQorICAgIHsKKyAgICAgIHNsb3QgPSAqc2xvdF9pZF9wOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHNsb3QgPCBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9PSBzbG90KTsKKyAgICAgIAorICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgKz0gMTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoKnNsb3RfaWRfcCA8IDApOworICAKKyAgaWYgKGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzIDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cykKKyAgICB7CisgICAgICBzbG90ID0gMDsKKyAgICAgIHdoaWxlIChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cykKKyAgICAgICAgeworICAgICAgICAgIGlmIChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9IHNsb3Q7CisgICAgICAgICAgICAgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnJlZmNvdW50ID0gMTsKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgKz0gMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgKytzbG90OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNBbGxvY2F0ZWRTbG90ICp0bXA7CisgICAgICAKKyAgICAgIHNsb3QgPSAtMTsKKyAgICAgIHRtcCA9IGRidXNfcmVhbGxvYyAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoREJ1c0FsbG9jYXRlZFNsb3QpICogKGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMgKyAxKSk7CisgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90cyA9IHRtcDsKKyAgICAgIHNsb3QgPSBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzOworICAgICAgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyArPSAxOworICAgICAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgKz0gMTsKKyAgICAgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPSBzbG90OworICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgPSAxOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHNsb3QgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKCpzbG90X2lkX3AgPCAwKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkID09IHNsb3QpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnJlZmNvdW50ID09IDEpOworICAKKyAgKnNsb3RfaWRfcCA9IHNsb3Q7CisgIAorICBfZGJ1c192ZXJib3NlICgiQWxsb2NhdGVkIHNsb3QgJWQgb24gYWxsb2NhdG9yICVwIHRvdGFsICVkIHNsb3RzIGFsbG9jYXRlZCAlZCB1c2VkXG4iLAorICAgICAgICAgICAgICAgICBzbG90LCBhbGxvY2F0b3IsIGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMsIGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzKTsKKyAgCisgb3V0OgorICBfZGJ1c19tdXRleF91bmxvY2sgKCooYWxsb2NhdG9yLT5sb2NrX2xvYykpOworICByZXR1cm4gc2xvdCA+PSAwOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGFuIElEIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGgKKyAqIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MoKS4gIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uCisgKiBleGlzdGluZyAjREJ1c0RhdGFTbG90TGlzdCBvYmplY3RzIHdpdGggdGhpcyBJRCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlCisgKiBkYXRhIGxpc3QgaXMgZmluYWxpemVkLCBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZQorICogcmVwbGFjZWQgaWYgc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4KKyAqIFRoZSBzbG90IHZhbHVlIGlzIHJlc2V0IHRvIC0xIGlmIHRoaXMgaXMgdGhlIGxhc3QgdW5yZWYuCisgKgorICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYWxsb2NhdG9yCisgKiBAcGFyYW0gc2xvdF9pZF9wIGFkZHJlc3Mgd2hlcmUgd2Ugc3RvcmUgdGhlIHNsb3QKKyAqLwordm9pZAorX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgICAgICpzbG90X2lkX3ApCit7CisgIF9kYnVzX211dGV4X2xvY2sgKCooYWxsb2NhdG9yLT5sb2NrX2xvYykpOworICAKKyAgX2RidXNfYXNzZXJ0ICgqc2xvdF9pZF9wIDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbKnNsb3RfaWRfcF0uc2xvdF9pZCA9PSAqc2xvdF9pZF9wKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1sqc2xvdF9pZF9wXS5yZWZjb3VudCA+IDApOworCisgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnJlZmNvdW50ID4gMCkKKyAgICB7CisgICAgICBfZGJ1c19tdXRleF91bmxvY2sgKCooYWxsb2NhdG9yLT5sb2NrX2xvYykpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiByZWZjb3VudCBpcyAwLCBmcmVlIHRoZSBzbG90ICovCisgIF9kYnVzX3ZlcmJvc2UgKCJGcmVlaW5nIHNsb3QgJWQgb24gYWxsb2NhdG9yICVwIHRvdGFsICVkIGFsbG9jYXRlZCAlZCB1c2VkXG4iLAorICAgICAgICAgICAgICAgICAqc2xvdF9pZF9wLCBhbGxvY2F0b3IsIGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMsIGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzKTsKKyAgCisgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnNsb3RfaWQgPSAtMTsKKyAgKnNsb3RfaWRfcCA9IC0xOworICAKKyAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgLT0gMTsKKyAgCisgIGlmIChhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyA9PSAwKQorICAgIHsKKyAgICAgIERCdXNNdXRleCAqKm11dGV4X2xvYyA9IGFsbG9jYXRvci0+bG9ja19sb2M7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMpOworICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMgPSBOVUxMOworICAgICAgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyA9IDA7CisgICAgICBhbGxvY2F0b3ItPmxvY2tfbG9jID0gTlVMTDsKKworICAgICAgX2RidXNfbXV0ZXhfdW5sb2NrICgqbXV0ZXhfbG9jKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19tdXRleF91bmxvY2sgKCooYWxsb2NhdG9yLT5sb2NrX2xvYykpOworICAgIH0KK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIHNsb3QgbGlzdC4KKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIGluaXRpYWxpemUuCisgKi8KK3ZvaWQKK19kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKERCdXNEYXRhU2xvdExpc3QgKmxpc3QpCit7CisgIGxpc3QtPnNsb3RzID0gTlVMTDsKKyAgbGlzdC0+bl9zbG90cyA9IDA7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBpbiB0aGUgZGF0YSBzbG90IGxpc3QsIGFsb25nIHdpdGggYW4gb3B0aW9uYWwKKyAqIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcgdGhlIGRhdGEgd2hlbiB0aGUgZGF0YSBpcyBzZXQKKyAqIGFnYWluLCBvciB3aGVuIHRoZSBzbG90IGxpc3QgaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIgbXVzdAorICogaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MoKSBmb3IgdGhlCisgKiBzYW1lIGFsbG9jYXRvciBwYXNzZWQgaW4gaGVyZS4gVGhlIHNhbWUgYWxsb2NhdG9yIGhhcyB0byBiZSB1c2VkCisgKiB3aXRoIHRoZSBzbG90IGxpc3QgZXZlcnkgdGltZS4KKyAqCisgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBhbGxvY2F0b3IgdG8gdXNlCisgKiBAcGFyYW0gbGlzdCB0aGUgZGF0YSBzbG90IGxpc3QKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcGFyYW0gb2xkX2ZyZWVfZnVuYyBmcmVlIGZ1bmN0aW9uIGZvciBhbnkgcHJldmlvdXNseS1leGlzdGluZyBkYXRhCisgKiBAcGFyYW0gb2xkX2RhdGEgcHJldmlvdXNseS1leGlzdGluZyBkYXRhLCBzaG91bGQgYmUgZnJlZWQgd2l0aCBvbGRfZnJlZV9mdW5jCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGF0YVNsb3RMaXN0ICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICpvbGRfZnJlZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSkKK3sKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICAvKiBXZSBuZWVkIHRvIHRha2UgdGhlIGFsbG9jYXRvciBsb2NrIGhlcmUsIGJlY2F1c2UgdGhlIGFsbG9jYXRvciBjb3VsZAorICAgKiBiZSBlLmcuIHJlYWxsb2MoKWluZyBhbGxvY2F0ZWRfc2xvdHMuIFdlIGF2b2lkIGRvaW5nIHRoaXMgaWYgYXNzZXJ0cworICAgKiBhcmUgZGlzYWJsZWQsIHNpbmNlIHRoZW4gdGhlIGFzc2VydHMgYXJlIGVtcHR5LgorICAgKi8KKyAgX2RidXNfbXV0ZXhfbG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPT0gc2xvdCk7CisgIF9kYnVzX211dGV4X3VubG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisjZW5kaWYKKyAgCisgIGlmIChzbG90ID49IGxpc3QtPm5fc2xvdHMpCisgICAgeworICAgICAgREJ1c0RhdGFTbG90ICp0bXA7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgdG1wID0gZGJ1c19yZWFsbG9jIChsaXN0LT5zbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChEQnVzRGF0YVNsb3QpICogKHNsb3QgKyAxKSk7CisgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbGlzdC0+c2xvdHMgPSB0bXA7CisgICAgICBpID0gbGlzdC0+bl9zbG90czsKKyAgICAgIGxpc3QtPm5fc2xvdHMgPSBzbG90ICsgMTsKKyAgICAgIHdoaWxlIChpIDwgbGlzdC0+bl9zbG90cykKKyAgICAgICAgeworICAgICAgICAgIGxpc3QtPnNsb3RzW2ldLmRhdGEgPSBOVUxMOworICAgICAgICAgIGxpc3QtPnNsb3RzW2ldLmZyZWVfZGF0YV9mdW5jID0gTlVMTDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChzbG90IDwgbGlzdC0+bl9zbG90cyk7CisKKyAgKm9sZF9kYXRhID0gbGlzdC0+c2xvdHNbc2xvdF0uZGF0YTsKKyAgKm9sZF9mcmVlX2Z1bmMgPSBsaXN0LT5zbG90c1tzbG90XS5mcmVlX2RhdGFfZnVuYzsKKworICBsaXN0LT5zbG90c1tzbG90XS5kYXRhID0gZGF0YTsKKyAgbGlzdC0+c2xvdHNbc2xvdF0uZnJlZV9kYXRhX2Z1bmMgPSBmcmVlX2RhdGFfZnVuYzsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IHN0aWxsIGJlIGFsbG9jYXRlZCAobXVzdCBub3QgaGF2ZSBiZWVuIGZyZWVkKS4KKyAqCisgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBhbGxvY2F0b3Igc2xvdCB3YXMgYWxsb2NhdGVkIGZyb20KKyAqIEBwYXJhbSBsaXN0IHRoZSBkYXRhIHNsb3QgbGlzdAorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGF0YVNsb3RMaXN0ICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNsb3QpCit7CisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgLyogV2UgbmVlZCB0byB0YWtlIHRoZSBhbGxvY2F0b3IgbG9jayBoZXJlLCBiZWNhdXNlIHRoZSBhbGxvY2F0b3IgY291bGQKKyAgICogYmUgZS5nLiByZWFsbG9jKClpbmcgYWxsb2NhdGVkX3Nsb3RzLiBXZSBhdm9pZCBkb2luZyB0aGlzIGlmIGFzc2VydHMKKyAgICogYXJlIGRpc2FibGVkLCBzaW5jZSB0aGVuIHRoZSBhc3NlcnRzIGFyZSBlbXB0eS4KKyAgICovCisgIF9kYnVzX211dGV4X2xvY2sgKCooYWxsb2NhdG9yLT5sb2NrX2xvYykpOworICBfZGJ1c19hc3NlcnQgKHNsb3QgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPT0gc2xvdCk7CisgIF9kYnVzX211dGV4X3VubG9jayAoKihhbGxvY2F0b3ItPmxvY2tfbG9jKSk7CisjZW5kaWYKKworICBpZiAoc2xvdCA+PSBsaXN0LT5uX3Nsb3RzKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuIGxpc3QtPnNsb3RzW3Nsb3RdLmRhdGE7Cit9CisKKy8qKgorICogRnJlZXMgYWxsIGRhdGEgc2xvdHMgY29udGFpbmVkIGluIHRoZSBsaXN0LCBjYWxsaW5nCisgKiBhcHBsaWNhdGlvbi1wcm92aWRlZCBmcmVlIGZ1bmN0aW9ucyBpZiB0aGV5IGV4aXN0LgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIGNsZWFyCisgKi8KK3ZvaWQKK19kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyIChEQnVzRGF0YVNsb3RMaXN0ICpsaXN0KQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsaXN0LT5uX3Nsb3RzKQorICAgIHsKKyAgICAgIGlmIChsaXN0LT5zbG90c1tpXS5mcmVlX2RhdGFfZnVuYykKKyAgICAgICAgKCogbGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMpIChsaXN0LT5zbG90c1tpXS5kYXRhKTsKKyAgICAgIGxpc3QtPnNsb3RzW2ldLmRhdGEgPSBOVUxMOworICAgICAgbGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMgPSBOVUxMOworICAgICAgKytpOworICAgIH0KK30KKworLyoqCisgKiBGcmVlcyB0aGUgZGF0YSBzbG90IGxpc3QgYW5kIGFsbCBkYXRhIHNsb3RzIGNvbnRhaW5lZAorICogaW4gaXQsIGNhbGxpbmcgYXBwbGljYXRpb24tcHJvdmlkZWQgZnJlZSBmdW5jdGlvbnMKKyAqIGlmIHRoZXkgZXhpc3QuCisgKgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gZnJlZQorICovCit2b2lkCitfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlIChEQnVzRGF0YVNsb3RMaXN0ICpsaXN0KQoreworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9jbGVhciAobGlzdCk7CisgIAorICBkYnVzX2ZyZWUgKGxpc3QtPnNsb3RzKTsKKyAgbGlzdC0+c2xvdHMgPSBOVUxMOworICBsaXN0LT5uX3Nsb3RzID0gMDsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBmcmVlX2NvdW50ZXI7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIGludCBpID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGRhdGEpOworCisgIF9kYnVzX2Fzc2VydCAoZnJlZV9jb3VudGVyID09IGkpOworICArK2ZyZWVfY291bnRlcjsKK30KKworLyoqCisgKiBUZXN0IGZ1bmN0aW9uIGZvciBkYXRhIHNsb3RzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kYXRhX3Nsb3RfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0RhdGFTbG90QWxsb2NhdG9yIGFsbG9jYXRvcjsKKyAgREJ1c0RhdGFTbG90TGlzdCBsaXN0OworICBpbnQgaTsKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jOworICB2b2lkICpvbGRfZGF0YTsKKyAgREJ1c011dGV4ICptdXRleDsKKyAgCisgIGlmICghX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9pbml0ICgmYWxsb2NhdG9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIGFsbG9jYXRvciIpOworCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKCZsaXN0KTsKKworICBfZGJ1c19tdXRleF9uZXdfYXRfbG9jYXRpb24gKCZtdXRleCk7CisgIGlmIChtdXRleCA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhbGxvYyBtdXRleCIpOworICAKKyNkZWZpbmUgTl9TTE9UUyAxMDAKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBOX1NMT1RTKQorICAgIHsKKyAgICAgIC8qIHdlIGRvbid0IHJlYWxseSB3YW50IGFwcHMgdG8gcmVseSBvbiB0aGlzIG9yZGVyZWQKKyAgICAgICAqIGFsbG9jYXRpb24sIGJ1dCBpdCBzaW1wbGlmaWVzIHRoaW5ncyB0byByZWx5IG9uIGl0CisgICAgICAgKiBoZXJlLgorICAgICAgICovCisgICAgICBkYnVzX2ludDMyX3QgdG1wID0gLTE7CisgICAgICAKKyAgICAgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MgKCZhbGxvY2F0b3IsICZtdXRleCwgJnRtcCk7CisKKyAgICAgIGlmICh0bXAgIT0gaSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkIG5vdCBhbGxvY2F0ZSBzbG90cyBpbiBudW1lcmljIG9yZGVyXG4iKTsKKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBOX1NMT1RTKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmYWxsb2NhdG9yLCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9mcmVlX3Nsb3RfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgdG8gc2V0IGRhdGEiKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfZnJlZV9mdW5jID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfZGF0YSA9PSBOVUxMKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgKCZhbGxvY2F0b3IsICZsaXN0LCBpKSA9PQorICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGZyZWVfY291bnRlciA9IDA7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZhbGxvY2F0b3IsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBzZXQgZGF0YSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9mcmVlX2Z1bmMgPT0gdGVzdF9mcmVlX3Nsb3RfZGF0YV9mdW5jKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKG9sZF9kYXRhKSA9PSBpKTsKKworICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaSA9PSAoZnJlZV9jb3VudGVyIC0gMSkpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJmFsbG9jYXRvciwgJmxpc3QsIGkpID09CisgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgZnJlZV9jb3VudGVyID0gMDsKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJmxpc3QpOworCisgIF9kYnVzX2Fzc2VydCAoTl9TTE9UUyA9PSBmcmVlX2NvdW50ZXIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgZGJ1c19pbnQzMl90IHRtcCA9IGk7CisgICAgICAKKyAgICAgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJmFsbG9jYXRvciwgJnRtcCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRtcCA9PSAtMSk7CisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZtdXRleCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1kYXRhc2xvdC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWRhdGFzbG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3MDZmNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1kYXRhc2xvdC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1kYXRhc2xvdC5oICBzdG9yaW5nIGRhdGEgb24gb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfREFUQVNMT1RfSAorI2RlZmluZSBEQlVTX0RBVEFTTE9UX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzRGF0YVNsb3RBbGxvY2F0b3IgREJ1c0RhdGFTbG90QWxsb2NhdG9yOwordHlwZWRlZiBzdHJ1Y3QgREJ1c0RhdGFTbG90TGlzdCBEQnVzRGF0YVNsb3RMaXN0OworCisvKiogT3BhcXVlIHR5cGVkZWYgZm9yIERCdXNEYXRhU2xvdCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0RhdGFTbG90IERCdXNEYXRhU2xvdDsKKy8qKiBEQnVzRGF0YVNsb3QgaXMgdXNlZCB0byBzdG9yZSBhcHBsaWNhdGlvbiBkYXRhIG9uIHRoZSBjb25uZWN0aW9uICovCitzdHJ1Y3QgREJ1c0RhdGFTbG90Cit7CisgIHZvaWQgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGFwcGxpY2F0aW9uIGRhdGEgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuYzsgLyoqPCBGcmVlIHRoZSBhcHBsaWNhdGlvbiBkYXRhICovCit9OworCit0eXBlZGVmIHN0cnVjdCBEQnVzQWxsb2NhdGVkU2xvdCBEQnVzQWxsb2NhdGVkU2xvdDsKKworLyoqIEFuIGFsbG9jYXRlZCBzbG90IGZvciBzdG9yaW5nIGRhdGEKKyAqLworc3RydWN0IERCdXNBbGxvY2F0ZWRTbG90Cit7CisgIGRidXNfaW50MzJfdCBzbG90X2lkOyAgLyoqPCBJRCBvZiB0aGlzIHNsb3QgKi8KKyAgaW50ICAgICAgICAgIHJlZmNvdW50OyAvKio8IE51bWJlciBvZiB1c2VzIG9mIHRoZSBzbG90ICovCit9OworCisvKioKKyAqIEFuIGFsbG9jYXRvciB0aGF0IHRyYWNrcyBhIHNldCBvZiBzbG90IElEcy4KKyAqLworc3RydWN0IERCdXNEYXRhU2xvdEFsbG9jYXRvcgoreworICBEQnVzQWxsb2NhdGVkU2xvdCAqYWxsb2NhdGVkX3Nsb3RzOyAvKio8IEFsbG9jYXRlZCBzbG90cyAqLworICBpbnQgIG5fYWxsb2NhdGVkX3Nsb3RzOyAvKio8IG51bWJlciBvZiBzbG90cyBtYWxsb2MnZCAqLworICBpbnQgIG5fdXNlZF9zbG90czsgICAgICAvKio8IG51bWJlciBvZiBzbG90cyB1c2VkICovCisgIERCdXNNdXRleCAqKmxvY2tfbG9jOyAgIC8qKjwgbG9jYXRpb24gb2YgdGhyZWFkIGxvY2sgKi8KK307CisKKy8qKgorICogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgdGhlIGFjdHVhbCB1c2VyIGRhdGEgc2V0IGF0IGEgZ2l2ZW4KKyAqIHNsb3QuCisgKi8KK3N0cnVjdCBEQnVzRGF0YVNsb3RMaXN0Cit7CisgIERCdXNEYXRhU2xvdCAqc2xvdHM7ICAgLyoqPCBEYXRhIHNsb3RzICovCisgIGludCAgICAgICAgICAgbl9zbG90czsgLyoqPCBTbG90cyB3ZSBoYXZlIHN0b3JhZ2UgZm9yIGluIGRhdGFfc2xvdHMgKi8KK307CisKK2RidXNfYm9vbF90IF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfaW5pdCAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAgICAgICAgICAgICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAqc2xvdF9pZF9wKTsKK3ZvaWQgICAgICAgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgKnNsb3RfaWRfcCk7Cit2b2lkICAgICAgICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICAgICAgIChEQnVzRGF0YVNsb3RMaXN0ICAgICAgICpsaXN0KTsKK2RidXNfYm9vbF90IF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAgICAgICAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAqb2xkX2ZyZWVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqKm9sZF9kYXRhKTsKK3ZvaWQqICAgICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAgICAgICAgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzbG90KTsKK3ZvaWQgICAgICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyICAgICAgKERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QpOwordm9pZCAgICAgICAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAgICAgICAoREJ1c0RhdGFTbG90TGlzdCAgICAgICAqbGlzdCk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfREFUQVNMT1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWVycm9ycy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWVycm9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjc1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtZXJyb3JzLmMKQEAgLTAsMCArMSw0MjAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1lcnJvcnMuYyBFcnJvciByZXBvcnRpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1lcnJvcnMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzRXJyb3JJbnRlcm5hbHMgRXJyb3IgcmVwb3J0aW5nIGludGVybmFscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBFcnJvciByZXBvcnRpbmcgaW50ZXJuYWxzCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBEQlVTX0VSUk9SX0lOSVQKKyAqCisgKiBFeHBhbmRzIHRvIGEgc3VpdGFibGUgaW5pdGlhbGl6ZXIgZm9yIGEgREJ1c0Vycm9yIG9uIHRoZSBzdGFjay4KKyAqIERlY2xhcmluZyBhIERCdXNFcnJvciB3aXRoOgorICoKKyAqIEBjb2RlCisgKiBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgKgorICogZG9fdGhpbmdzX3dpdGggKCZlcnJvcik7CisgKiBAZW5kY29kZQorICoKKyAqIGlzIGEgbW9yZSBjb25jaXNlIGZvcm0gb2Y6CisgKgorICogQGNvZGUKKyAqIERCdXNFcnJvciBlcnJvcjsKKyAqCisgKiBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgKiBkb190aGluZ3Nfd2l0aCAoJmVycm9yKTsKKyAqIEBlbmRjb2RlCisgKi8KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c0Vycm9yCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKm5hbWU7IC8qKjwgZXJyb3IgbmFtZSAqLworICBjaGFyICptZXNzYWdlOyAvKio8IGVycm9yIG1lc3NhZ2UgKi8KKworICB1bnNpZ25lZCBpbnQgY29uc3RfbWVzc2FnZSA6IDE7IC8qKjwgTWVzc2FnZSBpcyBub3Qgb3duZWQgYnkgREJ1c0Vycm9yICovCisKKyAgdW5zaWduZWQgaW50IGR1bW15MiA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15MyA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NCA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NSA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKworICB2b2lkICpwYWRkaW5nMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICAKK30gREJ1c1JlYWxFcnJvcjsKKworLyoqCisgKiBSZXR1cm5zIGEgbG9uZ2VyIG1lc3NhZ2UgZGVzY3JpYmluZyBhbiBlcnJvciBuYW1lLgorICogSWYgdGhlIGVycm9yIG5hbWUgaXMgdW5rbm93biwgcmV0dXJucyB0aGUgbmFtZQorICogaXRzZWxmLgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgdG8gZGVzY3JpYmUKKyAqIEByZXR1cm5zIGEgY29uc3RhbnQgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICovCitzdGF0aWMgY29uc3QgY2hhcioKK21lc3NhZ2VfZnJvbV9lcnJvciAoY29uc3QgY2hhciAqZXJyb3IpCit7CisgIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCkgPT0gMCkKKyAgICByZXR1cm4gIlVua25vd24gZXJyb3IiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgPT0gMCkKKyAgICByZXR1cm4gIk5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZSI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IpID09IDApCisgICAgcmV0dXJuICJFcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgZGF0YSI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MpID09IDApCisgICAgcmV0dXJuICJDb3VsZCBub3QgcGFyc2UgYWRkcmVzcyI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCkgPT0gMCkKKyAgICByZXR1cm4gIkZlYXR1cmUgbm90IHN1cHBvcnRlZCI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVEKSA9PSAwKQorICAgIHJldHVybiAiUmVzb3VyY2UgbGltaXRzIGV4Y2VlZGVkIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKSA9PSAwKQorICAgIHJldHVybiAiUGVybWlzc2lvbiBkZW5pZWQiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0FVVEhfRkFJTEVEKSA9PSAwKQorICAgIHJldHVybiAiQ291bGQgbm90IGF1dGhlbnRpY2F0ZSB0byBzZXJ2ZXIiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX05PX1NFUlZFUikgPT0gMCkKKyAgICByZXR1cm4gIk5vIHNlcnZlciBhdmFpbGFibGUgYXQgYWRkcmVzcyI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfVElNRU9VVCkgPT0gMCkKKyAgICByZXR1cm4gIkNvbm5lY3Rpb24gdGltZWQgb3V0IjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9OT19ORVRXT1JLKSA9PSAwKQorICAgIHJldHVybiAiTmV0d29yayB1bmF2YWlsYWJsZSI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0UpID09IDApCisgICAgcmV0dXJuICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9ESVNDT05ORUNURUQpID09IDApCisgICAgcmV0dXJuICJEaXNjb25uZWN0ZWQuIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MpID09IDApCisgICAgcmV0dXJuICJJbnZhbGlkIGFyZ3VtZW50cy4iOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX05PX1JFUExZKSA9PSAwKQorICAgIHJldHVybiAiRGlkIG5vdCBnZXQgYSByZXBseSBtZXNzYWdlLiI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfRklMRV9OT1RfRk9VTkQpID09IDApCisgICAgcmV0dXJuICJGaWxlIGRvZXNuJ3QgZXhpc3QuIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpID09IDApCisgICAgcmV0dXJuICJPYmplY3QgcGF0aCBhbHJlYWR5IGluIHVzZSI7CisgIGVsc2UKKyAgICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNFcnJvcnMgRXJyb3IgcmVwb3J0aW5nCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIEVycm9yIHJlcG9ydGluZworICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byByZXBvcnRpbmcgZXJyb3JzLgorICoKKyAqCisgKiBJbiBlc3NlbmNlIEQtQnVzIGVycm9yIHJlcG9ydGluZyB3b3JrcyBhcyBmb2xsb3dzOgorICoKKyAqIEBjb2RlCisgKiBEQnVzRXJyb3IgZXJyb3I7CisgKiBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgKiBkYnVzX3NvbWVfZnVuY3Rpb24gKGFyZzEsIGFyZzIsICZlcnJvcik7CisgKiBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgKiAgIHsKKyAqICAgICBmcHJpbnRmIChzdGRlcnIsICJhbiBlcnJvciBvY2N1cnJlZDogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICogICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAqICAgfQorICogQGVuZGNvZGUKKyAqCisgKiBCeSBjb252ZW50aW9uLCBhbGwgZnVuY3Rpb25zIGFsbG93ICNOVUxMIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IqLAorICogc28gY2FsbGVycyB3aG8gZG9uJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3IgY2FuIGlnbm9yZSBpdC4KKyAqIAorICogVGhlcmUgYXJlIHNvbWUgcnVsZXMuIEFuIGVycm9yIHBhc3NlZCB0byBhIEQtQnVzIGZ1bmN0aW9uIG11c3QKKyAqIGFsd2F5cyBiZSB1bnNldDsgeW91IGNhbid0IHBhc3MgaW4gYW4gZXJyb3IgdGhhdCdzIGFscmVhZHkgc2V0LiAgSWYKKyAqIGEgZnVuY3Rpb24gaGFzIGEgcmV0dXJuIGNvZGUgaW5kaWNhdGluZyB3aGV0aGVyIGFuIGVycm9yIG9jY3VycmVkLAorICogYW5kIGFsc28gYSAjREJ1c0Vycm9yIHBhcmFtZXRlciwgdGhlbiB0aGUgZXJyb3Igd2lsbCBhbHdheXMgYmUgc2V0CisgKiBpZiBhbmQgb25seSBpZiB0aGUgcmV0dXJuIGNvZGUgaW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkLiBpLmUuCisgKiB0aGUgcmV0dXJuIGNvZGUgYW5kIHRoZSBlcnJvciBhcmUgbmV2ZXIgZ29pbmcgdG8gZGlzYWdyZWUuCisgKgorICogQW4gZXJyb3Igb25seSBuZWVkcyB0byBiZSBmcmVlZCBpZiBpdCdzIGJlZW4gc2V0LCBub3QgaWYKKyAqIGl0J3MgbWVyZWx5IGJlZW4gaW5pdGlhbGl6ZWQuCisgKgorICogWW91IGNhbiBjaGVjayB0aGUgc3BlY2lmaWMgZXJyb3IgdGhhdCBvY2N1cnJlZCB1c2luZworICogZGJ1c19lcnJvcl9oYXNfbmFtZSgpLgorICogCisgKiBFcnJvcnMgd2lsbCBub3QgYmUgc2V0IGZvciBwcm9ncmFtbWluZyBlcnJvcnMsIHN1Y2ggYXMgcGFzc2luZworICogaW52YWxpZCBhcmd1bWVudHMgdG8gdGhlIGxpYmRidXMgQVBJLiBJbnN0ZWFkLCBsaWJkYnVzIHdpbGwgcHJpbnQKKyAqIHdhcm5pbmdzLCBleGl0IG9uIGEgZmFpbGVkIGFzc2VydGlvbiwgb3IgZXZlbiBjcmFzaCBpbiB0aG9zZSBjYXNlcworICogKGluIG90aGVyIHdvcmRzLCBpbmNvcnJlY3QgdXNlIG9mIHRoZSBBUEkgcmVzdWx0cyBpbiB1bmRlZmluZWQKKyAqIGJlaGF2aW9yLCBwb3NzaWJseSBhY2NvbXBhbmllZCBieSBoZWxwZnVsIGRlYnVnZ2luZyBvdXRwdXQgaWYKKyAqIHlvdSdyZSBsdWNreSkuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIERCdXNFcnJvciBzdHJ1Y3R1cmUuIERvZXMgbm90IGFsbG9jYXRlIGFueSBtZW1vcnk7CisgKiB0aGUgZXJyb3Igb25seSBuZWVkcyB0byBiZSBmcmVlZCBpZiBpdCBpcyBzZXQgYXQgc29tZSBwb2ludC4KKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIERCdXNFcnJvci4KKyAqLwordm9pZAorZGJ1c19lcnJvcl9pbml0IChEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzUmVhbEVycm9yICpyZWFsOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChlcnJvciAhPSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoREJ1c0Vycm9yKSA9PSBzaXplb2YgKERCdXNSZWFsRXJyb3IpKTsKKworICByZWFsID0gKERCdXNSZWFsRXJyb3IgKillcnJvcjsKKyAgCisgIHJlYWwtPm5hbWUgPSBOVUxMOyAgCisgIHJlYWwtPm1lc3NhZ2UgPSBOVUxMOworCisgIHJlYWwtPmNvbnN0X21lc3NhZ2UgPSBUUlVFOworfQorCisvKioKKyAqIEZyZWVzIGFuIGVycm9yIHRoYXQncyBiZWVuIHNldCAob3IganVzdCBpbml0aWFsaXplZCksCisgKiB0aGVuIHJlaW5pdGlhbGl6ZXMgdGhlIGVycm9yIGFzIGluIGRidXNfZXJyb3JfaW5pdCgpLgorICoKKyAqIEBwYXJhbSBlcnJvciBtZW1vcnkgd2hlcmUgdGhlIGVycm9yIGlzIHN0b3JlZC4KKyAqLwordm9pZAorZGJ1c19lcnJvcl9mcmVlIChEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzUmVhbEVycm9yICpyZWFsOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChlcnJvciAhPSBOVUxMKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxFcnJvciAqKWVycm9yOworCisgIGlmICghcmVhbC0+Y29uc3RfbWVzc2FnZSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJlYWwtPm5hbWUpOworICAgICAgZGJ1c19mcmVlIChyZWFsLT5tZXNzYWdlKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0IChlcnJvcik7Cit9CisKKy8qKgorICogQXNzaWducyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIHRvIGEgREJ1c0Vycm9yLiAgRG9lcyBub3RoaW5nIGlmCisgKiBlcnJvciBpcyAjTlVMTC4gVGhlIG1lc3NhZ2UgbWF5IGJlICNOVUxMLCB3aGljaCBtZWFucyBhIGRlZmF1bHQKKyAqIG1lc3NhZ2Ugd2lsbCBiZSBkZWR1Y2VkIGZyb20gdGhlIG5hbWUuIFRoZSBkZWZhdWx0IG1lc3NhZ2Ugd2lsbCBiZQorICogdG90YWxseSB1c2VsZXNzLCB0aG91Z2gsIHNvIHVzaW5nIGEgI05VTEwgbWVzc2FnZSBpcyBub3QgcmVjb21tZW5kZWQuCisgKgorICogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNvcHkgdGhlIGVycm9yIG5hbWUgb3IgbWVzc2FnZSwgeW91CisgKiBtdXN0IGVuc3VyZSB0aGUgbmFtZSBhbmQgbWVzc2FnZSBhcmUgZ2xvYmFsIGRhdGEgdGhhdCB3b24ndCBiZQorICogZnJlZWQuIFlvdSBwcm9iYWJseSB3YW50IGRidXNfc2V0X2Vycm9yKCkgaW5zdGVhZCwgaW4gbW9zdCBjYXNlcy4KKyAqIAorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvci5vciAjTlVMTAorICogQHBhcmFtIG5hbWUgdGhlIGVycm9yIG5hbWUgKG5vdCBjb3BpZWQhISEpCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZSAobm90IGNvcGllZCEhISkKKyAqLwordm9pZAorZGJ1c19zZXRfZXJyb3JfY29uc3QgKERCdXNFcnJvciAgKmVycm9yLAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBjb25zdCBjaGFyICptZXNzYWdlKQoreworICBEQnVzUmVhbEVycm9yICpyZWFsOworCisgIF9kYnVzX3JldHVybl9pZl9lcnJvcl9pc19zZXQgKGVycm9yKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCk7CisgIAorICBpZiAoZXJyb3IgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChlcnJvci0+bmFtZSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlcnJvci0+bWVzc2FnZSA9PSBOVUxMKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2Zyb21fZXJyb3IgKG5hbWUpOworICAKKyAgcmVhbCA9IChEQnVzUmVhbEVycm9yICopZXJyb3I7CisgIAorICByZWFsLT5uYW1lID0gKGNoYXIqKSBuYW1lOworICByZWFsLT5tZXNzYWdlID0gKGNoYXIgKiltZXNzYWdlOworICByZWFsLT5jb25zdF9tZXNzYWdlID0gVFJVRTsKK30KKworLyoqCisgKiBNb3ZlcyBhbiBlcnJvciBzcmMgaW50byBkZXN0LCBmcmVlaW5nIHNyYyBhbmQKKyAqIG92ZXJ3cml0aW5nIGRlc3QuIEJvdGggc3JjIGFuZCBkZXN0IG11c3QgYmUgaW5pdGlhbGl6ZWQuCisgKiBzcmMgaXMgcmVpbml0aWFsaXplZCB0byBhbiBlbXB0eSBlcnJvci4gZGVzdCBtYXkgbm90CisgKiBjb250YWluIGFuIGV4aXN0aW5nIGVycm9yLiBJZiB0aGUgZGVzdGluYXRpb24gaXMKKyAqICNOVUxMLCBqdXN0IGZyZWVzIGFuZCByZWluaXRzIHRoZSBzb3VyY2UgZXJyb3IuCisgKiAKKyAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBlcnJvcgorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIGVycm9yIG9yICNOVUxMCisgKi8KK3ZvaWQKK2RidXNfbW92ZV9lcnJvciAoREJ1c0Vycm9yICpzcmMsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZGVzdCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldCAoZGVzdCk7CisKKyAgaWYgKGRlc3QpCisgICAgeworICAgICAgZGJ1c19lcnJvcl9mcmVlIChkZXN0KTsKKyAgICAgICpkZXN0ID0gKnNyYzsKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoc3JjKTsKKyAgICB9CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKHNyYyk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVycm9yIGlzIHNldCBhbmQgaGFzIHRoZSBnaXZlbgorICogbmFtZS4KKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZ2l2ZW4gbmFtZWQgZXJyb3Igb2NjdXJyZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfZXJyb3JfaGFzX25hbWUgKGNvbnN0IERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZXJyb3IgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX2Fzc2VydCAoKGVycm9yLT5uYW1lICE9IE5VTEwgJiYgZXJyb3ItPm1lc3NhZ2UgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAoZXJyb3ItPm5hbWUgPT0gTlVMTCAmJiBlcnJvci0+bWVzc2FnZSA9PSBOVUxMKSk7CisgIAorICBpZiAoZXJyb3ItPm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHN0cjEsIHN0cjI7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0cjEsIGVycm9yLT5uYW1lKTsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyMiwgbmFtZSk7CisgICAgICByZXR1cm4gX2RidXNfc3RyaW5nX2VxdWFsICgmc3RyMSwgJnN0cjIpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCAodGhlIGVycm9yIGlzIHNldCkuCisgKgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Vycm9yX2lzX3NldCAoY29uc3QgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvciAhPSBOVUxMLCBGQUxTRSk7ICAKKyAgX2RidXNfYXNzZXJ0ICgoZXJyb3ItPm5hbWUgIT0gTlVMTCAmJiBlcnJvci0+bWVzc2FnZSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChlcnJvci0+bmFtZSA9PSBOVUxMICYmIGVycm9yLT5tZXNzYWdlID09IE5VTEwpKTsKKyAgcmV0dXJuIGVycm9yLT5uYW1lICE9IE5VTEw7Cit9CisKKy8qKgorICogQXNzaWducyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIHRvIGEgREJ1c0Vycm9yLgorICogRG9lcyBub3RoaW5nIGlmIGVycm9yIGlzICNOVUxMLgorICoKKyAqIFRoZSBmb3JtYXQgbWF5IGJlICNOVUxMLCB3aGljaCBtZWFucyBhIChwcmV0dHkgbXVjaCB1c2VsZXNzKQorICogZGVmYXVsdCBtZXNzYWdlIHdpbGwgYmUgZGVkdWNlZCBmcm9tIHRoZSBuYW1lLiBUaGlzIGlzIG5vdCBhIGdvb2QKKyAqIGlkZWEsIGp1c3QgZ28gYWhlYWQgYW5kIHByb3ZpZGUgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4gSXQgd29uJ3QKKyAqIGh1cnQgeW91LgorICoKKyAqIElmIG5vIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIGZvciB0aGUgZXJyb3IgbWVzc2FnZSwgCisgKiBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBzZXQgaW5zdGVhZC4KKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yLm9yICNOVUxMCisgKiBAcGFyYW0gbmFtZSB0aGUgZXJyb3IgbmFtZQorICogQHBhcmFtIGZvcm1hdCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZAorZGJ1c19zZXRfZXJyb3IgKERCdXNFcnJvciAgKmVycm9yLAorCQljb25zdCBjaGFyICpuYW1lLAorCQljb25zdCBjaGFyICpmb3JtYXQsCisJCS4uLikKK3sKKyAgREJ1c1JlYWxFcnJvciAqcmVhbDsKKyAgREJ1c1N0cmluZyBzdHI7CisgIHZhX2xpc3QgYXJnczsKKyAgCisgIGlmIChlcnJvciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBpdCdzIGEgYnVnIHRvIHBpbGUgdXAgZXJyb3JzICovCisgIF9kYnVzX3JldHVybl9pZl9lcnJvcl9pc19zZXQgKGVycm9yKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCk7CisgIAorICBfZGJ1c19hc3NlcnQgKGVycm9yLT5uYW1lID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVycm9yLT5tZXNzYWdlID09IE5VTEwpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIGdvdG8gbm9tZW07CisgIAorICBpZiAoZm9ybWF0ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2Zyb21fZXJyb3IgKG5hbWUpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgICAgICB2YV9lbmQgKGFyZ3MpOworICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICgmc3RyLCBmb3JtYXQsIGFyZ3MpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgICAgIHZhX2VuZCAoYXJncyk7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICB9CisKKyAgcmVhbCA9IChEQnVzUmVhbEVycm9yICopZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnJlYWwtPm1lc3NhZ2UpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIAorICByZWFsLT5uYW1lID0gX2RidXNfc3RyZHVwIChuYW1lKTsKKyAgaWYgKHJlYWwtPm5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJlYWwtPm1lc3NhZ2UpOworICAgICAgcmVhbC0+bWVzc2FnZSA9IE5VTEw7CisgICAgICBnb3RvIG5vbWVtOworICAgIH0KKyAgcmVhbC0+Y29uc3RfbWVzc2FnZSA9IEZBTFNFOworCisgIHJldHVybjsKKyAgCisgbm9tZW06CisgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBwdWJsaWMgQVBJICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtZXJyb3JzLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzMTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1lcnJvcnMuaApAQCAtMCwwICsxLDkwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZXJyb3JzLmggRXJyb3IgcmVwb3J0aW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfRVJST1JfSAorI2RlZmluZSBEQlVTX0VSUk9SX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcHJvdG9jb2wuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNFcnJvcnMKKyAqIEB7CisgKi8KKworLyoqIE1vc3RseS1vcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYW4gZXJyb3IgdGhhdCBvY2N1cnJlZCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0Vycm9yIERCdXNFcnJvcjsKKworLyoqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGFuIGV4Y2VwdGlvbi4KKyAqLworc3RydWN0IERCdXNFcnJvcgoreworICBjb25zdCBjaGFyICpuYW1lOyAgICAvKio8IHB1YmxpYyBlcnJvciBuYW1lIGZpZWxkICovCisgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7IC8qKjwgcHVibGljIGVycm9yIG1lc3NhZ2UgZmllbGQgKi8KKworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXkyIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXkzIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXk0IDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXk1IDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworCisgIHZvaWQgKnBhZGRpbmcxOyAvKio8IHBsYWNlaG9sZGVyICovCit9OworCisjZGVmaW5lIERCVVNfRVJST1JfSU5JVCB7IE5VTEwsIE5VTEwsIFRSVUUsIDAsIDAsIDAsIDAsIE5VTEwgfQorCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19lcnJvcl9pbml0ICAgICAgKERCdXNFcnJvciAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfZXJyb3JfZnJlZSAgICAgIChEQnVzRXJyb3IgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX3NldF9lcnJvciAgICAgICAoREJ1c0Vycm9yICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKERCdXNFcnJvciAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICAgICAgKERCdXNFcnJvciAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZGVzdCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19lcnJvcl9oYXNfbmFtZSAgKGNvbnN0IERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Vycm9yX2lzX3NldCAgICAoY29uc3QgREJ1c0Vycm9yICplcnJvcik7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19FUlJPUl9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtZmlsZS11bml4LmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtZmlsZS11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3NTkzMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1maWxlLXVuaXguYwpAQCAtMCwwICsxLDQxNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWZpbGUtdW5peC5jIHVuaXggcmVsYXRlZCBmaWxlIGltcGxlbWVudGF0aW9uIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtZXJyb3JzLmgiCisjaW5jbHVkZSAiZGJ1cy1maWxlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworLyoqCisgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZSB0byB0aGUgc3RyaW5nLAorICogcmV0dXJuaW5nIGVycm9yIGNvZGUuIEF0IHRoZSBtb21lbnQsIHdvbid0IG9wZW4gYSBmaWxlCisgKiBtb3JlIHRoYW4gYSBtZWdhYnl0ZSBpbiBzaXplLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byBsb2FkCisgKiBAcGFyYW0gZXJyb3IgcGxhY2UgdG8gc2V0IGFuIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZmlsZV9nZXRfY29udGVudHMgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgaW50IG9yaWdfbGVuOworICBpbnQgdG90YWw7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICAvKiBPX0JJTkFSWSB1c2VmdWwgb24gQ3lnd2luICovCisgIGZkID0gb3BlbiAoZmlsZW5hbWVfYywgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJmaWxlIGZkICVkIG9wZW5lZFxuIiwgZmQpOworICAKKyAgaWYgKGZzdGF0IChmZCwgJnNiKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzdGF0IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmc3RhdCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNiLnN0X3NpemUgPiBfREJVU19PTkVfTUVHQUJZVEUpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBzaXplICVsdSBvZiBcIiVzXCIgaXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNiLnN0X3NpemUsIGZpbGVuYW1lX2MpOworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICB0b3RhbCA9IDA7CisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIGlmIChzYi5zdF9zaXplID4gMCAmJiBTX0lTUkVHIChzYi5zdF9tb2RlKSkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfcmVhZDsKKworICAgICAgd2hpbGUgKHRvdGFsIDwgKGludCkgc2Iuc3Rfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIGJ5dGVzX3JlYWQgPSBfZGJ1c19yZWFkIChmZCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5zdF9zaXplIC0gdG90YWwpOworICAgICAgICAgIGlmIChieXRlc19yZWFkIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlYWQoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBvcmlnX2xlbik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b3RhbCArPSBieXRlc19yZWFkOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKHNiLnN0X3NpemUgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ2FuIG9ubHkgb3BlbiByZWd1bGFyIGZpbGVzIGF0IHRoZSBtb21lbnQuXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MpOworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIFdyaXRlcyBhIHN0cmluZyBvdXQgdG8gYSBmaWxlLiBJZiB0aGUgZmlsZSBleGlzdHMsCisgKiBpdCB3aWxsIGJlIGF0b21pY2FsbHkgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBkYXRhLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZSB0byBzYXZlIHN0cmluZyB0bworICogQHBhcmFtIHdvcmxkX3JlYWRhYmxlIElmIHNldCwgZW5zdXJlIHRoZSBmaWxlIGlzIHdvcmxkIHJlYWRhYmxlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgd29ybGRfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBpbnQgYnl0ZXNfdG9fd3JpdGU7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIERCdXNTdHJpbmcgdG1wX2ZpbGVuYW1lOworICBjb25zdCBjaGFyICp0bXBfZmlsZW5hbWVfYzsKKyAgaW50IHRvdGFsOworICBkYnVzX2Jvb2xfdCBuZWVkX3VubGluazsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmQgPSAtMTsKKyAgcmV0dmFsID0gRkFMU0U7CisgIG5lZWRfdW5saW5rID0gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wX2ZpbGVuYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZmlsZW5hbWUsIDAsICZ0bXBfZmlsZW5hbWUsIDApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcF9maWxlbmFtZSwgIi4iKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNkZWZpbmUgTl9UTVBfRklMRU5BTUVfUkFORE9NX0JZVEVTIDgKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZ0bXBfZmlsZW5hbWUsIE5fVE1QX0ZJTEVOQU1FX1JBTkRPTV9CWVRFUykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIHRtcF9maWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdG1wX2ZpbGVuYW1lKTsKKworICBmZCA9IG9wZW4gKHRtcF9maWxlbmFtZV9jLCBPX1dST05MWSB8IE9fQklOQVJZIHwgT19FWENMIHwgT19DUkVBVCwKKyAgICAgICAgICAgICB3b3JsZF9yZWFkYWJsZSA/IDA2NDQgOiAwNjAwKTsKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaWYgKHdvcmxkX3JlYWRhYmxlKQorICAgIHsKKyAgICAgIC8qIEVuc3VyZSB0aGUgZmlsZSBpcyB3b3JsZCByZWFkYWJsZSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZgorICAgICAgICogcG9zc2libHkgcmVzdHJpY3RpdmUgdW1hc2tzOworICAgICAgICogc2VlIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDEwLVNlcHRlbWJlci8wMTMzNjcuaHRtbAorICAgICAgICovCisgICAgICBpZiAoZmNobW9kIChmZCwgMDY0NCkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2htb2QgJXM6ICVzIiwgdG1wX2ZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJ0bXAgZmlsZSBmZCAlZCBvcGVuZWRcbiIsIGZkKTsKKyAgCisgIG5lZWRfdW5saW5rID0gVFJVRTsKKyAgCisgIHRvdGFsID0gMDsKKyAgYnl0ZXNfdG9fd3JpdGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICB3aGlsZSAodG90YWwgPCBieXRlc190b193cml0ZSkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICAgICAgYnl0ZXNfd3JpdHRlbiA9IF9kYnVzX3dyaXRlIChmZCwgc3RyLCB0b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fd3JpdGUgLSB0b3RhbCk7CisKKyAgICAgIGlmIChieXRlc193cml0dGVuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgdG90YWwgKz0gYnl0ZXNfd3JpdHRlbjsKKyAgICB9CisKKyAgaWYgKGZzeW5jKGZkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHN5bmNocm9uaXplIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICB0bXBfZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKCFfZGJ1c19jbG9zZSAoZmQsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGZkID0gLTE7CisgIAorICBpZiAocmVuYW1lICh0bXBfZmlsZW5hbWVfYywgZmlsZW5hbWVfYykgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVuYW1lICVzIHRvICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdG1wX2ZpbGVuYW1lX2MsIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBuZWVkX3VubGluayA9IEZBTFNFOworICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICAvKiBjbG9zZSBmaXJzdCwgdGhlbiB1bmxpbmssIHRvIHByZXZlbnQgIi5uZnMzNDIzNDIzNSIgZ2FyYmFnZQorICAgKiBmaWxlcworICAgKi8KKworICBpZiAoZmQgPj0gMCkKKyAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAKKyAgaWYgKG5lZWRfdW5saW5rICYmIHVubGluayAodG1wX2ZpbGVuYW1lX2MpIDwgMCkKKyAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHVubGluayB0ZW1wIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIE1ha2VzIHRoZSBmaWxlIHJlYWRhYmxlIGJ5IGV2ZXJ5IHVzZXIgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBmaWxlJ3MgcGVybWlzc2lvbnMgY291bGQgYmUgY2hhbmdlZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZShjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgaWYgKGNobW9kIChmaWxlbmFtZV9jLCAwNjQ0KSA9PSAtMSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiogQ3JlYXRlcyB0aGUgZ2l2ZW4gZmlsZSwgZmFpbGluZyBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGNyZWF0ZWQgdGhlIGZpbGUgYW5kIGl0IGRpZG4ndCBleGlzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICBmZCA9IG9wZW4gKGZpbGVuYW1lX2MsIE9fV1JPTkxZIHwgT19CSU5BUlkgfCBPX0VYQ0wgfCBPX0NSRUFULAorICAgICAgICAgICAgIDA2MDApOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiZXhjbHVzaXZlIGZpbGUgZmQgJWQgb3BlbmVkXG4iLCBmZCk7CisgIAorICBpZiAoIV9kYnVzX2Nsb3NlIChmZCwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBEZWxldGVzIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1bmxpbmsoKSBzdWNjZWVkZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAodW5saW5rIChmaWxlbmFtZV9jKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGRlbGV0ZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1maWxlLXdpbi5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWZpbGUtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhOGVhMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1maWxlLXdpbi5jCkBAIC0wLDAgKzEsNDA3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZmlsZS13aW4uYyB3aW5kb3dzIHJlbGF0ZWQgZmlsZSBpbXBsZW1lbnRhdGlvbiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHJlYWQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFwcGVuZHMKKyAqIHRoZSBkYXRhIGl0IHJlYWRzIHRvIHRoZSBEQnVzU3RyaW5nIGJ1ZmZlci4gSXQgYXBwZW5kcworICogdXAgdG8gdGhlIGdpdmVuIGNvdW50LgorICogCisgKiBAcGFyYW0gaG5kIHRoZSBIQU5ETEUgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHBhcmFtIGVycm9yIHBsYWNlIHRvIHNldCBhbiBlcnJvcgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQKK19kYnVzX2ZpbGVfcmVhZCAoSEFORExFICAgICAgICAgICAgaG5kLAorICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgQk9PTCByZXN1bHQ7CisgIERXT1JEIGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgY2hhciAqZGF0YTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworCisgIHJlc3VsdCA9IFJlYWRGaWxlIChobmQsIGRhdGEsIGNvdW50LCAmYnl0ZXNfcmVhZCwgTlVMTCk7CisgIGlmIChyZXN1bHQgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSAweCV4OiAlcyIsIGhuZCwgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoYnl0ZXNfcmVhZCkKKyAgICB7CisgICAgICAvKiBwdXQgbGVuZ3RoIGJhY2sgKGRvZXNuJ3QgYWN0dWFsbHkgcmVhbGxvYykgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0ICsgYnl0ZXNfcmVhZCk7CisKKyNpZiAwCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc19yZWFkKTsKKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gYnl0ZXNfcmVhZDsKK30KKworCisvKioKKyAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBmaWxlIHRvIHRoZSBzdHJpbmcsCisgKiByZXR1cm5pbmcgZXJyb3IgY29kZS4gQXQgdGhlIG1vbWVudCwgd29uJ3Qgb3BlbiBhIGZpbGUKKyAqIG1vcmUgdGhhbiBhIG1lZ2FieXRlIGluIHNpemUuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIHRvIGxvYWQKKyAqIEBwYXJhbSBlcnJvciBwbGFjZSB0byBzZXQgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19maWxlX2dldF9jb250ZW50cyAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBIQU5ETEUgaG5kOworICBEV09SRCBmc2l6ZTsKKyAgRFdPUkQgZnNpemVfaGk7CisgIGludCBvcmlnX2xlbjsKKyAgdW5zaWduZWQgaW50IHRvdGFsOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBobmQgPSBDcmVhdGVGaWxlQSAoZmlsZW5hbWVfYywgR0VORVJJQ19SRUFELAorICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICBpZiAoaG5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiOiAlcyIsIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImZpbGUgJXMgaG5kICVwIG9wZW5lZFxuIiwgZmlsZW5hbWVfYywgaG5kKTsKKyAgCisgIGZzaXplID0gR2V0RmlsZVNpemUgKGhuZCwgJmZzaXplX2hpKTsKKyAgaWYgKGZzaXplID09IDB4RkZGRkZGRkYgJiYgR2V0TGFzdEVycm9yKCkgIT0gTk9fRVJST1IpCisgICAgeyAKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGZpbGUgc2l6ZSBmb3IgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiR2V0RmlsZVNpemUoKSBmYWlsZWQ6ICVzIiwgZW1zZyk7CisKKyAgICAgIENsb3NlSGFuZGxlIChobmQpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmc2l6ZV9oaSAhPSAwIHx8IGZzaXplID4gX0RCVVNfT05FX01FR0FCWVRFKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgc2l6ZSAlbHUvJWx1IG9mIFwiJXNcIiBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZnNpemVfaGksCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGZzaXplLCBmaWxlbmFtZV9jKTsKKyAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB0b3RhbCA9IDA7CisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIGlmIChmc2l6ZSA+IDApCisgICAgeworICAgICAgaW50IGJ5dGVzX3JlYWQ7CisKKyAgICAgIHdoaWxlICh0b3RhbCA8IGZzaXplKQorICAgICAgICB7CisgICAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX2ZpbGVfcmVhZCAoaG5kLCBzdHIsIGZzaXplIC0gdG90YWwsIGVycm9yKTsKKyAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZW1hdHVyZSBFT0YgcmVhZGluZyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICAgICAgICAgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG90YWwgKz0gYnl0ZXNfcmVhZDsKKyAgICAgICAgfQorCisgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIG91dCB0byBhIGZpbGUuIElmIHRoZSBmaWxlIGV4aXN0cywKKyAqIGl0IHdpbGwgYmUgYXRvbWljYWxseSBvdmVyd3JpdHRlbiBieSB0aGUgbmV3IGRhdGEuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIG91dAorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIHRvIHNhdmUgc3RyaW5nIHRvCisgKiBAcGFyYW0gd29ybGRfcmVhZGFibGUgaWYgdHJ1ZSwgZW5zdXJlIGZpbGUgaXMgd29ybGQgcmVhZGFibGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4gb24gZmFpbHVyZQorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgd29ybGRfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgSEFORExFIGhuZDsKKyAgaW50IGJ5dGVzX3RvX3dyaXRlOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworICBEQnVzU3RyaW5nIHRtcF9maWxlbmFtZTsKKyAgY29uc3QgY2hhciAqdG1wX2ZpbGVuYW1lX2M7CisgIGludCB0b3RhbDsKKyAgY29uc3QgY2hhciAqc3RyX2M7CisgIGRidXNfYm9vbF90IG5lZWRfdW5saW5rOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaG5kID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIHJldHZhbCA9IEZBTFNFOworICBuZWVkX3VubGluayA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXBfZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChmaWxlbmFtZSwgMCwgJnRtcF9maWxlbmFtZSwgMCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcF9maWxlbmFtZSwgIi4iKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNkZWZpbmUgTl9UTVBfRklMRU5BTUVfUkFORE9NX0JZVEVTIDgKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZ0bXBfZmlsZW5hbWUsIE5fVE1QX0ZJTEVOQU1FX1JBTkRPTV9CWVRFUykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgdG1wX2ZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0bXBfZmlsZW5hbWUpOworCisgIC8qIFRPRE8gLSBzdXBwb3J0IHdvcmxkLXJlYWRhYmxlIGluIGFuIGF0b21pYyBmYXNoaW9uICovCisgIGhuZCA9IENyZWF0ZUZpbGVBICh0bXBfZmlsZW5hbWVfYywgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCBDUkVBVEVfTkVXLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisgIGlmIChobmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIFwiJXNcIjogJXMiLCBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGlmICh3b3JsZF9yZWFkYWJsZSkKKyAgICB7CisgICAgICBpZiAoISBfZGJ1c19tYWtlX2ZpbGVfd29ybGRfcmVhZGFibGUgKCZ0bXBfZmlsZW5hbWUsIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJ0bXAgZmlsZSAlcyBobmQgJXAgb3BlbmVkXG4iLCB0bXBfZmlsZW5hbWVfYywgaG5kKTsKKworICBuZWVkX3VubGluayA9IFRSVUU7CisKKyAgdG90YWwgPSAwOworICBieXRlc190b193cml0ZSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICBzdHJfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKTsKKworICB3aGlsZSAodG90YWwgPCBieXRlc190b193cml0ZSkKKyAgICB7CisgICAgICBEV09SRCBieXRlc193cml0dGVuOworICAgICAgQk9PTCByZXM7CisKKyAgICAgIHJlcyA9IFdyaXRlRmlsZSAoaG5kLCBzdHJfYyArIHRvdGFsLCBieXRlc190b193cml0ZSAtIHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCk7CisKKyAgICAgIGlmIChyZXMgPT0gMCB8fCBieXRlc193cml0dGVuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvICVzOiAlcyIsIHRtcF9maWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIHRvdGFsICs9IGJ5dGVzX3dyaXR0ZW47CisgICAgfQorCisgIGlmIChDbG9zZUhhbmRsZSAoaG5kKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIGZpbGUgJXM6ICVzIiwgdG1wX2ZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBobmQgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKworICAvKiBVbmxpa2UgcmVuYW1lKCksIE1vdmVGaWxlRXgoKSBjYW4gcmVwbGFjZSBleGlzdGluZyBmaWxlcyAqLworICBpZiAoIU1vdmVGaWxlRXhBICh0bXBfZmlsZW5hbWVfYywgZmlsZW5hbWVfYywgTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORykpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVuYW1lICVzIHRvICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBuZWVkX3VubGluayA9IEZBTFNFOworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIC8qIGNsb3NlIGZpcnN0LCB0aGVuIHVubGluayAqLworCisgIGlmIChobmQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisKKyAgaWYgKG5lZWRfdW5saW5rICYmIERlbGV0ZUZpbGVBICh0bXBfZmlsZW5hbWVfYykgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gdW5saW5rIHRlbXAgZmlsZSAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworCisgIGlmICghcmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKiBDcmVhdGVzIHRoZSBnaXZlbiBmaWxlLCBmYWlsaW5nIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgY3JlYXRlZCB0aGUgZmlsZSBhbmQgaXQgZGlkbid0IGV4aXN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfZmlsZV9leGNsdXNpdmVseSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIEhBTkRMRSBobmQ7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGhuZCA9IENyZWF0ZUZpbGVBIChmaWxlbmFtZV9jLCBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsIENSRUFURV9ORVcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfSEFORExFX1ZBTFVFKTsKKyAgaWYgKGhuZCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJleGNsdXNpdmUgZmlsZSAlcyBobmQgJXAgb3BlbmVkXG4iLCBmaWxlbmFtZV9jLCBobmQpOworCisgIGlmIChDbG9zZUhhbmRsZSAoaG5kKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtZmlsZS5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBmYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWZpbGUuYwpAQCAtMCwwICsxLDI4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy11bml4LmMgV3JhcHBlcnMgYXJvdW5kIFVOSVggc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJkYnVzLWZpbGUuaCIKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWZpbGUuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4MzdmNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1maWxlLmgKQEAgLTAsMCArMSw2MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWZpbGUuaCBkYnVzIGZpbGUgcmVsYXRlZCBzdHVmZiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19GSUxFX0gKKyNkZWZpbmUgREJVU19GSUxFX0gKKworLy8jaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNGaWxlCisgKiBAeworICovCisKKy8qKgorICogRmlsZSBpbnRlcmZhY2UKKyAqLworZGJ1c19ib29sX3QgX2RidXNfZmlsZV9leGlzdHMgICAgICAgICAoY29uc3QgY2hhciAgICAgICAqZmlsZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19maWxlX2dldF9jb250ZW50cyAgIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgd29ybGRfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZSAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworZGJ1c19ib29sX3QgICAgX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX2RlbGV0ZV9maWxlICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtaGFzaC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VmNGNlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWhhc2guYwpAQCAtMCwwICsxLDIxOTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1oYXNoLmMgR2VuZXJpYyBoYXNoIHRhYmxlIHV0aWxpdHkgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogCisgKiBIYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGdlbmVyaWMvdGNsSGFzaC5jIGZyb20gdGhlIFRjbAorICogc291cmNlIGNvZGUuIFRoZSBvcmlnaW5hbCBUY2wgbGljZW5zZSBhcHBsaWVzIHRvIHBvcnRpb25zIG9mIHRoZQorICogY29kZSBmcm9tIHRjbEhhc2guYzsgdGhlIFRjbCBsaWNlbnNlIGZvbGxvd3MgdGhpcyBzdGFuZGFkIEQtQnVzIAorICogbGljZW5zZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKy8qIAorICogVGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYXBwbGllcyB0byBjb2RlIGZyb20gdGhlIFRjbCBkaXN0cmlidXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIENvcHlyaWdodCAoYykgMTk5NCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHRlZCBieSB0aGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZgorICogQ2FsaWZvcm5pYSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgU2NyaXB0aWNzIENvcnBvcmF0aW9uLCBhbmQKKyAqIG90aGVyIHBhcnRpZXMuICBUaGUgZm9sbG93aW5nIHRlcm1zIGFwcGx5IHRvIGFsbCBmaWxlcyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSBzb2Z0d2FyZSB1bmxlc3MgZXhwbGljaXRseSBkaXNjbGFpbWVkIGluIGluZGl2aWR1YWwgZmlsZXMuCisgKiAKKyAqIFRoZSBhdXRob3JzIGhlcmVieSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogZGlzdHJpYnV0ZSwgYW5kIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueQorICogcHVycG9zZSwgcHJvdmlkZWQgdGhhdCBleGlzdGluZyBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQgaW4KKyAqIGFsbCBjb3BpZXMgYW5kIHRoYXQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgdmVyYmF0aW0gaW4gYW55CisgKiBkaXN0cmlidXRpb25zLiBObyB3cml0dGVuIGFncmVlbWVudCwgbGljZW5zZSwgb3Igcm95YWx0eSBmZWUgaXMKKyAqIHJlcXVpcmVkIGZvciBhbnkgb2YgdGhlIGF1dGhvcml6ZWQgdXNlcy4gIE1vZGlmaWNhdGlvbnMgdG8gdGhpcworICogc29mdHdhcmUgbWF5IGJlIGNvcHlyaWdodGVkIGJ5IHRoZWlyIGF1dGhvcnMgYW5kIG5lZWQgbm90IGZvbGxvdworICogdGhlIGxpY2Vuc2luZyB0ZXJtcyBkZXNjcmliZWQgaGVyZSwgcHJvdmlkZWQgdGhhdCB0aGUgbmV3IHRlcm1zIGFyZQorICogY2xlYXJseSBpbmRpY2F0ZWQgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgZWFjaCBmaWxlIHdoZXJlIHRoZXkgYXBwbHkuCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIERJU1RSSUJVVE9SUyBCRSBMSUFCTEUgVE8gQU5ZCisgKiBQQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIElUUyBET0NVTUVOVEFUSU9OLAorICogT1IgQU5ZIERFUklWQVRJVkVTIFRIRVJFT0YsIEVWRU4gSUYgVEhFIEFVVEhPUlMgSEFWRSBCRUVOIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqIAorICogVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBTUEVDSUZJQ0FMTFkgRElTQ0xBSU0gQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5ECisgKiBOT04tSU5GUklOR0VNRU5ULiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLAorICogQU5EIFRIRSBBVVRIT1JTIEFORCBESVNUUklCVVRPUlMgSEFWRSBOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUKKyAqIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKiAKKyAqIEdPVkVSTk1FTlQgVVNFOiBJZiB5b3UgYXJlIGFjcXVpcmluZyB0aGlzIHNvZnR3YXJlIG9uIGJlaGFsZiBvZiB0aGUKKyAqIFUuUy4gZ292ZXJubWVudCwgdGhlIEdvdmVybm1lbnQgc2hhbGwgaGF2ZSBvbmx5ICJSZXN0cmljdGVkIFJpZ2h0cyIKKyAqIGluIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uIGFzIGRlZmluZWQgaW4gdGhlIEZlZGVyYWwKKyAqIEFjcXVpc2l0aW9uIFJlZ3VsYXRpb25zIChGQVJzKSBpbiBDbGF1c2UgNTIuMjI3LjE5IChjKSAoMikuICBJZiB5b3UKKyAqIGFyZSBhY3F1aXJpbmcgdGhlIHNvZnR3YXJlIG9uIGJlaGFsZiBvZiB0aGUgRGVwYXJ0bWVudCBvZiBEZWZlbnNlLAorICogdGhlIHNvZnR3YXJlIHNoYWxsIGJlIGNsYXNzaWZpZWQgYXMgIkNvbW1lcmNpYWwgQ29tcHV0ZXIgU29mdHdhcmUiCisgKiBhbmQgdGhlIEdvdmVybm1lbnQgc2hhbGwgaGF2ZSBvbmx5ICJSZXN0cmljdGVkIFJpZ2h0cyIgYXMgZGVmaW5lZAorICogaW4gQ2xhdXNlIDI1Mi4yMjctNzAxMyAoYykgKDEpIG9mIERGQVJzLiAgTm90d2l0aHN0YW5kaW5nIHRoZQorICogZm9yZWdvaW5nLCB0aGUgYXV0aG9ycyBncmFudCB0aGUgVS5TLiBHb3Zlcm5tZW50IGFuZCBvdGhlcnMgYWN0aW5nCisgKiBpbiBpdHMgYmVoYWxmIHBlcm1pc3Npb24gdG8gdXNlIGFuZCBkaXN0cmlidXRlIHRoZSBzb2Z0d2FyZSBpbgorICogYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbWVtcG9vbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzSGFzaFRhYmxlIEhhc2ggdGFibGUKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0hhc2hUYWJsZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzSGFzaFRhYmxlLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNIYXNoVGFibGVJbnRlcm5hbHMgSGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNIYXNoVGFibGUgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNIYXNoVGFibGUuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFdoZW4gdGhlcmUgYXJlIHRoaXMgbWFueSBlbnRyaWVzIHBlciBidWNrZXQsIG9uIGF2ZXJhZ2UsIHJlYnVpbGQKKyAqIHRoZSBoYXNoIHRhYmxlIHRvIG1ha2UgaXQgbGFyZ2VyLgorICovCisjZGVmaW5lIFJFQlVJTERfTVVMVElQTElFUiAgMworCisvKioKKyAqIFRha2VzIGEgcHJlbGltaW5hcnkgaW50ZWdlciBoYXNoIHZhbHVlIGFuZCBwcm9kdWNlcyBhbiBpbmRleCBpbnRvIGEKKyAqIGhhc2ggdGFibGVzIGJ1Y2tldCBsaXN0LiAgVGhlIGlkZWEgaXMgdG8gbWFrZSBpdCBzbyB0aGF0CisgKiBwcmVsaW1pbmFyeSB2YWx1ZXMgdGhhdCBhcmUgYXJiaXRyYXJpbHkgc2ltaWxhciB3aWxsIGVuZCB1cCBpbgorICogZGlmZmVyZW50IGJ1Y2tldHMuICBUaGUgaGFzaCBmdW5jdGlvbiB3YXMgdGFrZW4gZnJvbSBhCisgKiByYW5kb20tbnVtYmVyIGdlbmVyYXRvci4gKFRoaXMgaXMgdXNlZCB0byBoYXNoIGludGVnZXJzLikKKyAqCisgKiBUaGUgZG93bl9zaGlmdCBkcm9wcyBvZmYgdGhlIGhpZ2ggYml0cyBvZiB0aGUgaGFzaCBpbmRleCwgYW5kCisgKiBkZWNyZWFzZXMgYXMgd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgKHRvIGtlZXAgbW9yZQorICogcmFuZ2UgaW4gdGhlIGhhc2ggaW5kZXgpLiBUaGUgbWFzayBhbHNvIHN0cmlwcyBoaWdoIGJpdHMgYW5kIHN0cmlwcworICogZmV3ZXIgaGlnaCBiaXRzIGFzIHRoZSBudW1iZXIgb2YgaGFzaCBidWNrZXRzIGluY3JlYXNlcy4KKyAqIEkgZG9uJ3QgdW5kZXJzdGFuZCB0d28gdGhpbmdzOiB3aHkgaXMgdGhlIGluaXRpYWwgZG93bnNoaWZ0IDI4CisgKiB0byBrZWVwIDQgYml0cyB3aGVuIHRoZSBpbml0aWFsIG1hc2sgaXMgMDExIHRvIGtlZXAgMiBiaXRzLAorICogYW5kIHdoeSBkbyB3ZSBoYXZlIGJvdGggYSBtYXNrIGFuZCBhIGRvd25zaGlmdD8KKyAqIAorICovCisjZGVmaW5lIFJBTkRPTV9JTkRFWCh0YWJsZSwgaSkgXAorICAgICgoKCgoaW50cHRyX3QpIChpKSkqMTEwMzUxNTI0NSkgPj4gKHRhYmxlKS0+ZG93bl9zaGlmdCkgJiAodGFibGUpLT5tYXNrKQorCisvKioKKyAqIEluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gaGFzaCB0YWJsZSAoaGFzaCB0YWJsZSBzdGF0aWNhbGx5CisgKiBhbGxvY2F0ZXMgaXRzIGJ1Y2tldHMgZm9yIHRoaXMgc2l6ZSBhbmQgYmVsb3cpLgorICogVGhlIGluaXRpYWwgbWFzayBoYXMgdG8gYmUgc3luY2VkIHRvIHRoaXMuCisgKi8KKyNkZWZpbmUgREJVU19TTUFMTF9IQVNIX1RBQkxFIDQKKworLyoqCisgKiBUeXBlZGVmIGZvciBEQnVzSGFzaEVudHJ5CisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNIYXNoRW50cnkgREJ1c0hhc2hFbnRyeTsKKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBoYXNoIGVudHJ5LgorICogCisgKiBBIHNpbmdsZSBlbnRyeSAoa2V5LXZhbHVlIHBhaXIpIGluIHRoZSBoYXNoIHRhYmxlLgorICogSW50ZXJuYWwgdG8gaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RydWN0IERCdXNIYXNoRW50cnkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqbmV4dDsgICAgLyoqPCBQb2ludGVyIHRvIG5leHQgZW50cnkgaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXNoIGJ1Y2tldCwgb3IgI05VTEwgZm9yIGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaGFpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKmtleTsgICAgICAgICAgICAgIC8qKjwgSGFzaCBrZXkgKi8KKyAgdm9pZCAqdmFsdWU7ICAgICAgICAgICAgLyoqPCBIYXNoIHZhbHVlICovCit9OworCisvKioKKyAqIEZ1bmN0aW9uIHVzZWQgdG8gZmluZCBhbmQgb3B0aW9uYWxseSBjcmVhdGUgYSBoYXNoIGVudHJ5LgorICovCit0eXBlZGVmIERCdXNIYXNoRW50cnkqICgqIERCdXNGaW5kRW50cnlGdW5jdGlvbikgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAqKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpOworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c0hhc2hUYWJsZS4KKyAqIAorICogSGFzaCB0YWJsZSBpbnRlcm5hbHMuIEhhc2ggdGFibGVzIGFyZSBvcGFxdWUgb2JqZWN0cywgdGhleSBtdXN0IGJlCisgKiB1c2VkIHZpYSBhY2Nlc3NvciBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBEQnVzSGFzaFRhYmxlIHsKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgCisgIERCdXNIYXNoRW50cnkgKipidWNrZXRzOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byBidWNrZXQgYXJyYXkuICBFYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGVsZW1lbnQgcG9pbnRzIHRvIGZpcnN0IGVudHJ5IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1Y2tldCdzIGhhc2ggY2hhaW4sIG9yICNOVUxMLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c0hhc2hFbnRyeSAqc3RhdGljX2J1Y2tldHNbREJVU19TTUFMTF9IQVNIX1RBQkxFXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQnVja2V0IGFycmF5IHVzZWQgZm9yIHNtYWxsIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKHRvIGF2b2lkIG1hbGxvY3MgYW5kIGZyZWVzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgbl9idWNrZXRzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgYnVja2V0cyBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF0ICoqYnVja2V0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgbl9lbnRyaWVzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgZW50cmllcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgaGlfcmVidWlsZF9zaXplOyAgICAgICAgICAgICAgICAgLyoqPCBFbmxhcmdlIHRhYmxlIHdoZW4gbl9lbnRyaWVzIGdldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGJlIHRoaXMgbGFyZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGxvX3JlYnVpbGRfc2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgU2hyaW5rIHRhYmxlIHdoZW4gbl9lbnRyaWVzIGdldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlbG93IHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGRvd25fc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2hpZnQgY291bnQgdXNlZCBpbiBoYXNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbi4gIERlc2lnbmVkIHRvIHVzZSBoaWdoLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3JkZXIgYml0cyBvZiByYW5kb21pemVkIGtleXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFzayB2YWx1ZSB1c2VkIGluIGhhc2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNIYXNoVHlwZSBrZXlfdHlwZTsgICAgICAgICAgICAgICAvKio8IFR5cGUgb2Yga2V5cyB1c2VkIGluIHRoaXMgdGFibGUgKi8KKworCisgIERCdXNGaW5kRW50cnlGdW5jdGlvbiBmaW5kX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIGZvciBmaW5kaW5nIGVudHJpZXMgKi8KKworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfa2V5X2Z1bmN0aW9uOyAgIC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBrZXlzICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV92YWx1ZV9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byBmcmVlIHZhbHVlcyAqLworCisgIERCdXNNZW1Qb29sICplbnRyeV9wb29sOyAgICAgICAgICAgICAgLyoqPCBNZW1vcnkgcG9vbCBmb3IgaGFzaCBlbnRyaWVzICovCit9OworCisvKiogCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNIYXNoSXRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGU7ICAgICAvKio8IFBvaW50ZXIgdG8gdGFibGUgY29udGFpbmluZyBlbnRyeS4gKi8KKyAgREJ1c0hhc2hFbnRyeSAqKmJ1Y2tldDsgICAvKio8IFBvaW50ZXIgdG8gYnVja2V0IHRoYXQgcG9pbnRzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlyc3QgZW50cnkgaW4gdGhpcyBlbnRyeSdzIGNoYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZWQgZm9yIGRlbGV0aW5nIHRoZSBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7ICAgICAgLyoqPCBDdXJyZW50IGhhc2ggZW50cnkgKi8KKyAgREJ1c0hhc2hFbnRyeSAqbmV4dF9lbnRyeTsgLyoqPCBOZXh0IGVudHJ5IHRvIGJlIGl0ZXJhdGVkIG9udG8gaW4gY3VycmVudCBidWNrZXQgKi8KKyAgaW50IG5leHRfYnVja2V0OyAgICAgICAgICAgLyoqPCBpbmRleCBvZiBuZXh0IGJ1Y2tldCAqLworICBpbnQgbl9lbnRyaWVzX29uX2luaXQ7ICAgICAvKio8IHVzZWQgdG8gZGV0ZWN0IHRhYmxlIHJlc2l6ZSBzaW5jZSBpbml0aWFsaXphdGlvbiAqLworfSBEQnVzUmVhbEhhc2hJdGVyOworCitzdGF0aWMgREJ1c0hhc2hFbnRyeSogZmluZF9kaXJlY3RfZnVuY3Rpb24gICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgKioqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICAgKnByZWFsbG9jYXRlZCk7CitzdGF0aWMgREJ1c0hhc2hFbnRyeSogZmluZF9zdHJpbmdfZnVuY3Rpb24gICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgKioqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICAgKnByZWFsbG9jYXRlZCk7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIERCdXNIYXNoRW50cnkqIGZpbmRfdHdvX3N0cmluZ3NfZnVuY3Rpb24gKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAgICpwcmVhbGxvY2F0ZWQpOworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50ICAgc3RyaW5nX2hhc2ggICAgICAgICAgICAgICAoY29uc3QgY2hhciAgICAgICAgICAgICAqc3RyKTsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCitzdGF0aWMgdW5zaWduZWQgaW50ICAgdHdvX3N0cmluZ3NfaGFzaCAgICAgICAgICAoY29uc3QgY2hhciAgICAgICAgICAgICAqc3RyKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgICAgICAgICAgIHJlYnVpbGRfdGFibGUgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlKTsKK3N0YXRpYyBEQnVzSGFzaEVudHJ5KiBhbGxvY19lbnRyeSAgICAgICAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgcmVtb3ZlX2VudHJ5ICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgICoqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICAgKmVudHJ5KTsKK3N0YXRpYyB2b2lkICAgICAgICAgICBmcmVlX2VudHJ5ICAgICAgICAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgICAgICplbnRyeSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgZnJlZV9lbnRyeV9kYXRhICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgICAqZW50cnkpOworCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNIYXNoVGFibGUKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzSGFzaEl0ZXIKKyAqCisgKiBQdWJsaWMgb3BhcXVlIGhhc2ggdGFibGUgaXRlcmF0b3Igb2JqZWN0LgorICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c0hhc2hUYWJsZQorICoKKyAqIFB1YmxpYyBvcGFxdWUgaGFzaCB0YWJsZSBvYmplY3QuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzSGFzaFR5cGUKKyAqCisgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgYSBrZXkgaW4gdGhlIGhhc2ggdGFibGUuCisgKi8KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGhhc2ggdGFibGUuIFNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBfZGJ1c19oYXNoX3RhYmxlX3VucmVmKCkuIElmIG1lbW9yeSBjYW5ub3QgYmUKKyAqIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUsIHJldHVybnMgI05VTEwuCisgKgorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgaGFzaCBrZXkgdG8gdXNlLgorICogQHBhcmFtIGtleV9mcmVlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgaGFzaCBrZXlzLgorICogQHBhcmFtIHZhbHVlX2ZyZWVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gZnJlZSBoYXNoIHZhbHVlcy4KKyAqIEByZXR1cm5zIGEgbmV3IERCdXNIYXNoVGFibGUgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCitEQnVzSGFzaFRhYmxlKgorX2RidXNfaGFzaF90YWJsZV9uZXcgKERCdXNIYXNoVHlwZSAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uIGtleV9mcmVlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gdmFsdWVfZnJlZV9mdW5jdGlvbikKK3sKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGU7CisgIERCdXNNZW1Qb29sICplbnRyeV9wb29sOworICAKKyAgdGFibGUgPSBkYnVzX25ldzAgKERCdXNIYXNoVGFibGUsIDEpOworICBpZiAodGFibGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBlbnRyeV9wb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplb2YgKERCdXNIYXNoRW50cnkpLCBUUlVFKTsKKyAgaWYgKGVudHJ5X3Bvb2wgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHRhYmxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHRhYmxlLT5yZWZjb3VudCA9IDE7CisgIHRhYmxlLT5lbnRyeV9wb29sID0gZW50cnlfcG9vbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoREJVU19TTUFMTF9IQVNIX1RBQkxFID09IF9EQlVTX05fRUxFTUVOVFMgKHRhYmxlLT5zdGF0aWNfYnVja2V0cykpOworICAKKyAgdGFibGUtPmJ1Y2tldHMgPSB0YWJsZS0+c3RhdGljX2J1Y2tldHM7ICAKKyAgdGFibGUtPm5fYnVja2V0cyA9IERCVVNfU01BTExfSEFTSF9UQUJMRTsKKyAgdGFibGUtPm5fZW50cmllcyA9IDA7CisgIHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUgPSBEQlVTX1NNQUxMX0hBU0hfVEFCTEUgKiBSRUJVSUxEX01VTFRJUExJRVI7CisgIHRhYmxlLT5sb19yZWJ1aWxkX3NpemUgPSAwOworICB0YWJsZS0+ZG93bl9zaGlmdCA9IDI4OworICB0YWJsZS0+bWFzayA9IDM7CisgIHRhYmxlLT5rZXlfdHlwZSA9IHR5cGU7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+bWFzayA8IHRhYmxlLT5uX2J1Y2tldHMpOworICAKKyAgc3dpdGNoICh0YWJsZS0+a2V5X3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19IQVNIX0lOVDoKKyAgICBjYXNlIERCVVNfSEFTSF9QT0lOVEVSOgorICAgIGNhc2UgREJVU19IQVNIX1VJTlRQVFI6CisgICAgICB0YWJsZS0+ZmluZF9mdW5jdGlvbiA9IGZpbmRfZGlyZWN0X2Z1bmN0aW9uOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX0hBU0hfU1RSSU5HOgorICAgICAgdGFibGUtPmZpbmRfZnVuY3Rpb24gPSBmaW5kX3N0cmluZ19mdW5jdGlvbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19IQVNIX1RXT19TVFJJTkdTOgorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgIHRhYmxlLT5maW5kX2Z1bmN0aW9uID0gZmluZF90d29fc3RyaW5nc19mdW5jdGlvbjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlVua25vd24gaGFzaCB0YWJsZSB0eXBlIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uID0ga2V5X2ZyZWVfZnVuY3Rpb247CisgIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uID0gdmFsdWVfZnJlZV9mdW5jdGlvbjsKKworICByZXR1cm4gdGFibGU7Cit9CisKKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGEgaGFzaCB0YWJsZS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gYWRkIGEgcmVmZXJlbmNlIHRvLgorICogQHJldHVybnMgdGhlIGhhc2ggdGFibGUuCisgKi8KK0RCdXNIYXNoVGFibGUgKgorX2RidXNfaGFzaF90YWJsZV9yZWYgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICB0YWJsZS0+cmVmY291bnQgKz0gMTsKKyAgCisgIHJldHVybiB0YWJsZTsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGEgaGFzaCB0YWJsZSwKKyAqIGZyZWVpbmcgdGhlIGhhc2ggdGFibGUgaWYgdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gcmVtb3ZlIGEgcmVmZXJlbmNlIGZyb20uCisgKi8KK3ZvaWQKK19kYnVzX2hhc2hfdGFibGVfdW5yZWYgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICB0YWJsZS0+cmVmY291bnQgLT0gMTsKKworICBpZiAodGFibGUtPnJlZmNvdW50ID09IDApCisgICAgeworI2lmIDAKKyAgICAgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAgICAgREJ1c0hhc2hFbnRyeSAqbmV4dDsKKyAgICAgIGludCBpOworCisgICAgICAvKiBGcmVlIHRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bl9idWNrZXRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBlbnRyeSA9IHRhYmxlLT5idWNrZXRzW2ldOworICAgICAgICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuZXh0ID0gZW50cnktPm5leHQ7CisKKyAgICAgICAgICAgICAgZnJlZV9lbnRyeSAodGFibGUsIGVudHJ5KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGVudHJ5ID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAgICAgaW50IGk7CisKKyAgICAgIC8qIEZyZWUgdGhlIGVudHJpZXMgaW4gdGhlIHRhYmxlLiAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5uX2J1Y2tldHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5ID0gdGFibGUtPmJ1Y2tldHNbaV07CisgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZyZWVfZW50cnlfZGF0YSAodGFibGUsIGVudHJ5KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIC8qIFdlIGNhbiBkbyB0aGlzIHZlcnkgcXVpY2tseSB3aXRoIG1lbW9yeSBwb29scyA7LSkgKi8KKyAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHRhYmxlLT5lbnRyeV9wb29sKTsKKyNlbmRpZgorICAgICAgCisgICAgICAvKiBGcmVlIHRoZSBidWNrZXQgYXJyYXksIGlmIGl0IHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICovCisgICAgICBpZiAodGFibGUtPmJ1Y2tldHMgIT0gdGFibGUtPnN0YXRpY19idWNrZXRzKQorICAgICAgICBkYnVzX2ZyZWUgKHRhYmxlLT5idWNrZXRzKTsKKworICAgICAgZGJ1c19mcmVlICh0YWJsZSk7CisgICAgfQorfQorCisvKioKKyAqIFJlbW92ZWQgYWxsIGVudHJpZXMgZnJvbSBhIGhhc2ggdGFibGUuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlIHRvIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tLgorICovCit2b2lkCitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkoJml0ZXIpOworICAgIH0KK30KKworc3RhdGljIERCdXNIYXNoRW50cnkqCithbGxvY19lbnRyeSAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKHRhYmxlLT5lbnRyeV9wb29sKTsKKyAgCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfZW50cnlfZGF0YSAoREJ1c0hhc2hUYWJsZSAgKnRhYmxlLAorCQkgREJ1c0hhc2hFbnRyeSAgKmVudHJ5KQoreworICBpZiAodGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworICBpZiAodGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgKnRhYmxlLAorICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgKmVudHJ5KQoreworICBmcmVlX2VudHJ5X2RhdGEgKHRhYmxlLCBlbnRyeSk7CisgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHRhYmxlLT5lbnRyeV9wb29sLCBlbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfZW50cnkgKERCdXNIYXNoVGFibGUgICp0YWJsZSwKKyAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgKmVudHJ5KQoreworICBfZGJ1c19hc3NlcnQgKHRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGJ1Y2tldCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICgqYnVja2V0ICE9IE5VTEwpOyAgCisgIF9kYnVzX2Fzc2VydCAoZW50cnkgIT0gTlVMTCk7CisgIAorICBpZiAoKmJ1Y2tldCA9PSBlbnRyeSkKKyAgICAqYnVja2V0ID0gZW50cnktPm5leHQ7CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzSGFzaEVudHJ5ICpwcmV2OworICAgICAgcHJldiA9ICpidWNrZXQ7CisKKyAgICAgIHdoaWxlIChwcmV2LT5uZXh0ICE9IGVudHJ5KQorICAgICAgICBwcmV2ID0gcHJldi0+bmV4dDsgICAgICAKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChwcmV2ICE9IE5VTEwpOworCisgICAgICBwcmV2LT5uZXh0ID0gZW50cnktPm5leHQ7CisgICAgfQorICAKKyAgdGFibGUtPm5fZW50cmllcyAtPSAxOworICBmcmVlX2VudHJ5ICh0YWJsZSwgZW50cnkpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgaGFzaCB0YWJsZSBpdGVyYXRvci4gVG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzIGluIGEKKyAqIGhhc2ggdGFibGUsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUgKHRoZSBwcmludGYgYXNzdW1lcyBhIGhhc2gKKyAqIGZyb20gc3RyaW5ncyB0byBzdHJpbmdzIG9idmlvdXNseSk6CisgKgorICogQGNvZGUKKyAqIERCdXNIYXNoSXRlciBpdGVyOworICoKKyAqIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICogd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgKiAgIHsKKyAqICAgICAgcHJpbnRmICgiVGhlIGZpcnN0IGtleSBpcyAlcyBhbmQgdmFsdWUgaXMgJXNcbiIsCisgKiAgICAgICAgICAgICAgX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlciksCisgKiAgICAgICAgICAgICAgX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpKTsKKyAqICAgfQorICogCisgKiAKKyAqIEBlbmRjb2RlCisgKgorICogVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkIHBvaW50aW5nICJvbmUgYmVmb3JlIiB0aGUgZmlyc3QgaGFzaAorICogZW50cnkuIFRoZSBmaXJzdCBjYWxsIHRvIF9kYnVzX2hhc2hfaXRlcl9uZXh0KCkgbW92ZXMgaXQgb250bworICogdGhlIGZpcnN0IHZhbGlkIGVudHJ5IG9yIHJldHVybnMgI0ZBTFNFIGlmIHRoZSBoYXNoIHRhYmxlIGlzCisgKiBlbXB0eS4gU3Vic2VxdWVudCBjYWxscyBtb3ZlIHRvIHRoZSBuZXh0IHZhbGlkIGVudHJ5IG9yIHJldHVybgorICogI0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVudHJpZXMuCisgKgorICogTm90ZSB0aGF0IGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc2FmZSB0byByZW1vdmUgYSBoYXNoIGVudHJ5IGR1cmluZworICogaXRlcmF0aW9uLCBidXQgaXQgaXMgbm90IHNhZmUgdG8gYWRkIGEgaGFzaCBlbnRyeS4KKyAqIAorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlIHRvIGl0ZXJhdGUgb3Zlci4KKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvciB0byBpbml0aWFsaXplLgorICovCit2b2lkCitfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChEQnVzSGFzaEl0ZXIpID09IHNpemVvZiAoREJ1c1JlYWxIYXNoSXRlcikpOworICAKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICByZWFsLT50YWJsZSA9IHRhYmxlOworICByZWFsLT5idWNrZXQgPSBOVUxMOworICByZWFsLT5lbnRyeSA9IE5VTEw7CisgIHJlYWwtPm5leHRfZW50cnkgPSBOVUxMOworICByZWFsLT5uZXh0X2J1Y2tldCA9IDA7CisgIHJlYWwtPm5fZW50cmllc19vbl9pbml0ID0gdGFibGUtPm5fZW50cmllczsKK30KKworLyoqCisgKiBNb3ZlIHRoZSBoYXNoIGl0ZXJhdG9yIGZvcndhcmQgb25lIHN0ZXAsIHRvIHRoZSBuZXh0IGhhc2ggZW50cnkuCisgKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgX2RidXNfaGFzaF9pdGVyX2luaXQoKSBleHBsYWlucyBpbiBtb3JlCisgKiBkZXRhaWwuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHRvIG1vdmUgZm9yd2FyZC4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIHRvIG1vdmUgdG8uCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChEQnVzSGFzaEl0ZXIpID09IHNpemVvZiAoREJ1c1JlYWxIYXNoSXRlcikpOworICAKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICAvKiBpZiB0aGlzIGFzc2VydGlvbiBmYWlsZWQgc29tZW9uZSBwcm9iYWJseSBhZGRlZCBoYXNoIGVudHJpZXMKKyAgICogZHVyaW5nIGl0ZXJhdGlvbiwgd2hpY2ggaXMgYmFkLgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5uX2VudHJpZXNfb25faW5pdCA+PSByZWFsLT50YWJsZS0+bl9lbnRyaWVzKTsKKyAgCisgIC8qIFJlbWVtYmVyIHRoYXQgcmVhbC0+ZW50cnkgbWF5IGhhdmUgYmVlbiBkZWxldGVkICovCisgIAorICB3aGlsZSAocmVhbC0+bmV4dF9lbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5uZXh0X2J1Y2tldCA+PSByZWFsLT50YWJsZS0+bl9idWNrZXRzKQorICAgICAgICB7CisgICAgICAgICAgLyogaW52YWxpZGF0ZSBpdGVyIGFuZCByZXR1cm4gZmFsc2UgKi8KKyAgICAgICAgICByZWFsLT5lbnRyeSA9IE5VTEw7CisgICAgICAgICAgcmVhbC0+dGFibGUgPSBOVUxMOworICAgICAgICAgIHJlYWwtPmJ1Y2tldCA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJlYWwtPmJ1Y2tldCA9ICYocmVhbC0+dGFibGUtPmJ1Y2tldHNbcmVhbC0+bmV4dF9idWNrZXRdKTsKKyAgICAgIHJlYWwtPm5leHRfZW50cnkgPSAqKHJlYWwtPmJ1Y2tldCk7CisgICAgICByZWFsLT5uZXh0X2J1Y2tldCArPSAxOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPm5leHRfZW50cnkgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+YnVja2V0ICE9IE5VTEwpOworICAKKyAgcmVhbC0+ZW50cnkgPSByZWFsLT5uZXh0X2VudHJ5OworICByZWFsLT5uZXh0X2VudHJ5ID0gcmVhbC0+ZW50cnktPm5leHQ7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGVudHJ5IGZyb20gdGhlIGhhc2ggdGFibGUuCisgKiBJZiBhIGtleV9mcmVlX2Z1bmN0aW9uIG9yIHZhbHVlX2ZyZWVfZnVuY3Rpb24KKyAqIHdhcyBwcm92aWRlZCB0byBfZGJ1c19oYXNoX3RhYmxlX25ldygpLAorICogZnJlZXMgdGhlIGtleSBhbmQvb3IgdmFsdWUgZm9yIHRoaXMgZW50cnkuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK3ZvaWQKK19kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkgKERCdXNIYXNoSXRlciAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+YnVja2V0ICE9IE5VTEwpOworICAKKyAgcmVtb3ZlX2VudHJ5IChyZWFsLT50YWJsZSwgcmVhbC0+YnVja2V0LCByZWFsLT5lbnRyeSk7CisKKyAgcmVhbC0+ZW50cnkgPSBOVUxMOyAvKiBtYWtlIGl0IGNyYXNoIGlmIHlvdSB0cnkgdG8gdXNlIHRoaXMgZW50cnkgKi8KK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBlbnRyeS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKERCdXNIYXNoSXRlciAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHJlYWwtPmVudHJ5LT52YWx1ZTsKK30KKworLyoqCisgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBlbnRyeS4KKyAqIElmIHRoZSBoYXNoIHRhYmxlIGhhcyBhIHZhbHVlX2ZyZWVfZnVuY3Rpb24KKyAqIGl0IHdpbGwgYmUgdXNlZCB0byBmcmVlIHRoZSBwcmV2aW91cyB2YWx1ZS4KKyAqIFRoZSBoYXNoIHRhYmxlIHdpbGwgb3duIHRoZSBwYXNzZWQtaW4gdmFsdWUKKyAqIChpdCB3aWxsIG5vdCBiZSBjb3BpZWQpLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBoYXNoIHRhYmxlIGl0ZXJhdG9yLgorICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCisgKi8KK3ZvaWQKK19kYnVzX2hhc2hfaXRlcl9zZXRfdmFsdWUgKERCdXNIYXNoSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworCisgIGlmIChyZWFsLT50YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiAmJiB2YWx1ZSAhPSByZWFsLT5lbnRyeS0+dmFsdWUpICAgIAorICAgICgqIHJlYWwtPnRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKSAocmVhbC0+ZW50cnktPnZhbHVlKTsKKyAgCisgIHJlYWwtPmVudHJ5LT52YWx1ZSA9IHZhbHVlOworfQorCisvKioKKyAqIEdldHMgdGhlIGtleSBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCisgKiBPbmx5IHdvcmtzIGZvciBoYXNoIHRhYmxlcyBvZiB0eXBlICNEQlVTX0hBU0hfSU5ULgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBoYXNoIHRhYmxlIGl0ZXJhdG9yLgorICovCitpbnQKK19kYnVzX2hhc2hfaXRlcl9nZXRfaW50X2tleSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICByZXR1cm4gX0RCVVNfUE9JTlRFUl9UT19JTlQgKHJlYWwtPmVudHJ5LT5rZXkpOworfQorCisvKioKKyAqIEdldHMgdGhlIGtleSBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCisgKiBPbmx5IHdvcmtzIGZvciBoYXNoIHRhYmxlcyBvZiB0eXBlICNEQlVTX0hBU0hfVUlOVFBUUi4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqLwordWludHB0cl90CitfZGJ1c19oYXNoX2l0ZXJfZ2V0X3VpbnRwdHJfa2V5IChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworCisgIHJldHVybiAodWludHB0cl90KSByZWFsLT5lbnRyeS0+a2V5OworfQorCisvKioKKyAqIEdldHMgdGhlIGtleSBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCisgKiBPbmx5IHdvcmtzIGZvciBoYXNoIHRhYmxlcyBvZiB0eXBlICNEQlVTX0hBU0hfU1RSSU5HCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqLworY29uc3QgY2hhcioKK19kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICByZXR1cm4gcmVhbC0+ZW50cnktPmtleTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogR2V0cyB0aGUga2V5IGZvciB0aGUgY3VycmVudCBlbnRyeS4KKyAqIE9ubHkgd29ya3MgZm9yIGhhc2ggdGFibGVzIG9mIHR5cGUgI0RCVVNfSEFTSF9UV09fU1RSSU5HUworICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19oYXNoX2l0ZXJfZ2V0X3R3b19zdHJpbmdzX2tleSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICByZXR1cm4gcmVhbC0+ZW50cnktPmtleTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qKgorICogQSBsb3ctbGV2ZWwgYnV0IGVmZmljaWVudCBpbnRlcmZhY2UgZm9yIG1hbmlwdWxhdGluZyB0aGUgaGFzaAorICogdGFibGUuICBJdCdzIGVmZmljaWVudCBiZWNhdXNlIHlvdSBjYW4gZ2V0LCBzZXQsIGFuZCBvcHRpb25hbGx5CisgKiBjcmVhdGUgdGhlIGhhc2ggZW50cnkgd2hpbGUgb25seSBydW5uaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIG9uZQorICogdGltZS4KKyAqCisgKiBOb3RlIHRoYXQgd2hpbGUgY2FsbGluZyBfZGJ1c19oYXNoX2l0ZXJfbmV4dCgpIG9uIHRoZSBpdGVyYXRvcgorICogZmlsbGVkIGluIGJ5IHRoaXMgZnVuY3Rpb24gbWF5IHdvcmssIGl0J3MgY29tcGxldGVseQorICogdW5kZWZpbmVkIHdoaWNoIGVudHJpZXMgYXJlIGFmdGVyIHRoaXMgaXRlciBhbmQgd2hpY2gKKyAqIGFyZSBiZWZvcmUgaXQuIFNvIGl0IHdvdWxkIGJlIHNpbGx5IHRvIGl0ZXJhdGUgdXNpbmcgdGhpcworICogaXRlcmF0b3IuCisgKgorICogSWYgdGhlIGhhc2ggZW50cnkgaXMgY3JlYXRlZCwgaXRzIHZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQKKyAqIHRvIGFsbCBiaXRzIHplcm8uCisgKgorICogI0ZBTFNFIG1heSBiZSByZXR1cm5lZCBkdWUgdG8gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgb3IKKyAqIGJlY2F1c2UgY3JlYXRlX2lmX25vdF9mb3VuZCB3YXMgI0ZBTFNFIGFuZCB0aGUgZW50cnkKKyAqIGRpZCBub3QgZXhpc3QuCisgKgorICogSWYgY3JlYXRlX2lmX25vdF9mb3VuZCBpcyAjVFJVRSBhbmQgdGhlIGVudHJ5IGlzIGNyZWF0ZWQsIHRoZSBoYXNoCisgKiB0YWJsZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGtleSB0aGF0J3MgcGFzc2VkIGluLgorICoKKyAqIEZvciBhIGhhc2ggdGFibGUgb2YgdHlwZSAjREJVU19IQVNIX0lOVCwgY2FzdCB0aGUgaW50CisgKiBrZXkgdG8gdGhlIGtleSBwYXJhbWV0ZXIgdXNpbmcgI19EQlVTX0lOVF9UT19QT0lOVEVSKCkuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2gga2V5LgorICogQHBhcmFtIGNyZWF0ZV9pZl9ub3RfZm91bmQgaWYgI1RSVUUsIGNyZWF0ZSB0aGUgZW50cnkgaWYgaXQgZGlkbid0IGV4aXN0LgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgaGFzaCBlbnRyeSBub3cgZXhpc3RzIChhbmQgdGhlIGl0ZXJhdG9yIGlzIHRodXMgdmFsaWQpLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoREJ1c0hhc2hJdGVyKSA9PSBzaXplb2YgKERCdXNSZWFsSGFzaEl0ZXIpKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCBrZXksIGNyZWF0ZV9pZl9ub3RfZm91bmQsICZidWNrZXQsIE5VTEwpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHJlYWwtPnRhYmxlID0gdGFibGU7CisgIHJlYWwtPmJ1Y2tldCA9IGJ1Y2tldDsKKyAgcmVhbC0+ZW50cnkgPSBlbnRyeTsKKyAgcmVhbC0+bmV4dF9lbnRyeSA9IGVudHJ5LT5uZXh0OworICByZWFsLT5uZXh0X2J1Y2tldCA9IChidWNrZXQgLSB0YWJsZS0+YnVja2V0cykgKyAxOworICByZWFsLT5uX2VudHJpZXNfb25faW5pdCA9IHRhYmxlLT5uX2VudHJpZXM7IAorCisgIF9kYnVzX2Fzc2VydCAoJih0YWJsZS0+YnVja2V0c1tyZWFsLT5uZXh0X2J1Y2tldC0xXSkgPT0gcmVhbC0+YnVja2V0KTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYWRkX2FsbG9jYXRlZF9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAqKipidWNrZXQpCit7CisgIERCdXNIYXNoRW50cnkgKipiOyAgCisgIAorICBlbnRyeS0+a2V5ID0ga2V5OworICAKKyAgYiA9ICYodGFibGUtPmJ1Y2tldHNbaWR4XSk7CisgIGVudHJ5LT5uZXh0ID0gKmI7CisgICpiID0gZW50cnk7CisKKyAgaWYgKGJ1Y2tldCkKKyAgICAqYnVja2V0ID0gYjsKKyAgCisgIHRhYmxlLT5uX2VudHJpZXMgKz0gMTsKKworICAvKiBub3RlIHdlIE9OTFkgcmVidWlsZCB3aGVuIEFERElORyAtIGJlY2F1c2UgeW91IGNhbiBpdGVyYXRlIG92ZXIgYQorICAgKiB0YWJsZSBhbmQgcmVtb3ZlIGVudHJpZXMgc2FmZWx5LgorICAgKi8KKyAgaWYgKHRhYmxlLT5uX2VudHJpZXMgPj0gdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSB8fAorICAgICAgdGFibGUtPm5fZW50cmllcyA8IHRhYmxlLT5sb19yZWJ1aWxkX3NpemUpCisgICAgcmVidWlsZF90YWJsZSAodGFibGUpOworfQorCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2FkZF9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLCAKKyAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCkKK3sKKyAgREJ1c0hhc2hFbnRyeSAgKmVudHJ5OworCisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBlbnRyeSA9IGFsbG9jX2VudHJ5ICh0YWJsZSk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChidWNrZXQpCisgICAgICAgICAgICAqYnVja2V0ID0gTlVMTDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVudHJ5ID0gKERCdXNIYXNoRW50cnkqKSBwcmVhbGxvY2F0ZWQ7CisgICAgfQorCisgIGFkZF9hbGxvY2F0ZWRfZW50cnkgKHRhYmxlLCBlbnRyeSwgaWR4LCBrZXksIGJ1Y2tldCk7CisKKyAgcmV0dXJuIGVudHJ5OworfQorCisvKiBUaGlzIGlzIGdfc3RyX2hhc2ggZnJvbSBHTGliIHdoaWNoIHdhcworICogZXh0ZW5zaXZlbHkgZGlzY3Vzc2VkL3Rlc3RlZC9wcm9maWxlZAorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitzdHJpbmdfaGFzaCAoY29uc3QgY2hhciAqc3RyKQoreworICBjb25zdCBjaGFyICpwID0gc3RyOworICB1bnNpZ25lZCBpbnQgaCA9ICpwOworCisgIGlmIChoKQorICAgIGZvciAocCArPSAxOyAqcCAhPSAnXDAnOyBwKyspCisgICAgICBoID0gKGggPDwgNSkgLSBoICsgKnA7CisKKyAgcmV0dXJuIGg7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKiBUaGlzIGhhc2hlcyBhIG1lbW9yeSBibG9jayB3aXRoIHR3byBudWwtdGVybWluYXRlZCBzdHJpbmdzCisgKiBpbiBpdCwgdXNlZCBpbiBkYnVzLW9iamVjdC1yZWdpc3RyeS5jIGF0IHRoZSBtb21lbnQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3R3b19zdHJpbmdzX2hhc2ggKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgY29uc3QgY2hhciAqcCA9IHN0cjsKKyAgdW5zaWduZWQgaW50IGggPSAqcDsKKworICBpZiAoaCkKKyAgICBmb3IgKHAgKz0gMTsgKnAgIT0gJ1wwJzsgcCsrKQorICAgICAgaCA9IChoIDw8IDUpIC0gaCArICpwOworCisgIGZvciAocCArPSAxOyAqcCAhPSAnXDAnOyBwKyspCisgICAgaCA9IChoIDw8IDUpIC0gaCArICpwOworICAKKyAgcmV0dXJuIGg7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKiogS2V5IGNvbXBhcmlzb24gZnVuY3Rpb24gKi8KK3R5cGVkZWYgaW50ICgqIEtleUNvbXBhcmVGdW5jKSAoY29uc3Qgdm9pZCAqa2V5X2EsIGNvbnN0IHZvaWQgKmtleV9iKTsKKworc3RhdGljIERCdXNIYXNoRW50cnkqCitmaW5kX2dlbmVyaWNfZnVuY3Rpb24gKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgS2V5Q29tcGFyZUZ1bmMgICAgICAgIGNvbXBhcmVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAqKipidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIGlmIChidWNrZXQpCisgICAgKmJ1Y2tldCA9IE5VTEw7CisKKyAgLyogU2VhcmNoIGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGlzIGJ1Y2tldC4gKi8KKyAgZW50cnkgPSB0YWJsZS0+YnVja2V0c1tpZHhdOworICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoKGNvbXBhcmVfZnVuYyA9PSBOVUxMICYmIGtleSA9PSBlbnRyeS0+a2V5KSB8fAorICAgICAgICAgIChjb21wYXJlX2Z1bmMgIT0gTlVMTCAmJiAoKiBjb21wYXJlX2Z1bmMpIChrZXksIGVudHJ5LT5rZXkpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJ1Y2tldCkKKyAgICAgICAgICAgICpidWNrZXQgPSAmKHRhYmxlLT5idWNrZXRzW2lkeF0pOworCisgICAgICAgICAgaWYgKHByZWFsbG9jYXRlZCkKKyAgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfZnJlZV9wcmVhbGxvY2F0ZWRfZW50cnkgKHRhYmxlLCBwcmVhbGxvY2F0ZWQpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKworICBpZiAoY3JlYXRlX2lmX25vdF9mb3VuZCkKKyAgICBlbnRyeSA9IGFkZF9lbnRyeSAodGFibGUsIGlkeCwga2V5LCBidWNrZXQsIHByZWFsbG9jYXRlZCk7CisgIGVsc2UgaWYgKHByZWFsbG9jYXRlZCkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5ICh0YWJsZSwgcHJlYWxsb2NhdGVkKTsKKyAgCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIERCdXNIYXNoRW50cnkqCitmaW5kX3N0cmluZ19mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICB1bnNpZ25lZCBpbnQgaWR4OworICAKKyAgaWR4ID0gc3RyaW5nX2hhc2ggKGtleSkgJiB0YWJsZS0+bWFzazsKKworICByZXR1cm4gZmluZF9nZW5lcmljX2Z1bmN0aW9uICh0YWJsZSwga2V5LCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChLZXlDb21wYXJlRnVuYykgc3RyY21wLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFsbG9jYXRlZCk7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCitzdGF0aWMgaW50Cit0d29fc3RyaW5nc19jbXAgKGNvbnN0IGNoYXIgKmEsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmIpCit7CisgIHNpemVfdCBsZW5fYTsKKyAgc2l6ZV90IGxlbl9iOworICBpbnQgcmVzOworICAKKyAgcmVzID0gc3RyY21wIChhLCBiKTsKKyAgaWYgKHJlcyAhPSAwKQorICAgIHJldHVybiByZXM7CisKKyAgbGVuX2EgPSBzdHJsZW4gKGEpOworICBsZW5fYiA9IHN0cmxlbiAoYik7CisKKyAgcmV0dXJuIHN0cmNtcCAoYSArIGxlbl9hICsgMSwgYiArIGxlbl9iICsgMSk7Cit9CisjZW5kaWYKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyBEQnVzSGFzaEVudHJ5KgorZmluZF90d29fc3RyaW5nc19mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIHVuc2lnbmVkIGludCBpZHg7CisgIAorICBpZHggPSB0d29fc3RyaW5nc19oYXNoIChrZXkpICYgdGFibGUtPm1hc2s7CisKKyAgcmV0dXJuIGZpbmRfZ2VuZXJpY19mdW5jdGlvbiAodGFibGUsIGtleSwgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS2V5Q29tcGFyZUZ1bmMpIHR3b19zdHJpbmdzX2NtcCwgY3JlYXRlX2lmX25vdF9mb3VuZCwgYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQpOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworc3RhdGljIERCdXNIYXNoRW50cnkqCitmaW5kX2RpcmVjdF9mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICB1bnNpZ25lZCBpbnQgaWR4OworICAKKyAgaWR4ID0gUkFORE9NX0lOREVYICh0YWJsZSwga2V5KSAmIHRhYmxlLT5tYXNrOworCisKKyAgcmV0dXJuIGZpbmRfZ2VuZXJpY19mdW5jdGlvbiAodGFibGUsIGtleSwgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFsbG9jYXRlZCk7Cit9CisKK3N0YXRpYyB2b2lkCityZWJ1aWxkX3RhYmxlIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgaW50IG9sZF9zaXplOworICBpbnQgbmV3X2J1Y2tldHM7CisgIERCdXNIYXNoRW50cnkgKipvbGRfYnVja2V0czsKKyAgREJ1c0hhc2hFbnRyeSAqKm9sZF9jaGFpbjsKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIGRidXNfYm9vbF90IGdyb3dpbmc7CisgIAorICAvKgorICAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGJ1Y2tldCBhcnJheSwgYW5kIHNldCB1cAorICAgKiBoYXNoaW5nIGNvbnN0YW50cyBmb3IgbmV3IGFycmF5IHNpemUuCisgICAqLworCisgIGdyb3dpbmcgPSB0YWJsZS0+bl9lbnRyaWVzID49IHRhYmxlLT5oaV9yZWJ1aWxkX3NpemU7CisgIAorICBvbGRfc2l6ZSA9IHRhYmxlLT5uX2J1Y2tldHM7CisgIG9sZF9idWNrZXRzID0gdGFibGUtPmJ1Y2tldHM7CisKKyAgaWYgKGdyb3dpbmcpCisgICAgeworICAgICAgLyogb3ZlcmZsb3cgcGFyYW5vaWEgKi8KKyAgICAgIGlmICh0YWJsZS0+bl9idWNrZXRzIDwgX0RCVVNfSU5UX01BWCAvIDQgJiYKKyAgICAgICAgICB0YWJsZS0+ZG93bl9zaGlmdCA+PSAwKQorICAgICAgICBuZXdfYnVja2V0cyA9IHRhYmxlLT5uX2J1Y2tldHMgKiA0OworICAgICAgZWxzZQorICAgICAgICByZXR1cm47IC8qIGNhbid0IGdyb3cgYW55bW9yZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld19idWNrZXRzID0gdGFibGUtPm5fYnVja2V0cyAvIDQ7CisgICAgICBpZiAobmV3X2J1Y2tldHMgPCBEQlVTX1NNQUxMX0hBU0hfVEFCTEUpCisgICAgICAgIHJldHVybjsgLyogZG9uJ3QgYm90aGVyIHNocmlua2luZyB0aGlzIGZhciAqLworICAgIH0KKworICB0YWJsZS0+YnVja2V0cyA9IGRidXNfbmV3MCAoREJ1c0hhc2hFbnRyeSosIG5ld19idWNrZXRzKTsKKyAgaWYgKHRhYmxlLT5idWNrZXRzID09IE5VTEwpCisgICAgeworICAgICAgLyogb3V0IG9mIG1lbW9yeSwgeWF5IC0ganVzdCBkb24ndCByZWFsbG9jYXRlLCB0aGUgdGFibGUgd2lsbAorICAgICAgICogc3RpbGwgd29yaywgYWxiZWl0IG1vcmUgc2xvd2x5LgorICAgICAgICovCisgICAgICB0YWJsZS0+YnVja2V0cyA9IG9sZF9idWNrZXRzOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0YWJsZS0+bl9idWNrZXRzID0gbmV3X2J1Y2tldHM7CisgIAorICBpZiAoZ3Jvd2luZykKKyAgICB7CisgICAgICB0YWJsZS0+bG9fcmVidWlsZF9zaXplID0gdGFibGUtPmhpX3JlYnVpbGRfc2l6ZTsKKyAgICAgIHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUgKj0gNDsKKyAgICAgIAorICAgICAgdGFibGUtPmRvd25fc2hpZnQgLT0gMjsgICAgICAgICAgICAgICAvKiBrZWVwIDIgbW9yZSBoaWdoIGJpdHMgKi8KKyAgICAgIHRhYmxlLT5tYXNrID0gKHRhYmxlLT5tYXNrIDw8IDIpICsgMzsgLyoga2VlcCAyIG1vcmUgaGlnaCBiaXRzICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSA9IHRhYmxlLT5sb19yZWJ1aWxkX3NpemU7CisgICAgICB0YWJsZS0+bG9fcmVidWlsZF9zaXplIC89IDQ7CisKKyAgICAgIHRhYmxlLT5kb3duX3NoaWZ0ICs9IDI7ICAgICAgICAgLyoga2VlcCAyIGZld2VyIGhpZ2ggYml0cyAqLworICAgICAgdGFibGUtPm1hc2sgPSB0YWJsZS0+bWFzayA+PiAyOyAvKiBrZWVwIDIgZmV3ZXIgaGlnaCBiaXRzICovCisgICAgfQorCisjaWYgMAorICBwcmludGYgKCIlcyB0YWJsZSB0byBsbyA9ICVkIGhpID0gJWQgZG93bnNoaWZ0ID0gJWQgbWFzayA9IDB4JXhcbiIsCisgICAgICAgICAgZ3Jvd2luZyA/ICJHUk9XIiA6ICJTSFJJTksiLAorICAgICAgICAgIHRhYmxlLT5sb19yZWJ1aWxkX3NpemUsCisgICAgICAgICAgdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSwKKyAgICAgICAgICB0YWJsZS0+ZG93bl9zaGlmdCwKKyAgICAgICAgICB0YWJsZS0+bWFzayk7CisjZW5kaWYKKyAgCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmxvX3JlYnVpbGRfc2l6ZSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+aGlfcmVidWlsZF9zaXplID4gdGFibGUtPmxvX3JlYnVpbGRfc2l6ZSk7CisgIF9kYnVzX2Fzc2VydCAodGFibGUtPm1hc2sgIT0gMCk7CisgIC8qIHRoZSBtYXNrIGlzIGVzc2VudGlhbGx5IHRoZSBtYXggaW5kZXggKi8KKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+bWFzayA8IHRhYmxlLT5uX2J1Y2tldHMpOworICAKKyAgLyoKKyAgICogUmVoYXNoIGFsbCBvZiB0aGUgZXhpc3RpbmcgZW50cmllcyBpbnRvIHRoZSBuZXcgYnVja2V0IGFycmF5LgorICAgKi8KKworICBmb3IgKG9sZF9jaGFpbiA9IG9sZF9idWNrZXRzOyBvbGRfc2l6ZSA+IDA7IG9sZF9zaXplLS0sIG9sZF9jaGFpbisrKQorICAgIHsKKyAgICAgIGZvciAoZW50cnkgPSAqb2xkX2NoYWluOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9ICpvbGRfY2hhaW4pCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4OworICAgICAgICAgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgICAgICAgICAgCisgICAgICAgICAgKm9sZF9jaGFpbiA9IGVudHJ5LT5uZXh0OworICAgICAgICAgIHN3aXRjaCAodGFibGUtPmtleV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBEQlVTX0hBU0hfU1RSSU5HOgorICAgICAgICAgICAgICBpZHggPSBzdHJpbmdfaGFzaCAoZW50cnktPmtleSkgJiB0YWJsZS0+bWFzazsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERCVVNfSEFTSF9UV09fU1RSSU5HUzoKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICAgICAgICAgIGlkeCA9IHR3b19zdHJpbmdzX2hhc2ggKGVudHJ5LT5rZXkpICYgdGFibGUtPm1hc2s7CisjZWxzZQorICAgICAgICAgICAgICBpZHggPSAwOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0d28tc3RyaW5ncyBpcyBub3QgZW5hYmxlZCIpOworI2VuZGlmCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEQlVTX0hBU0hfSU5UOgorICAgICAgICAgICAgY2FzZSBEQlVTX0hBU0hfVUlOVFBUUjoKKyAgICAgICAgICAgIGNhc2UgREJVU19IQVNIX1BPSU5URVI6CisgICAgICAgICAgICAgIGlkeCA9IFJBTkRPTV9JTkRFWCAodGFibGUsIGVudHJ5LT5rZXkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlkeCA9IDA7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlVua25vd24gaGFzaCB0YWJsZSB0eXBlIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGJ1Y2tldCA9ICYodGFibGUtPmJ1Y2tldHNbaWR4XSk7CisgICAgICAgICAgZW50cnktPm5leHQgPSAqYnVja2V0OworICAgICAgICAgICpidWNrZXQgPSBlbnRyeTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIEZyZWUgdGhlIG9sZCBidWNrZXQgYXJyYXksIGlmIGl0IHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICovCisKKyAgaWYgKG9sZF9idWNrZXRzICE9IHRhYmxlLT5zdGF0aWNfYnVja2V0cykKKyAgICBkYnVzX2ZyZWUgKG9sZF9idWNrZXRzKTsKK30KKworLyoqCisgKiBMb29rcyB1cCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gc3RyaW5nIGluIGEgaGFzaCB0YWJsZQorICogb2YgdHlwZSAjREJVU19IQVNIX1NUUklORy4gUmV0dXJucyAlTlVMTCBpZiB0aGUgdmFsdWUKKyAqIGlzIG5vdCBwcmVzZW50LiAoQSBub3QtcHJlc2VudCBlbnRyeSBpcyBpbmRpc3Rpbmd1aXNoYWJsZQorICogZnJvbSBhbiBlbnRyeSB3aXRoIGEgdmFsdWUgb2YgJU5VTEwuKQorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgc3RyaW5nIHRvIGxvb2sgdXAuCisgKiBAcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGhhc2ggZW50cnkuCisgKi8KK3ZvaWQqCitfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICprZXkpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworICAKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCAoY2hhciopIGtleSwgRkFMU0UsIE5VTEwsIE5VTEwpOworCisgIGlmIChlbnRyeSkKKyAgICByZXR1cm4gZW50cnktPnZhbHVlOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlCisgKiBvZiB0eXBlICNEQlVTX0hBU0hfVFdPX1NUUklOR1MuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIHN0cmluZyB0byBsb29rIHVwLgorICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBoYXNoIGVudHJ5LgorICovCit2b2lkKgorX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdHdvX3N0cmluZ3MgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1RXT19TVFJJTkdTKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgKGNoYXIqKSBrZXksIEZBTFNFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkpCisgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBMb29rcyB1cCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gaW50ZWdlciBpbiBhIGhhc2ggdGFibGUKKyAqIG9mIHR5cGUgI0RCVVNfSEFTSF9JTlQuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGludGVnZXIgdG8gbG9vayB1cC4KKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBlbnRyeS4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX0lOVCk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpLCBGQUxTRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qIGRpc2FibGVkIHNpbmNlIGl0J3Mgb25seSB1c2VkIGZvciB0ZXN0aW5nICovCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBpbnRlZ2VyIGluIGEgaGFzaCB0YWJsZQorICogb2YgdHlwZSAjREJVU19IQVNIX1BPSU5URVIuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGludGVnZXIgdG8gbG9vayB1cC4KKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBlbnRyeS4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfdGFibGVfbG9va3VwX3BvaW50ZXIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqa2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfUE9JTlRFUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIGtleSwgRkFMU0UsIE5VTEwsIE5VTEwpOworCisgIGlmIChlbnRyeSkKKyAgICByZXR1cm4gZW50cnktPnZhbHVlOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBpbnRlZ2VyIGluIGEgaGFzaCB0YWJsZQorICogb2YgdHlwZSAjREJVU19IQVNIX1VJTlRQVFIuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGludGVnZXIgdG8gbG9vayB1cC4KKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBlbnRyeS4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICAgICAga2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfVUlOVFBUUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsICh2b2lkKikga2V5LCBGQUxTRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICprZXkpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OworICAKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1NUUklORyk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIChjaGFyKikga2V5LCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIHJlbW92ZV9lbnRyeSAodGFibGUsIGJ1Y2tldCwgZW50cnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV90d29fc3RyaW5ncyAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqa2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKyAgREJ1c0hhc2hFbnRyeSAqKmJ1Y2tldDsKKyAgCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9UV09fU1RSSU5HUyk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIChjaGFyKikga2V5LCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIHJlbW92ZV9lbnRyeSAodGFibGUsIGJ1Y2tldCwgZW50cnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9pbnQgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBrZXkpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OworICAKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX0lOVCk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpLCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisgIAorICBpZiAoZW50cnkpCisgICAgeworICAgICAgcmVtb3ZlX2VudHJ5ICh0YWJsZSwgYnVja2V0LCBlbnRyeSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKiBkaXNhYmxlZCBzaW5jZSBpdCdzIG9ubHkgdXNlZCBmb3IgdGVzdGluZyAqLworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9wb2ludGVyIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfUE9JTlRFUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIGtleSwgRkFMU0UsICZidWNrZXQsIE5VTEwpOworICAKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIHJlbW92ZV9lbnRyeSAodGFibGUsIGJ1Y2tldCwgZW50cnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfVUlOVFBUUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsICh2b2lkKikga2V5LCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisgIAorICBpZiAoZW50cnkpCisgICAgeworICAgICAgcmVtb3ZlX2VudHJ5ICh0YWJsZSwgYnVja2V0LCBlbnRyeSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGhhc2ggZW50cnkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4KKyAqIFRoZSBrZXkgYW5kIHZhbHVlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSBzdG9yZWQKKyAqIGluIHRoZSBoYXNoIHRhYmxlIGJ5IHJlZmVyZW5jZS4gSWYgYW4gZW50cnkgd2l0aCB0aGUKKyAqIGdpdmVuIGtleSBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGtleSBhbmQgdmFsdWUKKyAqIGFyZSBvdmVyd3JpdHRlbiAoYW5kIGZyZWVkIGlmIHRoZSBoYXNoIHRhYmxlIGhhcworICogYSBrZXlfZnJlZV9mdW5jdGlvbiBhbmQvb3IgdmFsdWVfZnJlZV9mdW5jdGlvbikuCisgKgorICogUmV0dXJucyAjRkFMU0UgaWYgbWVtb3J5IGZvciB0aGUgbmV3IGhhc2ggZW50cnkKKyAqIGNhbid0IGJlIGFsbG9jYXRlZC4KKyAqIAorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaGFzaCBlbnRyeSBrZXkuCisgKiBAcGFyYW0gdmFsdWUgdGhlIGhhc2ggZW50cnkgdmFsdWUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnZhbHVlKQoreworICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkOworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgKHRhYmxlKTsKKyAgaWYgKHByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkICh0YWJsZSwgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyoqCisgKiBDcmVhdGVzIGEgaGFzaCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorICogVGhlIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHN0b3JlZAorICogaW4gdGhlIGhhc2ggdGFibGUgYnkgcmVmZXJlbmNlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZQorICogZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMga2V5IGFuZCB2YWx1ZQorICogYXJlIG92ZXJ3cml0dGVuIChhbmQgZnJlZWQgaWYgdGhlIGhhc2ggdGFibGUgaGFzCisgKiBhIGtleV9mcmVlX2Z1bmN0aW9uIGFuZC9vciB2YWx1ZV9mcmVlX2Z1bmN0aW9uKS4KKyAqCisgKiBSZXR1cm5zICNGQUxTRSBpZiBtZW1vcnkgZm9yIHRoZSBuZXcgaGFzaCBlbnRyeQorICogY2FuJ3QgYmUgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGVudHJ5IGtleS4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaGFzaCBlbnRyeSB2YWx1ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3R3b19zdHJpbmdzIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1RXT19TVFJJTkdTKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwga2V5LCBUUlVFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7IC8qIG5vIG1lbW9yeSAqLworCisgIGlmICh0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24gJiYgZW50cnktPmtleSAhPSBrZXkpCisgICAgKCogdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKSAoZW50cnktPmtleSk7CisgIAorICBpZiAodGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gJiYgZW50cnktPnZhbHVlICE9IHZhbHVlKQorICAgICgqIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKSAoZW50cnktPnZhbHVlKTsKKyAgCisgIGVudHJ5LT5rZXkgPSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgaGFzaCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorICogVGhlIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHN0b3JlZAorICogaW4gdGhlIGhhc2ggdGFibGUgYnkgcmVmZXJlbmNlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZQorICogZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMga2V5IGFuZCB2YWx1ZQorICogYXJlIG92ZXJ3cml0dGVuIChhbmQgZnJlZWQgaWYgdGhlIGhhc2ggdGFibGUgaGFzCisgKiBhIGtleV9mcmVlX2Z1bmN0aW9uIGFuZC9vciB2YWx1ZV9mcmVlX2Z1bmN0aW9uKS4KKyAqCisgKiBSZXR1cm5zICNGQUxTRSBpZiBtZW1vcnkgZm9yIHRoZSBuZXcgaGFzaCBlbnRyeQorICogY2FuJ3QgYmUgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGVudHJ5IGtleS4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaGFzaCBlbnRyeSB2YWx1ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9JTlQpOworICAKKyAgZW50cnkgPSAoKiB0YWJsZS0+ZmluZF9mdW5jdGlvbikgKHRhYmxlLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoa2V5KSwgVFJVRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOyAvKiBubyBtZW1vcnkgKi8KKworICBpZiAodGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uICYmIGVudHJ5LT5rZXkgIT0gX0RCVVNfSU5UX1RPX1BPSU5URVIgKGtleSkpCisgICAgKCogdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKSAoZW50cnktPmtleSk7CisgIAorICBpZiAodGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gJiYgZW50cnktPnZhbHVlICE9IHZhbHVlKQorICAgICgqIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKSAoZW50cnktPnZhbHVlKTsKKyAgCisgIGVudHJ5LT5rZXkgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoa2V5KTsKKyAgZW50cnktPnZhbHVlID0gdmFsdWU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKiBkaXNhYmxlZCBzaW5jZSBpdCdzIG9ubHkgdXNlZCBmb3IgdGVzdGluZyAqLworLyoqCisgKiBDcmVhdGVzIGEgaGFzaCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorICogVGhlIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHN0b3JlZAorICogaW4gdGhlIGhhc2ggdGFibGUgYnkgcmVmZXJlbmNlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZQorICogZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMga2V5IGFuZCB2YWx1ZQorICogYXJlIG92ZXJ3cml0dGVuIChhbmQgZnJlZWQgaWYgdGhlIGhhc2ggdGFibGUgaGFzCisgKiBhIGtleV9mcmVlX2Z1bmN0aW9uIGFuZC9vciB2YWx1ZV9mcmVlX2Z1bmN0aW9uKS4KKyAqCisgKiBSZXR1cm5zICNGQUxTRSBpZiBtZW1vcnkgZm9yIHRoZSBuZXcgaGFzaCBlbnRyeQorICogY2FuJ3QgYmUgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGVudHJ5IGtleS4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaGFzaCBlbnRyeSB2YWx1ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3BvaW50ZXIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9QT0lOVEVSKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwga2V5LCBUUlVFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7IC8qIG5vIG1lbW9yeSAqLworCisgIGlmICh0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24gJiYgZW50cnktPmtleSAhPSBrZXkpCisgICAgKCogdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKSAoZW50cnktPmtleSk7CisgIAorICBpZiAodGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24gJiYgZW50cnktPnZhbHVlICE9IHZhbHVlKQorICAgICgqIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uKSAoZW50cnktPnZhbHVlKTsKKyAgCisgIGVudHJ5LT5rZXkgPSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgaGFzaCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorICogVGhlIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHN0b3JlZAorICogaW4gdGhlIGhhc2ggdGFibGUgYnkgcmVmZXJlbmNlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZQorICogZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMga2V5IGFuZCB2YWx1ZQorICogYXJlIG92ZXJ3cml0dGVuIChhbmQgZnJlZWQgaWYgdGhlIGhhc2ggdGFibGUgaGFzCisgKiBhIGtleV9mcmVlX2Z1bmN0aW9uIGFuZC9vciB2YWx1ZV9mcmVlX2Z1bmN0aW9uKS4KKyAqCisgKiBSZXR1cm5zICNGQUxTRSBpZiBtZW1vcnkgZm9yIHRoZSBuZXcgaGFzaCBlbnRyeQorICogY2FuJ3QgYmUgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGVudHJ5IGtleS4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaGFzaCBlbnRyeSB2YWx1ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9VSU5UUFRSKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgKHZvaWQqKSBrZXksIFRSVUUsIE5VTEwsIE5VTEwpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsgLyogbm8gbWVtb3J5ICovCisKKyAgaWYgKHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbiAmJiBlbnRyeS0+a2V5ICE9ICh2b2lkKikga2V5KQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworICAKKyAgaWYgKHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uICYmIGVudHJ5LT52YWx1ZSAhPSB2YWx1ZSkKKyAgICAoKiB0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbikgKGVudHJ5LT52YWx1ZSk7CisgIAorICBlbnRyeS0+a2V5ID0gKHZvaWQqKSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFByZWFsbG9jYXRlIGFuIG9wYXF1ZSBkYXRhIGJsb2IgdGhhdCBhbGxvd3MgdXMgdG8gaW5zZXJ0IGludG8gdGhlCisgKiBoYXNoIHRhYmxlIGF0IGEgbGF0ZXIgdGltZSB3aXRob3V0IGFsbG9jYXRpbmcgYW55IG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUKKyAqIEByZXR1cm5zIHRoZSBwcmVhbGxvY2F0ZWQgZGF0YSwgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNQcmVhbGxvY2F0ZWRIYXNoKgorX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAKKyAgZW50cnkgPSBhbGxvY19lbnRyeSAodGFibGUpOworCisgIHJldHVybiAoREJ1c1ByZWFsbG9jYXRlZEhhc2gqKSBlbnRyeTsKK30KKworLyoqCisgKiBGcmVlcyBhbiBvcGFxdWUgREJ1c1ByZWFsbG9jYXRlZEhhc2ggdGhhdCB3YXMgKm5vdCogdXNlZAorICogaW4gb3JkZXIgdG8gaW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlCisgKiBAcGFyYW0gcHJlYWxsb2NhdGVkIHRoZSBwcmVhbGxvY2F0ZWQgZGF0YQorICovCit2b2lkCitfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5IChEQnVzSGFzaFRhYmxlICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKyAgCisgIGVudHJ5ID0gKERCdXNIYXNoRW50cnkqKSBwcmVhbGxvY2F0ZWQ7CisgIAorICAvKiBEb24ndCB1c2UgZnJlZV9lbnRyeSgpLCBzaW5jZSB0aGlzIGVudHJ5IGhhcyBubyBrZXkvZGF0YSAqLworICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jICh0YWJsZS0+ZW50cnlfcG9vbCwgZW50cnkpOworfQorCisvKioKKyAqIEluc2VydHMgYSBzdHJpbmcta2V5ZWQgZW50cnkgaW50byB0aGUgaGFzaCB0YWJsZSwgdXNpbmcgYQorICogcHJlYWxsb2NhdGVkIGRhdGEgYmxvY2sgZnJvbQorICogX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSgpLiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsIGR1ZQorICogdG8gbGFjayBvZiBtZW1vcnkuIFRoZSBEQnVzUHJlYWxsb2NhdGVkSGFzaCBvYmplY3QgaXMgY29uc3VtZWQgYW5kCisgKiBzaG91bGQgbm90IGJlIHJldXNlZCBvciBmcmVlZC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gd29ya3MKKyAqIGp1c3QgbGlrZSBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcoKS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUKKyAqIEBwYXJhbSBwcmVhbGxvY2F0ZWQgdGhlIHByZWFsbG9jYXRlZCBkYXRhCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSAKKyAqLwordm9pZAorX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nX3ByZWFsbG9jYXRlZCAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwga2V5LCBUUlVFLCBOVUxMLCBwcmVhbGxvY2F0ZWQpOworCisgIF9kYnVzX2Fzc2VydCAoZW50cnkgIT0gTlVMTCk7CisgIAorICBpZiAodGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uICYmIGVudHJ5LT5rZXkgIT0ga2V5KQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworCisgIGlmICh0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiAmJiBlbnRyeS0+dmFsdWUgIT0gdmFsdWUpCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworICAgICAgCisgIGVudHJ5LT5rZXkgPSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBoYXNoIGVudHJpZXMgaW4gYSBoYXNoIHRhYmxlLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUuCisgKi8KK2ludAorX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgcmV0dXJuIHRhYmxlLT5uX2VudHJpZXM7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIElmIHlvdSdyZSB3b25kZXJpbmcgd2h5IHRoZSBoYXNoIHRhYmxlIHRlc3QgdGFrZXMKKyAqIGZvcmV2ZXIgdG8gcnVuLCBpdCdzIGJlY2F1c2Ugd2UgY2FsbCB0aGlzIGZ1bmN0aW9uCisgKiBpbiBpbm5lciBsb29wcyB0aHVzIG1ha2luZyB0aGluZ3MgcXVhZHJhdGljLgorICovCitzdGF0aWMgaW50Citjb3VudF9lbnRyaWVzIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIGludCBjb3VudDsKKworICBjb3VudCA9IDA7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICArK2NvdW50OworCisgIF9kYnVzX2Fzc2VydCAoY291bnQgPT0gX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzICh0YWJsZSkpOworICAKKyAgcmV0dXJuIGNvdW50OworfQorCisvKiBDb3B5IHRoZSBmb29cMGJhclwwIGRvdWJsZSBzdHJpbmcgdGhpbmcgKi8KK3N0YXRpYyBjaGFyKgorX2RidXNfc3RyZHVwMiAoY29uc3QgY2hhciAqc3RyKQoreworICBzaXplX3QgbGVuOworICBjaGFyICpjb3B5OworICAKKyAgaWYgKHN0ciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgbGVuID0gc3RybGVuIChzdHIpOworICBsZW4gKz0gc3RybGVuICgoc3RyICsgbGVuICsgMSkpOworCisgIGNvcHkgPSBkYnVzX21hbGxvYyAobGVuICsgMik7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtY3B5IChjb3B5LCBzdHIsIGxlbiArIDIpOworICAKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c0hhc2hUYWJsZUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzSGFzaFRhYmxlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90ZXN0ICh2b2lkKQoreworICBpbnQgaTsKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGUxOworICBEQnVzSGFzaFRhYmxlICp0YWJsZTI7CisgIERCdXNIYXNoVGFibGUgKnRhYmxlMzsKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGU0OworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyNkZWZpbmUgTl9IQVNIX0tFWVMgNTAwMAorICBjaGFyICoqa2V5czsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisKKyAga2V5cyA9IGRidXNfbmV3IChjaGFyICosIE5fSEFTSF9LRVlTKTsKKyAgaWYgKGtleXMgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTl9IQVNIX0tFWVM7IGkrKykKKyAgICB7CisgICAgICBrZXlzW2ldID0gZGJ1c19tYWxsb2MgKDEyOCk7CisKKyAgICAgIGlmIChrZXlzW2ldID09IE5VTEwpCisJX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgfQorCisgIHByaW50ZiAoIkNvbXB1dGluZyB0ZXN0IGhhc2gga2V5cy4uLlxuIik7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fSEFTSF9LRVlTKQorICAgIHsKKyAgICAgIGludCBsZW47CisKKyAgICAgIC8qIGFsbCB0aGUgaGFzaCBrZXlzIGFyZSBUV09fU1RSSU5HUywgYnV0CisgICAgICAgKiB0aGVuIHdlIGNhbiBhbHNvIHVzZSB0aG9zZSBhcyByZWd1bGFyIHN0cmluZ3MuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgbGVuID0gc3ByaW50ZiAoa2V5c1tpXSwgIkhhc2gga2V5ICVkIiwgaSk7CisgICAgICBzcHJpbnRmIChrZXlzW2ldICsgbGVuICsgMSwgIlR3byBzdHJpbmcgJWQiLCBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKihrZXlzW2ldICsgbGVuKSA9PSAnXDAnKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKihrZXlzW2ldICsgbGVuICsgMSkgIT0gJ1wwJyk7CisgICAgICArK2k7CisgICAgfQorICBwcmludGYgKCIuLi4gZG9uZS5cbiIpOworICAKKyAgdGFibGUxID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTEgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB0YWJsZTIgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTIgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB0YWJsZTMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUzID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgdGFibGU0ID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9UV09fU1RSSU5HUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlNCA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIAorICAvKiBJbnNlcnQgYW5kIHJlbW92ZSBhIGJ1bmNoIG9mIHN0dWZmLCBjb3VudGluZyB0aGUgdGFibGUgaW4gYmV0d2VlbgorICAgKiB0byBiZSBzdXJlIGl0J3Mgbm90IGJyb2tlbiBhbmQgdGhhdCBpdGVyYXRpb24gd29ya3MKKyAgICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDMwMDApCisgICAgeworICAgICAgdm9pZCAqdmFsdWU7CisgICAgICBjaGFyICprZXk7CisKKyAgICAgIGtleSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJWYWx1ZSEiKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHRhYmxlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgKHRhYmxlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAodGFibGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgdmFsdWUpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAga2V5ID0gX2RidXNfc3RyZHVwMiAoa2V5c1tpXSk7CisgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJWYWx1ZSEiKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF90d29fc3RyaW5ncyAodGFibGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSArIDEpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTIpID09IGkgKyAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUzKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlNCkgPT0gaSArIDEpOworCisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAodGFibGUxLCBrZXlzW2ldKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAodmFsdWUsICJWYWx1ZSEiKSA9PSAwKTsKKworICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKHRhYmxlMiwgaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZhbHVlLCBrZXlzW2ldKSA9PSAwKTsKKworICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyICh0YWJsZTMsIGkpOworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2YWx1ZSwga2V5c1tpXSkgPT0gMCk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdHdvX3N0cmluZ3MgKHRhYmxlNCwga2V5c1tpXSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZhbHVlLCAiVmFsdWUhIikgPT0gMCk7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzW2ldKTsKKworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfaW50ICh0YWJsZTIsIGkpOworCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyICh0YWJsZTMsIGkpOworCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV90d29fc3RyaW5ncyAodGFibGU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNbaV0pOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMykgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlNCkgPT0gaSk7CisKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVmICh0YWJsZTIpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlZiAodGFibGUzKTsKKyAgX2RidXNfaGFzaF90YWJsZV9yZWYgKHRhYmxlNCk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMik7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMyk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlNCk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMik7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMyk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlNCk7CisgIHRhYmxlMyA9IE5VTEw7CisKKyAgLyogSW5zZXJ0IGEgYnVuY2ggb2Ygc3R1ZmYgdGhlbiBjaGVjaworICAgKiB0aGF0IGl0ZXJhdGlvbiB3b3JrcyBjb3JyZWN0bHkgKGZpbmRzIHRoZSByaWdodAorICAgKiB2YWx1ZXMsIGl0ZXJfc2V0X3ZhbHVlIHdvcmtzLCBldGMuKQorICAgKi8KKyAgdGFibGUxID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTEgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKyAgCisgIHRhYmxlMiA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMiA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgNTAwMCkKKyAgICB7CisgICAgICBjaGFyICprZXk7CisgICAgICB2b2lkICp2YWx1ZTsgICAgICAKKyAgICAgIAorICAgICAga2V5ID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIlZhbHVlISIpOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgdmFsdWUgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAodGFibGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHZhbHVlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSArIDEpOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZTEsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqa2V5OworICAgICAgdm9pZCAqdmFsdWU7CisKKyAgICAgIGtleSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfc3RyaW5nX2tleSAoJml0ZXIpOworICAgICAgdmFsdWUgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nICh0YWJsZTEsIGtleSkgPT0gdmFsdWUpOworCisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIkRpZmZlcmVudCB2YWx1ZSEiKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoJml0ZXIsIHZhbHVlKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHRhYmxlMSwga2V5KSA9PSB2YWx1ZSk7CisgICAgfQorICAKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlMSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSAtIDEpOworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUyLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGludCBrZXk7CisgICAgICB2b2lkICp2YWx1ZTsKKworICAgICAga2V5ID0gX2RidXNfaGFzaF9pdGVyX2dldF9pbnRfa2V5ICgmaXRlcik7CisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKHRhYmxlMiwga2V5KSA9PSB2YWx1ZSk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiRGlmZmVyZW50IHZhbHVlISIpOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICgmaXRlciwgdmFsdWUpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAodGFibGUyLCBrZXkpID09IHZhbHVlKTsKKyAgICB9CisKKyAgaSA9IGNvdW50X2VudHJpZXMgKHRhYmxlMik7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZTIsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoJml0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTIpICsgMSA9PSBpKTsKKyAgICAgIC0taTsKKyAgICB9CisKKyAgLyogYWRkL3JlbW92ZSBpbnRlcmxlYXZlZCwgdG8gY2hlY2sgdGhhdCB3ZSBncm93L3NocmluayB0aGUgdGFibGUKKyAgICogYXBwcm9wcmlhdGVseQorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTAwMCkKKyAgICB7CisgICAgICBjaGFyICprZXk7CisgICAgICB2b2lkICp2YWx1ZTsKKyAgICAgICAgICAgIAorICAgICAga2V5ID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiVmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBjaGFyICprZXk7CisgICAgICB2b2lkICp2YWx1ZTsgICAgICAKKyAgICAgIAorICAgICAga2V5ID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICB2YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIlZhbHVlISIpOworICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAodGFibGUxLCBrZXlzW2ldKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAodGFibGUxLCBrZXlzW2ldKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzICh0YWJsZTEpID09IGkpOworICAgICAgCisgICAgICAtLWk7CisgICAgfQorCisgIC8qIG51a2UgdGhlc2UgdGFibGVzICovCisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHRhYmxlMik7CisKKworICAvKiBOb3cgZG8gYSBidW5jaCBvZiB0aGluZ3MgYWdhaW4gdXNpbmcgX2RidXNfaGFzaF9pdGVyX2xvb2t1cCgpIHRvCisgICAqIGJlIHN1cmUgdGhhdCBpbnRlcmZhY2Ugd29ya3MuCisgICAqLworICB0YWJsZTEgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworICAKKyAgdGFibGUyID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUyID09IE5VTEwpCisgICAgZ290byBvdXQ7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAzMDAwKQorICAgIHsKKyAgICAgIHZvaWQgKnZhbHVlOworICAgICAgY2hhciAqa2V5OworCisgICAgICBrZXkgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwICgiVmFsdWUhIik7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIFRSVUUsICZpdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9zZXRfdmFsdWUgKCZpdGVyLCB2YWx1ZSk7CisKKyAgICAgIHZhbHVlID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSwgVFJVRSwgJml0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpID09IE5VTEwpOworICAgICAgX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoJml0ZXIsIHZhbHVlKTsgCisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSArIDEpOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfaXRlcl9sb29rdXAgKHRhYmxlMSwga2V5c1tpXSwgRkFMU0UsICZpdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgIHZhbHVlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2YWx1ZSwgIlZhbHVlISIpID09IDApOworCisgICAgICAvKiBJdGVyYXRlIGp1c3QgdG8gYmUgc3VyZSBpdCB3b3JrcywgdGhvdWdoCisgICAgICAgKiBpdCdzIGEgc3R1cGlkIHRoaW5nIHRvIGRvCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICA7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSksIEZBTFNFLCAmaXRlcikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAodmFsdWUsIGtleXNbaV0pID09IDApOworCisgICAgICAvKiBJdGVyYXRlIGp1c3QgdG8gYmUgc3VyZSBpdCB3b3JrcywgdGhvdWdoCisgICAgICAgKiBpdCdzIGEgc3R1cGlkIHRoaW5nIHRvIGRvCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgICAgICA7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUxLCBrZXlzW2ldLCBGQUxTRSwgJml0ZXIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJoYXNoIGVudHJ5IHNob3VsZCBoYXZlIGV4aXN0ZWQiKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkgKCZpdGVyKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSwgRkFMU0UsICZpdGVyKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaGFzaCBlbnRyeSBzaG91bGQgaGF2ZSBleGlzdGVkIik7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUxKSA9PSBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUyKSA9PSBpKTsKKworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmICh0YWJsZTEpOworICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmICh0YWJsZTIpOworCisgIHJldCA9IFRSVUU7CisKKyBvdXQ6CisgIGZvciAoaSA9IDA7IGkgPCBOX0hBU0hfS0VZUzsgaSsrKQorICAgIGRidXNfZnJlZSAoa2V5c1tpXSk7CisKKyAgZGJ1c19mcmVlIChrZXlzKTsKKyAgCisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtaGFzaC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNhMjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWhhc2guaApAQCAtMCwwICsxLDE1MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWhhc2guaCBHZW5lcmljIGhhc2ggdGFibGUgdXRpbGl0eSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfSEFTSF9ICisjZGVmaW5lIERCVVNfSEFTSF9ICisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0hhc2hUYWJsZQorICogQHsKKyAqLworCisvKiogSGFzaCBpdGVyYXRvciBvYmplY3QuIFRoZSBpdGVyYXRvciBpcyBvbiB0aGUgc3RhY2ssIGJ1dCBpdHMgcmVhbAorICogZmllbGRzIGFyZSBoaWRkZW4gcHJpdmF0ZWx5LgorICovCitzdHJ1Y3QgREJ1c0hhc2hJdGVyCit7CisgIHZvaWQgKmR1bW15MTsgLyoqPCBEbyBub3QgdXNlLiAqLworICB2b2lkICpkdW1teTI7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgdm9pZCAqZHVtbXkzOyAvKio8IERvIG5vdCB1c2UuICovCisgIHZvaWQgKmR1bW15NDsgLyoqPCBEbyBub3QgdXNlLiAqLworICBpbnQgICBkdW1teTU7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgaW50ICAgZHVtbXk2OyAvKio8IERvIG5vdCB1c2UuICovCit9OworCit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaFRhYmxlIERCdXNIYXNoVGFibGU7Cit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaEl0ZXIgIERCdXNIYXNoSXRlcjsKKworLyogQWxsb3dpbmcgYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uIGFzIHdpdGggR0xpYgorICogd291bGQgYmUgbmljZXIgZm9yIGEgcHVibGljIEFQSSwgYnV0IGZvcgorICogYW4gaW50ZXJuYWwgQVBJIHRoaXMgc2F2ZXMgdHlwaW5nLCB3ZSBjYW4gYWRkCisgKiBtb3JlIHdoZW5ldmVyIHdlIGZlZWwgbGlrZSBpdC4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfSEFTSF9TVFJJTkcsICAgICAgICAvKio8IEhhc2gga2V5cyBhcmUgc3RyaW5ncy4gKi8KKyAgREJVU19IQVNIX1RXT19TVFJJTkdTLCAgIC8qKjwgSGFzaCBrZXkgaXMgdHdvIHN0cmluZ3MgaW4gb25lIG1lbW9yeSBibG9jaywgaS5lLiBmb29cXDBiYXJcXDAgKi8KKyAgREJVU19IQVNIX0lOVCwgICAgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2Vycy4gKi8KKyAgREJVU19IQVNIX1BPSU5URVIsICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBwb2ludGVycy4gKi8KKyAgREJVU19IQVNIX1VJTlRQVFIgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2VyIGNhcGFibGUgdG8gaG9sZCBhIHBvaW50ZXIuICovCit9IERCdXNIYXNoVHlwZTsKKworREJ1c0hhc2hUYWJsZSogX2RidXNfaGFzaF90YWJsZV9uZXcgICAgICAgICAgICAgICAgKERCdXNIYXNoVHlwZSAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAga2V5X2ZyZWVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgdmFsdWVfZnJlZV9mdW5jdGlvbik7CitEQnVzSGFzaFRhYmxlKiBfZGJ1c19oYXNoX3RhYmxlX3JlZiAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOwordm9pZCAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlKTsKK3ZvaWQgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSk7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAgICAgICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Citjb25zdCBjaGFyKiAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Citjb25zdCBjaGFyKiAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3R3b19zdHJpbmdzX2tleSAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit1aW50cHRyX3QgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3VpbnRwdHJfa2V5ICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK3ZvaWQqICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3R3b19zdHJpbmdzIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICprZXkpOwordm9pZCogICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50ICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGtleSk7Cit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9wb2ludGVyICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqa2V5KTsKK3ZvaWQqICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgICAgICAgICBrZXkpOworZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nICAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmtleSk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV90d29fc3RyaW5ncyAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXkpOworZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfcG9pbnRlciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmtleSk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICAgICAgICAga2V5KTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUpOworZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdHdvX3N0cmluZ3MgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlKTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3BvaW50ZXIgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUpOworZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOworCisvKiBQcmVhbGxvY2F0aW9uICovCisKKy8qKiBBIHByZWFsbG9jYXRlZCBoYXNoIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBEQnVzUHJlYWxsb2NhdGVkSGFzaCBEQnVzUHJlYWxsb2NhdGVkSGFzaDsKKworREJ1c1ByZWFsbG9jYXRlZEhhc2ggKl9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSk7Cit2b2lkICAgICAgICAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpOwordm9pZCAgICAgICAgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZ19wcmVhbGxvY2F0ZWQgKERCdXNIYXNoVGFibGUgICAgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKnZhbHVlKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0hBU0hfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWludGVybmFscy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWludGVybmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODY0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtaW50ZXJuYWxzLmMKQEAgLTAsMCArMSwxMDI0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtaW50ZXJuYWxzLmMgIHJhbmRvbSB1dGlsaXR5IHN0dWZmIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtYnN0cmluZy5oPgorI2VuZGlmCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNJbnRlcm5hbHMgRC1CdXMgc2VjcmV0IGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBicmllZiBEb2N1bWVudGF0aW9uIHVzZWZ1bCB3aGVuIGRldmVsb3Bpbmcgb3IgZGVidWdnaW5nIEQtQnVzIGl0c2VsZi4KKyAqIAorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNJbnRlcm5hbHNVdGlscyBVdGlsaXRpZXMgYW5kIHBvcnRhYmlsaXR5CisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgVXRpbGl0eSBmdW5jdGlvbnMgKF9kYnVzX2Fzc2VydCgpLCBfZGJ1c193YXJuKCksIGV0Yy4pCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBfZGJ1c19hc3NlcnQKKyAqCisgKiBBYm9ydHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCisgKiAKKyAqIEBwYXJhbSBjb25kaXRpb24gY29uZGl0aW9uIHdoaWNoIG11c3QgYmUgdHJ1ZS4KKyAqLworCisvKioKKyAqIEBkZWYgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkCisgKgorICogQWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBjYWxsZWQuCisgKiBUaGUgZ2l2ZW4gZXhwbGFuYXRpb24gd2lsbCBiZSBwcmludGVkLgorICogCisgKiBAcGFyYW0gZXhwbGFuYXRpb24gZXhwbGFuYXRpb24gb2Ygd2hhdCBoYXBwZW5lZCBpZiB0aGUgY29kZSB3YXMgcmVhY2hlZC4KKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfTl9FTEVNRU5UUworICoKKyAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBmaXhlZC1zaXplIGFycmF5IHVzaW5nCisgKiBzaXplb2YoKS4KKyAqCisgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGNvdW50IGVsZW1lbnRzIGluLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19QT0lOVEVSX1RPX0lOVAorICoKKyAqIFNhZmVseSBjYXN0cyBhIHZvaWQqIHRvIGFuIGludGVnZXI7IHNob3VsZCBvbmx5IGJlIHVzZWQgb24gdm9pZCoKKyAqIHRoYXQgYWN0dWFsbHkgY29udGFpbiBpbnRlZ2VycywgZm9yIGV4YW1wbGUgb25lIGNyZWF0ZWQgd2l0aAorICogX0RCVVNfSU5UX1RPX1BPSU5URVIuICBPbmx5IGd1YXJhbnRlZWQgdG8gcHJlc2VydmUgMzIgYml0cy4KKyAqIChpLmUuIGl0J3MgdXNlZCB0byBzdG9yZSAzMi1iaXQgaW50cyBpbiBwb2ludGVycywgYnV0CisgKiBjYW4ndCBiZSB1c2VkIHRvIHN0b3JlIDY0LWJpdCBwb2ludGVycyBpbiBpbnRzLikKKyAqCisgKiBAcGFyYW0gcG9pbnRlciBwb2ludGVyIHRvIGV4dHJhY3QgYW4gaW50ZWdlciBmcm9tLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UX1RPX1BPSU5URVIKKyAqCisgKiBTYWZlbHkgc3R1ZmZzIGFuIGludGVnZXIgaW50byBhIHBvaW50ZXIsIHRvIGJlIGV4dHJhY3RlZCBsYXRlciB3aXRoCisgKiBfREJVU19QT0lOVEVSX1RPX0lOVC4gT25seSBndWFyYW50ZWVkIHRvIHByZXNlcnZlIDMyIGJpdHMuCisgKgorICogQHBhcmFtIGludGVnZXIgdGhlIGludGVnZXIgdG8gc3R1ZmYgaW50byBhIHBvaW50ZXIuCisgKi8KKy8qKgorICogQGRlZiBfREJVU19aRVJPCisgKgorICogU2V0cyBhbGwgYml0cyBpbiBhbiBvYmplY3QgdG8gemVyby4KKyAqCisgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgemVyb2VkLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UMTZfTUlOCisgKgorICogTWluaW11bSB2YWx1ZSBvZiB0eXBlICJpbnQxNiIKKyAqLworLyoqCisgKiBAZGVmIF9EQlVTX0lOVDE2X01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAiaW50MTYiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19VSU5UMTZfTUFYCisgKgorICogTWF4aW11bSB2YWx1ZSBvZiB0eXBlICJ1aW50MTYiCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX0lOVDMyX01JTgorICoKKyAqIE1pbmltdW0gdmFsdWUgb2YgdHlwZSAiaW50MzIiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19JTlQzMl9NQVgKKyAqCisgKiBNYXhpbXVtIHZhbHVlIG9mIHR5cGUgImludDMyIgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfVUlOVDMyX01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAidWludDMyIgorICovCisKKy8qKgorICogQGRlZiBfREJVU19JTlRfTUlOCisgKgorICogTWluaW11bSB2YWx1ZSBvZiB0eXBlICJpbnQiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19JTlRfTUFYCisgKgorICogTWF4aW11bSB2YWx1ZSBvZiB0eXBlICJpbnQiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19VSU5UX01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAidWludCIKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNGb3JlYWNoRnVuY3Rpb24KKyAqIAorICogVXNlZCB0byBpdGVyYXRlIG92ZXIgZWFjaCBpdGVtIGluIGEgY29sbGVjdGlvbiwgc3VjaCBhcworICogYSBEQnVzTGlzdC4KKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfTE9DS19OQU1FCisgKgorICogRXhwYW5kcyB0byBuYW1lIG9mIGEgZ2xvYmFsIGxvY2sgdmFyaWFibGUuCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX0RFRklORV9HTE9CQUxfTE9DSworICoKKyAqIERlZmluZXMgYSBnbG9iYWwgbG9jayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICogVGhlIGxvY2sgbXVzdCBiZSBhZGRlZCB0byB0aGUgbGlzdCB0byBpbml0aWFsaXplCisgKiBpbiBkYnVzX3RocmVhZHNfaW5pdCgpLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLCisgKgorICogRXhwYW5kcyB0byBkZWNsYXJhdGlvbiBvZiBhIGdsb2JhbCBsb2NrIGRlZmluZWQKKyAqIHdpdGggX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLLgorICogVGhlIGxvY2sgbXVzdCBiZSBhZGRlZCB0byB0aGUgbGlzdCB0byBpbml0aWFsaXplCisgKiBpbiBkYnVzX3RocmVhZHNfaW5pdCgpLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19MT0NLCisgKgorICogTG9ja3MgYSBnbG9iYWwgbG9jaworICovCisKKy8qKgorICogQGRlZiBfREJVU19VTkxPQ0sKKyAqCisgKiBVbmxvY2tzIGEgZ2xvYmFsIGxvY2sKKyAqLworCisvKioKKyAqIEZpeGVkICJvdXQgb2YgbWVtb3J5IiBlcnJvciBtZXNzYWdlLCBqdXN0IHRvIGF2b2lkCisgKiBtYWtpbmcgdXAgYSBkaWZmZXJlbnQgc3RyaW5nIGV2ZXJ5IHRpbWUgYW5kIHdhc3RpbmcKKyAqIHNwYWNlLgorICovCitjb25zdCBjaGFyICpfZGJ1c19ub19tZW1vcnlfbWVzc2FnZSA9ICJOb3QgZW5vdWdoIG1lbW9yeSI7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCB3YXJuX2luaXR0ZWQgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBmYXRhbF93YXJuaW5ncyA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IGZhdGFsX3dhcm5pbmdzX29uX2NoZWNrX2ZhaWxlZCA9IFRSVUU7CisKK3N0YXRpYyB2b2lkCitpbml0X3dhcm5pbmdzKHZvaWQpCit7CisgIGlmICghd2Fybl9pbml0dGVkKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBzID0gX2RidXNfZ2V0ZW52ICgiREJVU19GQVRBTF9XQVJOSU5HUyIpOworICAgICAgaWYgKHMgJiYgKnMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnMgPT0gJzAnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYXRhbF93YXJuaW5ncyA9IEZBTFNFOworICAgICAgICAgICAgICBmYXRhbF93YXJuaW5nc19vbl9jaGVja19mYWlsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICgqcyA9PSAnMScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhdGFsX3dhcm5pbmdzID0gVFJVRTsKKyAgICAgICAgICAgICAgZmF0YWxfd2FybmluZ3Nfb25fY2hlY2tfZmFpbGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiREJVU19GQVRBTF9XQVJOSU5HUyBzaG91bGQgYmUgc2V0IHRvIDAgb3IgMSBpZiBzZXQsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB3YXJuX2luaXR0ZWQgPSBUUlVFOworICAgIH0KK30KKworLyoqCisgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RkZXJyLiBDYW4gb3B0aW9uYWxseSBiZSBtYWRlIHRvIGV4aXQKKyAqIGZhdGFsbHkgYnkgc2V0dGluZyBEQlVTX0ZBVEFMX1dBUk5JTkdTLCBidXQgdGhpcyBpcyByYXJlbHkKKyAqIHVzZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJldHR5IG11Y2ggZXF1aXZhbGVudCB0bworICogZnByaW50ZihzdGRlcnIpLiBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCgpIG9uIHRoZSBvdGhlciBoYW5kIGlzCisgKiBzdWl0YWJsZSBmb3IgdXNlIHdoZW4gYSBwcm9ncmFtbWluZyBtaXN0YWtlIGhhcyBiZWVuIG1hZGUuCisgKgorICogQHBhcmFtIGZvcm1hdCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZAorX2RidXNfd2FybiAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgaWYgKCF3YXJuX2luaXR0ZWQpCisgICAgaW5pdF93YXJuaW5ncyAoKTsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworCisgIGlmIChmYXRhbF93YXJuaW5ncykKKyAgICB7CisgICAgICBmZmx1c2ggKHN0ZGVycik7CisgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qKgorICogUHJpbnRzIGEgImNyaXRpY2FsIiB3YXJuaW5nIHRvIHN0ZGVyciB3aGVuIGFuIGFzc2VydGlvbiBmYWlsczsKKyAqIGRpZmZlcnMgZnJvbSBfZGJ1c193YXJuIHByaW1hcmlseSBpbiB0aGF0IGl0IHByZWZpeGVzIHRoZSBwaWQgYW5kCisgKiBkZWZhdWx0cyB0byBmYXRhbC4gVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gYSBwcm9ncmFtbWluZworICogZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQuIChOT1QgZm9yIHVuYXZvaWRhYmxlIGVycm9ycyB0aGF0IGFuIGFwcAorICogbWlnaHQgaGFuZGxlIC0gdGhvc2Ugc2hvdWxkIGJlIHJldHVybmVkIGFzIERCdXNFcnJvci4pIENhbGxpbmcgdGhpcworICogbWVhbnMgInRoZXJlIGlzIGEgYnVnIgorICovCit2b2lkCitfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgCisgIGlmICghd2Fybl9pbml0dGVkKQorICAgIGluaXRfd2FybmluZ3MgKCk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAicHJvY2VzcyAlbHU6ICIsIF9kYnVzX3BpZF9mb3JfbG9nICgpKTsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworCisgIGlmIChmYXRhbF93YXJuaW5nc19vbl9jaGVja19mYWlsZWQpCisgICAgeworICAgICAgZmZsdXNoIChzdGRlcnIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorfQorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisKK3N0YXRpYyBkYnVzX2Jvb2xfdCB2ZXJib3NlX2luaXR0ZWQgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCB2ZXJib3NlID0gVFJVRTsKKworLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgY3VycmVudCB0aHJlYWQgaW4gdmVyYm9zZSBtZXNzYWdlcyAqLworI2RlZmluZSBQVEhSRUFEX0lOX1ZFUkJPU0UgMAorI2lmIFBUSFJFQURfSU5fVkVSQk9TRQorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgaW5saW5lCisjZW5kaWYKKyNpZmRlZiBEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HCitzdGF0aWMgY2hhciBtb2R1bGVfbmFtZVsxMDI0XTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3ZlcmJvc2VfaW5pdCAodm9pZCkKK3sKKyAgaWYgKCF2ZXJib3NlX2luaXR0ZWQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcCA9IF9kYnVzX2dldGVudiAoIkRCVVNfVkVSQk9TRSIpOworICAgICAgdmVyYm9zZSA9IHAgIT0gTlVMTCAmJiAqcCA9PSAnMSc7CisgICAgICB2ZXJib3NlX2luaXR0ZWQgPSBUUlVFOworI2lmZGVmIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcKKyAgICAgIHsKKyAgICAgICAgY2hhciAqbGFzdF9wZXJpb2QsICpsYXN0X3NsYXNoOworICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZSgwLG1vZHVsZV9uYW1lLHNpemVvZihtb2R1bGVfbmFtZSktMSk7CisgICAgICAgIGxhc3RfcGVyaW9kID0gX21ic3JjaHIobW9kdWxlX25hbWUsJy4nKTsKKyAgICAgICAgaWYgKGxhc3RfcGVyaW9kKQorICAgICAgICAgICpsYXN0X3BlcmlvZCA9J1wwJzsKKyAgICAgICAgbGFzdF9zbGFzaCA9IF9tYnNyY2hyKG1vZHVsZV9uYW1lLCdcXCcpOworICAgICAgICBpZiAobGFzdF9zbGFzaCkKKyAgICAgICAgICBzdHJjcHkobW9kdWxlX25hbWUsbGFzdF9zbGFzaCsxKTsKKyAgICAgICAgc3RyY2F0KG1vZHVsZV9uYW1lLCI6ICIpOworICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCisvKiogQGRlZiBEQlVTX0lTX0RJUl9TRVBBUkFUT1IoYykKKyAqIG1hY3JvIGZvciBjaGVja2luZyBpZiBjaGFyYWN0ZXIgYyBpcyBhIHBhdGNoIHNlcGFyYXRvcgorICogCisgKiBAdG9kbyBtb3ZlIHRvIGEgaGVhZGVyIGZpbGUgc28gdGhhdCBvdGhlcnMgY2FuIHVzZSB0aGlzIHRvbworICovCisjaWZkZWYgREJVU19XSU4gCisjZGVmaW5lIERCVVNfSVNfRElSX1NFUEFSQVRPUihjKSAoYyA9PSAnXFwnIHx8IGMgPT0gJy8nKQorI2Vsc2UKKyNkZWZpbmUgREJVU19JU19ESVJfU0VQQVJBVE9SKGMpIChjID09ICcvJykKKyNlbmRpZgorCisvKiogCisgcmVtb3ZlIHNvdXJjZSByb290IGZyb20gZmlsZSBwYXRoIAorIHRoZSBzb3VyY2Ugcm9vdCBpcyBkZXRlcm1pbmVkIGJ5IAorKi8gCitzdGF0aWMgY2hhciAqX2RidXNfZmlsZV9wYXRoX2V4dHJhY3RfZWxlbWVudHNfZnJvbV90YWlsKGNvbnN0IGNoYXIgKmZpbGUsaW50IGxldmVsKQoreworICBzdGF0aWMgaW50IHByZWZpeCA9IC0xOworICBjaGFyICpwOworCisgIGlmIChwcmVmaXggPT0gLTEpIAorICAgIHsKKyAgICAgIGNoYXIgKnAgPSAoY2hhciAqKWZpbGUgKyBzdHJsZW4oZmlsZSk7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBwcmVmaXggPSAwOworICAgICAgZm9yICg7cCA+PSBmaWxlO3AtLSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChEQlVTX0lTX0RJUl9TRVBBUkFUT1IoKnApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKytpID49IGxldmVsKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwLWZpbGUrMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICByZXR1cm4gKGNoYXIgKilmaWxlK3ByZWZpeDsKK30KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBkYnVzX2lzX3ZlcmJvc2UoKSBtYWNybyBpZiBidWlsdCB3aXRoIHZlcmJvc2UgbG9nZ2luZworICogZW5hYmxlZC4KKyAqIEByZXR1cm5zIHdoZXRoZXIgdmVyYm9zZSBsb2dnaW5nIGlzIGFjdGl2ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2lzX3ZlcmJvc2VfcmVhbCAodm9pZCkKK3sKKyAgX2RidXNfdmVyYm9zZV9pbml0ICgpOworICByZXR1cm4gdmVyYm9zZTsKK30KKworLyoqCisgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RkZXJyCisgKiBpZiB0aGUgdXNlciBoYXMgZW5hYmxlZCB2ZXJib3NlIG1vZGUuCisgKiBUaGlzIGlzIHRoZSByZWFsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLAorICogdXNlIF9kYnVzX3ZlcmJvc2UoKSBtYWNybyBpbiBjb2RlLgorICoKKyAqIEBwYXJhbSBmb3JtYXQgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcuCisgKi8KK3ZvaWQKKyNpZmRlZiBEQlVTX0NQUF9TVVBQT1JUU19WQVJJQUJMRV9NQUNST19BUkdVTUVOVFMKK19kYnVzX3ZlcmJvc2VfcmVhbCAoY29uc3QgY2hhciAqZmlsZSwgCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsaW5lLCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisjZWxzZQorX2RidXNfdmVyYm9zZV9yZWFsIChjb25zdCBjaGFyICpmb3JtYXQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIHN0YXRpYyBkYnVzX2Jvb2xfdCBuZWVkX3BpZCA9IFRSVUU7CisgIGludCBsZW47CisgIAorICAvKiB0aGluZ3MgYXJlIHdyaXR0ZW4gYSBiaXQgb2RkbHkgaGVyZSBzbyB0aGF0CisgICAqIGluIHRoZSBub24tdmVyYm9zZSBjYXNlIHdlIGp1c3QgaGF2ZSB0aGUgb25lCisgICAqIGNvbmRpdGlvbmFsIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAqLworICBpZiAoIV9kYnVzX2lzX3ZlcmJvc2VfcmVhbCgpKQorICAgIHJldHVybjsKKworI2lmbmRlZiBEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HCisgIC8qIFByaW50IG91dCBwaWQgYmVmb3JlIHRoZSBsaW5lICovCisgIGlmIChuZWVkX3BpZCkKKyAgICB7CisjaWYgUFRIUkVBRF9JTl9WRVJCT1NFCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlbHU6IDB4JWx4OiAiLCBfZGJ1c19waWRfZm9yX2xvZyAoKSwgcHRocmVhZF9zZWxmICgpKTsKKyNlbHNlCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlbHU6ICIsIF9kYnVzX3BpZF9mb3JfbG9nICgpKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgIC8qIE9ubHkgcHJpbnQgcGlkIGFnYWluIGlmIHRoZSBuZXh0IGxpbmUgaXMgYSBuZXcgbGluZSAqLworICBsZW4gPSBzdHJsZW4gKGZvcm1hdCk7CisgIGlmIChmb3JtYXRbbGVuLTFdID09ICdcbicpCisgICAgbmVlZF9waWQgPSBUUlVFOworICBlbHNlCisgICAgbmVlZF9waWQgPSBGQUxTRTsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNpZmRlZiBEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HCisgIHsKKyAgY2hhciBidWZbMTAyNF07CisgIHN0cmNweShidWYsbW9kdWxlX25hbWUpOworI2lmZGVmIERCVVNfQ1BQX1NVUFBPUlRTX1ZBUklBQkxFX01BQ1JPX0FSR1VNRU5UUworICBzcHJpbnRmIChidWYrc3RybGVuKGJ1ZiksICJbJXMoJWQpOiVzXSAiLF9kYnVzX2ZpbGVfcGF0aF9leHRyYWN0X2VsZW1lbnRzX2Zyb21fdGFpbChmaWxlLDIpLGxpbmUsZnVuY3Rpb24pOworI2VuZGlmCisgIHZzcHJpbnRmIChidWYrc3RybGVuKGJ1ZiksZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgT3V0cHV0RGVidWdTdHJpbmdBKGJ1Zik7CisgIH0KKyNlbHNlCisjaWZkZWYgREJVU19DUFBfU1VQUE9SVFNfVkFSSUFCTEVfTUFDUk9fQVJHVU1FTlRTCisgIGZwcmludGYgKHN0ZGVyciwgIlslcyglZCk6JXNdICIsX2RidXNfZmlsZV9wYXRoX2V4dHJhY3RfZWxlbWVudHNfZnJvbV90YWlsKGZpbGUsMiksbGluZSxmdW5jdGlvbik7CisjZW5kaWYKKworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworCisgIGZmbHVzaCAoc3RkZXJyKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlaW5pdGlhbGl6ZXMgdGhlIHZlcmJvc2UgbG9nZ2luZyBjb2RlLCB1c2VkCisgKiBhcyBhIGhhY2sgaW4gZGJ1cy1zcGF3bi5jIHNvIHRoYXQgYSBjaGlsZAorICogcHJvY2VzcyByZS1yZWFkcyBpdHMgcGlkCisgKgorICovCit2b2lkCitfZGJ1c192ZXJib3NlX3Jlc2V0X3JlYWwgKHZvaWQpCit7CisgIHZlcmJvc2VfaW5pdHRlZCA9IEZBTFNFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKKy8qKgorICogRHVwbGljYXRlcyBhIHN0cmluZy4gUmVzdWx0IG11c3QgYmUgZnJlZWQgd2l0aAorICogZGJ1c19mcmVlKCkuIFJldHVybnMgI05VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgKiBJZiB0aGUgc3RyaW5nIHRvIGJlIGR1cGxpY2F0ZWQgaXMgI05VTEwsIHJldHVybnMgI05VTEwuCisgKiAKKyAqIEBwYXJhbSBzdHIgc3RyaW5nIHRvIGR1cGxpY2F0ZS4KKyAqIEByZXR1cm5zIG5ld2x5LWFsbG9jYXRlZCBjb3B5LgorICovCitjaGFyKgorX2RidXNfc3RyZHVwIChjb25zdCBjaGFyICpzdHIpCit7CisgIHNpemVfdCBsZW47CisgIGNoYXIgKmNvcHk7CisgIAorICBpZiAoc3RyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBsZW4gPSBzdHJsZW4gKHN0cik7CisKKyAgY29weSA9IGRidXNfbWFsbG9jIChsZW4gKyAxKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKGNvcHksIHN0ciwgbGVuICsgMSk7CisgIAorICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBEdXBsaWNhdGVzIGEgYmxvY2sgb2YgbWVtb3J5LiBSZXR1cm5zCisgKiAjTlVMTCBvbiBmYWlsdXJlLgorICoKKyAqIEBwYXJhbSBtZW0gbWVtb3J5IHRvIGNvcHkKKyAqIEBwYXJhbSBuX2J5dGVzIG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBAcmV0dXJucyB0aGUgY29weQorICovCit2b2lkKgorX2RidXNfbWVtZHVwIChjb25zdCB2b2lkICAqbWVtLAorICAgICAgICAgICAgICBzaXplX3QgICAgICAgbl9ieXRlcykKK3sKKyAgdm9pZCAqY29weTsKKworICBjb3B5ID0gZGJ1c19tYWxsb2MgKG5fYnl0ZXMpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbWNweSAoY29weSwgbWVtLCBuX2J5dGVzKTsKKyAgCisgIHJldHVybiBjb3B5OworfQorCisvKioKKyAqIER1cGxpY2F0ZXMgYSBzdHJpbmcgYXJyYXkuIFJlc3VsdCBtYXkgYmUgZnJlZWQgd2l0aAorICogZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICogSWYgdGhlIGFycmF5IHRvIGJlIGR1cGxpY2F0ZWQgaXMgI05VTEwsIHJldHVybnMgI05VTEwuCisgKiAKKyAqIEBwYXJhbSBhcnJheSBhcnJheSB0byBkdXBsaWNhdGUuCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgY29weS4KKyAqLworY2hhcioqCitfZGJ1c19kdXBfc3RyaW5nX2FycmF5IChjb25zdCBjaGFyICoqYXJyYXkpCit7CisgIGludCBsZW47CisgIGludCBpOworICBjaGFyICoqY29weTsKKyAgCisgIGlmIChhcnJheSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAobGVuID0gMDsgYXJyYXlbbGVuXSAhPSBOVUxMOyArK2xlbikKKyAgICA7CisKKyAgY29weSA9IGRidXNfbmV3MCAoY2hhciosIGxlbiArIDEpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBjb3B5W2ldID0gX2RidXNfc3RyZHVwIChhcnJheVtpXSk7CisgICAgICBpZiAoY29weVtpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY29weSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIHN0cmluZyBhcnJheSBjb250YWlucyB0aGUgZ2l2ZW4gc3RyaW5nLgorICogCisgKiBAcGFyYW0gYXJyYXkgYXJyYXkgdG8gc2VhcmNoLgorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gbG9vayBmb3IKKyAqIEByZXR1cm5zICNUUlVFIGlmIGFycmF5IGNvbnRhaW5zIHN0cmluZworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zIChjb25zdCBjaGFyICoqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzdHIpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoYXJyYXlbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcnJheVtpXSwgc3RyKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG5ldyBVVUlELiBJZiB5b3UgY2hhbmdlIGhvdyB0aGlzIGlzIGRvbmUsCisgKiB0aGVyZSdzIHNvbWUgdGV4dCBhYm91dCBpdCBpbiB0aGUgc3BlYyB0aGF0IHNob3VsZCBhbHNvIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gdXVpZCB0aGUgdXVpZCB0byBpbml0aWFsaXplCisgKi8KK3ZvaWQKK19kYnVzX2dlbmVyYXRlX3V1aWQgKERCdXNHVUlEICp1dWlkKQoreworICBsb25nIG5vdzsKKworICBfZGJ1c19nZXRfY3VycmVudF90aW1lICgmbm93LCBOVUxMKTsKKworICB1dWlkLT5hc191aW50MzJzW0RCVVNfVVVJRF9MRU5HVEhfV09SRFMgLSAxXSA9IERCVVNfVUlOVDMyX1RPX0JFIChub3cpOworICAKKyAgX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlciAodXVpZC0+YXNfYnl0ZXMsIERCVVNfVVVJRF9MRU5HVEhfQllURVMgLSA0KTsKK30KKworLyoqCisgKiBIZXgtZW5jb2RlIGEgVVVJRC4KKyAqCisgKiBAcGFyYW0gdXVpZCB0aGUgdXVpZAorICogQHBhcmFtIGVuY29kZWQgc3RyaW5nIHRvIGFwcGVuZCBoZXggdXVpZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXVpZF9lbmNvZGUgKGNvbnN0IERCdXNHVUlEICp1dWlkLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICplbmNvZGVkKQoreworICBEQnVzU3RyaW5nIGJpbmFyeTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmYmluYXJ5LCB1dWlkLT5hc19ieXRlcywgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJmJpbmFyeSwgMCwgZW5jb2RlZCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVuY29kZWQpKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19yZWFkX3V1aWRfZmlsZV93aXRob3V0X2NyZWF0aW5nIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBjb250ZW50czsKKyAgREJ1c1N0cmluZyBkZWNvZGVkOworICBpbnQgZW5kOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRlbnRzKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZWNvZGVkKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRzKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmY29udGVudHMsIGZpbGVuYW1lLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAoJmNvbnRlbnRzKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykgIT0gREJVU19VVUlEX0xFTkdUSF9IRVgpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICJVVUlEIGZpbGUgJyVzJyBzaG91bGQgY29udGFpbiBhIGhleCBzdHJpbmcgb2YgbGVuZ3RoICVkLCBub3QgbGVuZ3RoICVkLCB3aXRoIG5vIG90aGVyIHRleHQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfVVVJRF9MRU5HVEhfSEVYLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudHMpKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKCZjb250ZW50cywgMCwgJmVuZCwgJmRlY29kZWQsIDApKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmIChlbmQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIlVVSUQgZmlsZSAnJXMnIGNvbnRhaW5zIGludmFsaWQgaGV4IGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlY29kZWQpICE9IERCVVNfVVVJRF9MRU5HVEhfQllURVMpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICJVVUlEIGZpbGUgJyVzJyBjb250YWlucyAlZCBieXRlcyBvZiBoZXgtZW5jb2RlZCBkYXRhIGluc3RlYWQgb2YgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCksCisgICAgICAgICAgICAgICAgICAgICAgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIgKCZkZWNvZGVkLCB1dWlkLT5hc19ieXRlcywgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50cyk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7CisgIAorIGVycm9yOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX3V1aWRfZmlsZV9leGNsdXNpdmVseSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzR1VJRCAgICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgZW5jb2RlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW5jb2RlZCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19nZW5lcmF0ZV91dWlkICh1dWlkKTsKKyAgCisgIGlmICghX2RidXNfdXVpZF9lbmNvZGUgKHV1aWQsICZlbmNvZGVkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmZW5jb2RlZCwgJ1xuJykpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKCZlbmNvZGVkLCBmaWxlbmFtZSwgVFJVRSwgZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbmNvZGVkKTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7CisgIAorIGVycm9yOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZW5jb2RlZCk7CisgIHJldHVybiBGQUxTRTsgICAgICAgIAorfQorCisvKioKKyAqIFJlYWRzIChhbmQgb3B0aW9uYWxseSB3cml0ZXMpIGEgdXVpZCB0byBhIGZpbGUuIEluaXRpYWxpemVzIHRoZSB1dWlkCisgKiB1bmxlc3MgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlCisgKiBAcGFyYW0gdXVpZCB1dWlkIHRvIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGxvYWRlZCB1dWlkCisgKiBAcGFyYW0gY3JlYXRlX2lmX25vdF9mb3VuZCAjVFJVRSB0byBjcmVhdGUgYSBuZXcgdXVpZCBhbmQgc2F2ZSBpdCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0CisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHJldHVybgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfdXVpZF9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzR1VJRCAgICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNFcnJvciByZWFkX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIGlmIChfZGJ1c19yZWFkX3V1aWRfZmlsZV93aXRob3V0X2NyZWF0aW5nIChmaWxlbmFtZSwgdXVpZCwgJnJlYWRfZXJyb3IpKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghY3JlYXRlX2lmX25vdF9mb3VuZCkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZyZWFkX2Vycm9yLCBlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIElmIHRoZSBmaWxlIGV4aXN0cyBhbmQgY29udGFpbnMganVuaywgd2Ugd2FudCB0byBrZWVwIHRoYXQgZXJyb3IKKyAgICogbWVzc2FnZSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0IHdpdGggYSAiZmlsZSBleGlzdHMiIGVycm9yCisgICAqIG1lc3NhZ2Ugd2hlbiB3ZSB0cnkgdG8gd3JpdGUKKyAgICovCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmcmVhZF9lcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0ZJTEVfQ09OVEVOVCkpCisgICAgeworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmcmVhZF9lcnJvciwgZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnJlYWRfZXJyb3IpOworICAgICAgcmV0dXJuIF9kYnVzX2NyZWF0ZV91dWlkX2ZpbGVfZXhjbHVzaXZlbHkgKGZpbGVuYW1lLCB1dWlkLCBlcnJvcik7CisgICAgfQorfQorCitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKG1hY2hpbmVfdXVpZCk7CitzdGF0aWMgaW50IG1hY2hpbmVfdXVpZF9pbml0aWFsaXplZF9nZW5lcmF0aW9uID0gMDsKK3N0YXRpYyBEQnVzR1VJRCBtYWNoaW5lX3V1aWQ7CisKKy8qKgorICogR2V0cyB0aGUgaGV4LWVuY29kZWQgVVVJRCBvZiB0aGUgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGlzCisgKiBleGVjdXRlZCBvbi4gVGhpcyBVVUlEIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGEgZ2l2ZW4KKyAqIG1hY2hpbmUgYXQgbGVhc3QgdW50aWwgaXQgbmV4dCByZWJvb3RzLCB0aG91Z2ggaXQgYWxzbworICogbWFrZXMgc29tZSBlZmZvcnQgdG8gYmUgdGhlIHNhbWUgZm9yZXZlciwgaXQgbWF5IGNoYW5nZSBpZiB0aGUKKyAqIG1hY2hpbmUgaXMgcmVjb25maWd1cmVkIG9yIGl0cyBoYXJkd2FyZSBpcyBtb2RpZmllZC4KKyAqIAorICogQHBhcmFtIHV1aWRfc3RyIHN0cmluZyB0byBhcHBlbmQgaGV4LWVuY29kZWQgbWFjaGluZSB1dWlkIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKERCdXNTdHJpbmcgKnV1aWRfc3RyKQoreworICBkYnVzX2Jvb2xfdCBvazsKKyAgCisgIF9EQlVTX0xPQ0sgKG1hY2hpbmVfdXVpZCk7CisgIGlmIChtYWNoaW5lX3V1aWRfaW5pdGlhbGl6ZWRfZ2VuZXJhdGlvbiAhPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgICAgICBpZiAoIV9kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkICgmbWFjaGluZV91dWlkLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsgICAgICAgICAgCisjaWZuZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgICAgICAvKiBGb3IgdGhlIHRlc3Qgc3VpdGUsIHdlIG1heSBub3QgYmUgaW5zdGFsbGVkIHNvIGp1c3QgY29udGludWUgc2lsZW50bHkKKyAgICAgICAgICAgKiBoZXJlLiBCdXQgaW4gYSBwcm9kdWN0aW9uIGJ1aWxkLCB3ZSB3YW50IHRvIGJlIG5pY2UgYW5kIGxvdWQgYWJvdXQKKyAgICAgICAgICAgKiB0aGlzLgorICAgICAgICAgICAqLworICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiRC1CdXMgbGlicmFyeSBhcHBlYXJzIHRvIGJlIGluY29ycmVjdGx5IHNldCB1cDsgZmFpbGVkIHRvIHJlYWQgbWFjaGluZSB1dWlkOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VlIHRoZSBtYW51YWwgcGFnZSBmb3IgZGJ1cy11dWlkZ2VuIHRvIGNvcnJlY3QgdGhpcyBpc3N1ZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX2dlbmVyYXRlX3V1aWQgKCZtYWNoaW5lX3V1aWQpOworICAgICAgICB9CisgICAgfQorCisgIG9rID0gX2RidXNfdXVpZF9lbmNvZGUgKCZtYWNoaW5lX3V1aWQsIHV1aWRfc3RyKTsKKworICBfREJVU19VTkxPQ0sgKG1hY2hpbmVfdXVpZCk7CisKKyAgcmV0dXJuIG9rOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIG5hbWUuCisgKgorICogQHBhcmFtIGhlYWRlcl9maWVsZCB0aGUgZmllbGQgdG8gZGVzY3JpYmUKKyAqIEByZXR1cm5zIGEgY29uc3RhbnQgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGZpZWxkCisgKi8KK2NvbnN0IGNoYXIgKgorX2RidXNfaGVhZGVyX2ZpZWxkX3RvX3N0cmluZyAoaW50IGhlYWRlcl9maWVsZCkKK3sKKyAgc3dpdGNoIChoZWFkZXJfZmllbGQpCisgICAgeworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfSU5WQUxJRDoKKyAgICAgIHJldHVybiAiaW52YWxpZCI7CisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9QQVRIOgorICAgICAgcmV0dXJuICJwYXRoIjsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRToKKyAgICAgIHJldHVybiAiaW50ZXJmYWNlIjsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUjoKKyAgICAgIHJldHVybiAibWVtYmVyIjsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUU6CisgICAgICByZXR1cm4gImVycm9yLW5hbWUiOworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMOgorICAgICAgcmV0dXJuICJyZXBseS1zZXJpYWwiOworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT046CisgICAgICByZXR1cm4gImRlc3RpbmF0aW9uIjsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUjoKKyAgICAgIHJldHVybiAic2VuZGVyIjsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRToKKyAgICAgIHJldHVybiAic2lnbmF0dXJlIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKy8qKiBTdHJpbmcgdXNlZCBpbiBfZGJ1c19yZXR1cm5faWZfZmFpbCBtYWNybyAqLworY29uc3QgY2hhciAqX2RidXNfcmV0dXJuX2lmX2ZhaWxfd2FybmluZ19mb3JtYXQgPQorImFyZ3VtZW50cyB0byAlcygpIHdlcmUgaW5jb3JyZWN0LCBhc3NlcnRpb24gXCIlc1wiIGZhaWxlZCBpbiBmaWxlICVzIGxpbmUgJWQuXG4iCisiVGhpcyBpcyBub3JtYWxseSBhIGJ1ZyBpbiBzb21lIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBELUJ1cyBsaWJyYXJ5LlxuIjsKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKy8qKgorICogSW50ZXJuYWxzIG9mIF9kYnVzX2Fzc2VydCgpOyBpdCdzIGEgZnVuY3Rpb24KKyAqIHJhdGhlciB0aGFuIGEgbWFjcm8gd2l0aCB0aGUgaW5saW5lIGNvZGUgc28KKyAqIHRoYXQgdGhlIGFzc2VydGlvbiBmYWlsdXJlIGJsb2NrcyBkb24ndCBzaG93IHVwCisgKiBpbiB0ZXN0IHN1aXRlIGNvdmVyYWdlLCBhbmQgdG8gc2hyaW5rIGNvZGUgc2l6ZS4KKyAqCisgKiBAcGFyYW0gY29uZGl0aW9uIFRSVUUgaWYgYXNzZXJ0aW9uIHN1Y2NlZWRlZAorICogQHBhcmFtIGNvbmRpdGlvbl90ZXh0IGNvbmRpdGlvbiBhcyBhIHN0cmluZworICogQHBhcmFtIGZpbGUgZmlsZSB0aGUgYXNzZXJ0aW9uIGlzIGluCisgKiBAcGFyYW0gbGluZSBsaW5lIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqIEBwYXJhbSBmdW5jIGZ1bmN0aW9uIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqLwordm9pZAorX2RidXNfcmVhbF9hc3NlcnQgKGRidXNfYm9vbF90ICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmNvbmRpdGlvbl90ZXh0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBsaW5lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpmdW5jKQoreworICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFjb25kaXRpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlbHU6IGFzc2VydGlvbiBmYWlsZWQgXCIlc1wiIGZpbGUgXCIlc1wiIGxpbmUgJWQgZnVuY3Rpb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19waWRfZm9yX2xvZyAoKSwgY29uZGl0aW9uX3RleHQsIGZpbGUsIGxpbmUsIGZ1bmMpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorfQorCisvKioKKyAqIEludGVybmFscyBvZiBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoKTsgaXQncyBhIGZ1bmN0aW9uCisgKiByYXRoZXIgdGhhbiBhIG1hY3JvIHdpdGggdGhlIGlubGluZSBjb2RlIHNvCisgKiB0aGF0IHRoZSBhc3NlcnRpb24gZmFpbHVyZSBibG9ja3MgZG9uJ3Qgc2hvdyB1cAorICogaW4gdGVzdCBzdWl0ZSBjb3ZlcmFnZSwgYW5kIHRvIHNocmluayBjb2RlIHNpemUuCisgKgorICogQHBhcmFtIGV4cGxhbmF0aW9uIHdoYXQgd2FzIHJlYWNoZWQgdGhhdCBzaG91bGRuJ3QgaGF2ZSBiZWVuCisgKiBAcGFyYW0gZmlsZSBmaWxlIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqIEBwYXJhbSBsaW5lIGxpbmUgdGhlIGFzc2VydGlvbiBpcyBpbgorICovCit2b2lkCitfZGJ1c19yZWFsX2Fzc2VydF9ub3RfcmVhY2hlZCAoY29uc3QgY2hhciAqZXhwbGFuYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsaW5lKQoreworICBfZGJ1c193YXJuICgiRmlsZSBcIiVzXCIgbGluZSAlZCBwcm9jZXNzICVsdSBzaG91bGQgbm90IGhhdmUgYmVlbiByZWFjaGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZSwgbGluZSwgX2RidXNfcGlkX2Zvcl9sb2cgKCksIGV4cGxhbmF0aW9uKTsKKyAgX2RidXNfYWJvcnQgKCk7Cit9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0FTU0VSVCAqLworICAKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCitzdGF0aWMgZGJ1c19ib29sX3QKK3J1bl9mYWlsaW5nX2VhY2hfbWFsbG9jIChpbnQgICAgICAgICAgICAgICAgICAgIG5fbWFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUZXN0TWVtb3J5RnVuY3Rpb24gZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIG5fbWFsbG9jcyArPSAxMDsgLyogZnVkZ2UgZmFjdG9yIHRvIGVuc3VyZSByZWFsbG9jcyBldGMuIGFyZSBjb3ZlcmVkICovCisgIAorICB3aGlsZSAobl9tYWxsb2NzID49IDApCisgICAgeyAgICAgIAorICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAobl9tYWxsb2NzKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIlxuPT09XG4lczogKHdpbGwgZmFpbCBtYWxsb2MgJWQgd2l0aCAlZCBmYWlsdXJlcylcbj09PVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBuX21hbGxvY3MsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAoKSk7CisKKyAgICAgIGlmICghKCogZnVuYykgKGRhdGEpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIG5fbWFsbG9jcyAtPSAxOworICAgIH0KKworICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyIChfREJVU19JTlRfTUFYKTsKKworICByZXR1cm4gVFJVRTsKK30gICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqCisgKiBUZXN0cyBob3cgd2VsbCB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmVzcG9uZHMgdG8gb3V0LW9mLW1lbW9yeQorICogc2l0dWF0aW9ucy4gQ2FsbHMgdGhlIGZ1bmN0aW9uIHJlcGVhdGVkbHksIGZhaWxpbmcgYSBkaWZmZXJlbnQKKyAqIGNhbGwgdG8gbWFsbG9jKCkgZWFjaCB0aW1lLiBJZiB0aGUgZnVuY3Rpb24gZXZlciByZXR1cm5zICNGQUxTRSwKKyAqIHRoZSB0ZXN0IGZhaWxzLiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAjVFJVRSB3aGVuZXZlciBzb21ldGhpbmcKKyAqIHZhbGlkIChzdWNoIGFzIHJldHVybmluZyBhbiBlcnJvciwgb3Igc3VjY2VlZGluZykgb2NjdXJzLCBhbmQgI0ZBTFNFCisgKiBpZiBpdCBnZXRzIGNvbmZ1c2VkIGluIHNvbWUgd2F5LgorICoKKyAqIEBwYXJhbSBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdCB1c2VkIGluIHZlcmJvc2Ugb3V0cHV0CisgKiBAcGFyYW0gZnVuYyBmdW5jdGlvbiB0byBjYWxsCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gZnVuY3Rpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBmdW5jdGlvbiBuZXZlciByZXR1cm5zIEZBTFNFCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoY29uc3QgY2hhciAgICAgICAgICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbiAgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBpbnQgYXBwcm94X21hbGxvY3M7CisgIGNvbnN0IGNoYXIgKnNldHRpbmc7CisgIGludCBtYXhfZmFpbHVyZXNfdG9fdHJ5OworICBpbnQgaTsKKworICAvKiBSdW4gb25jZSB0byBzZWUgYWJvdXQgaG93IG1hbnkgbWFsbG9jcyBhcmUgaW52b2x2ZWQgKi8KKyAgCisgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgKF9EQlVTX0lOVF9NQVgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSdW5uaW5nIG9uY2UgdG8gY291bnQgbWFsbG9jc1xuIik7CisgIAorICBpZiAoISgqIGZ1bmMpIChkYXRhKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBhcHByb3hfbWFsbG9jcyA9IF9EQlVTX0lOVF9NQVggLSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbj09PT09PT09PT09PT09PT09XG4lczogYWJvdXQgJWQgbWFsbG9jcyB0b3RhbFxuPT09PT09PT09PT09PT09PT1cbiIsCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBhcHByb3hfbWFsbG9jcyk7CisKKyAgc2V0dGluZyA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9NQUxMT0NfRkFJTFVSRVMiKTsKKyAgaWYgKHNldHRpbmcgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgIGxvbmcgdjsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBzZXR0aW5nKTsKKyAgICAgIHYgPSA0OworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmc3RyLCAwLCAmdiwgTlVMTCkpCisgICAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBwYXJzZSAnJXMnIGFzIGludGVnZXJcbiIsIHNldHRpbmcpOworICAgICAgbWF4X2ZhaWx1cmVzX3RvX3RyeSA9IHY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWF4X2ZhaWx1cmVzX3RvX3RyeSA9IDQ7CisgICAgfQorCisgIGkgPSBzZXR0aW5nID8gbWF4X2ZhaWx1cmVzX3RvX3RyeSAtIDEgOiAxOworICB3aGlsZSAoaSA8IG1heF9mYWlsdXJlc190b190cnkpCisgICAgeworICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgKGkpOworICAgICAgaWYgKCFydW5fZmFpbGluZ19lYWNoX21hbGxvYyAoYXBwcm94X21hbGxvY3MsIGRlc2NyaXB0aW9uLCBmdW5jLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgKytpOworICAgIH0KKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJcbj09PT09PT09PT09PT09PT09XG4lczogYWxsIGl0ZXJhdGlvbnMgcGFzc2VkXG49PT09PT09PT09PT09PT09PVxuIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24pOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtaW50ZXJuYWxzLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtaW50ZXJuYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlZjdkNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1pbnRlcm5hbHMuaApAQCAtMCwwICsxLDM2NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWludGVybmFscy5oICByYW5kb20gdXRpbGl0eSBzdHVmZiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZkZWYgREJVU19JTlNJREVfREJVU19ICisjZXJyb3IgIllvdSBjYW4ndCBpbmNsdWRlIGRidXMtaW50ZXJuYWxzLmggaW4gdGhlIHB1YmxpYyBoZWFkZXIgZGJ1cy5oIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19JTlRFUk5BTFNfSAorI2RlZmluZSBEQlVTX0lOVEVSTkFMU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRocmVhZHMtaW50ZXJuYWwuaD4KKworREJVU19CRUdJTl9ERUNMUworCisjaWZuZGVmIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTCisjZGVmaW5lIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTCSJhdXRvbGF1bmNoOiIKKyNlbmRpZgorCit2b2lkIF9kYnVzX3dhcm4gICAgICAgICAgICAgICAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDEsIDIpOworCit2b2lkIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDEsIDIpOworCisKKyNpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKQorI2RlZmluZSBfREJVU19GVU5DVElPTl9OQU1FIF9fZnVuY19fCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBfREJVU19GVU5DVElPTl9OQU1FIF9fRlVOQ1RJT05fXworI2Vsc2UKKyNkZWZpbmUgX0RCVVNfRlVOQ1RJT05fTkFNRSAidW5rbm93biBmdW5jdGlvbiIKKyNlbmRpZgorCisvKgorICogKGNvZGUgZnJvbSBHTGliKQorICogCisgKiBUaGUgX0RCVVNfTElLRUxZIGFuZCBfREJVU19VTkxJS0VMWSBtYWNyb3MgbGV0IHRoZSBwcm9ncmFtbWVyIGdpdmUgaGludHMgdG8gCisgKiB0aGUgY29tcGlsZXIgYWJvdXQgdGhlIGV4cGVjdGVkIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uLiBTb21lIGNvbXBpbGVycworICogY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciBvcHRpbWl6YXRpb25zLgorICoKKyAqIFRoZSBfREJVU19CT09MRUFOX0VYUFIgbWFjcm8gaXMgaW50ZW5kZWQgdG8gdHJpZ2dlciBhIGdjYyB3YXJuaW5nIHdoZW4KKyAqIHB1dHRpbmcgYXNzaWdubWVudHMgaW4gdGhlIG1hY3JvIGFyZworICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID4gMikgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCisjZGVmaW5lIF9EQlVTX0JPT0xFQU5fRVhQUihleHByKSAgICAgICAgICAgICAgICBcCisgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBpbnQgX2RidXNfYm9vbGVhbl92YXJfOyAgICAgICAgICAgICAgICAgICAgICBcCisgICBpZiAoZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfZGJ1c19ib29sZWFuX3Zhcl8gPSAxOyAgICAgICAgICAgICAgICAgICBcCisgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfZGJ1c19ib29sZWFuX3Zhcl8gPSAwOyAgICAgICAgICAgICAgICAgICBcCisgICBfZGJ1c19ib29sZWFuX3Zhcl87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2RlZmluZSBfREJVU19MSUtFTFkoZXhwcikgKF9fYnVpbHRpbl9leHBlY3QgKF9EQlVTX0JPT0xFQU5fRVhQUihleHByKSwgMSkpCisjZGVmaW5lIF9EQlVTX1VOTElLRUxZKGV4cHIpIChfX2J1aWx0aW5fZXhwZWN0IChfREJVU19CT09MRUFOX0VYUFIoZXhwciksIDApKQorI2Vsc2UKKyNkZWZpbmUgX0RCVVNfTElLRUxZKGV4cHIpIChleHByKQorI2RlZmluZSBfREJVU19VTkxJS0VMWShleHByKSAoZXhwcikKKyNlbmRpZgorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisKKy8qCisgYXQgbGVhc3QgZ251IGNjIGFuZCBtc3ZjIGNvbXBpbGVyIGFyZSBrbm93biB0byAKKyBoYXZlIHN1cHBvcnQgZm9yIHZhcmlhYmxlIG1hY3JvIGFyZ3VtZW50IGxpc3RzCisgYWRkIG90aGVyIGNvbXBpbGVycyBpcyByZXF1aXJlZAorKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSAKKyNkZWZpbmUgREJVU19DUFBfU1VQUE9SVFNfVkFSSUFCTEVfTUFDUk9fQVJHVU1FTlRTCisjZW5kaWYKKworI2lmZGVmIERCVVNfQ1BQX1NVUFBPUlRTX1ZBUklBQkxFX01BQ1JPX0FSR1VNRU5UUwordm9pZCBfZGJ1c192ZXJib3NlX3JlYWwgICAgICAgKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDQsIDUpOworIyAgZGVmaW5lIF9kYnVzX3ZlcmJvc2UoZm10LC4uLikgX2RidXNfdmVyYm9zZV9yZWFsKCBfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCit2b2lkIF9kYnVzX3ZlcmJvc2VfcmVhbCAgICAgICAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDEsIDIpOworIyAgZGVmaW5lIF9kYnVzX3ZlcmJvc2UgX2RidXNfdmVyYm9zZV9yZWFsCisjZW5kaWYKK3ZvaWQgX2RidXNfdmVyYm9zZV9yZXNldF9yZWFsICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2lzX3ZlcmJvc2VfcmVhbCAodm9pZCk7CisKKyMgIGRlZmluZSBfZGJ1c192ZXJib3NlX3Jlc2V0IF9kYnVzX3ZlcmJvc2VfcmVzZXRfcmVhbAorIyAgZGVmaW5lIF9kYnVzX2lzX3ZlcmJvc2UgX2RidXNfaXNfdmVyYm9zZV9yZWFsCisjZWxzZQorIyAgaWZkZWYgSEFWRV9JU09fVkFSQVJHUworIyAgICBkZWZpbmUgX2RidXNfdmVyYm9zZSguLi4pCisjICBlbGlmIGRlZmluZWQgKEhBVkVfR05VQ19WQVJBUkdTKQorIyAgICBkZWZpbmUgX2RidXNfdmVyYm9zZShmb3JtYXQuLi4pCisjICBlbHNlCitzdGF0aWMgdm9pZCBfZGJ1c192ZXJib3NlKGNvbnN0IGNoYXIgKiB4LC4uLikgezt9CisjICBlbmRpZgorIyAgZGVmaW5lIF9kYnVzX3ZlcmJvc2VfcmVzZXQoKQorIyAgZGVmaW5lIF9kYnVzX2lzX3ZlcmJvc2UoKSBGQUxTRSAKKyNlbmRpZiAvKiAhREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKK2NvbnN0IGNoYXIqIF9kYnVzX3N0cmVycm9yIChpbnQgZXJyb3JfbnVtYmVyKTsKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyNkZWZpbmUgX2RidXNfYXNzZXJ0KGNvbmRpdGlvbikKKyNlbHNlCit2b2lkIF9kYnVzX3JlYWxfYXNzZXJ0IChkYnVzX2Jvb2xfdCAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmNvbmRpdGlvbl90ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpmdW5jKTsKKyNkZWZpbmUgX2RidXNfYXNzZXJ0KGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfcmVhbF9hc3NlcnQgKChjb25kaXRpb24pICE9IDAsICNjb25kaXRpb24sIF9fRklMRV9fLCBfX0xJTkVfXywgX0RCVVNfRlVOQ1RJT05fTkFNRSkKKyNlbmRpZiAvKiAhREJVU19ESVNBQkxFX0FTU0VSVCAqLworCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorI2RlZmluZSBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoZXhwbGFuYXRpb24pCisjZWxzZQordm9pZCBfZGJ1c19yZWFsX2Fzc2VydF9ub3RfcmVhY2hlZCAoY29uc3QgY2hhciAqZXhwbGFuYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGluZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKyNkZWZpbmUgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKGV4cGxhbmF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19yZWFsX2Fzc2VydF9ub3RfcmVhY2hlZCAoZXhwbGFuYXRpb24sIF9fRklMRV9fLCBfX0xJTkVfXykKKyNlbmRpZiAvKiAhREJVU19ESVNBQkxFX0FTU0VSVCAqLworCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworI2RlZmluZSBfZGJ1c19yZXR1cm5faWZfZmFpbChjb25kaXRpb24pCisjZGVmaW5lIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbChjb25kaXRpb24sIHZhbCkKKyNlbHNlCisKK2V4dGVybiBjb25zdCBjaGFyICpfZGJ1c19yZXR1cm5faWZfZmFpbF93YXJuaW5nX2Zvcm1hdDsKKworI2RlZmluZSBfZGJ1c19yZXR1cm5faWZfZmFpbChjb25kaXRpb24pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBfZGJ1c19hc3NlcnQgKCgqKGNvbnN0IGNoYXIqKV9EQlVTX0ZVTkNUSU9OX05BTUUpICE9ICdfJyk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoY29uZGl0aW9uKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkIChfZGJ1c19yZXR1cm5faWZfZmFpbF93YXJuaW5nX2Zvcm1hdCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0ZVTkNUSU9OX05BTUUsICNjb25kaXRpb24sIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsKGNvbmRpdGlvbiwgdmFsKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBfZGJ1c19hc3NlcnQgKCgqKGNvbnN0IGNoYXIqKV9EQlVTX0ZVTkNUSU9OX05BTUUpICE9ICdfJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShjb25kaXRpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoX2RidXNfcmV0dXJuX2lmX2ZhaWxfd2FybmluZ19mb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0ZVTkNUSU9OX05BTUUsICNjb25kaXRpb24sIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgXAorICAgIHJldHVybiAodmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogIURCVVNfRElTQUJMRV9BU1NFUlQgKi8KKworI2RlZmluZSBfREJVU19OX0VMRU1FTlRTKGFycmF5KSAoKGludCkgKHNpemVvZiAoKGFycmF5KSkgLyBzaXplb2YgKChhcnJheSlbMF0pKSkKKworI2RlZmluZSBfREJVU19QT0lOVEVSX1RPX0lOVChwb2ludGVyKSAoKGludHB0cl90KShwb2ludGVyKSkKKyNkZWZpbmUgX0RCVVNfSU5UX1RPX1BPSU5URVIoaW50ZWdlcikgKCh2b2lkKikoKGludHB0cl90KShpbnRlZ2VyKSkpCisKKyNkZWZpbmUgX0RCVVNfWkVSTyhvYmplY3QpIChtZW1zZXQgKCYob2JqZWN0KSwgJ1wwJywgc2l6ZW9mICgob2JqZWN0KSkpKQorCisjZGVmaW5lIF9EQlVTX1NUUlVDVF9PRkZTRVQoc3RydWN0X3R5cGUsIG1lbWJlcikJXAorICAgICgoaW50cHRyX3QpICgodW5zaWduZWQgY2hhciopICYoKHN0cnVjdF90eXBlKikgMCktPm1lbWJlcikpCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisvKiB0aGlzIGlzIGFuIGFzc2VydCBhbmQgbm90IGFuIGVycm9yLCBidXQgaW4gdGhlIHR5cGljYWwgLS1kaXNhYmxlLWNoZWNrcyBjYXNlICh5b3UncmUgdHJ5aW5nCisgKiB0byByZWFsbHkgbWluaW1pemUgY29kZSBzaXplKSwgZGlzYWJsaW5nIHRoZXNlIGFzc2VydGlvbnMgbWFrZXMgc2Vuc2UuCisgKi8KKyNkZWZpbmUgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcikKKyNkZWZpbmUgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKQorI2Vsc2UKKyNkZWZpbmUgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcikgICBfZGJ1c19hc3NlcnQgKChlcnJvcikgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoKGVycm9yKSkpCisjZGVmaW5lIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcikgX2RidXNfYXNzZXJ0ICgoZXJyb3IpID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0ICgoZXJyb3IpKSkKKyNlbmRpZgorCisjZGVmaW5lIF9kYnVzX3JldHVybl9pZl9lcnJvcl9pc19zZXQoZXJyb3IpIF9kYnVzX3JldHVybl9pZl9mYWlsICgoZXJyb3IpID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0ICgoZXJyb3IpKSkKKyNkZWZpbmUgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQoZXJyb3IsIHZhbCkgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICgoZXJyb3IpID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0ICgoZXJyb3IpKSwgKHZhbCkpCisKKy8qIFRoaXMgYWxpZ25tZW50IHRoaW5nIGlzIGZyb20gT1JCaXQyICovCisvKiBBbGlnbiBhIHZhbHVlIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCisgKiBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguCisgKi8KKworLyoKKyAqICAgKHRoaXMgKyBib3VuZGFyeSAtIDEpCisgKiAgICAgICAgICAmCisgKiAgICB+KGJvdW5kYXJ5IC0gMSkKKyAqLworCisjZGVmaW5lIF9EQlVTX0FMSUdOX1ZBTFVFKHRoaXMsIGJvdW5kYXJ5KSBcCisgICgoICgodWludHB0cl90KSh0aGlzKSkgKyAoKCh1aW50cHRyX3QpKGJvdW5kYXJ5KSkgLTEpKSAmICh+KCgodWludHB0cl90KShib3VuZGFyeSkpLTEpKSkKKworI2RlZmluZSBfREJVU19BTElHTl9BRERSRVNTKHRoaXMsIGJvdW5kYXJ5KSBcCisgICgodm9pZCopX0RCVVNfQUxJR05fVkFMVUUodGhpcywgYm91bmRhcnkpKQorCisKK2NoYXIqICAgICAgIF9kYnVzX3N0cmR1cCAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAgKnN0cik7Cit2b2lkKiAgICAgICBfZGJ1c19tZW1kdXAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgICptZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBuX2J5dGVzKTsKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoY29uc3QgY2hhciAqKmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqc3RyKTsKK2NoYXIqKiAgICAgIF9kYnVzX2R1cF9zdHJpbmdfYXJyYXkgICAgICAoY29uc3QgY2hhciAqKmFycmF5KTsKKworI2RlZmluZSBfREJVU19JTlQxNl9NSU4JICgoZGJ1c19pbnQxNl90KSAweDgwMDApCisjZGVmaW5lIF9EQlVTX0lOVDE2X01BWAkgKChkYnVzX2ludDE2X3QpIDB4N2ZmZikKKyNkZWZpbmUgX0RCVVNfVUlOVDE2X01BWCAoKGRidXNfdWludDE2X3QpMHhmZmZmKQorI2RlZmluZSBfREJVU19JTlQzMl9NSU4JICgoZGJ1c19pbnQzMl90KSAweDgwMDAwMDAwKQorI2RlZmluZSBfREJVU19JTlQzMl9NQVgJICgoZGJ1c19pbnQzMl90KSAweDdmZmZmZmZmKQorI2RlZmluZSBfREJVU19VSU5UMzJfTUFYICgoZGJ1c191aW50MzJfdCkweGZmZmZmZmZmKQorLyogdXNpbmcgMzItYml0IGhlcmUgaXMgc29ydCBvZiBib2d1cyAqLworI2RlZmluZSBfREJVU19JTlRfTUlOCSBfREJVU19JTlQzMl9NSU4KKyNkZWZpbmUgX0RCVVNfSU5UX01BWAkgX0RCVVNfSU5UMzJfTUFYCisjZGVmaW5lIF9EQlVTX1VJTlRfTUFYCSBfREJVU19VSU5UMzJfTUFYCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisjZGVmaW5lIF9EQlVTX0lOVDY0X01BWAkgREJVU19JTlQ2NF9DT05TVEFOVCAgKDB4N2ZmZmZmZmZmZmZmZmZmZikKKyNkZWZpbmUgX0RCVVNfVUlOVDY0X01BWCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHhmZmZmZmZmZmZmZmZmZmZmKQorI2VuZGlmCisjZGVmaW5lIF9EQlVTX09ORV9LSUxPQllURSAxMDI0CisjZGVmaW5lIF9EQlVTX09ORV9NRUdBQllURSAxMDI0ICogX0RCVVNfT05FX0tJTE9CWVRFCisjZGVmaW5lIF9EQlVTX09ORV9IT1VSX0lOX01JTExJU0VDT05EUyAoMTAwMCAqIDYwICogNjApCisjZGVmaW5lIF9EQlVTX1VTRUNfUEVSX1NFQ09ORCAgICAgICAgICAoMTAwMDAwMCkKKworI3VuZGVmCU1BWAorI2RlZmluZSBNQVgoYSwgYikgICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCU1JTgorI2RlZmluZSBNSU4oYSwgYikgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCUFCUworI2RlZmluZSBBQlMoYSkJICAgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCisKKyNkZWZpbmUgX0RCVVNfSVNBU0NJSShjKSAoKGMpICE9ICdcMCcgJiYgKCgoYykgJiB+MHg3ZikgPT0gMCkpCisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzRm9yZWFjaEZ1bmN0aW9uKSAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK2RidXNfYm9vbF90IF9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoaW50ICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCit2b2lkIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKK3ZvaWQgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGNvbnN0IERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuKTsKKworY29uc3QgY2hhciogX2RidXNfaGVhZGVyX2ZpZWxkX3RvX3N0cmluZyAoaW50IGhlYWRlcl9maWVsZCk7CisKK2V4dGVybiBjb25zdCBjaGFyICpfZGJ1c19ub19tZW1vcnlfbWVzc2FnZTsKKyNkZWZpbmUgX0RCVVNfU0VUX09PTShlcnJvcikgZGJ1c19zZXRfZXJyb3JfY29uc3QgKChlcnJvciksIERCVVNfRVJST1JfTk9fTUVNT1JZLCBfZGJ1c19ub19tZW1vcnlfbWVzc2FnZSkKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qIE1lbW9yeSBkZWJ1Z2dpbmcgKi8KK3ZvaWQgICAgICAgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgICAgICAgIChpbnQgIHVudGlsX25leHRfZmFpbCk7CitpbnQgICAgICAgICBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAgICAgICAoaW50ICBmYWlsdXJlc19wZXJfZmFpbHVyZSk7CitpbnQgICAgICAgICBfZGJ1c19nZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19kaXNhYmxlX21lbV9wb29scyAgICAgICAgICAgICAodm9pZCk7CitpbnQgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAodm9pZCk7CisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbikgICh2b2lkICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChjb25zdCBjaGFyICAgICAgICAgICAgICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmRhdGEpOworI2Vsc2UKKyNkZWZpbmUgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlcihuKQorI2RlZmluZSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyIF9EQlVTX0lOVF9NQVgKKworLyogVGhlc2UgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIHNvIHRoYXQgYmxvY2tzCisgKiB0aGV5IHByb3RlY3Qgc2hvdWxkIGJlIG9wdGltaXplZCBhd2F5CisgKi8KKyNkZWZpbmUgX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlcigpIChGQUxTRSkKKyNkZWZpbmUgX2RidXNfZGlzYWJsZV9tZW1fcG9vbHMoKSAgICAgICAgICAgIChGQUxTRSkKKyNkZWZpbmUgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgICgwKQorI2VuZGlmIC8qICFEQlVTX0JVSUxEX1RFU1RTICovCisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzU2h1dGRvd25GdW5jdGlvbikgKHZvaWQgKmRhdGEpOworZGJ1c19ib29sX3QgX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoREJ1c1NodXRkb3duRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmRhdGEpOworCitleHRlcm4gaW50IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbjsKKworLyogVGhyZWFkIGluaXRpYWxpemVycyAqLworI2RlZmluZSBfREJVU19MT0NLX05BTUUobmFtZSkgICAgICAgICAgIF9kYnVzX2xvY2tfIyNuYW1lCisjZGVmaW5lIF9EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sobmFtZSkgZXh0ZXJuIERCdXNNdXRleCAgKl9kYnVzX2xvY2tfIyNuYW1lCisjZGVmaW5lIF9EQlVTX0RFRklORV9HTE9CQUxfTE9DSyhuYW1lKSAgREJ1c011dGV4ICAgICAgICAgKl9kYnVzX2xvY2tfIyNuYW1lICAKKyNkZWZpbmUgX0RCVVNfTE9DSyhuYW1lKSAgICAgICAgICAgICAgICBfZGJ1c19tdXRleF9sb2NrICAgKF9kYnVzX2xvY2tfIyNuYW1lKQorI2RlZmluZSBfREJVU19VTkxPQ0sobmFtZSkgICAgICAgICAgICAgIF9kYnVzX211dGV4X3VubG9jayAoX2RidXNfbG9ja18jI25hbWUpCisKKy8qIDEtNSAqLworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAobGlzdCk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChjb25uZWN0aW9uX3Nsb3RzKTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKHBlbmRpbmdfY2FsbF9zbG90cyk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChzZXJ2ZXJfc2xvdHMpOworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAobWVzc2FnZV9zbG90cyk7CisvKiA1LTEwICovCitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChidXMpOworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAoYnVzX2RhdGFzKTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKHNodXRkb3duX2Z1bmNzKTsKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKHN5c3RlbV91c2Vycyk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChtZXNzYWdlX2NhY2hlKTsKKy8qIDEwLTE0ICovCitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworX0RCVVNfREVDTEFSRV9HTE9CQUxfTE9DSyAod2luX2Zkcyk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChzaWRfYXRvbV9jYWNoZSk7CitfREJVU19ERUNMQVJFX0dMT0JBTF9MT0NLIChtYWNoaW5lX3V1aWQpOworCisjaWYgIURCVVNfVVNFX1NZTkMKK19EQlVTX0RFQ0xBUkVfR0xPQkFMX0xPQ0sgKGF0b21pYyk7CisjZGVmaW5lIF9EQlVTX05fR0xPQkFMX0xPQ0tTICgxNSkKKyNlbHNlCisjZGVmaW5lIF9EQlVTX05fR0xPQkFMX0xPQ0tTICgxNCkKKyNlbmRpZgorCitkYnVzX2Jvb2xfdCBfZGJ1c190aHJlYWRzX2luaXRfZGVidWcgKHZvaWQpOworCitkYnVzX2Jvb2xfdCAgIF9kYnVzX2FkZHJlc3NfYXBwZW5kX2VzY2FwZWQgKERCdXNTdHJpbmcgICAgICAgKmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVuZXNjYXBlZCk7CisKK3ZvaWQgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzICAgICAgICAoREJ1c0Vycm9yICAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqYWRkcmVzc19wcm9ibGVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICphZGRyZXNzX3Byb2JsZW1fZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICphZGRyZXNzX3Byb2JsZW1fb3RoZXIpOworCisjZGVmaW5lIERCVVNfVVVJRF9MRU5HVEhfQllURVMgMTYKKyNkZWZpbmUgREJVU19VVUlEX0xFTkdUSF9XT1JEUyAoREJVU19VVUlEX0xFTkdUSF9CWVRFUyAvIDQpCisjZGVmaW5lIERCVVNfVVVJRF9MRU5HVEhfSEVYICAgKERCVVNfVVVJRF9MRU5HVEhfQllURVMgKiAyKQorCisvKioKKyAqIEEgZ2xvYmFsbHkgdW5pcXVlIElEIDsgd2UgaGF2ZSBvbmUgZm9yIGVhY2ggREJ1c1NlcnZlciwgYW5kIGFsc28gb25lIGZvciBlYWNoCisgKiBtYWNoaW5lIHdpdGggbGliZGJ1cyBpbnN0YWxsZWQgb24gaXQuCisgKi8KK3VuaW9uIERCdXNHVUlECit7CisgIGRidXNfdWludDMyX3QgYXNfdWludDMyc1tEQlVTX1VVSURfTEVOR1RIX1dPUkRTXTsgICAgIC8qKjwgZ3VpZCBhcyBmb3VyIHVpbnQzMiB2YWx1ZXMgKi8KKyAgY2hhciBhc19ieXRlc1tEQlVTX1VVSURfTEVOR1RIX0JZVEVTXTsgICAgICAgICAgICAgICAgLyoqPCBndWlkIGFzIDE2IHNpbmdsZS1ieXRlIHZhbHVlcyAqLworfTsKKwordm9pZCAgICAgICAgX2RidXNfZ2VuZXJhdGVfdXVpZCAgKERCdXNHVUlEICAgICAgICAgKnV1aWQpOworZGJ1c19ib29sX3QgX2RidXNfdXVpZF9lbmNvZGUgICAgKGNvbnN0IERCdXNHVUlEICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZW5jb2RlZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX3V1aWRfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0dVSUQgICAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkIChEQnVzU3RyaW5nICp1dWlkX3N0cik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0lOVEVSTkFMU19IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMta2V5cmluZy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWtleXJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU4ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWtleXJpbmcuYwpAQCAtMCwwICsxLDExNTMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1rZXlyaW5nLmMgU3RvcmUgc2VjcmV0IGNvb2tpZXMgaW4geW91ciBob21lZGlyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMta2V5cmluZy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzS2V5cmluZyBrZXlyaW5nIGNsYXNzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNLZXlyaW5nIGRhdGEgc3RydWN0dXJlCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNLZXlyaW5nLiBEQnVzS2V5cmluZyBpcyBpbnRlbmRlZAorICogdG8gbWFuYWdlIGNvb2tpZXMgdXNlZCB0byBhdXRoZW50aWNhdGUgY2xpZW50cyB0byBzZXJ2ZXJzLiAgVGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlICJ2ZXJpZnkgdGhhdCBjbGllbnQgY2FuIHJlYWQgdGhlIHVzZXIncyBob21lZGlyIgorICogYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLiAgQm90aCBjbGllbnQgYW5kIHNlcnZlciBtdXN0IGhhdmUgYWNjZXNzCisgKiB0byB0aGUgaG9tZWRpci4KKyAqCisgKiBUaGUgc2VjcmV0IGtleXMgYXJlIG5vdCBrZXB0IGluIGxvY2tlZCBtZW1vcnksIGFuZCBhcmUgd3JpdHRlbiB0byBhCisgKiBmaWxlIGluIHRoZSB1c2VyJ3MgaG9tZWRpci4gSG93ZXZlciB0aGV5IGFyZSB0cmFuc2llbnQgKG9ubHkgdXNlZAorICogYnkgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlIGZvciBhIGZpeGVkIHBlcmlvZCBvZiB0aW1lLCB0aGVuCisgKiBkaXNjYXJkZWQpLiBBbHNvLCB0aGUga2V5cyBhcmUgbm90IHNlbnQgb3ZlciB0aGUgd2lyZS4KKyAqCisgKiBAdG9kbyB0aGVyZSdzIGEgbWVtb3J5IGxlYWsgb24gc29tZSBjb2RlcGF0aCBpbiBoZXJlLCBJIHNhdyBpdCBvbmNlCisgKiB3aGVuIHJ1bm5pbmcgbWFrZSBjaGVjayAtIHByb2JhYmx5IHNvbWUgc3BlY2lmaWMgaW5pdGlhbCBjb29raWVzCisgKiBwcmVzZW50IGluIHRoZSBjb29raWUgZmlsZSwgdGhlbiBkZXBlbmRpbmcgb24gd2hhdCB3ZSBkbyB3aXRoIHRoZW0uCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0tleXJpbmdJbnRlcm5hbHMgREJ1c0tleXJpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzS2V5cmluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogVGhlIGd1dHMgb2YgREJ1c0tleXJpbmcuCisgKgorICogQHsKKyAqLworCisvKiogVGhlIG1heGltdW0gYWdlIG9mIGEga2V5IGJlZm9yZSB3ZSBjcmVhdGUgYSBuZXcga2V5IHRvIHVzZSBpbgorICogY2hhbGxlbmdlcy4gIFRoaXMgaXNuJ3Qgc3VwZXItcmVsaWFibHkgZW5mb3JjZWQsIHNpbmNlIHN5c3RlbQorICogY2xvY2tzIGNhbiBjaGFuZ2Ugb3IgYmUgd3JvbmcsIGJ1dCB3ZSBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gb25seQorICogdXNlIGtleXMgZm9yIGEgc2hvcnQgdGltZS4KKyAqLworI2RlZmluZSBORVdfS0VZX1RJTUVPVVRfU0VDT05EUyAgICAgKDYwKjUpCisvKioKKyAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHdlIGRyb3AgYSBrZXkgZnJvbSB0aGUgc2VjcmV0cyBmaWxlLgorICogVGhlIEVYUElSRV9LRVlTX1RJTUVPVVRfU0VDT05EUyAtIE5FV19LRVlfVElNRU9VVF9TRUNPTkRTIGlzIHRoZSBtaW5pbXVtCisgKiB0aW1lIHdpbmRvdyBhIGNsaWVudCBoYXMgdG8gY29tcGxldGUgYXV0aGVudGljYXRpb24uCisgKi8KKyNkZWZpbmUgRVhQSVJFX0tFWVNfVElNRU9VVF9TRUNPTkRTIChORVdfS0VZX1RJTUVPVVRfU0VDT05EUyArICg2MCoyKSkKKy8qKgorICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYSBrZXkgY2FuIGJlIGluIHRoZSBmdXR1cmUuCisgKi8KKyNkZWZpbmUgTUFYX1RJTUVfVFJBVkVMX1NFQ09ORFMgKDYwKjUpCisKKy8qKgorICogTWF4aW11bSBudW1iZXIgb2Yga2V5cyBpbiB0aGUga2V5cmluZyBiZWZvcmUKKyAqIHdlIGp1c3QgaWdub3JlIHRoZSByZXN0CisgKi8KKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjZGVmaW5lIE1BWF9LRVlTX0lOX0ZJTEUgMTAKKyNlbHNlCisjZGVmaW5lIE1BWF9LRVlTX0lOX0ZJTEUgMjU2CisjZW5kaWYKKworLyoqCisgKiBBIHNpbmdsZSBrZXkgZnJvbSB0aGUgY29va2llIGZpbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZGJ1c19pbnQzMl90IGlkOyAvKio8IGlkZW50aWZpZXIgdXNlZCB0byByZWZlciB0byB0aGUga2V5ICovCisKKyAgbG9uZyBjcmVhdGlvbl90aW1lOyAvKio8IHdoZW4gdGhlIGtleSB3YXMgZ2VuZXJhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAqICAgYXMgdW5peCB0aW1lc3RhbXAuIHNpZ25lZCBsb25nCisgICAgICAgICAgICAgICAgICAgICAgICogICBtYXRjaGVzIHN0cnVjdCB0aW1ldmFsLgorICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgREJ1c1N0cmluZyBzZWNyZXQ7IC8qKjwgdGhlIGFjdHVhbCBrZXkgKi8KKworfSBEQnVzS2V5OworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c0tleXJpbmcuCisgKiAKKyAqIERCdXNLZXlyaW5nIGludGVybmFscy4gREJ1c0tleXJpbmcgaXMgYW4gb3BhcXVlIG9iamVjdCwgaXQgbXVzdCBiZQorICogdXNlZCB2aWEgYWNjZXNzb3IgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgREJ1c0tleXJpbmcKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzU3RyaW5nIGRpcmVjdG9yeTsgICAgIC8qKjwgRGlyZWN0b3J5IHRoZSBiZWxvdyB0d28gaXRlbXMgYXJlIGluc2lkZSAqLworICBEQnVzU3RyaW5nIGZpbGVuYW1lOyAgICAgIC8qKjwgS2V5cmluZyBmaWxlbmFtZSAqLworICBEQnVzU3RyaW5nIGZpbGVuYW1lX2xvY2s7IC8qKjwgTmFtZSBvZiBsb2NrZmlsZSAqLworICBEQnVzS2V5ICprZXlzOyAvKio8IEtleXMgbG9hZGVkIGZyb20gdGhlIGZpbGUgKi8KKyAgaW50IG5fa2V5czsgICAgLyoqPCBOdW1iZXIgb2Yga2V5cyAqLworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzOyAvKio8IENyZWRlbnRpYWxzIGNvbnRhaW5pbmcgdXNlciB0aGUga2V5cmluZyBpcyBmb3IgKi8KK307CisKK3N0YXRpYyBEQnVzS2V5cmluZyoKK19kYnVzX2tleXJpbmdfbmV3ICh2b2lkKQoreworICBEQnVzS2V5cmluZyAqa2V5cmluZzsKKworICBrZXlyaW5nID0gZGJ1c19uZXcwIChEQnVzS2V5cmluZywgMSk7CisgIGlmIChrZXlyaW5nID09IE5VTEwpCisgICAgZ290byBvdXRfMDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlyaW5nLT5kaXJlY3RvcnkpKQorICAgIGdvdG8gb3V0XzE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleXJpbmctPmZpbGVuYW1lKSkKKyAgICBnb3RvIG91dF8yOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrKSkKKyAgICBnb3RvIG91dF8zOworICAKKyAga2V5cmluZy0+cmVmY291bnQgPSAxOworICBrZXlyaW5nLT5rZXlzID0gTlVMTDsKKyAga2V5cmluZy0+bl9rZXlzID0gMDsKKworICByZXR1cm4ga2V5cmluZzsKKworIG91dF8zOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXJpbmctPmZpbGVuYW1lKTsKKyBvdXRfMjoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlyaW5nLT5kaXJlY3RvcnkpOworIG91dF8xOgorICBkYnVzX2ZyZWUgKGtleXJpbmcpOworIG91dF8wOgorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfa2V5cyAoREJ1c0tleSAqa2V5cywKKyAgICAgICAgICAgaW50ICAgICAgbl9rZXlzKQoreworICBpbnQgaTsKKworICAvKiBzaG91bGQgYmUgc2FmZSBmb3IgYXJncyBOVUxMLCAwICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW2ldLnNlY3JldCk7CisgICAgICArK2k7CisgICAgfQorCisgIGRidXNfZnJlZSAoa2V5cyk7Cit9CisKKy8qIE91ciBsb2NraW5nIHNjaGVtZSBpcyBoaWdobHkgdW5yZWxpYWJsZS4gIEhvd2V2ZXIsIHRoZXJlIGlzCisgKiB1bmZvcnR1bmF0ZWx5IG5vIHJlbGlhYmxlIGxvY2tpbmcgc2NoZW1lIGluIHVzZXIgaG9tZSBkaXJlY3RvcmllczsKKyAqIGJldHdlZW4gYnVncyBpbiBMaW51eCBORlMsIHBlb3BsZSB1c2luZyBUcnU2NCBvciBvdGhlciB0b3RhbCBjcmFwCisgKiBORlMsIEFGUywgcmFuZG9tLWZpbGUtc3lzdGVtLW9mLXRoZS13ZWVrLCBhbmQgc28gZm9ydGgsIGZjbnRsKCkgaW4KKyAqIGhvbWVkaXJzIHNpbXBseSBnZW5lcmF0ZXMgdG9ucyBvZiBidWcgcmVwb3J0cy4gVGhpcyBoYXMgYmVlbgorICogbGVhcm5lZCB0aHJvdWdoIGhhcmQgZXhwZXJpZW5jZSB3aXRoIEdDb25mLCB1bmZvcnR1bmF0ZWx5LgorICoKKyAqIFRoaXMgYmFkIGhhY2sgbWlnaHQgd29yayBiZXR0ZXIgZm9yIHRoZSBraW5kIG9mIGxvY2sgd2UgaGF2ZSBoZXJlLAorICogd2hpY2ggd2UgZG9uJ3QgZXhwZWN0IHRvIGhvbGQgZm9yIGFueSBsZW5ndGggb2YgdGltZS4gIENyYXNoaW5nCisgKiB3aGlsZSB3ZSBob2xkIGl0IHNob3VsZCBiZSB1bmxpa2VseSwgYW5kIHRpbWluZyBvdXQgc3VjaCB0aGF0IHdlCisgKiBkZWxldGUgYSBzdGFsZSBsb2NrIHNob3VsZCBhbHNvIGJlIHVubGlrZWx5IGV4Y2VwdCB3aGVuIHRoZQorICogZmlsZXN5c3RlbSBpcyBydW5uaW5nIHJlYWxseSBzbG93bHkuICBTdHVmZiBtaWdodCBicmVhayBpbiBjb3JuZXIKKyAqIGNhc2VzIGJ1dCBhcyBsb25nIGFzIGl0J3Mgbm90IGEgc2VjdXJpdHktbGV2ZWwgYnJlYWthZ2UgaXQgc2hvdWxkCisgKiBiZSBPSy4KKyAqLworCisvKiogTWF4aW11bSBudW1iZXIgb2YgdGltZW91dHMgd2FpdGluZyBmb3IgbG9jayBiZWZvcmUgd2UgZGVjaWRlIGl0J3Mgc3RhbGUgKi8KKyNkZWZpbmUgTUFYX0xPQ0tfVElNRU9VVFMgMzIKKy8qKiBMZW5ndGggb2YgZWFjaCB0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGEgbG9jayAqLworI2RlZmluZSBMT0NLX1RJTUVPVVRfTUlMTElTRUNPTkRTIDI1MAorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfbG9jayAoREJ1c0tleXJpbmcgKmtleXJpbmcpCit7CisgIGludCBuX3RpbWVvdXRzOworICAKKyAgbl90aW1lb3V0cyA9IDA7CisgIHdoaWxlIChuX3RpbWVvdXRzIDwgTUFYX0xPQ0tfVElNRU9VVFMpCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgICAgICBpZiAoX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICBicmVhazsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkRpZCBub3QgZ2V0IGxvY2sgZmlsZSwgc2xlZXBpbmcgJWQgbWlsbGlzZWNvbmRzICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICBMT0NLX1RJTUVPVVRfTUlMTElTRUNPTkRTLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzIChMT0NLX1RJTUVPVVRfTUlMTElTRUNPTkRTKTsKKyAgICAgIAorICAgICAgKytuX3RpbWVvdXRzOworICAgIH0KKworICBpZiAobl90aW1lb3V0cyA9PSBNQVhfTE9DS19USU1FT1VUUykKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJMb2NrIGZpbGUgdGltZWQgb3V0ICVkIHRpbWVzLCBhc3N1bWluZyBzdGFsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG5fdGltZW91dHMpOworCisgICAgICBpZiAoIV9kYnVzX2RlbGV0ZV9maWxlICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZG4ndCBkZWxldGUgb2xkIGxvY2sgZmlsZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2NyZWF0ZV9maWxlX2V4Y2x1c2l2ZWx5ICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ291bGRuJ3QgY3JlYXRlIGxvY2sgZmlsZSBhZnRlciBkZWxldGluZyBzdGFsZSBvbmU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX2tleXJpbmdfdW5sb2NrIChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIGlmICghX2RidXNfZGVsZXRlX2ZpbGUgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZGVsZXRlIGxvY2sgZmlsZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyBEQnVzS2V5KgorZmluZF9rZXlfYnlfaWQgKERCdXNLZXkgKmtleXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgbl9rZXlzLAorICAgICAgICAgICAgICAgIGludCAgICAgIGlkKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgeworICAgICAgaWYgKGtleXNbaV0uaWQgPT0gaWQpCisgICAgICAgIHJldHVybiAma2V5c1tpXTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfbmV3X2tleSAoREJ1c0tleSAgKiprZXlzX3AsCisgICAgICAgICAgICAgaW50ICAgICAgICpuX2tleXNfcCwKKyAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzS2V5ICpuZXc7CisgIERCdXNTdHJpbmcgYnl0ZXM7CisgIGludCBpZDsKKyAgbG9uZyB0aW1lc3RhbXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0tleSAqa2V5czsKKyAgaW50IG5fa2V5czsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZieXRlcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGtleXMgPSAqa2V5c19wOworICBuX2tleXMgPSAqbl9rZXlzX3A7CisgIHJldHZhbCA9IEZBTFNFOworICAgICAgCisgIC8qIEdlbmVyYXRlIGFuIGludGVnZXIgSUQgYW5kIHRoZW4gdGhlIGFjdHVhbCBrZXkuICovCisgcmV0cnk6CisgICAgICAKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZieXRlcywgNCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYnl0ZXMpOworICAgICAgCisgIGlkID0gc1swXSB8IChzWzFdIDw8IDgpIHwgKHNbMl0gPDwgMTYpIHwgKHNbM10gPDwgMjQpOworICBpZiAoaWQgPCAwKQorICAgIGlkID0gLSBpZDsKKyAgX2RidXNfYXNzZXJ0IChpZCA+PSAwKTsKKworICBpZiAoZmluZF9rZXlfYnlfaWQgKGtleXMsIG5fa2V5cywgaWQpICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZieXRlcywgMCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiS2V5IElEICVkIGFscmVhZHkgZXhpc3RlZCwgdHJ5aW5nIGFub3RoZXIgb25lXG4iLAorICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIkNyZWF0aW5nIGtleSB3aXRoIElEICVkXG4iLCBpZCk7CisgICAgICAKKyNkZWZpbmUgS0VZX0xFTkdUSF9CWVRFUyAyNAorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJ5dGVzLCAwKTsKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZieXRlcywgS0VZX0xFTkdUSF9CWVRFUykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgbmV3ID0gZGJ1c19yZWFsbG9jIChrZXlzLCBzaXplb2YgKERCdXNLZXkpICogKG5fa2V5cyArIDEpKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGtleXMgPSBuZXc7CisgICprZXlzX3AgPSBrZXlzOyAvKiBvdGhlcndpc2UgKmtleXNfcCBlbmRzIHVwIGludmFsaWQgKi8KKyAgbl9rZXlzICs9IDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleXNbbl9rZXlzLTFdLnNlY3JldCkpCisgICAgeworICAgICAgbl9rZXlzIC09IDE7IC8qIHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGUgb25lIHdlIGRpZG4ndCBpbml0ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c19nZXRfY3VycmVudF90aW1lICgmdGltZXN0YW1wLCBOVUxMKTsKKyAgICAgIAorICBrZXlzW25fa2V5cy0xXS5pZCA9IGlkOworICBrZXlzW25fa2V5cy0xXS5jcmVhdGlvbl90aW1lID0gdGltZXN0YW1wOworICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmYnl0ZXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlzW25fa2V5cy0xXS5zZWNyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW25fa2V5cy0xXS5zZWNyZXQpOworICAgICAgbl9rZXlzIC09IDE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgICpuX2tleXNfcCA9IG5fa2V5czsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYnl0ZXMpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJlbG9hZHMgdGhlIGtleXJpbmcgZmlsZSwgb3B0aW9uYWxseSBhZGRzIG9uZSBuZXcga2V5IHRvIHRoZSBmaWxlLAorICogcmVtb3ZlcyBhbGwgZXhwaXJlZCBrZXlzIGZyb20gdGhlIGZpbGUgaWZmIGEga2V5IHdhcyBhZGRlZCwgdGhlbgorICogcmVzYXZlcyB0aGUgZmlsZS4gIFN0b3JlcyB0aGUga2V5cyBmcm9tIHRoZSBmaWxlIGluIGtleXJpbmctPmtleXMuCisgKiBOb3RlIHRoYXQgdGhlIGZpbGUgaXMgb25seSByZXNhdmVkICh3cml0dGVuIHRvKSBpZiBhIGtleSBpcyBhZGRlZCwKKyAqIHRoaXMgbWVhbnMgdGhhdCBvbmx5IHNlcnZlcnMgZXZlciB3cml0ZSB0byB0aGUgZmlsZSBhbmQgbmVlZCB0bworICogbG9jayBpdCwgd2hpY2ggYXZvaWRzIGEgbG90IG9mIGxvY2sgY29udGVudGlvbiBhdCBsb2dpbiB0aW1lIGFuZAorICogc3VjaC4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHBhcmFtIGFkZF9uZXcgI1RSVUUgdG8gYWRkIGEgbmV3IGtleSB0byB0aGUgZmlsZSwgZXhwaXJlIGtleXMsIGFuZCByZXNhdmUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19rZXlyaW5nX3JlbG9hZCAoREJ1c0tleXJpbmcgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGFkZF9uZXcsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbnRlbnRzOworICBEQnVzU3RyaW5nIGxpbmU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgZGJ1c19ib29sX3QgaGF2ZV9sb2NrOworICBEQnVzS2V5ICprZXlzOworICBpbnQgbl9rZXlzOworICBpbnQgaTsKKyAgbG9uZyBub3c7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAoIV9kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIgKCZrZXlyaW5nLT5kaXJlY3RvcnksIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZW50cykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgIAorICBrZXlzID0gTlVMTDsKKyAgbl9rZXlzID0gMDsKKyAgcmV0dmFsID0gRkFMU0U7CisgIGhhdmVfbG9jayA9IEZBTFNFOworCisgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZub3csIE5VTEwpOworICAKKyAgaWYgKGFkZF9uZXcpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19rZXlyaW5nX2xvY2sgKGtleXJpbmcpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NrIGtleXJpbmcgZmlsZSB0byBhZGQgdG8gaXQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBoYXZlX2xvY2sgPSBUUlVFOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5cmluZy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbG9hZCBrZXlyaW5nIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgLyogY29udGludWUgd2l0aCBlbXB0eSBrZXlyaW5nIGZpbGUsIHNvIHdlIHJlY3JlYXRlIGl0ICovCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoJmNvbnRlbnRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJTZWNyZXQga2V5cmluZyBmaWxlIGNvbnRhaW5zIG5vbi1BU0NJSSEgSWdub3JpbmcgZXhpc3RpbmcgY29udGVudHNcbiIpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZW50cywgMCk7CisgICAgfQorCisgIC8qIEZJWE1FIHRoaXMgaXMgYmFkbHkgaW5lZmZpY2llbnQgZm9yIGxhcmdlIGtleXJpbmcgZmlsZXMKKyAgICogKG5vdCB0aGF0IGxhcmdlIGtleXJpbmcgZmlsZXMgZXhpc3Qgb3V0c2lkZSBvZiB0ZXN0IHN1aXRlcykKKyAgICovCisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZjb250ZW50cywgJmxpbmUpKQorICAgIHsKKyAgICAgIGludCBuZXh0OworICAgICAgbG9uZyB2YWw7CisgICAgICBpbnQgaWQ7CisgICAgICBsb25nIHRpbWVzdGFtcDsKKyAgICAgIGludCBsZW47CisgICAgICBpbnQgZW5kOworICAgICAgREJ1c0tleSAqbmV3OworCisgICAgICAvKiBEb24ndCBsb2FkIG1vcmUgdGhhbiB0aGUgbWF4LiAqLworICAgICAgaWYgKG5fa2V5cyA+PSAoYWRkX25ldyA/IE1BWF9LRVlTX0lOX0ZJTEUgLSAxIDogTUFYX0tFWVNfSU5fRklMRSkpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBuZXh0ID0gMDsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJmxpbmUsIDAsICZ2YWwsICZuZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb3VsZCBub3QgcGFyc2Ugc2VjcmV0IGtleSBJRCBhdCBzdGFydCBvZiBsaW5lXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAodmFsID4gX0RCVVNfSU5UMzJfTUFYIHx8IHZhbCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiaW52YWxpZCBzZWNyZXQga2V5IElEIGF0IHN0YXJ0IG9mIGxpbmVcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlkID0gdmFsOworCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoJmxpbmUsIG5leHQsICZuZXh0KTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmbGluZSwgbmV4dCwgJnRpbWVzdGFtcCwgJm5leHQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImNvdWxkIG5vdCBwYXJzZSBzZWNyZXQga2V5IHRpbWVzdGFtcFxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKHRpbWVzdGFtcCA8IDAgfHwKKyAgICAgICAgICAobm93ICsgTUFYX1RJTUVfVFJBVkVMX1NFQ09ORFMpIDwgdGltZXN0YW1wIHx8CisgICAgICAgICAgKG5vdyAtIEVYUElSRV9LRVlTX1RJTUVPVVRfU0VDT05EUykgPiB0aW1lc3RhbXApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZHJvcHBpbmcvaWdub3JpbmcgJWxkLXNlY29uZHMgb2xkIGtleSB3aXRoIHRpbWVzdGFtcCAlbGQgYXMgY3VycmVudCB0aW1lIGlzICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub3cgLSB0aW1lc3RhbXAsIHRpbWVzdGFtcCwgbm93KTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoJmxpbmUsIG5leHQsICZuZXh0KTsKKworICAgICAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKTsKKworICAgICAgaWYgKChsZW4gLSBuZXh0KSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIHNlY3JldCBrZXkgYWZ0ZXIgSUQgYW5kIHRpbWVzdGFtcFxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogV2UgaGF2ZSBhbGwgdGhyZWUgcGFydHMgKi8KKyAgICAgIG5ldyA9IGRidXNfcmVhbGxvYyAoa2V5cywgc2l6ZW9mIChEQnVzS2V5KSAqIChuX2tleXMgKyAxKSk7CisgICAgICBpZiAobmV3ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBrZXlzID0gbmV3OworICAgICAgbl9rZXlzICs9IDE7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXlzW25fa2V5cy0xXS5zZWNyZXQpKQorICAgICAgICB7CisgICAgICAgICAgbl9rZXlzIC09IDE7IC8qIHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGUgb25lIHdlIGRpZG4ndCBpbml0ICovCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAga2V5c1tuX2tleXMtMV0uaWQgPSBpZDsKKyAgICAgIGtleXNbbl9rZXlzLTFdLmNyZWF0aW9uX3RpbWUgPSB0aW1lc3RhbXA7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZGVjb2RlICgmbGluZSwgbmV4dCwgJmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlzW25fa2V5cy0xXS5zZWNyZXQsIDApKQorCXsKKwkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKSAhPSBlbmQpCisJeworCSAgX2RidXNfdmVyYm9zZSAoImludmFsaWQgaGV4IGVuY29kaW5nIGluIGtleXJpbmcgZmlsZVxuIik7CisJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXNbbl9rZXlzIC0gMV0uc2VjcmV0KTsKKwkgIG5fa2V5cyAtPSAxOworCSAgY29udGludWU7CisJfQorICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3VjY2Vzc2Z1bGx5IGxvYWRlZCAlZCBleGlzdGluZyBrZXlzXG4iLAorICAgICAgICAgICAgICAgICBuX2tleXMpOworCisgIGlmIChhZGRfbmV3KQorICAgIHsKKyAgICAgIGlmICghYWRkX25ld19rZXkgKCZrZXlzLCAmbl9rZXlzLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdlbmVyYXRlIG5ldyBrZXk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID8gZXJyb3ItPm1lc3NhZ2UgOiAiKHVua25vd24pIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZW50cywgMCk7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1tpXS5pZCkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjb250ZW50cywgJyAnKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1tpXS5jcmVhdGlvbl90aW1lKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmNvbnRlbnRzLCAnICcpKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZrZXlzW2ldLnNlY3JldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykpKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY29udGVudHMsICdcbicpKQorICAgICAgICAgICAgZ290byBub21lbTsgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG5vbWVtOgorICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJmNvbnRlbnRzLCAma2V5cmluZy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoa2V5cmluZy0+a2V5cykKKyAgICBmcmVlX2tleXMgKGtleXJpbmctPmtleXMsIGtleXJpbmctPm5fa2V5cyk7CisgIGtleXJpbmctPmtleXMgPSBrZXlzOworICBrZXlyaW5nLT5uX2tleXMgPSBuX2tleXM7CisgIGtleXMgPSBOVUxMOworICBuX2tleXMgPSAwOworICAKKyAgcmV0dmFsID0gVFJVRTsgIAorICAKKyBvdXQ6CisgIGlmIChoYXZlX2xvY2spCisgICAgX2RidXNfa2V5cmluZ191bmxvY2sgKGtleXJpbmcpOworICAKKyAgaWYgKCEgKChyZXR2YWwgPT0gVFJVRSAmJiAoZXJyb3IgPT0gTlVMTCB8fCBlcnJvci0+bmFtZSA9PSBOVUxMKSkgfHwKKyAgICAgICAgIChyZXR2YWwgPT0gRkFMU0UgJiYgKGVycm9yID09IE5VTEwgfHwgZXJyb3ItPm5hbWUgIT0gTlVMTCkpKSkKKyAgICB7CisgICAgICBpZiAoZXJyb3IgJiYgZXJyb3ItPm5hbWUpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJlcnJvciBpcyAlczogJXNcbiIsIGVycm9yLT5uYW1lLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICBfZGJ1c193YXJuICgicmV0dXJuaW5nICVkIGJ1dCBlcnJvciBwb2ludGVyICVwIG5hbWUgJXNcbiIsCisgICAgICAgICAgICAgICAgICByZXR2YWwsIGVycm9yLCBlcnJvci0+bmFtZSA/IGVycm9yLT5uYW1lIDogIihub25lKSIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGhhbmRsZSBlcnJvcnMgcHJvcGVybHkiKTsKKyAgICB9CisgIAorICBpZiAoa2V5cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfemVybyAoJmtleXNbaV0uc2VjcmV0KTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXNbaV0uc2VjcmV0KTsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChrZXlzKTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIGludGVybmFscyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNLZXlyaW5nCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEluY3JlbWVudHMgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBrZXlyaW5nCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqIEByZXR1cm5zIHRoZSBrZXlyaW5nCisgKi8KK0RCdXNLZXlyaW5nICoKK19kYnVzX2tleXJpbmdfcmVmIChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAga2V5cmluZy0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4ga2V5cmluZzsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHJlZmNvdW50IGFuZCBmaW5hbGl6ZXMgaWYgaXQgcmVhY2hlcworICogemVyby4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICovCit2b2lkCitfZGJ1c19rZXlyaW5nX3VucmVmIChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAga2V5cmluZy0+cmVmY291bnQgLT0gMTsKKworICBpZiAoa2V5cmluZy0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoa2V5cmluZy0+Y3JlZGVudGlhbHMpCisgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChrZXlyaW5nLT5jcmVkZW50aWFscyk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5cmluZy0+ZmlsZW5hbWUpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5cmluZy0+ZGlyZWN0b3J5KTsKKyAgICAgIGZyZWVfa2V5cyAoa2V5cmluZy0+a2V5cywga2V5cmluZy0+bl9rZXlzKTsKKyAgICAgIGRidXNfZnJlZSAoa2V5cmluZyk7ICAgICAgCisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcga2V5cmluZyB0aGF0IGxpdmVzIGluIHRoZSB+Ly5kYnVzLWtleXJpbmdzIGRpcmVjdG9yeQorICogb2YgdGhlIGdpdmVuIHVzZXIgY3JlZGVudGlhbHMuIElmIHRoZSBjcmVkZW50aWFscyBhcmUgI05VTEwgb3IKKyAqIGVtcHR5LCB1c2VzIHRob3NlIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHVzZXJuYW1lIHRvIGdldCBrZXlyaW5nIGZvciwgb3IgI05VTEwKKyAqIEBwYXJhbSBjb250ZXh0IHdoaWNoIGtleXJpbmcgdG8gZ2V0CisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBrZXlyaW5nIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK0RCdXNLZXlyaW5nKgorX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgcmluZ2RpcjsKKyAgREJ1c0tleXJpbmcgKmtleXJpbmc7CisgIGRidXNfYm9vbF90IGVycm9yX3NldDsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgREJ1c0NyZWRlbnRpYWxzICpvdXJfY3JlZGVudGlhbHM7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGtleXJpbmcgPSBOVUxMOworICBlcnJvcl9zZXQgPSBGQUxTRTsKKyAgb3VyX2NyZWRlbnRpYWxzID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyaW5nZGlyKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoY3JlZGVudGlhbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBvdXJfY3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19jb3B5IChjcmVkZW50aWFscyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgb3VyX2NyZWRlbnRpYWxzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgIH0KKyAgCisgIGlmIChvdXJfY3JlZGVudGlhbHMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAob3VyX2NyZWRlbnRpYWxzKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2VzcyAob3VyX2NyZWRlbnRpYWxzKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19hcHBlbmRfa2V5cmluZ19kaXJlY3RvcnlfZm9yX2NyZWRlbnRpYWxzICgmcmluZ2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJfY3JlZGVudGlhbHMpKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAga2V5cmluZyA9IF9kYnVzX2tleXJpbmdfbmV3ICgpOworICBpZiAoa2V5cmluZyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX2Fzc2VydCAoa2V5cmluZy0+Y3JlZGVudGlhbHMgPT0gTlVMTCk7CisgIGtleXJpbmctPmNyZWRlbnRpYWxzID0gb3VyX2NyZWRlbnRpYWxzOworICBvdXJfY3JlZGVudGlhbHMgPSBOVUxMOyAvKiBzbyB3ZSBkb24ndCB1bnJlZiBpdCBhZ2FpbiBsYXRlciAqLworICAKKyAgLyogc2hvdWxkIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYWxyZWFkeSwgYnV0IHBhcmFub2lhIGNoZWNrIGhlcmUgKi8KKyAgaWYgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKGNvbnRleHQpKQorICAgIHsKKyAgICAgIGVycm9yX3NldCA9IFRSVUU7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29udGV4dCBpbiBrZXlyaW5nIGNyZWF0aW9uIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogU2F2ZSBrZXlyaW5nIGRpciBpbiB0aGUga2V5cmluZyBvYmplY3QgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnJpbmdkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlyaW5nLT5kaXJlY3RvcnksIDApKQorICAgIGdvdG8gZmFpbGVkOyAgCisKKyAgLyogQ3JlYXRlIGtleXJpbmctPmZpbGVuYW1lIGJhc2VkIG9uIGtleXJpbmcgZGlyIGFuZCBjb250ZXh0ICovCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZrZXlyaW5nLT5kaXJlY3RvcnksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlyaW5nLT5maWxlbmFtZSwgMCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgma2V5cmluZy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogQ3JlYXRlIGxvY2tmaWxlIG5hbWUgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmtleXJpbmctPmZpbGVuYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywgMCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgma2V5cmluZy0+ZmlsZW5hbWVfbG9jaywgIi5sb2NrIikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgLyogUmVsb2FkIGtleXJpbmcgKi8KKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgaWYgKCFfZGJ1c19rZXlyaW5nX3JlbG9hZCAoa2V5cmluZywgRkFMU0UsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkaWRuJ3QgbG9hZCBhbiBleGlzdGluZyBrZXlyaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgfQorICAKKyAgLyogV2UgZG9uJ3QgZmFpbCBmYXRhbGx5IGlmIHdlIGNhbid0IGNyZWF0ZSB0aGUgZGlyZWN0b3J5LAorICAgKiBidXQgdGhlIGtleXJpbmcgd2lsbCBwcm9iYWJseSBhbHdheXMgYmUgZW1wdHkKKyAgICogdW5sZXNzIHNvbWVvbmUgZWxzZSBtYW5hZ2VzIHRvIGNyZWF0ZSBpdAorICAgKi8KKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgaWYgKCFfZGJ1c19jcmVhdGVfZGlyZWN0b3J5ICgma2V5cmluZy0+ZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDcmVhdGluZyBrZXlyaW5nIGRpcmVjdG9yeTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICB0bXBfZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJpbmdkaXIpOworICAKKyAgcmV0dXJuIGtleXJpbmc7CisgIAorIGZhaWxlZDoKKyAgaWYgKCFlcnJvcl9zZXQpCisgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGlmIChvdXJfY3JlZGVudGlhbHMpCisgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKG91cl9jcmVkZW50aWFscyk7CisgIGlmIChrZXlyaW5nKQorICAgIF9kYnVzX2tleXJpbmdfdW5yZWYgKGtleXJpbmcpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJpbmdkaXIpOworICByZXR1cm4gTlVMTDsKKworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIGEgdmFsaWQgY29udGV4dC4KKyAqIENvbnRleHRzIHRoYXQgbWlnaHQgY2F1c2UgY29uZnVzaW9uIHdoZW4gdXNlZAorICogaW4gZmlsZW5hbWVzIGFyZSBub3QgYWxsb3dlZCAoY29udGV4dHMgY2FuJ3QKKyAqIHN0YXJ0IHdpdGggYSBkb3Qgb3IgY29udGFpbiBkaXIgc2VwYXJhdG9ycykuCisgKgorICogQHRvZG8gdGhpcyBpcyB0aGUgbW9zdCBpbmVmZmljaWVudCBpbXBsZW1lbnRhdGlvbgorICogaW1hZ2luYWJsZS4KKyAqCisgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dAorICogQHJldHVybnMgI1RSVUUgaWYgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoY29uc3QgREJ1c1N0cmluZyAqY29udGV4dCkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb250ZXh0KSA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGlzIHplcm8tbGVuZ3RoXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgKGNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoY29udGV4dCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IG5vdCB2YWxpZCBhc2NpaVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgLyogbm8gZGlyZWN0b3J5IHNlcGFyYXRvcnMgKi8gIAorICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKGNvbnRleHQsIDAsICIvIiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBzbGFzaFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoY29udGV4dCwgMCwgIlxcIiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBiYWNrc2xhc2hcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBwcmV2ZW50IGF0dGVtcHRzIHRvIHVzZSBkb3RmaWxlcyBvciAiLi4iIG9yICIubG9jayIKKyAgICogYWxsIG9mIHdoaWNoIG1pZ2h0IGFsbG93IHNvbWUga2luZCBvZiBhdHRhY2sKKyAgICovCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoY29udGV4dCwgMCwgIi4iLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIGRvdFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIG5vIHNwYWNlcy90YWJzLCB0aG9zZSBhcmUgdXNlZCBmb3Igc2VwYXJhdG9ycyBpbiB0aGUgcHJvdG9jb2wgKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChjb250ZXh0LCAwLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIGJsYW5rXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kIChjb250ZXh0LCAwLCAiXG4iLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIG5ld2xpbmVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKGNvbnRleHQsIDAsICJcciIsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGNvbnRhaW5zIGEgY2FycmlhZ2UgcmV0dXJuXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIERCdXNLZXkqCitmaW5kX3JlY2VudF9rZXkgKERCdXNLZXlyaW5nICprZXlyaW5nKQoreworICBpbnQgaTsKKyAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisKKyAgX2RidXNfZ2V0X2N1cnJlbnRfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwga2V5cmluZy0+bl9rZXlzKQorICAgIHsKKyAgICAgIERCdXNLZXkgKmtleSA9ICZrZXlyaW5nLT5rZXlzW2ldOworCisgICAgICBfZGJ1c192ZXJib3NlICgiS2V5ICVkIGlzICVsZCBzZWNvbmRzIG9sZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGksIHR2X3NlYyAtIGtleS0+Y3JlYXRpb25fdGltZSk7CisgICAgICAKKyAgICAgIGlmICgodHZfc2VjIC0gTkVXX0tFWV9USU1FT1VUX1NFQ09ORFMpIDwga2V5LT5jcmVhdGlvbl90aW1lKQorICAgICAgICByZXR1cm4ga2V5OworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEdldHMgYSByZWNlbnQga2V5IHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uCisgKiBJZiBubyByZWNlbnQga2V5IGV4aXN0cywgY3JlYXRlcyBvbmUuIFJldHVybnMKKyAqIHRoZSBrZXkgSUQuIElmIGEga2V5IGNhbid0IGJlIHdyaXR0ZW4gdG8gdGhlIGtleXJpbmcKKyAqIGZpbGUgc28gbm8gcmVjZW50IGtleSBjYW4gYmUgY3JlYXRlZCwgcmV0dXJucyAtMS4KKyAqIEFsbCB2YWxpZCBrZXlzIGFyZSA+IDAuCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvbiBmYWlsdXJlCisgKiBAcmV0dXJucyBrZXkgSUQgdG8gdXNlIGZvciBhdXRoLCBvciAtMSBvbiBmYWlsdXJlCisgKi8KK2ludAorX2RidXNfa2V5cmluZ19nZXRfYmVzdF9rZXkgKERCdXNLZXlyaW5nICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgKmVycm9yKQoreworICBEQnVzS2V5ICprZXk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBrZXkgPSBmaW5kX3JlY2VudF9rZXkgKGtleXJpbmcpOworICBpZiAoa2V5KQorICAgIHJldHVybiBrZXktPmlkOworCisgIC8qIEFsbCBvdXIga2V5cyBhcmUgdG9vIG9sZCwgb3Igd2UndmUgbmV2ZXIgbG9hZGVkIHRoZQorICAgKiBrZXlyaW5nLiBDcmVhdGUgYSBuZXcgb25lLgorICAgKi8KKyAgaWYgKCFfZGJ1c19rZXlyaW5nX3JlbG9hZCAoa2V5cmluZywgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIHJldHVybiAtMTsKKworICBrZXkgPSBmaW5kX3JlY2VudF9rZXkgKGtleXJpbmcpOworICBpZiAoa2V5KQorICAgIHJldHVybiBrZXktPmlkOworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyByZWNlbnQtZW5vdWdoIGtleSBmb3VuZCBpbiBrZXlyaW5nLCBhbmQgdW5hYmxlIHRvIGNyZWF0ZSBhIG5ldyBrZXkiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGtleXJpbmcgaXMgZm9yIHRoZSBzYW1lIHVzZXIgYXMgdGhlIGdpdmVuIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBrZXlyaW5nIHRoZSBrZXlyaW5nCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIGNyZWRlbnRpYWxzIHRvIGNoZWNrCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGtleXJpbmcgYmVsb25ncyB0byB0aGUgZ2l2ZW4gdXNlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfa2V5cmluZ19pc19mb3JfY3JlZGVudGlhbHMgKERCdXNLZXlyaW5nICAgICAgICAgICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChrZXlyaW5nLT5jcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMpOworfQorCisvKioKKyAqIEdldHMgdGhlIGhleC1lbmNvZGVkIHNlY3JldCBrZXkgZm9yIHRoZSBnaXZlbiBJRC4KKyAqIFJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LiBSZXR1cm5zICNUUlVFCisgKiBidXQgZW1wdHkga2V5IG9uIGFueSBvdGhlciBlcnJvciBzdWNoIGFzIHVua25vd24KKyAqIGtleSBJRC4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHBhcmFtIGtleV9pZCB0aGUga2V5IElECisgKiBAcGFyYW0gaGV4X2tleSBzdHJpbmcgdG8gYXBwZW5kIGhleC1lbmNvZGVkIGtleSB0bworICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfZ2V0X2hleF9rZXkgKERCdXNLZXlyaW5nICAgICAgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGtleV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpoZXhfa2V5KQoreworICBEQnVzS2V5ICprZXk7CisKKyAga2V5ID0gZmluZF9rZXlfYnlfaWQgKGtleXJpbmctPmtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlyaW5nLT5uX2tleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlfaWQpOworICBpZiAoa2V5ID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7IC8qIGhhZCBlbm91Z2ggbWVtb3J5LCBzbyBUUlVFICovCisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgma2V5LT5zZWNyZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4X2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoaGV4X2tleSkpOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIGV4cG9zZWQgQVBJICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBjb250ZXh0OworICBEQnVzS2V5cmluZyAqcmluZzE7CisgIERCdXNLZXlyaW5nICpyaW5nMjsKKyAgaW50IGlkOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGludCBpOworCisgIHJpbmcxID0gTlVMTDsKKyAgcmluZzIgPSBOVUxMOworICAKKyAgLyogQ29udGV4dCB2YWxpZGF0aW9uICovCisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb28iKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9ibGFoIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiLmZvbyIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImJhci5mb28iKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJiYXIvZm9vIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiYmFyXFxmb28iKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb29ceGZhXHhmMCIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImZvb1x4ODAiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb29ceDdmIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJmb28gYmFyIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZXh0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjb250ZXh0LCAnXDAnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRleHQpOworCisgIC8qIE5vdyB2ZXJpZnkgdGhhdCBpZiB3ZSBjcmVhdGUgYSBrZXkgaW4ga2V5cmluZyAxLAorICAgKiBpdCBpcyBwcm9wZXJseSBsb2FkZWQgaW4ga2V5cmluZyAyCisgICAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgIm9yZ19mcmVlZGVza3RvcF9kYnVzX3Rlc3RzdWl0ZSIpOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIHJpbmcxID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgIF9kYnVzX2Fzc2VydCAocmluZzEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZXJyb3IubmFtZSA9PSBOVUxMKTsKKworICBpZCA9IF9kYnVzX2tleXJpbmdfZ2V0X2Jlc3Rfa2V5IChyaW5nMSwgJmVycm9yKTsKKyAgaWYgKGlkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgbG9hZCBrZXlyaW5nOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisgIHJpbmcyID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLCAmY29udGV4dCwgJmVycm9yKTsKKyAgX2RidXNfYXNzZXJ0IChyaW5nMiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlcnJvci5uYW1lID09IE5VTEwpOworICAKKyAgaWYgKHJpbmcxLT5uX2tleXMgIT0gcmluZzItPm5fa2V5cykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJEaWZmZXJlbnQgbnVtYmVyIG9mIGtleXMgaW4ga2V5cmluZ3NcbiIpOworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKworICAvKiBXZSBndWFyYW50ZWUgd2UgbG9hZCBhbmQgc2F2ZSBrZWVwaW5nIGtleXMgaW4gYSBmaXhlZAorICAgKiBvcmRlcgorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgcmluZzEtPm5fa2V5cykKKyAgICB7CisgICAgICBpZiAocmluZzEtPmtleXNbaV0uaWQgIT0gcmluZzItPmtleXNbaV0uaWQpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJLZXlyaW5nIDEgaGFzIGZpcnN0IGtleSBJRCAlZCBhbmQga2V5cmluZyAyIGhhcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByaW5nMS0+a2V5c1tpXS5pZCwgcmluZzItPmtleXNbaV0uaWQpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfSAgICAgIAorCisgICAgICBpZiAocmluZzEtPmtleXNbaV0uY3JlYXRpb25fdGltZSAhPSByaW5nMi0+a2V5c1tpXS5jcmVhdGlvbl90aW1lKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiS2V5cmluZyAxIGhhcyBmaXJzdCBrZXkgdGltZSAlbGQgYW5kIGtleXJpbmcgMiBoYXMgJWxkXG4iLAorICAgICAgICAgICAgICAgICAgIHJpbmcxLT5rZXlzW2ldLmNyZWF0aW9uX3RpbWUsIHJpbmcyLT5rZXlzW2ldLmNyZWF0aW9uX3RpbWUpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJnJpbmcxLT5rZXlzW2ldLnNlY3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmluZzItPmtleXNbaV0uc2VjcmV0KSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIktleXJpbmdzIDEgYW5kIDIgaGF2ZSBkaWZmZXJlbnQgc2VjcmV0cyBmb3Igc2FtZSBJRC90aW1lc3RhbXBcbiIpOworICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHByaW50ZiAoIiAlZCBrZXlzIGluIHRlc3RcbiIsIHJpbmcxLT5uX2tleXMpOworCisgIC8qIFRlc3QgcmVmL3VucmVmICovCisgIF9kYnVzX2tleXJpbmdfcmVmIChyaW5nMSk7CisgIF9kYnVzX2tleXJpbmdfcmVmIChyaW5nMik7CisgIF9kYnVzX2tleXJpbmdfdW5yZWYgKHJpbmcxKTsKKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworCisKKyAgLyogcmVhbGx5IHVucmVmICovCisgIF9kYnVzX2tleXJpbmdfdW5yZWYgKHJpbmcxKTsKKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsdXJlOgorICBpZiAocmluZzEpCisgICAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzEpOworICBpZiAocmluZzIpCisgICAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzIpOworCisgIHJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKyAgICAgCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMta2V5cmluZy5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWtleXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBlMzFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWtleXJpbmcuaApAQCAtMCwwICsxLDUyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMta2V5cmluZy5oIFN0b3JlIHNlY3JldCBjb29raWVzIGluIHlvdXIgaG9tZWRpcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfS0VZUklOR19ICisjZGVmaW5lIERCVVNfS0VZUklOR19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY3JlZGVudGlhbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzS2V5cmluZyBEQnVzS2V5cmluZzsKKworREJ1c0tleXJpbmcqIF9kYnVzX2tleXJpbmdfbmV3X2Zvcl9jcmVkZW50aWFscyAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJ1c0tleXJpbmcqIF9kYnVzX2tleXJpbmdfcmVmICAgICAgICAgICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZyk7Cit2b2lkICAgICAgICAgX2RidXNfa2V5cmluZ191bnJlZiAgICAgICAgICAgICAgIChEQnVzS2V5cmluZyAgICAgICprZXlyaW5nKTsKK2RidXNfYm9vbF90ICBfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgICAgKGNvbnN0IERCdXNTdHJpbmcgKmNvbnRleHQpOworaW50ICAgICAgICAgIF9kYnVzX2tleXJpbmdfZ2V0X2Jlc3Rfa2V5ICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICBfZGJ1c19rZXlyaW5nX2lzX2Zvcl9jcmVkZW50aWFscyAgKERCdXNLZXlyaW5nICAgICAgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscyk7CitkYnVzX2Jvb2xfdCAgX2RidXNfa2V5cmluZ19nZXRfaGV4X2tleSAgICAgICAgIChEQnVzS2V5cmluZyAgICAgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAga2V5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqaGV4X2tleSk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfS0VZUklOR19IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbGlzdC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE2ZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWxpc3QuYwpAQCAtMCwwICsxLDE0MDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1saXN0LmMgR2VuZXJpYyBsaW5rZWQgbGlzdCB1dGlsaXR5IChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtbWVtcG9vbC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy1pbnRlcm5hbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTGlzdCBMaW5rZWQgbGlzdAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTGlzdCBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzTGlzdC4KKyAqLworCitzdGF0aWMgREJ1c01lbVBvb2wgKmxpc3RfcG9vbDsKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAobGlzdCk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNMaXN0SW50ZXJuYWxzIExpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0xpc3QgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNMaXN0LgorICoKKyAqIEB7CisgKi8KKworLyogdGhlIG1lbSBwb29sIGlzIHByb2JhYmx5IGEgc3BlZWQgaGl0LCB3aXRoIHRoZSB0aHJlYWQKKyAqIGxvY2ssIHRob3VnaCBpdCBkb2VzIHN0aWxsIHNhdmUgbWVtb3J5IC0gdW5rbm93bi4KKyAqLworc3RhdGljIERCdXNMaXN0KgorYWxsb2NfbGluayAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX0RCVVNfTE9DSyAobGlzdCk7CisKKyAgaWYgKGxpc3RfcG9vbCA9PSBOVUxMKQorICAgIHsgICAgICAKKyAgICAgIGxpc3RfcG9vbCA9IF9kYnVzX21lbV9wb29sX25ldyAoc2l6ZW9mIChEQnVzTGlzdCksIFRSVUUpOworCisgICAgICBpZiAobGlzdF9wb29sID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19VTkxPQ0sgKGxpc3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAobGlzdF9wb29sKTsKKyAgICAgIGlmIChsaW5rID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlIChsaXN0X3Bvb2wpOworICAgICAgICAgIGxpc3RfcG9vbCA9IE5VTEw7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChsaXN0KTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxpbmsgPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAobGlzdF9wb29sKTsKKyAgICB9CisKKyAgaWYgKGxpbmspCisgICAgbGluay0+ZGF0YSA9IGRhdGE7CisgIAorICBfREJVU19VTkxPQ0sgKGxpc3QpOworCisgIHJldHVybiBsaW5rOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9saW5rIChEQnVzTGlzdCAqbGluaykKK3sgIAorICBfREJVU19MT0NLIChsaXN0KTsKKyAgaWYgKF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKGxpc3RfcG9vbCwgbGluaykpCisgICAgeworICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAobGlzdF9wb29sKTsKKyAgICAgIGxpc3RfcG9vbCA9IE5VTEw7CisgICAgfQorICAKKyAgX0RCVVNfVU5MT0NLIChsaXN0KTsKK30KKworc3RhdGljIHZvaWQKK2xpbmtfYmVmb3JlIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0ID0gbGluazsKKyAgICAgICpsaXN0ID0gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICB7ICAgICAgCisgICAgICBsaW5rLT5uZXh0ID0gYmVmb3JlX3RoaXNfbGluazsKKyAgICAgIGxpbmstPnByZXYgPSBiZWZvcmVfdGhpc19saW5rLT5wcmV2OworICAgICAgYmVmb3JlX3RoaXNfbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5wcmV2LT5uZXh0ID0gbGluazsKKyAgICAgIAorICAgICAgaWYgKGJlZm9yZV90aGlzX2xpbmsgPT0gKmxpc3QpCisgICAgICAgICpsaXN0ID0gbGluazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsaW5rX2FmdGVyIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGluay0+cHJldiA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0ID0gbGluazsKKyAgICAgICpsaXN0ID0gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsaW5rLT5wcmV2ID0gYWZ0ZXJfdGhpc19saW5rOworICAgICAgbGluay0+bmV4dCA9IGFmdGVyX3RoaXNfbGluay0+bmV4dDsKKyAgICAgIGFmdGVyX3RoaXNfbGluay0+bmV4dCA9IGxpbms7CisgICAgICBsaW5rLT5uZXh0LT5wcmV2ID0gbGluazsKKyAgICB9Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNMaXN0CisgKiBAeworICovCisKKy8qKgorICogQHN0cnVjdCBEQnVzTGlzdAorICoKKyAqIEEgbm9kZSBpbiBhIGxpbmtlZCBsaXN0LgorICoKKyAqIERCdXNMaXN0IGlzIGEgY2lyY3VsYXIgbGlzdDsgdGhhdCBpcywgdGhlIHRhaWwgb2YgdGhlIGxpc3QKKyAqIHBvaW50cyBiYWNrIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiBUaGUgZW1wdHkgbGlzdCBpcworICogcmVwcmVzZW50ZWQgYnkgYSAjTlVMTCBwb2ludGVyLgorICovCisKKy8qKgorICogQGRlZiBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsKKyAqCisgKiBHZXRzIHRoZSBuZXh0IGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGlmCisgKiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4gVXNlZCBmb3IgaXRlcmF0aW9uLgorICoKKyAqIEBjb2RlCisgKiBEQnVzTGlzdCAqbGluazsKKyAqIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdCk7CisgKiB3aGlsZSAobGluayAhPSBOVUxMKQorICogICB7CisgKiAgICAgcHJpbnRmICgidmFsdWUgaXMgJXBcbiIsIGxpbmstPmRhdGEpOworICogICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaW5rKTsKKyAqICAgfQorICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayBjdXJyZW50IGxpbmsuCisgKiBAcmV0dXJucyB0aGUgbmV4dCBsaW5rLCBvciAlTlVMTCBpZiBub25lLgorICogCisgKi8KKworLyoqCisgKiBAZGVmIF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluaworICoKKyAqIEdldHMgdGhlIHByZXZpb3VzIGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGlmCisgKiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4gVXNlZCBmb3IgaXRlcmF0aW9uLgorICoKKyAqIEBjb2RlCisgKiBEQnVzTGlzdCAqbGluazsKKyAqIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZsaXN0KTsKKyAqIHdoaWxlIChsaW5rICE9IE5VTEwpCisgKiAgIHsKKyAqICAgICBwcmludGYgKCJ2YWx1ZSBpcyAlcFxuIiwgbGluay0+ZGF0YSk7CisgKiAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmxpbmspOworICogICB9CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIGN1cnJlbnQgbGluay4KKyAqIEByZXR1cm5zIHRoZSBwcmV2aW91cyBsaW5rLCBvciAlTlVMTCBpZiBub25lLgorICogCisgKi8KKworLyoqCisgKiBBbGxvY2F0ZXMgYSBsaW5rZWQgbGlzdCBub2RlLiBVc2VmdWwgZm9yIHByZWFsbG9jYXRpbmcKKyAqIG5vZGVzIGFuZCB1c2luZyBfZGJ1c19saXN0X2FwcGVuZF9saW5rKCkgdG8gYXZvaWQKKyAqIGFsbG9jYXRpb25zLgorICogCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIGxpbmsuCisgKiBAcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBsaW5rLgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfYWxsb2NfbGluayAodm9pZCAqZGF0YSkKK3sKKyAgcmV0dXJuIGFsbG9jX2xpbmsgKGRhdGEpOworfQorCisvKioKKyAqIEZyZWVzIGEgbGlua2VkIGxpc3Qgbm9kZSBhbGxvY2F0ZWQgd2l0aCBfZGJ1c19saXN0X2FsbG9jX2xpbmsuCisgKiBEb2VzIG5vdCBmcmVlIHRoZSBkYXRhIGluIHRoZSBub2RlLgorICoKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaXN0IG5vZGUKKyAqLwordm9pZAorX2RidXNfbGlzdF9mcmVlX2xpbmsgKERCdXNMaXN0ICpsaW5rKQoreworICBmcmVlX2xpbmsgKGxpbmspOworfQorCisKKy8qKgorICogQXBwZW5kcyBhIHZhbHVlIHRvIHRoZSBsaXN0LiBNYXkgcmV0dXJuICNGQUxTRQorICogaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gYWRkIGEgbGlzdCBsaW5rLgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBhcHBlbmQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9hcHBlbmQgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kIChsaXN0LCBkYXRhKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogTm93IGN5Y2xlIHRoZSBsaXN0IGZvcndhcmQgb25lIHNvIHRoZSBwcmVwZW5kZWQgbm9kZSBpcyB0aGUgdGFpbCAqLworICAqbGlzdCA9ICgqbGlzdCktPm5leHQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUHJlcGVuZHMgYSB2YWx1ZSB0byB0aGUgbGlzdC4gTWF5IHJldHVybiAjRkFMU0UKKyAqIGlmIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGFkZCBhIGxpc3QgbGluay4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gcHJlcGVuZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3ByZXBlbmQgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gYWxsb2NfbGluayAoZGF0YSk7CisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGxpbmtfYmVmb3JlIChsaXN0LCAqbGlzdCwgbGluayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGxpbmsgdG8gdGhlIGxpc3QuCisgKiBDYW5ub3QgZmFpbCBkdWUgdG8gb3V0IG9mIG1lbW9yeS4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayB0aGUgbGluayB0byBhcHBlbmQuCisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKwkJCURCdXNMaXN0ICpsaW5rKQoreworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAobGlzdCwgbGluayk7CisKKyAgLyogTm93IGN5Y2xlIHRoZSBsaXN0IGZvcndhcmQgb25lIHNvIHRoZSBwcmVwZW5kZWQgbm9kZSBpcyB0aGUgdGFpbCAqLworICAqbGlzdCA9ICgqbGlzdCktPm5leHQ7Cit9CisKKy8qKgorICogUHJlcGVuZHMgYSBsaW5rIHRvIHRoZSBsaXN0LiAKKyAqIENhbm5vdCBmYWlsIGR1ZSB0byBvdXQgb2YgbWVtb3J5LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHRvIHByZXBlbmQuCisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfcHJlcGVuZF9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisJCQkgREJ1c0xpc3QgKmxpbmspCit7CisgIGxpbmtfYmVmb3JlIChsaXN0LCAqbGlzdCwgbGluayk7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIEluc2VydHMgZGF0YSBpbnRvIHRoZSBsaXN0IGJlZm9yZSB0aGUgZ2l2ZW4gZXhpc3RpbmcgbGluay4KKyAqIAorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gbW9kaWZ5CisgKiBAcGFyYW0gYmVmb3JlX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBiZWZvcmUsIG9yICNOVUxMIHRvIGFwcGVuZAorICogQHBhcmFtIGRhdGEgdGhlIHZhbHVlIHRvIGluc2VydAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X2luc2VydF9iZWZvcmUgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgaWYgKGJlZm9yZV90aGlzX2xpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gX2RidXNfbGlzdF9hcHBlbmQgKGxpc3QsIGRhdGEpOworICBlbHNlCisgICAgeworICAgICAgbGluayA9IGFsbG9jX2xpbmsgKGRhdGEpOworICAgICAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAKKyAgICAgIGxpbmtfYmVmb3JlIChsaXN0LCBiZWZvcmVfdGhpc19saW5rLCBsaW5rKTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qKgorICogSW5zZXJ0cyBkYXRhIGludG8gdGhlIGxpc3QgYWZ0ZXIgdGhlIGdpdmVuIGV4aXN0aW5nIGxpbmsuCisgKiAKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIG1vZGlmeQorICogQHBhcmFtIGFmdGVyX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBhZnRlciwgb3IgI05VTEwgdG8gcHJlcGVuZAorICogQHBhcmFtIGRhdGEgdGhlIHZhbHVlIHRvIGluc2VydAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X2luc2VydF9hZnRlciAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYWZ0ZXJfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7ICAKKworICBpZiAoYWZ0ZXJfdGhpc19saW5rID09IE5VTEwpCisgICAgcmV0dXJuIF9kYnVzX2xpc3RfcHJlcGVuZCAobGlzdCwgZGF0YSk7CisgIGVsc2UKKyAgICB7CisgICAgICBsaW5rID0gYWxsb2NfbGluayAoZGF0YSk7CisgICAgICBpZiAobGluayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgIAorICAgICAgbGlua19hZnRlciAobGlzdCwgYWZ0ZXJfdGhpc19saW5rLCBsaW5rKTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgbGluayBpbnRvIHRoZSBsaXN0IGJlZm9yZSB0aGUgZ2l2ZW4gZXhpc3RpbmcgbGluay4KKyAqIAorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gbW9kaWZ5CisgKiBAcGFyYW0gYmVmb3JlX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBiZWZvcmUsIG9yICNOVUxMIHRvIGFwcGVuZAorICogQHBhcmFtIGxpbmsgdGhlIGxpbmsgdG8gaW5zZXJ0CisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfaW5zZXJ0X2JlZm9yZV9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpiZWZvcmVfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGJlZm9yZV90aGlzX2xpbmsgPT0gTlVMTCkKKyAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rIChsaXN0LCBsaW5rKTsKKyAgZWxzZQorICAgIGxpbmtfYmVmb3JlIChsaXN0LCBiZWZvcmVfdGhpc19saW5rLCBsaW5rKTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgbGluayBpbnRvIHRoZSBsaXN0IGFmdGVyIHRoZSBnaXZlbiBleGlzdGluZyBsaW5rLgorICogCisgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCB0byBtb2RpZnkKKyAqIEBwYXJhbSBhZnRlcl90aGlzX2xpbmsgZXhpc3RpbmcgbGluayB0byBpbnNlcnQgYWZ0ZXIsIG9yICNOVUxMIHRvIHByZXBlbmQKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHRvIGluc2VydAorICovCit2b2lkCitfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGFmdGVyX3RoaXNfbGluayA9PSBOVUxMKQorICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rIChsaXN0LCBsaW5rKTsKKyAgZWxzZSAgCisgICAgbGlua19hZnRlciAobGlzdCwgYWZ0ZXJfdGhpc19saW5rLCBsaW5rKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbGlzdC4gT25seSByZW1vdmVzIHRoZQorICogZmlyc3QgdmFsdWUgZXF1YWwgdG8gdGhlIGdpdmVuIGRhdGEgcG9pbnRlciwKKyAqIGV2ZW4gaWYgbXVsdGlwbGUgdmFsdWVzIGV4aXN0IHdoaWNoIG1hdGNoLgorICogVGhpcyBpcyBhIGxpbmVhci10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gcmVtb3ZlLgorICogQHJldHVybnMgI1RSVUUgaWYgYSB2YWx1ZSB3YXMgZm91bmQgdG8gcmVtb3ZlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9yZW1vdmUgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGluay0+ZGF0YSA9PSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAobGlzdCwgbGluayk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbGlzdC4gT25seSByZW1vdmVzIHRoZQorICogbGFzdCB2YWx1ZSBlcXVhbCB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludGVyLAorICogZXZlbiBpZiBtdWx0aXBsZSB2YWx1ZXMgZXhpc3Qgd2hpY2ggbWF0Y2guCisgKiBUaGlzIGlzIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byByZW1vdmUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIHZhbHVlIHdhcyBmb3VuZCB0byByZW1vdmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3JlbW92ZV9sYXN0IChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2ZpbmRfbGFzdCAobGlzdCwgZGF0YSk7CisgIGlmIChsaW5rKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKGxpc3QsIGxpbmspOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZpbmRzIGEgdmFsdWUgaW4gdGhlIGxpc3QuIFJldHVybnMgdGhlIGxhc3QgbGluaworICogd2l0aCB2YWx1ZSBlcXVhbCB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludGVyLgorICogVGhpcyBpcyBhIGxpbmVhci10aW1lIG9wZXJhdGlvbi4KKyAqIFJldHVybnMgI05VTEwgaWYgbm8gdmFsdWUgZm91bmQgdGhhdCBtYXRjaGVzLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBmaW5kLgorICogQHJldHVybnMgdGhlIGxpbmsgaWYgZm91bmQKKyAqLworREJ1c0xpc3QqCitfZGJ1c19saXN0X2ZpbmRfbGFzdCAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAobGlzdCk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGluay0+ZGF0YSA9PSBkYXRhKQorICAgICAgICByZXR1cm4gbGluazsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpbmsgZnJvbSB0aGUgbGlzdCwgYnV0IGRvZXNuJ3QKKyAqIGZyZWUgaXQuIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsoKSBib3RoIHJlbW92ZXMgdGhlCisgKiBsaW5rIGFuZCBhbHNvIGZyZWVzIGl0LgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0CisgKiBAcGFyYW0gbGluayB0aGUgbGluayBpbiB0aGUgbGlzdAorICovCit2b2lkCitfZGJ1c19saXN0X3VubGluayAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluaykKK3sKKyAgaWYgKGxpbmstPm5leHQgPT0gbGluaykKKyAgICB7CisgICAgICAvKiBvbmUtZWxlbWVudCBsaXN0ICovCisgICAgICAqbGlzdCA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeyAgICAgIAorICAgICAgbGluay0+cHJldi0+bmV4dCA9IGxpbmstPm5leHQ7CisgICAgICBsaW5rLT5uZXh0LT5wcmV2ID0gbGluay0+cHJldjsKKyAgICAgIAorICAgICAgaWYgKCpsaXN0ID09IGxpbmspCisgICAgICAgICpsaXN0ID0gbGluay0+bmV4dDsKKyAgICB9CisKKyAgbGluay0+bmV4dCA9IE5VTEw7CisgIGxpbmstPnByZXYgPSBOVUxMOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBsaW5rIGZyb20gdGhlIGxpc3QuIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcGFyYW0gbGluayB0aGUgbGlzdCBsaW5rIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfbGlzdF9yZW1vdmVfbGluayAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBfZGJ1c19saXN0X3VubGluayAobGlzdCwgbGluayk7CisgIGZyZWVfbGluayAobGluayk7Cit9CisKKy8qKgorICogRnJlZXMgYWxsIGxpbmtzIGluIHRoZSBsaXN0IGFuZCBzZXRzIHRoZSBsaXN0IGhlYWQgdG8gI05VTEwuIERvZXMKKyAqIG5vdCBmcmVlIHRoZSBkYXRhIGluIGVhY2ggbGluaywgZm9yIG9idmlvdXMgcmVhc29ucy4gVGhpcyBpcyBhCisgKiBsaW5lYXItdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICovCit2b2lkCitfZGJ1c19saXN0X2NsZWFyIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSAqbGlzdDsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgICAKKyAgICAgIGZyZWVfbGluayAobGluayk7CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICAqbGlzdCA9IE5VTEw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZmlyc3QgbGluayBpbiB0aGUgbGlzdC4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgZmlyc3QgbGluaywgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK0RCdXNMaXN0KgorX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoREJ1c0xpc3QgKipsaXN0KQoreworICByZXR1cm4gKmxpc3Q7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbGFzdCBsaW5rIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBsYXN0IGxpbmssIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoREJ1c0xpc3QgKipsaXN0KQoreworICBpZiAoKmxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiAoKmxpc3QpLT5wcmV2OworfQorCisvKioKKyAqIEdldHMgdGhlIGxhc3QgZGF0YSBpbiB0aGUgbGlzdC4KKyAqIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgbGFzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfZ2V0X2xhc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UKKyAgICByZXR1cm4gKCpsaXN0KS0+cHJldi0+ZGF0YTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBmaXJzdCBkYXRhIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBmaXJzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfZ2V0X2ZpcnN0IChEQnVzTGlzdCAqKmxpc3QpCit7CisgIGlmICgqbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuICgqbGlzdCktPmRhdGE7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgZmlyc3QgbGluayBpbiB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIFRoaXMgaXMgYQorICogY29uc3RhbnQtdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHJldHVybnMgdGhlIGZpcnN0IGxpbmsgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgX2RidXNfbGlzdF91bmxpbmsgKGxpc3QsIGxpbmspOworCisgIHJldHVybiBsaW5rOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgZmlyc3QgZGF0YSBpbiB0aGUgbGlzdCwgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK3ZvaWQqCitfZGJ1c19saXN0X3BvcF9maXJzdCAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgdm9pZCAqZGF0YTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGRhdGEgPSBsaW5rLT5kYXRhOworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChsaXN0LCBsaW5rKTsKKworICByZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgbGFzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfcG9wX2xhc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIHZvaWQgKmRhdGE7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGRhdGEgPSBsaW5rLT5kYXRhOworICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChsaXN0LCBsaW5rKTsKKworICByZXR1cm4gZGF0YTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogUmVtb3ZlcyB0aGUgbGFzdCBsaW5rIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgbGFzdCBsaW5rIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLworREJ1c0xpc3QqCitfZGJ1c19saXN0X3BvcF9sYXN0X2xpbmsgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBfZGJ1c19saXN0X3VubGluayAobGlzdCwgbGluayk7CisKKyAgcmV0dXJuIGxpbms7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKioKKyAqIENvcGllcyBhIGxpc3QuIFRoaXMgaXMgYSBsaW5lYXItdGltZSBvcGVyYXRpb24uICBJZiB0aGVyZSBpc24ndAorICogZW5vdWdoIG1lbW9yeSB0byBjb3B5IHRoZSBlbnRpcmUgbGlzdCwgdGhlIGRlc3RpbmF0aW9uIGxpc3Qgd2lsbCBiZQorICogc2V0IHRvICNOVUxMLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGhlYWQgb2YgdGhlIGxpc3QgdG8gY29weS4KKyAqIEBwYXJhbSBkZXN0IGFkZHJlc3Mgd2hlcmUgdGhlIGNvcGllZCBsaXN0IHNob3VsZCBiZSBwbGFjZWQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X2NvcHkgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKipkZXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c19hc3NlcnQgKGxpc3QgIT0gZGVzdCk7CisKKyAgKmRlc3QgPSBOVUxMOworICAKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKGRlc3QsIGxpbmstPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgLyogZnJlZSB3aGF0IHdlIGhhdmUgc28gZmFyICovCisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoZGVzdCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBsZW5ndGggb2YgYSBsaXN0LiBUaGlzIGlzIGEgbGluZWFyLXRpbWUKKyAqIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKiBAcmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK2ludAorX2RidXNfbGlzdF9nZXRfbGVuZ3RoIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgbGVuZ3RoOworCisgIGxlbmd0aCA9IDA7CisgIAorICBsaW5rID0gKmxpc3Q7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgKytsZW5ndGg7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gbGVuZ3RoOworfQorCisvKioKKyAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0LiAgVGhlCisgKiBmdW5jdGlvbiBpcyBwYXNzZWQgdGhlIGxpc3QgZWxlbWVudCBhcyBpdHMgZmlyc3QgYXJndW1lbnQsIGFuZCB0aGUKKyAqIGdpdmVuIGRhdGEgYXMgaXRzIHNlY29uZCBhcmd1bWVudC4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICogQHBhcmFtIGZ1bmN0aW9uIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZWxlbWVudC4KKyAqIEBwYXJhbSBkYXRhIGV4dHJhIGRhdGEgZm9yIHRoZSBmdW5jdGlvbi4KKyAqIAorICovCit2b2lkCitfZGJ1c19saXN0X2ZvcmVhY2ggKERCdXNMaXN0ICAgICAgICAgICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gKmxpc3Q7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgICAgCisgICAgICAoKiBmdW5jdGlvbikgKGxpbmstPmRhdGEsIGRhdGEpOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBsZW5ndGggaXMgZXhhY3RseSBvbmUuCisgKgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIGxlbmd0aCBpcyBleGFjdGx5IG9uZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIHJldHVybiAoKmxpc3QgIT0gTlVMTCAmJgorICAgICAgICAgICgqbGlzdCktPm5leHQgPT0gKmxpc3QpOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgdm9pZAordmVyaWZ5X2xpc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBsZW5ndGg7CisgIAorICBsaW5rID0gKmxpc3Q7CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKGxpbmstPm5leHQgPT0gbGluaykKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmstPnByZXYgPT0gbGluayk7CisgICAgICBfZGJ1c19hc3NlcnQgKCpsaXN0ID09IGxpbmspOworICAgICAgcmV0dXJuOworICAgIH0KKworICBsZW5ndGggPSAwOworICBkbworICAgIHsKKyAgICAgIGxlbmd0aCArPSAxOworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rLT5wcmV2LT5uZXh0ID09IGxpbmspOworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rLT5uZXh0LT5wcmV2ID09IGxpbmspOworICAgICAgbGluayA9IGxpbmstPm5leHQ7CisgICAgfQorICB3aGlsZSAobGluayAhPSAqbGlzdCk7CisKKyAgX2RidXNfYXNzZXJ0IChsZW5ndGggPT0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoIChsaXN0KSk7CisKKyAgaWYgKGxlbmd0aCA9PSAxKQorICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lIChsaXN0KSk7CisgIGVsc2UKKyAgICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKGxpc3QpKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpc19hc2NlbmRpbmdfc2VxdWVuY2UgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBwcmV2OworCisgIHByZXYgPSBfREJVU19JTlRfTUlOOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2ID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmstPmRhdGEpOworICAgICAgCisgICAgICBpZiAodiA8PSBwcmV2KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHByZXYgPSB2OworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXNfZGVzY2VuZGluZ19zZXF1ZW5jZSAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IHByZXY7CisKKyAgcHJldiA9IF9EQlVTX0lOVF9NQVg7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaW50IHYgPSBfREJVU19QT0lOVEVSX1RPX0lOVCAobGluay0+ZGF0YSk7CisKKyAgICAgIGlmICh2ID49IHByZXYpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcHJldiA9IHY7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfZXZlbl92YWx1ZXMgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaW50IHYgPSBfREJVU19QT0lOVEVSX1RPX0lOVCAobGluay0+ZGF0YSk7CisKKyAgICAgIGlmICgodiAlIDIpICE9IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsbF9vZGRfdmFsdWVzIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2ID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmstPmRhdGEpOworCisgICAgICBpZiAoKHYgJSAyKSA9PSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0c19lcXVhbCAoREJ1c0xpc3QgKipsaXN0MSwKKyAgICAgICAgICAgICBEQnVzTGlzdCAqKmxpc3QyKQoreworICBEQnVzTGlzdCAqbGluazE7CisgIERCdXNMaXN0ICpsaW5rMjsKKyAgCisgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdDEpOworICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QyKTsKKyAgd2hpbGUgKGxpbmsxICYmIGxpbmsyKQorICAgIHsKKyAgICAgIGlmIChsaW5rMS0+ZGF0YSAhPSBsaW5rMi0+ZGF0YSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdDEsIGxpbmsxKTsKKyAgICAgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0MiwgbGluazIpOworICAgIH0KKworICBpZiAobGluazEgfHwgbGluazIpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNMaXN0SW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNMaXN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF90ZXN0ICh2b2lkKQoreworICBEQnVzTGlzdCAqbGlzdDE7CisgIERCdXNMaXN0ICpsaXN0MjsKKyAgREJ1c0xpc3QgKmxpbmsxOworICBEQnVzTGlzdCAqbGluazI7CisgIERCdXNMaXN0ICpjb3B5MTsKKyAgREJ1c0xpc3QgKmNvcHkyOworICBpbnQgaTsKKyAgCisgIGxpc3QxID0gTlVMTDsKKyAgbGlzdDIgPSBOVUxMOworCisgIC8qIFRlc3QgYXBwZW5kIGFuZCBwcmVwZW5kICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgYXBwZW5kIik7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdW50IG5vdCBhbGxvY2F0ZSBmb3IgcHJlcGVuZCIpOworICAgICAgKytpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QxKSA9PSBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmbGlzdDIpID09IGkpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfZGVzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QyKSk7CisKKyAgLyogVGVzdCBsaXN0IGNsZWFyICovCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0Mik7CisKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworCisgIC8qIFRlc3QgZ2V0X2ZpcnN0LCBnZXRfbGFzdCwgcG9wX2ZpcnN0LCBwb3BfbGFzdCAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgdm9pZCAqZ290X2RhdGExOworICAgICAgdm9pZCAqZ290X2RhdGEyOworICAgICAgCisgICAgICB2b2lkICpkYXRhMTsKKyAgICAgIHZvaWQgKmRhdGEyOworCisgICAgICBnb3RfZGF0YTEgPSBfZGJ1c19saXN0X2dldF9sYXN0ICgmbGlzdDEpOworICAgICAgZ290X2RhdGEyID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZsaXN0Mik7CisgICAgICAKKyAgICAgIGRhdGExID0gX2RidXNfbGlzdF9wb3BfbGFzdCAoJmxpc3QxKTsKKyAgICAgIGRhdGEyID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZsaXN0Mik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoZ290X2RhdGExID09IGRhdGExKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZ290X2RhdGEyID09IGRhdGEyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTIpID09IGkpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MikpOworICAgICAgCisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAobGlzdDEgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGlzdDIgPT0gTlVMTCk7CisKKyAgLyogVGVzdCBnZXRfZmlyc3RfbGluaywgZ2V0X2xhc3RfbGluaywgcG9wX2ZpcnN0X2xpbmssIHBvcF9sYXN0X2xpbmsgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICBfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpnb3RfbGluazE7CisgICAgICBEQnVzTGlzdCAqZ290X2xpbmsyOworCisgICAgICBEQnVzTGlzdCAqbGluazE7CisgICAgICBEQnVzTGlzdCAqbGluazI7CisgICAgICAKKyAgICAgIHZvaWQgKmRhdGExOworICAgICAgdm9pZCAqZGF0YTI7CisgICAgICAKKyAgICAgIGdvdF9saW5rMSA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmxpc3QxKTsKKyAgICAgIGdvdF9saW5rMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0Mik7CisgICAgICAKKyAgICAgIGxpbmsxID0gX2RidXNfbGlzdF9wb3BfbGFzdF9saW5rICgmbGlzdDEpOworICAgICAgbGluazIgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmbGlzdDIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGdvdF9saW5rMSA9PSBsaW5rMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGdvdF9saW5rMiA9PSBsaW5rMik7CisKKyAgICAgIGRhdGExID0gbGluazEtPmRhdGE7CisgICAgICBkYXRhMiA9IGxpbmsyLT5kYXRhOworCisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluazEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmsyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTIpID09IGkpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MikpOworICAgICAgCisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAobGlzdDEgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGlzdDIgPT0gTlVMTCk7CisgIAorICAvKiBUZXN0IGl0ZXJhdGlvbiAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QxKSA9PSBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmbGlzdDIpID09IGkpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfZGVzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QyKSk7CisKKyAgLS1pOworICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0Mik7CisgIHdoaWxlIChsaW5rMiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGluazIpOyAvKiBwcmV0ZW5kIHRoaXMgbGluayBpcyB0aGUgaGVhZCAqLworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMi0+ZGF0YSkgPT0gaSk7CisgICAgICAKKyAgICAgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdDIsIGxpbmsyKTsKKyAgICAgIC0taTsKKyAgICB9CisKKyAgaSA9IDA7CisgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QxKTsKKyAgd2hpbGUgKGxpbmsxICE9IE5VTEwpCisgICAgeworICAgICAgdmVyaWZ5X2xpc3QgKCZsaW5rMSk7IC8qIHByZXRlbmQgdGhpcyBsaW5rIGlzIHRoZSBoZWFkICovCisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmsxLT5kYXRhKSA9PSBpKTsKKyAgICAgIAorICAgICAgbGluazEgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0MSwgbGluazEpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmbGlzdDEpOworICB3aGlsZSAobGluazEgIT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpbmsxKTsgLyogcHJldGVuZCB0aGlzIGxpbmsgaXMgdGhlIGhlYWQgKi8KKworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAobGluazEtPmRhdGEpID09IGkpOworICAgICAgCisgICAgICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmxpc3QxLCBsaW5rMSk7CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0Mik7CisKKyAgLyogVGVzdCByZW1vdmUgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICBfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IHNob3VsZCBoYXZlIGJlZW4gaW4gbGlzdCIpOworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBpbiBsaXN0Iik7CisKKyAgICAgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgICAgfQorICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGFsbF9vZGRfdmFsdWVzICgmbGlzdDEpKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxfb2RkX3ZhbHVlcyAoJmxpc3QyKSk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKworICAvKiB0ZXN0IHJlbW92aW5nIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBlbGVtZW50cyAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgaWYgKChpICUgMikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBpbiBsaXN0Iik7CisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X3JlbW92ZSAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZWxlbWVudCBzaG91bGQgaGF2ZSBiZWVuIGluIGxpc3QiKTsKKworICAgICAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgICAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICAgICAgICB9CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYWxsX2V2ZW5fdmFsdWVzICgmbGlzdDEpKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxfZXZlbl92YWx1ZXMgKCZsaXN0MikpOworCisgIC8qIGNsZWFyIGxpc3QgdXNpbmcgcmVtb3ZlX2xpbmsgKi8KKyAgd2hpbGUgKGxpc3QxICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QxLCBsaXN0MSk7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICB9CisgIHdoaWxlIChsaXN0MiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0MiwgbGlzdDIpOworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgICAgfQorCisgIC8qIFRlc3QgcmVtb3ZlIGxpbmsgbW9yZSBnZW5lcmFsbHkgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QyKTsKKyAgd2hpbGUgKGxpbmsyICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0MiwgbGluazIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMi0+ZGF0YSkgPT0gaSk7CisKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0MiwgbGluazIpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgIAorICAgICAgbGluazIgPSBuZXh0OworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGFsbF9vZGRfdmFsdWVzICgmbGlzdDIpKTsgIAorICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDIpOworICAKKyAgaSA9IDA7CisgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QxKTsKKyAgd2hpbGUgKGxpbmsxICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0MSwgbGluazEpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMS0+ZGF0YSkgPT0gaSk7CisKKyAgICAgIGlmICgoaSAlIDIpICE9IDApCisgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0MSwgbGluazEpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIAorICAgICAgbGluazEgPSBuZXh0OworICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGFsbF9ldmVuX3ZhbHVlcyAoJmxpc3QxKSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisKKyAgLyogVGVzdCBjb3B5aW5nIGEgbGlzdCAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpOworICAgICAgX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICArK2k7CisgICAgfQorCisgIC8qIGJhZCBwb2ludGVycywgYmVjYXVzZSB0aGV5IGFyZSBhbGxvd2VkIGluIHRoZSBjb3B5IGRlc3QgKi8KKyAgY29weTEgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoMHgzNDIyMzQpOworICBjb3B5MiA9IF9EQlVTX0lOVF9UT19QT0lOVEVSICgyMyk7CisgIAorICBfZGJ1c19saXN0X2NvcHkgKCZsaXN0MSwgJmNvcHkxKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIHZlcmlmeV9saXN0ICgmY29weTEpOworICBfZGJ1c19hc3NlcnQgKGxpc3RzX2VxdWFsICgmbGlzdDEsICZjb3B5MSkpOworICAKKyAgX2RidXNfbGlzdF9jb3B5ICgmbGlzdDIsICZjb3B5Mik7CisgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICB2ZXJpZnlfbGlzdCAoJmNvcHkyKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0c19lcXVhbCAoJmxpc3QyLCAmY29weTIpKTsKKworICAvKiBOb3cgdGVzdCBjb3B5aW5nIGVtcHR5IGxpc3RzICovCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0Mik7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb3B5MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb3B5Mik7CisgIAorICAvKiBiYWQgcG9pbnRlcnMsIGJlY2F1c2UgdGhleSBhcmUgYWxsb3dlZCBpbiB0aGUgY29weSBkZXN0ICovCisgIGNvcHkxID0gX0RCVVNfSU5UX1RPX1BPSU5URVIgKDB4MzQyMjM0KTsKKyAgY29weTIgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoMjMpOworICAKKyAgX2RidXNfbGlzdF9jb3B5ICgmbGlzdDEsICZjb3B5MSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICB2ZXJpZnlfbGlzdCAoJmNvcHkxKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0c19lcXVhbCAoJmxpc3QxLCAmY29weTEpKTsKKyAgCisgIF9kYnVzX2xpc3RfY29weSAoJmxpc3QyLCAmY29weTIpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgdmVyaWZ5X2xpc3QgKCZjb3B5Mik7CisgIF9kYnVzX2Fzc2VydCAobGlzdHNfZXF1YWwgKCZsaXN0MiwgJmNvcHkyKSk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKyAgCisgIC8qIGluc2VydF9iZWZvcmUgb24gZW1wdHkgbGlzdCAqLworICBfZGJ1c19saXN0X2luc2VydF9iZWZvcmUgKCZsaXN0MSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMCkpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKworICAvKiBpbnNlcnRpbmcgYmVmb3JlIGZpcnN0IGVsZW1lbnQgKi8KKyAgX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlICgmbGlzdDEsIGxpc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgyKSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworCisgIC8qIGluc2VydGluZyBpbiB0aGUgbWlkZGxlICovCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2JlZm9yZSAoJmxpc3QxLCBsaXN0MS0+bmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMSkpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgX2RidXNfYXNzZXJ0IChpc19kZXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsgIAorCisgIC8qIHVzaW5nIGluc2VydF9iZWZvcmUgdG8gYXBwZW5kICovCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2JlZm9yZSAoJmxpc3QxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgtMSkpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgX2RidXNfYXNzZXJ0IChpc19kZXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisKKyAgLyogaW5zZXJ0X2FmdGVyIG9uIGVtcHR5IGxpc3QgKi8KKyAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZsaXN0MSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgwKSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworCisgIC8qIGluc2VydGluZyBhZnRlciBmaXJzdCBlbGVtZW50ICovCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyICgmbGlzdDEsIGxpc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDEpKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKworICAvKiBpbnNlcnRpbmcgYXQgdGhlIGVuZCAqLworICBfZGJ1c19saXN0X2luc2VydF9hZnRlciAoJmxpc3QxLCBsaXN0MS0+bmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgyKSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisKKyAgLyogdXNpbmcgaW5zZXJ0X2FmdGVyIHRvIHByZXBlbmQgKi8KKyAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZsaXN0MSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgtMSkpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworICAKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKworICAvKiB1c2luZyByZW1vdmVfbGFzdCAqLworICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMikpOworICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMSkpOworICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMykpOworCisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDIpKTsKKyAgCisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgIAorICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLWxpc3QuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzYWQyNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1saXN0LmgKQEAgLTAsMCArMSw5OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWxpc3QuaCBHZW5lcmljIGxpbmtlZCBsaXN0IHV0aWxpdHkgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTElTVF9ICisjZGVmaW5lIERCVVNfTElTVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworc3RydWN0IERCdXNMaXN0Cit7CisgIERCdXNMaXN0ICpwcmV2OyAvKio8IFByZXZpb3VzIGxpc3Qgbm9kZS4gKi8KKyAgREJ1c0xpc3QgKm5leHQ7IC8qKjwgTmV4dCBsaXN0IG5vZGUuICovCisgIHZvaWQgICAgICpkYXRhOyAvKio8IERhdGEgc3RvcmVkIGF0IHRoaXMgZWxlbWVudC4gKi8KK307CitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2FwcGVuZCAgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X3ByZXBlbmQgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2luc2VydF9iZWZvcmUgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYmVmb3JlX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOworZGJ1c19ib29sX3QgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgICAgICAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOwordm9pZCAgICAgICAgX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmJlZm9yZV90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyX2xpbmsgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICphZnRlcl90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfcmVtb3ZlICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK0RCdXNMaXN0KiAgIF9kYnVzX2xpc3RfZmluZF9sYXN0ICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJ1c0xpc3QqICAgX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQnVzTGlzdCogICBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK3ZvaWQqICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xhc3QgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOwordm9pZCogICAgICAgX2RidXNfbGlzdF9nZXRfZmlyc3QgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCk7Cit2b2lkKiAgICAgICBfZGJ1c19saXN0X3BvcF9maXJzdCAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK3ZvaWQqICAgICAgIF9kYnVzX2xpc3RfcG9wX2xhc3QgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJ1c0xpc3QqICAgX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQnVzTGlzdCogICBfZGJ1c19saXN0X3BvcF9sYXN0X2xpbmsgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfY29weSAgICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKipkZXN0KTsKK2ludCAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJ1c0xpc3QqICAgX2RidXNfbGlzdF9hbGxvY19saW5rICAgICAgICAgKHZvaWQgICAgICAqZGF0YSk7Cit2b2lkICAgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAgICAgICAgICAoREJ1c0xpc3QgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfdW5saW5rICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworCisKKworCit2b2lkIF9kYnVzX2xpc3RfZm9yZWFjaCAoREJ1c0xpc3QgICAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hGdW5jdGlvbiAgIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpkYXRhKTsKKworI2RlZmluZSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsobGlzdCwgbGluaykgKChsaW5rKS0+bmV4dCA9PSAqKGxpc3QpID8gTlVMTCA6IChsaW5rKS0+bmV4dCkKKyNkZWZpbmUgX2RidXNfbGlzdF9nZXRfcHJldl9saW5rKGxpc3QsIGxpbmspICgobGluaykgPT0gKihsaXN0KSA/IE5VTEwgOiAobGluayktPnByZXYpCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hY3Jvcy5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDNlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFjcm9zLmgKQEAgLTAsMCArMSwxODggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYWNyb3MuaCAgZ2VuZXJpYyBtYWNyb3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19NQUNST1NfSAorI2RlZmluZSBEQlVTX01BQ1JPU19ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBEQlVTX0JFR0lOX0RFQ0xTICBleHRlcm4gIkMiIHsKKyMgIGRlZmluZSBEQlVTX0VORF9ERUNMUyAgICB9CisjZWxzZQorIyAgZGVmaW5lIERCVVNfQkVHSU5fREVDTFMKKyMgIGRlZmluZSBEQlVTX0VORF9ERUNMUworI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorIyAgZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjICBkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNpZm5kZWYgTlVMTAorIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICAgZGVmaW5lIE5VTEwgICAgICAgICgwTCkKKyMgIGVsc2UgLyogIV9fY3BsdXNwbHVzICovCisjICAgIGRlZmluZSBOVUxMICAgICAgICAoKHZvaWQqKSAwKQorIyAgZW5kaWYgLyogIV9fY3BsdXNwbHVzICovCisjZW5kaWYKKworI2lmICBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkKKyMgIGRlZmluZSBEQlVTX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMzAwKQorIyAgZGVmaW5lIERCVVNfREVQUkVDQVRFRCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpCisjZWxzZQorIyAgZGVmaW5lIERCVVNfREVQUkVDQVRFRAorI2VuZGlmCisKKyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOCkKKyMgIGRlZmluZSBfREJVU19HTlVDX0VYVEVOU0lPTiBfX2V4dGVuc2lvbl9fCisjZWxzZQorIyAgZGVmaW5lIF9EQlVTX0dOVUNfRVhURU5TSU9OCisjZW5kaWYKKworI2lmICAgICBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPiA0KQorI2RlZmluZSBfREJVU19HTlVDX1BSSU5URiggZm9ybWF0X2lkeCwgYXJnX2lkeCApICAgIFwKKyAgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyAoX19wcmludGZfXywgZm9ybWF0X2lkeCwgYXJnX2lkeCkpKQorI2RlZmluZSBfREJVU19HTlVDX05PUkVUVVJOICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyNlbHNlICAgLyogIV9fR05VQ19fICovCisjZGVmaW5lIF9EQlVTX0dOVUNfUFJJTlRGKCBmb3JtYXRfaWR4LCBhcmdfaWR4ICkKKyNkZWZpbmUgX0RCVVNfR05VQ19OT1JFVFVSTgorI2VuZGlmICAvKiAhX19HTlVDX18gKi8KKworI2lmICAgIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NikKKyNkZWZpbmUgREJVU19NQUxMT0MgICAgIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKQorI2Vsc2UKKyNkZWZpbmUgREJVU19NQUxMT0MKKyNlbmRpZgorCisjaWYgICAgIChfX0dOVUNfXyA+IDQpIHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4KSkpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRTIoeCx5KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4LHkpKSkKKyNlbHNlCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KQorI2RlZmluZSBEQlVTX0FMTE9DX1NJWkUyKHgseSkKKyNlbmRpZgorCisvKiogQGRlZiBfREJVU19HTlVDX1BSSU5URgorICogdXNlZCB0byB0ZWxsIGdjYyBhYm91dCBwcmludGYgZm9ybWF0IHN0cmluZ3MKKyAqLworLyoqIEBkZWYgX0RCVVNfR05VQ19OT1JFVFVSTgorICogdXNlZCB0byB0ZWxsIGdjYyBhYm91dCBmdW5jdGlvbnMgdGhhdCBuZXZlciByZXR1cm4sIHN1Y2ggYXMgX2RidXNfYWJvcnQoKQorICovCisKKworLyogTm9ybWFsbHkgZG9jcyBhcmUgaW4gLmMgZmlsZXMsIGJ1dCB0aGVyZSBpc24ndCBhIC5jIGZpbGUgZm9yIHRoaXMuICovCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWFjcm9zIFV0aWxpdHkgbWFjcm9zCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmICNUUlVFLCAjRkFMU0UsICNOVUxMLCBhbmQgc28gb24KKyAqCisgKiBVdGlsaXR5IG1hY3Jvcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBEQlVTX0JFR0lOX0RFQ0xTCisgKgorICogTWFjcm8gdXNlZCBwcmlvciB0byBkZWNsYXJpbmcgZnVuY3Rpb25zIGluIHRoZSBELUJ1cyBoZWFkZXIKKyAqIGZpbGVzLiBFeHBhbmRzIHRvICJleHRlcm4gIkMiIiB3aGVuIHVzaW5nIGEgQysrIGNvbXBpbGVyLAorICogYW5kIGV4cGFuZHMgdG8gbm90aGluZyB3aGVuIHVzaW5nIGEgQyBjb21waWxlci4KKyAqCisgKiBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgaW4geW91ciBvd24gY29kZSwgY29uc2lkZXIgaXQKKyAqIEQtQnVzIGludGVybmFsLgorICovCisvKioKKyAqIEBkZWYgREJVU19FTkRfREVDTFMKKyAqCisgKiBNYWNybyB1c2VkIGFmdGVyIGRlY2xhcmluZyBmdW5jdGlvbnMgaW4gdGhlIEQtQnVzIGhlYWRlcgorICogZmlsZXMuIEV4cGFuZHMgdG8gIn0iIHdoZW4gdXNpbmcgYSBDKysgY29tcGlsZXIsCisgKiBhbmQgZXhwYW5kcyB0byBub3RoaW5nIHdoZW4gdXNpbmcgYSBDIGNvbXBpbGVyLgorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIG93biBjb2RlLCBjb25zaWRlciBpdAorICogRC1CdXMgaW50ZXJuYWwuCisgKi8KKy8qKgorICogQGRlZiBUUlVFCisgKgorICogRXhwYW5kcyB0byAiMSIKKyAqLworLyoqCisgKiBAZGVmIEZBTFNFCisgKgorICogRXhwYW5kcyB0byAiMCIKKyAqLworLyoqCisgKiBAZGVmIE5VTEwKKyAqCisgKiBBIG51bGwgcG9pbnRlciwgZGVmaW5lZCBhcHByb3ByaWF0ZWx5IGZvciBDIG9yIEMrKy4KKyAqLworLyoqCisgKiBAZGVmIERCVVNfREVQUkVDQVRFRAorICoKKyAqIFRlbGxzIHRoZSBjb21waWxlciB0byB3YXJuIGFib3V0IGEgZnVuY3Rpb24gb3IgdHlwZSBpZiBpdCdzIHVzZWQuCisgKiBDb2RlIG1hcmtlZCBpbiB0aGlzIHdheSBzaG91bGQgYWxzbyBiZSBlbmNsb3NlZCBpbgorICogQGNvZGUKKyAqICNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQKKyAqICBkZXByZWNhdGVkIHN0dWZmIGhlcmUKKyAqICNlbmRpZgorICogQGVuZGNvZGUKKyAqCisgKiBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgaW4geW91ciBvd24gY29kZSwgY29uc2lkZXIgaXQKKyAqIEQtQnVzIGludGVybmFsLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfR05VQ19FWFRFTlNJT04KKyAqCisgKiBUZWxscyBnY2Mgbm90IHRvIHdhcm4gYWJvdXQgZXh0ZW5zaW9ucyB0byB0aGUgQyBzdGFuZGFyZCBpbiB0aGUKKyAqIGZvbGxvd2luZyBleHByZXNzaW9uLCBldmVuIGlmIGNvbXBpbGluZyB3aXRoIC1wZWRhbnRpYy4gRG8gbm90IHVzZQorICogdGhpcyBtYWNybyBpbiB5b3VyIG93biBjb2RlOyBwbGVhc2UgY29uc2lkZXIgaXQgdG8gYmUgaW50ZXJuYWwgdG8gbGliZGJ1cy4KKyAqLworCisvKgorICogQGRlZiBEQlVTX0VYUE9SVAorICoKKyAqIERlY2xhcmUgdGhlIGZvbGxvd2luZyBzeW1ib2wgYXMgcHVibGljLiAgVGhpcyBpcyBjdXJyZW50bHkgYSBub29wIG9uCisgKiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBXaW5kb3dzLgorICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgIGlmIGRlZmluZWQoREJVU19TVEFUSUNfQlVJTEQpCisjICBkZWZpbmUgREJVU19FWFBPUlQKKyMgIGVsaWYgZGVmaW5lZChkYnVzXzFfRVhQT1JUUykKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjZWxzZQorI2RlZmluZSBEQlVTX0VYUE9SVAorI2VuZGlmCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19NQUNST1NfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1haW5sb29wLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFpbmxvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzE1OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1haW5sb29wLmMKQEAgLTAsMCArMSw5MjcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYWlubG9vcC5jICBNYWluIGxvb3AgdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tYWlubG9vcC5oIgorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy13YXRjaC5oPgorCisjZGVmaW5lIE1BSU5MT09QX1NQRVcgMAorCisjaWYgTUFJTkxPT1BfU1BFVworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorc3RhdGljIGNvbnN0IGNoYXIqCit3YXRjaF9mbGFnc190b19zdHJpbmcgKGludCBmbGFncykKK3sKKyAgY29uc3QgY2hhciAqd2F0Y2hfdHlwZTsKKworICBpZiAoKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkgJiYKKyAgICAgIChmbGFncyAmIERCVVNfV0FUQ0hfV1JJVEFCTEUpKQorICAgIHdhdGNoX3R5cGUgPSAicmVhZHdyaXRlIjsKKyAgZWxzZSBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIHdhdGNoX3R5cGUgPSAicmVhZCI7CisgIGVsc2UgaWYgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkKKyAgICB3YXRjaF90eXBlID0gIndyaXRlIjsKKyAgZWxzZQorICAgIHdhdGNoX3R5cGUgPSAibm90IHJlYWQgb3Igd3JpdGUiOworICByZXR1cm4gd2F0Y2hfdHlwZTsKK30KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKyNlbmRpZiAvKiBNQUlOTE9PUF9TUEVXICovCisKK3N0cnVjdCBEQnVzTG9vcAoreworICBpbnQgcmVmY291bnQ7CisgIERCdXNMaXN0ICpjYWxsYmFja3M7CisgIGludCBjYWxsYmFja19saXN0X3NlcmlhbDsKKyAgaW50IHdhdGNoX2NvdW50OworICBpbnQgdGltZW91dF9jb3VudDsKKyAgaW50IGRlcHRoOyAvKio8IG51bWJlciBvZiByZWN1cnNpdmUgcnVucyAqLworICBEQnVzTGlzdCAqbmVlZF9kaXNwYXRjaDsKK307CisKK3R5cGVkZWYgZW51bQoreworICBDQUxMQkFDS19XQVRDSCwKKyAgQ0FMTEJBQ0tfVElNRU9VVAorfSBDYWxsYmFja1R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCByZWZjb3VudDsKKyAgQ2FsbGJhY2tUeXBlIHR5cGU7CisgIHZvaWQgKmRhdGE7CisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kYXRhX2Z1bmM7Cit9IENhbGxiYWNrOworCit0eXBlZGVmIHN0cnVjdAoreworICBDYWxsYmFjayBjYWxsYmFjazsKKyAgREJ1c1dhdGNoRnVuY3Rpb24gZnVuY3Rpb247CisgIERCdXNXYXRjaCAqd2F0Y2g7CisgIC8qIGxhc3Qgd2F0Y2ggaGFuZGxlIGZhaWxlZCBkdWUgdG8gT09NICovCisgIHVuc2lnbmVkIGludCBsYXN0X2l0ZXJhdGlvbl9vb20gOiAxOworfSBXYXRjaENhbGxiYWNrOworCit0eXBlZGVmIHN0cnVjdAoreworICBDYWxsYmFjayBjYWxsYmFjazsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisgIERCdXNUaW1lb3V0RnVuY3Rpb24gZnVuY3Rpb247CisgIHVuc2lnbmVkIGxvbmcgbGFzdF90dl9zZWM7CisgIHVuc2lnbmVkIGxvbmcgbGFzdF90dl91c2VjOworfSBUaW1lb3V0Q2FsbGJhY2s7CisKKyNkZWZpbmUgV0FUQ0hfQ0FMTEJBQ0soY2FsbGJhY2spICAgKChXYXRjaENhbGxiYWNrKiljYWxsYmFjaykKKyNkZWZpbmUgVElNRU9VVF9DQUxMQkFDSyhjYWxsYmFjaykgKChUaW1lb3V0Q2FsbGJhY2sqKWNhbGxiYWNrKQorCitzdGF0aWMgV2F0Y2hDYWxsYmFjayoKK3dhdGNoX2NhbGxiYWNrX25ldyAoREJ1c1dhdGNoICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIFdhdGNoQ2FsbGJhY2sgKmNiOworCisgIGNiID0gZGJ1c19uZXcgKFdhdGNoQ2FsbGJhY2ssIDEpOworICBpZiAoY2IgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjYi0+d2F0Y2ggPSB3YXRjaDsKKyAgY2ItPmZ1bmN0aW9uID0gZnVuY3Rpb247CisgIGNiLT5sYXN0X2l0ZXJhdGlvbl9vb20gPSBGQUxTRTsKKyAgY2ItPmNhbGxiYWNrLnJlZmNvdW50ID0gMTsKKyAgY2ItPmNhbGxiYWNrLnR5cGUgPSBDQUxMQkFDS19XQVRDSDsKKyAgY2ItPmNhbGxiYWNrLmRhdGEgPSBkYXRhOworICBjYi0+Y2FsbGJhY2suZnJlZV9kYXRhX2Z1bmMgPSBmcmVlX2RhdGFfZnVuYzsKKyAgCisgIHJldHVybiBjYjsKK30KKworc3RhdGljIFRpbWVvdXRDYWxsYmFjayoKK3RpbWVvdXRfY2FsbGJhY2tfbmV3IChEQnVzVGltZW91dCAgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0RnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIFRpbWVvdXRDYWxsYmFjayAqY2I7CisKKyAgY2IgPSBkYnVzX25ldyAoVGltZW91dENhbGxiYWNrLCAxKTsKKyAgaWYgKGNiID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY2ItPnRpbWVvdXQgPSB0aW1lb3V0OworICBjYi0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgX2RidXNfZ2V0X2N1cnJlbnRfdGltZSAoJmNiLT5sYXN0X3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNiLT5sYXN0X3R2X3VzZWMpOworICBjYi0+Y2FsbGJhY2sucmVmY291bnQgPSAxOyAgICAKKyAgY2ItPmNhbGxiYWNrLnR5cGUgPSBDQUxMQkFDS19USU1FT1VUOworICBjYi0+Y2FsbGJhY2suZGF0YSA9IGRhdGE7CisgIGNiLT5jYWxsYmFjay5mcmVlX2RhdGFfZnVuYyA9IGZyZWVfZGF0YV9mdW5jOworICAKKyAgcmV0dXJuIGNiOworfQorCitzdGF0aWMgQ2FsbGJhY2sgKiAKK2NhbGxiYWNrX3JlZiAoQ2FsbGJhY2sgKmNiKQoreworICBfZGJ1c19hc3NlcnQgKGNiLT5yZWZjb3VudCA+IDApOworICAKKyAgY2ItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGNiOworfQorCitzdGF0aWMgdm9pZAorY2FsbGJhY2tfdW5yZWYgKENhbGxiYWNrICpjYikKK3sKKyAgX2RidXNfYXNzZXJ0IChjYi0+cmVmY291bnQgPiAwKTsKKworICBjYi0+cmVmY291bnQgLT0gMTsKKworICBpZiAoY2ItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaWYgKGNiLT5mcmVlX2RhdGFfZnVuYykKKyAgICAgICAgKCogY2ItPmZyZWVfZGF0YV9mdW5jKSAoY2ItPmRhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGNiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2NhbGxiYWNrIChEQnVzTG9vcCAgKmxvb3AsCisgICAgICAgICAgICAgIENhbGxiYWNrICpjYikKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxvb3AtPmNhbGxiYWNrcywgY2IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworCisgIHN3aXRjaCAoY2ItPnR5cGUpCisgICAgeworICAgIGNhc2UgQ0FMTEJBQ0tfV0FUQ0g6CisgICAgICBsb29wLT53YXRjaF9jb3VudCArPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQUxMQkFDS19USU1FT1VUOgorICAgICAgbG9vcC0+dGltZW91dF9jb3VudCArPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfY2FsbGJhY2sgKERCdXNMb29wICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKmxpbmspCit7CisgIENhbGxiYWNrICpjYiA9IGxpbmstPmRhdGE7CisgIAorICBzd2l0Y2ggKGNiLT50eXBlKQorICAgIHsKKyAgICBjYXNlIENBTExCQUNLX1dBVENIOgorICAgICAgbG9vcC0+d2F0Y2hfY291bnQgLT0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FMTEJBQ0tfVElNRU9VVDoKKyAgICAgIGxvb3AtPnRpbWVvdXRfY291bnQgLT0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIGNhbGxiYWNrX3VucmVmIChjYik7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsb29wLT5jYWxsYmFja3MsIGxpbmspOworICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworfQorCitEQnVzTG9vcCoKK19kYnVzX2xvb3BfbmV3ICh2b2lkKQoreworICBEQnVzTG9vcCAqbG9vcDsKKworICBsb29wID0gZGJ1c19uZXcwIChEQnVzTG9vcCwgMSk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbG9vcC0+cmVmY291bnQgPSAxOworICAKKyAgcmV0dXJuIGxvb3A7Cit9CisKK0RCdXNMb29wICoKK19kYnVzX2xvb3BfcmVmIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb29wICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxvb3AtPnJlZmNvdW50ID4gMCk7CisKKyAgbG9vcC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gbG9vcDsKK30KKwordm9pZAorX2RidXNfbG9vcF91bnJlZiAoREJ1c0xvb3AgKmxvb3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9vcCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsb29wLT5yZWZjb3VudCA+IDApOworCisgIGxvb3AtPnJlZmNvdW50IC09IDE7CisgIGlmIChsb29wLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHdoaWxlIChsb29wLT5uZWVkX2Rpc3BhdGNoKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmxvb3AtPm5lZWRfZGlzcGF0Y2gpOworCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGxvb3ApOworICAgIH0KK30KKworZGJ1c19ib29sX3QKK19kYnVzX2xvb3BfYWRkX3dhdGNoIChEQnVzTG9vcCAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYykKK3sKKyAgV2F0Y2hDYWxsYmFjayAqd2NiOworCisgIHdjYiA9IHdhdGNoX2NhbGxiYWNrX25ldyAod2F0Y2gsIGZ1bmN0aW9uLCBkYXRhLCBmcmVlX2RhdGFfZnVuYyk7CisgIGlmICh3Y2IgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFhZGRfY2FsbGJhY2sgKGxvb3AsIChDYWxsYmFjayopIHdjYikpCisgICAgeworICAgICAgd2NiLT5jYWxsYmFjay5mcmVlX2RhdGFfZnVuYyA9IE5VTEw7IC8qIGRvbid0IHdhbnQgdG8gaGF2ZSB0aGlzIHNpZGUgZWZmZWN0ICovCisgICAgICBjYWxsYmFja191bnJlZiAoKENhbGxiYWNrKikgd2NiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKERCdXNMb29wICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+Y2FsbGJhY2tzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxvb3AtPmNhbGxiYWNrcywgbGluayk7CisgICAgICBDYWxsYmFjayAqdGhpcyA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmICh0aGlzLT50eXBlID09IENBTExCQUNLX1dBVENIICYmCisgICAgICAgICAgV0FUQ0hfQ0FMTEJBQ0sgKHRoaXMpLT53YXRjaCA9PSB3YXRjaCAmJgorICAgICAgICAgIHRoaXMtPmRhdGEgPT0gZGF0YSAmJgorICAgICAgICAgIFdBVENIX0NBTExCQUNLICh0aGlzKS0+ZnVuY3Rpb24gPT0gZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICByZW1vdmVfY2FsbGJhY2sgKGxvb3AsIGxpbmspOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfd2FybiAoImNvdWxkIG5vdCBmaW5kIHdhdGNoICVwIGZ1bmN0aW9uICVwIGRhdGEgJXAgdG8gcmVtb3ZlXG4iLAorICAgICAgICAgICAgICB3YXRjaCwgKHZvaWQgKilmdW5jdGlvbiwgZGF0YSk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX2FkZF90aW1lb3V0IChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgIGZyZWVfZGF0YV9mdW5jKQoreworICBUaW1lb3V0Q2FsbGJhY2sgKnRjYjsKKworICB0Y2IgPSB0aW1lb3V0X2NhbGxiYWNrX25ldyAodGltZW91dCwgZnVuY3Rpb24sIGRhdGEsIGZyZWVfZGF0YV9mdW5jKTsKKyAgaWYgKHRjYiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWFkZF9jYWxsYmFjayAobG9vcCwgKENhbGxiYWNrKikgdGNiKSkKKyAgICB7CisgICAgICB0Y2ItPmNhbGxiYWNrLmZyZWVfZGF0YV9mdW5jID0gTlVMTDsgLyogZG9uJ3Qgd2FudCB0byBoYXZlIHRoaXMgc2lkZSBlZmZlY3QgKi8KKyAgICAgIGNhbGxiYWNrX3VucmVmICgoQ2FsbGJhY2sqKSB0Y2IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsb29wLT5jYWxsYmFja3MpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbG9vcC0+Y2FsbGJhY2tzLCBsaW5rKTsKKyAgICAgIENhbGxiYWNrICp0aGlzID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKHRoaXMtPnR5cGUgPT0gQ0FMTEJBQ0tfVElNRU9VVCAmJgorICAgICAgICAgIFRJTUVPVVRfQ0FMTEJBQ0sgKHRoaXMpLT50aW1lb3V0ID09IHRpbWVvdXQgJiYKKyAgICAgICAgICB0aGlzLT5kYXRhID09IGRhdGEgJiYKKyAgICAgICAgICBUSU1FT1VUX0NBTExCQUNLICh0aGlzKS0+ZnVuY3Rpb24gPT0gZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICByZW1vdmVfY2FsbGJhY2sgKGxvb3AsIGxpbmspOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfd2FybiAoImNvdWxkIG5vdCBmaW5kIHRpbWVvdXQgJXAgZnVuY3Rpb24gJXAgZGF0YSAlcCB0byByZW1vdmVcbiIsCisgICAgICAgICAgICAgIHRpbWVvdXQsICh2b2lkICopZnVuY3Rpb24sIGRhdGEpOworfQorCisvKiBDb252b2x1dGlvbnMgZnJvbSBHTGliLCB0aGVyZSByZWFsbHkgbXVzdCBiZSBhIGJldHRlciB3YXkKKyAqIHRvIGRvIHRoaXMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfdGltZW91dCAodW5zaWduZWQgbG9uZyAgICB0dl9zZWMsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHR2X3VzZWMsCisgICAgICAgICAgICAgICBUaW1lb3V0Q2FsbGJhY2sgKnRjYiwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAqdGltZW91dCkKK3sKKyAgbG9uZyBzZWNfcmVtYWluaW5nOworICBsb25nIG1zZWNfcmVtYWluaW5nOworICB1bnNpZ25lZCBsb25nIGV4cGlyYXRpb25fdHZfc2VjOworICB1bnNpZ25lZCBsb25nIGV4cGlyYXRpb25fdHZfdXNlYzsKKyAgbG9uZyBpbnRlcnZhbF9zZWNvbmRzOworICBsb25nIGludGVydmFsX21pbGxpc2Vjb25kczsKKyAgaW50IGludGVydmFsOworCisgIC8qIEknbSBwcmV0dHkgc3VyZSB0aGlzIGZ1bmN0aW9uIGNvdWxkIHN1Y2sgKGEgbG90KSBsZXNzICovCisgIAorICBpbnRlcnZhbCA9IGRidXNfdGltZW91dF9nZXRfaW50ZXJ2YWwgKHRjYi0+dGltZW91dCk7CisgIAorICBpbnRlcnZhbF9zZWNvbmRzID0gaW50ZXJ2YWwgLyAxMDAwTDsKKyAgaW50ZXJ2YWxfbWlsbGlzZWNvbmRzID0gaW50ZXJ2YWwgJSAxMDAwTDsKKyAgCisgIGV4cGlyYXRpb25fdHZfc2VjID0gdGNiLT5sYXN0X3R2X3NlYyArIGludGVydmFsX3NlY29uZHM7CisgIGV4cGlyYXRpb25fdHZfdXNlYyA9IHRjYi0+bGFzdF90dl91c2VjICsgaW50ZXJ2YWxfbWlsbGlzZWNvbmRzICogMTAwMDsKKyAgaWYgKGV4cGlyYXRpb25fdHZfdXNlYyA+PSAxMDAwMDAwKQorICAgIHsKKyAgICAgIGV4cGlyYXRpb25fdHZfdXNlYyAtPSAxMDAwMDAwOworICAgICAgZXhwaXJhdGlvbl90dl9zZWMgKz0gMTsKKyAgICB9CisgIAorICBzZWNfcmVtYWluaW5nID0gZXhwaXJhdGlvbl90dl9zZWMgLSB0dl9zZWM7CisgIC8qIG5lZWQgdG8gZm9yY2UgdGhpcyB0byBiZSBzaWduZWQsIGFzIGl0IGlzIGludGVuZGVkIHRvIHNvbWV0aW1lcworICAgKiBwcm9kdWNlIGEgbmVnYXRpdmUgcmVzdWx0CisgICAqLworICBtc2VjX3JlbWFpbmluZyA9ICgobG9uZykgZXhwaXJhdGlvbl90dl91c2VjIC0gKGxvbmcpIHR2X3VzZWMpIC8gMTAwMEw7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCJJbnRlcnZhbCBpcyAlbGQgc2Vjb25kcyAlbGQgbXNlY3NcbiIsCisgICAgICAgICAgICAgICAgIGludGVydmFsX3NlY29uZHMsCisgICAgICAgICAgICAgICAgIGludGVydmFsX21pbGxpc2Vjb25kcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJOb3cgaXMgICVsdSBzZWNvbmRzICVsdSB1c2Vjc1xuIiwKKyAgICAgICAgICAgICAgICAgdHZfc2VjLCB0dl91c2VjKTsKKyAgX2RidXNfdmVyYm9zZSAoIkxhc3QgaXMgJWx1IHNlY29uZHMgJWx1IHVzZWNzXG4iLAorICAgICAgICAgICAgICAgICB0Y2ItPmxhc3RfdHZfc2VjLCB0Y2ItPmxhc3RfdHZfdXNlYyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJFeHAgaXMgICVsdSBzZWNvbmRzICVsdSB1c2Vjc1xuIiwKKyAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl90dl9zZWMsIGV4cGlyYXRpb25fdHZfdXNlYyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJQcmUtY29ycmVjdGlvbiwgc2VjX3JlbWFpbmluZyAlbGQgbXNlY19yZW1haW5pbmcgJWxkXG4iLAorICAgICAgICAgICAgICAgICBzZWNfcmVtYWluaW5nLCBtc2VjX3JlbWFpbmluZyk7CisjZW5kaWYKKyAgCisgIC8qIFdlIGRvIHRoZSBmb2xsb3dpbmcgaW4gYSByYXRoZXIgY29udm9sdXRlZCBmYXNoaW9uIHRvIGRlYWwgd2l0aAorICAgKiB0aGUgZmFjdCB0aGF0IHdlIGRvbid0IGhhdmUgYW4gaW50ZWdyYWwgdHlwZSBiaWcgZW5vdWdoIHRvIGhvbGQKKyAgICogdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHRpbWV2YWxzIGluIG1pbGxpc2Vjb25kcy4KKyAgICovCisgIGlmIChzZWNfcmVtYWluaW5nIDwgMCB8fCAoc2VjX3JlbWFpbmluZyA9PSAwICYmIG1zZWNfcmVtYWluaW5nIDwgMCkpCisgICAgeworICAgICAgKnRpbWVvdXQgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChtc2VjX3JlbWFpbmluZyA8IDApCisJeworCSAgbXNlY19yZW1haW5pbmcgKz0gMTAwMDsKKwkgIHNlY19yZW1haW5pbmcgLT0gMTsKKwl9CisKKyAgICAgIGlmIChzZWNfcmVtYWluaW5nID4gKF9EQlVTX0lOVF9NQVggLyAxMDAwKSB8fAorICAgICAgICAgIG1zZWNfcmVtYWluaW5nID4gX0RCVVNfSU5UX01BWCkKKyAgICAgICAgKnRpbWVvdXQgPSBfREJVU19JTlRfTUFYOworICAgICAgZWxzZQorICAgICAgICAqdGltZW91dCA9IHNlY19yZW1haW5pbmcgKiAxMDAwICsgbXNlY19yZW1haW5pbmc7ICAgICAgICAKKyAgICB9CisKKyAgaWYgKCp0aW1lb3V0ID4gaW50ZXJ2YWwpCisgICAgeworICAgICAgLyogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIHByb2JhYmx5IG1vdmVkIGJhY2t3YXJkICovCisgICAgICBfZGJ1c192ZXJib3NlICgiU3lzdGVtIGNsb2NrIHNldCBiYWNrd2FyZCEgUmVzZXR0aW5nIHRpbWVvdXQuXG4iKTsKKyAgICAgIAorICAgICAgdGNiLT5sYXN0X3R2X3NlYyA9IHR2X3NlYzsKKyAgICAgIHRjYi0+bGFzdF90dl91c2VjID0gdHZfdXNlYzsKKworICAgICAgKnRpbWVvdXQgPSBpbnRlcnZhbDsKKyAgICB9CisgIAorI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIiAgdGltZW91dCBleHBpcmVzIGluICVkIG1pbGxpc2Vjb25kc1xuIiwgKnRpbWVvdXQpOworI2VuZGlmCisgIAorICByZXR1cm4gKnRpbWVvdXQgPT0gMDsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2xvb3BfZGlzcGF0Y2ggKERCdXNMb29wICpsb29wKQoreworCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiICAlZCBjb25uZWN0aW9ucyB0byBkaXNwYXRjaFxuIiwgX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmbG9vcC0+bmVlZF9kaXNwYXRjaCkpOworI2VuZGlmCisgIAorICBpZiAobG9vcC0+bmVlZF9kaXNwYXRjaCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgbmV4dDoKKyAgd2hpbGUgKGxvb3AtPm5lZWRfZGlzcGF0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmbG9vcC0+bmVlZF9kaXNwYXRjaCk7CisgICAgICAKKyAgICAgIHdoaWxlIChUUlVFKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKyAgICAgICAgICAKKyAgICAgICAgICBzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgICAgICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbG9vcF9xdWV1ZV9kaXNwYXRjaCAoREJ1c0xvb3AgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgaWYgKF9kYnVzX2xpc3RfYXBwZW5kICgmbG9vcC0+bmVlZF9kaXNwYXRjaCwgY29ubmVjdGlvbikpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIFJldHVybnMgVFJVRSBpZiB3ZSBpbnZva2VkIGFueSB0aW1lb3V0cyBvciBoYXZlIHJlYWR5IGZpbGUKKyAqIGRlc2NyaXB0b3JzLCB3aGljaCBpcyBqdXN0IHVzZWQgaW4gdGVzdCBjb2RlIGFzIGEgZGVidWcgaGFjaworICovCisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX2l0ZXJhdGUgKERCdXNMb29wICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICBibG9jaykKK3sgIAorI2RlZmluZSBOX1NUQUNLX0RFU0NSSVBUT1JTIDY0CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c1BvbGxGRCAqZmRzOworICBEQnVzUG9sbEZEIHN0YWNrX2Zkc1tOX1NUQUNLX0RFU0NSSVBUT1JTXTsKKyAgaW50IG5fZmRzOworICBXYXRjaENhbGxiYWNrICoqd2F0Y2hlc19mb3JfZmRzOworICBXYXRjaENhbGxiYWNrICpzdGFja193YXRjaGVzX2Zvcl9mZHNbTl9TVEFDS19ERVNDUklQVE9SU107CisgIGludCBpOworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IG5fcmVhZHk7CisgIGludCBpbml0aWFsX3NlcmlhbDsKKyAgbG9uZyB0aW1lb3V0OworICBkYnVzX2Jvb2xfdCBvb21fd2F0Y2hfcGVuZGluZzsKKyAgaW50IG9yaWdfZGVwdGg7CisgIAorICByZXR2YWwgPSBGQUxTRTsgICAgICAKKworICBmZHMgPSBOVUxMOworICB3YXRjaGVzX2Zvcl9mZHMgPSBOVUxMOworICBuX2ZkcyA9IDA7CisgIG9vbV93YXRjaF9wZW5kaW5nID0gRkFMU0U7CisgIG9yaWdfZGVwdGggPSBsb29wLT5kZXB0aDsKKyAgCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiSXRlcmF0aW9uIGJsb2NrPSVkIGRlcHRoPSVkIHRpbWVvdXRfY291bnQ9JWQgd2F0Y2hfY291bnQ9JWRcbiIsCisgICAgICAgICAgICAgICAgIGJsb2NrLCBsb29wLT5kZXB0aCwgbG9vcC0+dGltZW91dF9jb3VudCwgbG9vcC0+d2F0Y2hfY291bnQpOworI2VuZGlmCisgIAorICBpZiAobG9vcC0+Y2FsbGJhY2tzID09IE5VTEwpCisgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKworICBpZiAobG9vcC0+d2F0Y2hfY291bnQgPiBOX1NUQUNLX0RFU0NSSVBUT1JTKQorICAgIHsKKyAgICAgIGZkcyA9IGRidXNfbmV3MCAoREJ1c1BvbGxGRCwgbG9vcC0+d2F0Y2hfY291bnQpOworICAgICAgCisgICAgICB3aGlsZSAoZmRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgZmRzID0gZGJ1c19uZXcwIChEQnVzUG9sbEZELCBsb29wLT53YXRjaF9jb3VudCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgd2F0Y2hlc19mb3JfZmRzID0gZGJ1c19uZXcgKFdhdGNoQ2FsbGJhY2sqLCBsb29wLT53YXRjaF9jb3VudCk7CisgICAgICB3aGlsZSAod2F0Y2hlc19mb3JfZmRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgd2F0Y2hlc19mb3JfZmRzID0gZGJ1c19uZXcgKFdhdGNoQ2FsbGJhY2sqLCBsb29wLT53YXRjaF9jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7ICAgICAgCisgICAgICBmZHMgPSBzdGFja19mZHM7CisgICAgICB3YXRjaGVzX2Zvcl9mZHMgPSBzdGFja193YXRjaGVzX2Zvcl9mZHM7CisgICAgfQorCisgIC8qIGZpbGwgb3VyIGFycmF5IG9mIGZkcyBhbmQgd2F0Y2hlcyAqLworICBuX2ZkcyA9IDA7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+Y2FsbGJhY2tzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxvb3AtPmNhbGxiYWNrcywgbGluayk7CisgICAgICBDYWxsYmFjayAqY2IgPSBsaW5rLT5kYXRhOworICAgICAgaWYgKGNiLT50eXBlID09IENBTExCQUNLX1dBVENIKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzOworICAgICAgICAgIFdhdGNoQ2FsbGJhY2sgKndjYiA9IFdBVENIX0NBTExCQUNLIChjYik7CisgICAgICAgICAgaW50IGZkID0gZGJ1c193YXRjaF9nZXRfc29ja2V0ICh3Y2ItPndhdGNoKTsKKworICAgICAgICAgIGlmICh3Y2ItPmxhc3RfaXRlcmF0aW9uX29vbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogd2Ugc2tpcCB0aGlzIG9uZSB0aGlzIHRpbWUsIGJ1dCByZWVuYWJsZSBpdCBuZXh0IHRpbWUsCisgICAgICAgICAgICAgICAqIGFuZCBoYXZlIGEgdGltZW91dCBvbiB0aGlzIGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgd2NiLT5sYXN0X2l0ZXJhdGlvbl9vb20gPSBGQUxTRTsKKyAgICAgICAgICAgICAgb29tX3dhdGNoX3BlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsgLyogcmV0dXJuIFRSVUUgaGVyZSB0byBrZWVwIHRoZSBsb29wIGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSB3YXRjaCBpcyBpbmFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgc2tpcHBpbmcgd2F0Y2ggb24gZmQgJWQgYXMgaXQgd2FzIG91dCBvZiBtZW1vcnkgbGFzdCB0aW1lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoZmQgPT0gLTEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgid2F0Y2ggJXAgd2FzIGludmFsaWRhdGVkIGJ1dCBub3QgcmVtb3ZlZDsgIgorICAgICAgICAgICAgICAgICAgInJlbW92aW5nIGl0IG5vd1xuIiwgd2NiLT53YXRjaCk7CisgICAgICAgICAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChsb29wLCB3Y2ItPndhdGNoLCB3Y2ItPmZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgKChDYWxsYmFjayAqKXdjYiktPmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKHdjYi0+d2F0Y2gpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB3YXRjaGVzX2Zvcl9mZHNbbl9mZHNdID0gd2NiOworCisgICAgICAgICAgICAgIGNhbGxiYWNrX3JlZiAoY2IpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGZsYWdzID0gZGJ1c193YXRjaF9nZXRfZmxhZ3MgKHdjYi0+d2F0Y2gpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGZkc1tuX2Zkc10uZmQgPSBmZDsKKyAgICAgICAgICAgICAgZmRzW25fZmRzXS5yZXZlbnRzID0gMDsKKyAgICAgICAgICAgICAgZmRzW25fZmRzXS5ldmVudHMgPSAwOworICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgICAgICAgICAgICAgIGZkc1tuX2Zkc10uZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKyAgICAgICAgICAgICAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkKKyAgICAgICAgICAgICAgICBmZHNbbl9mZHNdLmV2ZW50cyB8PSBfREJVU19QT0xMT1VUOworCisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBwb2xsaW5nIHdhdGNoIG9uIGZkICVkICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIHdhdGNoX2ZsYWdzX3RvX3N0cmluZyAoZmxhZ3MpKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgIG5fZmRzICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgc2tpcHBpbmcgZGlzYWJsZWQgd2F0Y2ggb24gZmQgJWQgICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfZmxhZ3NfdG9fc3RyaW5nIChkYnVzX3dhdGNoX2dldF9mbGFncyAod2NiLT53YXRjaCkpKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorICAKKyAgdGltZW91dCA9IC0xOworICBpZiAobG9vcC0+dGltZW91dF9jb3VudCA+IDApCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB0dl9zZWM7CisgICAgICB1bnNpZ25lZCBsb25nIHR2X3VzZWM7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKyAgICAgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+Y2FsbGJhY2tzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxvb3AtPmNhbGxiYWNrcywgbGluayk7CisgICAgICAgICAgQ2FsbGJhY2sgKmNiID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGlmIChjYi0+dHlwZSA9PSBDQUxMQkFDS19USU1FT1VUICYmCisgICAgICAgICAgICAgIGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCAoVElNRU9VVF9DQUxMQkFDSyAoY2IpLT50aW1lb3V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVGltZW91dENhbGxiYWNrICp0Y2IgPSBUSU1FT1VUX0NBTExCQUNLIChjYik7CisgICAgICAgICAgICAgIGludCBtc2Vjc19yZW1haW5pbmc7CisKKyAgICAgICAgICAgICAgY2hlY2tfdGltZW91dCAodHZfc2VjLCB0dl91c2VjLCB0Y2IsICZtc2Vjc19yZW1haW5pbmcpOworCisgICAgICAgICAgICAgIGlmICh0aW1lb3V0IDwgMCkKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbXNlY3NfcmVtYWluaW5nOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGltZW91dCA9IE1JTiAobXNlY3NfcmVtYWluaW5nLCB0aW1lb3V0KTsKKworI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdGltZW91dCBhZGRlZCwgJWQgcmVtYWluaW5nLCBhZ2dyZWdhdGUgdGltZW91dCAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3JlbWFpbmluZywgdGltZW91dCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAodGltZW91dCA+PSAwKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBpdCdzIG5vdCBnb2luZyB0byBnZXQgc2hvcnRlci4uLiAqLworICAgICAgICAgICAgfQorI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICBlbHNlIGlmIChjYi0+dHlwZSA9PSBDQUxMQkFDS19USU1FT1VUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBza2lwcGluZyBkaXNhYmxlZCB0aW1lb3V0XG4iKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisgICAgfQorCisgIC8qIE5ldmVyIGJsb2NrIGlmIHdlIGhhdmUgc3R1ZmYgdG8gZGlzcGF0Y2ggKi8KKyAgaWYgKCFibG9jayB8fCBsb29wLT5uZWVkX2Rpc3BhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgdGltZW91dCA9IDA7CisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdGltZW91dCBpcyAwIGFzIHdlIGFyZW4ndCBibG9ja2luZ1xuIik7CisjZW5kaWYKKyAgICB9CisKKyAgLyogaWYgYSB3YXRjaCBpcyBPT00sIGRvbid0IHdhaXQgbG9uZ2VyIHRoYW4gdGhlIE9PTQorICAgKiB3YWl0IHRvIHJlLWVuYWJsZSBpdAorICAgKi8KKyAgaWYgKG9vbV93YXRjaF9wZW5kaW5nKQorICAgIHRpbWVvdXQgPSBNSU4gKHRpbWVvdXQsIF9kYnVzX2dldF9vb21fd2FpdCAoKSk7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHBvbGxpbmcgb24gJWQgZGVzY3JpcHRvcnMgdGltZW91dCAlbGRcbiIsIG5fZmRzLCB0aW1lb3V0KTsKKyNlbmRpZgorICAKKyAgbl9yZWFkeSA9IF9kYnVzX3BvbGwgKGZkcywgbl9mZHMsIHRpbWVvdXQpOworCisgIGluaXRpYWxfc2VyaWFsID0gbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWw7CisKKyAgaWYgKGxvb3AtPnRpbWVvdXRfY291bnQgPiAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdHZfc2VjOworICAgICAgdW5zaWduZWQgbG9uZyB0dl91c2VjOworCisgICAgICBfZGJ1c19nZXRfY3VycmVudF90aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisKKyAgICAgIC8qIEl0J2QgYmUgbmljZSB0byBhdm9pZCB0aGlzIE8obikgdGhpbmd5IGhlcmUgKi8KKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbG9vcC0+Y2FsbGJhY2tzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxvb3AtPmNhbGxiYWNrcywgbGluayk7CisgICAgICAgICAgQ2FsbGJhY2sgKmNiID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGlmIChpbml0aWFsX3NlcmlhbCAhPSBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgICAgICAgICBpZiAobG9vcC0+ZGVwdGggIT0gb3JpZ19kZXB0aCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICAgICAgICAgIAorICAgICAgICAgIGlmIChjYi0+dHlwZSA9PSBDQUxMQkFDS19USU1FT1VUICYmCisgICAgICAgICAgICAgIGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCAoVElNRU9VVF9DQUxMQkFDSyAoY2IpLT50aW1lb3V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVGltZW91dENhbGxiYWNrICp0Y2IgPSBUSU1FT1VUX0NBTExCQUNLIChjYik7CisgICAgICAgICAgICAgIGludCBtc2Vjc19yZW1haW5pbmc7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoY2hlY2tfdGltZW91dCAodHZfc2VjLCB0dl91c2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNiLCAmbXNlY3NfcmVtYWluaW5nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBTYXZlIGxhc3QgY2FsbGJhY2sgdGltZSBhbmQgZmlyZSB0aGlzIHRpbWVvdXQgKi8KKyAgICAgICAgICAgICAgICAgIHRjYi0+bGFzdF90dl9zZWMgPSB0dl9zZWM7CisgICAgICAgICAgICAgICAgICB0Y2ItPmxhc3RfdHZfdXNlYyA9IHR2X3VzZWM7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBpbnZva2luZyB0aW1lb3V0XG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAoKiB0Y2ItPmZ1bmN0aW9uKSAodGNiLT50aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5kYXRhKTsKKworICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdGltZW91dCBoYXMgbm90IGV4cGlyZWRcbiIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICBlbHNlIGlmIChjYi0+dHlwZSA9PSBDQUxMQkFDS19USU1FT1VUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBza2lwcGluZyBpbnZvY2F0aW9uIG9mIGRpc2FibGVkIHRpbWVvdXRcbiIpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIAorICBpZiAobl9yZWFkeSA+IDApCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fZmRzKQorICAgICAgICB7CisgICAgICAgICAgLyogRklYTUUgSSB0aGluayB0aGlzICJyZXN0YXJ0IGlmIHdlIGNoYW5nZSB0aGUgd2F0Y2hlcyIKKyAgICAgICAgICAgKiBhcHByb2FjaCBjb3VsZCByZXN1bHQgaW4gc3RhcnZpbmcgd2F0Y2hlcworICAgICAgICAgICAqIHRvd2FyZCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChpbml0aWFsX3NlcmlhbCAhPSBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgICAgICAgICBpZiAobG9vcC0+ZGVwdGggIT0gb3JpZ19kZXB0aCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgICAgICAgICBpZiAoZmRzW2ldLnJldmVudHMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgV2F0Y2hDYWxsYmFjayAqd2NiOworICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29uZGl0aW9uOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHdjYiA9IHdhdGNoZXNfZm9yX2Zkc1tpXTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IDA7CisgICAgICAgICAgICAgIGlmIChmZHNbaV0ucmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9SRUFEQUJMRTsKKyAgICAgICAgICAgICAgaWYgKGZkc1tpXS5yZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9XUklUQUJMRTsKKyAgICAgICAgICAgICAgaWYgKGZkc1tpXS5yZXZlbnRzICYgX0RCVVNfUE9MTEhVUCkKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9IQU5HVVA7CisgICAgICAgICAgICAgIGlmIChmZHNbaV0ucmV2ZW50cyAmIF9EQlVTX1BPTExFUlIpCisgICAgICAgICAgICAgICAgY29uZGl0aW9uIHw9IERCVVNfV0FUQ0hfRVJST1I7CisKKyAgICAgICAgICAgICAgLyogY29uZGl0aW9uIG1heSBzdGlsbCBiZSAwIGlmIHdlIGdvdCBzb21lCisgICAgICAgICAgICAgICAqIHdlaXJkIFBPTExGT08gdGhpbmcgbGlrZSBQT0xMV1JCQU5ECisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChjb25kaXRpb24gIT0gMCAmJgorICAgICAgICAgICAgICAgICAgZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAod2NiLT53YXRjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCEoKiB3Y2ItPmZ1bmN0aW9uKSAod2NiLT53YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ2FsbGJhY2sqKXdjYiktPmRhdGEpKQorICAgICAgICAgICAgICAgICAgICB3Y2ItPmxhc3RfaXRlcmF0aW9uX29vbSA9IFRSVUU7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBJbnZva2VkIHdhdGNoLCBvb20gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjYi0+bGFzdF9pdGVyYXRpb25fb29tKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKGZkc1tpXS5yZXZlbnRzICYgX0RCVVNfUE9MTE5WQUwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJpbnZhbGlkIHJlcXVlc3QsIHNvY2tldCBmZCAlZCBub3Qgb3BlblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmZHNbaV0uZmQpOworICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAod2NiLT53YXRjaCk7CisgICAgICAgICAgICAgICAgICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2NiLT53YXRjaCwgd2NiLT5mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAoKENhbGxiYWNrICopd2NiKS0+ZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisgICAgICAKKyBuZXh0X2l0ZXJhdGlvbjoKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCIgIG1vdmluZyB0byBuZXh0IGl0ZXJhdGlvblxuIik7CisjZW5kaWYKKyAgCisgIGlmIChmZHMgJiYgZmRzICE9IHN0YWNrX2ZkcykKKyAgICBkYnVzX2ZyZWUgKGZkcyk7CisgIGlmICh3YXRjaGVzX2Zvcl9mZHMpCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fZmRzKQorICAgICAgICB7CisgICAgICAgICAgY2FsbGJhY2tfdW5yZWYgKCZ3YXRjaGVzX2Zvcl9mZHNbaV0tPmNhbGxiYWNrKTsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHdhdGNoZXNfZm9yX2ZkcyAhPSBzdGFja193YXRjaGVzX2Zvcl9mZHMpCisgICAgICAgIGRidXNfZnJlZSAod2F0Y2hlc19mb3JfZmRzKTsKKyAgICB9CisgIAorICBpZiAoX2RidXNfbG9vcF9kaXNwYXRjaCAobG9vcCkpCisgICAgcmV0dmFsID0gVFJVRTsKKyAgCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiUmV0dXJuaW5nICVkXG4iLCByZXR2YWwpOworI2VuZGlmCisgIAorICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitfZGJ1c19sb29wX3J1biAoREJ1c0xvb3AgKmxvb3ApCit7CisgIGludCBvdXJfZXhpdF9kZXB0aDsKKworICBfZGJ1c19hc3NlcnQgKGxvb3AtPmRlcHRoID49IDApOworICAKKyAgX2RidXNfbG9vcF9yZWYgKGxvb3ApOworICAKKyAgb3VyX2V4aXRfZGVwdGggPSBsb29wLT5kZXB0aDsKKyAgbG9vcC0+ZGVwdGggKz0gMTsKKworICBfZGJ1c192ZXJib3NlICgiUnVubmluZyBtYWluIGxvb3AsIGRlcHRoICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICBsb29wLT5kZXB0aCAtIDEsIGxvb3AtPmRlcHRoKTsKKyAgCisgIHdoaWxlIChsb29wLT5kZXB0aCAhPSBvdXJfZXhpdF9kZXB0aCkKKyAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGxvb3AsIFRSVUUpOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworfQorCit2b2lkCitfZGJ1c19sb29wX3F1aXQgKERCdXNMb29wICpsb29wKQoreworICBfZGJ1c19hc3NlcnQgKGxvb3AtPmRlcHRoID4gMCk7ICAKKyAgCisgIGxvb3AtPmRlcHRoIC09IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIlF1aXQgbWFpbiBsb29wLCBkZXB0aCAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgbG9vcC0+ZGVwdGggKyAxLCBsb29wLT5kZXB0aCk7Cit9CisKK2ludAorX2RidXNfZ2V0X29vbV93YWl0ICh2b2lkKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgLyogbWFrZSB0ZXN0cyBnbyBmYXN0ICovCisgIHJldHVybiAwOworI2Vsc2UKKyAgcmV0dXJuIDUwMDsKKyNlbmRpZgorfQorCit2b2lkCitfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKHZvaWQpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJXYWl0aW5nIGZvciBtb3JlIG1lbW9yeVxuIik7CisgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoX2RidXNfZ2V0X29vbV93YWl0ICgpKTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYWlubG9vcC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1haW5sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZjgyMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYWlubG9vcC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYWlubG9vcC5oICBNYWluIGxvb3AgdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTUFJTkxPT1BfSAorI2RlZmluZSBEQlVTX01BSU5MT09QX0gKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCit0eXBlZGVmIHN0cnVjdCBEQnVzTG9vcCBEQnVzTG9vcDsKKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzV2F0Y2hGdW5jdGlvbikgICAoREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRGdW5jdGlvbikgKERCdXNUaW1lb3V0ICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKTsKKworREJ1c0xvb3AqICAgX2RidXNfbG9vcF9uZXcgICAgICAgICAgICAodm9pZCk7CitEQnVzTG9vcCogICBfZGJ1c19sb29wX3JlZiAgICAgICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xvb3BfdW5yZWYgICAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3ApOworZGJ1c19ib29sX3QgX2RidXNfbG9vcF9hZGRfd2F0Y2ggICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoRnVuY3Rpb24gICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgZnJlZV9kYXRhX2Z1bmMpOwordm9pZCAgICAgICAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoRnVuY3Rpb24gICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgZnJlZV9kYXRhX2Z1bmMpOwordm9pZCAgICAgICAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKmRhdGEpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAqY29ubmVjdGlvbik7CisKK3ZvaWQgICAgICAgIF9kYnVzX2xvb3BfcnVuICAgICAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3ApOwordm9pZCAgICAgICAgX2RidXNfbG9vcF9xdWl0ICAgICAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2l0ZXJhdGUgICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgYmxvY2spOworZGJ1c19ib29sX3QgX2RidXNfbG9vcF9kaXNwYXRjaCAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7CisKK2ludCAgX2RidXNfZ2V0X29vbV93YWl0ICAgICh2b2lkKTsKK3ZvaWQgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICh2b2lkKTsKKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmIC8qIERCVVNfTUFJTkxPT1BfSCAqLworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2JjNzIxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYwpAQCAtMCwwICsxLDE5OTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWJhc2ljLmMgIE1hcnNoYWxsaW5nIHJvdXRpbmVzIGZvciBiYXNpYyAocHJpbWl0aXZlKSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01hcnNoYWwgbWFyc2hhbGluZyBhbmQgdW5tYXJzaGFsaW5nCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIGZ1bmN0aW9ucyB0byBtYXJzaGFsL3VubWFyc2hhbCBkYXRhIGZyb20gdGhlIHdpcmUKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gY29udmVydGluZyBwcmltaXRpdmUgZGF0YSB0eXBlcyBmcm9tCisgKiB3aXJlIGZvcm1hdCB0byBuYXRpdmUgbWFjaGluZSBmb3JtYXQsIGFuZCB2aWNlIHZlcnNhLgorICoKKyAqIEEgc2lnbmF0dXJlIGlzIGp1c3QgYSBzdHJpbmcgd2l0aCBtdWx0aXBsZSB0eXBlcyBvbmUgYWZ0ZXIgdGhlIG90aGVyLgorICogZm9yIGV4YW1wbGUgYSB0eXBlIGlzICJpIiBvciAiKGlpKSIsIGEgc2lnbmF0dXJlIGlzICJpKGlpKSIKKyAqIHdoZXJlIGkgaXMgaW50IGFuZCAoaWkpIGlzIHN0cnVjdCB7IGludDsgaW50OyB9CisgKgorICogQHsKKyAqLworCitzdGF0aWMgdm9pZAorcGFja18yX29jdGV0cyAoZGJ1c191aW50MTZfdCAgIHZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqZGF0YSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCAyKSA9PSBkYXRhKTsKKworICBpZiAoKGJ5dGVfb3JkZXIpID09IERCVVNfTElUVExFX0VORElBTikKKyAgICAqKChkYnVzX3VpbnQxNl90KikoZGF0YSkpID0gREJVU19VSU5UMTZfVE9fTEUgKHZhbHVlKTsKKyAgZWxzZQorICAgICooKGRidXNfdWludDE2X3QqKShkYXRhKSkgPSBEQlVTX1VJTlQxNl9UT19CRSAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorcGFja180X29jdGV0cyAoZGJ1c191aW50MzJfdCAgIHZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqZGF0YSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCA0KSA9PSBkYXRhKTsKKworICBpZiAoKGJ5dGVfb3JkZXIpID09IERCVVNfTElUVExFX0VORElBTikKKyAgICAqKChkYnVzX3VpbnQzMl90KikoZGF0YSkpID0gREJVU19VSU5UMzJfVE9fTEUgKHZhbHVlKTsKKyAgZWxzZQorICAgICooKGRidXNfdWludDMyX3QqKShkYXRhKSkgPSBEQlVTX1VJTlQzMl9UT19CRSAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorcGFja184X29jdGV0cyAoREJ1c0Jhc2ljVmFsdWUgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAqZGF0YSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCA4KSA9PSBkYXRhKTsKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBpZiAoKGJ5dGVfb3JkZXIpID09IERCVVNfTElUVExFX0VORElBTikKKyAgICAqKChkYnVzX3VpbnQ2NF90KikoZGF0YSkpID0gREJVU19VSU5UNjRfVE9fTEUgKHZhbHVlLnU2NCk7CisgIGVsc2UKKyAgICAqKChkYnVzX3VpbnQ2NF90KikoZGF0YSkpID0gREJVU19VSU5UNjRfVE9fQkUgKHZhbHVlLnU2NCk7CisjZWxzZQorICAqKERCdXM4Qnl0ZVN0cnVjdCopZGF0YSA9IHZhbHVlLnU2NDsKKyAgc3dhcF84X29jdGV0cyAoKERCdXNCYXNpY1ZhbHVlKilkYXRhLCBieXRlX29yZGVyKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFBhY2tzIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIgaW50byBhIGRhdGEgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIKKyAqLwordm9pZAorX2RidXNfcGFja191aW50MzIgKGRidXNfdWludDMyX3QgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqZGF0YSkKK3sKKyAgcGFja180X29jdGV0cyAodmFsdWUsIGJ5dGVfb3JkZXIsIGRhdGEpOworfQorCisjaWZuZGVmIERCVVNfSEFWRV9JTlQ2NAorLyogZnJvbSBPUkJpdCAqLworc3RhdGljIHZvaWQKK3N3YXBfYnl0ZXMgKHVuc2lnbmVkIGNoYXIgKmRhdGEsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBsZW4pCit7CisgIHVuc2lnbmVkIGNoYXIgKnAxID0gZGF0YTsKKyAgdW5zaWduZWQgY2hhciAqcDIgPSBkYXRhICsgbGVuIC0gMTsKKworICB3aGlsZSAocDEgPCBwMikKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHRtcCA9ICpwMTsKKyAgICAgICpwMSA9ICpwMjsKKyAgICAgICpwMiA9IHRtcDsKKworICAgICAgLS1wMjsKKyAgICAgICsrcDE7CisgICAgfQorfQorI2VuZGlmIC8qICFEQlVTX0hBVkVfSU5UNjQgKi8KKworc3RhdGljIHZvaWQKK3N3YXBfOF9vY3RldHMgKERCdXNCYXNpY1ZhbHVlICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyKQoreworICBpZiAoYnl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgeworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAgICAgdmFsdWUtPnU2NCA9IERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKHZhbHVlLT51NjQpOworI2Vsc2UKKyAgICAgIHN3YXBfYnl0ZXMgKCh1bnNpZ25lZCBjaGFyICopdmFsdWUsIDgpOworI2VuZGlmCisgICAgfQorfQorCisjaWYgMAorc3RhdGljIERCdXNCYXNpY1ZhbHVlCit1bnBhY2tfOF9vY3RldHMgKGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgIERCdXNCYXNpY1ZhbHVlIHI7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCA4KSA9PSBkYXRhKTsKKyAgX2RidXNfYXNzZXJ0IChzaXplb2YgKHIpID09IDgpOworCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIGlmIChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTikKKyAgICByLnU2NCA9IERCVVNfVUlOVDY0X0ZST01fTEUgKCooZGJ1c191aW50NjRfdCopZGF0YSk7CisgIGVsc2UKKyAgICByLnU2NCA9IERCVVNfVUlOVDY0X0ZST01fQkUgKCooZGJ1c191aW50NjRfdCopZGF0YSk7CisjZWxzZQorICByLnU2NCA9ICooREJ1czhCeXRlU3RydWN0KilkYXRhOworICBzd2FwXzhfb2N0ZXRzICgmciwgYnl0ZV9vcmRlcik7CisjZW5kaWYKKworICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MTYKKy8qKgorICogVW5wYWNrcyBhIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBkYXRhIHBvaW50ZXIKKyAqCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBUaGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIKKyAqIEByZXR1cm5zIHRoZSBpbnRlZ2VyCisgKi8KK2RidXNfdWludDE2X3QKK19kYnVzX3VucGFja191aW50MTYgKGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDIpID09IGRhdGEpOworCisgIGlmIChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTikKKyAgICByZXR1cm4gREJVU19VSU5UMTZfRlJPTV9MRSAoKihkYnVzX3VpbnQxNl90KilkYXRhKTsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX1VJTlQxNl9GUk9NX0JFICgqKGRidXNfdWludDE2X3QqKWRhdGEpOworfQorI2VuZGlmIC8qIF9kYnVzX3VucGFja191aW50MTYgKi8KKworI2lmbmRlZiBfZGJ1c191bnBhY2tfdWludDMyCisvKioKKyAqIFVucGFja3MgYSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgZGF0YSBwb2ludGVyCisgKgorICogQHBhcmFtIGJ5dGVfb3JkZXIgVGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBwb2ludGVyCisgKiBAcmV0dXJucyB0aGUgaW50ZWdlcgorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c191bnBhY2tfdWludDMyIChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCA0KSA9PSBkYXRhKTsKKworICBpZiAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgcmV0dXJuIERCVVNfVUlOVDMyX0ZST01fTEUgKCooZGJ1c191aW50MzJfdCopZGF0YSk7CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19VSU5UMzJfRlJPTV9CRSAoKihkYnVzX3VpbnQzMl90KilkYXRhKTsKK30KKyNlbmRpZiAvKiBfZGJ1c191bnBhY2tfdWludDMyICovCisKK3N0YXRpYyB2b2lkCitzZXRfMl9vY3RldHMgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICBkYnVzX3VpbnQxNl90ICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcikKK3sKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8CisgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciA9PSBEQlVTX0JJR19FTkRJQU4pOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9mZnNldCwgMik7CisKKyAgcGFja18yX29jdGV0cyAodmFsdWUsIGJ5dGVfb3JkZXIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorc2V0XzRfb2N0ZXRzIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIGNoYXIgKmRhdGE7CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTiB8fAorICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoc3RyLCBvZmZzZXQsIDQpOworCisgIHBhY2tfNF9vY3RldHMgKHZhbHVlLCBieXRlX29yZGVyLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3NldF84X29jdGV0cyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgIERCdXNCYXNpY1ZhbHVlICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyKQoreworICBjaGFyICpkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb2Zmc2V0LCA4KTsKKworICBwYWNrXzhfb2N0ZXRzICh2YWx1ZSwgYnl0ZV9vcmRlciwgZGF0YSk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgNCBieXRlcyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGEgbWFyc2hhbGVkIHVuc2lnbmVkCisgKiBpbnRlZ2VyLCByZXBsYWNpbmcgYW55dGhpbmcgZm91bmQgdGhlcmUgcHJldmlvdXNseS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdGhlIG1hcnNoYWxsZWQgaW50IHRvCisgKiBAcGFyYW0gcG9zIHRoZSBieXRlIG9mZnNldCB3aGVyZSBpbnQgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIHVzZQorICoKKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIHNldF80X29jdGV0cyAoc3RyLCBwb3MsIHZhbHVlLCBieXRlX29yZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBleGlzdGluZyBtYXJzaGFsZWQgc3RyaW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQgd2l0aAorICogYSBuZXcgbWFyc2hhbGVkIHN0cmluZy4gVGhlIGdpdmVuIG9mZnNldCBtdXN0IHBvaW50IHRvCisgKiBhbiBleGlzdGluZyBzdHJpbmcgb3IgdGhlIHdyb25nIGxlbmd0aCB3aWxsIGJlIGRlbGV0ZWQKKyAqIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgc3RyaW5nLgorICoKKyAqIE5vdGU6IG5vIGF0dGVtcHQgaXMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHRvIHJlLWFsaWduCisgKiBhbnkgZGF0YSB3aGljaCBoYXMgYmVlbiBhbHJlYWR5IG1hcnNoYWxsZWQgYWZ0ZXIgdGhpcworICogc3RyaW5nLiBVc2Ugd2l0aCBjYXV0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSB0aGUgbWFyc2hhbGxlZCBzdHJpbmcgdG8KKyAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXJzaGFsZWQgc3RyaW5nIGxlbmd0aAorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gb2xkX2VuZF9wb3MgcGxhY2UgdG8gc3RvcmUgYnl0ZSBhZnRlciB0aGUgbnVsIGJ5dGUgb2YgdGhlIG9sZCB2YWx1ZQorICogQHBhcmFtIG5ld19lbmRfcG9zIHBsYWNlIHRvIHN0b3JlIGJ5dGUgYWZ0ZXIgdGhlIG51bCBieXRlIG9mIHRoZSBuZXcgdmFsdWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X3N0cmluZyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqb2xkX2VuZF9wb3MsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpuZXdfZW5kX3BvcykKK3sKKyAgaW50IG9sZF9sZW4sIG5ld19sZW47CisgIERCdXNTdHJpbmcgZHN0cjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRzdHIsIHZhbHVlKTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpID09ICh1bnNpZ25lZCkgcG9zKTsKKyAgb2xkX2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHBvcywgNCkpOworCisgIG5ld19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmZHN0ciwgMCwgbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgcG9zICsgNCwgb2xkX2xlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoc3RyLCBwb3MsIG5ld19sZW4sIGJ5dGVfb3JkZXIpOworCisgIGlmIChvbGRfZW5kX3BvcykKKyAgICAqb2xkX2VuZF9wb3MgPSBwb3MgKyA0ICsgb2xkX2xlbiArIDE7CisgIGlmIChuZXdfZW5kX3BvcykKKyAgICAqbmV3X2VuZF9wb3MgPSBwb3MgKyA0ICsgbmV3X2xlbiArIDE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZXhpc3RpbmcgbWFyc2hhbGVkIHNpZ25hdHVyZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGEgbmV3CisgKiBtYXJzaGFsZWQgc2lnbmF0dXJlLiBTYW1lIGJhc2ljIGlkZWFzIGFzIHNldF9zdHJpbmcoKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdGhlIG1hcnNoYWxsZWQgc2lnbmF0dXJlIHRvCisgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFyc2hhbGVkIHNpZ25hdHVyZSBsZW5ndGgKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIHVzZQorICogQHBhcmFtIG9sZF9lbmRfcG9zIHBsYWNlIHRvIHN0b3JlIGJ5dGUgYWZ0ZXIgdGhlIG51bCBieXRlIG9mIHRoZSBvbGQgdmFsdWUKKyAqIEBwYXJhbSBuZXdfZW5kX3BvcyBwbGFjZSB0byBzdG9yZSBieXRlIGFmdGVyIHRoZSBudWwgYnl0ZSBvZiB0aGUgbmV3IHZhbHVlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9zaWduYXR1cmUgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqbmV3X2VuZF9wb3MpCit7CisgIGludCBvbGRfbGVuLCBuZXdfbGVuOworICBEQnVzU3RyaW5nIGRzdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZkc3RyLCB2YWx1ZSk7CisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpOworICBuZXdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJmRzdHIsIDAsIG5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHBvcyArIDEsIG9sZF9sZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgcG9zLCBuZXdfbGVuKTsKKworICBpZiAob2xkX2VuZF9wb3MpCisgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMSArIG9sZF9sZW4gKyAxOworICBpZiAobmV3X2VuZF9wb3MpCisgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMSArIG5ld19sZW4gKyAxOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgYW4gZXhpc3RpbmcgYmFzaWMgdHlwZSB2YWx1ZSB0byBhIG5ldyB2YWx1ZS4KKyAqIEFyZ3VtZW50cyB3b3JrIHRoZSBzYW1lIHdheSBhcyBfZGJ1c19tYXJzaGFsX2Jhc2ljX3R5cGUoKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBwb3MgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdmFsdWUKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGFuZCBuZXcgdmFsdWVzCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgYnl0ZSBvcmRlciBmb3IgbWFyc2hhbGluZworICogQHBhcmFtIG9sZF9lbmRfcG9zIGxvY2F0aW9uIHRvIHN0b3JlIGVuZCBwb3NpdGlvbiBvZiB0aGUgb2xkIHZhbHVlLCBvciAjTlVMTAorICogQHBhcmFtIG5ld19lbmRfcG9zIGxvY2F0aW9uIHRvIHN0b3JlIGVuZCBwb3NpdGlvbiBvZiB0aGUgbmV3IHZhbHVlLCBvciAjTlVMTAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19lbmRfcG9zKQoreworICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqdnA7CisKKyAgdnAgPSB2YWx1ZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgcG9zLCB2cC0+Ynl0KTsKKyAgICAgIGlmIChvbGRfZW5kX3BvcykKKyAgICAgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMTsKKyAgICAgIGlmIChuZXdfZW5kX3BvcykKKyAgICAgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgMik7CisgICAgICBzZXRfMl9vY3RldHMgKHN0ciwgcG9zLCB2cC0+dTE2LCBieXRlX29yZGVyKTsKKyAgICAgIGlmIChvbGRfZW5kX3BvcykKKyAgICAgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgMjsKKyAgICAgIGlmIChuZXdfZW5kX3BvcykKKyAgICAgICAgKm5ld19lbmRfcG9zID0gcG9zICsgMjsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgc2V0XzRfb2N0ZXRzIChzdHIsIHBvcywgdnAtPnUzMiwgYnl0ZV9vcmRlcik7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDQ7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCA4KTsKKyAgICAgIHNldF84X29jdGV0cyAoc3RyLCBwb3MsICp2cCwgYnl0ZV9vcmRlcik7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDg7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDg7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIHNldF9zdHJpbmcgKHN0ciwgcG9zLCB2cC0+c3RyLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9lbmRfcG9zLCBuZXdfZW5kX3Bvcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICBfZGJ1c19hc3NlcnQgKHZwLT5zdHIgIT0gTlVMTCk7CisgICAgICByZXR1cm4gc2V0X3NpZ25hdHVyZSAoc3RyLCBwb3MsIHZwLT5zdHIsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2VuZF9wb3MsIG5ld19lbmRfcG9zKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZGVtYXJzaGFsIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nCisgKiBAcGFyYW0gbmV3X3BvcyB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBzdHJpbmcKKyAqIEByZXR1cm5zIHRoZSBkZW1hcnNoYWxlZCBpbnRlZ2VyLgorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworCisgIGlmIChuZXdfcG9zKQorICAgICpuZXdfcG9zID0gcG9zICsgNDsKKworICBfZGJ1c19hc3NlcnQgKHBvcyArIDQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICAKKyAgcmV0dXJuIF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cikgKyBwb3MpOworfQorCisvKioKKyAqIERlbWFyc2hhbHMgYSBiYXNpYy10eXBlZCB2YWx1ZS4gVGhlICJ2YWx1ZSIgcG9pbnRlciBpcyBhbHdheXMKKyAqIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgb2YgdGhlIGJhc2ljIHR5cGUuIFNvIGUuZy4KKyAqIGlmIHRoZSBiYXNpYyB0eXBlIGlzICJkb3VibGUiIHRoZW4gdGhlIHBvaW50ZXIgaXMKKyAqIGEgZG91YmxlKiwgYW5kIGlmIGl0J3MgImNoYXIqIiB0aGVuIHRoZSBwb2ludGVyIGlzCisgKiBhICJjaGFyKioiLgorICoKKyAqIEEgdmFsdWUgb2YgdHlwZSAjREJ1c0Jhc2ljVmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBsYXJnZSBlbm91Z2ggdG8KKyAqIGhvbGQgYW55IG9mIHRoZSB0eXBlcyB0aGF0IG1heSBiZSByZXR1cm5lZCwgd2hpY2ggaXMgaGFuZHkgaWYgeW91CisgKiBhcmUgdHJ5aW5nIHRvIGRvIHRoaW5ncyBnZW5lcmljYWxseS4gRm9yIGV4YW1wbGUgeW91IGNhbiBwYXNzCisgKiBhIERCdXNCYXNpY1ZhbHVlKiBpbiB0byB0aGlzIGZ1bmN0aW9uLCBhbmQgdGhlbiBwYXNzIHRoZSBzYW1lCisgKiBEQnVzQmFzaWNWYWx1ZSogaW4gdG8gX2RidXNfbWFyc2hhbF9iYXNpY190eXBlKCkgaW4gb3JkZXIgdG8KKyAqIG1vdmUgYSB2YWx1ZSBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gcG9zIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdmFsdWUgdG8gZGVtYXJzaGFsCisgKiBAcGFyYW0gdmFsdWUgcG9pbnRlciB0byByZXR1cm4gdmFsdWUgZGF0YQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBuZXdfcG9zIHBvaW50ZXIgdG8gdXBkYXRlIHdpdGggbmV3IHBvc2l0aW9uLCBvciAjTlVMTAorICoqLwordm9pZAorX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljIChjb25zdCBEQnVzU3RyaW5nICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIGNvbnN0IGNoYXIgKnN0cl9kYXRhOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSk7CisKKyAgc3RyX2RhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgLyogQmVsb3cgd2Ugdm9sYXRpbGUgdHlwZXMgdG8gYXZvaWQgYWxpYXNpbmcgaXNzdWVzOworICAgKiBzZWUgaHR0cDovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDEzNworICAgKi8KKyAgCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgIHsKKyAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnZwID0gdmFsdWU7CisgICAgICAqdnAgPSAodW5zaWduZWQgY2hhcikgX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcyk7CisgICAgICAocG9zKSsrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50MTZfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDIpOworICAgICAgKnZwID0gKihkYnVzX3VpbnQxNl90ICopKHN0cl9kYXRhICsgcG9zKTsKKyAgICAgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKwkqdnAgPSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICgqdnApOworICAgICAgcG9zICs9IDI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50MzJfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpOworICAgICAgKnZwID0gKihkYnVzX3VpbnQzMl90ICopKHN0cl9kYXRhICsgcG9zKTsKKyAgICAgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKwkqdnAgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqdnApOworICAgICAgcG9zICs9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgeworICAgICAgdm9sYXRpbGUgZGJ1c191aW50NjRfdCAqdnAgPSB2YWx1ZTsKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDgpOworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAgICAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgICAgICAqdnAgPSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICgqKGRidXNfdWludDY0X3QqKShzdHJfZGF0YSArIHBvcykpOworICAgICAgZWxzZQorICAgICAgICAqdnAgPSAqKGRidXNfdWludDY0X3QqKShzdHJfZGF0YSArIHBvcyk7CisjZWxzZQorICAgICAgKnZwID0gKihEQnVzOEJ5dGVTdHJ1Y3QqKSAoc3RyX2RhdGEgKyBwb3MpOworICAgICAgc3dhcF84X29jdGV0cyAodnAsIGJ5dGVfb3JkZXIpOworI2VuZGlmCisgICAgICBwb3MgKz0gODsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgdm9sYXRpbGUgY2hhciAqKnZwID0gdmFsdWU7CisKKyAgICAgICAgbGVuID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBwb3MsIGJ5dGVfb3JkZXIsICZwb3MpOworCisgICAgICAgICp2cCA9IChjaGFyKikgc3RyX2RhdGEgKyBwb3M7CisKKyAgICAgICAgcG9zICs9IGxlbiArIDE7IC8qIGxlbmd0aCBwbHVzIG51bCAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICB2b2xhdGlsZSBjaGFyICoqdnAgPSB2YWx1ZTsKKworICAgICAgICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKTsKKyAgICAgICAgcG9zICs9IDE7CisKKyAgICAgICAgKnZwID0gKGNoYXIqKSBzdHJfZGF0YSArIHBvczsKKworICAgICAgICBwb3MgKz0gbGVuICsgMTsgLyogbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJ0eXBlICVzICVkIG5vdCBhIGJhc2ljIHR5cGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpLCB0eXBlKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vdCBhIGJhc2ljIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAobmV3X3BvcykKKyAgICAqbmV3X3BvcyA9IHBvczsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzJfb2N0ZXRzIChEQnVzU3RyaW5nICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgZGJ1c191aW50MTZfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAodmFsdWUpID09IDIpOworCisgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKyAgICB2YWx1ZSA9IERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKHZhbHVlKTsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIHJldHZhbCA9IF9kYnVzX3N0cmluZ19pbnNlcnRfMl9hbGlnbmVkIChzdHIsIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopJnZhbHVlKTsKKworICBpZiAocG9zX2FmdGVyKQorICAgIHsKKyAgICAgICpwb3NfYWZ0ZXIgPSBpbnNlcnRfYXQgKyAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvcmlnX2xlbik7CisgICAgICBfZGJ1c19hc3NlcnQgKCpwb3NfYWZ0ZXIgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hcnNoYWxfNF9vY3RldHMgKERCdXNTdHJpbmcgICAqc3RyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IG9yaWdfbGVuOworCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mICh2YWx1ZSkgPT0gNCk7CisKKyAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgIHZhbHVlID0gREJVU19VSU5UMzJfU1dBUF9MRV9CRSAodmFsdWUpOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgcmV0dmFsID0gX2RidXNfc3RyaW5nX2luc2VydF80X2FsaWduZWQgKHN0ciwgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikmdmFsdWUpOworCisgIGlmIChwb3NfYWZ0ZXIpCisgICAgeworICAgICAgKnBvc19hZnRlciA9IGluc2VydF9hdCArIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIG9yaWdfbGVuKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKnBvc19hZnRlciA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF84X29jdGV0cyAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgdmFsdWUsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAodmFsdWUpID09IDgpOworCisgIHN3YXBfOF9vY3RldHMgKCZ2YWx1ZSwgYnl0ZV9vcmRlcik7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvcmlnX2xlbjsKKworICByZXR1cm4gcmV0dmFsOworfQorCitlbnVtCisgIHsKKyAgICBNQVJTSEFMX0FTX1NUUklORywKKyAgICBNQVJTSEFMX0FTX1NJR05BVFVSRSwKKyAgICBNQVJTSEFMX0FTX0JZVEVfQVJSQVkKKyAgfTsKKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoaW50ICAgICAgICAgICAgICAgICAgbWFyc2hhbF9hcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGRhdGFfbGVuLCAvKiBkb2Vzbid0IGluY2x1ZGUgbnVsIGlmIGFueSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBpbnQgcG9zOworICBEQnVzU3RyaW5nIHZhbHVlX3N0cjsKKyAgaW50IHZhbHVlX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8IGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKyAgaWYgKGluc2VydF9hdCA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKQorICAgIF9kYnVzX3dhcm4gKCJpbnNlcnRfYXQgPSAlZCBzdHJpbmcgbGVuID0gJWQgZGF0YV9sZW4gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICBpbnNlcnRfYXQsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpLCBkYXRhX2xlbik7CisgIAorICBpZiAobWFyc2hhbF9hcyA9PSBNQVJTSEFMX0FTX0JZVEVfQVJSQVkpCisgICAgdmFsdWVfbGVuID0gZGF0YV9sZW47CisgIGVsc2UKKyAgICB2YWx1ZV9sZW4gPSBkYXRhX2xlbiArIDE7IC8qIHZhbHVlIGhhcyBhIG51bCAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnZhbHVlX3N0ciwgdmFsdWUsIHZhbHVlX2xlbik7CisKKyAgcG9zID0gaW5zZXJ0X2F0OworCisgIGlmIChtYXJzaGFsX2FzID09IE1BUlNIQUxfQVNfU0lHTkFUVVJFKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YV9sZW4gPD0gREJVU19NQVhJTVVNX1NJR05BVFVSRV9MRU5HVEgpOworICAgICAgX2RidXNfYXNzZXJ0IChkYXRhX2xlbiA8PSAyNTUpOyAvKiBzYW1lIGFzIG1heCBzaWcgbGVuIHJpZ2h0IG5vdyAqLworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3RyLCBwb3MsIGRhdGFfbGVuKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIHBvcyArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghbWFyc2hhbF80X29jdGV0cyAoc3RyLCBwb3MsIGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCAmcG9zKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmdmFsdWVfc3RyLCAwLCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHBvcykpCisgICAgZ290byBvb207CisKKyNpZiAwCisgIC8qIHRvbyBleHBlbnNpdmUgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmdmFsdWVfc3RyLCAwLCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MpKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKHN0ciwgcG9zLCB2YWx1ZV9sZW4pOworI2VuZGlmCisKKyAgcG9zICs9IHZhbHVlX2xlbjsKKworICBpZiAocG9zX2FmdGVyKQorICAgICpwb3NfYWZ0ZXIgPSBwb3M7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIC8qIERlbGV0ZSB3aGF0IHdlJ3ZlIGluc2VydGVkICovCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHN0ciwgaW5zZXJ0X2F0LCBwb3MgLSBpbnNlcnRfYXQpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX3N0cmluZyAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgcmV0dXJuIG1hcnNoYWxfbGVuX2ZvbGxvd2VkX2J5X2J5dGVzIChNQVJTSEFMX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGluc2VydF9hdCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgcG9zX2FmdGVyKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX3NpZ25hdHVyZSAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIHJldHVybiBtYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoTUFSU0hBTF9BU19TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBpbnNlcnRfYXQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ09NUElMRVJfQllURV9PUkRFUiwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19hZnRlcik7Cit9CisKKy8qKgorICogTWFyc2hhbHMgYSBiYXNpYy10eXBlZCB2YWx1ZS4gVGhlICJ2YWx1ZSIgcG9pbnRlciBpcyBhbHdheXMgdGhlCisgKiBhZGRyZXNzIG9mIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgYmFzaWMgdHlwZSB2YWx1ZS4KKyAqIFNvIGZvciBleGFtcGxlIGZvciBpbnQzMiBpdCB3aWxsIGJlIGRidXNfaW50MzJfdCosIGFuZAorICogZm9yIHN0cmluZyBpdCB3aWxsIGJlIGNvbnN0IGNoYXIqKi4gVGhpcyBpcyBmb3Igc3ltbWV0cnkKKyAqIHdpdGggX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljKCkgYW5kIHRvIGhhdmUgYSBzaW1wbGUKKyAqIGNvbnNpc3RlbnQgcnVsZS4KKyAqCisgKiBAcGFyYW0gc3RyIHN0cmluZyB0byBtYXJzaGFsIHRvCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydCB0aGUgdmFsdWUKKyAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludGVyIHRvIGEgdmFyaWFibGUgY29udGFpbmluZyB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3NfYWZ0ZXIgI05VTEwgb3IgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0eXBlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZwOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSk7CisKKyAgdnAgPSB2YWx1ZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoc3RyLCBpbnNlcnRfYXQsIHZwLT5ieXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAocG9zX2FmdGVyKQorICAgICAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIG1hcnNoYWxfMl9vY3RldHMgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+dTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgcmV0dXJuIG1hcnNoYWxfNF9vY3RldHMgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+dTMyICE9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBtYXJzaGFsXzRfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgdnAtPnUzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBtYXJzaGFsXzhfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgKnZwLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICBfZGJ1c19hc3NlcnQgKHZwLT5zdHIgIT0gTlVMTCk7CisgICAgICByZXR1cm4gbWFyc2hhbF9zdHJpbmcgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+c3RyLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIG1hcnNoYWxfc2lnbmF0dXJlIChzdHIsIGluc2VydF9hdCwgdnAtPnN0ciwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF8xX29jdGV0c19hcnJheSAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgaW50IHBvczsKKyAgREJ1c1N0cmluZyB2YWx1ZV9zdHI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmdmFsdWVfc3RyLCB2YWx1ZSwgbl9lbGVtZW50cyk7CisKKyAgcG9zID0gaW5zZXJ0X2F0OworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmdmFsdWVfc3RyLCAwLCBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MpKQorICAgIHJldHVybiBGQUxTRTsKKworICBwb3MgKz0gbl9lbGVtZW50czsKKworICBpZiAocG9zX2FmdGVyKQorICAgICpwb3NfYWZ0ZXIgPSBwb3M7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU3dhcHMgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIHRoZSBvcHBvc2l0ZSBieXRlIG9yZGVyCisgKgorICogQHBhcmFtIGRhdGEgc3RhcnQgb2YgYXJyYXkKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cworICogQHBhcmFtIGFsaWdubWVudCBzaXplIG9mIGVhY2ggZWxlbWVudAorICovCit2b2lkCitfZGJ1c19zd2FwX2FycmF5ICh1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGFsaWdubWVudCkKK3sKKyAgdW5zaWduZWQgY2hhciAqZDsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgYWxpZ25tZW50KSA9PSBkYXRhKTsKKworICAvKiB3ZSB1c2UgY29uc3RfZGF0YSBhbmQgY2FzdCBpdCBvZmYgc28gREJ1c1N0cmluZyBjYW4gYmUgYSBjb25zdCBzdHJpbmcKKyAgICogZm9yIHRoZSB1bml0IHRlc3RzLiBkb24ndCBhc2suCisgICAqLworICBkID0gZGF0YTsKKyAgZW5kID0gZCArIChuX2VsZW1lbnRzICogYWxpZ25tZW50KTsKKyAgCisgIGlmIChhbGlnbm1lbnQgPT0gOCkKKyAgICB7CisgICAgICB3aGlsZSAoZCAhPSBlbmQpCisgICAgICAgIHsKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgICAgICAgICAqKChkYnVzX3VpbnQ2NF90KilkKSA9IERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKCooKGRidXNfdWludDY0X3QqKWQpKTsKKyNlbHNlCisgICAgICAgICAgc3dhcF84X2J5dGVzICgoREJ1c0Jhc2ljVmFsdWUqKSBkKTsKKyNlbmRpZgorICAgICAgICAgIGQgKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoYWxpZ25tZW50ID09IDQpCisgICAgeworICAgICAgd2hpbGUgKGQgIT0gZW5kKQorICAgICAgICB7CisgICAgICAgICAgKigoZGJ1c191aW50MzJfdCopZCkgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQzMl90KilkKSk7CisgICAgICAgICAgZCArPSA0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChhbGlnbm1lbnQgPT0gMik7CisgICAgICAKKyAgICAgIHdoaWxlIChkICE9IGVuZCkKKyAgICAgICAgeworICAgICAgICAgICooKGRidXNfdWludDE2X3QqKWQpID0gREJVU19VSU5UMTZfU1dBUF9MRV9CRSAoKigoZGJ1c191aW50MTZfdCopZCkpOworICAgICAgICAgIGQgKz0gMjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3N3YXBfYXJyYXkgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgIGludCAgICAgICAgIGFycmF5X3N0YXJ0LAorICAgICAgICAgICAgaW50ICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgIGludCAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICBpbnQgICAgICAgICBhbGlnbm1lbnQpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKGFycmF5X3N0YXJ0LCBhbGlnbm1lbnQpID09ICh1bnNpZ25lZCkgYXJyYXlfc3RhcnQpOworCisgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKyAgICB7CisgICAgICAvKiB3ZSB1c2UgY29uc3RfZGF0YSBhbmQgY2FzdCBpdCBvZmYgc28gREJ1c1N0cmluZyBjYW4gYmUgYSBjb25zdCBzdHJpbmcKKyAgICAgICAqIGZvciB0aGUgdW5pdCB0ZXN0cy4gZG9uJ3QgYXNrLgorICAgICAgICovCisgICAgICBfZGJ1c19zd2FwX2FycmF5ICgodW5zaWduZWQgY2hhciopIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cikgKyBhcnJheV9zdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLCBhbGlnbm1lbnQpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX2ZpeGVkX211bHRpIChEQnVzU3RyaW5nICAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNCYXNpY1ZhbHVlICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgaW50IG9sZF9zdHJpbmdfbGVuOworICBpbnQgYXJyYXlfc3RhcnQ7CisgIERCdXNTdHJpbmcgdDsKKyAgaW50IGxlbl9pbl9ieXRlczsKKworICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHMgPD0gREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAvIGFsaWdubWVudCk7CisgIAorICBvbGRfc3RyaW5nX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGxlbl9pbl9ieXRlcyA9IG5fZWxlbWVudHMgKiBhbGlnbm1lbnQ7CisgIGFycmF5X3N0YXJ0ID0gaW5zZXJ0X2F0OworICAKKyAgLyogTm90ZSB0aGF0IHdlIGRvIGFsaWdubWVudCBwYWRkaW5nIHVuY29uZGl0aW9uYWxseQorICAgKiBldmVuIGlmIHRoZSBhcnJheSBpcyBlbXB0eTsgdGhpcyBtZWFucyB0aGF0CisgICAqIHBhZGRpbmcgKyBsZW4gaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICogaW4gdGhlIGFycmF5LgorICAgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYWxpZ25tZW50IChzdHIsICZhcnJheV9zdGFydCwgYWxpZ25tZW50KSkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5faW5fYnl0ZXMpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGFycmF5X3N0YXJ0KSkKKyAgICBnb3RvIGVycm9yOworCisgIHN3YXBfYXJyYXkgKHN0ciwgYXJyYXlfc3RhcnQsIG5fZWxlbWVudHMsIGJ5dGVfb3JkZXIsIGFsaWdubWVudCk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gYXJyYXlfc3RhcnQgKyBsZW5faW5fYnl0ZXM7CisgIAorICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvbGRfc3RyaW5nX2xlbik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIE1hcnNoYWxzIGEgYmxvY2sgb2YgdmFsdWVzIG9mIGZpeGVkLWxlbmd0aCB0eXBlIGFsbCBhdCBvbmNlLCBhcyBhbgorICogb3B0aW1pemF0aW9uLiAgZGJ1c190eXBlX2lzX2ZpeGVkKCkgcmV0dXJucyAjVFJVRSBmb3IgZml4ZWQtbGVuZ3RoCisgKiB0eXBlcywgd2hpY2ggYXJlIHRoZSBiYXNpYyB0eXBlcyBtaW51cyB0aGUgc3RyaW5nLWxpa2UgdHlwZXMuCisgKgorICogVGhlIHZhbHVlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkZHJlc3Mgb2YgYW4KKyAqIGFycmF5LCBzbyBlLmcuICJjb25zdCBkYnVzX3VpbnQzMl90KioiCisgKgorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gbWFyc2hhbCB0bworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBpbnNlcnQgdGhlIHZhbHVlCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHR5cGUgb2YgYXJyYXkgZWxlbWVudHMKKyAqIEBwYXJhbSB2YWx1ZSBhZGRyZXNzIG9mIGFuIGFycmF5IHRvIG1hcnNoYWwKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3NfYWZ0ZXIgI05VTEwgb3IgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0eXBlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF93cml0ZV9maXhlZF9tdWx0aSAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgY29uc3Qgdm9pZCogdnAgPSAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopdmFsdWU7CisgIAorICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSk7CisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA+PSAwKTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgJWQgZWxlbWVudHMgb2YgJXNcbiIsCisgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMsIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpKTsKKyNlbmRpZgorICAKKyAgc3dpdGNoIChlbGVtZW50X3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICByZXR1cm4gbWFyc2hhbF8xX29jdGV0c19hcnJheSAoc3RyLCBpbnNlcnRfYXQsIHZwLCBuX2VsZW1lbnRzLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIG1hcnNoYWxfZml4ZWRfbXVsdGkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgMiwgcG9zX2FmdGVyKTsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuIG1hcnNoYWxfZml4ZWRfbXVsdGkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgNCwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gbWFyc2hhbF9maXhlZF9tdWx0aSAoc3RyLCBpbnNlcnRfYXQsIHZwLCBuX2VsZW1lbnRzLCBieXRlX29yZGVyLCA4LCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm9uIGZpeGVkIHR5cGUgaW4gYXJyYXkgd3JpdGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBTa2lwcyBvdmVyIGEgYmFzaWMtdHlwZWQgdmFsdWUsIHJlcG9ydGluZyB0aGUgZm9sbG93aW5nIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHZhbHVlIHRvIHJlYWQKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zIHBvaW50ZXIgdG8gcG9zaXRpb24gaW4gdGhlIHN0cmluZywKKyAqICAgICAgICAgICAgdXBkYXRlZCBvbiByZXR1cm4gdG8gbmV3IHBvc2l0aW9uCisgKiovCit2b2lkCitfZGJ1c19tYXJzaGFsX3NraXBfYmFzaWMgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpwb3MpCit7CisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisgIAorICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICAoKnBvcykrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICpwb3MgPSBfREJVU19BTElHTl9WQUxVRSAoKnBvcywgMik7CisgICAgICAqcG9zICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgKnBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFICgqcG9zLCA0KTsKKyAgICAgICpwb3MgKz0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAqcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKCpwb3MsIDgpOworICAgICAgKnBvcyArPSA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIGxlbiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHN0ciwgKnBvcywgYnl0ZV9vcmRlciwgcG9zKTsKKyAgICAgICAgCisgICAgICAgICpwb3MgKz0gbGVuICsgMTsgLyogbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICB7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsICpwb3MpOworCisgICAgICAgICpwb3MgKz0gbGVuICsgMjsgLyogbGVuZ3RoIGJ5dGUgcGx1cyBsZW5ndGggcGx1cyBudWwgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c193YXJuICgidHlwZSAlcyBub3QgYSBiYXNpYyB0eXBlXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vdCBhIGJhc2ljIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqCisgKiBTa2lwcyBhbiBhcnJheSwgcmV0dXJuaW5nIHRoZSBuZXh0IHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHRoZSB0eXBlIG9mIGFycmF5IGVsZW1lbnRzCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlcgorICogQHBhcmFtIHBvcyBwb2ludGVyIHRvIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcsCisgKiAgICAgICAgICAgIHVwZGF0ZWQgb24gcmV0dXJuIHRvIG5ldyBwb3NpdGlvbgorICovCit2b2lkCitfZGJ1c19tYXJzaGFsX3NraXBfYXJyYXkgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqcG9zKQoreworICBkYnVzX3VpbnQzMl90IGFycmF5X2xlbjsKKyAgaW50IGk7CisgIGludCBhbGlnbm1lbnQ7CisKKyAgaSA9IF9EQlVTX0FMSUdOX1ZBTFVFICgqcG9zLCA0KTsKKworICBhcnJheV9sZW4gPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChzdHIsIGksIGJ5dGVfb3JkZXIsICZpKTsKKworICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1lbnRfdHlwZSk7CisKKyAgaSA9IF9EQlVTX0FMSUdOX1ZBTFVFIChpLCBhbGlnbm1lbnQpOworCisgICpwb3MgPSBpICsgYXJyYXlfbGVuOworfQorCisvKioKKyAqIEdldHMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgdGhlIGdpdmVuIHR5cGU7CisgKiB3aWxsIGJlIDEsIDQsIG9yIDguCisgKgorICogQHBhcmFtIHR5cGVjb2RlIHRoZSB0eXBlCisgKiBAcmV0dXJucyBhbGlnbm1lbnQgb2YgMSwgNCwgb3IgOAorICovCitpbnQKK19kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoaW50IHR5cGVjb2RlKQoreworICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIC8qIHRoaXMgc3R1ZmYgaXMgNCBzaW5jZSBpdCBzdGFydHMgd2l0aCBhIGxlbmd0aCAqLworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIHJldHVybiA0OworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAvKiBzdHJ1Y3QgaXMgOCBzaW5jZSBpdCBjb3VsZCBjb250YWluIGFuIDgtYWxpZ25lZCBpdGVtCisgICAgICAgKiBhbmQgaXQncyBzaW1wbGVyIHRvIGp1c3QgYWx3YXlzIGFsaWduIHN0cnVjdHMgdG8gODsKKyAgICAgICAqIHdlIHdhbnQgdGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIGEgc3RydWN0IG9mIGEgZ2l2ZW4KKyAgICAgICAqIHR5cGUgdG8gYmUgcHJlZGljdGFibGUsIG5vdCBsb2NhdGlvbi1kZXBlbmRlbnQuCisgICAgICAgKiBESUNUX0VOVFJZIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyBzdHJ1Y3QuCisgICAgICAgKi8KKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgIHJldHVybiA4OworCisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVua25vd24gdHlwZWNvZGUgaW4gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50KCkiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCisvKioKKyAqIFJldHVybiAjVFJVRSBpZiB0aGUgdHlwZWNvZGUgaXMgYSB2YWxpZCB0eXBlY29kZS4KKyAqICNEQlVTX1RZUEVfSU5WQUxJRCBzdXJwcmlzaW5nbHkgZW5vdWdoIGlzIG5vdCBjb25zaWRlcmVkIHZhbGlkLCBhbmQKKyAqIHJhbmRvbSB1bmtub3duIGJ5dGVzIGFyZW4ndCBlaXRoZXIuIFRoaXMgZnVuY3Rpb24gaXMgc2FmZSB3aXRoCisgKiB1bnRydXN0ZWQgZGF0YS4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9pc192YWxpZCAoaW50IHR5cGVjb2RlKQoreworICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIHR5cGUuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIHRoZSB0eXBlIHRvIGRlc2NyaWJlCisgKiBAcmV0dXJucyBhIGNvbnN0YW50IHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlCisgKi8KK2NvbnN0IGNoYXIgKgorX2RidXNfdHlwZV90b19zdHJpbmcgKGludCB0eXBlY29kZSkKK3sKKyAgc3dpdGNoICh0eXBlY29kZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5WQUxJRDoKKyAgICAgIHJldHVybiAiaW52YWxpZCI7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgIHJldHVybiAiYm9vbGVhbiI7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICByZXR1cm4gImludDE2IjsKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICByZXR1cm4gInVpbnQxNiI7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICByZXR1cm4gImludDMyIjsKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gInVpbnQzMiI7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgICByZXR1cm4gImludDY0IjsKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gInVpbnQ2NCI7ICAgICAgCisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHJldHVybiAib2JqZWN0X3BhdGgiOworICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgIHJldHVybiAic2lnbmF0dXJlIjsKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgICByZXR1cm4gInN0cnVjdCI7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgIHJldHVybiAiZGljdF9lbnRyeSI7CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICByZXR1cm4gImFycmF5IjsKKyAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgcmV0dXJuICJ2YXJpYW50IjsKKyAgICBjYXNlIERCVVNfU1RSVUNUX0JFR0lOX0NIQVI6CisgICAgICByZXR1cm4gImJlZ2luX3N0cnVjdCI7CisgICAgY2FzZSBEQlVTX1NUUlVDVF9FTkRfQ0hBUjoKKyAgICAgIHJldHVybiAiZW5kX3N0cnVjdCI7CisgICAgY2FzZSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjoKKyAgICAgIHJldHVybiAiYmVnaW5fZGljdF9lbnRyeSI7CisgICAgY2FzZSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVI6CisgICAgICByZXR1cm4gImVuZF9kaWN0X2VudHJ5IjsKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuICJ1bml4X2ZkIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKKy8qKgorICogSWYgaW4gdmVyYm9zZSBtb2RlLCBwcmludCBhIGJsb2NrIG9mIGJpbmFyeSBkYXRhLgorICoKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhCisgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKyAqIEBwYXJhbSBvZmZzZXQgd2hlcmUgdG8gc3RhcnQgY291bnRpbmcgZm9yIGJ5dGUgaW5kZXhlcworICovCit2b2lkCitfZGJ1c192ZXJib3NlX2J5dGVzIChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0KQoreworICBpbnQgaTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxpZ25lZDsKKworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKworICBpZiAoIV9kYnVzX2lzX3ZlcmJvc2UoKSkKKyAgICByZXR1cm47CisKKyAgLyogUHJpbnQgYmxhbmtzIG9uIGZpcnN0IHJvdyBpZiBhcHByb3ByaWF0ZSAqLworICBhbGlnbmVkID0gX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgNCk7CisgIGlmIChhbGlnbmVkID4gZGF0YSkKKyAgICBhbGlnbmVkIC09IDQ7CisgIF9kYnVzX2Fzc2VydCAoYWxpZ25lZCA8PSBkYXRhKTsKKworICBpZiAoYWxpZ25lZCAhPSBkYXRhKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlNGxkXHQlcDogIiwgLSAobG9uZykoZGF0YSAtIGFsaWduZWQpLCBhbGlnbmVkKTsKKyAgICAgIHdoaWxlIChhbGlnbmVkICE9IGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAgICIpOworICAgICAgICAgICsrYWxpZ25lZDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBub3cgcHJpbnQgdGhlIGJ5dGVzICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoX0RCVVNfQUxJR05fQUREUkVTUyAoJmRhdGFbaV0sIDQpID09ICZkYXRhW2ldKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiU0ZFx0JXA6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgaSwgJmRhdGFbaV0pOworICAgICAgICB9CisKKyAgICAgIGlmIChkYXRhW2ldID49IDMyICYmCisgICAgICAgICAgZGF0YVtpXSA8PSAxMjYpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJyVjJyAiLCBkYXRhW2ldKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIjB4JXMleCAiLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2ldIDw9IDB4ZiA/ICIwIiA6ICIiLCBkYXRhW2ldKTsKKworICAgICAgKytpOworCisgICAgICBpZiAoX0RCVVNfQUxJR05fQUREUkVTUyAoJmRhdGFbaV0sIDQpID09ICZkYXRhW2ldKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgPiAzKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkJFOiAlZCBMRTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQzMiAoREJVU19CSUdfRU5ESUFOLCAmZGF0YVtpLTRdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfTElUVExFX0VORElBTiwgJmRhdGFbaS00XSkpOworCisgICAgICAgICAgaWYgKGkgPiA3ICYmCisgICAgICAgICAgICAgIF9EQlVTX0FMSUdOX0FERFJFU1MgKCZkYXRhW2ldLCA4KSA9PSAmZGF0YVtpXSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUgorICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIHU2NDogMHglIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZGJ1c191aW50NjRfdCopJmRhdGFbaS04XSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBkYmw6ICVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihkb3VibGUqKSZkYXRhW2ktOF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7Cit9CisKKy8qKgorICogRHVtcCB0aGUgZ2l2ZW4gcGFydCBvZiB0aGUgc3RyaW5nIHRvIHZlcmJvc2UgbG9nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiByYW5nZSB0byBkdW1wCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiByYW5nZQorICovCit2b2lkCitfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgY2hhciAqZDsKKyAgaW50IHJlYWxfbGVuOworCisgIHJlYWxfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKworICBpZiAoc3RhcnQgPiByZWFsX2xlbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiICBbJWQsJWQpIGlzIG5vdCBpbnNpZGUgc3RyaW5nIG9mIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBsZW4sIHJlYWxfbGVuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKChzdGFydCArIGxlbikgPiByZWFsX2xlbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiICBbJWQsJWQpIGV4dGVuZHMgb3V0c2lkZSBzdHJpbmcgb2YgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGxlbiwgcmVhbF9sZW4pOworICAgICAgbGVuID0gcmVhbF9sZW4gLSBzdGFydDsKKyAgICB9CisKKyAgZCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsIGxlbik7CisKKyAgX2RidXNfdmVyYm9zZV9ieXRlcyAoZCwgbGVuLCBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQKK21hcF90eXBlX2NoYXJfdG9fdHlwZSAoaW50IHQpCit7CisgIGlmICh0ID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpCisgICAgcmV0dXJuIERCVVNfVFlQRV9TVFJVQ1Q7CisgIGVsc2UgaWYgKHQgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpCisgICAgcmV0dXJuIERCVVNfVFlQRV9ESUNUX0VOVFJZOworICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAgICAgcmV0dXJuIHQ7CisgICAgfQorfQorCisvKioKKyAqIEdldCB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgc2lnbmF0dXJlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKKyAqIGFuZCBqdXN0IGdldHRpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNpZ25hdHVyZSBpcyB0aGF0IHlvdSB3b24ndAorICogZ2V0IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIsIHlvdSdsbCBnZXQgREJVU19UWVBFX1NUUlVDVAorICogaW5zdGVhZC4KKyAqCisgKiBAcGFyYW0gc3RyIHN0cmluZyBjb250YWluaW5nIHNpZ25hdHVyZQorICogQHBhcmFtIHBvcyB3aGVyZSB0aGUgc2lnbmF0dXJlIHN0YXJ0cworICogQHJldHVybnMgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIHNpZ25hdHVyZQorICovCitpbnQKK19kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zKQoreworICByZXR1cm4gbWFwX3R5cGVfY2hhcl90b190eXBlIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKSk7Cit9CisKKy8qKgorICogU2ltaWxhciB0byAjX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUsIGJ1dCBvcGVyYXRlcworICogb24gYSBDIHN0cmluZyBidWZmZXIuCisgKgorICogQHBhcmFtIHN0ciBhIEMgc3RyaW5nIGJ1ZmZlcgorICogQHBhcmFtIHBvcyB3aGVyZSB0aGUgc2lnbmF0dXJlIHN0YXJ0cworICogQHJldHVybnMgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIHNpZ25hdHVyZQorICovCitpbnQKK19kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyIChjb25zdCBjaGFyICAgICAgICpzdHIsCisJCQkJICAgICBpbnQgICAgICAgICAgICAgICBwb3MpCit7CisgIHJldHVybiBtYXBfdHlwZV9jaGFyX3RvX3R5cGUgKHN0cltwb3NdKTsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoqCisgKiBSZWFkcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB2YWx1ZXMsIGFzIGFuIG9wdGltaXphdGlvbgorICogdnMuIHJlYWRpbmcgZWFjaCBvbmUgaW5kaXZpZHVhbGx5IGludG8gYSBuZXcgYnVmZmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZGF0YSBpbi1wbGFjZTsgaXQgZG9lcyBub3QgbWFrZSBhIGNvcHksCisgKiBhbmQgaXQgZG9lcyBub3Qgc3dhcCB0aGUgYnl0ZXMuCisgKgorICogSWYgeW91IGFzayBmb3IgI0RCVVNfVFlQRV9ET1VCTEUgeW91IHdpbGwgZ2V0IGEgImNvbnN0IGRvdWJsZSoiIGJhY2sKKyAqIGFuZCB0aGUgInZhbHVlIiBhcmd1bWVudCBzaG91bGQgYmUgYSAiY29uc3QgZG91YmxlKioiIGFuZCBzbyBvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gcG9zIHBvc2l0aW9uIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIGVsZW1lbnRfdHlwZSB0eXBlIG9mIGFycmF5IGVsZW1lbnRzCisgKiBAcGFyYW0gdmFsdWUgcGxhY2UgdG8gcmV0dXJuIHRoZSBhcnJheQorICogQHBhcmFtIG5fZWxlbWVudHMgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyLCB1c2VkIHRvIHJlYWQgdGhlIGFycmF5IGxlbmd0aAorICogQHBhcmFtIG5ld19wb3MgI05VTEwgb3IgbG9jYXRpb24gdG8gc3RvcmUgYSBwb3NpdGlvbiBhZnRlciB0aGUgZWxlbWVudHMKKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpCit7CisgIGludCBhcnJheV9sZW47CisgIGludCBhbGlnbm1lbnQ7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkpOworICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19iYXNpYyAoZWxlbWVudF90eXBlKSk7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJyZWFkaW5nICVkIGVsZW1lbnRzIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzLCBfZGJ1c190eXBlX3RvX3N0cmluZyAoZWxlbWVudF90eXBlKSk7CisjZW5kaWYKKyAgCisgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKTsKKworICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCBhbGlnbm1lbnQpOworICAKKyAgYXJyYXlfbGVuID0gbl9lbGVtZW50cyAqIGFsaWdubWVudDsKKworICAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopIHZhbHVlID0gKHZvaWQqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHBvcywgYXJyYXlfbGVuKTsKKyAgaWYgKG5ld19wb3MpCisgICAgKm5ld19wb3MgPSBwb3MgKyBhcnJheV9sZW47Cit9CisKK3N0YXRpYyB2b2lkCitzd2FwX3Rlc3RfYXJyYXkgKHZvaWQgKmFycmF5LAorICAgICAgICAgICAgICAgICBpbnQgICBsZW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgIGludCAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgIGludCAgIGFsaWdubWVudCkKK3sKKyAgREJ1c1N0cmluZyB0OworCisgIGlmIChhbGlnbm1lbnQgPT0gMSkKKyAgICByZXR1cm47CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZ0LCBhcnJheSwgbGVuX2J5dGVzKTsKKyAgc3dhcF9hcnJheSAoJnQsIDAsIGxlbl9ieXRlcyAvIGFsaWdubWVudCwgYnl0ZV9vcmRlciwgYWxpZ25tZW50KTsKK30KKworI2RlZmluZSBNQVJTSEFMX0JBU0lDKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB2XyMjdHlwZW5hbWUgPSBsaXRlcmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgKCZzdHIsIHBvcywgREJVU19UWVBFXyMjdHlwZW5hbWUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfIyN0eXBlbmFtZSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgTlVMTCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBERU1BUlNIQUxfQkFTSUModHlwZW5hbWUsIGJ5dGVfb3JkZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKCZzdHIsIHBvcywgREJVU19UWVBFXyMjdHlwZW5hbWUsICZ2XyMjdHlwZW5hbWUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgJnBvcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgREVNQVJTSEFMX0JBU0lDX0FORF9DSEVDSyh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9CQVNJQyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGl0ZXJhbCAhPSB2XyMjdHlwZW5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJnN0ciwgZHVtcF9wb3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgLSBkdW1wX3Bvcyk7ICAgICAgICBcCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlbWFyc2hhbGVkIHdyb25nIHZhbHVlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX1RFU1QodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUFSU0hBTF9CQVNJQyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpOyAgICAgICAgICAgICAgXAorICAgIGR1bXBfcG9zID0gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERU1BUlNIQUxfQkFTSUNfQU5EX0NIRUNLICh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCk7ICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTUFSU0hBTF9URVNUX1NUUkNNUCh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BUlNIQUxfQkFTSUMgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkdW1wX3BvcyA9IHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVNQVJTSEFMX0JBU0lDICh0eXBlbmFtZSwgYnl0ZV9vcmRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdHJjbXAgKGxpdGVyYWwsIHZfIyN0eXBlbmFtZSkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3RyLCBkdW1wX3BvcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIC0gZHVtcF9wb3MpOyAgICAgIFwKKyAgICAgICAgX2RidXNfd2FybiAoImxpdGVyYWwgJyVzJ1xudmFsdWUgICclcydcbiIsIGxpdGVyYWwsIHZfIyN0eXBlbmFtZSk7ICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlbWFyc2hhbGVkIHdyb25nIHZhbHVlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX0ZJWEVEX0FSUkFZKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpbnQgbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB2X1VJTlQzMiA9IHNpemVvZihsaXRlcmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgKCZzdHIsIHBvcywgREJVU19UWVBFX1VJTlQzMiwgJnZfVUlOVDMyLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsICZuZXh0KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB2X0FSUkFZXyMjdHlwZW5hbWUgPSBsaXRlcmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoIV9kYnVzX21hcnNoYWxfd3JpdGVfZml4ZWRfbXVsdGkgKCZzdHIsIG5leHQsIERCVVNfVFlQRV8jI3R5cGVuYW1lLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0FSUkFZXyMjdHlwZW5hbWUsIF9EQlVTX05fRUxFTUVOVFMobGl0ZXJhbCksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIE5VTEwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBERU1BUlNIQUxfRklYRURfQVJSQVkodHlwZW5hbWUsIGJ5dGVfb3JkZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoREJVU19UWVBFXyMjdHlwZW5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZfVUlOVDMyID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoJnN0ciwgZHVtcF9wb3MsIGJ5dGVfb3JkZXIsICZuZXh0KTsgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX21hcnNoYWxfcmVhZF9maXhlZF9tdWx0aSAoJnN0ciwgbmV4dCwgREJVU19UWVBFXyMjdHlwZW5hbWUsICZ2X0FSUkFZXyMjdHlwZW5hbWUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9VSU5UMzIvYWxpZ25tZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN3YXBfdGVzdF9hcnJheSAodl9BUlJBWV8jI3R5cGVuYW1lLCB2X1VJTlQzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgYWxpZ25tZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFTUFSU0hBTF9GSVhFRF9BUlJBWV9BTkRfQ0hFQ0sodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERU1BUlNIQUxfRklYRURfQVJSQVkgKHR5cGVuYW1lLCBieXRlX29yZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG1lbWNtcCAobGl0ZXJhbCwgdl9BUlJBWV8jI3R5cGVuYW1lLCBzaXplb2YgKGxpdGVyYWwpICE9IDApKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIk1BUlNIQUxFRCBEQVRBXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3RyLCBkdW1wX3BvcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgLSBkdW1wX3Bvcyk7ICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxJVEVSQUwgREFUQVxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgKChjaGFyKilsaXRlcmFsLCBzaXplb2YgKGxpdGVyYWwpLCAwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlICgiUkVBRCBEQVRBXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlcyAoKGNoYXIqKXZfQVJSQVlfIyN0eXBlbmFtZSwgc2l6ZW9mIChsaXRlcmFsKSwgMCk7ICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlbWFyc2hhbGVkIHdyb25nIGZpeGVkIGFycmF5IHZhbHVlIik7ICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BUlNIQUxfRklYRURfQVJSQVkgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgXAorICAgIGR1bXBfcG9zID0gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9GSVhFRF9BUlJBWV9BTkRfQ0hFQ0sgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgXAorICB9IHdoaWxlICgwKQorCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF90ZXN0ICh2b2lkKQoreworICBpbnQgYWxpZ25tZW50OworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IHBvcywgZHVtcF9wb3M7CisgIHVuc2lnbmVkIGNoYXIgYXJyYXkxWzVdID0geyAzLCA0LCAwLCAxLCA5IH07CisgIGRidXNfaW50MTZfdCBhcnJheTJbM10gPSB7IDEyNCwgNDU3LCA3ODAgfTsKKyAgZGJ1c19pbnQzMl90IGFycmF5NFszXSA9IHsgMTIzLCA0NTYsIDc4OSB9OworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBkYnVzX2ludDY0X3QgYXJyYXk4WzNdID0geyBEQlVTX0lOVDY0X0NPTlNUQU5UICgweDEyM2ZmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlQ2NF9DT05TVEFOVCAoMHg0NTZmZmZmZmZmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5UNjRfQ09OU1RBTlQgKDB4Nzg5ZmZmZmZmZmYpIH07CisgIGRidXNfaW50NjRfdCAqdl9BUlJBWV9JTlQ2NDsKKyNlbmRpZgorICB1bnNpZ25lZCBjaGFyICp2X0FSUkFZX0JZVEU7CisgIGRidXNfaW50MTZfdCAqdl9BUlJBWV9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCAqdl9BUlJBWV9VSU5UMTY7CisgIGRidXNfaW50MzJfdCAqdl9BUlJBWV9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCAqdl9BUlJBWV9VSU5UMzI7CisgIERCdXNTdHJpbmcgdDsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkb3VibGUgdF9ET1VCTEU7CisgIGRidXNfaW50MTZfdCB2X0lOVDE2OworICBkYnVzX3VpbnQxNl90IHZfVUlOVDE2OworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCB2X1VJTlQzMjsKKyAgZGJ1c19pbnQ2NF90IHZfSU5UNjQ7CisgIGRidXNfdWludDY0X3Qgdl9VSU5UNjQ7CisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICBkYnVzX2Jvb2xfdCB2X0JPT0xFQU47CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBjb25zdCBjaGFyICp2X1NJR05BVFVSRTsKKyAgY29uc3QgY2hhciAqdl9PQkpFQ1RfUEFUSDsKKyAgaW50IGJ5dGVfb3JkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgcG9zID0gMDsKKworICAvKiBNYXJzaGFsIGRvdWJsZXMgKi8KKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0JJR19FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19CSUdfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19MSVRUTEVfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgLyogTWFyc2hhbCBzaWduZWQgMTYgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDUpOworICBNQVJTSEFMX1RFU1QgKElOVDE2LCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NSk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCAxNiBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQpOworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19MSVRUTEVfRU5ESUFOLCAweDEyMzQpOworICAKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDU2NzgpOworICBNQVJTSEFMX1RFU1QgKElOVDMyLCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NTY3OCk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQ1Njc4KTsKKyAgTUFSU0hBTF9URVNUIChVSU5UMzIsIERCVVNfTElUVExFX0VORElBTiwgMHgxMjM0NTY3OCk7CisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQ2NCwgREJVU19CSUdfRU5ESUFOLCBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSk7CisgIE1BUlNIQUxfVEVTVCAoSU5UNjQsIERCVVNfTElUVExFX0VORElBTiwgREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykpOworCisgIC8qIE1hcnNoYWwgdW5zaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChVSU5UNjQsIERCVVNfQklHX0VORElBTiwgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykpOworICBNQVJTSEFMX1RFU1QgKFVJTlQ2NCwgREJVU19MSVRUTEVfRU5ESUFOLCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSk7CisjZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisKKyAgLyogTWFyc2hhbCBieXRlICovCisgIE1BUlNIQUxfVEVTVCAoQllURSwgREJVU19CSUdfRU5ESUFOLCA1KTsKKyAgTUFSU0hBTF9URVNUIChCWVRFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDUpOworCisgIC8qIE1hcnNoYWwgYWxsIHBvc3NpYmxlIGJvb2xzISAqLworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfTElUVExFX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgVFJVRSk7CisgIE1BUlNIQUxfVEVTVCAoQk9PTEVBTiwgREJVU19MSVRUTEVfRU5ESUFOLCBUUlVFKTsKKworICAvKiBNYXJzaGFsIHN0cmluZ3MgKi8KKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0xJVFRMRV9FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICJUaGlzIGlzIHRoZSBkYnVzIHRlc3Qgc3RyaW5nIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNUUklORywgREJVU19MSVRUTEVfRU5ESUFOLCAiVGhpcyBpcyB0aGUgZGJ1cyB0ZXN0IHN0cmluZyIpOworCisgIC8qIG9iamVjdCBwYXRocyAqLworICBNQVJTSEFMX1RFU1RfU1RSQ01QIChPQkpFQ1RfUEFUSCwgREJVU19CSUdfRU5ESUFOLCAiL2EvYi9jIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKE9CSkVDVF9QQVRILCBEQlVTX0xJVFRMRV9FTkRJQU4sICIvYS9iL2MiKTsKKworICAvKiBzaWduYXR1cmVzICovCisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19MSVRUTEVfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiYShpaSkiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU0lHTkFUVVJFLCBEQlVTX0xJVFRMRV9FTkRJQU4sICJhKGlpKSIpOworCisgIC8qIEFycmF5cyAqLworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKElOVDE2LCBEQlVTX0JJR19FTkRJQU4sIGFycmF5Mik7CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UMTYsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkyKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChVSU5UMTYsIERCVVNfQklHX0VORElBTiwgYXJyYXkyKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChVSU5UMTYsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkyKTsKKyAgCisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UMzIsIERCVVNfQklHX0VORElBTiwgYXJyYXk0KTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChJTlQzMiwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTQpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKFVJTlQzMiwgREJVU19CSUdfRU5ESUFOLCBhcnJheTQpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKFVJTlQzMiwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTQpOworCisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoQllURSwgREJVU19CSUdfRU5ESUFOLCBhcnJheTEpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKEJZVEUsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkxKTsKKyAgCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UNjQsIERCVVNfQklHX0VORElBTiwgYXJyYXk4KTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChJTlQ2NCwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTgpOworI2VuZGlmCisKKyNpZiAwCisKKyAgLyoKKyAgICogRklYTUUgcmVzdG9yZSB0aGUgc2V0L3BhY2sgdGVzdHMKKyAgICovCisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgLyogc2V0L3BhY2sgNjQtYml0IGludGVnZXJzICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCA4KTsKKworICAvKiBzaWduZWQgbGl0dGxlICovCisgIF9kYnVzX21hcnNoYWxfc2V0X2ludDY0ICgmc3RyLCBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQ2NCAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBiaWcgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfaW50NjQgKCZzdHIsIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDY0IChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGxpdHRsZSBwYWNrICovCisgIF9kYnVzX3BhY2tfaW50NjQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpLAorICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50NjQgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgYmlnIHBhY2sgKi8KKyAgX2RidXNfcGFja19pbnQ2NCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNyksCisgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQ2NCAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGxpdHRsZSAqLworICBfZGJ1c19tYXJzaGFsX3NldF91aW50NjQgKCZzdHIsIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50NjQgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgYmlnICovCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQ2NCAoJnN0ciwgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQ2NCAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBsaXR0bGUgcGFjayAqLworICBfZGJ1c19wYWNrX3VpbnQ2NCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNyksCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQ2NCAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBiaWcgcGFjayAqLworICBfZGJ1c19wYWNrX3VpbnQ2NCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNyksCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQ2NCAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworICAvKiBzZXQvcGFjayAzMi1iaXQgaW50ZWdlcnMgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDQpOworCisgIC8qIHNpZ25lZCBsaXR0bGUgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfaW50MzIgKCZzdHIsIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC0weDEyMzQ1Nik7CisKKyAgX2RidXNfYXNzZXJ0ICgtMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50MzIgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgYmlnICovCisgIF9kYnVzX21hcnNoYWxfc2V0X2ludDMyICgmc3RyLCBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtMHgxMjM0NTYpOworCisgIF9kYnVzX2Fzc2VydCAoLTB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDMyIChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGxpdHRsZSBwYWNrICovCisgIF9kYnVzX3BhY2tfaW50MzIgKC0weDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKC0weDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQzMiAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBiaWcgcGFjayAqLworICBfZGJ1c19wYWNrX2ludDMyICgtMHgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0ICgtMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50MzIgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBsaXR0bGUgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4MTIzNDU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTik7CisKKyAgX2RidXNfYXNzZXJ0ICgweDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgYmlnICovCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4pOworCisgIF9kYnVzX2Fzc2VydCAoMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGxpdHRsZSBwYWNrICovCisgIF9kYnVzX3BhY2tfdWludDMyICgweDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGJpZyBwYWNrICovCisgIF9kYnVzX3BhY2tfdWludDMyICgweDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisjZW5kaWYgLyogc2V0L3BhY2sgdGVzdHMgZm9yIGludGVnZXJzICovCisKKyAgLyogU3RyaW5ncyBpbi1wbGFjZSBzZXQgKi8KKyAgYnl0ZV9vcmRlciA9IERCVVNfTElUVExFX0VORElBTjsKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgLyogSW5pdCBhIHN0cmluZyAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDApOworCisgICAgICAvKiByZXNldCBwb3MgZm9yIHRoZSBtYWNyb3MgKi8KKyAgICAgIHBvcyA9IDA7CisKKyAgICAgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNUUklORywgYnl0ZV9vcmRlciwgIkhlbGxvIHdvcmxkIik7CisKKyAgICAgIC8qIFNldCBpdCB0byBzb21ldGhpbmcgbG9uZ2VyICovCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnQsICJIZWxsbyB3b3JsZCBmb28iKTsKKworICAgICAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0KTsKKyAgICAgIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljICgmc3RyLCAwLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORywgYnl0ZV9vcmRlciwgTlVMTCwgTlVMTCk7CisKKyAgICAgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAoJnN0ciwgMCwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wICh2X1NUUklORywgIkhlbGxvIHdvcmxkIGZvbyIpID09IDApOworCisgICAgICAvKiBTZXQgaXQgdG8gc29tZXRoaW5nIHNob3J0ZXIgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdCwgIkhlbGxvIik7CisKKyAgICAgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdCk7CisgICAgICBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYyAoJnN0ciwgMCwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcsIGJ5dGVfb3JkZXIsIE5VTEwsIE5VTEwpOworICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljICgmc3RyLCAwLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZfU1RSSU5HLCAiSGVsbG8iKSA9PSAwKTsKKworICAgICAgLyogRG8gdGhlIG90aGVyIGJ5dGUgb3JkZXIgKi8KKyAgICAgIGlmIChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTikKKyAgICAgICAgYnl0ZV9vcmRlciA9IERCVVNfQklHX0VORElBTjsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIENsZWFuIHVwICovCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjdmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oCkBAIC0wLDAgKzEsMjczIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1iYXNpYy5oICBNYXJzaGFsbGluZyByb3V0aW5lcyBmb3IgYmFzaWMgKHByaW1pdGl2ZSkgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX0JBU0lDX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX0JBU0lDX0gKKworI2lmZGVmIEhBVkVfQllURVNXQVBfSAorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgREJVU19DT01QSUxFUl9CWVRFX09SREVSIERCVVNfQklHX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgREJVU19DT01QSUxFUl9CWVRFX09SREVSIERCVVNfTElUVExFX0VORElBTgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0JZVEVTV0FQX0gKKyNkZWZpbmUgREJVU19VSU5UMTZfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpIGJzd2FwXzE2KHZhbCkKKyNkZWZpbmUgREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpIGJzd2FwXzMyKHZhbCkKKyNlbHNlIC8qIEhBVkVfQllURVNXQVBfSCAqLworCisjZGVmaW5lIERCVVNfVUlOVDE2X1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKQkoKGRidXNfdWludDE2X3QpICggICAgICBcCisgICAgKGRidXNfdWludDE2X3QpICgoZGJ1c191aW50MTZfdCkgKHZhbCkgPj4gOCkgfCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRidXNfdWludDE2X3QpICgoZGJ1c191aW50MTZfdCkgKHZhbCkgPDwgOCkpKQorCisjZGVmaW5lIERCVVNfVUlOVDMyX1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKQkoKGRidXNfdWludDMyX3QpICggICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMDAwMDBmZlUpIDw8IDI0KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMDAwZmYwMFUpIDw8ICA4KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMGZmMDAwMFUpID4+ICA4KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHhmZjAwMDAwMFUpID4+IDI0KSkpCisKKyNlbmRpZiAvKiBIQVZFX0JZVEVTV0FQX0ggKi8KKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorCisjaWZkZWYgSEFWRV9CWVRFU1dBUF9ICisjZGVmaW5lIERCVVNfVUlOVDY0X1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKSBic3dhcF82NCh2YWwpCisjZWxzZSAvKiBIQVZFX0JZVEVTV0FQX0ggKi8KKworI2RlZmluZSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFX0NPTlNUQU5UKHZhbCkJKChkYnVzX3VpbnQ2NF90KSAoICAgICAgICAgICAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwMDAwMDAwMDBmZikpIDw8IDU2KSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDAwMDAwMDBmZjAwKSkgPDwgNDApIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDAwMDAwMDBmZjAwMDApKSA8PCAyNCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwMDBmZjAwMDAwMCkpIDw8ICA4KSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDBmZjAwMDAwMDAwKSkgPj4gIDgpIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDBmZjAwMDAwMDAwMDApKSA+PiAyNCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDBmZjAwMDAwMDAwMDAwMCkpID4+IDQwKSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHhmZjAwMDAwMDAwMDAwMDAwKSkgPj4gNTYpKSkKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworI2VuZGlmIC8qIEhBVkVfQllURVNXQVBfSCAqLworCisjZGVmaW5lIERCVVNfVUlOVDE2X1NXQVBfTEVfQkUodmFsKSAoREJVU19VSU5UMTZfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQxNl9TV0FQX0xFX0JFKHZhbCkgICgoZGJ1c19pbnQxNl90KURCVVNfVUlOVDE2X1NXQVBfTEVfQkVfQ09OU1RBTlQgKHZhbCkpCisKKyNkZWZpbmUgREJVU19VSU5UMzJfU1dBUF9MRV9CRSh2YWwpIChEQlVTX1VJTlQzMl9TV0FQX0xFX0JFX0NPTlNUQU5UICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDMyX1NXQVBfTEVfQkUodmFsKSAgKChkYnVzX2ludDMyX3QpREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorIyAgZGVmaW5lIERCVVNfVUlOVDY0X1NXQVBfTEVfQkUodmFsKSAoREJVU19VSU5UNjRfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDY0X1NXQVBfTEVfQkUodmFsKSAgKChkYnVzX2ludDY0X3QpREJVU19VSU5UNjRfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19CRSh2YWwpCSgoZGJ1c19pbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQxNl9UT19CRSh2YWwpCSgoZGJ1c191aW50MTZfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19MRSh2YWwpCShEQlVTX0lOVDE2X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UMTZfVE9fTEUodmFsKQkoREJVU19VSU5UMTZfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0JFKHZhbCkJKChkYnVzX2ludDMyX3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0JFKHZhbCkJKChkYnVzX3VpbnQzMl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0xFKHZhbCkJKERCVVNfSU5UMzJfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQzMl9UT19MRSh2YWwpCShEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWwpKQorIyAgaWZkZWYgREJVU19IQVZFX0lOVDY0CisjICAgIGRlZmluZSBEQlVTX0lOVDY0X1RPX0JFKHZhbCkJKChkYnVzX2ludDY0X3QpICh2YWwpKQorIyAgICBkZWZpbmUgREJVU19VSU5UNjRfVE9fQkUodmFsKQkoKGRidXNfdWludDY0X3QpICh2YWwpKQorIyAgICBkZWZpbmUgREJVU19JTlQ2NF9UT19MRSh2YWwpCShEQlVTX0lOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19MRSh2YWwpCShEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICh2YWwpKQorIyAgZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisKKyNlbHNlIC8qIFdPUkRTX0JJR0VORElBTiAqLworCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19MRSh2YWwpCSgoZGJ1c19pbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQxNl9UT19MRSh2YWwpCSgoZGJ1c191aW50MTZfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19CRSh2YWwpCSgoZGJ1c19pbnQxNl90KSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDE2X1RPX0JFKHZhbCkJKERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQzMl9UT19MRSh2YWwpCSgoZGJ1c19pbnQzMl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQzMl9UT19MRSh2YWwpCSgoZGJ1c191aW50MzJfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQzMl9UT19CRSh2YWwpCSgoZGJ1c19pbnQzMl90KSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0JFKHZhbCkJKERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKHZhbCkpCisjICBpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyMgICAgZGVmaW5lIERCVVNfSU5UNjRfVE9fTEUodmFsKQkoKGRidXNfaW50NjRfdCkgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19MRSh2YWwpCSgoZGJ1c191aW50NjRfdCkgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX0lOVDY0X1RPX0JFKHZhbCkJKChkYnVzX2ludDY0X3QpIERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisjICAgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19CRSh2YWwpCShEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICh2YWwpKQorIyAgZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisjZW5kaWYKKworLyogVGhlIHRyYW5zZm9ybWF0aW9uIGlzIHN5bW1ldHJpYywgc28gdGhlIEZST00ganVzdCBtYXBzIHRvIHRoZSBUTy4gKi8KKyNkZWZpbmUgREJVU19JTlQxNl9GUk9NX0xFKHZhbCkJIChEQlVTX0lOVDE2X1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQxNl9GUk9NX0xFKHZhbCkgKERCVVNfVUlOVDE2X1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDE2X0ZST01fQkUodmFsKQkgKERCVVNfSU5UMTZfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfVUlOVDE2X0ZST01fQkUodmFsKSAoREJVU19VSU5UMTZfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UMzJfRlJPTV9MRSh2YWwpCSAoREJVU19JTlQzMl9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19VSU5UMzJfRlJPTV9MRSh2YWwpIChEQlVTX1VJTlQzMl9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQzMl9GUk9NX0JFKHZhbCkJIChEQlVTX0lOVDMyX1RPX0JFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQzMl9GUk9NX0JFKHZhbCkgKERCVVNfVUlOVDMyX1RPX0JFICh2YWwpKQorI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorIyAgZGVmaW5lIERCVVNfSU5UNjRfRlJPTV9MRSh2YWwpCSAoREJVU19JTlQ2NF9UT19MRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQ2NF9GUk9NX0xFKHZhbCkgKERCVVNfVUlOVDY0X1RPX0xFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfSU5UNjRfRlJPTV9CRSh2YWwpCSAoREJVU19JTlQ2NF9UT19CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQ2NF9GUk9NX0JFKHZhbCkgKERCVVNfVUlOVDY0X1RPX0JFICh2YWwpKQorI2VuZGlmIC8qIERCVVNfSEFWRV9JTlQ2NCAqLworCisjaWZuZGVmIERCVVNfSEFWRV9JTlQ2NAorLyoqCisgKiBBbiA4LWJ5dGUgc3RydWN0IHlvdSBjb3VsZCB1c2UgdG8gYWNjZXNzIGludDY0IHdpdGhvdXQgaGF2aW5nCisgKiBpbnQ2NCBzdXBwb3J0CisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGRidXNfdWludDMyX3QgZmlyc3QzMjsgIC8qKjwgZmlyc3QgMzIgYml0cyBpbiB0aGUgOCBieXRlcyAoYmV3YXJlIGVuZGlhbiBpc3N1ZXMpICovCisgIGRidXNfdWludDMyX3Qgc2Vjb25kMzI7IC8qKjwgc2Vjb25kIDMyIGJpdHMgaW4gdGhlIDggYnl0ZXMgKGJld2FyZSBlbmRpYW4gaXNzdWVzKSAqLworfSBEQnVzOEJ5dGVTdHJ1Y3Q7CisjZW5kaWYgLyogREJVU19IQVZFX0lOVDY0ICovCisKKy8qKgorICogQSBzaW1wbGUgOC1ieXRlIHZhbHVlIHVuaW9uIHRoYXQgbGV0cyB5b3UgYWNjZXNzIDggYnl0ZXMgYXMgaWYgdGhleQorICogd2VyZSB2YXJpb3VzIHR5cGVzOyB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggYmFzaWMgdHlwZXMgdmlhCisgKiB2b2lkIHBvaW50ZXJzIGFuZCB2YXJhcmdzLgorICovCit0eXBlZGVmIHVuaW9uCit7CisgIGRidXNfaW50MTZfdCAgaTE2OyAgIC8qKjwgYXMgaW50MTYgKi8KKyAgZGJ1c191aW50MTZfdCB1MTY7ICAgLyoqPCBhcyBpbnQxNiAqLworICBkYnVzX2ludDMyX3QgIGkzMjsgICAvKio8IGFzIGludDMyICovCisgIGRidXNfdWludDMyX3QgdTMyOyAgIC8qKjwgYXMgaW50MzIgKi8KKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgZGJ1c19pbnQ2NF90ICBpNjQ7ICAgLyoqPCBhcyBpbnQ2NCAqLworICBkYnVzX3VpbnQ2NF90IHU2NDsgICAvKio8IGFzIGludDY0ICovCisjZWxzZQorICBEQnVzOEJ5dGVTdHJ1Y3QgdTY0OyAvKio8IGFzIDgtYnl0ZS1zdHJ1Y3QgKi8KKyNlbmRpZgorICBkb3VibGUgZGJsOyAgICAgICAgICAvKio8IGFzIGRvdWJsZSAqLworICB1bnNpZ25lZCBjaGFyIGJ5dDsgICAvKio8IGFzIGJ5dGUgKi8KKyAgY2hhciAqc3RyOyAgICAgICAgICAgLyoqPCBhcyBjaGFyKiAqLworfSBEQnVzQmFzaWNWYWx1ZTsKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyNkZWZpbmUgX2RidXNfdW5wYWNrX3VpbnQxNihieXRlX29yZGVyLCBkYXRhKSAgICAgICAgICAgXAorICAgKCgoYnl0ZV9vcmRlcikgPT0gREJVU19MSVRUTEVfRU5ESUFOKSA/ICAgICAgICAgICAgICBcCisgICAgIERCVVNfVUlOVDE2X0ZST01fTEUgKCooZGJ1c191aW50MTZfdCopKGRhdGEpKSA6ICAgIFwKKyAgICAgREJVU19VSU5UMTZfRlJPTV9CRSAoKihkYnVzX3VpbnQxNl90KikoZGF0YSkpKQorCisjZGVmaW5lIF9kYnVzX3VucGFja191aW50MzIoYnl0ZV9vcmRlciwgZGF0YSkgICAgICAgICAgIFwKKyAgICgoKGJ5dGVfb3JkZXIpID09IERCVVNfTElUVExFX0VORElBTikgPyAgICAgICAgICAgICAgXAorICAgICBEQlVTX1VJTlQzMl9GUk9NX0xFICgqKGRidXNfdWludDMyX3QqKShkYXRhKSkgOiAgICBcCisgICAgIERCVVNfVUlOVDMyX0ZST01fQkUgKCooZGJ1c191aW50MzJfdCopKGRhdGEpKSkKKyNlbmRpZgorCisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MTYKK2RidXNfdWludDE2X3QgX2RidXNfdW5wYWNrX3VpbnQxNiAoaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKwordm9pZCAgICAgICAgICBfZGJ1c19wYWNrX3VpbnQzMiAgIChkYnVzX3VpbnQzMl90ICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAqZGF0YSk7CisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MzIKK2RidXNfdWludDMyX3QgX2RidXNfdW5wYWNrX3VpbnQzMiAoaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKworZGJ1c19ib29sX3QgICBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYyAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfZW5kX3Bvcyk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgICAgICAgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqcG9zX2FmdGVyKTsKK2RidXNfYm9vbF90ICAgX2RidXNfbWFyc2hhbF93cml0ZV9maXhlZF9tdWx0aSAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnBvc19hZnRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbmV3X3Bvcyk7Cit2b2lkICAgICAgICAgIF9kYnVzX21hcnNoYWxfcmVhZF9maXhlZF9tdWx0aSAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfcG9zKTsKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2Jhc2ljICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpwb3MpOwordm9pZCAgICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYXJyYXkgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqcG9zKTsKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICAgICAgICAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyKTsKK2RidXNfdWludDMyX3QgX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpOworZGJ1c19ib29sX3QgICBfZGJ1c190eXBlX2lzX3ZhbGlkICAgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICB0eXBlY29kZSk7CitpbnQgICAgICAgICAgIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAgICAgICAgKGludCAgICAgICAgICAgICAgIHR5cGVjb2RlKTsKK2RidXNfYm9vbF90ICAgX2RidXNfdHlwZV9pc19maXhlZCAgICAgICAgICAgICAoaW50ICAgICAgICAgICAgICAgdHlwZWNvZGUpOworaW50ICAgICAgICAgICBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgICAgICAgIChpbnQgICAgICAgICAgICAgICB0eXBlY29kZSk7Citjb25zdCBjaGFyKiAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICAgICAgICAgICAgKGludCAgICAgICAgICAgICAgIHR5cGVjb2RlKTsKKworaW50ICAgICAgICAgICBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcyk7CisKK2ludCAgICAgICAgICAgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIgICAoY29uc3QgY2hhciAgICAgICAqc3RyLAorCQkJCQkJICAgICBpbnQgICAgICAgICAgICAgICBwb3MpOworCit2b2lkIF9kYnVzX3N3YXBfYXJyYXkgKHVuc2lnbmVkIGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGFsaWdubWVudCk7CisKKyNlbmRpZiAvKiBEQlVTX01BUlNIQUxfQkFTSUNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjc0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYyAgV291bGQgYmUgaW4gZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMgYnV0IHRlc3RzL2J1cyBvbmx5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMgCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQKK2RvX2J5dGVzd2FwX3Rlc3QgKGludCBieXRlX29yZGVyKQoreworICBpbnQgc2VxdWVuY2U7CisgIERCdXNTdHJpbmcgc2lnbmF0dXJlOworICBEQnVzU3RyaW5nIGJvZHk7CisgIGludCBvcHBvc2l0ZV9vcmRlcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2lnbmF0dXJlKSB8fCAhX2RidXNfc3RyaW5nX2luaXQgKCZib2R5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBvcHBvc2l0ZV9vcmRlciA9IGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOID8gREJVU19CSUdfRU5ESUFOIDogREJVU19MSVRUTEVfRU5ESUFOOworICAKKyAgc2VxdWVuY2UgPSAwOworICB3aGlsZSAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAoc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZSwgJmJvZHkpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgY29weTsKKyAgICAgIERCdXNUeXBlUmVhZGVyIGJvZHlfcmVhZGVyOworICAgICAgREJ1c1R5cGVSZWFkZXIgY29weV9yZWFkZXI7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb3B5KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZib2R5LCAwLCAmY29weSwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwICgmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9zaXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHksIDApOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmYm9keV9yZWFkZXIsIGJ5dGVfb3JkZXIsICZzaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9keSwgMCk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmY29weV9yZWFkZXIsIG9wcG9zaXRlX29yZGVyLCAmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHksIDApOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX2VxdWFsX3ZhbHVlcyAoJmJvZHlfcmVhZGVyLCAmY29weV9yZWFkZXIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnbmF0dXJlKSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJvZHkpKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmNvcHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29weSkpOworCisgICAgICAgICAgX2RidXNfd2FybiAoIkJ5dGUtc3dhcHBlZCBkYXRhIGRpZCBub3QgaGF2ZSBzYW1lIHZhbHVlcyBhcyBvcmlnaW5hbCBkYXRhXG4iKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29weSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc2lnbmF0dXJlLCAwKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYm9keSwgMCk7CisgICAgICArK3NlcXVlbmNlOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNpZ25hdHVyZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYm9keSk7CisKKyAgcHJpbnRmICgiICAlZCBibG9ja3Mgc3dhcHBlZCBmcm9tIG9yZGVyICclYycgdG8gJyVjJ1xuIiwKKyAgICAgICAgICBzZXF1ZW5jZSwgYnl0ZV9vcmRlciwgb3Bwb3NpdGVfb3JkZXIpOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF9ieXRlc3dhcF90ZXN0ICh2b2lkKQoreworICBkb19ieXRlc3dhcF90ZXN0IChEQlVTX0xJVFRMRV9FTkRJQU4pOworICBkb19ieXRlc3dhcF90ZXN0IChEQlVTX0JJR19FTkRJQU4pOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkN2UyMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMgIFN3YXAgYSBibG9jayBvZiBtYXJzaGFsZWQgZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICogQHsKKyAqLworCitzdGF0aWMgdm9pZAorYnl0ZXN3YXBfYm9keV9oZWxwZXIgKERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIHdhbGtfcmVhZGVyX3RvX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgb2xkX2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5ld19ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICpwLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKipuZXdfcCkKK3sKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIHN3aXRjaCAoY3VycmVudF90eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICAgICAgKytwOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICAgICAgeworICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDIpOworICAgICAgICAgICAgKigoZGJ1c191aW50MTZfdCopcCkgPSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQxNl90KilwKSk7CisgICAgICAgICAgICBwICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA0KTsKKyAgICAgICAgICAgICooKGRidXNfdWludDMyX3QqKXApID0gREJVU19VSU5UMzJfU1dBUF9MRV9CRSAoKigoZGJ1c191aW50MzJfdCopcCkpOworICAgICAgICAgICAgcCArPSA0OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA4KTsKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgICAgICAgICAgICooKGRidXNfdWludDY0X3QqKXApID0gREJVU19VSU5UNjRfU1dBUF9MRV9CRSAoKigoZGJ1c191aW50NjRfdCopcCkpOworI2Vsc2UKKyAgICAgICAgICAgIF9kYnVzX3N3YXBfYXJyYXkgKHAsIDEsIDgpOworI2VuZGlmCisgICAgICAgICAgICBwICs9IDg7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgYXJyYXlfbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgNCk7CisKKyAgICAgICAgICAgIGFycmF5X2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKG9sZF9ieXRlX29yZGVyLCBwKTsKKworICAgICAgICAgICAgKigoZGJ1c191aW50MzJfdCopcCkgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQzMl90KilwKSk7CisgICAgICAgICAgICBwICs9IDQ7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVsZW1fdHlwZTsKKyAgICAgICAgICAgICAgICBpbnQgYWxpZ25tZW50OworCisgICAgICAgICAgICAgICAgZWxlbV90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKTsKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1fdHlwZSk7CisKKwkJX2RidXNfYXNzZXJ0ICgoYXJyYXlfbGVuIC8gYWxpZ25tZW50KSA8IERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEgpOworCisgICAgICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIGFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbV90eXBlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWdubWVudCA+IDEpCisJCSAgICAgIF9kYnVzX3N3YXBfYXJyYXkgKHAsIGFycmF5X2xlbiAvIGFsaWdubWVudCwgYWxpZ25tZW50KTsKKwkJICAgIHAgKz0gYXJyYXlfbGVuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphcnJheV9lbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kID0gcCArIGFycmF5X2xlbjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHAgPCBhcnJheV9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN3YXBfYm9keV9oZWxwZXIgKCZzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgJnApOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX1NUUklORyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcCArPSAoYXJyYXlfbGVuICsgMSk7IC8qICsgMSBmb3IgbnVsICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3Qgc2lnX2xlbjsKKworICAgICAgICAgICAgc2lnX2xlbiA9ICpwOworICAgICAgICAgICAgCisgICAgICAgICAgICBwICs9IChzaWdfbGVuICsgMik7IC8qICsyIGZvciBsZW4gYW5kIG51bCAqLworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEgYnl0ZSBzaWcgbGVuLCBzaWcgdHlwZWNvZGVzLCBhbGlnbiB0bworICAgICAgICAgICAgICogY29udGFpbmVkLXR5cGUtYm91bmRhcnksIHZhbHVlcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGJ1c191aW50MzJfdCBzaWdfbGVuOworICAgICAgICAgICAgREJ1c1N0cmluZyBzaWc7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICAgICAgICBpbnQgY29udGFpbmVkX2FsaWdubWVudDsKKworICAgICAgICAgICAgc2lnX2xlbiA9ICpwOworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzaWcsIHAsIHNpZ19sZW4pOworCisgICAgICAgICAgICBwICs9IChzaWdfbGVuICsgMSk7IC8qIDEgZm9yIG51bCAqLworCisgICAgICAgICAgICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoJnNpZywgMCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgY29udGFpbmVkX2FsaWdubWVudCk7CisKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnN1YiwgJnNpZywgMCk7CisKKyAgICAgICAgICAgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmc3ViLCBGQUxTRSwgb2xkX2J5dGVfb3JkZXIsIG5ld19ieXRlX29yZGVyLCBwLCAmcCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisKKyAgICAgICAgICAgIHAgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnl0ZXN3YXBfYm9keV9oZWxwZXIgKCZzdWIsIFRSVUUsIG9sZF9ieXRlX29yZGVyLCBuZXdfYnl0ZV9vcmRlciwgcCwgJnApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICAgIC8qIGZkcyBjYW4gb25seSBiZSBwYXNzZWQgb24gYSBsb2NhbCBtYWNoaW5lLCBzbyBieXRlIG9yZGVyIG11c3QgYWx3YXlzIG1hdGNoICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJhdHRlbXB0ZWQgdG8gYnl0ZXN3YXAgdW5peCBmZHMgd2hpY2ggbWFrZXMgbm8gc2Vuc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgdHlwZWNvZGUgaW4gc3VwcG9zZWRseS12YWxpZGF0ZWQgc2lnbmF0dXJlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgaWYgKHdhbGtfcmVhZGVyX3RvX2VuZCkKKyAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChuZXdfcCkKKyAgICAqbmV3X3AgPSBwOworfQorCisvKioKKyAqIEJ5dGVzd2FwcyB0aGUgbWFyc2hhbGVkIGRhdGEgaW4gdGhlIGdpdmVuIHZhbHVlX3N0ci4KKyAqCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlcyBpbiB0aGUgdmFsdWVfc3RyCisgKiBAcGFyYW0gc2lnbmF0dXJlX3N0YXJ0IHdoZXJlIGluIHNpZ25hdHVyZSBpcyB0aGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gb2xkX2J5dGVfb3JkZXIgdGhlIG9sZCBieXRlIG9yZGVyCisgKiBAcGFyYW0gbmV3X2J5dGVfb3JkZXIgdGhlIG5ldyBieXRlIG9yZGVyCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgYm9keQorICogQHBhcmFtIHZhbHVlX3BvcyB3aGVyZSB0aGUgdmFsdWVzIHN0YXJ0CisgKi8KK3ZvaWQKK19kYnVzX21hcnNoYWxfYnl0ZXN3YXAgKGNvbnN0IERCdXNTdHJpbmcgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHNpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKworICBfZGJ1c19hc3NlcnQgKHZhbHVlX3BvcyA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZV9wb3MgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlX3N0cikpOworCisgIGlmIChvbGRfYnl0ZV9vcmRlciA9PSBuZXdfYnl0ZV9vcmRlcikKKyAgICByZXR1cm47CisgIAorICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaWduYXR1cmVfc3RhcnQpOworCisgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmcmVhZGVyLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2J5dGVfb3JkZXIsIG5ld19ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAodmFsdWVfc3RyLCB2YWx1ZV9wb3MsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKy8qKiBAfSAqLworCisvKiBUZXN0cyBpbiBkYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTJkZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaApAQCAtMCwwICsxLDM3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1ieXRlc3dhcC5oICBTd2FwIGEgYmxvY2sgb2YgbWFyc2hhbGVkIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01BUlNIQUxfQllURVNXQVBfSAorI2RlZmluZSBEQlVTX01BUlNIQUxfQllURVNXQVBfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmg+CisKK3ZvaWQgX2RidXNfbWFyc2hhbF9ieXRlc3dhcCAoY29uc3QgREJ1c1N0cmluZyAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzaWduYXR1cmVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuZXdfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX0JZVEVTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jCkBAIC0wLDAgKzEsMTQ5NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtaGVhZGVyLmMgIE1hbmFnaW5nIG1hcnNoYWxpbmcvZGVtYXJzaGFsaW5nIG9mIG1lc3NhZ2UgaGVhZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMvZGJ1cy1zaGFyZWQuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtaGVhZGVyLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1ieXRlc3dhcC5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNYXJzaGFsCisgKgorICogQHsKKyAqLworCisKKy8qIE5vdCB0aHJlYWQgbG9ja2VkLCBidXQgc3RyaWN0bHkgY29uc3QvcmVhZC1vbmx5IHNvIHNob3VsZCBiZSBPSworICovCisvKiogU3RhdGljICNEQnVzU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSBvZiBhIG1lc3NhZ2UgaGVhZGVyICovCitfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwgREJVU19IRUFERVJfU0lHTkFUVVJFKTsKKy8qKiBTdGF0aWMgI0RCdXNTdHJpbmcgY29udGFpbmluZyB0aGUgbG9jYWwgaW50ZXJmYWNlICovCitfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhfZGJ1c19sb2NhbF9pbnRlcmZhY2Vfc3RyLCAgREJVU19JTlRFUkZBQ0VfTE9DQUwpOworLyoqIFN0YXRpYyAjREJ1c1N0cmluZyBjb250YWluaW5nIHRoZSBsb2NhbCBwYXRoICovCitfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhfZGJ1c19sb2NhbF9wYXRoX3N0ciwgICAgICAgREJVU19QQVRIX0xPQ0FMKTsKKworLyoqIE9mZnNldCBmcm9tIHN0YXJ0IG9mIF9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyIHRvIHRoZSBzaWduYXR1cmUgb2YgdGhlIGZpZWxkcyBhcnJheSAqLworI2RlZmluZSBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCA2CisvKiogT2Zmc2V0IGZyb20gc3RhcnQgb2YgX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIgdG8gdGhlIHNpZ25hdHVyZSBvZiBhbiBlbGVtZW50IG9mIHRoZSBmaWVsZHMgYXJyYXkgKi8KKyNkZWZpbmUgRklFTERTX0FSUkFZX0VMRU1FTlRfU0lHTkFUVVJFX09GRlNFVCA3CisKKworLyoqIE9mZnNldCB0byBieXRlIG9yZGVyIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEJZVEVfT1JERVJfT0ZGU0VUICAgIDAKKy8qKiBPZmZzZXQgdG8gdHlwZSBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBUWVBFX09GRlNFVCAgICAgICAgICAxCisvKiogT2Zmc2V0IHRvIGZsYWdzIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEZMQUdTX09GRlNFVCAgICAgICAgIDIKKy8qKiBPZmZzZXQgdG8gdmVyc2lvbiBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBWRVJTSU9OX09GRlNFVCAgICAgICAzCisvKiogT2Zmc2V0IHRvIGJvZHkgbGVuZ3RoIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEJPRFlfTEVOR1RIX09GRlNFVCA0CisvKiogT2Zmc2V0IHRvIGNsaWVudCBzZXJpYWwgZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgU0VSSUFMX09GRlNFVCA4CisvKiogT2Zmc2V0IHRvIGZpZWxkcyBhcnJheSBsZW5ndGggZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQgMTIKKy8qKiBPZmZzZXQgdG8gZmlyc3QgZmllbGQgaW4gaGVhZGVyICovCisjZGVmaW5lIEZJUlNUX0ZJRUxEX09GRlNFVCAxNgorCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyIGNvZGU7IC8qKjwgdGhlIGZpZWxkIGNvZGUgKi8KKyAgdW5zaWduZWQgY2hhciB0eXBlOyAvKio8IHRoZSB2YWx1ZSB0eXBlICovCit9IEhlYWRlckZpZWxkVHlwZTsKKworc3RhdGljIGNvbnN0IEhlYWRlckZpZWxkVHlwZQorX2RidXNfaGVhZGVyX2ZpZWxkX3R5cGVzW0RCVVNfSEVBREVSX0ZJRUxEX0xBU1QrMV0gPSB7CisgIHsgREJVU19IRUFERVJfRklFTERfSU5WQUxJRCwgREJVU19UWVBFX0lOVkFMSUQgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9QQVRILCBEQlVTX1RZUEVfT0JKRUNUX1BBVEggfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UsIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9NRU1CRVIsIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMLCBEQlVTX1RZUEVfVUlOVDMyIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04sIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIsIERCVVNfVFlQRV9TVFJJTkcgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsIERCVVNfVFlQRV9TSUdOQVRVUkUgfSwKKyAgeyBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUywgREJVU19UWVBFX1VJTlQzMiB9Cit9OworCisvKiogTWFjcm8gdG8gbG9vayB1cCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIGZpZWxkICovCisjZGVmaW5lIEVYUEVDVEVEX1RZUEVfT0ZfRklFTEQoZmllbGQpIChfZGJ1c19oZWFkZXJfZmllbGRfdHlwZXNbZmllbGRdLnR5cGUpCisKKy8qKiBUaGUgbW9zdCBwYWRkaW5nIHdlIGNvdWxkIGV2ZXIgbmVlZCBmb3IgYSBoZWFkZXIgKi8KKyNkZWZpbmUgTUFYX1BPU1NJQkxFX0hFQURFUl9QQURESU5HIDcKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVzZXJ2ZV9oZWFkZXJfcGFkZGluZyAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBfZGJ1c19hc3NlcnQgKGhlYWRlci0+cGFkZGluZyA8PSBNQVhfUE9TU0lCTEVfSEVBREVSX1BBRERJTkcpOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuICgmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BPU1NJQkxFX0hFQURFUl9QQURESU5HIC0gaGVhZGVyLT5wYWRkaW5nKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGhlYWRlci0+cGFkZGluZyA9IE1BWF9QT1NTSUJMRV9IRUFERVJfUEFERElORzsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjb3JyZWN0X2hlYWRlcl9wYWRkaW5nIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGludCB1bnBhZGRlZF9sZW47CisKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXItPnBhZGRpbmcgPT0gNyk7CisKKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKCZoZWFkZXItPmRhdGEsIGhlYWRlci0+cGFkZGluZyk7CisgIHVucGFkZGVkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGggKCZoZWFkZXItPmRhdGEsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IHBhZCBoZWFkZXIgdGhvdWdoIGVub3VnaCBwYWRkaW5nIHdhcyBwcmVhbGxvY2F0ZWQiKTsKKworICBoZWFkZXItPnBhZGRpbmcgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkgLSB1bnBhZGRlZF9sZW47Cit9CisKKy8qKiBDb21wdXRlIHRoZSBlbmQgb2YgdGhlIGhlYWRlciwgaWdub3JpbmcgcGFkZGluZyAqLworI2RlZmluZSBIRUFERVJfRU5EX0JFRk9SRV9QQURESU5HKGhlYWRlcikgXAorICAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCYoaGVhZGVyKS0+ZGF0YSkgLSAoaGVhZGVyKS0+cGFkZGluZykKKworLyoqCisgKiBJbnZhbGlkYXRlcyBhbGwgZmllbGRzIGluIHRoZSBjYWNoZS4gVGhpcyBtYXkgYmUgdXNlZCB3aGVuIHRoZQorICogY2FjaGUgaXMgdG90YWxseSB1bmluaXRpYWxpemVkIChjb250YWlucyBqdW5rKSBzbyBzaG91bGQgbm90CisgKiBsb29rIGF0IHdoYXQncyBpbiB0aGVyZSBub3cuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19oZWFkZXJfY2FjaGVfaW52YWxpZGF0ZV9hbGwgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpCisgICAgeworICAgICAgaGVhZGVyLT5maWVsZHNbaV0udmFsdWVfcG9zID0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX1VOS05PV047CisgICAgICArK2k7CisgICAgfQorfQorCisvKioKKyAqIENhY2hlcyBvbmUgZmllbGQKKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZF9jb2RlIHRoZSBmaWVsZAorICogQHBhcmFtIHZhcmlhbnRfcmVhZGVyIHRoZSByZWFkZXIgZm9yIHRoZSB2YXJpYW50IGluIHRoZSBmaWVsZAorICovCitzdGF0aWMgdm9pZAorX2RidXNfaGVhZGVyX2NhY2hlX29uZSAoREJ1c0hlYWRlciAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaWVsZF9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnZhcmlhbnRfcmVhZGVyKQoreworICBoZWFkZXItPmZpZWxkc1tmaWVsZF9jb2RlXS52YWx1ZV9wb3MgPQorICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKHZhcmlhbnRfcmVhZGVyKTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoImNhY2hlZCB2YWx1ZV9wb3MgJWQgZm9yIGZpZWxkICVkXG4iLAorICAgICAgICAgICAgICAgICBoZWFkZXItPmZpZWxkc1tmaWVsZF9jb2RlXS52YWx1ZV9wb3MsIGZpZWxkX2NvZGUpCisjZW5kaWYKK30KKworLyoqCisgKiBSZXZhbGlkYXRlcyB0aGUgZmllbGRzIGNhY2hlCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19oZWFkZXJfY2FjaGVfcmV2YWxpZGF0ZSAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBEQnVzVHlwZVJlYWRlciBhcnJheTsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCkKKyAgICB7CisgICAgICBoZWFkZXItPmZpZWxkc1tpXS52YWx1ZV9wb3MgPSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQ7CisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFkZXIsICZhcnJheSk7CisKKyAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZhcnJheSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgREJ1c1R5cGVSZWFkZXIgdmFyaWFudDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZmllbGRfY29kZTsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJmFycmF5LCAmc3ViKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViKSA9PSBEQlVTX1RZUEVfQllURSk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmc3ViLCAmZmllbGRfY29kZSk7CisKKyAgICAgIC8qIFVua25vd24gZmllbGRzIHNob3VsZCBiZSBpZ25vcmVkICovCisgICAgICBpZiAoZmllbGRfY29kZSA+IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpCisgICAgICAgIGdvdG8gbmV4dF9maWVsZDsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnN1Yik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX1ZBUklBTlQpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnN1YiwgJnZhcmlhbnQpOworCisgICAgICBfZGJ1c19oZWFkZXJfY2FjaGVfb25lIChoZWFkZXIsIGZpZWxkX2NvZGUsICZ2YXJpYW50KTsKKworICAgIG5leHRfZmllbGQ6CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpOworICAgIH0KK30KKworLyoqCisgKiBDaGVja3MgZm9yIGEgZmllbGQsIHVwZGF0aW5nIHRoZSBjYWNoZSBpZiByZXF1aXJlZC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgZmllbGQgZG9lc24ndCBleGlzdAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9jYWNoZV9jaGVjayAoREJ1c0hlYWRlciAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBmaWVsZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKTsKKworICBpZiAoaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcyA9PSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfVU5LTk9XTikKKyAgICBfZGJ1c19oZWFkZXJfY2FjaGVfcmV2YWxpZGF0ZSAoaGVhZGVyKTsKKworICBpZiAoaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcyA9PSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZmllbGQgaXMga25vd24gbm90IHRvIGV4aXN0LiBJdCBtYXkgZXhpc3QKKyAqIGV2ZW4gaWYgaXQncyBub3Qga25vd24gdG8gZXhpc3QuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGZpZWxkIGRlZmluaXRlbHkgZG9lc24ndCBleGlzdAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9jYWNoZV9rbm93bl9ub25leGlzdGVudCAoREJ1c0hlYWRlciAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBmaWVsZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKTsKKworICByZXR1cm4gKGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3MgPT0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX05PTkVYSVNURU5UKTsKK30KKworLyoqCisgKiBXcml0ZXMgYSBzdHJ1Y3Qgb2YgeyBieXRlLCB2YXJpYW50IH0gd2l0aCB0aGUgZ2l2ZW4gYmFzaWMgdHlwZS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgKHNob3VsZCBiZSByZWFkeSB0byB3cml0ZSBhIHN0cnVjdCkKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBhcyBmb3IgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMoKQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlX2Jhc2ljX2ZpZWxkIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAqdmFsdWUpCit7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1R5cGVXcml0ZXIgdmFyaWFudDsKKyAgaW50IHN0YXJ0OworICBpbnQgcGFkZGluZzsKKyAgdW5zaWduZWQgY2hhciBmaWVsZF9ieXRlOworICBEQnVzU3RyaW5nIGNvbnRhaW5lZF90eXBlOworICBjaGFyIGJ1ZlsyXTsKKworICBzdGFydCA9IHdyaXRlci0+dmFsdWVfcG9zOworICBwYWRkaW5nID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSAtIHN0YXJ0OworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAod3JpdGVyLCBEQlVTX1RZUEVfU1RSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsICZzdWIpKQorICAgIGdvdG8gYXBwZW5kX2ZhaWxlZDsKKworICBmaWVsZF9ieXRlID0gZmllbGQ7CisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfYnl0ZSkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGJ1ZlswXSA9IHR5cGU7CisgIGJ1ZlsxXSA9ICdcMCc7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmNvbnRhaW5lZF90eXBlLCBidWYsIDEpOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJnN1YiwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lZF90eXBlLCAwLCAmdmFyaWFudCkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ2YXJpYW50LCB0eXBlLCB2YWx1ZSkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICgmc3ViLCAmdmFyaWFudCkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gYXBwZW5kX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworIGFwcGVuZF9mYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHdyaXRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSAtIHN0YXJ0IC0gcGFkZGluZyk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZXRzIGEgc3RydWN0IG9mIHsgYnl0ZSwgdmFyaWFudCB9IHdpdGggdGhlIGdpdmVuIGJhc2ljIHR5cGUuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIChzaG91bGQgYmUgaXRlcmF0aW5nIG92ZXIgdGhlIGFycmF5IHBvaW50aW5nIGF0IHRoZSBmaWVsZCB0byBzZXQpCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYXMgZm9yIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljKCkKKyAqIEBwYXJhbSByZWFsaWduX3Jvb3Qgd2hlcmUgdG8gcmVhbGlnbiBmcm9tCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X2Jhc2ljX2ZpZWxkIChEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QpCit7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgREJ1c1R5cGVSZWFkZXIgdmFyaWFudDsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX0JZVEUpOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgeworICAgdW5zaWduZWQgY2hhciB2X0JZVEU7CisgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmc3ViLCAmdl9CWVRFKTsKKyAgIF9kYnVzX2Fzc2VydCAoKChpbnQpIHZfQllURSkgPT0gZmllbGQpOworIH0KKyNlbmRpZgorCisgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnN1YikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gdmFyaWFudCBmaWVsZD8iKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3ViLCAmdmFyaWFudCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnZhcmlhbnQpID09IHR5cGUpOworCisgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljICgmdmFyaWFudCwgdmFsdWUsIHJlYWxpZ25fcm9vdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcmV0dXJucyB0aGUgdHlwZQorICovCitpbnQKK19kYnVzX2hlYWRlcl9nZXRfbWVzc2FnZV90eXBlIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGludCB0eXBlOworCisgIHR5cGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZoZWFkZXItPmRhdGEsIFRZUEVfT0ZGU0VUKTsKKyAgX2RidXNfYXNzZXJ0ICh0eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpOworCisgIHJldHVybiB0eXBlOworfQorCisvKioKKyAqIFNldHMgdGhlIHNlcmlhbCBudW1iZXIgb2YgYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb25jZSBvbgorICogYSBoZWFkZXIuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gc2VyaWFsIHRoZSBzZXJpYWwKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX3NldF9zZXJpYWwgKERCdXNIZWFkZXIgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICBzZXJpYWwpCit7CisgIC8qIHdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgc2VyaWFsIG9uIG91dGdvaW5nCisgICAqIG1lc3NhZ2VzLCBhbmQgdG8gcmVzZXQgdGhlIHNlcmlhbCBpbiBkYnVzX21lc3NhZ2VfY29weTsKKyAgICogdGhpcyBhc3NlcnRpb24gc2hvdWxkIGNhdGNoIGEgZG91YmxlLXNldCBvbiBvdXRnb2luZy4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGVhZGVyX2dldF9zZXJpYWwgKGhlYWRlcikgPT0gMCB8fAorICAgICAgICAgICAgICAgIHNlcmlhbCA9PSAwKTsKKworICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSSUFMX09GRlNFVCwKKwkJCSAgICBzZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5ieXRlX29yZGVyKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwoKQorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHJldHVybnMgdGhlIGNsaWVudCBzZXJpYWwKKyAqLworZGJ1c191aW50MzJfdAorX2RidXNfaGVhZGVyX2dldF9zZXJpYWwgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgcmV0dXJuIF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKCZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJJQUxfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKy8qKgorICogUmUtaW5pdGlhbGl6ZXMgYSBoZWFkZXIgdGhhdCB3YXMgcHJldmlvdXNseSBpbml0aWFsaXplZCBhbmQgbmV2ZXIKKyAqIGZyZWVkLiAgQWZ0ZXIgdGhpcywgdG8gbWFrZSB0aGUgaGVhZGVyIHZhbGlkIHlvdSBoYXZlIHRvIGNhbGwKKyAqIF9kYnVzX2hlYWRlcl9jcmVhdGUoKS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIGhlYWRlciB0byByZS1pbml0aWFsaXplCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBieXRlIG9yZGVyIG9mIHRoZSBoZWFkZXIKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX3JlaW5pdCAoREJ1c0hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlcikKK3sKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZoZWFkZXItPmRhdGEsIDApOworCisgIGhlYWRlci0+Ynl0ZV9vcmRlciA9IGJ5dGVfb3JkZXI7CisgIGhlYWRlci0+cGFkZGluZyA9IDA7CisKKyAgX2RidXNfaGVhZGVyX2NhY2hlX2ludmFsaWRhdGVfYWxsIChoZWFkZXIpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgaGVhZGVyLCBidXQgZG9lc24ndCBwcmVwYXJlIGl0IGZvciB1c2U7CisgKiB0byBtYWtlIHRoZSBoZWFkZXIgdmFsaWQsIHlvdSBoYXZlIHRvIGNhbGwgX2RidXNfaGVhZGVyX2NyZWF0ZSgpLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgaGVhZGVyIHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIgb2YgdGhlIGhlYWRlcgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfaW5pdCAoREJ1c0hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkICgmaGVhZGVyLT5kYXRhLCAzMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hlYWRlcl9yZWluaXQgKGhlYWRlciwgYnl0ZV9vcmRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRnJlZXMgYSBoZWFkZXIuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl9mcmVlIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmaGVhZGVyLT5kYXRhKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBkZXN0IHdpdGggYSBjb3B5IG9mIHRoZSBnaXZlbiBoZWFkZXIuCisgKiBSZXNldHMgdGhlIG1lc3NhZ2Ugc2VyaWFsIHRvIDAgb24gdGhlIGNvcHkuCisgKgorICogQHBhcmFtIGhlYWRlciBoZWFkZXIgdG8gY29weQorICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gZm9yIGNvcHkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NvcHkgKGNvbnN0IERCdXNIZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICBEQnVzSGVhZGVyICAgICAgICpkZXN0KQoreworICAqZGVzdCA9ICpoZWFkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZkZXN0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhlYWRlci0+ZGF0YSwgMCwgJmRlc3QtPmRhdGEsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVzdC0+ZGF0YSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFJlc2V0IHRoZSBzZXJpYWwgKi8KKyAgX2RidXNfaGVhZGVyX3NldF9zZXJpYWwgKGRlc3QsIDApOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEZpbGxzIGluIHRoZSBwcmltYXJ5IGZpZWxkcyBvZiB0aGUgaGVhZGVyLCBzbyB0aGUgaGVhZGVyIGlzIHJlYWR5CisgKiBmb3IgdXNlLiAjTlVMTCBtYXkgYmUgc3BlY2lmaWVkIGZvciBzb21lIG9yIGFsbCBvZiB0aGUgZmllbGRzIHRvCisgKiBhdm9pZCBhZGRpbmcgdGhvc2UgZmllbGRzLiBTb21lIGNvbWJpbmF0aW9ucyBvZiBmaWVsZHMgZG9uJ3QgbWFrZQorICogc2Vuc2UsIGFuZCBwYXNzaW5nIHRoZW0gaW4gd2lsbCB0cmlnZ2VyIGFuIGFzc2VydGlvbiBmYWlsdXJlLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIG1lc3NhZ2VfdHlwZSB0aGUgbWVzc2FnZSB0eXBlCisgKiBAcGFyYW0gZGVzdGluYXRpb24gZGVzdGluYXRpb24gZmllbGQgb3IgI05VTEwKKyAqIEBwYXJhbSBwYXRoIHBhdGggZmllbGQgb3IgI05VTEwKKyAqIEBwYXJhbSBpbnRlcmZhY2UgaW50ZXJmYWNlIGZpZWxkIG9yICNOVUxMCisgKiBAcGFyYW0gbWVtYmVyIG1lbWJlciBmaWVsZCBvciAjTlVMTAorICogQHBhcmFtIGVycm9yX25hbWUgZXJyb3IgbmFtZSBvciAjTlVMTAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfY3JlYXRlIChEQnVzSGVhZGVyICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICptZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSkKK3sKKyAgdW5zaWduZWQgY2hhciB2X0JZVEU7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgYXJyYXk7CisKKyAgX2RidXNfYXNzZXJ0ICgoKGludGVyZmFjZSB8fCBtZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKSAmJiBtZW1iZXIpIHx8CisgICAgICAgICAgICAgICAgKGVycm9yX25hbWUpIHx8CisgICAgICAgICAgICAgICAgIShpbnRlcmZhY2UgfHwgbWVtYmVyIHx8IGVycm9yX25hbWUpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkgPT0gMCk7CisKKyAgaWYgKCFyZXNlcnZlX2hlYWRlcl9wYWRkaW5nIChoZWFkZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmd3JpdGVyLCBoZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBREVSX0VORF9CRUZPUkVfUEFERElORyAoaGVhZGVyKSk7CisKKyAgdl9CWVRFID0gaGVhZGVyLT5ieXRlX29yZGVyOworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQllURSkpCisgICAgZ290byBvb207CisKKyAgdl9CWVRFID0gbWVzc2FnZV90eXBlOworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQllURSkpCisgICAgZ290byBvb207CisKKyAgdl9CWVRFID0gMDsgLyogZmxhZ3MgKi8KKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0JZVEUpKQorICAgIGdvdG8gb29tOworCisgIHZfQllURSA9IERCVVNfTUFKT1JfUFJPVE9DT0xfVkVSU0lPTjsKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0JZVEUpKQorICAgIGdvdG8gb29tOworCisgIHZfVUlOVDMyID0gMDsgLyogYm9keSBsZW5ndGggKi8KKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfVUlOVDMyKSkKKyAgICBnb3RvIG9vbTsKKworICB2X1VJTlQzMiA9IDA7IC8qIHNlcmlhbCAqLworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJndyaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyYXkpKQorICAgIGdvdG8gb29tOworCisgIC8qIE1hcnNoYWwgYWxsIHRoZSBmaWVsZHMgKE1hcnNoYWxsIEZpZWxkcz8pICovCisKKyAgaWYgKHBhdGggIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX09CSkVDVF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGRlc3RpbmF0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RpbmF0aW9uKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmIChpbnRlcmZhY2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZmFjZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAobWVtYmVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW1iZXIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGVycm9yX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9uYW1lKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICgmd3JpdGVyLCAmYXJyYXkpKQorICAgIGdvdG8gb29tOworCisgIGNvcnJlY3RfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZoZWFkZXItPmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKSAtIGhlYWRlci0+cGFkZGluZyk7CisgIGNvcnJlY3RfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdpdmVuIGRhdGEgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGJvZHkKKyAqIGFuZCB0aGUgZmllbGRzIGFycmF5LCBjaGVjayB3aGV0aGVyIHRoZSBkYXRhIGlzIGxvbmcgZW5vdWdoIHRvCisgKiBjb250YWluIHRoZSBlbnRpcmUgbWVzc2FnZSAoYXNzdW1pbmcgdGhlIGNsYWltZWQgbGVuZ3RocyBhcmUKKyAqIGFjY3VyYXRlKS4gQWxzbyBjaGVja3MgdGhhdCB0aGUgbGVuZ3RocyBhcmUgaW4gc2FuaXR5IHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIG1heF9tZXNzYWdlX2xlbmd0aCBtYXhpbXVtIGxlbmd0aCBvZiBhIHZhbGlkIG1lc3NhZ2UKKyAqIEBwYXJhbSB2YWxpZGl0eSByZXR1cm4gbG9jYXRpb24gZm9yIHdoeSB0aGUgZGF0YSBpcyBpbnZhbGlkIGlmIGl0IGlzCisgKiBAcGFyYW0gYnl0ZV9vcmRlciByZXR1cm4gbG9jYXRpb24gZm9yIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBmaWVsZHNfYXJyYXlfbGVuIHJldHVybiBsb2NhdGlvbiBmb3IgY2xhaW1lZCBmaWVsZHMgYXJyYXkgbGVuZ3RoCisgKiBAcGFyYW0gaGVhZGVyX2xlbiByZXR1cm4gbG9jYXRpb24gZm9yIGNsYWltZWQgaGVhZGVyIGxlbmd0aAorICogQHBhcmFtIGJvZHlfbGVuIHJldHVybiBsb2NhdGlvbiBmb3IgY2xhaW1lZCBib2R5IGxlbmd0aAorICogQHBhcmFtIHN0ciB0aGUgZGF0YQorICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIGRhdGEsIDgtYWxpZ25lZAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGRhdGEgaXMgbG9uZyBlbm91Z2ggZm9yIHRoZSBjbGFpbWVkIGxlbmd0aCwgYW5kIHRoZSBsZW5ndGhzIHdlcmUgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkIChpbnQgICAgICAgICAgICAgICAgbWF4X21lc3NhZ2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICp2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKKworeworICBkYnVzX3VpbnQzMl90IGhlYWRlcl9sZW5fdW5zaWduZWQ7CisgIGRidXNfdWludDMyX3QgZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZDsKKyAgZGJ1c191aW50MzJfdCBib2R5X2xlbl91bnNpZ25lZDsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDwgX0RCVVNfSU5UMzJfTUFYIC8gMik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPT0gKGludCkgX0RCVVNfQUxJR05fVkFMVUUgKHN0YXJ0LCA4KSk7CisKKyAgKmJ5dGVfb3JkZXIgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgc3RhcnQgKyBCWVRFX09SREVSX09GRlNFVCk7CisKKyAgaWYgKCpieXRlX29yZGVyICE9IERCVVNfTElUVExFX0VORElBTiAmJiAqYnl0ZV9vcmRlciAhPSBEQlVTX0JJR19FTkRJQU4pCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9CWVRFX09SREVSOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUICsgNCA8PSBsZW4pOworICBmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBzdGFydCArIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfb3JkZXIsIE5VTEwpOworCisgIGlmIChmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkID4gKHVuc2lnbmVkKSBtYXhfbWVzc2FnZV9sZW5ndGgpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0lOU0FORV9GSUVMRFNfQVJSQVlfTEVOR1RIOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKEJPRFlfTEVOR1RIX09GRlNFVCArIDQgPCBsZW4pOworICBib2R5X2xlbl91bnNpZ25lZCA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHN0ciwgc3RhcnQgKyBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfb3JkZXIsIE5VTEwpOworCisgIGlmIChib2R5X2xlbl91bnNpZ25lZCA+ICh1bnNpZ25lZCkgbWF4X21lc3NhZ2VfbGVuZ3RoKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9JTlNBTkVfQk9EWV9MRU5HVEg7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGhlYWRlcl9sZW5fdW5zaWduZWQgPSBGSVJTVF9GSUVMRF9PRkZTRVQgKyBmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkOworICBoZWFkZXJfbGVuX3Vuc2lnbmVkID0gX0RCVVNfQUxJR05fVkFMVUUgKGhlYWRlcl9sZW5fdW5zaWduZWQsIDgpOworCisgIC8qIG92ZXJmbG93IHNob3VsZCBiZSBpbXBvc3NpYmxlIHNpbmNlIHRoZSBsZW5ndGhzIGFyZW4ndCBhbGxvd2VkIHRvCisgICAqIGJlIGh1Z2UuCisgICAqLworICBfZGJ1c19hc3NlcnQgKG1heF9tZXNzYWdlX2xlbmd0aCA8IF9EQlVTX0lOVDMyX01BWCAvIDIpOworICBpZiAoYm9keV9sZW5fdW5zaWduZWQgKyBoZWFkZXJfbGVuX3Vuc2lnbmVkID4gKHVuc2lnbmVkKSBtYXhfbWVzc2FnZV9sZW5ndGgpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkc7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYm9keV9sZW5fdW5zaWduZWQgPCAodW5zaWduZWQpIF9EQlVTX0lOVDMyX01BWCk7CisgIF9kYnVzX2Fzc2VydCAoZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZCA8ICh1bnNpZ25lZCkgX0RCVVNfSU5UMzJfTUFYKTsKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXJfbGVuX3Vuc2lnbmVkIDwgKHVuc2lnbmVkKSBfREJVU19JTlQzMl9NQVgpOworCisgICpib2R5X2xlbiA9IGJvZHlfbGVuX3Vuc2lnbmVkOworICAqZmllbGRzX2FycmF5X2xlbiA9IGZpZWxkc19hcnJheV9sZW5fdW5zaWduZWQ7CisgICpoZWFkZXJfbGVuID0gaGVhZGVyX2xlbl91bnNpZ25lZDsKKworICAqdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworCisgIF9kYnVzX3ZlcmJvc2UgKCJoYXZlICVkIGJ5dGVzLCBuZWVkIGJvZHkgJXUgKyBoZWFkZXIgJXUgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgbGVuLCBib2R5X2xlbl91bnNpZ25lZCwgaGVhZGVyX2xlbl91bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgYm9keV9sZW5fdW5zaWduZWQgKyBoZWFkZXJfbGVuX3Vuc2lnbmVkKTsKKworICByZXR1cm4gKGJvZHlfbGVuX3Vuc2lnbmVkICsgaGVhZGVyX2xlbl91bnNpZ25lZCkgPD0gKHVuc2lnbmVkKSBsZW47Cit9CisKK3N0YXRpYyBEQnVzVmFsaWRpdHkKK2NoZWNrX21hbmRhdG9yeV9maWVsZHMgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyNkZWZpbmUgUkVRVUlSRV9GSUVMRChuYW1lKSBkbyB7IGlmIChoZWFkZXItPmZpZWxkc1tEQlVTX0hFQURFUl9GSUVMRF8jI25hbWVdLnZhbHVlX3BvcyA8IDApIHJldHVybiBEQlVTX0lOVkFMSURfTUlTU0lOR18jI25hbWU7IH0gd2hpbGUgKDApCisKKyAgc3dpdGNoIChfZGJ1c19oZWFkZXJfZ2V0X21lc3NhZ2VfdHlwZSAoaGVhZGVyKSkKKyAgICB7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisgICAgICBSRVFVSVJFX0ZJRUxEIChJTlRFUkZBQ0UpOworICAgICAgLyogRkFMTCBUSFJVIC0gc2lnbmFscyBhbHNvIHJlcXVpcmUgdGhlIHBhdGggYW5kIG1lbWJlciAqLworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICBSRVFVSVJFX0ZJRUxEIChQQVRIKTsKKyAgICAgIFJFUVVJUkVfRklFTEQgKE1FTUJFUik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgUkVRVUlSRV9GSUVMRCAoRVJST1JfTkFNRSk7CisgICAgICBSRVFVSVJFX0ZJRUxEIChSRVBMWV9TRVJJQUwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgICAgUkVRVUlSRV9GSUVMRCAoUkVQTFlfU0VSSUFMKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBvdGhlciBtZXNzYWdlIHR5cGVzIGFsbG93ZWQgYnV0IGlnbm9yZWQgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gREJVU19WQUxJRDsKK30KKworc3RhdGljIERCdXNWYWxpZGl0eQorbG9hZF9hbmRfdmFsaWRhdGVfZmllbGQgKERCdXNIZWFkZXIgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICp2YXJpYW50X3JlYWRlcikKK3sKKyAgaW50IHR5cGU7CisgIGludCBleHBlY3RlZF90eXBlOworICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHI7CisgIGludCB2YWx1ZV9wb3M7CisgIGludCBzdHJfZGF0YV9wb3M7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIGludCBiYWRfc3RyaW5nX2NvZGU7CisgIGRidXNfYm9vbF90ICgqIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMpIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBsZW4pOworCisgIC8qIFN1cHBvc2VkIHRvIGhhdmUgYmVlbiBjaGVja2VkIGFscmVhZHkgKi8KKyAgX2RidXNfYXNzZXJ0IChmaWVsZCA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKTsKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCAhPSBEQlVTX0hFQURFUl9GSUVMRF9JTlZBTElEKTsKKworICAvKiBCZWZvcmUgd2UgY2FuIGNhY2hlIGEgZmllbGQsIHdlIG5lZWQgdG8ga25vdyBpdCBoYXMgdGhlIHJpZ2h0IHR5cGUgKi8KKyAgdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHZhcmlhbnRfcmVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hlYWRlcl9maWVsZF90eXBlc1tmaWVsZF0uY29kZSA9PSBmaWVsZCk7CisKKyAgZXhwZWN0ZWRfdHlwZSA9IEVYUEVDVEVEX1RZUEVfT0ZfRklFTEQgKGZpZWxkKTsKKyAgaWYgKHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmllbGQgJWQgc2hvdWxkIGhhdmUgdHlwZSAlZCBidXQgaGFzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZmllbGQsIGV4cGVjdGVkX3R5cGUsIHR5cGUpOworICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfSEFTX1dST05HX1RZUEU7CisgICAgfQorCisgIC8qIElmIHRoZSBmaWVsZCB3YXMgcHJvdmlkZWQgdHdpY2UsIHdlIGFyZW4ndCBoYXBweSAqLworICBpZiAoaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcyA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJIZWFkZXIgZmllbGQgJWQgc2VlbiBhIHNlY29uZCB0aW1lXG4iLCBmaWVsZCk7CisgICAgICByZXR1cm4gREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9BUFBFQVJTX1RXSUNFOworICAgIH0KKworICAvKiBOb3cgd2UgY2FuIGNhY2hlIGFuZCBsb29rIGF0IHRoZSBmaWVsZCBjb250ZW50ICovCisgIF9kYnVzX3ZlcmJvc2UgKCJpbml0aWFsbHkgY2FjaGluZyBmaWVsZCAlZFxuIiwgZmllbGQpOworICBfZGJ1c19oZWFkZXJfY2FjaGVfb25lIChoZWFkZXIsIGZpZWxkLCB2YXJpYW50X3JlYWRlcik7CisKKyAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IE5VTEw7CisKKyAgLyogbWFrZSBjb21waWxlciBoYXBweSB0aGF0IGFsbCB0aGlzIGlzIGluaXRpYWxpemVkICovCisgIHZfVUlOVDMyID0gMDsKKyAgdmFsdWVfc3RyID0gTlVMTDsKKyAgdmFsdWVfcG9zID0gLTE7CisgIHN0cl9kYXRhX3BvcyA9IC0xOworICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX1ZBTElEOworCisgIGlmIChleHBlY3RlZF90eXBlID09IERCVVNfVFlQRV9VSU5UMzIpCisgICAgeworICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoaGVhZGVyLCBmaWVsZCwgZXhwZWN0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1VJTlQzMik7CisgICAgfQorICBlbHNlIGlmIChleHBlY3RlZF90eXBlID09IERCVVNfVFlQRV9TVFJJTkcgfHwKKyAgICAgICAgICAgZXhwZWN0ZWRfdHlwZSA9PSBEQlVTX1RZUEVfT0JKRUNUX1BBVEggfHwKKyAgICAgICAgICAgZXhwZWN0ZWRfdHlwZSA9PSBEQlVTX1RZUEVfU0lHTkFUVVJFKQorICAgIHsKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3IChoZWFkZXIsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9zdHIsICZ2YWx1ZV9wb3MpOworICAgICAgc3RyX2RhdGFfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHZhbHVlX3BvcywgNCkgKyA0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vbmUgb2YgdGhlIGtub3duIGZpZWxkcyBzaG91bGQgaGF2ZSB0aGlzIHR5cGUiKTsKKyAgICB9CisKKyAgc3dpdGNoIChmaWVsZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTjoKKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZTsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT047CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRToKKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2U7CisgICAgICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX0lOVkFMSURfQkFEX0lOVEVSRkFDRTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZfZGJ1c19sb2NhbF9pbnRlcmZhY2Vfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZfZGJ1c19sb2NhbF9pbnRlcmZhY2Vfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHN0cl9kYXRhX3BvcykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSBpcyBvbiB0aGUgbG9jYWwgaW50ZXJmYWNlXG4iKTsKKyAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfTUVNQkVSOgorICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IF9kYnVzX3ZhbGlkYXRlX21lbWJlcjsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfTUVNQkVSOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUU6CisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZTsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfRVJST1JfTkFNRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVI6CisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gX2RidXNfdmFsaWRhdGVfYnVzX25hbWU7CisgICAgICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX0lOVkFMSURfQkFEX1NFTkRFUjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9QQVRIOgorICAgICAgLyogT0JKRUNUX1BBVEggd2FzIHZhbGlkYXRlZCBnZW5lcmljYWxseSBkdWUgdG8gaXRzIHR5cGUgKi8KKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBOVUxMOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJl9kYnVzX2xvY2FsX3BhdGhfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZfZGJ1c19sb2NhbF9wYXRoX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCBzdHJfZGF0YV9wb3MpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgaXMgZnJvbSB0aGUgbG9jYWwgcGF0aFxuIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX1BBVEg7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9SRVBMWV9TRVJJQUw6CisgICAgICAvKiBDYW4ndCBiZSAwICovCisgICAgICBpZiAodl9VSU5UMzIgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQkFEX1NFUklBTDsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTOgorICAgICAgLyogRXZlcnkgdmFsdWUgbWFrZXMgc2Vuc2UgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkU6CisgICAgICAvKiBTSUdOQVRVUkUgdmFsaWRhdGVkIGdlbmVyaWNhbGx5IGR1ZSB0byBpdHMgdHlwZSAqLworICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IE5VTEw7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmtub3duIGZpZWxkIHNob3VsZG4ndCBiZSBzZWVuIGhlcmUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoc3RyaW5nX3ZhbGlkYXRpb25fZnVuYykKKyAgICB7CisgICAgICBkYnVzX3VpbnQzMl90IGxlbjsKKworICAgICAgX2RidXNfYXNzZXJ0IChiYWRfc3RyaW5nX2NvZGUgIT0gREJVU19WQUxJRCk7CisKKyAgICAgIGxlbiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHZhbHVlX3N0ciwgdmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5ieXRlX29yZGVyLCBOVUxMKTsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJWYWxpZGF0aW5nIHN0cmluZyBoZWFkZXIgZmllbGQ7IGNvZGUgJWQgaWYgZmFpbHNcbiIsCisgICAgICAgICAgICAgICAgICAgICBiYWRfc3RyaW5nX2NvZGUpOworI2VuZGlmCisgICAgICBpZiAoISgqc3RyaW5nX3ZhbGlkYXRpb25fZnVuYykgKHZhbHVlX3N0ciwgc3RyX2RhdGFfcG9zLCBsZW4pKQorICAgICAgICByZXR1cm4gYmFkX3N0cmluZ19jb2RlOworICAgIH0KKworICByZXR1cm4gREJVU19WQUxJRDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbWVzc2FnZSBoZWFkZXIgZnJvbSBwb3RlbnRpYWxseS11bnRydXN0ZWQgZGF0YS4gVGhlCisgKiByZXR1cm4gdmFsdWUgaXMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgYW5kIHRoZSBkYXRhIHdhcworICogdmFsaWQuIElmIGl0IHJldHVybnMgI1RSVUUsIHRoZSBoZWFkZXIgd2lsbCBiZSBjcmVhdGVkLiBJZiBpdAorICogcmV0dXJucyAjRkFMU0UgYW5kICp2YWxpZGl0eSA9PSAjREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUiwgCisgKiB0aGVuIHRoZXJlIHdhc24ndCBlbm91Z2ggbWVtb3J5LiAgSWYgaXQgcmV0dXJucyAjRkFMU0UgCisgKiBhbmQgKnZhbGlkaXR5ICE9ICNEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SIHRoZW4gdGhlIGRhdGEgd2FzIAorICogaW52YWxpZC4KKyAqCisgKiBUaGUgYnl0ZV9vcmRlciwgZmllbGRzX2FycmF5X2xlbiwgYW5kIGJvZHlfbGVuIGFyZ3Mgc2hvdWxkIGJlIGZyb20KKyAqIF9kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkKCkuIFZhbGlkYXRpb24gcGVyZm9ybWVkIGluCisgKiBfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZCgpIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuCisgKiBhbHJlYWR5IGRvbmUuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyIChtdXN0IGJlIGluaXRpYWxpemVkKQorICogQHBhcmFtIG1vZGUgd2hldGhlciB0byBkbyB2YWxpZGF0aW9uCisgKiBAcGFyYW0gdmFsaWRpdHkgcmV0dXJuIGxvY2F0aW9uIGZvciBpbnZhbGlkaXR5IHJlYXNvbgorICogQHBhcmFtIGJ5dGVfb3JkZXIgYnl0ZSBvcmRlciBmcm9tIGhlYWRlcgorICogQHBhcmFtIGZpZWxkc19hcnJheV9sZW4gY2xhaW1lZCBsZW5ndGggb2YgZmllbGRzIGFycmF5CisgKiBAcGFyYW0gYm9keV9sZW4gY2xhaW1lZCBsZW5ndGggb2YgYm9keQorICogQHBhcmFtIGhlYWRlcl9sZW4gY2xhaW1lZCBsZW5ndGggb2YgaGVhZGVyCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgaGVhZGVyLCA4LWFsaWduZWQKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHN0cmluZyB0byBsb29rIGF0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5IG9yIGRhdGEgd2FzIGludmFsaWQsICNUUlVFIG90aGVyd2lzZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2xvYWQgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkYXRpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgKnZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBpbnQgbGVmdG92ZXI7CisgIERCdXNWYWxpZGl0eSB2OworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlUmVhZGVyIGFycmF5X3JlYWRlcjsKKyAgdW5zaWduZWQgY2hhciB2X2J5dGU7CisgIGRidXNfdWludDMyX3Qgdl91aW50MzI7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBpbnQgcGFkZGluZ19zdGFydDsKKyAgaW50IHBhZGRpbmdfbGVuOworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID09IChpbnQpIF9EQlVTX0FMSUdOX1ZBTFVFIChzdGFydCwgOCkpOworICBfZGJ1c19hc3NlcnQgKGhlYWRlcl9sZW4gPD0gbGVuKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSkgPT0gMCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKHN0ciwgc3RhcnQsIGhlYWRlcl9sZW4sICZoZWFkZXItPmRhdGEsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY29weSBidWZmZXIgaW50byBuZXcgaGVhZGVyXG4iKTsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtb2RlID09IERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZKQorICAgIHsKKyAgICAgIGxlZnRvdmVyID0gbGVuIC0gaGVhZGVyX2xlbiAtIGJvZHlfbGVuIC0gc3RhcnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdiA9IF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gKCZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0b3ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHN0YXJ0LCBsZW4pOworICAgICAgCisgICAgICBpZiAodiAhPSBEQlVTX1ZBTElEKQorICAgICAgICB7CisgICAgICAgICAgKnZhbGlkaXR5ID0gdjsKKyAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChsZWZ0b3ZlciA8IGxlbik7CisKKyAgcGFkZGluZ19sZW4gPSBoZWFkZXJfbGVuIC0gKEZJUlNUX0ZJRUxEX09GRlNFVCArIGZpZWxkc19hcnJheV9sZW4pOworICBwYWRkaW5nX3N0YXJ0ID0gc3RhcnQgKyBGSVJTVF9GSUVMRF9PRkZTRVQgKyBmaWVsZHNfYXJyYXlfbGVuOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ICsgaGVhZGVyX2xlbiA9PSAoaW50KSBfREJVU19BTElHTl9WQUxVRSAocGFkZGluZ19zdGFydCwgOCkpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ICsgaGVhZGVyX2xlbiA9PSBwYWRkaW5nX3N0YXJ0ICsgcGFkZGluZ19sZW4pOworCisgIGlmIChtb2RlICE9IERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAoc3RyLCBwYWRkaW5nX3N0YXJ0LCBwYWRkaW5nX2xlbikpCisgICAgICAgIHsKKyAgICAgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaGVhZGVyLT5wYWRkaW5nID0gcGFkZGluZ19sZW47CisKKyAgaWYgKG1vZGUgPT0gREJVU19WQUxJREFUSU9OX01PREVfV0VfVFJVU1RfVEhJU19EQVRBX0FCU09MVVRFTFkpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBXZSBub3cga25vdyB0aGUgZGF0YSBpcyB3ZWxsLWZvcm1lZCwgYnV0IHdlIGhhdmUgdG8gY2hlY2sgdGhhdAorICAgKiBpdCdzIHZhbGlkLgorICAgKi8KKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgc3RhcnQpOworCisgIC8qIEJZVEUgT1JERVIgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gQllURV9PUkRFUl9PRkZTRVQpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhZGVyLCAmdl9ieXRlKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0ICh2X2J5dGUgPT0gYnl0ZV9vcmRlcik7CisgIGhlYWRlci0+Ynl0ZV9vcmRlciA9IGJ5dGVfb3JkZXI7CisKKyAgLyogTUVTU0FHRSBUWVBFICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IFRZUEVfT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnZfYnl0ZSk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworCisgIC8qIHVua25vd24gbWVzc2FnZSB0eXBlcyBhcmUgc3VwcG9zZWQgdG8gYmUgaWdub3JlZCwgc28gb25seSB2YWxpZGF0aW9uIGhlcmUgaXMKKyAgICogdGhhdCBpdCBpc24ndCBpbnZhbGlkCisgICAqLworICBpZiAodl9ieXRlID09IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEU7CisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgIC8qIEZMQUdTICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IEZMQUdTX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZ2X2J5dGUpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICAvKiB1bmtub3duIGZsYWdzIHNob3VsZCBiZSBpZ25vcmVkICovCisKKyAgLyogUFJPVE9DT0wgVkVSU0lPTiAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBWRVJTSU9OX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZ2X2J5dGUpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICBpZiAodl9ieXRlICE9IERCVVNfTUFKT1JfUFJPVE9DT0xfVkVSU0lPTikKKyAgICB7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX1BST1RPQ09MX1ZFUlNJT047CisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgIC8qIEJPRFkgTEVOR1RIICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX1VJTlQzMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gQk9EWV9MRU5HVEhfT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnZfdWludDMyKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChib2R5X2xlbiA9PSAoc2lnbmVkKSB2X3VpbnQzMik7CisKKyAgLyogU0VSSUFMICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX1VJTlQzMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gU0VSSUFMX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZzZXJpYWwpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICBpZiAoc2VyaWFsID09IDApCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9TRVJJQUw7CisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJmFycmF5X3JlYWRlcik7CisgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXlfcmVhZGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciBzdHJ1Y3RfcmVhZGVyOworICAgICAgREJ1c1R5cGVSZWFkZXIgdmFyaWFudF9yZWFkZXI7CisgICAgICB1bnNpZ25lZCBjaGFyIGZpZWxkX2NvZGU7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5X3JlYWRlcikgPT0gREJVU19UWVBFX1NUUlVDVCk7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZhcnJheV9yZWFkZXIsICZzdHJ1Y3RfcmVhZGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3RydWN0X3JlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnN0cnVjdF9yZWFkZXIsICZmaWVsZF9jb2RlKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdHJ1Y3RfcmVhZGVyKTsKKworICAgICAgaWYgKGZpZWxkX2NvZGUgPT0gREJVU19IRUFERVJfRklFTERfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbnZhbGlkIGhlYWRlciBmaWVsZCBjb2RlXG4iKTsKKyAgICAgICAgICAqdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0NPREU7CisgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICB9CisKKyAgICAgIGlmIChmaWVsZF9jb2RlID4gREJVU19IRUFERVJfRklFTERfTEFTVCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmtub3duIGhlYWRlciBmaWVsZCBjb2RlICVkLCBza2lwcGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9jb2RlKTsKKyAgICAgICAgICBnb3RvIG5leHRfZmllbGQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3RydWN0X3JlYWRlcikgPT0gREJVU19UWVBFX1ZBUklBTlQpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnN0cnVjdF9yZWFkZXIsICZ2YXJpYW50X3JlYWRlcik7CisKKyAgICAgIHYgPSBsb2FkX2FuZF92YWxpZGF0ZV9maWVsZCAoaGVhZGVyLCBmaWVsZF9jb2RlLCAmdmFyaWFudF9yZWFkZXIpOworICAgICAgaWYgKHYgIT0gREJVU19WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaWVsZCAlZCB3YXMgaW52YWxpZFxuIiwgZmllbGRfY29kZSk7CisgICAgICAgICAgKnZhbGlkaXR5ID0gdjsKKyAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIH0KKworICAgIG5leHRfZmllbGQ6CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXlfcmVhZGVyKTsKKyAgICB9CisKKyAgLyogQW55dGhpbmcgd2UgZGlkbid0IGZpbGwgaW4gaXMgbm93IGtub3duIG5vdCB0byBleGlzdCAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPD0gREJVU19IRUFERVJfRklFTERfTEFTVCkKKyAgICB7CisgICAgICBpZiAoaGVhZGVyLT5maWVsZHNbaV0udmFsdWVfcG9zID09IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9VTktOT1dOKQorICAgICAgICBoZWFkZXItPmZpZWxkc1tpXS52YWx1ZV9wb3MgPSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQ7CisgICAgICArK2k7CisgICAgfQorCisgIHYgPSBjaGVja19tYW5kYXRvcnlfZmllbGRzIChoZWFkZXIpOworICBpZiAodiAhPSBEQlVTX1ZBTElEKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJNYW5kYXRvcnkgZmllbGRzIHdlcmUgbWlzc2luZywgY29kZSAlZFxuIiwgdik7CisgICAgICAqdmFsaWRpdHkgPSB2OworICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKworICAqdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICByZXR1cm4gVFJVRTsKKworIGludmFsaWQ6CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhLCAwKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZpbGxzIGluIHRoZSBjb3JyZWN0IGJvZHkgbGVuZ3RoLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGJvZHlfbGVuIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX3VwZGF0ZV9sZW5ndGhzIChEQnVzSGVhZGVyICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGJvZHlfbGVuKQoreworICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+Ynl0ZV9vcmRlcik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF9maWVsZF9mb3JfbW9kaWZpY2F0aW9uIChEQnVzSGVhZGVyICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0IChyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWxpZ25fcm9vdCwgcmVhZGVyKTsKKworICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICB1bnNpZ25lZCBjaGFyIGZpZWxkX2NvZGU7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX0JZVEUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnN1YiwgJmZpZWxkX2NvZGUpOworCisgICAgICBpZiAoZmllbGRfY29kZSA9PSAodW5zaWduZWQpIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpID09IERCVVNfVFlQRV9TVFJVQ1QpOworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcik7CisgICAgfQorCisgZG9uZToKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHdpdGggYmFzaWMgdHlwZS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nCisgKiB2YWx1ZSwgaXQgaXNuJ3QgYWxsb3dlZCB0byBiZSAjTlVMTC4gSWYgdGhlIGZpZWxkIGRvZXNuJ3QgZXhpc3QsCisgKiBpdCB3aWxsIGJlIGNyZWF0ZWQuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIHNldAorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGFzIGZvciBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYygpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljIChEQnVzSGVhZGVyICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKTsKKworICBpZiAoIXJlc2VydmVfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIElmIHRoZSBmaWVsZCBleGlzdHMgd2Ugc2V0LCBvdGhlcndpc2Ugd2UgYXBwZW5kICovCisgIGlmIChfZGJ1c19oZWFkZXJfY2FjaGVfY2hlY2sgKGhlYWRlciwgZmllbGQpKQorICAgIHsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHJlYWxpZ25fcm9vdDsKKworICAgICAgaWYgKCFmaW5kX2ZpZWxkX2Zvcl9tb2RpZmljYXRpb24gKGhlYWRlciwgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgJnJlYWxpZ25fcm9vdCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZpZWxkIHdhcyBtYXJrZWQgcHJlc2VudCBpbiBjYWNoZSBidXQgd2Fzbid0IGZvdW5kIik7CisKKyAgICAgIGlmICghc2V0X2Jhc2ljX2ZpZWxkICgmcmVhZGVyLCBmaWVsZCwgdHlwZSwgdmFsdWUsICZyZWFsaWduX3Jvb3QpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICAgICAgREJ1c1R5cGVXcml0ZXIgYXJyYXk7CisKKyAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdmFsdWVzX29ubHkgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisKKyAgICAgIC8qIHJlY3Vyc2UgaW50byBhcnJheSB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IGxlbmd0aCwgYW5kIGp1bXAgdG8KKyAgICAgICAqIGVuZCBvZiBhcnJheS4KKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9hcHBlbmRfYXJyYXkgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9FTEVNRU5UX1NJR05BVFVSRV9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycmF5KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmVjdXJzZSBpbnRvIEFSUkFZIHNob3VsZCBub3QgaGF2ZSB1c2VkIG1lbW9yeSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGFycmF5LnUuYXJyYXkubGVuX3BvcyA9PSBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGFycmF5LnUuYXJyYXkuc3RhcnRfcG9zID09IEZJUlNUX0ZJRUxEX09GRlNFVCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGFycmF5LnZhbHVlX3BvcyA9PSBIRUFERVJfRU5EX0JFRk9SRV9QQURESU5HIChoZWFkZXIpKTsKKworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsIHR5cGUsIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAoJndyaXRlciwgJmFycmF5KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5yZWN1cnNlIGZyb20gQVJSQVkgc2hvdWxkIG5vdCBoYXZlIHVzZWQgbWVtb3J5Iik7CisgICAgfQorCisgIGNvcnJlY3RfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcik7CisKKyAgLyogV2UgY291bGQgYmUgc21hcnRlciBhYm91dCB0aGlzIChvbmx5IGludmFsaWRhdGUgZmllbGRzIGFmdGVyIHRoZQorICAgKiBvbmUgd2UgbW9kaWZpZWQsIG9yIGV2ZW4gb25seSBpZiB0aGUgb25lIHdlIG1vZGlmaWVkIGNoYW5nZWQKKyAgICogbGVuZ3RoKS4gQnV0IHRoaXMgaGFjayBpcyBhIHN0YXJ0LgorICAgKi8KKyAgX2RidXNfaGVhZGVyX2NhY2hlX2ludmFsaWRhdGVfYWxsIChoZWFkZXIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIG9mIGEgZmllbGQgd2l0aCBiYXNpYyB0eXBlLiBJZiB0aGUgZmllbGQKKyAqIGRvZXNuJ3QgZXhpc3QsIHJldHVybnMgI0ZBTFNFLCBvdGhlcndpc2UgcmV0dXJucyAjVFJVRS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gZ2V0CisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYXMgZm9yIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYygpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGZpZWxkIGRvZXNuJ3QgZXhpc3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKERCdXNIZWFkZXIgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnZhbHVlKQoreworICBfZGJ1c19hc3NlcnQgKGZpZWxkICE9IERCVVNfSEVBREVSX0ZJRUxEX0lOVkFMSUQpOworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hlYWRlcl9maWVsZF90eXBlc1tmaWVsZF0uY29kZSA9PSBmaWVsZCk7CisgIC8qIGluIGxpZ2h0IG9mIHRoaXMgeW91IG1pZ2h0IGFzayB3aHkgdGhlIHR5cGUgaXMgcGFzc2VkIGluOworICAgKiB0aGUgb25seSByYXRpb25hbGUgSSBjYW4gdGhpbmsgb2YgaXMgc28gdGhlIGNhbGxlciBoYXMKKyAgICogdG8gc3BlY2lmeSBpdHMgZXhwZWN0YXRpb24gYW5kIGJyZWFrcyBpZiB3ZSBjaGFuZ2UgaXQKKyAgICovCisgIF9kYnVzX2Fzc2VydCAodHlwZSA9PSBFWFBFQ1RFRF9UWVBFX09GX0ZJRUxEIChmaWVsZCkpOworCisgIGlmICghX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChoZWFkZXIsIGZpZWxkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID49IDApOworCisgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAoJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHZhbHVlLCBoZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcmF3IG1hcnNoYWxlZCBkYXRhIGZvciBhIGZpZWxkLiBJZiB0aGUgZmllbGQgZG9lc24ndAorICogZXhpc3QsIHJldHVybnMgI0ZBTFNFLCBvdGhlcndpc2UgcmV0dXJucyAjVFJVRS4gIFJldHVybnMgdGhlIHN0YXJ0CisgKiBvZiB0aGUgbWFyc2hhbGVkIGRhdGEsIGkuZS4gdXN1YWxseSB0aGUgYnl0ZSB3aGVyZSB0aGUgbGVuZ3RoCisgKiBzdGFydHMgKGZvciBzdHJpbmdzIGFuZCBhcnJheXMpIG9yIGZvciBiYXNpYyB0eXBlcyBqdXN0IHRoZSB2YWx1ZQorICogaXRzZWxmLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBnZXQKKyAqIEBwYXJhbSBzdHIgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgZGF0YSBzdHJpbmcKKyAqIEBwYXJhbSBwb3MgcmV0dXJuIGxvY2F0aW9uIGZvciBzdGFydCBvZiBmaWVsZCB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqcG9zKQoreworICBpZiAoIV9kYnVzX2hlYWRlcl9jYWNoZV9jaGVjayAoaGVhZGVyLCBmaWVsZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChzdHIpCisgICAgKnN0ciA9ICZoZWFkZXItPmRhdGE7CisgIGlmIChwb3MpCisgICAgKnBvcyA9IGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3M7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRGVsZXRlcyBhIGZpZWxkLCBpZiBpdCBleGlzdHMuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIGRlbGV0ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2RlbGV0ZV9maWVsZCAoREJ1c0hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZmllbGQpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhbGlnbl9yb290OworCisgIGlmIChfZGJ1c19oZWFkZXJfY2FjaGVfa25vd25fbm9uZXhpc3RlbnQgKGhlYWRlciwgZmllbGQpKQorICAgIHJldHVybiBUUlVFOyAvKiBub3RoaW5nIHRvIGRvICovCisKKyAgLyogU2NhbiB0byB0aGUgZmllbGQgd2Ugd2FudCwgZGVsZXRlIGFuZCByZWFsaWduLCByZWFwcGVuZAorICAgKiBwYWRkaW5nLiBGaWVsZCBtYXkgdHVybiBvdXQgbm90IHRvIGV4aXN0LgorICAgKi8KKyAgaWYgKCFmaW5kX2ZpZWxkX2Zvcl9tb2RpZmljYXRpb24gKGhlYWRlciwgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCAmcmVhbGlnbl9yb290KSkKKyAgICByZXR1cm4gVFJVRTsgLyogbm90aGluZyB0byBkbyAqLworCisgIGlmICghcmVzZXJ2ZV9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9kZWxldGUgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhbGlnbl9yb290KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29ycmVjdF9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKTsKKworICBfZGJ1c19oZWFkZXJfY2FjaGVfaW52YWxpZGF0ZV9hbGwgKGhlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChoZWFkZXIsIGZpZWxkKSk7IC8qIEV4cGVuc2l2ZSBhc3NlcnRpb24gLi4uICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVG9nZ2xlcyBhIG1lc3NhZ2UgZmxhZyBiaXQsIHR1cm5pbmcgb24gdGhlIGJpdCBpZiB2YWx1ZSA9IFRSVUUgYW5kCisgKiBmbGlwcGluZyBpdCBvZmYgaWYgdmFsdWUgPSBGQUxTRS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmbGFnIHRoZSBtZXNzYWdlIGZsYWcgdG8gdG9nZ2xlCisgKiBAcGFyYW0gdmFsdWUgdG9nZ2xlIG9uIG9yIG9mZgorICovCit2b2lkCitfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgKERCdXNIZWFkZXIgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgdmFsdWUpCit7CisgIHVuc2lnbmVkIGNoYXIgKmZsYWdzX3A7CisKKyAgZmxhZ3NfcCA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKCZoZWFkZXItPmRhdGEsIEZMQUdTX09GRlNFVCwgMSk7CisKKyAgaWYgKHZhbHVlKQorICAgICpmbGFnc19wIHw9IGZsYWc7CisgIGVsc2UKKyAgICAqZmxhZ3NfcCAmPSB+ZmxhZzsKK30KKworLyoqCisgKiBHZXRzIGEgbWVzc2FnZSBmbGFnIGJpdCwgcmV0dXJuaW5nIFRSVUUgaWYgdGhlIGJpdCBpcyBzZXQuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmxhZyB0aGUgbWVzc2FnZSBmbGFnIHRvIGdldAorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGZsYWcgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfZ2V0X2ZsYWcgKERCdXNIZWFkZXIgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGZsYWcpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZsYWdzX3A7CisKKyAgZmxhZ3NfcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKCZoZWFkZXItPmRhdGEsIEZMQUdTX09GRlNFVCwgMSk7CisKKyAgcmV0dXJuICgqZmxhZ3NfcCAmIGZsYWcpICE9IDA7Cit9CisKKy8qKgorICogU3dhcHMgdGhlIGhlYWRlciBpbnRvIHRoZSBnaXZlbiBvcmRlciBpZiByZXF1aXJlZC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBuZXdfb3JkZXIgdGhlIG5ldyBieXRlIG9yZGVyCisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl9ieXRlc3dhcCAoREJ1c0hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuZXdfb3JkZXIpCit7CisgIGlmIChoZWFkZXItPmJ5dGVfb3JkZXIgPT0gbmV3X29yZGVyKQorICAgIHJldHVybjsKKworICBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwICgmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGhlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLT5kYXRhLCAwKTsKKworICBoZWFkZXItPmJ5dGVfb3JkZXIgPSBuZXdfb3JkZXI7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2RidXNfYm9vbF90CitfZGJ1c19tYXJzaGFsX2hlYWRlcl90ZXN0ICh2b2lkKQoreworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE2YzVmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWhlYWRlci5oICBNYW5hZ2luZyBtYXJzaGFsaW5nL2RlbWFyc2hhbGluZyBvZiBtZXNzYWdlIGhlYWRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX0hFQURFUl9ICisjZGVmaW5lIERCVVNfTUFSU0hBTF9IRUFERVJfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCit0eXBlZGVmIHN0cnVjdCBEQnVzSGVhZGVyICAgICAgREJ1c0hlYWRlcjsKK3R5cGVkZWYgc3RydWN0IERCdXNIZWFkZXJGaWVsZCBEQnVzSGVhZGVyRmllbGQ7CisKKyNkZWZpbmUgX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX1VOS05PV04gLTEKKyNkZWZpbmUgX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX05PTkVYSVNURU5UIC0yCisKKy8qKgorICogQ2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IGEgaGVhZGVyIGZpZWxkIGluIHRoZSBtZXNzYWdlCisgKi8KK3N0cnVjdCBEQnVzSGVhZGVyRmllbGQKK3sKKyAgaW50ICAgICAgICAgICAgdmFsdWVfcG9zOyAvKio8IFBvc2l0aW9uIG9mIGZpZWxkIHZhbHVlLCBvciAtMS8tMiAqLworfTsKKworLyoqCisgKiBNZXNzYWdlIGhlYWRlciBkYXRhIGFuZCBzb21lIGNhY2hlZCBkZXRhaWxzIG9mIGl0LgorICovCitzdHJ1Y3QgREJ1c0hlYWRlcgoreworICBEQnVzU3RyaW5nIGRhdGE7IC8qKjwgSGVhZGVyIG5ldHdvcmsgZGF0YSwgc3RvcmVkCisgICAgICAgICAgICAgICAgICAgICogc2VwYXJhdGVseSBmcm9tIGJvZHkgc28gd2UgY2FuCisgICAgICAgICAgICAgICAgICAgICogaW5kZXBlbmRlbnRseSByZWFsbG9jIGl0LgorICAgICAgICAgICAgICAgICAgICAqLworCisgIERCdXNIZWFkZXJGaWVsZCBmaWVsZHNbREJVU19IRUFERVJfRklFTERfTEFTVCArIDFdOyAvKio8IFRyYWNrIHRoZSBsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgZWFjaCBmaWVsZCBpbiBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIGRidXNfdWludDMyX3QgcGFkZGluZyA6IDM7ICAgICAgICAvKio8IGJ5dGVzIG9mIGFsaWdubWVudCBpbiBoZWFkZXIgKi8KKyAgZGJ1c191aW50MzJfdCBieXRlX29yZGVyIDogODsgICAgIC8qKjwgYnl0ZSBvcmRlciBvZiBoZWFkZXIgKi8KK307CisKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2luaXQgICAgICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl9mcmVlICAgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfaGVhZGVyX3JlaW5pdCAgICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9jcmVhdGUgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVycm9yX25hbWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfY29weSAgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c0hlYWRlciAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIZWFkZXIgICAgICAgICpkZXN0KTsKK2ludCAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9tZXNzYWdlX3R5cGUgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIpOwordm9pZCAgICAgICAgICBfZGJ1c19oZWFkZXJfc2V0X3NlcmlhbCAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICBzZXJpYWwpOworZGJ1c191aW50MzJfdCBfZGJ1c19oZWFkZXJfZ2V0X3NlcmlhbCAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl91cGRhdGVfbGVuZ3RocyAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJvZHlfbGVuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICp2YWx1ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqdmFsdWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqcG9zKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2RlbGV0ZV9maWVsZCAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQpOwordm9pZCAgICAgICAgICBfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIHZhbHVlKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2dldF9mbGFnICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgZmxhZyk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9lbnN1cmVfc2lnbmF0dXJlICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnR5cGVfcG9zKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQgKGludCAgICAgICAgICAgICAgICBtYXhfbWVzc2FnZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9sb2FkICAgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkYXRpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl9ieXRlc3dhcCAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIG5ld19vcmRlcik7CisKKworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX0hFQURFUl9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA4YmIwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYwpAQCAtMCwwICsxLDM1NjUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMgIFdvdWxkIGJlIGluIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYywgYnV0IG9ubHkgdXNlZCBpbiBidXMvdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIHZvaWQKK2Jhc2ljX3ZhbHVlX3plcm8gKERCdXNCYXNpY1ZhbHVlICp2YWx1ZSkKK3sKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICB2YWx1ZS0+dTY0ID0gMDsKKyNlbHNlCisgIHZhbHVlLT51NjQuZmlyc3QzMiA9IDA7CisgIHZhbHVlLT51NjQuc2Vjb25kMzIgPSAwOworI2VuZGlmCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYmFzaWNfdmFsdWVfZXF1YWwgKGludCAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgIERCdXNCYXNpY1ZhbHVlICpsaHMsCisgICAgICAgICAgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgKnJocykKK3sKKyAgaWYgKHR5cGUgPT0gREJVU19UWVBFX1NUUklORyB8fAorICAgICAgdHlwZSA9PSBEQlVTX1RZUEVfU0lHTkFUVVJFIHx8CisgICAgICB0eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCkKKyAgICB7CisgICAgICByZXR1cm4gc3RyY21wIChsaHMtPnN0ciwgcmhzLT5zdHIpID09IDA7CisgICAgfQorICBlbHNlCisgICAgeworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAgICAgcmV0dXJuIGxocy0+dTY0ID09IHJocy0+dTY0OworI2Vsc2UKKyAgICAgIHJldHVybiBsaHMtPnU2NC5maXJzdDMyID09IHJocy0+dTY0LmZpcnN0MzIgJiYKKyAgICAgICAgbGhzLT51NjQuc2Vjb25kMzIgPT0gcmhzLT51NjQuc2Vjb25kMzI7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZXF1YWxfdmFsdWVzX2hlbHBlciAoREJ1c1R5cGVSZWFkZXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyaHMpCit7CisgIGludCBsaHNfdHlwZTsKKyAgaW50IHJoc190eXBlOworCisgIGxoc190eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAobGhzKTsKKyAgcmhzX3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyaHMpOworCisgIGlmIChsaHNfdHlwZSAhPSByaHNfdHlwZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGxoc190eXBlID09IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChkYnVzX3R5cGVfaXNfYmFzaWMgKGxoc190eXBlKSkKKyAgICB7CisgICAgICBEQnVzQmFzaWNWYWx1ZSBsaHNfdmFsdWU7CisgICAgICBEQnVzQmFzaWNWYWx1ZSByaHNfdmFsdWU7CisKKyAgICAgIGJhc2ljX3ZhbHVlX3plcm8gKCZsaHNfdmFsdWUpOworICAgICAgYmFzaWNfdmFsdWVfemVybyAoJnJoc192YWx1ZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKGxocywgJmxoc192YWx1ZSk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyaHMsICZyaHNfdmFsdWUpOworCisgICAgICByZXR1cm4gYmFzaWNfdmFsdWVfZXF1YWwgKGxoc190eXBlLCAmbGhzX3ZhbHVlLCAmcmhzX3ZhbHVlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciBsaHNfc3ViOworICAgICAgREJ1c1R5cGVSZWFkZXIgcmhzX3N1YjsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAobGhzLCAmbGhzX3N1Yik7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyaHMsICZyaHNfc3ViKTsKKworICAgICAgcmV0dXJuIGVxdWFsX3ZhbHVlc19oZWxwZXIgKCZsaHNfc3ViLCAmcmhzX3N1Yik7CisgICAgfQorfQorCisvKioKKyAqIFNlZSB3aGV0aGVyIHRoZSB0d28gcmVhZGVycyBwb2ludCB0byBpZGVudGljYWwgZGF0YSBibG9ja3MuCisgKgorICogQHBhcmFtIGxocyByZWFkZXIgMQorICogQHBhcmFtIHJocyByZWFkZXIgMgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGRhdGEgYmxvY2tzIGhhdmUgdGhlIHNhbWUgdmFsdWVzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9lcXVhbF92YWx1ZXMgKGNvbnN0IERCdXNUeXBlUmVhZGVyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyaHMpCit7CisgIERCdXNUeXBlUmVhZGVyIGNvcHlfbGhzID0gKmxoczsKKyAgREJ1c1R5cGVSZWFkZXIgY29weV9yaHMgPSAqcmhzOworCisgIHJldHVybiBlcXVhbF92YWx1ZXNfaGVscGVyICgmY29weV9saHMsICZjb3B5X3Jocyk7Cit9CisKKy8qIFRFU1RTICovCisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBXaGV0aGVyIHRvIGRvIHRoZSBPT00gc3R1ZmYgKG9ubHkgd2l0aCBvdGhlciBleHBlbnNpdmUgdGVzdHMpICovCisjZGVmaW5lIFRFU1RfT09NX0hBTkRMSU5HIDAKKy8qIFdlIGRvIHN0YXJ0IG9mZnNldCAwIHRocm91Z2ggOSwgdG8gZ2V0IHZhcmlvdXMgYWxpZ25tZW50IGNhc2VzLiBTdGlsbCB0aGlzCisgKiBvYnZpb3VzbHkgbWFrZXMgdGhlIHRlc3Qgc3VpdGUgcnVuIDEweCBhcyBzbG93LgorICovCisjZGVmaW5lIE1BWF9JTklUSUFMX09GRlNFVCA5CisKKy8qIExhcmdlc3QgaXRlcmF0aW9uIGNvdW50IHRvIHRlc3QgY29weWluZywgcmVhbGlnbm1lbnQsCisgKiBldGMuIHdpdGguIGkuZS4gd2Ugb25seSB0ZXN0IHRoaXMgc3R1ZmYgd2l0aCBzb21lIG9mIHRoZSBzbWFsbGVyCisgKiBkYXRhIHNldHMuCisgKi8KKyNkZWZpbmUgTUFYX0lURVJBVElPTlNfRk9SX0VYUEVOU0lWRV9URVNUUyAxMDAwCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBieXRlX29yZGVyOworICBpbnQgaW5pdGlhbF9vZmZzZXQ7CisgIERCdXNTdHJpbmcgc2lnbmF0dXJlOworICBEQnVzU3RyaW5nIGJvZHk7Cit9IERhdGFCbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IHNhdmVkX3NpZ19sZW47CisgIGludCBzYXZlZF9ib2R5X2xlbjsKK30gRGF0YUJsb2NrU3RhdGU7CisKKyNkZWZpbmUgTl9GRU5DRV9CWVRFUyA1CisjZGVmaW5lIEZFTkNFX0JZVEVTX1NUUiAiYWJjZGUiCisjZGVmaW5lIElOSVRJQUxfUEFERElOR19CWVRFICdcMCcKKworc3RhdGljIGRidXNfYm9vbF90CitkYXRhX2Jsb2NrX2luaXQgKERhdGFCbG9jayAqYmxvY2ssCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICBpbml0aWFsX29mZnNldCkKK3sKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmJsb2NrLT5zaWduYXR1cmUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYmxvY2stPmJvZHkpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYmxvY2stPnNpZ25hdHVyZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoJmJsb2NrLT5zaWduYXR1cmUsIDAsIGluaXRpYWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVRJQUxfUEFERElOR19CWVRFKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZibG9jay0+Ym9keSwgMCwgaW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVElBTF9QQURESU5HX0JZVEUpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmJsb2NrLT5zaWduYXR1cmUsIEZFTkNFX0JZVEVTX1NUUikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYmxvY2stPmJvZHksIEZFTkNFX0JZVEVTX1NUUikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+c2lnbmF0dXJlKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYmxvY2stPmJvZHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBibG9jay0+Ynl0ZV9vcmRlciA9IGJ5dGVfb3JkZXI7CisgIGJsb2NrLT5pbml0aWFsX29mZnNldCA9IGluaXRpYWxfb2Zmc2V0OworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9ibG9ja19zYXZlIChEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgIERhdGFCbG9ja1N0YXRlICpzdGF0ZSkKK3sKKyAgc3RhdGUtPnNhdmVkX3NpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gTl9GRU5DRV9CWVRFUzsKKyAgc3RhdGUtPnNhdmVkX2JvZHlfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+Ym9keSkgLSBOX0ZFTkNFX0JZVEVTOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9ibG9ja19yZXN0b3JlIChEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIERhdGFCbG9ja1N0YXRlICpzdGF0ZSkKK3sKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5zYXZlZF9zaWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gc3RhdGUtPnNhdmVkX3NpZ19sZW4gLSBOX0ZFTkNFX0JZVEVTKTsKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+c2F2ZWRfYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gc3RhdGUtPnNhdmVkX2JvZHlfbGVuIC0gTl9GRU5DRV9CWVRFUyk7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX3ZlcmlmeSAoRGF0YUJsb2NrICpibG9jaykKK3sKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRU5DRV9CWVRFU19TVFIpKQorICAgIHsKKyAgICAgIGludCBvZmZzZXQ7CisKKyAgICAgIG9mZnNldCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnNpZ25hdHVyZSkgLSBOX0ZFTkNFX0JZVEVTIC0gODsKKyAgICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICBvZmZzZXQgPSAwOworCisgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnNpZ25hdHVyZSkgLSBvZmZzZXQpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYmxvY2sgZGlkIG5vdCB2ZXJpZnk6IGJhZCBieXRlcyBhdCBlbmQgb2Ygc2lnbmF0dXJlIik7CisgICAgfQorICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRU5DRV9CWVRFU19TVFIpKQorICAgIHsKKyAgICAgIGludCBvZmZzZXQ7CisKKyAgICAgIG9mZnNldCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUyAtIDg7CisgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+Ym9keSkgLSBvZmZzZXQpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYmxvY2sgZGlkIG5vdCB2ZXJpZnk6IGJhZCBieXRlcyBhdCBlbmQgb2YgYm9keSIpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGJsb2NrLT5pbml0aWFsX29mZnNldCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwgKCZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBibG9jay0+aW5pdGlhbF9vZmZzZXQpKTsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfZnJlZSAoRGF0YUJsb2NrICpibG9jaykKK3sKKyAgZGF0YV9ibG9ja192ZXJpZnkgKGJsb2NrKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5zaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5ib2R5KTsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfcmVzZXQgKERhdGFCbG9jayAqYmxvY2spCit7CisgIGRhdGFfYmxvY2tfdmVyaWZ5IChibG9jayk7CisKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5pbml0aWFsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIE5fRkVOQ0VfQllURVMgLSBibG9jay0+aW5pdGlhbF9vZmZzZXQpOworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5pbml0aWFsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+Ym9keSkgLSBOX0ZFTkNFX0JZVEVTIC0gYmxvY2stPmluaXRpYWxfb2Zmc2V0KTsKKworICBkYXRhX2Jsb2NrX3ZlcmlmeSAoYmxvY2spOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIpCit7CisgIGlmIChyZWFkZXIpCisgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5pbml0aWFsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPmluaXRpYWxfb2Zmc2V0KTsKKworICBpZiAod3JpdGVyKQorICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gTl9GRU5DRV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+Ym9keSkgLSBOX0ZFTkNFX0JZVEVTKTsKK30KKworc3RhdGljIHZvaWQKK3JlYWxfY2hlY2tfZXhwZWN0ZWRfdHlwZSAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZnVuY25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsaW5lKQoreworICBpbnQgdDsKKworICB0ID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKTsKKworICBpZiAodCAhPSBleHBlY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiUmVhZCB0eXBlICVzIHdoaWxlIGV4cGVjdGluZyAlcyBhdCAlcyBsaW5lICVkXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHQpLAorICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lLCBsaW5lKTsKKworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmVhZCB3cm9uZyB0eXBlIik7CisgICAgfQorfQorCisjZGVmaW5lIGNoZWNrX2V4cGVjdGVkX3R5cGUocmVhZGVyLCBleHBlY3RlZCkgcmVhbF9jaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIGV4cGVjdGVkLCBfREJVU19GVU5DVElPTl9OQU1FLCBfX0xJTkVfXykKKworI2RlZmluZSBORVhUX0VYUEVDVElOR19UUlVFKHJlYWRlcikgIGRvIHsgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChyZWFkZXIpKSAgICAgICAgIFwKKyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfd2FybiAoIl9kYnVzX3R5cGVfcmVhZGVyX25leHQoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBUUlVFIGF0ICVzICVkXG4iLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSwgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBORVhUX0VYUEVDVElOR19GQUxTRShyZWFkZXIpIGRvIHsgaWYgKF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcikpICAgICAgICAgIFwKKyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfd2FybiAoIl9kYnVzX3R5cGVfcmVhZGVyX25leHQoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBGQUxTRSBhdCAlcyAlZFxuIiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSwgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgREJVU19UWVBFX0lOVkFMSUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3R5cGVkZWYgc3RydWN0IFRlc3RUeXBlTm9kZSAgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZTsKK3R5cGVkZWYgc3RydWN0IFRlc3RUeXBlTm9kZUNsYXNzICAgICAgICAgIFRlc3RUeXBlTm9kZUNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgVGVzdFR5cGVOb2RlQ29udGFpbmVyICAgICAgVGVzdFR5cGVOb2RlQ29udGFpbmVyOwordHlwZWRlZiBzdHJ1Y3QgVGVzdFR5cGVOb2RlQ29udGFpbmVyQ2xhc3MgVGVzdFR5cGVOb2RlQ29udGFpbmVyQ2xhc3M7CisKK3N0cnVjdCBUZXN0VHlwZU5vZGUKK3sKKyAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmtsYXNzOworfTsKKworc3RydWN0IFRlc3RUeXBlTm9kZUNvbnRhaW5lcgoreworICBUZXN0VHlwZU5vZGUgYmFzZTsKKyAgREJ1c0xpc3QgICAgKmNoaWxkcmVuOworfTsKKworc3RydWN0IFRlc3RUeXBlTm9kZUNsYXNzCit7CisgIGludCB0eXBlY29kZTsKKworICBpbnQgaW5zdGFuY2Vfc2l6ZTsKKworICBpbnQgc3ViY2xhc3NfZGV0YWlsOyAvKiBhIGJhZCBoYWNrIHRvIGF2b2lkIGEgYnVuY2ggb2Ygc3ViY2xhc3MgY2FzdGluZyAqLworCisgIGRidXNfYm9vbF90ICAgKCogY29uc3RydWN0KSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlKTsKKyAgdm9pZCAgICAgICAgICAoKiBkZXN0cm95KSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUpOworCisgIGRidXNfYm9vbF90ICgqIHdyaXRlX3ZhbHVlKSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKKyAgZGJ1c19ib29sX3QgKCogcmVhZF92YWx1ZSkgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKKyAgZGJ1c19ib29sX3QgKCogc2V0X3ZhbHVlKSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKKyAgZGJ1c19ib29sX3QgKCogYnVpbGRfc2lnbmF0dXJlKSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpOworICBkYnVzX2Jvb2xfdCAoKiB3cml0ZV9tdWx0aSkgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKKyAgZGJ1c19ib29sX3QgKCogcmVhZF9tdWx0aSkgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworfTsKKworc3RydWN0IFRlc3RUeXBlTm9kZUNvbnRhaW5lckNsYXNzCit7CisgIFRlc3RUeXBlTm9kZUNsYXNzIGJhc2U7Cit9OworCisvKiBGSVhNRSB0aGlzIGNvdWxkIGJlIGNoaWxsZWQgb3V0IHN1YnN0YW50aWFsbHkgYnkgdW5pZnlpbmcKKyAqIHRoZSBiYXNpYyB0eXBlcyBpbnRvIGJhc2ljX3dyaXRlX3ZhbHVlL2Jhc2ljX3JlYWRfdmFsdWUKKyAqIGFuZCBieSBtZXJnaW5nIHJlYWRfdmFsdWUgYW5kIHNldF92YWx1ZSBpbnRvIG9uZSBmdW5jdGlvbgorICogdGFraW5nIGEgZmxhZyBhcmd1bWVudC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90IGludDE2X3dyaXRlX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MTZfcmVhZF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MTZfc2V0X3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MTZfd3JpdGVfbXVsdGkgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworc3RhdGljIGRidXNfYm9vbF90IGludDE2X3JlYWRfbXVsdGkgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MzJfd3JpdGVfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQzMl9yZWFkX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQzMl9zZXRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQzMl93cml0ZV9tdWx0aSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MzJfcmVhZF9tdWx0aSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQ2NF93cml0ZV92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDY0X3JlYWRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDY0X3NldF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHN0cmluZ193cml0ZV92YWx1ZSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RyaW5nX3JlYWRfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RyaW5nX3NldF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYm9vbF93cml0ZV92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBib29sX3JlYWRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBib29sX3NldF92YWx1ZSAgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBieXRlX3dyaXRlX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJ5dGVfcmVhZF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJ5dGVfc2V0X3ZhbHVlICAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGRvdWJsZV93cml0ZV92YWx1ZSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZG91YmxlX3JlYWRfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZG91YmxlX3NldF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgb2JqZWN0X3BhdGhfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBvYmplY3RfcGF0aF9yZWFkX3ZhbHVlICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBvYmplY3RfcGF0aF9zZXRfdmFsdWUgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzaWduYXR1cmVfd3JpdGVfdmFsdWUgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHNpZ25hdHVyZV9yZWFkX3ZhbHVlICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHNpZ25hdHVyZV9zZXRfdmFsdWUgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHN0cnVjdF93cml0ZV92YWx1ZSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RydWN0X3JlYWRfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RydWN0X3NldF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RydWN0X2J1aWxkX3NpZ25hdHVyZSAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkaWN0X3dyaXRlX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGRpY3RfcmVhZF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGRpY3Rfc2V0X3ZhbHVlICAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGRpY3RfYnVpbGRfc2lnbmF0dXJlICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cik7CitzdGF0aWMgZGJ1c19ib29sX3QgYXJyYXlfd3JpdGVfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhcnJheV9yZWFkX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhcnJheV9zZXRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhcnJheV9idWlsZF9zaWduYXR1cmUgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpOworc3RhdGljIGRidXNfYm9vbF90IHZhcmlhbnRfd3JpdGVfdmFsdWUgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgdmFyaWFudF9yZWFkX3ZhbHVlICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgdmFyaWFudF9zZXRfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgdm9pZCAgICAgICAgY29udGFpbmVyX2Rlc3Ryb3kgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlKTsKKworCisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBpbnQxNl9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0lOVDE2LAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDE2X3dyaXRlX3ZhbHVlLAorICBpbnQxNl9yZWFkX3ZhbHVlLAorICBpbnQxNl9zZXRfdmFsdWUsCisgIE5VTEwsCisgIGludDE2X3dyaXRlX211bHRpLAorICBpbnQxNl9yZWFkX211bHRpCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgdWludDE2X2NsYXNzID0geworICBEQlVTX1RZUEVfVUlOVDE2LAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDE2X3dyaXRlX3ZhbHVlLCAvKiByZWN5Y2xlIGZyb20gaW50MTYgKi8KKyAgaW50MTZfcmVhZF92YWx1ZSwgIC8qIHJlY3ljbGUgZnJvbSBpbnQxNiAqLworICBpbnQxNl9zZXRfdmFsdWUsICAgLyogcmVjeWNsZSBmcm9tIGludDE2ICovCisgIE5VTEwsCisgIGludDE2X3dyaXRlX211bHRpLCAvKiByZWN5Y2xlIGZyb20gaW50MTYgKi8KKyAgaW50MTZfcmVhZF9tdWx0aSAgIC8qIHJlY3ljbGUgZnJvbSBpbnQxNiAqLworfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGludDMyX2NsYXNzID0geworICBEQlVTX1RZUEVfSU5UMzIsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50MzJfd3JpdGVfdmFsdWUsCisgIGludDMyX3JlYWRfdmFsdWUsCisgIGludDMyX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgaW50MzJfd3JpdGVfbXVsdGksCisgIGludDMyX3JlYWRfbXVsdGkKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyB1aW50MzJfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9VSU5UMzIsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50MzJfd3JpdGVfdmFsdWUsIC8qIHJlY3ljbGUgZnJvbSBpbnQzMiAqLworICBpbnQzMl9yZWFkX3ZhbHVlLCAgLyogcmVjeWNsZSBmcm9tIGludDMyICovCisgIGludDMyX3NldF92YWx1ZSwgICAvKiByZWN5Y2xlIGZyb20gaW50MzIgKi8KKyAgTlVMTCwKKyAgaW50MzJfd3JpdGVfbXVsdGksIC8qIHJlY3ljbGUgZnJvbSBpbnQzMiAqLworICBpbnQzMl9yZWFkX211bHRpICAgLyogcmVjeWNsZSBmcm9tIGludDMyICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgaW50NjRfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9JTlQ2NCwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQ2NF93cml0ZV92YWx1ZSwKKyAgaW50NjRfcmVhZF92YWx1ZSwKKyAgaW50NjRfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLCAvKiBGSVhNRSAqLworICBOVUxMICAvKiBGSVhNRSAqLworfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHVpbnQ2NF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1VJTlQ2NCwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQ2NF93cml0ZV92YWx1ZSwgLyogcmVjeWNsZSBmcm9tIGludDY0ICovCisgIGludDY0X3JlYWRfdmFsdWUsICAvKiByZWN5Y2xlIGZyb20gaW50NjQgKi8KKyAgaW50NjRfc2V0X3ZhbHVlLCAgIC8qIHJlY3ljbGUgZnJvbSBpbnQ2NCAqLworICBOVUxMLAorICBOVUxMLCAvKiBGSVhNRSAqLworICBOVUxMICAvKiBGSVhNRSAqLworfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cmluZ18wX2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSSU5HLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsIC8qIHN0cmluZyBsZW5ndGggKi8KKyAgTlVMTCwKKyAgTlVMTCwKKyAgc3RyaW5nX3dyaXRlX3ZhbHVlLAorICBzdHJpbmdfcmVhZF92YWx1ZSwKKyAgc3RyaW5nX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cmluZ18xX2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSSU5HLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDEsIC8qIHN0cmluZyBsZW5ndGggKi8KKyAgTlVMTCwKKyAgTlVMTCwKKyAgc3RyaW5nX3dyaXRlX3ZhbHVlLAorICBzdHJpbmdfcmVhZF92YWx1ZSwKKyAgc3RyaW5nX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworLyogd2l0aCBudWwsIGEgbGVuIDMgc3RyaW5nIHNob3VsZCBmaWxsIDQgYnl0ZXMgYW5kIHRodXMgaXMgInNwZWNpYWwiICovCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RyaW5nXzNfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJJTkcsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMywgLyogc3RyaW5nIGxlbmd0aCAqLworICBOVUxMLAorICBOVUxMLAorICBzdHJpbmdfd3JpdGVfdmFsdWUsCisgIHN0cmluZ19yZWFkX3ZhbHVlLAorICBzdHJpbmdfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCisvKiB3aXRoIG51bCwgYSBsZW4gOCBzdHJpbmcgc2hvdWxkIGZpbGwgOSBieXRlcyBhbmQgdGh1cyBpcyAic3BlY2lhbCIgKGZhci1mZXRjaGVkIEkgc3VwcG9zZSkgKi8KK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzdHJpbmdfOF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NUUklORywKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICA4LCAvKiBzdHJpbmcgbGVuZ3RoICovCisgIE5VTEwsCisgIE5VTEwsCisgIHN0cmluZ193cml0ZV92YWx1ZSwKKyAgc3RyaW5nX3JlYWRfdmFsdWUsCisgIHN0cmluZ19zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBib29sX2NsYXNzID0geworICBEQlVTX1RZUEVfQk9PTEVBTiwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBib29sX3dyaXRlX3ZhbHVlLAorICBib29sX3JlYWRfdmFsdWUsCisgIGJvb2xfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLCAvKiBGSVhNRSAqLworICBOVUxMICAvKiBGSVhNRSAqLworfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGJ5dGVfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9CWVRFLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGJ5dGVfd3JpdGVfdmFsdWUsCisgIGJ5dGVfcmVhZF92YWx1ZSwKKyAgYnl0ZV9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgZG91YmxlX2NsYXNzID0geworICBEQlVTX1RZUEVfRE9VQkxFLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGRvdWJsZV93cml0ZV92YWx1ZSwKKyAgZG91YmxlX3JlYWRfdmFsdWUsCisgIGRvdWJsZV9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgb2JqZWN0X3BhdGhfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBvYmplY3RfcGF0aF93cml0ZV92YWx1ZSwKKyAgb2JqZWN0X3BhdGhfcmVhZF92YWx1ZSwKKyAgb2JqZWN0X3BhdGhfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc2lnbmF0dXJlX2NsYXNzID0geworICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIHNpZ25hdHVyZV93cml0ZV92YWx1ZSwKKyAgc2lnbmF0dXJlX3JlYWRfdmFsdWUsCisgIHNpZ25hdHVyZV9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzdHJ1Y3RfMV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NUUlVDVCwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAxLCAvKiBudW1iZXIgb2YgdGltZXMgY2hpbGRyZW4gYXBwZWFyIGFzIGZpZWxkcyAqLworICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgc3RydWN0X3dyaXRlX3ZhbHVlLAorICBzdHJ1Y3RfcmVhZF92YWx1ZSwKKyAgc3RydWN0X3NldF92YWx1ZSwKKyAgc3RydWN0X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cnVjdF8yX2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSVUNULAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDIsIC8qIG51bWJlciBvZiB0aW1lcyBjaGlsZHJlbiBhcHBlYXIgYXMgZmllbGRzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBzdHJ1Y3Rfd3JpdGVfdmFsdWUsCisgIHN0cnVjdF9yZWFkX3ZhbHVlLAorICBzdHJ1Y3Rfc2V0X3ZhbHVlLAorICBzdHJ1Y3RfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgZGljdF8xX2NsYXNzID0geworICBEQlVTX1RZUEVfQVJSQVksIC8qIHRoaXMgaXMgY29ycmVjdCwgYSBkaWN0IGlzIGFuIGFycmF5IG9mIGRpY3QgZW50cnkgKi8KKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAxLCAvKiBudW1iZXIgb2YgZW50cmllcyAqLworICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgZGljdF93cml0ZV92YWx1ZSwKKyAgZGljdF9yZWFkX3ZhbHVlLAorICBkaWN0X3NldF92YWx1ZSwKKyAgZGljdF9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhcnJheXNfd3JpdGVfZml4ZWRfaW5fYmxvY2tzID0gRkFMU0U7CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBhcnJheV8wX2NsYXNzID0geworICBEQlVTX1RZUEVfQVJSQVksCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMCwgLyogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBhcnJheV93cml0ZV92YWx1ZSwKKyAgYXJyYXlfcmVhZF92YWx1ZSwKKyAgYXJyYXlfc2V0X3ZhbHVlLAorICBhcnJheV9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBhcnJheV8xX2NsYXNzID0geworICBEQlVTX1RZUEVfQVJSQVksCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMSwgLyogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBhcnJheV93cml0ZV92YWx1ZSwKKyAgYXJyYXlfcmVhZF92YWx1ZSwKKyAgYXJyYXlfc2V0X3ZhbHVlLAorICBhcnJheV9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBhcnJheV8yX2NsYXNzID0geworICBEQlVTX1RZUEVfQVJSQVksCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMiwgLyogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBhcnJheV93cml0ZV92YWx1ZSwKKyAgYXJyYXlfcmVhZF92YWx1ZSwKKyAgYXJyYXlfc2V0X3ZhbHVlLAorICBhcnJheV9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBhcnJheV85X2NsYXNzID0geworICBEQlVTX1RZUEVfQVJSQVksCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgOSwgLyogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBhcnJheV93cml0ZV92YWx1ZSwKKyAgYXJyYXlfcmVhZF92YWx1ZSwKKyAgYXJyYXlfc2V0X3ZhbHVlLAorICBhcnJheV9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyB2YXJpYW50X2NsYXNzID0geworICBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAwLAorICBOVUxMLAorICBjb250YWluZXJfZGVzdHJveSwKKyAgdmFyaWFudF93cml0ZV92YWx1ZSwKKyAgdmFyaWFudF9yZWFkX3ZhbHVlLAorICB2YXJpYW50X3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzKiBjb25zdAorYmFzaWNfbm9kZXNbXSA9IHsKKyAgJmludDE2X2NsYXNzLAorICAmdWludDE2X2NsYXNzLAorICAmaW50MzJfY2xhc3MsCisgICZ1aW50MzJfY2xhc3MsCisgICZpbnQ2NF9jbGFzcywKKyAgJnVpbnQ2NF9jbGFzcywKKyAgJmJvb2xfY2xhc3MsCisgICZieXRlX2NsYXNzLAorICAmZG91YmxlX2NsYXNzLAorICAmc3RyaW5nXzBfY2xhc3MsCisgICZzdHJpbmdfMV9jbGFzcywKKyAgJnN0cmluZ18zX2NsYXNzLAorICAmc3RyaW5nXzhfY2xhc3MsCisgICZvYmplY3RfcGF0aF9jbGFzcywKKyAgJnNpZ25hdHVyZV9jbGFzcworfTsKKyNkZWZpbmUgTl9CQVNJQ1MgKF9EQlVTX05fRUxFTUVOVFMgKGJhc2ljX25vZGVzKSkKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzKiBjb25zdAorY29udGFpbmVyX25vZGVzW10gPSB7CisgICZzdHJ1Y3RfMV9jbGFzcywKKyAgJmFycmF5XzFfY2xhc3MsCisgICZzdHJ1Y3RfMl9jbGFzcywKKyAgJmFycmF5XzBfY2xhc3MsCisgICZhcnJheV8yX2NsYXNzLAorICAmdmFyaWFudF9jbGFzcywKKyAgJmRpY3RfMV9jbGFzcyAvKiBsYXN0IHNpbmNlIHdlIHdhbnQgc3RydWN0IGFuZCBhcnJheSBiZWZvcmUgaXQgKi8KKyAgLyogYXJyYXlfOV9jbGFzcyBpcyBvbWl0dGVkIG9uIHB1cnBvc2UsIGl0J3MgdG9vIHNsb3c7CisgICAqIHdlIG9ubHkgdXNlIGl0IGluIG9uZSBoYXJkY29kZWQgdGVzdCBiZWxvdworICAgKi8KK307CisjZGVmaW5lIE5fQ09OVEFJTkVSUyAoX0RCVVNfTl9FTEVNRU5UUyAoY29udGFpbmVyX25vZGVzKSkKKworc3RhdGljIFRlc3RUeXBlTm9kZSoKK25vZGVfbmV3IChjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqa2xhc3MpCit7CisgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKworICBub2RlID0gZGJ1c19tYWxsb2MwIChrbGFzcy0+aW5zdGFuY2Vfc2l6ZSk7CisgIGlmIChub2RlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbm9kZS0+a2xhc3MgPSBrbGFzczsKKworICBpZiAoa2xhc3MtPmNvbnN0cnVjdCkKKyAgICB7CisgICAgICBpZiAoISgqIGtsYXNzLT5jb25zdHJ1Y3QpIChub2RlKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAobm9kZSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCitub2RlX2Rlc3Ryb3kgKFRlc3RUeXBlTm9kZSAqbm9kZSkKK3sKKyAgaWYgKG5vZGUtPmtsYXNzLT5kZXN0cm95KQorICAgICgqIG5vZGUtPmtsYXNzLT5kZXN0cm95KSAobm9kZSk7CisgIGRidXNfZnJlZSAobm9kZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSAoKiBub2RlLT5rbGFzcy0+d3JpdGVfdmFsdWUpIChub2RlLCBibG9jaywgd3JpdGVyLCBzZWVkKTsKKworI2lmIDAKKyAgLyogSGFuZHkgdG8gc2VlIHdoZXJlIHRoaW5ncyBicmVhaywgYnV0IHRvbyBleHBlbnNpdmUgdG8gZG8gYWxsIHRoZSB0aW1lICovCisgIGRhdGFfYmxvY2tfdmVyaWZ5IChibG9jayk7CisjZW5kaWYKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBEQnVzVHlwZVJlYWRlciByZXN0b3JlZDsgKi8KKworICBpZiAoISgqIG5vZGUtPmtsYXNzLT5yZWFkX3ZhbHVlKSAobm9kZSwgcmVhZGVyLCBzZWVkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFdhcm5pbmc6IGlmIHRoaXMgb25lIGZhaWxzIGR1ZSB0byBPT00sIGl0IGhhcyBzaWRlIGVmZmVjdHMgKGNhbgorICogbW9kaWZ5IG9ubHkgc29tZSBvZiB0aGUgc3ViLXZhbHVlcykuIE9LIGluIGEgdGVzdCBzdWl0ZSwgYnV0IHdlCisgKiBuZXZlciBkbyB0aGlzIGluIHJlYWwgY29kZS4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Citub2RlX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBpZiAoISgqIG5vZGUtPmtsYXNzLT5zZXRfdmFsdWUpIChub2RlLCByZWFkZXIsIHJlYWxpZ25fcm9vdCwgc2VlZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfYnVpbGRfc2lnbmF0dXJlIChUZXN0VHlwZU5vZGUgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICpzdHIpCit7CisgIGlmIChub2RlLT5rbGFzcy0+YnVpbGRfc2lnbmF0dXJlKQorICAgIHJldHVybiAoKiBub2RlLT5rbGFzcy0+YnVpbGRfc2lnbmF0dXJlKSAobm9kZSwgc3RyKTsKKyAgZWxzZQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citub2RlX2FwcGVuZF9jaGlsZCAoVGVzdFR5cGVOb2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisKKyAgX2RidXNfYXNzZXJ0IChub2RlLT5rbGFzcy0+aW5zdGFuY2Vfc2l6ZSA+PSAoaW50KSBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lcikpOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb250YWluZXItPmNoaWxkcmVuLCBjaGlsZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7IC8qIHdlIG5ldmVyIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb24gbm9kZV9hcHBlbmRfY2hpbGQgYW55aG93IC0gaXQncyBydW4gZnJvbSBvdXRzaWRlIHRoZSBtYWxsb2MtZmFpbHVyZSB0ZXN0IGNvZGUgKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citub2RlX3dyaXRlX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBuX2NvcGllcykKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX2Fzc2VydCAobm9kZS0+a2xhc3MtPndyaXRlX211bHRpICE9IE5VTEwpOworICByZXR2YWwgPSAoKiBub2RlLT5rbGFzcy0+d3JpdGVfbXVsdGkpIChub2RlLCBibG9jaywgd3JpdGVyLCBzZWVkLCBuX2NvcGllcyk7CisKKyNpZiAwCisgIC8qIEhhbmR5IHRvIHNlZSB3aGVyZSB0aGluZ3MgYnJlYWssIGJ1dCB0b28gZXhwZW5zaXZlIHRvIGRvIGFsbCB0aGUgdGltZSAqLworICBkYXRhX2Jsb2NrX3ZlcmlmeSAoYmxvY2spOworI2VuZGlmCisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citub2RlX3JlYWRfbXVsdGkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5fY29waWVzKQoreworICBfZGJ1c19hc3NlcnQgKG5vZGUtPmtsYXNzLT5yZWFkX211bHRpICE9IE5VTEwpOworCisgIGlmICghKCogbm9kZS0+a2xhc3MtPnJlYWRfbXVsdGkpIChub2RlLCByZWFkZXIsIHNlZWQsIG5fY29waWVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90b3RhbCA9IDA7CitzdGF0aWMgaW50IG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0ID0gMDsKK3N0YXRpYyBpbnQgbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCA9IDA7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IERCdXNTdHJpbmcgICAqc2lnbmF0dXJlOworICBEYXRhQmxvY2sgICAgICAgICAgKmJsb2NrOworICBpbnQgICAgICAgICAgICAgICAgIHR5cGVfb2Zmc2V0OworICBUZXN0VHlwZU5vZGUgICAgICAqKm5vZGVzOworICBpbnQgICAgICAgICAgICAgICAgIG5fbm9kZXM7Cit9IE5vZGVJdGVyYXRpb25EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3J1bl90ZXN0X2NvcHkgKE5vZGVJdGVyYXRpb25EYXRhICpuaWQpCit7CisgIERhdGFCbG9jayAqc3JjOworICBEYXRhQmxvY2sgZGVzdDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKworICBzcmMgPSBuaWQtPmJsb2NrOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghZGF0YV9ibG9ja19pbml0ICgmZGVzdCwgc3JjLT5ieXRlX29yZGVyLCBzcmMtPmluaXRpYWxfb2Zmc2V0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKHNyYywgJnJlYWRlciwgTlVMTCk7CisgIGRhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyICgmZGVzdCwgTlVMTCwgJndyaXRlcik7CisKKyAgLyogREJ1c1R5cGVXcml0ZXIgYXNzdW1lcyBpdCdzIHdyaXRpbmcgaW50byBhbiBleGlzdGluZyBzaWduYXR1cmUsCisgICAqIHNvIGRvZXNuJ3QgYWRkIG51bCBvbiBpdHMgb3duLiBXZSBoYXZlIHRvIGRvIHRoYXQuCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoJmRlc3Quc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC5pbml0aWFsX29mZnNldCwgJ1wwJykpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXIgKCZ3cml0ZXIsICZyZWFkZXIpKQorICAgIGdvdG8gb3V0OworCisgIC8qIERhdGEgYmxvY2tzIHNob3VsZCBub3cgYmUgaWRlbnRpY2FsICovCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsICgmc3JjLT5zaWduYXR1cmUsICZkZXN0LnNpZ25hdHVyZSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlNPVVJDRVxuIik7CisgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJnNyYy0+c2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3JjLT5zaWduYXR1cmUpKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJERVNUXG4iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmZGVzdC5zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkZXN0LnNpZ25hdHVyZSkpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2lnbmF0dXJlcyBkaWQgbm90IG1hdGNoIik7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsICgmc3JjLT5ib2R5LCAmZGVzdC5ib2R5KSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiU09VUkNFXG4iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3JjLT5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3JjLT5ib2R5KSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiREVTVFxuIik7CisgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmRlc3QuYm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlc3QuYm9keSkpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYm9kaWVzIGRpZCBub3QgbWF0Y2giKTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKworICBkYXRhX2Jsb2NrX2ZyZWUgKCZkZXN0KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3J1bl90ZXN0X3ZhbHVlc19vbmx5X3dyaXRlIChOb2RlSXRlcmF0aW9uRGF0YSAqbmlkKQoreworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IHNpZ19sZW47CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGF0YV9ibG9ja19yZXNldCAobmlkLT5ibG9jayk7CisKKyAgc2lnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuaWQtPnNpZ25hdHVyZSk7CisKKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoJndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT5ibG9jay0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT5zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuaWQtPmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm5pZC0+YmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUyk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5pZC0+YmxvY2stPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5pZC0+c2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmlkLT5ibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT5ibG9jay0+aW5pdGlhbF9vZmZzZXQpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5pZC0+bl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfd3JpdGVfdmFsdWUgKG5pZC0+bm9kZXNbaV0sIG5pZC0+YmxvY2ssICZ3cml0ZXIsIGkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgKytpOworICAgIH0KKworICAvKiBpZiB3ZSB3cm90ZSBhbnkgdHlwZWNvZGVzIHRoZW4gdGhpcyB3b3VsZCBmYWlsICovCisgIF9kYnVzX2Fzc2VydCAoc2lnX2xlbiA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobmlkLT5zaWduYXR1cmUpKTsKKworICAvKiBCdXQgYmUgc3VyZSB3ZSB3cm90ZSBvdXQgdGhlIHZhbHVlcyBjb3JyZWN0bHkgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV9yZWFkX3ZhbHVlIChuaWQtPm5vZGVzW2ldLCAmcmVhZGVyLCBpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChpICsgMSA9PSBuaWQtPm5fbm9kZXMpCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmcmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnJlYWRlcik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGF0YV9ibG9ja19yZXNldCAobmlkLT5ibG9jayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIG9mZnNldCB0aGUgc2VlZCBmb3Igc2V0dGluZywgc28gd2Ugc2V0IGRpZmZlcmVudCBudW1iZXJzIHRoYW4KKyAqIHdlIG9yaWdpbmFsbHkgd3JvdGUuIERvbid0IG9mZnNldCBieSBhIGh1Z2UgbnVtYmVyIHNpbmNlIGluCisgKiBzb21lIGNhc2VzIGl0J3MgdmFsdWUgPSBwb3NzaWJpbGl0aWVzW3NlZWQgJSBuX3Bvc3NpYmlsaXRpZXNdCisgKiBhbmQgd2UgZG9uJ3Qgd2FudCB0byB3cmFwIGFyb3VuZC4gYm9vbF9mcm9tX3NlZWQKKyAqIGlzIGp1c3Qgc2VlZCAlIDIgZXZlbi4KKyAqLworI2RlZmluZSBTRVRfU0VFRCAxCitzdGF0aWMgZGJ1c19ib29sX3QKK3J1bl90ZXN0X3NldF92YWx1ZXMgKE5vZGVJdGVyYXRpb25EYXRhICpuaWQpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhbGlnbl9yb290OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyIChuaWQtPmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgTlVMTCk7CisKKyAgcmVhbGlnbl9yb290ID0gcmVhZGVyOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5pZC0+bl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfc2V0X3ZhbHVlIChuaWQtPm5vZGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgJnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKyBTRVRfU0VFRCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoaSArIDEgPT0gbmlkLT5uX25vZGVzKQorICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnJlYWRlcik7CisgICAgICBlbHNlCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX1RSVUUgKCZyZWFkZXIpOworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlIG5ldyB2YWx1ZXMgd2VyZSBzZXQgKi8KKworICByZWFkZXIgPSByZWFsaWduX3Jvb3Q7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV9yZWFkX3ZhbHVlIChuaWQtPm5vZGVzW2ldLCAmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKyBTRVRfU0VFRCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoaSArIDEgPT0gbmlkLT5uX25vZGVzKQorICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnJlYWRlcik7CisgICAgICBlbHNlCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX1RSVUUgKCZyZWFkZXIpOworCisgICAgICArK2k7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3RfZGVsZXRlX3ZhbHVlcyAoTm9kZUl0ZXJhdGlvbkRhdGEgKm5pZCkKK3sKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCB0OworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGRhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyIChuaWQtPmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgTlVMTCk7CisKKyAgd2hpbGUgKCh0ID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIC8qIFJpZ2h0IG5vdywgZGVsZXRpbmcgb25seSB3b3JrcyBvbiBhcnJheSBlbGVtZW50cy4gIFdlIGRlbGV0ZQorICAgICAgICogYWxsIGFycmF5IGVsZW1lbnRzLCBhbmQgdGhlbiB2ZXJpZnkgdGhhdCB0aGVyZSBhcmVuJ3QgYW55CisgICAgICAgKiBsZWZ0LgorICAgICAgICovCisgICAgICBpZiAodCA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzVHlwZVJlYWRlciBhcnJheTsKKyAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKyAgICAgICAgICBpbnQgZWxlbV90eXBlOworCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJmFycmF5KTsKKyAgICAgICAgICBuX2VsZW1lbnRzID0gMDsKKyAgICAgICAgICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbl9lbGVtZW50cyArPSAxOworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogcmVzZXQgdG8gc3RhcnQgb2YgYXJyYXkgKi8KKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhZGVyLCAmYXJyYXkpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWN1cnNpbmcgaW50byBkZWxldGlvbiBsb29wIHJlYWRlci52YWx1ZV9wb3MgPSAlZCBhcnJheS52YWx1ZV9wb3MgPSAlZCBhcnJheS51LnN0YXJ0X3BvcyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci52YWx1ZV9wb3MsIGFycmF5LnZhbHVlX3BvcywgYXJyYXkudS5hcnJheS5zdGFydF9wb3MpOworICAgICAgICAgIHdoaWxlICgoZWxlbV90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gYWx3YXlzIGRlbGV0ZSBmcm9tIHRoZSBzYW1lIHBhcnQgb2YgdGhlIGFycmF5LiAqLworICAgICAgICAgICAgICBzdGF0aWMgaW50IGN5Y2xlID0gMDsKKyAgICAgICAgICAgICAgaW50IGVsZW07CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzID4gMCk7CisKKyAgICAgICAgICAgICAgZWxlbSA9IGN5Y2xlOworICAgICAgICAgICAgICBpZiAoZWxlbSA9PSAzIHx8IGVsZW0gPj0gbl9lbGVtZW50cykgLyogZW5kIG9mIGFycmF5ICovCisgICAgICAgICAgICAgICAgZWxlbSA9IG5fZWxlbWVudHMgLSAxOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkZWxldGluZyBhcnJheSBlbGVtZW50ICVkIG9mICVkIHR5cGUgJXMgY3ljbGUgJWQgcmVhZGVyIHBvcyAlZCBlbGVtIHBvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSwgbl9lbGVtZW50cywgX2RidXNfdHlwZV90b19zdHJpbmcgKGVsZW1fdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLCByZWFkZXIudmFsdWVfcG9zLCBhcnJheS52YWx1ZV9wb3MpOworICAgICAgICAgICAgICB3aGlsZSAoZWxlbSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpKQorICAgICAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgaGF2ZSBoYWQgYW5vdGhlciBlbGVtZW50XG4iKTsKKyAgICAgICAgICAgICAgICAgIC0tZWxlbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9kZWxldGUgKCZhcnJheSwgJnJlYWRlcikpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgICAgbl9lbGVtZW50cyAtPSAxOworCisgICAgICAgICAgICAgIC8qIHJlc2V0ICovCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFkZXIsICZhcnJheSk7CisKKyAgICAgICAgICAgICAgaWYgKGN5Y2xlID4gMikKKyAgICAgICAgICAgICAgICBjeWNsZSA9IDA7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjeWNsZSArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gYXJyYXkgZWxlbWVudHMgbGVmdCAqLworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAobmlkLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsIE5VTEwpOworCisgIHdoaWxlICgodCA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitydW5fdGVzdF9ub2Rlc19pdGVyYXRpb24gKHZvaWQgKmRhdGEpCit7CisgIE5vZGVJdGVyYXRpb25EYXRhICpuaWQgPSBkYXRhOworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICAvKiBTdHVmZiB0byBkbzoKKyAgICogMS4gd3JpdGUgdGhlIHZhbHVlCisgICAqIDIuIHN0cmNtcC1jb21wYXJlIHdpdGggdGhlIHNpZ25hdHVyZSB3ZSBidWlsdAorICAgKiAzLiByZWFkIHRoZSB2YWx1ZQorICAgKiA0LiB0eXBlLWl0ZXJhdGUgdGhlIHNpZ25hdHVyZSBhbmQgdGhlIHZhbHVlIGFuZCBzZWUgaWYgdGhleSBhcmUgdGhlIHNhbWUgdHlwZS13aXNlCisgICAqLworICByZXR2YWwgPSBGQUxTRTsKKworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAobmlkLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsICZ3cml0ZXIpOworCisgIC8qIERCdXNUeXBlV3JpdGVyIGFzc3VtZXMgaXQncyB3cml0aW5nIGludG8gYW4gZXhpc3Rpbmcgc2lnbmF0dXJlLAorICAgKiBzbyBkb2Vzbid0IGFkZCBudWwgb24gaXRzIG93bi4gV2UgaGF2ZSB0byBkbyB0aGF0LgorICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKCZuaWQtPmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPnR5cGVfb2Zmc2V0LCAnXDAnKSkKKyAgICBnb3RvIG91dDsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChuaWQtPm5vZGVzW2ldLCBuaWQtPmJsb2NrLCAmd3JpdGVyLCBpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nIChuaWQtPnNpZ25hdHVyZSwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5pZC0+c2lnbmF0dXJlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmlkLT5ibG9jay0+c2lnbmF0dXJlLCBuaWQtPnR5cGVfb2Zmc2V0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgc2lnbmF0dXJlICclcycgYW5kIGdvdCAnJXMnIHdpdGggaW5pdGlhbCBvZmZzZXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKG5pZC0+c2lnbmF0dXJlKSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKCZuaWQtPmJsb2NrLT5zaWduYXR1cmUsIG5pZC0+dHlwZV9vZmZzZXQsIDApLAorICAgICAgICAgICAgICAgICAgbmlkLT50eXBlX29mZnNldCk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ3cm9uZyBzaWduYXR1cmUiKTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV9yZWFkX3ZhbHVlIChuaWQtPm5vZGVzW2ldLCAmcmVhZGVyLCBpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChpICsgMSA9PSBuaWQtPm5fbm9kZXMpCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmcmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnJlYWRlcik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QgPD0gTUFYX0lURVJBVElPTlNfRk9SX0VYUEVOU0lWRV9URVNUUykKKyAgICB7CisgICAgICAvKiB0aGlzIHNldCB2YWx1ZXMgdGVzdCB1c2VzIGNvZGUgZnJvbSBjb3B5IGFuZAorICAgICAgICogdmFsdWVzX29ubHlfd3JpdGUgc28gd291bGQgaWRlYWxseSBiZSBsYXN0IHNvIHlvdSBnZXQgYQorICAgICAgICogc2ltcGxlciB0ZXN0IGNhc2UgZm9yIHByb2JsZW1zIHdpdGggY29weWluZyBvciB2YWx1ZXNfb25seQorICAgICAgICogd3JpdGluZzsgYnV0IGl0IGFsc28gbmVlZHMgYW4gYWxyZWFkeS13cml0dGVuIERhdGFCbG9jayBzbyBpdAorICAgICAgICogaGFzIHRvIGdvIGZpcnN0LiBDb21tZW50IGl0IG91dCBpZiBpdCBicmVha3MsIGFuZCBzZWUgaWYgdGhlCisgICAgICAgKiBsYXRlciB0ZXN0cyBhbHNvIGJyZWFrIC0gZGVidWcgdGhlbSBmaXJzdCBpZiBzby4KKyAgICAgICAqLworICAgICAgaWYgKCFydW5fdGVzdF9zZXRfdmFsdWVzIChuaWQpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFydW5fdGVzdF9kZWxldGVfdmFsdWVzIChuaWQpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFydW5fdGVzdF9jb3B5IChuaWQpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFydW5fdGVzdF92YWx1ZXNfb25seV93cml0ZSAobmlkKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIEZJWE1FIHR5cGUtaXRlcmF0ZSBib3RoIHNpZ25hdHVyZSBhbmQgdmFsdWUgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdGluZworICAgKiB0cmVlIHRvIHRoZSBub2RlIHRyZWUgcGVyaGFwcworICAgKi8KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorCisgIGRhdGFfYmxvY2tfcmVzZXQgKG5pZC0+YmxvY2spOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitydW5fdGVzdF9ub2Rlc19pbl9vbmVfY29uZmlndXJhdGlvbiAoVGVzdFR5cGVOb2RlICAgICoqbm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9ub2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbml0aWFsX29mZnNldCkKK3sKKyAgRGF0YUJsb2NrIGJsb2NrOworICBOb2RlSXRlcmF0aW9uRGF0YSBuaWQ7CisKKyAgaWYgKCFkYXRhX2Jsb2NrX2luaXQgKCZibG9jaywgYnl0ZV9vcmRlciwgaW5pdGlhbF9vZmZzZXQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIG5pZC5zaWduYXR1cmUgPSBzaWduYXR1cmU7CisgIG5pZC5ibG9jayA9ICZibG9jazsKKyAgbmlkLnR5cGVfb2Zmc2V0ID0gaW5pdGlhbF9vZmZzZXQ7CisgIG5pZC5ub2RlcyA9IG5vZGVzOworICBuaWQubl9ub2RlcyA9IG5fbm9kZXM7CisKKyAgaWYgKFRFU1RfT09NX0hBTkRMSU5HICYmCisgICAgICBuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0IDw9IE1BWF9JVEVSQVRJT05TX0ZPUl9FWFBFTlNJVkVfVEVTVFMpCisgICAgeworICAgICAgX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJydW5uaW5nIHRlc3Qgbm9kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3Rlc3Rfbm9kZXNfaXRlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghcnVuX3Rlc3Rfbm9kZXNfaXRlcmF0aW9uICgmbmlkKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgfQorCisgIGRhdGFfYmxvY2tfZnJlZSAoJmJsb2NrKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl90ZXN0X25vZGVzIChUZXN0VHlwZU5vZGUgKipub2RlcywKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBuX25vZGVzKQoreworICBpbnQgaTsKKyAgREJ1c1N0cmluZyBzaWduYXR1cmU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNpZ25hdHVyZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoISBub2RlX2J1aWxkX3NpZ25hdHVyZSAobm9kZXNbaV0sICZzaWduYXR1cmUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgICAgKytpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiPj4+IHRlc3Qgbm9kZXMgd2l0aCBzaWduYXR1cmUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc2lnbmF0dXJlKSk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDw9IE1BWF9JTklUSUFMX09GRlNFVCkKKyAgICB7CisgICAgICBydW5fdGVzdF9ub2Rlc19pbl9vbmVfY29uZmlndXJhdGlvbiAobm9kZXMsIG5fbm9kZXMsICZzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLCBpKTsKKyAgICAgIHJ1bl90ZXN0X25vZGVzX2luX29uZV9jb25maWd1cmF0aW9uIChub2Rlcywgbl9ub2RlcywgJnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sIGkpOworCisgICAgICArK2k7CisgICAgfQorCisgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0ICs9IDE7CisgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdG90YWwgKz0gMTsKKworICBpZiAobl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgPT0gbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgMTAwJSUgJWQgdGhpcyB0ZXN0ICglZCBjdW11bGF0aXZlKVxuIiwKKyAgICAgICAgICAgICAgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0LAorICAgICAgICAgICAgICAgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90b3RhbCk7CisgICAgfQorICAvKiB0aGlzIGhhcHBlbnMgdG8gdHVybiBvdXQgd2VsbCB3aXRoIG1vZCA9PSAxICovCisgIGVsc2UgaWYgKChuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCAlCisgICAgICAgICAgICAoaW50KShuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0IC8gMTAuMCkpID09IDEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICVkJSUgIiwgKGludCkgKG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0IC8gKGRvdWJsZSkgbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCAqIDEwMCkpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNpZ25hdHVyZSk7Cit9CisKKyNkZWZpbmUgTl9WQUxVRVMgKE5fQkFTSUNTICogTl9DT05UQUlORVJTICsgTl9CQVNJQ1MpCisKK3N0YXRpYyBUZXN0VHlwZU5vZGUqCit2YWx1ZV9nZW5lcmF0b3IgKGludCAqaXApCit7CisgIGludCBpID0gKmlwOworICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY2hpbGRfa2xhc3M7CisgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjb250YWluZXJfa2xhc3M7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKworICBfZGJ1c19hc3NlcnQgKGkgPD0gTl9WQUxVRVMpOworCisgIGlmIChpID09IE5fVkFMVUVTKQorICAgIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoaSA8IE5fQkFTSUNTKQorICAgIHsKKyAgICAgIG5vZGUgPSBub2RlX25ldyAoYmFzaWNfbm9kZXNbaV0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIGltYWdpbmUgYW4gYXJyYXk6CisgICAgICAgKiBjb250YWluZXIgMCBvZiBiYXNpYyAwCisgICAgICAgKiBjb250YWluZXIgMCBvZiBiYXNpYyAxCisgICAgICAgKiBjb250YWluZXIgMCBvZiBiYXNpYyAyCisgICAgICAgKiBjb250YWluZXIgMSBvZiBiYXNpYyAwCisgICAgICAgKiBjb250YWluZXIgMSBvZiBiYXNpYyAxCisgICAgICAgKiBjb250YWluZXIgMSBvZiBiYXNpYyAyCisgICAgICAgKi8KKyAgICAgIGkgLT0gTl9CQVNJQ1M7CisKKyAgICAgIGNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpIC8gTl9CQVNJQ1NdOworICAgICAgY2hpbGRfa2xhc3MgPSBiYXNpY19ub2Rlc1tpICUgTl9CQVNJQ1NdOworCisgICAgICBub2RlID0gbm9kZV9uZXcgKGNvbnRhaW5lcl9rbGFzcyk7CisgICAgICBjaGlsZCA9IG5vZGVfbmV3IChjaGlsZF9rbGFzcyk7CisKKyAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCBjaGlsZCk7CisgICAgfQorCisgICppcCArPSAxOyAvKiBpbmNyZW1lbnQgdGhlIGdlbmVyYXRvciAqLworCisgIHJldHVybiBub2RlOworfQorCitzdGF0aWMgdm9pZAorYnVpbGRfYm9keSAoVGVzdFR5cGVOb2RlICoqbm9kZXMsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICBuX25vZGVzLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKmJvZHkpCit7CisgIGludCBpOworICBEYXRhQmxvY2sgYmxvY2s7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCEgbm9kZV9idWlsZF9zaWduYXR1cmUgKG5vZGVzW2ldLCBzaWduYXR1cmUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBpZiAoIWRhdGFfYmxvY2tfaW5pdCAoJmJsb2NrLCBieXRlX29yZGVyLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgCisgIGRhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyICgmYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCAmd3JpdGVyKTsKKyAgCisgIC8qIERCdXNUeXBlV3JpdGVyIGFzc3VtZXMgaXQncyB3cml0aW5nIGludG8gYW4gZXhpc3Rpbmcgc2lnbmF0dXJlLAorICAgKiBzbyBkb2Vzbid0IGFkZCBudWwgb24gaXRzIG93bi4gV2UgaGF2ZSB0byBkbyB0aGF0LgorICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKCZibG9jay5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAnXDAnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAobm9kZXNbaV0sICZibG9jaywgJndyaXRlciwgaSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmYmxvY2suYm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2suYm9keSkgLSBOX0ZFTkNFX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgZGF0YV9ibG9ja19mcmVlICgmYmxvY2spOyAgCit9CisKK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2VuZXJhdGVfYm9kaWVzIChpbnQgICAgICAgICAgIHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICpzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgKmJvZHkpCit7CisgIFRlc3RUeXBlTm9kZSAqbm9kZXNbMV07CisgIGludCBpOworICBpbnQgbl9ub2RlczsKKworICBub2Rlc1swXSA9IHZhbHVlX2dlbmVyYXRvciAoJnNlcXVlbmNlKTsKKworICBpZiAobm9kZXNbMF0gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbl9ub2RlcyA9IDE7CisgIAorICBidWlsZF9ib2R5IChub2Rlcywgbl9ub2RlcywgYnl0ZV9vcmRlciwgc2lnbmF0dXJlLCBib2R5KTsKKworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fbm9kZXMpCisgICAgeworICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1tpXSk7CisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCittYWtlX2FuZF9ydW5fdmFsdWVzX2luc2lkZV9jb250YWluZXIgKGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjb250YWluZXJfa2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICBuX25lc3RlZCkKK3sKKyAgVGVzdFR5cGVOb2RlICpyb290OworICBUZXN0VHlwZU5vZGUgKmNvbnRhaW5lcjsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKyAgaW50IGk7CisKKyAgcm9vdCA9IG5vZGVfbmV3IChjb250YWluZXJfa2xhc3MpOworICBjb250YWluZXIgPSByb290OworICBmb3IgKGkgPSAxOyBpIDwgbl9uZXN0ZWQ7IGkrKykKKyAgICB7CisgICAgICBjaGlsZCA9IG5vZGVfbmV3IChjb250YWluZXJfa2xhc3MpOworICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKGNvbnRhaW5lciwgY2hpbGQpOworICAgICAgY29udGFpbmVyID0gY2hpbGQ7CisgICAgfQorCisgIC8qIGNvbnRhaW5lciBzaG91bGQgbm93IGJlIHRoZSBtb3N0LW5lc3RlZCBjb250YWluZXIgKi8KKworICBpID0gMDsKKyAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICB7CisgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoY29udGFpbmVyLCBjaGlsZCk7CisKKyAgICAgIHJ1bl90ZXN0X25vZGVzICgmcm9vdCwgMSk7CisKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYoKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopY29udGFpbmVyKS0+Y2hpbGRyZW4pOworICAgICAgbm9kZV9kZXN0cm95IChjaGlsZCk7CisgICAgfQorCisgIG5vZGVfZGVzdHJveSAocm9vdCk7Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9uZXh0X3Rlc3QgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZXhwZWN0ZWQpCit7CisgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0ID0gMDsKKyAgbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCA9IGV4cGVjdGVkOworCisgIGZwcmludGYgKHN0ZGVyciwgIj4+PiA+Pj4gIik7CisgIGZwcmludGYgKHN0ZGVyciwgZm9ybWF0LAorICAgICAgICAgICBuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0KTsKK30KKworc3RhdGljIHZvaWQKK21ha2VfYW5kX3J1bl90ZXN0X25vZGVzICh2b2lkKQoreworICBpbnQgaSwgaiwgaywgbTsKKworICAvKiBXZSB0cnkgdG8gZG8gdGhpcyBpbiBvcmRlciBvZiAiY29tcGxpY2F0ZWRuZXNzIiBzbyB0aGF0IHRlc3QKKyAgICogZmFpbHVyZXMgdGVuZCB0byBzaG93IHVwIGluIHRoZSBzaW1wbGVzdCB0ZXN0IGNhc2UgdGhhdAorICAgKiBkZW1vbnN0cmF0ZXMgdGhlIGZhaWx1cmUuICBUaGVyZSBhcmUgYWxzbyBzb21lIHRlc3RzIHRoYXQgcnVuCisgICAqIG1vcmUgdGhhbiBvbmNlIGZvciB0aGlzIHJlYXNvbiwgZmlyc3Qgd2hpbGUgZ29pbmcgdGhyb3VnaCBzaW1wbGUKKyAgICogY2FzZXMsIHNlY29uZCB3aGlsZSBnb2luZyB0aHJvdWdoIGEgYnJvYWRlciByYW5nZSBvZiBjb21wbGV4CisgICAqIGNhc2VzLgorICAgKi8KKyAgLyogRWFjaCBiYXNpYyBub2RlLiBUaGUgYmFzaWMgbm9kZXMgc2hvdWxkIGluY2x1ZGU6CisgICAqCisgICAqIC0gZWFjaCBmaXhlZC1zaXplIHR5cGUgKGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBoYXMgZGlmZmVyZW50IHZhbHVlcyBlYWNoIHRpbWUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHdlIGNhbiB0ZWxsIGlmIHdlIG1peCB0d28gb2YgdGhlbSB1cCkKKyAgICogLSBzdHJpbmdzIG9mIHZhcmlvdXMgbGVuZ3RocworICAgKiAtIG9iamVjdCBwYXRoCisgICAqIC0gc2lnbmF0dXJlCisgICAqLworICAvKiBFYWNoIGNvbnRhaW5lciBub2RlLiBUaGUgY29udGFpbmVyIG5vZGVzIHNob3VsZCBpbmNsdWRlOgorICAgKgorICAgKiAgc3RydWN0IHdpdGggMSBhbmQgMiBjb3BpZXMgb2YgdGhlIGNvbnRhaW5lZCBpdGVtCisgICAqICBhcnJheSB3aXRoIDAsIDEsIDIgY29waWVzIG9mIHRoZSBjb250YWluZWQgaXRlbQorICAgKiAgdmFyaWFudAorICAgKi8KKyAgLyogIExldCBhICJ2YWx1ZSIgYmUgYSBiYXNpYyBub2RlLCBvciBhIGNvbnRhaW5lciBjb250YWluaW5nIGEgc2luZ2xlIGJhc2ljIG5vZGUuCisgICAqICBMZXQgbl92YWx1ZXMgYmUgdGhlIG51bWJlciBvZiBzdWNoIHZhbHVlcyBpLmUuIChuX2NvbnRhaW5lciAqIG5fYmFzaWMgKyBuX2Jhc2ljKQorICAgKiAgV2hlbiBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgdmFsdWVzIHRvIG1ha2UgY29tYmluYXRpb25zLCBkbyB0aGUgYmFzaWMgdHlwZXMKKyAgICogIGZpcnN0IGFuZCB0aGUgY29udGFpbmVycyBzZWNvbmQuCisgICAqLworICAvKiBFYWNoIGl0ZW0gaXMgc2hvd24gd2l0aCBpdHMgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gY29tcGxldGUgc28KKyAgICogd2UgY2FuIGtlZXAgYSBoYW5kbGUgb24gdGhpcyB1bml0IHRlc3QKKyAgICovCisKKyAgLyogRklYTUUgdGVzdCBqdXN0IGFuIGVtcHR5IGJvZHksIG5vIHR5cGVzIGF0IGFsbCAqLworCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUgYnkgaXRzZWxmICVkIGl0ZXJhdGlvbnNcbiIsIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKG5vZGUgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICB7CisgICAgICAgIHJ1bl90ZXN0X25vZGVzICgmbm9kZSwgMSk7CisKKyAgICAgICAgbm9kZV9kZXN0cm95IChub2RlKTsKKyAgICAgIH0KKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUgYnkgaXRzZWxmIHdpdGggYXJyYXlzIGFzIGJsb2NrcyAlZCBpdGVyYXRpb25zXG4iLCBOX1ZBTFVFUyk7CisgIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBUUlVFOworICB7CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworICAgIGkgPSAwOworICAgIHdoaWxlICgobm9kZSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGUpOworICAgICAgfQorICB9CisgIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBGQUxTRTsKKworICBzdGFydF9uZXh0X3Rlc3QgKCJBbGwgdmFsdWVzIGluIG9uZSBiaWcgdG9wbGV2ZWwgJWQgaXRlcmF0aW9uXG4iLCAxKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZXNbTl9WQUxVRVNdOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKChub2Rlc1tpXSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIDsKKworICAgIHJ1bl90ZXN0X25vZGVzIChub2RlcywgTl9WQUxVRVMpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5fVkFMVUVTOyBpKyspCisgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGVzW2ldKTsKKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUsdmFsdWUgcGFpciBjb21iaW5hdGlvbiBhcyB0b3BsZXZlbCwgaW4gYm90aCBvcmRlcnMgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX1ZBTFVFUyAqIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZXNbMl07CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKG5vZGVzWzBdID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBqID0gMDsKKyAgICAgICAgd2hpbGUgKChub2Rlc1sxXSA9IHZhbHVlX2dlbmVyYXRvciAoJmopKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAobm9kZXMsIDIpOworCisgICAgICAgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGVzWzFdKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1swXSk7CisgICAgICB9CisgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIGNvbnRhaW5lciBjb250YWluaW5nIGVhY2ggdmFsdWUgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworCisgICAgICBtYWtlX2FuZF9ydW5fdmFsdWVzX2luc2lkZV9jb250YWluZXIgKGNvbnRhaW5lcl9rbGFzcywgMSk7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIGNvbnRhaW5pbmcgZWFjaCB2YWx1ZSB3aXRoIGFycmF5cyBhcyBibG9ja3MgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBUUlVFOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKworICAgICAgbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb250YWluZXJfa2xhc3MsIDEpOworICAgIH0KKyAgYXJyYXlzX3dyaXRlX2ZpeGVkX2luX2Jsb2NrcyA9IEZBTFNFOworCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIG9mIHNhbWUgY29udGFpbmVyIG9mIGVhY2ggdmFsdWUgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworCisgICAgICBtYWtlX2FuZF9ydW5fdmFsdWVzX2luc2lkZV9jb250YWluZXIgKGNvbnRhaW5lcl9rbGFzcywgMik7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIG9mIHNhbWUgY29udGFpbmVyIG9mIHNhbWUgY29udGFpbmVyIG9mIGVhY2ggdmFsdWUgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworCisgICAgICBtYWtlX2FuZF9ydW5fdmFsdWVzX2luc2lkZV9jb250YWluZXIgKGNvbnRhaW5lcl9rbGFzcywgMyk7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUsdmFsdWUgcGFpciBpbnNpZGUgYSBzdHJ1Y3QgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX1ZBTFVFUyAqIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqdmFsMSwgKnZhbDI7CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworCisgICAgbm9kZSA9IG5vZGVfbmV3ICgmc3RydWN0XzFfY2xhc3MpOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKCh2YWwxID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBqID0gMDsKKyAgICAgICAgd2hpbGUgKCh2YWwyID0gdmFsdWVfZ2VuZXJhdG9yICgmaikpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisKKyAgICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCB2YWwxKTsKKyAgICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCB2YWwyKTsKKworICAgICAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgICAgICAgbm9kZV9kZXN0cm95ICh2YWwyKTsKKyAgICAgICAgICB9CisgICAgICAgIG5vZGVfZGVzdHJveSAodmFsMSk7CisgICAgICB9CisgICAgbm9kZV9kZXN0cm95IChub2RlKTsKKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkFsbCB2YWx1ZXMgaW4gb25lIGJpZyBzdHJ1Y3QgJWQgaXRlcmF0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgIDEpOworICB7CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgICBub2RlID0gbm9kZV9uZXcgKCZzdHJ1Y3RfMV9jbGFzcyk7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKGNoaWxkID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG5vZGUsIGNoaWxkKTsKKworICAgIHJ1bl90ZXN0X25vZGVzICgmbm9kZSwgMSk7CisKKyAgICBub2RlX2Rlc3Ryb3kgKG5vZGUpOworICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSBpbiBhIGxhcmdlIGFycmF5ICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9WQUxVRVMpOworICB7CisgICAgVGVzdFR5cGVOb2RlICp2YWw7CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworCisgICAgbm9kZSA9IG5vZGVfbmV3ICgmYXJyYXlfOV9jbGFzcyk7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKHZhbCA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKworICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAobm9kZSwgdmFsKTsKKworICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm5vZGUsIDEpOworCisgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKyAgICAgICAgbm9kZV9kZXN0cm95ICh2YWwpOworICAgICAgfQorCisgICAgbm9kZV9kZXN0cm95IChub2RlKTsKKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIG9mIGVhY2ggY29udGFpbmVyIG9mIGVhY2ggdmFsdWUgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqb3V0ZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworICAgICAgVGVzdFR5cGVOb2RlICpvdXRlcl9jb250YWluZXIgPSBub2RlX25ldyAob3V0ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IE5fQ09OVEFJTkVSUzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKyAgICAgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqaW5uZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2pdOworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqaW5uZXJfY29udGFpbmVyID0gbm9kZV9uZXcgKGlubmVyX2NvbnRhaW5lcl9rbGFzcyk7CisKKyAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAob3V0ZXJfY29udGFpbmVyLCBpbm5lcl9jb250YWluZXIpOworCisgICAgICAgICAgbSA9IDA7CisgICAgICAgICAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJm0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKGlubmVyX2NvbnRhaW5lciwgY2hpbGQpOworCisgICAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzICgmb3V0ZXJfY29udGFpbmVyLCAxKTsKKworICAgICAgICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmKChUZXN0VHlwZU5vZGVDb250YWluZXIqKWlubmVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgbm9kZV9kZXN0cm95IChjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilvdXRlcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgbm9kZV9kZXN0cm95IChpbm5lcl9jb250YWluZXIpOworICAgICAgICB9CisgICAgICBub2RlX2Rlc3Ryb3kgKG91dGVyX2NvbnRhaW5lcik7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIG9mIGVhY2ggY29udGFpbmVyIG9mIGVhY2ggY29udGFpbmVyIG9mIGVhY2ggdmFsdWUgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqb3V0ZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworICAgICAgVGVzdFR5cGVOb2RlICpvdXRlcl9jb250YWluZXIgPSBub2RlX25ldyAob3V0ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IE5fQ09OVEFJTkVSUzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmlubmVyX2NvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tqXTsKKyAgICAgICAgICBUZXN0VHlwZU5vZGUgKmlubmVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChpbm5lcl9jb250YWluZXJfa2xhc3MpOworCisgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG91dGVyX2NvbnRhaW5lciwgaW5uZXJfY29udGFpbmVyKTsKKworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOX0NPTlRBSU5FUlM7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKyAgICAgICAgICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNlbnRlcl9jb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNba107CisgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2VudGVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChjZW50ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoaW5uZXJfY29udGFpbmVyLCBjZW50ZXJfY29udGFpbmVyKTsKKworICAgICAgICAgICAgICBtID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJm0pKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoY2VudGVyX2NvbnRhaW5lciwgY2hpbGQpOworCisgICAgICAgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm91dGVyX2NvbnRhaW5lciwgMSk7CisKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYoKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopY2VudGVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilpbm5lcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAoY2VudGVyX2NvbnRhaW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilvdXRlcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgbm9kZV9kZXN0cm95IChpbm5lcl9jb250YWluZXIpOworICAgICAgICB9CisgICAgICBub2RlX2Rlc3Ryb3kgKG91dGVyX2NvbnRhaW5lcik7CisgICAgfQorCisjaWYgMAorICAvKiBUaGlzIG9uZSB0YWtlcyBhIHJlYWxseSBsb25nIHRpbWUsIHNvIGNvbW1lbnQgaXQgb3V0IGZvciBub3cgKi8KKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSx2YWx1ZSx2YWx1ZSB0cmlwbGV0IGNvbWJpbmF0aW9uIGFzIHRvcGxldmVsLCBpbiBhbGwgb3JkZXJzICVkIGl0ZXJhdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgTl9WQUxVRVMgKiBOX1ZBTFVFUyAqIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZXNbM107CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKG5vZGVzWzBdID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBqID0gMDsKKyAgICAgICAgd2hpbGUgKChub2Rlc1sxXSA9IHZhbHVlX2dlbmVyYXRvciAoJmopKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgobm9kZXNbMl0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZrKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAobm9kZXMsIDMpOworCisgICAgICAgICAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1syXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMV0pOworICAgICAgICAgIH0KKyAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1swXSk7CisgICAgICB9CisgIH0KKyNlbmRpZiAvKiAjaWYgMCBleHBlbnNpdmUgdGVzdCAqLworCisgIGZwcmludGYgKHN0ZGVyciwgIiVkIHRvdGFsIGl0ZXJhdGlvbnMgb2YgcmVjdXJzaXZlIG1hcnNoYWxpbmcgdGVzdHNcbiIsCisgICAgICAgICAgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdG90YWwpOworICBmcHJpbnRmIChzdGRlcnIsICJlYWNoIGl0ZXJhdGlvbiByYW4gYXQgaW5pdGlhbCBvZmZzZXRzIDAgdGhyb3VnaCAlZCBpbiBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhblxuIiwKKyAgICAgICAgICAgTUFYX0lOSVRJQUxfT0ZGU0VUKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAib3V0IG9mIG1lbW9yeSBoYW5kbGluZyAlcyB0ZXN0ZWRcbiIsCisgICAgICAgICAgIFRFU1RfT09NX0hBTkRMSU5HID8gIndhcyIgOiAid2FzIG5vdCIpOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF9yZWN1cnNpdmVfdGVzdCAodm9pZCkKK3sKKyAgbWFrZV9hbmRfcnVuX3Rlc3Rfbm9kZXMgKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKgorICoKKyAqICAgICAgICAgSW1wbGVtZW50YXRpb25zIG9mIGVhY2ggdHlwZSBub2RlIGNsYXNzCisgKgorICoKKyAqCisgKi8KKyNkZWZpbmUgTUFYX01VTFRJX0NPVU5UIDUKKworI2RlZmluZSBTQU1QTEVfSU5UMTYgICAgICAgICAgIDEyMzQKKyNkZWZpbmUgU0FNUExFX0lOVDE2X0FMVEVSTkFURSA2Nzg1CitzdGF0aWMgZGJ1c19pbnQxNl90CitpbnQxNl9mcm9tX3NlZWQgKGludCBzZWVkKQoreworICAvKiBHZW5lcmF0ZSBhbiBpbnRlZ2VyIHZhbHVlIHRoYXQncyBwcmVkaWN0YWJsZSBmcm9tIHNlZWQuICBXZSBjb3VsZAorICAgKiBqdXN0IHVzZSBzZWVkIGl0c2VsZiwgYnV0IHRoYXQgd291bGQgb25seSBldmVyIHRvdWNoIG9uZSBieXRlIG9mCisgICAqIHRoZSBpbnQgc28gd291bGQgbWlzcyBzb21lIGtpbmRzIG9mIGJ1Zy4KKyAgICovCisgIGRidXNfaW50MTZfdCB2OworCisgIHYgPSA0MjsgLyoganVzdCB0byBxdWlldCBjb21waWxlciBhZmFpayAqLworICBzd2l0Y2ggKHNlZWQgJSA1KQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICB2ID0gU0FNUExFX0lOVDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgdiA9IFNBTVBMRV9JTlQxNl9BTFRFUk5BVEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB2ID0gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICB2ID0gX0RCVVNfSU5UMTZfTUFYOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgdiA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKHNlZWQgPiAxKQorICAgIHYgKj0gc2VlZDsgLyogd3JhcHMgYXJvdW5kIGV2ZW50dWFsbHksIHdoaWNoIGlzIGZpbmUgKi8KKworICByZXR1cm4gdjsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQxNl93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDE2ICovCisgIGRidXNfaW50MTZfdCB2OworCisgIHYgPSBpbnQxNl9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MTZfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDE2ICovCisgIGRidXNfaW50MTZfdCB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX2ludDE2X3QqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IGludDE2X2Zyb21fc2VlZCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDE2X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgdjsKKworICB2ID0gaW50MTZfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDE2X3dyaXRlX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDE2ICovCisgIGRidXNfaW50MTZfdCB2YWx1ZXNbTUFYX01VTFRJX0NPVU5UXTsKKyAgZGJ1c19pbnQxNl90ICp2X0FSUkFZX0lOVDE2ID0gdmFsdWVzOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICB2YWx1ZXNbaV0gPSBpbnQxNl9mcm9tX3NlZWQgKHNlZWQgKyBpKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfZml4ZWRfbXVsdGkgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQVJSQVlfSU5UMTYsIGNvdW50KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQxNl9yZWFkX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MTYgKi8KKyAgZGJ1c19pbnQxNl90ICp2YWx1ZXM7CisgIGludCBuX2VsZW1lbnRzOworICBpbnQgaTsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9maXhlZF9tdWx0aSAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl9lbGVtZW50cyk7CisKKyAgaWYgKG5fZWxlbWVudHMgIT0gY291bnQpCisgICAgX2RidXNfd2FybiAoImdvdCAlZCBlbGVtZW50cyBleHBlY3RlZCAlZFxuIiwgbl9lbGVtZW50cywgY291bnQpOworICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHMgPT0gY291bnQpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIF9kYnVzX2Fzc2VydCAoKChkYnVzX2ludDE2X3QpX2RidXNfdW5wYWNrX3VpbnQxNiAocmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXZhbHVlcyArIChpICogMikpKSA9PQorICAgICAgICAgICAgICAgICAgaW50MTZfZnJvbV9zZWVkIChzZWVkICsgaSkpOworCisgIHJldHVybiBUUlVFOworfQorCisKKyNkZWZpbmUgU0FNUExFX0lOVDMyICAgICAgICAgICAxMjM0NTY3OAorI2RlZmluZSBTQU1QTEVfSU5UMzJfQUxURVJOQVRFIDUzNzgxNDI5CitzdGF0aWMgZGJ1c19pbnQzMl90CitpbnQzMl9mcm9tX3NlZWQgKGludCBzZWVkKQoreworICAvKiBHZW5lcmF0ZSBhbiBpbnRlZ2VyIHZhbHVlIHRoYXQncyBwcmVkaWN0YWJsZSBmcm9tIHNlZWQuICBXZSBjb3VsZAorICAgKiBqdXN0IHVzZSBzZWVkIGl0c2VsZiwgYnV0IHRoYXQgd291bGQgb25seSBldmVyIHRvdWNoIG9uZSBieXRlIG9mCisgICAqIHRoZSBpbnQgc28gd291bGQgbWlzcyBzb21lIGtpbmRzIG9mIGJ1Zy4KKyAgICovCisgIGRidXNfaW50MzJfdCB2OworCisgIHYgPSA0MjsgLyoganVzdCB0byBxdWlldCBjb21waWxlciBhZmFpayAqLworICBzd2l0Y2ggKHNlZWQgJSA1KQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICB2ID0gU0FNUExFX0lOVDMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgdiA9IFNBTVBMRV9JTlQzMl9BTFRFUk5BVEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB2ID0gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICB2ID0gX0RCVVNfSU5UX01BWDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHYgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChzZWVkID4gMSkKKyAgICB2ICo9IHNlZWQ7IC8qIHdyYXBzIGFyb3VuZCBldmVudHVhbGx5LCB3aGljaCBpcyBmaW5lICovCisKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MzJfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQzMiAqLworICBkYnVzX2ludDMyX3QgdjsKKworICB2ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDMyX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQzMiAqLworICBkYnVzX2ludDMyX3QgdjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQzMl90KikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQzMl9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MzIgKi8KKyAgZGJ1c19pbnQzMl90IHY7CisKKyAgdiA9IGludDMyX2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQzMl93cml0ZV9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQzMiAqLworICBkYnVzX2ludDMyX3QgdmFsdWVzW01BWF9NVUxUSV9DT1VOVF07CisgIGRidXNfaW50MzJfdCAqdl9BUlJBWV9JTlQzMiA9IHZhbHVlczsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgdmFsdWVzW2ldID0gaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0FSUkFZX0lOVDMyLCBjb3VudCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MzJfcmVhZF9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCAqdmFsdWVzOworICBpbnQgbl9lbGVtZW50czsKKyAgaW50IGk7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5fZWxlbWVudHMpOworCisgIGlmIChuX2VsZW1lbnRzICE9IGNvdW50KQorICAgIF9kYnVzX3dhcm4gKCJnb3QgJWQgZWxlbWVudHMgZXhwZWN0ZWQgJWRcbiIsIG5fZWxlbWVudHMsIGNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzID09IGNvdW50KTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICBfZGJ1c19hc3NlcnQgKCgoaW50KV9kYnVzX3VucGFja191aW50MzIgKHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKil2YWx1ZXMgKyAoaSAqIDQpKSkgPT0KKyAgICAgICAgICAgICAgICAgIGludDMyX2Zyb21fc2VlZCAoc2VlZCArIGkpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorc3RhdGljIGRidXNfaW50NjRfdAoraW50NjRfZnJvbV9zZWVkIChpbnQgc2VlZCkKK3sKKyAgZGJ1c19pbnQzMl90IHYzMjsKKyAgZGJ1c19pbnQ2NF90IHY7CisKKyAgdjMyID0gaW50MzJfZnJvbV9zZWVkIChzZWVkKTsKKworICB2ID0gLSAoZGJ1c19pbnQzMl90KSB+IHYzMjsKKyAgdiB8PSAoKChkYnVzX2ludDY0X3QpdjMyKSA8PCAzMik7CisKKyAgcmV0dXJuIHY7Cit9CisjZW5kaWYKKworc3RhdGljIGRidXNfYm9vbF90CitpbnQ2NF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDY0ICovCisgIGRidXNfaW50NjRfdCB2OworCisgIHYgPSBpbnQ2NF9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7CisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDY0X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQ2NCAqLworICBkYnVzX2ludDY0X3QgdjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQ2NF90KikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQ2NF9mcm9tX3NlZWQgKHNlZWQpKTsKKworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50NjRfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDY0ICovCisgIGRidXNfaW50NjRfdCB2OworCisgIHYgPSBpbnQ2NF9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7CisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQorCisjZGVmaW5lIE1BWF9TQU1QTEVfU1RSSU5HX0xFTiAxMAorc3RhdGljIHZvaWQKK3N0cmluZ19mcm9tX3NlZWQgKGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgIGludCAgIGxlbiwKKyAgICAgICAgICAgICAgICAgIGludCAgIHNlZWQpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgX2RidXNfYXNzZXJ0IChsZW4gPCBNQVhfU0FNUExFX1NUUklOR19MRU4pOworCisgIC8qIHZhcnkgdGhlIGxlbmd0aCBzbGlnaHRseSwgdGhvdWdoIHdlIGFsc28gaGF2ZSBtdWx0aXBsZSBzdHJpbmcKKyAgICogdmFsdWUgdHlwZXMgZm9yIHRoaXMsIHZhcnlpbmcgaXQgaGVyZSB0ZXN0cyB0aGUgc2V0X3ZhbHVlIGNvZGUKKyAgICovCisgIHN3aXRjaCAoc2VlZCAlIDMpCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIGxlbiArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbGVuIC09IDI7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmIChsZW4gPCAwKQorICAgIGxlbiA9IDA7CisKKyAgdiA9ICh1bnNpZ25lZCBjaGFyKSAoJ0EnICsgc2VlZCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGlmICh2IDwgJ0EnIHx8IHYgPiAneicpCisgICAgICAgIHYgPSAnQSc7CisKKyAgICAgIGJ1ZltpXSA9IHY7CisKKyAgICAgIHYgKz0gMTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgYnVmW2ldID0gJ1wwJzsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJpbmdfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXT0iIjsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKworICBzdHJpbmdfZnJvbV9zZWVkIChidWYsIG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWwsCisgICAgICAgICAgICAgICAgICAgIHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ19yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjb25zdCBjaGFyICp2OworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXTsKKyAgdiA9IGJ1ZjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgJnYpOworCisgIHN0cmluZ19mcm9tX3NlZWQgKGJ1Ziwgbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbCwKKyAgICAgICAgICAgICAgICAgICAgc2VlZCk7CisKKyAgaWYgKHN0cmNtcCAoYnVmLCB2KSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJyZWFkIHN0cmluZyAnJXMnIGV4cGVjdGVkICclcydcbiIsCisgICAgICAgICAgICAgICAgICB2LCBidWYpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RyaW5nX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgc3RyaW5nX2Zyb21fc2VlZCAoYnVmLCBub2RlLT5rbGFzcy0+c3ViY2xhc3NfZGV0YWlsLAorICAgICAgICAgICAgICAgICAgICBzZWVkKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgeworICAgY29uc3QgY2hhciAqb2xkOworICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLCAmb2xkKTsKKyAgIF9kYnVzX3ZlcmJvc2UgKCJTRVRUSU5HIG5ldyBzdHJpbmcgJyVzJyBsZW4gJWQgaW4gcGxhY2Ugb2YgJyVzJyBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICB2X3N0cmluZywgc3RybGVuICh2X3N0cmluZyksIG9sZCwgc3RybGVuIChvbGQpKTsKKyB9CisjZW5kaWYKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworI2RlZmluZSBCT09MX0ZST01fU0VFRChzZWVkKSAoKGRidXNfYm9vbF90KSgoc2VlZCkgJSAyKSkKKworc3RhdGljIGRidXNfYm9vbF90Citib29sX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZGJ1c19ib29sX3QgdjsKKworICB2ID0gQk9PTF9GUk9NX1NFRUQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYm9vbF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRidXNfYm9vbF90IHY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IEJPT0xfRlJPTV9TRUVEIChzZWVkKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYm9vbF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZGJ1c19ib29sX3QgdjsKKworICB2ID0gQk9PTF9GUk9NX1NFRUQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9zZXRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKKyNkZWZpbmUgQllURV9GUk9NX1NFRUQoc2VlZCkgKCh1bnNpZ25lZCBjaGFyKSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQpKQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J5dGVfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgdiA9IEJZVEVfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J5dGVfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IEJZVEVfRlJPTV9TRUVEIChzZWVkKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGRidXNfYm9vbF90CitieXRlX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICB1bnNpZ25lZCBjaGFyIHY7CisKKyAgdiA9IEJZVEVfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCitzdGF0aWMgZG91YmxlCitkb3VibGVfZnJvbV9zZWVkIChpbnQgc2VlZCkKK3sKKyAgcmV0dXJuIFNBTVBMRV9JTlQzMiAqIChkb3VibGUpIHNlZWQgKyAwLjM7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG91YmxlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZG91YmxlIHY7CisKKyAgdiA9IGRvdWJsZV9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG91YmxlX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRvdWJsZSB2OworICBkb3VibGUgZXhwZWN0ZWQ7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSopICZ2KTsKKworICBleHBlY3RlZCA9IGRvdWJsZV9mcm9tX3NlZWQgKHNlZWQpOworCisgIGlmICghX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMICh2LCBleHBlY3RlZCkpCisgICAgeworI2lmZGVmIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSCisgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgZG91YmxlICVnIGdvdCAlZ1xuIGJpdHMgPSAweCUiIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSICJ4IHZzLlxuIGJpdHMgPSAweCUiIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSICJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCB2LAorICAgICAgICAgICAgICAgICAgKihkYnVzX3VpbnQ2NF90KikoY2hhciopJmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgKihkYnVzX3VpbnQ2NF90KikoY2hhciopJnYpOworI2VuZGlmCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb3VibGVfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRvdWJsZSB2OworCisgIHYgPSBkb3VibGVfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCisjZGVmaW5lIE1BWF9TQU1QTEVfT0JKRUNUX1BBVEhfTEVOIDEwCitzdGF0aWMgdm9pZAorb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgIHNlZWQpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIHY7CisgIGludCBsZW47CisKKyAgbGVuID0gc2VlZCAlIDk7CisgIF9kYnVzX2Fzc2VydCAobGVuIDwgTUFYX1NBTVBMRV9PQkpFQ1RfUEFUSF9MRU4pOworCisgIHYgPSAodW5zaWduZWQgY2hhcikgKCdBJyArIHNlZWQpOworCisgIGlmIChsZW4gPCAyKQorICAgIHsKKyAgICAgIGJ1ZlswXSA9ICcvJzsKKyAgICAgIGkgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgKyAxIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHYgPCAnQScgfHwgdiA+ICd6JykKKyAgICAgICAgICAgIHYgPSAnQSc7CisKKyAgICAgICAgICBidWZbaV0gPSAnLyc7CisgICAgICAgICAgKytpOworICAgICAgICAgIGJ1ZltpXSA9IHY7CisgICAgICAgICAgKytpOworICAgICAgICAgIAorICAgICAgICAgIHYgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKworICBidWZbaV0gPSAnXDAnOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9PQkpFQ1RfUEFUSF9MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjb25zdCBjaGFyICp2OworICBjaGFyIGJ1ZltNQVhfU0FNUExFX09CSkVDVF9QQVRIX0xFTiArIDFdOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSAmdik7CisKKyAgb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIGlmIChzdHJjbXAgKGJ1ZiwgdikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgicmVhZCBvYmplY3QgcGF0aCAnJXMnIGV4cGVjdGVkICclcydcbiIsCisgICAgICAgICAgICAgICAgICB2LCBidWYpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorb2JqZWN0X3BhdGhfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGNoYXIgYnVmW01BWF9TQU1QTEVfT0JKRUNUX1BBVEhfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIG9iamVjdF9wYXRoX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworI2RlZmluZSBNQVhfU0FNUExFX1NJR05BVFVSRV9MRU4gMTAKK3N0YXRpYyB2b2lkCitzaWduYXR1cmVfZnJvbV9zZWVkIChjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICBzZWVkKQoreworICAvKiB0cnkgdG8gYXZvaWQgYXNjZW5kaW5nLCBkZXNjZW5kaW5nLCBvciBhbHRlcm5hdGluZyBsZW5ndGggdG8gaGVscCBmaW5kIGJ1Z3MgKi8KKyAgY29uc3QgY2hhciAqc2FtcGxlX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAiYXNheCIKKyAgICAiIiwKKyAgICAiYXNhdSh4eHh4KSIsCisgICAgIngiLAorICAgICJhaSIsCisgICAgImEoaWkpIgorICB9OworCisgIHN0cmNweSAoYnVmLCBzYW1wbGVfc2lnbmF0dXJlc1tzZWVkICUgX0RCVVNfTl9FTEVNRU5UUyhzYW1wbGVfc2lnbmF0dXJlcyldKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzaWduYXR1cmVfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NJR05BVFVSRV9MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgc2lnbmF0dXJlX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfc3RyaW5nKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzaWduYXR1cmVfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY29uc3QgY2hhciAqdjsKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TSUdOQVRVUkVfTEVOICsgMV07CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopICZ2KTsKKworICBzaWduYXR1cmVfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIGlmIChzdHJjbXAgKGJ1ZiwgdikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgicmVhZCBzaWduYXR1cmUgdmFsdWUgJyVzJyBleHBlY3RlZCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgdiwgYnVmKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2lnbmF0dXJlX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NJR05BVFVSRV9MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgc2lnbmF0dXJlX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJ1Y3Rfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEYXRhQmxvY2tTdGF0ZSBzYXZlZDsKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBpbnQgaTsKKyAgaW50IG5fY29waWVzOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisKKyAgZGF0YV9ibG9ja19zYXZlIChibG9jaywgJnNhdmVkKTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKHdyaXRlciwgREJVU19UWVBFX1NUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2NvcGllcykKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBUZXN0VHlwZU5vZGUgKmNoaWxkID0gbGluay0+ZGF0YTsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChjaGlsZCwgYmxvY2ssICZzdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAod3JpdGVyLCAmc3ViKSkKKyAgICB7CisgICAgICBkYXRhX2Jsb2NrX3Jlc3RvcmUgKGJsb2NrLCAmc2F2ZWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJ1Y3RfcmVhZF9vcl9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgREJ1c1R5cGVSZWFkZXIgc3ViOworICBpbnQgaTsKKyAgaW50IG5fY29waWVzOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9TVFJVQ1QpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKGNoaWxkLCAmc3ViLCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFub2RlX3NldF92YWx1ZSAoY2hpbGQsICZzdWIsIHJlYWxpZ25fcm9vdCwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpID09IChuX2NvcGllcyAtIDEpICYmIG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmc3ViKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmc3ViKTsKKworICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBzdHJ1Y3RfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgTlVMTCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gc3RydWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIHJlYWxpZ25fcm9vdCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X2J1aWxkX3NpZ25hdHVyZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBpbnQgaTsKKyAgaW50IG9yaWdfbGVuOworICBpbnQgbl9jb3BpZXM7CisKKyAgbl9jb3BpZXMgPSBub2RlLT5rbGFzcy0+c3ViY2xhc3NfZGV0YWlsOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikpCisgICAgZ290byBvb207CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKGNoaWxkLCBzdHIpKQorICAgICAgICAgICAgZ290byBvb207CisKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfU1RSVUNUX0VORF9DSEFSKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXJyYXlfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEYXRhQmxvY2tTdGF0ZSBzYXZlZDsKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBEQnVzU3RyaW5nIGVsZW1lbnRfc2lnbmF0dXJlOworICBpbnQgaTsKKyAgaW50IG5fY29waWVzOworICBpbnQgZWxlbWVudF90eXBlOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisKKyAgZGF0YV9ibG9ja19zYXZlIChibG9jaywgJnNhdmVkKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZWxlbWVudF9zaWduYXR1cmUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgaWYgKCFub2RlX2J1aWxkX3NpZ25hdHVyZSAoY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50X3NpZ25hdHVyZSkpCisgICAgZ290byBvb207CisKKyAgZWxlbWVudF90eXBlID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKCZlbGVtZW50X3NpZ25hdHVyZSwgMCk7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgZ290byBvb207CisKKyAgaWYgKGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgJiYKKyAgICAgIGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSAmJgorICAgICAgY2hpbGQtPmtsYXNzLT53cml0ZV9tdWx0aSkKKyAgICB7CisgICAgICBpZiAoIW5vZGVfd3JpdGVfbXVsdGkgKGNoaWxkLCBibG9jaywgJnN1Yiwgc2VlZCwgbl9jb3BpZXMpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbiwgbGluayk7CisKKyAgICAgICAgICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChjaGlsZCwgYmxvY2ssICZzdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAod3JpdGVyLCAmc3ViKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVsZW1lbnRfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZWxlbWVudF9zaWduYXR1cmUpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXJyYXlfcmVhZF9vcl9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgREJ1c1R5cGVSZWFkZXIgc3ViOworICBpbnQgaTsKKyAgaW50IG5fY29waWVzOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9BUlJBWSk7CisKKyAgY2hpbGQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworCisgIGlmIChuX2NvcGllcyA+IDApCisgICAgeworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgaWYgKHJlYWxpZ25fcm9vdCA9PSBOVUxMICYmIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgJiYKKyAgICAgICAgICBkYnVzX3R5cGVfaXNfZml4ZWQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKHJlYWRlcikpICYmCisgICAgICAgICAgY2hpbGQtPmtsYXNzLT5yZWFkX211bHRpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFub2RlX3JlYWRfbXVsdGkgKGNoaWxkLCAmc3ViLCBzZWVkLCBuX2NvcGllcykpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGkgPSAwOworICAgICAgICAgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNMaXN0ICpsaW5rOworCisgICAgICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICAgICAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGNoaWxkLT5rbGFzcy0+dHlwZWNvZGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKSk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZV9yZWFkX3ZhbHVlIChjaGlsZCwgJnN1Yiwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVfc2V0X3ZhbHVlIChjaGlsZCwgJnN1YiwgcmVhbGlnbl9yb290LCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gKG5fY29waWVzIC0gMSkgJiYgbmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnN1Yik7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX1RSVUUgKCZzdWIpOworCisgICAgICAgICAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gYXJyYXlfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgTlVMTCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXJyYXlfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBhcnJheV9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCByZWFsaWduX3Jvb3QsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X2J1aWxkX3NpZ25hdHVyZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIGludCBvcmlnX2xlbjsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfVFlQRV9BUlJBWSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFub2RlX2J1aWxkX3NpZ25hdHVyZSAoX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICByZXR1cm4gRkFMU0U7Cit9CisKKyAvKiAxMCBpcyByYW5kb20ganVzdCB0byBhZGQgYW5vdGhlciBzZWVkIHRoYXQgd2UgdXNlIGluIHRoZSBzdWl0ZSAqLworI2RlZmluZSBWQVJJQU5UX1NFRUQgMTAKKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1N0cmluZyBjb250ZW50X3NpZ25hdHVyZTsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lICgmY29udGFpbmVyLT5jaGlsZHJlbikpOworCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBkYXRhX2Jsb2NrX3NhdmUgKGJsb2NrLCAmc2F2ZWQpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZW50X3NpZ25hdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudF9zaWduYXR1cmUpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAod3JpdGVyLCBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudF9zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChjaGlsZCwgYmxvY2ssICZzdWIsIHNlZWQgKyBWQVJJQU5UX1NFRUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudF9zaWduYXR1cmUpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50X3NpZ25hdHVyZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lICgmY29udGFpbmVyLT5jaGlsZHJlbikpOworCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9WQVJJQU5UKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQsICZzdWIsIHNlZWQgKyBWQVJJQU5UX1NFRUQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFub2RlX3NldF92YWx1ZSAoY2hpbGQsICZzdWIsIHJlYWxpZ25fcm9vdCwgc2VlZCArIFZBUklBTlRfU0VFRCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZzdWIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3ZhcmlhbnRfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gdmFyaWFudF9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCBOVUxMLCBzZWVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gdmFyaWFudF9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCByZWFsaWduX3Jvb3QsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RpY3Rfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEYXRhQmxvY2tTdGF0ZSBzYXZlZDsKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBEQnVzU3RyaW5nIGVudHJ5X3ZhbHVlX3NpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBkaWN0X2VudHJ5X3NpZ25hdHVyZTsKKyAgaW50IGk7CisgIGludCBuX2VudHJpZXM7CisgIGludCBlbnRyeV92YWx1ZV90eXBlOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgIG5fZW50cmllcyA9IG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWw7CisKKyAgX2RidXNfYXNzZXJ0IChjb250YWluZXItPmNoaWxkcmVuICE9IE5VTEwpOworCisgIGRhdGFfYmxvY2tfc2F2ZSAoYmxvY2ssICZzYXZlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBpZiAoIW5vZGVfYnVpbGRfc2lnbmF0dXJlIChjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGljdF9lbnRyeV9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORykpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpY3RfZW50cnlfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikpCisgICAgZ290byBvb207CisgIAorICBlbnRyeV92YWx1ZV90eXBlID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUsIDApOworICAKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGljdF9lbnRyeV9zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgZ290byBvb207CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9lbnRyaWVzKQorICAgIHsKKyAgICAgIERCdXNUeXBlV3JpdGVyIGVudHJ5X3N1YjsKKyAgICAgIGRidXNfaW50MzJfdCBrZXk7CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJnN1YiwgREJVU19UWVBFX0RJQ1RfRU5UUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnRyeV9zdWIpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAga2V5ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSk7CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZlbnRyeV9zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5KSkKKyAgICAgICAgZ290byBvb207CisgICAgICAKKyAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQsIGJsb2NrLCAmZW50cnlfc3ViLCBzZWVkICsgaSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAoJnN1YiwgJmVudHJ5X3N1YikpCisgICAgICAgIGdvdG8gb29tOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gb29tOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGRhdGFfYmxvY2tfcmVzdG9yZSAoYmxvY2ssICZzYXZlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZW50cnlfdmFsdWVfc2lnbmF0dXJlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgaW50IGk7CisgIGludCBuX2VudHJpZXM7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgbl9lbnRyaWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9BUlJBWSk7CisKKyAgY2hpbGQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworCisgIGlmIChuX2VudHJpZXMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKCZzdWIsIERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fZW50cmllcykKKyAgICAgICAgeworICAgICAgICAgIERCdXNUeXBlUmVhZGVyIGVudHJ5X3N1YjsKKworICAgICAgICAgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKCZzdWIsIERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3ViLCAmZW50cnlfc3ViKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfaW50MzJfdCB2OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAoJmVudHJ5X3N1YiwgREJVU19UWVBFX0lOVDMyKTsKKworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmZW50cnlfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQzMl90KikgJnYpOworCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKSk7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJmVudHJ5X3N1Yik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQsICZlbnRyeV9zdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZlbnRyeV9zdWIpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19pbnQzMl90IHY7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB2ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkICsgaSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAoJmVudHJ5X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJmVudHJ5X3N1Yik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIW5vZGVfc2V0X3ZhbHVlIChjaGlsZCwgJmVudHJ5X3N1YiwgcmVhbGlnbl9yb290LCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmZW50cnlfc3ViKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoaSA9PSAobl9lbnRyaWVzIC0gMSkpCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnN1Yik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnN1Yik7CisKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGljdF9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIE5VTEwsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RpY3Rfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBkaWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIHJlYWxpZ25fcm9vdCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGljdF9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIGludCBvcmlnX2xlbjsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfVFlQRV9BUlJBWSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORyBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HKSkKKyAgICBnb3RvIG9vbTsKKyAgCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitjb250YWluZXJfZGVzdHJveSAoVGVzdFR5cGVOb2RlICpub2RlKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgbm9kZV9kZXN0cm95IChjaGlsZCk7CisKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjEwODU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKQEAgLTAsMCArMSwyNzQwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAgTWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIHJlY3Vyc2l2ZSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICogQHsKKyAqLworCisvKiogdHVybiB0aGlzIG9uIHRvIGdldCBkZWx1Z2VkIGluIFR5cGVSZWFkZXIgdmVyYm9zZSBzcGFtICovCisjZGVmaW5lIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UgIDAKKworLyoqIHR1cm4gdGhpcyBvbiB0byBnZXQgZGVsdWdlZCBpbiBUeXBlV3JpdGVyIHZlcmJvc2Ugc3BhbSAqLworI2RlZmluZSBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRSAwCisKK3N0YXRpYyB2b2lkCitmcmVlX2ZpeHVwcyAoREJ1c0xpc3QgKipmaXh1cHMpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChmaXh1cHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworCisgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChmaXh1cHMsIGxpbmspOworCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgKmZpeHVwcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithcHBseV9hbmRfZnJlZV9maXh1cHMgKERCdXNMaXN0ICAgICAgKipmaXh1cHMsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgaWYgKCpmaXh1cHMpCisgICAgX2RidXNfdmVyYm9zZSAoIiAlZCBGSVhVUFMgdG8gYXBwbHlcbiIsCisgICAgICAgICAgICAgICAgICAgX2RidXNfbGlzdF9nZXRfbGVuZ3RoIChmaXh1cHMpKTsKKyNlbmRpZgorCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChmaXh1cHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworCisgICAgICBuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChmaXh1cHMsIGxpbmspOworCisgICAgICBpZiAocmVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0FycmF5TGVuRml4dXAgKmY7CisKKyAgICAgICAgICBmID0gbGluay0+ZGF0YTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBhcHBseWluZyBGSVhVUCB0byByZWFkZXIgJXAgYXQgcG9zICVkIG5ld19sZW4gPSAlZCBvbGQgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwgZi0+bGVuX3Bvc19pbl9yZWFkZXIsIGYtPm5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bGVuX3Bvc19pbl9yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyLCBOVUxMKSk7CisjZW5kaWYKKworICAgICAgICAgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoKERCdXNTdHJpbmcqKSByZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmxlbl9wb3NfaW5fcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlcik7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgICpmaXh1cHMgPSBOVUxMOworfQorCisvKioKKyAqIFZpcnR1YWwgdGFibGUgZm9yIGEgdHlwZSByZWFkZXIuCisgKi8KK3N0cnVjdCBEQnVzVHlwZVJlYWRlckNsYXNzCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qKjwgbmFtZSBmb3IgZGVidWdnaW5nICovCisgIGludCAgICAgICAgIGlkOyAgICAgICAgIC8qKjwgaW5kZXggaW4gYWxsX3JlYWRlcl9jbGFzc2VzICovCisgIGRidXNfYm9vbF90IHR5cGVzX29ubHk7IC8qKjwgb25seSBpdGVyYXRlcyBvdmVyIHR5cGVzLCBub3QgdmFsdWVzICovCisgIHZvaWQgICAgICAgICgqIHJlY3Vyc2UpICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICAqcGFyZW50KTsgLyoqPCByZWN1cnNlIHdpdGggdGhpcyByZWFkZXIgYXMgc3ViICovCisgIGRidXNfYm9vbF90ICgqIGNoZWNrX2ZpbmlzaGVkKSAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7IC8qKjwgY2hlY2sgd2hldGhlciByZWFkZXIgaXMgYXQgdGhlIGVuZCAqLworICB2b2lkICAgICAgICAoKiBuZXh0KSAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSk7IC8qKjwgZ28gdG8gdGhlIG5leHQgdmFsdWUgKi8KK307CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdHlwZV9nZXRfYWxpZ25tZW50IChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zKQoreworICByZXR1cm4gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoc3RyLCBwb3MpKTsKK30KKworc3RhdGljIHZvaWQKK3JlYWRlcl9pbml0IChEQnVzVHlwZVJlYWRlciAgICAqcmVhZGVyLAorICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICByZWFkZXItPmJ5dGVfb3JkZXIgPSBieXRlX29yZGVyOworICByZWFkZXItPmZpbmlzaGVkID0gRkFMU0U7CisgIHJlYWRlci0+dHlwZV9zdHIgPSB0eXBlX3N0cjsKKyAgcmVhZGVyLT50eXBlX3BvcyA9IHR5cGVfcG9zOworICByZWFkZXItPnZhbHVlX3N0ciA9IHZhbHVlX3N0cjsKKyAgcmVhZGVyLT52YWx1ZV9wb3MgPSB2YWx1ZV9wb3M7Cit9CisKK3N0YXRpYyB2b2lkCitiYXNlX3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgLyogcG9pbnQgc3VicmVhZGVyIGF0IHRoZSBzYW1lIHBsYWNlIGFzIHBhcmVudCAqLworICByZWFkZXJfaW5pdCAoc3ViLAorICAgICAgICAgICAgICAgcGFyZW50LT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgcGFyZW50LT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgIHBhcmVudC0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICBwYXJlbnQtPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgIHBhcmVudC0+dmFsdWVfcG9zKTsKK30KKworc3RhdGljIHZvaWQKK3N0cnVjdF9vcl9kaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcGFyZW50KQoreworICBiYXNlX3JlYWRlcl9yZWN1cnNlIChzdWIsIHBhcmVudCk7CisgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MpID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIgfHwKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKSA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUik7CisKKyAgc3ViLT50eXBlX3BvcyArPSAxOworfQorCitzdGF0aWMgdm9pZAorc3RydWN0X29yX2RpY3RfZW50cnlfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgc3RydWN0X29yX2RpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSAoc3ViLCBwYXJlbnQpOworCisgIC8qIHN0cnVjdCBhbmQgZGljdCBlbnRyeSBoYXZlIDggYnl0ZSBhbGlnbm1lbnQgKi8KKyAgc3ViLT52YWx1ZV9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIDgpOworfQorCitzdGF0aWMgdm9pZAorYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIGJhc2VfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKworICAvKiBwb2ludCB0eXBlX3BvcyBhdCB0aGUgYXJyYXkgZWxlbWVudCB0eXBlICovCisgIHN1Yi0+dHlwZV9wb3MgKz0gMTsKKworICAvKiBJbml0IHdpdGggdmFsdWVzIGxpa2VseSB0byBjcmFzaCB0aGluZ3MgaWYgbWlzdXNlZCAqLworICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zID0gX0RCVVNfSU5UX01BWDsKKyAgc3ViLT5hcnJheV9sZW5fb2Zmc2V0ID0gNzsKK30KKworLyoqIGNvbXB1dGUgcG9zaXRpb24gb2YgYXJyYXkgbGVuZ3RoIGdpdmVuIGFycmF5X2xlbl9vZmZzZXQsIHdoaWNoIGlzCisgICAgdGhlIG9mZnNldCBiYWNrIGZyb20gc3RhcnRfcG9zIHRvIGVuZCBvZiB0aGUgbGVuICovCisjZGVmaW5lIEFSUkFZX1JFQURFUl9MRU5fUE9TKHJlYWRlcikgXAorICAoKHJlYWRlciktPnUuYXJyYXkuc3RhcnRfcG9zIC0gKChpbnQpKHJlYWRlciktPmFycmF5X2xlbl9vZmZzZXQpIC0gNCkKKworc3RhdGljIGludAorYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIGRidXNfdWludDMyX3QgYXJyYXlfbGVuOworICBpbnQgbGVuX3BvczsKKworICBsZW5fcG9zID0gQVJSQVlfUkVBREVSX0xFTl9QT1MgKHJlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAobGVuX3BvcywgNCkgPT0gKHVuc2lnbmVkKSBsZW5fcG9zKTsKKyAgYXJyYXlfbGVuID0gX2RidXNfdW5wYWNrX3VpbnQzMiAocmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnZhbHVlX3N0ciwgbGVuX3BvcywgNCkpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICAgcmVhZGVyICVwIGxlbl9wb3MgJWQgYXJyYXkgbGVuICV1IGxlbl9vZmZzZXQgJWRcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwgbGVuX3BvcywgYXJyYXlfbGVuLCByZWFkZXItPmFycmF5X2xlbl9vZmZzZXQpOworI2VuZGlmCisKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zIC0gbGVuX3BvcyAtIDQgPCA4KTsKKworICByZXR1cm4gYXJyYXlfbGVuOworfQorCitzdGF0aWMgdm9pZAorYXJyYXlfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgaW50IGFsaWdubWVudDsKKyAgaW50IGxlbl9wb3M7CisKKyAgYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSAoc3ViLCBwYXJlbnQpOworCisgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA0KTsKKworICBsZW5fcG9zID0gc3ViLT52YWx1ZV9wb3M7CisKKyAgc3ViLT52YWx1ZV9wb3MgKz0gNDsgLyogZm9yIHRoZSBsZW5ndGggKi8KKworICBhbGlnbm1lbnQgPSBlbGVtZW50X3R5cGVfZ2V0X2FsaWdubWVudCAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MpOworCisgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCBhbGlnbm1lbnQpOworCisgIHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgPSBzdWItPnZhbHVlX3BvczsKKyAgX2RidXNfYXNzZXJ0ICgoc3ViLT51LmFycmF5LnN0YXJ0X3BvcyAtIChsZW5fcG9zICsgNCkpIDwgOCk7IC8qIG9ubHkgMyBiaXRzIGluIGFycmF5X2xlbl9vZmZzZXQgKi8KKyAgc3ViLT5hcnJheV9sZW5fb2Zmc2V0ID0gc3ViLT51LmFycmF5LnN0YXJ0X3BvcyAtIChsZW5fcG9zICsgNCk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgICAgdHlwZSByZWFkZXIgJXAgYXJyYXkgc3RhcnQgPSAlZCBsZW5fb2Zmc2V0ID0gJWQgYXJyYXkgbGVuID0gJWQgYXJyYXkgZWxlbWVudCB0eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHN1YiwKKyAgICAgICAgICAgICAgICAgc3ViLT51LmFycmF5LnN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgc3ViLT5hcnJheV9sZW5fb2Zmc2V0LAorICAgICAgICAgICAgICAgICBhcnJheV9yZWFkZXJfZ2V0X2FycmF5X2xlbiAoc3ViKSwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChzdWItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MpKSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3ZhcmlhbnRfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcGFyZW50KQoreworICBpbnQgc2lnX2xlbjsKKyAgaW50IGNvbnRhaW5lZF9hbGlnbm1lbnQ7CisKKyAgYmFzZV9yZWFkZXJfcmVjdXJzZSAoc3ViLCBwYXJlbnQpOworCisgIC8qIFZhcmlhbnQgaXMgMSBieXRlIHNpZyBsZW5ndGggKHdpdGhvdXQgbnVsKSwgc2lnbmF0dXJlIHdpdGggbnVsLAorICAgKiBwYWRkaW5nIHRvIDgtYm91bmRhcnksIHRoZW4gdmFsdWVzCisgICAqLworCisgIHNpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN1Yi0+dmFsdWVfc3RyLCBzdWItPnZhbHVlX3Bvcyk7CisKKyAgc3ViLT50eXBlX3N0ciA9IHN1Yi0+dmFsdWVfc3RyOworICBzdWItPnR5cGVfcG9zID0gc3ViLT52YWx1ZV9wb3MgKyAxOworCisgIHN1Yi0+dmFsdWVfcG9zID0gc3ViLT50eXBlX3BvcyArIHNpZ19sZW4gKyAxOworCisgIGNvbnRhaW5lZF9hbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChzdWItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3BvcykpOworICAKKyAgc3ViLT52YWx1ZV9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIGNvbnRhaW5lZF9hbGlnbm1lbnQpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICAgIHR5cGUgcmVhZGVyICVwIHZhcmlhbnQgY29udGFpbmluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICBzdWIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MsIDApKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3JlYWRlcl9jaGVja19maW5pc2hlZCAoY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJlYWRlcikKK3sKKyAgaW50IGVuZF9wb3M7CisKKyAgLyogcmV0dXJuIHRoZSBhcnJheSBlbGVtZW50IHR5cGUgaWYgZWxlbWVudHMgcmVtYWluLCBhbmQKKyAgICogVFlQRV9JTlZBTElEIG90aGVyd2lzZQorICAgKi8KKworICBlbmRfcG9zID0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcyArIGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChyZWFkZXIpOworCisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPD0gZW5kX3Bvcyk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPj0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3Bvcyk7CisKKyAgcmV0dXJuIHJlYWRlci0+dmFsdWVfcG9zID09IGVuZF9wb3M7Cit9CisKK3N0YXRpYyB2b2lkCitza2lwX29uZV9jb21wbGV0ZV90eXBlIChjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnR5cGVfcG9zKQoreworICBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0IChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHR5cGVfc3RyKSwKKwkJCSAgICAgdHlwZV9wb3MpOworfQorCisvKioKKyAqIFNraXBzIHRvIHRoZSBuZXh0ICJjb21wbGV0ZSIgdHlwZSBpbnNpZGUgYSB0eXBlIHNpZ25hdHVyZS4KKyAqIFRoZSBzaWduYXR1cmUgaXMgcmVhZCBzdGFydGluZyBhdCB0eXBlX3BvcywgYW5kIHRoZSBuZXh0CisgKiB0eXBlIHBvc2l0aW9uIGlzIHN0b3JlZCBpbiB0aGUgc2FtZSB2YXJpYWJsZS4KKyAqCisgKiBAcGFyYW0gdHlwZV9zdHIgYSB0eXBlIHNpZ25hdHVyZSAobXVzdCBiZSB2YWxpZCkKKyAqIEBwYXJhbSB0eXBlX3BvcyBhbiBpbnRlZ2VyIHBvc2l0aW9uIGluIHRoZSB0eXBlIHNpZ25hdHVyZSAoaW4gYW5kIG91dCkKKyAqLwordm9pZAorX2RidXNfdHlwZV9zaWduYXR1cmVfbmV4dCAoY29uc3QgY2hhciAgICAgICAqdHlwZV9zdHIsCisJCQkgICBpbnQgICAgICAgICAgICAgICp0eXBlX3BvcykKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQ7CisKKyAgX2RidXNfYXNzZXJ0ICh0eXBlX3N0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0eXBlX3BvcyAhPSBOVUxMKTsKKyAgCisgIHN0YXJ0ID0gdHlwZV9zdHI7CisgIHAgPSBzdGFydCArICp0eXBlX3BvczsKKworICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAKKyAgd2hpbGUgKCpwID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICArK3A7CisKKyAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgCisgIGlmICgqcCA9PSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKQorICAgIHsKKyAgICAgIGludCBkZXB0aDsKKworICAgICAgZGVwdGggPSAxOworCisgICAgICB3aGlsZSAoVFJVRSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgKytwOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICBpZiAoKnAgPT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikKKyAgICAgICAgICAgIGRlcHRoICs9IDE7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gREJVU19TVFJVQ1RfRU5EX0NIQVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRlcHRoIC09IDE7CisgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoKnAgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpCisgICAgeworICAgICAgaW50IGRlcHRoOworCisgICAgICBkZXB0aCA9IDE7CisKKyAgICAgIHdoaWxlIChUUlVFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICArK3A7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgIGlmICgqcCA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikKKyAgICAgICAgICAgIGRlcHRoICs9IDE7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkZXB0aCAtPSAxOworICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICArK3A7CisgICAgfQorCisgICp0eXBlX3BvcyA9IChpbnQpIChwIC0gc3RhcnQpOworfQorCitzdGF0aWMgaW50CitmaW5kX2xlbl9vZl9jb21wbGV0ZV90eXBlIChjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zKQoreworICBpbnQgZW5kOworCisgIGVuZCA9IHR5cGVfcG9zOworCisgIHNraXBfb25lX2NvbXBsZXRlX3R5cGUgKHR5cGVfc3RyLCAmZW5kKTsKKworICByZXR1cm4gZW5kIC0gdHlwZV9wb3M7Cit9CisKK3N0YXRpYyB2b2lkCitiYXNlX3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSkKK3sKKyAgc3dpdGNoIChjdXJyZW50X3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICAvKiBTY2FuIGZvcndhcmQgb3ZlciB0aGUgZW50aXJlIGNvbnRhaW5lciBjb250ZW50cyAqLworICAgICAgeworICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisKKyAgICAgICAgaWYgKHJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkgJiYgY3VycmVudF90eXBlID09IERCVVNfVFlQRV9WQVJJQU5UKQorICAgICAgICAgIDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlY3Vyc2UgaW50byB0aGUgc3RydWN0IG9yIHZhcmlhbnQgKi8KKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgIC8qIFNraXAgZXZlcnl0aGluZyBpbiB0aGlzIHN1YnJlYWRlciAqLworICAgICAgICAgICAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdWIpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm90aGluZyAqLzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zID0gc3ViLnZhbHVlX3BvczsKKworICAgICAgICAvKiBOb3cgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBjb250YWluZXI7IGZvciB2YXJpYW50cywgdGhlCisgICAgICAgICAqIHN1YnJlYWRlcidzIHR5cGVfcG9zIGlzIHRvdGFsbHkgaW5hcHBsaWNhYmxlIChpdCdzIGluIHRoZQorICAgICAgICAgKiB2YWx1ZSBzdHJpbmcpIGJ1dCB3ZSBrbm93IHRoYXQgd2UgaW5jcmVtZW50IGJ5IG9uZSBwYXN0IHRoZQorICAgICAgICAgKiBEQlVTX1RZUEVfVkFSSUFOVAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfVkFSSUFOVCkKKyAgICAgICAgICByZWFkZXItPnR5cGVfcG9zICs9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZWFkZXItPnR5cGVfcG9zID0gc3ViLnR5cGVfcG9zOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIHsKKyAgICAgICAgaWYgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9hcnJheSAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT52YWx1ZV9wb3MpOworCisgICAgICAgIHNraXBfb25lX2NvbXBsZXRlX3R5cGUgKHJlYWRlci0+dHlwZV9zdHIsICZyZWFkZXItPnR5cGVfcG9zKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSkKKyAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2Jhc2ljIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3R5cGUsIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT52YWx1ZV9wb3MpOworCisgICAgICByZWFkZXItPnR5cGVfcG9zICs9IDE7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzdHJ1Y3RfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3R5cGUpCit7CisgIGludCB0OworCisgIGJhc2VfcmVhZGVyX25leHQgKHJlYWRlciwgY3VycmVudF90eXBlKTsKKworICAvKiBmb3IgU1RSVUNUIGNvbnRhaW5lcnMgd2UgcmV0dXJuIEZBTFNFIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdCwKKyAgICogZm9yIElOVkFMSUQgd2UgcmV0dXJuIEZBTFNFIGF0IHRoZSBlbmQgb2YgdGhlIHNpZ25hdHVyZS4KKyAgICogSW4gYm90aCBjYXNlcyB3ZSBhcnJhbmdlIGZvciBnZXRfY3VycmVudF90eXBlKCkgdG8gcmV0dXJuIElOVkFMSUQKKyAgICogd2hpY2ggaXMgZGVmaW5lZCB0byBoYXBwZW4gaWZmIHdlJ3JlIGF0IHRoZSBlbmQgKG5vIG1vcmUgbmV4dCgpKQorICAgKi8KKyAgdCA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3Bvcyk7CisgIGlmICh0ID09IERCVVNfU1RSVUNUX0VORF9DSEFSKQorICAgIHsKKyAgICAgIHJlYWRlci0+dHlwZV9wb3MgKz0gMTsKKyAgICAgIHJlYWRlci0+ZmluaXNoZWQgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RpY3RfZW50cnlfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlKQoreworICBpbnQgdDsKKworICBiYXNlX3JlYWRlcl9uZXh0IChyZWFkZXIsIGN1cnJlbnRfdHlwZSk7CisKKyAgLyogZm9yIFNUUlVDVCBjb250YWluZXJzIHdlIHJldHVybiBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QsCisgICAqIGZvciBJTlZBTElEIHdlIHJldHVybiBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZSBzaWduYXR1cmUuCisgICAqIEluIGJvdGggY2FzZXMgd2UgYXJyYW5nZSBmb3IgZ2V0X2N1cnJlbnRfdHlwZSgpIHRvIHJldHVybiBJTlZBTElECisgICAqIHdoaWNoIGlzIGRlZmluZWQgdG8gaGFwcGVuIGlmZiB3ZSdyZSBhdCB0aGUgZW5kIChubyBtb3JlIG5leHQoKSkKKyAgICovCisgIHQgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MpOworICBpZiAodCA9PSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpCisgICAgeworICAgICAgcmVhZGVyLT50eXBlX3BvcyArPSAxOworICAgICAgcmVhZGVyLT5maW5pc2hlZCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfbmV4dCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3R5cGUpCit7CisgIC8qIFdlIGhhdmUgb25lICJlbGVtZW50IiB0byBiZSBpdGVyYXRlZCBvdmVyCisgICAqIGluIGVhY2ggYXJyYXksIHdoaWNoIGlzIGl0cyBlbGVtZW50IHR5cGUuCisgICAqIFNvIHRoZSBmaW5pc2hlZCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlJ3ZlCisgICAqIGl0ZXJhdGVkIG92ZXIgaXQgeWV0IG9yIG5vdC4KKyAgICovCisgIHJlYWRlci0+ZmluaXNoZWQgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYXJyYXlfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSkKK3sKKyAgLyogU2tpcCBvbmUgYXJyYXkgZWxlbWVudCAqLworICBpbnQgZW5kX3BvczsKKworICBlbmRfcG9zID0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcyArIGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChyZWFkZXIpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICByZWFkZXIgJXAgYXJyYXkgbmV4dCBTVEFSVCBzdGFydF9wb3MgPSAlZCBlbmRfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgY3VycmVudF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgZW5kX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpKTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPCBlbmRfcG9zKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3BvcyA+PSByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zKTsKKworICBzd2l0Y2ggKF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zKSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIHsKKyAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworCisgICAgICAgIC8qIFJlY3Vyc2UgaW50byB0aGUgc3RydWN0IG9yIHZhcmlhbnQgKi8KKyAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgICAvKiBTa2lwIGV2ZXJ5dGhpbmcgaW4gdGhpcyBlbGVtZW50ICovCisgICAgICAgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3ViKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBub3RoaW5nICovOworICAgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBlbGVtZW50ICovCisgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zID0gc3ViLnZhbHVlX3BvczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICB7CisgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9hcnJheSAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlci0+dmFsdWVfcG9zKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2Jhc2ljIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3R5cGUsIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT52YWx1ZV9wb3MpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICByZWFkZXIgJXAgYXJyYXkgbmV4dCBFTkQgc3RhcnRfcG9zID0gJWQgZW5kX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIGN1cnJlbnRfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsCisgICAgICAgICAgICAgICAgIHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgIGVuZF9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zIDw9IGVuZF9wb3MpOworCisgIGlmIChyZWFkZXItPnZhbHVlX3BvcyA9PSBlbmRfcG9zKQorICAgIHsKKyAgICAgIHNraXBfb25lX2NvbXBsZXRlX3R5cGUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT50eXBlX3Bvcyk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBib2R5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImJvZHkiLCAwLAorICBGQUxTRSwKKyAgTlVMTCwgLyogYm9keSBpcyBhbHdheXMgdG9wbGV2ZWwsIHNvIGRvZXNuJ3QgZ2V0IHJlY3Vyc2VkIGludG8gKi8KKyAgTlVMTCwKKyAgYmFzZV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgYm9keV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImJvZHkgdHlwZXMiLCAxLAorICBUUlVFLAorICBOVUxMLCAvKiBib2R5IGlzIGFsd2F5cyB0b3BsZXZlbCwgc28gZG9lc24ndCBnZXQgcmVjdXJzZWQgaW50byAqLworICBOVUxMLAorICBiYXNlX3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBzdHJ1Y3RfcmVhZGVyX2NsYXNzID0geworICAic3RydWN0IiwgMiwKKyAgRkFMU0UsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBzdHJ1Y3RfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIHN0cnVjdF90eXBlc19vbmx5X3JlYWRlcl9jbGFzcyA9IHsKKyAgInN0cnVjdCB0eXBlcyIsIDMsCisgIFRSVUUsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIHN0cnVjdF9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgZGljdF9lbnRyeV9yZWFkZXJfY2xhc3MgPSB7CisgICJkaWN0X2VudHJ5IiwgNCwKKyAgRkFMU0UsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBkaWN0X2VudHJ5X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBkaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzID0geworICAiZGljdF9lbnRyeSB0eXBlcyIsIDUsCisgIFRSVUUsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIGRpY3RfZW50cnlfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIGFycmF5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImFycmF5IiwgNiwKKyAgRkFMU0UsCisgIGFycmF5X3JlYWRlcl9yZWN1cnNlLAorICBhcnJheV9yZWFkZXJfY2hlY2tfZmluaXNoZWQsCisgIGFycmF5X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBhcnJheV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImFycmF5IHR5cGVzIiwgNywKKyAgVFJVRSwKKyAgYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSwKKyAgTlVMTCwKKyAgYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgdmFyaWFudF9yZWFkZXJfY2xhc3MgPSB7CisgICJ2YXJpYW50IiwgOCwKKyAgRkFMU0UsCisgIHZhcmlhbnRfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIGJhc2VfcmVhZGVyX25leHQKK307CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgKiBjb25zdAorYWxsX3JlYWRlcl9jbGFzc2VzW10gPSB7CisgICZib2R5X3JlYWRlcl9jbGFzcywKKyAgJmJvZHlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MsCisgICZzdHJ1Y3RfcmVhZGVyX2NsYXNzLAorICAmc3RydWN0X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzLAorICAmZGljdF9lbnRyeV9yZWFkZXJfY2xhc3MsCisgICZkaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzLAorICAmYXJyYXlfcmVhZGVyX2NsYXNzLAorICAmYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MsCisgICZ2YXJpYW50X3JlYWRlcl9jbGFzcworfTsKKyNlbmRpZgorCisvKioKKyAqIEluaXRpYWxpemVzIGEgdHlwZSByZWFkZXIuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgYmxvY2sgdG8gcmVhZAorICogQHBhcmFtIHR5cGVfc3RyIHRoZSBzaWduYXR1cmUgb2YgdGhlIGJsb2NrIHRvIHJlYWQKKyAqIEBwYXJhbSB0eXBlX3BvcyBsb2NhdGlvbiBvZiBzaWduYXR1cmUKKyAqIEBwYXJhbSB2YWx1ZV9zdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHZhbHVlcyBibG9jaworICogQHBhcmFtIHZhbHVlX3BvcyBzdGFydCBvZiB2YWx1ZXMgYmxvY2sKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoREJ1c1R5cGVSZWFkZXIgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIHJlYWRlci0+a2xhc3MgPSAmYm9keV9yZWFkZXJfY2xhc3M7CisKKyAgcmVhZGVyX2luaXQgKHJlYWRlciwgYnl0ZV9vcmRlciwgdHlwZV9zdHIsIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZV9wb3MpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBpbml0IHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQoKSBidXQgdGhlIGl0ZXJhdGlvbiBpcyBvdmVyIHRoZQorICogc2lnbmF0dXJlLCBub3Qgb3ZlciB2YWx1ZXMuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHNpZ25hdHVyZSBzdHJpbmcKKyAqIEBwYXJhbSB0eXBlX3BvcyBsb2NhdGlvbiBpbiB0aGUgc2lnbmF0dXJlIHN0cmluZworICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKERCdXNUeXBlUmVhZGVyICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGVfcG9zKQoreworICByZWFkZXItPmtsYXNzID0gJmJvZHlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3M7CisKKyAgcmVhZGVyX2luaXQgKHJlYWRlciwgREJVU19DT01QSUxFUl9CWVRFX09SREVSIC8qIGlycmVsZXZhbnQgKi8sCisgICAgICAgICAgICAgICB0eXBlX3N0ciwgdHlwZV9wb3MsIE5VTEwsIF9EQlVTX0lOVF9NQVggLyogY3Jhc2hlcyBpZiB3ZSBzY3JldyB1cCAqLyk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgcmVhZGVyICVwIGluaXQgdHlwZXMgb25seSB0eXBlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0aGUgcmVhZGVyIGlzIGN1cnJlbnRseSBwb2ludGluZyB0bzsKKyAqIG9yIGZvciBhIHR5cGVzLW9ubHkgcmVhZGVyIGdldHMgdGhlIHR5cGUgaXQncyBjdXJyZW50bHkgcG9pbnRpbmcgdG8uCisgKiBJZiB0aGUgcmVhZGVyIGlzIGF0IHRoZSBlbmQgb2YgYSBibG9jayBvciBlbmQgb2YgYSBjb250YWluZXIgc3VjaAorICogYXMgYW4gYXJyYXksIHJldHVybnMgI0RCVVNfVFlQRV9JTlZBTElELgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICovCitpbnQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIGludCB0OworCisgIGlmIChyZWFkZXItPmZpbmlzaGVkIHx8CisgICAgICAocmVhZGVyLT5rbGFzcy0+Y2hlY2tfZmluaXNoZWQgJiYKKyAgICAgICAoKiByZWFkZXItPmtsYXNzLT5jaGVja19maW5pc2hlZCkgKHJlYWRlcikpKQorICAgIHQgPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgZWxzZQorICAgIHQgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MpOworCisgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUik7CisgIAorI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgY3VycmVudCB0eXBlX3BvcyA9ICVkIHR5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodCkpOworI2VuZGlmCisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IG9mIHRoZSBhcnJheSB0aGUgcmVhZGVyIGlzIGN1cnJlbnRseQorICogcG9pbnRpbmcgdG8uIEl0J3MgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGlmCisgKiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlKCkgZG9lc24ndCByZXR1cm4gI0RCVVNfVFlQRV9BUlJBWQorICogZm9yIHRoaXMgcmVhZGVyLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICovCitpbnQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKQoreworICBpbnQgZWxlbWVudF90eXBlOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpOworCisgIGVsZW1lbnRfdHlwZSA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcyArIDEpOworCisgIHJldHVybiBlbGVtZW50X3R5cGU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdmFsdWUgYmxvY2sKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICovCitpbnQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKQoreworICByZXR1cm4gcmVhZGVyLT52YWx1ZV9wb3M7Cit9CisKKy8qKgorICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBtYXJzaGFsZWQgdmFsdWUgaW4gdGhlIGRhdGEgYmVpbmcgcmVhZC4gIFRoZQorICogYWRkcmVzcyBtYXkgbm90IGJlIGFsaWduZWQ7IHlvdSBoYXZlIHRvIGFsaWduIGl0IHRvIHRoZSB0eXBlIG9mIHRoZQorICogdmFsdWUgeW91IHdhbnQgdG8gcmVhZC4gTW9zdCBvZiB0aGUgZGVtYXJzaGFsIHJvdXRpbmVzIGRvIHRoaXMgZm9yCisgKiB5b3UuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gdmFsdWVfbG9jYXRpb24gdGhlIGFkZHJlc3Mgb2YgdGhlIG1hcnNoYWxlZCB2YWx1ZQorICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9yZWFkX3JhdyAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKip2YWx1ZV9sb2NhdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0ICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSk7CisKKyAgKnZhbHVlX2xvY2F0aW9uID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKK30KKworLyoqCisgKiBSZWFkcyBhIGJhc2ljLXR5cGVkIHZhbHVlLCBhcyB3aXRoIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYygpLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZQorICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChjb25zdCBEQnVzVHlwZVJlYWRlciAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnZhbHVlKQoreworICBpbnQgdDsKKworICBfZGJ1c19hc3NlcnQgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KTsKKworICB0ID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKTsKKworICBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCByZWFkIGJhc2ljIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5LgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciB0byByZWFkIGZyb20KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5CisgKi8KK2ludAorX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2FycmF5X2xlbmd0aCAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+a2xhc3MgPT0gJmFycmF5X3JlYWRlcl9jbGFzcyk7CisKKyAgcmV0dXJuIGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChyZWFkZXIpOworfQorCisvKioKKyAqIFJlYWRzIGEgYmxvY2sgb2YgZml4ZWQtbGVuZ3RoIGJhc2ljIHZhbHVlcywgZnJvbSB0aGUgY3VycmVudCBwb2ludAorICogaW4gYW4gYXJyYXkgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuICBEb2VzIG5vdCB3b3JrIGZvciBhcnJheXMgb2YKKyAqIHN0cmluZyBvciBjb250YWluZXIgdHlwZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhcnJheSBpbi1wbGFjZTsgaXQgZG9lcyBub3QgbWFrZSBhIGNvcHksCisgKiBhbmQgaXQgZG9lcyBub3Qgc3dhcCB0aGUgYnl0ZXMuCisgKgorICogSWYgeW91IGFzayBmb3IgI0RCVVNfVFlQRV9ET1VCTEUgeW91IHdpbGwgZ2V0IGEgImNvbnN0IGRvdWJsZSoiIGJhY2sKKyAqIGFuZCB0aGUgInZhbHVlIiBhcmd1bWVudCBzaG91bGQgYmUgYSAiY29uc3QgZG91YmxlKioiIGFuZCBzbyBvbi4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gdmFsdWUgcGxhY2UgdG8gcmV0dXJuIHRoZSBhcnJheSB2YWx1ZXMKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIHBsYWNlIHRvIHJldHVybiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9maXhlZF9tdWx0aSAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpuX2VsZW1lbnRzKQoreworICBpbnQgZWxlbWVudF90eXBlOworICBpbnQgZW5kX3BvczsKKyAgaW50IHJlbWFpbmluZ19sZW47CisgIGludCBhbGlnbm1lbnQ7CisgIGludCB0b3RhbF9sZW47CisKKyAgX2RidXNfYXNzZXJ0ICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT5rbGFzcyA9PSAmYXJyYXlfcmVhZGVyX2NsYXNzKTsKKworICBlbGVtZW50X3R5cGUgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MpOworCisgIF9kYnVzX2Fzc2VydCAoZWxlbWVudF90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKTsgLyogd2h5IHdlIGRvbid0IHVzZSBnZXRfY3VycmVudF90eXBlKCkgKi8KKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkpOworCisgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKTsKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zID49IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MpOworCisgIHRvdGFsX2xlbiA9IGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChyZWFkZXIpOworICBlbmRfcG9zID0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcyArIHRvdGFsX2xlbjsKKyAgcmVtYWluaW5nX2xlbiA9IGVuZF9wb3MgLSByZWFkZXItPnZhbHVlX3BvczsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoImVuZF9wb3MgJWQgdG90YWxfbGVuICVkIHJlbWFpbmluZ19sZW4gJWQgdmFsdWVfcG9zICVkXG4iLAorICAgICAgICAgICAgICAgICBlbmRfcG9zLCB0b3RhbF9sZW4sIHJlbWFpbmluZ19sZW4sIHJlYWRlci0+dmFsdWVfcG9zKTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAocmVtYWluaW5nX2xlbiA8PSB0b3RhbF9sZW4pOworCisgIGlmIChyZW1haW5pbmdfbGVuID09IDApCisgICAgKihjb25zdCBEQnVzQmFzaWNWYWx1ZSoqKSB2YWx1ZSA9IE5VTEw7CisgIGVsc2UKKyAgICAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopIHZhbHVlID0KKyAgICAgICh2b2lkKikgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdfbGVuKTsKKworICAqbl9lbGVtZW50cyA9IHJlbWFpbmluZ19sZW4gLyBhbGlnbm1lbnQ7CisgIF9kYnVzX2Fzc2VydCAoKHJlbWFpbmluZ19sZW4gJSBhbGlnbm1lbnQpID09IDApOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCByZWFkIGZpeGVkIGFycmF5IHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBJbml0aWFsaXplIGEgbmV3IHJlYWRlciBwb2ludGluZyB0byB0aGUgZmlyc3QgdHlwZSBhbmQKKyAqIGNvcnJlc3BvbmRpbmcgdmFsdWUgdGhhdCdzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgY29udGFpbmVyLiBJdCdzCisgKiBhbiBlcnJvciB0byBjYWxsIHRoaXMgaWYgdGhlIGN1cnJlbnQgdHlwZSBpcyBhIG5vbi1jb250YWluZXIuCisgKgorICogTm90ZSB0aGF0IERCdXNUeXBlUmVhZGVyIHRyYXZlcnNlcyB2YWx1ZXMsIG5vdCB0eXBlcy4gU28gaWYgeW91CisgKiBoYXZlIGFuIGVtcHR5IGFycmF5IG9mIGFycmF5IG9mIGludCwgeW91IGNhbid0IHJlY3Vyc2UgaW50byBpdC4gWW91CisgKiBjYW4gb25seSByZWN1cnNlIGludG8gZWFjaCBlbGVtZW50LgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHN1YiBhIHJlYWRlciB0byBpbml0IHBvaW50aW5nIHRvIHRoZSBmaXJzdCBjaGlsZAorICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnN1YikKK3sKKyAgaW50IHQ7CisKKyAgdCA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zKTsKKworICBzd2l0Y2ggKHQpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBzdWItPmtsYXNzID0gJnN0cnVjdF90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAgc3ViLT5rbGFzcyA9ICZzdHJ1Y3RfcmVhZGVyX2NsYXNzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBzdWItPmtsYXNzID0gJmRpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3M7CisgICAgICBlbHNlCisgICAgICAgIHN1Yi0+a2xhc3MgPSAmZGljdF9lbnRyeV9yZWFkZXJfY2xhc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBzdWItPmtsYXNzID0gJmFycmF5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzOworICAgICAgZWxzZQorICAgICAgICBzdWItPmtsYXNzID0gJmFycmF5X3JlYWRlcl9jbGFzczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICBpZiAocmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY2FuJ3QgcmVjdXJzZSBpbnRvIHZhcmlhbnQgdHlwZWNvZGUiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3ViLT5rbGFzcyA9ICZ2YXJpYW50X3JlYWRlcl9jbGFzczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c192ZXJib3NlICgicmVjdXJzaW5nIGludG8gdHlwZSAlc1xuIiwgX2RidXNfdHlwZV90b19zdHJpbmcgKHQpKTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICAgICAgaWYgKHQgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiWW91IGNhbid0IHJlY3Vyc2UgaW50byBhbiBlbXB0eSBhcnJheSBvciBvZmYgdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm9keVxuIik7CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb24ndCB5ZXQgaGFuZGxlIHJlY3Vyc2luZyBpbnRvIHRoaXMgdHlwZSIpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHN1Yi0+a2xhc3MgPT0gYWxsX3JlYWRlcl9jbGFzc2VzW3N1Yi0+a2xhc3MtPmlkXSk7CisKKyAgKCogc3ViLT5rbGFzcy0+cmVjdXJzZSkgKHN1YiwgcmVhZGVyKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgUkVDVVJTRUQgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHN1Yiwgc3ViLT50eXBlX3Bvcywgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN1Yi0+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+a2xhc3MgPT0gJmFycmF5X3JlYWRlcl9jbGFzcyk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFyZXBsYWNlbWVudF9ibG9ja19pbml0ICgmYmxvY2ssIHJlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghcmVwbGFjZW1lbnRfYmxvY2tfcmVwbGFjZSAoJmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHJlcGxhY2VtZW50X2Jsb2NrX2ZyZWUgKCZibG9jayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQ29tcGFyZXMgdHdvIHJlYWRlcnMsIHdoaWNoIG11c3QgYmUgaXRlcmF0aW5nIG92ZXIgdGhlIHNhbWUgdmFsdWUgZGF0YS4KKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBmdXJ0aGVyIGFsb25nIHRoYW4gdGhlIHNlY29uZCBwYXJhbWV0ZXIuCisgKgorICogQHBhcmFtIGxocyBsZWZ0LWhhbmQtc2lkZSAoZmlyc3QpIHBhcmFtZXRlcgorICogQHBhcmFtIHJocyBsZWZ0LWhhbmQtc2lkZSAoZmlyc3QpIHBhcmFtZXRlcgorICogQHJldHVybnMgd2hldGhlciBsaHMgaXMgZ3JlYXRlciB0aGFuIHJocworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfZ3JlYXRlcl90aGFuIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyaHMpCit7CisgIF9kYnVzX2Fzc2VydCAobGhzLT52YWx1ZV9zdHIgPT0gcmhzLT52YWx1ZV9zdHIpOworCisgIHJldHVybiBsaHMtPnZhbHVlX3BvcyA+IHJocy0+dmFsdWVfcG9zOworfQorCisvKgorICoKKyAqCisgKiAgICAgICAgIERCdXNUeXBlV3JpdGVyCisgKgorICoKKyAqCisgKi8KKworLyoqCisgKiBJbml0aWFsaXplIGEgd3JpdGUgaXRlcmF0b3IsIHdoaWNoIGlzIHVzZWQgdG8gd3JpdGUgb3V0IHZhbHVlcyBpbgorICogc2VyaWFsaXplZCBELUJ1cyBmb3JtYXQuCisgKgorICogVGhlIHR5cGVfcG9zIHBhc3NlZCBpbiBpcyBleHBlY3RlZCB0byBiZSBpbnNpZGUgYW4gYWxyZWFkeS12YWxpZCwKKyAqIHRob3VnaCBwb3RlbnRpYWxseSBlbXB0eSwgdHlwZSBzaWduYXR1cmUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYnl0ZQorICogYWZ0ZXIgdHlwZV9wb3MgbXVzdCBiZSBlaXRoZXIgI0RCVVNfVFlQRV9JTlZBTElEIChha2EgbnVsKSBvciBzb21lCisgKiBvdGhlciB2YWxpZCB0eXBlLiAjREJ1c1R5cGVXcml0ZXIgd29uJ3QgZW5mb3JjZSB0aGF0IHRoZSBzaWduYXR1cmUKKyAqIGlzIGFscmVhZHkgdmFsaWQgKHlvdSBjYW4gYXBwZW5kIHRoZSBudWwgYnl0ZSBhdCB0aGUgZW5kIGlmIHlvdQorICogbGlrZSksIGJ1dCBqdXN0IGJlIGF3YXJlIHRoYXQgeW91IG5lZWQgdGhlIG51bCBieXRlIGV2ZW50dWFsbHkgYW5kCisgKiAjREJ1c1R5cGVXcml0ZXIgaXNuJ3QgZ29pbmcgdG8gd3JpdGUgaXQgZm9yIHlvdS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gbWFyc2hhbCBpbnRvCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHN0cmluZyB0byB3cml0ZSB0eXBlY29kZXMgaW50bworICogQHBhcmFtIHR5cGVfcG9zIHdoZXJlIHRvIGluc2VydCB0eXBlY29kZXMKKyAqIEBwYXJhbSB2YWx1ZV9zdHIgdGhlIHN0cmluZyB0byB3cml0ZSB2YWx1ZXMgaW50bworICogQHBhcmFtIHZhbHVlX3BvcyB3aGVyZSB0byBpbnNlcnQgdmFsdWVzCisgKgorICovCit2b2lkCitfZGJ1c190eXBlX3dyaXRlcl9pbml0IChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHZhbHVlX3BvcykKK3sKKyAgd3JpdGVyLT5ieXRlX29yZGVyID0gYnl0ZV9vcmRlcjsKKyAgd3JpdGVyLT50eXBlX3N0ciA9IHR5cGVfc3RyOworICB3cml0ZXItPnR5cGVfcG9zID0gdHlwZV9wb3M7CisgIHdyaXRlci0+dmFsdWVfc3RyID0gdmFsdWVfc3RyOworICB3cml0ZXItPnZhbHVlX3BvcyA9IHZhbHVlX3BvczsKKyAgd3JpdGVyLT5jb250YWluZXJfdHlwZSA9IERCVVNfVFlQRV9JTlZBTElEOworICB3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uID0gRkFMU0U7CisgIHdyaXRlci0+ZW5hYmxlZCA9IFRSVUU7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgid3JpdGVyICVwIGluaXQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIik7CisjZW5kaWYKK30KKworLyoqCisgKiBJbml0aWFsaXplIGEgd3JpdGUgaXRlcmF0b3IsIHdpdGggdGhlIHNpZ25hdHVyZSB0byBiZSBwcm92aWRlZAorICogbGF0ZXIuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIGluaXQKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIG1hcnNoYWwgaW50bworICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHZhbHVlcyBpbnRvCisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRvIGluc2VydCB2YWx1ZXMKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2luaXRfdHlwZXNfZGVsYXllZCAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgKHdyaXRlciwgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgdmFsdWVfc3RyLCB2YWx1ZV9wb3MpOworfQorCisvKioKKyAqIEFkZHMgdHlwZSBzdHJpbmcgdG8gdGhlIHdyaXRlciwgaWYgaXQgaGFkIG5vbmUuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIGluaXQKKyAqIEBwYXJhbSB0eXBlX3N0ciB0eXBlIHN0cmluZyB0byBhZGQKKyAqIEBwYXJhbSB0eXBlX3BvcyB0eXBlIHBvc2l0aW9uCisgKgorICovCit2b2lkCitfZGJ1c190eXBlX3dyaXRlcl9hZGRfdHlwZXMgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHR5cGVfcG9zKQoreworICBpZiAod3JpdGVyLT50eXBlX3N0ciA9PSBOVUxMKSAvKiBrZWVwcyB1cyBmcm9tIHVzaW5nIHRoaXMgYXMgc2V0dGVyICovCisgICAgeworICAgICAgd3JpdGVyLT50eXBlX3N0ciA9IHR5cGVfc3RyOworICAgICAgd3JpdGVyLT50eXBlX3BvcyA9IHR5cGVfcG9zOworICAgIH0KK30KKworLyoqCisgKiBSZW1vdmVzIHR5cGUgc3RyaW5nIGZyb20gdGhlIHdyaXRlci4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gcmVtb3ZlIGZyb20KKyAqLwordm9pZAorX2RidXNfdHlwZV93cml0ZXJfcmVtb3ZlX3R5cGVzIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyKQoreworICB3cml0ZXItPnR5cGVfc3RyID0gTlVMTDsKKyAgd3JpdGVyLT50eXBlX3BvcyA9IC0xOworfQorCisvKioKKyAqIExpa2UgX2RidXNfdHlwZV93cml0ZXJfaW5pdCgpLCBleGNlcHQgdGhlIHR5cGUgc3RyaW5nCisgKiBwYXNzZWQgaW4gc2hvdWxkIGNvcnJlc3BvbmQgdG8gYW4gZXhpc3Rpbmcgc2lnbmF0dXJlIHRoYXQKKyAqIG1hdGNoZXMgd2hhdCB5b3UncmUgZ29pbmcgdG8gd3JpdGUgb3V0LiBUaGUgd3JpdGVyIHdpbGwKKyAqIGNoZWNrIHdoYXQgeW91IHdyaXRlIHZzLiB0aGlzIGV4aXN0aW5nIHNpZ25hdHVyZS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gbWFyc2hhbCBpbnRvCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHN0cmluZyB3aXRoIHNpZ25hdHVyZQorICogQHBhcmFtIHR5cGVfcG9zIHN0YXJ0IG9mIHNpZ25hdHVyZQorICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHZhbHVlcyBpbnRvCisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRvIGluc2VydCB2YWx1ZXMKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2luaXRfdmFsdWVzX29ubHkgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0ICh3cml0ZXIsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nKil0eXBlX3N0ciwgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0ciwgdmFsdWVfcG9zKTsKKworICB3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uID0gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpY19ub190eXBlY29kZSAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAqdmFsdWUpCit7CisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgcmV0dXJuIF9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgKHdyaXRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlci0+dmFsdWVfcG9zKTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKiBJZiBvdXIgcGFyZW50IGlzIGFuIGFycmF5LCB0aGluZ3MgYXJlIGEgbGl0dGxlIGJpdCBjb21wbGljYXRlZC4KKyAqCisgKiBUaGUgcGFyZW50IG11c3QgaGF2ZSBhIGNvbXBsZXRlIGVsZW1lbnQgdHlwZSwgc3VjaCBhcworICogImkiIG9yICJhYWkiIG9yICIoaWkpIiBvciAiYShpaSkiLiBUaGVyZSBjYW4ndCBiZQorICogdW5jbG9zZWQgcGFyZW5zLCBvciBhbiAiYSIgd2l0aCBubyBmb2xsb3dpbmcgdHlwZS4KKyAqCisgKiBUbyByZWN1cnNlLCB0aGUgb25seSBhbGxvd2VkIG9wZXJhdGlvbiBpcyB0byByZWN1cnNlIGludG8gdGhlCisgKiBmaXJzdCB0eXBlIGluIHRoZSBlbGVtZW50IHR5cGUuIFNvIGZvciAiaSIgeW91IGNhbid0IHJlY3Vyc2UsIGZvcgorICogImFpIiB5b3UgY2FuIHJlY3Vyc2UgaW50byB0aGUgYXJyYXksIGZvciAiKGlpKSIgeW91IGNhbiByZWN1cnNlCisgKiBpbnRvIHRoZSBzdHJ1Y3QuCisgKgorICogSWYgeW91IHJlY3Vyc2UgaW50byB0aGUgYXJyYXkgZm9yICJhaSIsIHRoZW4geW91IG11c3Qgc3BlY2lmeQorICogImkiIGZvciB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBhcnJheSB5b3UgcmVjdXJzZSBpbnRvLgorICoKKyAqIFdoaWxlIGluc2lkZSBhbiBhcnJheSBhdCBhbnkgbGV2ZWwsIHdlIG5lZWQgdG8gYXZvaWQgd3JpdGluZyB0bworICogdHlwZV9zdHIsIHNpbmNlIHRoZSB0eXBlIG9ubHkgYXBwZWFycyBvbmNlIGZvciB0aGUgd2hvbGUgYXJyYXksCisgKiBpdCBkb2VzIG5vdCBhcHBlYXIgZm9yIGVhY2ggYXJyYXkgZWxlbWVudC4KKyAqCisgKiBXaGlsZSBpbnNpZGUgYW4gYXJyYXkgdHlwZV9wb3MgcG9pbnRzIHRvIHRoZSBleHBlY3RlZCBuZXh0CisgKiB0eXBlY29kZSwgcmF0aGVyIHRoYW4gdGhlIG5leHQgcGxhY2Ugd2UgY291bGQgd3JpdGUgYSB0eXBlY29kZS4KKyAqLworc3RhdGljIHZvaWQKK3dyaXRlcl9yZWN1cnNlX2luaXRfYW5kX2NoZWNrIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqc3ViKQoreworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0IChzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dmFsdWVfcG9zKTsKKworICBzdWItPmNvbnRhaW5lcl90eXBlID0gY29udGFpbmVyX3R5cGU7CisKKyAgaWYgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gfHwKKyAgICAgIChzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSB8fCBzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9WQVJJQU5UKSkKKyAgICBzdWItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uID0gVFJVRTsKKyAgZWxzZQorICAgIHN1Yi0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBGQUxTRTsKKworICBzdWItPmVuYWJsZWQgPSB3cml0ZXItPmVuYWJsZWQ7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAod3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiAmJiB3cml0ZXItPnR5cGVfc3RyKQorICAgIHsKKyAgICAgIGludCBleHBlY3RlZDsKKworICAgICAgZXhwZWN0ZWQgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3Bvcyk7CisKKyAgICAgIGlmIChleHBlY3RlZCAhPSBzdWItPmNvbnRhaW5lcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJXcml0aW5nIGFuIGVsZW1lbnQgb2YgdHlwZSAlcywgYnV0IHRoZSBleHBlY3RlZCB0eXBlIGhlcmUgaXMgJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG92ZXJhbGwgc2lnbmF0dXJlIGV4cGVjdGVkIGhlcmUgd2FzICclcycgYW5kIHdlIGFyZSBvbiBieXRlICVkIG9mIHRoYXQgc2lnbmF0dXJlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoc3ViLT5jb250YWluZXJfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHdyaXRlci0+dHlwZV9zdHIpLCB3cml0ZXItPnR5cGVfcG9zKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIldyaXRpbmcgYW4gZWxlbWVudCBvZiB0eXBlICVzLCBidXQgbm8gdmFsdWUgaXMgZXhwZWN0ZWQgaGVyZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChzdWItPmNvbnRhaW5lcl90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHdyaXRlci0+dHlwZV9zdHIpLCB3cml0ZXItPnR5cGVfcG9zKTsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJiYWQgYXJyYXkgZWxlbWVudCBvciB2YXJpYW50IGNvbnRlbnQgd3JpdHRlbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIERCVVNfRElTQUJMRV9DSEVDS1MgKi8KKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIHJlY3Vyc2UgcGFyZW50ICVzIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCByZW1haW5pbmcgc2lnICclcycgZW5hYmxlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh3cml0ZXItPmNvbnRhaW5lcl90eXBlKSwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3Bvcywgd3JpdGVyLT52YWx1ZV9wb3MsIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24sCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT5lbmFibGVkKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgcmVjdXJzZSBzdWIgJXMgICB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIGlzX2V4cGVjdGF0aW9uID0gJWQgZW5hYmxlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBzdWIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChzdWItPmNvbnRhaW5lcl90eXBlKSwKKyAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3Bvcywgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24sCisgICAgICAgICAgICAgICAgIHN1Yi0+ZW5hYmxlZCk7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0eXBlY29kZSkKK3sKKyAgLyogQSBzdWJ3cml0ZXIgaW5zaWRlIGFuIGFycmF5IG9yIHZhcmlhbnQgd2lsbCBoYXZlIHR5cGVfcG9zCisgICAqIHBvaW50aW5nIHRvIHRoZSBleHBlY3RlZCB0eXBlY29kZTsgYSB3cml0ZXIgbm90IGluc2lkZSBhbiBhcnJheQorICAgKiBvciB2YXJpYW50IGhhcyB0eXBlX3BvcyBwb2ludGluZyB0byB0aGUgbmV4dCBwbGFjZSB0byBpbnNlcnQgYQorICAgKiB0eXBlY29kZS4KKyAgICovCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgd3JpdGVfb3JfdmVyaWZ5IHN0YXJ0IHR5cGVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnIGVuYWJsZWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLCB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfc3RyID8KKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3BvcywgMCkgOgorICAgICAgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+ZW5hYmxlZCk7CisjZW5kaWYKKworICBpZiAod3JpdGVyLT50eXBlX3N0ciA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICh3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uKQorICAgIHsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICAgICAgeworICAgICAgICBpbnQgZXhwZWN0ZWQ7CisKKyAgICAgICAgZXhwZWN0ZWQgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHdyaXRlci0+dHlwZV9zdHIsIHdyaXRlci0+dHlwZV9wb3MpOworCisgICAgICAgIGlmIChleHBlY3RlZCAhPSB0eXBlY29kZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiQXJyYXkgb3IgdmFyaWFudCB0eXBlIHJlcXVpcmVzIHRoYXQgdHlwZSAlcyBiZSB3cml0dGVuLCBidXQgJXMgd2FzIHdyaXR0ZW4uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG92ZXJhbGwgc2lnbmF0dXJlIGV4cGVjdGVkIGhlcmUgd2FzICclcycgYW5kIHdlIGFyZSBvbiBieXRlICVkIG9mIHRoYXQgc2lnbmF0dXJlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChleHBlY3RlZCksIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0eXBlY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHdyaXRlci0+dHlwZV9zdHIpLCB3cml0ZXItPnR5cGVfcG9zKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBcnJheSBvciB2YXJpYW50IHR5cGUgd2Fzbid0IGV4cGVjdGluZyBhbnkgbW9yZSB2YWx1ZXMgdG8gYmUgd3JpdHRlbiBpbnRvIGl0LCBidXQgYSB2YWx1ZSAlcyB3YXMgd3JpdHRlbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGVjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYmFkIHR5cGUgaW5zZXJ0ZWQgc29tZXdoZXJlIGluc2lkZSBhbiBhcnJheSBvciB2YXJpYW50Iik7CisgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIERCVVNfRElTQUJMRV9DSEVDS1MgKi8KKworICAgICAgLyogaWYgaW1tZWRpYXRlbHkgaW5zaWRlIGFuIGFycmF5IHdlJ2QgYWx3YXlzIGJlIGFwcGVuZGluZyBhbiBlbGVtZW50LAorICAgICAgICogc28gdGhlIGV4cGVjdGVkIHR5cGUgZG9lc24ndCBjaGFuZ2U7IGlmIGluc2lkZSBhIHN0cnVjdCBvciBzb21ldGhpbmcKKyAgICAgICAqIGJlbG93IGFuIGFycmF5LCB3ZSBuZWVkIHRvIG1vdmUgdGhyb3VnaCBzYWlkIHN0cnVjdCBvciBzb21ldGhpbmcuCisgICAgICAgKi8KKyAgICAgIGlmICh3cml0ZXItPmNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgd3JpdGVyLT50eXBlX3BvcyArPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlICh3cml0ZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWNvZGUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHdyaXRlci0+dHlwZV9wb3MgKz0gMTsKKyAgICB9CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCB3cml0ZV9vcl92ZXJpZnkgZW5kIHR5cGVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHdyaXRlci0+dHlwZV9zdHIsIHdyaXRlci0+dHlwZV9wb3MsIDApKTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlcl9yZWN1cnNlX3N0cnVjdF9vcl9kaWN0X2VudHJ5IChEQnVzVHlwZVdyaXRlciAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYmVnaW5fY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAqc3ViKQoreworICAvKiBGSVhNRSByaWdodCBub3cgY29udGFpbmVkX3R5cGUgaXMgaWdub3JlZDsgd2UgY291bGQgcHJvYmFibHkKKyAgICogYWxtb3N0IHRyaXZpYWxseSBmaXggdGhlIGNvZGUgc28gaWYgaXQncyBwcmVzZW50IHdlCisgICAqIHdyaXRlIGl0IG91dCBhbmQgdGhlbiBzZXQgdHlwZV9wb3NfaXNfZXhwZWN0YXRpb24KKyAgICovCisKKyAgLyogRW5zdXJlIHRoYXQgd2UnbGwgYmUgYWJsZSB0byBhZGQgYWxpZ25tZW50IHBhZGRpbmcgYW5kIHRoZSB0eXBlY29kZSAqLworICBpZiAod3JpdGVyLT5lbmFibGVkKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlIChzdWItPnZhbHVlX3N0ciwgOCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCF3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKHN1YiwgYmVnaW5fY2hhcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluc2VydCBzdHJ1Y3QgdHlwZWNvZGUgYWZ0ZXIgcHJlYWxsb2MiKTsKKworICBpZiAod3JpdGVyLT5lbmFibGVkKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIDgpIC0gc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcMCcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgbm90IGhhdmUgZmFpbGVkIHRvIGluc2VydCBhbGlnbm1lbnQgcGFkZGluZyBmb3Igc3RydWN0Iik7CisgICAgICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgOCk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVyX3JlY3Vyc2VfYXJyYXkgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX2FycmF5X2FwcGVuZCkKK3sKKyAgZGJ1c191aW50MzJfdCB2YWx1ZSA9IDA7CisgIGludCBhbGlnbm1lbnQ7CisgIGludCBhbGlnbmVkOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaWYgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZICYmCisgICAgICB3cml0ZXItPnR5cGVfc3RyKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dS5hcnJheS5lbGVtZW50X3R5cGVfcG9zICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIldyaXRpbmcgYW4gYXJyYXkgb2YgJyVzJyBidXQgdGhpcyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZXhwZWN0ZWQgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgcGFyZW50IGFycmF5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbikpOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImluY29tcGF0aWJsZSB0eXBlIGZvciBjaGlsZCBhcnJheSIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIERCVVNfRElTQUJMRV9DSEVDS1MgKi8KKworICBpZiAod3JpdGVyLT5lbmFibGVkICYmICFpc19hcnJheV9hcHBlbmQpCisgICAgeworICAgICAgLyogMyBwYWQgKyA0IGJ5dGVzIGZvciB0aGUgYXJyYXkgbGVuZ3RoLCBhbmQgNCBieXRlcyBwb3NzaWJsZSBwYWRkaW5nCisgICAgICAgKiBiZWZvcmUgYXJyYXkgdmFsdWVzCisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlIChzdWItPnZhbHVlX3N0ciwgMyArIDQgKyA0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAod3JpdGVyLT50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN1Yi0+dHlwZV9wb3MgKz0gMTsgLyogbW92ZSB0byBwb2ludCB0byB0aGUgZWxlbWVudCB0eXBlLCBzaW5jZSB0eXBlX3BvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaG91bGQgYmUgdGhlIGV4cGVjdGVkIHR5cGUgZm9yIGZ1cnRoZXIgd3JpdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgc3ViLT51LmFycmF5LmVsZW1lbnRfdHlwZV9wb3MgPSBzdWItPnR5cGVfcG9zOworICAgIH0KKworICBpZiAoIXdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pCisgICAgeworICAgICAgLyogc3ViIGlzIGEgdG9wbGV2ZWwvb3V0ZXJtb3N0IGFycmF5IHNvIHdlIG5lZWQgdG8gd3JpdGUgdGhlIHR5cGUgZGF0YSAqLworCisgICAgICAvKiBhbGxvYyBzcGFjZSBmb3IgYXJyYXkgdHlwZWNvZGUsIGVsZW1lbnQgc2lnbmF0dXJlICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hbGxvY19zcGFjZSAod3JpdGVyLT50eXBlX3N0ciwgMSArIGNvbnRhaW5lZF90eXBlX2xlbikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKHdyaXRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5zZXJ0IGFycmF5IHR5cGVjb2RlIGFmdGVyIHByZWFsbG9jIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT51LmFycmF5LmVsZW1lbnRfdHlwZV9wb3MpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgbm90IGhhdmUgZmFpbGVkIHRvIGluc2VydCBhcnJheSBlbGVtZW50IHR5cGVjb2RlcyIpOworICAgIH0KKworICBpZiAod3JpdGVyLT50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBwYXJlbnQgaXMgYW4gYXJyYXksIHdlIGhvbGQgdHlwZV9wb3MgcG9pbnRpbmcgYXQgdGhlIGFycmF5IGVsZW1lbnQgdHlwZTsKKyAgICAgICAqIG90aGVyd2lzZSBhZHZhbmNlIGl0IHRvIHJlZmxlY3QgdGhlIGFycmF5IHZhbHVlIHdlIGp1c3QgcmVjdXJzZWQgaW50bworICAgICAgICovCisgICAgICBpZiAod3JpdGVyLT5jb250YWluZXJfdHlwZSAhPSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgIHdyaXRlci0+dHlwZV9wb3MgKz0gMSArIGNvbnRhaW5lZF90eXBlX2xlbjsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfYXNzZXJ0ICh3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uKTsgLyogYmVjYXVzZSBpdCdzIGFuIGFycmF5ICovCisgICAgfQorCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgLyogV3JpdGUgKG9yIGp1bXAgb3ZlciwgaWYgaXNfYXJyYXlfYXBwZW5kKSB0aGUgbGVuZ3RoICovCisgICAgICBzdWItPnUuYXJyYXkubGVuX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgNCk7CisKKyAgICAgIGlmIChpc19hcnJheV9hcHBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICBzdWItPnZhbHVlX3BvcyArPSA0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljX25vX3R5cGVjb2RlIChzdWIsIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFycmF5IGxlbiIpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3ViLT51LmFycmF5Lmxlbl9wb3MgPT0gc3ViLT52YWx1ZV9wb3MgLSA0KTsKKworICAgICAgLyogV3JpdGUgYWxpZ25tZW50IHBhZGRpbmcgZm9yIGFycmF5IGVsZW1lbnRzCisgICAgICAgKiBOb3RlIHRoYXQgd2Ugd3JpdGUgdGhlIHBhZGRpbmcgKmV2ZW4gZm9yIGVtcHR5IGFycmF5cyoKKyAgICAgICAqIHRvIGF2b2lkIHdvbmt5IHNwZWNpYWwgY2FzZXMKKyAgICAgICAqLworICAgICAgYWxpZ25tZW50ID0gZWxlbWVudF90eXBlX2dldF9hbGlnbm1lbnQgKGNvbnRhaW5lZF90eXBlLCBjb250YWluZWRfdHlwZV9zdGFydCk7CisKKyAgICAgIGFsaWduZWQgPSBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIGFsaWdubWVudCk7CisgICAgICBpZiAoYWxpZ25lZCAhPSBzdWItPnZhbHVlX3BvcykKKyAgICAgICAgeworICAgICAgICAgIGlmICghaXNfYXJyYXlfYXBwZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKHN1Yi0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZWQgLSBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXDAnKSkKKyAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaG91bGQgbm90IGhhdmUgZmFpbGVkIHRvIGluc2VydCBhbGlnbm1lbnQgcGFkZGluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgc3ViLT52YWx1ZV9wb3MgPSBhbGlnbmVkOworICAgICAgICB9CisKKyAgICAgIHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgPSBzdWItPnZhbHVlX3BvczsKKworICAgICAgaWYgKGlzX2FycmF5X2FwcGVuZCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfdWludDMyX3QgbGVuOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAoc3ViLT51LmFycmF5Lmxlbl9wb3MsIDQpID09CisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIHN1Yi0+dS5hcnJheS5sZW5fcG9zKTsKKyAgICAgICAgICBsZW4gPSBfZGJ1c191bnBhY2tfdWludDMyIChzdWItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT51LmFycmF5Lmxlbl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCkpOworCisgICAgICAgICAgc3ViLT52YWx1ZV9wb3MgKz0gbGVuOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogbm90IGVuYWJsZWQsIHNvIHdlIHdvbid0IHdyaXRlIHRoZSBsZW5fcG9zOyBzZXQgaXQgdG8gLTEgdG8gc28gaW5kaWNhdGUgKi8KKyAgICAgIHN1Yi0+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+ZW5hYmxlZDsKKyAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2VfY29udGFpbmVkX2xlbiAod3JpdGVyLCBjdXJyZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ19zdHIsIHNpZ19zdGFydCwgc2lnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YndyaXRlciwgRkFMU0UpKQorICAgICAgICAgICAgZ290byBvb207CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWN1cnNlZCBpbnRvIHN1YndyaXRlciBhdCAlZCB3cml0ZSB0YXJnZXQgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YndyaXRlci52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN1YndyaXRlci52YWx1ZV9zdHIpKTsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKCF3cml0ZXJfd3JpdGVfcmVhZGVyX2hlbHBlciAoJnN1YndyaXRlciwgJnN1YnJlYWRlciwgc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X3Bvcywgc3RhcnRfYWZ0ZXJfbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX3N0YXJ0X2FmdGVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pc19zdGFydF9hZnRlcikpCisgICAgICAgICAgICBnb3RvIG9vbTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImFib3V0IHRvIHVucmVjdXJzZSBmcm9tICVzIHN1YnJlYWRlciBhdCAlZCB3cml0ZXIgYXQgJWQgc3Vid3JpdGVyIGF0ICVkICB3cml0ZSB0YXJnZXQgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlYWRlci52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Vid3JpdGVyLnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpKTsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKCFpbnNpZGVfc3RhcnRfYWZ0ZXIgJiYgIXRoaXNfaXNfc3RhcnRfYWZ0ZXIpCisgICAgICAgICAgICBlbmFibGVfaWZfYWZ0ZXIgKHdyaXRlciwgJnN1YnJlYWRlciwgc3RhcnRfYWZ0ZXIpOworICAgICAgICAgIHBhc3Rfc3RhcnRfYWZ0ZXIgPSB3cml0ZXItPmVuYWJsZWQ7CisgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YndyaXRlcikpCisgICAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgICAgIC8qIElmIHdlIHdlcmVuJ3QgZW5hYmxlZCB3aGVuIHdlIHJlY3Vyc2VkLCB3ZSBkaWRuJ3QKKyAgICAgICAgICAgKiB3cml0ZSBhbiBhcnJheSBsZW47IGlmIHdlIHBhc3NlZCBzdGFydF9hZnRlcgorICAgICAgICAgICAqIHNvbWV3aGVyZSBpbnNpZGUgdGhlIGFycmF5LCB0aGVuIHdlIG5lZWQgdG8gZ2VuZXJhdGUKKyAgICAgICAgICAgKiBhIGZpeHVwLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChzdGFydF9hZnRlciAhPSBOVUxMICYmCisgICAgICAgICAgICAgICFlbmFibGVkX2F0X3JlY3Vyc2UgJiYgcGFzdF9zdGFydF9hZnRlciAmJgorICAgICAgICAgICAgICBjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZICYmCisgICAgICAgICAgICAgIGZpeHVwcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzQXJyYXlMZW5GaXh1cCBmaXh1cDsKKyAgICAgICAgICAgICAgaW50IGJ5dGVzX3dyaXR0ZW5fYWZ0ZXJfc3RhcnRfYWZ0ZXI7CisgICAgICAgICAgICAgIGludCBieXRlc19iZWZvcmVfc3RhcnRfYWZ0ZXI7CisgICAgICAgICAgICAgIGludCBvbGRfbGVuOworCisgICAgICAgICAgICAgIC8qIHRoaXMgc3Vid3JpdGVyIGFjY2VzcyBpcyBtb2RlcmF0ZWx5IHVua29zaGVyIHNpbmNlIHdlCisgICAgICAgICAgICAgICAqIGFscmVhZHkgdW5yZWN1cnNlZCwgYnV0IGl0IHdvcmtzIGFzIGxvbmcgYXMgdW5yZWN1cnNlCisgICAgICAgICAgICAgICAqIGRvZXNuJ3QgYnJlYWsgdXMgb24gcHVycG9zZQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlciA9IHdyaXRlcl9nZXRfYXJyYXlfbGVuICgmc3Vid3JpdGVyKTsKKworICAgICAgICAgICAgICBieXRlc19iZWZvcmVfc3RhcnRfYWZ0ZXIgPQorICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyLT52YWx1ZV9wb3MgLSByZWFkZXJfYXJyYXlfc3RhcnRfcG9zOworCisgICAgICAgICAgICAgIGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyID0gcmVhZGVyX2FycmF5X2xlbl9wb3M7CisgICAgICAgICAgICAgIGZpeHVwLm5ld19sZW4gPQorICAgICAgICAgICAgICAgIGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlciArCisgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X2xlbiArCisgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlcjsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChmaXh1cC5sZW5fcG9zX2luX3JlYWRlciwgNCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyKTsKKworICAgICAgICAgICAgICBvbGRfbGVuID0gX2RidXNfdW5wYWNrX3VpbnQzMiAocmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cC5sZW5fcG9zX2luX3JlYWRlciwgNCkpOworCisgICAgICAgICAgICAgIGlmIChvbGRfbGVuICE9IGZpeHVwLm5ld19sZW4gJiYgIWFwcGVuZF9maXh1cCAoZml4dXBzLCAmZml4dXApKQorICAgICAgICAgICAgICAgIGdvdG8gb29tOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkdlbmVyYXRlZCBmaXh1cCBsZW5fcG9zX2luX3JlYWRlciA9ICVkIG5ld19sZW4gPSAlZCByZWFkZXJfYXJyYXlfc3RhcnRfcG9zID0gJWQgc3RhcnRfYWZ0ZXItPnZhbHVlX3BvcyA9ICVkIGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlciA9ICVkIHN0YXJ0X2FmdGVyX25ld19sZW4gPSAlZCBieXRlc193cml0dGVuX2FmdGVyX3N0YXJ0X2FmdGVyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cC5uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJfYXJyYXlfc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19iZWZvcmVfc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW5fYWZ0ZXJfc3RhcnRfYWZ0ZXIpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIERCdXNCYXNpY1ZhbHVlIHZhbDsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljIChjdXJyZW50X3R5cGUpKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJlYWRpbmcgYmFzaWMgdmFsdWUgJXMgYXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MpOworI2VuZGlmCisKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsICZ2YWwpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV3JpdGluZyBiYXNpYyB2YWx1ZSAlcyBhdCAlZCB3cml0ZSB0YXJnZXQgbGVuICVkIGluc2lkZV9zdGFydF9hZnRlciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnZhbHVlX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX3N0YXJ0X2FmdGVyKTsKKyNlbmRpZgorICAgICAgICAgIGlmICghaW5zaWRlX3N0YXJ0X2FmdGVyKQorICAgICAgICAgICAgZW5hYmxlX2lmX2FmdGVyICh3cml0ZXIsIHJlYWRlciwgc3RhcnRfYWZ0ZXIpOworICAgICAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwgY3VycmVudF90eXBlLCAmdmFsKSkKKyAgICAgICAgICAgIGdvdG8gb29tOworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldyb3RlIGJhc2ljIHZhbHVlICVzLCBuZXcgdmFsdWVfcG9zICVkIHdyaXRlIHRhcmdldCBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChyZWFkZXIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgaWYgKGZpeHVwcykKKyAgICBhcHBseV9hbmRfZnJlZV9maXh1cHMgKGZpeHVwcywgTlVMTCk7IC8qIE5VTEwgZm9yIHJlYWRlciB0byBhcHBseSB0byAqLworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBJdGVyYXRlIHRocm91Z2ggYWxsIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gcmVhZGVyLCB3cml0aW5nIGEgY29weSBvZgorICogZWFjaCB2YWx1ZSB0byB0aGUgd3JpdGVyLiAgVGhlIHJlYWRlciB3aWxsIGJlIG1vdmVkIGZvcndhcmQgdG8gaXRzCisgKiBlbmQgcG9zaXRpb24uCisgKgorICogSWYgYSByZWFkZXIgc3RhcnRfYWZ0ZXIgaXMgcHJvdmlkZWQsIGl0IHNob3VsZCBiZSBhIHJlYWRlciBmb3IgdGhlCisgKiBzYW1lIGRhdGEgYXMgdGhlIHJlYWRlciB0byBiZSB3cml0dGVuLiBPbmx5IHZhbHVlcyBvY2N1cnJpbmcgYWZ0ZXIKKyAqIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHN0YXJ0X2FmdGVyIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgd3JpdGVyLgorICoKKyAqIElmIHN0YXJ0X2FmdGVyIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBjb3B5IG9mIHRoZSByZWFkZXIgd2lsbCBiZQorICogcGFydGlhbC4gVGhpcyBtZWFucyB0aGF0IGFycmF5IGxlbmd0aHMgd2lsbCBub3QgaGF2ZSBiZWVuIGNvcGllZC4KKyAqIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgeW91IHdyb3RlIGEgbmV3IHZlcnNpb24gb2YgdGhlIHZhbHVlIGF0CisgKiBzdGFydF9hZnRlciB0byB0aGUgd3JpdGVyLiBZb3UgaGF2ZSB0byBwYXNzIGluIHRoZSBzdGFydCBwb3NpdGlvbgorICogYW5kIGxlbmd0aCBvZiB0aGUgbmV3IHZhbHVlLiAoSWYgeW91IGFyZSBkZWxldGluZyB0aGUgdmFsdWUKKyAqIGF0IHN0YXJ0X2FmdGVyLCBwYXNzIGluIDAgZm9yIHRoZSBsZW5ndGguKQorICoKKyAqIElmIHRoZSBmaXh1cHMgcGFyYW1ldGVyIGlzIG5vbi0jTlVMTCwgdGhlbiBhbnkgYXJyYXkgbGVuZ3RoIHRoYXQKKyAqIHdhcyByZWFkIGJ1dCBub3Qgd3JpdHRlbiBkdWUgdG8gc3RhcnRfYWZ0ZXIgd2lsbCBiZSBwcm92aWRlZAorICogYXMgYSAjREJ1c0FycmF5TGVuRml4dXAuIFRoZSBmaXh1cCBjb250YWlucyB0aGUgcG9zaXRpb24gb2YgdGhlCisgKiBhcnJheSBsZW5ndGggaW4gdGhlIHNvdXJjZSBkYXRhLCBhbmQgdGhlIGNvcnJlY3QgYXJyYXkgbGVuZ3RoCisgKiBhc3N1bWluZyB5b3UgY29tYmluZSB0aGUgc291cmNlIGRhdGEgYmVmb3JlIHN0YXJ0X2FmdGVyIHdpdGgKKyAqIHRoZSB3cml0dGVuIGRhdGEgYXQgc3RhcnRfYWZ0ZXIgYW5kIGJleW9uZC4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gY29weSB0bworICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIHRvIGNvcHkgZnJvbQorICogQHBhcmFtIHN0YXJ0X2FmdGVyICNOVUxMIG9yIGEgcmVhZGVyIHNob3dpbmcgd2hlcmUgdG8gc3RhcnQKKyAqIEBwYXJhbSBzdGFydF9hZnRlcl9uZXdfcG9zIHRoZSBwb3NpdGlvbiBvZiBzdGFydF9hZnRlciBlcXVpdmFsZW50IGluIHRoZSB0YXJnZXQgZGF0YQorICogQHBhcmFtIHN0YXJ0X2FmdGVyX25ld19sZW4gdGhlIGxlbmd0aCBvZiBzdGFydF9hZnRlciBlcXVpdmFsZW50IGluIHRoZSB0YXJnZXQgZGF0YQorICogQHBhcmFtIGZpeHVwcyBsaXN0IHRvIGFwcGVuZCAjREJ1c0FycmF5TGVuRml4dXAgaWYgdGhlIHdyaXRlIHdhcyBwYXJ0aWFsCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXJfcGFydGlhbCAoREJ1c1R5cGVXcml0ZXIgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpzdGFydF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgICoqZml4dXBzKQoreworICBEQnVzVHlwZVdyaXRlciBvcmlnOworICBpbnQgb3JpZ190eXBlX2xlbjsKKyAgaW50IG9yaWdfdmFsdWVfbGVuOworICBpbnQgbmV3X2J5dGVzOworICBpbnQgb3JpZ19lbmFibGVkOworCisgIG9yaWcgPSAqd3JpdGVyOworICBvcmlnX3R5cGVfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dHlwZV9zdHIpOworICBvcmlnX3ZhbHVlX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnZhbHVlX3N0cik7CisgIG9yaWdfZW5hYmxlZCA9IHdyaXRlci0+ZW5hYmxlZDsKKworICBpZiAoc3RhcnRfYWZ0ZXIpCisgICAgX2RidXNfdHlwZV93cml0ZXJfc2V0X2VuYWJsZWQgKHdyaXRlciwgRkFMU0UpOworCisgIGlmICghd3JpdGVyX3dyaXRlX3JlYWRlcl9oZWxwZXIgKHdyaXRlciwgcmVhZGVyLCBzdGFydF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4dXBzLCBGQUxTRSkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfdHlwZV93cml0ZXJfc2V0X2VuYWJsZWQgKHdyaXRlciwgb3JpZ19lbmFibGVkKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGlmICghd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbikKKyAgICB7CisgICAgICBuZXdfYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT50eXBlX3N0cikgLSBvcmlnX3R5cGVfbGVuOworICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAod3JpdGVyLT50eXBlX3N0ciwgb3JpZy50eXBlX3BvcywgbmV3X2J5dGVzKTsKKyAgICB9CisgIG5ld19ieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnZhbHVlX3N0cikgLSBvcmlnX3ZhbHVlX2xlbjsKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAod3JpdGVyLT52YWx1ZV9zdHIsIG9yaWcudmFsdWVfcG9zLCBuZXdfYnl0ZXMpOworCisgICp3cml0ZXIgPSBvcmlnOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBJdGVyYXRlIHRocm91Z2ggYWxsIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gcmVhZGVyLCB3cml0aW5nIGEgY29weSBvZgorICogZWFjaCB2YWx1ZSB0byB0aGUgd3JpdGVyLiAgVGhlIHJlYWRlciB3aWxsIGJlIG1vdmVkIGZvcndhcmQgdG8gaXRzCisgKiBlbmQgcG9zaXRpb24uCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIGNvcHkgdG8KKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciB0byBjb3B5IGZyb20KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlciAoREJ1c1R5cGVXcml0ZXIgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlcikKK3sKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlcl9wYXJ0aWFsICh3cml0ZXIsIHJlYWRlciwgTlVMTCwgMCwgMCwgTlVMTCk7Cit9CisKKy8qKgorICogSWYgZGlzYWJsZWQsIGEgd3JpdGVyIGNhbiBzdGlsbCBiZSBpdGVyYXRlZCBmb3J3YXJkIGFuZCByZWN1cnNlZC91bnJlY3Vyc2VkCisgKiBidXQgd29uJ3Qgd3JpdGUgYW55IHZhbHVlcy4gVHlwZXMgd2lsbCBzdGlsbCBiZSB3cml0dGVuIHVubGVzcyB0aGUKKyAqIHdyaXRlciBpcyBhICJ2YWx1ZXMgb25seSIgd3JpdGVyLCBiZWNhdXNlIHRoZSB3cml0ZXIgbmVlZHMgYWNjZXNzIHRvCisgKiBhIHZhbGlkIHNpZ25hdHVyZSB0byBiZSBhYmxlIHRvIGl0ZXJhdGUuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgdHlwZSB3cml0ZXIKKyAqIEBwYXJhbSBlbmFibGVkICNUUlVFIGlmIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbgorICovCit2b2lkCitfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGVuYWJsZWQpCit7CisgIHdyaXRlci0+ZW5hYmxlZCA9IGVuYWJsZWQgIT0gRkFMU0U7Cit9CisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgREJ1c01hcnNoYWwgZ3JvdXAgKi8KKworLyogdGVzdHMgaW4gZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNTQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oCkBAIC0wLDAgKzEsMTkxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCAgTWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIHJlY3Vyc2l2ZSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTUFSU0hBTF9SRUNVUlNJVkVfSAorI2RlZmluZSBEQlVTX01BUlNIQUxfUkVDVVJTSVZFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisKK3R5cGVkZWYgc3RydWN0IERCdXNUeXBlUmVhZGVyICAgICAgREJ1c1R5cGVSZWFkZXI7Cit0eXBlZGVmIHN0cnVjdCBEQnVzVHlwZVdyaXRlciAgICAgIERCdXNUeXBlV3JpdGVyOwordHlwZWRlZiBzdHJ1Y3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBEQnVzVHlwZVJlYWRlckNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgREJ1c0FycmF5TGVuRml4dXAgICBEQnVzQXJyYXlMZW5GaXh1cDsKKworLyoqCisgKiBUaGUgdHlwZSByZWFkZXIgaXMgYW4gaXRlcmF0b3IgZm9yIHJlYWRpbmcgdmFsdWVzIGZyb20gYSBibG9jayBvZgorICogdmFsdWVzLgorICovCitzdHJ1Y3QgREJ1c1R5cGVSZWFkZXIKK3sKKyAgZGJ1c191aW50MzJfdCBieXRlX29yZGVyIDogODsgLyoqPCBieXRlIG9yZGVyIG9mIHRoZSBibG9jayAqLworCisgIGRidXNfdWludDMyX3QgZmluaXNoZWQgOiAxOyAgIC8qKjwgbWFya3Mgd2UncmUgYXQgZW5kIGl0ZXJhdG9yIGZvciBjYXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGVyZSB3ZSBkb24ndCBoYXZlIGFub3RoZXIgd2F5IHRvIHRlbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGRidXNfdWludDMyX3QgYXJyYXlfbGVuX29mZnNldCA6IDM7IC8qKjwgYnl0ZXMgYmFjayBmcm9tIHN0YXJ0X3BvcyB0aGF0IGxlbiBlbmRzICovCisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOyAgIC8qKjwgc3RyaW5nIGNvbnRhaW5pbmcgc2lnbmF0dXJlIG9mIGJsb2NrICovCisgIGludCB0eXBlX3BvczsgICAgICAgICAgICAgICAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiBzaWduYXR1cmUgKi8KKyAgY29uc3QgREJ1c1N0cmluZyAqdmFsdWVfc3RyOyAgLyoqPCBzdHJpbmcgY29udGFpbmluZyB2YWx1ZXMgb2YgYmxvY2sgKi8KKyAgaW50IHZhbHVlX3BvczsgICAgICAgICAgICAgICAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHZhbHVlcyAqLworCisgIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgKmtsYXNzOyAvKio8IHRoZSB2dGFibGUgZm9yIHRoZSByZWFkZXIgKi8KKyAgdW5pb24KKyAgeworICAgIHN0cnVjdCB7CisgICAgICBpbnQgc3RhcnRfcG9zOyAgICAgICAgICAgICAgICAvKio8IGZvciBhcnJheSByZWFkZXJzLCB0aGUgc3RhcnQgb2YgdGhlIGFycmF5IHZhbHVlcyAqLworICAgIH0gYXJyYXk7CisgIH0gdTsgLyoqPCBjbGFzcy1zcGVjaWZpYyBkYXRhICovCit9OworCisvKioKKyAqIFRoZSB0eXBlIHdyaXRlciBpcyBhbiBpdGVyYXRvciBmb3Igd3JpdGluZyB0byBhIGJsb2NrIG9mIHZhbHVlcy4KKyAqLworc3RydWN0IERCdXNUeXBlV3JpdGVyCit7CisgIGRidXNfdWludDMyX3QgYnl0ZV9vcmRlciA6IDg7ICAgICAgICAgICAgLyoqPCBieXRlIG9yZGVyIHRvIHdyaXRlIHZhbHVlcyB3aXRoICovCisKKyAgZGJ1c191aW50MzJfdCBjb250YWluZXJfdHlwZSA6IDg7ICAgICAgICAvKio8IHdoYXQgYXJlIHdlIGluc2lkZT8gKGUuZy4gc3RydWN0LCB2YXJpYW50LCBhcnJheSkgKi8KKworICBkYnVzX3VpbnQzMl90IHR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uIDogMTsgLyoqPCB0eXBlX3BvcyBjYW4gYmUgZWl0aGVyIGFuIGluc2VydGlvbiBwb2ludCBmb3Igb3IgYW4gZXhwZWN0ZWQgbmV4dCB0eXBlICovCisKKyAgZGJ1c191aW50MzJfdCBlbmFibGVkIDogMTsgLyoqPCB3aGV0aGVyIHRvIHdyaXRlIHZhbHVlcyAqLworCisgIERCdXNTdHJpbmcgKnR5cGVfc3RyOyAvKio8IHdoZXJlIHRvIHdyaXRlIHR5cGVjb2RlcyAob3IgcmVhZCB0eXBlIGV4cGVjdGF0aW9ucykgKi8KKyAgaW50IHR5cGVfcG9zOyAgICAgICAgIC8qKjwgY3VycmVudCBwb3MgaW4gdHlwZV9zdHIgKi8KKyAgREJ1c1N0cmluZyAqdmFsdWVfc3RyOyAvKio8IHdoZXJlIHRvIHdyaXRlIHZhbHVlcyAqLworICBpbnQgdmFsdWVfcG9zOyAgICAgICAgIC8qKjwgbmV4dCBwb3NpdGlvbiB0byB3cml0ZSAqLworCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IHN0YXJ0X3BvczsgLyoqPCBwb3NpdGlvbiBvZiBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSAqLworICAgICAgaW50IGxlbl9wb3M7ICAgLyoqPCBwb3NpdGlvbiBvZiBsZW5ndGggb2YgdGhlIGFycmF5ICovCisgICAgICBpbnQgZWxlbWVudF90eXBlX3BvczsgLyoqPCBwb3NpdGlvbiBvZiBhcnJheSBlbGVtZW50IHR5cGUgaW4gdHlwZV9zdHIgKi8KKyAgICB9IGFycmF5OworICB9IHU7IC8qKjwgY2xhc3Mtc3BlY2lmaWMgZGF0YSAqLworfTsKKworLyoqCisgKiBXaGVuIG1vZGlmeWluZyBhbiBleGlzdGluZyBibG9jayBvZiB2YWx1ZXMsIGFycmF5IGxlbmd0aHMgbWF5IG5lZWQKKyAqIHRvIGJlIGFkanVzdGVkOyB0aG9zZSBhZGp1c3RtZW50cyBhcmUgZGVzY3JpYmVkIGJ5IHRoaXMgc3RydWN0LgorICovCitzdHJ1Y3QgREJ1c0FycmF5TGVuRml4dXAKK3sKKyAgaW50IGxlbl9wb3NfaW5fcmVhZGVyOyAvKio8IHdoZXJlIHRoZSBsZW5ndGggd2FzIGluIHRoZSBvcmlnaW5hbCBibG9jayAqLworICBpbnQgbmV3X2xlbjsgICAgICAgICAgIC8qKjwgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbGVuZ3RoIGluIHRoZSB3cml0dGVuLW91dCBibG9jayAqLworfTsKKwordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdF90eXBlc19vbmx5ICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlX3Bvcyk7CitpbnQgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7CitpbnQgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7CitpbnQgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICAgICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICAgICAgICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqdmFsdWUpOworaW50ICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2FycmF5X2xlbmd0aCAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9maXhlZF9tdWx0aSAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpuX2VsZW1lbnRzKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfcmF3ICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKip2YWx1ZV9sb2NhdGlvbik7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICAgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICAqc3VicmVhZGVyKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfcmVhZGVyX25leHQgICAgICAgICAgICAgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfcmVhZGVyX2hhc19uZXh0ICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9zaWduYXR1cmUgICAgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKipzdHJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqc3RhcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqbGVuX3ApOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljICAgICAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFsaWduX3Jvb3QpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfZGVsZXRlICAgICAgICAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWxpZ25fcm9vdCk7CitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9ncmVhdGVyX3RoYW4gICAgICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmhzKTsKKworZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfZXF1YWxfdmFsdWVzICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyaHMpOworCit2b2lkICAgICAgICBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0ICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgKnNpZ25hdHVyZSwKKwkJCQkJCQkgaW50ICAgICAgICAgICAgICAgICAgICp0eXBlX3Bvcyk7CisKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgICAgICAgICAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdmFsdWVfcG9zKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdHlwZXNfZGVsYXllZCAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfYWRkX3R5cGVzICAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlX3Bvcyk7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cyk7CitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICAgICAgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAgICAgICpzdWIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgICAgICAqc3ViKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX2FwcGVuZF9hcnJheSAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKmNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAgICAgICpzdWIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyKTsKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlcl9wYXJ0aWFsIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnN0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAgKipmaXh1cHMpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfc2V0X2VuYWJsZWQgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgZW5hYmxlZCk7CisKKworI2VuZGlmIC8qIERCVVNfTUFSU0hBTF9SRUNVUlNJVkVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTM1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYywgYnV0IG9ubHkgdXNlZCBieSB0ZXN0cy9idXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgREJ1c1ZhbGlkaXR5IGV4cGVjdGVkOworfSBWYWxpZGl0eVRlc3Q7CisKK3N0YXRpYyB2b2lkCitydW5fdmFsaWRpdHlfdGVzdHMgKGNvbnN0IFZhbGlkaXR5VGVzdCAqdGVzdHMsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbl90ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICgqIGZ1bmMpIChjb25zdCBEQnVzU3RyaW5nKixpbnQsaW50KSkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5fdGVzdHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgIERCdXNWYWxpZGl0eSB2OworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGVzdHNbaV0uZGF0YSk7CisKKyAgICAgIHYgPSAoKmZ1bmMpICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworCisgICAgICBpZiAodiAhPSB0ZXN0c1tpXS5leHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJJbXByb3BlciB2YWxpZGF0aW9uIHJlc3VsdCAlZCBmb3IgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICB2LCB0ZXN0c1tpXS5kYXRhKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBWYWxpZGl0eVRlc3Qgc2lnbmF0dXJlX3Rlc3RzW10gPSB7CisgIHsgIiIsIERCVVNfVkFMSUQgfSwKKyAgeyAiaSIsIERCVVNfVkFMSUQgfSwKKyAgeyAiYWkiLCBEQlVTX1ZBTElEIH0sCisgIHsgIihpKSIsIERCVVNfVkFMSUQgfSwKKyAgeyAidyIsIERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFIH0sCisgIHsgImEiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiYWFhYWFhIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImlpKGlpKWEiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiaWEiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgLyogREJVU19JTlZBTElEX1NJR05BVFVSRV9UT09fTE9ORywgKi8gLyogdG9vIGhhcmQgdG8gdGVzdCB0aGlzIHdheSAqLworICB7ICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLAorICAgIERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0FSUkFZX1JFQ1VSU0lPTiB9LAorICB7ICIoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKGlpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkiLAorICAgIERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX1NUUlVDVF9SRUNVUlNJT04gfSwKKyAgeyAiKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEIH0sCisgIHsgImkpIiwgREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQgfSwKKyAgeyAiYSkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0VOREVEX0JVVF9OT1RfU1RBUlRFRCB9LAorICB7ICIoIiwgREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgfSwKKyAgeyAiKGkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRCB9LAorICB7ICIoaWlpaWkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRCB9LAorICB7ICIoYWkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRCB9LAorICB7ICIoKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUyB9LAorICB7ICIoKCkpIiwgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTIH0sCisgIHsgImEoKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUyB9LAorICB7ICJpKCkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiKClpIiwgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTIH0sCisgIHsgIihhKSIsIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRSB9LAorICB7ICJhe2lhfSIsIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRSB9LAorICB7ICJhe30iLCBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfTk9fRklFTERTIH0sCisgIHsgImF7YWlpfSIsIERCVVNfSU5WQUxJRF9ESUNUX0tFWV9NVVNUX0JFX0JBU0lDX1RZUEUgfSwKKyAgLyogeyAiYXtpfSIsIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19PTkxZX09ORV9GSUVMRCB9LCAqLworICAvKiB7ICJ7aXN9IiwgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfTk9UX0lOU0lERV9BUlJBWSB9LCAqLworICAvKiB7ICJhe2lzaX0iLCBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfVE9PX01BTllfRklFTERTIH0sICovCit9OworCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90ZXN0ICh2b2lkKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGk7CisKKyAgY29uc3QgY2hhciAqdmFsaWRfcGF0aHNbXSA9IHsKKyAgICAiLyIsCisgICAgIi9mb28vYmFyIiwKKyAgICAiL2ZvbyIsCisgICAgIi9mb28vYmFyL2JheiIKKyAgfTsKKyAgY29uc3QgY2hhciAqaW52YWxpZF9wYXRoc1tdID0geworICAgICJiYXIiLAorICAgICJiYXIvYmF6IiwKKyAgICAiL2Zvby9iYXIvIiwKKyAgICAiL2Zvby8iCisgICAgImZvby8iLAorICAgICJib28vL2JsYWgiLAorICAgICIvLyIsCisgICAgIi8vLyIsCisgICAgImZvby8vL2JsYWgvIiwKKyAgICAiSGVsbG8gV29ybGQiLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIGNvbnN0IGNoYXIgKnZhbGlkX2ludGVyZmFjZXNbXSA9IHsKKyAgICAib3JnLmZyZWVkZXNrdG9wLkZvbyIsCisgICAgIkJhci5CYXoiLAorICAgICJCbGFoLkJsYWguQmxhaC5CbGFoLkJsYWgiLAorICAgICJhLmIiLAorICAgICJhLmIuYy5kLmUuZi5nIiwKKyAgICAiYTAuYjEuYzIuZDMuZTQuZjUuZzYiLAorICAgICJhYmMxMjMuZm9vMjciCisgIH07CisgIGNvbnN0IGNoYXIgKmludmFsaWRfaW50ZXJmYWNlc1tdID0geworICAgICIuIiwKKyAgICAiIiwKKyAgICAiLi4iLAorICAgICIuRm9vLkJhciIsCisgICAgIi4uRm9vLkJhciIsCisgICAgIkZvby5CYXIuIiwKKyAgICAiRm9vLkJhci4uIiwKKyAgICAiRm9vIiwKKyAgICAiOWZvby5iYXIuYmF6IiwKKyAgICAiZm9vLmJhci4uYmF6IiwKKyAgICAiZm9vLmJhci4uLmJheiIsCisgICAgImZvby5iYXIuYi4uYmxhaCIsCisgICAgIjoiLAorICAgICI6MC0xIiwKKyAgICAiMTAiLAorICAgICI6MTEuMzQzMjQiLAorICAgICIwLjAuMCIsCisgICAgIjAuLjAiLAorICAgICJmb28uQmFyLiUiLAorICAgICJmb28uQmFyISEiLAorICAgICIhRm9vLmJhci5ieiIsCisgICAgImZvby4kLmJsYWgiLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIGNvbnN0IGNoYXIgKnZhbGlkX3VuaXF1ZV9uYW1lc1tdID0geworICAgICI6MCIsCisgICAgIjphIiwKKyAgICAiOiIsCisgICAgIjouYSIsCisgICAgIjouMSIsCisgICAgIjowLjEiLAorICAgICI6MDAwLjIyMjIiLAorICAgICI6LmJsYWgiLAorICAgICI6YWJjZS5mcmVlZGVza3RvcC5ibGFoIgorICB9OworICBjb25zdCBjaGFyICppbnZhbGlkX3VuaXF1ZV9uYW1lc1tdID0geworICAgIC8vIjotIiwKKyAgICAiOiEiLAorICAgIC8vIjowLTEwIiwKKyAgICAiOmJsYWguIiwKKyAgICAiOmJsYWguIiwKKyAgICAiOmJsYWguLm9yZyIsCisgICAgIjpibGFoLm9yZy4uIiwKKyAgICAiOi4uYmxhaC5vcmciLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIGNvbnN0IGNoYXIgKnZhbGlkX21lbWJlcnNbXSA9IHsKKyAgICAiSGVsbG8iLAorICAgICJCYXIiLAorICAgICJmb29iYXIiLAorICAgICJfZm9vYmFyIiwKKyAgICAiZm9vODkiCisgIH07CisKKyAgY29uc3QgY2hhciAqaW52YWxpZF9tZW1iZXJzW10gPSB7CisgICAgIjlIZWxsbyIsCisgICAgIjEwIiwKKyAgICAiMSIsCisgICAgImZvby1iYXIiLAorICAgICJibGFoLm9yZyIsCisgICAgIi5ibGFoIiwKKyAgICAiYmxhaC4iLAorICAgICJIZWxsby4iLAorICAgICIhZm9vIiwKKyAgICAiIiwKKyAgICAiICAgIiwKKyAgICAiZm9vIGJhciIKKyAgfTsKKworICBjb25zdCBjaGFyICp2YWxpZF9zaWduYXR1cmVzW10gPSB7CisgICAgIiIsCisgICAgInNzcyIsCisgICAgImkiLAorICAgICJiIgorICB9OworCisgIGNvbnN0IGNoYXIgKmludmFsaWRfc2lnbmF0dXJlc1tdID0geworICAgICIgIiwKKyAgICAibm90IGEgdmFsaWQgc2lnbmF0dXJlIiwKKyAgICAiMTIzIiwKKyAgICAiLiIsCisgICAgIigiLAorICAgICJheyhpaSlpfSIgLyogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDMgKi8KKyAgfTsKKworICAvKiBTaWduYXR1cmUgd2l0aCByZWFzb24gKi8KKworICBydW5fdmFsaWRpdHlfdGVzdHMgKHNpZ25hdHVyZV90ZXN0cywgX0RCVVNfTl9FTEVNRU5UUyAoc2lnbmF0dXJlX3Rlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24pOworCisgIC8qIFBhdGggdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9wYXRocykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHZhbGlkX3BhdGhzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9wYXRoICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlBhdGggXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX3BhdGhzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfcGF0aHMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX3BhdGhzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJQYXRoIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfcGF0aHNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkIHBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIEludGVyZmFjZSB2YWxpZGF0aW9uICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkX2ludGVyZmFjZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB2YWxpZF9pbnRlcmZhY2VzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJJbnRlcmZhY2UgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgaW50ZXJmYWNlIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX2ludGVyZmFjZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICBpZiAoX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJJbnRlcmZhY2UgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZFxuIiwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBpbnRlcmZhY2UiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIEJ1cyBuYW1lIHZhbGlkYXRpb24gKGNoZWNrIHRoYXQgdmFsaWQgaW50ZXJmYWNlcyBhcmUgdmFsaWQgYnVzIG5hbWVzLAorICAgKiBhbmQgaW52YWxpZCBpbnRlcmZhY2VzIGFyZSBpbnZhbGlkIHNlcnZpY2VzIGV4Y2VwdCBpZiB0aGV5IHN0YXJ0IHdpdGggJzonKQorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkJ1cyBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIGJ1cyBuYW1lIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX2ludGVyZmFjZXMpKQorICAgIHsKKyAgICAgIGlmIChpbnZhbGlkX2ludGVyZmFjZXNbaV1bMF0gIT0gJzonKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGludmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgICAgICBpZiAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQnVzIG5hbWUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZFxuIiwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgYnVzIG5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIHVuaXF1ZSBuYW1lIHZhbGlkYXRpb24gKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfdW5pcXVlX25hbWVzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfdW5pcXVlX25hbWVzW2ldKTsKKworICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQnVzIG5hbWUgXCIlc1wiIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRcbiIsIHZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCB1bmlxdWUgbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF91bmlxdWVfbmFtZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisKKyAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJCdXMgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkXG4iLCBpbnZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgdW5pcXVlIG5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisKKyAgLyogRXJyb3IgbmFtZSB2YWxpZGF0aW9uIChjdXJyZW50bHkgaWRlbnRpY2FsIHRvIGludGVyZmFjZXMpCisgICAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9pbnRlcmZhY2VzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFcnJvciBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIGVycm9yIG5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgaWYgKGludmFsaWRfaW50ZXJmYWNlc1tpXVswXSAhPSAnOicpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKworICAgICAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXJyb3IgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkXG4iLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBlcnJvciBuYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBNZW1iZXIgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9tZW1iZXJzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfbWVtYmVyc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVtYmVyIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9tZW1iZXJzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIG1lbWJlciIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9tZW1iZXJzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgaW52YWxpZF9tZW1iZXJzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVtYmVyIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfbWVtYmVyc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgbWVtYmVyIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBTaWduYXR1cmUgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9zaWduYXR1cmVzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfc2lnbmF0dXJlc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiU2lnbmF0dXJlIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkXG4iLCB2YWxpZF9zaWduYXR1cmVzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHNpZ25hdHVyZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9zaWduYXR1cmVzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgaW52YWxpZF9zaWduYXR1cmVzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiU2lnbmF0dXJlIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRcbiIsIGludmFsaWRfc2lnbmF0dXJlc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWQgc2lnbmF0dXJlIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBWYWxpZGF0ZSBjbGFpbWVkIGxlbmd0aCBsb25nZXIgdGhhbiByZWFsIGxlbmd0aCAqLworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgImFiYy5lZmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCA4KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgdG9vLWxvbmcgc3RyaW5nIik7CisgIGlmIChfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKCZzdHIsIDAsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgImFiYyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLCA0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgdG9vLWxvbmcgc3RyaW5nIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICJzc3MiKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZSAoJnN0ciwgMCwgNCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIHRvby1sb25nIHNpZ25hdHVyZSIpOworCisgIC8qIFZhbGlkYXRlIHN0cmluZyBleGNlZWRpbmcgbWF4IG5hbWUgbGVuZ3RoICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIHdoaWxlIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPD0gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgImFiYy5kZWYiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmIChfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgb3Zlcm1heCBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgb3Zlcm1heCBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIG92ZXJtYXggc3RyaW5nIik7CisKKyAgLyogb3ZlcmxvbmcgbWVtYmVyICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCAwKTsKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA8PSBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiYWJjIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCBvdmVybWF4IHN0cmluZyIpOworCisgIC8qIG92ZXJsb25nIHVuaXF1ZSBuYW1lICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCAwKTsKKyAgX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIjoiKTsKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA8PSBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiYWJjIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIG92ZXJtYXggc3RyaW5nIik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIC8qIEJvZHkgdmFsaWRhdGlvbjsgdGVzdCBiYXNpYyB2YWxpZGF0aW9uIG9mIHZhbGlkIGJvZGllcyBmb3IgYm90aCBlbmRpYW4gKi8KKyAgCisgIHsKKyAgICBpbnQgc2VxdWVuY2U7CisgICAgREJ1c1N0cmluZyBzaWduYXR1cmU7CisgICAgREJ1c1N0cmluZyBib2R5OworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNpZ25hdHVyZSkgfHwgIV9kYnVzX3N0cmluZ19pbml0ICgmYm9keSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgIHNlcXVlbmNlID0gMDsKKyAgICB3aGlsZSAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAoc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZSwgJmJvZHkpKQorICAgICAgeworICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisKKyAgICAgICAgdmFsaWRpdHkgPSBfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uICgmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmYm9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJvZHkpKTsKKyAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoImludmFsaWQgY29kZSAlZCBleHBlY3RlZCB2YWxpZCBvbiBzZXF1ZW5jZSAlZCBsaXR0bGUgZW5kaWFuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHksIHNlcXVlbmNlKTsKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc2lnbmF0dXJlLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNpZ25hdHVyZSkpOworICAgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZib2R5LCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJvZHkpKTsKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc2lnbmF0dXJlLCAwKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZib2R5LCAwKTsKKyAgICAgICAgKytzZXF1ZW5jZTsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgc2VxdWVuY2UgPSAwOworICAgIHdoaWxlIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2VuZXJhdGVfYm9kaWVzIChzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmF0dXJlLCAmYm9keSkpCisgICAgICB7CisgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKworICAgICAgICB2YWxpZGl0eSA9IF9kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gKCZzaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiaW52YWxpZCBjb2RlICVkIGV4cGVjdGVkIHZhbGlkIG9uIHNlcXVlbmNlICVkIGJpZyBlbmRpYW5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSwgc2VxdWVuY2UpOworICAgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzaWduYXR1cmUsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnbmF0dXJlKSk7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJvZHksIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzaWduYXR1cmUsIDApOworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgICArK3NlcXVlbmNlOworICAgICAgfQorCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYm9keSk7CisgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwNDQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMKQEAgLTAsMCArMSwxMjI5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC12YWxpZGF0ZS5jIFZhbGlkYXRpb24gcm91dGluZXMgZm9yIG1hcnNoYWxlZCBkYXRhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC12YWxpZGF0ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01hcnNoYWwKKyAqCisgKiBAeworICovCisKKy8qKgorICogVmVyaWZpZXMgdGhhdCB0aGUgcmFuZ2Ugb2YgdHlwZV9zdHIgZnJvbSB0eXBlX3BvcyB0byB0eXBlX2VuZCBpcyBhCisgKiB2YWxpZCBzaWduYXR1cmUuICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgI1RSVUUsIGl0IHdpbGwgYmUgc2FmZQorICogdG8gaXRlcmF0ZSBvdmVyIHRoZSBzaWduYXR1cmUgd2l0aCBhIHR5cGVzLW9ubHkgI0RCdXNUeXBlUmVhZGVyLgorICogVGhlIHJhbmdlIHBhc3NlZCBpbiBzaG91bGQgTk9UIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nCisgKiBudWwvREJVU19UWVBFX0lOVkFMSUQuCisgKgorICogQHBhcmFtIHR5cGVfc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB0eXBlX3BvcyB3aGVyZSB0aGUgdHlwZWNvZGVzIHN0YXJ0CisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB0eXBlY29kZXMKKyAqIEByZXR1cm5zICNEQlVTX1ZBTElEIGlmIHZhbGlkLCByZWFzb24gd2h5IGludmFsaWQgb3RoZXJ3aXNlCisgKi8KK0RCdXNWYWxpZGl0eQorX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uIChjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBpbnQgbGFzdDsKKyAgaW50IHN0cnVjdF9kZXB0aDsKKyAgaW50IGFycmF5X2RlcHRoOworICBpbnQgZGljdF9lbnRyeV9kZXB0aDsKKyAgREJ1c1ZhbGlkaXR5IHJlc3VsdDsKKworICBpbnQgZWxlbWVudF9jb3VudDsKKyAgREJ1c0xpc3QgKmVsZW1lbnRfY291bnRfc3RhY2s7CisKKyAgcmVzdWx0ID0gREJVU19WQUxJRDsKKyAgZWxlbWVudF9jb3VudF9zdGFjayA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmVsZW1lbnRfY291bnRfc3RhY2ssIF9EQlVTX0lOVF9UT19QT0lOVEVSICgwKSkpCisgICAgeworICAgICAgcmVzdWx0ID0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHR5cGVfc3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHR5cGVfcG9zIDwgX0RCVVNfSU5UMzJfTUFYIC0gbGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAodHlwZV9wb3MgPj0gMCk7CisKKyAgaWYgKGxlbiA+IERCVVNfTUFYSU1VTV9TSUdOQVRVUkVfTEVOR1RIKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfVE9PX0xPTkc7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHR5cGVfc3RyLCB0eXBlX3BvcywgMCk7CisKKyAgZW5kID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAodHlwZV9zdHIsIHR5cGVfcG9zICsgbGVuLCAwKTsKKyAgc3RydWN0X2RlcHRoID0gMDsKKyAgYXJyYXlfZGVwdGggPSAwOworICBkaWN0X2VudHJ5X2RlcHRoID0gMDsKKyAgbGFzdCA9IERCVVNfVFlQRV9JTlZBTElEOworCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICBzd2l0Y2ggKCpwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICAgIGFycmF5X2RlcHRoICs9IDE7CisgICAgICAgICAgaWYgKGFycmF5X2RlcHRoID4gREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT047CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUjoKKyAgICAgICAgICBzdHJ1Y3RfZGVwdGggKz0gMTsKKworICAgICAgICAgIGlmIChzdHJ1Y3RfZGVwdGggPiBEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX1NUUlVDVF9SRUNVUlNJT047CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbGVtZW50X2NvdW50X3N0YWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfU1RSVUNUX0VORF9DSEFSOgorICAgICAgICAgIGlmIChzdHJ1Y3RfZGVwdGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQ7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhc3QgPT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZlbGVtZW50X2NvdW50X3N0YWNrKTsKKworICAgICAgICAgIHN0cnVjdF9kZXB0aCAtPSAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVI6CisgICAgICAgICAgaWYgKGxhc3QgIT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9OT1RfSU5TSURFX0FSUkFZOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIGRpY3RfZW50cnlfZGVwdGggKz0gMTsKKworICAgICAgICAgIGlmIChkaWN0X2VudHJ5X2RlcHRoID4gREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9ESUNUX0VOVFJZX1JFQ1VSU0lPTjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZWxlbWVudF9jb3VudF9zdGFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgwKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVI6CisgICAgICAgICAgaWYgKGRpY3RfZW50cnlfZGVwdGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfRU5ERURfQlVUX05PVF9TVEFSVEVEOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIGRpY3RfZW50cnlfZGVwdGggLT0gMTsKKworICAgICAgICAgIGVsZW1lbnRfY291bnQgPSAKKyAgICAgICAgICAgIF9EQlVTX1BPSU5URVJfVE9fSU5UIChfZGJ1c19saXN0X3BvcF9sYXN0ICgmZWxlbWVudF9jb3VudF9zdGFjaykpOworCisgICAgICAgICAgaWYgKGVsZW1lbnRfY291bnQgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGVsZW1lbnRfY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfTk9fRklFTERTOworICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50X2NvdW50ID09IDEpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX1RPT19NQU5ZX0ZJRUxEUzsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6ICAgICAvKiBkb2Vzbid0IGFwcGVhciBpbiBzaWduYXR1cmVzICovCisgICAgICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6IC8qIGRpdHRvICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREU7CisJICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoKnAgIT0gREJVU19UWVBFX0FSUkFZICYmIAorICAgICAgICAgICpwICE9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSICYmIAorCSAgKnAgIT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikgCisgICAgICAgIHsKKyAgICAgICAgICBlbGVtZW50X2NvdW50ID0gCisgICAgICAgICAgICBfREJVU19QT0lOVEVSX1RPX0lOVCAoX2RidXNfbGlzdF9wb3BfbGFzdCAoJmVsZW1lbnRfY291bnRfc3RhY2spKTsKKworICAgICAgICAgICsrZWxlbWVudF9jb3VudDsKKworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbGVtZW50X2NvdW50X3N0YWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGVsZW1lbnRfY291bnQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKGFycmF5X2RlcHRoID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSBEQlVTX1RZUEVfQVJSQVkgJiYgcCAhPSBlbmQpCisgICAgICAgICAgICB7CisJICAgICAgIGNvbnN0IGNoYXIgKnAxOworCSAgICAgICBwMSA9IHAgKyAxOworICAgICAgICAgICAgICAgaWYgKCpwMSA9PSBEQlVTX1NUUlVDVF9FTkRfQ0hBUiB8fAorICAgICAgICAgICAgICAgICAgICpwMSA9PSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEU7CisgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisJICAgIHsKKyAgICAgICAgICAgICAgYXJyYXlfZGVwdGggPSAwOworCSAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKGxhc3QgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIShfZGJ1c190eXBlX2lzX3ZhbGlkICgqcCkgJiYgZGJ1c190eXBlX2lzX2Jhc2ljICgqcCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsYXN0ID0gKnA7CisgICAgICArK3A7CisgICAgfQorCisKKyAgaWYgKGFycmF5X2RlcHRoID4gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgCisgIGlmIChzdHJ1Y3RfZGVwdGggPiAwKQorICAgIHsKKyAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDsKKyAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgCisgIGlmIChkaWN0X2VudHJ5X2RlcHRoID4gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIAorICBfZGJ1c19hc3NlcnQgKGxhc3QgIT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChsYXN0ICE9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKGxhc3QgIT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpOworCisgIHJlc3VsdCA9IERCVVNfVkFMSUQ7CisKK291dDoKKyAgX2RidXNfbGlzdF9jbGVhciAoJmVsZW1lbnRfY291bnRfc3RhY2spOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBub3RlOiB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byB2YWxpZGF0ZSB0aGUgaGVhZGVyJ3MgdmFsdWVzLAorICogc2luY2UgdGhlIGhlYWRlciBpcyBhIHZhbGlkIGJvZHkgd2l0aCBhIHBhcnRpY3VsYXIgc2lnbmF0dXJlLgorICovCitzdGF0aWMgREJ1c1ZhbGlkaXR5Cit2YWxpZGF0ZV9ib2R5X2hlbHBlciAoREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgd2Fsa19yZWFkZXJfdG9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipuZXdfcCkKK3sKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICAvKiBUaGUgc3BlYyBhbGxvd3MgYXJyYXlzIGFuZCBzdHJ1Y3RzIHRvIGVhY2ggbmVzdCAzMiwgZm9yIHRvdGFsCisgICAqIG5lc3Rpbmcgb2YgMiozMi4gV2Ugd2FudCB0byBpbXBvc2UgdGhlIHNhbWUgbGltaXQgb24gImR5bmFtaWMiCisgICAqIHZhbHVlIG5lc3RpbmcgKG5vdCB2aXNpYmxlIGluIHRoZSBzaWduYXR1cmUpIHdoaWNoIGlzIGludHJvZHVjZWQKKyAgICogYnkgREJVU19UWVBFX1ZBUklBTlQuCisgICAqLworICBpZiAodG90YWxfZGVwdGggPiAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIICogMikpCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9ORVNURURfVE9PX0RFRVBMWTsKKyAgICB9CisKKyAgd2hpbGUgKChjdXJyZW50X3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphOworICAgICAgaW50IGFsaWdubWVudDsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICB2YWxpZGF0aW5nIHZhbHVlIG9mIHR5cGUgJXMgdHlwZSByZWFkZXIgJXAgdHlwZV9wb3MgJWQgcCAlcCBlbmQgJXAgJWQgcmVtYWluXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgKGludCkgKGVuZCAtIHApKTsKKyNlbmRpZgorCisgICAgICAvKiBHdWFyYW50ZWUgdGhhdCBwIGhhcyBvbmUgYnl0ZSB0byBsb29rIGF0ICovCisgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworCisgICAgICBzd2l0Y2ggKGN1cnJlbnRfdHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgICAgICsrcDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChjdXJyZW50X3R5cGUpOworICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCBhbGlnbm1lbnQpOworICAgICAgICAgIGlmIChhID49IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgIHdoaWxlIChwICE9IGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0JPT0xFQU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgdiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHApOworICAgICAgICAgICAgICBpZiAoISh2ID09IDAgfHwgdiA9PSAxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0JPT0xFQU5fTk9UX1pFUk9fT1JfT05FOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHAgKz0gYWxpZ25tZW50OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgY2xhaW1lZF9sZW47CisKKyAgICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA0KTsKKyAgICAgICAgICAgIGlmIChhICsgNCA+IGVuZCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYWltZWRfbGVuID0gX2RidXNfdW5wYWNrX3VpbnQzMiAoYnl0ZV9vcmRlciwgcCk7CisgICAgICAgICAgICBwICs9IDQ7CisKKyAgICAgICAgICAgIC8qIHAgbWF5IG5vdyBiZSA9PSBlbmQgKi8KKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocCA8PSBlbmQpOworCisgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhcnJheV9lbGVtX3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlIChyZWFkZXIpOworCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX2lzX3ZhbGlkIChhcnJheV9lbGVtX3R5cGUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGFycmF5X2VsZW1fdHlwZSk7CisKKyAgICAgICAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgYWxpZ25tZW50KTsKKworICAgICAgICAgICAgICAgIC8qIGEgbWF5IG5vdyBiZSA9PSBlbmQgKi8KKyAgICAgICAgICAgICAgICBpZiAoYSA+IGVuZCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHAgIT0gYSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOworICAgICAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsYWltZWRfbGVuID4gKHVuc2lnbmVkIGxvbmcpIChlbmQgLSBwKSkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9MRU5HVEhfT1VUX09GX0JPVU5EUzsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfT0JKRUNUX1BBVEgpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzdHIsIHAsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CQURfUEFUSDsKKworICAgICAgICAgICAgICAgIHAgKz0gY2xhaW1lZF9sZW47CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfU1RSSU5HKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmc3RyLCBwLCBjbGFpbWVkX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CQURfVVRGOF9JTl9TVFJJTkc7CisKKyAgICAgICAgICAgICAgICBwICs9IGNsYWltZWRfbGVuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZICYmIGNsYWltZWRfbGVuID4gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXJyYXlfZW5kOworICAgICAgICAgICAgICAgIGludCBhcnJheV9lbGVtX3R5cGU7CisKKyAgICAgICAgICAgICAgICBpZiAoY2xhaW1lZF9sZW4gPiBEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfRVhDRUVEU19NQVhJTVVNOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoYXQgdGhlIHJlYWRlciBpcyB0eXBlcyBvbmx5LCBzbyB3ZSBjYW4ndAorICAgICAgICAgICAgICAgICAqIHVzZSBpdCB0byBpdGVyYXRlIG92ZXIgZWxlbWVudHMuIEl0IHN0YXlzIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICogZm9yIGFsbCBlbGVtZW50cy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICAgICAgICAgICAgYXJyYXlfZW5kID0gcCArIGNsYWltZWRfbGVuOworCisgICAgICAgICAgICAgICAgYXJyYXlfZWxlbV90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKTsKKworICAgICAgICAgICAgICAgIC8qIGF2b2lkIHJlY3Vyc2l2ZSBjYWxsIHRvIHZhbGlkYXRlX2JvZHlfaGVscGVyIGlmIHRoaXMgaXMgYW4gYXJyYXkKKyAgICAgICAgICAgICAgICAgKiBvZiBmaXhlZC1zaXplIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICovIAorICAgICAgICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGFycmF5X2VsZW1fdHlwZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGJvb2xzIG5lZWQgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB0aGV5IGNhbgorICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIGFuIGludmFsaWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheV9lbGVtX3R5cGUgPT0gREJVU19UWVBFX0JPT0xFQU4pCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCB2OworICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChhcnJheV9lbGVtX3R5cGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocCA8IGFycmF5X2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBfZGJ1c191bnBhY2tfdWludDMyIChieXRlX29yZGVyLCBwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHYgPT0gMCB8fCB2ID09IDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gYWxpZ25tZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gYXJyYXlfZW5kOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHAgPCBhcnJheV9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGF0ZV9ib2R5X2hlbHBlciAoJnN1YiwgYnl0ZV9vcmRlciwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBlbmQsICZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRpdHk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHAgIT0gYXJyYXlfZW5kKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfSU5DT1JSRUNUOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIG51bCB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGNsYWltZWRfbGVuOworICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisKKyAgICAgICAgICAgIGNsYWltZWRfbGVuID0gKnA7CisgICAgICAgICAgICArK3A7CisKKyAgICAgICAgICAgIC8qIDEgaXMgZm9yIG51bCB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgaWYgKGNsYWltZWRfbGVuICsgMSA+ICh1bnNpZ25lZCBsb25nKSAoZW5kIC0gcCkpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOworCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzdHIsIHAsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICAgIHZhbGlkaXR5ID0KKyAgICAgICAgICAgICAgX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSk7CisKKyAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gdmFsaWRpdHk7CisKKyAgICAgICAgICAgIHAgKz0gY2xhaW1lZF9sZW47CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAocCA8IGVuZCk7CisgICAgICAgICAgICBpZiAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX01JU1NJTkdfTlVMOworCisgICAgICAgICAgICArK3A7CisKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwID0gJXAgZW5kID0gJXAgY2xhaW1lZF9sZW4gJXVcbiIsIHAsIGVuZCwgY2xhaW1lZF9sZW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEgYnl0ZSBzaWcgbGVuLCBzaWcgdHlwZWNvZGVzLCBhbGlnbiB0bworICAgICAgICAgICAgICogY29udGFpbmVkLXR5cGUtYm91bmRhcnksIHZhbHVlcy4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvKiBJbiBhZGRpdGlvbiB0byBub3JtYWwgc2lnbmF0dXJlIHZhbGlkYXRpb24sIHdlIG5lZWQgdG8gYmUgc3VyZQorICAgICAgICAgICAgICogdGhlIHNpZ25hdHVyZSBjb250YWlucyBvbmx5IGEgc2luZ2xlIChwb3NzaWJseSBjb250YWluZXIpIHR5cGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgY2xhaW1lZF9sZW47CisgICAgICAgICAgICBEQnVzU3RyaW5nIHNpZzsKKyAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKyAgICAgICAgICAgIGludCBjb250YWluZWRfYWxpZ25tZW50OworICAgICAgICAgICAgaW50IGNvbnRhaW5lZF90eXBlOworICAgICAgICAgICAgREJ1c1ZhbGlkaXR5IHJlYXNvbjsKKworICAgICAgICAgICAgY2xhaW1lZF9sZW4gPSAqcDsKKyAgICAgICAgICAgICsrcDsKKworICAgICAgICAgICAgLyogKyAxIGZvciBudWwgKi8KKyAgICAgICAgICAgIGlmIChjbGFpbWVkX2xlbiArIDEgPiAodW5zaWduZWQgbG9uZykgKGVuZCAtIHApKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0xFTkdUSF9PVVRfT0ZfQk9VTkRTOworCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzaWcsIHAsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICAgIHJlYXNvbiA9IF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoJnNpZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNpZykpOworICAgICAgICAgICAgaWYgKCEocmVhc29uID09IERCVVNfVkFMSUQpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9CQUQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcCArPSBjbGFpbWVkX2xlbjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX01JU1NJTkdfTlVMOworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICBjb250YWluZWRfdHlwZSA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlICgmc2lnLCAwKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZWRfdHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9FTVBUWTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29udGFpbmVkX2FsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoY29udGFpbmVkX3R5cGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgY29udGFpbmVkX2FsaWdubWVudCk7CisgICAgICAgICAgICBpZiAoYSA+IGVuZCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnN1YiwgJnNpZywgMCk7CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgIT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgICB2YWxpZGl0eSA9IHZhbGlkYXRlX2JvZHlfaGVscGVyICgmc3ViLCBieXRlX29yZGVyLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2RlcHRoICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIGVuZCwgJnApOworICAgICAgICAgICAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiB2YWxpZGl0eTsKKworICAgICAgICAgICAgaWYgKF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdWIpKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX1NQRUNJRklFU19NVUxUSVBMRV9WQUxVRVM7CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9ESUNUX0VOVFJZOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworCisgICAgICAgICAgICBhID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgOCk7CisgICAgICAgICAgICBpZiAoYSA+IGVuZCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB3aGlsZSAocCAhPSBhKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCpwICE9ICdcMCcpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgIHZhbGlkaXR5ID0gdmFsaWRhdGVfYm9keV9oZWxwZXIgKCZzdWIsIGJ5dGVfb3JkZXIsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBlbmQsICZwKTsKKyAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gdmFsaWRpdHk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCB0eXBlY29kZSBpbiBzdXBwb3NlZGx5LXZhbGlkYXRlZCBzaWduYXR1cmUiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWYgMAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgIHZhbGlkYXRlZCB2YWx1ZSBvZiB0eXBlICVzIHR5cGUgcmVhZGVyICVwIHR5cGVfcG9zICVkIHAgJXAgZW5kICVwICVkIHJlbWFpblxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLCByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHAsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpIChlbmQgLSBwKSk7CisjZW5kaWYKKworICAgICAgaWYgKHAgPiBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm90IGVub3VnaCBkYXRhISEhIHAgPSAlcCBlbmQgPSAlcCBlbmQtcCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsIGVuZCwgKGludCkgKGVuZCAtIHApKTsKKyAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorCisgICAgICBpZiAod2Fsa19yZWFkZXJfdG9fZW5kKQorICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0IChyZWFkZXIpOworICAgICAgZWxzZQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKG5ld19wKQorICAgICpuZXdfcCA9IHA7CisKKyAgcmV0dXJuIERCVVNfVkFMSUQ7Cit9CisKKy8qKgorICogVmVyaWZpZXMgdGhhdCB0aGUgcmFuZ2Ugb2YgdmFsdWVfc3RyIGZyb20gdmFsdWVfcG9zIHRvIHZhbHVlX2VuZCBpcworICogYSBsZWdpdGltYXRlIHZhbHVlIG9mIHR5cGUgZXhwZWN0ZWRfc2lnbmF0dXJlLiAgSWYgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyAjVFJVRSwgaXQgd2lsbCBiZSBzYWZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgdmFsdWVzIHdpdGgKKyAqICNEQnVzVHlwZVJlYWRlci4gVGhlIHNpZ25hdHVyZSBpcyBhc3N1bWVkIHRvIGJlIGFscmVhZHkgdmFsaWQuCisgKgorICogSWYgYnl0ZXNfcmVtYWluaW5nIGlzIG5vdCAjTlVMTCwgdGhlbiBsZWZ0b3ZlciBieXRlcyB3aWxsIGJlIHN0b3JlZAorICogdGhlcmUgYW5kICNEQlVTX1ZBTElEIHJldHVybmVkLiBJZiBpdCBpcyAjTlVMTCwgdGhlbgorICogI0RCVVNfSU5WQUxJRF9UT09fTVVDSF9EQVRBIHdpbGwgYmUgcmV0dXJuZWQgaWYgYnl0ZXMgYXJlIGxlZnQKKyAqIG92ZXIuCisgKgorICogQHBhcmFtIGV4cGVjdGVkX3NpZ25hdHVyZSB0aGUgZXhwZWN0ZWQgdHlwZXMgaW4gdGhlIHZhbHVlX3N0cgorICogQHBhcmFtIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCB3aGVyZSBpbiBleHBlY3RlZF9zaWduYXR1cmUgaXMgdGhlIHNpZ25hdHVyZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBieXRlc19yZW1haW5pbmcgcGxhY2UgdG8gc3RvcmUgbGVmdG92ZXIgYnl0ZXMKKyAqIEBwYXJhbSB2YWx1ZV9zdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBib2R5CisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRoZSB2YWx1ZXMgc3RhcnQKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHZhbHVlcyBhZnRlciB2YWx1ZV9wb3MKKyAqIEByZXR1cm5zICNEQlVTX1ZBTElEIGlmIHZhbGlkLCByZWFzb24gd2h5IGludmFsaWQgb3RoZXJ3aXNlCisgKi8KK0RCdXNWYWxpZGl0eQorX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAoY29uc3QgREJ1c1N0cmluZyAqZXhwZWN0ZWRfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2lnbmF0dXJlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmJ5dGVzX3JlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZV9wb3MgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAodmFsdWVfcG9zIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh2YWx1ZV9zdHIpIC0gbGVuKTsKKworICBfZGJ1c192ZXJib3NlICgidmFsaWRhdGluZyBib2R5IGZyb20gcG9zICVkIGxlbiAlZCBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgdmFsdWVfcG9zLCBsZW4sIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGV4cGVjdGVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2lnbmF0dXJlLCBleHBlY3RlZF9zaWduYXR1cmVfc3RhcnQpOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh2YWx1ZV9zdHIsIHZhbHVlX3BvcywgbGVuKTsKKyAgZW5kID0gcCArIGxlbjsKKworICB2YWxpZGl0eSA9IHZhbGlkYXRlX2JvZHlfaGVscGVyICgmcmVhZGVyLCBieXRlX29yZGVyLCBUUlVFLCAwLCBwLCBlbmQsICZwKTsKKyAgaWYgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpCisgICAgcmV0dXJuIHZhbGlkaXR5OworICAKKyAgaWYgKGJ5dGVzX3JlbWFpbmluZykKKyAgICB7CisgICAgICAqYnl0ZXNfcmVtYWluaW5nID0gZW5kIC0gcDsKKyAgICAgIHJldHVybiBEQlVTX1ZBTElEOworICAgIH0KKyAgZWxzZSBpZiAocCA8IGVuZCkKKyAgICByZXR1cm4gREJVU19JTlZBTElEX1RPT19NVUNIX0RBVEE7CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHAgPT0gZW5kKTsKKyAgICAgIHJldHVybiBEQlVTX1ZBTElEOworICAgIH0KK30KKworLyoqCisgKiBEZXRlcm1pbmUgd2V0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICogaW4gYSBuYW1lLgorICovCisjZGVmaW5lIFZBTElEX0lOSVRJQUxfTkFNRV9DSEFSQUNURVIoYykgICAgICAgICBcCisgICggKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA9PSAnXycpICkKKworLyoqCisgKiBEZXRlcm1pbmUgd2V0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgYSBzZWNvbmQgb3IgbGF0ZXIKKyAqIGNoYXJhY3RlciBpbiBhIG5hbWUKKyAqLworI2RlZmluZSBWQUxJRF9OQU1FX0NIQVJBQ1RFUihjKSAgICAgICAgICAgICAgICAgXAorICAoICgoYykgPj0gJzAnICYmIChjKSA8PSAnOScpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPT0gJ18nKSApCisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBvYmplY3QgcGF0aAorICogbmFtZSBpbiB0aGUgRC1CdXMgcHJvdG9jb2wuIFBhcnQgb2YgdGhlIHZhbGlkYXRpb24gZW5zdXJlcyB0aGF0CisgKiB0aGUgb2JqZWN0IHBhdGggY29udGFpbnMgb25seSBBU0NJSS4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHRvZG8gY2hhbmdlIHNwZWMgdG8gZGlzYWxsb3cgbW9yZSB0aGluZ3MsIHN1Y2ggYXMgc3BhY2VzIGluIHRoZQorICogcGF0aCBuYW1lCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9wYXRoIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0X3NsYXNoOworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cikgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICBpZiAoKnMgIT0gJy8nKQorICAgIHJldHVybiBGQUxTRTsKKyAgbGFzdF9zbGFzaCA9IHM7CisgICsrczsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID09ICcvJykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyAtIGxhc3Rfc2xhc2gpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsgLyogbm8gZW1wdHkgcGF0aCBjb21wb25lbnRzIGFsbG93ZWQgKi8KKworICAgICAgICAgIGxhc3Rfc2xhc2ggPSBzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmICgoZW5kIC0gbGFzdF9zbGFzaCkgPCAyICYmCisgICAgICBsZW4gPiAxKQorICAgIHJldHVybiBGQUxTRTsgLyogdHJhaWxpbmcgc2xhc2ggbm90IGFsbG93ZWQgdW5sZXNzIHRoZSBzdHJpbmcgaXMgIi8iICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2NvbnN0IGNoYXIgKgorX2RidXNfdmFsaWRpdHlfdG9fZXJyb3JfbWVzc2FnZSAoREJ1c1ZhbGlkaXR5IHZhbGlkaXR5KQoreworICBzd2l0Y2ggKHZhbGlkaXR5KQorICAgIHsKKyAgICBjYXNlIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk91dCBvZiBtZW1vcnkiOworICAgIGNhc2UgREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTjogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biByZWFzb24iOworICAgIGNhc2UgREJVU19WQUxJRF9CVVRfSU5DT01QTEVURTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFsaWQgYnV0IGluY29tcGxldGUiOworICAgIGNhc2UgREJVU19WQUxJRElUWV9VTktOT1dOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFsaWRpdHkgdW5rbm93biI7CisgICAgY2FzZSBEQlVTX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYWxpZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERTogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHR5cGVjb2RlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRTogICAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgYXJyYXkgZWxlbWVudCB0eXBlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfVE9PX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNpZ25hdHVyZSBpcyB0b28gbG9uZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT046ICAgICAgICAgICAgcmV0dXJuICJFeGNlZWRlZCBtYXhpbXVtIGFycmF5IHJlY3Vyc2lvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OOiAgICAgICAgICAgcmV0dXJuICJFeGNlZWRlZCBtYXhpbXVtIHN0cnVjdCByZWN1cnNpb24iOworICAgIGNhc2UgREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQ6ICAgICAgICAgICAgICAgIHJldHVybiAiU3RydWN0IGVuZGVkIGJ1dCBub3Qgc3RhcnRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDogICAgICAgICAgICAgICAgcmV0dXJuICJTdHJ1Y3Qgc3RhcnRlZCBidXQgbm90IGVuZGVkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN0cnVjdCBoYXMgbm8gZmllbGRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkFsaWdubWVudCBwYWRkaW5nIG5vdCBudWxsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORTogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJvb2xlYW4gaXMgbm90IHplcm8gb3Igb25lIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5vdCBlbm91Z2ggZGF0YSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJUb28gbXVjaCBkYXRhIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfQllURV9PUkRFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBieXRlIG9yZGVyIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfUFJPVE9DT0xfVkVSU0lPTjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBwcm90b2NvbCB2ZXJzaW9uIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfTUVTU0FHRV9UWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBtZXNzYWdlIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9TRVJJQUw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHNlcmlhbCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSU5TQU5FX0ZJRUxEU19BUlJBWV9MRU5HVEg6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJJbnNhbmUgZmllbGRzIGFycmF5IGxlbmd0aCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSU5TQU5FX0JPRFlfTEVOR1RIOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJbnNhbmUgYm9keSBsZW5ndGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWVzc2FnZSB0b28gbG9uZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0NPREU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJIZWFkZXIgZmllbGQgY29kZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0hBU19XUk9OR19UWVBFOiAgICAgICAgICAgICAgICAgcmV0dXJuICJIZWFkZXIgZmllbGQgaGFzIHdyb25nIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVXNlcyBsb2NhbCBpbnRlcmZhY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfUEFUSDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVXNlcyBsb2NhbCBwYXRoIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfQVBQRUFSU19UV0lDRTogICAgICAgICAgICAgICAgICByZXR1cm4gIkhlYWRlciBmaWVsZCBhcHBlYXJzIHR3aWNlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBkZXN0aW5hdGlvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQkFEX0lOVEVSRkFDRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgaW50ZXJmYWNlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfTUVNQkVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBtZW1iZXIiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9FUlJPUl9OQU1FOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIGVycm9yIG5hbWUiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9TRU5ERVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHNlbmRlciI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTUlTU0lOR19QQVRIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nIHBhdGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfSU5URVJGQUNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBpbnRlcmZhY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfTUVNQkVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBtZW1iZXIiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfRVJST1JfTkFNRTogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBlcnJvciBuYW1lIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9NSVNTSU5HX1JFUExZX1NFUklBTDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgcmVwbHkgc2VyaWFsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfRVhDRUVEU19NQVhJTVVNOiAgICAgICAgICAgICAgICByZXR1cm4gIkFycmF5IGxlbmd0aCBleGNlZWRzIG1heGltdW0iOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9QQVRIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHBhdGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICAgICAgICAgIHJldHVybiAiU2lnbmF0dXJlIGxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfVVRGOF9JTl9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCB1dGY4IGluIHN0cmluZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0lOQ09SUkVDVDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJBcnJheSBsZW5ndGggaW5jb3JyZWN0IjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIGxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9CQUQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIGJhZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfRU1QVFk6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYXJpYW50IHNpZ25hdHVyZSBlbXB0eSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfU1BFQ0lGSUVTX01VTFRJUExFX1ZBTFVFUzogcmV0dXJuICJWYXJpYW50IHNpZ25hdHVyZSBzcGVjaWZpZXMgbXVsdGlwbGUgdmFsdWVzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9NSVNTSU5HX05VTDogICAgICAgICAgICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIG1pc3NpbmcgbnVsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUw6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN0cmluZyBtaXNzaW5nIG51bCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX01JU1NJTkdfTlVMOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTaWduYXR1cmUgbWlzc2luZyBudWwiOworICAgIGNhc2UgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fRElDVF9FTlRSWV9SRUNVUlNJT046ICAgICAgIHJldHVybiAiRXhjZWVkZWQgbWF4aW11bSBkaWN0IGVudHJ5IHJlY3Vyc2lvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQ6ICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGVuZGVkIGJ1dCBub3Qgc3RhcnRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9TVEFSVEVEX0JVVF9OT1RfRU5ERUQ6ICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IHN0YXJ0ZWQgYnV0IG5vdCBlbmRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfTk9fRklFTERTOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGhhcyBubyBmaWVsZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEOiAgICAgICAgICAgICAgIHJldHVybiAiRGljdCBlbnRyeSBoYXMgb25seSBvbmUgZmllbGQiOworICAgIGNhc2UgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX1RPT19NQU5ZX0ZJRUxEUzogICAgICAgICAgICAgIHJldHVybiAiRGljdCBlbnRyeSBoYXMgdG9vIG1hbnkgZmllbGRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX05PVF9JTlNJREVfQVJSQVk6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRpY3QgZW50cnkgbm90IGluc2lkZSBhcnJheSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGtleSBtdXN0IGJlIGJhc2ljIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX05FU1RFRF9UT09fREVFUExZOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFyaWFudHMgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIGEgaHVnZWx5IHJlY3Vyc2l2ZSB0cmVlIG9mIHZhbHVlcyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiSW52YWxpZCI7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaW50ZXJmYWNlIG5hbWUKKyAqIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gVGhpcyBpbmNsdWRlcyBhIGxlbmd0aCByZXN0cmljdGlvbiBhbmQgYW4KKyAqIEFTQ0lJIHN1YnNldCwgc2VlIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlmYWNlOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0X2RvdDsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisKKyAgaWYgKGxlbiA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGFzdF9kb3QgPSBOVUxMOworICBpZmFjZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBpZmFjZSArIGxlbjsKKyAgcyA9IGlmYWNlOworCisgIC8qIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgZmlyc3QgY2hhciBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgKiBpbiB0aGUgbG9vcC4gTm90ZSB3ZSBrbm93IGxlbiA+IDAKKyAgICovCisgIGlmIChfREJVU19VTkxJS0VMWSAoKnMgPT0gJy4nKSkgLyogZGlzYWxsb3cgc3RhcnRpbmcgd2l0aCBhIC4gKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfSU5JVElBTF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICArK3M7CisKKyAgd2hpbGUgKHMgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmICgqcyA9PSAnLicpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKChzICsgMSkgPT0gZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0lOSVRJQUxfTkFNRV9DSEFSQUNURVIgKCoocyArIDEpKSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgbGFzdF9kb3QgPSBzOworICAgICAgICAgICsrczsgLyogd2UganVzdCB2YWxpZGF0ZWQgdGhlIG5leHQgY2hhciwgc28gc2tpcCB0d28gKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmIChfREJVU19VTkxJS0VMWSAobGFzdF9kb3QgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgbWVtYmVyIG5hbWUKKyAqIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gVGhpcyBpbmNsdWRlcyBhIGxlbmd0aCByZXN0cmljdGlvbiwgZXRjLiwKKyAqIHNlZSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBjb25zdCB1bnNpZ25lZCBjaGFyICptZW1iZXI7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID4gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lbWJlciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBtZW1iZXIgKyBsZW47CisgIHMgPSBtZW1iZXI7CisKKyAgLyogY2hlY2sgc3BlY2lhbCBjYXNlcyBvZiBmaXJzdCBjaGFyIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBkb25lCisgICAqIGluIHRoZSBsb29wLiBOb3RlIHdlIGtub3cgbGVuID4gMAorICAgKi8KKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9JTklUSUFMX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgICsrczsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfTkFNRV9DSEFSQUNURVIgKCpzKSkpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgKytzOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGVycm9yIG5hbWUKKyAqIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gVGhpcyBpbmNsdWRlcyBhIGxlbmd0aCByZXN0cmljdGlvbiwgZXRjLiwKKyAqIHNlZSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgLyogU2FtZSByZXN0cmljdGlvbnMgYXMgaW50ZXJmYWNlIG5hbWUgYXQgdGhlIG1vbWVudCAqLworICByZXR1cm4gX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlIChzdHIsIHN0YXJ0LCBsZW4pOworfQorCisvKioKKyAqIERldGVybWluZSB3ZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgKiBpbiBhIGJ1cyBuYW1lLgorICovCisjZGVmaW5lIFZBTElEX0lOSVRJQUxfQlVTX05BTUVfQ0hBUkFDVEVSKGMpICAgICAgICAgXAorICAoICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPT0gJ18nKSB8fCAoKGMpID09ICctJykpCisKKy8qKgorICogRGV0ZXJtaW5lIHdldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGFzIGEgc2Vjb25kIG9yIGxhdGVyCisgKiBjaGFyYWN0ZXIgaW4gYSBidXMgbmFtZQorICovCisjZGVmaW5lIFZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUihjKSAgICAgICAgICAgICAgICAgXAorICAoICgoYykgPj0gJzAnICYmIChjKSA8PSAnOScpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpIHx8ICAgICAgICAgICAgICAgXAorICAgICgoYykgPT0gJ18nKSB8fCAoKGMpID09ICctJykpCisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBidXMgbmFtZSBpbgorICogdGhlIEQtQnVzIHByb3RvY29sLiBUaGlzIGluY2x1ZGVzIGEgbGVuZ3RoIHJlc3RyaWN0aW9uLCBldGMuLCBzZWUKKyAqIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX2J1c19uYW1lIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlmYWNlOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0X2RvdDsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSk7CisKKyAgaWYgKGxlbiA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fTkFNRV9MRU5HVEgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGFzdF9kb3QgPSBOVUxMOworICBpZmFjZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBpZmFjZSArIGxlbjsKKyAgcyA9IGlmYWNlOworCisgIC8qIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgZmlyc3QgY2hhciBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgKiBpbiB0aGUgbG9vcC4gTm90ZSB3ZSBrbm93IGxlbiA+IDAKKyAgICovCisgIGlmICgqcyA9PSAnOicpCisgIHsKKyAgICAvKiB1bmlxdWUgbmFtZSAqLworICAgICsrczsKKyAgICB3aGlsZSAocyAhPSBlbmQpCisgICAgICB7CisgICAgICAgIGlmICgqcyA9PSAnLicpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgocyArIDEpID09IGVuZCkpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUiAoKihzICsgMSkpKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgKytzOyAvKiB3ZSBqdXN0IHZhbGlkYXRlZCB0aGUgbmV4dCBjaGFyLCBzbyBza2lwIHR3byAqLworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9CVVNfTkFNRV9DSEFSQUNURVIgKCpzKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICArK3M7CisgICAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoKnMgPT0gJy4nKSkgLyogZGlzYWxsb3cgc3RhcnRpbmcgd2l0aCBhIC4gKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfSU5JVElBTF9CVVNfTkFNRV9DSEFSQUNURVIgKCpzKSkpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgKytzOworCisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoKnMgPT0gJy4nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgocyArIDEpID09IGVuZCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9JTklUSUFMX0JVU19OQU1FX0NIQVJBQ1RFUiAoKihzICsgMSkpKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBsYXN0X2RvdCA9IHM7CisgICAgICAgICAgKytzOyAvKiB3ZSBqdXN0IHZhbGlkYXRlZCB0aGUgbmV4dCBjaGFyLCBzbyBza2lwIHR3byAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmIChfREJVU19VTkxJS0VMWSAobGFzdF9kb3QgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgbWVzc2FnZSB0eXBlCisgKiBzaWduYXR1cmUgaW4gdGhlIEQtQnVzIHByb3RvY29sLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIHNpZ25hdHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKworICBpZiAobGVuID4gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoc3RyLCBzdGFydCwgbGVuKSA9PSBEQlVTX1ZBTElEOworfQorCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGgoKSAqLworREVGSU5FX0RCVVNfTkFNRV9DSEVDSyhwYXRoKQorLyoqIGRlZmluZSBfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UoKSAqLworREVGSU5FX0RCVVNfTkFNRV9DSEVDSyhpbnRlcmZhY2UpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlcigpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKG1lbWJlcikKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKGVycm9yX25hbWUpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lKCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0soYnVzX25hbWUpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3NpZ25hdHVyZSgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKHNpZ25hdHVyZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfdXRmOCgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKHV0ZjgpCisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDJlMjZiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaApAQCAtMCwwICsxLDIwMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCAgVmFsaWRhdGlvbiByb3V0aW5lcyBmb3IgbWFyc2hhbGVkIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX1ZBTElEQVRFX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX1ZBTElEQVRFX0gKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUaGlzIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBib29sIGZvciBoaWdoIHZpc2liaWxpdHkKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZLAorICBEQlVTX1ZBTElEQVRJT05fTU9ERV9EQVRBX0lTX1VOVFJVU1RFRAorfSBEQnVzVmFsaWRhdGlvbk1vZGU7CisKKy8qKgorICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiB1bml0IHRlc3RpbmcsIHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCBlYWNoCisgKiBpbnZhbGlkIG1lc3NhZ2UgaXMgaW52YWxpZCBmb3IgdGhlIGV4cGVjdGVkIHJlYXNvbnMuIFRodXMgd2UgcmVhbGx5CisgKiB3YW50IGEgZGlzdGluY3QgZW51bSB2YWx1ZSBmb3IgZXZlcnkgY29kZXBhdGggbGVhdmluZyB0aGUgdmFsaWRhdG9yCisgKiBmdW5jdGlvbnMuIEVudW0gdmFsdWVzIGFyZSBzcGVjaWZpZWQgbWFudWFsbHkgZm9yIGVhc2Ugb2YgZGVidWdnaW5nCisgKiAoc28geW91IGNhbiBzZWUgdGhlIGVudW0gdmFsdWUgZ2l2ZW4gYSBwcmludGYpCisgKi8KK3R5cGVkZWYgZW51bQoreworI2RlZmluZSBfREJVU19ORUdBVElWRV9WQUxJRElUWV9DT1VOVCA0CisgIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgPSAtNCwgLyoqPCBjYW4ndCBkZXRlcm1pbmUgdmFsaWRpdHkgZHVlIHRvIE9PTSAqLworICBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OID0gLTMsCisgIERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUgPSAtMiwKKyAgREJVU19WQUxJRElUWV9VTktOT1dOID0gLTEsCisgIERCVVNfVkFMSUQgPSAwLCAvKio8IHRoZSBkYXRhIGlzIHZhbGlkICovCisgIERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFID0gMSwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFID0gMiwKKyAgREJVU19JTlZBTElEX1NJR05BVFVSRV9UT09fTE9ORyA9IDMsIC8qIHRoaXMgb25lIGlzIGltcG9zc2libGUgcmlnaHQgbm93IHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB5b3UgY2FuJ3QgcHV0IGEgdG9vLWxvbmcgdmFsdWUgaW4gYSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fQVJSQVlfUkVDVVJTSU9OID0gNCwKKyAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fU1RSVUNUX1JFQ1VSU0lPTiA9IDUsCisgIERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEID0gNiwKKyAgREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgPSA3LAorICBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgPSA4LAorICBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTCA9IDksCisgIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORSA9IDEwLAorICBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBID0gMTEsCisgIERCVVNfSU5WQUxJRF9UT09fTVVDSF9EQVRBID0gMTIsIC8qKjwgdHJhaWxpbmcganVuayBtYWtlcyBpdCBpbnZhbGlkICovCisgIERCVVNfSU5WQUxJRF9CQURfQllURV9PUkRFUiA9IDEzLAorICBEQlVTX0lOVkFMSURfQkFEX1BST1RPQ09MX1ZFUlNJT04gPSAxNCwKKyAgREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEUgPSAxNSwKKyAgREJVU19JTlZBTElEX0JBRF9TRVJJQUwgPSAxNiwKKyAgREJVU19JTlZBTElEX0lOU0FORV9GSUVMRFNfQVJSQVlfTEVOR1RIID0gMTcsCisgIERCVVNfSU5WQUxJRF9JTlNBTkVfQk9EWV9MRU5HVEggPSAxOCwKKyAgREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkcgPSAxOSwKKyAgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9DT0RFID0gMjAsCisgIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfSEFTX1dST05HX1RZUEUgPSAyMSwKKyAgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFID0gMjIsCisgIERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX1BBVEggPSAyMywKKyAgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9BUFBFQVJTX1RXSUNFID0gMjQsCisgIERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT04gPSAyNSwKKyAgREJVU19JTlZBTElEX0JBRF9JTlRFUkZBQ0UgPSAyNiwKKyAgREJVU19JTlZBTElEX0JBRF9NRU1CRVIgPSAyNywKKyAgREJVU19JTlZBTElEX0JBRF9FUlJPUl9OQU1FID0gMjgsCisgIERCVVNfSU5WQUxJRF9CQURfU0VOREVSID0gMjksCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1BBVEggPSAzMCwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfSU5URVJGQUNFID0gMzEsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX01FTUJFUiA9IDMyLAorICBEQlVTX0lOVkFMSURfTUlTU0lOR19FUlJPUl9OQU1FID0gMzMsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1JFUExZX1NFUklBTCA9IDM0LAorICBEQlVTX0lOVkFMSURfTEVOR1RIX09VVF9PRl9CT1VORFMgPSAzNSwKKyAgREJVU19JTlZBTElEX0FSUkFZX0xFTkdUSF9FWENFRURTX01BWElNVU0gPSAzNiwKKyAgREJVU19JTlZBTElEX0JBRF9QQVRIID0gMzcsCisgIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFMgPSAzOCwKKyAgREJVU19JTlZBTElEX0JBRF9VVEY4X0lOX1NUUklORyA9IDM5LAorICBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0lOQ09SUkVDVCA9IDQwLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFMgPSA0MSwKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0JBRCA9IDQyLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfRU1QVFkgPSA0MywKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX1NQRUNJRklFU19NVUxUSVBMRV9WQUxVRVMgPSA0NCwKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX01JU1NJTkdfTlVMID0gNDUsCisgIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUwgPSA0NiwKKyAgREJVU19JTlZBTElEX1NJR05BVFVSRV9NSVNTSU5HX05VTCA9IDQ3LAorICBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9ESUNUX0VOVFJZX1JFQ1VSU0lPTiA9IDQ4LAorICBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQgPSA0OSwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEID0gNTAsCisgIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFMgPSA1MSwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEID0gNTIsCisgIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19UT09fTUFOWV9GSUVMRFMgPSA1MywKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfTk9UX0lOU0lERV9BUlJBWSA9IDU0LAorICBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFID0gNTUsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1VOSVhfRkRTID0gNTYsCisgIERCVVNfSU5WQUxJRF9ORVNURURfVE9PX0RFRVBMWSA9IDU3LAorICBEQlVTX1ZBTElESVRZX0xBU1QKK30gREJ1c1ZhbGlkaXR5OworCitEQnVzVmFsaWRpdHkgX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uIChjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCdXNWYWxpZGl0eSBfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmV4cGVjdGVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpieXRlc19yZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pOworCitjb25zdCBjaGFyICpfZGJ1c192YWxpZGl0eV90b19lcnJvcl9tZXNzYWdlIChEQnVzVmFsaWRpdHkgdmFsaWRpdHkpOworCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9wYXRoICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9tZW1iZXIgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmUgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CisvKiBqdXN0IHRvIGhhdmUgYSBuYW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgYWJvdmU6ICovCisjZGVmaW5lIF9kYnVzX3ZhbGlkYXRlX3V0ZjgocyxiLGUpIF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4IChzLCBiLCBlKQorCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworCisvKiBCZSBzdXJlIHRoZXkgZG9uJ3QgZXhpc3QsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZW0gb3V0c2lkZSBvZiBjaGVja3MKKyAqIGFuZCBzbyB3ZSB3YW50IHRoZSBjb21waWxlIGZhaWx1cmUuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0sod2hhdCkKKyNkZWZpbmUgREVGSU5FX0RCVVNfTkFNRV9DSEVDSyh3aGF0KQorCisjZWxzZSAvKiAhREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisvKiogQSBuYW1lIGNoZWNrIGlzIHVzZWQgaW4gX2RidXNfcmV0dXJuX2lmX2ZhaWwoKSwgaXQncyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhLiB1c2UgX2RidXNfdmFsaWRhdGVfd2hhdGV2ZXIgZm9yIHRoYXQuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0sod2hhdCkgXAorZGJ1c19ib29sX3QgX2RidXNfY2hlY2tfaXNfdmFsaWRfIyN3aGF0IChjb25zdCBjaGFyICpuYW1lKQorCisvKiogRGVmaW5lIGEgbmFtZSBjaGVjayB0byBiZSB1c2VkIGluIF9kYnVzX3JldHVybl9pZl9mYWlsKCkgc3RhdGVtZW50cy4KKyAqLworI2RlZmluZSBERUZJTkVfREJVU19OQU1FX0NIRUNLKHdoYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorX2RidXNfY2hlY2tfaXNfdmFsaWRfIyN3aGF0IChjb25zdCBjaGFyICpuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQnVzU3RyaW5nIHN0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobmFtZSA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX2RidXNfdmFsaWRhdGVfIyN3aGF0ICgmc3RyLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOyAgICAgICAgXAorfQorI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQ0hFQ0tTICovCisKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGgoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0socGF0aCk7CisvKiogZGVmaW5lcyBfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0soaW50ZXJmYWNlKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlcigpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhtZW1iZXIpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhlcnJvcl9uYW1lKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lKCkgKi8KK0RFQ0xBUkVfREJVU19OQU1FX0NIRUNLKGJ1c19uYW1lKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3NpZ25hdHVyZSgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhzaWduYXR1cmUpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfdXRmOCgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyh1dGY4KTsKKworLyoqIEB9ICovCisKKyNlbmRpZiAvKiBEQlVTX01BUlNIQUxfVkFMSURBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lbW9yeS5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzc1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVtb3J5LmMKQEAgLTAsMCArMSw4NTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZW1vcnkuYyAgRC1CdXMgbWVtb3J5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbWVtb3J5LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lbW9yeSBNZW1vcnkgQWxsb2NhdGlvbgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBkYnVzX21hbGxvYygpLCBkYnVzX2ZyZWUoKSwgZXRjLgorICoKKyAqIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gYWxsb2NhdGluZyBhbmQgcmVsZWFzaW5nCisgKiBibG9ja3Mgb2YgbWVtb3J5LgorICoKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWVtb3J5SW50ZXJuYWxzIE1lbW9yeSBhbGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgaW50ZXJuYWxzIG9mIGRidXNfbWFsbG9jKCkgZXRjLgorICoKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgcmVsYXRlZCB0byBhbGxvY2F0aW5nIGFuZCByZWxlYXNpbmcgYmxvY2tzCisgKiBvZiBtZW1vcnkuCisgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5CisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBkZWYgZGJ1c19uZXcKKyAqCisgKiBTYWZlIG1hY3JvIGZvciB1c2luZyBkYnVzX21hbGxvYygpLiBBY2NlcHRzIHRoZSB0eXBlCisgKiB0byBhbGxvY2F0ZSBhbmQgdGhlIG51bWJlciBvZiB0eXBlIGluc3RhbmNlcyB0bworICogYWxsb2NhdGUgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJucyBhIG1lbW9yeSBibG9jaworICogY2FzdCB0byB0aGUgZGVzaXJlZCB0eXBlLCBpbnN0ZWFkIG9mIGFzIGEgdm9pZCouCisgKgorICogQHBhcmFtIHR5cGUgdHlwZSBuYW1lIHRvIGFsbG9jYXRlCisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGluc3RhbmNlcyBpbiB0aGUgYWxsb2NhdGVkIGFycmF5CisgKiBAcmV0dXJucyB0aGUgbmV3IG1lbW9yeSBibG9jayBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KKworLyoqCisgKiBAZGVmIGRidXNfbmV3MAorICoKKyAqIFNhZmUgbWFjcm8gZm9yIHVzaW5nIGRidXNfbWFsbG9jMCgpLiBBY2NlcHRzIHRoZSB0eXBlCisgKiB0byBhbGxvY2F0ZSBhbmQgdGhlIG51bWJlciBvZiB0eXBlIGluc3RhbmNlcyB0bworICogYWxsb2NhdGUgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJucyBhIG1lbW9yeSBibG9jaworICogY2FzdCB0byB0aGUgZGVzaXJlZCB0eXBlLCBpbnN0ZWFkIG9mIGFzIGEgdm9pZCouCisgKiBUaGUgYWxsb2NhdGVkIGFycmF5IGlzIGluaXRpYWxpemVkIHRvIGFsbC1iaXRzLXplcm8uCisgKgorICogQHBhcmFtIHR5cGUgdHlwZSBuYW1lIHRvIGFsbG9jYXRlCisgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGluc3RhbmNlcyBpbiB0aGUgYWxsb2NhdGVkIGFycmF5CisgKiBAcmV0dXJucyB0aGUgbmV3IG1lbW9yeSBibG9jayBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzRnJlZUZ1bmN0aW9uCisgKgorICogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB3aGljaCBmcmVlcyBhIGJsb2NrIG9mIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gbWVtb3J5IHRoZSBtZW1vcnkgdG8gZnJlZQorICovCisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgcHVibGljIEFQSSBkb2NzICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeUludGVybmFscworICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkZWJ1Z19pbml0aWFsaXplZCA9IEZBTFNFOworc3RhdGljIGludCBmYWlsX250aCA9IC0xOworc3RhdGljIHNpemVfdCBmYWlsX3NpemUgPSAwOworc3RhdGljIGludCBmYWlsX2FsbG9jX2NvdW50ZXIgPSBfREJVU19JTlRfTUFYOworc3RhdGljIGludCBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlID0gMTsKK3N0YXRpYyBpbnQgbl9mYWlsdXJlc190aGlzX2ZhaWx1cmUgPSAwOworc3RhdGljIGRidXNfYm9vbF90IGd1YXJkcyA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IGRpc2FibGVfbWVtX3Bvb2xzID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgYmFja3RyYWNlX29uX2ZhaWxfYWxsb2MgPSBGQUxTRTsKK3N0YXRpYyBEQnVzQXRvbWljIG5fYmxvY2tzX291dHN0YW5kaW5nID0gezB9OworCisvKiogdmFsdWUgc3RvcmVkIGluIGd1YXJkIHBhZGRpbmcgZm9yIGRlYnVnZ2luZyBidWZmZXIgb3ZlcnJ1biAqLworI2RlZmluZSBHVUFSRF9WQUxVRSAweGRlYWRiZWVmCisvKiogc2l6ZSBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJsb2NrIHN0b3JlZCBpbiBndWFyZCBtb2RlICovCisjZGVmaW5lIEdVQVJEX0lORk9fU0laRSA4CisvKiogc2l6ZSBvZiB0aGUgR1VBUkRfVkFMVUUtZmlsbGVkIHBhZGRpbmcgYWZ0ZXIgdGhlIGhlYWRlciBpbmZvICAqLworI2RlZmluZSBHVUFSRF9TVEFSVF9QQUQgMTYKKy8qKiBzaXplIG9mIHRoZSBHVUFSRF9WQUxVRS1maWxsZWQgcGFkZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworI2RlZmluZSBHVUFSRF9FTkRfUEFEIDE2CisvKiogc2l6ZSBvZiBzdHVmZiBhdCBzdGFydCBvZiBibG9jayAqLworI2RlZmluZSBHVUFSRF9TVEFSVF9PRkZTRVQgKEdVQVJEX1NUQVJUX1BBRCArIEdVQVJEX0lORk9fU0laRSkKKy8qKiB0b3RhbCBleHRyYSBzaXplIG92ZXIgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGZvciBndWFyZCBzdHVmZiAqLworI2RlZmluZSBHVUFSRF9FWFRSQV9TSVpFIChHVUFSRF9TVEFSVF9PRkZTRVQgKyBHVUFSRF9FTkRfUEFEKQorCitzdGF0aWMgdm9pZAorX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKHZvaWQpCit7CisgIGlmICghZGVidWdfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgZGVidWdfaW5pdGlhbGl6ZWQgPSBUUlVFOworICAgICAgCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9OVEgiKSAhPSBOVUxMKQorCXsKKwkgIGZhaWxfbnRoID0gYXRvaSAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9OVEgiKSk7CisgICAgICAgICAgZmFpbF9hbGxvY19jb3VudGVyID0gZmFpbF9udGg7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZmFpbCBtYWxsb2MgZXZlcnkgJWQgdGltZXNcbiIsIGZhaWxfbnRoKTsKKwl9CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX01BTExPQ19GQUlMX0dSRUFURVJfVEhBTiIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBmYWlsX3NpemUgPSBhdG9pIChfZGJ1c19nZXRlbnYgKCJEQlVTX01BTExPQ19GQUlMX0dSRUFURVJfVEhBTiIpKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2lsbCBmYWlsIG1hbGxvY3Mgb3ZlciAlbGQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGZhaWxfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgaWYgKF9kYnVzX2dldGVudiAoIkRCVVNfTUFMTE9DX0dVQVJEUyIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBndWFyZHMgPSBUUlVFOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXaWxsIHVzZSBtYWxsb2MgZ3VhcmRzXG4iKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19ESVNBQkxFX01FTV9QT09MUyIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkaXNhYmxlX21lbV9wb29scyA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZGlzYWJsZSBtZW1vcnkgcG9vbHNcbiIpOworICAgICAgICB9CisKKyAgICAgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX01BTExPQ19CQUNLVFJBQ0VTIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGJhY2t0cmFjZV9vbl9mYWlsX2FsbG9jID0gVFJVRTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2lsbCBiYWNrdHJhY2Ugb24gZmFpbGluZyBhIG1hbGxvY1xuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogV2hldGhlciB0byB0dXJuIG9mZiBtZW0gcG9vbHMsIHVzZWZ1bCBmb3IgbGVhayBjaGVja2luZy4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiBtZW1wb29scyBzaG91bGQgbm90IGJlIHVzZWQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kaXNhYmxlX21lbV9wb29scyAodm9pZCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIHJldHVybiBkaXNhYmxlX21lbV9wb29sczsKK30KKworLyoqCisgKiBTZXRzIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMgdW50aWwgd2Ugc2ltdWxhdGUgYSBmYWlsZWQKKyAqIGFsbG9jYXRpb24uIElmIHNldCB0byAwLCB0aGUgbmV4dCBhbGxvY2F0aW9uIHRvIHJ1bgorICogZmFpbHM7IGlmIHNldCB0byAxLCBvbmUgc3VjY2VlZHMgdGhlbiB0aGUgbmV4dCBmYWlsczsgZXRjLgorICogU2V0IHRvIF9EQlVTX0lOVF9NQVggdG8gbm90IGZhaWwgYW55dGhpbmcuIAorICoKKyAqIEBwYXJhbSB1bnRpbF9uZXh0X2ZhaWwgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgYWxsb2NzIGJlZm9yZSBvbmUgZmFpbHMKKyAqLwordm9pZAorX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoaW50IHVudGlsX25leHRfZmFpbCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisKKyAgZmFpbF9hbGxvY19jb3VudGVyID0gdW50aWxfbmV4dF9mYWlsOworCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiU2V0IGZhaWwgYWxsb2MgY291bnRlciA9ICVkXG4iLCBmYWlsX2FsbG9jX2NvdW50ZXIpOworI2VuZGlmCit9CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgYWxsb2NzIHVudGlsIHdlJ2xsIHNpbXVsYXRlCisgKiBhIGZhaWxlZCBhbGxvYy4KKyAqCisgKiBAcmV0dXJucyBjdXJyZW50IGNvdW50ZXIgdmFsdWUKKyAqLworaW50CitfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICh2b2lkKQoreworICBfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZyAoKTsKKworICByZXR1cm4gZmFpbF9hbGxvY19jb3VudGVyOworfQorCisvKioKKyAqIFNldHMgaG93IG1hbnkgbWFsbG9jcyB0byBmYWlsIHdoZW4gdGhlIGZhaWwgYWxsb2MgY291bnRlciByZWFjaGVzCisgKiAwLgorICoKKyAqIEBwYXJhbSBmYWlsdXJlc19wZXJfZmFpbHVyZSBudW1iZXIgdG8gZmFpbAorICovCit2b2lkCitfZGJ1c19zZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAoaW50IGZhaWx1cmVzX3Blcl9mYWlsdXJlKQoreworICBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlID0gZmFpbHVyZXNfcGVyX2ZhaWx1cmU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIHdlJ2xsIGhhdmUgd2hlbiB0aGUgZmFpbCBtYWxsb2MKKyAqIGNvdW50ZXIgcmVhY2hlcyAwLgorICoKKyAqIEByZXR1cm5zIG51bWJlciBvZiBmYWlsdXJlcyBwbGFubmVkCisgKi8KK2ludAorX2RidXNfZ2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgKHZvaWQpCit7CisgIHJldHVybiBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIGRidXNfYm9vbF90IGNhbGxlZCA9IDA7CisvKioKKyAqIENhbGxlZCB3aGVuIGFib3V0IHRvIGFsbG9jIHNvbWUgbWVtb3J5OyBpZgorICogaXQgcmV0dXJucyAjVFJVRSwgdGhlbiB0aGUgYWxsb2NhdGlvbiBzaG91bGQKKyAqIGZhaWwuIElmIGl0IHJldHVybnMgI0ZBTFNFLCB0aGVuIHRoZSBhbGxvY2F0aW9uCisgKiBzaG91bGQgbm90IGZhaWwuCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyBhbGxvYyBzaG91bGQgZmFpbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAodm9pZCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisjaWZkZWYgREJVU19XSU5fRklYTUUKKyAgeworICAgIGlmICghY2FsbGVkKQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlKCJUT0RPOiBtZW1vcnkgYWxsb2NhdGlvbiB0ZXN0aW5nIGVycm9ycyBkaXNhYmxlZCBmb3Igbm93XG4iKTsKKyAgICAgICAgY2FsbGVkID0gMTsKKyAgICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNlbmRpZgorCisgIGlmIChmYWlsX2FsbG9jX2NvdW50ZXIgPD0gMCkKKyAgICB7CisgICAgICBpZiAoYmFja3RyYWNlX29uX2ZhaWxfYWxsb2MpCisgICAgICAgIF9kYnVzX3ByaW50X2JhY2t0cmFjZSAoKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImZhaWx1cmUgJWRcbiIsIG5fZmFpbHVyZXNfdGhpc19mYWlsdXJlKTsKKyAgICAgIAorICAgICAgbl9mYWlsdXJlc190aGlzX2ZhaWx1cmUgKz0gMTsKKyAgICAgIGlmIChuX2ZhaWx1cmVzX3RoaXNfZmFpbHVyZSA+PSBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGZhaWxfbnRoID49IDApCisgICAgICAgICAgICBmYWlsX2FsbG9jX2NvdW50ZXIgPSBmYWlsX250aDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmYWlsX2FsbG9jX2NvdW50ZXIgPSBfREJVU19JTlRfTUFYOworCisgICAgICAgICAgbl9mYWlsdXJlc190aGlzX2ZhaWx1cmUgPSAwOworCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlc2V0IGZhaWwgYWxsb2MgY291bnRlciB0byAlZFxuIiwgZmFpbF9hbGxvY19jb3VudGVyKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmYWlsX2FsbG9jX2NvdW50ZXIgLT0gMTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIG1hbGxvYygpJ2QgYmxvY2tzLgorICoKKyAqIEByZXR1cm5zIG51bWJlciBvZiBibG9ja3MKKyAqLworaW50CitfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAodm9pZCkKK3sKKyAgcmV0dXJuIG5fYmxvY2tzX291dHN0YW5kaW5nLnZhbHVlOworfQorCisvKioKKyAqIFdoZXJlIHRoZSBibG9jayBjYW1lIGZyb20uCisgKi8KK3R5cGVkZWYgZW51bQoreworICBTT1VSQ0VfVU5LTk9XTiwKKyAgU09VUkNFX01BTExPQywKKyAgU09VUkNFX1JFQUxMT0MsCisgIFNPVVJDRV9NQUxMT0NfWkVSTywKKyAgU09VUkNFX1JFQUxMT0NfTlVMTAorfSBCbG9ja1NvdXJjZTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitzb3VyY2Vfc3RyaW5nIChCbG9ja1NvdXJjZSBzb3VyY2UpCit7CisgIHN3aXRjaCAoc291cmNlKQorICAgIHsKKyAgICBjYXNlIFNPVVJDRV9VTktOT1dOOgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICBjYXNlIFNPVVJDRV9NQUxMT0M6CisgICAgICByZXR1cm4gIm1hbGxvYyI7CisgICAgY2FzZSBTT1VSQ0VfUkVBTExPQzoKKyAgICAgIHJldHVybiAicmVhbGxvYyI7CisgICAgY2FzZSBTT1VSQ0VfTUFMTE9DX1pFUk86CisgICAgICByZXR1cm4gIm1hbGxvYzAiOworICAgIGNhc2UgU09VUkNFX1JFQUxMT0NfTlVMTDoKKyAgICAgIHJldHVybiAicmVhbGxvYyhOVUxMKSI7CisgICAgfQorICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJJbnZhbGlkIG1hbGxvYyBibG9jayBzb3VyY2UgSUQiKTsKKyAgcmV0dXJuICJpbnZhbGlkISI7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19ndWFyZHMgKHZvaWQgICAgICAgKmZyZWVfYmxvY2ssCisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG92ZXJ3cml0ZSkKK3sKKyAgaWYgKGZyZWVfYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpibG9jayA9ICgodW5zaWduZWQgY2hhciopZnJlZV9ibG9jaykgLSBHVUFSRF9TVEFSVF9PRkZTRVQ7CisgICAgICBzaXplX3QgcmVxdWVzdGVkX2J5dGVzID0gKihkYnVzX3VpbnQzMl90KilibG9jazsKKyAgICAgIEJsb2NrU291cmNlIHNvdXJjZSA9ICooZGJ1c191aW50MzJfdCopKGJsb2NrICsgNCk7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgIGRidXNfYm9vbF90IGZhaWxlZDsKKworICAgICAgZmFpbGVkID0gRkFMU0U7CisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgiQ2hlY2tpbmcgJWQgYnl0ZXMgcmVxdWVzdCBmcm9tIHNvdXJjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9ieXRlcywgc291cmNlX3N0cmluZyAoc291cmNlKSk7CisjZW5kaWYKKyAgICAgIAorICAgICAgaSA9IEdVQVJEX0lORk9fU0laRTsKKyAgICAgIHdoaWxlIChpIDwgR1VBUkRfU1RBUlRfT0ZGU0VUKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSA9ICooZGJ1c191aW50MzJfdCopICZibG9ja1tpXTsKKyAgICAgICAgICBpZiAodmFsdWUgIT0gR1VBUkRfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJCbG9jayBvZiAlbHUgYnl0ZXMgZnJvbSAlcyBoYWQgc3RhcnQgZ3VhcmQgdmFsdWUgMHgldXggYXQgJWQgZXhwZWN0ZWQgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHJlcXVlc3RlZF9ieXRlcywgc291cmNlX3N0cmluZyAoc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGksIEdVQVJEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgZmFpbGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpICs9IDQ7CisgICAgICAgIH0KKworICAgICAgaSA9IEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlczsKKyAgICAgIHdoaWxlIChpIDwgKEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlcyArIEdVQVJEX0VORF9QQUQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSA9ICooZGJ1c191aW50MzJfdCopICZibG9ja1tpXTsKKyAgICAgICAgICBpZiAodmFsdWUgIT0gR1VBUkRfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJCbG9jayBvZiAlbHUgYnl0ZXMgZnJvbSAlcyBoYWQgZW5kIGd1YXJkIHZhbHVlIDB4JXV4IGF0ICVkIGV4cGVjdGVkIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSByZXF1ZXN0ZWRfYnl0ZXMsIHNvdXJjZV9zdHJpbmcgKHNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBpLCBHVUFSRF9WQUxVRSk7CisgICAgICAgICAgICAgIGZhaWxlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaSArPSA0OworICAgICAgICB9CisKKyAgICAgIC8qIHNldCBtZW1vcnkgdG8gYW55dGhpbmcgYnV0IG51bCBieXRlcyAqLworICAgICAgaWYgKG92ZXJ3cml0ZSkKKyAgICAgICAgbWVtc2V0IChmcmVlX2Jsb2NrLCAnZycsIHJlcXVlc3RlZF9ieXRlcyk7CisgICAgICAKKyAgICAgIGlmIChmYWlsZWQpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImd1YXJkIHZhbHVlIGNvcnJ1cHRpb24iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkKgorc2V0X2d1YXJkcyAodm9pZCAgICAgICAqcmVhbF9ibG9jaywKKyAgICAgICAgICAgIHNpemVfdCAgICAgIHJlcXVlc3RlZF9ieXRlcywKKyAgICAgICAgICAgIEJsb2NrU291cmNlIHNvdXJjZSkKK3sKKyAgdW5zaWduZWQgY2hhciAqYmxvY2sgPSByZWFsX2Jsb2NrOworICB1bnNpZ25lZCBpbnQgaTsKKyAgCisgIGlmIChibG9jayA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX2Fzc2VydCAoR1VBUkRfU1RBUlRfT0ZGU0VUICsgR1VBUkRfRU5EX1BBRCA9PSBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgCisgICooKGRidXNfdWludDMyX3QqKWJsb2NrKSA9IHJlcXVlc3RlZF9ieXRlczsKKyAgKigoZGJ1c191aW50MzJfdCopKGJsb2NrICsgNCkpID0gc291cmNlOworCisgIGkgPSBHVUFSRF9JTkZPX1NJWkU7CisgIHdoaWxlIChpIDwgR1VBUkRfU1RBUlRfT0ZGU0VUKQorICAgIHsKKyAgICAgICgqKGRidXNfdWludDMyX3QqKSAmYmxvY2tbaV0pID0gR1VBUkRfVkFMVUU7CisgICAgICAKKyAgICAgIGkgKz0gNDsKKyAgICB9CisKKyAgaSA9IEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlczsKKyAgd2hpbGUgKGkgPCAoR1VBUkRfU1RBUlRfT0ZGU0VUICsgcmVxdWVzdGVkX2J5dGVzICsgR1VBUkRfRU5EX1BBRCkpCisgICAgeworICAgICAgKCooZGJ1c191aW50MzJfdCopICZibG9ja1tpXSkgPSBHVUFSRF9WQUxVRTsKKyAgICAgIAorICAgICAgaSArPSA0OworICAgIH0KKyAgCisgIGNoZWNrX2d1YXJkcyAoYmxvY2sgKyBHVUFSRF9TVEFSVF9PRkZTRVQsIEZBTFNFKTsKKyAgCisgIHJldHVybiBibG9jayArIEdVQVJEX1NUQVJUX09GRlNFVDsKK30KKworI2VuZGlmCisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzIGRvY3MgKi8KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZW1vcnkKKyAqCisgKiBAeworICovCisKKy8qKgorICogQWxsb2NhdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMsIGFzIHdpdGggc3RhbmRhcmQKKyAqIG1hbGxvYygpLiBHdWFyYW50ZWVkIHRvIHJldHVybiAjTlVMTCBpZiBieXRlcyBpcyB6ZXJvCisgKiBvbiBhbGwgcGxhdGZvcm1zLiBSZXR1cm5zICNOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICogVGhlIG1lbW9yeSBtdXN0IGJlIHJlbGVhc2VkIHdpdGggZGJ1c19mcmVlKCkuCisgKgorICogZGJ1c19tYWxsb2MoKSBtZW1vcnkgaXMgTk9UIHNhZmUgdG8gZnJlZSB3aXRoIHJlZ3VsYXIgZnJlZSgpIGZyb20KKyAqIHRoZSBDIGxpYnJhcnkuIEZyZWUgaXQgd2l0aCBkYnVzX2ZyZWUoKSBvbmx5LgorICoKKyAqIEBwYXJhbSBieXRlcyBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqIEByZXR1cm4gYWxsb2NhdGVkIG1lbW9yeSwgb3IgI05VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbHMuCisgKi8KK3ZvaWQqCitkYnVzX21hbGxvYyAoc2l6ZV90IGJ5dGVzKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgbWFsbG9jIG9mICVsZCBieXRlc1xuIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorCisgIGlmIChieXRlcyA9PSAwKSAvKiBzb21lIHN5c3RlbSBtYWxsb2NzIGhhbmRsZSB0aGlzLCBzb21lIGRvbid0ICovCisgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBlbHNlIGlmIChmYWlsX3NpemUgIT0gMCAmJiBieXRlcyA+IGZhaWxfc2l6ZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZSBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIHZvaWQgKmJsb2NrOworCisgICAgICBibG9jayA9IG1hbGxvYyAoYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgIGlmIChibG9jaykKKwlfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgCisgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfTUFMTE9DKTsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIHZvaWQgKm1lbTsKKyAgICAgIG1lbSA9IG1hbGxvYyAoYnl0ZXMpOworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgIGlmIChtZW0pCisJX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIG1lbTsKKyAgICB9Cit9CisKKy8qKgorICogQWxsb2NhdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMsIGFzIHdpdGggc3RhbmRhcmQgbWFsbG9jKCksIGJ1dAorICogYWxsIGJ5dGVzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGFzIHdpdGggY2FsbG9jKCkuIEd1YXJhbnRlZWQgdG8KKyAqIHJldHVybiAjTlVMTCBpZiBieXRlcyBpcyB6ZXJvIG9uIGFsbCBwbGF0Zm9ybXMuIFJldHVybnMgI05VTEwgaWYgdGhlCisgKiBhbGxvY2F0aW9uIGZhaWxzLiAgVGhlIG1lbW9yeSBtdXN0IGJlIHJlbGVhc2VkIHdpdGggZGJ1c19mcmVlKCkuCisgKgorICogZGJ1c19tYWxsb2MwKCkgbWVtb3J5IGlzIE5PVCBzYWZlIHRvIGZyZWUgd2l0aCByZWd1bGFyIGZyZWUoKSBmcm9tCisgKiB0aGUgQyBsaWJyYXJ5LiBGcmVlIGl0IHdpdGggZGJ1c19mcmVlKCkgb25seS4KKyAqCisgKiBAcGFyYW0gYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiBAcmV0dXJuIGFsbG9jYXRlZCBtZW1vcnksIG9yICNOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICovCit2b2lkKgorZGJ1c19tYWxsb2MwIChzaXplX3QgYnl0ZXMpCit7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZyAoKTsKKyAgCisgIGlmIChfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgRkFJTElORyBtYWxsb2MwIG9mICVsZCBieXRlc1xuIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgIAorICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmCisgIAorICBpZiAoYnl0ZXMgPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGVsc2UgaWYgKGZhaWxfc2l6ZSAhPSAwICYmIGJ5dGVzID4gZmFpbF9zaXplKQorICAgIHJldHVybiBOVUxMOworICBlbHNlIGlmIChndWFyZHMpCisgICAgeworICAgICAgdm9pZCAqYmxvY2s7CisKKyAgICAgIGJsb2NrID0gY2FsbG9jIChieXRlcyArIEdVQVJEX0VYVFJBX1NJWkUsIDEpOworICAgICAgaWYgKGJsb2NrKQorCV9kYnVzX2F0b21pY19pbmMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfTUFMTE9DX1pFUk8pOworICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgdm9pZCAqbWVtOworICAgICAgbWVtID0gY2FsbG9jIChieXRlcywgMSk7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgaWYgKG1lbSkKKwlfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworI2VuZGlmCisgICAgICByZXR1cm4gbWVtOworICAgIH0KK30KKworLyoqCisgKiBSZXNpemVzIGEgYmxvY2sgb2YgbWVtb3J5IHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGRidXNfbWFsbG9jKCkgb3IKKyAqIGRidXNfbWFsbG9jMCgpLiBHdWFyYW50ZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSBhbmQgcmV0dXJuICNOVUxMIGlmIGJ5dGVzCisgKiBpcyB6ZXJvIG9uIGFsbCBwbGF0Zm9ybXMuIFJldHVybnMgI05VTEwgaWYgdGhlIHJlc2l6ZSBmYWlscy4KKyAqIElmIHRoZSByZXNpemUgZmFpbHMsIHRoZSBtZW1vcnkgaXMgbm90IGZyZWVkLgorICoKKyAqIEBwYXJhbSBtZW1vcnkgYmxvY2sgdG8gYmUgcmVzaXplZAorICogQHBhcmFtIGJ5dGVzIG5ldyBzaXplIG9mIHRoZSBtZW1vcnkgYmxvY2sKKyAqIEByZXR1cm4gYWxsb2NhdGVkIG1lbW9yeSwgb3IgI05VTEwgaWYgdGhlIHJlc2l6ZSBmYWlscy4KKyAqLwordm9pZCoKK2RidXNfcmVhbGxvYyAodm9pZCAgKm1lbW9yeSwKKyAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgcmVhbGxvYyBvZiAlbGQgYnl0ZXNcbiIsIChsb25nKSBieXRlcyk7CisgICAgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorICAKKyAgaWYgKGJ5dGVzID09IDApIC8qIGd1YXJhbnRlZSB0aGlzIGlzIHNhZmUgKi8KKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG1lbW9yeSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBlbHNlIGlmIChmYWlsX3NpemUgIT0gMCAmJiBieXRlcyA+IGZhaWxfc2l6ZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZSBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIGlmIChtZW1vcnkpCisgICAgICAgIHsKKyAgICAgICAgICBzaXplX3Qgb2xkX2J5dGVzOworICAgICAgICAgIHZvaWQgKmJsb2NrOworICAgICAgICAgIAorICAgICAgICAgIGNoZWNrX2d1YXJkcyAobWVtb3J5LCBGQUxTRSk7CisgICAgICAgICAgCisgICAgICAgICAgYmxvY2sgPSByZWFsbG9jICgoKHVuc2lnbmVkIGNoYXIqKW1lbW9yeSkgLSBHVUFSRF9TVEFSVF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyArIEdVQVJEX0VYVFJBX1NJWkUpOworCisJICBvbGRfYnl0ZXMgPSAqKGRidXNfdWludDMyX3QqKWJsb2NrOworICAgICAgICAgIGlmIChibG9jayAmJiBieXRlcyA+PSBvbGRfYnl0ZXMpCisgICAgICAgICAgICAvKiBvbGQgZ3VhcmRzIHNob3VsZG4ndCBoYXZlIG1vdmVkICovCisgICAgICAgICAgICBjaGVja19ndWFyZHMgKCgodW5zaWduZWQgY2hhciopYmxvY2spICsgR1VBUkRfU1RBUlRfT0ZGU0VULCBGQUxTRSk7CisgICAgICAgICAgCisgICAgICAgICAgcmV0dXJuIHNldF9ndWFyZHMgKGJsb2NrLCBieXRlcywgU09VUkNFX1JFQUxMT0MpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB2b2lkICpibG9jazsKKyAgICAgICAgICAKKyAgICAgICAgICBibG9jayA9IG1hbGxvYyAoYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFKTsKKworICAgICAgICAgIGlmIChibG9jaykKKwkgICAgX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyAgICAgICAgICAKKyAgICAgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfUkVBTExPQ19OVUxMKTsgICAKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgdm9pZCAqbWVtOworICAgICAgbWVtID0gcmVhbGxvYyAobWVtb3J5LCBieXRlcyk7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgaWYgKG1lbW9yeSA9PSBOVUxMICYmIG1lbSAhPSBOVUxMKQorCSAgICBfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworI2VuZGlmCisgICAgICByZXR1cm4gbWVtOworICAgIH0KK30KKworLyoqCisgKiBGcmVlcyBhIGJsb2NrIG9mIG1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCBieSBkYnVzX21hbGxvYygpIG9yCisgKiBkYnVzX21hbGxvYzAoKS4gSWYgcGFzc2VkICNOVUxMLCBkb2VzIG5vdGhpbmcuCisgKiAKKyAqIEBwYXJhbSBtZW1vcnkgYmxvY2sgdG8gYmUgZnJlZWQKKyAqLwordm9pZAorZGJ1c19mcmVlICh2b2lkICAqbWVtb3J5KQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKGd1YXJkcykKKyAgICB7CisgICAgICBjaGVja19ndWFyZHMgKG1lbW9yeSwgVFJVRSk7CisgICAgICBpZiAobWVtb3J5KQorICAgICAgICB7CisJICBfZGJ1c19hdG9taWNfZGVjICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgICAgIAorCSAgX2RidXNfYXNzZXJ0IChuX2Jsb2Nrc19vdXRzdGFuZGluZy52YWx1ZSA+PSAwKTsKKyAgICAgICAgICAKKyAgICAgICAgICBmcmVlICgoKHVuc2lnbmVkIGNoYXIqKW1lbW9yeSkgLSBHVUFSRF9TVEFSVF9PRkZTRVQpOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgaWYgKG1lbW9yeSkgLyogd2UgZ3VhcmFudGVlIGl0J3Mgc2FmZSB0byBmcmVlIChOVUxMKSAqLworICAgIHsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBfZGJ1c19hdG9taWNfZGVjICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKG5fYmxvY2tzX291dHN0YW5kaW5nLnZhbHVlID49IDApOworI2VuZGlmCisKKyAgICAgIGZyZWUgKG1lbW9yeSk7CisgICAgfQorfQorCisvKioKKyAqIEZyZWVzIGEgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzLgorICogSWYgcGFzc2VkICNOVUxMLCBkb2VzIG5vdGhpbmcuCisgKgorICogQHBhcmFtIHN0cl9hcnJheSB0aGUgYXJyYXkgdG8gYmUgZnJlZWQKKyAqLwordm9pZAorZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hhciAqKnN0cl9hcnJheSkKK3sKKyAgaWYgKHN0cl9hcnJheSkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoc3RyX2FycmF5W2ldKQorCXsKKwkgIGRidXNfZnJlZSAoc3RyX2FycmF5W2ldKTsKKwkgIGkrKzsKKwl9CisKKyAgICAgIGRidXNfZnJlZSAoc3RyX2FycmF5KTsKKyAgICB9Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgcHVibGljIEFQSSBkb2NzIGJsb2NrICovCisKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5SW50ZXJuYWxzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiBpcyB1c2VkIHRvIHRyYWNrIGVhY2gKKyAqIHRpbWUgdGhhdCBkYnVzX3NodXRkb3duKCkgaXMgY2FsbGVkLCBzbyB3ZSBjYW4KKyAqIHJlaW5pdCB0aGluZ3MgYWZ0ZXIgaXQncyBiZWVuIGNhbGxlZC4gSXQgaXMgc2ltcGx5CisgKiBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgd2Ugc2h1dCBkb3duLgorICovCitpbnQgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uID0gMTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHNodXRkb3duLgorICovCit0eXBlZGVmIHN0cnVjdCBTaHV0ZG93bkNsb3N1cmUgU2h1dGRvd25DbG9zdXJlOworCisvKioKKyAqIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gc2h1dGRvd24uCisgKi8KK3N0cnVjdCBTaHV0ZG93bkNsb3N1cmUKK3sKKyAgU2h1dGRvd25DbG9zdXJlICpuZXh0OyAgICAgLyoqPCBOZXh0IFNodXRkb3duQ2xvc3VyZSAqLworICBEQnVzU2h1dGRvd25GdW5jdGlvbiBmdW5jOyAvKio8IEZ1bmN0aW9uIHRvIGNhbGwgKi8KKyAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciBmdW5jdGlvbiAqLworfTsKKworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChzaHV0ZG93bl9mdW5jcyk7CitzdGF0aWMgU2h1dGRvd25DbG9zdXJlICpyZWdpc3RlcmVkX2dsb2JhbHMgPSBOVUxMOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2xlYW51cCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZXhhY3RseSBvbmNlCisgKiB0aGUgbmV4dCB0aW1lIGRidXNfc2h1dGRvd24oKSBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKERCdXNTaHV0ZG93bkZ1bmN0aW9uICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIFNodXRkb3duQ2xvc3VyZSAqYzsKKworICBjID0gZGJ1c19uZXcgKFNodXRkb3duQ2xvc3VyZSwgMSk7CisKKyAgaWYgKGMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYy0+ZnVuYyA9IGZ1bmM7CisgIGMtPmRhdGEgPSBkYXRhOworCisgIF9EQlVTX0xPQ0sgKHNodXRkb3duX2Z1bmNzKTsKKyAgCisgIGMtPm5leHQgPSByZWdpc3RlcmVkX2dsb2JhbHM7CisgIHJlZ2lzdGVyZWRfZ2xvYmFscyA9IGM7CisKKyAgX0RCVVNfVU5MT0NLIChzaHV0ZG93bl9mdW5jcyk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBwcml2YXRlIEFQSSBkb2NzIGJsb2NrICovCisKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5CisgKgorICogQHsKKyAqLworCisvKioKKyAqIEZyZWVzIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGludGVybmFsbHkgYnkgbGliZGJ1cyBhbmQKKyAqIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIGRidXNfdGhyZWFkc19pbml0KCkuIGxpYmRidXMga2VlcHMgaW50ZXJuYWwKKyAqIGdsb2JhbCB2YXJpYWJsZXMsIGZvciBleGFtcGxlIGNhY2hlcyBhbmQgdGhyZWFkIGxvY2tzLCBhbmQgaXQKKyAqIGNhbiBiZSB1c2VmdWwgdG8gZnJlZSB0aGVzZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogZGJ1c19zaHV0ZG93bigpIGRvZXMgTk9UIGZyZWUgbWVtb3J5IHRoYXQgd2FzIHJldHVybmVkCisgKiB0byB0aGUgYXBwbGljYXRpb24uIEl0IG9ubHkgcmV0dXJucyBsaWJkYnVzLWludGVybmFsCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogWW91IE1VU1QgZnJlZSBhbGwgbWVtb3J5IGFuZCByZWxlYXNlIGFsbCByZWZlcmVuY2UgY291bnRzCisgKiByZXR1cm5lZCB0byB5b3UgYnkgbGliZGJ1cyBwcmlvciB0byBjYWxsaW5nIGRidXNfc2h1dGRvd24oKS4KKyAqCisgKiBZb3UgY2FuJ3QgY29udGludWUgdG8gdXNlIGFueSBELUJ1cyBvYmplY3RzLCBzdWNoIGFzIGNvbm5lY3Rpb25zLAorICogdGhhdCB3ZXJlIGFsbG9jYXRlZCBwcmlvciB0byBkYnVzX3NodXRkb3duKCkuIFlvdSBjYW4sIGhvd2V2ZXIsCisgKiBzdGFydCBvdmVyOyBjYWxsIGRidXNfdGhyZWFkc19pbml0KCkgYWdhaW4sIGNyZWF0ZSBuZXcgY29ubmVjdGlvbnMsCisgKiBhbmQgc28gZm9ydGguCisgKgorICogV0FSTklORzogZGJ1c19zaHV0ZG93bigpIGlzIE5PVCB0aHJlYWQgc2FmZSwgaXQgbXVzdCBiZSBjYWxsZWQKKyAqIHdoaWxlIE5PIG90aGVyIHRocmVhZHMgYXJlIHVzaW5nIEQtQnVzLiAoUmVtZW1iZXIsIHlvdSBoYXZlIHRvIGZyZWUKKyAqIGFsbCBELUJ1cyBvYmplY3RzIGFuZCBtZW1vcnkgYmVmb3JlIHlvdSBjYWxsIGRidXNfc2h1dGRvd24oKSwgc28gbm8KKyAqIHRocmVhZCBjYW4gYmUgdXNpbmcgbGliZGJ1cy4pCisgKgorICogVGhlIHB1cnBvc2Ugb2YgZGJ1c19zaHV0ZG93bigpIGlzIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBnZXQKKyAqIGNsZWFuIG91dHB1dCBmcm9tIG1lbW9yeSBsZWFrIGNoZWNrZXJzLiBkYnVzX3NodXRkb3duKCkgbWF5IGFsc28gYmUKKyAqIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBkbG9wZW4oKSBsaWJkYnVzIGluc3RlYWQgb2YgbGlua2luZyB0byBpdCwKKyAqIGFuZCB3YW50IHRvIGJlIGFibGUgdG8gdW5sb2FkIHRoZSBsaWJyYXJ5IGFnYWluLgorICoKKyAqIFRoZXJlIGlzIGFic29sdXRlbHkgbm8gcmVxdWlyZW1lbnQgdG8gY2FsbCBkYnVzX3NodXRkb3duKCkgLSBpbiBmYWN0LAorICogbW9zdCBhcHBsaWNhdGlvbnMgd29uJ3QgYm90aGVyIGFuZCBzaG91bGQgbm90IGZlZWwgZ3VpbHR5LgorICogCisgKiBZb3UgaGF2ZSB0byBrbm93IHRoYXQgbm9ib2R5IGlzIHVzaW5nIGxpYmRidXMgaW4geW91ciBhcHBsaWNhdGlvbidzCisgKiBwcm9jZXNzIGJlZm9yZSB5b3UgY2FuIGNhbGwgZGJ1c19zaHV0ZG93bigpLiBPbmUgaW1wbGljYXRpb24gb2YgdGhpcworICogaXMgdGhhdCBjYWxsaW5nIGRidXNfc2h1dGRvd24oKSBmcm9tIGEgbGlicmFyeSBpcyBhbG1vc3QgY2VydGFpbmx5CisgKiB3cm9uZywgc2luY2UgeW91IGRvbid0IGtub3cgd2hhdCB0aGUgcmVzdCBvZiB0aGUgYXBwIGlzIHVwIHRvLgorICogCisgKi8KK3ZvaWQKK2RidXNfc2h1dGRvd24gKHZvaWQpCit7CisgIHdoaWxlIChyZWdpc3RlcmVkX2dsb2JhbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBTaHV0ZG93bkNsb3N1cmUgKmM7CisKKyAgICAgIGMgPSByZWdpc3RlcmVkX2dsb2JhbHM7CisgICAgICByZWdpc3RlcmVkX2dsb2JhbHMgPSBjLT5uZXh0OworICAgICAgCisgICAgICAoKiBjLT5mdW5jKSAoYy0+ZGF0YSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoYyk7CisgICAgfQorCisgIF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiArPSAxOworfQorCisvKiogQH0gKi8gLyoqIEVuZCBvZiBwdWJsaWMgQVBJIGRvY3MgYmxvY2sgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworLyoqCisgKiBAaW5ncm91cCBEQnVzTWVtb3J5SW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNNZW1vcnkKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZW1vcnlfdGVzdCAodm9pZCkKK3sKKyAgZGJ1c19ib29sX3Qgb2xkX2d1YXJkczsKKyAgdm9pZCAqcDsKKyAgc2l6ZV90IHNpemU7CisKKyAgb2xkX2d1YXJkcyA9IGd1YXJkczsKKyAgZ3VhcmRzID0gVFJVRTsKKyAgcCA9IGRidXNfbWFsbG9jICg0KTsKKyAgaWYgKHAgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgZm9yIChzaXplID0gNDsgc2l6ZSA8IDI1Njsgc2l6ZSArPSA0KQorICAgIHsKKyAgICAgIHAgPSBkYnVzX3JlYWxsb2MgKHAsIHNpemUpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisgIGZvciAoc2l6ZSA9IDI1Njsgc2l6ZSAhPSAwOyBzaXplIC09IDQpCisgICAgeworICAgICAgcCA9IGRidXNfcmVhbGxvYyAocCwgc2l6ZSk7CisgICAgICBpZiAocCA9PSBOVUxMKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIH0KKyAgZGJ1c19mcmVlIChwKTsKKyAgZ3VhcmRzID0gb2xkX2d1YXJkczsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lbW9yeS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDU2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVtb3J5LmgKQEAgLTAsMCArMSw3MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lbW9yeS5oICBELUJ1cyBtZW1vcnkgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19NRU1PUllfSAorI2RlZmluZSBEQlVTX01FTU9SWV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5CisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitEQlVTX01BTExPQworREJVU19BTExPQ19TSVpFKDEpCit2b2lkKiBkYnVzX21hbGxvYyAgICAgICAgKHNpemVfdCBieXRlcyk7CisKK0RCVVNfRVhQT1JUCitEQlVTX01BTExPQworREJVU19BTExPQ19TSVpFKDEpCit2b2lkKiBkYnVzX21hbGxvYzAgICAgICAgKHNpemVfdCBieXRlcyk7CisKK0RCVVNfRVhQT1JUCitEQlVTX01BTExPQworREJVU19BTExPQ19TSVpFKDIpCit2b2lkKiBkYnVzX3JlYWxsb2MgICAgICAgKHZvaWQgICptZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcyk7CitEQlVTX0VYUE9SVAordm9pZCAgZGJ1c19mcmVlICAgICAgICAgICh2b2lkICAqbWVtb3J5KTsKKworI2RlZmluZSBkYnVzX25ldyh0eXBlLCBjb3VudCkgICgodHlwZSopZGJ1c19tYWxsb2MgKHNpemVvZiAodHlwZSkgKiAoY291bnQpKSkKKyNkZWZpbmUgZGJ1c19uZXcwKHR5cGUsIGNvdW50KSAoKHR5cGUqKWRidXNfbWFsbG9jMCAoc2l6ZW9mICh0eXBlKSAqIChjb3VudCkpKQorCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGFyICoqc3RyX2FycmF5KTsKKwordHlwZWRlZiB2b2lkICgqIERCdXNGcmVlRnVuY3Rpb24pICh2b2lkICptZW1vcnkpOworCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX3NodXRkb3duICh2b2lkKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVtcG9vbC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lbXBvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODA1ODZiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lbXBvb2wuYwpAQCAtMCwwICsxLDU3OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lbXBvb2wuaCBNZW1vcnkgcG9vbHMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1lbXBvb2wuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWVtUG9vbCBtZW1vcnkgcG9vbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c01lbVBvb2wgb2JqZWN0CisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNNZW1Qb29sLiAgQSBtZW1vcnkgcG9vbCBpcyB1c2VkCisgKiB0byBkZWNyZWFzZSBtZW1vcnkgZnJhZ21lbnRhdGlvbi9vdmVyaGVhZCBhbmQgaW5jcmVhc2Ugc3BlZWQgZm9yCisgKiBibG9ja3Mgb2Ygc21hbGwgdW5pZm9ybWx5LXNpemVkIG9iamVjdHMuIFRoZSBtYWluIHBvaW50IGlzIHRvIGF2b2lkCisgKiB0aGUgb3ZlcmhlYWQgb2YgYSBtYWxsb2MgYmxvY2sgZm9yIGVhY2ggc21hbGwgb2JqZWN0LCBzcGVlZCBpcworICogc2Vjb25kYXJ5LgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNZW1Qb29sSW50ZXJuYWxzIE1lbW9yeSBwb29sIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c01lbVBvb2wgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNNZW1Qb29sLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiB0eXBlZGVmIHNvIERCdXNGcmVlZEVsZW1lbnQgc3RydWN0IGNhbiByZWZlciB0byBpdHNlbGYuCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNGcmVlZEVsZW1lbnQgREJ1c0ZyZWVkRWxlbWVudDsKKworLyoqCisgKiBzdHJ1Y3QgcmVwcmVzZW50aW5nIGFuIGVsZW1lbnQgb24gdGhlIGZyZWUgbGlzdC4KKyAqIFdlIGp1c3QgY2FzdCBmcmVlZCBlbGVtZW50cyB0byB0aGlzIHNvIHdlIGNhbgorICogbWFrZSBhIGxpc3Qgb3V0IG9mIHRoZW0uCisgKi8KK3N0cnVjdCBEQnVzRnJlZWRFbGVtZW50Cit7CisgIERCdXNGcmVlZEVsZW1lbnQgKm5leHQ7IC8qKjwgbmV4dCBlbGVtZW50IG9mIHRoZSBmcmVlIGxpc3QgKi8KK307CisKKy8qKgorICogVGhlIGR1bW15IHNpemUgb2YgdGhlIHZhcmlhYmxlLWxlbmd0aCAiZWxlbWVudHMiCisgKiBmaWVsZCBpbiBEQnVzTWVtQmxvY2sKKyAqLworI2RlZmluZSBFTEVNRU5UX1BBRERJTkcgNAorCisvKioKKyAqIFR5cGVkZWYgZm9yIERCdXNNZW1CbG9jayBzbyB0aGUgc3RydWN0IGNhbiByZWN1cnNpdmVseQorICogcG9pbnQgdG8gaXRzZWxmLgorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVtQmxvY2sgREJ1c01lbUJsb2NrOworCisvKioKKyAqIERCdXNNZW1CbG9jayBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSBtYWxsb2MoKS1yZXR1cm5lZAorICogYmxvY2sgdGhhdCBnZXRzIGNodW5rZWQgdXAgaW50byBvYmplY3RzIGluIHRoZSBtZW1vcnkgcG9vbC4KKyAqLworc3RydWN0IERCdXNNZW1CbG9jaworeworICBEQnVzTWVtQmxvY2sgKm5leHQ7ICAvKio8IG5leHQgYmxvY2sgaW4gdGhlIGxpc3QsIHdoaWNoIGlzIGFscmVhZHkgdXNlZCB1cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICogICBvbmx5IHNhdmVkIHNvIHdlIGNhbiBmcmVlIGFsbCB0aGUgYmxvY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAqICAgd2hlbiB3ZSBmcmVlIHRoZSBtZW0gcG9vbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogdGhpcyBpcyBhIGxvbmcgc28gdGhhdCAiZWxlbWVudHMiIGlzIGFsaWduZWQgKi8KKyAgbG9uZyB1c2VkX3NvX2ZhcjsgICAgIC8qKjwgYnl0ZXMgb2YgdGhpcyBibG9jayBhbHJlYWR5IGFsbG9jYXRlZCBhcyBlbGVtZW50cy4gKi8KKyAgCisgIHVuc2lnbmVkIGNoYXIgZWxlbWVudHNbRUxFTUVOVF9QQURESU5HXTsgLyoqPCB0aGUgYmxvY2sgZGF0YSwgYWN0dWFsbHkgYWxsb2NhdGVkIHRvIHJlcXVpcmVkIHNpemUgKi8KK307CisKKy8qKgorICogSW50ZXJuYWxzIGZpZWxkcyBvZiBEQnVzTWVtUG9vbAorICovCitzdHJ1Y3QgREJ1c01lbVBvb2wKK3sKKyAgaW50IGVsZW1lbnRfc2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIGEgc2luZ2xlIG9iamVjdCBpbiB0aGUgcG9vbCAqLworICBpbnQgYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2sgKi8KKyAgdW5zaWduZWQgaW50IHplcm9fZWxlbWVudHMgOiAxOyAgLyoqPCB3aGV0aGVyIHRvIHplcm8taW5pdCBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKworICBEQnVzRnJlZWRFbGVtZW50ICpmcmVlX2VsZW1lbnRzOyAvKio8IGEgZnJlZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHJlY3ljbGUgKi8KKyAgREJ1c01lbUJsb2NrICpibG9ja3M7ICAgICAgICAgICAgLyoqPCBibG9ja3Mgb2YgbWVtb3J5IGZyb20gbWFsbG9jKCkgKi8KKyAgaW50IGFsbG9jYXRlZF9lbGVtZW50czsgICAgICAgICAgLyoqPCBDb3VudCBvZiBvdXRzdGFuZGluZyBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KK307CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZW1Qb29sCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNNZW1Qb29sCisgKgorICogT3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBtZW1vcnkgcG9vbC4gTWVtb3J5IHBvb2xzIGFsbG93CisgKiBhdm9pZGluZyBwZXItbWFsbG9jLWJsb2NrIG1lbW9yeSBvdmVyaGVhZCB3aGVuIGFsbG9jYXRpbmcgYSBsb3Qgb2YKKyAqIHNtYWxsIG9iamVjdHMgdGhhdCBhcmUgYWxsIHRoZSBzYW1lIHNpemUuIFRoZXkgYXJlIHNsaWdodGx5CisgKiBmYXN0ZXIgdGhhbiBjYWxsaW5nIG1hbGxvYygpIGFsc28uCisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1lbW9yeSBwb29sLCBvciByZXR1cm5zICNOVUxMIG9uIGZhaWx1cmUuICBPYmplY3RzIGluCisgKiB0aGUgcG9vbCBtdXN0IGJlIGF0IGxlYXN0IHNpemVvZih2b2lkKikgYnl0ZXMgZWFjaCwgZHVlIHRvIHRoZSB3YXkKKyAqIG1lbW9yeSBwb29scyB3b3JrLiBUbyBhdm9pZCBjcmVhdGluZyA2NCBiaXQgcHJvYmxlbXMsIHRoaXMgbWVhbnMgYXQKKyAqIGxlYXN0IDggYnl0ZXMgb24gYWxsIHBsYXRmb3JtcywgdW5sZXNzIHlvdSBhcmUgNCBieXRlcyBvbiAzMi1iaXQKKyAqIGFuZCA4IGJ5dGVzIG9uIDY0LWJpdC4KKyAqCisgKiBAcGFyYW0gZWxlbWVudF9zaXplIHNpemUgb2YgYW4gZWxlbWVudCBhbGxvY2F0ZWQgZnJvbSB0aGUgcG9vbC4KKyAqIEBwYXJhbSB6ZXJvX2VsZW1lbnRzIHdoZXRoZXIgdG8gemVyby1pbml0aWFsaXplIGVsZW1lbnRzCisgKiBAcmV0dXJucyB0aGUgbmV3IHBvb2wgb3IgI05VTEwKKyAqLworREJ1c01lbVBvb2wqCitfZGJ1c19tZW1fcG9vbF9uZXcgKGludCBlbGVtZW50X3NpemUsCisgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IHplcm9fZWxlbWVudHMpCit7CisgIERCdXNNZW1Qb29sICpwb29sOworCisgIHBvb2wgPSBkYnVzX25ldzAgKERCdXNNZW1Qb29sLCAxKTsKKyAgaWYgKHBvb2wgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBNYWtlIHRoZSBlbGVtZW50IHNpemUgYXQgbGVhc3QgOCBieXRlcy4gKi8KKyAgaWYgKGVsZW1lbnRfc2l6ZSA8IDgpCisgICAgZWxlbWVudF9zaXplID0gODsKKyAgCisgIC8qIHRoZXNlIGFzc2VydGlvbnMgYXJlIGVxdWl2YWxlbnQgYnV0IHRoZSBmaXJzdCBpcyBtb3JlIGNsZWFyCisgICAqIHRvIHByb2dyYW1tZXJzIHRoYXQgc2VlIGl0IGZhaWwuCisgICAqLworICBfZGJ1c19hc3NlcnQgKGVsZW1lbnRfc2l6ZSA+PSAoaW50KSBzaXplb2YgKHZvaWQqKSk7CisgIF9kYnVzX2Fzc2VydCAoZWxlbWVudF9zaXplID49IChpbnQpIHNpemVvZiAoREJ1c0ZyZWVkRWxlbWVudCkpOworCisgIC8qIGFsaWduIHRoZSBlbGVtZW50IHNpemUgdG8gYSBwb2ludGVyIGJvdW5kYXJ5IHNvIHdlIHdvbid0IGdldCBidXMKKyAgICogZXJyb3JzIHVuZGVyIG90aGVyIGFyY2hpdGVjdHVyZXMuICAKKyAgICovCisgIHBvb2wtPmVsZW1lbnRfc2l6ZSA9IF9EQlVTX0FMSUdOX1ZBTFVFIChlbGVtZW50X3NpemUsIHNpemVvZiAodm9pZCAqKSk7CisKKyAgcG9vbC0+emVyb19lbGVtZW50cyA9IHplcm9fZWxlbWVudHMgIT0gRkFMU0U7CisKKyAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID0gMDsKKyAgCisgIC8qIHBpY2sgYSBzaXplIGZvciB0aGUgZmlyc3QgYmxvY2s7IGl0IGluY3JlYXNlcworICAgKiBmb3IgZWFjaCBibG9jayB3ZSBuZWVkIHRvIGFsbG9jYXRlLiBUaGlzIGlzCisgICAqIGFjdHVhbGx5IGhhbGYgdGhlIGluaXRpYWwgYmxvY2sgc2l6ZQorICAgKiBzaW5jZSBfZGJ1c19tZW1fcG9vbF9hbGxvYygpIHVuY29uZGl0aW9uYWxseQorICAgKiBkb3VibGVzIGl0IHByaW9yIHRvIGNyZWF0aW5nIGEgbmV3IGJsb2NrLiAgKi8KKyAgcG9vbC0+YmxvY2tfc2l6ZSA9IHBvb2wtPmVsZW1lbnRfc2l6ZSAqIDg7CisKKyAgX2RidXNfYXNzZXJ0ICgocG9vbC0+YmxvY2tfc2l6ZSAlCisgICAgICAgICAgICAgICAgIHBvb2wtPmVsZW1lbnRfc2l6ZSkgPT0gMCk7CisgIAorICByZXR1cm4gcG9vbDsKK30KKworLyoqCisgKiBGcmVlcyBhIG1lbW9yeSBwb29sIChhbmQgYWxsIGVsZW1lbnRzIGFsbG9jYXRlZCBmcm9tIGl0KS4KKyAqCisgKiBAcGFyYW0gcG9vbCB0aGUgbWVtb3J5IHBvb2wuCisgKi8KK3ZvaWQKK19kYnVzX21lbV9wb29sX2ZyZWUgKERCdXNNZW1Qb29sICpwb29sKQoreworICBEQnVzTWVtQmxvY2sgKmJsb2NrOworCisgIGJsb2NrID0gcG9vbC0+YmxvY2tzOworICB3aGlsZSAoYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVtQmxvY2sgKm5leHQgPSBibG9jay0+bmV4dDsKKworICAgICAgZGJ1c19mcmVlIChibG9jayk7CisKKyAgICAgIGJsb2NrID0gbmV4dDsKKyAgICB9CisKKyAgZGJ1c19mcmVlIChwb29sKTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gb2JqZWN0IGZyb20gdGhlIG1lbW9yeSBwb29sLgorICogVGhlIG9iamVjdCBtdXN0IGJlIGZyZWVkIHdpdGggX2RidXNfbWVtX3Bvb2xfZGVhbGxvYygpLgorICoKKyAqIEBwYXJhbSBwb29sIHRoZSBtZW1vcnkgcG9vbAorICogQHJldHVybnMgdGhlIGFsbG9jYXRlZCBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCit2b2lkKgorX2RidXNfbWVtX3Bvb2xfYWxsb2MgKERCdXNNZW1Qb29sICpwb29sKQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKF9kYnVzX2Rpc2FibGVfbWVtX3Bvb2xzICgpKQorICAgIHsKKyAgICAgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgICAgICBpbnQgYWxsb2Nfc2l6ZTsKKyAgICAgIAorICAgICAgLyogVGhpcyBpcyBvYnZpb3VzbHkgcmVhbGx5IHNpbGx5LCBidXQgaXQncworICAgICAgICogZGVidWctbW9kZS1vbmx5IGNvZGUgdGhhdCBpcyBjb21waWxlZCBvdXQKKyAgICAgICAqIHdoZW4gdGVzdHMgYXJlIGRpc2FibGVkIChfZGJ1c19kaXNhYmxlX21lbV9wb29scygpCisgICAgICAgKiBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24gRkFMU0Ugc28gdGhpcyBibG9jaworICAgICAgICogc2hvdWxkIHZhbmlzaCkKKyAgICAgICAqLworICAgICAgCisgICAgICBhbGxvY19zaXplID0gc2l6ZW9mIChEQnVzTWVtQmxvY2spIC0gRUxFTUVOVF9QQURESU5HICsKKyAgICAgICAgcG9vbC0+ZWxlbWVudF9zaXplOworICAgICAgCisgICAgICBpZiAocG9vbC0+emVyb19lbGVtZW50cykKKyAgICAgICAgYmxvY2sgPSBkYnVzX21hbGxvYzAgKGFsbG9jX3NpemUpOworICAgICAgZWxzZQorICAgICAgICBibG9jayA9IGRidXNfbWFsbG9jIChhbGxvY19zaXplKTsKKworICAgICAgaWYgKGJsb2NrICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBibG9jay0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICAgICAgICBwb29sLT5ibG9ja3MgPSBibG9jazsKKyAgICAgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgKz0gMTsKKworICAgICAgICAgIHJldHVybiAodm9pZCopICZibG9jay0+ZWxlbWVudHNbMF07CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgRkFJTElORyBtZW1wb29sIGFsbG9jXG4iKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocG9vbC0+ZnJlZV9lbGVtZW50cykKKyAgICAgICAgeworICAgICAgICAgIERCdXNGcmVlZEVsZW1lbnQgKmVsZW1lbnQgPSBwb29sLT5mcmVlX2VsZW1lbnRzOworCisgICAgICAgICAgcG9vbC0+ZnJlZV9lbGVtZW50cyA9IHBvb2wtPmZyZWVfZWxlbWVudHMtPm5leHQ7CisKKyAgICAgICAgICBpZiAocG9vbC0+emVyb19lbGVtZW50cykKKyAgICAgICAgICAgIG1lbXNldCAoZWxlbWVudCwgJ1wwJywgcG9vbC0+ZWxlbWVudF9zaXplKTsKKworICAgICAgICAgIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyArPSAxOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB2b2lkICplbGVtZW50OworICAgICAgCisgICAgICAgICAgaWYgKHBvb2wtPmJsb2NrcyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIHBvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXIgPT0gcG9vbC0+YmxvY2tfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTmVlZCBhIG5ldyBibG9jayAqLworICAgICAgICAgICAgICBEQnVzTWVtQmxvY2sgKmJsb2NrOworICAgICAgICAgICAgICBpbnQgYWxsb2Nfc2l6ZTsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICAgICAgICAgIGludCBzYXZlZF9jb3VudGVyOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChwb29sLT5ibG9ja19zaXplIDw9IF9EQlVTX0lOVF9NQVggLyA0KSAvKiBhdm9pZCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIHVzZSBhIGxhcmdlciBibG9jayBzaXplIGZvciBvdXIgbmV4dCBibG9jayAqLworICAgICAgICAgICAgICAgICAgcG9vbC0+YmxvY2tfc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0ICgocG9vbC0+YmxvY2tfc2l6ZSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLT5lbGVtZW50X3NpemUpID09IDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhbGxvY19zaXplID0gc2l6ZW9mIChEQnVzTWVtQmxvY2spIC0gRUxFTUVOVF9QQURESU5HICsgcG9vbC0+YmxvY2tfc2l6ZTsKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgICAgICAgICAgLyogV2Ugc2F2ZS9yZXN0b3JlIHRoZSBjb3VudGVyLCBzbyB0aGF0IG1lbW9yeSBwb29scyB3b24ndAorICAgICAgICAgICAgICAgKiBjYXVzZSBhIGdpdmVuIGZ1bmN0aW9uIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZgorICAgICAgICAgICAgICAgKiBhbGxvY2F0aW9ucyBvbiBkaWZmZXJlbnQgaW52b2NhdGlvbnMuIGkuZS4gIHdoZW4gdGVzdGluZworICAgICAgICAgICAgICAgKiB3ZSB3YW50IGNvbnNpc3RlbnQgYWxsb2MgcGF0dGVybnMuIFNvIHdlIHNraXAgb3VyCisgICAgICAgICAgICAgICAqIG1hbGxvYyBoZXJlIGZvciBwdXJwb3NlcyBvZiBmYWlsZWQgYWxsb2Mgc2ltdWxhdGlvbi4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIHNhdmVkX2NvdW50ZXIgPSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICgpOworICAgICAgICAgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyIChfREJVU19JTlRfTUFYKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAocG9vbC0+emVyb19lbGVtZW50cykKKyAgICAgICAgICAgICAgICBibG9jayA9IGRidXNfbWFsbG9jMCAoYWxsb2Nfc2l6ZSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBibG9jayA9IGRidXNfbWFsbG9jIChhbGxvY19zaXplKTsKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgICAgICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoc2F2ZWRfY291bnRlcik7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2F2ZWRfY291bnRlciA9PSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICgpKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoYmxvY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgICBibG9jay0+dXNlZF9zb19mYXIgPSAwOworICAgICAgICAgICAgICBibG9jay0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICAgICAgICAgICAgcG9vbC0+YmxvY2tzID0gYmxvY2s7ICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgZWxlbWVudCA9ICZwb29sLT5ibG9ja3MtPmVsZW1lbnRzW3Bvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXJdOworICAgICAgICAgIAorICAgICAgICAgIHBvb2wtPmJsb2Nrcy0+dXNlZF9zb19mYXIgKz0gcG9vbC0+ZWxlbWVudF9zaXplOworCisgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzICs9IDE7CisgICAgICAgICAgCisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYW4gb2JqZWN0IHByZXZpb3VzbHkgY3JlYXRlZCB3aXRoCisgKiBfZGJ1c19tZW1fcG9vbF9hbGxvYygpLiBUaGUgcHJldmlvdXMgb2JqZWN0CisgKiBtdXN0IGhhdmUgY29tZSBmcm9tIHRoaXMgc2FtZSBwb29sLgorICogQHBhcmFtIHBvb2wgdGhlIG1lbW9yeSBwb29sCisgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBlYXJsaWVyIGFsbG9jYXRlZC4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgYWxsb2NhdGVkIGVsZW1lbnRzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChEQnVzTWVtUG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICplbGVtZW50KQoreworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKF9kYnVzX2Rpc2FibGVfbWVtX3Bvb2xzICgpKQorICAgIHsKKyAgICAgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgICAgICBEQnVzTWVtQmxvY2sgKnByZXY7CisKKyAgICAgIC8qIG1tbSwgZmFzdC4gOy0pIGRlYnVnLW9ubHkgY29kZSwgc28gZG9lc24ndCBtYXR0ZXIuICovCisgICAgICAKKyAgICAgIHByZXYgPSBOVUxMOworICAgICAgYmxvY2sgPSBwb29sLT5ibG9ja3M7CisKKyAgICAgIHdoaWxlIChibG9jayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJsb2NrLT5lbGVtZW50cyA9PSAodW5zaWduZWQgY2hhciopIGVsZW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBibG9jay0+bmV4dDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBvb2wtPmJsb2NrcyA9IGJsb2NrLT5uZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChibG9jayk7CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgPiAwKTsKKyAgICAgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzIC09IDE7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAocG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID09IDApCisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChwb29sLT5ibG9ja3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICByZXR1cm4gcG9vbC0+YmxvY2tzID09IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgcHJldiA9IGJsb2NrOworICAgICAgICAgIGJsb2NrID0gYmxvY2stPm5leHQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZnJlZWQgbm9uZXhpc3RlbnQgYmxvY2siKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIERCdXNGcmVlZEVsZW1lbnQgKmZyZWVkOworICAgICAgCisgICAgICBmcmVlZCA9IGVsZW1lbnQ7CisgICAgICBmcmVlZC0+bmV4dCA9IHBvb2wtPmZyZWVfZWxlbWVudHM7CisgICAgICBwb29sLT5mcmVlX2VsZW1lbnRzID0gZnJlZWQ7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID4gMCk7CisgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgLT0gMTsKKyAgICAgIAorICAgICAgcmV0dXJuIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA9PSAwOworICAgIH0KK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0YXRpYyB2b2lkCit0aW1lX2Zvcl9zaXplIChpbnQgc2l6ZSkKK3sKKyAgaW50IGk7CisgIGludCBqOworICBjbG9ja190IHN0YXJ0OworICBjbG9ja190IGVuZDsKKyNkZWZpbmUgRlJFRV9BUlJBWV9TSVpFIDUxMgorI2RlZmluZSBOX0lURVJBVElPTlMgRlJFRV9BUlJBWV9TSVpFICogNTEyCisgIHZvaWQgKnRvX2ZyZWVbRlJFRV9BUlJBWV9TSVpFXTsKKyAgREJ1c01lbVBvb2wgKnBvb2w7CisKKyAgX2RidXNfdmVyYm9zZSAoIlRpbWluZ3MgZm9yIHNpemUgJWRcbiIsIHNpemUpOworICAKKyAgX2RidXNfdmVyYm9zZSAoIiBtYWxsb2NcbiIpOworICAKKyAgc3RhcnQgPSBjbG9jayAoKTsKKyAgCisgIGkgPSAwOworICBqID0gMDsKKyAgd2hpbGUgKGkgPCBOX0lURVJBVElPTlMpCisgICAgeworICAgICAgdG9fZnJlZVtqXSA9IGRidXNfbWFsbG9jIChzaXplKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodG9fZnJlZVtqXSAhPSBOVUxMKTsgLyogaW4gYSByZWFsIGFwcCBvZiBjb3Vyc2UgdGhpcyBpcyB3cm9uZyAqLworCisgICAgICArK2o7CisKKyAgICAgIGlmIChqID09IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGogPSAwOworICAgICAgICAgIHdoaWxlIChqIDwgRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHRvX2ZyZWVbal0pOworICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGVuZCA9IGNsb2NrICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIGNyZWF0ZWQvZGVzdHJveWVkICVkIGVsZW1lbnRzIGluICVnIHNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgIE5fSVRFUkFUSU9OUywgKGVuZCAtIHN0YXJ0KSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDKTsKKworCisKKyAgX2RidXNfdmVyYm9zZSAoIiBtZW1wb29sc1xuIik7CisgIAorICBzdGFydCA9IGNsb2NrICgpOworCisgIHBvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemUsIEZBTFNFKTsKKyAgCisgIGkgPSAwOworICBqID0gMDsKKyAgd2hpbGUgKGkgPCBOX0lURVJBVElPTlMpCisgICAgeworICAgICAgdG9fZnJlZVtqXSA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChwb29sKTsgCisgICAgICBfZGJ1c19hc3NlcnQgKHRvX2ZyZWVbal0gIT0gTlVMTCk7ICAvKiBpbiBhIHJlYWwgYXBwIG9mIGNvdXJzZSB0aGlzIGlzIHdyb25nICovCisKKyAgICAgICsrajsKKworICAgICAgaWYgKGogPT0gRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKGogPCBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHBvb2wsIHRvX2ZyZWVbal0pOworICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHBvb2wpOworICAKKyAgZW5kID0gY2xvY2sgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRlZC9kZXN0cm95ZWQgJWQgZWxlbWVudHMgaW4gJWcgc2Vjb25kc1xuIiwKKyAgICAgICAgICAgICAgICAgTl9JVEVSQVRJT05TLCAoZW5kIC0gc3RhcnQpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgemVyb2VkIG1hbGxvY1xuIik7CisgICAgCisgIHN0YXJ0ID0gY2xvY2sgKCk7CisgIAorICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBkYnVzX21hbGxvYzAgKHNpemUpOworICAgICAgX2RidXNfYXNzZXJ0ICh0b19mcmVlW2pdICE9IE5VTEwpOyAvKiBpbiBhIHJlYWwgYXBwIG9mIGNvdXJzZSB0aGlzIGlzIHdyb25nICovCisKKyAgICAgICsrajsKKworICAgICAgaWYgKGogPT0gRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKGogPCBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAodG9fZnJlZVtqXSk7CisgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgZW5kID0gY2xvY2sgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRlZC9kZXN0cm95ZWQgJWQgZWxlbWVudHMgaW4gJWcgc2Vjb25kc1xuIiwKKyAgICAgICAgICAgICAgICAgTl9JVEVSQVRJT05TLCAoZW5kIC0gc3RhcnQpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUMpOworICAKKyAgX2RidXNfdmVyYm9zZSAoIiB6ZXJvZWQgbWVtcG9vbHNcbiIpOworICAKKyAgc3RhcnQgPSBjbG9jayAoKTsKKworICBwb29sID0gX2RidXNfbWVtX3Bvb2xfbmV3IChzaXplLCBUUlVFKTsKKyAgCisgIGkgPSAwOworICBqID0gMDsKKyAgd2hpbGUgKGkgPCBOX0lURVJBVElPTlMpCisgICAgeworICAgICAgdG9fZnJlZVtqXSA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChwb29sKTsgCisgICAgICBfZGJ1c19hc3NlcnQgKHRvX2ZyZWVbal0gIT0gTlVMTCk7ICAvKiBpbiBhIHJlYWwgYXBwIG9mIGNvdXJzZSB0aGlzIGlzIHdyb25nICovCisKKyAgICAgICsrajsKKworICAgICAgaWYgKGogPT0gRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKGogPCBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHBvb2wsIHRvX2ZyZWVbal0pOworICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHBvb2wpOworICAKKyAgZW5kID0gY2xvY2sgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRlZC9kZXN0cm95ZWQgJWQgZWxlbWVudHMgaW4gJWcgc2Vjb25kc1xuIiwKKyAgICAgICAgICAgICAgICAgTl9JVEVSQVRJT05TLCAoZW5kIC0gc3RhcnQpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUMpOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNNZW1Qb29sSW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNNZW1Qb29sCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVtX3Bvb2xfdGVzdCAodm9pZCkKK3sKKyAgaW50IGk7CisgIGludCBlbGVtZW50X3NpemVzW10gPSB7IDQsIDgsIDE2LCA1MCwgMTI0IH07CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChlbGVtZW50X3NpemVzKSkKKyAgICB7CisgICAgICB0aW1lX2Zvcl9zaXplIChlbGVtZW50X3NpemVzW2ldKTsKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tZW1wb29sLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVtcG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTUyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVtcG9vbC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZW1wb29sLmggTWVtb3J5IHBvb2xzCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTUVNUE9PTF9ICisjZGVmaW5lIERCVVNfTUVNUE9PTF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNNZW1Qb29sIERCdXNNZW1Qb29sOworCitEQnVzTWVtUG9vbCogX2RidXNfbWVtX3Bvb2xfbmV3ICAgICAoaW50ICAgICAgICAgIGVsZW1lbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgemVyb19lbGVtZW50cyk7Cit2b2lkICAgICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAgICAoREJ1c01lbVBvb2wgKnBvb2wpOwordm9pZCogICAgICAgIF9kYnVzX21lbV9wb29sX2FsbG9jICAgKERCdXNNZW1Qb29sICpwb29sKTsKK2RidXNfYm9vbF90ICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChEQnVzTWVtUG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZWxlbWVudCk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FTVBPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2Y4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMKQEAgLTAsMCArMSwxMjk0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS1mYWN0b3J5LmMgR2VuZXJhdG9yIG9mIHZhbGlkIGFuZCBpbnZhbGlkIG1lc3NhZ2UgZGF0YSBmb3IgdGVzdCBzdWl0ZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBDSEFOR0VfVFlQRV9BREpVU1QsCisgICAgQ0hBTkdFX1RZUEVfQUJTT0xVVEUKKyAgfSBDaGFuZ2VUeXBlOworCisjZGVmaW5lIEJZVEVfT1JERVJfT0ZGU0VUICAwCisjZGVmaW5lIFRZUEVfT0ZGU0VUICAgICAgICAxCisjZGVmaW5lIEJPRFlfTEVOR1RIX09GRlNFVCA0CisjZGVmaW5lIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUIDEyCisKK3N0YXRpYyB2b2lkCitpdGVyX3JlY3Vyc2UgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGl0ZXItPmRlcHRoICs9IDE7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPCBfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkcpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF0gPj0gMCk7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfZ2V0X3NlcXVlbmNlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBfZGJ1c19hc3NlcnQgKGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF0gPj0gMCk7CisgIHJldHVybiBpdGVyLT5zZXF1ZW5jZV9ub3NbaXRlci0+ZGVwdGhdOworfQorCitzdGF0aWMgdm9pZAoraXRlcl9zZXRfc2VxdWVuY2UgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2VxdWVuY2UpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VxdWVuY2UgPj0gMCk7CisgIGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF0gPSBzZXF1ZW5jZTsKK30KKworc3RhdGljIHZvaWQKK2l0ZXJfdW5yZWN1cnNlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBpdGVyLT5kZXB0aCAtPSAxOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID49IDApOworfQorCitzdGF0aWMgdm9pZAoraXRlcl9uZXh0IChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBpdGVyLT5zZXF1ZW5jZV9ub3NbaXRlci0+ZGVwdGhdICs9IDE7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXRlcl9maXJzdF9pbl9zZXJpZXMgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGludCBpOworCisgIGkgPSBpdGVyLT5kZXB0aDsKKyAgd2hpbGUgKGkgPCBfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkcpCisgICAgeworICAgICAgaWYgKGl0ZXItPnNlcXVlbmNlX25vc1tpXSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICArK2k7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzSW5uZXJHZW5lcmF0b3JGdW5jKSAgIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKiptZXNzYWdlX3ApOwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzTWVzc2FnZUdlbmVyYXRvckZ1bmMpIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSk7CisKK3N0YXRpYyB2b2lkCitzZXRfcmVwbHlfc2VyaWFsIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwgMTAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV90cml2aWFsX2lubmVyIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICoqbWVzc2FnZV9wKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBzd2l0Y2ggKGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9mb28vYmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRvY3VtZW50RmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pOworICAgICAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vL2JhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuRG9jdW1lbnRGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9lcnJvcl9uYW1lIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdEVycm9yTmFtZSIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgeworICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkcgPSAiVGhpcyBpcyBhbiBlcnJvciI7CisgICAgICAgIAorICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgKm1lc3NhZ2VfcCA9IG1lc3NhZ2U7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9tYW55X2JvZGllc19pbm5lciAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKiptZXNzYWdlX3ApCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBib2R5OworCisgIC8qIEtlZXBpbmcgdGhpcyBzbWFsbCBtYWtlcyB0aGluZ3MgZ28gZmFzdGVyICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgiby56LkYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm8uei5CIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYWgiKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBzZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2lnbmF0dXJlKSB8fCAhX2RidXNfc3RyaW5nX2luaXQgKCZib2R5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgCisgIGlmIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2VuZXJhdGVfYm9kaWVzIChpdGVyX2dldF9zZXF1ZW5jZSAoaXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZSwgJmJvZHkpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnZfU0lHTkFUVVJFOworCisgICAgICB2X1NJR05BVFVSRSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnNpZ25hdHVyZSk7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU0lHTkFUVVJFKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZib2R5LCAwLCAmbWVzc2FnZS0+Ym9keSwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSwgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5ieXRlX29yZGVyKTsKKyAgICAgIAorICAgICAgKm1lc3NhZ2VfcCA9IG1lc3NhZ2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICptZXNzYWdlX3AgPSBOVUxMOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2lnbmF0dXJlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZib2R5KTsKKworICByZXR1cm4gKm1lc3NhZ2VfcCAhPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAqbWVzc2FnZSkKK3sKKyAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIDEpOworICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgCisgIC8qIG1vdmUgZm9yIGVmZmljaWVuY3ksIHNpbmNlIHdlJ2xsIG51a2UgdGhlIG1lc3NhZ2UgYW55d2F5ICovCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJm1lc3NhZ2UtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfb3V0ZXIgKERCdXNNZXNzYWdlRGF0YUl0ZXIgICAqaXRlciwKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICBEQnVzSW5uZXJHZW5lcmF0b3JGdW5jIGZ1bmMpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIG1lc3NhZ2UgPSBOVUxMOworICBpZiAoISgqZnVuYykoaXRlciwgJm1lc3NhZ2UpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdGVyX25leHQgKGl0ZXIpOworICAKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworCisgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfdHJpdmlhbCAoREJ1c01lc3NhZ2VEYXRhSXRlciAgICppdGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgcmV0dXJuIGdlbmVyYXRlX291dGVyIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV90cml2aWFsX2lubmVyKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9tYW55X2JvZGllcyAoREJ1c01lc3NhZ2VEYXRhSXRlciAgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICByZXR1cm4gZ2VuZXJhdGVfb3V0ZXIgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX21hbnlfYm9kaWVzX2lubmVyKTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorc2ltcGxlX21ldGhvZF9jYWxsICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgLyogS2VlcGluZyB0aGlzIHNtYWxsIG1ha2VzIHN0dWZmIGdvIGZhc3RlciAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm8uYi5RIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZi9iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvLmIuWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJvIik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitzaW1wbGVfc2lnbmFsICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2YvYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm8uYi5aIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJvIik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitzaW1wbGVfbWV0aG9kX3JldHVybiAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIG1lc3NhZ2UgPSAgZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgIAorICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorc2ltcGxlX2Vycm9yICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgbWVzc2FnZSA9ICBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsICJmb28uYmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIAorICBzZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKyAgCisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCittZXNzYWdlX3dpdGhfbmVzdGluZ19sZXZlbHMgKGludCBsZXZlbHMpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKyAgREJ1c01lc3NhZ2VJdGVyICpwYXJlbnRzOworICBEQnVzTWVzc2FnZUl0ZXIgKmNoaWxkcmVuOworICBpbnQgaTsKKworICAvKiBJZiBsZXZlbHMgaXMgaGlnaGVyIGl0IGJyZWFrcyBzaWdfcmVmY291bnQgaW4gREJ1c01lc3NhZ2VSZWFsSXRlcgorICAgKiBpbiBkYnVzLW1lc3NhZ2UuYywgdGhpcyBhc3NlcnQgaXMganVzdCB0byBoZWxwIHlvdSBrbm93IHlvdSBuZWVkCisgICAqIHRvIGZpeCB0aGF0IGlmIHlvdSBoaXQgaXQKKyAgICovCisgIF9kYnVzX2Fzc2VydCAobGV2ZWxzIDwgMjU2KTsKKworICBwYXJlbnRzID0gZGJ1c19uZXcoREJ1c01lc3NhZ2VJdGVyLCBsZXZlbHMgKyAxKTsKKyAgY2hpbGRyZW4gPSBkYnVzX25ldyhEQnVzTWVzc2FnZUl0ZXIsIGxldmVscyArIDEpOworCisgIHZfSU5UMzIgPSA0MjsKKyAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICBpID0gMDsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZwYXJlbnRzW2ldKTsKKyAgd2hpbGUgKGkgPCBsZXZlbHMpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZwYXJlbnRzW2ldLCBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09IChsZXZlbHMgLSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZHJlbltpXSk7CisgICAgICArK2k7CisgICAgICBwYXJlbnRzW2ldID0gY2hpbGRyZW5baS0xXTsKKyAgICB9CisgIC0taTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmY2hpbGRyZW5baV0sIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIpOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJnBhcmVudHNbaV0sICZjaGlsZHJlbltpXSk7CisgICAgICAtLWk7CisgICAgfQorCisgIGRidXNfZnJlZShwYXJlbnRzKTsKKyAgZGJ1c19mcmVlKGNoaWxkcmVuKTsKKworICByZXR1cm4gbWVzc2FnZTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9zcGVjaWFsIChEQnVzTWVzc2FnZURhdGFJdGVyICAgKml0ZXIsCisgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgaXRlbV9zZXE7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBpbnQgcG9zOworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA9PSAwKTsKKyAgCisgIG1lc3NhZ2UgPSBOVUxMOworICBwb3MgPSAtMTsKKyAgdl9JTlQzMiA9IDQyOworICBpdGVtX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKworICBpZiAoaXRlbV9zZXEgPT0gMCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAvKiBzZXQgYW4gaW52YWxpZCB0eXBlY29kZSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCAnJCcpOworCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDEpCisgICAgeworICAgICAgY2hhciBsb25nX3NpZ1tEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgrMl07CisgICAgICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IChEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEggKyAxKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0FSUkFZOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5WQUxJRDsKKworICAgICAgdl9TVFJJTkcgPSBsb25nX3NpZzsKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0FSUkFZX1JFQ1VSU0lPTjsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDIpCisgICAgeworICAgICAgY2hhciBsb25nX3NpZ1tEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgqMis0XTsKKyAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDw9IChEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEggKyAxKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUjsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5UMzI7CisgICAgICArK2k7CisKKyAgICAgIHdoaWxlIChpIDwgKERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCoyICsgMykpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfU1RSVUNUX0VORF9DSEFSOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICAgIAorICAgICAgdl9TVFJJTkcgPSBsb25nX3NpZzsKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX1NUUlVDVF9SRUNVUlNJT047CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAzKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gNCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA1KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUik7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDIsIERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gNikKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgVFlQRV9PRkZTRVQsIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX01FU1NBR0VfVFlQRTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDcpCisgICAgeworICAgICAgLyogTWVzc2FnZXMgb2YgdW5rbm93biB0eXBlIGFyZSBjb25zaWRlcmVkIHZhbGlkICovCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgVFlQRV9PRkZTRVQsIDEwMCk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA4KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChkYXRhLCBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCAvIDIgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5ieXRlX29yZGVyKTsKKyAgICAgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoZGF0YSwgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCAvIDIgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5ieXRlX29yZGVyKTsKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9NRVNTQUdFX1RPT19MT05HOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gOSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICp2X1NUUklORyA9ICJub3QgYSB2YWxpZCBidXMgbmFtZSI7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworCisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfQkFEX1NFTkRFUjsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDEwKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0xPQ0FMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfVVNFU19MT0NBTF9JTlRFUkZBQ0U7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxMSkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgREJVU19QQVRIX0xPQ0FMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfVVNFU19MT0NBTF9QQVRIOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTIpCisgICAgeworICAgICAgLyogTWV0aG9kIGNhbGxzIGRvbid0IGhhdmUgdG8gaGF2ZSBpbnRlcmZhY2UgKi8KKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxMykKKyAgICB7CisgICAgICAvKiBTaWduYWxzIHJlcXVpcmUgYW4gaW50ZXJmYWNlICovCisgICAgICBtZXNzYWdlID0gc2ltcGxlX3NpZ25hbCAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX01JU1NJTkdfSU5URVJGQUNFOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTQpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfcmV0dXJuICgpOworCisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9kZWxldGVfZmllbGQgKCZtZXNzYWdlLT5oZWFkZXIsIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX01JU1NJTkdfUkVQTFlfU0VSSUFMOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTUpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9lcnJvciAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UsIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9NSVNTSU5HX0VSUk9SX05BTUU7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxNikKKyAgICB7CisgICAgICBjaGFyIGxvbmdfc2lnW0RCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCo0KzEwXTsKKyAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICAgICAgaW50IGk7CisgICAgICBpbnQgbl9iZWdpbnM7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDw9IChEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgqMyArIDMpKQorICAgICAgICB7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfQVJSQVk7CisgICAgICAgICAgKytpOworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVI7CisgICAgICAgICAgKytpOworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVDMyOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgbl9iZWdpbnMgPSBpIC8gMzsKKworICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5UMzI7CisgICAgICArK2k7CisgICAgICAKKyAgICAgIHdoaWxlIChuX2JlZ2lucyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUjsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgbl9iZWdpbnMgLT0gMTsKKyAgICAgICAgfQorICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICAgIAorICAgICAgdl9TVFJJTkcgPSBsb25nX3NpZzsKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0RJQ1RfRU5UUllfUkVDVVJTSU9OOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTcpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCBEQlVTX1RZUEVfQVJSQVkpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAyLCBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX1NUQVJURURfQlVUX05PVF9FTkRFRDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDE4KQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwb3MpOworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfRU5ERURfQlVUX05PVF9TVEFSVEVEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTkpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCBEQlVTX1RZUEVfQVJSQVkpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAyLCBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUik7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDMsIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFM7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAyMCkKKyAgICB7CisgICAgICAvKiA2NCBsZXZlbHMgb2YgbmVzdGluZyBpcyBPSyAqLworICAgICAgbWVzc2FnZSA9IG1lc3NhZ2Vfd2l0aF9uZXN0aW5nX2xldmVscyg2NCk7CisKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMjEpCisgICAgeworICAgICAgLyogNjUgbGV2ZWxzIG9mIG5lc3RpbmcgaXMgbm90IE9LICovCisgICAgICBtZXNzYWdlID0gbWVzc2FnZV93aXRoX25lc3RpbmdfbGV2ZWxzKDY1KTsKKworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9ORVNURURfVE9PX0RFRVBMWTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaXRlcl9uZXh0IChpdGVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfd3JvbmdfbGVuZ3RoIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGxlbmd0aHNbXSA9IHsgLTQyLCAtMTcsIC0xNiwgLTE1LCAtOSwgLTgsIC03LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLAorICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxNSwgMTYsIDMwIH07CisgIGludCBhZGp1c3Q7CisgIGludCBsZW5fc2VxOworCisgcmVzdGFydDoKKyAgbGVuX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgaWYgKGxlbl9zZXEgPT0gX0RCVVNfTl9FTEVNRU5UUyAobGVuZ3RocykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAobGVuX3NlcSA8IF9EQlVTX05fRUxFTUVOVFMgKGxlbmd0aHMpKTsKKyAgCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIGlmICghZ2VuZXJhdGVfbWFueV9ib2RpZXMgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICB7CisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7IC8qIHJlc2V0IHRvIGZpcnN0IGJvZHkgKi8KKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIGl0ZXJfbmV4dCAoaXRlcik7ICAgICAgICAgICAgLyogbmV4dCBsZW5ndGggYWRqdXN0bWVudCAqLworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworCisgIGFkanVzdCA9IGxlbmd0aHNbbGVuX3NlcV07CisKKyAgaWYgKGFkanVzdCA8IDApCisgICAgeworICAgICAgaWYgKChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgKyBhZGp1c3QpIDwgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKQorICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGF0YSwgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKGRhdGEsIC0gYWRqdXN0KTsKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9GT1JfVU5LTk9XTl9SRUFTT047CisgICAgfQorICBlbHNlCisgICAgeyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGRhdGEsIGFkanVzdCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1RPT19NVUNIX0RBVEE7CisgICAgfQorCisgIC8qIEZpeHVwIGxlbmd0aHMgKi8KKyAgeworICAgIGludCBvbGRfYm9keV9sZW47CisgICAgaW50IG5ld19ib2R5X2xlbjsKKyAgICBpbnQgYnl0ZV9vcmRlcjsKKyAgICAKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA+PSBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpOworICAgIAorICAgIGJ5dGVfb3JkZXIgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRhdGEsIEJZVEVfT1JERVJfT0ZGU0VUKTsKKyAgICBvbGRfYm9keV9sZW4gPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIF9kYnVzX2Fzc2VydCAob2xkX2JvZHlfbGVuIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKyAgICBuZXdfYm9keV9sZW4gPSBvbGRfYm9keV9sZW4gKyBhZGp1c3Q7CisgICAgaWYgKG5ld19ib2R5X2xlbiA8IDApCisgICAgICB7CisgICAgICAgIG5ld19ib2R5X2xlbiA9IDA7CisgICAgICAgIC8qIHdlIGp1c3QgbXVuZ2VkIHRoZSBoZWFkZXIsIGFuZCBhcmVuJ3Qgc3VyZSBob3cgKi8KKyAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRElUWV9VTktOT1dOOworICAgICAgfQorCisgICAgX2RidXNfdmVyYm9zZSAoImNoYW5naW5nIGJvZHkgbGVuIGZyb20gJXUgdG8gJXUgYnkgYWRqdXN0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIG9sZF9ib2R5X2xlbiwgbmV3X2JvZHlfbGVuLCBhZGp1c3QpOworICAgIAorICAgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoZGF0YSwgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2JvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcik7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9ieXRlX2NoYW5nZWQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgYnl0ZV9zZXE7CisgIGludCB2X0JZVEU7CisKKyAgLyogVGhpcyBpcyBhIGxpdHRsZSBjb252b2x1dGVkIHRvIG1ha2UgdGhlIGJvZGllcyB0aGUKKyAgICogb3V0ZXIgbG9vcCBhbmQgZWFjaCBieXRlIG9mIGVhY2ggYm9keSB0aGUgaW5uZXIKKyAgICogbG9vcAorICAgKi8KKworIHJlc3RhcnQ6CisgIGlmICghZ2VuZXJhdGVfbWFueV9ib2RpZXMgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgYnl0ZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgCisgIGlmIChieXRlX3NlcSA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRhdGEsIDApOworICAgICAgLyogcmVzZXQgYnl0ZSBjb3VudCAqLworICAgICAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsKKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBVbmRvIHRoZSAibmV4dCIgaW4gZ2VuZXJhdGVfbWFueV9ib2RpZXMgKi8KKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcikgLSAxKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX3NlcSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSk7CisgIHZfQllURSA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgYnl0ZV9zZXEpOworICB2X0JZVEUgKz0gYnl0ZV9zZXE7IC8qIGFyYml0cmFyeSBidXQgZGV0ZXJtaW5pc3RpYyBjaGFuZ2UgdG8gdGhlIGJ5dGUgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBieXRlX3NlcSwgdl9CWVRFKTsKKyAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRElUWV9VTktOT1dOOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbmRfbmV4dF90eXBlY29kZSAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGludCBib2R5X3NlcTsKKyAgaW50IGJ5dGVfc2VxOworICBpbnQgYmFzZV9kZXB0aDsKKworICBiYXNlX2RlcHRoID0gaXRlci0+ZGVwdGg7CisKKyByZXN0YXJ0OgorICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGF0YSwgMCk7CisKKyAgYm9keV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIAorICBpZiAoIWdlbmVyYXRlX21hbnlfYm9kaWVzIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiBVbmRvIHRoZSAibmV4dCIgaW4gZ2VuZXJhdGVfbWFueV9ib2RpZXMgKi8KKyAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIGJvZHlfc2VxKTsKKyAgCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIHdoaWxlIChUUlVFKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgICAgICAKKyAgICAgIGJ5dGVfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSk7CisgICAgICAKKyAgICAgIGlmIChieXRlX3NlcSA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiByZXNldCBieXRlIGNvdW50ICovCisgICAgICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOworICAgICAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICAgICAgICAgIGl0ZXJfbmV4dCAoaXRlcik7IC8qIGdvIHRvIHRoZSBuZXh0IGJvZHkgKi8KKyAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChieXRlX3NlcSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSk7CisKKyAgICAgIGlmIChfZGJ1c190eXBlX2lzX3ZhbGlkIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRhdGEsIGJ5dGVfc2VxKSkpCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZQorICAgICAgICBpdGVyX25leHQgKGl0ZXIpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxID09IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSk7CisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworCisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgdHlwZWNvZGVzW10gPSB7CisgIERCVVNfVFlQRV9JTlZBTElELAorICBEQlVTX1RZUEVfQllURSwKKyAgREJVU19UWVBFX0JPT0xFQU4sCisgIERCVVNfVFlQRV9JTlQxNiwKKyAgREJVU19UWVBFX1VJTlQxNiwKKyAgREJVU19UWVBFX0lOVDMyLAorICBEQlVTX1RZUEVfVUlOVDMyLAorICBEQlVTX1RZUEVfSU5UNjQsCisgIERCVVNfVFlQRV9VSU5UNjQsCisgIERCVVNfVFlQRV9ET1VCTEUsCisgIERCVVNfVFlQRV9TVFJJTkcsCisgIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwKKyAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgREJVU19UWVBFX0FSUkFZLAorICBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiwKKyAgREJVU19TVFJVQ1RfRU5EX0NIQVIsCisgIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSLAorICBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIsCisgIERCVVNfVFlQRV9VTklYX0ZELAorICAyNTUgLyogcmFuZG9tIGludmFsaWQgdHlwZWNvZGUgKi8KK307CisgIAorc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV90eXBlY29kZV9jaGFuZ2VkIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgYnl0ZV9zZXE7CisgIGludCB0eXBlY29kZV9zZXE7CisgIGludCBiYXNlX2RlcHRoOworCisgIGJhc2VfZGVwdGggPSBpdGVyLT5kZXB0aDsKKworIHJlc3RhcnQ6CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCAwKTsKKyAgCisgIGlmICghZmluZF9uZXh0X3R5cGVjb2RlIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIGJ5dGVfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworICAKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgdHlwZWNvZGVfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworCisgIF9kYnVzX2Fzc2VydCAodHlwZWNvZGVfc2VxIDw9IF9EQlVTX05fRUxFTUVOVFMgKHR5cGVjb2RlcykpOworICAKKyAgaWYgKHR5cGVjb2RlX3NlcSA9PSBfREJVU19OX0VMRU1FTlRTICh0eXBlY29kZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAyKSk7CisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7IC8qIHJlc2V0IHR5cGVjb2RlIHNlcXVlbmNlICovCisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMSkpOworICAgICAgaXRlcl9uZXh0IChpdGVyKTsgLyogZ28gdG8gdGhlIG5leHQgYnl0ZV9zZXEgKi8KKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAyKSk7CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworCisjaWYgMAorICBwcmludGYgKCJDaGFuZ2luZyBieXRlICVkIGluIG1lc3NhZ2UgJWQgdG8gJWNcbiIsCisgICAgICAgICAgYnl0ZV9zZXEsIGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSwgdHlwZWNvZGVzW3R5cGVjb2RlX3NlcV0pOworI2VuZGlmCisgIAorICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIGJ5dGVfc2VxLCB0eXBlY29kZXNbdHlwZWNvZGVfc2VxXSk7CisgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTjsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoYW5nZVR5cGUgdHlwZTsKKyAgZGJ1c191aW50MzJfdCB2YWx1ZTsgLyogY2FzdCB0byBzaWduZWQgZm9yIGFkanVzdHMgKi8KK30gVUludENoYW5nZTsKKworc3RhdGljIGNvbnN0IFVJbnRDaGFuZ2UgdWludDMyX2NoYW5nZXNbXSA9IHsKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAtMSB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIC0yIH0sCisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgLTMgfSwKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAxIH0sCisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgMiB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIDMgfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgX0RCVVNfVUlOVDMyX01BWCB9LAorICB7IENIQU5HRV9UWVBFX0FCU09MVVRFLCAwIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIDEgfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgX0RCVVNfVUlOVDMyX01BWCAtIDEgfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgX0RCVVNfVUlOVDMyX01BWCAtIDUgfQorfTsKKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV91aW50MzJfY2hhbmdlZCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgYm9keV9zZXE7CisgIGludCBieXRlX3NlcTsKKyAgaW50IGNoYW5nZV9zZXE7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIGludCBieXRlX29yZGVyOworICBjb25zdCBVSW50Q2hhbmdlICpjaGFuZ2U7CisgIGludCBiYXNlX2RlcHRoOworCisgIC8qIE91dGVyIGxvb3AgaXMgZWFjaCBib2R5LCBuZXh0IGxvb3AgaXMgZWFjaCBjaGFuZ2UsCisgICAqIGlubmVyIGxvb3AgaXMgZWFjaCBjaGFuZ2UgbG9jYXRpb24KKyAgICovCisKKyAgYmFzZV9kZXB0aCA9IGl0ZXItPmRlcHRoOworICAKKyBuZXh0X2JvZHk6CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCAwKTsKKyAgYm9keV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIAorICBpZiAoIWdlbmVyYXRlX21hbnlfYm9kaWVzIChpdGVyLCBkYXRhLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisKKyAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIGJvZHlfc2VxKTsgLyogdW5kbyB0aGUgIm5leHQiIGZyb20gZ2VuZXJhdGVfbWFueV9ib2RpZXMgKi8KKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyBuZXh0X2NoYW5nZToKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgY2hhbmdlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgCisgIGlmIChjaGFuZ2Vfc2VxID09IF9EQlVTX05fRUxFTUVOVFMgKHVpbnQzMl9jaGFuZ2VzKSkKKyAgICB7CisgICAgICAvKiBSZXNldCBjaGFuZ2UgY291bnQgKi8KKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsKKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIGl0ZXJfbmV4dCAoaXRlcik7CisgICAgICBnb3RvIG5leHRfYm9keTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAyKSk7CisgIGJ5dGVfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICAvKiBza2lwIDQgYnl0ZXMgYXQgYSB0aW1lICovCisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChieXRlX3NlcSwgNCkgPT0gKHVuc2lnbmVkKSBieXRlX3NlcSk7CisgIGlmIChieXRlX3NlcSA+PSAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpIC0gNCkpCisgICAgeworICAgICAgLyogcmVzZXQgYnl0ZSBjb3VudCAqLworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgICAgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMikpOworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgICAgIGl0ZXJfbmV4dCAoaXRlcik7CisgICAgICBnb3RvIG5leHRfY2hhbmdlOworICAgIH0KKyAgCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPD0gKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSAtIDQpKTsKKworICBieXRlX29yZGVyID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBCWVRFX09SREVSX09GRlNFVCk7CisgIAorICB2X1VJTlQzMiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKGRhdGEsIGJ5dGVfc2VxLCBieXRlX29yZGVyLCBOVUxMKTsKKworICBjaGFuZ2UgPSAmdWludDMyX2NoYW5nZXNbY2hhbmdlX3NlcV07CisKKyAgaWYgKGNoYW5nZS0+dHlwZSA9PSBDSEFOR0VfVFlQRV9BREpVU1QpCisgICAgeworICAgICAgdl9VSU5UMzIgKz0gKGludCkgY2hhbmdlLT52YWx1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2X1VJTlQzMiA9IGNoYW5nZS0+dmFsdWU7CisgICAgfQorCisjaWYgMAorICBwcmludGYgKCJib2R5ICVkIGNoYW5nZSAlZCBwb3MgJWQgIiwKKyAgICAgICAgICBib2R5X3NlcSwgY2hhbmdlX3NlcSwgYnl0ZV9zZXEpOworCisgIGlmIChjaGFuZ2UtPnR5cGUgPT0gQ0hBTkdFX1RZUEVfQURKVVNUKQorICAgIHByaW50ZiAoImFkanVzdCBieSAlZCIsIChpbnQpIGNoYW5nZS0+dmFsdWUpOworICBlbHNlCisgICAgcHJpbnRmICgic2V0IHRvICV1IiwgY2hhbmdlLT52YWx1ZSk7CisgIAorICBwcmludGYgKCIgXHQldSAtPiAldVxuIiwKKyAgICAgICAgICBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChkYXRhLCBieXRlX3NlcSwgYnl0ZV9vcmRlciwgTlVMTCksCisgICAgICAgICAgdl9VSU5UMzIpOworI2VuZGlmCisgIAorICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKGRhdGEsIGJ5dGVfc2VxLCB2X1VJTlQzMiwgYnl0ZV9vcmRlcik7CisgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTjsKKworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMSkpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgICAgICAgICAgCisgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBEQnVzTWVzc2FnZUdlbmVyYXRvckZ1bmMgZnVuYzsgIAorfSBEQnVzTWVzc2FnZUdlbmVyYXRvcjsKKworc3RhdGljIGNvbnN0IERCdXNNZXNzYWdlR2VuZXJhdG9yIGdlbmVyYXRvcnNbXSA9IHsKKyAgeyAidHJpdmlhbCBleGFtcGxlIG9mIGVhY2ggbWVzc2FnZSB0eXBlIiwgZ2VuZXJhdGVfdHJpdmlhbCB9LAorICB7ICJhc3NvcnRlZCBhcmd1bWVudHMiLCBnZW5lcmF0ZV9tYW55X2JvZGllcyB9LAorICB7ICJhc3NvcnRlZCBzcGVjaWFsIGNhc2VzIiwgZ2VuZXJhdGVfc3BlY2lhbCB9LAorICB7ICJlYWNoIHVpbnQzMiBtb2RpZmllZCIsIGdlbmVyYXRlX3VpbnQzMl9jaGFuZ2VkIH0sCisgIHsgIndyb25nIGJvZHkgbGVuZ3RocyIsIGdlbmVyYXRlX3dyb25nX2xlbmd0aCB9LAorICB7ICJlYWNoIGJ5dGUgbW9kaWZpZWQiLCBnZW5lcmF0ZV9ieXRlX2NoYW5nZWQgfSwKKyNpZiAwCisgIC8qIFRoaXMgaXMgcmVhbGx5IGV4cGVuc2l2ZSBhbmQgZG9lc24ndCBhZGQgdG9vIG11Y2ggY292ZXJhZ2UgKi8KKyAgeyAiY2hhbmdlIGVhY2ggdHlwZWNvZGUiLCBnZW5lcmF0ZV90eXBlY29kZV9jaGFuZ2VkIH0KKyNlbmRpZgorfTsKKwordm9pZAorX2RidXNfbWVzc2FnZV9kYXRhX2ZyZWUgKERCdXNNZXNzYWdlRGF0YSAqZGF0YSkKK3sKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhLT5kYXRhKTsKK30KKwordm9pZAorX2RidXNfbWVzc2FnZV9kYXRhX2l0ZXJfaW5pdCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlcikKK3sKKyAgaW50IGk7CisgIAorICBpdGVyLT5kZXB0aCA9IDA7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX01FU1NBR0VfREFUQV9NQVhfTkVTVElORykKKyAgICB7CisgICAgICBpdGVyLT5zZXF1ZW5jZV9ub3NbaV0gPSAwOworICAgICAgKytpOworICAgIH0KKyAgaXRlci0+Y291bnQgPSAwOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9kYXRhX2l0ZXJfZ2V0X2FuZF9uZXh0IChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZURhdGEgICAgICpkYXRhKQoreworICBEQnVzTWVzc2FnZUdlbmVyYXRvckZ1bmMgZnVuYzsKKyAgaW50IGdlbmVyYXRvcjsKKworIHJlc3RhcnQ6CisgIGdlbmVyYXRvciA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgCisgIGlmIChnZW5lcmF0b3IgPT0gX0RCVVNfTl9FTEVNRU5UUyAoZ2VuZXJhdG9ycykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgIAorICBpZiAoaXRlcl9maXJzdF9pbl9zZXJpZXMgKGl0ZXIpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiB0ZXN0aW5nIG1lc3NhZ2UgbG9hZGluZzogJXMgIiwgZ2VuZXJhdG9yc1tnZW5lcmF0b3JdLm5hbWUpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KKyAgCisgIGZ1bmMgPSBnZW5lcmF0b3JzW2dlbmVyYXRvcl0uZnVuYzsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGF0YS0+ZGF0YSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgIAorICBpZiAoKCpmdW5jKShpdGVyLCAmZGF0YS0+ZGF0YSwgJmRhdGEtPmV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICA7CisgIGVsc2UKKyAgICB7CisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7CisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOyAvKiBuZXh0IGdlbmVyYXRvciAqLworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhLT5kYXRhKTsKKyAgICAgIHByaW50ZiAoIiVkIHRlc3QgbG9hZHMgY3VtdWxhdGl2ZVxuIiwgaXRlci0+Y291bnQpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworCisgIGl0ZXItPmNvdW50ICs9IDE7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzQ3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmgKQEAgLTAsMCArMSw2MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIEdlbmVyYXRvciBvZiB2YWxpZCBhbmQgaW52YWxpZCBtZXNzYWdlIGRhdGEgZm9yIHRlc3Qgc3VpdGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NRVNTQUdFX0ZBQ1RPUllfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfRkFDVE9SWV9ICisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNWYWxpZGl0eSBleHBlY3RlZF92YWxpZGl0eTsKKyAgCisgIERCdXNTdHJpbmcgZGF0YTsKKworfSBEQnVzTWVzc2FnZURhdGE7CisKKyNkZWZpbmUgX0RCVVNfTUVTU0FHRV9EQVRBX01BWF9ORVNUSU5HIDEwCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgc2VxdWVuY2Vfbm9zW19EQlVTX01FU1NBR0VfREFUQV9NQVhfTkVTVElOR107CisgIGludCBkZXB0aDsKKyAgaW50IGNvdW50OworfSBEQnVzTWVzc2FnZURhdGFJdGVyOworCit2b2lkICAgICAgICBfZGJ1c19tZXNzYWdlX2RhdGFfZnJlZSAgICAgICAgICAgICAgKERCdXNNZXNzYWdlRGF0YSAgICAgKmRhdGEpOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9kYXRhX2l0ZXJfaW5pdCAgICAgICAgIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKTsKK2RidXNfYm9vbF90IF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2dldF9hbmRfbmV4dCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VEYXRhICAgICAqZGF0YSk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworI2VuZGlmIC8qIERCVVNfTUVTU0FHRV9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDkzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLWludGVybmFsLmggREJ1c01lc3NhZ2Ugb2JqZWN0IGludGVybmFsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX01FU1NBR0VfSU5URVJOQUxfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1yZXNvdXJjZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNNZXNzYWdlTG9hZGVyIERCdXNNZXNzYWdlTG9hZGVyOworCit2b2lkIF9kYnVzX21lc3NhZ2VfZ2V0X25ldHdvcmtfZGF0YSAgKERCdXNNZXNzYWdlICAgICAgICptZXNzYWdlLAorCQkJCSAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipoZWFkZXIsCisJCQkJICAgICAgY29uc3QgREJ1c1N0cmluZyAqKmJvZHkpOwordm9pZCBfZGJ1c19tZXNzYWdlX2dldF91bml4X2ZkcyAgICAgIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbl9mZHMpOworCit2b2lkICAgICAgICBfZGJ1c19tZXNzYWdlX2xvY2sgICAgICAgICAgICAgICAgICAoREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKK3ZvaWQgICAgICAgIF9kYnVzX21lc3NhZ2VfdW5sb2NrICAgICAgICAgICAgICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgX2RidXNfbWVzc2FnZV9hZGRfY291bnRlciAgICAgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIpOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9hZGRfY291bnRlcl9saW5rICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKmxpbmspOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9yZW1vdmVfY291bnRlciAgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgKipsaW5rX3JldHVybik7CisKK0RCdXNNZXNzYWdlTG9hZGVyKiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgICAgICAgICAgICAgICAgICAgKHZvaWQpOworREJ1c01lc3NhZ2VMb2FkZXIqIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JlZiAgICAgICAgICAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmICAgICAgICAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworCit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAgICAgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICoqYnVmZmVyKTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQpOworCitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzICAgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgICAgICAgICptYXhfbl9mZHMpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2ZkcyAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICAgICAgbl9mZHMpOworCitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CitEQnVzTWVzc2FnZSogICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcGVla19tZXNzYWdlICAgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CitEQnVzTWVzc2FnZSogICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgICAgICAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CitEQnVzTGlzdCogICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2VfbGluayAgICAgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcHV0YmFja19tZXNzYWdlX2xpbmsgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgICAqbGluayk7CisKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCdXNWYWxpZGl0eSAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfY29ycnVwdGlvbl9yZWFzb24gKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKKwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9tYXhfbWVzc2FnZV9zaXplICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgIHNpemUpOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9tYXhfbWVzc2FnZV9zaXplICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworCit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgIG4pOworbG9uZyAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyhEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FU1NBR0VfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTNiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS1wcml2YXRlLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCBoZWFkZXIgc2hhcmVkIGJldHdlZW4gZGJ1cy1tZXNzYWdlLmMgYW5kIGRidXMtbWVzc2FnZS11dGlsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX01FU1NBR0VfUFJJVkFURV9ICisjZGVmaW5lIERCVVNfTUVTU0FHRV9QUklWQVRFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWRhdGFzbG90Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVzc2FnZUludGVybmFscworICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNNZXNzYWdlTG9hZGVyCisgKgorICogVGhlIERCdXNNZXNzYWdlTG9hZGVyIG9iamVjdCBlbmNhcHN1bGF0ZXMgdGhlIHByb2Nlc3Mgb2YgY29udmVydGluZworICogYSBieXRlIHN0cmVhbSBpbnRvIGEgc2VyaWVzIG9mIERCdXNNZXNzYWdlLiBJdCBidWZmZXJzIHRoZSBpbmNvbWluZworICogYnl0ZXMgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUsIGFuZCBnZW5lcmF0ZXMgYSBxdWV1ZSBvZgorICogbWVzc2FnZXMuIERCdXNNZXNzYWdlTG9hZGVyIGlzIHR5cGljYWxseSB1c2VkIGFzIHBhcnQgb2YgYQorICogREJ1c1RyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbi4gVGhlIERCdXNUcmFuc3BvcnQgdGhlbiBoYW5kcyBvZmYKKyAqIHRoZSBsb2FkZWQgbWVzc2FnZXMgdG8gYSBEQnVzQ29ubmVjdGlvbiwgbWFraW5nIHRoZSBtZXNzYWdlcworICogdmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24uCisgKgorICogQHRvZG8gd3JpdGUgdGVzdHMgZm9yIGJyZWFrLWxvYWRlciB0aGF0IGEpIHJhbmRvbWx5IGRlbGV0ZSBoZWFkZXIKKyAqIGZpZWxkcyBhbmQgYikgc2V0IHN0cmluZyBmaWVsZHMgdG8gemVyby1sZW5ndGggYW5kIG90aGVyIGZ1bmt5CisgKiB2YWx1ZXMuCisgKgorICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzTWVzc2FnZUxvYWRlci4KKyAqIEFsbCBtZW1iZXJzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c01lc3NhZ2VMb2FkZXIKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQuICovCisKKyAgREJ1c1N0cmluZyBkYXRhOyAgICAgLyoqPCBCdWZmZXJlZCBkYXRhICovCisKKyAgREJ1c0xpc3QgKm1lc3NhZ2VzOyAgLyoqPCBDb21wbGV0ZSBtZXNzYWdlcy4gKi8KKworICBsb25nIG1heF9tZXNzYWdlX3NpemU7IC8qKjwgTWF4aW11bSBzaXplIG9mIGEgbWVzc2FnZSAqLworICBsb25nIG1heF9tZXNzYWdlX3VuaXhfZmRzOyAvKio8IE1heGltdW0gdW5peCBmZHMgaW4gYSBtZXNzYWdlICovCisKKyAgREJ1c1ZhbGlkaXR5IGNvcnJ1cHRpb25fcmVhc29uOyAvKio8IHdoeSB3ZSB3ZXJlIGNvcnJ1cHRlZCAqLworCisgIHVuc2lnbmVkIGludCBjb3JydXB0ZWQgOiAxOyAvKio8IFdlIGdvdCBicm9rZW4gZGF0YSwgYW5kIGFyZSBubyBsb25nZXIgd29ya2luZyAqLworCisgIHVuc2lnbmVkIGludCBidWZmZXJfb3V0c3RhbmRpbmcgOiAxOyAvKio8IFNvbWVvbmUgaXMgdXNpbmcgdGhlIGJ1ZmZlciB0byByZWFkICovCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICB1bnNpZ25lZCBpbnQgdW5peF9mZHNfb3V0c3RhbmRpbmcgOiAxOyAvKio8IFNvbWVvbmUgaXMgdXNpbmcgdGhlIHVuaXggZmQgYXJyYXkgdG8gcmVhZCAqLworCisgIGludCAqdW5peF9mZHM7IC8qKjwgRmlsZSBkZXNjcmlwdG9ycyB0aGF0IGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBidXQgbm90IHlldCBiZWVuIGhhbmRlZCB0byBhbnkgbWVzc2FnZS4gQXJyYXkgd2lsbCBiZSBhbGxvY2F0ZWQgYXQgZmlyc3QgdXNlLiAqLworICB1bnNpZ25lZCBuX3VuaXhfZmRzX2FsbG9jYXRlZDsgLyoqPCBOdW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGlzIGFycmF5IGhhcyBzcGFjZSBmb3IgKi8KKyAgdW5zaWduZWQgbl91bml4X2ZkczsgLyoqPCBOdW1iZXIgb2YgdmFsaWQgZmlsZSBkZXNjcmlwdG9ycyBpbiBhcnJheSAqLworI2VuZGlmCit9OworCisKKy8qKiBIb3cgbWFueSBiaXRzIGFyZSBpbiB0aGUgY2hhbmdlZF9zdGFtcCB1c2VkIHRvIHZhbGlkYXRlIGl0ZXJhdG9ycyAqLworI2RlZmluZSBDSEFOR0VEX1NUQU1QX0JJVFMgMjEKKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNNZXNzYWdlCisgKgorICogT2JqZWN0IHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBvciB0byBiZSBzZW50IHRvCisgKiBhbm90aGVyIGFwcGxpY2F0aW9uLiBUaGlzIGlzIGFuIG9wYXF1ZSBvYmplY3QsIGFsbCBtZW1iZXJzCisgKiBhcmUgcHJpdmF0ZS4KKyAqLworc3RydWN0IERCdXNNZXNzYWdlCit7CisgIERCdXNBdG9taWMgcmVmY291bnQ7IC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisKKyAgREJ1c0hlYWRlciBoZWFkZXI7IC8qKjwgSGVhZGVyIG5ldHdvcmsgZGF0YSBhbmQgYXNzb2NpYXRlZCBjYWNoZSAqLworCisgIERCdXNTdHJpbmcgYm9keTsgICAvKio8IEJvZHkgbmV0d29yayBkYXRhLiAqLworCisgIGNoYXIgYnl0ZV9vcmRlcjsgLyoqPCBNZXNzYWdlIGJ5dGUgb3JkZXIuICovCisKKyAgdW5zaWduZWQgaW50IGxvY2tlZCA6IDE7IC8qKjwgTWVzc2FnZSBiZWluZyBzZW50LCBubyBtb2RpZmljYXRpb25zIGFsbG93ZWQuICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICB1bnNpZ25lZCBpbnQgaW5fY2FjaGUgOiAxOyAvKio8IEhhcyBiZWVuICJmcmVlZCIgc2luY2UgaXQncyBpbiB0aGUgY2FjaGUgKHRoaXMgaXMgYSBkZWJ1ZyBmZWF0dXJlKSAqLworI2VuZGlmCisKKyAgREJ1c0xpc3QgKmNvdW50ZXJzOyAgIC8qKjwgMC1OIERCdXNDb3VudGVyIHVzZWQgdG8gdHJhY2sgbWVzc2FnZSBzaXplL3VuaXggZmRzLiAqLworICBsb25nIHNpemVfY291bnRlcl9kZWx0YTsgICAvKio8IFNpemUgd2UgaW5jcmVtZW50ZWQgdGhlIHNpemUgY291bnRlcnMgYnkuICAgKi8KKworICBkYnVzX3VpbnQzMl90IGNoYW5nZWRfc3RhbXAgOiBDSEFOR0VEX1NUQU1QX0JJVFM7IC8qKjwgSW5jcmVtZW50ZWQgd2hlbiBpdGVyYXRvcnMgYXJlIGludmFsaWRhdGVkLiAqLworCisgIERCdXNEYXRhU2xvdExpc3Qgc2xvdF9saXN0OyAgIC8qKjwgRGF0YSBzdG9yZWQgYnkgYWxsb2NhdGVkIGludGVnZXIgSUQgKi8KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGludCBnZW5lcmF0aW9uOyAvKio8IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiB3aGVuIG1lc3NhZ2Ugd2FzIGNyZWF0ZWQgKi8KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgaW50ICp1bml4X2ZkczsKKyAgLyoqPCBVbml4IGZpbGUgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZS4gVGhlc2UgYXJlCisgICAgIGNsb3NlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlc3Ryb3llZCwgaGVuY2UgbWFrZSBzdXJlIHRvIGR1cCgpCisgICAgIHRoZW0gd2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgdGhlbSBoZXJlLiAqLworICB1bnNpZ25lZCBuX3VuaXhfZmRzOyAvKio8IE51bWJlciBvZiB2YWxpZCBmZHMgaW4gdGhlIGFycmF5ICovCisgIHVuc2lnbmVkIG5fdW5peF9mZHNfYWxsb2NhdGVkOyAvKio8IEFsbG9jYXRlZCBzaXplIG9mIHRoZSBhcnJheSAqLworCisgIGxvbmcgdW5peF9mZF9jb3VudGVyX2RlbHRhOyAvKio8IFNpemUgd2UgaW5jcmVtZW50ZWQgdGhlIHVuaXggZmQgY291bnRlciBieSAqLworI2VuZGlmCit9OworCitkYnVzX2Jvb2xfdCBfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpOworCit0eXBlZGVmIHN0cnVjdCBEQnVzSW5pdGlhbEZEcyBEQnVzSW5pdGlhbEZEczsKK0RCdXNJbml0aWFsRkRzICpfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICh2b2lkKTsKK3ZvaWQgICAgICAgICAgICBfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChEQnVzSW5pdGlhbEZEcyAqZmRzKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FU1NBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjg4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS11dGlsLmMKQEAgLTAsMCArMSwxNTQ1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy1tZXNzYWdlLmMsIGJ1dCBvbmx5IHVzZWQgYnkgYnVzL3Rlc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1wcml2YXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKy8qIE5lY2Vzc2FyeSBmb3IgdGhlIExpbnV4LXNwZWNpZmljIGZkIGxlYWsgY2hlY2tpbmcgY29kZSBvbmx5ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZXNzYWdlCisgKiBAeworICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIFJlYWRzIGFyZ3VtZW50cyBmcm9tIGEgbWVzc2FnZSBpdGVyYXRvciBnaXZlbiBhIHZhcmlhYmxlIGFyZ3VtZW50CisgKiBsaXN0LiBPbmx5IGFyZ3VtZW50cyBvZiBiYXNpYyB0eXBlIGFuZCBhcnJheXMgb2YgZml4ZWQtbGVuZ3RoCisgKiBiYXNpYyB0eXBlIG1heSBiZSByZWFkIHdpdGggdGhpcyBmdW5jdGlvbi4gU2VlCisgKiBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MoKSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0aGUgZmlyc3QgYXJndW1lbnQgdHlwZQorICogQHBhcmFtIC4uLiBsb2NhdGlvbiBmb3IgZmlyc3QgYXJndW1lbnQgdmFsdWUsIHRoZW4gbGlzdCBvZiB0eXBlLWxvY2F0aW9uIHBhaXJzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIHdhcyBzZXQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorCQkJICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCSAgICAuLi4pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgdmFfbGlzdCB2YXJfYXJnczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGl0ZXIgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGZpcnN0X2FyZ190eXBlKTsKKyAgcmV0dmFsID0gX2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCAoaXRlciwgZXJyb3IsIGZpcnN0X2FyZ190eXBlLCB2YXJfYXJncyk7CisgIHZhX2VuZCAodmFyX2FyZ3MpOworCisgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBpbnQgdmFsaWRpdGllc19zZWVuW0RCVVNfVkFMSURJVFlfTEFTVCArIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UXTsKKworc3RhdGljIHZvaWQKK3Jlc2V0X3ZhbGlkaXRpZXNfc2VlbiAodm9pZCkKK3sKKyAgaW50IGk7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkaXRpZXNfc2VlbikpCisgICAgeworICAgICAgdmFsaWRpdGllc19zZWVuW2ldID0gMDsKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfdmFsaWRpdHlfc2VlbiAoREJ1c1ZhbGlkaXR5IHZhbGlkaXR5KQoreworICB2YWxpZGl0aWVzX3NlZW5bdmFsaWRpdHkgKyBfREJVU19ORUdBVElWRV9WQUxJRElUWV9DT1VOVF0gKz0gMTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3ZhbGlkaXRpZXNfc2VlbiAoZGJ1c19ib29sX3Qgbm90X3NlZW4pCit7CisgIGludCBpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTICh2YWxpZGl0aWVzX3NlZW4pKQorICAgIHsKKyAgICAgIGlmICgoaSAtIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UKSA9PSBEQlVTX1ZBTElESVRZX1VOS05PV04gfHwKKyAgICAgICAgICAoaSAtIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UKSA9PSBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OKQorICAgICAgICA7CisgICAgICBlbHNlIGlmICgobm90X3NlZW4gJiYgdmFsaWRpdGllc19zZWVuW2ldID09IDApIHx8CisgICAgICAgICAgICAgICAoIW5vdF9zZWVuICYmIHZhbGlkaXRpZXNfc2VlbltpXSA+IDApKQorICAgICAgICBwcmludGYgKCJ2YWxpZGl0eSAlM2Qgc2VlbiAlZCB0aW1lc1xuIiwKKyAgICAgICAgICAgICAgICBpIC0gX0RCVVNfTkVHQVRJVkVfVkFMSURJVFlfQ09VTlQsCisgICAgICAgICAgICAgICAgdmFsaWRpdGllc19zZWVuW2ldKTsKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAodm9pZCkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCksIF9fRklMRV9fKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm1lbWxlYWtzIik7CisgICAgfQorfQorCisjaWZkZWYgX19saW51eF9fCitzdHJ1Y3QgREJ1c0luaXRpYWxGRHMgeworICAgIGZkX3NldCBzZXQ7Cit9OworI2VuZGlmCisKK0RCdXNJbml0aWFsRkRzICoKK19kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKHZvaWQpCit7CisjaWZkZWYgX19saW51eF9fCisgIERJUiAqZDsKKyAgREJ1c0luaXRpYWxGRHMgKmZkczsKKworICAvKiB0aGlzIGlzIHBsYWluIG1hbGxvYyBzbyBpdCB3b24ndCBpbnRlcmZlcmUgd2l0aCBsZWFrIGNoZWNraW5nICovCisgIGZkcyA9IG1hbGxvYyAoc2l6ZW9mIChEQnVzSW5pdGlhbEZEcykpOworICBfZGJ1c19hc3NlcnQgKGZkcyAhPSBOVUxMKTsKKworICAvKiBUaGlzIHdvcmtzIG9uIExpbnV4IG9ubHkgKi8KKworICBpZiAoKGQgPSBvcGVuZGlyICgiL3Byb2Mvc2VsZi9mZCIpKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgZGlyZW50ICpkZTsKKworICAgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKQorICAgICAgICB7CisgICAgICAgICAgbG9uZyBsOworICAgICAgICAgIGNoYXIgKmUgPSBOVUxMOworICAgICAgICAgIGludCBmZDsKKworICAgICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgIGwgPSBzdHJ0b2wgKGRlLT5kX25hbWUsICZlLCAxMCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChlcnJubyA9PSAwICYmIGUgJiYgISplKTsKKworICAgICAgICAgIGZkID0gKGludCkgbDsKKworICAgICAgICAgIGlmIChmZCA8IDMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGlmIChmZCA9PSBkaXJmZCAoZCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIEZEX1NFVCAoZmQsICZmZHMtPnNldCk7CisgICAgICAgIH0KKworICAgICAgY2xvc2VkaXIgKGQpOworICAgIH0KKworICByZXR1cm4gZmRzOworI2Vsc2UKKyAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKwordm9pZAorX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoREJ1c0luaXRpYWxGRHMgKmZkcykKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgRElSICpkOworCisgIC8qIFRoaXMgd29ya3Mgb24gTGludXggb25seSAqLworCisgIGlmICgoZCA9IG9wZW5kaXIgKCIvcHJvYy9zZWxmL2ZkIikpKQorICAgIHsKKyAgICAgIHN0cnVjdCBkaXJlbnQgKmRlOworCisgICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgY2hhciAqZSA9IE5VTEw7CisgICAgICAgICAgaW50IGZkOworCisgICAgICAgICAgaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgbCA9IHN0cnRvbCAoZGUtPmRfbmFtZSwgJmUsIDEwKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGVycm5vID09IDAgJiYgZSAmJiAhKmUpOworCisgICAgICAgICAgZmQgPSAoaW50KSBsOworCisgICAgICAgICAgaWYgKGZkIDwgMykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaWYgKGZkID09IGRpcmZkIChkKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZCwgJmZkcy0+c2V0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgX2RidXNfd2FybiAoImZpbGUgZGVzY3JpcHRvciAlaSBsZWFrZWQgaW4gJXMuXG4iLCBmZCwgX19GSUxFX18pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZkbGVha3MiKTsKKyAgICAgICAgfQorCisgICAgICBjbG9zZWRpciAoZCk7CisgICAgfQorCisgIGZyZWUgKGZkcyk7CisjZWxzZQorICBfZGJ1c19hc3NlcnQgKGZkcyA9PSBOVUxMKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2hhdmVfdmFsaWRfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBtZXNzYWdlID0gTlVMTDsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImxvYWRlciBjb3JydXB0ZWQgb24gbWVzc2FnZSB0aGF0IHdhcyBleHBlY3RlZCB0byBiZSB2YWxpZDsgaW52YWxpZCByZWFzb24gJWRcbiIsCisgICAgICAgICAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBtZXNzYWdlID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgKGxvYWRlcik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImRpZG4ndCBsb2FkIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgKG1lc3NhZ2Ugbm90IHBvcHBlZClcbiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJoYWQgbGVmdG92ZXIgYnl0ZXMgZnJvbSBleHBlY3RlZC10by1iZS12YWxpZCBzaW5nbGUgbWVzc2FnZVxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyNpZiAwCisgIC8qIEZJWE1FICovCisgIC8qIFZlcmlmeSB0aGF0IHdlJ3JlIGFibGUgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHRoZSBtZXNzYWdlLgorICAgKiBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBkZXRlY3QgaW1wcm9wZXIgaGFuZGxpbmcgb2YgbWVzc2FnZXMKKyAgICogaW4gbm9uc3RhbmRhcmQgYnl0ZSBvcmRlci4KKyAgICovCisgIGlmICghY2hlY2tfbWVzc2FnZV9oYW5kbGluZyAobWVzc2FnZSkpCisgICAgZ290byBmYWlsZWQ7CisjZW5kaWYKKworICByZWNvcmRfdmFsaWRpdHlfc2VlbiAoREJVU19WQUxJRCk7CisgIAorICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfaW52YWxpZF9tZXNzYWdlIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImxvYWRlciBub3QgY29ycnVwdGVkIG9uIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW52YWxpZFxuIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmVjb3JkX3ZhbGlkaXR5X3NlZW4gKGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24pOworICAKKyAgaWYgKGV4cGVjdGVkX3ZhbGlkaXR5ICE9IERCVVNfSU5WQUxJRF9GT1JfVU5LTk9XTl9SRUFTT04gJiYKKyAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gIT0gZXhwZWN0ZWRfdmFsaWRpdHkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgY29ycnVwdGVkIGZvciByZWFzb24gJWQgYW5kIHdhcyBjb3JydXB0ZWQgZm9yICVkIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSwgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19pbmNvbXBsZXRlX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJsb2FkZXIgY29ycnVwdGVkIG9uIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgKGJ1dCBpbmNvbXBsZXRlKSwgY29ycnVwdGlvbiByZWFzb24gJWRcbiIsCisgICAgICAgICAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBtZXNzYWdlID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgKGxvYWRlcik7CisgIGlmIChtZXNzYWdlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImxvYWRlZCBtZXNzYWdlIHRoYXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluY29tcGxldGVcbiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJlY29yZF92YWxpZGl0eV9zZWVuIChEQlVTX1ZBTElEX0JVVF9JTkNPTVBMRVRFKTsKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sb2FkZXJfcmVzdWx0cyAoREJ1c01lc3NhZ2VMb2FkZXIgICAgICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpZiAoIV9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzIChsb2FkZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBxdWV1ZSBtZXNzYWdlcyIpOworCisgIGlmIChleHBlY3RlZF92YWxpZGl0eSA9PSBEQlVTX1ZBTElEKQorICAgIHJldHVybiBjaGVja19oYXZlX3ZhbGlkX21lc3NhZ2UgKGxvYWRlcik7CisgIGVsc2UgaWYgKGV4cGVjdGVkX3ZhbGlkaXR5ID09IERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUpCisgICAgcmV0dXJuIGNoZWNrX2luY29tcGxldGVfbWVzc2FnZSAobG9hZGVyKTsKKyAgZWxzZSBpZiAoZXhwZWN0ZWRfdmFsaWRpdHkgPT0gREJVU19WQUxJRElUWV9VTktOT1dOKQorICAgIHsKKyAgICAgIC8qIGhlcmUgd2UganVzdCBrbm93IHdlIGRpZG4ndCBzZWdmYXVsdCBhbmQgdGhhdCB3YXMgdGhlCisgICAgICAgKiBvbmx5IHRlc3QuIEFsc28sIHdlIHJlY29yZCB0aGF0IHdlIGdvdCBjb3ZlcmFnZQorICAgICAgICogZm9yIHRoZSB2YWxpZGl0eSByZWFzb24uCisgICAgICAgKi8KKyAgICAgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgICAgICByZWNvcmRfdmFsaWRpdHlfc2VlbiAobG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBjaGVja19pbnZhbGlkX21lc3NhZ2UgKGxvYWRlciwgZXhwZWN0ZWRfdmFsaWRpdHkpOworfQorCisvKioKKyAqIExvYWRzIHRoZSBtZXNzYWdlIGluIHRoZSBnaXZlbiBtZXNzYWdlIGZpbGUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIHRvIGxvYWQKKyAqIEBwYXJhbSBkYXRhIHN0cmluZyB0byBsb2FkIG1lc3NhZ2UgaW50bworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2Ugd2FzIGxvYWRlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2xvYWRfbWVzc2FnZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgX2RidXNfdmVyYm9zZSAoIkxvYWRpbmcgcmF3ICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKSk7CisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKGRhdGEsIGZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgbG9hZCBtZXNzYWdlIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVHJpZXMgbG9hZGluZyB0aGUgbWVzc2FnZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSBmaWxlCisgKiBhbmQgdmVyaWZpZXMgdGhhdCBEQnVzTWVzc2FnZUxvYWRlciBjYW4gaGFuZGxlIGl0LgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byBsb2FkCisgKiBAcGFyYW0gZXhwZWN0ZWRfdmFsaWRpdHkgd2hhdCB0aGUgbWVzc2FnZSBoYXMgdG8gYmUgbGlrZSB0byByZXR1cm4gI1RSVUUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhcyB0aGUgZXhwZWN0ZWQgdmFsaWRpdHkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgREJ1c1N0cmluZyBkYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRhdGEpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBzdHJpbmdcbiIpOworCisgIGlmICghZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2xvYWRfbWVzc2FnZV9maWxlIChmaWxlbmFtZSwgJmRhdGEpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJldHZhbCA9IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9kYXRhICgmZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpOworCisgZmFpbGVkOgorCisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRhdGEpID4gMCkKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZkYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkYXRhKSk7CisKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgbWVzc2FnZSBsb2FkZXIgdGVzdCBvbiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRyaWVzIGxvYWRpbmcgdGhlIGdpdmVuIG1lc3NhZ2UgZGF0YS4KKyAqCisgKgorICogQHBhcmFtIGRhdGEgdGhlIG1lc3NhZ2UgZGF0YQorICogQHBhcmFtIGV4cGVjdGVkX3ZhbGlkaXR5IHdoYXQgdGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGxpa2UgdG8gcmV0dXJuICNUUlVFCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIGV4cGVjdGVkIHZhbGlkaXR5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfdHJ5X21lc3NhZ2VfZGF0YSAoY29uc3QgREJ1c1N0cmluZyAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgbGVuOworICBpbnQgaTsKKworICBsb2FkZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBXcml0ZSB0aGUgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUgKi8KKworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisKKyAgLyogY2hlY2sgc29tZSB0cml2aWFsIGxvYWRlciBmdW5jdGlvbnMgKi8KKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmVmIChsb2FkZXIpOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3NpemUgKGxvYWRlcik7CisKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgaSkpOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIsIDEpOworICAgIH0KKworICBpZiAoIWNoZWNrX2xvYWRlcl9yZXN1bHRzIChsb2FkZXIsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgbG9hZGVyID0gTlVMTDsKKworICAvKiBXcml0ZSB0aGUgZGF0YSBhbGwgYXQgb25jZSAqLworCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKworICB7CisgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAobG9hZGVyLCAmYnVmZmVyKTsKKyAgICBfZGJ1c19zdHJpbmdfY29weSAoZGF0YSwgMCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSk7CisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIsIDEpOworICB9CisKKyAgaWYgKCFjaGVja19sb2FkZXJfcmVzdWx0cyAobG9hZGVyLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIGxvYWRlciA9IE5VTEw7CisKKyAgLyogV3JpdGUgdGhlIGRhdGEgMiBieXRlcyBhdCBhIHRpbWUgKi8KKworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgaSkpOworICAgICAgaWYgKChpKzEpIDwgbGVuKQorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRhdGEsIGkrMSkpOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIsIDEpOworICAgIH0KKworICBpZiAoIWNoZWNrX2xvYWRlcl9yZXN1bHRzIChsb2FkZXIsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgbG9hZGVyID0gTlVMTDsKKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChsb2FkZXIpCisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3Rfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICp0ZXN0X2Jhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqc3ViZGlyLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICBEQnVzRm9yZWFjaE1lc3NhZ2VGaWxlRnVuYyBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRpciA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnlcbiIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nXG4iKTsKKworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHByaW50ZiAoIlRlc3RpbmcgJXM6XG4iLCBzdWJkaXIpOworCisgbmV4dDoKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZpbGVuYW1lLCAiLm1lc3NhZ2UtcmF3IikpCisgICAgICAgIDsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZW5hbWUsICIubWVzc2FnZSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGxvYWQgJXMsIG1lc3NhZ2UgYnVpbGRlciBsYW5ndWFnZSBubyBsb25nZXIgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTa2lwcGluZyBub24tLm1lc3NhZ2UgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCSAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIGlmICghICgqZnVuY3Rpb24pICgmZnVsbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5LCB1c2VyX2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBldmVyeSBtZXNzYWdlIGZpbGUgaW4gdGhlIHRlc3Qgc3VpdGUuCisgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAjRkFMU0Ugb24gdGVzdCBmYWlsdXJlIG9yIGZhdGFsIGVycm9yLgorICoKKyAqIEBwYXJhbSB0ZXN0X2RhdGFfZGlyIHJvb3QgZGlyIG9mIHRoZSB0ZXN0IHN1aXRlIGRhdGEgZmlsZXMgKHRvcF9zcmNkaXIvdGVzdC9kYXRhKQorICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHRvIHJ1bgorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIGZvciBmdW5jdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZXJlJ3MgYSBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZm9yZWFjaF9tZXNzYWdlX2ZpbGUgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kaXJlY3RvcnksIHRlc3RfZGF0YV9kaXIpOworICAKKyAgaWYgKCFwcm9jZXNzX3Rlc3Rfc3ViZGlyICgmdGVzdF9kaXJlY3RvcnksICJ2YWxpZC1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19WQUxJRCwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAiaW52YWxpZC1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTiwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAiaW5jb21wbGV0ZS1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19WQUxJRF9CVVRfSU5DT01QTEVURSwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorIGZhaWxlZDoKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjaWYgMAorI2RlZmluZSBHRVRfQU5EX0NIRUNLKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgIT0gREJVU19UWVBFXyMjdHlwZW5hbWUpICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ290IHdyb25nIGFyZ3VtZW50IHR5cGUgZnJvbSBtZXNzYWdlIGl0ZXIiKTsgICBcCisgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmaXRlciwgJnZfIyN0eXBlbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodl8jI3R5cGVuYW1lICE9IGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ290IHdyb25nIHZhbHVlIGZyb20gbWVzc2FnZSBpdGVyIik7ICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX0FORF9DSEVDS19TVFJDTVAoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV8jI3R5cGVuYW1lKSAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyBhcmd1bWVudCB0eXBlIGZyb20gbWVzc2FnZSBpdGVyIik7ICAgXAorICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJml0ZXIsICZ2XyMjdHlwZW5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0cmNtcCAodl8jI3R5cGVuYW1lLCBsaXRlcmFsKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyB2YWx1ZSBmcm9tIG1lc3NhZ2UgaXRlciIpOyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRfQU5EX0NIRUNLKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcikpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIG1vdmUgaXRlciB0byBuZXh0Iik7IFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfQU5EX0NIRUNLX1NUUkNNUF9BTkRfTkVYVChpdGVyLCB0eXBlbmFtZSwgbGl0ZXJhbCkgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUX0FORF9DSEVDS19TVFJDTVAoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpOyAgICAgICAgICAgICAgXAorICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBtb3ZlIGl0ZXIgdG8gbmV4dCIpOyBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCittZXNzYWdlX2l0ZXJfdGVzdCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJheSwgYXJyYXkyOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkYnVzX2ludDE2X3Qgdl9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCB2X1VJTlQxNjsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIGRidXNfaW50NjRfdCB2X0lOVDY0OworICBkYnVzX3VpbnQ2NF90IHZfVUlOVDY0OworI2VuZGlmCisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICBkYnVzX2Jvb2xfdCB2X0JPT0xFQU47CisKKyAgY29uc3QgZGJ1c19pbnQzMl90ICpvdXJfaW50X2FycmF5OworICBpbnQgbGVuOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKworICBHRVRfQU5EX0NIRUNLX1NUUkNNUF9BTkRfTkVYVCAoaXRlciwgU1RSSU5HLCAiVGVzdCBzdHJpbmciKTsKKyAgR0VUX0FORF9DSEVDS19BTkRfTkVYVCAoaXRlciwgSU5UMzIsIC0weDEyMzQ1Njc4KTsKKyAgR0VUX0FORF9DSEVDS19BTkRfTkVYVCAoaXRlciwgVUlOVDMyLCAweGVkZDFlKTsKKyAgR0VUX0FORF9DSEVDS19BTkRfTkVYVCAoaXRlciwgRE9VQkxFLCAzLjE0MTU5KTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgIT0gREJVU19UWVBFX0FSUkFZKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFyZ3VtZW50IHR5cGUgbm90IGFuIGFycmF5Iik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZpdGVyKSAhPSBEQlVTX1RZUEVfRE9VQkxFKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFycmF5IHR5cGUgbm90IGRvdWJsZSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmYXJyYXkpOworCisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGFycmF5LCBET1VCTEUsIDEuNSk7CisgIEdFVF9BTkRfQ0hFQ0sgKGFycmF5LCBET1VCTEUsIDIuNSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcnJheSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkbid0IHJlYWNoIGVuZCBvZiBhcnJheSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlJlYWNoZWQgZW5kIG9mIGFyZ3VtZW50cyIpOworCisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIEJZVEUsIDB4RjApOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKSAhPSBEQlVTX1RZUEVfQVJSQVkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gYXJyYXkiKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV9JTlQzMikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBcnJheSB0eXBlIG5vdCBpbnQzMiIpOworCisgIC8qIEVtcHR5IGFycmF5ICovCisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmYXJyYXkpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJyYXkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCByZWFjaCBlbmQgb2YgYXJyYXkiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJSZWFjaGVkIGVuZCBvZiBhcmd1bWVudHMiKTsKKworICBHRVRfQU5EX0NIRUNLIChpdGVyLCBCWVRFLCAweEYwKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCByZWFjaCBlbmQgb2YgYXJndW1lbnRzIik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3ZlcmlmeV90ZXN0X21lc3NhZ2UgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBkYnVzX2ludDE2X3Qgb3VyX2ludDE2OworICBkYnVzX3VpbnQxNl90IG91cl91aW50MTY7CisgIGRidXNfaW50MzJfdCBvdXJfaW50OworICBkYnVzX3VpbnQzMl90IG91cl91aW50OworICBjb25zdCBjaGFyICpvdXJfc3RyOworICBkb3VibGUgb3VyX2RvdWJsZTsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkYnVzX2Jvb2xfdCBvdXJfYm9vbDsKKyAgdW5zaWduZWQgY2hhciBvdXJfYnl0ZV8xLCBvdXJfYnl0ZV8yOworICBjb25zdCBkYnVzX3VpbnQzMl90ICpvdXJfdWludDMyX2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfdWludDMyX2FycmF5X2xlbjsKKyAgZGJ1c19pbnQzMl90ICpvdXJfaW50MzJfYXJyYXkgPSAodm9pZCopMHhkZWFkYmVlZjsKKyAgaW50IG91cl9pbnQzMl9hcnJheV9sZW47CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIGRidXNfaW50NjRfdCBvdXJfaW50NjQ7CisgIGRidXNfdWludDY0X3Qgb3VyX3VpbnQ2NDsKKyAgZGJ1c19pbnQ2NF90ICpvdXJfdWludDY0X2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfdWludDY0X2FycmF5X2xlbjsKKyAgY29uc3QgZGJ1c19pbnQ2NF90ICpvdXJfaW50NjRfYXJyYXkgPSAodm9pZCopMHhkZWFkYmVlZjsKKyAgaW50IG91cl9pbnQ2NF9hcnJheV9sZW47CisjZW5kaWYKKyAgY29uc3QgZG91YmxlICpvdXJfZG91YmxlX2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfZG91YmxlX2FycmF5X2xlbjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqb3VyX2J5dGVfYXJyYXkgPSAodm9pZCopMHhkZWFkYmVlZjsKKyAgaW50IG91cl9ieXRlX2FycmF5X2xlbjsKKyAgY29uc3QgZGJ1c19ib29sX3QgKm91cl9ib29sZWFuX2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfYm9vbGVhbl9hcnJheV9sZW47CisgIGNoYXIgKipvdXJfc3RyaW5nX2FycmF5OworICBpbnQgb3VyX3N0cmluZ19hcnJheV9sZW47CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3MgKCZpdGVyLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQxNiwgJm91cl9pbnQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQxNiwgJm91cl91aW50MTYsCisJCQkJICAgREJVU19UWVBFX0lOVDMyLCAmb3VyX2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50LAorI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UNjQsICZvdXJfaW50NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UNjQsICZvdXJfdWludDY0LAorI2VuZGlmCisJCQkJICAgREJVU19UWVBFX1NUUklORywgJm91cl9zdHIsCisJCQkJICAgREJVU19UWVBFX0RPVUJMRSwgJm91cl9kb3VibGUsCisJCQkJICAgREJVU19UWVBFX0JPT0xFQU4sICZvdXJfYm9vbCwKKwkJCQkgICBEQlVTX1RZUEVfQllURSwgJm91cl9ieXRlXzEsCisJCQkJICAgREJVU19UWVBFX0JZVEUsICZvdXJfYnl0ZV8yLAorCQkJCSAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl91aW50MzJfYXJyYXksICZvdXJfdWludDMyX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfaW50MzJfYXJyYXksICZvdXJfaW50MzJfYXJyYXlfbGVuLAorI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorCQkJCSAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl91aW50NjRfYXJyYXksICZvdXJfdWludDY0X2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfaW50NjRfYXJyYXksICZvdXJfaW50NjRfYXJyYXlfbGVuLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9kb3VibGVfYXJyYXksICZvdXJfZG91YmxlX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9ieXRlX2FycmF5LCAmb3VyX2J5dGVfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9CT09MRUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VyX2Jvb2xlYW5fYXJyYXksICZvdXJfYm9vbGVhbl9hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9zdHJpbmdfYXJyYXksICZvdXJfc3RyaW5nX2FycmF5X2xlbiwKKwkJCQkgICAwKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZXJyb3I6ICVzIC0gJXNcbiIsIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAoZXJyb3IubWVzc2FnZSAhPSBOVUxMKSA/IGVycm9yLm1lc3NhZ2UgOiAibm8gbWVzc2FnZSIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ291bGQgbm90IGdldCBhcmd1bWVudHMiKTsKKyAgICB9CisKKyAgaWYgKG91cl9pbnQxNiAhPSAtMHgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiMTYtYml0IGludGVnZXJzIGRpZmZlciEiKTsKKworICBpZiAob3VyX3VpbnQxNiAhPSAweDEyMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCIxNi1iaXQgdWludHMgZGlmZmVyISIpOworICAKKyAgaWYgKG91cl9pbnQgIT0gLTB4MTIzNDU2NzgpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW50ZWdlcnMgZGlmZmVyISIpOworCisgIGlmIChvdXJfdWludCAhPSAweDEyMzAwMDQyKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVpbnRzIGRpZmZlciEiKTsKKworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBpZiAob3VyX2ludDY0ICE9IERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiY2QpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIjY0LWJpdCBpbnRlZ2VycyBkaWZmZXIhIik7CisgIGlmIChvdXJfdWludDY0ICE9IERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiY2QpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIjY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VycyBkaWZmZXIhIik7CisjZW5kaWYKKworICB2X0RPVUJMRSA9IDMuMTQxNTk7CisgIGlmICghIF9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAob3VyX2RvdWJsZSwgdl9ET1VCTEUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZXMgZGlmZmVyISIpOworCisgIGlmIChzdHJjbXAgKG91cl9zdHIsICJUZXN0IHN0cmluZyIpICE9IDApCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic3RyaW5ncyBkaWZmZXIhIik7CisKKyAgaWYgKCFvdXJfYm9vbCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJib29sZWFucyBkaWZmZXIiKTsKKworICBpZiAob3VyX2J5dGVfMSAhPSA0MikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJieXRlcyBkaWZmZXIhIik7CisKKyAgaWYgKG91cl9ieXRlXzIgIT0gMjQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnl0ZXMgZGlmZmVyISIpOworCisgIGlmIChvdXJfdWludDMyX2FycmF5X2xlbiAhPSA0IHx8CisgICAgICBvdXJfdWludDMyX2FycmF5WzBdICE9IDB4MTIzNDU2NzggfHwKKyAgICAgIG91cl91aW50MzJfYXJyYXlbMV0gIT0gMHgyMzQ1Njc4MSB8fAorICAgICAgb3VyX3VpbnQzMl9hcnJheVsyXSAhPSAweDM0NTY3ODEyIHx8CisgICAgICBvdXJfdWludDMyX2FycmF5WzNdICE9IDB4NDU2NzgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidWludCBhcnJheSBkaWZmZXJzIik7CisKKyAgaWYgKG91cl9pbnQzMl9hcnJheV9sZW4gIT0gNCB8fAorICAgICAgb3VyX2ludDMyX2FycmF5WzBdICE9IDB4MTIzNDU2NzggfHwKKyAgICAgIG91cl9pbnQzMl9hcnJheVsxXSAhPSAtMHgyMzQ1Njc4MSB8fAorICAgICAgb3VyX2ludDMyX2FycmF5WzJdICE9IDB4MzQ1Njc4MTIgfHwKKyAgICAgIG91cl9pbnQzMl9hcnJheVszXSAhPSAtMHg0NTY3ODEyMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnQgYXJyYXkgZGlmZmVycyIpOworCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIGlmIChvdXJfdWludDY0X2FycmF5X2xlbiAhPSA0IHx8CisgICAgICBvdXJfdWludDY0X2FycmF5WzBdICE9IDB4MTIzNDU2NzggfHwKKyAgICAgIG91cl91aW50NjRfYXJyYXlbMV0gIT0gMHgyMzQ1Njc4MSB8fAorICAgICAgb3VyX3VpbnQ2NF9hcnJheVsyXSAhPSAweDM0NTY3ODEyIHx8CisgICAgICBvdXJfdWludDY0X2FycmF5WzNdICE9IDB4NDU2NzgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidWludDY0IGFycmF5IGRpZmZlcnMiKTsKKworICBpZiAob3VyX2ludDY0X2FycmF5X2xlbiAhPSA0IHx8CisgICAgICBvdXJfaW50NjRfYXJyYXlbMF0gIT0gMHgxMjM0NTY3OCB8fAorICAgICAgb3VyX2ludDY0X2FycmF5WzFdICE9IC0weDIzNDU2NzgxIHx8CisgICAgICBvdXJfaW50NjRfYXJyYXlbMl0gIT0gMHgzNDU2NzgxMiB8fAorICAgICAgb3VyX2ludDY0X2FycmF5WzNdICE9IC0weDQ1Njc4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludDY0IGFycmF5IGRpZmZlcnMiKTsKKyNlbmRpZiAvKiBEQlVTX0hBVkVfSU5UNjQgKi8KKworICBpZiAob3VyX2RvdWJsZV9hcnJheV9sZW4gIT0gMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgYXJyYXkgaGFkIHdyb25nIGxlbmd0aCIpOworCisgIC8qIE9uIGFsbCBJRUVFIG1hY2hpbmVzIChpLmUuIGV2ZXJ5dGhpbmcgc2FuZSkgZXhhY3QgZXF1YWxpdHkKKyAgICogc2hvdWxkIGJlIHByZXNlcnZlZCBvdmVyIHRoZSB3aXJlCisgICAqLworICB2X0RPVUJMRSA9IDAuMTIzNDsKKyAgaWYgKCEgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMIChvdXJfZG91YmxlX2FycmF5WzBdLCB2X0RPVUJMRSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKyAgdl9ET1VCTEUgPSA5ODc2LjU0MzIxOworICBpZiAoISBfREJVU19ET1VCTEVTX0JJVFdJU0VfRVFVQUwgKG91cl9kb3VibGVfYXJyYXlbMV0sIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgYXJyYXkgaGFkIHdyb25nIHZhbHVlcyIpOworICB2X0RPVUJMRSA9IC0zMDAuMDsKKyAgaWYgKCEgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMIChvdXJfZG91YmxlX2FycmF5WzJdLCB2X0RPVUJMRSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKworICBpZiAob3VyX2J5dGVfYXJyYXlfbGVuICE9IDQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnl0ZSBhcnJheSBoYWQgd3JvbmcgbGVuZ3RoIik7CisKKyAgaWYgKG91cl9ieXRlX2FycmF5WzBdICE9ICdhJyB8fAorICAgICAgb3VyX2J5dGVfYXJyYXlbMV0gIT0gJ2InIHx8CisgICAgICBvdXJfYnl0ZV9hcnJheVsyXSAhPSAnYycgfHwKKyAgICAgIG91cl9ieXRlX2FycmF5WzNdICE9IDIzNCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJieXRlIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKworICBpZiAob3VyX2Jvb2xlYW5fYXJyYXlfbGVuICE9IDUpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYm9vbCBhcnJheSBoYWQgd3JvbmcgbGVuZ3RoIik7CisKKyAgaWYgKG91cl9ib29sZWFuX2FycmF5WzBdICE9IFRSVUUgfHwKKyAgICAgIG91cl9ib29sZWFuX2FycmF5WzFdICE9IEZBTFNFIHx8CisgICAgICBvdXJfYm9vbGVhbl9hcnJheVsyXSAhPSBUUlVFIHx8CisgICAgICBvdXJfYm9vbGVhbl9hcnJheVszXSAhPSBUUlVFIHx8CisgICAgICBvdXJfYm9vbGVhbl9hcnJheVs0XSAhPSBGQUxTRSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJib29sIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKworICBpZiAob3VyX3N0cmluZ19hcnJheV9sZW4gIT0gNCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzdHJpbmcgYXJyYXkgd2FzIHdyb25nIGxlbmd0aCIpOworCisgIGlmIChzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbMF0sICJGb28iKSAhPSAwIHx8CisgICAgICBzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbMV0sICJiYXIiKSAhPSAwIHx8CisgICAgICBzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbMl0sICIiKSAhPSAwIHx8CisgICAgICBzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbM10sICJ3b28gd29vIHdvbyB3b28iKSAhPSAwKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInN0cmluZyBhcnJheSBoYWQgd3JvbmcgdmFsdWVzIik7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAob3VyX3N0cmluZ19hcnJheSk7CisgIAorICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCByZWFjaCBlbmQgb2YgYXJndW1lbnRzIik7Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c01lc3NhZ2VJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c01lc3NhZ2UuCisgKgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICptZXNzYWdlX3dpdGhvdXRfdW5peF9mZHM7CisgIERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXI7CisgIGludCBpOworICBjb25zdCBjaGFyICpkYXRhOworICBEQnVzTWVzc2FnZSAqY29weTsKKyAgY29uc3QgY2hhciAqbmFtZTE7CisgIGNvbnN0IGNoYXIgKm5hbWUyOworICBjb25zdCBkYnVzX3VpbnQzMl90IG91cl91aW50MzJfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAweDIzNDU2NzgxLCAweDM0NTY3ODEyLCAweDQ1Njc4MTIzIH07CisgIGNvbnN0IGRidXNfaW50MzJfdCBvdXJfaW50MzJfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAtMHgyMzQ1Njc4MSwgMHgzNDU2NzgxMiwgLTB4NDU2NzgxMjMgfTsKKyAgY29uc3QgZGJ1c191aW50MzJfdCAqdl9BUlJBWV9VSU5UMzIgPSBvdXJfdWludDMyX2FycmF5OworICBjb25zdCBkYnVzX2ludDMyX3QgKnZfQVJSQVlfSU5UMzIgPSBvdXJfaW50MzJfYXJyYXk7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIGNvbnN0IGRidXNfdWludDY0X3Qgb3VyX3VpbnQ2NF9hcnJheVtdID0KKyAgICB7IDB4MTIzNDU2NzgsIDB4MjM0NTY3ODEsIDB4MzQ1Njc4MTIsIDB4NDU2NzgxMjMgfTsKKyAgY29uc3QgZGJ1c19pbnQ2NF90IG91cl9pbnQ2NF9hcnJheVtdID0KKyAgICB7IDB4MTIzNDU2NzgsIC0weDIzNDU2NzgxLCAweDM0NTY3ODEyLCAtMHg0NTY3ODEyMyB9OworICBjb25zdCBkYnVzX3VpbnQ2NF90ICp2X0FSUkFZX1VJTlQ2NCA9IG91cl91aW50NjRfYXJyYXk7CisgIGNvbnN0IGRidXNfaW50NjRfdCAqdl9BUlJBWV9JTlQ2NCA9IG91cl9pbnQ2NF9hcnJheTsKKyNlbmRpZgorICBjb25zdCBjaGFyICpvdXJfc3RyaW5nX2FycmF5W10gPSB7ICJGb28iLCAiYmFyIiwgIiIsICJ3b28gd29vIHdvbyB3b28iIH07CisgIGNvbnN0IGNoYXIgKip2X0FSUkFZX1NUUklORyA9IG91cl9zdHJpbmdfYXJyYXk7CisgIGNvbnN0IGRvdWJsZSBvdXJfZG91YmxlX2FycmF5W10gPSB7IDAuMTIzNCwgOTg3Ni41NDMyMSwgLTMwMC4wIH07CisgIGNvbnN0IGRvdWJsZSAqdl9BUlJBWV9ET1VCTEUgPSBvdXJfZG91YmxlX2FycmF5OworICBjb25zdCB1bnNpZ25lZCBjaGFyIG91cl9ieXRlX2FycmF5W10gPSB7ICdhJywgJ2InLCAnYycsIDIzNCB9OworICBjb25zdCB1bnNpZ25lZCBjaGFyICp2X0FSUkFZX0JZVEUgPSBvdXJfYnl0ZV9hcnJheTsKKyAgY29uc3QgZGJ1c19ib29sX3Qgb3VyX2Jvb2xlYW5fYXJyYXlbXSA9IHsgVFJVRSwgRkFMU0UsIFRSVUUsIFRSVUUsIEZBTFNFIH07CisgIGNvbnN0IGRidXNfYm9vbF90ICp2X0FSUkFZX0JPT0xFQU4gPSBvdXJfYm9vbGVhbl9hcnJheTsKKyAgY2hhciBzaWdbNjRdOworICBjb25zdCBjaGFyICpzOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkYnVzX2ludDE2X3Qgdl9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCB2X1VJTlQxNjsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIGRidXNfaW50NjRfdCB2X0lOVDY0OworICBkYnVzX3VpbnQ2NF90IHZfVUlOVDY0OworI2VuZGlmCisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICB1bnNpZ25lZCBjaGFyIHYyX0JZVEU7CisgIGRidXNfYm9vbF90IHZfQk9PTEVBTjsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXIsIGFycmF5X2l0ZXIsIHN0cnVjdF9pdGVyOworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGludCB2X1VOSVhfRkQ7CisjZW5kaWYKKyAgY2hhciAqKmRlY29tcG9zZWQ7CisgIERCdXNJbml0aWFsRkRzICppbml0aWFsX2ZkczsKKworICBpbml0aWFsX2ZkcyA9IF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RNZXRob2QiKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uIChtZXNzYWdlLCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFNlcnZpY2UiKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLCAiRm9vLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RNZXRob2QiKSk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFBhdGgiKSA9PSAwKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIDEyMzQpOworCisgIC8qIHN0cmluZyBsZW5ndGggaW5jbHVkaW5nIG51bCBieXRlIG5vdCBhIG11bHRpcGxlIG9mIDQgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAobWVzc2FnZSwgIm9yZy5mb28uYmFyMSIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCAib3JnLmZvby5iYXIxIikpOworICBkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwgNTY3OCk7CisKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZtZXNzYWdlLT5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAobWVzc2FnZSwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworCisKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZtZXNzYWdlLT5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSk7CisKKworICBfZGJ1c19hc3NlcnQgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgIm9yZy5mb28uYmFyMSIpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSkgPT0gMTIzNCk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpID09IDU2NzgpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfZGVzdGluYXRpb24gKG1lc3NhZ2UsICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIpKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKG1lc3NhZ2UpID09IEZBTFNFKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAobWVzc2FnZSkgPT0gVFJVRSk7CisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIEZBTFNFKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChtZXNzYWdlKSA9PSBGQUxTRSk7CisKKyAgLyogU2V0L2dldCBzb21lIGhlYWRlciBmaWVsZHMgKi8KKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgIi9mb28iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIi9mb28iKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCAib3JnLkZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuRm9vIikgPT0gMCk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAobWVzc2FnZSwgIkJhciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYXIiKSA9PSAwKTsKKworICAvKiBTZXQvZ2V0IHRoZW0gd2l0aCBsb25nZXIgdmFsdWVzICovCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiL2Zvby9iYXIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIi9mb28vYmFyIikgPT0gMCk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgIm9yZy5Gb28uQmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5Gb28uQmFyIikgPT0gMCk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAobWVzc2FnZSwgIkJhckZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYXJGb28iKSA9PSAwKTsKKworICAvKiBSZWFsbG9jIHNob3J0ZXIgYWdhaW4gKi8KKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgIi9mb28iKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIi9mb28iKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCAib3JnLkZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuRm9vIikgPT0gMCk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAobWVzc2FnZSwgIkJhciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYXIiKSA9PSAwKTsKKworICAvKiBQYXRoIGRlY29tcG9zaW5nICovCisgIGRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChtZXNzYWdlLCAmZGVjb21wb3NlZCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZCA9PSBOVUxMKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZCk7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiLyIpOworICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAobWVzc2FnZSwgJmRlY29tcG9zZWQpOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZFswXSA9PSBOVUxMKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZCk7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiL2EvYiIpOworICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAobWVzc2FnZSwgJmRlY29tcG9zZWQpOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkZWNvbXBvc2VkWzBdLCAiYSIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGVjb21wb3NlZFsxXSwgImIiKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkWzJdID09IE5VTEwpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkKTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvc3BhbS9lZ2dzIik7CisgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChtZXNzYWdlLCAmZGVjb21wb3NlZCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRlY29tcG9zZWRbMF0sICJzcGFtIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkZWNvbXBvc2VkWzFdLCAiZWdncyIpID09IDApOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWRbMl0gPT0gTlVMTCk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWQpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogVGVzdCB0aGUgdmFyYXJnIGZ1bmN0aW9ucyAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28uVGVzdEludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdE1ldGhvZCIpOworICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAobWVzc2FnZSwgMSk7CisgIGRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLCA1Njc4KTsKKworICB2X0lOVDE2ID0gLTB4MTIzOworICB2X1VJTlQxNiA9IDB4MTIzOworICB2X0lOVDMyID0gLTB4MTIzNDU2Nzg7CisgIHZfVUlOVDMyID0gMHgxMjMwMDA0MjsKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgdl9JTlQ2NCA9IERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiY2QpOworICB2X1VJTlQ2NCA9IERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiY2QpOworI2VuZGlmCisgIHZfU1RSSU5HID0gIlRlc3Qgc3RyaW5nIjsKKyAgdl9ET1VCTEUgPSAzLjE0MTU5OworICB2X0JPT0xFQU4gPSBUUlVFOworICB2X0JZVEUgPSA0MjsKKyAgdjJfQllURSA9IDI0OworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHZfVU5JWF9GRCA9IDE7CisjZW5kaWYKKworICBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDE2LCAmdl9JTlQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2LCAmdl9VSU5UMTYsCisJCQkgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdl9VSU5UMzIsCisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDY0LCAmdl9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDY0LCAmdl9VSU5UNjQsCisjZW5kaWYKKwkJCSAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisJCQkgICAgREJVU19UWVBFX0RPVUJMRSwgJnZfRE9VQkxFLAorCQkJICAgIERCVVNfVFlQRV9CT09MRUFOLCAmdl9CT09MRUFOLAorCQkJICAgIERCVVNfVFlQRV9CWVRFLCAmdl9CWVRFLAorCQkJICAgIERCVVNfVFlQRV9CWVRFLCAmdjJfQllURSwKKwkJCSAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9VSU5UMzIsICZ2X0FSUkFZX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfdWludDMyX2FycmF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9JTlQzMiwgJnZfQVJSQVlfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2ludDMyX2FycmF5KSwKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9VSU5UNjQsICZ2X0FSUkFZX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfdWludDY0X2FycmF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9JTlQ2NCwgJnZfQVJSQVlfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2ludDY0X2FycmF5KSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0RPVUJMRSwgJnZfQVJSQVlfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9kb3VibGVfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsICZ2X0FSUkFZX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2J5dGVfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JPT0xFQU4sICZ2X0FSUkFZX0JPT0xFQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2Jvb2xlYW5fYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywgJnZfQVJSQVlfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9zdHJpbmdfYXJyYXkpLAorCisJCQkgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgIGkgPSAwOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQxNjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDE2OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDMyOworI2lmZGVmIERCVVNfSEFWRV9JTlQ2NAorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQ2NDsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDY0OworI2VuZGlmCisgIHNpZ1tpKytdID0gREJVU19UWVBFX1NUUklORzsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfRE9VQkxFOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9CT09MRUFOOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9CWVRFOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9CWVRFOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDMyOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5UMzI7CisjaWZkZWYgREJVU19IQVZFX0lOVDY0CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9VSU5UNjQ7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQ2NDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfRE9VQkxFOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQllURTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0JPT0xFQU47CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisKKyAgbWVzc2FnZV93aXRob3V0X3VuaXhfZmRzID0gZGJ1c19tZXNzYWdlX2NvcHkobWVzc2FnZSk7CisgIF9kYnVzX2Fzc2VydChtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMpOworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJnZfVU5JWF9GRCwKKwkJCSAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1VOSVhfRkQ7CisjZW5kaWYKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5WQUxJRDsKKworICBfZGJ1c19hc3NlcnQgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChzaWcpKTsKKworICBfZGJ1c192ZXJib3NlICgiSEVBREVSXG4iKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpKTsKKyAgX2RidXNfdmVyYm9zZSAoIkJPRFlcbiIpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKKworICBfZGJ1c192ZXJib3NlICgiU2lnbmF0dXJlIGV4cGVjdGVkIFwiJXNcIiBhY3R1YWwgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICBzaWcsIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSk7CisKKyAgcyA9IGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChtZXNzYWdlLCBzaWcpKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHMsIHNpZykgPT0gMCk7CisKKyAgdmVyaWZ5X3Rlc3RfbWVzc2FnZSAobWVzc2FnZSk7CisKKyAgY29weSA9IGRidXNfbWVzc2FnZV9jb3B5IChtZXNzYWdlKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSA9PQorICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChjb3B5KSk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZS0+aGVhZGVyLnBhZGRpbmcgPT0gY29weS0+aGVhZGVyLnBhZGRpbmcpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcHktPmhlYWRlci5kYXRhKSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb3B5LT5ib2R5KSk7CisKKyAgdmVyaWZ5X3Rlc3RfbWVzc2FnZSAoY29weSk7CisKKyAgbmFtZTEgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisgIG5hbWUyID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKGNvcHkpOworCisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChuYW1lMSwgbmFtZTIpID09IDApOworCisgIG5hbWUxID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworICBuYW1lMiA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChjb3B5KTsKKworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAobmFtZTEsIG5hbWUyKSA9PSAwKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGNvcHkpOworCisgIC8qIE1lc3NhZ2UgbG9hZGVyIHRlc3QgKi8KKyAgZGJ1c19tZXNzYWdlX2xvY2sgKG1lc3NhZ2UpOworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisgIAorICAvKiBjaGVjayByZWYvdW5yZWYgKi8KKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmVmIChsb2FkZXIpOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKworICAvKiBXcml0ZSB0aGUgaGVhZGVyIGRhdGEgb25lIGJ5dGUgYXQgYSB0aW1lICovCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSk7CisgIGZvciAoaSA9IDA7IGkgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAobG9hZGVyLCAmYnVmZmVyKTsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoYnVmZmVyLCBkYXRhW2ldKTsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKGxvYWRlciwgYnVmZmVyLCAxKTsKKyAgICB9CisKKyAgLyogV3JpdGUgdGhlIGJvZHkgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUgKi8KKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJm1lc3NhZ2UtPmJvZHkpOworICBmb3IgKGkgPSAwOyBpIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KTsgaSsrKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAobG9hZGVyLCAmYnVmZmVyKTsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoYnVmZmVyLCBkYXRhW2ldKTsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKGxvYWRlciwgYnVmZmVyLCAxKTsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICB7CisgICAgaW50ICp1bml4X2ZkczsKKyAgICB1bnNpZ25lZCBuX3VuaXhfZmRzOworICAgIC8qIFdyaXRlIHVuaXggZmQgKi8KKyAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfdW5peF9mZHMobG9hZGVyLCAmdW5peF9mZHMsICZuX3VuaXhfZmRzKTsKKyAgICBfZGJ1c19hc3NlcnQobl91bml4X2ZkcyA+IDApOworICAgIF9kYnVzX2Fzc2VydChtZXNzYWdlLT5uX3VuaXhfZmRzID09IDEpOworICAgIHVuaXhfZmRzWzBdID0gX2RidXNfZHVwKG1lc3NhZ2UtPnVuaXhfZmRzWzBdLCBOVUxMKTsKKyAgICBfZGJ1c19hc3NlcnQodW5peF9mZHNbMF0gPj0gMCk7CisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX3VuaXhfZmRzKGxvYWRlciwgdW5peF9mZHMsIDEpOworICB9CisjZW5kaWYKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIC8qIE5vdyBwb3AgYmFjayB0aGUgbWVzc2FnZSAqLworICBpZiAoIV9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzIChsb2FkZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBxdWV1ZSBtZXNzYWdlcyIpOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm1lc3NhZ2UgbG9hZGVyIGNvcnJ1cHRlZCIpOworCisgIG1lc3NhZ2UgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAobG9hZGVyKTsKKyAgaWYgKCFtZXNzYWdlKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInJlY2VpdmVkIGEgTlVMTCBtZXNzYWdlIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSA1Njc4KQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInJlcGx5IHNlcmlhbCBmaWVsZHMgZGlmZmVyIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBvdnZlcmlkZSB0aGUgc2VyaWFsLCBzaW5jZSBpdCB3YXMgcmVzZXQgYnkgZGJ1c19tZXNzYWdlX2NvcHkoKSAqLworICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbChtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMsIDg5MDEpOworCisgIGRidXNfbWVzc2FnZV9sb2NrIChtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMpOworCisgIHZlcmlmeV90ZXN0X21lc3NhZ2UgKG1lc3NhZ2Vfd2l0aG91dF91bml4X2Zkcyk7CisKKyAgICB7CisgICAgICAvKiBNYXJzaGFsIGFuZCBkZW1hcnNoYWwgdGhlIG1lc3NhZ2UuICovCisKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlMjsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNoYXIgKm1hcnNoYWxsZWQgPSBOVUxMOworICAgICAgaW50IGxlbiA9IDA7CisgICAgICBjaGFyIGdhcmJhZ2VfaGVhZGVyW0RCVVNfTUlOSU1VTV9IRUFERVJfU0laRV0gPSAieHh4IjsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfbWFyc2hhbCAobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzLCAmbWFyc2hhbGxlZCwgJmxlbikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBtYXJzaGFsIG1lc3NhZ2UiKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChsZW4gIT0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG1hcnNoYWxsZWQgIT0gTlVMTCk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKG1hcnNoYWxsZWQsIGxlbikgPT0gbGVuKTsKKyAgICAgIG1lc3NhZ2UyID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAobWFyc2hhbGxlZCwgbGVuLCAmZXJyb3IpOworCisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UyICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgdmVyaWZ5X3Rlc3RfbWVzc2FnZSAobWVzc2FnZTIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UyKTsKKyAgICAgIGRidXNfZnJlZSAobWFyc2hhbGxlZCk7CisKKyAgICAgIC8qIERlbWFyc2hhbCBpbnZhbGlkIG1lc3NhZ2UuICovCisKKyAgICAgIG1lc3NhZ2UyID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoImludmFsaWQiLCA3LCAmZXJyb3IpOworICAgICAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMiA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgICAgICAvKiBEZW1hcnNoYWwgaW52YWxpZCAoZW1wdHkpIG1lc3NhZ2UuICovCisKKyAgICAgIG1lc3NhZ2UyID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoIiIsIDAsICZlcnJvcik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UyID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgICAgIC8qIEJ5dGVzIG5lZWRlZCB0byBkZW1hcnNoYWwgZW1wdHkgbWVzc2FnZTogMCAobW9yZSkgKi8KKworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoIiIsIDApID09IDApOworICAgICAgCisgICAgICAvKiBCeXRlcyBuZWVkZWQgdG8gZGVtYXJzaGFsIGludmFsaWQgbWVzc2FnZTogLTEgKGVycm9yKS4gKi8KKworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoZ2FyYmFnZV9oZWFkZXIsIERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSkgPT0gLTEpOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2Vfd2l0aG91dF91bml4X2Zkcyk7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworCisgIGNoZWNrX21lbWxlYWtzICgpOworICBfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChpbml0aWFsX2Zkcyk7CisgIGluaXRpYWxfZmRzID0gX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAoKTsKKworICAvKiBDaGVjayB0aGF0IHdlIGNhbiBhYmFuZG9uIGEgY29udGFpbmVyICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFNlcnZpY2UiLAorCQkgIAkJCSAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFBhdGgiLAorCQkJCQkgICJGb28uVGVzdEludGVyZmFjZSIsCisJCQkJCSAgIk1ldGhvZCIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKwkJCSAgCQkJICAoREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKwkJCQkJCSAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisJCQkJCQkgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORworCQkJCQkJICAgREJVU19TVFJVQ1RfRU5EX0NIQVJfQVNfU1RSSU5HKSwKKwkJCQkJCSAgJmFycmF5X2l0ZXIpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFycmF5X2l0ZXIsIERCVVNfVFlQRV9TVFJVQ1QsCisJCQkgIAkJCSAgTlVMTCwgJnN0cnVjdF9pdGVyKSk7CisKKyAgcyA9ICJwZWFjaGVzIjsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZzdHJ1Y3RfaXRlciwgREJVU19UWVBFX1NUUklORywKKwkJCSAgCQkJJnMpKTsKKworICAvKiB1aC1vaCwgZXJyb3IsIHRyeSBhbmQgdW53aW5kICovCisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZhcnJheV9pdGVyLCAmc3RydWN0X2l0ZXIpOworICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJmFycmF5X2l0ZXIsICZpdGVyKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIC8qIExvYWQgYWxsIHRoZSBzYW1wbGUgbWVzc2FnZXMgZnJvbSB0aGUgbWVzc2FnZSBmYWN0b3J5ICovCisgIHsKKyAgICBEQnVzTWVzc2FnZURhdGFJdGVyIGRpdGVyOworICAgIERCdXNNZXNzYWdlRGF0YSBtZGF0YTsKKyAgICBpbnQgY291bnQ7CisKKyAgICByZXNldF92YWxpZGl0aWVzX3NlZW4gKCk7CisgICAgCisgICAgY291bnQgPSAwOworICAgIF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2luaXQgKCZkaXRlcik7CisgICAgCisgICAgd2hpbGUgKF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2dldF9hbmRfbmV4dCAoJmRpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZGF0YSkpCisgICAgICB7CisgICAgICAgIGlmICghZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2RhdGEgKCZtZGF0YS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGF0YS5leHBlY3RlZF92YWxpZGl0eSkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIHZhbGlkaXR5ICVkIGFuZCBkaWQgbm90IGdldCBpdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1kYXRhLmV4cGVjdGVkX3ZhbGlkaXR5KTsKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm1lc3NhZ2UgZGF0YSBmYWlsZWQiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfbWVzc2FnZV9kYXRhX2ZyZWUgKCZtZGF0YSk7CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICAgIH0KKworICAgIHByaW50ZiAoIiVkIHNhbXBsZSBtZXNzYWdlcyB0ZXN0ZWRcbiIsIGNvdW50KTsKKworICAgIHByaW50X3ZhbGlkaXRpZXNfc2VlbiAoRkFMU0UpOworICAgIHByaW50X3ZhbGlkaXRpZXNfc2VlbiAoVFJVRSk7CisgIH0KKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworCisgIC8qIE5vdyBsb2FkIGV2ZXJ5IG1lc3NhZ2UgaW4gdGVzdF9kYXRhX2RpciBpZiB3ZSBoYXZlIG9uZSAqLworICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGluaXRpYWxfZmRzID0gX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAoKTsKKworICBpZiAoIWRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9mb3JlYWNoX21lc3NhZ2VfZmlsZSAodGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfdHJ5X21lc3NhZ2VfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZm9yZWFjaF9tZXNzYWdlX2ZpbGUgdGVzdCBmYWlsZWQiKTsKKworICBfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChpbml0aWFsX2Zkcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGVmNWFjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UuYwpAQCAtMCwwICsxLDQ2OTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLmMgIERCdXNNZXNzYWdlIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWhlYWRlci5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW9iamVjdC10cmVlLmgiCisjaW5jbHVkZSAiZGJ1cy1tZW1vcnkuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgdm9pZCBkYnVzX21lc3NhZ2VfZmluYWxpemUgKERCdXNNZXNzYWdlICptZXNzYWdlKTsKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lc3NhZ2VJbnRlcm5hbHMgREJ1c01lc3NhZ2UgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNNZXNzYWdlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzTWVzc2FnZSBhbmQgaXRzIG1ldGhvZHMuCisgKgorICogQHsKKyAqLworCisvKiBOb3QgdGhyZWFkIGxvY2tlZCwgYnV0IHN0cmljdGx5IGNvbnN0L3JlYWQtb25seSBzbyBzaG91bGQgYmUgT0sKKyAqLworLyoqIEFuIHN0YXRpYyBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIGVtcHR5IHNpZ25hdHVyZSAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfZW1wdHlfc2lnbmF0dXJlX3N0ciwgICIiKTsKKworLyogdGhlc2UgaGF2ZSB3YWNreSB2YWx1ZXMgdG8gaGVscCB0cmFwIHVuaW5pdGlhbGl6ZWQgaXRlcmF0b3JzOworICogYnV0IGhhcyB0byBmaXQgaW4gMyBiaXRzCisgKi8KK2VudW0geworICBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUiA9IDMsCisgIERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSID0gNworfTsKKworLyoqIHR5cGVkZWYgZm9yIGludGVybmFscyBvZiBtZXNzYWdlIGl0ZXJhdG9yICovCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVzc2FnZVJlYWxJdGVyIERCdXNNZXNzYWdlUmVhbEl0ZXI7CisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzTWVzc2FnZUl0ZXIKKyAqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gaW4gYSBtZXNzYWdlLiBBbGwgZmllbGRzIGFyZSBpbnRlcm5hbC4KKyAqLworc3RydWN0IERCdXNNZXNzYWdlUmVhbEl0ZXIKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7IC8qKjwgTWVzc2FnZSB1c2VkICovCisgIGRidXNfdWludDMyX3QgY2hhbmdlZF9zdGFtcCA6IENIQU5HRURfU1RBTVBfQklUUzsgLyoqPCBzdGFtcCB0byBkZXRlY3QgaW52YWxpZCBpdGVycyAqLworICBkYnVzX3VpbnQzMl90IGl0ZXJfdHlwZSA6IDM7ICAgICAgLyoqPCB3aGV0aGVyIHRoaXMgaXMgYSByZWFkZXIgb3Igd3JpdGVyIGl0ZXIgKi8KKyAgZGJ1c191aW50MzJfdCBzaWdfcmVmY291bnQgOiA4OyAgIC8qKjwgZGVwdGggb2Ygb3Blbl9zaWduYXR1cmUoKSAqLworICB1bmlvbgorICB7CisgICAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOyAvKio8IHdyaXRlciAqLworICAgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsgLyoqPCByZWFkZXIgKi8KKyAgfSB1OyAvKio8IHRoZSB0eXBlIHdyaXRlciBvciByZWFkZXIgdGhhdCBkb2VzIGFsbCB0aGUgd29yayAqLworfTsKKworc3RhdGljIHZvaWQKK2dldF9jb25zdF9zaWduYXR1cmUgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICoqdHlwZV9zdHJfcCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICp0eXBlX3Bvc19wKQoreworICBpZiAoX2RidXNfaGVhZGVyX2dldF9maWVsZF9yYXcgKGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zdHJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3Bvc19wKSkKKyAgICB7CisgICAgICAqdHlwZV9wb3NfcCArPSAxOyAvKiBza2lwIHRoZSBzaWduYXR1cmUgbGVuZ3RoIHdoaWNoIGlzIDEgYnl0ZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICp0eXBlX3N0cl9wID0gJl9kYnVzX2VtcHR5X3NpZ25hdHVyZV9zdHI7CisgICAgICAqdHlwZV9wb3NfcCA9IDA7CisgICAgfQorfQorCisvKioKKyAqIFN3YXBzIHRoZSBtZXNzYWdlIHRvIGNvbXBpbGVyIGJ5dGUgb3JkZXIgaWYgcmVxdWlyZWQKKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZAorX2RidXNfbWVzc2FnZV9ieXRlc3dhcCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOworICBpbnQgdHlwZV9wb3M7CisgIAorICBpZiAobWVzc2FnZS0+Ynl0ZV9vcmRlciA9PSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJTd2FwcGluZyBtZXNzYWdlIGludG8gY29tcGlsZXIgYnl0ZSBvcmRlclxuIik7CisgIAorICBnZXRfY29uc3Rfc2lnbmF0dXJlICgmbWVzc2FnZS0+aGVhZGVyLCAmdHlwZV9zdHIsICZ0eXBlX3Bvcyk7CisgIAorICBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwICh0eXBlX3N0ciwgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ09NUElMRVJfQllURV9PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UtPmJvZHksIDApOworCisgIG1lc3NhZ2UtPmJ5dGVfb3JkZXIgPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVI7CisgIAorICBfZGJ1c19oZWFkZXJfYnl0ZXN3YXAgKCZtZXNzYWdlLT5oZWFkZXIsIERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7Cit9CisKKy8qKiBieXRlLXN3YXAgdGhlIG1lc3NhZ2UgaWYgaXQgZG9lc24ndCBtYXRjaCBvdXIgYnl0ZSBvcmRlci4KKyAqICBDYWxsZWQgb25seSB3aGVuIHdlIG5lZWQgdGhlIG1lc3NhZ2UgaW4gb3VyIG93biBieXRlIG9yZGVyLAorICogIG5vcm1hbGx5IHdoZW4gcmVhZGluZyBhcnJheXMgb2YgaW50ZWdlcnMgb3IgZG91Ymxlcy4KKyAqICBPdGhlcndpc2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgc2luY2UgaXQgd291bGQgZG8gbmVlZGxlc3MKKyAqICB3b3JrLgorICovCisjZGVmaW5lIGVuc3VyZV9ieXRlX29yZGVyKG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgIFwKKyBpZiAobWVzc2FnZS0+Ynl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpICAgXAorICAgX2RidXNfbWVzc2FnZV9ieXRlc3dhcCAobWVzc2FnZSkKKworLyoqCisgKiBHZXRzIHRoZSBkYXRhIHRvIGJlIHNlbnQgb3ZlciB0aGUgbmV0d29yayBmb3IgdGhpcyBtZXNzYWdlLgorICogVGhlIGhlYWRlciBhbmQgdGhlbiB0aGUgYm9keSBzaG91bGQgYmUgd3JpdHRlbiBvdXQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZQorICogZGF0YSBvbmNlIGEgbWVzc2FnZSBpcyBsb2NrZWQgKHdpdGggZGJ1c19tZXNzYWdlX2xvY2soKSkuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCisgKiBAcGFyYW0gaGVhZGVyIHJldHVybiBsb2NhdGlvbiBmb3IgbWVzc2FnZSBoZWFkZXIgZGF0YS4KKyAqIEBwYXJhbSBib2R5IHJldHVybiBsb2NhdGlvbiBmb3IgbWVzc2FnZSBib2R5IGRhdGEuCisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfZ2V0X25ldHdvcmtfZGF0YSAoREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgKipoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgKipib2R5KQoreworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UtPmxvY2tlZCk7CisKKyAgKmhlYWRlciA9ICZtZXNzYWdlLT5oZWFkZXIuZGF0YTsKKyAgKmJvZHkgPSAmbWVzc2FnZS0+Ym9keTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1bml4IGZkcyB0byBiZSBzZW50IG92ZXIgdGhlIG5ldHdvcmsgZm9yIHRoaXMgbWVzc2FnZS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGRhdGEgb25jZSBhCisgKiBtZXNzYWdlIGlzIGxvY2tlZCAod2l0aCBkYnVzX21lc3NhZ2VfbG9jaygpKS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSBmZHMgcmV0dXJuIGxvY2F0aW9uIG9mIHVuaXggZmQgYXJyYXkKKyAqIEBwYXJhbSBuX2ZkcyByZXR1cm4gbnVtYmVyIG9mIGVudHJpZXMgaW4gYXJyYXkKKyAqLwordm9pZCBfZGJ1c19tZXNzYWdlX2dldF91bml4X2ZkcyhEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAqKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgKm5fZmRzKQoreworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UtPmxvY2tlZCk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAqZmRzID0gbWVzc2FnZS0+dW5peF9mZHM7CisgICpuX2ZkcyA9IG1lc3NhZ2UtPm5fdW5peF9mZHM7CisjZWxzZQorICAqZmRzID0gTlVMTDsKKyAgKm5fZmRzID0gMDsKKyNlbmRpZgorfQorCisvKioKKyAqIFNldHMgdGhlIHNlcmlhbCBudW1iZXIgb2YgYSBtZXNzYWdlLgorICogVGhpcyBjYW4gb25seSBiZSBkb25lIG9uY2Ugb24gYSBtZXNzYWdlLgorICoKKyAqIERCdXNDb25uZWN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlIHNlcmlhbCB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZSAKKyAqIHdoZW4gdGhlIG1lc3NhZ2UgaXMgc2VudDsgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IG5lZWRlZCB3aGVuIGVuY2Fwc3VsYXRpbmcgCisgKiBtZXNzYWdlcyBpbiBhbm90aGVyIHByb3RvY29sLCBvciBvdGhlcndpc2UgYnlwYXNzaW5nIERCdXNDb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2VyaWFsIHRoZSBzZXJpYWwKKyAqLwordm9pZCAKK2RidXNfbWVzc2FnZV9zZXRfc2VyaWFsIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgIHNlcmlhbCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkKTsKKworICBfZGJ1c19oZWFkZXJfc2V0X3NlcmlhbCAoJm1lc3NhZ2UtPmhlYWRlciwgc2VyaWFsKTsKK30KKworLyoqCisgKiBBZGRzIGEgY291bnRlciB0byBiZSBpbmNyZW1lbnRlZCBpbW1lZGlhdGVseSB3aXRoIHRoZSBzaXplL3VuaXggZmRzCisgKiBvZiB0aGlzIG1lc3NhZ2UsIGFuZCBkZWNyZW1lbnRlZCBieSB0aGUgc2l6ZS91bml4IGZkcyBvZiB0aGlzCisgKiBtZXNzYWdlIHdoZW4gdGhpcyBtZXNzYWdlIGlmIGZpbmFsaXplZC4gIFRoZSBsaW5rIGNvbnRhaW5zIGEKKyAqIGNvdW50ZXIgd2l0aCBpdHMgcmVmY291bnQgYWxyZWFkeSBpbmNyZW1lbnRlZCwgYnV0IHRoZSBjb3VudGVyCisgKiBpdHNlbGYgbm90IGluY3JlbWVudGVkLiAgT3duZXJzaGlwIG9mIGxpbmsgYW5kIGNvdW50ZXIgcmVmY291bnQgaXMKKyAqIHBhc3NlZCB0byB0aGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGxpbmsgbGluayB3aXRoIGNvdW50ZXIgYXMgZGF0YQorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2FkZF9jb3VudGVyX2xpbmsgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICpsaW5rKQoreworICAvKiByaWdodCBub3cgd2UgZG9uJ3QgcmVjb21wdXRlIHRoZSBkZWx0YSB3aGVuIG1lc3NhZ2UKKyAgICogc2l6ZSBjaGFuZ2VzLCBhbmQgdGhhdCdzIE9LIGZvciBjdXJyZW50IHB1cnBvc2VzCisgICAqIEkgdGhpbmssIGJ1dCBjb3VsZCBiZSBpbXBvcnRhbnQgdG8gY2hhbmdlIGxhdGVyLgorICAgKiBEbyByZWNvbXB1dGUgaXQgd2hlbmV2ZXIgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIGNvdW50ZXJzLAorICAgKiBzaW5jZSBpdCdzIGJhc2ljYWxseSBmcmVlLgorICAgKi8KKyAgaWYgKG1lc3NhZ2UtPmNvdW50ZXJzID09IE5VTEwpCisgICAgeworICAgICAgbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhID0KKyAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkgKworICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSA9IG1lc3NhZ2UtPm5fdW5peF9mZHM7CisjZW5kaWYKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJtZXNzYWdlIGhhcyBzaXplICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKKyAgICB9CisKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJm1lc3NhZ2UtPmNvdW50ZXJzLCBsaW5rKTsKKworICBfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplIChsaW5rLT5kYXRhLCBtZXNzYWdlLT5zaXplX2NvdW50ZXJfZGVsdGEpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgX2RidXNfY291bnRlcl9hZGp1c3RfdW5peF9mZCAobGluay0+ZGF0YSwgbWVzc2FnZS0+dW5peF9mZF9jb3VudGVyX2RlbHRhKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEFkZHMgYSBjb3VudGVyIHRvIGJlIGluY3JlbWVudGVkIGltbWVkaWF0ZWx5IHdpdGggdGhlIHNpemUvdW5peCBmZHMKKyAqIG9mIHRoaXMgbWVzc2FnZSwgYW5kIGRlY3JlbWVudGVkIGJ5IHRoZSBzaXplL3VuaXggZmRzIG9mIHRoaXMKKyAqIG1lc3NhZ2Ugd2hlbiB0aGlzIG1lc3NhZ2UgaWYgZmluYWxpemVkLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9hZGRfY291bnRlciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoY291bnRlcik7CisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2NvdW50ZXJfcmVmIChjb3VudGVyKTsKKyAgX2RidXNfbWVzc2FnZV9hZGRfY291bnRlcl9saW5rIChtZXNzYWdlLCBsaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgY291bnRlciB0cmFja2luZyB0aGUgc2l6ZS91bml4IGZkcyBvZiB0aGlzIG1lc3NhZ2UsIGFuZAorICogZGVjcmVtZW50cyB0aGUgY291bnRlciBieSB0aGUgc2l6ZS91bml4IGZkcyBvZiB0aGlzIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBsaW5rX3JldHVybiByZXR1cm4gdGhlIGxpbmsgdXNlZAorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9yZW1vdmVfY291bnRlciAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXIgICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgKipsaW5rX3JldHVybikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZmluZF9sYXN0ICgmbWVzc2FnZS0+Y291bnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcik7CisgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X3VubGluayAoJm1lc3NhZ2UtPmNvdW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgIGlmIChsaW5rX3JldHVybikKKyAgICAqbGlua19yZXR1cm4gPSBsaW5rOworICBlbHNlCisgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3NpemUgKGNvdW50ZXIsIC0gbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgKGNvdW50ZXIsIC0gbWVzc2FnZS0+dW5peF9mZF9jb3VudGVyX2RlbHRhKTsKKyNlbmRpZgorCisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKGNvdW50ZXIpOworfQorCisvKioKKyAqIExvY2tzIGEgbWVzc2FnZS4gQWxsb3dzIGNoZWNraW5nIHRoYXQgYXBwbGljYXRpb25zIGRvbid0IGtlZXAgYQorICogcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBpbiB0aGUgb3V0Z29pbmcgcXVldWUgYW5kIGNoYW5nZSBpdAorICogdW5kZXJuZWF0aCB1cy4gTWVzc2FnZXMgYXJlIGxvY2tlZCB3aGVuIHRoZXkgZW50ZXIgdGhlIG91dGdvaW5nCisgKiBxdWV1ZSAoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSgpKSwgYW5kIHRoZSBsaWJyYXJ5IGNvbXBsYWlucworICogaWYgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgd2hpbGUgbG9ja2VkLiBUaGlzIGZ1bmN0aW9uIG1heSBhbHNvIAorICogY2FsbGVkIGV4dGVybmFsbHksIGZvciBhcHBsaWNhdGlvbnMgd3JhcHBpbmcgRC1CdXMgaW4gYW5vdGhlciBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBsb2NrLgorICovCit2b2lkCitkYnVzX21lc3NhZ2VfbG9jayAoREJ1c01lc3NhZ2UgICptZXNzYWdlKQoreworICBpZiAoIW1lc3NhZ2UtPmxvY2tlZCkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfdXBkYXRlX2xlbmd0aHMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworCisgICAgICAvKiBtdXN0IGhhdmUgYSBzaWduYXR1cmUgaWYgeW91IGhhdmUgYSBib2R5ICovCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkgIT0gTlVMTCk7CisKKyAgICAgIG1lc3NhZ2UtPmxvY2tlZCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp2YWx1ZSkKK3sKKyAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgcmV0dXJuIF9kYnVzX2hlYWRlcl9kZWxldGVfZmllbGQgKCZtZXNzYWdlLT5oZWFkZXIsIGZpZWxkKTsKKyAgZWxzZQorICAgIHJldHVybiBfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Cit9CisKKyNpZiAwCisvKiBQcm9iYWJseSB3ZSBkb24ndCBuZWVkIHRvIHVzZSB0aGlzICovCisvKioKKyAqIFNldHMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWVzc2FnZSwgaS5lLiB0aGUgYXJndW1lbnRzIGluIHRoZQorICogbWVzc2FnZSBwYXlsb2FkLiBUaGUgc2lnbmF0dXJlIGluY2x1ZGVzIG9ubHkgImluIiBhcmd1bWVudHMgZm9yCisgKiAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgYW5kIG9ubHkgIm91dCIgYXJndW1lbnRzIGZvcgorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4sIHNvIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tCisgKiB3aGF0IHlvdSBtaWdodCBleHBlY3QgKGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUKKyAqIGVudGlyZSBDKystc3R5bGUgbWV0aG9kKS4KKyAqCisgKiBUaGUgc2lnbmF0dXJlIGlzIGEgc3RyaW5nIG1hZGUgdXAgb2YgdHlwZSBjb2RlcyBzdWNoIGFzCisgKiAjREJVU19UWVBFX0lOVDMyLiBUaGUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgd2l0aCBudWwgKG51bCBpcyBhbHNvCisgKiB0aGUgdmFsdWUgb2YgI0RCVVNfVFlQRV9JTlZBTElEKS4gVGhlIG1hY3JvcyBzdWNoIGFzCisgKiAjREJVU19UWVBFX0lOVDMyIGV2YWx1YXRlIHRvIGludGVnZXJzOyB0byBhc3NlbWJsZSBhIHNpZ25hdHVyZSB5b3UKKyAqIG1heSBmaW5kIGl0IHVzZWZ1bCB0byB1c2UgdGhlIHN0cmluZyBmb3Jtcywgc3VjaCBhcworICogI0RCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcuCisgKgorICogQW4gInVuc2V0IiBvciAjTlVMTCBzaWduYXR1cmUgaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcyBhbiBlbXB0eQorICogc2lnbmF0dXJlLiBJbiBmYWN0IGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkgd2lsbCBuZXZlciByZXR1cm4KKyAqICNOVUxMLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2Vfc2V0X3NpZ25hdHVyZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzaWduYXR1cmUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpZ25hdHVyZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfc2lnbmF0dXJlIChzaWduYXR1cmUpKTsKKyAgLyogY2FuJ3QgZGVsZXRlIHRoZSBzaWduYXR1cmUgaWYgeW91IGhhdmUgYSBtZXNzYWdlIGJvZHkgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSk7Cit9CisjZW5kaWYKKworLyogTWVzc2FnZSBDYWNoZQorICoKKyAqIFdlIGNhY2hlIHNvbWUgREJ1c01lc3NhZ2UgdG8gcmVkdWNlIHRoZSBvdmVyaGVhZCBvZiBhbGxvY2F0aW5nCisgKiB0aGVtLiAgSW4gbXkgcHJvZmlsaW5nIHRoaXMgY29uc2lzdGVudGx5IG1hZGUgYWJvdXQgYW4gOCUKKyAqIGRpZmZlcmVuY2UuICBJdCBhdm9pZHMgdGhlIG1hbGxvYyBmb3IgdGhlIG1lc3NhZ2UsIHRoZSBtYWxsb2MgZm9yCisgKiB0aGUgc2xvdCBsaXN0LCB0aGUgbWFsbG9jIGZvciB0aGUgaGVhZGVyIHN0cmluZyBhbmQgYm9keSBzdHJpbmcsCisgKiBhbmQgdGhlIGFzc29jaWF0ZWQgZnJlZSgpIGNhbGxzLiBJdCBkb2VzIGludHJvZHVjZSBhbm90aGVyIGdsb2JhbAorICogbG9jayB3aGljaCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlIGluIGNlcnRhaW4gY2FzZXMuCisgKgorICogRm9yIHRoZSBlY2hvIGNsaWVudC9zZXJ2ZXIgdGhlIHJvdW5kIHRyaXAgdGltZSBnb2VzIGZyb20gYXJvdW5kCisgKiAuMDAwMDc3IHRvIC4wMDAwNjkgd2l0aCB0aGUgbWVzc2FnZSBjYWNoZSBvbiBteSBsYXB0b3AuIFRoZSBzeXNwcm9mCisgKiBjaGFuZ2UgaXMgYXMgZm9sbG93cyAobnVtYmVycyBhcmUgY3VtdWxhdGl2ZSBwZXJjZW50YWdlKToKKyAqCisgKiAgd2l0aCBtZXNzYWdlIGNhY2hlIGltcGxlbWVudGVkIGFzIGFycmF5IGFzIGl0IGlzIG5vdyAoMC4wMDAwNjkgcGVyKToKKyAqICAgIG5ld19lbXB0eV9oZWFkZXIgICAgICAgICAgIDEuNDYKKyAqICAgICAgbXV0ZXhfbG9jayAgICAgICAgICAgICAgIDAuNTYgICAgIyBpLmUuIF9EQlVTX0xPQ0sobWVzc2FnZV9jYWNoZSkKKyAqICAgICAgbXV0ZXhfdW5sb2NrICAgICAgICAgICAgIDAuMjUKKyAqICAgICAgc2VsZiAgICAgICAgICAgICAgICAgICAgIDAuNDEKKyAqICAgIHVucmVmICAgICAgICAgICAgICAgICAgICAgIDIuMjQKKyAqICAgICAgc2VsZiAgICAgICAgICAgICAgICAgICAgIDAuNjgKKyAqICAgICAgbGlzdF9jbGVhciAgICAgICAgICAgICAgIDAuNDMKKyAqICAgICAgbXV0ZXhfbG9jayAgICAgICAgICAgICAgIDAuMzMgICAgIyBpLmUuIF9EQlVTX0xPQ0sobWVzc2FnZV9jYWNoZSkKKyAqICAgICAgbXV0ZXhfdW5sb2NrICAgICAgICAgICAgIDAuMjUKKyAqCisgKiAgd2l0aCBtZXNzYWdlIGNhY2hlIGltcGxlbWVudGVkIGFzIGxpc3QgKDAuMDAwMDcwIHBlciByb3VuZHRyaXApOgorICogICAgbmV3X2VtcHR5X2hlYWRlciAgICAgICAgICAgMi43MgorICogICAgICBsaXN0X3BvcF9maXJzdCAgICAgICAgICAgMS44OAorICogICAgdW5yZWYgICAgICAgICAgICAgICAgICAgICAgMy4zCisgKiAgICAgIGxpc3RfcHJlcGVuZCAgICAgICAgICAgICAxLjYzCisgKgorICogd2l0aG91dCBjYWNoZSAoMC4wMDAwNzcgcGVyIHJvdW5kdHJpcCk6CisgKiAgICBuZXdfZW1wdHlfaGVhZGVyICAgICAgICAgICA2LjcKKyAqICAgICAgc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIDMuNDMKKyAqICAgICAgICBkYnVzX21hbGxvYyAgICAgICAgICAgIDIuNDMKKyAqICAgICAgZGJ1c19tYWxsb2MwICAgICAgICAgICAgIDIuNTkKKyAqCisgKiAgICB1bnJlZiAgICAgICAgICAgICAgICAgICAgICA0LjAyCisgKiAgICAgIHN0cmluZ19mcmVlICAgICAgICAgICAgICAxLjgyCisgKiAgICAgICAgZGJ1c19mcmVlICAgICAgICAgICAgICAxLjYzCisgKiAgICAgIGRidXNfZnJlZSAgICAgICAgICAgICAgICAwLjcxCisgKgorICogSWYgeW91IGltcGxlbWVudCB0aGUgbWVzc2FnZV9jYWNoZSB3aXRoIGEgbGlzdCwgdGhlIHByaW1hcnkgcmVhc29uCisgKiBpdCdzIHNsb3dlciBpcyB0aGF0IHlvdSBhZGQgYW5vdGhlciB0aHJlYWQgbG9jayAob24gdGhlIERCdXNMaXN0CisgKiBtZW1wb29sKS4KKyAqLworCisvKiogQXZvaWQgY2FjaGluZyBodWdlIG1lc3NhZ2VzICovCisjZGVmaW5lIE1BWF9NRVNTQUdFX1NJWkVfVE9fQ0FDSEUgMTAgKiBfREJVU19PTkVfS0lMT0JZVEUKKworLyoqIEF2b2lkIGNhY2hpbmcgdG9vIG1hbnkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSAgICA1CisKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAobWVzc2FnZV9jYWNoZSk7CitzdGF0aWMgREJ1c01lc3NhZ2UgKm1lc3NhZ2VfY2FjaGVbTUFYX01FU1NBR0VfQ0FDSEVfU0laRV07CitzdGF0aWMgaW50IG1lc3NhZ2VfY2FjaGVfY291bnQgPSAwOworc3RhdGljIGRidXNfYm9vbF90IG1lc3NhZ2VfY2FjaGVfc2h1dGRvd25fcmVnaXN0ZXJlZCA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2NhY2hlX3NodXRkb3duICh2b2lkICpkYXRhKQoreworICBpbnQgaTsKKworICBfREJVU19MT0NLIChtZXNzYWdlX2NhY2hlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKQorICAgIHsKKyAgICAgIGlmIChtZXNzYWdlX2NhY2hlW2ldKQorICAgICAgICBkYnVzX21lc3NhZ2VfZmluYWxpemUgKG1lc3NhZ2VfY2FjaGVbaV0pOworCisgICAgICArK2k7CisgICAgfQorCisgIG1lc3NhZ2VfY2FjaGVfY291bnQgPSAwOworICBtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQgPSBGQUxTRTsKKworICBfREJVU19VTkxPQ0sgKG1lc3NhZ2VfY2FjaGUpOworfQorCisvKioKKyAqIFRyaWVzIHRvIGdldCBhIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBjYWNoZS4gIFRoZSByZXRyaWV2ZWQKKyAqIG1lc3NhZ2Ugd2lsbCBoYXZlIGp1bmsgaW4gaXQsIHNvIGl0IHN0aWxsIG5lZWRzIHRvIGJlIGNsZWFyZWQgb3V0CisgKiBpbiBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlcigpCisgKgorICogQHJldHVybnMgdGhlIG1lc3NhZ2UsIG9yICNOVUxMIGlmIG5vbmUgY2FjaGVkCisgKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9nZXRfY2FjaGVkICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgaW50IGk7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX0RCVVNfTE9DSyAobWVzc2FnZV9jYWNoZSk7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX2NvdW50ID49IDApOworCisgIGlmIChtZXNzYWdlX2NhY2hlX2NvdW50ID09IDApCisgICAgeworICAgICAgX0RCVVNfVU5MT0NLIChtZXNzYWdlX2NhY2hlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlIHVubGVzcyBjb3VudCA+IDAsIGFuZAorICAgKiBtZXNzYWdlX2NhY2hlIGlzIHVuaW5pdGlhbGl6ZWQgdW50aWwgdGhlIHNodXRkb3duIGlzCisgICAqIHJlZ2lzdGVyZWQKKyAgICovCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9jYWNoZV9zaHV0ZG93bl9yZWdpc3RlcmVkKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKQorICAgIHsKKyAgICAgIGlmIChtZXNzYWdlX2NhY2hlW2ldKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfY2FjaGVbaV07CisgICAgICAgICAgbWVzc2FnZV9jYWNoZVtpXSA9IE5VTEw7CisgICAgICAgICAgbWVzc2FnZV9jYWNoZV9jb3VudCAtPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICArK2k7CisgICAgfQorICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfY2FjaGVfY291bnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoaSA8IE1BWF9NRVNTQUdFX0NBQ0hFX1NJWkUpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5yZWZjb3VudC52YWx1ZSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5jb3VudGVycyA9PSBOVUxMKTsKKyAgCisgIF9EQlVTX1VOTE9DSyAobWVzc2FnZV9jYWNoZSk7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworc3RhdGljIHZvaWQKK2Nsb3NlX3VuaXhfZmRzKGludCAqZmRzLCB1bnNpZ25lZCAqbl9mZHMpCit7CisgIERCdXNFcnJvciBlOworICBpbnQgaTsKKworICBpZiAoKm5fZmRzIDw9IDApCisgICAgcmV0dXJuOworCisgIGRidXNfZXJyb3JfaW5pdCgmZSk7CisKKyAgZm9yIChpID0gMDsgaSA8ICpuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY2xvc2UoZmRzW2ldLCAmZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuKCJGYWlsZWQgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9yOiAlc1xuIiwgZS5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUoJmUpOworICAgICAgICB9CisgICAgfQorCisgICpuX2ZkcyA9IDA7CisKKyAgLyogV2UgZG9uJ3QgZnJlZSB0aGUgYXJyYXkgaGVyZSwgaW4gY2FzZSB3ZSBjYW4gcmVjeWNsZSBpdCBsYXRlciAqLworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitmcmVlX2NvdW50ZXIgKHZvaWQgKmVsZW1lbnQsCisgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgIERCdXNDb3VudGVyICpjb3VudGVyID0gZWxlbWVudDsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBkYXRhOworCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3NpemUgKGNvdW50ZXIsIC0gbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhKTsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19jb3VudGVyX2FkanVzdF91bml4X2ZkIChjb3VudGVyLCAtIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKKworICBfZGJ1c19jb3VudGVyX3VucmVmIChjb3VudGVyKTsKK30KKworLyoqCisgKiBUcmllcyB0byBjYWNoZSBhIG1lc3NhZ2UsIG90aGVyd2lzZSBmaW5hbGl6ZSBpdC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2NhY2hlX29yX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgZGJ1c19ib29sX3Qgd2FzX2NhY2hlZDsKKyAgaW50IGk7CisgIAorICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UtPnJlZmNvdW50LnZhbHVlID09IDApOworCisgIC8qIFRoaXMgY2FsbHMgYXBwbGljYXRpb24gY29kZSBhbmQgaGFzIHRvIGJlIGRvbmUgZmlyc3QgdGhpbmcKKyAgICogd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrCisgICAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9jbGVhciAoJm1lc3NhZ2UtPnNsb3RfbGlzdCk7CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmbWVzc2FnZS0+Y291bnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgZnJlZV9jb3VudGVyLCBtZXNzYWdlKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJm1lc3NhZ2UtPmNvdW50ZXJzKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGNsb3NlX3VuaXhfZmRzKG1lc3NhZ2UtPnVuaXhfZmRzLCAmbWVzc2FnZS0+bl91bml4X2Zkcyk7CisjZW5kaWYKKworICB3YXNfY2FjaGVkID0gRkFMU0U7CisKKyAgX0RCVVNfTE9DSyAobWVzc2FnZV9jYWNoZSk7CisKKyAgaWYgKCFtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX2NvdW50ID09IDApOworCisgICAgICBpZiAoIV9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKGRidXNfbWVzc2FnZV9jYWNoZV9zaHV0ZG93biwgTlVMTCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIG1lc3NhZ2VfY2FjaGVbaV0gPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICBtZXNzYWdlX2NhY2hlX3NodXRkb3duX3JlZ2lzdGVyZWQgPSBUUlVFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfY2FjaGVfY291bnQgPj0gMCk7CisKKyAgaWYgKChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSArCisgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSkgPgorICAgICAgTUFYX01FU1NBR0VfU0laRV9UT19DQUNIRSkKKyAgICBnb3RvIG91dDsKKworICBpZiAobWVzc2FnZV9jYWNoZV9jb3VudCA+PSBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKQorICAgIGdvdG8gb3V0OworCisgIC8qIEZpbmQgZW1wdHkgc2xvdCAqLworICBpID0gMDsKKyAgd2hpbGUgKG1lc3NhZ2VfY2FjaGVbaV0gIT0gTlVMTCkKKyAgICArK2k7CisKKyAgX2RidXNfYXNzZXJ0IChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSk7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlW2ldID09IE5VTEwpOworICBtZXNzYWdlX2NhY2hlW2ldID0gbWVzc2FnZTsKKyAgbWVzc2FnZV9jYWNoZV9jb3VudCArPSAxOworICB3YXNfY2FjaGVkID0gVFJVRTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBtZXNzYWdlLT5pbl9jYWNoZSA9IFRSVUU7CisjZW5kaWYKKworIG91dDoKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5yZWZjb3VudC52YWx1ZSA9PSAwKTsKKyAgCisgIF9EQlVTX1VOTE9DSyAobWVzc2FnZV9jYWNoZSk7CisgIAorICBpZiAoIXdhc19jYWNoZWQpCisgICAgZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChtZXNzYWdlKTsKK30KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAoREJ1c01lc3NhZ2VSZWFsSXRlciAqaXRlcikKK3sKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBpdGVyYXRvciBpcyBOVUxMXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGl0ZXItPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUikKKyAgICB7CisgICAgICBpZiAoaXRlci0+dS5yZWFkZXIuYnl0ZV9vcmRlciAhPSBpdGVyLT5tZXNzYWdlLT5ieXRlX29yZGVyKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgY2hhbmdlZCBieXRlIG9yZGVyIHNpbmNlIGl0ZXJhdG9yIHdhcyBjcmVhdGVkXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIC8qIGJlY2F1c2Ugd2Ugc3dhcCB0aGUgbWVzc2FnZSBpbnRvIGNvbXBpbGVyIG9yZGVyIHdoZW4geW91IGluaXQgYW4gaXRlciAqLworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT51LnJlYWRlci5ieXRlX29yZGVyID09IERCVVNfQ09NUElMRVJfQllURV9PUkRFUik7CisgICAgfQorICBlbHNlIGlmIChpdGVyLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpCisgICAgeworICAgICAgaWYgKGl0ZXItPnUud3JpdGVyLmJ5dGVfb3JkZXIgIT0gaXRlci0+bWVzc2FnZS0+Ynl0ZV9vcmRlcikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiZGJ1cyBtZXNzYWdlIGNoYW5nZWQgYnl0ZSBvcmRlciBzaW5jZSBhcHBlbmQgaXRlcmF0b3Igd2FzIGNyZWF0ZWRcbiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgLyogYmVjYXVzZSB3ZSBzd2FwIHRoZSBtZXNzYWdlIGludG8gY29tcGlsZXIgb3JkZXIgd2hlbiB5b3UgaW5pdCBhbiBpdGVyICovCisgICAgICBfZGJ1c19hc3NlcnQgKGl0ZXItPnUud3JpdGVyLmJ5dGVfb3JkZXIgPT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBpdGVyYXRvciBsb29rcyB1bmluaXRpYWxpemVkIG9yIGNvcnJ1cHRlZFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChpdGVyLT5jaGFuZ2VkX3N0YW1wICE9IGl0ZXItPm1lc3NhZ2UtPmNoYW5nZWRfc3RhbXApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgaXRlcmF0b3IgaW52YWxpZCBiZWNhdXNlIHRoZSBtZXNzYWdlIGhhcyBiZWVuIG1vZGlmaWVkIChvciBwZXJoYXBzIHRoZSBpdGVyYXRvciBpcyBqdXN0IHVuaW5pdGlhbGl6ZWQpXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB2YXJhcmdzIGFyZy1nZXR0aW5nIGZ1bmN0aW9ucy4KKyAqIGRidXNfbWVzc2FnZV9nZXRfYXJncygpIGlzIHRoZSBwbGFjZSB0byBnbyBmb3IgY29tcGxldGUKKyAqIGRvY3VtZW50YXRpb24uCisgKgorICogQHRvZG8gVGhpcyBtYXkgbGVhayBtZW1vcnkgYW5kIGZpbGUgZGVzY3JpcHRvcnMgaWYgcGFyc2luZyBmYWlscy4gU2VlICMyMTI1OQorICoKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX2dldF9hcmdzCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluCisgKiBAcGFyYW0gZmlyc3RfYXJnX3R5cGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQKKyAqIEBwYXJhbSB2YXJfYXJncyByZXR1cm4gbG9jYXRpb24gZm9yIGZpcnN0IGFyZ3VtZW50LCBmb2xsb3dlZCBieSBsaXN0IG9mIHR5cGUvbG9jYXRpb24gcGFpcnMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGludCBzcGVjX3R5cGUsIG1zZ190eXBlLCBpOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBzcGVjX3R5cGUgPSBmaXJzdF9hcmdfdHlwZTsKKyAgaSA9IDA7CisKKyAgd2hpbGUgKHNwZWNfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBtc2dfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlcik7CisKKyAgICAgIGlmIChtc2dfdHlwZSAhPSBzcGVjX3R5cGUpCisJeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCAlZCBpcyBzcGVjaWZpZWQgdG8gYmUgb2YgdHlwZSBcIiVzXCIsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBhY3R1YWxseSBvZiB0eXBlIFwiJXNcIlxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHNwZWNfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChtc2dfdHlwZSkpOworCisgICAgICAgICAgZ290byBvdXQ7CisJfQorCisgICAgICBpZiAoc3BlY190eXBlID09IERCVVNfVFlQRV9VTklYX0ZEKQorICAgICAgICB7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSBpZHg7CisgICAgICAgICAgaW50ICpwZmQsIG5mZDsKKworICAgICAgICAgIHBmZCA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCopOworICAgICAgICAgIF9kYnVzX2Fzc2VydChwZmQpOworCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYygmcmVhbC0+dS5yZWFkZXIsICZpZHgpOworCisgICAgICAgICAgaWYgKGlkeC51MzIgPj0gcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOQ09OU0lTVEVOVF9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgcmVmZXJzIHRvIGZpbGUgZGVzY3JpcHRvciBhdCBpbmRleCAlaSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGhhcyBvbmx5ICVpIGRlc2NyaXB0b3JzIGF0dGFjaGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeC51MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKG5mZCA9IF9kYnVzX2R1cChyZWFsLT5tZXNzYWdlLT51bml4X2Zkc1tpZHgudTMyXSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICpwZmQgPSBuZmQ7CisjZWxzZQorICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBmaWxlIGRlc2NpcHRvciBwYXNzaW5nLlxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c190eXBlX2lzX2Jhc2ljIChzcGVjX3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgKnB0cjsKKworICAgICAgICAgIHB0ciA9IHZhX2FyZyAodmFyX2FyZ3MsIERCdXNCYXNpY1ZhbHVlKik7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHB0ciAhPSBOVUxMKTsKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzcGVjX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVsZW1lbnRfdHlwZTsKKyAgICAgICAgICBpbnQgc3BlY19lbGVtZW50X3R5cGU7CisgICAgICAgICAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKipwdHI7CisgICAgICAgICAgaW50ICpuX2VsZW1lbnRzX3A7CisgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgYXJyYXk7CisKKyAgICAgICAgICBzcGVjX2VsZW1lbnRfdHlwZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCk7CisgICAgICAgICAgZWxlbWVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKTsKKworICAgICAgICAgIGlmIChzcGVjX2VsZW1lbnRfdHlwZSAhPSBlbGVtZW50X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgJWQgaXMgc3BlY2lmaWVkIHRvIGJlIGFuIGFycmF5IG9mIFwiJXNcIiwgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBhY3R1YWxseSBhbiBhcnJheSBvZiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHNwZWNfZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpKTsKKworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKHNwZWNfZWxlbWVudF90eXBlKSAmJgorICAgICAgICAgICAgICBlbGVtZW50X3R5cGUgIT0gREJVU19UWVBFX1VOSVhfRkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHB0ciA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzX3AgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQqKTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHB0ciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzX3AgIT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgcHRyLCBuX2VsZW1lbnRzX3ApOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHNwZWNfZWxlbWVudF90eXBlID09IERCVVNfVFlQRV9TVFJJTkcgfHwKKyAgICAgICAgICAgICAgICAgICBzcGVjX2VsZW1lbnRfdHlwZSA9PSBEQlVTX1RZUEVfU0lHTkFUVVJFIHx8CisgICAgICAgICAgICAgICAgICAgc3BlY19lbGVtZW50X3R5cGUgPT0gREJVU19UWVBFX09CSkVDVF9QQVRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICoqKnN0cl9hcnJheV9wOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKyAgICAgICAgICAgICAgY2hhciAqKnN0cl9hcnJheTsKKworICAgICAgICAgICAgICBzdHJfYXJyYXlfcCA9IHZhX2FyZyAodmFyX2FyZ3MsIGNoYXIqKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzX3AgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQqKTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHN0cl9hcnJheV9wICE9IE5VTEwpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHNfcCAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAvKiBDb3VudCBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKi8KKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIG5fZWxlbWVudHMgPSAwOworICAgICAgICAgICAgICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICArK25fZWxlbWVudHM7CisgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzdHJfYXJyYXkgPSBkYnVzX25ldzAgKGNoYXIqLCBuX2VsZW1lbnRzICsgMSk7CisgICAgICAgICAgICAgIGlmIChzdHJfYXJyYXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogTm93IGdvIHRocm91Z2ggYW5kIGR1cCBlYWNoIHN0cmluZyAqLworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhbC0+dS5yZWFkZXIsICZhcnJheSk7CisKKyAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgIHdoaWxlIChpIDwgbl9lbGVtZW50cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnMpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBzdHJfYXJyYXlbaV0gPSBfZGJ1c19zdHJkdXAgKHMpOworICAgICAgICAgICAgICAgICAgaWYgKHN0cl9hcnJheVtpXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc3RyX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSkpCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoaSA9PSBuX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpID09IERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChpID09IG5fZWxlbWVudHMpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHN0cl9hcnJheVtpXSA9PSBOVUxMKTsKKworICAgICAgICAgICAgICAqc3RyX2FycmF5X3AgPSBzdHJfYXJyYXk7CisgICAgICAgICAgICAgICpuX2VsZW1lbnRzX3AgPSBuX2VsZW1lbnRzOworICAgICAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgieW91IGNhbid0IHJlYWQgYXJyYXlzIG9mIGNvbnRhaW5lciB0eXBlcyAoc3RydWN0LCB2YXJpYW50LCBhcnJheSkgd2l0aCAlcyBmb3Igbm93XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgieW91IGNhbiBvbmx5IHJlYWQgYXJyYXlzIGFuZCBiYXNpYyB0eXBlcyB3aXRoICVzIGZvciBub3dcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICBzcGVjX3R5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhbC0+dS5yZWFkZXIpICYmIHNwZWNfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGhhcyBvbmx5ICVkIGFyZ3VtZW50cywgYnV0IG1vcmUgd2VyZSBleHBlY3RlZCIsIGkpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2UKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgTWVzc2FnZSB0byBiZSBzZW50IG9yIHJlY2VpdmVkIG92ZXIgYSAjREJ1c0Nvbm5lY3Rpb24uCisgKgorICogQSBEQnVzTWVzc2FnZSBpcyB0aGUgbW9zdCBiYXNpYyB1bml0IG9mIGNvbW11bmljYXRpb24gb3ZlciBhCisgKiBEQnVzQ29ubmVjdGlvbi4gQSBEQnVzQ29ubmVjdGlvbiByZXByZXNlbnRzIGEgc3RyZWFtIG9mIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIGFwcGxpY2F0aW9uLCBhbmQgYSBzdHJlYW0gb2YgbWVzc2FnZXMKKyAqIHNlbnQgdG8gYSByZW1vdGUgYXBwbGljYXRpb24uCisgKgorICogQSBtZXNzYWdlIGhhcyBhIG1lc3NhZ2UgdHlwZSwgcmV0dXJuZWQgZnJvbQorICogZGJ1c19tZXNzYWdlX2dldF90eXBlKCkuICBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEKKyAqIG1ldGhvZCBjYWxsLCBhIHJlcGx5IHRvIGEgbWV0aG9kIGNhbGwsIGEgc2lnbmFsLCBvciBhbiBlcnJvciByZXBseS4KKyAqCisgKiBBIG1lc3NhZ2UgaGFzIGhlYWRlciBmaWVsZHMgc3VjaCBhcyB0aGUgc2VuZGVyLCBkZXN0aW5hdGlvbiwgbWV0aG9kCisgKiBvciBzaWduYWwgbmFtZSwgYW5kIHNvIGZvcnRoLiBEQnVzTWVzc2FnZSBoYXMgYWNjZXNzb3IgZnVuY3Rpb25zIGZvcgorICogdGhlc2UsIHN1Y2ggYXMgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIoKS4KKyAqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsKCksIGRidXNfbWVzc2FnZV9pc19zaWduYWwoKSwKKyAqIGFuZCBkYnVzX21lc3NhZ2VfaXNfZXJyb3IoKSBjaGVjayBzZXZlcmFsIGhlYWRlciBmaWVsZHMgYXQgb25jZSBhbmQgYXJlCisgKiBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0aGFuIGNoZWNraW5nIHRoZSBoZWFkZXIgZmllbGRzIHdpdGggaW5kaXZpZHVhbAorICogYWNjZXNzb3IgZnVuY3Rpb25zLgorICoKKyAqIEZpbmFsbHksIGEgbWVzc2FnZSBoYXMgYXJndW1lbnRzLiBUaGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMKKyAqIGFyZSBpbiB0aGUgbWVzc2FnZSdzIHNpZ25hdHVyZSBoZWFkZXIgZmllbGQgKGFjY2Vzc2VkIHdpdGgKKyAqIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkpLiAgU2ltcGxlIGFyZ3VtZW50IHZhbHVlcyBhcmUgdXN1YWxseQorICogcmV0cmlldmVkIHdpdGggZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkgYnV0IG1vcmUgY29tcGxleCB2YWx1ZXMgc3VjaAorICogYXMgc3RydWN0cyBtYXkgcmVxdWlyZSB0aGUgdXNlIG9mICNEQnVzTWVzc2FnZUl0ZXIuCisgKgorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZ29lcyBpbnRvIHNvbWUgbW9yZSBkZXRhaWwgYWJvdXQgaGVhZGVyIGZpZWxkcyBhbmQKKyAqIG1lc3NhZ2UgdHlwZXMuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVzc2FnZQorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9yIHRvIGJlCisgKiBzZW50IHRvIGFub3RoZXIgYXBwbGljYXRpb24uCisgKi8KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgb2YgYSBtZXNzYWdlIG9yIDAgaWYgbm9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCisgKiBUaGUgbWVzc2FnZSdzIHNlcmlhbCBudW1iZXIgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHNlbmRpbmcKKyAqIHRoZSBtZXNzYWdlIGFuZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlcGxpZXMgdG8gdGhpcyBtZXNzYWdlLgorICoKKyAqIEFsbCBtZXNzYWdlcyByZWNlaXZlZCBvbiBhIGNvbm5lY3Rpb24gd2lsbCBoYXZlIGEgc2VyaWFsIHByb3ZpZGVkCisgKiBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uLgorICoKKyAqIEZvciBtZXNzYWdlcyB5b3UncmUgc2VuZGluZywgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSB3aWxsIGFzc2lnbiBhCisgKiBzZXJpYWwgYW5kIHJldHVybiBpdCB0byB5b3UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBzZXJpYWwKKyAqLworZGJ1c191aW50MzJfdAorZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgMCk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfc2VyaWFsICgmbWVzc2FnZS0+aGVhZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSByZXBseSBzZXJpYWwgb2YgYSBtZXNzYWdlICh0aGUgc2VyaWFsIG9mIHRoZSBtZXNzYWdlIHRoaXMKKyAqIGlzIGEgcmVwbHkgdG8pLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gcmVwbHlfc2VyaWFsIHRoZSBzZXJpYWwgd2UncmUgcmVwbHlpbmcgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgcmVwbHlfc2VyaWFsKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXBseV9zZXJpYWwgIT0gMCwgRkFMU0UpOyAvKiAwIGlzIGludmFsaWQgKi8KKworICByZXR1cm4gX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlfc2VyaWFsKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBhIHJlcGx5IHRvIG9yIDAgaWYgbm9uZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHJlcGx5IHNlcmlhbAorICovCitkYnVzX3VpbnQzMl90CitkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCAwKTsKKworICBpZiAoX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpKQorICAgIHJldHVybiB2X1VJTlQzMjsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5yZWZjb3VudC52YWx1ZSA9PSAwKTsKKworICAvKiBUaGlzIGNhbGxzIGFwcGxpY2F0aW9uIGNhbGxiYWNrcyEgKi8KKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoJm1lc3NhZ2UtPnNsb3RfbGlzdCk7CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmbWVzc2FnZS0+Y291bnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgZnJlZV9jb3VudGVyLCBtZXNzYWdlKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJm1lc3NhZ2UtPmNvdW50ZXJzKTsKKworICBfZGJ1c19oZWFkZXJfZnJlZSAoJm1lc3NhZ2UtPmhlYWRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmbWVzc2FnZS0+Ym9keSk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBjbG9zZV91bml4X2ZkcyhtZXNzYWdlLT51bml4X2ZkcywgJm1lc3NhZ2UtPm5fdW5peF9mZHMpOworICBkYnVzX2ZyZWUobWVzc2FnZS0+dW5peF9mZHMpOworI2VuZGlmCisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5yZWZjb3VudC52YWx1ZSA9PSAwKTsKKyAgCisgIGRidXNfZnJlZSAobWVzc2FnZSk7Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgZnJvbV9jYWNoZTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQgKCk7CisKKyAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcm9tX2NhY2hlID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcm9tX2NhY2hlID0gRkFMU0U7CisgICAgICBtZXNzYWdlID0gZGJ1c19uZXcgKERCdXNNZXNzYWdlLCAxKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBtZXNzYWdlLT5nZW5lcmF0aW9uID0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgbWVzc2FnZS0+dW5peF9mZHMgPSBOVUxMOworICAgICAgbWVzc2FnZS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSAwOworI2VuZGlmCisgICAgfQorICAKKyAgbWVzc2FnZS0+cmVmY291bnQudmFsdWUgPSAxOworICBtZXNzYWdlLT5ieXRlX29yZGVyID0gREJVU19DT01QSUxFUl9CWVRFX09SREVSOworICBtZXNzYWdlLT5sb2NrZWQgPSBGQUxTRTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBtZXNzYWdlLT5pbl9jYWNoZSA9IEZBTFNFOworI2VuZGlmCisgIG1lc3NhZ2UtPmNvdW50ZXJzID0gTlVMTDsKKyAgbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhID0gMDsKKyAgbWVzc2FnZS0+Y2hhbmdlZF9zdGFtcCA9IDA7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBtZXNzYWdlLT5uX3VuaXhfZmRzID0gMDsKKyAgbWVzc2FnZS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSAwOworICBtZXNzYWdlLT51bml4X2ZkX2NvdW50ZXJfZGVsdGEgPSAwOworI2VuZGlmCisKKyAgaWYgKCFmcm9tX2NhY2hlKQorICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKCZtZXNzYWdlLT5zbG90X2xpc3QpOworCisgIGlmIChmcm9tX2NhY2hlKQorICAgIHsKKyAgICAgIF9kYnVzX2hlYWRlcl9yZWluaXQgKCZtZXNzYWdlLT5oZWFkZXIsIG1lc3NhZ2UtPmJ5dGVfb3JkZXIpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5LCAwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9pbml0ICgmbWVzc2FnZS0+aGVhZGVyLCBtZXNzYWdlLT5ieXRlX29yZGVyKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAobWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZtZXNzYWdlLT5ib2R5LCAzMikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oZWFkZXJfZnJlZSAoJm1lc3NhZ2UtPmhlYWRlcik7CisgICAgICAgICAgZGJ1c19mcmVlIChtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZS4KKyAqIFR5cGVzIGluY2x1ZGUgI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLAorICogI0RCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCwgYW5kIHNvIGZvcnRoLgorICoKKyAqIFVzdWFsbHkgeW91IHdhbnQgdG8gdXNlIGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwoKSwKKyAqIGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybigpLCBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCgpLAorICogb3IgZGJ1c19tZXNzYWdlX25ld19lcnJvcigpIGluc3RlYWQuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlX3R5cGUgdHlwZSBvZiBtZXNzYWdlCisgKiBAcmV0dXJucyBuZXcgbWVzc2FnZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfbmV3IChpbnQgbWVzc2FnZV90eXBlKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2VfdHlwZSAhPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElELCBOVUxMKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKCk7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY3JlYXRlICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcgbWVzc2FnZSB0byBpbnZva2UgYSBtZXRob2Qgb24gYSByZW1vdGUKKyAqIG9iamVjdC4gUmV0dXJucyAjTlVMTCBpZiBtZW1vcnkgY2FuJ3QgYmUgYWxsb2NhdGVkIGZvciB0aGUKKyAqIG1lc3NhZ2UuIFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgI05VTEwgaW4gd2hpY2ggY2FzZSBubyBkZXN0aW5hdGlvbgorICogaXMgc2V0OyB0aGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgRC1CdXMgaW4gYSBwZWVyLXRvLXBlZXIKKyAqIGNvbnRleHQgKG5vIG1lc3NhZ2UgYnVzKS4gVGhlIGludGVyZmFjZSBtYXkgYmUgI05VTEwsIHdoaWNoIG1lYW5zCisgKiB0aGF0IGlmIG11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdCBpdCBpcyB1bmRlZmluZWQKKyAqIHdoaWNoIG9uZSB3aWxsIGJlIGludm9rZWQuCisgKgorICogVGhlIHBhdGggYW5kIG1ldGhvZCBuYW1lcyBtYXkgbm90IGJlICNOVUxMLgorICoKKyAqIERlc3RpbmF0aW9uLCBwYXRoLCBpbnRlcmZhY2UsIGFuZCBtZXRob2QgbmFtZSBjYW4ndCBjb250YWluCisgKiBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzIChzZWUgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24pLgorICogCisgKiBAcGFyYW0gZGVzdGluYXRpb24gbmFtZSB0aGF0IHRoZSBtZXNzYWdlIHNob3VsZCBiZSBzZW50IHRvIG9yICNOVUxMCisgKiBAcGFyYW0gcGF0aCBvYmplY3QgcGF0aCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2VudCB0bworICogQHBhcmFtIGludGVyZmFjZSBpbnRlcmZhY2UgdG8gaW52b2tlIG1ldGhvZCBvbiwgb3IgI05VTEwKKyAqIEBwYXJhbSBtZXRob2QgbWV0aG9kIHRvIGludm9rZQorICoKKyAqIEByZXR1cm5zIGEgbmV3IERCdXNNZXNzYWdlLCBmcmVlIHdpdGggZGJ1c19tZXNzYWdlX3VucmVmKCkKKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChjb25zdCBjaGFyICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXRob2QgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGVzdGluYXRpb24gPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChkZXN0aW5hdGlvbiksIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKHBhdGgpLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbnRlcmZhY2UgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2ludGVyZmFjZSAoaW50ZXJmYWNlKSwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyIChtZXRob2QpLCBOVUxMKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKCk7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY3JlYXRlICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLCBwYXRoLCBpbnRlcmZhY2UsIG1ldGhvZCwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gbWVzc2FnZTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbWVzc2FnZSB0aGF0IGlzIGEgcmVwbHkgdG8gYSBtZXRob2QgY2FsbC4gUmV0dXJucworICogI05VTEwgaWYgbWVtb3J5IGNhbid0IGJlIGFsbG9jYXRlZCBmb3IgdGhlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIG1ldGhvZF9jYWxsIHRoZSBtZXNzYWdlIGJlaW5nIHJlcGxpZWQgdG8KKyAqIEByZXR1cm5zIGEgbmV3IERCdXNNZXNzYWdlLCBmcmVlIHdpdGggZGJ1c19tZXNzYWdlX3VucmVmKCkKKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKERCdXNNZXNzYWdlICptZXRob2RfY2FsbCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IGNoYXIgKnNlbmRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1ldGhvZF9jYWxsICE9IE5VTEwsIE5VTEwpOworCisgIHNlbmRlciA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXRob2RfY2FsbCk7CisKKyAgLyogc2VuZGVyIGlzIGFsbG93ZWQgdG8gYmUgbnVsbCBoZXJlIGluIHBlZXItdG8tcGVlciBjYXNlICovCisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWV0aG9kX2NhbGwpKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBzaWduYWwgZW1pc3Npb24uIFJldHVybnMKKyAqICNOVUxMIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBtZXNzYWdlLiAgQSBzaWduYWwgaXMKKyAqIGlkZW50aWZpZWQgYnkgaXRzIG9yaWdpbmF0aW5nIG9iamVjdCBwYXRoLCBpbnRlcmZhY2UsIGFuZCB0aGUgbmFtZQorICogb2YgdGhlIHNpZ25hbC4KKyAqCisgKiBQYXRoLCBpbnRlcmZhY2UsIGFuZCBzaWduYWwgbmFtZSBtdXN0IGFsbCBiZSB2YWxpZCAodGhlIEQtQnVzCisgKiBzcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlIHN5bnRheCBvZiB0aGVzZSBmaWVsZHMpLgorICogCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgb2JqZWN0IGVtaXR0aW5nIHRoZSBzaWduYWwKKyAqIEBwYXJhbSBpbnRlcmZhY2UgdGhlIGludGVyZmFjZSB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQgZnJvbQorICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgc2lnbmFsCisgKiBAcmV0dXJucyBhIG5ldyBEQnVzTWVzc2FnZSwgZnJlZSB3aXRoIGRidXNfbWVzc2FnZV91bnJlZigpCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbnRlcmZhY2UgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9wYXRoIChwYXRoKSwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfaW50ZXJmYWNlIChpbnRlcmZhY2UpLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9tZW1iZXIgKG5hbWUpLCBOVUxMKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKCk7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY3JlYXRlICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBwYXRoLCBpbnRlcmZhY2UsIG5hbWUsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIHRoYXQgaXMgYW4gZXJyb3IgcmVwbHkgdG8gYW5vdGhlciBtZXNzYWdlLgorICogRXJyb3IgcmVwbGllcyBhcmUgbW9zdCBjb21tb24gaW4gcmVzcG9uc2UgdG8gbWV0aG9kIGNhbGxzLCBidXQKKyAqIGNhbiBiZSByZXR1cm5lZCBpbiByZXBseSB0byBhbnkgbWVzc2FnZS4KKyAqCisgKiBUaGUgZXJyb3IgbmFtZSBtdXN0IGJlIGEgdmFsaWQgZXJyb3IgbmFtZSBhY2NvcmRpbmcgdG8gdGhlIHN5bnRheAorICogZ2l2ZW4gaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uIElmIHlvdSBkb24ndCB3YW50IHRvIG1ha2UKKyAqIHVwIGFuIGVycm9yIG5hbWUganVzdCB1c2UgI0RCVVNfRVJST1JfRkFJTEVELgorICoKKyAqIEBwYXJhbSByZXBseV90byB0aGUgbWVzc2FnZSB3ZSdyZSByZXBseWluZyB0bworICogQHBhcmFtIGVycm9yX25hbWUgdGhlIGVycm9yIG5hbWUKKyAqIEBwYXJhbSBlcnJvcl9tZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlIHN0cmluZyAob3IgI05VTEwgZm9yIG5vbmUsIGJ1dCBwbGVhc2UgZ2l2ZSBhIG1lc3NhZ2UpCisgKiBAcmV0dXJucyBhIG5ldyBlcnJvciBtZXNzYWdlIG9iamVjdCwgZnJlZSB3aXRoIGRidXNfbWVzc2FnZV91bnJlZigpCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19lcnJvciAoREJ1c01lc3NhZ2UgKnJlcGx5X3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IGNoYXIgKnNlbmRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXBseV90byAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvcl9uYW1lICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2Vycm9yX25hbWUgKGVycm9yX25hbWUpLCBOVUxMKTsKKworICBzZW5kZXIgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAocmVwbHlfdG8pOworCisgIC8qIHNlbmRlciBtYXkgYmUgTlVMTCBmb3Igbm9uLW1lc3NhZ2UtYnVzIGNhc2Ugb3IKKyAgICogd2hlbiB0aGUgbWVzc2FnZSBidXMgaXMgZGVhbGluZyB3aXRoIGFuIHVucmVnaXN0ZXJlZAorICAgKiBjb25uZWN0aW9uLgorICAgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIE5VTEwsIE5VTEwsIE5VTEwsIGVycm9yX25hbWUpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgVFJVRSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKHJlcGx5X3RvKSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoZXJyb3JfbWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSB0aGF0IGlzIGFuIGVycm9yIHJlcGx5IHRvIGFub3RoZXIgbWVzc2FnZSwgYWxsb3dpbmcKKyAqIHlvdSB0byB1c2UgcHJpbnRmIGZvcm1hdHRpbmcuCisgKgorICogU2VlIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IoKSBmb3IgZGV0YWlscyAtIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUKKyAqIGFzaWRlIGZyb20gdGhlIHByaW50ZiBmb3JtYXR0aW5nLgorICoKKyAqIEB0b2RvIGFkZCBfREJVU19HTlVDX1BSSU5URiB0byB0aGlzIChyZXF1aXJlcyBtb3ZpbmcgX0RCVVNfR05VQ19QUklOVEYgdG8KKyAqIHB1YmxpYyBoZWFkZXIsIHNlZSBEQlVTX0RFUFJFQ0FURUQgZm9yIGFuIGV4YW1wbGUpCisgKiAKKyAqIEBwYXJhbSByZXBseV90byB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICogQHBhcmFtIGVycm9yX25hbWUgdGhlIGVycm9yIG5hbWUKKyAqIEBwYXJhbSBlcnJvcl9mb3JtYXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9ybWF0IGFzIHdpdGggcHJpbnRmCisgKiBAcGFyYW0gLi4uIGZvcm1hdCBzdHJpbmcgYXJndW1lbnRzCisgKiBAcmV0dXJucyBhIG5ldyBlcnJvciBtZXNzYWdlCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19lcnJvcl9wcmludGYgKERCdXNNZXNzYWdlICpyZXBseV90bywKKwkJCSAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfZm9ybWF0LAorCQkJICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBEQnVzU3RyaW5nIHN0cjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXBseV90byAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvcl9uYW1lICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2Vycm9yX25hbWUgKGVycm9yX25hbWUpLCBOVUxMKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICB2YV9zdGFydCAoYXJncywgZXJyb3JfZm9ybWF0KTsKKworICBpZiAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICgmc3RyLCBlcnJvcl9mb3JtYXQsIGFyZ3MpKQorICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChyZXBseV90bywgZXJyb3JfbmFtZSwKKwkJCQkgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKTsKKyAgZWxzZQorICAgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICB2YV9lbmQgKGFyZ3MpOworCisgIHJldHVybiBtZXNzYWdlOworfQorCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIHRoYXQgaXMgYW4gZXhhY3QgcmVwbGljYSBvZiB0aGUgbWVzc2FnZQorICogc3BlY2lmaWVkLCBleGNlcHQgdGhhdCBpdHMgcmVmY291bnQgaXMgc2V0IHRvIDEsIGl0cyBtZXNzYWdlIHNlcmlhbAorICogaXMgcmVzZXQgdG8gMCwgYW5kIGlmIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHdhcyAibG9ja2VkIiAoaW4gdGhlCisgKiBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlIGFuZCB0aHVzIG5vdCBtb2RpZmlhYmxlKSB0aGUgbmV3IG1lc3NhZ2UKKyAqIHdpbGwgbm90IGJlIGxvY2tlZC4KKyAqCisgKiBAdG9kbyBUaGlzIGZ1bmN0aW9uIGNhbid0IGJlIHVzZWQgaW4gcHJvZ3JhbXMgdGhhdCB0cnkgdG8gcmVjb3ZlciBmcm9tIE9PTSBlcnJvcnMuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBuZXcgbWVzc2FnZS5vciAjTlVMTCBpZiBub3QgZW5vdWdoIG1lbW9yeSBvciBVbml4IGZpbGUgZGVzY3JpcHRvcnMgKGluIGNhc2UgdGhlIG1lc3NhZ2UgdG8gY29weSBpbmNsdWRlcyBVbml4IGZpbGUgZGVzY3JpcHRvcnMpIGNhbiBiZSBhbGxvY2F0ZWQuCisgKi8KK0RCdXNNZXNzYWdlICoKK2RidXNfbWVzc2FnZV9jb3B5IChjb25zdCBEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2UgKnJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgcmV0dmFsID0gZGJ1c19uZXcwIChEQnVzTWVzc2FnZSwgMSk7CisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR2YWwtPnJlZmNvdW50LnZhbHVlID0gMTsKKyAgcmV0dmFsLT5ieXRlX29yZGVyID0gbWVzc2FnZS0+Ynl0ZV9vcmRlcjsKKyAgcmV0dmFsLT5sb2NrZWQgPSBGQUxTRTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICByZXR2YWwtPmdlbmVyYXRpb24gPSBtZXNzYWdlLT5nZW5lcmF0aW9uOworI2VuZGlmCisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfY29weSAoJm1lc3NhZ2UtPmhlYWRlciwgJnJldHZhbC0+aGVhZGVyKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHJldHZhbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZyZXR2YWwtPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKSkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfZnJlZSAoJnJldHZhbC0+aGVhZGVyKTsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmbWVzc2FnZS0+Ym9keSwgMCwKKwkJCSAgJnJldHZhbC0+Ym9keSwgMCkpCisgICAgZ290byBmYWlsZWRfY29weTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHJldHZhbC0+dW5peF9mZHMgPSBkYnVzX25ldyhpbnQsIG1lc3NhZ2UtPm5fdW5peF9mZHMpOworICBpZiAocmV0dmFsLT51bml4X2ZkcyA9PSBOVUxMICYmIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwKQorICAgIGdvdG8gZmFpbGVkX2NvcHk7CisKKyAgcmV0dmFsLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA9IG1lc3NhZ2UtPm5fdW5peF9mZHM7CisKKyAgZm9yIChyZXR2YWwtPm5fdW5peF9mZHMgPSAwOworICAgICAgIHJldHZhbC0+bl91bml4X2ZkcyA8IG1lc3NhZ2UtPm5fdW5peF9mZHM7CisgICAgICAgcmV0dmFsLT5uX3VuaXhfZmRzKyspCisgICAgeworICAgICAgcmV0dmFsLT51bml4X2Zkc1tyZXR2YWwtPm5fdW5peF9mZHNdID0gX2RidXNfZHVwKG1lc3NhZ2UtPnVuaXhfZmRzW3JldHZhbC0+bl91bml4X2Zkc10sIE5VTEwpOworCisgICAgICBpZiAocmV0dmFsLT51bml4X2Zkc1tyZXR2YWwtPm5fdW5peF9mZHNdIDwgMCkKKyAgICAgICAgZ290byBmYWlsZWRfY29weTsKKyAgICB9CisKKyNlbmRpZgorCisgIHJldHVybiByZXR2YWw7CisKKyBmYWlsZWRfY29weToKKyAgX2RidXNfaGVhZGVyX2ZyZWUgKCZyZXR2YWwtPmhlYWRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0dmFsLT5ib2R5KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGNsb3NlX3VuaXhfZmRzKHJldHZhbC0+dW5peF9mZHMsICZyZXR2YWwtPm5fdW5peF9mZHMpOworICBkYnVzX2ZyZWUocmV0dmFsLT51bml4X2Zkcyk7CisjZW5kaWYKKworICBkYnVzX2ZyZWUgKHJldHZhbCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzTWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG1lc3NhZ2UKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX3VucmVmCisgKi8KK0RCdXNNZXNzYWdlICoKK2RidXNfbWVzc2FnZV9yZWYgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmluX2NhY2hlLCBOVUxMKTsKKyAgCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID49IDEpOworCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNNZXNzYWdlLCBmcmVlaW5nIHRoZQorICogbWVzc2FnZSBpZiB0aGUgY291bnQgcmVhY2hlcyAwLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAc2VlIGRidXNfbWVzc2FnZV9yZWYKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX3VucmVmIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZS0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoIW1lc3NhZ2UtPmluX2NhY2hlKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmbWVzc2FnZS0+cmVmY291bnQpOworCisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID49IDApOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICAvKiBDYWxscyBhcHBsaWNhdGlvbiBjYWxsYmFja3MhICovCisgICAgICBkYnVzX21lc3NhZ2VfY2FjaGVfb3JfZmluYWxpemUgKG1lc3NhZ2UpOworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSB0eXBlIG9mIGEgbWVzc2FnZS4gVHlwZXMgaW5jbHVkZQorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLCAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiwKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiwgI0RCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCwgYnV0IG90aGVyCisgKiB0eXBlcyBhcmUgYWxsb3dlZCBhbmQgYWxsIGNvZGUgbXVzdCBzaWxlbnRseSBpZ25vcmUgbWVzc2FnZXMgb2YKKyAqIHVua25vd24gdHlwZS4gI0RCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgd2lsbCBuZXZlciBiZSByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UKKyAqLworaW50CitkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfbWVzc2FnZV90eXBlICgmbWVzc2FnZS0+aGVhZGVyKTsKK30KKworLyoqCisgKiBBcHBlbmRzIGZpZWxkcyB0byBhIG1lc3NhZ2UgZ2l2ZW4gYSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiBUaGUKKyAqIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3Qgc2hvdWxkIGNvbnRhaW4gdGhlIHR5cGUgb2YgZWFjaCBhcmd1bWVudAorICogZm9sbG93ZWQgYnkgdGhlIHZhbHVlIHRvIGFwcGVuZC4gQXBwZW5kYWJsZSB0eXBlcyBhcmUgYmFzaWMgdHlwZXMsCisgKiBhbmQgYXJyYXlzIG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB0eXBlcyAoZXhjZXB0IGFycmF5cyBvZiBVbml4IGZpbGUKKyAqIGRlc2NyaXB0b3JzKS4gVG8gYXBwZW5kIHZhcmlhYmxlLWxlbmd0aCBiYXNpYyB0eXBlcywgb3IgYW55IG1vcmUKKyAqIGNvbXBsZXggdmFsdWUsIHlvdSBoYXZlIHRvIHVzZSBhbiBpdGVyYXRvciByYXRoZXIgdGhhbiB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBUbyBhcHBlbmQgYSBiYXNpYyB0eXBlLCBzcGVjaWZ5IGl0cyB0eXBlIGNvZGUgZm9sbG93ZWQgYnkgdGhlCisgKiBhZGRyZXNzIG9mIHRoZSB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgKgorICogQGNvZGUKKyAqCisgKiBkYnVzX2ludDMyX3Qgdl9JTlQzMiA9IDQyOworICogY29uc3QgY2hhciAqdl9TVFJJTkcgPSAiSGVsbG8gV29ybGQiOworICogZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAqIEBlbmRjb2RlCisgKgorICogVG8gYXBwZW5kIGFuIGFycmF5IG9mIGZpeGVkLWxlbmd0aCBiYXNpYyB0eXBlcyAoZXhjZXB0IFVuaXggZmlsZQorICogZGVzY3JpcHRvcnMpLCBwYXNzIGluIHRoZSBEQlVTX1RZUEVfQVJSQVkgdHlwZWNvZGUsIHRoZSBlbGVtZW50CisgKiB0eXBlY29kZSwgdGhlIGFkZHJlc3Mgb2YgdGhlIGFycmF5IHBvaW50ZXIsIGFuZCBhIDMyLWJpdCBpbnRlZ2VyCisgKiBnaXZpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuIFNvIGZvciBleGFtcGxlOiBAY29kZQorICogY29uc3QgZGJ1c19pbnQzMl90IGFycmF5W10gPSB7IDEsIDIsIDMgfTsgY29uc3QgZGJ1c19pbnQzMl90CisgKiAqdl9BUlJBWSA9IGFycmF5OyBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgKiBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9JTlQzMiwgJnZfQVJSQVksIDMsIERCVVNfVFlQRV9JTlZBTElEKTsKKyAqIEBlbmRjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFycmF5cyBvZiBVbml4IGZpbGUgZGVzY3JpcHRvcnMuIElmCisgKiB5b3UgbmVlZCB0aG9zZSB5b3UgbmVlZCB0byBtYW51YWxseSByZWN1cnNlIGludG8gdGhlIGFycmF5LgorICoKKyAqIEZvciBVbml4IGZpbGUgZGVzY3JpcHRvcnMgdGhpcyBmdW5jdGlvbiB3aWxsIGludGVybmFsbHkgZHVwbGljYXRlCisgKiB0aGUgZGVzY3JpcHRvciB5b3UgcGFzc2VkIGluLiBIZW5jZSB5b3UgbWF5IGNsb3NlIHRoZSBkZXNjcmlwdG9yCisgKiBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGNhbGwuCisgKgorICogQHdhcm5pbmcgaW4gQywgZ2l2ZW4gImludCBhcnJheVtdIiwgIiZhcnJheSA9PSBhcnJheSIgKHRoZQorICogY29tcC5sYW5nLmMgRkFRIHNheXMgb3RoZXJ3aXNlLCBidXQgZ2NjIGFuZCB0aGUgRkFRIGRvbid0IGFncmVlKS4KKyAqIFNvIGlmIHlvdSdyZSB1c2luZyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgcG9pbnRlciB5b3UgaGF2ZSB0byBjcmVhdGUKKyAqIGEgcG9pbnRlciB2YXJpYWJsZSwgYXNzaWduIHRoZSBhcnJheSB0byBpdCwgdGhlbiB0YWtlIHRoZSBhZGRyZXNzCisgKiBvZiB0aGUgcG9pbnRlciB2YXJpYWJsZS4gRm9yIHN0cmluZ3MgaXQgd29ya3MgdG8gd3JpdGUKKyAqIGNvbnN0IGNoYXIgKmFycmF5ID0gIkhlbGxvIiBhbmQgdGhlbiB1c2UgJmFycmF5IHRob3VnaC4KKyAqCisgKiBUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgI0RCVVNfVFlQRV9JTlZBTElELAorICogbWFya2luZyB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudCBsaXN0LiBJZiB5b3UgZG9uJ3QgZG8gdGhpcworICogdGhlbiBsaWJkYnVzIHdvbid0IGtub3cgdG8gc3RvcCBhbmQgd2lsbCByZWFkIGludmFsaWQgbWVtb3J5LgorICoKKyAqIFN0cmluZy9zaWduYXR1cmUvcGF0aCBhcnJheXMgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyAiY29uc3QgY2hhcioqKgorICogYWRkcmVzc19vZl9hcnJheSIgYW5kICJpbnQgbl9lbGVtZW50cyIKKyAqCisgKiBAdG9kbyBzdXBwb3J0IERCVVNfVFlQRV9TVFJVQ1QgYW5kIERCVVNfVFlQRV9WQVJJQU5UIGFuZCBjb21wbGV4IGFycmF5cworICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudAorICogQHBhcmFtIC4uLiB2YWx1ZSBvZiBmaXJzdCBhcmd1bWVudCwgbGlzdCBvZiBhZGRpdGlvbmFsIHR5cGUtdmFsdWUgcGFpcnMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisJCQkgIGludCAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCSAgLi4uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgdmFyX2FyZ3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGZpcnN0X2FyZ190eXBlKTsKKyAgcmV0dmFsID0gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCAobWVzc2FnZSwKKwkJCQkJICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgdmFyX2FyZ3MpOworICB2YV9lbmQgKHZhcl9hcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIExpa2UgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKCkgYnV0IHRha2VzIGEgdmFfbGlzdCBmb3IgdXNlIGJ5IGxhbmd1YWdlIGJpbmRpbmdzLgorICoKKyAqIEB0b2RvIGZvciBub3csIGlmIHRoaXMgZnVuY3Rpb24gZmFpbHMgZHVlIHRvIE9PTSBpdCB3aWxsIGxlYXZlCisgKiB0aGUgbWVzc2FnZSBoYWxmLXdyaXR0ZW4gYW5kIHlvdSBoYXZlIHRvIGRpc2NhcmQgdGhlIG1lc3NhZ2UKKyAqIGFuZCBzdGFydCBvdmVyLgorICoKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzLgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIGZpcnN0IGFyZ3VtZW50CisgKiBAcGFyYW0gdmFyX2FyZ3MgdmFsdWUgb2YgZmlyc3QgYXJndW1lbnQsIHRoZW4gbGlzdCBvZiB0eXBlL3ZhbHVlIHBhaXJzCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKwkJCQkgaW50ICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCSB2YV9saXN0ICAgICAgdmFyX2FyZ3MpCit7CisgIGludCB0eXBlOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIHR5cGUgPSBmaXJzdF9hcmdfdHlwZTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworCisgIHdoaWxlICh0eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIGlmIChkYnVzX3R5cGVfaXNfYmFzaWMgKHR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZhbHVlOworICAgICAgICAgIHZhbHVlID0gdmFfYXJnICh2YXJfYXJncywgY29uc3QgREJ1c0Jhc2ljVmFsdWUqKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVsZW1lbnRfdHlwZTsKKyAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgYXJyYXk7CisgICAgICAgICAgY2hhciBidWZbMl07CisKKyAgICAgICAgICBlbGVtZW50X3R5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgICAgICAgICAgICAKKyAgICAgICAgICBidWZbMF0gPSBlbGVtZW50X3R5cGU7CisgICAgICAgICAgYnVmWzFdID0gJ1wwJzsKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJheSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkgJiYKKyAgICAgICAgICAgICAgZWxlbWVudF90eXBlICE9IERCVVNfVFlQRV9VTklYX0ZEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqKnZhbHVlOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKworICAgICAgICAgICAgICB2YWx1ZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzID0gdmFfYXJnICh2YXJfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMpKSB7CisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmYXJyYXkpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudF90eXBlID09IERCVVNfVFlQRV9TVFJJTkcgfHwKKyAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUgPT0gREJVU19UWVBFX1NJR05BVFVSRSB8fAorICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSA9PSBEQlVTX1RZUEVfT0JKRUNUX1BBVEgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKioqdmFsdWVfcDsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZhbHVlOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICB2YWx1ZV9wID0gdmFfYXJnICh2YXJfYXJncywgY29uc3QgY2hhcioqKik7CisgICAgICAgICAgICAgIG5fZWxlbWVudHMgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworCisgICAgICAgICAgICAgIHZhbHVlID0gKnZhbHVlX3A7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuX2VsZW1lbnRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmYXJyYXkpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiYXJyYXlzIG9mICVzIGNhbid0IGJlIGFwcGVuZGVkIHdpdGggJXMgZm9yIG5vd1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGVsZW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0ZVTkNUSU9OX05BTUUpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmFycmF5KSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJ0eXBlICVzIGlzbid0IHN1cHBvcnRlZCB5ZXQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpLCBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIHR5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdldHMgYXJndW1lbnRzIGZyb20gYSBtZXNzYWdlIGdpdmVuIGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdC4gIFRoZQorICogc3VwcG9ydGVkIHR5cGVzIGluY2x1ZGUgdGhvc2Ugc3VwcG9ydGVkIGJ5CisgKiBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MoKTsgdGhhdCBpcywgYmFzaWMgdHlwZXMgYW5kIGFycmF5cyBvZgorICogZml4ZWQtbGVuZ3RoIGJhc2ljIHR5cGVzLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgdGhleSB3b3VsZAorICogYmUgZm9yIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYygpIG9yCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKS4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byB0aG9zZSB0eXBlcywgYXJyYXlzIG9mIHN0cmluZywgb2JqZWN0IHBhdGgsIGFuZAorICogc2lnbmF0dXJlIGFyZSBzdXBwb3J0ZWQ7IGJ1dCB0aGVzZSBhcmUgcmV0dXJuZWQgYXMgYWxsb2NhdGVkIG1lbW9yeQorICogYW5kIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCksIHdoaWxlIHRoZSBvdGhlcgorICogdHlwZXMgYXJlIHJldHVybmVkIGFzIGNvbnN0IHJlZmVyZW5jZXMuIFRvIGdldCBhIHN0cmluZyBhcnJheQorICogcGFzcyBpbiAiY2hhciAqKiphcnJheV9sb2NhdGlvbiIgYW5kICJpbnQgKm5fZWxlbWVudHMiLgorICoKKyAqIFNpbWlsYXIgdG8gZGJ1c19tZXNzYWdlX2dldF9maXhlZF9hcnJheSgpIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKKyAqIHN1cHBvcnQgYXJyYXlzIG9mIHR5cGUgREJVU19UWVBFX1VOSVhfRkQuIElmIHlvdSBuZWVkIHRvIHBhcnNlCisgKiBtZXNzYWdlcyB3aXRoIGFycmF5cyBvZiBVbml4IGZpbGUgZGVzY3JpcHRvcnMgeW91IG5lZWQgdG8gcmVjdXJzZQorICogaW50byB0aGUgYXJyYXkgbWFudWFsbHkuCisgKgorICogVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIHJlYWQgd2l0aCB0aGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZQorICogdGhlIEZEX0NMT0VYRUMgZmxhZyBzZXQuIElmIHlvdSBuZWVkIHRoZW0gd2l0aG91dCB0aGlzIGZsYWcgc2V0LAorICogbWFrZSBzdXJlIHRvIHVuc2V0IGl0IHdpdGggZmNudGwoKS4KKyAqCisgKiBUaGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBzaG91bGQgY29udGFpbiB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQKKyAqIGZvbGxvd2VkIGJ5IGEgcG9pbnRlciB0byB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIHN0b3JlZC4gVGhlIGxpc3QKKyAqIGlzIHRlcm1pbmF0ZWQgd2l0aCAjREJVU19UWVBFX0lOVkFMSUQuCisgKgorICogRXhjZXB0IGZvciBzdHJpbmcgYXJyYXlzLCB0aGUgcmV0dXJuZWQgdmFsdWVzIGFyZSBjb25zdGFudDsgZG8gbm90CisgKiBmcmVlIHRoZW0uIFRoZXkgcG9pbnQgaW50byB0aGUgI0RCdXNNZXNzYWdlLgorICoKKyAqIElmIHRoZSByZXF1ZXN0ZWQgYXJndW1lbnRzIGFyZSBub3QgcHJlc2VudCwgb3IgZG8gbm90IGhhdmUgdGhlCisgKiByZXF1ZXN0ZWQgdHlwZXMsIHRoZW4gYW4gZXJyb3Igd2lsbCBiZSBzZXQuCisgKgorICogSWYgbW9yZSBhcmd1bWVudHMgdGhhbiByZXF1ZXN0ZWQgYXJlIHByZXNlbnQsIHRoZSByZXF1ZXN0ZWQKKyAqIGFyZ3VtZW50cyBhcmUgcmV0dXJuZWQgYW5kIHRoZSBleHRyYSBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCisgKiAKKyAqIEB0b2RvIHN1cHBvcnQgREJVU19UWVBFX1NUUlVDVCBhbmQgREJVU19UWVBFX1ZBUklBTlQgYW5kIGNvbXBsZXggYXJyYXlzCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4gb24gZmFpbHVyZQorICogQHBhcmFtIGZpcnN0X2FyZ190eXBlIHRoZSBmaXJzdCBhcmd1bWVudCB0eXBlCisgKiBAcGFyYW0gLi4uIGxvY2F0aW9uIGZvciBmaXJzdCBhcmd1bWVudCB2YWx1ZSwgdGhlbiBsaXN0IG9mIHR5cGUtbG9jYXRpb24gcGFpcnMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9hcmdzIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkgICAgICAgLi4uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgdmFyX2FyZ3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBGQUxTRSk7CisKKyAgdmFfc3RhcnQgKHZhcl9hcmdzLCBmaXJzdF9hcmdfdHlwZSk7CisgIHJldHZhbCA9IGRidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QgKG1lc3NhZ2UsIGVycm9yLCBmaXJzdF9hcmdfdHlwZSwgdmFyX2FyZ3MpOworICB2YV9lbmQgKHZhcl9hcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIExpa2UgZGJ1c19tZXNzYWdlX2dldF9hcmdzIGJ1dCB0YWtlcyBhIHZhX2xpc3QgZm9yIHVzZSBieSBsYW5ndWFnZSBiaW5kaW5ncy4KKyAqCisgKiBAc2VlIGRidXNfbWVzc2FnZV9nZXRfYXJncworICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBmaWxsZWQgaW4KKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudAorICogQHBhcmFtIHZhcl9hcmdzIHJldHVybiBsb2NhdGlvbiBmb3IgZmlyc3QgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IGxpc3Qgb2YgdHlwZS9sb2NhdGlvbiBwYWlycworICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHdhcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJICAgICAgdmFfbGlzdCAgICAgICAgICB2YXJfYXJncykKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBGQUxTRSk7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICByZXR1cm4gX2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCAoJml0ZXIsIGVycm9yLCBmaXJzdF9hcmdfdHlwZSwgdmFyX2FyZ3MpOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfbWVzc2FnZV9pdGVyX2luaXRfY29tbW9uIChEQnVzTWVzc2FnZSAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBpdGVyX3R5cGUpCit7CisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChEQnVzTWVzc2FnZVJlYWxJdGVyKSA8PSBzaXplb2YgKERCdXNNZXNzYWdlSXRlcikpOworCisgIC8qIFNpbmNlIHRoZSBpdGVyYXRvciB3aWxsIHJlYWQgb3Igd3JpdGUgd2hvLWtub3dzLXdoYXQgZnJvbSB0aGUKKyAgICogbWVzc2FnZSwgd2UgbmVlZCB0byBnZXQgaW4gdGhlIHJpZ2h0IGJ5dGUgb3JkZXIKKyAgICovCisgIGVuc3VyZV9ieXRlX29yZGVyIChtZXNzYWdlKTsKKyAgCisgIHJlYWwtPm1lc3NhZ2UgPSBtZXNzYWdlOworICByZWFsLT5jaGFuZ2VkX3N0YW1wID0gbWVzc2FnZS0+Y2hhbmdlZF9zdGFtcDsKKyAgcmVhbC0+aXRlcl90eXBlID0gaXRlcl90eXBlOworICByZWFsLT5zaWdfcmVmY291bnQgPSAwOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgI0RCdXNNZXNzYWdlSXRlciBmb3IgcmVhZGluZyB0aGUgYXJndW1lbnRzIG9mIHRoZQorICogbWVzc2FnZSBwYXNzZWQgaW4uCisgKgorICogV2hlbiBwb3NzaWJsZSwgZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkgaXMgbXVjaCBtb3JlIGNvbnZlbmllbnQuCisgKiBTb21lIHR5cGVzIG9mIGFyZ3VtZW50IGNhbiBvbmx5IGJlIHJlYWQgd2l0aCAjREJ1c01lc3NhZ2VJdGVyCisgKiBob3dldmVyLgorICoKKyAqIFRoZSBlYXNpZXN0IHdheSB0byBpdGVyYXRlIGlzIGxpa2UgdGhpczogCisgKiBAY29kZQorICogZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICogd2hpbGUgKChjdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgKiAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKTsKKyAqIEBlbmRjb2RlCisgKgorICogI0RCdXNNZXNzYWdlSXRlciBjb250YWlucyBubyBhbGxvY2F0ZWQgbWVtb3J5OyBpdCBuZWVkIG5vdCBiZQorICogZnJlZWQsIGFuZCBjYW4gYmUgY29waWVkIGJ5IGFzc2lnbm1lbnQgb3IgbWVtY3B5KCkuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgbWVzc2FnZSBoYXMgbm8gYXJndW1lbnRzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisJCQlEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOworICBpbnQgdHlwZV9wb3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpdGVyICE9IE5VTEwsIEZBTFNFKTsKKworICBnZXRfY29uc3Rfc2lnbmF0dXJlICgmbWVzc2FnZS0+aGVhZGVyLCAmdHlwZV9zdHIsICZ0eXBlX3Bvcyk7CisKKyAgX2RidXNfbWVzc2FnZV9pdGVyX2luaXRfY29tbW9uIChtZXNzYWdlLCByZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmcmVhbC0+dS5yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RyLCB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UtPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhbC0+dS5yZWFkZXIpICE9IERCVVNfVFlQRV9JTlZBTElEOworfQorCisvKioKKyAqIENoZWNrcyBpZiBhbiBpdGVyYXRvciBoYXMgYW55IG1vcmUgZmllbGRzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXIKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGFyZSBtb3JlIGZpZWxkcyBmb2xsb3dpbmcKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX2hhc19uZXh0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2hhc19uZXh0ICgmcmVhbC0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIE1vdmVzIHRoZSBpdGVyYXRvciB0byB0aGUgbmV4dCBmaWVsZCwgaWYgYW55LiBJZiB0aGVyZSdzIG5vIG5leHQKKyAqIGZpZWxkLCByZXR1cm5zICNGQUxTRS4gSWYgdGhlIGl0ZXJhdG9yIG1vdmVzIGZvcndhcmQsIHJldHVybnMKKyAqICNUUlVFLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXIKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBpdGVyYXRvciB3YXMgbW92ZWQgdG8gdGhlIG5leHQgZmllbGQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX25leHQgKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIsIEZBTFNFKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWwtPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCB0eXBlIG9mIHRoZSBhcmd1bWVudCB0aGF0IHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBwb2ludHMgdG8uIElmIHRoZSBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLCByZXR1cm5zCisgKiAjREJVU19UWVBFX0lOVkFMSUQuIFlvdSBjYW4gdGh1cyB3cml0ZSBhIGxvb3AgYXMgZm9sbG93czoKKyAqCisgKiBAY29kZQorICogZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICogd2hpbGUgKChjdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgKiAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKTsKKyAqIEBlbmRjb2RlCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcgorICogQHJldHVybnMgdGhlIGFyZ3VtZW50IHR5cGUKKyAqLworaW50CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIsIEZBTFNFKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGFycmF5IHRoYXQgdGhlIG1lc3NhZ2UgaXRlcmF0b3IKKyAqIHBvaW50cyB0by4gTm90ZSB0aGF0IHlvdSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGl0ZXJhdG9yIHBvaW50cyB0bworICogYW4gYXJyYXkgcHJpb3IgdG8gdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcmV0dXJucyB0aGUgYXJyYXkgZWxlbWVudCB0eXBlCisgKi8KK2ludAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgREJVU19UWVBFX0lOVkFMSUQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUiwgREJVU19UWVBFX0lOVkFMSUQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlcikgPT0gREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKCZyZWFsLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogUmVjdXJzZXMgaW50byBhIGNvbnRhaW5lciB2YWx1ZSB3aGVuIHJlYWRpbmcgdmFsdWVzIGZyb20gYSBtZXNzYWdlLAorICogaW5pdGlhbGl6aW5nIGEgc3ViLWl0ZXJhdG9yIHRvIHVzZSBmb3IgdHJhdmVyc2luZyB0aGUgY2hpbGQgdmFsdWVzCisgKiBvZiB0aGUgY29udGFpbmVyLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIHJlY3Vyc2VzIGludG8gYSB2YWx1ZSwgbm90IGEgdHlwZSwgc28geW91IGNhbiBvbmx5CisgKiByZWN1cnNlIGlmIHRoZSB2YWx1ZSBleGlzdHMuIFRoZSBtYWluIGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgdGhhdAorICogaWYgeW91IGhhdmUgZm9yIGV4YW1wbGUgYW4gZW1wdHkgYXJyYXkgb2YgYXJyYXkgb2YgaW50MzIsIHlvdSBjYW4KKyAqIHJlY3Vyc2UgaW50byB0aGUgb3V0ZXJtb3N0IGFycmF5LCBidXQgaXQgd2lsbCBoYXZlIG5vIHZhbHVlcywgc28KKyAqIHlvdSB3b24ndCBiZSBhYmxlIHRvIHJlY3Vyc2UgZnVydGhlci4gVGhlcmUncyBubyBhcnJheSBvZiBpbnQzMiB0bworICogcmVjdXJzZSBpbnRvLgorICoKKyAqIElmIGEgY29udGFpbmVyIGlzIGFuIGFycmF5IG9mIGZpeGVkLWxlbmd0aCB0eXBlcyAoZXhjZXB0IFVuaXggZmlsZQorICogZGVzY3JpcHRvcnMpLCBpdCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRvIHVzZQorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkgdG8gZ2V0IHRoZSB3aG9sZSBhcnJheSBpbiBvbmUKKyAqIHNob3QsIHJhdGhlciB0aGFuIGluZGl2aWR1YWxseSB3YWxraW5nIG92ZXIgdGhlIGFycmF5IGVsZW1lbnRzLgorICoKKyAqIEJlIHN1cmUgeW91IGhhdmUgc29tZWhvdyBjaGVja2VkIHRoYXQKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSgpIG1hdGNoZXMgdGhlIHR5cGUgeW91IGFyZSBleHBlY3RpbmcKKyAqIHRvIHJlY3Vyc2UgaW50by4gUmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSB1bmRlZmluZWQgaWYgdGhlcmUgaXMKKyAqIG5vIGNvbnRhaW5lciB0byByZWN1cnNlIGludG8gYXQgdGhlIGN1cnJlbnQgaXRlcmF0b3IgcG9zaXRpb24uCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcmF0b3IKKyAqIEBwYXJhbSBzdWIgdGhlIHN1Yi1pdGVyYXRvciB0byBpbml0aWFsaXplCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKERCdXNNZXNzYWdlSXRlciAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgICpzdWIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWxfc3ViID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilzdWI7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc3ViICE9IE5VTEwpOworCisgICpyZWFsX3N1YiA9ICpyZWFsOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhbC0+dS5yZWFkZXIsICZyZWFsX3N1Yi0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2lnbmF0dXJlIG9mIGEgbWVzc2FnZSBpdGVyYXRvci4gIFRoaXMKKyAqIGlzIHVzZWZ1bCBwcmltYXJpbHkgZm9yIGRlYWxpbmcgd2l0aCB2YXJpYW50czsgb25lIGNhbgorICogcmVjdXJzZSBpbnRvIGEgdmFyaWFudCBhbmQgZGV0ZXJtaW5lIHRoZSBzaWduYXR1cmUgb2YKKyAqIHRoZSB2YXJpYW50J3MgdmFsdWUuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBtdXN0IGJlIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkuCisgKiAKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXJhdG9yCisgKiBAcmV0dXJucyB0aGUgY29udGFpbmVkIHNpZ25hdHVyZSwgb3IgTlVMTCBpZiBvdXQgb2YgbWVtb3J5CisgKi8KK2NoYXIgKgorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3NpZ25hdHVyZSAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBjb25zdCBEQnVzU3RyaW5nICpzaWc7CisgIERCdXNTdHJpbmcgcmV0c3RyOworICBjaGFyICpyZXQ7CisgIGludCBzdGFydCwgbGVuOworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgTlVMTCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJldHN0cikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3NpZ25hdHVyZSAoJnJlYWwtPnUucmVhZGVyLCAmc2lnLAorCQkJCSAgICZzdGFydCwgJmxlbik7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKCZyZXRzdHIsCisJCQkJX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzaWcpICsgc3RhcnQsCisJCQkJbGVuKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnJldHN0ciwgJnJldCkpCisgICAgcmV0dXJuIE5VTEw7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0c3RyKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBSZWFkcyBhIGJhc2ljLXR5cGVkIHZhbHVlIGZyb20gdGhlIG1lc3NhZ2UgaXRlcmF0b3IuCisgKiBCYXNpYyB0eXBlcyBhcmUgdGhlIG5vbi1jb250YWluZXJzIHN1Y2ggYXMgaW50ZWdlciBhbmQgc3RyaW5nLgorICoKKyAqIFRoZSB2YWx1ZSBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhdGlvbiB0byBzdG9yZQorICogdGhlIHJldHVybmVkIHZhbHVlLiBTbyBmb3IgaW50MzIgaXQgc2hvdWxkIGJlIGEgImRidXNfaW50MzJfdCoiCisgKiBhbmQgZm9yIHN0cmluZyBhICJjb25zdCBjaGFyKioiLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMKKyAqIGJ5IHJlZmVyZW5jZSBhbmQgc2hvdWxkIG5vdCBiZSBmcmVlZC4KKyAqCisgKiBUaGlzIGNhbGwgZHVwbGljYXRlcyBVbml4IGZpbGUgZGVzY3JpcHRvcnMgd2hlbiByZWFkaW5nIHRoZW0uIEl0IGlzCisgKiB5b3VyIGpvYiB0byBjbG9zZSB0aGVtIHdoZW4geW91IGRvbid0IG5lZWQgdGhlbSBhbnltb3JlLgorICoKKyAqIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSByZWFkIHdpdGggdGhpcyBmdW5jdGlvbiB3aWxsIGhhdmUKKyAqIHRoZSBGRF9DTE9FWEVDIGZsYWcgc2V0LiBJZiB5b3UgbmVlZCB0aGVtIHdpdGhvdXQgdGhpcyBmbGFnIHNldCwKKyAqIG1ha2Ugc3VyZSB0byB1bnNldCBpdCB3aXRoIGZjbnRsKCkuCisgKgorICogQmUgc3VyZSB5b3UgaGF2ZSBzb21laG93IGNoZWNrZWQgdGhhdAorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlKCkgbWF0Y2hlcyB0aGUgdHlwZSB5b3UgYXJlCisgKiBleHBlY3RpbmcsIG9yIHlvdSdsbCBjcmFzaCB3aGVuIHlvdSB0cnkgdG8gdXNlIGFuIGludGVnZXIgYXMgYQorICogc3RyaW5nIG9yIHNvbWV0aGluZy4KKyAqCisgKiBUbyByZWFkIGFueSBjb250YWluZXIgdHlwZSAoYXJyYXksIHN0cnVjdCwgZGljdCkgeW91IHdpbGwgbmVlZCB0bworICogcmVjdXJzZSBpbnRvIHRoZSBjb250YWluZXIgd2l0aCBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCkuICBJZgorICogdGhlIGNvbnRhaW5lciBpcyBhbiBhcnJheSBvZiBmaXhlZC1sZW5ndGggdmFsdWVzIChleGNlcHQgVW5peCBmaWxlCisgKiBkZXNjcmlwdG9ycyksIHlvdSBjYW4gZ2V0IGFsbCB0aGUgYXJyYXkgZWxlbWVudHMgYXQgb25jZSB3aXRoCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKS4gT3RoZXJ3aXNlLCB5b3UgaGF2ZSB0byBpdGVyYXRlCisgKiBvdmVyIHRoZSBjb250YWluZXIncyBjb250ZW50cyBvbmUgdmFsdWUgYXQgYSB0aW1lLgorICogCisgKiBBbGwgYmFzaWMtdHlwZWQgdmFsdWVzIGFyZSBndWFyYW50ZWVkIHRvIGZpdCBpbiA4IGJ5dGVzLiBTbyB5b3UgY2FuCisgKiB3cml0ZSBjb2RlIGxpa2UgdGhpczoKKyAqCisgKiBAY29kZQorICogZGJ1c191aW50NjRfdCB2YWx1ZTsKKyAqIGludCB0eXBlOworICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmcmVhZF9pdGVyLCAmdmFsdWUpOworICogdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnJlYWRfaXRlcik7CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZ3cml0ZV9pdGVyLCB0eXBlLCAmdmFsdWUpOworICogQGVuZGNvZGUKKyAqCisgKiBPbiBzb21lIHJlYWxseSBvYnNjdXJlIHBsYXRmb3JtcyBkYnVzX3VpbnQ2NF90IG1pZ2h0IG5vdCBleGlzdCwgaWYKKyAqIHlvdSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgeW91IHdpbGwga25vdy4gIGRidXNfdWludDY0X3QgaXMganVzdAorICogb25lIGV4YW1wbGUgb2YgYSB0eXBlIHRoYXQncyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgcG9zc2libGUKKyAqIHZhbHVlLCB5b3UgY291bGQgdXNlIGEgc3RydWN0IG9yIGNoYXJbOF0gaW5zdGVhZCBpZiB5b3UgbGlrZS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSB2YWx1ZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgdmFsdWUKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChEQnVzTWVzc2FnZUl0ZXIgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSkKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICh2YWx1ZSAhPSBOVUxMKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVyKSA9PSBEQlVTX1RZUEVfVU5JWF9GRCkKKyAgICB7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgIERCdXNCYXNpY1ZhbHVlIGlkeDsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYygmcmVhbC0+dS5yZWFkZXIsICZpZHgpOworCisgICAgICBpZiAoaWR4LnUzMiA+PSByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzKSB7CisgICAgICAgIC8qIEhtbSwgd2UgY2Fubm90IHJlYWxseSBzaWduYWwgYW4gZXJyb3IgaGVyZSwgc28gbGV0J3MgbWFrZQorICAgICAgICAgICBzdXJlIHRvIHJldHVybiBhbiBpbnZhbGlkIGZkLiAqLworICAgICAgICAqKChpbnQqKSB2YWx1ZSkgPSAtMTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAqKChpbnQqKSB2YWx1ZSkgPSBfZGJ1c19kdXAocmVhbC0+bWVzc2FnZS0+dW5peF9mZHNbaWR4LnUzMl0sIE5VTEwpOworI2Vsc2UKKyAgICAgICooKGludCopIHZhbHVlKSA9IC0xOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWwtPnUucmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5IGFzIG1hcnNoYWxlZCBpbiB0aGUgd2lyZQorICogcHJvdG9jb2wuIFRoZSBpdGVyYXRvciBtdXN0IGN1cnJlbnRseSBiZSBpbnNpZGUgYW4gYXJyYXktdHlwZWQKKyAqIHZhbHVlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBvbiB0aGUgZ3JvdW5kcyB0aGF0IGl0IGlzIHN0dXBpZC4gIFdoeQorICogd291bGQgeW91IHdhbnQgdG8ga25vdyBob3cgbWFueSBieXRlcyBhcmUgaW4gdGhlIGFycmF5IGFzIG1hcnNoYWxlZAorICogaW4gdGhlIHdpcmUgcHJvdG9jb2w/ICBGb3Igbm93LCB1c2UgdGhlIG5fZWxlbWVudHMgcmV0dXJuZWQgZnJvbQorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkgaW5zdGVhZCwgb3IgaXRlcmF0ZSBvdmVyIHRoZQorICogYXJyYXkgdmFsdWVzIGFuZCBjb3VudCB0aGVtLgorICoKKyAqIEB0b2RvIGludHJvZHVjZSBhIHZhcmlhbnQgb2YgdGhpcyBnZXRfbl9lbGVtZW50cyB0aGF0IHJldHVybnMKKyAqIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIHRob3VnaCB3aXRoIGEgbm9uLWZpeGVkIGFycmF5IGl0IHdpbGwgbm90CisgKiBiZSB2ZXJ5IGVmZmljaWVudCwgc28gbWF5YmUgaXQncyBub3QgZ29vZC4KKyAqIAorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBhcnJheQorICovCitpbnQKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcnJheV9sZW4gKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIDApOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfYXJyYXlfbGVuZ3RoICgmcmVhbC0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIFJlYWRzIGEgYmxvY2sgb2YgZml4ZWQtbGVuZ3RoIHZhbHVlcyBmcm9tIHRoZSBtZXNzYWdlIGl0ZXJhdG9yLgorICogRml4ZWQtbGVuZ3RoIHZhbHVlcyBhcmUgdGhvc2UgYmFzaWMgdHlwZXMgdGhhdCBhcmUgbm90IHN0cmluZy1saWtlLAorICogc3VjaCBhcyBpbnRlZ2VycywgYm9vbCwgZG91YmxlLiBUaGUgcmV0dXJuZWQgYmxvY2sgd2lsbCBiZSBmcm9tIHRoZQorICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkgdW50aWwgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisgKgorICogVGhlcmUgaXMgb25lIGV4Y2VwdGlvbiBoZXJlOiBhbHRob3VnaCBEQlVTX1RZUEVfVU5JWF9GRCBpcworICogY29uc2lkZXJlZCBhICdmaXhlZCcgdHlwZSBhcnJheXMgb2YgdGhpcyB0eXBlIG1heSBub3QgYmUgcmVhZCB3aXRoCisgKiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBtZXNzYWdlIGl0ZXIgc2hvdWxkIGJlICJpbiIgdGhlIGFycmF5ICh0aGF0IGlzLCB5b3UgcmVjdXJzZSBpbnRvIHRoZQorICogYXJyYXksIGFuZCB0aGVuIHlvdSBjYWxsIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSgpIG9uIHRoZQorICogInN1Yi1pdGVyYXRvciIgY3JlYXRlZCBieSBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCkpLgorICoKKyAqIFRoZSB2YWx1ZSBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhdGlvbiB0byBzdG9yZSB0aGUKKyAqIHJldHVybmVkIGFycmF5LiBTbyBmb3IgaW50MzIgaXQgc2hvdWxkIGJlIGEgImNvbnN0IGRidXNfaW50MzJfdCoqIgorICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGJ5IHJlZmVyZW5jZSBhbmQgc2hvdWxkIG5vdCBiZSBmcmVlZC4KKyAqIAorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGlmIGRidXNfdHlwZV9pc19maXhlZCgpIHJldHVybnMKKyAqICNUUlVFIGZvciB0aGUgZWxlbWVudCB0eXBlLgorICoKKyAqIElmIGFuIGFycmF5J3MgZWxlbWVudHMgYXJlIG5vdCBmaXhlZCBpbiBzaXplLCB5b3UgaGF2ZSB0byByZWN1cnNlCisgKiBpbnRvIHRoZSBhcnJheSB3aXRoIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UoKSBhbmQgcmVhZCB0aGUKKyAqIGVsZW1lbnRzIG9uZSBieSBvbmUuCisgKiAKKyAqIEJlY2F1c2UgdGhlIGFycmF5IGlzIG5vdCBjb3BpZWQsIHRoaXMgZnVuY3Rpb24gcnVucyBpbiBjb25zdGFudAorICogdGltZSBhbmQgaXMgZmFzdDsgaXQncyBtdWNoIHByZWZlcnJlZCBvdmVyIHdhbGtpbmcgdGhlIGVudGlyZSBhcnJheQorICogd2l0aCBhbiBpdGVyYXRvci4gKEhvd2V2ZXIsIHlvdSBjYW4gYWx3YXlzIHVzZQorICogZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSgpLCBldmVuIGZvciBmaXhlZC1sZW5ndGggdHlwZXM7CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKSBpcyBqdXN0IGFuIG9wdGltaXphdGlvbi4pCisgKiAKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIHZhbHVlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBibG9jaworICogQHBhcmFtIG5fZWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBibG9jaworICovCit2b2lkCitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkgKERCdXNNZXNzYWdlSXRlciAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuX2VsZW1lbnRzKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBpbnQgc3VidHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUoJnJlYWwtPnUucmVhZGVyKTsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICh2YWx1ZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKChzdWJ0eXBlID09IERCVVNfVFlQRV9JTlZBTElEKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGRidXNfdHlwZV9pc19maXhlZCAoc3VidHlwZSkgJiYgc3VidHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCkpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG5fZWxlbWVudHMpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgI0RCdXNNZXNzYWdlSXRlciBmb3IgYXBwZW5kaW5nIGFyZ3VtZW50cyB0byB0aGUgZW5kCisgKiBvZiBhIG1lc3NhZ2UuCisgKgorICogQHRvZG8gSWYgYXBwZW5kaW5nIGFueSBvZiB0aGUgYXJndW1lbnRzIGZhaWxzIGR1ZSB0byBsYWNrIG9mCisgKiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZCB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nCisgKiB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciB0byBpbml0aWFsaXplCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisJCQkgICAgICAgREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoaXRlciAhPSBOVUxMKTsKKworICBfZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9jb21tb24gKG1lc3NhZ2UsIHJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworCisgIC8qIFdlIGNyZWF0ZSB0aGUgc2lnbmF0dXJlIHN0cmluZyBhbmQgcG9pbnQgaXRlcmF0b3JzIGF0IGl0ICJvbiBkZW1hbmQiCisgICAqIHdoZW4gYSB2YWx1ZSBpcyBhY3R1YWxseSBhcHBlbmRlZC4gVGhhdCBtZWFucyB0aGF0IGluaXQoKSBuZXZlciBmYWlscworICAgKiBkdWUgdG8gT09NLgorICAgKi8KKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF90eXBlc19kZWxheWVkICgmcmVhbC0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZS0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IHNpZ25hdHVyZSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVudAorICogc2lnbmF0dXJlLCBzdG9yZXMgaXQgaW4gdGhlIGl0ZXJhdG9yLCBhbmQgcG9pbnRzIHRoZSBpdGVyYXRvciB0bworICogdGhlIGVuZCBvZiBpdC4gVXNlZCBhbnkgdGltZSB3ZSB3cml0ZSB0byB0aGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9zaWduYXR1cmUgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwpCit7CisgIERCdXNTdHJpbmcgKnN0cjsKKyAgY29uc3QgREJ1c1N0cmluZyAqY3VycmVudF9zaWc7CisgIGludCBjdXJyZW50X3NpZ19wb3M7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworCisgIGlmIChyZWFsLT51LndyaXRlci50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocmVhbC0+c2lnX3JlZmNvdW50ID4gMCk7CisgICAgICByZWFsLT5zaWdfcmVmY291bnQgKz0gMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBzdHIgPSBkYnVzX25ldyAoREJ1c1N0cmluZywgMSk7CisgIGlmIChzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJnJlYWwtPm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9zaWcsICZjdXJyZW50X3NpZ19wb3MpKQorICAgIGN1cnJlbnRfc2lnID0gTlVMTDsKKworICBpZiAoY3VycmVudF9zaWcpCisgICAgeworICAgICAgaW50IGN1cnJlbnRfbGVuOworCisgICAgICBjdXJyZW50X2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoY3VycmVudF9zaWcsIGN1cnJlbnRfc2lnX3Bvcyk7CisgICAgICBjdXJyZW50X3NpZ19wb3MgKz0gMTsgLyogbW92ZSBvbiB0byBzaWcgZGF0YSAqLworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoc3RyLCBjdXJyZW50X2xlbiArIDQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChzdHIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoY3VycmVudF9zaWcsIGN1cnJlbnRfc2lnX3BvcywgY3VycmVudF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlIChzdHIpOworICAgICAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoc3RyLCA0KSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVhbC0+c2lnX3JlZmNvdW50ID0gMTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9hZGRfdHlwZXMgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbmV3IHNpZ25hdHVyZSBhcyB0aGUgbWVzc2FnZSBzaWduYXR1cmUsIGZyZWVzIHRoZQorICogc2lnbmF0dXJlIHN0cmluZywgYW5kIG1hcmtzIHRoZSBpdGVyYXRvciBhcyBub3QgaGF2aW5nIGEgdHlwZV9zdHIKKyAqIGFueW1vcmUuIEZyZWVzIHRoZSBzaWduYXR1cmUgZXZlbiBpZiBpdCBmYWlscywgc28geW91IGNhbid0CisgKiByZWFsbHkgcmVjb3ZlciBmcm9tIGZhaWx1cmUuIEtpbmRhIGJ1c3RlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2Vfc2lnbmF0dXJlIChEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsKQoreworICBEQnVzU3RyaW5nICpzdHI7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA+IDApOworCisgIHJlYWwtPnNpZ19yZWZjb3VudCAtPSAxOworCisgIGlmIChyZWFsLT5zaWdfcmVmY291bnQgPiAwKQorICAgIHJldHVybiBUUlVFOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA9PSAwKTsKKworICByZXR2YWwgPSBUUlVFOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpOworICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZyZWFsLT5tZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgKCZyZWFsLT51LndyaXRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlIChzdHIpOworICBkYnVzX2ZyZWUgKHN0cik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgc2lnbmF0dXJlIHN0cmluZyBhbmQgbWFya3MgdGhlIGl0ZXJhdG9yIGFzIG5vdCBoYXZpbmcgYQorICogdHlwZV9zdHIgYW55bW9yZS4gIFNpbmNlIHRoZSBuZXcgc2lnbmF0dXJlIGlzIG5vdCBzZXQsIHRoZSBtZXNzYWdlCisgKiB3aWxsIGdlbmVyYWxseSBiZSBob3NlZCBhZnRlciB0aGlzIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX3NpZ25hdHVyZSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCkKK3sKKyAgREJ1c1N0cmluZyAqc3RyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT51LndyaXRlci50eXBlX3N0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5zaWdfcmVmY291bnQgPiAwKTsKKworICByZWFsLT5zaWdfcmVmY291bnQgLT0gMTsKKworICBpZiAocmVhbC0+c2lnX3JlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+c2lnX3JlZmNvdW50ID09IDApOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIF9kYnVzX3R5cGVfd3JpdGVyX3JlbW92ZV90eXBlcyAoJnJlYWwtPnUud3JpdGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKHN0cik7CisgIGRidXNfZnJlZSAoc3RyKTsKK30KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKml0ZXIpCit7CisgIGlmICghX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChpdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGl0ZXItPm1lc3NhZ2UtPmxvY2tlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgYXBwZW5kIGl0ZXJhdG9yIGNhbid0IGJlIHVzZWQ6IG1lc3NhZ2UgaXMgbG9ja2VkIChoYXMgYWxyZWFkeSBiZWVuIHNlbnQpXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKK3N0YXRpYyBpbnQgKgorZXhwYW5kX2ZkX2FycmF5KERCdXNNZXNzYWdlICptLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICBuKQoreworICBfZGJ1c19hc3NlcnQobSk7CisKKyAgLyogVGhpcyBtYWtlcyBzcGFjZSBmb3IgYWRkaW5nIG4gbmV3IGZkcyB0byB0aGUgYXJyYXkgYW5kIHJldHVybnMgYQorICAgICBwb2ludGVyIHRvIHRoZSBwbGFjZSB3ZXJlIHRoZSBmaXJzdCBmZCBzaG91bGQgYmUgcHV0LiAqLworCisgIGlmIChtLT5uX3VuaXhfZmRzICsgbiA+IG0tPm5fdW5peF9mZHNfYWxsb2NhdGVkKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGs7CisgICAgICBpbnQgKnA7CisKKyAgICAgIC8qIE1ha2UgdHdpY2UgYXMgbXVjaCBzcGFjZSBhcyBuZWNlc3NhcnkgKi8KKyAgICAgIGsgPSAobS0+bl91bml4X2ZkcyArIG4pICogMjsKKworICAgICAgLyogQWxsb2NhdGUgYXQgbGVhc3QgZm91ciAqLworICAgICAgaWYgKGsgPCA0KQorICAgICAgICBrID0gNDsKKworICAgICAgcCA9IGRidXNfcmVhbGxvYyhtLT51bml4X2ZkcywgayAqIHNpemVvZihpbnQpKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBtLT51bml4X2ZkcyA9IHA7CisgICAgICBtLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA9IGs7CisgICAgfQorCisgIHJldHVybiBtLT51bml4X2ZkcyArIG0tPm5fdW5peF9mZHM7Cit9CisjZW5kaWYKKworLyoqCisgKiBBcHBlbmRzIGEgYmFzaWMtdHlwZWQgdmFsdWUgdG8gdGhlIG1lc3NhZ2UuIFRoZSBiYXNpYyB0eXBlcyBhcmUgdGhlCisgKiBub24tY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMgaW50ZWdlciBhbmQgc3RyaW5nLgorICoKKyAqIFRoZSAidmFsdWUiIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiBhIGJhc2ljLXR5cGVkIHZhbHVlLgorICogU28gZm9yIHN0cmluZywgY29uc3QgY2hhcioqLiBGb3IgaW50ZWdlciwgZGJ1c19pbnQzMl90Ki4KKyAqCisgKiBGb3IgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoaXMgZnVuY3Rpb24gd2lsbCBpbnRlcm5hbGx5IGR1cGxpY2F0ZQorICogdGhlIGRlc2NyaXB0b3IgeW91IHBhc3NlZCBpbi4gSGVuY2UgeW91IG1heSBjbG9zZSB0aGUgZGVzY3JpcHRvcgorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGFwcGVuZCBpdGVyYXRvcgorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAqdmFsdWUpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICogY29uc3QgKnN0cmluZ19wOworICAgICAgY29uc3QgZGJ1c19ib29sX3QgKmJvb2xfcDsKKworICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICBzdHJpbmdfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3V0ZjggKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICBzdHJpbmdfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgc3RyaW5nX3AgPSB2YWx1ZTsKKyAgICAgICAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9zaWduYXR1cmUgKCpzdHJpbmdfcCksIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgIGJvb2xfcCA9IHZhbHVlOworICAgICAgICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCpib29sX3AgPT0gMCB8fCAqYm9vbF9wID09IDEsIEZBTFNFKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgLyogbm90aGluZyB0byBjaGVjaywgYWxsIHBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsb3dlZCAqLworICAgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAocmVhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh0eXBlID09IERCVVNfVFlQRV9VTklYX0ZEKQorICAgIHsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgaW50ICpmZHM7CisgICAgICBkYnVzX3VpbnQzMl90IHU7CisKKyAgICAgIC8qIEZpcnN0IHN0ZXAsIGluY2x1ZGUgdGhlIGZkIGluIHRoZSBmZCBsaXN0IG9mIHRoaXMgbWVzc2FnZSAqLworICAgICAgaWYgKCEoZmRzID0gZXhwYW5kX2ZkX2FycmF5KHJlYWwtPm1lc3NhZ2UsIDEpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAqZmRzID0gX2RidXNfZHVwKCooaW50KikgdmFsdWUsIE5VTEwpOworICAgICAgaWYgKCpmZHMgPCAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHUgPSByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzOworCisgICAgICAvKiBTZWNvbmQgc3RlcCwgd3JpdGUgdGhlIGluZGV4IHRvIHRoZSBmZCAqLworICAgICAgaWYgKCEocmV0ID0gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZyZWFsLT51LndyaXRlciwgREJVU19UWVBFX1VOSVhfRkQsICZ1KSkpIHsKKyAgICAgICAgX2RidXNfY2xvc2UoKmZkcywgTlVMTCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgICAgcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcyArPSAxOworICAgICAgdSArPSAxOworCisgICAgICAvKiBGaW5hbCBzdGVwLCB1cGRhdGUgdGhlIGhlYWRlciBhY2NvcmRpbmdseSAqLworICAgICAgcmV0ID0gX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJnJlYWwtPm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1KTsKKworICAgICAgLyogSWYgYW55IG9mIHRoZXNlIG9wZXJhdGlvbnMgZmFpbCB0aGUgbWVzc2FnZSBpcworICAgICAgICAgaG9zZWQuIEhvd2V2ZXIsIG5vIG1lbW9yeSBvciBmZHMgc2hvdWxkIGJlIGxlYWtlZCBzaW5jZSB3aGF0CisgICAgICAgICBoYXMgYmVlbiBhZGRlZCB0byBtZXNzYWdlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQKKyAgICAgICAgIGNhbiBoZW5jZSBiZSBhY2NvdW50ZWQgZm9yIHdoZW4gdGhlIG1lc3NhZ2UgaXMgYmVpbmcKKyAgICAgICAgIGZyZWVkLiAqLworI2Vsc2UKKyAgICAgIHJldCA9IEZBTFNFOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0ID0gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZyZWFsLT51LndyaXRlciwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCB2YWx1ZXMgdG8gYW4gYXJyYXkuIFRoZQorICogZml4ZWQtbGVuZ3RoIHR5cGVzIGFyZSBhbGwgYmFzaWMgdHlwZXMgdGhhdCBhcmUgbm90IHN0cmluZy1saWtlLiBTbworICogaW50MzIsIGRvdWJsZSwgYm9vbCwgZXRjLiAoVW5peCBmaWxlIGRlc2NyaXB0b3JzIGhvd2V2ZXIgYXJlIG5vdAorICogc3VwcG9ydGVkLikgWW91IG11c3QgY2FsbCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpIHRvCisgKiBvcGVuIGFuIGFycmF5IG9mIHZhbHVlcyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBZb3UgbWF5IGNhbGwKKyAqIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgKGFuZCBpbnRlcm1peGVkIHdpdGggY2FsbHMgdG8KKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygpKSBmb3IgdGhlIHNhbWUgYXJyYXkuCisgKgorICogVGhlICJ2YWx1ZSIgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheS4gIFNvIGZvcgorICogaW50ZWdlciwgImRidXNfaW50MzJfdCoqIiBpcyBleHBlY3RlZCBmb3IgZXhhbXBsZS4KKyAqCisgKiBAd2FybmluZyBpbiBDLCBnaXZlbiAiaW50IGFycmF5W10iLCAiJmFycmF5ID09IGFycmF5IiAodGhlCisgKiBjb21wLmxhbmcuYyBGQVEgc2F5cyBvdGhlcndpc2UsIGJ1dCBnY2MgYW5kIHRoZSBGQVEgZG9uJ3QgYWdyZWUpLgorICogU28gaWYgeW91J3JlIHVzaW5nIGFuIGFycmF5IGluc3RlYWQgb2YgYSBwb2ludGVyIHlvdSBoYXZlIHRvIGNyZWF0ZQorICogYSBwb2ludGVyIHZhcmlhYmxlLCBhc3NpZ24gdGhlIGFycmF5IHRvIGl0LCB0aGVuIHRha2UgdGhlIGFkZHJlc3MKKyAqIG9mIHRoZSBwb2ludGVyIHZhcmlhYmxlLgorICogQGNvZGUKKyAqIGNvbnN0IGRidXNfaW50MzJfdCBhcnJheVtdID0geyAxLCAyLCAzIH07CisgKiBjb25zdCBkYnVzX2ludDMyX3QgKnZfQVJSQVkgPSBhcnJheTsKKyAqIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmaXRlciwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWSwgMykpCisgKiAgIGZwcmludGYgKHN0ZGVyciwgIk5vIG1lbW9yeSFcbiIpOworICogQGVuZGNvZGUKKyAqIEZvciBzdHJpbmdzIGl0IHdvcmtzIHRvIHdyaXRlIGNvbnN0IGNoYXIgKmFycmF5ID0gIkhlbGxvIiBhbmQgdGhlbgorICogdXNlICZhcnJheSB0aG91Z2guCisgKgorICogQHRvZG8gSWYgdGhpcyBmYWlscyBkdWUgdG8gbGFjayBvZiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZAorICogeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgYXBwZW5kIGl0ZXJhdG9yCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cworICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheQorICogQHBhcmFtIG5fZWxlbWVudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5fZWxlbWVudHMpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpICYmIGVsZW1lbnRfdHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPnUud3JpdGVyLmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzID49IDAsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAvIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoZWxlbWVudF90eXBlID09IERCVVNfVFlQRV9CT09MRUFOKQorICAgIHsKKyAgICAgIGNvbnN0IGRidXNfYm9vbF90ICogY29uc3QgKmJvb2xzID0gdmFsdWU7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZWxlbWVudHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKCpib29scylbaV0gPT0gMCB8fCAoKmJvb2xzKVtpXSA9PSAxLCBGQUxTRSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9maXhlZF9tdWx0aSAoJnJlYWwtPnUud3JpdGVyLCBlbGVtZW50X3R5cGUsIHZhbHVlLCBuX2VsZW1lbnRzKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEFwcGVuZHMgYSBjb250YWluZXItdHlwZWQgdmFsdWUgdG8gdGhlIG1lc3NhZ2U7IHlvdSBhcmUgcmVxdWlyZWQgdG8KKyAqIGFwcGVuZCB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciB1c2luZyB0aGUgcmV0dXJuZWQKKyAqIHN1Yi1pdGVyYXRvciwgYW5kIHRoZW4gY2FsbAorICogZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyKCkuIENvbnRhaW5lciB0eXBlcyBhcmUgZm9yCisgKiBleGFtcGxlIHN0cnVjdCwgdmFyaWFudCwgYW5kIGFycmF5LiBGb3IgdmFyaWFudHMsIHRoZQorICogY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YgdGhlIHNpbmdsZSB2YWx1ZSBpbnNpZGUKKyAqIHRoZSB2YXJpYW50LiBGb3Igc3RydWN0cyBhbmQgZGljdCBlbnRyaWVzLCBjb250YWluZWRfc2lnbmF0dXJlCisgKiBzaG91bGQgYmUgI05VTEw7IGl0IHdpbGwgYmUgc2V0IHRvIHdoYXRldmVyIHR5cGVzIHlvdSB3cml0ZSBpbnRvCisgKiB0aGUgc3RydWN0LiAgRm9yIGFycmF5cywgY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YKKyAqIHRoZSBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBAdG9kbyBJZiB0aGlzIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIG1lc3NhZ2UgaXMgaG9zZWQgYW5kCisgKiB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIGNvbnRhaW5lZF9zaWduYXR1cmUgdGhlIHR5cGUgb2YgY29udGFpbmVyIGNvbnRlbnRzCisgKiBAcGFyYW0gc3ViIHN1Yi1pdGVyYXRvciB0byBpbml0aWFsaXplCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqY29udGFpbmVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1YikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKyAgREJ1c1N0cmluZyBjb250YWluZWRfc3RyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9jaGVjayAocmVhbCksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfY29udGFpbmVyICh0eXBlKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN1YiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKHR5cGUgPT0gREJVU19UWVBFX1NUUlVDVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfc2lnbmF0dXJlID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IERCVVNfVFlQRV9WQVJJQU5UICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF9zaWduYXR1cmUgIT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSAhPSBOVUxMKSwgRkFMU0UpOworICAKKyAgLyogdGhpcyB3b3VsZCBmYWlsIGlmIHRoZSBjb250YWluZWRfc2lnbmF0dXJlIGlzIGEgZGljdCBlbnRyeSwgc2luY2UKKyAgICogZGljdCBlbnRyaWVzIGFyZSBpbnZhbGlkIHNpZ25hdHVyZXMgc3RhbmRhbG9uZSAodGhleSBtdXN0IGJlIGluCisgICAqIGFuIGFycmF5KQorICAgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICgodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYgY29udGFpbmVkX3NpZ25hdHVyZSAmJiAqY29udGFpbmVkX3NpZ25hdHVyZSA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGFpbmVkX3NpZ25hdHVyZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3NpZ25hdHVyZSAoY29udGFpbmVkX3NpZ25hdHVyZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAocmVhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgICpyZWFsX3N1YiA9ICpyZWFsOworCisgIGlmIChjb250YWluZWRfc2lnbmF0dXJlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250YWluZWRfc3RyLCBjb250YWluZWRfc2lnbmF0dXJlKTsKKworICAgICAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZWRfc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsX3N1Yi0+dS53cml0ZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmcmVhbC0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsX3N1Yi0+dS53cml0ZXIpOworICAgIH0gCit9CisKKworLyoqCisgKiBDbG9zZXMgYSBjb250YWluZXItdHlwZWQgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIG1lc3NhZ2U7IG1heSB3cml0ZQorICogb3V0IG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIG1lc3NhZ2Uga25vd24gb25seSBhZnRlciB0aGUgZW50aXJlCisgKiBjb250YWluZXIgaXMgd3JpdHRlbiwgYW5kIG1heSBmcmVlIHJlc291cmNlcyBjcmVhdGVkIGJ5CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLgorICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGFwcGVuZCBpdGVyYXRvcgorICogQHBhcmFtIHN1YiBzdWItaXRlcmF0b3IgdG8gY2xvc2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsX3N1YiA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopc3ViOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUiwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWxfc3ViKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWxfc3ViLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIsIEZBTFNFKTsKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhbF9zdWItPnUud3JpdGVyKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQWJhbmRvbnMgY3JlYXRpb24gb2YgYSBjb250YWluZWQtdHlwZWQgdmFsdWUgYW5kIGZyZWVzIHJlc291cmNlcyBjcmVhdGVkCisgKiBieSBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLiAgT25jZSB0aGlzIHJldHVybnMsIHRoZSBtZXNzYWdlCisgKiBpcyBob3NlZCBhbmQgeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYWJhbmRvbiBjcmVhdGlvbiBvZiBhIG1lc3NhZ2Ugd2hlbiB5b3UgaGF2ZQorICogb3BlbiBjb250YWluZXJzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSBzdWIgc3ViLWl0ZXJhdG9yIHRvIGNsb3NlCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWxfc3ViID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilzdWI7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUik7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsX3N1YikpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocmVhbF9zdWItPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUik7CisKKyAgX2RidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fc2lnbmF0dXJlIChyZWFsKTsKK30KKworLyoqCisgKiBTZXRzIGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIG1lc3NhZ2UgZG9lcyBub3Qgd2FudCBhIHJlcGx5OyBpZgorICogdGhpcyBmbGFnIGlzIHNldCwgdGhlIG90aGVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiBtYXkgKGJ1dCBpcyBub3QKKyAqIHJlcXVpcmVkIHRvKSBvcHRpbWl6ZSBieSBub3Qgc2VuZGluZyBtZXRob2QgcmV0dXJuIG9yIGVycm9yCisgKiByZXBsaWVzLiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIHRoZQorICogbWVzc2FnZSBzdWNjZXNzZnVsbHkgYXJyaXZlZCBhdCB0aGUgcmVtb3RlIGVuZC4gTm9ybWFsbHkgeW91IGtub3cgYQorICogbWVzc2FnZSB3YXMgcmVjZWl2ZWQgd2hlbiB5b3UgcmVjZWl2ZSB0aGUgcmVwbHkgdG8gaXQuCisgKgorICogVGhlIGZsYWcgaXMgI0ZBTFNFIGJ5IGRlZmF1bHQsIHRoYXQgaXMgYnkgZGVmYXVsdCB0aGUgb3RoZXIgZW5kIGlzCisgKiByZXF1aXJlZCB0byByZXBseS4KKyAqCisgKiBPbiB0aGUgcHJvdG9jb2wgbGV2ZWwgdGhpcyB0b2dnbGVzICNEQlVTX0hFQURFUl9GTEFHX05PX1JFUExZX0VYUEVDVEVECisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gbm9fcmVwbHkgI1RSVUUgaWYgbm8gcmVwbHkgaXMgZGVzaXJlZAorICovCit2b2lkCitkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBub19yZXBseSkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkKTsKKworICBfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19OT19SRVBMWV9FWFBFQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19yZXBseSk7Cit9CisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBkb2VzIG5vdCBleHBlY3QKKyAqIGEgcmVwbHkuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIHNlbmRlciBpc24ndCB3YWl0aW5nIGZvciBhIHJlcGx5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKworICByZXR1cm4gX2RidXNfaGVhZGVyX2dldF9mbGFnICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GTEFHX05PX1JFUExZX0VYUEVDVEVEKTsKK30KKworLyoqCisgKiBTZXRzIGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYW4gb3duZXIgZm9yIHRoZSBkZXN0aW5hdGlvbiBuYW1lIHdpbGwKKyAqIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBiZWZvcmUgdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkLiBXaGVuIHRoaXMKKyAqIGZsYWcgaXMgc2V0LCB0aGUgbWVzc2FnZSBpcyBoZWxkIHVudGlsIGEgbmFtZSBvd25lciBmaW5pc2hlcworICogc3RhcnRpbmcgdXAsIG9yIGZhaWxzIHRvIHN0YXJ0IHVwLiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXBseQorICogd2lsbCBiZSBhbiBlcnJvci4KKyAqCisgKiBUaGUgZmxhZyBpcyBzZXQgdG8gI1RSVUUgYnkgZGVmYXVsdCwgaS5lLiBhdXRvIHN0YXJ0aW5nIGlzIHRoZSBkZWZhdWx0LgorICoKKyAqIE9uIHRoZSBwcm90b2NvbCBsZXZlbCB0aGlzIHRvZ2dsZXMgI0RCVVNfSEVBREVSX0ZMQUdfTk9fQVVUT19TVEFSVAorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGF1dG9fc3RhcnQgI1RSVUUgaWYgYXV0by1zdGFydGluZyBpcyBkZXNpcmVkCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBhdXRvX3N0YXJ0KQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQpOworCisgIF9kYnVzX2hlYWRlcl90b2dnbGVfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWF1dG9fc3RhcnQpOworfQorCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2Ugd2lsbCBjYXVzZSBhbiBvd25lciBmb3IKKyAqIGRlc3RpbmF0aW9uIG5hbWUgdG8gYmUgYXV0by1zdGFydGVkLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSB3aWxsIHVzZSBhdXRvLXN0YXJ0CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fc3RhcnQgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiAhX2RidXNfaGVhZGVyX2dldF9mbGFnICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19OT19BVVRPX1NUQVJUKTsKK30KKworCisvKioKKyAqIFNldHMgdGhlIG9iamVjdCBwYXRoIHRoaXMgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvIChmb3IKKyAqIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvciB0aGUgb25lIGEgc2lnbmFsIGlzIGJlaW5nCisgKiBlbWl0dGVkIGZyb20gKGZvciBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpLgorICoKKyAqIFRoZSBwYXRoIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBvYmplY3RfcGF0aCB0aGUgcGF0aCBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKm9iamVjdF9wYXRoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChvYmplY3RfcGF0aCA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfcGF0aCAob2JqZWN0X3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3BhdGgpOworfQorCisvKioKKyAqIEdldHMgdGhlIG9iamVjdCBwYXRoIHRoaXMgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvIChmb3IKKyAqIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvciBiZWluZyBlbWl0dGVkIGZyb20gKGZvcgorICogREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4gUmV0dXJucyAjTlVMTCBpZiBub25lLgorICoKKyAqIFNlZSBhbHNvIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkKCkuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHBhdGggKHNob3VsZCBub3QgYmUgZnJlZWQpIG9yICNOVUxMCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX09CSkVDVF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBoYXMgYSBwYXJ0aWN1bGFyIG9iamVjdCBwYXRoLiAgVGhlIG9iamVjdAorICogcGF0aCBpcyB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhIG1ldGhvZCBjYWxsIG9yIHRoZSBlbWl0dGluZworICogb2JqZWN0IGZvciBhIHNpZ25hbC4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHBhdGggdGhlIHBhdGggbmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgaXMgYSBwYXRoIGZpZWxkIGluIHRoZSBoZWFkZXIKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfcGF0aCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqcGF0aCkKK3sKKyAgY29uc3QgY2hhciAqbXNnX3BhdGg7CisgIG1zZ19wYXRoID0gZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKTsKKyAgCisgIGlmIChtc2dfcGF0aCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChwYXRoID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAgCisgIGlmIChzdHJjbXAgKG1zZ19wYXRoLCBwYXRoKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBvYmplY3QgcGF0aCB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0bworICogKGZvciBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgYmVpbmcgZW1pdHRlZAorICogZnJvbSAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkgaW4gYSBkZWNvbXBvc2VkCisgKiBmb3JtYXQgKG9uZSBhcnJheSBlbGVtZW50IHBlciBwYXRoIGNvbXBvbmVudCkuCisgKiBGcmVlIHRoZSByZXR1cm5lZCBhcnJheSB3aXRoIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKS4KKyAqCisgKiBBbiBlbXB0eSBidXQgbm9uLU5VTEwgcGF0aCBhcnJheSBtZWFucyB0aGUgcGF0aCAiLyIuCisgKiBTbyB0aGUgcGF0aCAiL2Zvby9iYXIiIGJlY29tZXMgeyAiZm9vIiwgImJhciIsIE5VTEwgfQorICogYW5kIHRoZSBwYXRoICIvIiBiZWNvbWVzIHsgTlVMTCB9LgorICoKKyAqIFNlZSBhbHNvIGRidXNfbWVzc2FnZV9nZXRfcGF0aCgpLgorICogCisgKiBAdG9kbyB0aGlzIGNvdWxkIGJlIG9wdGltaXplZCBieSB1c2luZyB0aGUgbGVuIGZyb20gdGhlIG1lc3NhZ2UKKyAqIGluc3RlYWQgb2YgY2FsbGluZyBzdHJsZW4oKSBhZ2FpbgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gcGF0aCBwbGFjZSB0byBzdG9yZSBhbGxvY2F0ZWQgYXJyYXkgb2YgcGF0aCBjb21wb25lbnRzOyAjTlVMTCBzZXQgaGVyZSBpZiBubyBwYXRoIGZpZWxkIGV4aXN0cworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYXJyYXkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICoqKnBhdGgpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKworICAqcGF0aCA9IE5VTEw7CisKKyAgdiA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSk7CisgIGlmICh2ICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19kZWNvbXBvc2VfcGF0aCAodiwgc3RybGVuICh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBpbnRlcmZhY2UgdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdG8KKyAqIChmb3IgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yCisgKiB0aGUgaW50ZXJmYWNlIGEgc2lnbmFsIGlzIGJlaW5nIGVtaXR0ZWQgZnJvbQorICogKGZvciBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpLgorICoKKyAqIFRoZSBpbnRlcmZhY2UgbmFtZSBtdXN0IGNvbnRhaW4gb25seSB2YWxpZCBjaGFyYWN0ZXJzIGFzIGRlZmluZWQKKyAqIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGludGVyZmFjZSB0aGUgaW50ZXJmYWNlIG9yICNOVUxMIHRvIHVuc2V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICppbnRlcmZhY2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGludGVyZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfaW50ZXJmYWNlIChpbnRlcmZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpbnRlcmZhY2UgdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdG8KKyAqIChmb3IgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIGJlaW5nIGVtaXR0ZWQKKyAqIGZyb20gKGZvciBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpLgorICogVGhlIGludGVyZmFjZSBuYW1lIGlzIGZ1bGx5LXF1YWxpZmllZCAobmFtZXNwYWNlZCkuCisgKiBSZXR1cm5zICNOVUxMIGlmIG5vbmUuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSBpbnRlcmZhY2UgKHNob3VsZCBub3QgYmUgZnJlZWQpIG9yICNOVUxMCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBoYXMgYW4gaW50ZXJmYWNlCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpbnRlcmZhY2UgdGhlIGludGVyZmFjZSBuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgaW50ZXJmYWNlIGZpZWxkIGluIHRoZSBoZWFkZXIgbWF0Y2hlcworICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19pbnRlcmZhY2UgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaW50ZXJmYWNlKQoreworICBjb25zdCBjaGFyICptc2dfaW50ZXJmYWNlOworICBtc2dfaW50ZXJmYWNlID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworICAgCisgIGlmIChtc2dfaW50ZXJmYWNlID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGludGVyZmFjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoaW50ZXJmYWNlID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAgICAKKyAgaWYgKHN0cmNtcCAobXNnX2ludGVyZmFjZSwgaW50ZXJmYWNlKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKKworfQorCisvKioKKyAqIFNldHMgdGhlIGludGVyZmFjZSBtZW1iZXIgYmVpbmcgaW52b2tlZAorICogKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvciBlbWl0dGVkCisgKiAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKS4KKyAqCisgKiBUaGUgbWVtYmVyIG5hbWUgbXVzdCBjb250YWluIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBhcyBkZWZpbmVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG1lbWJlciB0aGUgbWVtYmVyIG9yICNOVUxMIHRvIHVuc2V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICptZW1iZXIpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lbWJlciA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyIChtZW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpbnRlcmZhY2UgbWVtYmVyIGJlaW5nIGludm9rZWQKKyAqIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgZW1pdHRlZAorICogKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuIFJldHVybnMgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVtYmVyIG5hbWUgKHNob3VsZCBub3QgYmUgZnJlZWQpIG9yICNOVUxMCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBoYXMgYW4gaW50ZXJmYWNlIG1lbWJlcgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gbWVtYmVyIHRoZSBtZW1iZXIgbmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgaXMgYSBtZW1iZXIgZmllbGQgaW4gdGhlIGhlYWRlcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19tZW1iZXIgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbWVtYmVyKQoreworICBjb25zdCBjaGFyICptc2dfbWVtYmVyOworICBtc2dfbWVtYmVyID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworIAorICBpZiAobXNnX21lbWJlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChtZW1iZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG1lbWJlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAKKyAgaWYgKHN0cmNtcCAobXNnX21lbWJlciwgbWVtYmVyKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKKworfQorCisvKioKKyAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGVycm9yIChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikuCisgKiBUaGUgbmFtZSBpcyBmdWxseS1xdWFsaWZpZWQgKG5hbWVzcGFjZWQpLgorICoKKyAqIFRoZSBlcnJvciBuYW1lIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBlcnJvcl9uYW1lIHRoZSBuYW1lIG9yICNOVUxMIHRvIHVuc2V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmVycm9yX25hbWUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yX25hbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2Vycm9yX25hbWUgKGVycm9yX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX25hbWUpOworfQorCisvKioKKyAqIEdldHMgdGhlIGVycm9yIG5hbWUgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SIG9ubHkpCisgKiBvciAjTlVMTCBpZiBub25lLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBlcnJvciBuYW1lIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqdjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgdiA9IE5VTEw7IC8qIGluIGNhc2UgZmllbGQgZG9lc24ndCBleGlzdCAqLworICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIFNldHMgdGhlIG1lc3NhZ2UncyBkZXN0aW5hdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBuYW1lIG9mCisgKiBhbm90aGVyIGNvbm5lY3Rpb24gb24gdGhlIGJ1cyBhbmQgbWF5IGJlIGVpdGhlciB0aGUgdW5pcXVlIG5hbWUKKyAqIGFzc2lnbmVkIGJ5IHRoZSBidXMgdG8gZWFjaCBjb25uZWN0aW9uLCBvciBhIHdlbGwta25vd24gbmFtZQorICogc3BlY2lmaWVkIGluIGFkdmFuY2UuCisgKgorICogVGhlIGRlc3RpbmF0aW9uIG5hbWUgbXVzdCBjb250YWluIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBhcyBkZWZpbmVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gbmFtZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmRlc3RpbmF0aW9uKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXN0aW5hdGlvbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKGRlc3RpbmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIGRlc3RpbmF0aW9uIG9mIGEgbWVzc2FnZSBvciAjTlVMTCBpZiB0aGVyZSBpcyBub25lIHNldC4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZ2KTsKKyAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWVzc2FnZSBzZW5kZXIuCisgKgorICogVGhlIHNlbmRlciBtdXN0IGJlIGEgdmFsaWQgYnVzIG5hbWUgYXMgZGVmaW5lZCBpbiB0aGUgRC1CdXMKKyAqIHNwZWNpZmljYXRpb24uCisgKgorICogVXN1YWxseSB5b3UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMuIFRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gd2lsbAorICogY2FsbCBpdCB0byBzZXQgdGhlIG9yaWdpbiBvZiBlYWNoIG1lc3NhZ2UuIElmIHlvdSBhcmVuJ3QgaW1wbGVtZW50aW5nCisgKiBhIG1lc3NhZ2UgYnVzIGRhZW1vbiB5b3Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IHRoZSBzZW5kZXIuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBzZW5kZXIgdGhlIHNlbmRlciBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqc2VuZGVyKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZW5kZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChzZW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKworICByZXR1cm4gc2V0X29yX2RlbGV0ZV9zdHJpbmdfZmllbGQgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0VOREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB3aGljaCBvcmlnaW5hdGVkIHRoaXMKKyAqIG1lc3NhZ2UsIG9yICNOVUxMIGlmIHVua25vd24gb3IgaW5hcHBsaWNhYmxlLiBUaGUgc2VuZGVyIGlzIGZpbGxlZAorICogaW4gYnkgdGhlIG1lc3NhZ2UgYnVzLgorICoKKyAqIE5vdGUsIHRoZSByZXR1cm5lZCBzZW5kZXIgaXMgYWx3YXlzIHRoZSB1bmlxdWUgYnVzIG5hbWUuCisgKiBDb25uZWN0aW9ucyBtYXkgb3duIG11bHRpcGxlIG90aGVyIGJ1cyBuYW1lcywgYnV0IHRob3NlCisgKiBhcmUgbm90IGZvdW5kIGluIHRoZSBzZW5kZXIgZmllbGQuCisgKiAKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBzZW5kZXIgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqdjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgdiA9IE5VTEw7IC8qIGluIGNhc2UgZmllbGQgZG9lc24ndCBleGlzdCAqLworICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZ2KTsKKyAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UsIGkuZS4gdGhlIGFyZ3VtZW50cyBpbiB0aGUKKyAqIG1lc3NhZ2UgcGF5bG9hZC4gVGhlIHNpZ25hdHVyZSBpbmNsdWRlcyBvbmx5ICJpbiIgYXJndW1lbnRzIGZvcgorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMIGFuZCBvbmx5ICJvdXQiIGFyZ3VtZW50cyBmb3IKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOLCBzbyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbQorICogd2hhdCB5b3UgbWlnaHQgZXhwZWN0ICh0aGF0IGlzLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlCisgKiBlbnRpcmUgQysrLXN0eWxlIG1ldGhvZCkuCisgKgorICogVGhlIHNpZ25hdHVyZSBpcyBhIHN0cmluZyBtYWRlIHVwIG9mIHR5cGUgY29kZXMgc3VjaCBhcworICogI0RCVVNfVFlQRV9JTlQzMi4gVGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIHdpdGggbnVsIChudWwgaXMgYWxzbworICogdGhlIHZhbHVlIG9mICNEQlVTX1RZUEVfSU5WQUxJRCkuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHI7CisgIGludCB0eXBlX3BvczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgZ2V0X2NvbnN0X3NpZ25hdHVyZSAoJm1lc3NhZ2UtPmhlYWRlciwgJnR5cGVfc3RyLCAmdHlwZV9wb3MpOworCisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh0eXBlX3N0ciwgdHlwZV9wb3MsIDApOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaGFzX3R5cGVfaW50ZXJmYWNlX21lbWJlciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbWVtYmVyKQoreworICBjb25zdCBjaGFyICpuOworCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChpbnRlcmZhY2UgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobWVtYmVyICE9IE5VTEwpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IHR5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIE9wdGltaXplIGJ5IGNoZWNraW5nIHRoZSBzaG9ydCBtZW1iZXIgbmFtZSBmaXJzdAorICAgKiBpbnN0ZWFkIG9mIHRoZSBsb25nZXIgaW50ZXJmYWNlIG5hbWUKKyAgICovCisKKyAgbiA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKworICBpZiAobiAmJiBzdHJjbXAgKG4sIG1lbWJlcikgPT0gMCkKKyAgICB7CisgICAgICBuID0gZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpOworCisgICAgICBpZiAobiA9PSBOVUxMIHx8IHN0cmNtcCAobiwgaW50ZXJmYWNlKSA9PSAwKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEgbWV0aG9kIGNhbGwgd2l0aCB0aGUgZ2l2ZW4KKyAqIGludGVyZmFjZSBhbmQgbWVtYmVyIGZpZWxkcy4gIElmIHRoZSBtZXNzYWdlIGlzIG5vdAorICogI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLCBvciBoYXMgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIG9yCisgKiBtZW1iZXIgZmllbGQsIHJldHVybnMgI0ZBTFNFLiBJZiB0aGUgaW50ZXJmYWNlIGZpZWxkIGlzIG1pc3NpbmcsCisgKiB0aGVuIGl0IHdpbGwgYmUgYXNzdW1lZCBlcXVhbCB0byB0aGUgcHJvdmlkZWQgaW50ZXJmYWNlLiAgVGhlIEQtQnVzCisgKiBwcm90b2NvbCBhbGxvd3MgbWV0aG9kIGNhbGxlcnMgdG8gbGVhdmUgb3V0IHRoZSBpbnRlcmZhY2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGludGVyZmFjZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBpcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCBjYWxsCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbWV0aG9kKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGludGVyZmFjZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWV0aG9kICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBpbnRlcmZhY2UvbWV0aG9kIGFyZSB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZQorICAgKiBleHBlbnNpdmUsIGFuZCBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIHJldHVybiBfZGJ1c19tZXNzYWdlX2hhc190eXBlX2ludGVyZmFjZV9tZW1iZXIgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsIG1ldGhvZCk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgYSBzaWduYWwgd2l0aCB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGFuZAorICogbWVtYmVyIGZpZWxkcy4gIElmIHRoZSBtZXNzYWdlIGlzIG5vdCAjREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLCBvcgorICogaGFzIGEgZGlmZmVyZW50IGludGVyZmFjZSBvciBtZW1iZXIgZmllbGQsIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gaW50ZXJmYWNlIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqIEBwYXJhbSBzaWduYWxfbmFtZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgaXMgdGhlIHNwZWNpZmllZCBzaWduYWwKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pc19zaWduYWwgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzaWduYWxfbmFtZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbnRlcmZhY2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpZ25hbF9uYW1lICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBpbnRlcmZhY2UvbmFtZSBhcmUgdmFsaWQgc2luY2UgaXQgd291bGQgYmUKKyAgICogZXhwZW5zaXZlLCBhbmQgbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICByZXR1cm4gX2RidXNfbWVzc2FnZV9oYXNfdHlwZV9pbnRlcmZhY2VfbWVtYmVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwgc2lnbmFsX25hbWUpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGFuIGVycm9yIHJlcGx5IHdpdGggdGhlIGdpdmVuIGVycm9yCisgKiBuYW1lLiAgSWYgdGhlIG1lc3NhZ2UgaXMgbm90ICNEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiwgb3IgaGFzIGEKKyAqIGRpZmZlcmVudCBuYW1lLCByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGVycm9yX25hbWUgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGlzIHRoZSBzcGVjaWZpZWQgZXJyb3IKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pc19lcnJvciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9uYW1lKQoreworICBjb25zdCBjaGFyICpuOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZXJyb3JfbmFtZSAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIGRvbid0IGNoZWNrIHRoYXQgZXJyb3JfbmFtZSBpcyB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZSBleHBlbnNpdmUsCisgICAqIGFuZCBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHJldHVybiBGQUxTRTsKKworICBuID0gZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKTsKKworICBpZiAobiAmJiBzdHJjbXAgKG4sIGVycm9yX25hbWUpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQgdG8gdGhlIGdpdmVuIG5hbWUuICBJZiB0aGUKKyAqIG1lc3NhZ2UgaGFzIG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCBvciBoYXMgYSBkaWZmZXJlbnQKKyAqIGRlc3RpbmF0aW9uLCByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhcyB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gbmFtZQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19kZXN0aW5hdGlvbiAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpuYW1lKQoreworICBjb25zdCBjaGFyICpzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIGRvbid0IGNoZWNrIHRoYXQgbmFtZSBpcyB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZSBleHBlbnNpdmUsIGFuZAorICAgKiBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIHMgPSBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKTsKKworICBpZiAocyAmJiBzdHJjbXAgKHMsIG5hbWUpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaGFzIHRoZSBnaXZlbiB1bmlxdWUgbmFtZSBhcyBpdHMgc2VuZGVyLgorICogSWYgdGhlIG1lc3NhZ2UgaGFzIG5vIHNlbmRlciBzcGVjaWZpZWQgb3IgaGFzIGEgZGlmZmVyZW50IHNlbmRlciwKKyAqIHJldHVybnMgI0ZBTFNFLiBOb3RlIHRoYXQgYSBwZWVyIGFwcGxpY2F0aW9uIHdpbGwgYWx3YXlzIGhhdmUgdGhlCisgKiB1bmlxdWUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiBhcyB0aGUgc2VuZGVyLiBTbyB5b3UgY2FuJ3QgdXNlIHRoaXMKKyAqIGZ1bmN0aW9uIHRvIHNlZSB3aGV0aGVyIGEgc2VuZGVyIG93bmVkIGEgd2VsbC1rbm93biBuYW1lLgorICoKKyAqIE1lc3NhZ2VzIGZyb20gdGhlIGJ1cyBpdHNlbGYgd2lsbCBoYXZlICNEQlVTX1NFUlZJQ0VfREJVUworICogYXMgdGhlIHNlbmRlci4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhcyB0aGUgZ2l2ZW4gc2VuZGVyCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworICAvKiBkb24ndCBjaGVjayB0aGF0IG5hbWUgaXMgdmFsaWQgc2luY2UgaXQgd291bGQgYmUgZXhwZW5zaXZlLCBhbmQKKyAgICogbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICBzID0gZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpOworCisgIGlmIChzICYmIHN0cmNtcCAocywgbmFtZSkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIHNpZ25hdHVyZTsgc2VlCisgKiBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSgpIGZvciBtb3JlIGRldGFpbHMgb24gd2hhdCB0aGUgc2lnbmF0dXJlCisgKiBsb29rcyBsaWtlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2lnbmF0dXJlIHR5cGVjb2RlIGFycmF5CisgKiBAcmV0dXJucyAjVFJVRSBpZiBtZXNzYWdlIGhhcyB0aGUgZ2l2ZW4gc2lnbmF0dXJlCisqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNpZ25hdHVyZSkKK3sKKyAgY29uc3QgY2hhciAqczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpZ25hdHVyZSAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIGRvbid0IGNoZWNrIHRoYXQgc2lnbmF0dXJlIGlzIHZhbGlkIHNpbmNlIGl0IHdvdWxkIGJlIGV4cGVuc2l2ZSwKKyAgICogYW5kIG5vdCBjYXRjaCBtYW55IGNvbW1vbiBlcnJvcnMKKyAgICovCisKKyAgcyA9IGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKTsKKworICBpZiAocyAmJiBzdHJjbXAgKHMsIHNpZ25hdHVyZSkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZXRzIGEgI0RCdXNFcnJvciBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuCisgKiBtZXNzYWdlLiBUaGUgZXJyb3IgaXMgb25seSBzZXQgaWYgdGhlIG1lc3NhZ2UKKyAqIGlzIGFuIGVycm9yIG1lc3NhZ2UsIGFzIGluICNEQlVTX01FU1NBR0VfVFlQRV9FUlJPUi4KKyAqIFRoZSBuYW1lIG9mIHRoZSBlcnJvciBpcyBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2UsCisgKiBhbmQgdGhlIGVycm9yIG1lc3NhZ2UgaXMgc2V0IHRvIHRoZSBmaXJzdCBhcmd1bWVudAorICogaWYgdGhlIGFyZ3VtZW50IGV4aXN0cyBhbmQgaXMgYSBzdHJpbmcuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3Igd2FzIHNldCAodGhlIGVycm9yIGlzCisgKiBzZXQgaWYgYW5kIG9ubHkgaWYgdGhlIG1lc3NhZ2UgaXMgYW4gZXJyb3IgbWVzc2FnZSkuICBTbyB5b3UgY2FuCisgKiBjaGVjayBmb3IgYW4gZXJyb3IgcmVwbHkgYW5kIGNvbnZlcnQgaXQgdG8gREJ1c0Vycm9yIGluIG9uZSBnbzoKKyAqIEBjb2RlCisgKiAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAqICAgIHJldHVybiBlcnJvcjsKKyAqICBlbHNlCisgKiAgICBwcm9jZXNzIHJlcGx5OworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHRvIHNldAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2V0IGl0IGZyb20KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhZCB0eXBlICNEQlVTX01FU1NBR0VfVFlQRV9FUlJPUgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChEQnVzRXJyb3IgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICpzdHI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBGQUxTRSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHN0ciA9IE5VTEw7CisgIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICBzdHIgPyAiJXMiIDogTlVMTCwgc3RyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIG1lc3NhZ2UgY29udGFpbnMgdW5peCBmZHMKKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgdW5peCBmZHMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyhEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19hc3NlcnQobWVzc2FnZSk7CisKKyAgcmV0dXJuIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwOworI2Vsc2UKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZXNzYWdlSW50ZXJuYWxzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRoZSBpbml0aWFsIGJ1ZmZlciBzaXplIG9mIHRoZSBtZXNzYWdlIGxvYWRlci4KKyAqCisgKiBAdG9kbyB0aGlzIHNob3VsZCBiZSBiYXNlZCBvbiBtaW4gaGVhZGVyIHNpemUgcGx1cyBzb21lIGF2ZXJhZ2UKKyAqIGJvZHkgc2l6ZSwgb3Igc29tZXRoaW5nLiBPciByYXRoZXIsIHRoZSBtaW4gaGVhZGVyIHNpemUgb25seSwgaWYgd2UKKyAqIHdhbnQgdG8gdHJ5IHRvIHJlYWQgb25seSB0aGUgaGVhZGVyLCBzdG9yZSB0aGF0IGluIGEgREJ1c01lc3NhZ2UsCisgKiB0aGVuIHJlYWQgb25seSB0aGUgYm9keSBhbmQgc3RvcmUgdGhhdCwgZXRjLiwgZGVwZW5kcyBvbgorICogaG93IHdlIG9wdGltaXplIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIoKSBhbmQgd2hhdAorICogdGhlIGV4YWN0IG1lc3NhZ2UgZm9ybWF0IGlzLgorICovCisjZGVmaW5lIElOSVRJQUxfTE9BREVSX0RBVEFfTEVOIDMyCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIGxvYWRlci4gUmV0dXJucyAjTlVMTCBpZiBtZW1vcnkgY2FuJ3QKKyAqIGJlIGFsbG9jYXRlZC4KKyAqCisgKiBAcmV0dXJucyBuZXcgbG9hZGVyLCBvciAjTlVMTC4KKyAqLworREJ1c01lc3NhZ2VMb2FkZXIqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXI7CisKKyAgbG9hZGVyID0gZGJ1c19uZXcwIChEQnVzTWVzc2FnZUxvYWRlciwgMSk7CisgIGlmIChsb2FkZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGxvYWRlci0+cmVmY291bnQgPSAxOworCisgIGxvYWRlci0+Y29ycnVwdGVkID0gRkFMU0U7CisgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSBEQlVTX1ZBTElEOworCisgIC8qIHRoaXMgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgdGhlIGFwcCwgYnV0IGRlZmF1bHRzIHRvIHRoZSBwcm90b2NvbCBtYXggKi8KKyAgbG9hZGVyLT5tYXhfbWVzc2FnZV9zaXplID0gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIOworCisgIC8qIFdlIHNldCBhIHZlcnkgcmVsYXRpdmVseSBjb25zZXJ2YXRpdmUgZGVmYXVsdCBoZXJlIHNpbmNlIGR1ZSB0byBob3cKKyAgU0NNX1JJR0hUUyB3b3JrcyB3ZSBuZWVkIHRvIHByZWFsbG9jYXRlIGFuIGZkIGFycmF5IG9mIHRoZSBtYXhpbXVtCisgIG51bWJlciBvZiB1bml4IGZkcyB3ZSB3YW50IHRvIHJlY2VpdmUgaW4gYWR2YW5jZS4gQQorICB0cnktYW5kLXJlYWxsb2NhdGUgbG9vcCBpcyBub3QgcG9zc2libGUuICovCisgIGxvYWRlci0+bWF4X21lc3NhZ2VfdW5peF9mZHMgPSAxMDI0OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsb2FkZXItPmRhdGEpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAobG9hZGVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBwcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIGZvciBzcGVlZCwgaWdub3JlIGZhaWx1cmUgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZsb2FkZXItPmRhdGEsIElOSVRJQUxfTE9BREVSX0RBVEFfTEVOKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZsb2FkZXItPmRhdGEsIDApOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgbG9hZGVyLT51bml4X2ZkcyA9IE5VTEw7CisgIGxvYWRlci0+bl91bml4X2ZkcyA9IGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSAwOworICBsb2FkZXItPnVuaXhfZmRzX291dHN0YW5kaW5nID0gRkFMU0U7CisjZW5kaWYKKworICByZXR1cm4gbG9hZGVyOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgbG9hZGVyLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zIHRoZSBsb2FkZXIKKyAqLworREJ1c01lc3NhZ2VMb2FkZXIgKgorX2RidXNfbWVzc2FnZV9sb2FkZXJfcmVmIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBsb2FkZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGxvYWRlcjsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGxvYWRlciBhbmQgZmluYWxpemVzIHRoZQorICogbG9hZGVyIHdoZW4gdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBsb2FkZXItPnJlZmNvdW50IC09IDE7CisgIGlmIChsb2FkZXItPnJlZmNvdW50ID09IDApCisgICAgeworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBjbG9zZV91bml4X2Zkcyhsb2FkZXItPnVuaXhfZmRzLCAmbG9hZGVyLT5uX3VuaXhfZmRzKTsKKyAgICAgIGRidXNfZnJlZShsb2FkZXItPnVuaXhfZmRzKTsKKyNlbmRpZgorICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmbG9hZGVyLT5tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfbWVzc2FnZV91bnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmbG9hZGVyLT5tZXNzYWdlcyk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxvYWRlci0+ZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGxvYWRlcik7CisgICAgfQorfQorCisvKioKKyAqIEdldHMgdGhlIGJ1ZmZlciB0byB1c2UgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBuZXR3b3JrLiAgTmV0d29yaworICogZGF0YSBpcyByZWFkIGRpcmVjdGx5IGludG8gYW4gYWxsb2NhdGVkIGJ1ZmZlciwgd2hpY2ggaXMgdGhlbiB1c2VkCisgKiBpbiB0aGUgREJ1c01lc3NhZ2UsIHRvIGF2b2lkIGFzIG1hbnkgZXh0cmEgbWVtY3B5J3MgYXMgcG9zc2libGUuCisgKiBUaGUgYnVmZmVyIG11c3QgYWx3YXlzIGJlIHJldHVybmVkIGltbWVkaWF0ZWx5IHVzaW5nCisgKiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKCksIGV2ZW4gaWYgbm8gYnl0ZXMgYXJlCisgKiBzdWNjZXNzZnVsbHkgcmVhZC4KKyAqCisgKiBAdG9kbyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBhIGxvdCBtb3JlIGNsZXZlci4gRm9yIGV4YW1wbGUKKyAqIGl0IGNhbiBwcm9iYWJseSBhbHdheXMgcmV0dXJuIGEgYnVmZmVyIHNpemUgdG8gcmVhZCBleGFjdGx5CisgKiB0aGUgYm9keSBvZiB0aGUgbmV4dCBtZXNzYWdlLCB0aHVzIGF2b2lkaW5nIGFueSBtZW1vcnkgd2FzdGFnZQorICogb3IgcmVhbGxvY3MuCisgKgorICogQHRvZG8gd2UgbmVlZCB0byBlbmZvcmNlIGEgbWF4IGxlbmd0aCBvbiBzdHJpbmdzIGluIGhlYWRlciBmaWVsZHMuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbWVzc2FnZSBsb2FkZXIuCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqKmJ1ZmZlcikKK3sKKyAgX2RidXNfYXNzZXJ0ICghbG9hZGVyLT5idWZmZXJfb3V0c3RhbmRpbmcpOworCisgICpidWZmZXIgPSAmbG9hZGVyLT5kYXRhOworCisgIGxvYWRlci0+YnVmZmVyX291dHN0YW5kaW5nID0gVFJVRTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgYnVmZmVyIG9idGFpbmVkIGZyb20gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlcigpLAorICogaW5kaWNhdGluZyB0byB0aGUgbG9hZGVyIGhvdyBtYW55IGJ5dGVzIG9mIHRoZSBidWZmZXIgd2VyZSBmaWxsZWQKKyAqIGluLiBUaGlzIGZ1bmN0aW9uIG11c3QgYWx3YXlzIGJlIGNhbGxlZCwgZXZlbiBpZiBubyBieXRlcyB3ZXJlCisgKiBzdWNjZXNzZnVsbHkgcmVhZC4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIuCisgKiBAcGFyYW0gYnl0ZXNfcmVhZCBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQgaW50byB0aGUgYnVmZmVyLgorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBieXRlc19yZWFkKQoreworICBfZGJ1c19hc3NlcnQgKGxvYWRlci0+YnVmZmVyX291dHN0YW5kaW5nKTsKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIgPT0gJmxvYWRlci0+ZGF0YSk7CisKKyAgbG9hZGVyLT5idWZmZXJfb3V0c3RhbmRpbmcgPSBGQUxTRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBidWZmZXIgdG8gdXNlIGZvciByZWFkaW5nIHVuaXggZmRzIGZyb20gdGhlIG5ldHdvcmsuCisgKgorICogVGhpcyB3b3JrcyBzaW1pbGFyIHRvIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIoKQorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIG1lc3NhZ2UgbG9hZGVyLgorICogQHBhcmFtIGZkcyB0aGUgYXJyYXkgdG8gcmVhZCBmZHMgaW50bworICogQHBhcmFtIG1heF9uX2ZkcyBob3cgbWFueSBmZHMgdG8gcmVhZCBhdCBtb3N0CisgKiBAcmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gT09NCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfdW5peF9mZHMoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKipmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgICAgICAgICptYXhfbl9mZHMpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgX2RidXNfYXNzZXJ0ICghbG9hZGVyLT51bml4X2Zkc19vdXRzdGFuZGluZyk7CisKKyAgLyogQWxsb2NhdGUgc3BhY2Ugd2hlcmUgd2UgY2FuIHB1dCB0aGUgZmRzIHdlIHJlYWQuIFdlIGFsbG9jYXRlCisgICAgIHNwYWNlIGZvciBtYXhfbWVzc2FnZV91bml4X2ZkcyBzaW5jZSB0aGlzIGlzIGFuCisgICAgIHVwcGVyIGxpbWl0IGhvdyBtYW55IGZkcyBjYW4gYmUgcmVjZWl2ZWQgd2l0aGluIGEgc2luZ2xlCisgICAgIG1lc3NhZ2UuIFNpbmNlIFNDTV9SSUdIVFMgZG9lc24ndCBhbGxvdyBhIHJlYWxsb2NhdGUrcmV0cnkgbG9naWMKKyAgICAgd2UgYXJlIGFsbG9jYXRpbmcgdGhlIG1heGltdW0gcG9zc2libGUgYXJyYXkgc2l6ZSByaWdodCBmcm9tIHRoZQorICAgICBiZWdpbm5pbmcuIFRoaXMgc3Vja3MgYSBiaXQsIGhvd2V2ZXIgdW5sZXNzIFNDTV9SSUdIVFMgaXMgZml4ZWQKKyAgICAgdGhlcmUgaXMgbm8gYmV0dGVyIHdheS4gKi8KKworICBpZiAobG9hZGVyLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA8IGxvYWRlci0+bWF4X21lc3NhZ2VfdW5peF9mZHMpCisgICAgeworICAgICAgaW50ICphID0gZGJ1c19yZWFsbG9jKGxvYWRlci0+dW5peF9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkcyAqIHNpemVvZihsb2FkZXItPnVuaXhfZmRzWzBdKSk7CisKKyAgICAgIGlmICghYSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBsb2FkZXItPnVuaXhfZmRzID0gYTsKKyAgICAgIGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzOworICAgIH0KKworICAqZmRzID0gbG9hZGVyLT51bml4X2ZkcyArIGxvYWRlci0+bl91bml4X2ZkczsKKyAgKm1heF9uX2ZkcyA9IGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQgLSBsb2FkZXItPm5fdW5peF9mZHM7CisKKyAgbG9hZGVyLT51bml4X2Zkc19vdXRzdGFuZGluZyA9IFRSVUU7CisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJQbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQgdW5peCBmZCBwYXNzaW5nIik7CisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJldHVybnMgYSBidWZmZXIgb2J0YWluZWQgZnJvbSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfdW5peF9mZHMoKS4KKyAqCisgKiBUaGlzIHdvcmtzIHNpbWlsYXIgdG8gX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlcigpCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbWVzc2FnZSBsb2FkZXIuCisgKiBAcGFyYW0gZmRzIHRoZSBhcnJheSBmZHMgd2VyZSByZWFkIGludG8KKyAqIEBwYXJhbSBtYXhfbl9mZHMgaG93IG1hbnkgZmRzIHdlcmUgcmVhZAorICovCisKK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2ZkcyhEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICAgICAgIG5fZmRzKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2Fzc2VydChsb2FkZXItPnVuaXhfZmRzX291dHN0YW5kaW5nKTsKKyAgX2RidXNfYXNzZXJ0KGxvYWRlci0+dW5peF9mZHMgKyBsb2FkZXItPm5fdW5peF9mZHMgPT0gZmRzKTsKKyAgX2RidXNfYXNzZXJ0KGxvYWRlci0+bl91bml4X2ZkcyArIG5fZmRzIDw9IGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQpOworCisgIGxvYWRlci0+bl91bml4X2ZkcyArPSBuX2ZkczsKKyAgbG9hZGVyLT51bml4X2Zkc19vdXRzdGFuZGluZyA9IEZBTFNFOworI2Vsc2UKKyAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJQbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQgdW5peCBmZCBwYXNzaW5nIik7CisjZW5kaWYKK30KKworLyoKKyAqIEZJWE1FIHdoZW4gd2UgbW92ZSB0aGUgaGVhZGVyIG91dCBvZiB0aGUgYnVmZmVyLCB0aGF0IG1lbW1vdmVzIGFsbAorICogYnVmZmVyZWQgbWVzc2FnZXMuIEtpbmQgb2YgY3JhcHB5LgorICoKKyAqIEFsc28gd2UgY29weSB0aGUgaGVhZGVyIGFuZCBib2R5LCB3aGljaCBpcyBraW5kIG9mIGNyYXBweS4gIFRvCisgKiBhdm9pZCB0aGlzLCB3ZSBoYXZlIHRvIGFsbG93IGhlYWRlciBhbmQgYm9keSB0byBiZSBpbiBhIHNpbmdsZQorICogbWVtb3J5IGJsb2NrLCB3aGljaCBpcyBnb29kIGZvciBtZXNzYWdlcyB3ZSByZWFkIGFuZCBiYWQgZm9yCisgKiBtZXNzYWdlcyB3ZSBhcmUgY3JlYXRpbmcuIEJ1dCB3ZSBjb3VsZCBtb3ZlX2xlbigpIHRoZSBidWZmZXIgaW50bworICogdGhpcyBzaW5nbGUgbWVtb3J5IGJsb2NrLCBhbmQgbW92ZV9sZW4oKSB3aWxsIGp1c3Qgc3dhcCB0aGUgYnVmZmVycworICogaWYgeW91J3JlIG1vdmluZyB0aGUgZW50aXJlIGJ1ZmZlciByZXBsYWNpbmcgdGhlIGRlc3Qgc3RyaW5nLgorICoKKyAqIFdlIGNvdWxkIGFsc28gaGF2ZSB0aGUgbWVzc2FnZSBsb2FkZXIgdGVsbCB0aGUgdHJhbnNwb3J0IGhvdyBtYW55CisgKiBieXRlcyB0byByZWFkOyBzbyBpdCB3b3VsZCBmaXJzdCBhc2sgZm9yIHNvbWUgYXJiaXRyYXJ5IG51bWJlciBsaWtlCisgKiAyNTYsIHRoZW4gaWYgdGhlIG1lc3NhZ2Ugd2FzIGluY29tcGxldGUgaXQgd291bGQgdXNlIHRoZQorICogaGVhZGVyL2JvZHkgbGVuIHRvIGFzayBmb3IgZXhhY3RseSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSAob3IKKyAqIGJsb2NrcyB0aGUgc2l6ZSBvZiBhIHR5cGljYWwga2VybmVsIGJ1ZmZlciBmb3IgdGhlIHNvY2tldCkuIFRoYXQKKyAqIHdheSB3ZSBkb24ndCBnZXQgdHJhaWxpbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0aGF0IGhhdmUgdG8gYmUKKyAqIG1lbW1vdmVkLiBUaG91Z2ggSSBzdXBwb3NlIHdlIGFsc28gZG9uJ3QgaGF2ZSBhIGNoYW5jZSBvZiByZWFkaW5nIGEKKyAqIGJ1bmNoIG9mIHNtYWxsIG1lc3NhZ2VzIGF0IG9uY2UsIHNvIHRoZSBvcHRpbWl6YXRpb24gbWF5IGJlIHN0dXBpZC4KKyAqCisgKiBBbm90aGVyIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGtlZXAgYSAic3RhcnQiIGluZGV4IGludG8KKyAqIGxvYWRlci0+ZGF0YSBhbmQgb25seSBkZWxldGUgaXQgb2NjYXNpb25hbGx5LCBpbnN0ZWFkIG9mIGFmdGVyCisgKiBlYWNoIG1lc3NhZ2UgaXMgbG9hZGVkLgorICoKKyAqIGxvYWRfbWVzc2FnZSgpIHJldHVybnMgRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgT1IgdGhlIGxvYWRlciB3YXMgY29ycnVwdGVkCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorbG9hZF9tZXNzYWdlIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyLAorICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJvZHlfbGVuKQoreworICBkYnVzX2Jvb2xfdCBvb207CisgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKyAgY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHI7CisgIGludCB0eXBlX3BvczsKKyAgREJ1c1ZhbGlkYXRpb25Nb2RlIG1vZGU7CisgIGRidXNfdWludDMyX3Qgbl91bml4X2ZkcyA9IDA7CisKKyAgbW9kZSA9IERCVVNfVkFMSURBVElPTl9NT0RFX0RBVEFfSVNfVU5UUlVTVEVEOworICAKKyAgb29tID0gRkFMU0U7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbG9hZGVyLT5kYXRhLCAwLCBoZWFkZXJfbGVuIC8qICsgYm9keV9sZW4gKi8pOworI2VuZGlmCisKKyAgLyogMS4gVkFMSURBVEUgQU5EIENPUFkgT1ZFUiBIRUFERVIgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICgoaGVhZGVyX2xlbiArIGJvZHlfbGVuKSA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkpOworCisgIGlmICghX2RidXNfaGVhZGVyX2xvYWQgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2FkZXItPmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBsb2FkIGhlYWRlciBmb3IgbmV3IG1lc3NhZ2UgY29kZSAlZFxuIiwgdmFsaWRpdHkpOworCisgICAgICAvKiBhc3NlcnQgaGVyZSBzbyB3ZSBjYW4gY2F0Y2ggYW55IGNvZGUgdGhhdCBzdGlsbCB1c2VzIERCVVNfVkFMSUQgdG8gaW5kaWNhdGUKKyAgICAgICAgIG9vbSBlcnJvcnMuICBUaGV5IHNob3VsZCB1c2UgREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUiBpbnN0ZWFkICovCisgICAgICBfZGJ1c19hc3NlcnQgKHZhbGlkaXR5ICE9IERCVVNfVkFMSUQpOworCisgICAgICBpZiAodmFsaWRpdHkgPT0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUikKKyAgICAgICAgb29tID0gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gdmFsaWRpdHk7CisgICAgICAgIH0KKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHZhbGlkaXR5ID09IERCVVNfVkFMSUQpOworCisgIG1lc3NhZ2UtPmJ5dGVfb3JkZXIgPSBieXRlX29yZGVyOworCisgIC8qIDIuIFZBTElEQVRFIEJPRFkgKi8KKyAgaWYgKG1vZGUgIT0gREJVU19WQUxJREFUSU9OX01PREVfV0VfVFJVU1RfVEhJU19EQVRBX0FCU09MVVRFTFkpCisgICAgeworICAgICAgZ2V0X2NvbnN0X3NpZ25hdHVyZSAoJm1lc3NhZ2UtPmhlYWRlciwgJnR5cGVfc3RyLCAmdHlwZV9wb3MpOworICAgICAgCisgICAgICAvKiBCZWNhdXNlIHRoZSBieXRlc19yZW1haW5pbmcgYXJnIGlzIE5VTEwsIHRoaXMgdmFsaWRhdGVzIHRoYXQgdGhlCisgICAgICAgKiBib2R5IGlzIHRoZSByaWdodCBsZW5ndGgKKyAgICAgICAqLworICAgICAgdmFsaWRpdHkgPSBfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uICh0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2FkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuKTsKKyAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byB2YWxpZGF0ZSBtZXNzYWdlIGJvZHkgY29kZSAlZFxuIiwgdmFsaWRpdHkpOworCisgICAgICAgICAgbG9hZGVyLT5jb3JydXB0ZWQgPSBUUlVFOworICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSB2YWxpZGl0eTsKKyAgICAgICAgICAKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiAzLiBDT1BZIE9WRVIgVU5JWCBGRFMgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYygmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5fdW5peF9mZHMpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAobl91bml4X2ZkcyA+IGxvYWRlci0+bl91bml4X2ZkcykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlKCJNZXNzYWdlIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gbW9yZSB1bml4IGZkcyB0aGFuIHdlcmUgc2VudCAldSAhPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgbl91bml4X2ZkcywgbG9hZGVyLT5uX3VuaXhfZmRzKTsKKworICAgICAgbG9hZGVyLT5jb3JydXB0ZWQgPSBUUlVFOworICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9IERCVVNfSU5WQUxJRF9NSVNTSU5HX1VOSVhfRkRTOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIElmIHRoaXMgd2FzIGEgcmVjeWNsZWQgbWVzc2FnZSB0aGVyZSBtaWdodCBzdGlsbCBiZQorICAgICBzb21lIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBmZHMgKi8KKyAgZGJ1c19mcmVlKG1lc3NhZ2UtPnVuaXhfZmRzKTsKKworICBpZiAobl91bml4X2ZkcyA+IDApCisgICAgeworICAgICAgbWVzc2FnZS0+dW5peF9mZHMgPSBfZGJ1c19tZW1kdXAobG9hZGVyLT51bml4X2Zkcywgbl91bml4X2ZkcyAqIHNpemVvZihtZXNzYWdlLT51bml4X2Zkc1swXSkpOworICAgICAgaWYgKG1lc3NhZ2UtPnVuaXhfZmRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFsbG9jYXRlIGZpbGUgZGVzY3JpcHRvciBhcnJheVxuIik7CisgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBtZXNzYWdlLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCA9IG1lc3NhZ2UtPm5fdW5peF9mZHMgPSBuX3VuaXhfZmRzOworICAgICAgbG9hZGVyLT5uX3VuaXhfZmRzIC09IG5fdW5peF9mZHM7CisgICAgICBtZW1tb3ZlKGxvYWRlci0+dW5peF9mZHMgKyBuX3VuaXhfZmRzLCBsb2FkZXItPnVuaXhfZmRzLCBsb2FkZXItPm5fdW5peF9mZHMpOworICAgIH0KKyAgZWxzZQorICAgIG1lc3NhZ2UtPnVuaXhfZmRzID0gTlVMTDsKKworI2Vsc2UKKworICBpZiAobl91bml4X2ZkcyA+IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkhtbSwgbWVzc2FnZSBjbGFpbXMgdG8gY29tZSB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgIgorICAgICAgICAgICAgICAgICAgICAgImJ1dCB0aGF0J3Mgbm90IHN1cHBvcnRlZCBvbiBvdXIgcGxhdGZvcm0sIGRpc2Nvbm5lY3RpbmcuXG4iKTsKKworICAgICAgbG9hZGVyLT5jb3JydXB0ZWQgPSBUUlVFOworICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9IERCVVNfSU5WQUxJRF9NSVNTSU5HX1VOSVhfRkRTOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisjZW5kaWYKKworICAvKiAzLiBDT1BZIE9WRVIgQk9EWSBBTkQgUVVFVUUgTUVTU0FHRSAqLworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZsb2FkZXItPm1lc3NhZ2VzLCBtZXNzYWdlKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFwcGVuZCBuZXcgbWVzc2FnZSB0byBsb2FkZXIgcXVldWVcbiIpOworICAgICAgb29tID0gVFJVRTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpID49CisgICAgICAgICAgICAgICAgKGhlYWRlcl9sZW4gKyBib2R5X2xlbikpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmbG9hZGVyLT5kYXRhLCBoZWFkZXJfbGVuLCBib2R5X2xlbiwgJm1lc3NhZ2UtPmJvZHksIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbW92ZSBib2R5IGludG8gbmV3IG1lc3NhZ2VcbiIpOworICAgICAgb29tID0gVFJVRTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmbG9hZGVyLT5kYXRhLCAwLCBoZWFkZXJfbGVuICsgYm9keV9sZW4pOworCisgIC8qIGRvbid0IHdhc3RlIG1vcmUgdGhhbiAyayBvZiBtZW1vcnkgKi8KKyAgX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZsb2FkZXItPmRhdGEsIDIwNDgpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkgPT0gaGVhZGVyX2xlbik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSA9PSBib2R5X2xlbik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkxvYWRlZCBtZXNzYWdlICVwXG4iLCBtZXNzYWdlKTsKKworICBfZGJ1c19hc3NlcnQgKCFvb20pOworICBfZGJ1c19hc3NlcnQgKCFsb2FkZXItPmNvcnJ1cHRlZCk7CisgIF9kYnVzX2Fzc2VydCAobG9hZGVyLT5tZXNzYWdlcyAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2ZpbmRfbGFzdCAoJmxvYWRlci0+bWVzc2FnZXMsIG1lc3NhZ2UpICE9IE5VTEwpOworCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorCisgIC8qIENsZWFuIHVwICovCisKKyAgLyogZG9lcyBub3RoaW5nIGlmIHRoZSBtZXNzYWdlIGlzbid0IGluIHRoZSBsaXN0ICovCisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZsb2FkZXItPm1lc3NhZ2VzLCBtZXNzYWdlKTsKKyAgCisgIGlmIChvb20pCisgICAgX2RidXNfYXNzZXJ0ICghbG9hZGVyLT5jb3JydXB0ZWQpOworICBlbHNlCisgICAgX2RidXNfYXNzZXJ0IChsb2FkZXItPmNvcnJ1cHRlZCk7CisKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZsb2FkZXItPmRhdGEsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENvbnZlcnRzIGJ1ZmZlcmVkIGRhdGEgaW50byBtZXNzYWdlcywgaWYgd2UgaGF2ZSBlbm91Z2ggZGF0YS4gIElmCisgKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhLCBkb2VzIG5vdGhpbmcuCisgKgorICogQHRvZG8gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBwcm9wZXIgbmFtZWQgaGVhZGVyIGZpZWxkcyBleGlzdAorICogZm9yIGVhY2ggbWVzc2FnZSB0eXBlLgorICoKKyAqIEB0b2RvIElmIGEgbWVzc2FnZSBoYXMgdW5rbm93biB0eXBlLCB3ZSBzaG91bGQgcHJvYmFibHkgZWF0IGl0CisgKiByaWdodCBoZXJlIHJhdGhlciB0aGFuIHBhc3NpbmcgaXQgb3V0IHRvIGFwcGxpY2F0aW9ucy4gIEhvd2V2ZXIKKyAqIGl0J3Mgbm90IGFuIGVycm9yIHRvIHNlZSBtZXNzYWdlcyBvZiB1bmtub3duIHR5cGUuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgaGFkIGVub3VnaCBtZW1vcnkgdG8gZmluaXNoLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIHdoaWxlICghbG9hZGVyLT5jb3JydXB0ZWQgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSA+PSBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpCisgICAgeworICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworICAgICAgaW50IGJ5dGVfb3JkZXIsIGZpZWxkc19hcnJheV9sZW4sIGhlYWRlcl9sZW4sIGJvZHlfbGVuOworCisgICAgICBpZiAoX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQgKGxvYWRlci0+bWF4X21lc3NhZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2FkZXItPmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSkpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAodmFsaWRpdHkgPT0gREJVU19WQUxJRCk7CisKKyAgICAgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKCk7CisgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmICghbG9hZF9tZXNzYWdlIChsb2FkZXIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIGZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sIGJvZHlfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgLyogbG9hZF9tZXNzYWdlKCkgcmV0dXJucyBmYWxzZSBpZiBjb3JydXB0ZWQgb3IgT09NOyBpZgorICAgICAgICAgICAgICAgKiBjb3JydXB0ZWQgdGhlbiByZXR1cm4gVFJVRSBmb3Igbm90IE9PTQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci0+Y29ycnVwdGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChsb2FkZXItPm1lc3NhZ2VzICE9IE5VTEwpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9maW5kX2xhc3QgKCZsb2FkZXItPm1lc3NhZ2VzLCBtZXNzYWdlKSAhPSBOVUxMKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiSW5pdGlhbCBwZWVrIGF0IGhlYWRlciBzYXlzIHdlIGRvbid0IGhhdmUgYSB3aG9sZSBtZXNzYWdlIHlldCwgb3IgZGF0YSBicm9rZW4gd2l0aCBpbnZhbGlkIGNvZGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkpOworICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRlZCA9IFRSVUU7CisgICAgICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSB2YWxpZGl0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBQZWVrcyBhdCBmaXJzdCBsb2FkZWQgbWVzc2FnZSwgcmV0dXJucyAjTlVMTCBpZiBubyBtZXNzYWdlcyBoYXZlCisgKiBiZWVuIHF1ZXVlZC4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKiBAcmV0dXJucyB0aGUgbmV4dCBtZXNzYWdlLCBvciAjTlVMTCBpZiBub25lLgorICovCitEQnVzTWVzc2FnZSoKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3BlZWtfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgaWYgKGxvYWRlci0+bWVzc2FnZXMpCisgICAgcmV0dXJuIGxvYWRlci0+bWVzc2FnZXMtPmRhdGE7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBQb3BzIGEgbG9hZGVkIG1lc3NhZ2UgKHBhc3Npbmcgb3duZXJzaGlwIG9mIHRoZSBtZXNzYWdlCisgKiB0byB0aGUgY2FsbGVyKS4gUmV0dXJucyAjTlVMTCBpZiBubyBtZXNzYWdlcyBoYXZlIGJlZW4KKyAqIHF1ZXVlZC4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKiBAcmV0dXJucyB0aGUgbmV4dCBtZXNzYWdlLCBvciAjTlVMTCBpZiBub25lLgorICovCitEQnVzTWVzc2FnZSoKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICByZXR1cm4gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZsb2FkZXItPm1lc3NhZ2VzKTsKK30KKworLyoqCisgKiBQb3BzIGEgbG9hZGVkIG1lc3NhZ2UgaW5zaWRlIGEgbGlzdCBsaW5rIChwYXNzaW5nIG93bmVyc2hpcCBvZiB0aGUKKyAqIG1lc3NhZ2UgYW5kIGxpbmsgdG8gdGhlIGNhbGxlcikuIFJldHVybnMgI05VTEwgaWYgbm8gbWVzc2FnZXMgaGF2ZQorICogYmVlbiBsb2FkZWQuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHJldHVybnMgdGhlIG5leHQgbWVzc2FnZSBsaW5rLCBvciAjTlVMTCBpZiBub25lLgorICovCitEQnVzTGlzdCoKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlX2xpbmsgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIHJldHVybiBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmbG9hZGVyLT5tZXNzYWdlcyk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHBvcHBlZCBtZXNzYWdlIGxpbmssIHVzZWQgdG8gdW5kbyBhIHBvcC4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHdpdGggYSBtZXNzYWdlIGluIGl0CisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3B1dGJhY2tfbWVzc2FnZV9saW5rIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgKmxpbmspCit7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmbG9hZGVyLT5tZXNzYWdlcywgbGluayk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGxvYWRlciBpcyBjb25mdXNlZCBkdWUgdG8gYmFkIGRhdGEuCisgKiBJZiBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgdGhhdCBhcmUgaW52YWxpZCwgdGhlCisgKiBsb2FkZXIgZ2V0cyBjb25mdXNlZCBhbmQgZ2l2ZXMgdXAgcGVybWFuZW50bHkuCisgKiBUaGlzIHN0YXRlIGlzIGNhbGxlZCAiY29ycnVwdGVkLiIKKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBsb2FkZXIgaXMgaG9zZWQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBfZGJ1c19hc3NlcnQgKChsb2FkZXItPmNvcnJ1cHRlZCAmJiBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uICE9IERCVVNfVkFMSUQpIHx8CisgICAgICAgICAgICAgICAgKCFsb2FkZXItPmNvcnJ1cHRlZCAmJiBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID09IERCVVNfVkFMSUQpKTsKKyAgcmV0dXJuIGxvYWRlci0+Y29ycnVwdGVkOworfQorCisvKioKKyAqIENoZWNrcyB3aGF0IGtpbmQgb2YgYmFkIGRhdGEgY29uZnVzZWQgdGhlIGxvYWRlci4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEByZXR1cm5zIHdoeSB0aGUgbG9hZGVyIGlzIGhvc2VkLCBvciBEQlVTX1ZBTElEIGlmIGl0IGlzbid0LgorICovCitEQnVzVmFsaWRpdHkKK19kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9jb3JydXB0aW9uX3JlYXNvbiAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgX2RidXNfYXNzZXJ0ICgobG9hZGVyLT5jb3JydXB0ZWQgJiYgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiAhPSBEQlVTX1ZBTElEKSB8fAorICAgICAgICAgICAgICAgICghbG9hZGVyLT5jb3JydXB0ZWQgJiYgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9PSBEQlVTX1ZBTElEKSk7CisKKyAgcmV0dXJuIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb247Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG1lc3NhZ2Ugd2UgYWxsb3cuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4IG1lc3NhZ2Ugc2l6ZSBpbiBieXRlcworICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICBzaXplKQoreworICBpZiAoc2l6ZSA+IERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY2xhbXBpbmcgcmVxdWVzdGVkIG1heCBtZXNzYWdlIHNpemUgJWxkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIKTsKKyAgICAgIHNpemUgPSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEg7CisgICAgfQorICBsb2FkZXItPm1heF9tZXNzYWdlX3NpemUgPSBzaXplOworfQorCisvKioKKyAqIEdldHMgdGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlIHNpemUgaW4gYnl0ZXMuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcmV0dXJucyBtYXggc2l6ZSBpbiBieXRlcworICovCitsb25nCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpCit7CisgIHJldHVybiBsb2FkZXItPm1heF9tZXNzYWdlX3NpemU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSB1bml4IGZkcyBwZXIgbWVzc2FnZSB3ZSBhbGxvdy4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqIEBwYXJhbSBzaXplIHRoZSBtYXggbnVtYmVyIG9mIHVuaXggZmRzIGluIGEgbWVzc2FnZQorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgIG4pCit7CisgIGlmIChuID4gREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFMpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNsYW1waW5nIHJlcXVlc3RlZCBtYXggbWVzc2FnZSB1bml4X2ZkcyAlbGQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBuLCBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUyk7CisgICAgICBuID0gREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFM7CisgICAgfQorICBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzID0gbjsKK30KKworLyoqCisgKiBHZXRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHVuaXggZmRzIHBlciBtZXNzYWdlCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcmV0dXJucyBtYXggdW5peCBmZHMKKyAqLworbG9uZworX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcikKK3sKKyAgcmV0dXJuIGxvYWRlci0+bWF4X21lc3NhZ2VfdW5peF9mZHM7Cit9CisKK3N0YXRpYyBEQnVzRGF0YVNsb3RBbGxvY2F0b3Igc2xvdF9hbGxvY2F0b3I7CitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKG1lc3NhZ2Vfc2xvdHMpOworCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIGRhdGEgb24gYW55IERCdXNNZXNzYWdlLiBUaGUgYWxsb2NhdGVkIElEIG1heSB0aGVuIGJlIHVzZWQKKyAqIHdpdGggZGJ1c19tZXNzYWdlX3NldF9kYXRhKCkgYW5kIGRidXNfbWVzc2FnZV9nZXRfZGF0YSgpLgorICogVGhlIHBhc3NlZC1pbiBzbG90IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCBpcyBmaWxsZWQgaW4KKyAqIHdpdGggdGhlIHNsb3QgSUQuIElmIHRoZSBwYXNzZWQtaW4gc2xvdCBpcyBub3QgLTEsIGl0J3MgYXNzdW1lZAorICogdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBpdHMgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQuCisgKgorICogVGhlIGFsbG9jYXRlZCBzbG90IGlzIGdsb2JhbCwgaS5lLiBhbGwgREJ1c01lc3NhZ2Ugb2JqZWN0cyB3aWxsCisgKiBoYXZlIGEgc2xvdCB3aXRoIHRoZSBnaXZlbiBpbnRlZ2VyIElEIHJlc2VydmVkLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBvZiBhIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBzbG90CisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIHJldHVybiBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX0RCVVNfTE9DS19OQU1FIChtZXNzYWdlX3Nsb3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RfcCk7Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYSBnbG9iYWwgSUQgZm9yIG1lc3NhZ2UgZGF0YSBzbG90cy4KKyAqIGRidXNfbWVzc2FnZV9nZXRfZGF0YSgpIGFuZCBkYnVzX21lc3NhZ2Vfc2V0X2RhdGEoKSBtYXkgbm8KKyAqIGxvbmdlciBiZSB1c2VkIHdpdGggdGhpcyBzbG90LiAgRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24gZXhpc3RpbmcKKyAqIERCdXNNZXNzYWdlIG9iamVjdHMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBtZXNzYWdlIGlzCisgKiBmaW5hbGl6ZWQsIGJ1dCBtYXkgbm90IGJlIHJldHJpZXZlZCAoYW5kIG1heSBvbmx5IGJlIHJlcGxhY2VkIGlmCisgKiBzb21lb25lIGVsc2UgcmVhbGxvY2F0ZXMgdGhlIHNsb3QpLiAgV2hlbiB0aGUgcmVmY291bnQgb24gdGhlCisgKiBwYXNzZWQtaW4gc2xvdCByZWFjaGVzIDAsIGl0IGlzIHNldCB0byAtMS4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgc3RvcmluZyB0aGUgc2xvdCB0byBkZWFsbG9jYXRlCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9mcmVlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgqc2xvdF9wID49IDApOworCisgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJnNsb3RfYWxsb2NhdG9yLCBzbG90X3ApOworfQorCisvKioKKyAqIFN0b3JlcyBhIHBvaW50ZXIgb24gYSBEQnVzTWVzc2FnZSwgYWxvbmcKKyAqIHdpdGggYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZnJlZWluZworICogdGhlIGRhdGEgd2hlbiB0aGUgZGF0YSBpcyBzZXQgYWdhaW4sIG9yIHdoZW4KKyAqIHRoZSBtZXNzYWdlIGlzIGZpbmFsaXplZC4gVGhlIHNsb3QgbnVtYmVyCisgKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBkYnVzX21lc3NhZ2VfYWxsb2NhdGVfZGF0YV9zbG90KCkuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9kYXRhIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGF0YV9mdW5jKQoreworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmM7CisgIHZvaWQgKm9sZF9kYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzbG90ID49IDAsIEZBTFNFKTsKKworICByZXR2YWwgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZS0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGRhdGEsIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpOworCisgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgLyogRG8gdGhlIGFjdHVhbCBmcmVlIG91dHNpZGUgdGhlIG1lc3NhZ2UgbG9jayAqLworICAgICAgaWYgKG9sZF9mcmVlX2Z1bmMpCisgICAgICAgICgqIG9sZF9mcmVlX2Z1bmMpIChvbGRfZGF0YSk7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0cmlldmVzIGRhdGEgcHJldmlvdXNseSBzZXQgd2l0aCBkYnVzX21lc3NhZ2Vfc2V0X2RhdGEoKS4KKyAqIFRoZSBzbG90IG11c3Qgc3RpbGwgYmUgYWxsb2NhdGVkIChtdXN0IG5vdCBoYXZlIGJlZW4gZnJlZWQpLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCB0byBnZXQgZGF0YSBmcm9tCisgKiBAcmV0dXJucyB0aGUgZGF0YSwgb3IgI05VTEwgaWYgbm90IGZvdW5kCisgKi8KK3ZvaWQqCitkYnVzX21lc3NhZ2VfZ2V0X2RhdGEgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgIHNsb3QpCit7CisgIHZvaWQgKnJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgcmVzID0gX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UtPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90KTsKKworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBhIG1hY2hpbmUtcmVhZGFibGUgKG5vdCB0cmFuc2xhdGVkKQorICogc3RyaW5nIGludG8gYSBELUJ1cyBtZXNzYWdlIHR5cGUuCisgKgorICogQGNvZGUKKyAqICAgIm1ldGhvZF9jYWxsIiAgICAtPiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTAorICogICAibWV0aG9kX3JldHVybiIgIC0+IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4KKyAqICAgInNpZ25hbCIgICAgICAgICAtPiBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwKKyAqICAgImVycm9yIiAgICAgICAgICAtPiBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUgorICogICBhbnl0aGluZyBlbHNlICAgIC0+IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQKKyAqIEBlbmRjb2RlCisgKgorICovCitpbnQKK2RidXNfbWVzc2FnZV90eXBlX2Zyb21fc3RyaW5nIChjb25zdCBjaGFyICp0eXBlX3N0cikKK3sKKyAgaWYgKHN0cmNtcCAodHlwZV9zdHIsICJtZXRob2RfY2FsbCIpID09IDApCisgICAgcmV0dXJuIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOworICBpZiAoc3RyY21wICh0eXBlX3N0ciwgIm1ldGhvZF9yZXR1cm4iKSA9PSAwKQorICAgIHJldHVybiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOworICBlbHNlIGlmIChzdHJjbXAgKHR5cGVfc3RyLCAic2lnbmFsIikgPT0gMCkKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOworICBlbHNlIGlmIChzdHJjbXAgKHR5cGVfc3RyLCAiZXJyb3IiKSA9PSAwKQorICAgIHJldHVybiBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUjsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworfQorCisvKioKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBhIEQtQnVzIG1lc3NhZ2UgdHlwZSBpbnRvIGEKKyAqIG1hY2hpbmUtcmVhZGFibGUgc3RyaW5nIChub3QgdHJhbnNsYXRlZCkuCisgKgorICogQGNvZGUKKyAqICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgICAgLT4gIm1ldGhvZF9jYWxsIgorICogICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOICAtPiAibWV0aG9kX3JldHVybiIKKyAqICAgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMICAgICAgICAgLT4gInNpZ25hbCIKKyAqICAgREJVU19NRVNTQUdFX1RZUEVfRVJST1IgICAgICAgICAgLT4gImVycm9yIgorICogICBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEICAgICAgICAtPiAiaW52YWxpZCIKKyAqIEBlbmRjb2RlCisgKgorICovCitjb25zdCBjaGFyICoKK2RidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoaW50IHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTDoKKyAgICAgIHJldHVybiAibWV0aG9kX2NhbGwiOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjoKKyAgICAgIHJldHVybiAibWV0aG9kX3JldHVybiI7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisgICAgICByZXR1cm4gInNpZ25hbCI7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUjoKKyAgICAgIHJldHVybiAiZXJyb3IiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gImludmFsaWQiOworICAgIH0KK30KKworLyoqCisgKiBUdXJuIGEgREJ1c01lc3NhZ2UgaW50byB0aGUgbWFyc2hhbGxlZCBmb3JtIGFzIGRlc2NyaWJlZCBpbiB0aGUgRC1CdXMKKyAqIHNwZWNpZmljYXRpb24uCisgKgorICogR2VuZXJhbGx5LCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZnVsIGZvciBlbmNhcHN1bGF0aW5nIEQtQnVzIG1lc3NhZ2VzIGluCisgKiBhIGRpZmZlcmVudCBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gbXNnIHRoZSBEQnVzTWVzc2FnZQorICogQHBhcmFtIG1hcnNoYWxsZWRfZGF0YV9wIHRoZSBsb2NhdGlvbiB0byBzYXZlIHRoZSBtYXJzaGFsbGVkIGZvcm0gdG8KKyAqIEBwYXJhbSBsZW5fcCB0aGUgbG9jYXRpb24gdG8gc2F2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXJzaGFsbGVkIGZvcm0gdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9tYXJzaGFsIChEQnVzTWVzc2FnZSAgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAqKm1hcnNoYWxsZWRfZGF0YV9wLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAqbGVuX3ApCit7CisgIERCdXNTdHJpbmcgdG1wOworICBkYnVzX2Jvb2xfdCB3YXNfbG9ja2VkOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobXNnICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtYXJzaGFsbGVkX2RhdGFfcCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobGVuX3AgIT0gTlVMTCwgRkFMU0UpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRtcCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEVuc3VyZSB0aGUgbWVzc2FnZSBpcyBsb2NrZWQsIHRvIGVuc3VyZSB0aGUgbGVuZ3RoIGhlYWRlciBpcyBmaWxsZWQgaW4uICovCisgIHdhc19sb2NrZWQgPSBtc2ctPmxvY2tlZDsKKworICBpZiAoIXdhc19sb2NrZWQpCisgICAgZGJ1c19tZXNzYWdlX2xvY2sgKG1zZyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJihtc2ctPmhlYWRlci5kYXRhKSwgMCwgJnRtcCwgMCkpCisgICAgZ290byBmYWlsOworCisgICpsZW5fcCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmKG1zZy0+Ym9keSksIDAsICZ0bXAsICpsZW5fcCkpCisgICAgZ290byBmYWlsOworCisgICpsZW5fcCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmdG1wLCBtYXJzaGFsbGVkX2RhdGFfcCkpCisgICAgZ290byBmYWlsOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wKTsKKworICBpZiAoIXdhc19sb2NrZWQpCisgICAgbXNnLT5sb2NrZWQgPSBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWw6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wKTsKKworICBpZiAoIXdhc19sb2NrZWQpCisgICAgbXNnLT5sb2NrZWQgPSBGQUxTRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRGVtYXJzaGFsIGEgRC1CdXMgbWVzc2FnZSBmcm9tIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBELUJ1cworICogc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHZW5lcmFsbHksIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgZm9yIGVuY2Fwc3VsYXRpbmcgRC1CdXMgbWVzc2FnZXMgaW4KKyAqIGEgZGlmZmVyZW50IHByb3RvY29sLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIG1hcnNoYWxsZWQgREJ1c01lc3NhZ2UKKyAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiBzdHIKKyAqIEBwYXJhbSBlcnJvciB0aGUgbG9jYXRpb24gdG8gc2F2ZSBlcnJvcnMgdG8KKyAqIEByZXR1cm5zICNOVUxMIGlmIHRoZXJlIHdhcyBhbiBlcnJvcgorICovCitEQnVzTWVzc2FnZSAqCitkYnVzX21lc3NhZ2VfZGVtYXJzaGFsIChjb25zdCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcjsKKyAgREJ1c1N0cmluZyAqYnVmZmVyOworICBEQnVzTWVzc2FnZSAqbXNnOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc3RyICE9IE5VTEwsIE5VTEwpOworCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKworICBpZiAobG9hZGVyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAobG9hZGVyLCAmYnVmZmVyKTsKKyAgX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKGJ1ZmZlciwgc3RyLCBsZW4pOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlciwgbGVuKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzIChsb2FkZXIpKQorICAgIGdvdG8gZmFpbF9vb207CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgZ290byBmYWlsX2NvcnJ1cHQ7CisKKyAgbXNnID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2UgKGxvYWRlcik7CisKKyAgaWYgKCFtc2cpCisgICAgZ290byBmYWlsX29vbTsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgcmV0dXJuIG1zZzsKKworIGZhaWxfY29ycnVwdDoKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywgIk1lc3NhZ2UgaXMgY29ycnVwdGVkICglcykiLAorICAgICAgICAgICAgICAgICAgX2RidXNfdmFsaWRpdHlfdG9fZXJyb3JfbWVzc2FnZSAobG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbikpOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgcmV0dXJuIE5VTEw7CisKKyBmYWlsX29vbToKKyAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGJlIGluIHRoZSBidWZmZXIgdG8gZGVtYXJzaGFsIGEKKyAqIEQtQnVzIG1lc3NhZ2UuCisgKgorICogR2VuZXJhbGx5LCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZnVsIGZvciBlbmNhcHN1bGF0aW5nIEQtQnVzIG1lc3NhZ2VzIGluCisgKiBhIGRpZmZlcmVudCBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gc3RyIGRhdGEgdG8gYmUgbWFyc2hhbGxlZAorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHN0cgorICogQHBhcmFtIGVycm9yIHRoZSBsb2NhdGlvbiB0byBzYXZlIGVycm9ycyB0bworICogQHJldHVybnMgLTEgaWYgdGhlcmUgd2FzIG5vIHZhbGlkIGRhdGEgdG8gYmUgZGVtYXJzaGFsbGVkLCAwIGlmIHRoZXJlIHdhc24ndCBlbm91Z2ggZGF0YSB0byBkZXRlcm1pbmUgaG93IG11Y2ggc2hvdWxkIGJlIGRlbWFyc2hhbGxlZC4gT3RoZXJ3aXNlIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBkZW1hcnNoYWxsZWQKKyAqIAorICovCitpbnQgCitkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZChjb25zdCBjaGFyICpidWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGJ5dGVfb3JkZXIsIGZpZWxkc19hcnJheV9sZW4sIGhlYWRlcl9sZW4sIGJvZHlfbGVuOworICBEQnVzVmFsaWRpdHkgdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICBpbnQgaGF2ZV9tZXNzYWdlOworCisgIGlmICghYnVmIHx8IGxlbiA8IERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobGVuID4gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIKQorICAgIGxlbiA9IERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSDsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmc3RyLCBidWYsIGxlbik7CisgIAorICB2YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgIGhhdmVfbWVzc2FnZQorICAgID0gX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQoREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkaXR5LCAmYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIGlmICh2YWxpZGl0eSA9PSBEQlVTX1ZBTElEKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydChoYXZlX21lc3NhZ2UpOworICAgICAgcmV0dXJuIGhlYWRlcl9sZW4gKyBib2R5X2xlbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gLTE7IC8qIGJyb2tlbiEgKi8KKyAgICB9Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1lc3NhZ2UtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWVzc2FnZS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTAwNDkyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1lc3NhZ2UuaApAQCAtMCwwICsxLDMwOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UuaCBEQnVzTWVzc2FnZSBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX01FU1NBR0VfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2UKKyAqIEB7CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2U7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSBpdGVyYXRvci4gQ2FuIGJlIGNvcGllZCBieSB2YWx1ZSwgYW5kIGNvbnRhaW5zIG5vIGFsbG9jYXRlZCBtZW1vcnkgc28gbmV2ZXIgbmVlZHMgdG8gYmUgZnJlZWQgYW5kIGNhbiBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2VJdGVyIERCdXNNZXNzYWdlSXRlcjsKKworLyoqCisgKiBEQnVzTWVzc2FnZUl0ZXIgc3RydWN0OyBjb250YWlucyBubyBwdWJsaWMgZmllbGRzLiAKKyAqLworc3RydWN0IERCdXNNZXNzYWdlSXRlcgoreyAKKyAgdm9pZCAqZHVtbXkxOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqZHVtbXkyOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgZGJ1c191aW50MzJfdCBkdW1teTM7IC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NDsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NjsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15ODsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15OTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTA7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTE7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IHBhZDE7ICAgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IHBhZDI7ICAgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqcGFkMzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KK307CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ldyAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgbWVzc2FnZV90eXBlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAgIChjb25zdCBjaGFyICAqYnVzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbWV0aG9kKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChEQnVzTWVzc2FnZSAqbWV0aG9kX2NhbGwpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAgICAgICAgKGNvbnN0IGNoYXIgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpuYW1lKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19lcnJvciAgICAgICAgIChEQnVzTWVzc2FnZSAqcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9tZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19lcnJvcl9wcmludGYgIChEQnVzTWVzc2FnZSAqcmVwbHlfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9mb3JtYXQsCisJCQkJCSAgICAgLi4uKTsKKworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX21lc3NhZ2VfY29weSAgICAgICAgICAgICAgKGNvbnN0IERCdXNNZXNzYWdlICptZXNzYWdlKTsKKworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiAgZGJ1c19tZXNzYWdlX3JlZiAgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2ludCAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF90eXBlICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9wYXRoICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvYmplY3RfcGF0aCk7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggICAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX3BhdGggICAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpvYmplY3RfcGF0aCk7ICAKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaW50ZXJmYWNlKTsgICAgICAgCitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX2ludGVyZmFjZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICptZW1iZXIpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2hhc19tZW1iZXIgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbWVtYmVyKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbmFtZSk7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmRlc3RpbmF0aW9uKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2VuZGVyKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgbm9fcmVwbHkpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICptZXRob2QpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzaWduYWxfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaXNfZXJyb3IgICAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmVycm9yX25hbWUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2hhc19kZXN0aW5hdGlvbiAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpidXNfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnVuaXF1ZV9idXNfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNpZ25hdHVyZSk7CitEQlVTX0VYUE9SVAorZGJ1c191aW50MzJfdCBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICBzZXJpYWwpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICByZXBseV9zZXJpYWwpOworREJVU19FWFBPUlQKK2RidXNfdWludDMyX3QgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGF1dG9fc3RhcnQpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2dldF9hdXRvX3N0YXJ0ICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICoqKnBhdGgpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzICAgICAgICAgIChEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisJCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgICAgLi4uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0ICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICB2YV9saXN0ICAgICAgICAgIHZhcl9hcmdzKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgICAgLi4uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3NfdmFsaXN0ICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IsCisJCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgICAgdmFfbGlzdCAgICAgICAgICB2YXJfYXJncyk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfY29udGFpbnNfdW5peF9mZHMgICAgKERCdXNNZXNzYWdlICptZXNzYWdlKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2luaXQgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2l0ZXJfaGFzX25leHQgICAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICAgICAgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9zaWduYXR1cmUgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF90eXBlIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgICAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnZhbHVlKTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgd2lyZSBwcm90b2NvbCBzaXplIG9mIHRoZSBhcnJheSBpbiBieXRlcywKKyAqIHlvdSBkbyBub3Qgd2FudCB0byBrbm93IHRoYXQgcHJvYmFibHkKKyAqLworREJVU19FWFBPUlQKK0RCVVNfREVQUkVDQVRFRCBpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJyYXlfbGVuICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworI2VuZGlmCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5ICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAqbl9lbGVtZW50cyk7CisKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kICAgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAqdmFsdWUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9maXhlZF9hcnJheSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuX2VsZW1lbnRzKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKmNvbnRhaW5lZF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1Yik7CisKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfbWVzc2FnZV9sb2NrICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAgKERCdXNFcnJvciAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKKworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfZnJlZV9kYXRhX3Nsb3QgICAgIChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9zZXRfZGF0YSAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKTsKK0RCVVNfRVhQT1JUCit2b2lkKiAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2RhdGEgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCk7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAoY29uc3QgY2hhciAqdHlwZV9zdHIpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAgIChpbnQgdHlwZSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c19tZXNzYWdlX21hcnNoYWwgICAoREJ1c01lc3NhZ2UgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKiptYXJzaGFsbGVkX2RhdGFfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKmxlbl9wKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoY29uc3QgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGNvbnN0IGNoYXIgKnN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfTUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbWlzYy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTYxMDEzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1pc2MuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1pc2MuYyAgQSBmZXcgYXNzb3J0ZWQgcHVibGljIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGZpdCBlbHNld2hlcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1taXNjLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWlzYyBNaXNjZWxsYW5lb3VzCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIE1pc2NlbGxhbmVvdXMgQVBJIHRoYXQgZG9lc24ndCBjbGVhbmx5IGZpdCBhbnl3aGVyZSBlbHNlCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9idGFpbnMgdGhlIG1hY2hpbmUgVVVJRCBvZiB0aGUgbWFjaGluZSB0aGlzIHByb2Nlc3MgaXMgcnVubmluZyBvbi4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqIAorICogVGhpcyBVVUlEIGlzIGd1YXJhbnRlZWQgdG8gcmVtYWluIHRoZSBzYW1lIHVudGlsIHRoZSBuZXh0IHJlYm9vdAorICogKHVubGVzcyB0aGUgc3lzYWRtaW4gZm9vbGlzaGx5IGNoYW5nZXMgaXQgYW5kIHNjcmV3cyB0aGVtc2VsdmVzKS4KKyAqIEl0IHdpbGwgdXN1YWxseSByZW1haW4gdGhlIHNhbWUgYWNyb3NzIHJlYm9vdHMgYWxzbywgYnV0IGhhcmR3YXJlCisgKiBjb25maWd1cmF0aW9uIGNoYW5nZXMgb3IgcmVidWlsZGluZyB0aGUgbWFjaGluZSBjb3VsZCBicmVhayB0aGF0LgorICoKKyAqIFRoZSBpZGVhIGlzIHRoYXQgdHdvIHByb2Nlc3NlcyB3aXRoIHRoZSBzYW1lIG1hY2hpbmUgSUQgc2hvdWxkIGJlCisgKiBhYmxlIHRvIHVzZSBzaGFyZWQgbWVtb3J5LCBVTklYIGRvbWFpbiBzb2NrZXRzLCBwcm9jZXNzIElEcywgYW5kIG90aGVyCisgKiBmZWF0dXJlcyBvZiB0aGUgT1MgdGhhdCByZXF1aXJlIGJvdGggcHJvY2Vzc2VzIHRvIGJlIHJ1bm5pbmcKKyAqIG9uIHRoZSBzYW1lIE9TIGtlcm5lbCBpbnN0YW5jZS4KKyAqCisgKiBUaGUgbWFjaGluZSBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgcGVyLW1hY2hpbmUKKyAqIGluc3RhbmNlcy4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgaW4gYnVzIG5hbWVzIG9yCisgKiBYIHNlbGVjdGlvbiBuYW1lcy4KKyAqCisgKiBUaGUgbWFjaGluZSBJRCBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgbWFjaGluZSBob3N0bmFtZSwgYmVjYXVzZQorICogdGhlIGhvc3RuYW1lIGlzIGZyZXF1ZW50bHkgc2V0IHRvICJsb2NhbGhvc3QubG9jYWxkb21haW4iIGFuZAorICogbWF5IGFsc28gY2hhbmdlIGF0IHJ1bnRpbWUuCisgKgorICogWW91IGNhbiBnZXQgdGhlIG1hY2hpbmUgSUQgb2YgYSByZW1vdGUgYXBwbGljYXRpb24gYnkgaW52b2tpbmcgdGhlCisgKiBtZXRob2QgR2V0TWFjaGluZUlkIGZyb20gaW50ZXJmYWNlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuCisgKgorICogSWYgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiBoYXMgdGhlIHNhbWUgbWFjaGluZSBJRCBhcyB0aGUgb25lCisgKiByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLCB0aGVuIHRoZSByZW1vdGUgYXBwbGljYXRpb24gaXMgb24gdGhlCisgKiBzYW1lIG1hY2hpbmUgYXMgeW91ciBhcHBsaWNhdGlvbi4KKyAqCisgKiBUaGUgVVVJRCBpcyBub3QgYSBVVUlEIGluIHRoZSBzZW5zZSBvZiBSRkM0MTIyOyB0aGUgZGV0YWlscworICogYXJlIGV4cGxhaW5lZCBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAcmV0dXJucyBhIDMyLWJ5dGUtbG9uZyBoZXgtZW5jb2RlZCBVVUlEIHN0cmluZywgb3IgI05VTEwgaWYgaW5zdWZmaWNpZW50IG1lbW9yeQorICovCitjaGFyKgorZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyB1dWlkOworICBjaGFyICpzOworCisgIHMgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldF9sb2NhbF9tYWNoaW5lX3V1aWRfZW5jb2RlZCAoJnV1aWQpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZ1dWlkLCAmcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgICAgICByZXR1cm4gczsKKyAgICB9CisKK30KKworLyoqCisgKiBAZGVmIERCVVNfTUFKT1JfVkVSU0lPTgorICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgbWFqb3IgdmVyc2lvbiBvZiBsaWJkYnVzLCB0aGF0IGlzLCB0aGUgIlgiIGluICJYLlkuWiIsCisgKiBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZQorICogcnVudGltZSB2ZXJzaW9uIGZyb20gZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX01JTk9SX1ZFUlNJT04KKyAqCisgKiBUaGUgQ09NUElMRSBUSU1FIG1pbm9yIHZlcnNpb24gb2YgbGliZGJ1cywgdGhhdCBpcywgdGhlICJZIiBpbiAiWC5ZLloiLAorICogYXMgYW4gaW50ZWdlciBsaXRlcmFsLiBDb25zaWRlciBjYXJlZnVsbHkgd2hldGhlciB0byB1c2UgdGhpcyBvciB0aGUKKyAqIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIGRidXNfZ2V0X3ZlcnNpb24oKS4KKyAqLworCisvKioKKyAqIEBkZWYgREJVU19NSUNST19WRVJTSU9OCisgKgorICogVGhlIENPTVBJTEUgVElNRSBtaWNybyB2ZXJzaW9uIG9mIGxpYmRidXMsIHRoYXQgaXMsIHRoZSAiWiIgaW4gIlguWS5aIiwKKyAqIGFzIGFuIGludGVnZXIgbGl0ZXJhbC4gQ29uc2lkZXIgY2FyZWZ1bGx5IHdoZXRoZXIgdG8gdXNlIHRoaXMgb3IgdGhlCisgKiBydW50aW1lIHZlcnNpb24gZnJvbSBkYnVzX2dldF92ZXJzaW9uKCkuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVkVSU0lPTgorICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgdmVyc2lvbiBvZiBsaWJkYnVzLCBhcyBhIHNpbmdsZSBpbnRlZ2VyIHRoYXQgaGFzIDAgaW4gdGhlIG1vc3QKKyAqIHNpZ25pZmljYW50IGJ5dGUsIHRoZSBtYWpvciB2ZXJzaW9uIGluIHRoZSBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwKKyAqIHRoZSBtaW5vciB2ZXJzaW9uIGluIHRoZSB0aGlyZCBtb3N0IHNpZ25pZmljYW50LCBhbmQgdGhlIG1pY3JvIHZlcnNpb24gaW4gdGhlCisgKiBsZWFzdCBzaWduaWZpY2FudCBieXRlLiBUaGlzIG1lYW5zIHR3byBEQlVTX1ZFUlNJT04gY2FuIGJlIGNvbXBhcmVkIHRvIHNlZQorICogd2hpY2ggaXMgaGlnaGVyLgorICoKKyAqIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZSBydW50aW1lIHZlcnNpb24gZnJvbQorICogZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX1ZFUlNJT05fU1RSSU5HCisgKgorICogVGhlIENPTVBJTEUgVElNRSB2ZXJzaW9uIG9mIGxpYmRidXMsIGFzIGEgc3RyaW5nICJYLlkuWiIuCisgKgorICogQ29uc2lkZXIgY2FyZWZ1bGx5IHdoZXRoZXIgdG8gdXNlIHRoaXMgb3IgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmcm9tCisgKiBkYnVzX2dldF92ZXJzaW9uKCkuCisgKi8KKworLyoqCisgKiBHZXRzIHRoZSBEWU5BTUlDQUxMWSBMSU5LRUQgdmVyc2lvbiBvZiBsaWJkYnVzLiBBbHRlcm5hdGl2ZWx5LCB0aGVyZQorICogYXJlIG1hY3JvcyAjREJVU19NQUpPUl9WRVJTSU9OLCAjREJVU19NSU5PUl9WRVJTSU9OLCAjREJVU19NSUNST19WRVJTSU9OLAorICogYW5kICNEQlVTX1ZFUlNJT04gd2hpY2ggYWxsb3cgeW91IHRvIHRlc3QgdGhlIFZFUlNJT04gWU9VIEFSRSBDT01QSUxFRCBBR0FJTlNULgorICogSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gZ2V0IGVpdGhlciB0aGUgcnVudGltZSBvciB0aGUgY29tcGlsZS10aW1lIHZlcnNpb24uCisgKiBUaGluayBjYXJlZnVsbHkgYWJvdXQgd2hpY2ggb2YgdGhlc2UgeW91IHdhbnQgaW4gYSBnaXZlbiBjYXNlLgorICoKKyAqIFRoZSBsaWJkYnVzIGZ1bGwgdmVyc2lvbiBudW1iZXIgaXMgIk1BSk9SLk1JTk9SLk1JQ1JPIiB3aGVyZSB0aGUKKyAqIE1JTk9SIGNoYW5nZXMgaWYgQVBJIGlzIGFkZGVkLCBhbmQgdGhlIE1JQ1JPIGNoYW5nZXMgd2l0aCBlYWNoCisgKiByZWxlYXNlIG9mIGEgTUFKT1IuTUlOT1Igc2VyaWVzLiAgVGhlIE1JTk9SIGlzIGFuIG9kZCBudW1iZXIgZm9yCisgKiBkZXZlbG9wbWVudCByZWxlYXNlcyBhbmQgYW4gZXZlbiBudW1iZXIgZm9yIHN0YWJsZSByZWxlYXNlcy4KKyAqIAorICogQHBhcmFtIG1ham9yX3ZlcnNpb25fcCBwb2ludGVyIHRvIHJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiwgb3IgI05VTEwKKyAqIEBwYXJhbSBtaW5vcl92ZXJzaW9uX3AgcG9pbnRlciB0byByZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24sIG9yICNOVUxMCisgKiBAcGFyYW0gbWljcm9fdmVyc2lvbl9wIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBtaWNybyB2ZXJzaW9uLCBvciAjTlVMTCAKKyAqIAorICovCit2b2lkCitkYnVzX2dldF92ZXJzaW9uIChpbnQgKm1ham9yX3ZlcnNpb25fcCwKKyAgICAgICAgICAgICAgICAgIGludCAqbWlub3JfdmVyc2lvbl9wLAorICAgICAgICAgICAgICAgICAgaW50ICptaWNyb192ZXJzaW9uX3ApCit7CisgIGlmIChtYWpvcl92ZXJzaW9uX3ApCisgICAgKm1ham9yX3ZlcnNpb25fcCA9IERCVVNfTUFKT1JfVkVSU0lPTjsKKyAgaWYgKG1pbm9yX3ZlcnNpb25fcCkKKyAgICAqbWlub3JfdmVyc2lvbl9wID0gREJVU19NSU5PUl9WRVJTSU9OOworICBpZiAobWljcm9fdmVyc2lvbl9wKQorICAgICptaWNyb192ZXJzaW9uX3AgPSBEQlVTX01JQ1JPX1ZFUlNJT047Cit9CisKKworLyoqIEB9ICovIC8qIEVuZCBvZiBwdWJsaWMgQVBJICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCitkYnVzX2Jvb2xfdAorX2RidXNfbWlzY190ZXN0ICh2b2lkKQoreworICBpbnQgbWFqb3IsIG1pbm9yLCBtaWNybzsKKyAgREJ1c1N0cmluZyBzdHI7CisKKyAgLyogbWFrZSBzdXJlIHdlIGRvbid0IGNyYXNoIG9uIE5VTEwgKi8KKyAgZGJ1c19nZXRfdmVyc2lvbiAoTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgLyogTm93IHZlcmlmeSB0aGF0IGFsbCB0aGUgY29tcGlsZS10aW1lIHZlcnNpb24gc3R1ZmYKKyAgICogaXMgcmlnaHQgYW5kIG1hdGNoZXMgdGhlIHJ1bnRpbWUuIFRoZXNlIHRlc3RzCisgICAqIGFyZSBtb3N0bHkgaW50ZW5kZWQgdG8gY2F0Y2ggdmFyaW91cyBraW5kcyBvZgorICAgKiB0eXBvIChtaXhpbmcgdXAgbWFqb3IgYW5kIG1pbm9yLCB0aGF0IHNvcnQgb2YgdGhpbmcpLgorICAgKi8KKyAgZGJ1c19nZXRfdmVyc2lvbiAoJm1ham9yLCAmbWlub3IsICZtaWNybyk7CisKKyAgX2RidXNfYXNzZXJ0IChtYWpvciA9PSBEQlVTX01BSk9SX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKG1pbm9yID09IERCVVNfTUlOT1JfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAobWljcm8gPT0gREJVU19NSUNST19WRVJTSU9OKTsKKworI2RlZmluZSBNQUtFX1ZFUlNJT04oeCwgeSwgeikgKCgoeCkgPDwgMTYpIHwgKCh5KSA8PCA4KSB8ICh6KSkKKworICAvKiBjaGVjayB0aGF0IE1BS0VfVkVSU0lPTiB3b3JrcyBhbmQgcHJvZHVjZXMgdGhlIGludGVuZGVkIG9yZGVyaW5nICovCisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgxLCAwLCAwKSA+IE1BS0VfVkVSU0lPTiAoMCwgMCwgMCkpOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMSwgMSwgMCkgPiBNQUtFX1ZFUlNJT04gKDEsIDAsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDEsIDEsIDEpID4gTUFLRV9WRVJTSU9OICgxLCAxLCAwKSk7CisKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDIsIDAsIDApID4gTUFLRV9WRVJTSU9OICgxLCAxLCAxKSk7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgyLCAxLCAwKSA+IE1BS0VfVkVSU0lPTiAoMSwgMSwgMSkpOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMiwgMSwgMSkgPiBNQUtFX1ZFUlNJT04gKDEsIDEsIDEpKTsKKworICAvKiBjaGVjayBEQlVTX1ZFUlNJT04gKi8KKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yLCBtaW5vciwgbWljcm8pID09IERCVVNfVkVSU0lPTik7CisKKyAgLyogY2hlY2sgdGhhdCBvcmRlcmluZyB3b3JrcyB3aXRoIERCVVNfVkVSU0lPTiAqLworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IgLSAxLCBtaW5vciwgbWljcm8pIDwgREJVU19WRVJTSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yLCBtaW5vciAtIDEsIG1pY3JvKSA8IERCVVNfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciwgbWlub3IsIG1pY3JvIC0gMSkgPCBEQlVTX1ZFUlNJT04pOworICAKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yICsgMSwgbWlub3IsIG1pY3JvKSA+IERCVVNfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciwgbWlub3IgKyAxLCBtaWNybykgPiBEQlVTX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IsIG1pbm9yLCBtaWNybyArIDEpID4gREJVU19WRVJTSU9OKTsKKworICAvKiBDaGVjayBEQlVTX1ZFUlNJT05fU1RSSU5HICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCEoX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZzdHIsIG1ham9yKSAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcuJykgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZzdHIsIG1pbm9yKSAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcuJykgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZzdHIsIG1pY3JvKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIERCVVNfVkVSU0lPTl9TVFJJTkcpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW1pc2MuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1taXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNGJjYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1taXNjLmgKQEAgLTAsMCArMSw1MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1pc2MuaCAgQSBmZXcgYXNzb3J0ZWQgcHVibGljIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGZpdCBlbHNld2hlcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19NSVNDX0gKKyNkZWZpbmUgREJVU19NSVNDX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNaXNjCisgKiBAeworICovCitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCAgKHZvaWQpOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19nZXRfdmVyc2lvbiAgICAgICAgICAgKGludCAqbWFqb3JfdmVyc2lvbl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWlub3JfdmVyc2lvbl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWljcm9fdmVyc2lvbl9wKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01JU0NfSCAqLworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbm9uY2UuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1ub25jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGIyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtbm9uY2UuYwpAQCAtMCwwICsxLDQyOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW5vbmNlLmMgIE5vbmNlIGhhbmRsaW5nIGZ1bmN0aW9ucyB1c2VkIGJ5IG5vbmNlLXRjcCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtsYXJhbHZkYWxlbnMgRGF0YWtvbnN1bHQgQUIsIGEgS0RBQiBHcm91cCBjb21wYW55LCBpbmZvQGtkYWIubmV0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorLy8gbWFqb3Igc2VjdGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBtb2RpZmllZCBjb2RlIGZyb20gbGliYXNzdWFuLCAoQykgRlNGCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGRidXNfYm9vbF90Citkb19jaGVja19ub25jZSAoaW50IGZkLCBjb25zdCBEQnVzU3RyaW5nICpub25jZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBidWZmZXI7CisgIERCdXNTdHJpbmcgcDsKKyAgc2l6ZV90IG5sZWZ0OworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisgIGludCBuOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG5sZWZ0ID0gMTY7CisKKyAgaWYgKCAgICFfZGJ1c19zdHJpbmdfaW5pdCAoJmJ1ZmZlcikKKyAgICAgIHx8ICFfZGJ1c19zdHJpbmdfaW5pdCAoJnApICkgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisKKyAgd2hpbGUgKG5sZWZ0KQorICAgIHsKKyAgICAgIG4gPSBfZGJ1c19yZWFkX3NvY2tldCAoZmQsICZwLCBubGVmdCk7CisgICAgICBpZiAobiA9PSAtMSAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWludHIoKSkKKyAgICAgICAgOworICAgICAgZWxzZSBpZiAobiA9PSAtMSAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrKCkpCisgICAgICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwKTsKKyAgICAgIGVsc2UgaWYgKG49PS0xKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgbm9uY2UgZnJvbSBzb2NrZXQgKGZkPSVkKSIsIGZkICk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwgIkNvdWxkIG5vdCByZWFkIG5vbmNlIGZyb20gc29ja2V0IChmZD0lZCkiLCBmZCApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4oJmJ1ZmZlciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcCksIG4pOworICAgICAgICAgIG5sZWZ0IC09IG47CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVzdWx0ID0gIF9kYnVzX3N0cmluZ19lcXVhbF9sZW4gKCZidWZmZXIsIG5vbmNlLCAxNik7CisgIGlmICghcmVzdWx0KQorICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELCAiTm9uY2VzIGRvIG5vdCBtYXRjaCwgYWNjZXNzIGRlbmllZCAoZmQ9JWQpIiwgZmQgKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnApOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1ZmZlcik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiByZWFkcyB0aGUgbm9uY2UgZnJvbSB0aGUgbm9uY2UgZmlsZSBhbmQgc3RvcmVzIGl0IGluIGEgc3RyaW5nCisgKgorICogQHBhcmFtIGZuYW1lIHRoZSBmaWxlIHRvIHJlYWQgdGhlIG5vbmNlIGZyb20KKyAqIEBwYXJhbSBub25jZSByZXR1cm5zIHRoZSBub25jZS4gTXVzdCBiZSBhbiBpbml0aWFsaXplZCBzdHJpbmcsIHRoZSBub25jZSB3aWxsIGJlIGFwcGVuZGVkLgorICogQHBhcmFtIGVycm9yIGVycm9yIG9iamVjdCB0byByZXBvcnQgcG9zc2libGUgZXJyb3JzCisgKiBAcmV0dXJuIEZBTFNFIGlmZiByZWFkaW5nIHRoZSBub25jZSBmYWlscyAoZXJyb3IgaXMgc2V0IHRoZW4pCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19yZWFkX25vbmNlIChjb25zdCBEQnVzU3RyaW5nICpmbmFtZSwgREJ1c1N0cmluZyAqbm9uY2UsIERCdXNFcnJvciogZXJyb3IpCit7CisgIEZJTEUgKmZwOworICBjaGFyIGJ1ZmZlclsxN107CisgIHNpemVfdCBucmVhZDsKKworICBidWZmZXJbc2l6ZW9mIGJ1ZmZlciAtIDFdID0gJ1wwJzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c192ZXJib3NlICgicmVhZGluZyBub25jZSBmcm9tIGZpbGU6ICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZuYW1lKSk7CisKKworICBmcCA9IGZvcGVuIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZuYW1lKSwgInJiIik7CisgIGlmICghZnApCisgICAgcmV0dXJuIEZBTFNFOworICBucmVhZCA9IGZyZWFkIChidWZmZXIsIDEsIHNpemVvZiBidWZmZXIgLSAxLCBmcCk7CisgIGZjbG9zZSAoZnApOworICBpZiAoIW5yZWFkKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCwgIkNvdWxkIG5vdCByZWFkIG5vbmNlIGZyb20gZmlsZSAlcyIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZm5hbWUpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAobm9uY2UsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciAtIDEgKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQKK19kYnVzX2FjY2VwdF93aXRoX25vbmNlZmlsZSAoaW50IGxpc3Rlbl9mZCwgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlKQoreworICBpbnQgZmQ7CisgIERCdXNTdHJpbmcgbm9uY2U7CisKKyAgX2RidXNfYXNzZXJ0IChub25jZWZpbGUgIT0gTlVMTCk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZSkpCisgICAgcmV0dXJuIC0xOworICAvL1BFTkRJTkcoa2RhYik6IHNldCBiZXR0ZXIgZXJyb3JzCisgIGlmIChfZGJ1c19yZWFkX25vbmNlIChfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGgobm9uY2VmaWxlKSwgJm5vbmNlLCBOVUxMKSAhPSBUUlVFKQorICAgIHJldHVybiAtMTsKKyAgZmQgPSBfZGJ1c19hY2NlcHQgKGxpc3Rlbl9mZCk7CisgIGlmIChfZGJ1c19zb2NrZXRfaXNfaW52YWxpZCAoZmQpKQorICAgIHJldHVybiBmZDsKKyAgaWYgKGRvX2NoZWNrX25vbmNlKGZkLCAmbm9uY2UsIE5VTEwpICE9IFRSVUUpIHsKKyAgICBfZGJ1c192ZXJib3NlICgibm9uY2UgY2hlY2sgZmFpbGVkLiBDbG9zaW5nIHNvY2tldC5cbiIpOworICAgIF9kYnVzX2Nsb3NlX3NvY2tldChmZCwgTlVMTCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIGZkOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX2FuZF93cml0ZV9ub25jZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgbm9uY2U7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbm9uY2UpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoJm5vbmNlLCAxNikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0ID0gX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJm5vbmNlLCBmaWxlbmFtZSwgRkFMU0UsIGVycm9yKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNlbmRzIHRoZSBub25jZSBvdmVyIGEgZ2l2ZW4gc29ja2V0LiBCbG9ja3Mgd2hpbGUgZG9pbmcgc28uCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdGhlIG5vbmNlIGRhdGEgdG8gKHVzdWFsbHkgYSBzb2NrZXQpCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRoZSBub25jZWZpbGUgbG9jYXRpb24gdG8gcmVhZCB0aGUgbm9uY2UgZnJvbQorICogQHBhcmFtIGVycm9yIGNvbnRhaW5zIGVycm9yIGRldGFpbHMgaWYgRkFMU0UgaXMgcmV0dXJuZWQKKyAqIEByZXR1cm4gVFJVRSBpZmYgdGhlIG5vbmNlIHdhcyBzdWNjZXNzZnVsbHkgc2VudC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAqIGluZGljYXRlIHdoZXRoZXIgdGhlIHNlcnZlciBhY2NlcHRlZCB0aGUgbm9uY2UuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZW5kX25vbmNlIChpbnQgZmQsIGNvbnN0IERCdXNTdHJpbmcgKm5vbmNlZmlsZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmVhZF9yZXN1bHQ7CisgIGludCBzZW5kX3Jlc3VsdDsKKyAgc2l6ZV90IHNlbmRMZW47CisgIERCdXNTdHJpbmcgbm9uY2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChub25jZWZpbGUpID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlYWRfcmVzdWx0ID0gX2RidXNfcmVhZF9ub25jZSAobm9uY2VmaWxlLCAmbm9uY2UsIGVycm9yKTsKKyAgaWYgKCFyZWFkX3Jlc3VsdCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHNlbmRfcmVzdWx0ID0gX2RidXNfd3JpdGVfc29ja2V0IChmZCwgJm5vbmNlLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm5vbmNlKSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZSk7CisKKyAgaWYgKHNlbmRfcmVzdWx0ID09IC0xKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX3N5c3RlbV9lcnJubyAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNlbmQgbm9uY2UgKGZkPSVkKTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fbm9uY2VmaWxlX2NyZWF0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IHVzZV9zdWJkaXIpCit7CisgICAgZGJ1c19ib29sX3QgcmV0OworICAgIERCdXNTdHJpbmcgcmFuZG9tU3RyOworCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICBfZGJ1c19hc3NlcnQgKG5vbmNlZmlsZSk7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmFuZG9tU3RyKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICB9CisKKyAgICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9hc2NpaSAoJnJhbmRvbVN0ciwgOCkpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgfQorCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5vbmNlZmlsZS0+ZGlyKQorICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJm5vbmNlZmlsZS0+ZGlyLCBfZGJ1c19nZXRfdG1wZGlyKCkpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKyAgICBpZiAodXNlX3N1YmRpcikKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5kaXIsICIvZGJ1c19ub25jZS0iKQorICAgICAgICAgICAgfHwgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZub25jZWZpbGUtPmRpciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcmFuZG9tU3RyKSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGUtPnBhdGgpCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2NvcHkgKCZub25jZWZpbGUtPmRpciwgMCwgJm5vbmNlZmlsZS0+cGF0aCwgMCkKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCAiL25vbmNlIikpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFfZGJ1c19jcmVhdGVfZGlyZWN0b3J5ICgmbm9uY2VmaWxlLT5kaXIsIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGUtPnBhdGgpCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2NvcHkgKCZub25jZWZpbGUtPmRpciwgMCwgJm5vbmNlZmlsZS0+cGF0aCwgMCkKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCAiL2RidXNfbm9uY2UtIikKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyYW5kb21TdHIpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgfQorCisgICAgICB9CisKKyAgICBpZiAoIWdlbmVyYXRlX2FuZF93cml0ZV9ub25jZSAoJm5vbmNlZmlsZS0+cGF0aCwgZXJyb3IpKQorICAgICAgeworICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgIGlmICh1c2Vfc3ViZGlyKQorICAgICAgICAgIF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKCZub25jZWZpbGUtPmRpciwgTlVMTCk7IC8vd2UgaWdub3JlIHBvc3NpYmxlIGVycm9ycyBkZWxldGluZyB0aGUgZGlyIGFuZCByZXR1cm4gdGhlIHdyaXRlIGVycm9yIGluc3RlYWQKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmFuZG9tU3RyKTsKKworICAgIHJldHVybiBUUlVFOworICBvbl9lcnJvcjoKKyAgICBpZiAodXNlX3N1YmRpcikKKyAgICAgIF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKCZub25jZWZpbGUtPmRpciwgTlVMTCk7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPmRpcik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPnBhdGgpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmFuZG9tU3RyKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBEQlVTX1dJTgorLyoqCisgKiBjcmVhdGVzIGEgbm9uY2UgZmlsZSBpbiBhIHVzZXItcmVhZGFibGUgbG9jYXRpb24gYW5kIHdyaXRlcyBhIGdlbmVyYXRlZCBub25jZSB0byBpdAorICoKKyAqIEBwYXJhbSBub25jZWZpbGUgcmV0dXJucyB0aGUgbm9uY2UgZmlsZSBsb2NhdGlvbgorICogQHBhcmFtIGVycm9yIGVycm9yIGRldGFpbHMgaWYgY3JlYXRpbmcgdGhlIG5vbmNlIGZpbGUgZmFpbHMKKyAqIEByZXR1cm4gVFJVRSBpZmYgdGhlIG5vbmNlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfY3JlYXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICAgIHJldHVybiBkb19ub25jZWZpbGVfY3JlYXRlIChub25jZWZpbGUsIGVycm9yLCAvKnVzZV9zdWJkaXI9Ki9GQUxTRSk7Cit9CisKKy8qKgorICogZGVsZXRlcyB0aGUgbm9uY2VmaWxlIGFuZCBmcmVlcyB0aGUgREJ1c05vbmNlRmlsZSBvYmplY3QuCisgKgorICogQHBhcmFtIG5vbmNlZmlsZSB0aGUgbm9uY2UgZmlsZSB0byBkZWxldGUuIENvbnRlbnRzIHdpbGwgYmUgZnJlZWQuCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgZGV0YWlscyBpZiB0aGUgbm9uY2UgZmlsZSBjb3VsZCBub3QgYmUgZGVsZXRlZAorICogQHJldHVybiBUUlVFCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfZGVsZXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgX2RidXNfZGVsZXRlX2ZpbGUgKCZub25jZWZpbGUtPnBhdGgsIGVycm9yKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+ZGlyKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+cGF0aCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbHNlCisvKioKKyAqIGNyZWF0ZXMgYSBub25jZSBmaWxlIGluIGEgdXNlci1yZWFkYWJsZSBsb2NhdGlvbiBhbmQgd3JpdGVzIGEgZ2VuZXJhdGVkIG5vbmNlIHRvIGl0LgorICogSW5pdGlhbGl6ZXMgdGhlIG5vbmNlZmlsZSBvYmplY3QuCisgKgorICogQHBhcmFtIG5vbmNlZmlsZSByZXR1cm5zIHRoZSBub25jZSBmaWxlIGxvY2F0aW9uCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgZGV0YWlscyBpZiBjcmVhdGluZyB0aGUgbm9uY2UgZmlsZSBmYWlscworICogQHJldHVybiBUUlVFIGlmZiB0aGUgbm9uY2UgZmlsZSB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX25vbmNlZmlsZV9jcmVhdGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgICAgcmV0dXJuIGRvX25vbmNlZmlsZV9jcmVhdGUgKG5vbmNlZmlsZSwgZXJyb3IsIC8qdXNlX3N1YmRpcj0qL1RSVUUpOworfQorCisvKioKKyAqIGRlbGV0ZXMgdGhlIG5vbmNlZmlsZSBhbmQgZnJlZXMgdGhlIERCdXNOb25jZUZpbGUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBub25jZWZpbGUgdGhlIG5vbmNlIGZpbGUgdG8gZGVsZXRlLiBDb250ZW50cyB3aWxsIGJlIGZyZWVkLgorICogQHBhcmFtIGVycm9yIGVycm9yIGRldGFpbHMgaWYgdGhlIG5vbmNlIGZpbGUgY291bGQgbm90IGJlIGRlbGV0ZWQKKyAqIEByZXR1cm4gVFJVRQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbm9uY2VmaWxlX2RlbGV0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKCZub25jZWZpbGUtPmRpciwgZXJyb3IpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5kaXIpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5wYXRoKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisKKy8qKgorICogcmV0dXJucyB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoZSBub25jZSBmaWxlCisgKgorICogQHBhcmFtIG5vbmNlZmlsZSBhbiBpbml0aWFsaXplZCBub25jZWZpbGUgb2JqZWN0CisgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBub25jZSBmaWxlCisgKi8KK2NvbnN0IERCdXNTdHJpbmcqCitfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGggKGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSkKK3sKKyAgICBfZGJ1c19hc3NlcnQgKG5vbmNlZmlsZSk7CisgICAgcmV0dXJuICZub25jZWZpbGUtPnBhdGg7Cit9CisKKy8qKgorICogcmVhZHMgZGF0YSBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yIGFuZCBjaGVja3MgaWYgdGhlIHJlY2VpdmVkIGRhdGEgbWF0Y2hlcworICogdGhlIGRhdGEgaW4gdGhlIGdpdmVuIG5vbmNlZmlsZS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byByZWFkIHRoZSBub25jZSBmcm9tCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRoZSBub25jZSBmaWxlIHRvIGNoZWNrIHRoZSByZWNlaXZlZCBkYXRhIGFnYWluc3QKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBkZXRhaWxzIG9uIGZhaWwKKyAqIEByZXR1cm4gVFJVRSBpZmYgYSBub25jZSBjb3VsZCBiZSBzdWNjZXNzZnVsbHkgcmVhZCBmcm9tIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIGFuZCBtYXRjaGVzIHRoZSBub25jZSBmcm9tIHRoZSBnaXZlbiBub25jZSBmaWxlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfY2hlY2tfbm9uY2UgKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IqIGVycm9yKQoreworICAgIHJldHVybiBkb19jaGVja19ub25jZSAoZmQsIF9kYnVzX25vbmNlZmlsZV9nZXRfcGF0aCAobm9uY2VmaWxlKSwgZXJyb3IpOworfQorCisKKy8qKiBAfSBlbmQgb2Ygbm9uY2UgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1ub25jZS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW5vbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0ZWE3MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1ub25jZS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1ub25jZS5oICBOb25jZSBoYW5kbGluZyBmdW5jdGlvbnMgdXNlZCBieSBub25jZS10Y3AgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBLbGFyYWx2ZGFsZW5zIERhdGFrb25zdWx0IEFCLCBhIEtEQUIgR3JvdXAgY29tcGFueSwgaW5mb0BrZGFiLm5ldAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfTk9OQ0VfSAorI2RlZmluZSBEQlVTX05PTkNFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNOb25jZUZpbGUgREJ1c05vbmNlRmlsZTsKKworc3RydWN0IERCdXNOb25jZUZpbGUKK3sKKyAgREJ1c1N0cmluZyBwYXRoOworICBEQnVzU3RyaW5nIGRpcjsKK307CisKKy8vIHNlcnZlcgorCitkYnVzX2Jvb2xfdCBfZGJ1c19ub25jZWZpbGVfY3JlYXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfbm9uY2VmaWxlX2RlbGV0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX25vbmNlZmlsZV9jaGVja19ub25jZSAoaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitjb25zdCBEQnVzU3RyaW5nKiBfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGggKGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSk7CisKK2ludCBfZGJ1c19hY2NlcHRfd2l0aF9ub25jZWZpbGUgKGludCBsaXN0ZW5fZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzTm9uY2VGaWxlICpub25jZWZpbGUpOworCisvLyBzaGFyZWQKKworZGJ1c19ib29sX3QgX2RidXNfcmVhZF9ub25jZSAoY29uc3QgREJ1c1N0cmluZyAqZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpub25jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCisvLyBjbGllbnQKKworZGJ1c19ib29sX3QgX2RidXNfc2VuZF9ub25jZSAoaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX05PTkNFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjZmM4YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5jCkBAIC0wLDAgKzEsMTk1MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW9iamVjdC10cmVlLmMgIERCdXNPYmplY3RUcmVlIChpbnRlcm5hbHMgb2YgREJ1c0Nvbm5lY3Rpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW9iamVjdC10cmVlLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c09iamVjdFRyZWUgQSBoaWVyYXJjaHkgb2Ygb2JqZWN0cyB3aXRoIGNvbnRhaW5lci1jb250YWluZWQgcmVsYXRpb25zaGlwCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNPYmplY3RUcmVlIGlzIHVzZWQgYnkgREJ1c0Nvbm5lY3Rpb24gdG8gdHJhY2sgdGhlIG9iamVjdCB0cmVlCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNPYmplY3RUcmVlLiBUaGVzZQorICogYXJlIGFsbCBsaWJyYXJ5LWludGVybmFsLgorICoKKyAqIEB7CisgKi8KKworLyoqIFN1Ym5vZGUgb2YgdGhlIG9iamVjdCBoaWVyYXJjaHkgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNPYmplY3RTdWJ0cmVlIERCdXNPYmplY3RTdWJ0cmVlOworCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqIF9kYnVzX29iamVjdF9zdWJ0cmVlX25ldyAgIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKTsKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSogX2RidXNfb2JqZWN0X3N1YnRyZWVfcmVmICAgKERCdXNPYmplY3RTdWJ0cmVlICAgICAgICAgICAqc3VidHJlZSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmIChEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgKnN1YnRyZWUpOworCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzT2JqZWN0VHJlZQorICovCitzdHJ1Y3QgREJ1c09iamVjdFRyZWUKK3sKKyAgaW50ICAgICAgICAgICAgICAgICByZWZjb3VudDsgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb247IC8qKjwgQ29ubmVjdGlvbiB0aGlzIHRyZWUgYmVsb25ncyB0byAqLworCisgIERCdXNPYmplY3RTdWJ0cmVlICAqcm9vdDsgICAgICAgLyoqPCBSb290IG9mIHRoZSB0cmVlICgiLyIgbm9kZSkgKi8KK307CisKKy8qKgorICogU3RydWN0IHJlcHJlc2VudGluZyBhIHNpbmdsZSByZWdpc3RlcmVkIHN1YnRyZWUgaGFuZGxlciwgb3Igbm9kZQorICogdGhhdCdzIGEgcGFyZW50IG9mIGEgcmVnaXN0ZXJlZCBzdWJ0cmVlIGhhbmRsZXIuIElmCisgKiBtZXNzYWdlX2Z1bmN0aW9uICE9IE5VTEwgdGhlcmUncyBhY3R1YWxseSBhIGhhbmRsZXIgYXQgdGhpcyBub2RlLgorICovCitzdHJ1Y3QgREJ1c09iamVjdFN1YnRyZWUKK3sKKyAgREJ1c0F0b21pYyAgICAgICAgICAgICAgICAgICAgICAgICByZWZjb3VudDsgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgICAgICAgKnBhcmVudDsgICAgICAgICAgICAgIC8qKjwgUGFyZW50IG5vZGUgKi8KKyAgREJ1c09iamVjdFBhdGhVbnJlZ2lzdGVyRnVuY3Rpb24gICB1bnJlZ2lzdGVyX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIHRvIGNhbGwgb24gdW5yZWdpc3RlciAqLworICBEQnVzT2JqZWN0UGF0aE1lc3NhZ2VGdW5jdGlvbiAgICAgIG1lc3NhZ2VfZnVuY3Rpb247ICAgIC8qKjwgRnVuY3Rpb24gdG8gaGFuZGxlIG1lc3NhZ2VzICovCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhOyAgICAgICAgICAgLyoqPCBEYXRhIGZvciBmdW5jdGlvbnMgKi8KKyAgREJ1c09iamVjdFN1YnRyZWUgICAgICAgICAgICAgICAgKipzdWJ0cmVlczsgICAgICAgICAgICAvKio8IENoaWxkIG5vZGVzICovCisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9zdWJ0cmVlczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hpbGQgbm9kZXMgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc3VidHJlZXM7ICAgICAgICAvKio8IE51bWJlciBvZiBhbGxvY2F0ZWQgZW50cmllcyBpbiBzdWJ0cmVlcyAqLworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgIGludm9rZV9hc19mYWxsYmFjayA6IDE7IC8qKjwgV2hldGhlciB0byBpbnZva2UgbWVzc2FnZV9mdW5jdGlvbiB3aGVuIGNoaWxkIG5vZGVzIGRvbid0IGhhbmRsZSB0aGUgbWVzc2FnZSAqLworICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMV07IC8qKjwgQWxsb2NhdGVkIGFzIGxhcmdlIGFzIG5lY2Vzc2FyeSAqLworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB0cmVlLCByZXByZXNlbnRpbmcgYSBtYXBwaW5nIGZyb20gcGF0aHMKKyAqIHRvIGhhbmRsZXIgdnRhYmxlcy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiB0aGlzIHRyZWUgYmVsb25ncyB0bworICogQHJldHVybnMgdGhlIG5ldyB0cmVlIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzT2JqZWN0VHJlZSoKK19kYnVzX29iamVjdF90cmVlX25ldyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNPYmplY3RUcmVlICp0cmVlOworCisgIC8qIHRoZSBjb25uZWN0aW9uIHBhc3NlZCBpbiBoZXJlIGlzbid0IGZ1bGx5IGNvbnN0cnVjdGVkLAorICAgKiBzbyBkb24ndCBkbyBhbnl0aGluZyBtb3JlIHRoYW4gc3RvcmUgYSBwb2ludGVyIHRvCisgICAqIGl0CisgICAqLworCisgIHRyZWUgPSBkYnVzX25ldzAgKERCdXNPYmplY3RUcmVlLCAxKTsKKyAgaWYgKHRyZWUgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICB0cmVlLT5yZWZjb3VudCA9IDE7CisgIHRyZWUtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICB0cmVlLT5yb290ID0gX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3ICgiLyIsIE5VTEwsIE5VTEwpOworICBpZiAodHJlZS0+cm9vdCA9PSBOVUxMKQorICAgIGdvdG8gb29tOworICB0cmVlLT5yb290LT5pbnZva2VfYXNfZmFsbGJhY2sgPSBUUlVFOworICAKKyAgcmV0dXJuIHRyZWU7CisKKyBvb206CisgIGlmICh0cmVlKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodHJlZSk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50CisgKiBAcGFyYW0gdHJlZSB0aGUgb2JqZWN0IHRyZWUKKyAqIEByZXR1cm5zIHRoZSBvYmplY3QgdHJlZQorICovCitEQnVzT2JqZWN0VHJlZSAqCitfZGJ1c19vYmplY3RfdHJlZV9yZWYgKERCdXNPYmplY3RUcmVlICp0cmVlKQoreworICBfZGJ1c19hc3NlcnQgKHRyZWUtPnJlZmNvdW50ID4gMCk7CisKKyAgdHJlZS0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gdHJlZTsKK30KKworLyoqCisgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudAorICogQHBhcmFtIHRyZWUgdGhlIG9iamVjdCB0cmVlCisgKi8KK3ZvaWQKK19kYnVzX29iamVjdF90cmVlX3VucmVmIChEQnVzT2JqZWN0VHJlZSAqdHJlZSkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmVlLT5yZWZjb3VudCA+IDApOworCisgIHRyZWUtPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHRyZWUtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKHRyZWUpOworCisgICAgICBkYnVzX2ZyZWUgKHRyZWUpOworICAgIH0KK30KKworLyoqIFNldCB0byAxIHRvIGdldCBhIGJ1bmNoIG9mIGRlYnVnIHNwZXcgYWJvdXQgZmluZGluZyB0aGUKKyAqIHN1YnRyZWUgbm9kZXMKKyAqLworI2RlZmluZSBWRVJCT1NFX0ZJTkQgMAorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitmaW5kX3N1YnRyZWVfcmVjdXJzZSAoREJ1c09iamVjdFN1YnRyZWUgICpzdWJ0cmVlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICppbmRleF9pbl9wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICpleGFjdF9tYXRjaCkKK3sKKyAgaW50IGksIGo7CisgIGRidXNfYm9vbF90IHJldHVybl9kZWVwZXN0X21hdGNoOworCisgIHJldHVybl9kZWVwZXN0X21hdGNoID0gZXhhY3RfbWF0Y2ggIT0gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKCEocmV0dXJuX2RlZXBlc3RfbWF0Y2ggJiYgY3JlYXRlX2lmX25vdF9mb3VuZCkpOworCisgIGlmIChwYXRoWzBdID09IE5VTEwpCisgICAgeworI2lmIFZFUkJPU0VfRklORAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgcGF0aCBleGhhdXN0ZWQsIHJldHVybmluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUpOworI2VuZGlmCisgICAgICBpZiAoZXhhY3RfbWF0Y2ggIT0gTlVMTCkKKwkqZXhhY3RfbWF0Y2ggPSBUUlVFOworICAgICAgcmV0dXJuIHN1YnRyZWU7CisgICAgfQorCisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCIgIHNlYXJjaGluZyBjaGlsZHJlbiBvZiAlcyBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUsIHBhdGhbMF0pOworI2VuZGlmCisgIAorICBpID0gMDsKKyAgaiA9IHN1YnRyZWUtPm5fc3VidHJlZXM7CisgIHdoaWxlIChpIDwgaikKKyAgICB7CisgICAgICBpbnQgaywgdjsKKworICAgICAgayA9IChpICsgaikgLyAyOworICAgICAgdiA9IHN0cmNtcCAocGF0aFswXSwgc3VidHJlZS0+c3VidHJlZXNba10tPm5hbWUpOworCisjaWYgVkVSQk9TRV9GSU5ECisgICAgICBfZGJ1c192ZXJib3NlICgiICAlcyBjbXAgJXMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhdGhbMF0sIHN1YnRyZWUtPnN1YnRyZWVzW2tdLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgdik7CisjZW5kaWYKKyAgICAgIAorICAgICAgaWYgKHYgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpbmRleF9pbl9wYXJlbnQpCisgICAgICAgICAgICB7CisjaWYgVkVSQk9TRV9GSU5ECisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHN0b3JpbmcgcGFyZW50IGluZGV4ICVkXG4iLCBrKTsKKyNlbmRpZgorICAgICAgICAgICAgICAqaW5kZXhfaW5fcGFyZW50ID0gazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyZXR1cm5fZGVlcGVzdF9tYXRjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c09iamVjdFN1YnRyZWUgKm5leHQ7CisKKyAgICAgICAgICAgICAgbmV4dCA9IGZpbmRfc3VidHJlZV9yZWN1cnNlIChzdWJ0cmVlLT5zdWJ0cmVlc1trXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFsxXSwgY3JlYXRlX2lmX25vdF9mb3VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfaW5fcGFyZW50LCBleGFjdF9tYXRjaCk7CisgICAgICAgICAgICAgIGlmIChuZXh0ID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjaykKKyAgICAgICAgICAgICAgICB7CisjaWYgVkVSQk9TRV9GSU5ECisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBubyBkZWVwZXIgbWF0Y2ggZm91bmQsIHJldHVybmluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUpOworI2VuZGlmCisJCSAgaWYgKGV4YWN0X21hdGNoICE9IE5VTEwpCisJCSAgICAqZXhhY3RfbWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJ0cmVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmaW5kX3N1YnRyZWVfcmVjdXJzZSAoc3VidHJlZS0+c3VidHJlZXNba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoWzFdLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfaW5fcGFyZW50LCBleGFjdF9tYXRjaCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHYgPCAwKQorICAgICAgICB7CisgICAgICAgICAgaiA9IGs7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGkgPSBrICsgMTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiICBubyBtYXRjaCBmb3VuZCwgY3VycmVudCB0cmVlICVzLCBjcmVhdGVfaWZfbm90X2ZvdW5kID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUsIGNyZWF0ZV9pZl9ub3RfZm91bmQpOworI2VuZGlmCisgIAorICBpZiAoY3JlYXRlX2lmX25vdF9mb3VuZCkKKyAgICB7CisgICAgICBEQnVzT2JqZWN0U3VidHJlZSogY2hpbGQ7CisgICAgICBpbnQgY2hpbGRfcG9zLCBuZXdfbl9zdWJ0cmVlczsKKworI2lmIFZFUkJPU0VfRklORAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRpbmcgc3VidHJlZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhdGhbMF0pOworI2VuZGlmCisgICAgICAKKyAgICAgIGNoaWxkID0gX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3IChwYXRoWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgaWYgKGNoaWxkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBuZXdfbl9zdWJ0cmVlcyA9IHN1YnRyZWUtPm5fc3VidHJlZXMgKyAxOworICAgICAgaWYgKG5ld19uX3N1YnRyZWVzID4gc3VidHJlZS0+bWF4X3N1YnRyZWVzKQorICAgICAgICB7CisgICAgICAgICAgaW50IG5ld19tYXhfc3VidHJlZXM7CisgICAgICAgICAgREJ1c09iamVjdFN1YnRyZWUgKipuZXdfc3VidHJlZXM7CisKKyAgICAgICAgICBuZXdfbWF4X3N1YnRyZWVzID0gc3VidHJlZS0+bWF4X3N1YnRyZWVzID09IDAgPyAxIDogMiAqIHN1YnRyZWUtPm1heF9zdWJ0cmVlczsKKyAgICAgICAgICBuZXdfc3VidHJlZXMgPSBkYnVzX3JlYWxsb2MgKHN1YnRyZWUtPnN1YnRyZWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21heF9zdWJ0cmVlcyAqIHNpemVvZiAoREJ1c09iamVjdFN1YnRyZWUqKSk7CisgICAgICAgICAgaWYgKG5ld19zdWJ0cmVlcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoY2hpbGQpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBzdWJ0cmVlLT5zdWJ0cmVlcyA9IG5ld19zdWJ0cmVlczsKKyAgICAgICAgICBzdWJ0cmVlLT5tYXhfc3VidHJlZXMgPSBuZXdfbWF4X3N1YnRyZWVzOworICAgICAgICB9CisKKyAgICAgIC8qIFRoZSBiaW5hcnkgc2VhcmNoIGZhaWxlZCwgc28gaSA9PSBqIHBvaW50cyB0byB0aGUgCisgICAgICAgICBwbGFjZSB0aGUgY2hpbGQgc2hvdWxkIGJlIGluc2VydGVkLiAqLworICAgICAgY2hpbGRfcG9zID0gaTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY2hpbGRfcG9zIDwgbmV3X25fc3VidHJlZXMgJiYKKyAgICAgICAgICAgICAgICAgICAgbmV3X25fc3VidHJlZXMgPD0gc3VidHJlZS0+bWF4X3N1YnRyZWVzKTsKKyAgICAgIGlmIChjaGlsZF9wb3MgKyAxIDwgbmV3X25fc3VidHJlZXMpCisJeworCSAgbWVtbW92ZSAoJnN1YnRyZWUtPnN1YnRyZWVzW2NoaWxkX3BvcysxXSwgCisJCSAgICZzdWJ0cmVlLT5zdWJ0cmVlc1tjaGlsZF9wb3NdLCAKKwkJICAgKG5ld19uX3N1YnRyZWVzIC0gY2hpbGRfcG9zIC0gMSkgKiAKKwkJICAgc2l6ZW9mIHN1YnRyZWUtPnN1YnRyZWVzWzBdKTsKKwl9CisgICAgICBzdWJ0cmVlLT5zdWJ0cmVlc1tjaGlsZF9wb3NdID0gY2hpbGQ7CisKKyAgICAgIGlmIChpbmRleF9pbl9wYXJlbnQpCisgICAgICAgICppbmRleF9pbl9wYXJlbnQgPSBjaGlsZF9wb3M7CisgICAgICBzdWJ0cmVlLT5uX3N1YnRyZWVzID0gbmV3X25fc3VidHJlZXM7CisgICAgICBjaGlsZC0+cGFyZW50ID0gc3VidHJlZTsKKworICAgICAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlIChjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhbMV0sIGNyZWF0ZV9pZl9ub3RfZm91bmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleF9pbl9wYXJlbnQsIGV4YWN0X21hdGNoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZXhhY3RfbWF0Y2ggIT0gTlVMTCkKKwkqZXhhY3RfbWF0Y2ggPSBGQUxTRTsKKyAgICAgIHJldHVybiAocmV0dXJuX2RlZXBlc3RfbWF0Y2ggJiYgc3VidHJlZS0+aW52b2tlX2FzX2ZhbGxiYWNrKSA/IHN1YnRyZWUgOiBOVUxMOworICAgIH0KK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorZmluZF9zdWJ0cmVlIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICppbmRleF9pbl9wYXJlbnQpCit7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworCisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIGZvciBleGFjdCByZWdpc3RlcmVkIHN1YnRyZWVcbiIpOworI2VuZGlmCisgIAorICBzdWJ0cmVlID0gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHRyZWUtPnJvb3QsIHBhdGgsIEZBTFNFLCBpbmRleF9pbl9wYXJlbnQsIE5VTEwpOworCisgIGlmIChzdWJ0cmVlICYmIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiBzdWJ0cmVlOworfQorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitsb29rdXBfc3VidHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgpCit7CisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIGZvciBzdWJ0cmVlXG4iKTsKKyNlbmRpZgorICByZXR1cm4gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHRyZWUtPnJvb3QsIHBhdGgsIEZBTFNFLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorZmluZF9oYW5kbGVyIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgsCisgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICpleGFjdF9tYXRjaCkKK3sKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgX2RidXNfdmVyYm9zZSAoIkxvb2tpbmcgZm9yIGRlZXBlc3QgaGFuZGxlclxuIik7CisjZW5kaWYKKyAgX2RidXNfYXNzZXJ0IChleGFjdF9tYXRjaCAhPSBOVUxMKTsKKworICAqZXhhY3RfbWF0Y2ggPSBGQUxTRTsgLyogZW5zdXJlIGFsd2F5cyBpbml0aWFsaXplZCAqLworICAKKyAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBGQUxTRSwgTlVMTCwgZXhhY3RfbWF0Y2gpOworfQorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitlbnN1cmVfc3VidHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgpCit7CisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJFbnN1cmluZyBzdWJ0cmVlXG4iKTsKKyNlbmRpZgorICByZXR1cm4gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHRyZWUtPnJvb3QsIHBhdGgsIFRSVUUsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgY2hhciAqZmxhdHRlbl9wYXRoIChjb25zdCBjaGFyICoqcGF0aCk7CisKKy8qKgorICogUmVnaXN0ZXJzIGEgbmV3IHN1YnRyZWUgaW4gdGhlIGdsb2JhbCBvYmplY3QgdHJlZS4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgZ2xvYmFsIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gZmFsbGJhY2sgI1RSVUUgdG8gaGFuZGxlIG1lc3NhZ2VzIHRvIGNoaWxkcmVuIG9mIHRoaXMgcGF0aAorICogQHBhcmFtIHBhdGggTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIHBhdGggZWxlbWVudHMgZ2l2aW5nIHBhdGggdG8gc3VidHJlZQorICogQHBhcmFtIHZ0YWJsZSB0aGUgdnRhYmxlIHVzZWQgdG8gdHJhdmVyc2UgdGhpcyBzdWJ0cmVlCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSB0byBwYXNzIHRvIG1ldGhvZHMgaW4gdGhlIHZ0YWJsZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBpcyByZXBvcnRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKERCdXNPYmplY3RUcmVlICAgICAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgIGZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKQoreworICBEQnVzT2JqZWN0U3VidHJlZSAgKnN1YnRyZWU7CisKKyAgX2RidXNfYXNzZXJ0ICh0cmVlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHZ0YWJsZS0+bWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwYXRoICE9IE5VTEwpOworCisgIHN1YnRyZWUgPSBlbnN1cmVfc3VidHJlZSAodHJlZSwgcGF0aCk7CisgIGlmIChzdWJ0cmVlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChlcnJvciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqY29tcGxldGVfcGF0aCA9IGZsYXR0ZW5fcGF0aCAocGF0aCk7CisKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBoYW5kbGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV9wYXRoID8gY29tcGxldGVfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIihjYW5ub3QgcmVwcmVzZW50IHBhdGg6IG91dCBvZiBtZW1vcnkhKSIpOworCisgICAgICAgICAgZGJ1c19mcmVlIChjb21wbGV0ZV9wYXRoKTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSB2dGFibGUtPm1lc3NhZ2VfZnVuY3Rpb247CisgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSB2dGFibGUtPnVucmVnaXN0ZXJfZnVuY3Rpb247CisgIHN1YnRyZWUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgc3VidHJlZS0+aW52b2tlX2FzX2ZhbGxiYWNrID0gZmFsbGJhY2sgIT0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0IHN1YnRyZWUgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZQorICogc2FtZSBwYXRoLgorICoKKyAqIEBwYXJhbSB0cmVlIHRoZSBnbG9iYWwgb2JqZWN0IHRyZWUKKyAqIEBwYXJhbSBwYXRoIHBhdGggdG8gdGhlIHN1YnRyZWUgKHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgdG8gX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIoKSkKKyAqLwordm9pZAorX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAqKnBhdGgpCit7CisgIGludCBpOworICBEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZTsKKyAgREJ1c09iamVjdFBhdGhVbnJlZ2lzdGVyRnVuY3Rpb24gdW5yZWdpc3Rlcl9mdW5jdGlvbjsKKyAgdm9pZCAqdXNlcl9kYXRhOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisKKyAgdW5yZWdpc3Rlcl9mdW5jdGlvbiA9IE5VTEw7CisgIHVzZXJfZGF0YSA9IE5VTEw7CisKKyAgc3VidHJlZSA9IGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aCwgJmkpOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaWYgKHN1YnRyZWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQXR0ZW1wdGVkIHRvIHVucmVnaXN0ZXIgcGF0aCAocGF0aFswXSA9ICVzIHBhdGhbMV0gPSAlcykgd2hpY2ggaXNuJ3QgcmVnaXN0ZXJlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBhdGhbMF0gPyBwYXRoWzBdIDogIm51bGwiLAorICAgICAgICAgICAgICAgICAgcGF0aFsxXSA/IHBhdGhbMV0gOiAibnVsbCIpOworICAgICAgZ290byB1bmxvY2s7ICAgIAorICAgIH0KKyNlbHNlCisgIF9kYnVzX2Fzc2VydCAoc3VidHJlZSAhPSBOVUxMKTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+cGFyZW50ID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAoaSA+PSAwICYmIHN1YnRyZWUtPnBhcmVudC0+c3VidHJlZXNbaV0gPT0gc3VidHJlZSkpOworCisgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSBOVUxMOworCisgIHVucmVnaXN0ZXJfZnVuY3Rpb24gPSBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uOworICB1c2VyX2RhdGEgPSBzdWJ0cmVlLT51c2VyX2RhdGE7CisKKyAgc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbiA9IE5VTEw7CisgIHN1YnRyZWUtPnVzZXJfZGF0YSA9IE5VTEw7CisKKyAgLyogSWYgd2UgaGF2ZSBubyBzdWJ0cmVlcyBvZiBvdXIgb3duLCByZW1vdmUgZnJvbQorICAgKiBvdXIgcGFyZW50IChGSVhNRSBjb3VsZCBhbHNvIGJlIG1vcmUgYWdncmVzc2l2ZQorICAgKiBhbmQgcmVtb3ZlIG91ciBwYXJlbnQgaWYgaXQgYmVjb21lcyBlbXB0eSkKKyAgICovCisgIGlmIChzdWJ0cmVlLT5wYXJlbnQgJiYgc3VidHJlZS0+bl9zdWJ0cmVlcyA9PSAwKQorICAgIHsKKyAgICAgIC8qIGFzc3VtZXMgYSAwLWJ5dGUgbWVtbW92ZSBpcyBPSyAqLworICAgICAgbWVtbW92ZSAoJnN1YnRyZWUtPnBhcmVudC0+c3VidHJlZXNbaV0sCisgICAgICAgICAgICAgICAmc3VidHJlZS0+cGFyZW50LT5zdWJ0cmVlc1tpKzFdLAorICAgICAgICAgICAgICAgKHN1YnRyZWUtPnBhcmVudC0+bl9zdWJ0cmVlcyAtIGkgLSAxKSAqCisgICAgICAgICAgICAgICBzaXplb2YgKHN1YnRyZWUtPnBhcmVudC0+c3VidHJlZXNbMF0pKTsKKyAgICAgIHN1YnRyZWUtPnBhcmVudC0+bl9zdWJ0cmVlcyAtPSAxOworCisgICAgICBzdWJ0cmVlLT5wYXJlbnQgPSBOVUxMOworCisgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoc3VidHJlZSk7CisgICAgfQorICBzdWJ0cmVlID0gTlVMTDsKKwordW5sb2NrOgorICBjb25uZWN0aW9uID0gdHJlZS0+Y29ubmVjdGlvbjsKKworICAvKiBVbmxvY2sgYW5kIGNhbGwgYXBwbGljYXRpb24gY29kZSAqLworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKGNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgaWYgKHVucmVnaXN0ZXJfZnVuY3Rpb24pCisgICAgKCogdW5yZWdpc3Rlcl9mdW5jdGlvbikgKGNvbm5lY3Rpb24sIHVzZXJfZGF0YSk7CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGlmIChjb25uZWN0aW9uKQorI2VuZGlmCisgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc3VidHJlZV9yZWN1cnNlIChEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZSkKK3sKKyAgLyogRGVsZXRlIHRoZW0gZnJvbSB0aGUgZW5kLCBmb3Igc2xpZ2h0bHkKKyAgICogbW9yZSByb2J1c3RuZXNzIGFnYWluc3Qgb2RkIHJlZW50cmFuY3kuCisgICAqLworICB3aGlsZSAoc3VidHJlZS0+bl9zdWJ0cmVlcyA+IDApCisgICAgeworICAgICAgREJ1c09iamVjdFN1YnRyZWUgKmNoaWxkOworCisgICAgICBjaGlsZCA9IHN1YnRyZWUtPnN1YnRyZWVzW3N1YnRyZWUtPm5fc3VidHJlZXMgLSAxXTsKKyAgICAgIHN1YnRyZWUtPnN1YnRyZWVzW3N1YnRyZWUtPm5fc3VidHJlZXMgLSAxXSA9IE5VTEw7CisgICAgICBzdWJ0cmVlLT5uX3N1YnRyZWVzIC09IDE7CisgICAgICBjaGlsZC0+cGFyZW50ID0gTlVMTDsKKworICAgICAgZnJlZV9zdWJ0cmVlX3JlY3Vyc2UgKGNvbm5lY3Rpb24sIGNoaWxkKTsKKyAgICB9CisKKyAgLyogQ2FsbCBhcHBsaWNhdGlvbiBjb2RlICovCisgIGlmIChzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uKQorICAgICgqIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24pIChjb25uZWN0aW9uLAorCQkJCSAgICAgIHN1YnRyZWUtPnVzZXJfZGF0YSk7CisKKyAgc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9IE5VTEw7CisgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSBOVUxMOworICBzdWJ0cmVlLT51c2VyX2RhdGEgPSBOVUxMOworCisgIC8qIE5vdyBmcmVlIG91cnNlbHZlcyAqLworICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoc3VidHJlZSk7Cit9CisKKy8qKgorICogRnJlZSBhbGwgdGhlIGhhbmRsZXJzIGluIHRoZSB0cmVlLiBMb2NrIG9uIHRyZWUncyBjb25uZWN0aW9uCisgKiBtdXN0IG5vdCBiZSBoZWxkLgorICoKKyAqIEBwYXJhbSB0cmVlIHRoZSBvYmplY3QgdHJlZQorICovCit2b2lkCitfZGJ1c19vYmplY3RfdHJlZV9mcmVlX2FsbF91bmxvY2tlZCAoREJ1c09iamVjdFRyZWUgKnRyZWUpCit7CisgIGlmICh0cmVlLT5yb290KQorICAgIGZyZWVfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlLT5yb290KTsKKyAgdHJlZS0+cm9vdCA9IE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgKioqY2hpbGRfZW50cmllcykKK3sKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisgIGNoYXIgKipyZXR2YWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHBhcmVudF9wYXRoICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCk7CisKKyAgKmNoaWxkX2VudHJpZXMgPSBOVUxMOworICAKKyAgc3VidHJlZSA9IGxvb2t1cF9zdWJ0cmVlICh0cmVlLCBwYXJlbnRfcGF0aCk7CisgIGlmIChzdWJ0cmVlID09IE5VTEwpCisgICAgeworICAgICAgcmV0dmFsID0gZGJ1c19uZXcwIChjaGFyICosIDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgcmV0dmFsID0gZGJ1c19uZXcwIChjaGFyKiwgc3VidHJlZS0+bl9zdWJ0cmVlcyArIDEpOworICAgICAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBzdWJ0cmVlLT5uX3N1YnRyZWVzKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsW2ldID0gX2RidXNfc3RyZHVwIChzdWJ0cmVlLT5zdWJ0cmVlc1tpXS0+bmFtZSk7CisgICAgICAgICAgaWYgKHJldHZhbFtpXSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChyZXR2YWwpOworICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyBvdXQ6CisgICAgCisgICpjaGlsZF9lbnRyaWVzID0gcmV0dmFsOworICByZXR1cm4gcmV0dmFsICE9IE5VTEw7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX2RlZmF1bHRfaW50cm9zcGVjdF9hbmRfdW5sb2NrIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKipwYXRoKQoreworICBEQnVzU3RyaW5nIHhtbDsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBjaGFyICoqY2hpbGRyZW47CisgIGludCBpOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgZGJ1c19ib29sX3QgYWxyZWFkeV91bmxvY2tlZDsKKworICAvKiBXZSBoYXZlIHRoZSBjb25uZWN0aW9uIGxvY2sgaGVyZSAqLworCisgIGFscmVhZHlfdW5sb2NrZWQgPSBGQUxTRTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCIgY29uc2lkZXJpbmcgZGVmYXVsdCBJbnRyb3NwZWN0KCkgaGFuZGxlci4uLlxuIik7CisKKyAgcmVwbHkgPSBOVUxMOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9JTlRST1NQRUNUQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRyb3NwZWN0IikpCisgICAgeworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiIHVzaW5nIGRlZmF1bHQgSW50cm9zcGVjdCgpIGhhbmRsZXIhXG4iKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ4bWwpKQorICAgIHsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgIH0KKworICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworCisgIGNoaWxkcmVuID0gTlVMTDsKKyAgaWYgKCFfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrZWQgKHRyZWUsIHBhdGgsICZjaGlsZHJlbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmeG1sLCBEQlVTX0lOVFJPU1BFQ1RfMV8wX1hNTF9ET0NUWVBFX0RFQ0xfTk9ERSkpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ4bWwsICI8bm9kZT5cbiIpKQorICAgIGdvdG8gb3V0OworCisgIGkgPSAwOworICB3aGlsZSAoY2hpbGRyZW5baV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmeG1sLCAiICA8bm9kZSBuYW1lPVwiJXNcIi8+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baV0pKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ4bWwsICI8L25vZGU+XG4iKSkKKyAgICBnb3RvIG91dDsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnhtbCk7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HKSkKKyAgICBnb3RvIG91dDsKKyAgCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgIHsKKyAgICAgIGFscmVhZHlfdW5sb2NrZWQgPSBUUlVFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgCisgb3V0OgorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBpZiAoIWFscmVhZHlfdW5sb2NrZWQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnhtbCk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNoaWxkcmVuKTsKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBUcmllcyB0byBkaXNwYXRjaCBhIG1lc3NhZ2UgYnkgZGlyZWN0aW5nIGl0IHRvIGhhbmRsZXIgZm9yIHRoZQorICogb2JqZWN0IHBhdGggbGlzdGVkIGluIHRoZSBtZXNzYWdlIGhlYWRlciwgaWYgYW55LiBNZXNzYWdlcyBhcmUKKyAqIGRpc3BhdGNoZWQgZmlyc3QgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlciB0aGF0IG1hdGNoZXMgdGhlIGxhcmdlc3QKKyAqIG51bWJlciBvZiBwYXRoIGVsZW1lbnRzOyB0aGF0IGlzLCBtZXNzYWdlIHRvIC9mb28vYmFyL2JheiB3b3VsZCBnbworICogdG8gdGhlIGhhbmRsZXIgZm9yIC9mb28vYmFyIGJlZm9yZSB0aGUgb25lIGZvciAvZm9vLgorICoKKyAqIEB0b2RvIHRocmVhZCBwcm9ibGVtcworICoKKyAqIEBwYXJhbSB0cmVlIHRoZSBnbG9iYWwgb2JqZWN0IHRyZWUKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGRpc3BhdGNoCisgKiBAcmV0dXJucyB3aGV0aGVyIG1lc3NhZ2Ugd2FzIGhhbmRsZWQgc3VjY2Vzc2Z1bGx5CisgKi8KK0RCdXNIYW5kbGVyUmVzdWx0CitfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICptZXNzYWdlKQoreworICBjaGFyICoqcGF0aDsKKyAgZGJ1c19ib29sX3QgZXhhY3RfbWF0Y2g7CisgIERCdXNMaXN0ICpsaXN0OworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZTsKKyAgCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiRGlzcGF0Y2ggb2YgbWVzc2FnZSBieSBvYmplY3QgcGF0aFxuIik7CisjZW5kaWYKKyAgCisgIHBhdGggPSBOVUxMOworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChtZXNzYWdlLCAmcGF0aCkpCisgICAgeworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgZGVjb21wb3NlZCBwYXRoXG4iKTsKKworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgfQorCisgIGlmIChwYXRoID09IE5VTEwpCisgICAgeworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBhdGggZmllbGQgaW4gbWVzc2FnZVxuIik7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorICAKKyAgLyogRmluZCB0aGUgZGVlcGVzdCBwYXRoIHRoYXQgY292ZXJzIHRoZSBwYXRoIGluIHRoZSBtZXNzYWdlICovCisgIHN1YnRyZWUgPSBmaW5kX2hhbmRsZXIgKHRyZWUsIChjb25zdCBjaGFyKiopIHBhdGgsICZleGFjdF9tYXRjaCk7CisgIAorICAvKiBCdWlsZCBhIGxpc3Qgb2YgYWxsIHBhdGhzIHRoYXQgY292ZXIgdGhlIHBhdGggaW4gdGhlIG1lc3NhZ2UgKi8KKworICBsaXN0ID0gTlVMTDsKKworICB3aGlsZSAoc3VidHJlZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uICE9IE5VTEwgJiYgKGV4YWN0X21hdGNoIHx8IHN1YnRyZWUtPmludm9rZV9hc19mYWxsYmFjaykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV9yZWYgKHN1YnRyZWUpOworCisgICAgICAgICAgLyogcnVuIGRlZXBlc3QgcGF0aHMgZmlyc3QgKi8KKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdCwgc3VidHJlZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgICAgICAgICAgIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmIChzdWJ0cmVlKTsKKyAgICAgICAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgZXhhY3RfbWF0Y2ggPSBGQUxTRTsKKyAgICAgIHN1YnRyZWUgPSBzdWJ0cmVlLT5wYXJlbnQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIlZCBoYW5kbGVycyBpbiB0aGUgcGF0aCB0cmVlIGZvciB0aGlzIG1lc3NhZ2VcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QpKTsKKworICAvKiBJbnZva2UgZWFjaCBoYW5kbGVyIGluIHRoZSBsaXN0ICovCisKKyAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QsIGxpbmspOworICAgICAgc3VidHJlZSA9IGxpbmstPmRhdGE7CisKKyAgICAgIC8qIG1lc3NhZ2VfZnVuY3Rpb24gaXMgTlVMTCBpZiB3ZSdyZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAqIGR1ZSB0byByZWVudHJhbmN5CisgICAgICAgKi8KKyAgICAgIGlmIChzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgREJ1c09iamVjdFBhdGhNZXNzYWdlRnVuY3Rpb24gbWVzc2FnZV9mdW5jdGlvbjsKKyAgICAgICAgICB2b2lkICp1c2VyX2RhdGE7CisKKyAgICAgICAgICBtZXNzYWdlX2Z1bmN0aW9uID0gc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbjsKKyAgICAgICAgICB1c2VyX2RhdGEgPSBzdWJ0cmVlLT51c2VyX2RhdGE7CisKKyNpZiAwCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKGludm9raW5nIGEgaGFuZGxlcilcbiIpOworI2VuZGlmCisgICAgICAgICAgCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAgICAgICAgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBGSVhNRSB5b3UgY291bGQgdW5yZWdpc3RlciB0aGUgc3VidHJlZSBpbiBhbm90aGVyIHRocmVhZAorICAgICAgICAgICAqIGJlZm9yZSB3ZSBpbnZva2UgdGhlIGNhbGxiYWNrLCBhbmQgSSBjYW4ndCBmaWd1cmUgb3V0IGEKKyAgICAgICAgICAgKiBnb29kIHdheSB0byBzb2x2ZSB0aGlzLgorICAgICAgICAgICAqLworCisgICAgICAgICAgcmVzdWx0ID0gKCogbWVzc2FnZV9mdW5jdGlvbikgKHRyZWUtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YSk7CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorICAgICAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgZnJlZV9hbmRfcmV0dXJuOgorCisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisgICAgeworICAgICAgLyogVGhpcyBoYXJkY29kZWQgZGVmYXVsdCBoYW5kbGVyIGRvZXMgYSBtaW5pbWFsIEludHJvc3BlY3QoKQorICAgICAgICovCisgICAgICByZXN1bHQgPSBoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X2FuZF91bmxvY2sgKHRyZWUsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKiopIHBhdGgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICAgICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorICAKKyAgd2hpbGUgKGxpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QpOworICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QsIGxpbmspOworICAgIH0KKyAgCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHBhdGgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogTG9va3MgdXAgdGhlIGRhdGEgcGFzc2VkIHRvIF9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyKCkgZm9yIGEKKyAqIGhhbmRsZXIgYXQgdGhlIGdpdmVuIHBhdGguCisgKgorICogQHBhcmFtIHRyZWUgdGhlIGdsb2JhbCBvYmplY3QgdHJlZQorICogQHBhcmFtIHBhdGggTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIHBhdGggZWxlbWVudHMgZ2l2aW5nIHBhdGggdG8gc3VidHJlZQorICogQHJldHVybnMgdGhlIG9iamVjdCdzIHVzZXJfZGF0YSBvciAjTlVMTCBpZiBub25lIGZvdW5kCisgKi8KK3ZvaWQqCitfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoKQoreworICBkYnVzX2Jvb2xfdCBleGFjdF9tYXRjaDsKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisKKyAgX2RidXNfYXNzZXJ0ICh0cmVlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisgIAorICAvKiBGaW5kIHRoZSBkZWVwZXN0IHBhdGggdGhhdCBjb3ZlcnMgdGhlIHBhdGggaW4gdGhlIG1lc3NhZ2UgKi8KKyAgc3VidHJlZSA9IGZpbmRfaGFuZGxlciAodHJlZSwgKGNvbnN0IGNoYXIqKikgcGF0aCwgJmV4YWN0X21hdGNoKTsKKworICBpZiAoKHN1YnRyZWUgPT0gTlVMTCkgfHwgIWV4YWN0X21hdGNoKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBvYmplY3QgYXQgc3BlY2lmaWVkIHBhdGggZm91bmRcbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBzdWJ0cmVlLT51c2VyX2RhdGE7Cit9CisKKy8qKgorICogQWxsb2NhdGVzIGEgc3VidHJlZSBvYmplY3QuCisgKgorICogQHBhcmFtIG5hbWUgbmFtZSB0byBkdXBsaWNhdGUuCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgc3VidHJlZQorICovCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCithbGxvY2F0ZV9zdWJ0cmVlX29iamVjdCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IGxlbjsKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisgIGNvbnN0IHNpemVfdCBmcm9udF9wYWRkaW5nID0gX0RCVVNfU1RSVUNUX09GRlNFVCAoREJ1c09iamVjdFN1YnRyZWUsIG5hbWUpOworCisgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKG5hbWUpOworCisgIHN1YnRyZWUgPSBkYnVzX21hbGxvYyAoTUFYIChmcm9udF9wYWRkaW5nICsgKGxlbiArIDEpLCBzaXplb2YgKERCdXNPYmplY3RTdWJ0cmVlKSkpOworCisgIGlmIChzdWJ0cmVlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtY3B5IChzdWJ0cmVlLT5uYW1lLCBuYW1lLCBsZW4gKyAxKTsKKworICByZXR1cm4gc3VidHJlZTsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3IChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisKKyAgc3VidHJlZSA9IGFsbG9jYXRlX3N1YnRyZWVfb2JqZWN0IChuYW1lKTsKKyAgaWYgKHN1YnRyZWUgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisKKyAgc3VidHJlZS0+cGFyZW50ID0gTlVMTDsKKworICBpZiAodnRhYmxlKQorICAgIHsKKyAgICAgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSB2dGFibGUtPm1lc3NhZ2VfZnVuY3Rpb247CisgICAgICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gdnRhYmxlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSBOVUxMOworICAgICAgc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbiA9IE5VTEw7CisgICAgfQorCisgIHN1YnRyZWUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgc3VidHJlZS0+cmVmY291bnQudmFsdWUgPSAxOworICBzdWJ0cmVlLT5zdWJ0cmVlcyA9IE5VTEw7CisgIHN1YnRyZWUtPm5fc3VidHJlZXMgPSAwOworICBzdWJ0cmVlLT5tYXhfc3VidHJlZXMgPSAwOworICBzdWJ0cmVlLT5pbnZva2VfYXNfZmFsbGJhY2sgPSBGQUxTRTsKKworICByZXR1cm4gc3VidHJlZTsKKworIG9vbToKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSAqCitfZGJ1c19vYmplY3Rfc3VidHJlZV9yZWYgKERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlKQoreworICBfZGJ1c19hc3NlcnQgKHN1YnRyZWUtPnJlZmNvdW50LnZhbHVlID4gMCk7CisgIF9kYnVzX2F0b21pY19pbmMgKCZzdWJ0cmVlLT5yZWZjb3VudCk7CisKKyAgcmV0dXJuIHN1YnRyZWU7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWUpCit7CisgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+cmVmY291bnQudmFsdWUgPiAwKTsKKworICBpZiAoX2RidXNfYXRvbWljX2RlYyAoJnN1YnRyZWUtPnJlZmNvdW50KSA9PSAxKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbiA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9PSBOVUxMKTsKKworICAgICAgZGJ1c19mcmVlIChzdWJ0cmVlLT5zdWJ0cmVlcyk7CisgICAgICBkYnVzX2ZyZWUgKHN1YnRyZWUpOworICAgIH0KK30KKworLyoqCisgKiBMaXN0cyB0aGUgcmVnaXN0ZXJlZCBmYWxsYmFjayBoYW5kbGVycyBhbmQgb2JqZWN0IHBhdGggaGFuZGxlcnMgYXQKKyAqIHRoZSBnaXZlbiBwYXJlbnRfcGF0aC4gVGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKgorICogQHBhcmFtIHRyZWUgdGhlIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gcGFyZW50X3BhdGggdGhlIHBhdGggdG8gbGlzdCB0aGUgY2hpbGQgaGFuZGxlcnMgb2YKKyAqIEBwYXJhbSBjaGlsZF9lbnRyaWVzIHJldHVybnMgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBjaGlsZHJlbgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgY2hpbGQgZW50cmllcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX2FuZF91bmxvY2sgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgKioqY2hpbGRfZW50cmllcykKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIHJlc3VsdCA9IF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9lbnRyaWVzKTsKKyAgCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qKiBTZXQgdG8gMSB0byBnZXQgYSBidW5jaCBvZiBzcGV3IGFib3V0IGRpc2Fzc2VtYmxpbmcgdGhlIHBhdGggc3RyaW5nICovCisjZGVmaW5lIFZFUkJPU0VfREVDT01QT1NFIDAKKworLyoqCisgKiBEZWNvbXBvc2UgYW4gb2JqZWN0IHBhdGguICBBIHBhdGggb2YganVzdCAiLyIgaXMKKyAqIHJlcHJlc2VudGVkIGFzIGFuIGVtcHR5IHZlY3RvciBvZiBzdHJpbmdzLgorICogVGhlIHBhdGggbmVlZCBub3QgYmUgbnVsIHRlcm1pbmF0ZWQuCisgKiAKKyAqIEBwYXJhbSBkYXRhIHRoZSBwYXRoIGRhdGEKKyAqIEBwYXJhbSBsZW4gIHRoZSBsZW5ndGggb2YgdGhlIHBhdGggc3RyaW5nCisgKiBAcGFyYW0gcGF0aCBhZGRyZXNzIHRvIHN0b3JlIG5ldyBvYmplY3QgcGF0aAorICogQHBhcmFtIHBhdGhfbGVuIGxlbmd0aCBvZiBzdG9yZWQgcGF0aAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGVjb21wb3NlX3BhdGggKGNvbnN0IGNoYXIqICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICoqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgKnBhdGhfbGVuKQoreworICBjaGFyICoqcmV0dmFsOworICBpbnQgbl9jb21wb25lbnRzOworICBpbnQgaSwgaiwgY29tcDsKKworICBfZGJ1c19hc3NlcnQgKGRhdGEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocGF0aCAhPSBOVUxMKTsKKyAgCisjaWYgVkVSQk9TRV9ERUNPTVBPU0UKKyAgX2RidXNfdmVyYm9zZSAoIkRlY29tcG9zaW5nIHBhdGggXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICBkYXRhKTsKKyNlbmRpZgorICAKKyAgbl9jb21wb25lbnRzID0gMDsKKyAgaWYgKGxlbiA+IDEpIC8qIGlmIHBhdGggaXMgbm90IGp1c3QgIi8iICovCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IGxlbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YVtpXSAhPSAnXDAnKTsKKyAgICAgICAgICBpZiAoZGF0YVtpXSA9PSAnLycpCisgICAgICAgICAgICBuX2NvbXBvbmVudHMgKz0gMTsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR2YWwgPSBkYnVzX25ldzAgKGNoYXIqLCBuX2NvbXBvbmVudHMgKyAxKTsKKworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvbXAgPSAwOworICBpZiAobl9jb21wb25lbnRzID09IDApCisgICAgaSA9IDE7CisgIGVsc2UKKyAgICBpID0gMDsKKyAgd2hpbGUgKGNvbXAgPCBuX2NvbXBvbmVudHMpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpIDwgbGVuKTsKKyAgICAgIAorICAgICAgaWYgKGRhdGFbaV0gPT0gJy8nKQorICAgICAgICArK2k7CisgICAgICBqID0gaTsKKworICAgICAgd2hpbGUgKGogPCBsZW4gJiYgZGF0YVtqXSAhPSAnLycpCisgICAgICAgICsrajsKKworICAgICAgLyogTm93IFtpLCBqKSBpcyB0aGUgcGF0aCBjb21wb25lbnQgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoaSA8IGopOworICAgICAgX2RidXNfYXNzZXJ0IChkYXRhW2ldICE9ICcvJyk7CisgICAgICBfZGJ1c19hc3NlcnQgKGogPT0gbGVuIHx8IGRhdGFbal0gPT0gJy8nKTsKKworI2lmIFZFUkJPU0VfREVDT01QT1NFCisgICAgICBfZGJ1c192ZXJib3NlICgiICAoY29tcG9uZW50IGluIFslZCwlZCkpXG4iLAorICAgICAgICAgICAgICAgICAgICAgaSwgaik7CisjZW5kaWYKKyAgICAgIAorICAgICAgcmV0dmFsW2NvbXBdID0gX2RidXNfbWVtZHVwICgmZGF0YVtpXSwgaiAtIGkgKyAxKTsKKyAgICAgIGlmIChyZXR2YWxbY29tcF0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHJldHZhbCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICByZXR2YWxbY29tcF1bai1pXSA9ICdcMCc7CisjaWYgVkVSQk9TRV9ERUNPTVBPU0UKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChjb21wb25lbnQgJWQgPSBcIiVzXCIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgY29tcCwgcmV0dmFsW2NvbXBdKTsKKyNlbmRpZgorCisgICAgICArK2NvbXA7CisgICAgICBpID0gajsKKyAgICB9CisgIF9kYnVzX2Fzc2VydCAoaSA9PSBsZW4pOworICAKKyAgKnBhdGggPSByZXR2YWw7CisgIGlmIChwYXRoX2xlbikKKyAgICAqcGF0aF9sZW4gPSBuX2NvbXBvbmVudHM7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqIEB9ICovCisKK3N0YXRpYyBjaGFyKgorZmxhdHRlbl9wYXRoIChjb25zdCBjaGFyICoqcGF0aCkKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGNoYXIgKnM7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHBhdGhbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnN0ciwgJy8nKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAocGF0aFtpXSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnLycpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIHBhdGhbaV0pKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnMpKQorICAgIGdvdG8gbm9tZW07CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIHJldHVybiBzOworCisgbm9tZW06CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgU1RSX0VRVUFMLAorICBTVFJfUFJFRklYLAorICBTVFJfRElGRkVSRU5UCit9IFN0ckNvbXBhcmlzb247CisKKy8qIFJldHVybnMgVFJVRSBpZiBjb250YWluZXIgaXMgYSBwYXJlbnQgb2YgY2hpbGQKKyAqLworc3RhdGljIFN0ckNvbXBhcmlzb24KK3BhdGhfY29udGFpbnMgKGNvbnN0IGNoYXIgKipjb250YWluZXIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqY2hpbGQpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoY2hpbGRbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgdjsKKworICAgICAgaWYgKGNvbnRhaW5lcltpXSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gU1RSX1BSRUZJWDsgLyogY29udGFpbmVyIHJhbiBvdXQsIGNoaWxkIGNvbnRpbnVlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRodXMgdGhlIGNvbnRhaW5lciBpcyBhIHBhcmVudCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoaWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY29udGFpbmVyW2ldICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChjaGlsZFtpXSAhPSBOVUxMKTsKKworICAgICAgdiA9IHN0cmNtcCAoY29udGFpbmVyW2ldLCBjaGlsZFtpXSk7CisKKyAgICAgIGlmICh2ICE9IDApCisgICAgICAgIHJldHVybiBTVFJfRElGRkVSRU5UOyAvKiB0aGV5IG92ZXJsYXAgdW50aWwgaGVyZSBhbmQgdGhlbiBhcmUgZGlmZmVyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbm90IG92ZXJsYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgKytpOworICAgIH0KKworICAvKiBDaGlsZCByYW4gb3V0OyBpZiBjb250YWluZXIgYWxzbyBkaWQsIHRoZXkgYXJlIGVxdWFsOworICAgKiBvdGhlcndpc2UsIHRoZSBjaGlsZCBpcyBhIHBhcmVudCBvZiB0aGUgY29udGFpbmVyLgorICAgKi8KKyAgaWYgKGNvbnRhaW5lcltpXSA9PSBOVUxMKQorICAgIHJldHVybiBTVFJfRVFVQUw7CisgIGVsc2UKKyAgICByZXR1cm4gU1RSX0RJRkZFUkVOVDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitzcGV3X3N1YnRyZWVfcmVjdXJzZSAoREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluZGVudCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgaW5kZW50KQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIik7CisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIlcyAoJWQgY2hpbGRyZW4pXG4iLAorICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5uYW1lLCBzdWJ0cmVlLT5uX3N1YnRyZWVzKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBzdWJ0cmVlLT5uX3N1YnRyZWVzKQorICAgIHsKKyAgICAgIHNwZXdfc3VidHJlZV9yZWN1cnNlIChzdWJ0cmVlLT5zdWJ0cmVlc1tpXSwgaW5kZW50ICsgMik7CisKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzcGV3X3RyZWUgKERCdXNPYmplY3RUcmVlICp0cmVlKQoreworICBzcGV3X3N1YnRyZWVfcmVjdXJzZSAodHJlZS0+cm9vdCwgMCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBDYWxsYmFjayBkYXRhIHVzZWQgaW4gdGVzdHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqKnBhdGg7IC8qKjwgUGF0aCAqLworICBkYnVzX2Jvb2xfdCBoYW5kbGVyX2ZhbGxiYWNrOyAvKio8IHRydWUgaWYgdGhlIGhhbmRsZXIgbWF5IGJlIGNhbGxlZCBhcyBmYWxsYmFjayAqLworICBkYnVzX2Jvb2xfdCBtZXNzYWdlX2hhbmRsZWQ7IC8qKjwgR2V0cyBzZXQgdG8gdHJ1ZSBpZiBtZXNzYWdlIGhhbmRsZXIgY2FsbGVkICovCisgIGRidXNfYm9vbF90IGhhbmRsZXJfdW5yZWdpc3RlcmVkOyAvKio8IGdldHMgc2V0IHRvIHRydWUgaWYgaGFuZGxlciBpcyB1bnJlZ2lzdGVyZWQgKi8KK30gVHJlZVRlc3REYXRhOworCisKK3N0YXRpYyB2b2lkCit0ZXN0X3VucmVnaXN0ZXJfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIFRyZWVUZXN0RGF0YSAqdHRkID0gdXNlcl9kYXRhOworCisgIHR0ZC0+aGFuZGxlcl91bnJlZ2lzdGVyZWQgPSBUUlVFOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3Rlc3RfbWVzc2FnZV9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBUcmVlVGVzdERhdGEgKnR0ZCA9IHVzZXJfZGF0YTsKKworICB0dGQtPm1lc3NhZ2VfaGFuZGxlZCA9IFRSVUU7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3JlZ2lzdGVyIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICAgICoqcGF0aCwKKyAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZmFsbGJhY2ssCisgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgVHJlZVRlc3REYXRhICAgKnRyZWVfdGVzdF9kYXRhKQoreworICBEQnVzT2JqZWN0UGF0aFZUYWJsZSB2dGFibGUgPSB7IHRlc3RfdW5yZWdpc3Rlcl9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X21lc3NhZ2VfZnVuY3Rpb24sIE5VTEwgfTsKKworICB0cmVlX3Rlc3RfZGF0YVtpXS5tZXNzYWdlX2hhbmRsZWQgPSBGQUxTRTsKKyAgdHJlZV90ZXN0X2RhdGFbaV0uaGFuZGxlcl91bnJlZ2lzdGVyZWQgPSBGQUxTRTsKKyAgdHJlZV90ZXN0X2RhdGFbaV0uaGFuZGxlcl9mYWxsYmFjayA9IGZhbGxiYWNrOworICB0cmVlX3Rlc3RfZGF0YVtpXS5wYXRoID0gcGF0aDsKKworICBpZiAoIV9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyICh0cmVlLCBmYWxsYmFjaywgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyZWVfdGVzdF9kYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoKSA9PQorICAgICAgICAgICAgICAgICZ0cmVlX3Rlc3RfZGF0YVtpXSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb190ZXN0X2Rpc3BhdGNoIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICBUcmVlVGVzdERhdGEgICAqdHJlZV90ZXN0X2RhdGEsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbl90ZXN0X2RhdGEpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBpbnQgajsKKyAgREJ1c0hhbmRsZXJSZXN1bHQgcmVzdWx0OworICBjaGFyICpmbGF0OworCisgIG1lc3NhZ2UgPSBOVUxMOworICAKKyAgZmxhdCA9IGZsYXR0ZW5fcGF0aCAocGF0aCk7CisgIGlmIChmbGF0ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0SW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28iKTsKKyAgZGJ1c19mcmVlIChmbGF0KTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBqID0gMDsKKyAgd2hpbGUgKGogPCBuX3Rlc3RfZGF0YSkKKyAgICB7CisgICAgICB0cmVlX3Rlc3RfZGF0YVtqXS5tZXNzYWdlX2hhbmRsZWQgPSBGQUxTRTsKKyAgICAgICsrajsKKyAgICB9CisKKyAgcmVzdWx0ID0gX2RidXNfb2JqZWN0X3RyZWVfZGlzcGF0Y2hfYW5kX3VubG9jayAodHJlZSwgbWVzc2FnZSk7CisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19hc3NlcnQgKHRyZWVfdGVzdF9kYXRhW2ldLm1lc3NhZ2VfaGFuZGxlZCk7CisKKyAgaiA9IDA7CisgIHdoaWxlIChqIDwgbl90ZXN0X2RhdGEpCisgICAgeworICAgICAgaWYgKHRyZWVfdGVzdF9kYXRhW2pdLm1lc3NhZ2VfaGFuZGxlZCkKKwl7CisJICBpZiAodHJlZV90ZXN0X2RhdGFbal0uaGFuZGxlcl9mYWxsYmFjaykKKwkgICAgX2RidXNfYXNzZXJ0IChwYXRoX2NvbnRhaW5zICh0cmVlX3Rlc3RfZGF0YVtqXS5wYXRoLAorCQkJCQkgcGF0aCkgIT0gU1RSX0RJRkZFUkVOVCk7CisJICBlbHNlCisJICAgIF9kYnVzX2Fzc2VydCAocGF0aF9jb250YWlucyAodHJlZV90ZXN0X2RhdGFbal0ucGF0aCwgcGF0aCkgPT0gU1RSX0VRVUFMKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHRyZWVfdGVzdF9kYXRhW2pdLmhhbmRsZXJfZmFsbGJhY2spCisJICAgIF9kYnVzX2Fzc2VydCAocGF0aF9jb250YWlucyAodHJlZV90ZXN0X2RhdGFbal0ucGF0aCwKKwkJCQkJIHBhdGgpID09IFNUUl9ESUZGRVJFTlQpOworCSAgZWxzZQorCSAgICBfZGJ1c19hc3NlcnQgKHBhdGhfY29udGFpbnMgKHRyZWVfdGVzdF9kYXRhW2pdLnBhdGgsIHBhdGgpICE9IFNUUl9FUVVBTCk7CisJfQorCisgICAgICArK2o7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHNpemVfdAorc3RyaW5nX2FycmF5X2xlbmd0aCAoY29uc3QgY2hhciAqKmFycmF5KQoreworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgYXJyYXlbaV07IGkrKykgOworICByZXR1cm4gaTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqcGF0aDsKKyAgY29uc3QgY2hhciAqcmVzdWx0WzIwXTsKK30gRGVjb21wb3NlUGF0aFRlc3Q7CisKK3N0YXRpYyBEZWNvbXBvc2VQYXRoVGVzdCBkZWNvbXBvc2VfdGVzdHNbXSA9IHsKKyAgeyAiL2ZvbyIsIHsgImZvbyIsIE5VTEwgfSB9LAorICB7ICIvZm9vL2JhciIsIHsgImZvbyIsICJiYXIiLCBOVUxMIH0gfSwKKyAgeyAiLyIsIHsgTlVMTCB9IH0sCisgIHsgIi9hL2IiLCB7ICJhIiwgImIiLCBOVUxMIH0gfSwKKyAgeyAiL2EvYi9jIiwgeyAiYSIsICJiIiwgImMiLCBOVUxMIH0gfSwKKyAgeyAiL2EvYi9jL2QiLCB7ICJhIiwgImIiLCAiYyIsICJkIiwgTlVMTCB9IH0sCisgIHsgIi9mb28vYmFyL3EiLCB7ICJmb28iLCAiYmFyIiwgInEiLCBOVUxMIH0gfSwKKyAgeyAiL2Zvby9iYXIvdGhpcy9pcy9sb25nZXIiLCB7ICJmb28iLCAiYmFyIiwgInRoaXMiLCAiaXMiLCAibG9uZ2VyIiwgTlVMTCB9IH0KK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX2RlY29tcG9zZV90ZXN0cyAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoZGVjb21wb3NlX3Rlc3RzKSkKKyAgICB7CisgICAgICBjaGFyICoqcmVzdWx0OworICAgICAgaW50ICAgIHJlc3VsdF9sZW47CisgICAgICBpbnQgICAgZXhwZWN0ZWRfbGVuOworCisgICAgICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChkZWNvbXBvc2VfdGVzdHNbaV0ucGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoZGVjb21wb3NlX3Rlc3RzW2ldLnBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwgJnJlc3VsdF9sZW4pKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGV4cGVjdGVkX2xlbiA9IHN0cmluZ19hcnJheV9sZW5ndGggKGRlY29tcG9zZV90ZXN0c1tpXS5yZXN1bHQpOworICAgICAgCisgICAgICBpZiAocmVzdWx0X2xlbiAhPSAoaW50KSBzdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKXJlc3VsdCkgfHwKKyAgICAgICAgICBleHBlY3RlZF9sZW4gIT0gcmVzdWx0X2xlbiB8fAorICAgICAgICAgIHBhdGhfY29udGFpbnMgKGRlY29tcG9zZV90ZXN0c1tpXS5yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKikgcmVzdWx0KSAhPSBTVFJfRVFVQUwpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgcmVhbF9sZW4gPSBzdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKXJlc3VsdCk7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGRlY29tcG9zZSBvZiAlcyB0byBoYXZlIGxlbiAlZCwgcmV0dXJuZWQgJWQsIGFwcGVhcnMgdG8gaGF2ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VfdGVzdHNbaV0ucGF0aCwgZXhwZWN0ZWRfbGVuLCByZXN1bHRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIHJlYWxfbGVuKTsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRGVjb21wb3NlIHJlc3VsdGVkIGluIGVsZW1lbnRzOiB7ICIpOworICAgICAgICAgIGkgPSAwOworICAgICAgICAgIHdoaWxlIChpIDwgcmVhbF9sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJcIiVzXCIlcyIsIHJlc3VsdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSA9PSByZWFsX2xlbiA/ICIiIDogIiwgIik7CisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfZGJ1c193YXJuICgifVxuIik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicGF0aCBkZWNvbXBvc2UgZmFpbGVkXG4iKTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChyZXN1bHQpOworCisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorb2JqZWN0X3RyZWVfdGVzdF9pdGVyYXRpb24gKHZvaWQgKmRhdGEpCit7CisgIGNvbnN0IGNoYXIgKnBhdGgwW10gPSB7IE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDFbXSA9IHsgImZvbyIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDJbXSA9IHsgImZvbyIsICJiYXIiLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGgzW10gPSB7ICJmb28iLCAiYmFyIiwgImJheiIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDRbXSA9IHsgImZvbyIsICJiYXIiLCAiYm9vIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoNVtdID0geyAiYmxhaCIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDZbXSA9IHsgImJsYWgiLCAiYm9vZiIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDdbXSA9IHsgImJsYWgiLCAiYm9vZiIsICJ0aGlzIiwgImlzIiwgInJlYWxseSIsICJsb25nIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoOFtdID0geyAiY2hpbGRsZXNzIiwgTlVMTCB9OworICBEQnVzT2JqZWN0VHJlZSAqdHJlZTsKKyAgVHJlZVRlc3REYXRhIHRyZWVfdGVzdF9kYXRhWzldOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgZXhhY3RfbWF0Y2g7CisKKyAgaWYgKCFydW5fZGVjb21wb3NlX3Rlc3RzICgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHRyZWUgPSBOVUxMOworCisgIHRyZWUgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKE5VTEwpOworICBpZiAodHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMiwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNSwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNiwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNywgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoOCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIAorICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMSwgVFJVRSwgMSwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDEsICZleGFjdF9tYXRjaCkgJiYgIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgyLCAmZXhhY3RfbWF0Y2gpICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDQsICZleGFjdF9tYXRjaCkgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg1LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg2LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg3LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg4LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMiwgVFJVRSwgMiwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMywgVFJVRSwgMywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg0LCBUUlVFLCA0LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7ICAKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg1LCBUUlVFLCA1LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDAsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDEsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDIsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDMsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDQsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDUsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDYsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDcsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDgsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg2LCBUUlVFLCA2LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg3LCBUUlVFLCA3LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDgsIFRSVUUsIDgsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgyLCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDMsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg1LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDYsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNywgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg4LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICAKKyAgLyogdGVzdCB0aGUgbGlzdF9yZWdpc3RlcmVkIGZ1bmN0aW9uICovCisKKyAgeworICAgIGNvbnN0IGNoYXIgKnJvb3RbXSA9IHsgTlVMTCB9OworICAgIGNoYXIgKipjaGlsZF9lbnRyaWVzOworICAgIGludCBuYjsKKworICAgIF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwgcGF0aDEsICZjaGlsZF9lbnRyaWVzKTsKKyAgICBpZiAoY2hpbGRfZW50cmllcyAhPSBOVUxMKQorICAgICAgeworCW5iID0gc3RyaW5nX2FycmF5X2xlbmd0aCAoKGNvbnN0IGNoYXIqKiljaGlsZF9lbnRyaWVzKTsKKwlfZGJ1c19hc3NlcnQgKG5iID09IDEpOworCWRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNoaWxkX2VudHJpZXMpOworICAgICAgfQorCisgICAgX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkICh0cmVlLCBwYXRoMiwgJmNoaWxkX2VudHJpZXMpOworICAgIGlmIChjaGlsZF9lbnRyaWVzICE9IE5VTEwpCisgICAgICB7CisJbmIgPSBzdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKWNoaWxkX2VudHJpZXMpOworCV9kYnVzX2Fzc2VydCAobmIgPT0gMik7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRfZW50cmllcyk7CisgICAgICB9CisKKyAgICBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrZWQgKHRyZWUsIHBhdGg4LCAmY2hpbGRfZW50cmllcyk7CisgICAgaWYgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCkKKyAgICAgIHsKKwluYiA9IHN0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopY2hpbGRfZW50cmllcyk7CisJX2RidXNfYXNzZXJ0IChuYiA9PSAwKTsKKwlkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGlsZF9lbnRyaWVzKTsKKyAgICAgIH0KKworICAgIF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwgcm9vdCwgJmNoaWxkX2VudHJpZXMpOworICAgIGlmIChjaGlsZF9lbnRyaWVzICE9IE5VTEwpCisgICAgICB7CisJbmIgPSBzdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKWNoaWxkX2VudHJpZXMpOworCV9kYnVzX2Fzc2VydCAobmIgPT0gMyk7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRfZW50cmllcyk7CisgICAgICB9CisgIH0KKworICAvKiBDaGVjayB0aGF0IGRlc3Ryb3lpbmcgdHJlZSBjYWxscyB1bnJlZ2lzdGVyIGZ1bmNzICovCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVmICh0cmVlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX3VucmVnaXN0ZXJlZCk7CisgICAgICBfZGJ1c19hc3NlcnQgKCF0cmVlX3Rlc3RfZGF0YVtpXS5tZXNzYWdlX2hhbmRsZWQpOworICAgICAgKytpOworICAgIH0KKworICAvKiBOb3cgc3RhcnQgYWdhaW4gYW5kIHRyeSB0aGUgaW5kaXZpZHVhbCB1bnJlZ2lzdGVyIGZ1bmN0aW9uICovCisgIHRyZWUgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKE5VTEwpOworICBpZiAodHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBUUlVFLCAxLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgyLCBUUlVFLCAyLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgzLCBUUlVFLCAzLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg0LCBUUlVFLCA0LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg1LCBUUlVFLCA1LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg2LCBUUlVFLCA2LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg3LCBUUlVFLCA3LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg4LCBUUlVFLCA4LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDApID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDEpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoMikgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDMpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGgzKSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDQpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg0KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisgIAorICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg1KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoNSkgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDYpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg2KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg3KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoNykgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDgpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg4KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAodHJlZV90ZXN0X2RhdGFbaV0uaGFuZGxlcl91bnJlZ2lzdGVyZWQpOworICAgICAgX2RidXNfYXNzZXJ0ICghdHJlZV90ZXN0X2RhdGFbaV0ubWVzc2FnZV9oYW5kbGVkKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogUmVnaXN0ZXIgaXQgYWxsIGFnYWluLCBhbmQgdGVzdCBkaXNwYXRjaCAqLworICAKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDAsIFRSVUUsIDAsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDEsIEZBTFNFLCAxLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgyLCBUUlVFLCAyLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgzLCBUUlVFLCAzLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg0LCBUUlVFLCA0LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg1LCBUUlVFLCA1LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg2LCBGQUxTRSwgNiwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNywgVFJVRSwgNywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoOCwgVFJVRSwgOCwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisjaWYgMAorICBzcGV3X3RyZWUgKHRyZWUpOworI2VuZGlmCisKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoMCwgMCwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDEsIDEsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGgyLCAyLCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoMywgMywgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDQsIDQsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGg1LCA1LCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoNiwgNiwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDcsIDcsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGg4LCA4LCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgCisgb3V0OgorICBpZiAodHJlZSkKKyAgICB7CisgICAgICAvKiB0ZXN0IHJlZiAqLworICAgICAgX2RidXNfb2JqZWN0X3RyZWVfcmVmICh0cmVlKTsKKyAgICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVmICh0cmVlKTsKKyAgICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVmICh0cmVlKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c09iamVjdFRyZWUKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c09iamVjdFRyZWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19vYmplY3RfdHJlZV90ZXN0ICh2b2lkKQoreworICBfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoIm9iamVjdCB0cmVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90cmVlX3Rlc3RfaXRlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtb2JqZWN0LXRyZWUuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmRkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtb2JqZWN0LXRyZWUuaApAQCAtMCwwICsxLDYyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtb2JqZWN0LXRyZWUuaCAgREJ1c09iamVjdFRyZWUgKGludGVybmFscyBvZiBEQnVzQ29ubmVjdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX09CSkVDVF9UUkVFX0gKKyNkZWZpbmUgREJVU19PQkpFQ1RfVFJFRV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNPYmplY3RUcmVlIERCdXNPYmplY3RUcmVlOworCitEQnVzT2JqZWN0VHJlZSogX2RidXNfb2JqZWN0X3RyZWVfbmV3ICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK0RCdXNPYmplY3RUcmVlKiBfZGJ1c19vYmplY3RfdHJlZV9yZWYgICAoREJ1c09iamVjdFRyZWUgKnRyZWUpOwordm9pZCAgICAgICAgICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVmIChEQnVzT2JqZWN0VHJlZSAqdHJlZSk7CisKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyICAgICAgICAgICAgICAgKERCdXNPYmplY3RUcmVlICAgICAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICAgZmFsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKnBhdGgpOworREJ1c0hhbmRsZXJSZXN1bHQgX2RidXNfb2JqZWN0X3RyZWVfZGlzcGF0Y2hfYW5kX3VubG9jayAgICAoREJ1c09iamVjdFRyZWUgICAgICAgICAgICAgICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICptZXNzYWdlKTsKK3ZvaWQqICAgICAgICAgICAgIF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKERCdXNPYmplY3RUcmVlICAgICAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19vYmplY3RfdHJlZV9mcmVlX2FsbF91bmxvY2tlZCAgICAgIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUpOworCisKK2RidXNfYm9vbF90IF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF9hbmRfdW5sb2NrIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICoqcGFyZW50X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICoqKmNoaWxkX2VudHJpZXMpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19kZWNvbXBvc2VfcGF0aCAoY29uc3QgY2hhciAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKioqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKnBhdGhfbGVuKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfT0JKRUNUX1RSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzVlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgKQEAgLTAsMCArMSw2NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIERCdXNQZW5kaW5nQ2FsbCBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19QRU5ESU5HX0NBTExfSU5URVJOQUxfSAorI2RlZmluZSBEQlVTX1BFTkRJTkdfQ0FMTF9JTlRFUk5BTF9ICisKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKworREJVU19CRUdJTl9ERUNMUworCitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOwordm9pZCAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICBpc19hZGRlZCk7CitEQnVzVGltZW91dCAgICAqIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOworZGJ1c191aW50MzJfdCAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgc2VyaWFsKTsKK0RCdXNDb25uZWN0aW9uICogX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX2FuZF9sb2NrICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7CitEQnVzQ29ubmVjdGlvbiAqIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl91bmxvY2tlZCAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZF91bmxvY2tlZCAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfdW5sb2NrZWQgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpOwordm9pZCAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfcXVldWVfdGltZW91dF9lcnJvcl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgc2VyaWFsKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2Vycm9yX3VubG9ja2VkICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgc2VyaWFsKTsKK0RCdXNQZW5kaW5nQ2FsbCogX2RidXNfcGVuZGluZ19jYWxsX25ld191bmxvY2tlZCAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dEhhbmRsZXIgIHRpbWVvdXRfaGFuZGxlcik7CitEQnVzUGVuZGluZ0NhbGwqIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgICAgICAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOwordm9pZCAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWZfYW5kX3VubG9jayAgICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhX3VubG9ja2VkICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgZnJlZV9kYXRhX2Z1bmMpOworCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1BFTkRJTkdfQ0FMTF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkZTY1NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYwpAQCAtMCwwICsxLDgyNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXBlbmRpbmctY2FsbC5jIE9iamVjdCByZXByZXNlbnRpbmcgYSBjYWxsIGluIHByb2dyZXNzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1wZW5kaW5nLWNhbGwuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1BlbmRpbmdDYWxsSW50ZXJuYWxzIERCdXNQZW5kaW5nQ2FsbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c1BlbmRpbmdDYWxsIHByaXZhdGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzUGVuZGluZ0NhbGwgYW5kIGl0cyBtZXRob2RzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNQZW5kaW5nQ2FsbAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgcmVwbHkgbWVzc2FnZSB0aGF0IHdlJ3JlIHdhaXRpbmcgZm9yLgorICovCisKKy8qKgorICogc2hvcnRlciBhbmQgbW9yZSB2aXNpYmxlIHdheSB0byB3cml0ZSBfZGJ1c19jb25uZWN0aW9uX2xvY2soKQorICovCisjZGVmaW5lIENPTk5FQ1RJT05fTE9DSyhjb25uZWN0aW9uKSAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayhjb25uZWN0aW9uKQorLyoqCisgKiBzaG9ydGVyIGFuZCBtb3JlIHZpc2libGUgd2F5IHRvIHdyaXRlIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrKCkKKyAqLworI2RlZmluZSBDT05ORUNUSU9OX1VOTE9DSyhjb25uZWN0aW9uKSBfZGJ1c19jb25uZWN0aW9uX3VubG9jayhjb25uZWN0aW9uKQorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgI0RCdXNQZW5kaW5nQ2FsbCAtIGFsbCBmaWVsZHMgYXJlIHByaXZhdGUuCisgKi8KK3N0cnVjdCBEQnVzUGVuZGluZ0NhbGwKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzRGF0YVNsb3RMaXN0IHNsb3RfbGlzdDsgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgc3RvcmVkIGJ5IGFsbG9jYXRlZCBpbnRlZ2VyIElEICovCisgIAorICBEQnVzUGVuZGluZ0NhbGxOb3RpZnlGdW5jdGlvbiBmdW5jdGlvbjsgICAgICAgICAvKio8IE5vdGlmaWVyIHdoZW4gcmVwbHkgYXJyaXZlcy4gKi8KKworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsgICAgICAgICAgICAgICAgICAgICAvKio8IENvbm5lY3Rpb25zIHdlJ3JlIGFzc29jaWF0ZWQgd2l0aCAqLworICBEQnVzTWVzc2FnZSAqcmVwbHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlcGx5IChhZnRlciB3ZSd2ZSByZWNlaXZlZCBpdCkgKi8KKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0ICovCisKKyAgREJ1c0xpc3QgKnRpbWVvdXRfbGluazsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQcmVhbGxvY2F0ZWQgdGltZW91dCByZXNwb25zZSAqLworICAKKyAgZGJ1c191aW50MzJfdCByZXBseV9zZXJpYWw7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHBlY3RlZCBzZXJpYWwgb2YgcmVwbHkgKi8KKworICB1bnNpZ25lZCBpbnQgY29tcGxldGVkIDogMTsgICAgICAgICAgICAgICAgICAgICAvKio8IFRSVUUgaWYgY29tcGxldGVkICovCisgIHVuc2lnbmVkIGludCB0aW1lb3V0X2FkZGVkIDogMTsgICAgICAgICAgICAgICAgIC8qKjwgSGF2ZSBhZGRlZCB0aGUgdGltZW91dCAqLworfTsKKworc3RhdGljIGRidXNfaW50MzJfdCBub3RpZnlfdXNlcl9kYXRhX3Nsb3QgPSAtMTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHBlbmRpbmcgcmVwbHkgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIGNvbm5lY3Rpb24gd2hlcmUgcmVwbHkgd2lsbCBhcnJpdmUKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBsZW5ndGggb2YgdGltZW91dCwgLTEgZm9yIGRlZmF1bHQsIElOVF9NQVggZm9yIG5vIHRpbWVvdXQKKyAqIEBwYXJhbSB0aW1lb3V0X2hhbmRsZXIgdGltZW91dCBoYW5kbGVyLCB0YWtlcyBwZW5kaW5nIGNhbGwgYXMgZGF0YQorICogQHJldHVybnMgYSBuZXcgI0RCdXNQZW5kaW5nQ2FsbCBvciAjTlVMTCBpZiBubyBtZW1vcnkuCisgKi8KK0RCdXNQZW5kaW5nQ2FsbCoKK19kYnVzX3BlbmRpbmdfY2FsbF9uZXdfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyIHRpbWVvdXRfaGFuZGxlcikKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBEQnVzVGltZW91dCAqdGltZW91dDsKKworICBfZGJ1c19hc3NlcnQgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEpOworIAorICBpZiAodGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEpCisgICAgdGltZW91dF9taWxsaXNlY29uZHMgPSBfREJVU19ERUZBVUxUX1RJTUVPVVRfVkFMVUU7CisKKyAgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZub3RpZnlfdXNlcl9kYXRhX3Nsb3QpKQorICAgIHJldHVybiBOVUxMOworICAKKyAgcGVuZGluZyA9IGRidXNfbmV3MCAoREJ1c1BlbmRpbmdDYWxsLCAxKTsKKyAgCisgIGlmIChwZW5kaW5nID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgKCZub3RpZnlfdXNlcl9kYXRhX3Nsb3QpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyAhPSBfREJVU19JTlRfTUFYKQorICAgIHsKKyAgICAgIHRpbWVvdXQgPSBfZGJ1c190aW1lb3V0X25ldyAodGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZywgTlVMTCk7ICAKKworICAgICAgaWYgKHRpbWVvdXQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX2ZyZWVfZGF0YV9zbG90ICgmbm90aWZ5X3VzZXJfZGF0YV9zbG90KTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHBlbmRpbmcpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmctPnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBlbmRpbmctPnRpbWVvdXQgPSBOVUxMOworICAgIH0KKyAgICAgIAorICBwZW5kaW5nLT5yZWZjb3VudC52YWx1ZSA9IDE7CisgIHBlbmRpbmctPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAocGVuZGluZy0+Y29ubmVjdGlvbik7CisKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoJnBlbmRpbmctPnNsb3RfbGlzdCk7CisgIAorICByZXR1cm4gcGVuZGluZzsKK30KKworLyoqCisgKiBTZXRzIHRoZSByZXBseSBvZiBhIHBlbmRpbmcgY2FsbCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLAorICogb3IgaWYgdGhlIG1lc3NhZ2UgaXMgI05VTEwsIGJ5IHRpbWluZyBvdXQgdGhlIHBlbmRpbmcgY2FsbC4KKyAqIAorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gY29tcGxldGUgdGhlIGNhbGwgd2l0aCwgb3IgI05VTEwKKyAqICB0byB0aW1lIG91dCB0aGUgY2FsbAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3JlcGx5X3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UpCit7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgbWVzc2FnZSA9IHBlbmRpbmctPnRpbWVvdXRfbGluay0+ZGF0YTsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwZW5kaW5nLT50aW1lb3V0X2xpbmspOworICAgIH0KKyAgZWxzZQorICAgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIGhhbmRpbmcgbWVzc2FnZSAlcCAoJXMpIHRvIHBlbmRpbmcgY2FsbCBzZXJpYWwgJXVcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiA/CisgICAgICAgICAgICAgICAgICJtZXRob2QgcmV0dXJuIiA6CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IgPworICAgICAgICAgICAgICAgICAiZXJyb3IiIDogIm90aGVyIHR5cGUiLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworICAKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nLT5yZXBseSA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nLT5yZXBseV9zZXJpYWwgPT0gZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpKTsKKyAgcGVuZGluZy0+cmVwbHkgPSBtZXNzYWdlOworfQorCisvKioKKyAqIENhbGxzIG5vdGlmaWVyIGZ1bmN0aW9uIGZvciB0aGUgcGVuZGluZyBjYWxsCisgKiBhbmQgc2V0cyB0aGUgY2FsbCB0byBjb21wbGV0ZWQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogCisgKi8KK3ZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF9jb21wbGV0ZSAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKCFwZW5kaW5nLT5jb21wbGV0ZWQpOworICAKKyAgcGVuZGluZy0+Y29tcGxldGVkID0gVFJVRTsKKworICBpZiAocGVuZGluZy0+ZnVuY3Rpb24pCisgICAgeworICAgICAgdm9pZCAqdXNlcl9kYXRhOworICAgICAgdXNlcl9kYXRhID0gZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEgKHBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5X3VzZXJfZGF0YV9zbG90KTsKKyAgICAgIAorICAgICAgKCogcGVuZGluZy0+ZnVuY3Rpb24pIChwZW5kaW5nLCB1c2VyX2RhdGEpOworICAgIH0KK30KKworLyoqCisgKiBJZiB0aGUgcGVuZGluZyBjYWxsIGhhc24ndCBiZWVuIHRpbWVkIG91dCwgYWRkIGl0cyB0aW1lb3V0CisgKiBlcnJvciByZXBseSB0byB0aGUgY29ubmVjdGlvbidzIGluY29taW5nIG1lc3NhZ2UgcXVldWUuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdGhlIGNhbGwgd2FzIHNlbnQgdG8KKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gPT0gcGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICBpZiAocGVuZGluZy0+dGltZW91dF9saW5rKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfc3ludGhlc2l6ZWRfbWVzc2FnZV9saW5rIChjb25uZWN0aW9uLAorCQkJCQkJICAgICAgIHBlbmRpbmctPnRpbWVvdXRfbGluayk7CisgICAgICBwZW5kaW5nLT50aW1lb3V0X2xpbmsgPSBOVUxMOworICAgIH0KK30KKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIGEgdGltZW91dCBoYXMgYmVlbiBhZGRlZAorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGlzIGEgdGltZW91dCBvciAjRkFMU0UgaWYgbm90CisgKi8KK2RidXNfYm9vbF90IAorX2RidXNfcGVuZGluZ19jYWxsX2lzX3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKworICByZXR1cm4gcGVuZGluZy0+dGltZW91dF9hZGRlZDsKK30KKworCisvKioKKyAqIFNldHMgd2V0aGVyIHRoZSB0aW1lb3V0IGhhcyBiZWVuIGFkZGVkCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIGlzX2FkZGVkIHdoZXRoZXIgb3Igbm90IGEgdGltZW91dCBpcyBhZGRlZAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX2FkZGVkKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcGVuZGluZy0+dGltZW91dF9hZGRlZCA9IGlzX2FkZGVkOworfQorCisKKy8qKgorICogUmV0cml2ZXMgdGhlIHRpbWVvdXQKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcmV0dXJucyBhIHRpbWVvdXQgb2JqZWN0IG9yIE5VTEwgaWYgY2FsbCBoYXMgbm8gdGltZW91dAorICovCitEQnVzVGltZW91dCAqCitfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKworICByZXR1cm4gcGVuZGluZy0+dGltZW91dDsKK30KKworLyoqCisgKiBHZXRzIHRoZSByZXBseSdzIHNlcmlhbCBudW1iZXIKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcmV0dXJucyBhIHNlcmlhbCBudW1iZXIgZm9yIHRoZSByZXBseSBvciAwIAorICovCitkYnVzX3VpbnQzMl90IAorX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKworICByZXR1cm4gcGVuZGluZy0+cmVwbHlfc2VyaWFsOworfQorCisvKioKKyAqIFNldHMgdGhlIHJlcGx5J3Mgc2VyaWFsIG51bWJlcgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBzZXJpYWwgdGhlIHNlcmlhbCBudW1iZXIgCisgKi8KK3ZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkICAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHNlcmlhbCkKK3sKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9PSAwKTsKKworICBwZW5kaW5nLT5yZXBseV9zZXJpYWwgPSBzZXJpYWw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZW5kaW5nIGNhbGwuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwZW5kaW5nIGNhbGwKKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX2FuZF9sb2NrIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKyAKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgcmV0dXJuIHBlbmRpbmctPmNvbm5lY3Rpb247Cit9CisKKy8qKgorICogR2V0cyB0aGUgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZW5kaW5nIGNhbGwuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwZW5kaW5nIGNhbGwKKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKyAKKyAgcmV0dXJuIHBlbmRpbmctPmNvbm5lY3Rpb247Cit9CisKKy8qKgorICogU2V0cyB0aGUgcmVwbHkgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBlbmRpbmcgY2FsbCB0byBhIHRpbWVvdXQgZXJyb3IKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB3ZSBhcmUgc2VuZGluZyB0aGUgZXJyb3IgcmVwbHkgdG8gCisgKiBAcGFyYW0gc2VyaWFsIHNlcmlhbCBudW1iZXIgZm9yIHRoZSByZXBseQorICogQHJldHVybiAjRkFMU0Ugb24gT09NCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgIHNlcmlhbCkKK3sgCisgIERCdXNMaXN0ICpyZXBseV9saW5rOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLCBEQlVTX0VSUk9SX05PX1JFUExZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgbm90IHJlY2VpdmUgYSByZXBseS4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHJlbW90ZSBhcHBsaWNhdGlvbiBkaWQgbm90IHNlbmQgYSByZXBseSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgbWVzc2FnZSBidXMgc2VjdXJpdHkgcG9saWN5IGJsb2NrZWQgdGhlIHJlcGx5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSByZXBseSB0aW1lb3V0IGV4cGlyZWQsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG5ldHdvcmsgY29ubmVjdGlvbiB3YXMgYnJva2VuLiIpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVwbHlfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAocmVwbHkpOworICBpZiAocmVwbHlfbGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBwZW5kaW5nLT50aW1lb3V0X2xpbmsgPSByZXBseV9saW5rOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nLCBzZXJpYWwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLAorICogd2hpbGUgdGhlIGxvY2sgb24gaXRzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBoZWxkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICovCitEQnVzUGVuZGluZ0NhbGwgKgorX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBwZW5kaW5nLT5yZWZjb3VudC52YWx1ZSArPSAxOworICAKKyAgcmV0dXJuIHBlbmRpbmc7Cit9CisKKworc3RhdGljIHZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF9sYXN0X3VucmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAKKyAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIHNob3VsZCBiZSBhbHJlYWR5IGRldGFjaGVkCisgICAqIGZyb20gdGhlIGNvbm5lY3Rpb24sIG9yIG5ldmVyIGF0dGFjaGVkLgorICAgKi8KKyAgX2RidXNfYXNzZXJ0ICghcGVuZGluZy0+dGltZW91dF9hZGRlZCk7ICAKKworICBjb25uZWN0aW9uID0gcGVuZGluZy0+Y29ubmVjdGlvbjsKKworICAvKiB0aGlzIGFzc3VtZXMgd2UgYXJlbid0IGhvbGRpbmcgY29ubmVjdGlvbiBsb2NrLi4uICovCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2ZyZWUgKCZwZW5kaW5nLT5zbG90X2xpc3QpOworCisgIGlmIChwZW5kaW5nLT50aW1lb3V0ICE9IE5VTEwpCisgICAgX2RidXNfdGltZW91dF91bnJlZiAocGVuZGluZy0+dGltZW91dCk7CisgICAgICAKKyAgaWYgKHBlbmRpbmctPnRpbWVvdXRfbGluaykKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKChEQnVzTWVzc2FnZSAqKXBlbmRpbmctPnRpbWVvdXRfbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAocGVuZGluZy0+dGltZW91dF9saW5rKTsKKyAgICAgIHBlbmRpbmctPnRpbWVvdXRfbGluayA9IE5VTEw7CisgICAgfQorCisgIGlmIChwZW5kaW5nLT5yZXBseSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHBlbmRpbmctPnJlcGx5KTsKKyAgICAgIHBlbmRpbmctPnJlcGx5ID0gTlVMTDsKKyAgICB9CisgICAgICAKKyAgZGJ1c19mcmVlIChwZW5kaW5nKTsKKworICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoJm5vdGlmeV91c2VyX2RhdGFfc2xvdCk7CisKKyAgLyogY29ubmVjdGlvbiBsb2NrIHNob3VsZCBub3QgYmUgaGVsZC4gKi8KKyAgLyogRnJlZSB0aGUgY29ubmVjdGlvbiBsYXN0IHRvIGF2b2lkIGEgd2VpcmQgc3RhdGUgd2hpbGUKKyAgICogY2FsbGluZyBvdXQgdG8gYXBwbGljYXRpb24gY29kZSB3aGVyZSB0aGUgcGVuZGluZyBleGlzdHMKKyAgICogYnV0IG5vdCB0aGUgY29ubmVjdGlvbi4KKyAgICovCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLAorICogZnJlZWluZyBpdCBpZiB0aGUgY291bnQgcmVhY2hlcyAwLiBBc3N1bWVzCisgKiBjb25uZWN0aW9uIGxvY2sgaXMgYWxyZWFkeSBoZWxkLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKi8KK3ZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfYm9vbF90IGxhc3RfdW5yZWY7CisgIAorICBfZGJ1c19hc3NlcnQgKHBlbmRpbmctPnJlZmNvdW50LnZhbHVlID4gMCk7CisKKyAgcGVuZGluZy0+cmVmY291bnQudmFsdWUgLT0gMTsKKyAgbGFzdF91bnJlZiA9IHBlbmRpbmctPnJlZmNvdW50LnZhbHVlID09IDA7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICBpZiAobGFzdF91bnJlZikKKyAgICBfZGJ1c19wZW5kaW5nX2NhbGxfbGFzdF91bnJlZiAocGVuZGluZyk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBlbmRpbmcgY2FsbCBoYXMgcmVjZWl2ZWQgYSByZXBseQorICogeWV0LCBvciBub3QuIEFzc3VtZXMgY29ubmVjdGlvbiBsb2NrIGlzIGhlbGQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHJldHVybnMgI1RSVUUgaWYgYSByZXBseSBoYXMgYmVlbiByZWNlaXZlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZykKK3sKKyAgcmV0dXJuIHBlbmRpbmctPmNvbXBsZXRlZDsKK30KKworc3RhdGljIERCdXNEYXRhU2xvdEFsbG9jYXRvciBzbG90X2FsbG9jYXRvcjsKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAocGVuZGluZ19jYWxsX3Nsb3RzKTsKKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIG9uIGEgI0RCdXNQZW5kaW5nQ2FsbCwgYWxvbmcKKyAqIHdpdGggYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZnJlZWluZworICogdGhlIGRhdGEgd2hlbiB0aGUgZGF0YSBpcyBzZXQgYWdhaW4sIG9yIHdoZW4KKyAqIHRoZSBwZW5kaW5nIGNhbGwgaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIKKyAqIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCgpLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYykKK3sKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jOworICB2b2lkICpvbGRfZGF0YTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSk7CisKKyAgLyogRHJvcCBsb2NrcyB0byBjYWxsIG91dCB0byBhcHAgY29kZSAqLworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgIGlmIChvbGRfZnJlZV9mdW5jKQorICAgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgIH0KKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNQZW5kaW5nQ2FsbCBEQnVzUGVuZGluZ0NhbGwKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgUGVuZGluZyByZXBseSB0byBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UKKyAqCisgKiBBIERCdXNQZW5kaW5nQ2FsbCBpcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuCisgKiBleHBlY3RlZCByZXBseS4gQSAjREJ1c1BlbmRpbmdDYWxsIGNhbiBiZSBjcmVhdGVkCisgKiB3aGVuIHlvdSBzZW5kIGEgbWVzc2FnZSB0aGF0IHNob3VsZCBoYXZlIGEgcmVwbHkuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNQZW5kaW5nQ2FsbAorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSBwZW5kaW5nLgorICovCisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICovCitEQnVzUGVuZGluZ0NhbGwgKgorZGJ1c19wZW5kaW5nX2NhbGxfcmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBOVUxMKTsKKworICAvKiBUaGUgY29ubmVjdGlvbiBsb2NrIGlzIGJldHRlciB0aGFuIHRoZSBnbG9iYWwKKyAgICogbG9jayBpbiB0aGUgYXRvbWljIGluY3JlbWVudCBmYWxsYmFjaworICAgKi8KKyNpZmRlZiBEQlVTX0hBVkVfQVRPTUlDX0lOVAorICBfZGJ1c19hdG9taWNfaW5jICgmcGVuZGluZy0+cmVmY291bnQpOworI2Vsc2UKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nLT5yZWZjb3VudC52YWx1ZSA+IDApOworCisgIHBlbmRpbmctPnJlZmNvdW50LnZhbHVlICs9IDE7CisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIHBlbmRpbmc7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLAorICogZnJlZWluZyBpdCBpZiB0aGUgY291bnQgcmVhY2hlcyAwLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKi8KK3ZvaWQKK2RidXNfcGVuZGluZ19jYWxsX3VucmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfYm9vbF90IGxhc3RfdW5yZWY7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgLyogTW9yZSBlZmZpY2llbnQgdG8gdXNlIHRoZSBjb25uZWN0aW9uIGxvY2sgaW5zdGVhZCBvZiBhdG9taWMKKyAgICogaW50IGZhbGxiYWNrIGlmIHdlIGxhY2sgYXRvbWljIGludCBkZWNyZW1lbnQKKyAgICovCisjaWZkZWYgREJVU19IQVZFX0FUT01JQ19JTlQKKyAgbGFzdF91bnJlZiA9IChfZGJ1c19hdG9taWNfZGVjICgmcGVuZGluZy0+cmVmY291bnQpID09IDEpOworI2Vsc2UKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nLT5yZWZjb3VudC52YWx1ZSA+IDApOworICBwZW5kaW5nLT5yZWZjb3VudC52YWx1ZSAtPSAxOworICBsYXN0X3VucmVmID0gcGVuZGluZy0+cmVmY291bnQudmFsdWUgPT0gMDsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworI2VuZGlmCisgIAorICBpZiAobGFzdF91bnJlZikKKyAgICBfZGJ1c19wZW5kaW5nX2NhbGxfbGFzdF91bnJlZihwZW5kaW5nKTsKK30KKworLyoqCisgKiBTZXRzIGEgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZXBseSBpcworICogcmVjZWl2ZWQgb3IgdGhlIHBlbmRpbmcgY2FsbCB0aW1lcyBvdXQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHBhcmFtIGZ1bmN0aW9uIG5vdGlmaWVyIGZ1bmN0aW9uCisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byBub3RpZmllciBmdW5jdGlvbgorICogQHBhcmFtIGZyZWVfdXNlcl9kYXRhIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIHVzZXIgZGF0YQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsTm90aWZ5RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgICBmcmVlX3VzZXJfZGF0YSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwsIEZBTFNFKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgLyogY291bGQgaW52b2tlIGFwcGxpY2F0aW9uIGNvZGUhICovCisgIGlmICghX2RidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhX3VubG9ja2VkIChwZW5kaW5nLCBub3RpZnlfdXNlcl9kYXRhX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEsIGZyZWVfdXNlcl9kYXRhKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBwZW5kaW5nLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENhbmNlbHMgdGhlIHBlbmRpbmcgY2FsbCwgc3VjaCB0aGF0IGFueSByZXBseSBvciBlcnJvciByZWNlaXZlZAorICogd2lsbCBqdXN0IGJlIGlnbm9yZWQuICBEcm9wcyB0aGUgZGJ1cyBsaWJyYXJ5J3MgaW50ZXJuYWwgcmVmZXJlbmNlCisgKiB0byB0aGUgI0RCdXNQZW5kaW5nQ2FsbCBzbyB3aWxsIGZyZWUgdGhlIGNhbGwgaWYgbm9ib2R5IGVsc2UgaXMKKyAqIGhvbGRpbmcgYSByZWZlcmVuY2UuIEhvd2V2ZXIgeW91IHVzdWFsbHkgZ2V0IGEgcmVmZXJlbmNlIGZyb20KKyAqIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkoKSBzbyBwcm9iYWJseSB5b3VyIGFwcCBvd25zIGEgcmVmCisgKiBhbHNvLgorICoKKyAqIE5vdGUgdGhhdCBjYW5jZWxpbmcgYSBwZW5kaW5nIGNhbGwgd2lsbCA8ZW0+bm90PC9lbT4gc2ltdWxhdGUgYQorICogdGltZWQtb3V0IGNhbGw7IGlmIGEgY2FsbCB0aW1lcyBvdXQsIHRoZW4gYSB0aW1lb3V0IGVycm9yIHJlcGx5IGlzCisgKiByZWNlaXZlZC4gSWYgeW91IGNhbmNlbCB0aGUgY2FsbCwgbm8gcmVwbHkgaXMgcmVjZWl2ZWQgdW5sZXNzIHRoZQorICogdGhlIHJlcGx5IHdhcyBhbHJlYWR5IHJlY2VpdmVkIGJlZm9yZSB5b3UgY2FuY2VsZWQuCisgKiAKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorZGJ1c19wZW5kaW5nX2NhbGxfY2FuY2VsIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3BlbmRpbmdfY2FsbCAocGVuZGluZy0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgcGVuZGluZyBjYWxsIGhhcyByZWNlaXZlZCBhIHJlcGx5CisgKiB5ZXQsIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIHJlcGx5IGhhcyBiZWVuIHJlY2VpdmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfYm9vbF90IGNvbXBsZXRlZDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgY29tcGxldGVkID0gcGVuZGluZy0+Y29tcGxldGVkOworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGNvbXBsZXRlZDsKK30KKworLyoqCisgKiBHZXRzIHRoZSByZXBseSwgb3IgcmV0dXJucyAjTlVMTCBpZiBub25lIGhhcyBiZWVuIHJlY2VpdmVkCisgKiB5ZXQuIE93bmVyc2hpcCBvZiB0aGUgcmVwbHkgbWVzc2FnZSBwYXNzZXMgdG8gdGhlIGNhbGxlci4gVGhpcworICogZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIHBlbmRpbmcgY2FsbCwgc2luY2UgdGhlIHJlcGx5CisgKiBtZXNzYWdlIGlzIHRyYW5mZXJyZWQgdG8gdGhlIGNhbGxlci4KKyAqIAorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHJldHVybnMgdGhlIHJlcGx5IG1lc3NhZ2Ugb3IgI05VTEwuCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZy0+Y29tcGxldGVkLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nLT5yZXBseSAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgbWVzc2FnZSA9IHBlbmRpbmctPnJlcGx5OworICBwZW5kaW5nLT5yZXBseSA9IE5VTEw7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQmxvY2sgdW50aWwgdGhlIHBlbmRpbmcgY2FsbCBpcyBjb21wbGV0ZWQuICBUaGUgYmxvY2tpbmcgaXMgYXMgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKTsgaXQgZG9lcyBub3QgZW50ZXIgdGhlCisgKiBtYWluIGxvb3Agb3IgcHJvY2VzcyBvdGhlciBtZXNzYWdlcywgaXQgc2ltcGx5IHdhaXRzIGZvciB0aGUgcmVwbHkKKyAqIGluIHF1ZXN0aW9uLgorICoKKyAqIElmIHRoZSBwZW5kaW5nIGNhbGwgaXMgYWxyZWFkeSBjb21wbGV0ZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICogaW1tZWRpYXRlbHkuCisgKgorICogQHRvZG8gd2hlbiB5b3Ugc3RhcnQgYmxvY2tpbmcsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LCBidXQgaXQgc2hvdWxkCisgKiByZWFsbHkgb25seSB1c2UgdGltZSByZW1haW5pbmcgc2luY2UgdGhlIHBlbmRpbmcgY2FsbCB3YXMgY3JlYXRlZC4KKyAqIFRoaXMgcmVxdWlyZXMgc3RvcmluZyB0aW1lc3RhbXBzIGluc3RlYWQgb2YgaW50ZXJ2YWxzIGluIHRoZSB0aW1lb3V0CisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICovCit2b2lkCitkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocGVuZGluZyAhPSBOVUxMKTsKKworICBfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCAocGVuZGluZyk7Cit9CisKKy8qKgorICogQWxsb2NhdGVzIGFuIGludGVnZXIgSUQgdG8gYmUgdXNlZCBmb3Igc3RvcmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYworICogZGF0YSBvbiBhbnkgREJ1c1BlbmRpbmdDYWxsLiBUaGUgYWxsb2NhdGVkIElEIG1heSB0aGVuIGJlIHVzZWQKKyAqIHdpdGggZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEoKSBhbmQgZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEoKS4KKyAqIFRoZSBwYXNzZWQtaW4gc2xvdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIC0xLCBhbmQgaXMgZmlsbGVkIGluCisgKiB3aXRoIHRoZSBzbG90IElELiBJZiB0aGUgcGFzc2VkLWluIHNsb3QgaXMgbm90IC0xLCBpdCdzIGFzc3VtZWQKKyAqIHRvIGJlIGFscmVhZHkgYWxsb2NhdGVkLCBhbmQgaXRzIHJlZmNvdW50IGlzIGluY3JlbWVudGVkLgorICogCisgKiBUaGUgYWxsb2NhdGVkIHNsb3QgaXMgZ2xvYmFsLCBpLmUuIGFsbCBEQnVzUGVuZGluZ0NhbGwgb2JqZWN0cyB3aWxsCisgKiBoYXZlIGEgc2xvdCB3aXRoIHRoZSBnaXZlbiBpbnRlZ2VyIElEIHJlc2VydmVkLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBvZiBhIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBzbG90CisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19wZW5kaW5nX2NhbGxfYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgKnNsb3RfcCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzbG90X3AgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX0RCVVNfTE9DS19OQU1FIChwZW5kaW5nX2NhbGxfc2xvdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9wKTsKK30KKworLyoqCisgKiBEZWFsbG9jYXRlcyBhIGdsb2JhbCBJRCBmb3IgI0RCdXNQZW5kaW5nQ2FsbCBkYXRhIHNsb3RzLgorICogZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEoKSBhbmQgZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEoKSBtYXkKKyAqIG5vIGxvbmdlciBiZSB1c2VkIHdpdGggdGhpcyBzbG90LiAgRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24gZXhpc3RpbmcKKyAqIERCdXNQZW5kaW5nQ2FsbCBvYmplY3RzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgI0RCdXNQZW5kaW5nQ2FsbCBpcworICogZmluYWxpemVkLCBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZSByZXBsYWNlZCBpZgorICogc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4gIFdoZW4gdGhlIHJlZmNvdW50IG9uIHRoZQorICogcGFzc2VkLWluIHNsb3QgcmVhY2hlcyAwLCBpdCBpcyBzZXQgdG8gLTEuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIHN0b3JpbmcgdGhlIHNsb3QgdG8gZGVhbGxvY2F0ZQorICovCit2b2lkCitkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChzbG90X3AgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgqc2xvdF9wID49IDApOworCisgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJnNsb3RfYWxsb2NhdG9yLCBzbG90X3ApOworfQorCisvKioKKyAqIFN0b3JlcyBhIHBvaW50ZXIgb24gYSAjREJ1c1BlbmRpbmdDYWxsLCBhbG9uZworICogd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBmcmVlaW5nCisgKiB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldCBhZ2Fpbiwgb3Igd2hlbgorICogdGhlIHBlbmRpbmcgY2FsbCBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlcgorICogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggZGJ1c19wZW5kaW5nX2NhbGxfYWxsb2NhdGVfZGF0YV9zbG90KCkuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgbnVtYmVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byBzdG9yZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jIGZpbmFsaXplciBmdW5jdGlvbiBmb3IgdGhlIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIHdhcyBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBkYXRhCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSAoREJ1c1BlbmRpbmdDYWxsICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2xvdCA+PSAwLCBGQUxTRSk7CisKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJldHZhbCA9IF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YV91bmxvY2tlZCAocGVuZGluZywgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMpOworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0cmlldmVzIGRhdGEgcHJldmlvdXNseSBzZXQgd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBzdGlsbCBiZSBhbGxvY2F0ZWQgKG11c3Qgbm90IGhhdmUgYmVlbiBmcmVlZCkuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEgKERCdXNQZW5kaW5nQ2FsbCAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICBzbG90KQoreworICB2b2lkICpyZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwsIE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKworICByZXR1cm4gcmVzOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworLyoqCisgKiBAaW5ncm91cCBEQnVzUGVuZGluZ0NhbGxJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c1BlbmRpbmdDYWxsLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wZW5kaW5nX2NhbGxfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sgIAorCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY0YjhiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wZW5kaW5nLWNhbGwuaCBPYmplY3QgcmVwcmVzZW50aW5nIGEgY2FsbCBpbiBwcm9ncmVzcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1BFTkRJTkdfQ0FMTF9ICisjZGVmaW5lIERCVVNfUEVORElOR19DQUxMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1BlbmRpbmdDYWxsCisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitEQnVzUGVuZGluZ0NhbGwqIGRidXNfcGVuZGluZ19jYWxsX3JlZiAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbE5vdGlmeUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICAgICBmcmVlX3VzZXJfZGF0YSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX2NhbmNlbCAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgIGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAgICAgKGRidXNfaW50MzJfdCAgICAgKnNsb3RfcCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYyk7CitEQlVTX0VYUE9SVAordm9pZCogICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90KTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1BFTkRJTkdfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGlwZS11bml4LmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGlwZS11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyODA2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1waXBlLXVuaXguYwpAQCAtMCwwICsxLDgzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcGlwZS11bml4LmMgdW5peCByZWxhdGVkIHBpcGUgaW1wbGVtZW50YXRpb24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1waXBlLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qKgorICogd3JpdGUgZGF0YSB0byBhIHBpcGUuCisgKgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUgaW5zdGFuY2UKKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20KKyAqIEBwYXJhbSBzdGFydCB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnVmZmVyIHRvIHdyaXRlCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJ5IHRvIHdyaXRlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19waXBlX3dyaXRlIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IHdyaXR0ZW47CisgIAorICB3cml0dGVuID0gX2RidXNfd3JpdGUgKHBpcGUtPmZkX29yX2hhbmRsZSwgYnVmZmVyLCBzdGFydCwgbGVuKTsKKyAgaWYgKHdyaXR0ZW4gPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIldyaXRpbmcgdG8gcGlwZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICByZXR1cm4gd3JpdHRlbjsKK30KKworLyoqCisgKiBjbG9zZSBhIHBpcGUuCisgKgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUgaW5zdGFuY2UKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGFuIGVycm9yCisgKiBAcmV0dXJucyAtMSBpZiBlcnJvciBpcyBzZXQKKyAqLworaW50CitfZGJ1c19waXBlX2Nsb3NlICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKCFfZGJ1c19jbG9zZSAocGlwZS0+ZmRfb3JfaGFuZGxlLCBlcnJvcikpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAocGlwZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGlwZS13aW4uYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1waXBlLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzQ1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGlwZS13aW4uYwpAQCAtMCwwICsxLDkwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcGlwZS13aW4uYyB3aW5kb3dzIHJlbGF0ZWQgcGlwZSBpbXBsZW1lbnRhdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLyoqCisgKiB3cml0ZSBkYXRhIHRvIGEgcGlwZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BpcGVfd3JpdGUgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEV09SRCB3cml0dGVuOworICBCT09MIHJlczsKKworICBjb25zdCBjaGFyICpidWZmZXJfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoYnVmZmVyKTsKKworICByZXMgPSBXcml0ZUZpbGUgKChIQU5ETEUpIHBpcGUtPmZkX29yX2hhbmRsZSwgYnVmZmVyX2MgKyBzdGFydCwgbGVuLCAmd3JpdHRlbiwgTlVMTCk7CisgIGlmIChyZXMgPT0gMCB8fCB3cml0dGVuIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJXcml0aW5nIHRvIHBpcGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgIH0KKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKKy8qKgorICogY2xvc2UgYSBwaXBlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlIGluc3RhbmNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitpbnQKK19kYnVzX3BpcGVfY2xvc2UgIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoQ2xvc2VIYW5kbGUgKChIQU5ETEUpIHBpcGUtPmZkX29yX2hhbmRsZSkgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICgpLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgcGlwZSAlZDogJXMiLCBwaXBlLT5mZF9vcl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfcGlwZV9pbnZhbGlkYXRlIChwaXBlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1waXBlLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTYwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGlwZS5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1waXBlLmMgcGlwZSBpbXBsZW1lbnRhdGlvbiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworLyoKKyAqIGluaXQgYSBwaXBlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBpbml0IGZyb20gCisgKi8KK3ZvaWQKK19kYnVzX3BpcGVfaW5pdCAoREJ1c1BpcGUgKnBpcGUsCisgICAgICAgICAgICAgICAgIGludHB0cl90ICBmZCkKK3sKKyAgcGlwZS0+ZmRfb3JfaGFuZGxlID0gZmQ7Cit9CisKKy8qKgorICogaW5pdCBhIHBpcGUgd2l0aCBzdGRvdXQKKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZQorICovCit2b2lkCitfZGJ1c19waXBlX2luaXRfc3Rkb3V0IChEQnVzUGlwZSAqcGlwZSkKK3sKKyAgX2RidXNfcGlwZV9pbml0IChwaXBlLCAxKTsKK30KKworLyoqCisgKiBjaGVjayBpZiBhIHBpcGUgaXMgdmFsaWQ7IHBpcGVzIGNhbiBiZSBzZXQgaW52YWxpZCwgc2ltaWxhciB0bworICogYSAtMSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUgaW5zdGFuY2UKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBwaXBlIGlzIG5vdCB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGlwZV9pc192YWxpZChEQnVzUGlwZSAqcGlwZSkKK3sKKyAgcmV0dXJuIHBpcGUtPmZkX29yX2hhbmRsZSA+PSAwOworfQorCisvKioKKyAqIENoZWNrIGlmIGEgcGlwZSBpcyBzdGRvdXQgb3Igc3RkZXJyLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlIGluc3RhbmNlCisgKiBAcmV0dXJucyAjVFJVRSBpZiBwaXBlIGlzIG9uZSBvZiB0aGUgc3RhbmRhcmQgb3V0L2VyciBjaGFubmVscworICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGlwZV9pc19zdGRvdXRfb3Jfc3RkZXJyIChEQnVzUGlwZSAqcGlwZSkKK3sKKyAgcmV0dXJuIHBpcGUtPmZkX29yX2hhbmRsZSA9PSAxIHx8IHBpcGUtPmZkX29yX2hhbmRsZSA9PSAyOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgcGlwZSB0byBhbiBpbnZhbGlkIHZhbHVlLgorICogQHBhcmFtIHBpcGUgdGhlIHBpcGUKKyAqLwordm9pZAorX2RidXNfcGlwZV9pbnZhbGlkYXRlIChEQnVzUGlwZSAqcGlwZSkKK3sKKyAgcGlwZS0+ZmRfb3JfaGFuZGxlID0gLTE7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcGlwZS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmVhYzVmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXBpcGUuaApAQCAtMCwwICsxLDU5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy5oIFdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19QSVBFX0gKKyNkZWZpbmUgREJVU19QSVBFX0gKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitzdHJ1Y3QgREJ1c1BpcGUgeworICBpbnRwdHJfdCBmZF9vcl9oYW5kbGU7Cit9OworCit2b2lkICAgICAgICBfZGJ1c19waXBlX2luaXQgICAgICAgICAgICAgICAgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90ICAgICAgICAgIGZkKTsKK3ZvaWQgICAgICAgIF9kYnVzX3BpcGVfaW5pdF9zdGRvdXQgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSk7CitpbnQgICAgICAgICBfZGJ1c19waXBlX3dyaXRlICAgICAgICAgICAgICAgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworaW50ICAgICAgICAgX2RidXNfcGlwZV9jbG9zZSAgICAgICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19waXBlX2lzX3ZhbGlkICAgICAgICAgICAgKERCdXNQaXBlICAgICAgICAgKnBpcGUpOwordm9pZCAgICAgICAgX2RidXNfcGlwZV9pbnZhbGlkYXRlICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlKTsKK2RidXNfYm9vbF90IF9kYnVzX3BpcGVfaXNfc3Rkb3V0X29yX3N0ZGVyciAoREJ1c1BpcGUgICAgICAgICAqcGlwZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXByb3RvY29sLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWExNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXByb3RvY29sLmgKQEAgLTAsMCArMSw0NzAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wcm90b2NvbC5oICBELUJ1cyBwcm90b2NvbCBjb25zdGFudHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1BST1RPQ09MX0gKKyNkZWZpbmUgREJVU19QUk9UT0NPTF9ICisKKy8qIERvbid0IGluY2x1ZGUgYW55dGhpbmcgaW4gaGVyZSBmcm9tIGFueXdoZXJlIGVsc2UuIEl0J3MKKyAqIGludGVuZGVkIGZvciB1c2UgYnkgYW55IHJhbmRvbSBsaWJyYXJ5LgorICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2lmIDAKK30gLyogYXZvaWRzIGNvbmZ1c2luZyBlbWFjcyBpbmRlbnRhdGlvbiAqLworI2VuZGlmCisjZW5kaWYKKworLyogTm9ybWFsbHkgZG9jcyBhcmUgaW4gLmMgZmlsZXMsIGJ1dCB0aGVyZSBpc24ndCBhIC5jIGZpbGUgZm9yIHRoaXMuICovCisvKioKKyAqIEBkZWZncm91cCBEQnVzUHJvdG9jb2wgUHJvdG9jb2wgY29uc3RhbnRzCisgKiBAaW5ncm91cCAgREJ1cworICoKKyAqIEBicmllZiBEZWZpbmVzIGNvbnN0YW50cyB3aGljaCBhcmUgcGFydCBvZiB0aGUgRC1CdXMgcHJvdG9jb2wKKyAqCisgKiBUaGlzIGhlYWRlciBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFueSBsaWJyYXJ5LCBub3Qgb25seSBsaWJkYnVzLgorICoKKyAqIEB7CisgKi8KKworCisvKiBNZXNzYWdlIGJ5dGUgb3JkZXIgKi8KKyNkZWZpbmUgREJVU19MSVRUTEVfRU5ESUFOICgnbCcpICAvKio8IENvZGUgbWFya2luZyBMU0ItZmlyc3QgYnl0ZSBvcmRlciBpbiB0aGUgd2lyZSBwcm90b2NvbC4gKi8KKyNkZWZpbmUgREJVU19CSUdfRU5ESUFOICAgICgnQicpICAvKio8IENvZGUgbWFya2luZyBNU0ItZmlyc3QgYnl0ZSBvcmRlciBpbiB0aGUgd2lyZSBwcm90b2NvbC4gKi8KKworLyoqIFByb3RvY29sIHZlcnNpb24uICovCisjZGVmaW5lIERCVVNfTUFKT1JfUFJPVE9DT0xfVkVSU0lPTiAxCisKKy8qKiBUeXBlIGNvZGUgdGhhdCBpcyBuZXZlciBlcXVhbCB0byBhIGxlZ2l0aW1hdGUgdHlwZSBjb2RlICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlZBTElEICAgICAgICgoaW50KSAnXDAnKQorLyoqICNEQlVTX1RZUEVfSU5WQUxJRCBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5WQUxJRF9BU19TVFJJTkcgICAgICAgICJcMCIKKworLyogUHJpbWl0aXZlIHR5cGVzICovCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYW4gOC1iaXQgdW5zaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfQllURSAgICAgICAgICAoKGludCkgJ3knKQorLyoqICNEQlVTX1RZUEVfQllURSBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICJ5IgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgYm9vbGVhbiAqLworI2RlZmluZSBEQlVTX1RZUEVfQk9PTEVBTiAgICAgICAoKGludCkgJ2InKQorLyoqICNEQlVTX1RZUEVfQk9PTEVBTiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkcgICAgICAgICJiIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlQxNiAgICAgICAgICgoaW50KSAnbicpCisvKiogI0RCVVNfVFlQRV9JTlQxNiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UMTZfQVNfU1RSSU5HICAgICAgICAgICJuIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQxNiAgICAgICAgKChpbnQpICdxJykKKy8qKiAjREJVU19UWVBFX1VJTlQxNiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfVUlOVDE2X0FTX1NUUklORyAgICAgICAgICJxIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlQzMiAgICAgICAgICgoaW50KSAnaScpCisvKiogI0RCVVNfVFlQRV9JTlQzMiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HICAgICAgICAgICJpIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQzMiAgICAgICAgKChpbnQpICd1JykKKy8qKiAjREJVU19UWVBFX1VJTlQzMiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORyAgICAgICAgICJ1IgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9JTlQ2NCAgICAgICAgICgoaW50KSAneCcpCisvKiogI0RCVVNfVFlQRV9JTlQ2NCBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UNjRfQVNfU1RSSU5HICAgICAgICAgICJ4IgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQ2NCAgICAgICAgKChpbnQpICd0JykKKy8qKiAjREJVU19UWVBFX1VJTlQ2NCBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfVUlOVDY0X0FTX1NUUklORyAgICAgICAgICJ0IgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGFuIDgtYnl0ZSBkb3VibGUgaW4gSUVFRSA3NTQgZm9ybWF0ICovCisjZGVmaW5lIERCVVNfVFlQRV9ET1VCTEUgICAgICAgICgoaW50KSAnZCcpCisvKiogI0RCVVNfVFlQRV9ET1VCTEUgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0RPVUJMRV9BU19TVFJJTkcgICAgICAgICAiZCIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIFVURi04IGVuY29kZWQsIG51bC10ZXJtaW5hdGVkIFVuaWNvZGUgc3RyaW5nICovCisjZGVmaW5lIERCVVNfVFlQRV9TVFJJTkcgICAgICAgICgoaW50KSAncycpCisvKiogI0RCVVNfVFlQRV9TVFJJTkcgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcgICAgICAgICAicyIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIEQtQnVzIG9iamVjdCBwYXRoICovCisjZGVmaW5lIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCAgICgoaW50KSAnbycpCisvKiogI0RCVVNfVFlQRV9PQkpFQ1RfUEFUSCBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEhfQVNfU1RSSU5HICAgICJvIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgRC1CdXMgdHlwZSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgREJVU19UWVBFX1NJR05BVFVSRSAgICAgKChpbnQpICdnJykKKy8qKiAjREJVU19UWVBFX1NJR05BVFVSRSBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfU0lHTkFUVVJFX0FTX1NUUklORyAgICAgICJnIgorLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgdW5peCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VOSVhfRkQgICAgICAoKGludCkgJ2gnKQorLyoqICNEQlVTX1RZUEVfVU5JWF9GRCBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfVU5JWF9GRF9BU19TVFJJTkcgICAgICAgICJoIgorCisvKiBDb21wb3VuZCB0eXBlcyAqLworLyoqIFR5cGUgY29kZSBtYXJraW5nIGEgRC1CdXMgYXJyYXkgdHlwZSAqLworI2RlZmluZSBEQlVTX1RZUEVfQVJSQVkgICAgICAgICAoKGludCkgJ2EnKQorLyoqICNEQlVTX1RZUEVfQVJSQVkgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORyAgICAgICAgICAiYSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIEQtQnVzIHZhcmlhbnQgdHlwZSAqLworI2RlZmluZSBEQlVTX1RZUEVfVkFSSUFOVCAgICAgICAoKGludCkgJ3YnKQorLyoqICNEQlVTX1RZUEVfVkFSSUFOVCBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkcgICAgICAgICJ2IgorCisvKiogU1RSVUNUIGFuZCBESUNUX0VOVFJZIGFyZSBzb3J0IG9mIHNwZWNpYWwgc2luY2UgdGhlaXIgY29kZXMgY2FuJ3QKKyAqIGFwcGVhciBpbiBhIHR5cGUgc3RyaW5nLCBpbnN0ZWFkCisgKiBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSL0RCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSIGhhdmUgdG8gYXBwZWFyCisgKi8KKy8qKiBUeXBlIGNvZGUgdXNlZCB0byByZXByZXNlbnQgYSBzdHJ1Y3Q7IGhvd2V2ZXIsIHRoaXMgdHlwZSBjb2RlIGRvZXMgbm90IGFwcGVhcgorICogaW4gdHlwZSBzaWduYXR1cmVzLCBpbnN0ZWFkICNEQlVTX1NUUlVDVF9CRUdJTl9DSEFSIGFuZCAjREJVU19TVFJVQ1RfRU5EX0NIQVIgd2lsbAorICogYXBwZWFyIGluIGEgc2lnbmF0dXJlLgorICovCisjZGVmaW5lIERCVVNfVFlQRV9TVFJVQ1QgICAgICAgICgoaW50KSAncicpCisvKiogI0RCVVNfVFlQRV9TVFJVQ1QgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1NUUlVDVF9BU19TVFJJTkcgICAgICAgICAiciIKKy8qKiBUeXBlIGNvZGUgdXNlZCB0byByZXByZXNlbnQgYSBkaWN0IGVudHJ5OyBob3dldmVyLCB0aGlzIHR5cGUgY29kZSBkb2VzIG5vdCBhcHBlYXIKKyAqIGluIHR5cGUgc2lnbmF0dXJlcywgaW5zdGVhZCAjREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIgYW5kICNEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIgd2lsbAorICogYXBwZWFyIGluIGEgc2lnbmF0dXJlLgorICovCisjZGVmaW5lIERCVVNfVFlQRV9ESUNUX0VOVFJZICAgICgoaW50KSAnZScpCisvKiogI0RCVVNfVFlQRV9ESUNUX0VOVFJZIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9ESUNUX0VOVFJZX0FTX1NUUklORyAgICAgImUiCisKKy8qKiBEb2VzIG5vdCBpbmNsdWRlICNEQlVTX1RZUEVfSU5WQUxJRCwgI0RCVVNfU1RSVUNUX0JFR0lOX0NIQVIsICNEQlVTX1NUUlVDVF9FTkRfQ0hBUiwKKyAqICNEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiwgb3IgI0RCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUiAtIGkuZS4gaXQgaXMgdGhlIG51bWJlciBvZgorICogdmFsaWQgdHlwZXMsIG5vdCB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGNoYXJhY3RlcnMgdGhhdCBtYXkgYXBwZWFyIGluIGEgdHlwZSBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgREJVU19OVU1CRVJfT0ZfVFlQRVMgICAgKDE2KQorCisvKiBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gdHlwZWNvZGVzIHRoYXQgYXBwZWFyIGluIHR5cGUgc2lnbmF0dXJlcyAqLworCisvKiogQ29kZSBtYXJraW5nIHRoZSBzdGFydCBvZiBhIHN0cnVjdCB0eXBlIGluIGEgdHlwZSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiAgICgoaW50KSAnKCcpCisvKiogI0RCVVNfU1RSVUNUX0JFR0lOX0NIQVIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcgICAiKCIKKy8qKiBDb2RlIG1hcmtpbmcgdGhlIGVuZCBvZiBhIHN0cnVjdCB0eXBlIGluIGEgdHlwZSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgREJVU19TVFJVQ1RfRU5EX0NIQVIgICAgICgoaW50KSAnKScpCisvKiogI0RCVVNfU1RSVUNUX0VORF9DSEFSIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORyAgICAgIikiCisvKiogQ29kZSBtYXJraW5nIHRoZSBzdGFydCBvZiBhIGRpY3QgZW50cnkgdHlwZSBpbiBhIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSICAgKChpbnQpICd7JykKKy8qKiAjREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HICAgInsiCisvKiogQ29kZSBtYXJraW5nIHRoZSBlbmQgb2YgYSBkaWN0IGVudHJ5IHR5cGUgaW4gYSB0eXBlIHNpZ25hdHVyZSAqLworI2RlZmluZSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIgICAgICgoaW50KSAnfScpCisvKiogI0RCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUiBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVJfQVNfU1RSSU5HICAgICAifSIKKworLyoqIE1heCBsZW5ndGggaW4gYnl0ZXMgb2YgYSBidXMgbmFtZSwgaW50ZXJmYWNlLCBvciBtZW1iZXIgKG5vdCBvYmplY3QKKyAqIHBhdGgsIHBhdGhzIGFyZSB1bmxpbWl0ZWQpLiBUaGlzIGlzIGxpbWl0ZWQgYmVjYXVzZSBsb3RzIG9mIHN0dWZmCisgKiBpcyBPKG4pIGluIHRoaXMgbnVtYmVyLCBwbHVzIGl0IHdvdWxkIGJlIG9ibm94aW91cyB0byB0eXBlIGluIGEKKyAqIHBhcmFncmFwaC1sb25nIG1ldGhvZCBuYW1lIHNvIG1vc3QgbGlrZWx5IHNvbWV0aGluZyBsaWtlIHRoYXQgd291bGQKKyAqIGJlIGFuIGV4cGxvaXQuCisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX05BTUVfTEVOR1RIIDI1NQorCisvKiogVGhpcyBvbmUgaXMgMjU1IHNvIGl0IGZpdHMgaW4gYSBieXRlICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9TSUdOQVRVUkVfTEVOR1RIIDI1NQorCisvKiogTWF4IGxlbmd0aCBvZiBhIG1hdGNoIHJ1bGUgc3RyaW5nOyB0byBrZWVwIHBlb3BsZSBmcm9tIGhvc2luZyB0aGUKKyAqIGRhZW1vbiB3aXRoIHNvbWUgaHVnZSBydWxlCisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01BVENIX1JVTEVfTEVOR1RIIDEwMjQKKworLyoqIE1heCBhcmcgbnVtYmVyIHlvdSBjYW4gbWF0Y2ggb24gaW4gYSBtYXRjaCBydWxlLCBlLmcuCisgKiBhcmcwPSdoZWxsbycgaXMgT0ssIGFyZzM0ODk3MjA5ODc9J2hlbGxvJyBpcyBub3QKKyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9BUkdfTlVNQkVSIDYzCisKKy8qKiBNYXggbGVuZ3RoIG9mIGEgbWFyc2hhbGVkIGFycmF5IGluIGJ5dGVzICg2NE0sIDJeMjYpIFdlIHVzZSBzaWduZWQKKyAqIGludCBmb3IgbGVuZ3RocyBzbyBtdXN0IGJlIElOVF9NQVggb3IgbGVzcy4gIFdlIG5lZWQgc29tZXRoaW5nIGEKKyAqIGJpdCBzbWFsbGVyIHRoYW4gSU5UX01BWCBiZWNhdXNlIHRoZSBhcnJheSBpcyBpbnNpZGUgYSBtZXNzYWdlIHdpdGgKKyAqIGhlYWRlciBpbmZvLCBldGMuICBzbyBhbiBJTlRfTUFYIGFycmF5IHdvdWxkbid0IGFsbG93IHRoZSBtZXNzYWdlCisgKiBvdmVyaGVhZC4gIFRoZSA2NE0gbnVtYmVyIGlzIGFuIGF0dGVtcHQgYXQgYSBsYXJnZXIgbnVtYmVyIHRoYW4KKyAqIHdlJ2QgcmVhc29uYWJseSBldmVyIHVzZSwgYnV0IHNtYWxsIGVub3VnaCB0aGF0IHlvdXIgYnVzIHdvdWxkIGNoZXcKKyAqIHRocm91Z2ggaXQgZmFpcmx5IHF1aWNrbHkgd2l0aG91dCBsb2NraW5nIHVwIGZvcmV2ZXIuIElmIHlvdSBoYXZlCisgKiBkYXRhIHRoYXQncyBsaWtlbHkgdG8gYmUgbGFyZ2VyIHRoYW4gdGhpcywgeW91IHNob3VsZCBwcm9iYWJseSBiZQorICogc2VuZGluZyBpdCBpbiBtdWx0aXBsZSBpbmNyZW1lbnRhbCBtZXNzYWdlcyBhbnlob3cuCisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAoNjcxMDg4NjQpCisvKiogTnVtYmVyIG9mIGJpdHMgeW91IG5lZWQgaW4gYW4gdW5zaWduZWQgdG8gc3RvcmUgdGhlIG1heCBhcnJheSBzaXplICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEhfQklUUyAyNgorCisvKiogVGhlIG1heGltdW0gdG90YWwgbWVzc2FnZSBzaXplIGluY2x1ZGluZyBoZWFkZXIgYW5kIGJvZHk7IHNpbWlsYXIKKyAqIHJhdGlvbmFsZSB0byBtYXggYXJyYXkgc2l6ZS4KKyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEggKERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEggKiAyKQorLyoqIE51bWJlciBvZiBiaXRzIHlvdSBuZWVkIGluIGFuIHVuc2lnbmVkIHRvIHN0b3JlIHRoZSBtYXggbWVzc2FnZSBzaXplICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSF9CSVRTIDI3CisKKy8qKiBUaGUgbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgdW5peCBmZHMgaW4gYSBtZXNzYWdlLiBTaW1pbGFyCisgKiByYXRpb25hbGUgYXMgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RILiBIb3dldmVyIHdlIGRpdmlkZSBieSBmb3VyCisgKiBnaXZlbiB0aGF0IG9uZSBmZCBpcyBhbiBpbnQgYW5kIGhlbmNlIGF0IGxlYXN0IDMyIGJpdHMuCisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFMgKERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSC80KQorLyoqIE51bWJlciBvZiBiaXRzIHlvdSBuZWVkIGluIGFuIHVuc2lnbmVkIHRvIHN0b3JlIHRoZSBtYXggbWVzc2FnZSB1bml4IGZkcyAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEU19CSVRTIChEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEhfQklUUy0yKQorCisvKiogRGVwdGggb2YgcmVjdXJzaW9uIGluIHRoZSB0eXBlIHRyZWUuIFRoaXMgaXMgYXV0b21hdGljYWxseSBsaW1pdGVkCisgKiB0byBEQlVTX01BWElNVU1fU0lHTkFUVVJFX0xFTkdUSCBzaW5jZSB5b3UgY291bGQgb25seSBoYXZlIGFuIGFycmF5CisgKiBvZiBhcnJheSBvZiBhcnJheSBvZiAuLi4gdGhhdCBmaXQgaW4gdGhlIG1heCBzaWduYXR1cmUuICBCdXQgdGhhdCdzCisgKiBwcm9iYWJseSBhIGJpdCB0b28gbGFyZ2UuCisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIIDMyCisKKy8qIFR5cGVzIG9mIG1lc3NhZ2UgKi8KKworLyoqIFRoaXMgdmFsdWUgaXMgbmV2ZXIgYSB2YWxpZCBtZXNzYWdlIHR5cGUsIHNlZSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUoKSAqLworI2RlZmluZSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEICAgICAgIDAKKy8qKiBNZXNzYWdlIHR5cGUgb2YgYSBtZXRob2QgY2FsbCBtZXNzYWdlLCBzZWUgZGJ1c19tZXNzYWdlX2dldF90eXBlKCkgKi8KKyNkZWZpbmUgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwgICAxCisvKiogTWVzc2FnZSB0eXBlIG9mIGEgbWV0aG9kIHJldHVybiBtZXNzYWdlLCBzZWUgZGJ1c19tZXNzYWdlX2dldF90eXBlKCkgKi8KKyNkZWZpbmUgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiAyCisvKiogTWVzc2FnZSB0eXBlIG9mIGFuIGVycm9yIHJlcGx5IG1lc3NhZ2UsIHNlZSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUoKSAqLworI2RlZmluZSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiAgICAgICAgIDMKKy8qKiBNZXNzYWdlIHR5cGUgb2YgYSBzaWduYWwgbWVzc2FnZSwgc2VlIGRidXNfbWVzc2FnZV9nZXRfdHlwZSgpICovCisjZGVmaW5lIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCAgICAgICAgNAorCisjZGVmaW5lIERCVVNfTlVNX01FU1NBR0VfVFlQRVMgICAgICAgICAgNQorCisvKiBIZWFkZXIgZmxhZ3MgKi8KKworLyoqIElmIHNldCwgdGhpcyBmbGFnIG1lYW5zIHRoYXQgdGhlIHNlbmRlciBvZiBhIG1lc3NhZ2UgZG9lcyBub3QgY2FyZSBhYm91dCBnZXR0aW5nCisgKiBhIHJlcGx5LCBzbyB0aGUgcmVjaXBpZW50IG5lZWQgbm90IHNlbmQgb25lLiBTZWUgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSgpLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZMQUdfTk9fUkVQTFlfRVhQRUNURUQgMHgxCisvKioKKyAqIElmIHNldCwgdGhpcyBmbGFnIG1lYW5zIHRoYXQgZXZlbiBpZiB0aGUgbWVzc2FnZSBidXMga25vd3MgaG93IHRvIHN0YXJ0IGFuIG93bmVyIGZvcgorICogdGhlIGRlc3RpbmF0aW9uIGJ1cyBuYW1lIChzZWUgZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbigpKSwgaXQgc2hvdWxkIG5vdAorICogZG8gc28uIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGUgYnVzIG1heSBsYXVuY2ggYSBwcm9ncmFtIHRvIHByb2Nlc3MgdGhlCisgKiBtZXNzYWdlLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZMQUdfTk9fQVVUT19TVEFSVCAgICAgMHgyCisKKy8qIEhlYWRlciBmaWVsZHMgKi8KKworLyoqIE5vdCBlcXVhbCB0byBhbnkgdmFsaWQgaGVhZGVyIGZpZWxkIGNvZGUgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfSU5WQUxJRCAgICAgICAgMAorLyoqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgcGF0aCAtIHRoZSBwYXRoIGlzIHRoZSBvYmplY3QgZW1pdHRpbmcgYSBzaWduYWwgb3IgdGhlIG9iamVjdCByZWNlaXZpbmcgYSBtZXRob2QgY2FsbC4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X3BhdGgoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9QQVRIICAgICAgICAgICAxCisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBpbnRlcmZhY2UgY29udGFpbmluZyBhIG1lbWJlciAobWV0aG9kIG9yIHNpZ25hbCkuCisgKiBTZWUgZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UgICAgICAyCisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIGEgbWVtYmVyIChtZXRob2Qgb3Igc2lnbmFsKS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfbWVtYmVyKCkuICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiAgICAgICAgIDMKKy8qKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgYW4gZXJyb3IgbmFtZSAoZm91bmQgaW4gI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SIG1lc3NhZ2VzKS4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FICAgICA0CisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIGEgcmVwbHkgc2VyaWFsLCB1c2VkIHRvIG1hdGNoIGEgI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gbWVzc2FnZSB3aXRoIHRoZQorICogbWVzc2FnZSB0aGF0IGl0J3MgYSByZXBseSB0by4gU2VlIGRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsKCkuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMICAgNQorLyoqCisgKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGJ1cyBuYW1lIG9mIGEgbWVzc2FnZS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24oKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTiAgICA2CisvKioKKyAqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgc2VuZGVyIG9mIGEgbWVzc2FnZTsgdXN1YWxseSBpbml0aWFsaXplZCBieSB0aGUgbWVzc2FnZSBidXMuCisgKiBTZWUgZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIgICAgICAgICA3CisvKioKKyAqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgdHlwZSBzaWduYXR1cmUgb2YgYSBtZXNzYWdlLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSAgICAgIDgKKy8qKgorICogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBudW1iZXIgb2YgdW5peCBmaWxlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhpcyBtZXNzYWdlLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTICAgICAgIDkKKworCisvKioKKyAqIFZhbHVlIG9mIHRoZSBoaWdoZXN0LW51bWJlcmVkIGhlYWRlciBmaWVsZCBjb2RlLCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKKyAqIHRoZSBzaXplIG9mIGFuIGFycmF5IGluZGV4ZWQgYnkgaGVhZGVyIGZpZWxkIGNvZGUuIFJlbWVtYmVyIHRob3VnaAorICogdGhhdCB1bmtub3duIGNvZGVzIG11c3QgYmUgaWdub3JlZCwgc28gY2hlY2sgZm9yIHRoYXQgYmVmb3JlCisgKiBpbmRleGluZyB0aGUgYXJyYXkuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfTEFTVCBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUworCisvKiogSGVhZGVyIGZvcm1hdCBpcyBkZWZpbmVkIGFzIGEgc2lnbmF0dXJlOgorICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgb3JkZXIKKyAqICAgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIHR5cGUgSUQKKyAqICAgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncworICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sIHZlcnNpb24KKyAqICAgdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IGxlbmd0aAorICogICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbAorICogICBhcnJheSBvZiBzdHJ1Y3QgKGJ5dGUsdmFyaWFudCkgIChmaWVsZCBuYW1lLCB2YWx1ZSkKKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgY2FuIGJlIGNvbXB1dGVkIGFzIHRoZQorICogZml4ZWQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBkYXRhLCBwbHVzIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBhcnJheSBhdCB0aGUgZW5kLCBwbHVzIHBhZGRpbmcgdG8gYW4gOC1ib3VuZGFyeS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORyAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORyAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORyAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkcgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcKKworCisvKioKKyAqIFRoZSBzbWFsbGVzdCBoZWFkZXIgc2l6ZSB0aGF0IGNhbiBvY2N1ci4gIChJdCB3b24ndCBiZSB2YWxpZCBkdWUgdG8KKyAqIG1pc3NpbmcgcmVxdWlyZWQgaGVhZGVyIGZpZWxkcy4pIFRoaXMgaXMgNCBieXRlcywgdHdvIHVpbnQzMiwgYW4KKyAqIGFycmF5IGxlbmd0aC4gVGhpcyBpc24ndCBhbnkga2luZCBvZiByZXNvdXJjZSBsaW1pdCwganVzdCB0aGUKKyAqIG5lY2Vzc2FyeS9sb2dpY2FsIG91dGNvbWUgb2YgdGhlIGhlYWRlciBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFIDE2CisKKy8qIEVycm9ycyAqLworLyogV0FSTklORyB0aGVzZSBnZXQgYXV0b2NvbnZlcnRlZCB0byBhbiBlbnVtIGluIGRidXMtZ2xpYi5oLiBUaHVzLAorICogaWYgeW91IGNoYW5nZSB0aGUgb3JkZXIgaXQgYnJlYWtzIHRoZSBBQkkuIEtlZXAgdGhlbSBpbiBvcmRlci4KKyAqIEFsc28sIGRvbid0IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBzaW5jZSB0aGF0IHdpbGwgYnJlYWsgdGhlIHNlZAorICogc2NyaXB0LgorICovCisvKiogQSBnZW5lcmljIGVycm9yOyAic29tZXRoaW5nIHdlbnQgd3JvbmciIC0gc2VlIHRoZSBlcnJvciBtZXNzYWdlIGZvciBtb3JlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5GYWlsZWQiCisvKiogVGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFuIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OT19NRU1PUlkgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTm9NZW1vcnkiCisvKiogVGhlIGJ1cyBkb2Vzbid0IGtub3cgaG93IHRvIGxhdW5jaCBhIHNlcnZpY2UgdG8gc3VwcGx5IHRoZSBidXMgbmFtZSB5b3Ugd2FudGVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTiAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TZXJ2aWNlVW5rbm93biIKKy8qKiBUaGUgYnVzIG5hbWUgeW91IHJlZmVyZW5jZWQgZG9lc24ndCBleGlzdCAoaS5lLiBubyBhcHBsaWNhdGlvbiBvd25zIGl0KS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTmFtZUhhc05vT3duZXIiCisvKiogTm8gcmVwbHkgdG8gYSBtZXNzYWdlIGV4cGVjdGluZyBvbmUsIHVzdWFsbHkgbWVhbnMgYSB0aW1lb3V0IG9jY3VycmVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX1JFUExZICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob1JlcGx5IgorLyoqIFNvbWV0aGluZyB3ZW50IHdyb25nIHJlYWRpbmcgb3Igd3JpdGluZyB0byBhIHNvY2tldCwgZm9yIGV4YW1wbGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU9fRVJST1IgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLklPRXJyb3IiCisvKiogQSBELUJ1cyBidXMgYWRkcmVzcyB3YXMgbWFsZm9ybWVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0JBRF9BRERSRVNTICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5CYWRBZGRyZXNzIgorLyoqIFJlcXVlc3RlZCBvcGVyYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIChsaWtlIEVOT1NZUyBvbiBVTklYKS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTm90U3VwcG9ydGVkIgorLyoqIFNvbWUgbGltaXRlZCByZXNvdXJjZSBpcyBleGhhdXN0ZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVEICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkxpbWl0c0V4Y2VlZGVkIgorLyoqIFNlY3VyaXR5IHJlc3RyaWN0aW9ucyBkb24ndCBhbGxvdyBkb2luZyB3aGF0IHlvdSdyZSB0cnlpbmcgdG8gZG8uICovCisjZGVmaW5lIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFjY2Vzc0RlbmllZCIKKy8qKiBBdXRoZW50aWNhdGlvbiBkaWRuJ3Qgd29yay4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9BVVRIX0ZBSUxFRCAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuQXV0aEZhaWxlZCIKKy8qKiBVbmFibGUgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKHByb2JhYmx5IGNhdXNlZCBieSBFQ09OTlJFRlVTRUQgb24gYSBzb2NrZXQpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX1NFUlZFUiAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob1NlcnZlciIKKy8qKiBDZXJ0YWluIHRpbWVvdXQgZXJyb3JzLCBwb3NzaWJseSBFVElNRURPVVQgb24gYSBzb2NrZXQuCisgKiBOb3RlIHRoYXQgI0RCVVNfRVJST1JfTk9fUkVQTFkgaXMgdXNlZCBmb3IgbWVzc2FnZSByZXBseSB0aW1lb3V0cy4KKyAqIEB3YXJuaW5nIHRoaXMgaXMgY29uZnVzaW5nbHktbmFtZWQgZ2l2ZW4gdGhhdCAjREJVU19FUlJPUl9USU1FRF9PVVQgYWxzbyBleGlzdHMuIFdlIGNhbid0IGZpeAorICogaXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBzbyBqdXN0IGJlIGNhcmVmdWwuCisgKi8KKyNkZWZpbmUgREJVU19FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVGltZW91dCIKKy8qKiBObyBuZXR3b3JrIGFjY2VzcyAocHJvYmFibHkgRU5FVFVOUkVBQ0ggb24gYSBzb2NrZXQpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX05FVFdPUksgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob05ldHdvcmsiCisvKiogQ2FuJ3QgYmluZCBhIHNvY2tldCBzaW5jZSBpdHMgYWRkcmVzcyBpcyBpbiB1c2UgKGkuZS4gRUFERFJJTlVTRSkuICovCisjZGVmaW5lIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0UgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFkZHJlc3NJblVzZSIKKy8qKiBUaGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQgYW5kIHlvdSdyZSB0cnlpbmcgdG8gdXNlIGl0LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5EaXNjb25uZWN0ZWQiCisvKiogSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGEgbWV0aG9kIGNhbGwuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRBcmdzIgorLyoqIE1pc3NpbmcgZmlsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuRmlsZU5vdEZvdW5kIgorLyoqIEV4aXN0aW5nIGZpbGUgYW5kIHRoZSBvcGVyYXRpb24geW91J3JlIHVzaW5nIGRvZXMgbm90IHNpbGVudGx5IG92ZXJ3cml0ZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9GSUxFX0VYSVNUUyAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuRmlsZUV4aXN0cyIKKy8qKiBNZXRob2QgbmFtZSB5b3UgaW52b2tlZCBpc24ndCBrbm93biBieSB0aGUgb2JqZWN0IHlvdSBpbnZva2VkIGl0IG9uLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Vbmtub3duTWV0aG9kIgorLyoqIE9iamVjdCB5b3UgaW52b2tlZCBhIG1ldGhvZCBvbiBpc24ndCBrbm93bi4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTktOT1dOX09CSkVDVCAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5rbm93bk9iamVjdCIKKy8qKiBJbnRlcmZhY2UgeW91IGludm9rZWQgYSBtZXRob2Qgb24gaXNuJ3Qga25vd24gYnkgdGhlIG9iamVjdC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTktOT1dOX0lOVEVSRkFDRSAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5rbm93bkludGVyZmFjZSIKKy8qKiBQcm9wZXJ0eSB5b3UgdHJpZWQgdG8gYWNjZXNzIGlzbid0IGtub3duIGJ5IHRoZSBvYmplY3QuICovCisjZGVmaW5lIERCVVNfRVJST1JfVU5LTk9XTl9QUk9QRVJUWSAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlVua25vd25Qcm9wZXJ0eSIKKy8qKiBQcm9wZXJ0eSB5b3UgdHJpZWQgdG8gc2V0IGlzIHJlYWQtb25seS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9QUk9QRVJUWV9SRUFEX09OTFkgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuUHJvcGVydHlSZWFkT25seSIKKy8qKiBDZXJ0YWluIHRpbWVvdXQgZXJyb3JzLCBlLmcuIHdoaWxlIHN0YXJ0aW5nIGEgc2VydmljZS4KKyAqIEB3YXJuaW5nIHRoaXMgaXMgY29uZnVzaW5nbHktbmFtZWQgZ2l2ZW4gdGhhdCAjREJVU19FUlJPUl9USU1FT1VUIGFsc28gZXhpc3RzLiBXZSBjYW4ndCBmaXgKKyAqIGl0IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgc28ganVzdCBiZSBjYXJlZnVsLgorICovCisjZGVmaW5lIERCVVNfRVJST1JfVElNRURfT1VUICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlRpbWVkT3V0IgorLyoqIFRyaWVkIHRvIHJlbW92ZSBvciBtb2RpZnkgYSBtYXRjaCBydWxlIHRoYXQgZGlkbid0IGV4aXN0LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX01BVENIX1JVTEVfTk9UX0ZPVU5EICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVOb3RGb3VuZCIKKy8qKiBUaGUgbWF0Y2ggcnVsZSBpc24ndCBzeW50YWN0aWNhbGx5IHZhbGlkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVJbnZhbGlkIgorLyoqIFdoaWxlIHN0YXJ0aW5nIGEgbmV3IHByb2Nlc3MsIHRoZSBleGVjKCkgY2FsbCBmYWlsZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkV4ZWNGYWlsZWQiCisvKiogV2hpbGUgc3RhcnRpbmcgYSBuZXcgcHJvY2VzcywgdGhlIGZvcmsoKSBjYWxsIGZhaWxlZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9GT1JLX0ZBSUxFRCAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uRm9ya0ZhaWxlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCB0aGUgY2hpbGQgZXhpdGVkIHdpdGggYSBzdGF0dXMgY29kZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uQ2hpbGRFeGl0ZWQiCisvKiogV2hpbGUgc3RhcnRpbmcgYSBuZXcgcHJvY2VzcywgdGhlIGNoaWxkIGV4aXRlZCBvbiBhIHNpZ25hbC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uQ2hpbGRTaWduYWxlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCBzb21ldGhpbmcgd2VudCB3cm9uZy4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9GQUlMRUQgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uRmFpbGVkIgorLyoqIFdlIGZhaWxlZCB0byBzZXR1cCB0aGUgZW52aXJvbm1lbnQgY29ycmVjdGx5LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5GYWlsZWRUb1NldHVwIgorLyoqIFdlIGZhaWxlZCB0byBzZXR1cCB0aGUgY29uZmlnIHBhcnNlciBjb3JyZWN0bHkuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fQ09ORklHX0lOVkFMSUQgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkNvbmZpZ0ludmFsaWQiCisvKiogQnVzIG5hbWUgd2FzIG5vdCB2YWxpZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX0lOVkFMSUQgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uU2VydmljZU5vdFZhbGlkIgorLyoqIFNlcnZpY2UgZmlsZSBub3QgZm91bmQgaW4gc3lzdGVtLXNlcnZpY2VzIGRpcmVjdG9yeS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uU2VydmljZU5vdEZvdW5kIgorLyoqIFBlcm1pc3Npb25zIGFyZSBpbmNvcnJlY3Qgb24gdGhlIHNldHVpZCBoZWxwZXIuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLlBlcm1pc3Npb25zSW52YWxpZCIKKy8qKiBTZXJ2aWNlIGZpbGUgaW52YWxpZCAoTmFtZSwgVXNlciBvciBFeGVjIG1pc3NpbmcpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5GaWxlSW52YWxpZCIKKy8qKiBUcmllZCB0byBnZXQgYSBVTklYIHByb2Nlc3MgSUQgYW5kIGl0IHdhc24ndCBhdmFpbGFibGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fTk9fTUVNT1JZICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLk5vTWVtb3J5IgorLyoqIFRyaWVkIHRvIGdldCBhIFVOSVggcHJvY2VzcyBJRCBhbmQgaXQgd2Fzbid0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTklYX1BST0NFU1NfSURfVU5LTk9XTiAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5peFByb2Nlc3NJZFVua25vd24iCisvKiogQSB0eXBlIHNpZ25hdHVyZSBpcyBub3QgdmFsaWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9TSUdOQVRVUkUgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRTaWduYXR1cmUiCisvKiogQSBmaWxlIGNvbnRhaW5zIGludmFsaWQgc3ludGF4IG9yIGlzIG90aGVyd2lzZSBicm9rZW4uICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRGaWxlQ29udGVudCIKKy8qKiBBc2tlZCBmb3IgU0VMaW51eCBzZWN1cml0eSBjb250ZXh0IGFuZCBpdCB3YXNuJ3QgYXZhaWxhYmxlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NFTElOVVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TRUxpbnV4U2VjdXJpdHlDb250ZXh0VW5rbm93biIKKy8qKiBBc2tlZCBmb3IgQURUIGF1ZGl0IGRhdGEgYW5kIGl0IHdhc24ndCBhdmFpbGFibGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfQURUX0FVRElUX0RBVEFfVU5LTk9XTiAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFkdEF1ZGl0RGF0YVVua25vd24iCisvKiogVGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IHBhdGguICovCisjZGVmaW5lIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk9iamVjdFBhdGhJblVzZSIKKy8qKiBUaGUgbWVzc2FnZSBtZXRhIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBheWxvYWQuIGUuZy4gZXhwZWN0ZWQKKyAgICBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB3ZXJlIG5vdCBzZW50IG92ZXIgdGhlIHNvY2tldCB0aGlzIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIG9uLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0lOQ09OU0lTVEVOVF9NRVNTQUdFICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5JbmNvbnNpc3RlbnRNZXNzYWdlIgorCisvKiBYTUwgaW50cm9zcGVjdGlvbiBmb3JtYXQgKi8KKworLyoqIFhNTCBuYW1lc3BhY2Ugb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX05BTUVTUEFDRSAgICAgICAgICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cyIKKy8qKiBYTUwgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1BVQkxJQ19JREVOVElGSUVSICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIE9iamVjdCBJbnRyb3NwZWN0aW9uIDEuMC8vRU4iCisvKiogWE1MIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBpbnRyb3NwZWN0aW9uIGZvcm1hdCB2ZXJzaW9uIDEuMCAqLworI2RlZmluZSBEQlVTX0lOVFJPU1BFQ1RfMV8wX1hNTF9TWVNURU1fSURFTlRJRklFUiAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2ludHJvc3BlY3QuZHRkIgorLyoqIFhNTCBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnRyb3NwZWN0aW9uIGZvcm1hdCB2ZXJzaW9uIDEuMCAqLworI2RlZmluZSBEQlVTX0lOVFJPU1BFQ1RfMV8wX1hNTF9ET0NUWVBFX0RFQ0xfTk9ERSAiPCFET0NUWVBFIG5vZGUgUFVCTElDIFwiIkRCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1BVQkxJQ19JREVOVElGSUVSIlwiXG5cIiJEQlVTX0lOVFJPU1BFQ1RfMV8wX1hNTF9TWVNURU1fSURFTlRJRklFUiJcIj5cbiIKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmIDAKK3sgLyogYXZvaWRzIGNvbmZ1c2luZyBlbWFjcyBpbmRlbnRhdGlvbiAqLworI2VuZGlmCit9CisjZW5kaWYKKworI2VuZGlmIC8qIERCVVNfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXJlc291cmNlcy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXJlc291cmNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNzAwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcmVzb3VyY2VzLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1yZXNvdXJjZXMuYyBSZXNvdXJjZSB0cmFja2luZy9saW1pdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1Jlc291cmNlcyBSZXNvdXJjZSBsaW1pdHMgcmVsYXRlZCBjb2RlCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNDb3VudGVyIGFuZCBvdGhlciBzdHVmZiByZWxhdGVkIHRvIHJlc291cmNlIGxpbWl0cworICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byB0cmFja2luZyByZXNvdXJjZSBsaW1pdHMsCisgKiBzdWNoIGFzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkvdW5peCBmZHMgYSBjb25uZWN0aW9uIGNhbiB1c2UKKyAqIGZvciBtZXNzYWdlcywgZXRjLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNSZXNvdXJjZXNJbnRlcm5hbHMgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHJlc291cmNlIGxpbWl0cyBjb2RlLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNDb3VudGVyLgorICogCisgKiBEQnVzQ291bnRlciBpbnRlcm5hbHMuIERCdXNDb3VudGVyIGlzIGFuIG9wYXF1ZSBvYmplY3QsIGl0IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IERCdXNDb3VudGVyCit7CisgIGludCByZWZjb3VudDsgIC8qKjwgcmVmZXJlbmNlIGNvdW50ICovCisKKyAgbG9uZyBzaXplX3ZhbHVlOyAgICAgICAvKio8IGN1cnJlbnQgc2l6ZSBjb3VudGVyIHZhbHVlICovCisgIGxvbmcgdW5peF9mZF92YWx1ZTsgICAgLyoqPCBjdXJyZW50IHVuaXggZmQgY291bnRlciB2YWx1ZSAqLworCisgIGxvbmcgbm90aWZ5X3NpemVfZ3VhcmRfdmFsdWU7ICAgIC8qKjwgY2FsbCBub3RpZnkgZnVuY3Rpb24gd2hlbiBjcm9zc2luZyB0aGlzIHNpemUgdmFsdWUgKi8KKyAgbG9uZyBub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZTsgLyoqPCBjYWxsIG5vdGlmeSBmdW5jdGlvbiB3aGVuIGNyb3NzaW5nIHRoaXMgdW5peCBmZCB2YWx1ZSAqLworCisgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gbm90aWZ5X2Z1bmN0aW9uOyAvKio8IG5vdGlmeSBmdW5jdGlvbiAqLworICB2b2lkICpub3RpZnlfZGF0YTsgLyoqPCBkYXRhIGZvciBub3RpZnkgZnVuY3Rpb24gKi8KK307CisKKy8qKiBAfSAqLyAgLyogZW5kIG9mIHJlc291cmNlIGxpbWl0cyBpbnRlcm5hbHMgZG9jcyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNSZXNvdXJjZXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IERCdXNDb3VudGVyLiBEQnVzQ291bnRlciBpcyB1c2VkCisgKiB0byBjb3VudCB1c2FnZSBvZiBzb21lIHJlc291cmNlIHN1Y2ggYXMgbWVtb3J5LgorICoKKyAqIEByZXR1cm5zIG5ldyBjb3VudGVyIG9yICNOVUxMIG9uIGZhaWx1cmUKKyAqLworREJ1c0NvdW50ZXIqCitfZGJ1c19jb3VudGVyX25ldyAodm9pZCkKK3sKKyAgREJ1c0NvdW50ZXIgKmNvdW50ZXI7CisKKyAgY291bnRlciA9IGRidXNfbmV3IChEQnVzQ291bnRlciwgMSk7CisgIGlmIChjb3VudGVyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBjb3VudGVyLT5yZWZjb3VudCA9IDE7CisgIGNvdW50ZXItPnNpemVfdmFsdWUgPSAwOworICBjb3VudGVyLT51bml4X2ZkX3ZhbHVlID0gMDsKKworICBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSA9IDA7CisgIGNvdW50ZXItPm5vdGlmeV91bml4X2ZkX2d1YXJkX3ZhbHVlID0gMDsKKyAgY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uID0gTlVMTDsKKyAgY291bnRlci0+bm90aWZ5X2RhdGEgPSBOVUxMOworICAKKyAgcmV0dXJuIGNvdW50ZXI7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyByZWZjb3VudCBvZiB0aGUgY291bnRlcgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcmV0dXJucyB0aGUgY291bnRlcgorICovCitEQnVzQ291bnRlciAqCitfZGJ1c19jb3VudGVyX3JlZiAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoY291bnRlci0+cmVmY291bnQgPiAwKTsKKyAgCisgIGNvdW50ZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGNvdW50ZXI7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyByZWZjb3VudCBvZiB0aGUgY291bnRlciBhbmQgcG9zc2libHkKKyAqIGZpbmFsaXplcyB0aGUgY291bnRlci4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICovCit2b2lkCitfZGJ1c19jb3VudGVyX3VucmVmIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChjb3VudGVyLT5yZWZjb3VudCA+IDApOworCisgIGNvdW50ZXItPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGNvdW50ZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGNvdW50ZXIpOworICAgIH0KK30KKworLyoqCisgKiBBZGp1c3RzIHRoZSB2YWx1ZSBvZiB0aGUgc2l6ZSBjb3VudGVyIGJ5IHRoZSBnaXZlbgorICogZGVsdGEgd2hpY2ggbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorICogQ2FsbHMgdGhlIG5vdGlmeSBmdW5jdGlvbiBmcm9tIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSgpCisgKiBpZiB0aGF0IGZ1bmN0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICogQHBhcmFtIGRlbHRhIHZhbHVlIHRvIGFkZCB0byB0aGUgc2l6ZSBjb3VudGVyJ3MgY3VycmVudCB2YWx1ZQorICovCit2b2lkCitfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplIChEQnVzQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSkKK3sKKyAgbG9uZyBvbGQgPSBjb3VudGVyLT5zaXplX3ZhbHVlOworCisgIGNvdW50ZXItPnNpemVfdmFsdWUgKz0gZGVsdGE7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJBZGp1c3RpbmcgY291bnRlciAlbGQgYnkgJWxkID0gJWxkXG4iLAorICAgICAgICAgICAgICAgICBvbGQsIGRlbHRhLCBjb3VudGVyLT5zaXplX3ZhbHVlKTsKKyNlbmRpZgorCisgIGlmIChjb3VudGVyLT5ub3RpZnlfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgKChvbGQgPCBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSAmJgorICAgICAgICBjb3VudGVyLT5zaXplX3ZhbHVlID49IGNvdW50ZXItPm5vdGlmeV9zaXplX2d1YXJkX3ZhbHVlKSB8fAorICAgICAgIChvbGQgPj0gY291bnRlci0+bm90aWZ5X3NpemVfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+c2l6ZV92YWx1ZSA8IGNvdW50ZXItPm5vdGlmeV9zaXplX2d1YXJkX3ZhbHVlKSkpCisgICAgKCogY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uKSAoY291bnRlciwgY291bnRlci0+bm90aWZ5X2RhdGEpOworfQorCisvKioKKyAqIEFkanVzdHMgdGhlIHZhbHVlIG9mIHRoZSB1bml4IGZkIGNvdW50ZXIgYnkgdGhlIGdpdmVuCisgKiBkZWx0YSB3aGljaCBtYXkgYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisgKiBDYWxscyB0aGUgbm90aWZ5IGZ1bmN0aW9uIGZyb20gX2RidXNfY291bnRlcl9zZXRfbm90aWZ5KCkKKyAqIGlmIHRoYXQgZnVuY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkLgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcGFyYW0gZGVsdGEgdmFsdWUgdG8gYWRkIHRvIHRoZSB1bml4IGZkcyBjb3VudGVyJ3MgY3VycmVudCB2YWx1ZQorICovCit2b2lkCitfZGJ1c19jb3VudGVyX2FkanVzdF91bml4X2ZkIChEQnVzQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSkKK3sKKyAgbG9uZyBvbGQgPSBjb3VudGVyLT51bml4X2ZkX3ZhbHVlOworICAKKyAgY291bnRlci0+dW5peF9mZF92YWx1ZSArPSBkZWx0YTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIkFkanVzdGluZyBjb3VudGVyICVsZCBieSAlbGQgPSAlbGRcbiIsCisgICAgICAgICAgICAgICAgIG9sZCwgZGVsdGEsIGNvdW50ZXItPnVuaXhfZmRfdmFsdWUpOworI2VuZGlmCisgIAorICBpZiAoY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwgJiYKKyAgICAgICgob2xkIDwgY291bnRlci0+bm90aWZ5X3VuaXhfZmRfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+dW5peF9mZF92YWx1ZSA+PSBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSkgfHwKKyAgICAgICAob2xkID49IGNvdW50ZXItPm5vdGlmeV91bml4X2ZkX2d1YXJkX3ZhbHVlICYmCisgICAgICAgIGNvdW50ZXItPnVuaXhfZmRfdmFsdWUgPCBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSkpKQorICAgICgqIGNvdW50ZXItPm5vdGlmeV9mdW5jdGlvbikgKGNvdW50ZXIsIGNvdW50ZXItPm5vdGlmeV9kYXRhKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzaXplIGNvdW50ZXIuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEByZXR1cm5zIGl0cyBjdXJyZW50IHNpemUgdmFsdWUKKyAqLworbG9uZworX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIHJldHVybiBjb3VudGVyLT5zaXplX3ZhbHVlOworfQorCisvKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHVuaXggZmQgY291bnRlci4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICogQHJldHVybnMgaXRzIGN1cnJlbnQgdW5peCBmZCB2YWx1ZQorICovCitsb25nCitfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgcmV0dXJuIGNvdW50ZXItPnVuaXhfZmRfdmFsdWU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbm90aWZ5IGZ1bmN0aW9uIGZvciB0aGlzIGNvdW50ZXI7IHRoZSBub3RpZnkgZnVuY3Rpb24gaXMKKyAqIGNhbGxlZCB3aGVuZXZlciB0aGUgY291bnRlcidzIHZhbHVlcyBjcm9zcyB0aGUgZ3VhcmQgdmFsdWVzIGluCisgKiBlaXRoZXIgZGlyZWN0aW9uIChtb3ZpbmcgdXAsIG9yIG1vdmluZyBkb3duKS4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICogQHBhcmFtIHNpemVfZ3VhcmRfdmFsdWUgdGhlIHZhbHVlIHdlJ3JlIG5vdGlmaWVkIGlmIHRoZSBzaXplIGNvdW50ZXIgY3Jvc3NlcworICogQHBhcmFtIHVuaXhfZmRfZ3VhcmRfdmFsdWUgdGhlIHZhbHVlIHdlJ3JlIG5vdGlmaWVkIGlmIHRoZSB1bml4IGZkIGNvdW50ZXIgY3Jvc3NlcworICogQHBhcmFtIGZ1bmN0aW9uIGZ1bmN0aW9uIHRvIGNhbGwgaW4gb3JkZXIgdG8gbm90aWZ5CisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAqLwordm9pZAorX2RidXNfY291bnRlcl9zZXRfbm90aWZ5IChEQnVzQ291bnRlciAgICAgICAgICAgICAgICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICBzaXplX2d1YXJkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICB1bml4X2ZkX2d1YXJkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlck5vdGlmeUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSA9IHNpemVfZ3VhcmRfdmFsdWU7CisgIGNvdW50ZXItPm5vdGlmeV91bml4X2ZkX2d1YXJkX3ZhbHVlID0gdW5peF9mZF9ndWFyZF92YWx1ZTsKKyAgY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIGNvdW50ZXItPm5vdGlmeV9kYXRhID0gdXNlcl9kYXRhOworfQorCisvKiogQH0gKi8gIC8qIGVuZCBvZiByZXNvdXJjZSBsaW1pdHMgZXhwb3J0ZWQgQVBJICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcmVzb3VyY2VzLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtcmVzb3VyY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2M2E5NwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1yZXNvdXJjZXMuaApAQCAtMCwwICsxLDU3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcmVzb3VyY2VzLmggUmVzb3VyY2UgdHJhY2tpbmcvbGltaXRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19SRVNPVVJDRVNfSAorI2RlZmluZSBEQlVTX1JFU09VUkNFU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0NvdW50ZXIgREJ1c0NvdW50ZXI7CisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzQ291bnRlck5vdGlmeUZ1bmN0aW9uKSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICp1c2VyX2RhdGEpOworCitEQnVzQ291bnRlciogX2RidXNfY291bnRlcl9uZXcgICAgICAgKHZvaWQpOworREJ1c0NvdW50ZXIqIF9kYnVzX2NvdW50ZXJfcmVmICAgICAgIChEQnVzQ291bnRlciAqY291bnRlcik7Cit2b2lkICAgICAgICAgX2RidXNfY291bnRlcl91bnJlZiAgICAgKERCdXNDb3VudGVyICpjb3VudGVyKTsKKwordm9pZCAgICAgICAgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3NpemUgICAgICAgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSk7Cit2b2lkICAgICAgICAgX2RidXNfY291bnRlcl9hZGp1c3RfdW5peF9mZCAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgIGRlbHRhKTsKK2xvbmcgICAgICAgICBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlICAgIChEQnVzQ291bnRlciAqY291bnRlcik7Citsb25nICAgICAgICAgX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpOworCit2b2lkIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSAgICAoREJ1c0NvdW50ZXIgICAgICAgICAgICAgICAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICBzaXplX2d1YXJkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfZmRfZ3VhcmRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXJOb3RpZnlGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19SRVNPVVJDRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMThjYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMKQEAgLTAsMCArMSw0MzAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jIEluLXByb2MgZGVidWcgc2VydmVyIGltcGxlbWVudGF0aW9uIAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUgREJ1c1NlcnZlckRlYnVnUGlwZQorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbi1wcm9jZXNzIHBpcGUgZGVidWcgc2VydmVyIHVzZWQgaW4gdW5pdCB0ZXN0cy4KKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1NlcnZlckRlYnVnUGlwZS4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgdW5pdCB0ZXN0aW5nLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGRlYnVnIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NlcnZlckRlYnVnUGlwZSBEQnVzU2VydmVyRGVidWdQaXBlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlckRlYnVnUGlwZS4gQWxsIG1lbWJlcnMKKyAqIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1NlcnZlckRlYnVnUGlwZQoreworICBEQnVzU2VydmVyIGJhc2U7ICAvKio8IFBhcmVudCBjbGFzcyBtZW1iZXJzLiAqLworCisgIGNoYXIgKm5hbWU7IC8qKjwgU2VydmVyIG5hbWUuICovCisKKyAgZGJ1c19ib29sX3QgZGlzY29ubmVjdGVkOyAvKio8IFRSVUUgaWYgZGlzY29ubmVjdCBoYXMgYmVlbiBjYWxsZWQgKi8KK307CisKKy8qIEZJWE1FIG5vdCB0aHJlYWRzYWZlIChyaWdodCBub3cgdGhlIHRlc3Qgc3VpdGUgZG9lc24ndCB1c2UgdGhyZWFkcyBhbnlob3cgKSAqLworc3RhdGljIERCdXNIYXNoVGFibGUgKnNlcnZlcl9waXBlX2hhc2g7CitzdGF0aWMgaW50IHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPSAwOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3BpcGVfaGFzaF9yZWYgKHZvaWQpCit7CisgIGlmICghc2VydmVyX3BpcGVfaGFzaCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPT0gMCk7CisgICAgICAKKyAgICAgIHNlcnZlcl9waXBlX2hhc2ggPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmICghc2VydmVyX3BpcGVfaGFzaCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID0gMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3BpcGVfaGFzaF91bnJlZiAodm9pZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXJfcGlwZV9oYXNoICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPiAwKTsKKworICBzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50IC09IDE7CisgIGlmIChzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID09IDApCisgICAgeworICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoc2VydmVyX3BpcGVfaGFzaCk7CisgICAgICBzZXJ2ZXJfcGlwZV9oYXNoID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z19maW5hbGl6ZSAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBEQnVzU2VydmVyRGVidWdQaXBlICpkZWJ1Z19zZXJ2ZXIgPSAoREJ1c1NlcnZlckRlYnVnUGlwZSopIHNlcnZlcjsKKworICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgIAorICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoc2VydmVyKTsKKworICBkYnVzX2ZyZWUgKGRlYnVnX3NlcnZlci0+bmFtZSk7CisgIGRidXNfZnJlZSAoc2VydmVyKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgKChEQnVzU2VydmVyRGVidWdQaXBlKilzZXJ2ZXIpLT5kaXNjb25uZWN0ZWQgPSBUUlVFOworfQorCitzdGF0aWMgREJ1c1NlcnZlclZUYWJsZSBkZWJ1Z192dGFibGUgPSB7CisgIGRlYnVnX2ZpbmFsaXplLAorICBkZWJ1Z19kaXNjb25uZWN0Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZGVidWcgc2VydmVyIHVzaW5nIGFuIGluLXByb2Nlc3MgcGlwZQorICoKKyAqIEBwYXJhbSBzZXJ2ZXJfbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3IChjb25zdCBjaGFyICAgICAqc2VydmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NlcnZlckRlYnVnUGlwZSAqZGVidWdfc2VydmVyOworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIERCdXNTdHJpbmcgbmFtZV9zdHI7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmICghcGlwZV9oYXNoX3JlZiAoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNlcnZlcl9waXBlX2hhc2gsIHNlcnZlcl9uYW1lKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSwgTlVMTCk7CisgICAgICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBkZWJ1Z19zZXJ2ZXIgPSBkYnVzX25ldzAgKERCdXNTZXJ2ZXJEZWJ1Z1BpcGUsIDEpOworICBpZiAoZGVidWdfc2VydmVyID09IE5VTEwpCisgICAgZ290byBub21lbV8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICBnb3RvIG5vbWVtXzE7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZuYW1lX3N0ciwgc2VydmVyX25hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiZGVidWctcGlwZTpuYW1lPSIpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsICZuYW1lX3N0cikpCisgICAgZ290byBub21lbV8yOworICAKKyAgZGVidWdfc2VydmVyLT5uYW1lID0gX2RidXNfc3RyZHVwIChzZXJ2ZXJfbmFtZSk7CisgIGlmIChkZWJ1Z19zZXJ2ZXItPm5hbWUgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtXzI7CisgIAorICBpZiAoIV9kYnVzX3NlcnZlcl9pbml0X2Jhc2UgKCZkZWJ1Z19zZXJ2ZXItPmJhc2UsCisJCQkgICAgICAgJmRlYnVnX3Z0YWJsZSwgJmFkZHJlc3MpKQorICAgIGdvdG8gbm9tZW1fMzsKKworICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoc2VydmVyX3BpcGVfaGFzaCwKKwkJCQkgICAgICAgZGVidWdfc2VydmVyLT5uYW1lLAorCQkJCSAgICAgICBkZWJ1Z19zZXJ2ZXIpKQorICAgIGdvdG8gbm9tZW1fNDsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgIC8qIHNlcnZlciBrZWVwcyB0aGUgcGlwZSBoYXNoIHJlZiAqLworICAKKyAgcmV0dXJuIChEQnVzU2VydmVyICopZGVidWdfc2VydmVyOworCisgbm9tZW1fNDoKKyAgX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UgKCZkZWJ1Z19zZXJ2ZXItPmJhc2UpOworIG5vbWVtXzM6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyLT5uYW1lKTsKKyBub21lbV8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworIG5vbWVtXzE6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyKTsKKyBub21lbV8wOgorICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIHRoZSBjbGllbnQtc2lkZSB0cmFuc3BvcnQgZm9yCisgKiBhIGRlYnVnLXBpcGUgY29ubmVjdGlvbiBjb25uZWN0ZWQgdG8gdGhlCisgKiBnaXZlbiBkZWJ1Zy1waXBlIHNlcnZlciBuYW1lLgorICogCisgKiBAcGFyYW0gc2VydmVyX25hbWUgbmFtZSBvZiBzZXJ2ZXIgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgI05VTEwgb24gbm8gbWVtb3J5IG9yIHRyYW5zcG9ydAorICovCitEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3IChjb25zdCBjaGFyICAgICAqc2VydmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqY2xpZW50X3RyYW5zcG9ydDsKKyAgREJ1c1RyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGludCBjbGllbnRfZmQsIHNlcnZlcl9mZDsKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoc2VydmVyX3BpcGVfaGFzaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19TRVJWRVIsIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgc2VydmVyID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzZXJ2ZXJfcGlwZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lKTsKKyAgaWYgKHNlcnZlciA9PSBOVUxMIHx8CisgICAgICAoKERCdXNTZXJ2ZXJEZWJ1Z1BpcGUqKXNlcnZlciktPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fU0VSVkVSLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgImRlYnVnLXBpcGU6bmFtZT0iKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBzZXJ2ZXJfbmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19mdWxsX2R1cGxleF9waXBlICgmY2xpZW50X2ZkLCAmc2VydmVyX2ZkLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbGVkIHRvIGNyZWF0ZSBmdWxsIGR1cGxleCBwaXBlXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDb3VsZCBub3QgY3JlYXRlIGZ1bGwtZHVwbGV4IHBpcGUiKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY2xpZW50X3RyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmYWRkcmVzcyk7CisgIGlmIChjbGllbnRfdHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChjbGllbnRfZmQsIE5VTEwpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzZXJ2ZXJfZmQsIE5VTEwpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIAorICBjbGllbnRfZmQgPSAtMTsKKworICBzZXJ2ZXJfdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChzZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXItPmd1aWRfaGV4LCBOVUxMKTsKKyAgaWYgKHNlcnZlcl90cmFuc3BvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzZXJ2ZXJfZmQsIE5VTEwpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc2VydmVyX2ZkID0gLTE7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAoc2VydmVyX3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKikgc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBjb25uZWN0aW9uID0gX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAoc2VydmVyX3RyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisgIHNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICAKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogU2VlIGlmIHNvbWVvbmUgd2FudHMgdG8gaGFuZGxlIHRoaXMgbmV3IGNvbm5lY3Rpb24sCisgICAqIHNlbGYtcmVmZXJlbmNpbmcgZm9yIHBhcmFub2lhCisgICAqLworICBpZiAoc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mdW5jdGlvbikKKyAgICB7CisgICAgICBkYnVzX3NlcnZlcl9yZWYgKHNlcnZlcik7CisgICAgICAoKiBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKSAoc2VydmVyLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZGF0YSk7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoc2VydmVyKTsKKyAgICB9CisgIAorICAvKiBJZiBubyBvbmUgZ3JhYmJlZCBhIHJlZmVyZW5jZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBkaWUsCisgICAqIGFuZCB0aGUgY2xpZW50IHRyYW5zcG9ydCB3aWxsIGdldCBhbiBpbW1lZGlhdGUgZGlzY29ubmVjdAorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKGNvbm5lY3Rpb24pOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBjbGllbnRfdHJhbnNwb3J0OworfQorCisvKioKKyAqIFRyaWVzIHRvIGludGVycHJldCB0aGUgYWRkcmVzcyBlbnRyeSBhcyBhIGRlYnVnIHBpcGUgZW50cnkuCisgKiAKKyAqIFNldHMgZXJyb3IgaWYgdGhlIHJlc3VsdCBpcyBub3QgT0suCisgKiAKKyAqIEBwYXJhbSBlbnRyeSBhbiBhZGRyZXNzIGVudHJ5CisgKiBAcGFyYW0gc2VydmVyX3AgbG9jYXRpb24gdG8gc3RvcmUgYSBuZXcgREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByYXRpb25hbGUgZm9yIGZhaWx1cmUgb24gYmFkIGFkZHJlc3MKKyAqIEByZXR1cm5zIHRoZSBvdXRjb21lCisgKiAKKyAqLworREJ1c1NlcnZlckxpc3RlblJlc3VsdAorX2RidXNfc2VydmVyX2xpc3Rlbl9kZWJ1Z19waXBlIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisKKyAgKnNlcnZlcl9wID0gTlVMTDsKKyAgCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIAorICBpZiAoc3RyY21wIChtZXRob2QsICJkZWJ1Zy1waXBlIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJuYW1lIik7CisgICAgICAKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MoZXJyb3IsICJkZWJ1Zy1waXBlIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9kZWJ1Z19waXBlX25ldyAobmFtZSwgZXJyb3IpOworICAgICAgCisgICAgICBpZiAoKnNlcnZlcl9wKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX09LOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworLyoqCisgKiBPcGVucyBhIGRlYnVnIHBpcGUgdHJhbnNwb3J0LCB1c2VkIGluIHRoZSB0ZXN0IHN1aXRlLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkgdG8gdHJ5IG9wZW5pbmcgYXMgZGVidWctcGlwZQorICogQHBhcmFtIHRyYW5zcG9ydF9wIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG9wZW5lZCB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBiZSBzZXQKKyAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgYXR0ZW1wdAorICovCitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisgIAorICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworICBfZGJ1c19hc3NlcnQgKG1ldGhvZCAhPSBOVUxMKTsKKworICBpZiAoc3RyY21wIChtZXRob2QsICJkZWJ1Zy1waXBlIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJuYW1lIik7CisKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAiZGVidWctcGlwZSIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisgICAgICAgICAgCisgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfZGVidWdfcGlwZV9uZXcgKG5hbWUsIGVycm9yKTsKKworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0gICAgICAKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworCisvKiogQH0gKi8KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc0MzExCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgKQEAgLTAsMCArMSw0NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmggSW4tcHJvYyBkZWJ1ZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX0RFQlVHX1BJUEVfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9ERUJVR19QSVBFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c1NlcnZlciogICAgICAgICAgICAgX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3ICAgICAoY29uc3QgY2hhciAgICAgICAgKnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAgKGNvbnN0IGNoYXIgICAgICAgICpzZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitEQnVzU2VydmVyTGlzdGVuUmVzdWx0ICBfZGJ1c19zZXJ2ZXJfbGlzdGVuX2RlYnVnX3BpcGUgIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfREVCVUdfUElQRV9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDY3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jIFNlcnZlciBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIGxhdW5jaGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFRhbm5lciBMb3ZlbGFjZSA8bG92ZWxhY2VAd2F5ZmFyZXIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgQmVuamFtaW4gUmVlZCA8cmFuZ2Vycmlja0BiZWZ1bmsuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBKb25hcyBCw6RociA8am9uYXMuYmFlaHJAd2ViLmRlPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNlcnZlci1sYXVuY2hkLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJMYXVuY2hkIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBMYXVuY2hkCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciB3aXRoIExhdW5jaGQgc3VwcG9ydAorICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyNpbmNsdWRlIDxsYXVuY2guaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItc29ja2V0LmgiCisKKy8qIHB1dCBvdGhlciBwcml2YXRlIGxhdW5jaGQgZnVuY3Rpb25zIGhlcmUgKi8KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0xBVU5DSEQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgZnJvbSBsYXVuY2hkLgorICoKKyAqIGxhdW5jaGQgaGFzIGFsbG9jYWVkIGEgc29ja2V0IGZvciB1cy4gV2Ugbm93IHF1ZXJ5IGxhdW5jaGQgZm9yIHRoZQorICogZmlsZSBkZXNjcmlwdG9yIG9mIHRoaXMgc29ja2V0IGFuZCBjcmVhdGUgYSBzZXJ2ZXIgb24gaXQuCisgKiBJbiBhZGRpdGlvbiB3ZSBpbmhlcml0IGxhdW5jaGQncyBlbnZpcm9ubWVudCB3aGljaCBob2xkcyBhIHZhcmlhYmxlCisgKiBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBzb2NrZXQuIFRoaXMgaXMgdXNlZCB0byBpbml0IHRoZSBzZXJ2ZXIncworICogYWRkcmVzcyB3aGljaCBpcyBwYXNzZWQgdG8gYXV0b2xhdW5jaGVkIHNlcnZpY2VzLgorICoKKyAqIEBwYXJhbSBsYXVuY2hkX2Vudl92YXIgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHdoaWNoIGhvbGRzIHRoZSB1bml4IHBhdGggdG8gdGhlIHNvY2tldAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIHRoZSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCisKK0RCdXNTZXJ2ZXIgKgorX2RidXNfc2VydmVyX25ld19mb3JfbGF1bmNoZCAoY29uc3QgY2hhciAqbGF1bmNoZF9lbnZfdmFyLCBEQnVzRXJyb3IgKiBlcnJvcikKKyAgeworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgICAgREJ1c1N0cmluZyBhZGRyZXNzOworICAgIGludCBsYXVuY2hkX2ZkOworICAgIGxhdW5jaF9kYXRhX3Qgc29ja2V0c19kaWN0LCBjaGVja2luX3Jlc3BvbnNlOworICAgIGxhdW5jaF9kYXRhX3QgY2hlY2tpbl9yZXF1ZXN0OworICAgIGxhdW5jaF9kYXRhX3QgbGlzdGVuaW5nX2ZkX2FycmF5LCBsaXN0ZW5pbmdfZmQ7CisgICAgbGF1bmNoX2RhdGFfdCBlbnZpcm9ubWVudF9kaWN0LCBlbnZpcm9ubWVudF9wYXJhbTsKKyAgICBjb25zdCBjaGFyICpsYXVuY2hkX3NvY2tldF9wYXRoLCAqZGlzcGxheTsKKworICAgIGxhdW5jaGRfc29ja2V0X3BhdGggPSBfZGJ1c19nZXRlbnYgKGxhdW5jaGRfZW52X3Zhcik7CisgICAgZGlzcGxheSA9IF9kYnVzX2dldGVudiAoIkRJU1BMQVkiKTsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgaWYgKGxhdW5jaGRfc29ja2V0X3BhdGggPT0gTlVMTCB8fCAqbGF1bmNoZF9zb2NrZXRfcGF0aCA9PSAnXDAnKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAibGF1bmNoZCdzIGVudmlyb25tZW50IHZhcmlhYmxlICVzIGlzIGVtcHR5LCBidXQgc2hvdWxkIGNvbnRhaW4gYSBzb2NrZXQgcGF0aC5cbiIsIGxhdW5jaGRfZW52X3Zhcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgInVuaXg6cGF0aD0iKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBsYXVuY2hkX3NvY2tldF9wYXRoKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGlmICgoY2hlY2tpbl9yZXF1ZXN0ID0gbGF1bmNoX2RhdGFfbmV3X3N0cmluZyAoTEFVTkNIX0tFWV9DSEVDS0lOKSkgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXVuY2hfZGF0YV9uZXdfc3RyaW5nKFwiJXNcIikgVW5hYmxlIHRvIGNyZWF0ZSBzdHJpbmcuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTEFVTkNIX0tFWV9DSEVDS0lOKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgaWYgKChjaGVja2luX3Jlc3BvbnNlID0gbGF1bmNoX21zZyAoY2hlY2tpbl9yZXF1ZXN0KSkgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgImxhdW5jaF9tc2coXCIlc1wiKSBJUEMgZmFpbHVyZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBMQVVOQ0hfS0VZX0NIRUNLSU4sIHN0cmVycm9yIChlcnJubykpOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBpZiAoTEFVTkNIX0RBVEFfRVJSTk8gPT0gbGF1bmNoX2RhdGFfZ2V0X3R5cGUgKGNoZWNraW5fcmVzcG9uc2UpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELCAiQ2hlY2staW4gZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChsYXVuY2hfZGF0YV9nZXRfZXJybm8gKGNoZWNraW5fcmVzcG9uc2UpKSk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIHNvY2tldHNfZGljdCA9CisgICAgICBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoY2hlY2tpbl9yZXNwb25zZSwgTEFVTkNIX0pPQktFWV9TT0NLRVRTKTsKKyAgICBpZiAoTlVMTCA9PSBzb2NrZXRzX2RpY3QpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBzb2NrZXRzIGZvdW5kIHRvIGFuc3dlciByZXF1ZXN0cyBvbiFcbiIpOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBsaXN0ZW5pbmdfZmRfYXJyYXkgPQorICAgICAgbGF1bmNoX2RhdGFfZGljdF9sb29rdXAgKHNvY2tldHNfZGljdCwgInVuaXhfZG9tYWluX2xpc3RlbmVyIik7CisgICAgaWYgKE5VTEwgPT0gbGlzdGVuaW5nX2ZkX2FycmF5KQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8ga25vd24gc29ja2V0cyBmb3VuZCB0byBhbnN3ZXIgcmVxdWVzdHMgb24hXG4iKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgaWYgKGxhdW5jaF9kYXRhX2FycmF5X2dldF9jb3VudCAobGlzdGVuaW5nX2ZkX2FycmF5KSAhPSAxKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIDEgc29ja2V0IGZyb20gbGF1bmNoZCwgZ290ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaF9kYXRhX2FycmF5X2dldF9jb3VudCAobGlzdGVuaW5nX2ZkX2FycmF5KSk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGxpc3RlbmluZ19mZCA9IGxhdW5jaF9kYXRhX2FycmF5X2dldF9pbmRleCAobGlzdGVuaW5nX2ZkX2FycmF5LCAwKTsKKyAgICBsYXVuY2hkX2ZkID0gbGF1bmNoX2RhdGFfZ2V0X2ZkIChsaXN0ZW5pbmdfZmQpOworCisgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGxhdW5jaGRfZmQpOworCisgICAgaWYgKGxhdW5jaGRfZmQgPCAwKQorICAgICAgeworICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgaWYgKGRpc3BsYXkgPT0gTlVMTCB8fCAqZGlzcGxheSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGVudmlyb25tZW50X2RpY3QgPSBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoY2hlY2tpbl9yZXNwb25zZSwgTEFVTkNIX0pPQktFWV9VU0VSRU5WSVJPTk1FTlRWQVJJQUJMRVMpOworICAgICAgaWYgKE5VTEwgPT0gZW52aXJvbm1lbnRfZGljdCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmV0cmlldmUgdXNlciBlbnZpcm9ubWVudCBmcm9tIGxhdW5jaGQuIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGVudmlyb25tZW50X3BhcmFtID0gbGF1bmNoX2RhdGFfZGljdF9sb29rdXAgKGVudmlyb25tZW50X2RpY3QsICJESVNQTEFZIik7CisgICAgICAgICAgaWYgKE5VTEwgPT0gZW52aXJvbm1lbnRfcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmV0cmlldmUgRElTUExBWSBmcm9tIGxhdW5jaGQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkaXNwbGF5ID0gbGF1bmNoX2RhdGFfZ2V0X3N0cmluZyhlbnZpcm9ubWVudF9wYXJhbSk7CisgICAgICAgICAgICAgIF9kYnVzX3NldGVudiAoIkRJU1BMQVkiLCBkaXNwbGF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICAgfQorCisgICAgc2VydmVyID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0ICgmbGF1bmNoZF9mZCwgMSwgJmFkZHJlc3MsIDApOworICAgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbGlzdGVuIG9uIGxhdW5jaGQgZmQgJWQuIiwgbGF1bmNoZF9mZCk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgICByZXR1cm4gc2VydmVyOworCisgIGxfZmFpbGVkXzA6CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKworICAgIHJldHVybiBOVUxMOworI2Vsc2UgLyogREJVU19FTkFCTEVfTEFVTkNIRCAqLworICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgImFkZHJlc3MgdHlwZSAnbGF1bmNoZCcgcmVxdWVzdGVkLCBidXQgbGF1bmNoZCBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiIpOworICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIH0KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zZXJ2ZXItbGF1bmNoZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWI5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuaApAQCAtMCwwICsxLDM2IEBACisvKiBkYnVzLXNlcnZlci1sYXVuY2hkLmggU2VydmVyIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggbGF1bmNoZC4KKyogQ29weXJpZ2h0IChDKSAyMDA4LCBCZW5qYW1pbiBSZWVkIDxyYW5nZXJyaWNrQGJlZnVuay5jb20+CisqCisqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisqIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKgorKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoKKyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2lmbmRlZiBEQlVTX1NFUlZFUl9MQVVOQ0hEX0gKKyNkZWZpbmUgREJVU19TRVJWRVJfTEFVTkNIRF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzU2VydmVyICogX2RidXNfc2VydmVyX25ld19mb3JfbGF1bmNoZCAoY29uc3QgY2hhciAqbGF1bmNoZF9lbnZfdmFyLCBEQnVzRXJyb3IgKiBlcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisjZW5kaWYgLyogREJVU19TRVJWRVJfTEFVTkNIRF9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk3NmUzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaApAQCAtMCwwICsxLDE2MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1wcm90ZWN0ZWQuaCBVc2VkIGJ5IHN1YmNsYXNzZXMgb2YgREJ1c1NlcnZlciBvYmplY3QgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1BST1RFQ1RFRF9ICisjZGVmaW5lIERCVVNfU0VSVkVSX1BST1RFQ1RFRF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRocmVhZHMtaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFkZHJlc3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGltZW91dC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy13YXRjaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1yZXNvdXJjZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZGF0YXNsb3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NlcnZlclZUYWJsZSBEQnVzU2VydmVyVlRhYmxlOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHNlcnZlciAic3ViY2xhc3NlcyIKKyAqLworc3RydWN0IERCdXNTZXJ2ZXJWVGFibGUKK3sKKyAgdm9pZCAgICAgICAgKCogZmluYWxpemUpICAgICAgKERCdXNTZXJ2ZXIgKnNlcnZlcik7CisgIC8qKjwgVGhlIGZpbmFsaXplIG1ldGhvZCBtdXN0IGZyZWUgdGhlIHNlcnZlci4gKi8KKyAgCisgIHZvaWQgICAgICAgICgqIGRpc2Nvbm5lY3QpICAgIChEQnVzU2VydmVyICpzZXJ2ZXIpOworICAvKio8IERpc2Nvbm5lY3QgdGhpcyBzZXJ2ZXIuICovCit9OworCisvKioKKyAqIEBpbmdyb3VwIERCdXNTZXJ2ZXJJbnRlcm5hbHMKKyAqIEludGVybmFscyBvZiBEQnVzU2VydmVyIG9iamVjdAorICovCitzdHJ1Y3QgREJ1c1NlcnZlcgoreworICBEQnVzQXRvbWljIHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50LiAqLworICBjb25zdCBEQnVzU2VydmVyVlRhYmxlICp2dGFibGU7ICAgICAgICAgICAgIC8qKjwgVmlydHVhbCBtZXRob2RzIGZvciB0aGlzIGluc3RhbmNlLiAqLworICBEQnVzTXV0ZXggKm11dGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9jayBvbiB0aGUgc2VydmVyIG9iamVjdCAqLworCisgIERCdXNHVUlEIGd1aWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHbG9iYWxseSB1bmlxdWUgSUQgb2Ygc2VydmVyICovCisKKyAgREJ1c1N0cmluZyBndWlkX2hleDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEhleC1lbmNvZGVkIHZlcnNpb24gb2YgR1VJRCAqLworICAKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsgICAgICAgICAgICAgICAgICAgICAvKio8IE91ciB3YXRjaGVzICovCisgIERCdXNUaW1lb3V0TGlzdCAqdGltZW91dHM7ICAgICAgICAgICAgICAgICAgLyoqPCBPdXIgdGltZW91dHMgKi8gIAorCisgIGNoYXIgKmFkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBZGRyZXNzIHRoaXMgc2VydmVyIGlzIGxpc3RlbmluZyBvbi4gKi8KKyAgZGJ1c19ib29sX3QgcHVibGlzaGVkX2FkZHJlc3M7ICAgICAgICAgICAgICAvKio8IGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQgc2VydmVyIGhhcyBwdWJsaXNoZWQgaXRzIGJ1cyBhZGRyZXNzLiAqLworCisgIGludCBtYXhfY29ubmVjdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgYXQgb25jZS4gKi8KKworICBEQnVzRGF0YVNsb3RMaXN0IHNsb3RfbGlzdDsgICAvKio8IERhdGEgc3RvcmVkIGJ5IGFsbG9jYXRlZCBpbnRlZ2VyIElEICovCisgIAorICBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uICBuZXdfY29ubmVjdGlvbl9mdW5jdGlvbjsKKyAgLyoqPCBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG5ldyBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuICovCisgIHZvaWQgKm5ld19jb25uZWN0aW9uX2RhdGE7CisgIC8qKjwgRGF0YSBmb3IgbmV3IGNvbm5lY3Rpb24gY2FsbGJhY2sgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBuZXdfY29ubmVjdGlvbl9mcmVlX2RhdGFfZnVuY3Rpb247CisgIC8qKjwgQ2FsbGJhY2sgdG8gaW52b2tlIHRvIGZyZWUgbmV3X2Nvbm5lY3Rpb25fZGF0YQorICAgKiB3aGVuIHNlcnZlciBpcyBmaW5hbGl6ZWQgb3IgZGF0YSBpcyByZXBsYWNlZC4KKyAgICovCisKKyAgY2hhciAqKmF1dGhfbWVjaGFuaXNtczsgLyoqPCBBcnJheSBvZiBhbGxvd2VkIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgKi8KKyAgCisgIHVuc2lnbmVkIGludCBkaXNjb25uZWN0ZWQgOiAxOyAgICAgICAgICAgICAgLyoqPCBUUlVFIGlmIHdlIGFyZSBkaXNjb25uZWN0ZWQuICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICB1bnNpZ25lZCBpbnQgaGF2ZV9zZXJ2ZXJfbG9jayA6IDE7IC8qKjwgRG9lcyBzb21lb25lIGhhdmUgdGhlIHNlcnZlciBtdXRleCBsb2NrZWQgKi8KKyNlbmRpZgorfTsKKworZGJ1c19ib29sX3QgX2RidXNfc2VydmVyX2luaXRfYmFzZSAgICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTZXJ2ZXJWVGFibGUgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAqYWRkcmVzcyk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZXJ2ZXJfYWRkX3dhdGNoICAgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCAgIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl90b2dnbGVfd2F0Y2ggICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgZW5hYmxlZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZXJ2ZXJfYWRkX3RpbWVvdXQgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfdG9nZ2xlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgZW5hYmxlZCk7CisKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyKTsKKwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRCwgLyoqPCB3ZSBhcmVuJ3QgaW4gY2hhcmdlIG9mIHRoaXMgYWRkcmVzcyB0eXBlICovCisgIERCVVNfU0VSVkVSX0xJU1RFTl9PSywgICAgICAgICAgLyoqPCB3ZSBzZXQgdXAgdGhlIGxpc3RlbiAqLworICBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1MsIC8qKjwgbWFsZm9ybWVkIGFkZHJlc3MgKi8KKyAgREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVCwgLyoqPCB3ZWxsLWZvcm1lZCBhZGRyZXNzIGJ1dCBmYWlsZWQgdG8gc2V0IGl0IHVwICovCisgIERCVVNfU0VSVkVSX0xJU1RFTl9BRERSRVNTX0FMUkVBRFlfVVNFRCAvKio8IGFkZHJlc3MgaXMgYWxyZWFkeSB1c2VkICovCit9IERCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQ7CisKK0RCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQgX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisjZGVmaW5lIFRPT0tfTE9DS19DSEVDSyhzZXJ2ZXIpCisjZGVmaW5lIFJFTEVBU0lOR19MT0NLX0NIRUNLKHNlcnZlcikKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKHNlcnZlcikKKyNlbHNlCisjZGVmaW5lIFRPT0tfTE9DS19DSEVDSyhzZXJ2ZXIpIGRvIHsgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoIShzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrKTsgXAorICAgIChzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrID0gVFJVRTsgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBSRUxFQVNJTkdfTE9DS19DSEVDSyhzZXJ2ZXIpIGRvIHsgICAgICAgICAgICBcCisgICAgX2RidXNfYXNzZXJ0ICgoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayk7ICAgXAorICAgIChzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrID0gRkFMU0U7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKHNlcnZlcikgICAgICAgIF9kYnVzX2Fzc2VydCAoKHNlcnZlciktPmhhdmVfc2VydmVyX2xvY2spCisvKiBBICJET19OT1RfSEFWRV9MT0NLX0NIRUNLIiBpcyBpbXBvc3NpYmxlIHNpbmNlIHdlIG5lZWQgdGhlIGxvY2sgdG8gY2hlY2sgdGhlIGZsYWcgKi8KKyNlbmRpZgorCisjZGVmaW5lIFRSQUNFX0xPQ0tTIDAKKworI2RlZmluZSBTRVJWRVJfTE9DSyhzZXJ2ZXIpICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRSQUNFX0xPQ0tTKSB7IF9kYnVzX3ZlcmJvc2UgKCJMT0NLXG4iKTsgfSAgIFwKKyAgICBfZGJ1c19tdXRleF9sb2NrICgoc2VydmVyKS0+bXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUT09LX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFUlZFUl9VTkxPQ0soc2VydmVyKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUUkFDRV9MT0NLUykgeyBfZGJ1c192ZXJib3NlICgiVU5MT0NLXG4iKTsgIH0gICAgICAgIFwKKyAgICBSRUxFQVNJTkdfTE9DS19DSEVDSyAoc2VydmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfbXV0ZXhfdW5sb2NrICgoc2VydmVyKS0+bXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX1BST1RFQ1RFRF9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGEyNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYwpAQCAtMCwwICsxLDU4NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1zb2NrZXQuYyBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHNvY2tldHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1tZW1vcnkuaCIKKyNpbmNsdWRlICJkYnVzLW5vbmNlLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NlcnZlclNvY2tldCBEQnVzU2VydmVyIGltcGxlbWVudGF0aW9ucyBmb3IgU09DS0VUCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciBvbiBTT0NLRVQKKyAqCisgKiBAeworICovCisvKioKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIFNvY2tldCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXJTb2NrZXQgREJ1c1NlcnZlclNvY2tldDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXJTb2NrZXQuIEFsbCBtZW1iZXJzCisgKiBhcmUgcHJpdmF0ZS4KKyAqLworc3RydWN0IERCdXNTZXJ2ZXJTb2NrZXQKK3sKKyAgREJ1c1NlcnZlciBiYXNlOyAgIC8qKjwgUGFyZW50IGNsYXNzIG1lbWJlcnMuICovCisgIGludCBuX2ZkczsgICAgICAgICAvKio8IE51bWJlciBvZiBhY3RpdmUgZmlsZSBoYW5kbGVzICovCisgIGludCAqZmRzOyAgICAgICAgICAvKio8IEZpbGUgZGVzY3JpcHRvciBvciAtMSBpZiBkaXNjb25uZWN0ZWQuICovCisgIERCdXNXYXRjaCAqKndhdGNoOyAvKio8IEZpbGUgZGVzY3JpcHRvciB3YXRjaC4gKi8KKyAgY2hhciAqc29ja2V0X25hbWU7IC8qKjwgTmFtZSBvZiBkb21haW4gc29ja2V0LCB0byB1bmxpbmsgaWYgYXBwcm9wcmlhdGUgKi8KKyAgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlOyAvKio8IE5vbmNlIGZpbGUgdXNlZCB0byBhdXRoZW50aWNhdGUgY2xpZW50cyAqLworfTsKKworc3RhdGljIHZvaWQKK3NvY2tldF9maW5hbGl6ZSAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBEQnVzU2VydmVyU29ja2V0ICpzb2NrZXRfc2VydmVyID0gKERCdXNTZXJ2ZXJTb2NrZXQqKSBzZXJ2ZXI7CisgIGludCBpOworCisgIF9kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlIChzZXJ2ZXIpOworCisgIGZvciAoaSA9IDAgOyBpIDwgc29ja2V0X3NlcnZlci0+bl9mZHMgOyBpKyspCisgICAgaWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKQorICAgICAgeworICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICBzb2NrZXRfc2VydmVyLT53YXRjaFtpXSA9IE5VTEw7CisgICAgICB9CisKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT5mZHMpOworICBkYnVzX2ZyZWUgKHNvY2tldF9zZXJ2ZXItPndhdGNoKTsKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT5zb2NrZXRfbmFtZSk7CisgIGlmIChzb2NrZXRfc2VydmVyLT5ub25jZWZpbGUpCisJX2RidXNfbm9uY2VmaWxlX2RlbGV0ZSAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlLCBOVUxMKTsKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT5ub25jZWZpbGUpOworICBkYnVzX2ZyZWUgKHNlcnZlcik7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBpcyBqdXN0IGZvciBtZW1vcnksIG5vdCBvdGhlciBmYWlsdXJlcy4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX25ld19jbGllbnRfZmRfYW5kX3VubG9jayAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgY2xpZW50X2ZkKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uIG5ld19jb25uZWN0aW9uX2Z1bmN0aW9uOworICBEQnVzU2VydmVyU29ja2V0KiBzb2NrZXRfc2VydmVyOworICB2b2lkICpuZXdfY29ubmVjdGlvbl9kYXRhOworCisgIHNvY2tldF9zZXJ2ZXIgPSAoREJ1c1NlcnZlclNvY2tldCopc2VydmVyOworICBfZGJ1c192ZXJib3NlICgiQ3JlYXRpbmcgbmV3IGNsaWVudCBjb25uZWN0aW9uIHdpdGggZmQgJWRcbiIsIGNsaWVudF9mZCk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChjbGllbnRfZmQsIE5VTEwpKQorICAgIHsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgdHJhbnNwb3J0ID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChjbGllbnRfZmQsICZzZXJ2ZXItPmd1aWRfaGV4LCBGQUxTRSk7CisgIGlmICh0cmFuc3BvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKGNsaWVudF9mZCwgTlVMTCk7CisgICAgICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9zZXRfYXV0aF9tZWNoYW5pc21zICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSBzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcykpCisgICAgeworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogbm90ZSB0aGF0IGNsaWVudF9mZCBpcyBub3cgb3duZWQgYnkgdGhlIHRyYW5zcG9ydCwgYW5kIHdpbGwgYmUKKyAgICogY2xvc2VkIG9uIHRyYW5zcG9ydCBkaXNjb25uZWN0aW9uL2ZpbmFsaXphdGlvbgorICAgKi8KKworICBjb25uZWN0aW9uID0gX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAodHJhbnNwb3J0KTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworICB0cmFuc3BvcnQgPSBOVUxMOyAvKiBub3cgdW5kZXIgdGhlIGNvbm5lY3Rpb24gbG9jayAqLworCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2VlIGlmIHNvbWVvbmUgd2FudHMgdG8gaGFuZGxlIHRoaXMgbmV3IGNvbm5lY3Rpb24sIHNlbGYtcmVmZXJlbmNpbmcKKyAgICogZm9yIHBhcmFub2lhLgorICAgKi8KKyAgbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gPSBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2Z1bmN0aW9uOworICBuZXdfY29ubmVjdGlvbl9kYXRhID0gc2VydmVyLT5uZXdfY29ubmVjdGlvbl9kYXRhOworCisgIF9kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQgKHNlcnZlcik7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgaWYgKG5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKQorICAgIHsKKyAgICAgICgqIG5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKSAoc2VydmVyLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY29ubmVjdGlvbl9kYXRhKTsKKyAgICB9CisgIGRidXNfc2VydmVyX3VucmVmIChzZXJ2ZXIpOworCisgIC8qIElmIG5vIG9uZSBncmFiYmVkIGEgcmVmZXJlbmNlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGRpZS4gKi8KKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKGNvbm5lY3Rpb24pOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9oYW5kbGVfd2F0Y2ggKERCdXNXYXRjaCAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKmRhdGEpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGRhdGE7CisgIERCdXNTZXJ2ZXJTb2NrZXQgKnNvY2tldF9zZXJ2ZXIgPSBkYXRhOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IGZvdW5kID0gRkFMU0U7CisjZW5kaWYKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIGZvciAoaSA9IDAgOyBpIDwgc29ja2V0X3NlcnZlci0+bl9mZHMgOyBpKyspCisgICAgeworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID09IHdhdGNoKQorICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgfQorICBfZGJ1c19hc3NlcnQgKGZvdW5kKTsKKyNlbmRpZgorCisgIF9kYnVzX3ZlcmJvc2UgKCJIYW5kbGluZyBjbGllbnQgY29ubmVjdGlvbiwgZmxhZ3MgMHgleFxuIiwgZmxhZ3MpOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpCisgICAgeworICAgICAgaW50IGNsaWVudF9mZDsKKyAgICAgIGludCBsaXN0ZW5fZmQ7CisKKyAgICAgIGxpc3Rlbl9mZCA9IGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpOworCisgICAgICBpZiAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKQorICAgICAgICAgIGNsaWVudF9mZCA9IF9kYnVzX2FjY2VwdF93aXRoX25vbmNlZmlsZSAobGlzdGVuX2ZkLCBzb2NrZXRfc2VydmVyLT5ub25jZWZpbGUpOworICAgICAgZWxzZSAKKyAgICAgICAgICBjbGllbnRfZmQgPSBfZGJ1c19hY2NlcHQgKGxpc3Rlbl9mZCk7CisKKyAgICAgIGlmIChjbGllbnRfZmQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgLyogRUlOVFIgaGFuZGxlZCBmb3IgdXMgKi8KKworICAgICAgICAgIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrICgpKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIGNsaWVudCBhdmFpbGFibGUgdG8gYWNjZXB0IGFmdGVyIGFsbFxuIik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhY2NlcHQgYSBjbGllbnQgY29ubmVjdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghaGFuZGxlX25ld19jbGllbnRfZmRfYW5kX3VubG9jayAoc2VydmVyLCBjbGllbnRfZmQpKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJlamVjdGVkIGNsaWVudCBjb25uZWN0aW9uIGR1ZSB0byBsYWNrIG9mIG1lbW9yeVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9FUlJPUikKKyAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfSEFOR1VQKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJIYW5ndXAgb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworICBpbnQgaTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgZm9yIChpID0gMCA7IGkgPCBzb2NrZXRfc2VydmVyLT5uX2ZkcyA7IGkrKykKKyAgICB7CisgICAgICBpZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfc2VydmVyLT53YXRjaFtpXSk7CisgICAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc29ja2V0X3NlcnZlci0+ZmRzW2ldLCBOVUxMKTsKKyAgICAgIHNvY2tldF9zZXJ2ZXItPmZkc1tpXSA9IC0xOworICAgIH0KKworICBpZiAoc29ja2V0X3NlcnZlci0+c29ja2V0X25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHRtcDsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCBzb2NrZXRfc2VydmVyLT5zb2NrZXRfbmFtZSk7CisgICAgICBfZGJ1c19kZWxldGVfZmlsZSAoJnRtcCwgTlVMTCk7CisgICAgfQorCisgIGlmIChzZXJ2ZXItPnB1Ymxpc2hlZF9hZGRyZXNzKQorICAgICAgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzKCk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworfQorCitzdGF0aWMgY29uc3QgREJ1c1NlcnZlclZUYWJsZSBzb2NrZXRfdnRhYmxlID0geworICBzb2NrZXRfZmluYWxpemUsCisgIHNvY2tldF9kaXNjb25uZWN0Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAgVGhlCisgKiBmaWxlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIG5vbmJsb2NraW5nICh1c2UKKyAqIF9kYnVzX3NldF9mZF9ub25ibG9ja2luZygpIHRvIG1ha2UgaXQgc28pLiBUaGUgZmlsZSBkZXNjcmlwdG9yCisgKiBzaG91bGQgYmUgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucywgdGhhdCBpcywgbGlzdGVuKCkgc2hvdWxkIGhhdmUKKyAqIGJlZW4gc3VjY2Vzc2Z1bGx5IGludm9rZWQgb24gaXQuIFRoZSBzZXJ2ZXIgd2lsbCB1c2UgYWNjZXB0KCkgdG8KKyAqIGFjY2VwdCBuZXcgY2xpZW50IGNvbm5lY3Rpb25zLgorICoKKyAqIEBwYXJhbSBmZHMgbGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzLgorICogQHBhcmFtIG5fZmRzIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgc2VydmVyJ3MgYWRkcmVzcworICogQHBhcmFtIG5vbmNlZmlsZSB0byBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiAoTlVMTCBpZiBub3QgbmVlZGVkKQorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIGlmIG5vIG1lbW9yeS4KKyAqCisgKi8KK0RCdXNTZXJ2ZXIqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9zb2NrZXQgKGludCAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOb25jZUZpbGUgICAgKm5vbmNlZmlsZSkKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlcjsKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBpbnQgaTsKKworICBzb2NrZXRfc2VydmVyID0gZGJ1c19uZXcwIChEQnVzU2VydmVyU29ja2V0LCAxKTsKKyAgaWYgKHNvY2tldF9zZXJ2ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzb2NrZXRfc2VydmVyLT5ub25jZWZpbGUgPSBub25jZWZpbGU7CisKKyAgc29ja2V0X3NlcnZlci0+ZmRzID0gZGJ1c19uZXcgKGludCwgbl9mZHMpOworICBpZiAoIXNvY2tldF9zZXJ2ZXItPmZkcykKKyAgICBnb3RvIGZhaWxlZF8wOworCisgIHNvY2tldF9zZXJ2ZXItPndhdGNoID0gZGJ1c19uZXcwIChEQnVzV2F0Y2ggKiwgbl9mZHMpOworICBpZiAoIXNvY2tldF9zZXJ2ZXItPndhdGNoKQorICAgIGdvdG8gZmFpbGVkXzE7CisKKyAgZm9yIChpID0gMCA7IGkgPCBuX2ZkcyA7IGkrKykKKyAgICB7CisgICAgICBEQnVzV2F0Y2ggKndhdGNoOworCisgICAgICB3YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoZmRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfV0FUQ0hfUkVBREFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfaGFuZGxlX3dhdGNoLCBzb2NrZXRfc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbGVkXzI7CisKKyAgICAgIHNvY2tldF9zZXJ2ZXItPm5fZmRzKys7CisgICAgICBzb2NrZXRfc2VydmVyLT5mZHNbaV0gPSBmZHNbaV07CisgICAgICBzb2NrZXRfc2VydmVyLT53YXRjaFtpXSA9IHdhdGNoOworICAgIH0KKworICBpZiAoIV9kYnVzX3NlcnZlcl9pbml0X2Jhc2UgKCZzb2NrZXRfc2VydmVyLT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrZXRfdnRhYmxlLCBhZGRyZXNzKSkKKyAgICBnb3RvIGZhaWxlZF8yOworCisgIHNlcnZlciA9IChEQnVzU2VydmVyKilzb2NrZXRfc2VydmVyOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworCisgIGZvciAoaSA9IDAgOyBpIDwgbl9mZHMgOyBpKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zZXJ2ZXJfYWRkX3dhdGNoICgmc29ja2V0X3NlcnZlci0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pKQorICAgICAgICB7CisgICAgICAgICAgaW50IGo7CisgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBpIDsgaisrKQorICAgICAgICAgICAgX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbal0pOworCisgICAgICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgICAgICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoJnNvY2tldF9zZXJ2ZXItPmJhc2UpOworICAgICAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgICAgIH0KKyAgICB9CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICByZXR1cm4gKERCdXNTZXJ2ZXIqKSBzb2NrZXRfc2VydmVyOworCisgZmFpbGVkXzI6CisgIGZvciAoaSA9IDAgOyBpIDwgbl9mZHMgOyBpKyspCisgICAgeworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT53YXRjaCk7CisKKyBmYWlsZWRfMToKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT5mZHMpOworCisgZmFpbGVkXzA6CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlcik7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiBUQ1AuCisgKiBJZiBob3N0IGlzIE5VTEwsIGl0IHdpbGwgZGVmYXVsdCB0byBsb2NhbGhvc3QuCisgKiBJZiBiaW5kIGlzIE5VTEwsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgdmFsdWUgZm9yIHRoZSBob3N0CisgKiBwYXJhbWV0ZXIsIGFuZCBpZiB0aGF0IGlzIE5VTEwsIHRoZW4gbG9jYWxob3N0CisgKiBJZiBiaW5kIGlzIGEgaG9zdG5hbWUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYW5kIHdpbGwgbGlzdGVuCisgKiBvbiBhbGwgcmV0dXJuZWQgYWRkcmVzc2VzLgorICogSWYgZmFtaWx5IGlzIE5VTEwsIGhvc3RuYW1lIHJlc29sdXRpb24gd2lsbCB0cnkgYWxsIGFkZHJlc3MKKyAqIGZhbWlsaWVzLCBvdGhlcndpc2UgaXQgY2FuIGJlIGlwdjQgb3IgaXB2NiB0byByZXN0cmljdCB0aGUKKyAqIGFkZHJlc3NlcyBjb25zaWRlcmVkLgorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0bmFtZSB0byByZXBvcnQgZm9yIHRoZSBsaXN0ZW4gYWRkcmVzcworICogQHBhcmFtIGJpbmQgdGhlIGhvc3RuYW1lIHRvIGxpc3RlbiBvbgorICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIG9uIG9yIDAgdG8gbGV0IHRoZSBPUyBjaG9vc2UKKyAqIEBwYXJhbSBmYW1pbHkKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUuCisgKiBAcGFyYW0gdXNlX25vbmNlIHdoZXRoZXIgdG8gdXNlIGEgbm9uY2UgZm9yIGxvdy1sZXZlbCBhdXRoZW50aWNhdGlvbiAobm9uY2UtdGNwIHRyYW5zcG9ydCkgb3Igbm90ICh0Y3AgdHJhbnNwb3J0KQorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNTZXJ2ZXIqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgdXNlX25vbmNlKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIGludCAqbGlzdGVuX2ZkcyA9IE5VTEw7CisgIGludCBubGlzdGVuX2ZkcyA9IDAsIGk7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgREJ1c1N0cmluZyBob3N0X3N0cjsKKyAgREJ1c1N0cmluZyBwb3J0X3N0cjsKKyAgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbm9uY2VmaWxlID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBvcnRfc3RyKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzA7CisgICAgfQorCisgIGlmIChob3N0ID09IE5VTEwpCisgICAgaG9zdCA9ICJsb2NhbGhvc3QiOworCisgIGlmIChwb3J0ID09IE5VTEwpCisgICAgcG9ydCA9ICIwIjsKKworICBpZiAoYmluZCA9PSBOVUxMKQorICAgIGJpbmQgPSBob3N0OworICBlbHNlIGlmIChzdHJjbXAgKGJpbmQsICIqIikgPT0gMCkKKyAgICBiaW5kID0gTlVMTDsKKworICBubGlzdGVuX2ZkcyA9X2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgKGJpbmQsIHBvcnQsIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpc3Rlbl9mZHMsIGVycm9yKTsKKyAgaWYgKG5saXN0ZW5fZmRzIDw9IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZF8xOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmhvc3Rfc3RyLCBob3N0KTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgdXNlX25vbmNlID8gIm5vbmNlLXRjcDpob3N0PSIgOiAidGNwOmhvc3Q9IikgfHwKKyAgICAgICFfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkICgmYWRkcmVzcywgJmhvc3Rfc3RyKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLHBvcnQ9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKCZwb3J0X3N0cikpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMjsKKyAgICB9CisgIGlmIChmYW1pbHkgJiYKKyAgICAgICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICIsZmFtaWx5PSIpIHx8CisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBmYW1pbHkpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgfQorCisgIGlmICh1c2Vfbm9uY2UpCisgICAgeworICAgICAgbm9uY2VmaWxlID0gZGJ1c19uZXcwIChEQnVzTm9uY2VGaWxlLCAxKTsKKyAgICAgIGlmIChub25jZWZpbGUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19ub25jZWZpbGVfY3JlYXRlIChub25jZWZpbGUsIGVycm9yKSkKKyAgICAgICAgICBnb3RvIGZhaWxlZF8zOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLG5vbmNlZmlsZT0iKSB8fAorICAgICAgICAgICFfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkICgmYWRkcmVzcywgX2RidXNfbm9uY2VmaWxlX2dldF9wYXRoIChub25jZWZpbGUpKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gZmFpbGVkXzQ7CisgICAgICAgIH0KKworICAgIH0KKworICBzZXJ2ZXIgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9zb2NrZXQgKGxpc3Rlbl9mZHMsIG5saXN0ZW5fZmRzLCAmYWRkcmVzcywgbm9uY2VmaWxlKTsKKyAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfNDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwb3J0X3N0cik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmRzKTsKKworICByZXR1cm4gc2VydmVyOworCisgZmFpbGVkXzQ6CisgIF9kYnVzX25vbmNlZmlsZV9kZWxldGUgKG5vbmNlZmlsZSwgTlVMTCk7CisKKyBmYWlsZWRfMzoKKyAgZGJ1c19mcmVlIChub25jZWZpbGUpOworCisgZmFpbGVkXzI6CisgIGZvciAoaSA9IDAgOyBpIDwgbmxpc3Rlbl9mZHMgOyBpKyspCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChsaXN0ZW5fZmRzW2ldLCBOVUxMKTsKKyAgZGJ1c19mcmVlKGxpc3Rlbl9mZHMpOworCisgZmFpbGVkXzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcG9ydF9zdHIpOworCisgZmFpbGVkXzA6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVHJpZXMgdG8gaW50ZXJwcmV0IHRoZSBhZGRyZXNzIGVudHJ5IGZvciB2YXJpb3VzIHNvY2tldC1yZWxhdGVkCisgKiBhZGRyZXNzZXMgKHdlbGwsIGN1cnJlbnRseSBvbmx5IHRjcCBhbmQgbm9uY2UtdGNwKS4KKyAqCisgKiBTZXRzIGVycm9yIGlmIHRoZSByZXN1bHQgaXMgbm90IE9LLgorICoKKyAqIEBwYXJhbSBlbnRyeSBhbiBhZGRyZXNzIGVudHJ5CisgKiBAcGFyYW0gc2VydmVyX3AgYSBuZXcgREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByYXRpb25hbGUgZm9yIGZhaWx1cmUgb24gYmFkIGFkZHJlc3MKKyAqIEByZXR1cm5zIHRoZSBvdXRjb21lCisgKgorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgPSBOVUxMOworCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAidGNwIikgPT0gMCB8fCBzdHJjbXAgKG1ldGhvZCwgIm5vbmNlLXRjcCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqaG9zdDsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQ7CisgICAgICBjb25zdCBjaGFyICpiaW5kOworICAgICAgY29uc3QgY2hhciAqZmFtaWx5OworCisgICAgICBob3N0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJob3N0Iik7CisgICAgICBiaW5kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJiaW5kIik7CisgICAgICBwb3J0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwb3J0Iik7CisgICAgICBmYW1pbHkgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImZhbWlseSIpOworCisgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0IChob3N0LCBiaW5kLCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LCBlcnJvciwgc3RyY21wIChtZXRob2QsICJub25jZS10Y3AiKSA9PSAwID8gVFJVRSA6IEZBTFNFKTsKKworICAgICAgaWYgKCpzZXJ2ZXJfcCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKgorICogVGhpcyBpcyBhIGJhZCBoYWNrIHNpbmNlIGl0J3MgcmVhbGx5IHVuaXggZG9tYWluIHNvY2tldAorICogc3BlY2lmaWMuIEFsc28sIHRoZSBmdW5jdGlvbiB3ZWlyZGx5IGFkb3B0cyBvd25lcnNoaXAKKyAqIG9mIHRoZSBwYXNzZWQtaW4gc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgYSBzb2NrZXQgc2VydmVyCisgKiBAcGFyYW0gZmlsZW5hbWUgc29ja2V0IGZpbGVuYW1lIHRvIHJlcG9ydC9kZWxldGUKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9zb2NrZXRfb3duX2ZpbGVuYW1lIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqZmlsZW5hbWUpCit7CisgIERCdXNTZXJ2ZXJTb2NrZXQgKnNvY2tldF9zZXJ2ZXIgPSAoREJ1c1NlcnZlclNvY2tldCopIHNlcnZlcjsKKworICBzb2NrZXRfc2VydmVyLT5zb2NrZXRfbmFtZSA9IGZpbGVuYW1lOworfQorCisKKy8qKiBAfSAqLworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVjNzEyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuaApAQCAtMCwwICsxLDU0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLXNvY2tldC5oIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3Igc29ja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1NPQ0tFVF9ICisjZGVmaW5lIERCVVNfU0VSVkVSX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbm9uY2UuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzU2VydmVyKiBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9zb2NrZXQgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTm9uY2VGaWxlICAgICpub25jZWZpbGUpOworREJ1c1NlcnZlciogX2RidXNfc2VydmVyX25ld19mb3JfYXV0b2xhdW5jaCAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCdXNTZXJ2ZXIqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQgICAgICAgKGNvbnN0IGNoYXIgICAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpiaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICB1c2Vfbm9uY2UpOworREJ1c1NlcnZlckxpc3RlblJlc3VsdCBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworCit2b2lkIF9kYnVzX3NlcnZlcl9zb2NrZXRfb3duX2ZpbGVuYW1lIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpmaWxlbmFtZSk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci11bml4LmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLXVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGFkOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci11bml4LmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItdW5peC5jIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3IgVW5peCBuZXR3b3JrIHByb3RvY29scy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItdW5peC5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLWxhdW5jaGQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyVW5peCBEQnVzU2VydmVyIGltcGxlbWVudGF0aW9ucyBmb3IgVU5JWAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXIgb24gVU5JWAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUcmllcyB0byBpbnRlcnByZXQgdGhlIGFkZHJlc3MgZW50cnkgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYworICogd2F5LCBjcmVhdGluZyBhIHBsYXRmb3JtLXNwZWNpZmljIHNlcnZlciB0eXBlIGlmIGFwcHJvcHJpYXRlLgorICogU2V0cyBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBPSy4KKyAqCisgKiBAcGFyYW0gZW50cnkgYW4gYWRkcmVzcyBlbnRyeQorICogQHBhcmFtIHNlcnZlcl9wIGxvY2F0aW9uIHRvIHN0b3JlIGEgbmV3IERCdXNTZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmF0aW9uYWxlIGZvciBmYWlsdXJlIG9uIGJhZCBhZGRyZXNzCisgKiBAcmV0dXJucyB0aGUgb3V0Y29tZQorICoKKyAqLworREJ1c1NlcnZlckxpc3RlblJlc3VsdAorX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYyAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisKKyAgKnNlcnZlcl9wID0gTlVMTDsKKworICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgInVuaXgiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnBhdGggPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInBhdGgiKTsKKyAgICAgIGNvbnN0IGNoYXIgKnRtcGRpciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAidG1wZGlyIik7CisgICAgICBjb25zdCBjaGFyICphYnN0cmFjdCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiYWJzdHJhY3QiKTsKKworICAgICAgaWYgKHBhdGggPT0gTlVMTCAmJiB0bXBkaXIgPT0gTlVMTCAmJiBhYnN0cmFjdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzKGVycm9yLCAidW5peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIHRtcGRpciBvciBhYnN0cmFjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgaWYgKChwYXRoICYmIHRtcGRpcikgfHwKKyAgICAgICAgICAocGF0aCAmJiBhYnN0cmFjdCkgfHwKKyAgICAgICAgICAodG1wZGlyICYmIGFic3RyYWN0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyhlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzcGVjaWZ5IHR3byBvZiBcInBhdGhcIiBhbmQgXCJ0bXBkaXJcIiBhbmQgXCJhYnN0cmFjdFwiIGF0IHRoZSBzYW1lIHRpbWUiKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIGlmICh0bXBkaXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYnVzLSIpIHx8CisgICAgICAgICAgICAgICFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZmaWxlbmFtZSwgMTApIHx8CisgICAgICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCB0bXBkaXIpIHx8CisgICAgICAgICAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBBbHdheXMgdXNlIGFic3RyYWN0IG5hbWVzcGFjZSBpZiBwb3NzaWJsZSB3aXRoIHRtcGRpciAqLworCisgICAgICAgICAgKnNlcnZlcl9wID0KKyAgICAgICAgICAgIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksCisjaWZkZWYgSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChwYXRoKQorICAgICAgICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAocGF0aCwgRkFMU0UsIGVycm9yKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0IChhYnN0cmFjdCwgVFJVRSwgZXJyb3IpOworICAgICAgICB9CisKKyAgICAgIGlmICgqc2VydmVyX3AgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobWV0aG9kLCAic3lzdGVtZCIpID09IDApCisgICAgeworICAgICAgaW50IG4sICpmZHM7CisgICAgICBEQnVzU3RyaW5nIGFkZHJlc3M7CisKKyAgICAgIG4gPSBfZGJ1c19saXN0ZW5fc3lzdGVtZF9zb2NrZXRzICgmZmRzLCBlcnJvcik7CisgICAgICBpZiAobiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZhZGRyZXNzLCAic3lzdGVtZDoiKTsKKworICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0IChmZHMsIG4sICZhZGRyZXNzLCBOVUxMKTsKKyAgICAgIGlmICgqc2VydmVyX3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGludCBpOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChmZHNbaV0sIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgIGRidXNfZnJlZSAoZmRzKTsKKworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoZmRzKTsKKworICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKwl9CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICBlbHNlIGlmIChzdHJjbXAgKG1ldGhvZCwgImxhdW5jaGQiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZW52Iik7CisgICAgICBpZiAobGF1bmNoZF9lbnZfdmFyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAibGF1bmNoZCIsICJlbnYiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfbGF1bmNoZCAobGF1bmNoZF9lbnZfdmFyLCBlcnJvcik7CisKKyAgICAgIGlmICgqc2VydmVyX3AgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHdlIGRvbid0IGhhbmRsZSB0aGUgbWV0aG9kLCB3ZSByZXR1cm4gTlVMTCB3aXRoIHRoZQorICAgICAgICogZXJyb3IgdW5zZXQKKyAgICAgICAqLworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiB0aGUgZ2l2ZW4gVW5peCBkb21haW4gc29ja2V0LgorICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGZvciB0aGUgZG9tYWluIHNvY2tldC4KKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIHRoZSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgaW50IGxpc3Rlbl9mZDsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBjaGFyICpwYXRoX2NvcHk7CisgIERCdXNTdHJpbmcgcGF0aF9zdHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aF9zdHIsIHBhdGgpOworICBpZiAoKGFic3RyYWN0ICYmCisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDphYnN0cmFjdD0iKSkgfHwKKyAgICAgICghYWJzdHJhY3QgJiYKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJ1bml4OnBhdGg9IikpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsICZwYXRoX3N0cikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8wOworICAgIH0KKworICBwYXRoX2NvcHkgPSBfZGJ1c19zdHJkdXAgKHBhdGgpOworICBpZiAocGF0aF9jb3B5ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8wOworICAgIH0KKworICBsaXN0ZW5fZmQgPSBfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQgKHBhdGgsIGFic3RyYWN0LCBlcnJvcik7CisKKyAgaWYgKGxpc3Rlbl9mZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWRfMTsKKyAgICB9CisKKyAgc2VydmVyID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0ICgmbGlzdGVuX2ZkLCAxLCAmYWRkcmVzcywgMCk7CisgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzI7CisgICAgfQorCisgIF9kYnVzX3NlcnZlcl9zb2NrZXRfb3duX2ZpbGVuYW1lKHNlcnZlciwgcGF0aF9jb3B5KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgIHJldHVybiBzZXJ2ZXI7CisKKyBmYWlsZWRfMjoKKyAgX2RidXNfY2xvc2Vfc29ja2V0IChsaXN0ZW5fZmQsIE5VTEwpOworIGZhaWxlZF8xOgorICBkYnVzX2ZyZWUgKHBhdGhfY29weSk7CisgZmFpbGVkXzA6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci11bml4LmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLXVuaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI5OTZjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci11bml4LmgKQEAgLTAsMCArMSwzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci11bml4LmggU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBVbml4IG5ldHdvcmsgcHJvdG9jb2xzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1VOSVhfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9VTklYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCdXNTZXJ2ZXIqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX1VOSVhfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci13aW4uYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxYzg5NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItd2luLmMgU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBXSU4gbmV0d29yayBwcm90b2NvbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXdpbi5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXNvY2tldC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyV2luIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBXaW5kb3dzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciBvbiBXaW5kb3dzIAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUcmllcyB0byBpbnRlcnByZXQgdGhlIGFkZHJlc3MgZW50cnkgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYworICogd2F5LCBjcmVhdGluZyBhIHBsYXRmb3JtLXNwZWNpZmljIHNlcnZlciB0eXBlIGlmIGFwcHJvcHJpYXRlLgorICogU2V0cyBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBPSy4KKyAqIAorICogQHBhcmFtIGVudHJ5IGFuIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBzZXJ2ZXJfcCBsb2NhdGlvbiB0byBzdG9yZSBhIG5ldyBEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJhdGlvbmFsZSBmb3IgZmFpbHVyZSBvbiBiYWQgYWRkcmVzcworICogQHJldHVybnMgdGhlIG91dGNvbWUKKyAqIAorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgID0gTlVMTDsKKworICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgIm5vbmNlLXRjcCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqaG9zdDsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQ7CisgICAgICBjb25zdCBjaGFyICpiaW5kOworICAgICAgY29uc3QgY2hhciAqZmFtaWx5OworCisgICAgICBob3N0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJob3N0Iik7CisgICAgICBiaW5kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJiaW5kIik7CisgICAgICBwb3J0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwb3J0Iik7CisgICAgICBmYW1pbHkgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImZhbWlseSIpOworCisgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0IChob3N0LCBiaW5kLCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LCBlcnJvciwgVFJVRSk7CisKKyAgICAgIGlmICgqc2VydmVyX3ApCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fT0s7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG1ldGhvZCwgImF1dG9sYXVuY2giKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmhvc3QgPSAibG9jYWxob3N0IjsKKyAgICAgIGNvbnN0IGNoYXIgKmJpbmQgPSAibG9jYWxob3N0IjsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQgPSAiMCI7CisgICAgICBjb25zdCBjaGFyICpmYW1pbHkgPSAiaXB2NCI7CisgICAgICBjb25zdCBjaGFyICpzY29wZSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAic2NvcGUiKTsKKworICAgICAgaWYgKF9kYnVzX2RhZW1vbl9pc19zZXNzaW9uX2J1c19hZGRyZXNzX3B1Ymxpc2hlZCAoc2NvcGUpKQorICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQUREUkVTU19BTFJFQURZX1VTRUQ7CisKKyAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3RjcF9zb2NrZXQgKGhvc3QsIGJpbmQsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHksIGVycm9yLCBGQUxTRSk7CisgICAgICBpZiAoKnNlcnZlcl9wKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICAoKnNlcnZlcl9wKS0+cHVibGlzaGVkX2FkZHJlc3MgPQorICAgICAgICAgICAgICBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzICgoKnNlcnZlcl9wKS0+YWRkcmVzcywgc2NvcGUpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fT0s7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIG1ha2Ugc3VyZSBubyBoYW5kbGUgaXMgb3BlbgorICAgICAgICAgIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAoKTsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKiogQH0gKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci13aW4uaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjMjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmgKQEAgLTAsMCArMSwzNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci13aW4uaCBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHdpbmRvd3MgbmV0d29yayBwcm90b2NvbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NFUlZFUl9XSU5fSAorI2RlZmluZSBEQlVTX1NFUlZFUl9XSU5fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyogYWRkIGRlZmluaXRpb25zIGhlcmUgKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX1dJTl9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkMTRiMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zZXJ2ZXIuYwpAQCAtMCwwICsxLDEyMTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXIuYyBEQnVzU2VydmVyIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8gCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNlcnZlci5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJkYnVzLWFkZHJlc3MuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXIgREJ1c1NlcnZlcgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBTZXJ2ZXIgdGhhdCBsaXN0ZW5zIGZvciBuZXcgY29ubmVjdGlvbnMuCisgKgorICogQSBEQnVzU2VydmVyIHJlcHJlc2VudHMgYSBzZXJ2ZXIgdGhhdCBvdGhlciBhcHBsaWNhdGlvbnMKKyAqIGNhbiBjb25uZWN0IHRvLiBFYWNoIGNvbm5lY3Rpb24gZnJvbSBhbm90aGVyIGFwcGxpY2F0aW9uCisgKiBpcyByZXByZXNlbnRlZCBieSBhICNEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAdG9kbyBUaHJlYWQgc2FmZXR5IGhhc24ndCBiZWVuIHRlc3RlZCBtdWNoIGZvciAjREJ1c1NlcnZlcgorICogQHRvZG8gTmVlZCBub3RpZmljYXRpb24gdG8gYXBwcyBvZiBkaXNjb25uZWN0aW9uLCBtYXkgbWF0dGVyIGZvciBzb21lIHRyYW5zcG9ydHMKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVySW50ZXJuYWxzIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXIKKyAqCisgKiBAeworICovCisKKy8qIHRoaXMgaXMgYSBsaXR0bGUgZnJhZ2lsZSBzaW5jZSBpdCBhc3N1bWVzIHRoZSBhZGRyZXNzIGRvZXNuJ3QKKyAqIGFscmVhZHkgaGF2ZSBhIGd1aWQsIGJ1dCBpdCBzaG91bGRuJ3QKKyAqLworc3RhdGljIGNoYXIqCitjb3B5X2FkZHJlc3Nfd2l0aF9ndWlkX2FwcGVuZGVkIChjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3VpZF9oZXgpCit7CisgIERCdXNTdHJpbmcgd2l0aF9ndWlkOworICBjaGFyICpyZXR2YWw7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmd2l0aF9ndWlkKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChhZGRyZXNzLCAwLCAmd2l0aF9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJndpdGhfZ3VpZCkpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJndpdGhfZ3VpZCwgIixndWlkPSIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2NvcHkgKGd1aWRfaGV4LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2l0aF9ndWlkLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJndpdGhfZ3VpZCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmd2l0aF9ndWlkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR2YWwgPSBOVUxMOworICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJndpdGhfZ3VpZCwgJnJldHZhbCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ3aXRoX2d1aWQpOworICAgICAgCisgIHJldHVybiByZXR2YWw7IC8qIG1heSBiZSBOVUxMIGlmIHN0ZWFsX2RhdGEgZmFpbGVkICovCit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgdGhlIERCdXNTZXJ2ZXIgYmFzZSBjbGFzcy4KKyAqIENoYWluZWQgdXAgdG8gYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZ0YWJsZSBmb3IgdGhlIHN1YmNsYXNzLgorICogQHBhcmFtIGFkZHJlc3MgdGhlIHNlcnZlcidzIGFkZHJlc3MKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfaW5pdF9iYXNlIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU2VydmVyVlRhYmxlICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICphZGRyZXNzKQoreworICBzZXJ2ZXItPnZ0YWJsZSA9IHZ0YWJsZTsKKyAgc2VydmVyLT5yZWZjb3VudC52YWx1ZSA9IDE7CisKKyAgc2VydmVyLT5hZGRyZXNzID0gTlVMTDsKKyAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgc2VydmVyLT50aW1lb3V0cyA9IE5VTEw7CisgIHNlcnZlci0+cHVibGlzaGVkX2FkZHJlc3MgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmVyLT5ndWlkX2hleCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2dlbmVyYXRlX3V1aWQgKCZzZXJ2ZXItPmd1aWQpOworCisgIGlmICghX2RidXNfdXVpZF9lbmNvZGUgKCZzZXJ2ZXItPmd1aWQsICZzZXJ2ZXItPmd1aWRfaGV4KSkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIHNlcnZlci0+YWRkcmVzcyA9IGNvcHlfYWRkcmVzc193aXRoX2d1aWRfYXBwZW5kZWQgKGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXItPmd1aWRfaGV4KTsKKyAgaWYgKHNlcnZlci0+YWRkcmVzcyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgX2RidXNfbXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmc2VydmVyLT5tdXRleCk7CisgIGlmIChzZXJ2ZXItPm11dGV4ID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisgIAorICBzZXJ2ZXItPndhdGNoZXMgPSBfZGJ1c193YXRjaF9saXN0X25ldyAoKTsKKyAgaWYgKHNlcnZlci0+d2F0Y2hlcyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIHNlcnZlci0+dGltZW91dHMgPSBfZGJ1c190aW1lb3V0X2xpc3RfbmV3ICgpOworICBpZiAoc2VydmVyLT50aW1lb3V0cyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKCZzZXJ2ZXItPnNsb3RfbGlzdCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkluaXRpYWxpemVkIHNlcnZlciBvbiBhZGRyZXNzICVzXG4iLCBzZXJ2ZXItPmFkZHJlc3MpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9kYnVzX211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZzZXJ2ZXItPm11dGV4KTsKKyAgc2VydmVyLT5tdXRleCA9IE5VTEw7CisgIGlmIChzZXJ2ZXItPndhdGNoZXMpCisgICAgeworICAgICAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChzZXJ2ZXItPndhdGNoZXMpOworICAgICAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgICB9CisgIGlmIChzZXJ2ZXItPnRpbWVvdXRzKQorICAgIHsKKyAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChzZXJ2ZXItPnRpbWVvdXRzKTsKKyAgICAgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICAgIH0KKyAgaWYgKHNlcnZlci0+YWRkcmVzcykKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHNlcnZlci0+YWRkcmVzcyk7CisgICAgICBzZXJ2ZXItPmFkZHJlc3MgPSBOVUxMOworICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2ZXItPmd1aWRfaGV4KTsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGaW5hbGl6ZXMgdGhlIG1lbWJlcnMgb2YgdGhlIERCdXNTZXJ2ZXIgYmFzZSBjbGFzcy4KKyAqIENoYWluZWQgdXAgdG8gYnkgc3ViY2xhc3MgZmluYWxpemVycy4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIC8qIFdlIGRvbid0IGhhdmUgdGhlIGxvY2ssIGJ1dCBub2JvZHkgc2hvdWxkIGJlIGFjY2Vzc2luZworICAgKiBjb25jdXJyZW50bHkgc2luY2UgdGhleSBkb24ndCBoYXZlIGEgcmVmCisgICAqLworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIF9kYnVzX2Fzc2VydCAoIXNlcnZlci0+aGF2ZV9zZXJ2ZXJfbG9jayk7CisjZW5kaWYKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPmRpc2Nvbm5lY3RlZCk7CisgIAorICAvKiBjYWxscyBvdXQgdG8gYXBwbGljYXRpb24gY29kZS4uLiAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmc2VydmVyLT5zbG90X2xpc3QpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoc2VydmVyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHNlcnZlci0+d2F0Y2hlcyk7CisgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChzZXJ2ZXItPnRpbWVvdXRzKTsKKworICBfZGJ1c19tdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmc2VydmVyLT5tdXRleCk7CisgIAorICBkYnVzX2ZyZWUgKHNlcnZlci0+YWRkcmVzcyk7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmVyLT5ndWlkX2hleCk7Cit9CisKKworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEFkZEZ1bmN0aW9uKSAgICAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoKTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzV2F0Y2hSZW1vdmVGdW5jdGlvbikgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoVG9nZ2xlRnVuY3Rpb24pICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGVuYWJsZWQpOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoQWRkRnVuY3Rpb24gICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoUmVtb3ZlRnVuY3Rpb24gcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlRnVuY3Rpb24gdG9nZ2xlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIC8qIFRoaXMgaXNuJ3QgcmVhbGx5IHNhZmUgb3IgcmVhc29uYWJsZTsgYSBiZXR0ZXIgcGF0dGVybiBpcyB0aGUgImRvCisgICAqIGV2ZXJ5dGhpbmcsIHRoZW4gZHJvcCBsb2NrIGFuZCBjYWxsIG91dCIgb25lOyBidXQgaXQgaGFzIHRvIGJlCisgICAqIHByb3BhZ2F0ZWQgdXAgdGhyb3VnaCBhbGwgY2FsbGVycworICAgKi8KKyAgCisgIHdhdGNoZXMgPSBzZXJ2ZXItPndhdGNoZXM7CisgIGlmICh3YXRjaGVzKQorICAgIHsKKyAgICAgIHNlcnZlci0+d2F0Y2hlcyA9IE5VTEw7CisgICAgICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChzZXJ2ZXIpOworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICAgICAgaWYgKGFkZF9mdW5jdGlvbikKKyAgICAgICAgcmV0dmFsID0gKCogYWRkX2Z1bmN0aW9uKSAod2F0Y2hlcywgd2F0Y2gpOworICAgICAgZWxzZSBpZiAocmVtb3ZlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pICh3YXRjaGVzLCB3YXRjaCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogdG9nZ2xlX2Z1bmN0aW9uKSAod2F0Y2hlcywgd2F0Y2gsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgICAKKyAgICAgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAgICAgc2VydmVyLT53YXRjaGVzID0gd2F0Y2hlczsKKyAgICAgIF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCAoc2VydmVyKTsKKworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQWRkcyBhIHdhdGNoIGZvciB0aGlzIHNlcnZlciwgY2hhaW5pbmcgb3V0IHRvIGFwcGxpY2F0aW9uLXByb3ZpZGVkCisgKiB3YXRjaCBoYW5kbGVycy4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIGFkZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NlcnZlcl9hZGRfd2F0Y2ggKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgKndhdGNoKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisgIHJldHVybiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChzZXJ2ZXIsIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHdhdGNoIHByZXZpb3VzbHkgYWRkZWQgd2l0aCBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoKCkuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byByZW1vdmUuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9yZW1vdmVfd2F0Y2ggIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAqd2F0Y2gpCit7CisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKyAgcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoc2VydmVyLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9yZW1vdmVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEZBTFNFKTsKK30KKworLyoqCisgKiBUb2dnbGVzIGEgd2F0Y2ggYW5kIG5vdGlmaWVzIGFwcCB2aWEgc2VydmVyJ3MKKyAqIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiBpZiBhdmFpbGFibGUuIEl0J3MgYW4gZXJyb3IgdG8gY2FsbCB0aGlzCisgKiBmdW5jdGlvbiBvbiBhIHdhdGNoIHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfdG9nZ2xlX3dhdGNoIChEQnVzU2VydmVyICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGVuYWJsZWQpCit7CisgIF9kYnVzX2Fzc2VydCAod2F0Y2ggIT0gTlVMTCk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChzZXJ2ZXIsIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3RvZ2dsZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7Cit9CisKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNUaW1lb3V0QWRkRnVuY3Rpb24pICAgIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRSZW1vdmVGdW5jdGlvbikgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzVGltZW91dFRvZ2dsZUZ1bmN0aW9uKSAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICBlbmFibGVkKTsKKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRBZGRGdW5jdGlvbiAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24gcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICBlbmFibGVkKQoreworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgLyogVGhpcyBpc24ndCByZWFsbHkgc2FmZSBvciByZWFzb25hYmxlOyBhIGJldHRlciBwYXR0ZXJuIGlzIHRoZSAiZG8gZXZlcnl0aGluZywgdGhlbgorICAgKiBkcm9wIGxvY2sgYW5kIGNhbGwgb3V0IiBvbmU7IGJ1dCBpdCBoYXMgdG8gYmUgcHJvcGFnYXRlZCB1cCB0aHJvdWdoIGFsbCBjYWxsZXJzCisgICAqLworICAKKyAgdGltZW91dHMgPSBzZXJ2ZXItPnRpbWVvdXRzOworICBpZiAodGltZW91dHMpCisgICAgeworICAgICAgc2VydmVyLT50aW1lb3V0cyA9IE5VTEw7CisgICAgICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChzZXJ2ZXIpOworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICAgICAgaWYgKGFkZF9mdW5jdGlvbikKKyAgICAgICAgcmV0dmFsID0gKCogYWRkX2Z1bmN0aW9uKSAodGltZW91dHMsIHRpbWVvdXQpOworICAgICAgZWxzZSBpZiAocmVtb3ZlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pICh0aW1lb3V0cywgdGltZW91dCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogdG9nZ2xlX2Z1bmN0aW9uKSAodGltZW91dHMsIHRpbWVvdXQsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgICAKKyAgICAgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAgICAgc2VydmVyLT50aW1lb3V0cyA9IHRpbWVvdXRzOworICAgICAgX2RidXNfc2VydmVyX3VucmVmX3VubG9ja2VkIChzZXJ2ZXIpOworCisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBZGRzIGEgdGltZW91dCBmb3IgdGhpcyBzZXJ2ZXIsIGNoYWluaW5nIG91dCB0bworICogYXBwbGljYXRpb24tcHJvdmlkZWQgdGltZW91dCBoYW5kbGVycy4gVGhlIHRpbWVvdXQgc2hvdWxkIGJlCisgKiByZXBlYXRlZGx5IGhhbmRsZWQgd2l0aCBkYnVzX3RpbWVvdXRfaGFuZGxlKCkgYXQgaXRzIGdpdmVuIGludGVydmFsCisgKiB1bnRpbCBpdCBpcyByZW1vdmVkLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIGFkZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NlcnZlcl9hZGRfdGltZW91dCAoREJ1c1NlcnZlciAgKnNlcnZlciwKKwkJCSAgREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIHJldHVybiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKHNlcnZlciwgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X2FkZF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHRpbWVvdXQgcHJldmlvdXNseSBhZGRlZCB3aXRoIF9kYnVzX3NlcnZlcl9hZGRfdGltZW91dCgpLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0IChEQnVzU2VydmVyICAqc2VydmVyLAorCQkJICAgICBEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChzZXJ2ZXIsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFRvZ2dsZXMgYSB0aW1lb3V0IGFuZCBub3RpZmllcyBhcHAgdmlhIHNlcnZlcidzCisgKiBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiBpZiBhdmFpbGFibGUuIEl0J3MgYW4gZXJyb3IgdG8gY2FsbCB0aGlzCisgKiBmdW5jdGlvbiBvbiBhIHRpbWVvdXQgdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfdG9nZ2xlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgZW5hYmxlZCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChzZXJ2ZXIsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7Cit9CisKKworLyoqCisgKiBMaWtlIGRidXNfc2VydmVyX3JlZigpIGJ1dCBkb2VzIG5vdCBhY3F1aXJlIHRoZSBsb2NrIChtdXN0IGFscmVhZHkgYmUgaGVsZCkKKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc2VydmVyLT5yZWZjb3VudC52YWx1ZSA+IDApOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisjaWZkZWYgREJVU19IQVZFX0FUT01JQ19JTlQKKyAgX2RidXNfYXRvbWljX2luYyAoJnNlcnZlci0+cmVmY291bnQpOworI2Vsc2UKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnJlZmNvdW50LnZhbHVlID4gMCk7CisKKyAgc2VydmVyLT5yZWZjb3VudC52YWx1ZSArPSAxOworI2VuZGlmCit9CisKKy8qKgorICogTGlrZSBkYnVzX3NlcnZlcl91bnJlZigpIGJ1dCBkb2VzIG5vdCBhY3F1aXJlIHRoZSBsb2NrIChtdXN0IGFscmVhZHkgYmUgaGVsZCkKKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBkYnVzX2Jvb2xfdCBsYXN0X3VucmVmOworCisgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggZGJ1c19zZXJ2ZXJfdW5yZWYgKi8KKyAgCisgIF9kYnVzX2Fzc2VydCAoc2VydmVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+cmVmY291bnQudmFsdWUgPiAwKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisgIAorI2lmZGVmIERCVVNfSEFWRV9BVE9NSUNfSU5UCisgIGxhc3RfdW5yZWYgPSAoX2RidXNfYXRvbWljX2RlYyAoJnNlcnZlci0+cmVmY291bnQpID09IDEpOworI2Vsc2UKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnJlZmNvdW50LnZhbHVlID4gMCk7CisKKyAgc2VydmVyLT5yZWZjb3VudC52YWx1ZSAtPSAxOworICBsYXN0X3VucmVmID0gKHNlcnZlci0+cmVmY291bnQudmFsdWUgPT0gMCk7CisjZW5kaWYKKyAgCisgIGlmIChsYXN0X3VucmVmKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyLT5kaXNjb25uZWN0ZWQpOworICAgICAgCisgICAgICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+dnRhYmxlLT5maW5hbGl6ZSAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgKCogc2VydmVyLT52dGFibGUtPmZpbmFsaXplKSAoc2VydmVyKTsKKyAgICB9Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTZXJ2ZXIKKyAqCisgKiBAeworICovCisKKworLyoqCisgKiBAdHlwZWRlZiBEQnVzU2VydmVyCisgKgorICogQW4gb3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBzZXJ2ZXIgdGhhdCBsaXN0ZW5zIGZvcgorICogY29ubmVjdGlvbnMgZnJvbSBvdGhlciBhcHBsaWNhdGlvbnMuIEVhY2ggdGltZSBhIGNvbm5lY3Rpb24KKyAqIGlzIG1hZGUsIGEgbmV3IERCdXNDb25uZWN0aW9uIGlzIGNyZWF0ZWQgYW5kIG1hZGUgYXZhaWxhYmxlCisgKiB2aWEgYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbi4KKyAqIFRoZSBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGgKKyAqIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbigpLgorICogCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIERCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQgKCogZnVuYykgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworfSBsaXN0ZW5fZnVuY3NbXSA9IHsKKyAgeyBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCB9CisgICwgeyBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljIH0KKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgICwgeyBfZGJ1c19zZXJ2ZXJfbGlzdGVuX2RlYnVnX3BpcGUgfQorI2VuZGlmCit9OworCisvKioKKyAqIExpc3RlbnMgZm9yIG5ldyBjb25uZWN0aW9ucyBvbiB0aGUgZ2l2ZW4gYWRkcmVzcy4gIElmIHRoZXJlIGFyZQorICogbXVsdGlwbGUgc2VtaWNvbG9uLXNlcGFyYXRlZCBhZGRyZXNzIGVudHJpZXMgaW4gdGhlIGFkZHJlc3MsIHRyaWVzCisgKiBlYWNoIG9uZSBhbmQgbGlzdGVucyBvbiB0aGUgZmlyc3Qgb25lIHRoYXQgd29ya3MuCisgKiAKKyAqIFJldHVybnMgI05VTEwgYW5kIHNldHMgZXJyb3IgaWYgbGlzdGVuaW5nIGZhaWxzIGZvciBhbnkgcmVhc29uLgorICogT3RoZXJ3aXNlIHJldHVybnMgYSBuZXcgI0RCdXNTZXJ2ZXIuCisgKiBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24oKSwKKyAqIGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMoKSwgYW5kCisgKiBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IHRvCisgKiByZW5kZXIgdGhlIHNlcnZlciBmdWxseSBmdW5jdGlvbmFsLgorICoKKyAqIFRvIGZyZWUgdGhlIHNlcnZlciwgYXBwbGljYXRpb25zIG11c3QgY2FsbCBmaXJzdAorICogZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCgpIGFuZCB0aGVuIGRidXNfc2VydmVyX3VucmVmKCkuCisgKiAKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoaXMgc2VydmVyLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIGEgbmV3ICNEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogCisgKi8KK0RCdXNTZXJ2ZXIqCitkYnVzX3NlcnZlcl9saXN0ZW4gKGNvbnN0IGNoYXIgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJpZXM7CisgIGludCBsZW4sIGk7CisgIERCdXNFcnJvciBmaXJzdF9jb25uZWN0X2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICBkYnVzX2Jvb2xfdCBoYW5kbGVkX29uY2U7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFkZHJlc3MgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisgIAorICBpZiAoIWRidXNfcGFyc2VfYWRkcmVzcyAoYWRkcmVzcywgJmVudHJpZXMsICZsZW4sIGVycm9yKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBzZXJ2ZXIgPSBOVUxMOworICBoYW5kbGVkX29uY2UgPSBGQUxTRTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgaW50IGo7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCAoaW50KSBfREJVU19OX0VMRU1FTlRTIChsaXN0ZW5fZnVuY3MpOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU2VydmVyTGlzdGVuUmVzdWx0IHJlc3VsdDsKKyAgICAgICAgICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworCisgICAgICAgICAgcmVzdWx0ID0gKCogbGlzdGVuX2Z1bmNzW2pdLmZ1bmMpIChlbnRyaWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpOworCisgICAgICAgICAgaWYgKHJlc3VsdCA9PSBEQlVTX1NFUlZFUl9MSVNURU5fT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyICE9IE5VTEwpOworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICBoYW5kbGVkX29uY2UgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX0FERFJFU1NfQUxSRUFEWV9VU0VEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0FERFJFU1NfSU5fVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAiQWRkcmVzcyAnJXMnIGFscmVhZHkgdXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyaWVzWzBdKSk7CisgICAgICAgICAgICAgIGhhbmRsZWRfb25jZSA9IFRSVUU7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyID09IE5VTEwpOworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgIGhhbmRsZWRfb25jZSA9IFRSVUU7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyID09IE5VTEwpOworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworCisgICAgICAgICAgICAgIC8qIGtlZXAgdHJ5aW5nIGFkZHJlc3NlcyAqLworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAgICAgICAgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZmaXJzdF9jb25uZWN0X2Vycm9yKSkKKyAgICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsICZmaXJzdF9jb25uZWN0X2Vycm9yKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisKKyAgICAgICAgICAgICAgaGFuZGxlZF9vbmNlID0gVFJVRTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIGtlZXAgdHJ5aW5nIGFkZHJlc3NlcyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyID09IE5VTEwpOworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgfQorCisgb3V0OgorCisgIGlmICghaGFuZGxlZF9vbmNlKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gYWRkcmVzcyB0eXBlICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cmllc1swXSkpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IGFkZHJlc3MgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisgIAorICBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlIChlbnRyaWVzKTsKKworICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChlcnJvciA9PSBOVUxMIHx8IGRidXNfZXJyb3JfaXNfc2V0ICgmZmlyc3RfY29ubmVjdF9lcnJvcikgfHwKKyAgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKTsKKyAgICAgIAorICAgICAgaWYgKGVycm9yICYmIGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBhbHJlYWR5IHNldCB0aGUgZXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogZGlkbid0IHNldCB0aGUgZXJyb3IgYnV0IGVpdGhlciBlcnJvciBzaG91bGQgYmUKKyAgICAgICAgICAgKiBOVUxMIG9yIGZpcnN0X2Nvbm5lY3RfZXJyb3Igc2hvdWxkIGJlIHNldC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGVycm9yID09IE5VTEwgfHwgZGJ1c19lcnJvcl9pc19zZXQgKCZmaXJzdF9jb25uZWN0X2Vycm9yKSk7CisgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmZmlyc3RfY29ubmVjdF9lcnJvciwgZXJyb3IpOworICAgICAgICB9CisKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJmZpcnN0X2Nvbm5lY3RfZXJyb3IpOyAvKiBiZSBzdXJlIHdlIGZyZWVkIGl0ICovCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1NlcnZlci4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcmV0dXJucyB0aGUgc2VydmVyCisgKi8KK0RCdXNTZXJ2ZXIgKgorZGJ1c19zZXJ2ZXJfcmVmIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlci0+cmVmY291bnQudmFsdWUgPiAwLCBOVUxMKTsKKworI2lmZGVmIERCVVNfSEFWRV9BVE9NSUNfSU5UCisgIF9kYnVzX2F0b21pY19pbmMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyNlbHNlCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+cmVmY291bnQudmFsdWUgPiAwKTsKKworICBzZXJ2ZXItPnJlZmNvdW50LnZhbHVlICs9IDE7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisjZW5kaWYKKworICByZXR1cm4gc2VydmVyOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNTZXJ2ZXIuICBGaW5hbGl6ZXMgdGhlCisgKiBzZXJ2ZXIgaWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogVGhlIHNlcnZlciBtdXN0IGJlIGRpc2Nvbm5lY3RlZCBiZWZvcmUgdGhlIHJlZmNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK2RidXNfc2VydmVyX3VucmVmIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGRidXNfYm9vbF90IGxhc3RfdW5yZWY7CisKKyAgLyoga2VlcCB0aGlzIGluIHN5bmMgd2l0aCB1bnJlZl91bmxvY2tlZCAqLworICAKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHNlcnZlci0+cmVmY291bnQudmFsdWUgPiAwKTsKKworI2lmZGVmIERCVVNfSEFWRV9BVE9NSUNfSU5UCisgIGxhc3RfdW5yZWYgPSAoX2RidXNfYXRvbWljX2RlYyAoJnNlcnZlci0+cmVmY291bnQpID09IDEpOworI2Vsc2UKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIAorICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+cmVmY291bnQudmFsdWUgPiAwKTsKKworICBzZXJ2ZXItPnJlZmNvdW50LnZhbHVlIC09IDE7CisgIGxhc3RfdW5yZWYgPSAoc2VydmVyLT5yZWZjb3VudC52YWx1ZSA9PSAwKTsKKyAgCisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisjZW5kaWYKKyAgCisgIGlmIChsYXN0X3VucmVmKQorICAgIHsKKyAgICAgIC8qIGxvY2sgbm90IGhlbGQhICovCisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+ZGlzY29ubmVjdGVkKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnZ0YWJsZS0+ZmluYWxpemUgIT0gTlVMTCk7CisgICAgICAKKyAgICAgICgqIHNlcnZlci0+dnRhYmxlLT5maW5hbGl6ZSkgKHNlcnZlcik7CisgICAgfQorfQorCisvKioKKyAqIFJlbGVhc2VzIHRoZSBzZXJ2ZXIncyBhZGRyZXNzIGFuZCBzdG9wcyBsaXN0ZW5pbmcgZm9yCisgKiBuZXcgY2xpZW50cy4gSWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBvbmx5IHRoZSBmaXJzdAorICogY2FsbCBoYXMgYW4gZWZmZWN0LiBEb2VzIG5vdCBtb2RpZnkgdGhlIHNlcnZlcidzCisgKiByZWZlcmVuY2UgY291bnQuCisgKiAKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqLwordm9pZAorZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyLT5yZWZjb3VudC52YWx1ZSA+IDApOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChzZXJ2ZXIpOworICAKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnZ0YWJsZS0+ZGlzY29ubmVjdCAhPSBOVUxMKTsKKworICBpZiAoIXNlcnZlci0+ZGlzY29ubmVjdGVkKQorICAgIHsKKyAgICAgIC8qIHRoaXMgaGFzIHRvIGJlIGZpcnN0IHNvIHJlY3Vyc2l2ZSBjYWxscyB0byBkaXNjb25uZWN0IGRvbid0IGhhcHBlbiAqLworICAgICAgc2VydmVyLT5kaXNjb25uZWN0ZWQgPSBUUlVFOworICAgICAgCisgICAgICAoKiBzZXJ2ZXItPnZ0YWJsZS0+ZGlzY29ubmVjdCkgKHNlcnZlcik7CisgICAgfQorCisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgIGRidXNfc2VydmVyX3VucmVmIChzZXJ2ZXIpOworfQorCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIHNlcnZlciBpcyBzdGlsbCBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NlcnZlcl9nZXRfaXNfY29ubmVjdGVkIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIEZBTFNFKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgcmV0dmFsID0gIXNlcnZlci0+ZGlzY29ubmVjdGVkOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VydmVyLCBhcyBhIG5ld2x5LWFsbG9jYXRlZAorICogc3RyaW5nIHdoaWNoIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKyAqIEByZXR1cm5zIHRoZSBhZGRyZXNzIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitjaGFyKgorZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgY2hhciAqcmV0dmFsOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgTlVMTCk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIHJldHZhbCA9IF9kYnVzX3N0cmR1cCAoc2VydmVyLT5hZGRyZXNzKTsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgc2VydmVyLCBhcyBhIG5ld2x5LWFsbG9jYXRlZAorICogc3RyaW5nIHdoaWNoIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBJRCBpcworICogbm9ybWFsbHkgdXNlZCBieSBjbGllbnRzIHRvIHRlbGwgd2hlbiB0d28gI0RCdXNDb25uZWN0aW9uCisgKiB3b3VsZCBiZSBlcXVpdmFsZW50IChiZWNhdXNlIHRoZSBzZXJ2ZXIgYWRkcmVzcyBwYXNzZWQKKyAqIHRvIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgd2lsbCBoYXZlIHRoZSBzYW1lIGd1aWQgaW4gdGhlCisgKiB0d28gY2FzZXMpLiBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGNhbiByZS11c2UgYW4gZXhpc3RpbmcKKyAqIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2FtZSBJRCBpbnN0ZWFkIG9mIG9wZW5pbmcgYSBuZXcKKyAqIGNvbm5lY3Rpb24uCisgKgorICogVGhpcyBpcyBhbiBJRCB1bmlxdWUgdG8gZWFjaCAjREJ1c1NlcnZlci4gUmVtZW1iZXIgdGhhdAorICogYSAjREJ1c1NlcnZlciByZXByZXNlbnRzIG9ubHkgb25lIG1vZGUgb2YgY29ubmVjdGluZywKKyAqIHNvIGUuZy4gYSBidXMgZGFlbW9uIGNhbiBsaXN0ZW4gb24gbXVsdGlwbGUgYWRkcmVzc2VzCisgKiB3aGljaCB3aWxsIG1lYW4gaXQgaGFzIG11bHRpcGxlICNEQnVzU2VydmVyIGVhY2ggd2l0aAorICogdGhlaXIgb3duIElELgorICoKKyAqIFRoZSBJRCBpcyBub3QgYSBVVUlEIGluIHRoZSBzZW5zZSBvZiBSRkM0MTIyOyB0aGUgZGV0YWlscworICogYXJlIGV4cGxhaW5lZCBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKyAqIEByZXR1cm5zIHRoZSBpZCBvZiB0aGUgc2VydmVyIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitjaGFyKgorZGJ1c19zZXJ2ZXJfZ2V0X2lkIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGNoYXIgKnJldHZhbDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIE5VTEwpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICByZXR2YWwgPSBOVUxMOworICBfZGJ1c19zdHJpbmdfY29weV9kYXRhICgmc2VydmVyLT5ndWlkX2hleCwgJnJldHZhbCk7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZXRzIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgaGFuZGxpbmcgbmV3IGNvbm5lY3Rpb25zLiAgVGhlIGdpdmVuCisgKiBmdW5jdGlvbiBpcyBwYXNzZWQgZWFjaCBuZXcgY29ubmVjdGlvbiBhcyB0aGUgY29ubmVjdGlvbiBpcworICogY3JlYXRlZC4gSWYgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGNvbm5lY3Rpb24ncworICogcmVmZXJlbmNlIGNvdW50LCB0aGUgY29ubmVjdGlvbiB3aWxsIHN0YXkgYWxpdmUuIE90aGVyd2lzZSwgdGhlCisgKiBjb25uZWN0aW9uIHdpbGwgYmUgdW5yZWZlcmVuY2VkIGFuZCBjbG9zZWQuIFRoZSBuZXcgY29ubmVjdGlvbgorICogZnVuY3Rpb24gbWF5IGFsc28gY2xvc2UgdGhlIGNvbm5lY3Rpb24gaXRzZWxmLCB3aGljaCBpcyBjb25zaWRlcmVkCisgKiBnb29kIGZvcm0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IHdhbnRlZC4KKyAqCisgKiBUaGUgY29ubmVjdGlvbiBoZXJlIGlzIHByaXZhdGUgaW4gdGhlIHNlbnNlIG9mCisgKiBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCksIHNvIGlmIHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbgorICoga2VlcHMgYSByZWZlcmVuY2UgaXQgbXVzdCBhcnJhbmdlIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBjbG9zZWQuCisgKiBpLmUuIGxpYmRidXMgZG9lcyBub3Qgb3duIHRoaXMgY29ubmVjdGlvbiBvbmNlIHRoZSBuZXcgY29ubmVjdGlvbgorICogZnVuY3Rpb24gdGFrZXMgYSByZWZlcmVuY2UuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIGZ1bmN0aW9uIGEgZnVuY3Rpb24gdG8gaGFuZGxlIG5ldyBjb25uZWN0aW9ucy4KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgbmV3IGNvbm5lY3Rpb24gaGFuZGxlci4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gZnJlZSB0aGUgZGF0YS4KKyAqLwordm9pZAorZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuY3Rpb247CisgIHZvaWQgKm9sZF9kYXRhOworICAKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgb2xkX2ZyZWVfZnVuY3Rpb24gPSBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2ZyZWVfZGF0YV9mdW5jdGlvbjsKKyAgb2xkX2RhdGEgPSBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2RhdGE7CisgIAorICBzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZGF0YSA9IGRhdGE7CisgIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZnJlZV9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAgIAorICBpZiAob2xkX2ZyZWVfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiBvbGRfZnJlZV9mdW5jdGlvbikgKG9sZF9kYXRhKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSB3YXRjaCBmdW5jdGlvbnMgZm9yIHRoZSBzZXJ2ZXIuIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiBsb29wIGF3YXJlIG9mIGZpbGUKKyAqIGRlc2NyaXB0b3JzIHRoYXQgbmVlZCB0byBiZSBtb25pdG9yZWQgZm9yIGV2ZW50cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCk7CisgKiBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcm91dGluZS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlZ2luIG1vbml0b3JpbmcgYSBuZXcgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gc3RvcCBtb25pdG9yaW5nIGEgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIG5vdGlmeSB3aGVuIHRoZSB3YXRjaCBpcyBlbmFibGVkL2Rpc2FibGVkCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBGQUxTRSk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIHdhdGNoZXMgPSBzZXJ2ZXItPndhdGNoZXM7CisgIHNlcnZlci0+d2F0Y2hlcyA9IE5VTEw7CisgIGlmICh3YXRjaGVzKQorICAgIHsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXN1bHQgPSBfZGJ1c193YXRjaF9saXN0X3NldF9mdW5jdGlvbnMgKHdhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworICAgICAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJSZS1lbnRyYW50IGNhbGwgdG8gJXNcbiIsIF9EQlVTX0ZVTkNUSU9OX05BTUUpOworICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfQorICBzZXJ2ZXItPndhdGNoZXMgPSB3YXRjaGVzOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBTZXRzIHRoZSB0aW1lb3V0IGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZlci4gVGhlc2UgZnVuY3Rpb25zIGFyZQorICogcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgYXBwbGljYXRpb24ncyBtYWluIGxvb3AgYXdhcmUgb2YgdGltZW91dHMuCisgKgorICogVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCk7CisgKiBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcm91dGluZS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGFkZCBhIHRpbWVvdXQuCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVvdXQuCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBub3RpZnkgd2hlbiB0aGUgdGltZW91dCBpcyBlbmFibGVkL2Rpc2FibGVkCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICAqc2VydmVyLAorCQkJCSAgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKwkJCQkgICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisJCQkJICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0czsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIEZBTFNFKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgdGltZW91dHMgPSBzZXJ2ZXItPnRpbWVvdXRzOworICBzZXJ2ZXItPnRpbWVvdXRzID0gTlVMTDsKKyAgaWYgKHRpbWVvdXRzKQorICAgIHsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXN1bHQgPSBfZGJ1c190aW1lb3V0X2xpc3Rfc2V0X2Z1bmN0aW9ucyAodGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKyAgICAgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiUmUtZW50cmFudCBjYWxsIHRvICVzXG4iLCBfREJVU19GVU5DVElPTl9OQU1FKTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0KKyAgc2VydmVyLT50aW1lb3V0cyA9IHRpbWVvdXRzOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBTZXRzIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHRoYXQgdGhpcyBzZXJ2ZXIgb2ZmZXJzIHRvCisgKiBjbGllbnRzLCBhcyBhICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWVjaGFuaXNtIG5hbWVzLiBUaGlzCisgKiBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgY29ubmVjdGlvbnMgY3JlYXRlZCA8ZW0+YWZ0ZXI8L2VtPiBpdCBpcworICogY2FsbGVkLiAgUGFzcyAjTlVMTCBpbnN0ZWFkIG9mIGFuIGFycmF5IHRvIHVzZSBhbGwgYXZhaWxhYmxlCisgKiBtZWNoYW5pc21zICh0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4KKyAqCisgKiBUaGUgRC1CdXMgc3BlY2lmaWNhdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aGUgc3VwcG9ydGVkIG1lY2hhbmlzbXMuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCisgKiBAcGFyYW0gbWVjaGFuaXNtcyAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIG1lY2hhbmlzbXMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMgKERCdXNTZXJ2ZXIgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbWVjaGFuaXNtcykKK3sKKyAgY2hhciAqKmNvcHk7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAKKyAgaWYgKG1lY2hhbmlzbXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb3B5ID0gX2RidXNfZHVwX3N0cmluZ19hcnJheSAobWVjaGFuaXNtcyk7CisgICAgICBpZiAoY29weSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgY29weSA9IE5VTEw7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpOworICBzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcyA9IGNvcHk7CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBEQnVzRGF0YVNsb3RBbGxvY2F0b3Igc2xvdF9hbGxvY2F0b3I7CitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKHNlcnZlcl9zbG90cyk7CisKKy8qKgorICogQWxsb2NhdGVzIGFuIGludGVnZXIgSUQgdG8gYmUgdXNlZCBmb3Igc3RvcmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYworICogZGF0YSBvbiBhbnkgREJ1c1NlcnZlci4gVGhlIGFsbG9jYXRlZCBJRCBtYXkgdGhlbiBiZSB1c2VkCisgKiB3aXRoIGRidXNfc2VydmVyX3NldF9kYXRhKCkgYW5kIGRidXNfc2VydmVyX2dldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggLTEuIElmIGEgbm9ubmVnYXRpdmUKKyAqIHNsb3QgaXMgcGFzc2VkIGluLCB0aGUgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQgb24gdGhhdAorICogc2xvdCwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgc2xvdC4KKyAqICAKKyAqIFRoZSBhbGxvY2F0ZWQgc2xvdCBpcyBnbG9iYWwsIGkuZS4gYWxsIERCdXNTZXJ2ZXIgb2JqZWN0cyB3aWxsIGhhdmUKKyAqIGEgc2xvdCB3aXRoIHRoZSBnaXZlbiBpbnRlZ2VyIElEIHJlc2VydmVkLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBvZiBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgc2xvdCBJRAorICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgKnNsb3RfcCkKK3sKKyAgcmV0dXJuIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzTXV0ZXggKiopJl9EQlVTX0xPQ0tfTkFNRSAoc2VydmVyX3Nsb3RzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RfcCk7Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYSBnbG9iYWwgSUQgZm9yIHNlcnZlciBkYXRhIHNsb3RzLgorICogZGJ1c19zZXJ2ZXJfZ2V0X2RhdGEoKSBhbmQgZGJ1c19zZXJ2ZXJfc2V0X2RhdGEoKQorICogbWF5IG5vIGxvbmdlciBiZSB1c2VkIHdpdGggdGhpcyBzbG90LgorICogRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24gZXhpc3RpbmcgREJ1c1NlcnZlciBvYmplY3RzCisgKiB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIHNlcnZlciBpcyBmaW5hbGl6ZWQsCisgKiBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZSByZXBsYWNlZAorICogaWYgc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgdGhlIHNsb3QgdG8gZGVhbGxvY2F0ZQorICovCit2b2lkCitkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgqc2xvdF9wID49IDApOworICAKKyAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmc2xvdF9hbGxvY2F0b3IsIHNsb3RfcCk7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhIERCdXNTZXJ2ZXIsIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgc2VydmVyIGlzIGZpbmFsaXplZC4gVGhlIHNsb3QgbnVtYmVyCisgKiBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfc2V0X2RhdGEgKERCdXNTZXJ2ZXIgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBGQUxTRSk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIAorICByZXR2YWwgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSk7CisKKworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICAvKiBEbyB0aGUgYWN0dWFsIGZyZWUgb3V0c2lkZSB0aGUgc2VydmVyIGxvY2sgKi8KKyAgICAgIGlmIChvbGRfZnJlZV9mdW5jKQorICAgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHJpZXZlcyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c19zZXJ2ZXJfc2V0X2RhdGEoKS4KKyAqIFRoZSBzbG90IG11c3Qgc3RpbGwgYmUgYWxsb2NhdGVkIChtdXN0IG5vdCBoYXZlIGJlZW4gZnJlZWQpLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19zZXJ2ZXJfZ2V0X2RhdGEgKERCdXNTZXJ2ZXIgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgc2xvdCkKK3sKKyAgdm9pZCAqcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIE5VTEwpOworICAKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIAorICByZXMgPSBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCk7CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiByZXM7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitkYnVzX2Jvb2xfdAorX2RidXNfc2VydmVyX3Rlc3QgKHZvaWQpCit7CisgIGNvbnN0IGNoYXIgKnZhbGlkX2FkZHJlc3Nlc1tdID0geworICAgICJ0Y3A6cG9ydD0xMjM0IiwKKyAgICAidGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MTIzNCIsCisgICAgInRjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTEyMzQ7dGNwOnBvcnQ9NTY3OCIsCisjaWZkZWYgREJVU19VTklYCisgICAgInVuaXg6cGF0aD0uL2Jvb2dpZSIsCisgICAgInRjcDpwb3J0PTEyMzQ7dW5peDpwYXRoPS4vYm9vZ2llIiwKKyNlbmRpZgorICB9OworCisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgaW50IGk7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfYWRkcmVzc2VzKTsgaSsrKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICBjaGFyICppZDsKKworICAgICAgc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuICh2YWxpZF9hZGRyZXNzZXNbaV0sICZlcnJvcik7CisgICAgICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgic2VydmVyIGxpc3RlbiBlcnJvcjogJXM6ICVzXG4iLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRmFpbGVkIHRvIGxpc3RlbiBmb3IgdmFsaWQgYWRkcmVzcy4iKTsKKyAgICAgICAgfQorCisgICAgICBpZCA9IGRidXNfc2VydmVyX2dldF9pZCAoc2VydmVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaWQgIT0gTlVMTCk7CisgICAgICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKHNlcnZlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgICAgIGlmIChzdHJzdHIgKGFkZHJlc3MsIGlkKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoInNlcnZlciBpZCAnJXMnIGlzIG5vdCBpbiB0aGUgc2VydmVyIGFkZHJlc3MgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpZCwgYWRkcmVzcyk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYmFkIHNlcnZlciBpZCBvciBhZGRyZXNzIik7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChpZCk7CisgICAgICBkYnVzX2ZyZWUgKGFkZHJlc3MpOworICAgICAgCisgICAgICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChzZXJ2ZXIpOworICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKHNlcnZlcik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmVmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2VydmVyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXIuaCBEQnVzU2VydmVyIG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1NFUlZFUl9ICisjZGVmaW5lIERCVVNfU0VSVkVSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2VydmVyCisgKiBAeworICovCisKK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXIgREJ1c1NlcnZlcjsKKworLyoqIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBpcyBhdmFpbGFibGUuIE11c3QgcmVmZXJlbmNlIGFuZCBzYXZlIHRoZSBuZXcKKyAqIGNvbm5lY3Rpb24sIG9yIGNsb3NlIHRoZSBuZXcgY29ubmVjdGlvbi4gU2V0IHdpdGggZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKiBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uKSAoREJ1c1NlcnZlciAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisKK0RCVVNfRVhQT1JUCitEQnVzU2VydmVyKiBkYnVzX3NlcnZlcl9saXN0ZW4gICAgICAgICAgIChjb25zdCBjaGFyICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c1NlcnZlciogZGJ1c19zZXJ2ZXJfcmVmICAgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfZ2V0X2lzX2Nvbm5lY3RlZCAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2lkICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcyAgICAgICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAqKm1lY2hhbmlzbXMpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICAgICAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfZGF0YSAgICAgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfc2VydmVyX2dldF9kYXRhICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzbG90KTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2hhLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2hhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4Mjc1MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zaGEuYwpAQCAtMCwwICsxLDk2OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNoYS5jIFNIQS0xIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk1IEEuIE0uIEt1Y2hsaW5nCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNoYS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIiAvKiBmb3IgYnl0ZXN3YXAgcm91dGluZXMgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogVGhlIGZvbGxvd2luZyBjb21tZW50cyBoYXZlIHRoZSBoaXN0b3J5IG9mIHdoZXJlIHRoaXMgY29kZQorICogY29tZXMgZnJvbS4gSSBhY3R1YWxseSBjb3BpZWQgaXQgZnJvbSBHTmV0IGluIEdOT01FIENWUy4KKyAqIC0gaHBAcmVkaGF0LmNvbQorICovCisKKy8qCisgKiAgc2hhLmggOiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtCisgKgorICogUGFydCBvZiB0aGUgUHl0aG9uIENyeXB0b2dyYXBoeSBUb29sa2l0LCB2ZXJzaW9uIDEuMC4wCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCBBLk0uIEt1Y2hsaW5nCisgKgorICogRGlzdHJpYnV0ZSBhbmQgdXNlIGZyZWVseTsgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBmdXJ0aGVyCisgKiBkaXNzZW1pbmF0aW9uIGFuZCB1c2FnZSBleGNlcHQgdGhvc2UgaW1wb3NlZCBieSB0aGUgbGF3cyBvZiB5b3VyCisgKiBjb3VudHJ5IG9mIHJlc2lkZW5jZS4KKyAqCisgKi8KKworLyogU0hBOiBOSVNUJ3MgU2VjdXJlIEhhc2ggQWxnb3JpdGhtICovCisKKy8qIEJhc2VkIG9uIFNIQSBjb2RlIG9yaWdpbmFsbHkgcG9zdGVkIHRvIHNjaS5jcnlwdCBieSBQZXRlciBHdXRtYW5uCisgICBpbiBtZXNzYWdlIDwzMGFqbzUkb2U4QGNjdTIuYXVja2xhbmQuYWMubno+LgorICAgTW9kaWZpZWQgdG8gdGVzdCBmb3IgZW5kaWFubmVzcyBvbiBjcmVhdGlvbiBvZiBTSEEgb2JqZWN0cyBieSBBTUsuCisgICBBbHNvLCB0aGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBvZiBTSEEgd2FzIGZvdW5kIHRvIGhhdmUgYSB3ZWFrbmVzcworICAgYnkgTlNBL05JU1QuICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgZml4ZWQgdmVyc2lvbiBvZiBTSEEuCisqLworCisvKiBIZXJlJ3MgdGhlIGZpcnN0IHBhcmFncmFwaCBvZiBQZXRlciBHdXRtYW5uJ3MgcG9zdGluZzoKKworVGhlIGZvbGxvd2luZyBpcyBteSBTSEEgKEZJUFMgMTgwKSBjb2RlIHVwZGF0ZWQgdG8gYWxsb3cgdXNlIG9mIHRoZSAiZml4ZWQiCitTSEEsIHRoYW5rcyB0byBKaW0gR2lsbG9nbHkgYW5kIGFuIGFub255bW91cyBjb250cmlidXRvciBmb3IgdGhlIGluZm9ybWF0aW9uIG9uCit3aGF0J3MgY2hhbmdlZCBpbiB0aGUgbmV3IHZlcnNpb24uICBUaGUgZml4IGlzIGEgc2ltcGxlIGNoYW5nZSB3aGljaCBpbnZvbHZlcworYWRkaW5nIGEgc2luZ2xlIHJvdGF0ZSBpbiB0aGUgaW5pdGlhbCBleHBhbnNpb24gZnVuY3Rpb24uICBJdCBpcyB1bmtub3duCit3aGV0aGVyIHRoaXMgaXMgYW4gb3B0aW1hbCBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSB3aGljaCB3YXMgZGlzY292ZXJlZCBpbiB0aGUKK1NIQSBvciB3aGV0aGVyIGl0J3Mgc2ltcGx5IGEgYmFuZGFpZCB3aGljaCBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIGEgbWluaW11bSBvZgorZWZmb3J0IChmb3IgZXhhbXBsZSB0aGUgcmVlbmdpbmVlcmluZyBvZiBhIGdyZWF0IG1hbnkgQ2Fwc3RvbmUgY2hpcHMpLgorKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NIQSBTSEEgaW1wbGVtZW50YXRpb24KKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgU0hBLTEgaGFzaAorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb21wdXRpbmcgU0hBLTEgaGFzaC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU0hBSW50ZXJuYWxzIFNIQSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFscyBvZiBTSEEgaW1wbGVtZW50YXRpb24uCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIFNIQS0xIChzZWUgaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZmlwc3B1YnMvZmlwMTgwLTEuaHRtKS4KKyAqIFRoaXMgU0hBIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcKKyAqCisgKiBAeworICovCisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKKy8qIFRoZSBTSEEgYmxvY2sgc2l6ZSBhbmQgbWVzc2FnZSBkaWdlc3Qgc2l6ZXMsIGluIGJ5dGVzICovCisKKyNkZWZpbmUgU0hBX0RBVEFTSVpFICAgIDY0CisjZGVmaW5lIFNIQV9ESUdFU1RTSVpFICAyMAorCisvKiBUaGUgU0hBIGYoKS1mdW5jdGlvbnMuICBUaGUgZjEgYW5kIGYzIGZ1bmN0aW9ucyBjYW4gYmUgb3B0aW1pemVkIHRvCisgICBzYXZlIG9uZSBib29sZWFuIG9wZXJhdGlvbiBlYWNoIC0gdGhhbmtzIHRvIFJpY2ggU2Nocm9lcHBlbCwKKyAgIHJjc0Bjcy5hcml6b25hLmVkdSBmb3IgZGlzY292ZXJpbmcgdGhpcyAqLworCisvKiNkZWZpbmUgZjEoeCx5LHopICggKCB4ICYgeSApIHwgKCB+eCAmIHogKSApICAgICAgICAgIC8vIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMSh4LHkseikgICggeiBeICggeCAmICggeSBeIHogKSApICkgICAgICAgICAgIC8qIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMih4LHkseikgICggeCBeIHkgXiB6ICkgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyAyMC0zOSAqLworLyojZGVmaW5lIGYzKHgseSx6KSAoICggeCAmIHkgKSB8ICggeCAmIHogKSB8ICggeSAmIHogKSApICAgLy8gUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIGYzKHgseSx6KSAgKCAoIHggJiB5ICkgfCAoIHogJiAoIHggfCB5ICkgKSApICAgLyogUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIGY0KHgseSx6KSAgKCB4IF4geSBeIHogKSAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDYwLTc5ICovCisKKy8qIFRoZSBTSEEgTXlzdGVyaW91cyBDb25zdGFudHMgKi8KKworI2RlZmluZSBLMSAgMHg1QTgyNzk5OUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgIDAtMTkgKi8KKyNkZWZpbmUgSzIgIDB4NkVEOUVCQTFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDIwLTM5ICovCisjZGVmaW5lIEszICAweDhGMUJCQ0RDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyA0MC01OSAqLworI2RlZmluZSBLNCAgMHhDQTYyQzFENkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgNjAtNzkgKi8KKworLyogU0hBIGluaXRpYWwgdmFsdWVzICovCisKKyNkZWZpbmUgaDBpbml0ICAweDY3NDUyMzAxTAorI2RlZmluZSBoMWluaXQgIDB4RUZDREFCODlMCisjZGVmaW5lIGgyaW5pdCAgMHg5OEJBRENGRUwKKyNkZWZpbmUgaDNpbml0ICAweDEwMzI1NDc2TAorI2RlZmluZSBoNGluaXQgIDB4QzNEMkUxRjBMCisKKy8qIE5vdGUgdGhhdCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGFkZCBwYXJlbnRoZXNlcyB0byB0aGVzZSBtYWNyb3MgaWYgdGhleQorICAgYXJlIHRvIGJlIGNhbGxlZCB3aXRoIGV4cHJlc3Npb25zIGFzIGFyZ3VtZW50cyAqLworLyogMzItYml0IHJvdGF0ZSBsZWZ0IC0ga2x1ZGdlZCB3aXRoIHNoaWZ0cyAqLworCisjZGVmaW5lIFJPVEwobixYKSAoICggKCBYICkgPDwgbiApIHwgKCAoIFggKSA+PiAoIDMyIC0gbiApICkgKQorCisvKiBUaGUgaW5pdGlhbCBleHBhbmRpbmcgZnVuY3Rpb24uICBUaGUgaGFzaCBmdW5jdGlvbiBpcyBkZWZpbmVkIG92ZXIgYW4KKyAgIDgwLXdvcmQgZXhwYW5kZWQgaW5wdXQgYXJyYXkgVywgd2hlcmUgdGhlIGZpcnN0IDE2IGFyZSBjb3BpZXMgb2YgdGhlIGlucHV0CisgICBkYXRhLCBhbmQgdGhlIHJlbWFpbmluZyA2NCBhcmUgZGVmaW5lZCBieQorCisgICAgICAgIFdbIGkgXSA9IFdbIGkgLSAxNiBdIF4gV1sgaSAtIDE0IF0gXiBXWyBpIC0gOCBdIF4gV1sgaSAtIDMgXQorCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGdlbmVyYXRlcyB0aGVzZSB2YWx1ZXMgb24gdGhlIGZseSBpbiBhIGNpcmN1bGFyCisgICBidWZmZXIgLSB0aGFua3MgdG8gQ29saW4gUGx1bWIsIGNvbGluQG55eDEwLmNzLmR1LmVkdSBmb3IgdGhpcworICAgb3B0aW1pemF0aW9uLgorCisgICBUaGUgdXBkYXRlZCBTSEEgY2hhbmdlcyB0aGUgZXhwYW5kaW5nIGZ1bmN0aW9uIGJ5IGFkZGluZyBhIHJvdGF0ZSBvZiAxCisgICBiaXQuICBUaGFua3MgdG8gSmltIEdpbGxvZ2x5LCBqaW1AcmFuZC5vcmcsIGFuZCBhbiBhbm9ueW1vdXMgY29udHJpYnV0b3IKKyAgIGZvciB0aGlzIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgZXhwYW5kKFcsaSkgKCBXWyBpICYgMTUgXSA9IFJPVEwoIDEsICggV1sgaSAmIDE1IF0gXiBXWyAoaSAtIDE0KSAmIDE1IF0gXiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1sgKGkgLSA4KSAmIDE1IF0gXiBXWyAoaSAtIDMpICYgMTUgXSApICkgKQorCisKKy8qIFRoZSBwcm90b3R5cGUgU0hBIHN1Yi1yb3VuZC4gIFRoZSBmdW5kYW1lbnRhbCBzdWItcm91bmQgaXM6CisKKyAgICAgICAgYScgPSBlICsgUk9UTCggNSwgYSApICsgZiggYiwgYywgZCApICsgayArIGRhdGE7CisgICAgICAgIGInID0gYTsKKyAgICAgICAgYycgPSBST1RMKCAzMCwgYiApOworICAgICAgICBkJyA9IGM7CisgICAgICAgIGUnID0gZDsKKworICAgYnV0IHRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdW5yb2xsaW5nIHRoZSBsb29wIDUgdGltZXMgYW5kIHJlbmFtaW5nIHRoZQorICAgdmFyaWFibGVzICggZSwgYSwgYiwgYywgZCApID0gKCBhJywgYicsIGMnLCBkJywgZScgKSBlYWNoIGl0ZXJhdGlvbi4KKyAgIFRoaXMgY29kZSBpcyB0aGVuIHJlcGxpY2F0ZWQgMjAgdGltZXMgZm9yIGVhY2ggb2YgdGhlIDQgZnVuY3Rpb25zLCB1c2luZworICAgdGhlIG5leHQgMjAgdmFsdWVzIGZyb20gdGhlIFdbXSBhcnJheSBlYWNoIHRpbWUgKi8KKworI2RlZmluZSBzdWJSb3VuZChhLCBiLCBjLCBkLCBlLCBmLCBrLCBkYXRhKSBcCisgICAoIGUgKz0gUk9UTCggNSwgYSApICsgZiggYiwgYywgZCApICsgayArIGRhdGEsIGIgPSBST1RMKCAzMCwgYiApICkKKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworLyogUGVyZm9ybSB0aGUgU0hBIHRyYW5zZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgY29kZSwgbGlrZSBNRDUsIHNlZW1zIHRvCisgICBicmVhayBzb21lIG9wdGltaXppbmcgY29tcGlsZXJzIGR1ZSB0byB0aGUgY29tcGxleGl0eSBvZiB0aGUgZXhwcmVzc2lvbnMKKyAgIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYmFzaWMgYmxvY2suICBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHNwbGl0IGl0IGludG8KKyAgIHNlY3Rpb25zLCBlLmcuIGJhc2VkIG9uIHRoZSBmb3VyIHN1YnJvdW5kcworCisgICBOb3RlIHRoYXQgdGhpcyBjb3JydXB0cyB0aGUgY29udGV4dC0+ZGF0YSBhcmVhICovCisKK3N0YXRpYyB2b2lkCitTSEFUcmFuc2Zvcm0oZGJ1c191aW50MzJfdCAqZGlnZXN0LCBkYnVzX3VpbnQzMl90ICpkYXRhKQoreworICBkYnVzX3VpbnQzMl90IEEsIEIsIEMsIEQsIEU7ICAgICAvKiBMb2NhbCB2YXJzICovCisgIGRidXNfdWludDMyX3QgZURhdGFbMTZdOyAgICAgICAvKiBFeHBhbmRlZCBkYXRhICovCisKKyAgLyogU2V0IHVwIGZpcnN0IGJ1ZmZlciBhbmQgbG9jYWwgZGF0YSBidWZmZXIgKi8KKyAgQSA9IGRpZ2VzdFswXTsKKyAgQiA9IGRpZ2VzdFsxXTsKKyAgQyA9IGRpZ2VzdFsyXTsKKyAgRCA9IGRpZ2VzdFszXTsKKyAgRSA9IGRpZ2VzdFs0XTsKKyAgbWVtbW92ZSAoZURhdGEsIGRhdGEsIFNIQV9EQVRBU0laRSk7CisKKyAgLyogSGVhdnkgbWFuZ2xpbmcsIGluIDQgc3ViLXJvdW5kcyBvZiAyMCBpbnRlcmF0aW9ucyBlYWNoLiAqLworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjEsIEsxLCBlRGF0YVswXSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGVEYXRhWzFdKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZURhdGFbMl0pOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjEsIEsxLCBlRGF0YVszXSk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGVEYXRhWzRdKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYxLCBLMSwgZURhdGFbNV0pOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjEsIEsxLCBlRGF0YVs2XSk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMSwgSzEsIGVEYXRhWzddKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYxLCBLMSwgZURhdGFbOF0pOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjEsIEsxLCBlRGF0YVs5XSk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMSwgSzEsIGVEYXRhWzEwXSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGVEYXRhWzExXSk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMSwgSzEsIGVEYXRhWzEyXSk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMSwgSzEsIGVEYXRhWzEzXSk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGVEYXRhWzE0XSk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMSwgSzEsIGVEYXRhWzE1XSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGV4cGFuZCAoIGVEYXRhLCAxNikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZXhwYW5kICggZURhdGEsIDE3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjEsIEsxLCBleHBhbmQgKCBlRGF0YSwgMTgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGV4cGFuZCAoIGVEYXRhLCAxOSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyMSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDIyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyNCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyNykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzMCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDMxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzMykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzNikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzOSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0MSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0NCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0NykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDUxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1OSkgKTsKKworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjApICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2MSkgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDYyKSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjMpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2NCkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY1KSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjYpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2NykgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY4KSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjkpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDcxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3OSkgKTsKKworICAvKiBCdWlsZCBtZXNzYWdlIGRpZ2VzdCAqLworICBkaWdlc3RbMF0gKz0gQTsKKyAgZGlnZXN0WzFdICs9IEI7CisgIGRpZ2VzdFsyXSArPSBDOworICBkaWdlc3RbM10gKz0gRDsKKyAgZGlnZXN0WzRdICs9IEU7Cit9CisKKy8qIFdoZW4gcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBDUFUgd2UgbmVlZCB0byBwZXJmb3JtIGJ5dGUgcmV2ZXJzYWwgb24gYW4KKyAgIGFycmF5IG9mIGxvbmd3b3Jkcy4gKi8KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBzd2FwX3dvcmRzKGJ1ZmZlciwgYnl0ZV9jb3VudCkKKyNlbHNlCitzdGF0aWMgdm9pZAorc3dhcF93b3JkcyAoZGJ1c191aW50MzJfdCAqYnVmZmVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgYnl0ZV9jb3VudCkKK3sKKyAgYnl0ZV9jb3VudCAvPSBzaXplb2YgKGRidXNfdWludDMyX3QpOworICB3aGlsZSAoYnl0ZV9jb3VudC0tKQorICAgIHsKKyAgICAgICpidWZmZXIgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqYnVmZmVyKTsKKyAgICAgICsrYnVmZmVyOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc2hhX2luaXQgKERCdXNTSEFDb250ZXh0ICpjb250ZXh0KQoreworICAvKiBTZXQgdGhlIGgtdmFycyB0byB0aGVpciBpbml0aWFsIHZhbHVlcyAqLworICBjb250ZXh0LT5kaWdlc3RbMF0gPSBoMGluaXQ7CisgIGNvbnRleHQtPmRpZ2VzdFsxXSA9IGgxaW5pdDsKKyAgY29udGV4dC0+ZGlnZXN0WzJdID0gaDJpbml0OworICBjb250ZXh0LT5kaWdlc3RbM10gPSBoM2luaXQ7CisgIGNvbnRleHQtPmRpZ2VzdFs0XSA9IGg0aW5pdDsKKworICAvKiBJbml0aWFsaXNlIGJpdCBjb3VudCAqLworICBjb250ZXh0LT5jb3VudF9sbyA9IGNvbnRleHQtPmNvdW50X2hpID0gMDsKK30KKworc3RhdGljIHZvaWQKK3NoYV9hcHBlbmQgKERCdXNTSEFDb250ZXh0ICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICBjb3VudCkKK3sKKyAgZGJ1c191aW50MzJfdCB0bXA7CisgIHVuc2lnbmVkIGludCBkYXRhQ291bnQ7CisKKyAgLyogVXBkYXRlIGJpdGNvdW50ICovCisgIHRtcCA9IGNvbnRleHQtPmNvdW50X2xvOworICBpZiAoKCBjb250ZXh0LT5jb3VudF9sbyA9IHRtcCArICggKCBkYnVzX3VpbnQzMl90KSBjb3VudCA8PCAzKSApIDwgdG1wKQorICAgIGNvbnRleHQtPmNvdW50X2hpKys7ICAgICAgICAgICAgIC8qIENhcnJ5IGZyb20gbG93IHRvIGhpZ2ggKi8KKyAgY29udGV4dC0+Y291bnRfaGkgKz0gY291bnQgPj4gMjk7CisKKyAgLyogR2V0IGNvdW50IG9mIGJ5dGVzIGFscmVhZHkgaW4gZGF0YSAqLworICBkYXRhQ291bnQgPSAoaW50KSAodG1wID4+IDMpICYgMHgzRjsKKworICAvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLworICBpZiAoZGF0YUNvdW50KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBjb250ZXh0LT5kYXRhICsgZGF0YUNvdW50OworCisgICAgICBkYXRhQ291bnQgPSBTSEFfREFUQVNJWkUgLSBkYXRhQ291bnQ7CisgICAgICBpZiAoY291bnQgPCBkYXRhQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICBtZW1tb3ZlIChwLCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIG1lbW1vdmUgKHAsIGJ1ZmZlciwgZGF0YUNvdW50KTsKKyAgICAgIHN3YXBfd29yZHMgKGNvbnRleHQtPmRhdGEsIFNIQV9EQVRBU0laRSk7CisgICAgICBTSEFUcmFuc2Zvcm0gKGNvbnRleHQtPmRpZ2VzdCwgY29udGV4dC0+ZGF0YSk7CisgICAgICBidWZmZXIgKz0gZGF0YUNvdW50OworICAgICAgY291bnQgLT0gZGF0YUNvdW50OworICAgIH0KKworICAvKiBQcm9jZXNzIGRhdGEgaW4gU0hBX0RBVEFTSVpFIGNodW5rcyAqLworICB3aGlsZSAoY291bnQgPj0gU0hBX0RBVEFTSVpFKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKGNvbnRleHQtPmRhdGEsIGJ1ZmZlciwgU0hBX0RBVEFTSVpFKTsKKyAgICAgIHN3YXBfd29yZHMgKGNvbnRleHQtPmRhdGEsIFNIQV9EQVRBU0laRSk7CisgICAgICBTSEFUcmFuc2Zvcm0gKGNvbnRleHQtPmRpZ2VzdCwgY29udGV4dC0+ZGF0YSk7CisgICAgICBidWZmZXIgKz0gU0hBX0RBVEFTSVpFOworICAgICAgY291bnQgLT0gU0hBX0RBVEFTSVpFOworICAgIH0KKworICAvKiBIYW5kbGUgYW55IHJlbWFpbmluZyBieXRlcyBvZiBkYXRhLiAqLworICBtZW1tb3ZlIChjb250ZXh0LT5kYXRhLCBidWZmZXIsIGNvdW50KTsKK30KKworCisvKiBGaW5hbCB3cmFwdXAgLSBwYWQgdG8gU0hBX0RBVEFTSVpFLWJ5dGUgYm91bmRhcnkgd2l0aCB0aGUgYml0IHBhdHRlcm4KKyAgIDEgMCogKDY0LWJpdCBjb3VudCBvZiBiaXRzIHByb2Nlc3NlZCwgTVNCLWZpcnN0KSAqLworCitzdGF0aWMgdm9pZAorc2hhX2ZpbmlzaCAoREJ1c1NIQUNvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXSkKK3sKKyAgaW50IGNvdW50OworICB1bnNpZ25lZCBjaGFyICpkYXRhX3A7CisKKyAgLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgbW9kIDY0ICovCisgIGNvdW50ID0gKGludCkgY29udGV4dC0+Y291bnRfbG87CisgIGNvdW50ID0gKGNvdW50ID4+IDMpICYgMHgzRjsKKworICAvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCisgICAgIGFsd2F5cyBhdCBsZWFzdCBvbmUgYnl0ZSBmcmVlICovCisgIGRhdGFfcCA9ICh1bnNpZ25lZCBjaGFyICopIGNvbnRleHQtPmRhdGEgKyBjb3VudDsKKyAgKmRhdGFfcCsrID0gMHg4MDsKKworICAvKiBCeXRlcyBvZiBwYWRkaW5nIG5lZWRlZCB0byBtYWtlIDY0IGJ5dGVzICovCisgIGNvdW50ID0gU0hBX0RBVEFTSVpFIC0gMSAtIGNvdW50OworCisgIC8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0ICovCisgIGlmIChjb3VudCA8IDgpCisgICAgeworICAgICAgLyogVHdvIGxvdHMgb2YgcGFkZGluZzogIFBhZCB0aGUgZmlyc3QgYmxvY2sgdG8gNjQgYnl0ZXMgKi8KKyAgICAgIG1lbXNldCAoZGF0YV9wLCAwLCBjb3VudCk7CisgICAgICBzd2FwX3dvcmRzIChjb250ZXh0LT5kYXRhLCBTSEFfREFUQVNJWkUpOworICAgICAgU0hBVHJhbnNmb3JtIChjb250ZXh0LT5kaWdlc3QsIGNvbnRleHQtPmRhdGEpOworCisgICAgICAvKiBOb3cgZmlsbCB0aGUgbmV4dCBibG9jayB3aXRoIDU2IGJ5dGVzICovCisgICAgICBtZW1zZXQgKGNvbnRleHQtPmRhdGEsIDAsIFNIQV9EQVRBU0laRSAtIDgpOworICAgIH0KKyAgZWxzZQorICAgIC8qIFBhZCBibG9jayB0byA1NiBieXRlcyAqLworICAgIG1lbXNldCAoZGF0YV9wLCAwLCBjb3VudCAtIDgpOworCisgIC8qIEFwcGVuZCBsZW5ndGggaW4gYml0cyBhbmQgdHJhbnNmb3JtICovCisgIGNvbnRleHQtPmRhdGFbMTRdID0gY29udGV4dC0+Y291bnRfaGk7CisgIGNvbnRleHQtPmRhdGFbMTVdID0gY29udGV4dC0+Y291bnRfbG87CisKKyAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGF0YSwgU0hBX0RBVEFTSVpFIC0gOCk7CisgIFNIQVRyYW5zZm9ybSAoY29udGV4dC0+ZGlnZXN0LCBjb250ZXh0LT5kYXRhKTsKKyAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGlnZXN0LCBTSEFfRElHRVNUU0laRSk7CisgIG1lbW1vdmUgKGRpZ2VzdCwgY29udGV4dC0+ZGlnZXN0LCBTSEFfRElHRVNUU0laRSk7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgaW50ZXJuYWxzICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1NIQQorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgU0hBIGNvbnRleHQuCisgKgorICogQHBhcmFtIGNvbnRleHQgYW4gdW5pbml0aWFsaXplZCBjb250ZXh0LCB0eXBpY2FsbHkgb24gdGhlIHN0YWNrLgorICovCit2b2lkCitfZGJ1c19zaGFfaW5pdCAoREJ1c1NIQUNvbnRleHQgKmNvbnRleHQpCit7CisgIHNoYV9pbml0IChjb250ZXh0KTsKK30KKworLyoqCisgKiBGZWVkcyBtb3JlIGRhdGEgaW50byBhbiBleGlzdGluZyBzaGFzdW0gY29tcHV0YXRpb24uCisgKgorICogQHBhcmFtIGNvbnRleHQgdGhlIFNIQSBjb250ZXh0CisgKiBAcGFyYW0gZGF0YSB0aGUgYWRkaXRpb25hbCBkYXRhIHRvIGhhc2gKKyAqLwordm9pZAorX2RidXNfc2hhX3VwZGF0ZSAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIHVuc2lnbmVkIGludCBpbnB1dExlbjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQ7CisKKyAgaW5wdXQgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGF0YSk7CisgIGlucHV0TGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworCisgIHNoYV9hcHBlbmQgKGNvbnRleHQsIGlucHV0LCBpbnB1dExlbik7Cit9CisKKy8qKgorICogU0hBIGZpbmFsaXphdGlvbi4gRW5kcyBhbiBTSEEgbWVzc2FnZS1kaWdlc3Qgb3BlcmF0aW9uLCB3cml0aW5nIHRoZQorICogdGhlIG1lc3NhZ2UgZGlnZXN0IGFuZCB6ZXJvaW5nIHRoZSBjb250ZXh0LiAgVGhlIHJlc3VsdHMgYXJlCisgKiByZXR1cm5lZCBhcyBhIHJhdyAyMC1ieXRlIGRpZ2VzdCwgbm90IGFzIHRoZSBhc2NpaS1oZXgtZGlnaXRzCisgKiBzdHJpbmcgZm9ybSBvZiB0aGUgZGlnZXN0LgorICoKKyAqIEBwYXJhbSBjb250ZXh0IHRoZSBTSEEgY29udGV4dAorICogQHBhcmFtIHJlc3VsdHMgc3RyaW5nIHRvIGFwcGVuZCB0aGUgMjAtYnl0ZSBTSEEgZGlnZXN0IHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgdG8gYXBwZW5kIHRoZSBkaWdlc3QKKyAqCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfZmluYWwgKERCdXNTSEFDb250ZXh0ICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3VsdHMpCit7CisgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXTsKKworICBzaGFfZmluaXNoIChjb250ZXh0LCBkaWdlc3QpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKHJlc3VsdHMsIGRpZ2VzdCwgMjApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBzb21lIGtpbmQgb2Ygc2VjdXJpdHkgcGFyYW5vaWEsIHRob3VnaCBpdCBzZWVtcyBwb2ludGxlc3MKKyAgICogdG8gbWUgZ2l2ZW4gdGhlIG5vbnplcm9lZCBzdHVmZiBmbHlpbmcgYXJvdW5kCisgICAqLworICBfREJVU19aRVJPKCpjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb21wdXRlcyB0aGUgQVNDSUkgaGV4LWVuY29kZWQgc2hhc3VtIG9mIHRoZSBnaXZlbiBkYXRhIGFuZAorICogYXBwZW5kcyBpdCB0byB0aGUgb3V0cHV0IHN0cmluZy4KKyAqCisgKiBAcGFyYW0gZGF0YSBpbnB1dCBkYXRhIHRvIGJlIGhhc2hlZAorICogQHBhcmFtIGFzY2lpX291dHB1dCBzdHJpbmcgdG8gYXBwZW5kIEFTQ0lJIHNoYXN1bSB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfY29tcHV0ZSAoY29uc3QgREJ1c1N0cmluZyAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICphc2NpaV9vdXRwdXQpCit7CisgIERCdXNTSEFDb250ZXh0IGNvbnRleHQ7CisgIERCdXNTdHJpbmcgZGlnZXN0OworCisgIF9kYnVzX3NoYV9pbml0ICgmY29udGV4dCk7CisKKyAgX2RidXNfc2hhX3VwZGF0ZSAoJmNvbnRleHQsIGRhdGEpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkaWdlc3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3NoYV9maW5hbCAoJmNvbnRleHQsICZkaWdlc3QpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJmRpZ2VzdCwgMCwgYXNjaWlfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYXNjaWlfb3V0cHV0KSkpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpZ2VzdCk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpZ2VzdCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoYV9iaW5hcnkgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5wdXRfbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAqZXhwZWN0ZWQpCit7CisgIERCdXNTdHJpbmcgaW5wdXRfc3RyOworICBEQnVzU3RyaW5nIGV4cGVjdGVkX3N0cjsKKyAgREJ1c1N0cmluZyByZXN1bHRzOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmlucHV0X3N0ciwgaW5wdXQsIGlucHV0X2xlbik7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZXhwZWN0ZWRfc3RyLCBleHBlY3RlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJlc3VsdHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSBmb3IgU0hBLTEgcmVzdWx0cyIpOworCisgIGlmICghX2RidXNfc2hhX2NvbXB1dGUgKCZpbnB1dF9zdHIsICZyZXN1bHRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIFNIQS0xIHJlc3VsdHMiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmV4cGVjdGVkX3N0ciwgJnJlc3VsdHMpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBoYXNoICVzIGdvdCAlcyBmb3IgU0hBLTEgc3VtXG4iLAorICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZXN1bHRzKSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdHMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdHMpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zaGFfc3RyIChjb25zdCBjaGFyICppbnB1dCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkKQoreworICByZXR1cm4gY2hlY2tfc2hhX2JpbmFyeSAoaW5wdXQsIHN0cmxlbiAoaW5wdXQpLCBleHBlY3RlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGVjb2RlX2NvbXBhY3Rfc3RyaW5nIChjb25zdCBEQnVzU3RyaW5nICpsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZWNvZGVkKQoreworICBpbnQgbl9iaXRzOworICBkYnVzX2Jvb2xfdCBjdXJyZW50X2I7CisgIGludCBvZmZzZXQ7CisgIGludCBuZXh0OworICBsb25nIHZhbDsKKyAgaW50IGxlbmd0aF9ieXRlczsKKyAgCisgIG9mZnNldCA9IDA7CisgIG5leHQgPSAwOworCisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAobGluZSwgb2Zmc2V0LCAmdmFsLCAmbmV4dCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IHBhcnNlIGxlbmd0aCBhdCBzdGFydCBvZiBjb21wYWN0IHN0cmluZzogJXNcbiIsCisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGxpbmUpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGxpbmUsIG5leHQsICZuZXh0KTsKKyAgCisgIG9mZnNldCA9IG5leHQ7CisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAobGluZSwgb2Zmc2V0LCAmdmFsLCAmbmV4dCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IHBhcnNlIHN0YXJ0IGJpdCAnYicgaW4gY29tcGFjdCBzdHJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChsaW5lKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCEodmFsID09IDAgfHwgdmFsID09IDEpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInRoZSB2YWx1ZSAnYicgbXVzdCBiZSAwIG9yIDEsIHNlZSBzaGEtMS9SZWFkbWUudHh0XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGxpbmUsIG5leHQsICZuZXh0KTsKKyAgCisgIGN1cnJlbnRfYiA9IHZhbDsKKyAgbl9iaXRzID0gMDsKKyAgCisgIHdoaWxlIChuZXh0IDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGxpbmUpKQorICAgIHsKKyAgICAgIGludCB0b3RhbF9iaXRzOworICAgICAgCisgICAgICBvZmZzZXQgPSBuZXh0OworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChsaW5lLCBvZmZzZXQpID09ICdeJykKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAobGluZSwgb2Zmc2V0LCAmdmFsLCAmbmV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3QgcGFyc2UgYml0IGNvdW50IGluIGNvbXBhY3Qgc3RyaW5nXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgLyogV2Ugbm93IGFwcGVuZCAidmFsIiBjb3BpZXMgb2YgImN1cnJlbnRfYiIgYml0cyB0byB0aGUgc3RyaW5nICovCisgICAgICB0b3RhbF9iaXRzID0gbl9iaXRzICsgdmFsOworICAgICAgd2hpbGUgKG5fYml0cyA8IHRvdGFsX2JpdHMpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgYnl0ZV9jb250YWluaW5nX25leHRfYml0ID0gbl9iaXRzIC8gODsKKyAgICAgICAgICBpbnQgYml0X2NvbnRhaW5pbmdfbmV4dF9iaXQgPSA3IC0gKG5fYml0cyAlIDgpOworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkX2J5dGU7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCA+PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGVjb2RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRlY29kZWQsIGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCArIDEpKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBleHRlbmQgdG8gbmV4dCBieXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBvbGRfYnl0ZSA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGVjb2RlZCwgYnl0ZV9jb250YWluaW5nX25leHRfYml0KTsKKyAgICAgICAgICBvbGRfYnl0ZSB8PSBjdXJyZW50X2IgPDwgYml0X2NvbnRhaW5pbmdfbmV4dF9iaXQ7CisKKyNpZiAwCisgICAgICAgICAgcHJpbnRmICgiQXBwZW5kaW5nIGJpdCAlZCB0byBieXRlICVkIGF0IGJpdCAlZCByZXN1bHRpbmcgaW4gYnl0ZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgY3VycmVudF9iLCBieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQsCisgICAgICAgICAgICAgICAgICBiaXRfY29udGFpbmluZ19uZXh0X2JpdCwgb2xkX2J5dGUpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkZWNvZGVkLCBieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQsIG9sZF9ieXRlKTsKKyAgICAgICAgICAKKyAgICAgICAgICArK25fYml0czsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAobGluZSwgbmV4dCwgJm5leHQpOworICAgICAgICAgIAorICAgICAgY3VycmVudF9iID0gIWN1cnJlbnRfYjsKKyAgICB9CisKKyAgbGVuZ3RoX2J5dGVzID0gKG5fYml0cyAvIDggKyAoKG5fYml0cyAlIDgpID8gMSA6IDApKTsKKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGVjb2RlZCkgIT0gbGVuZ3RoX2J5dGVzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkV4cGVjdGVkIGxlbmd0aCAlZCBieXRlcyAlZCBiaXRzIGZvciBjb21wYWN0IHN0cmluZywgZ290ICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgbGVuZ3RoX2J5dGVzLCBuX2JpdHMsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkZWNvZGVkKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X25leHRfZXhwZWN0ZWRfcmVzdWx0IChEQnVzU3RyaW5nICpyZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpyZXN1bHQpCit7CisgIERCdXNTdHJpbmcgbGluZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxpbmUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAKKyBuZXh0X2l0ZXJhdGlvbjoKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19wb3BfbGluZSAocmVzdWx0cywgJmxpbmUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfbGVhZGluZ19ibGFua3MgKCZsaW5lKTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkgPT0gMCkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICIjIikpCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiSD4iKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIGRvbid0IHByaW50ICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICJEPiIpIHx8CisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiPEQiKSkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGludCBpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZsaW5lLCAwLCByZXN1bHQsIDApKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICB3aGlsZSAoaSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZXN1bHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzd2l0Y2ggKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocmVzdWx0LCBpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2EnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdiJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnYycpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2QnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdlJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnZicpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlIChyZXN1bHQsIGksIDEpOworICAgICAgICAgICAgICAgICAgLS1pOyAvKiB0byBvZmZzZXQgKytpIGJlbG93ICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgIC8qIG91dDogKi8KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3RfZGF0YSAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c1N0cmluZyB0ZXN0c19maWxlOworICBEQnVzU3RyaW5nIHJlc3VsdHNfZmlsZTsKKyAgREJ1c1N0cmluZyB0ZXN0czsKKyAgREJ1c1N0cmluZyByZXN1bHRzOworICBEQnVzU3RyaW5nIGxpbmU7CisgIERCdXNTdHJpbmcgdG1wOworICBpbnQgbGluZV9ubzsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgc3VjY2Vzc19jb3VudDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RzX2ZpbGUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHRzX2ZpbGUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0cykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJlc3VsdHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRlc3RzX2ZpbGUsIHRlc3RfZGF0YV9kaXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnJlc3VsdHNfZmlsZSwgdGVzdF9kYXRhX2RpcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0bXAsICJzaGEtMS9ieXRlLW1lc3NhZ2VzLnNoYTEiKTsKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmdGVzdHNfZmlsZSwgJnRtcCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0bXAsICJzaGEtMS9ieXRlLWhhc2hlcy5zaGExIik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnJlc3VsdHNfZmlsZSwgJnRtcCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJnRlc3RzLCAmdGVzdHNfZmlsZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3QgbG9hZCB0ZXN0IGRhdGEgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0c19maWxlKSwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZyZXN1bHRzLCAmcmVzdWx0c19maWxlLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBsb2FkIHJlc3VsdHMgZGF0YSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnJlc3VsdHNfZmlsZSksIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHN1Y2Nlc3NfY291bnQgPSAwOworICBsaW5lX25vID0gMDsKKyBuZXh0X2l0ZXJhdGlvbjoKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnRlc3RzLCAmbGluZSkpCisgICAgeworICAgICAgbGluZV9ubyArPSAxOworCisgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzICgmbGluZSk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpID09IDApCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiIyIpKQorICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIkg+IikpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJTSEEtMTogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsKKworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJmxpbmUsIDAsICJUeXBlIDMiLCBOVUxMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogU2VlIHNoYS0xL1JlYWRtZS50eHQgLSB0aGUgIlR5cGUgMyIgdGVzdHMgYXJlCisgICAgICAgICAgICAgICAqIHJhbmRvbSBzZWVkcywgcmF0aGVyIHRoYW4gZGF0YSB0byBiZSBoYXNoZWQuCisgICAgICAgICAgICAgICAqIHdlJ2QgaGF2ZSB0byBkbyBhIGxpdHRsZSBiaXQgbW9yZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgKiB0byB1c2UgdGhvc2UgdGVzdHMuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgcHJpbnRmICgiIChlbmRpbmcgdGVzdHMgZHVlIHRvIFR5cGUgMyB0ZXN0cyBzZWVuIC0gdGhpcyBpcyBub3JtYWwpXG4iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICJEPiIpIHx8CisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiPEQiKSkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgdGVzdDsKKyAgICAgICAgICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgICAgICAgICBEQnVzU3RyaW5nIG5leHRfbGluZTsKKyAgICAgICAgICBEQnVzU3RyaW5nIGV4cGVjdGVkOworICAgICAgICAgIGRidXNfYm9vbF90IHN1Y2Nlc3M7CisKKyAgICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5leHRfbGluZSkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZleHBlY3RlZCkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdCkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHQpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICAvKiB0aGUgImNvbXBhY3Qgc3RyaW5ncyIgYXJlICJeIi10ZXJtaW5hdGVkIG5vdAorICAgICAgICAgICAqIG5ld2xpbmUtdGVybWluYXRlZCBzbyByZWFkYWhlYWQgdG8gZmluZCB0aGUKKyAgICAgICAgICAgKiAiXiIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICB3aGlsZSAoIV9kYnVzX3N0cmluZ19maW5kICgmbGluZSwgMCwgIl4iLCBOVUxMKSAmJgorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZ0ZXN0cywgJm5leHRfbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmbGluZSwgJyAnKSB8fAorICAgICAgICAgICAgICAgICAgIV9kYnVzX3N0cmluZ19tb3ZlICgmbmV4dF9saW5lLCAwLCAmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKSkpCisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFkZWNvZGVfY29tcGFjdF9zdHJpbmcgKCZsaW5lLCAmdGVzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBkZWNvZGUgbGluZSAlZCBhcyBhIGNvbXBhY3Qgc3RyaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc2hhX2NvbXB1dGUgKCZ0ZXN0LCAmcmVzdWx0KSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSBmb3IgU0hBLTEgcmVzdWx0Iik7CisKKyAgICAgICAgICBpZiAoIWdldF9uZXh0X2V4cGVjdGVkX3Jlc3VsdCAoJnJlc3VsdHMsICZleHBlY3RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkIGFuIGV4cGVjdGVkIHJlc3VsdFxuIik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJnJlc3VsdCwgJmV4cGVjdGVkKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgZm9yIGxpbmUgJWQgZ290IGhhc2ggJXMgZXhwZWN0ZWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmV4cGVjdGVkKSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN1Y2Nlc3NfY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworCisgICAgICAgIGZhaWx1cmU6CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0KTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZuZXh0X2xpbmUpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworCisgICAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworICBwcmludGYgKCJQYXNzZWQgdGhlICVkIFNIQS0xIHRlc3RzIGluIHRoZSB0ZXN0IGZpbGVcbiIsCisgICAgICAgICAgc3VjY2Vzc19jb3VudCk7CisgIAorIG91dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0c19maWxlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzX2ZpbGUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNTSEFJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgU0hBIGNvbXB1dGF0aW9uLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGFfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgdW5zaWduZWQgY2hhciBhbGxfYnl0ZXNbMjU2XTsKKyAgaW50IGk7CisKKyAgaWYgKHRlc3RfZGF0YV9kaXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXByb2Nlc3NfdGVzdF9kYXRhICh0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHByaW50ZiAoIk5vIHRlc3QgZGF0YSBkaXJcbiIpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMjU2KQorICAgIHsKKyAgICAgIGFsbF9ieXRlc1tpXSA9IGk7CisgICAgICArK2k7CisgICAgfQorCisgIGlmICghY2hlY2tfc2hhX2JpbmFyeSAoYWxsX2J5dGVzLCAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjQ5MTZkNmJkYjdmNzhlNjgwMzY5OGNhYjMyZDE1ODZlYTQ1N2RmYzgiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNkZWZpbmUgQ0hFQ0soaW5wdXQsZXhwZWN0ZWQpIGlmICghY2hlY2tfc2hhX3N0ciAoaW5wdXQsIGV4cGVjdGVkKSkgcmV0dXJuIEZBTFNFCisKKyAgQ0hFQ0sgKCIiLCAiZGEzOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOSIpOworICBDSEVDSyAoImEiLCAiODZmN2U0MzdmYWE1YTdmY2UxNWQxZGRjYjllYWVhZWEzNzc2NjdiOCIpOworICBDSEVDSyAoImFiYyIsICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIik7CisgIENIRUNLICgibWVzc2FnZSBkaWdlc3QiLCAiYzEyMjUyY2VkYThiZTg5OTRkNWZhMDI5MGE0NzIzMWMxZDE2YWFlMyIpOworICBDSEVDSyAoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgIjMyZDEwYzdiOGNmOTY1NzBjYTA0Y2UzN2YyYTE5ZDg0MjQwZDNhODkiKTsKKyAgQ0hFQ0sgKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCisgICAgICAgICAiNzYxYzQ1N2JmNzNiMTRkMjdlOWU5MjY1YzQ2ZjRiNGRkYTExZjk0MCIpOworICBDSEVDSyAoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKKyAgICAgICAgICI1MGFiZjU3MDZhMTUwOTkwYTA4YjJjNWVhNDBmYTBlNTg1NTU0NzMyIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2hhLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2hhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4MDM1YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zaGEuaApAQCAtMCwwICsxLDU1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2hhLmggU0hBLTEgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NIQV9ICisjZGVmaW5lIERCVVNfU0hBX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNTSEFDb250ZXh0IERCdXNTSEFDb250ZXh0OworCisvKioKKyAqIFN0cnVjdCBzdG9yaW5nIHN0YXRlIG9mIHRoZSBTSEEgYWxnb3JpdGhtCisgKi8KK3N0cnVjdCBEQnVzU0hBQ29udGV4dAoreworICBkYnVzX3VpbnQzMl90ICBkaWdlc3RbNV07ICAgICAgICAgLyoqPCBNZXNzYWdlIGRpZ2VzdCAqLworICBkYnVzX3VpbnQzMl90ICBjb3VudF9sbzsgICAgICAgICAgLyoqPCA2NC1iaXQgYml0IGNvdW50ICovCisgIGRidXNfdWludDMyX3QgIGNvdW50X2hpOyAgICAgICAgICAvKio8IE5vIGNsdWUgKi8KKyAgZGJ1c191aW50MzJfdCAgZGF0YVsxNl07ICAgICAgICAgIC8qKjwgU0hBIGRhdGEgYnVmZmVyICovCit9OworCit2b2lkICAgICAgICBfZGJ1c19zaGFfaW5pdCAgICAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCk7Cit2b2lkICAgICAgICBfZGJ1c19zaGFfdXBkYXRlICAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX3NoYV9maW5hbCAgIChEQnVzU0hBQ29udGV4dCAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3VsdHMpOworZGJ1c19ib29sX3QgX2RidXNfc2hhX2NvbXB1dGUgKGNvbnN0IERCdXNTdHJpbmcgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYXNjaWlfb3V0cHV0KTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0hBX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zaGFyZWQuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zaGFyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU3NjcwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNoYXJlZC5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2hhcmVkLmggIFN0dWZmIHVzZWQgYnkgYm90aCBkYnVzL2RidXMuaCBsb3ctbGV2ZWwgYW5kIEMvQysrIGJpbmRpbmcgQVBJcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TSEFSRURfSAorI2RlZmluZSBEQlVTX1NIQVJFRF9ICisKKy8qIERvbid0IGluY2x1ZGUgYW55dGhpbmcgaW4gaGVyZSBmcm9tIGFueXdoZXJlIGVsc2UuIEl0J3MKKyAqIGludGVuZGVkIGZvciB1c2UgYnkgYW55IHJhbmRvbSBsaWJyYXJ5LgorICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2lmIDAKK30gLyogYXZvaWRzIGNvbmZ1c2luZyBlbWFjcyBpbmRlbnRhdGlvbiAqLworI2VuZGlmCisjZW5kaWYKKworLyogTm9ybWFsbHkgZG9jcyBhcmUgaW4gLmMgZmlsZXMsIGJ1dCB0aGVyZSBpc24ndCBhIC5jIGZpbGUgZm9yIHRoaXMuICovCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2hhcmVkIFNoYXJlZCBjb25zdGFudHMgCisgKiBAaW5ncm91cCAgREJ1cworICoKKyAqIEBicmllZiBTaGFyZWQgaGVhZGVyIGluY2x1ZGVkIGJ5IGJvdGggbGliZGJ1cyBhbmQgQy9DKysgYmluZGluZ3Mgc3VjaCBhcyB0aGUgR0xpYiBiaW5kaW5ncy4KKyAqCisgKiBVc3VhbGx5IGEgQy9DKysgYmluZGluZyBzdWNoIGFzIHRoZSBHTGliIG9yIFF0IGJpbmRpbmcgd29uJ3Qgd2FudCB0byBpbmNsdWRlIGRidXMuaCBpbiBpdHMKKyAqIHB1YmxpYyBoZWFkZXJzLiBIb3dldmVyLCBhIGZldyBjb25zdGFudHMgYW5kIG1hY3JvcyBtYXkgYmUgdXNlZnVsIHRvIGluY2x1ZGU7IHRob3NlIGFyZQorICogZm91bmQgaGVyZSBhbmQgaW4gZGJ1cy1wcm90b2NvbC5oCisgKgorICogQHsKKyAqLworCisKKy8qKgorICogV2VsbC1rbm93biBidXMgdHlwZXMuIFNlZSBkYnVzX2J1c19nZXQoKS4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfQlVTX1NFU1NJT04sICAgIC8qKjwgVGhlIGxvZ2luIHNlc3Npb24gYnVzICovCisgIERCVVNfQlVTX1NZU1RFTSwgICAgIC8qKjwgVGhlIHN5c3RlbXdpZGUgYnVzICovCisgIERCVVNfQlVTX1NUQVJURVIgICAgIC8qKjwgVGhlIGJ1cyB0aGF0IHN0YXJ0ZWQgdXMsIGlmIGFueSAqLworfSBEQnVzQnVzVHlwZTsKKworLyoqCisgKiBSZXN1bHRzIHRoYXQgYSBtZXNzYWdlIGhhbmRsZXIgY2FuIHJldHVybi4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRCwgICAgICAgICAvKio8IE1lc3NhZ2UgaGFzIGhhZCBpdHMgZWZmZWN0IC0gbm8gbmVlZCB0byBydW4gbW9yZSBoYW5kbGVycy4gKi8gCisgIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVELCAvKio8IE1lc3NhZ2UgaGFzIG5vdCBoYWQgYW55IGVmZmVjdCAtIHNlZSBpZiBvdGhlciBoYW5kbGVycyB3YW50IGl0LiAqLworICBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZICAgICAgLyoqPCBOZWVkIG1vcmUgbWVtb3J5IGluIG9yZGVyIHRvIHJldHVybiAjREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEIG9yICNEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlciB3aXRoIG1vcmUgbWVtb3J5LiAqLworfSBEQnVzSGFuZGxlclJlc3VsdDsKKworLyogQnVzIG5hbWVzICovCisKKy8qKiBUaGUgYnVzIG5hbWUgdXNlZCB0byB0YWxrIHRvIHRoZSBidXMgaXRzZWxmLiAqLworI2RlZmluZSBEQlVTX1NFUlZJQ0VfREJVUyAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKworLyogUGF0aHMgKi8KKy8qKiBUaGUgb2JqZWN0IHBhdGggdXNlZCB0byB0YWxrIHRvIHRoZSBidXMgaXRzZWxmLiAqLworI2RlZmluZSBEQlVTX1BBVEhfREJVUyAgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cyIKKy8qKiBUaGUgb2JqZWN0IHBhdGggdXNlZCBpbiBsb2NhbC9pbi1wcm9jZXNzLWdlbmVyYXRlZCBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgREJVU19QQVRIX0xPQ0FMICIvb3JnL2ZyZWVkZXNrdG9wL0RCdXMvTG9jYWwiCisKKy8qIEludGVyZmFjZXMsIHRoZXNlICNkZWZpbmUgZG9uJ3QgZG8gbXVjaCBvdGhlciB0aGFuCisgKiBjYXRjaCB0eXBvcyBhdCBjb21waWxlIHRpbWUKKyAqLworLyoqIFRoZSBpbnRlcmZhY2UgZXhwb3J0ZWQgYnkgdGhlIG9iamVjdCB3aXRoICNEQlVTX1NFUlZJQ0VfREJVUyBhbmQgI0RCVVNfUEFUSF9EQlVTICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX0RCVVMgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKy8qKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSBpbnRyb3NwZWN0YWJsZSBvYmplY3RzICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX0lOVFJPU1BFQ1RBQkxFICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSIKKy8qKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSBvYmplY3RzIHdpdGggcHJvcGVydGllcyAqLworI2RlZmluZSBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcyIKKy8qKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSBtb3N0IGRidXMgcGVlcnMgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfUEVFUiAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIiCisKKy8qKiBUaGlzIGlzIGEgc3BlY2lhbCBpbnRlcmZhY2Ugd2hvc2UgbWV0aG9kcyBjYW4gb25seSBiZSBpbnZva2VkCisgKiBieSB0aGUgbG9jYWwgaW1wbGVtZW50YXRpb24gKG1lc3NhZ2VzIGZyb20gcmVtb3RlIGFwcHMgYXJlbid0CisgKiBhbGxvd2VkIHRvIHNwZWNpZnkgdGhpcyBpbnRlcmZhY2UpLgorICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX0xPQ0FMICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCIKKworLyogT3duZXIgZmxhZ3MgKi8KKyNkZWZpbmUgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgMHgxIC8qKjwgQWxsb3cgYW5vdGhlciBzZXJ2aWNlIHRvIGJlY29tZSB0aGUgcHJpbWFyeSBvd25lciBpZiByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyAgMHgyIC8qKjwgUmVxdWVzdCB0byByZXBsYWNlIHRoZSBjdXJyZW50IHByaW1hcnkgb3duZXIgKi8KKyNkZWZpbmUgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFICAgICAgMHg0IC8qKjwgSWYgd2UgY2FuIG5vdCBiZWNvbWUgdGhlIHByaW1hcnkgb3duZXIgZG8gbm90IHBsYWNlIHVzIGluIHRoZSBxdWV1ZSAqLworCisvKiBSZXBsaWVzIHRvIHJlcXVlc3QgZm9yIGEgbmFtZSAqLworI2RlZmluZSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSICAxIC8qKjwgU2VydmljZSBoYXMgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIG9mIHRoZSByZXF1ZXN0ZWQgbmFtZSAqLworI2RlZmluZSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9JTl9RVUVVRSAgICAgICAyIC8qKjwgU2VydmljZSBjb3VsZCBub3QgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIGFuZCBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIHF1ZXVlICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0VYSVNUUyAgICAgICAgIDMgLyoqPCBTZXJ2aWNlIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0FMUkVBRFlfT1dORVIgIDQgLyoqPCBTZXJ2aWNlIGlzIGFscmVhZHkgdGhlIHByaW1hcnkgb3duZXIgKi8KKworLyogUmVwbGllcyB0byByZWxlYXNpbmcgYSBuYW1lICovCisjZGVmaW5lIERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEICAgICAgICAxIC8qKjwgU2VydmljZSB3YXMgcmVsZWFzZWQgZnJvbSB0aGUgZ2l2ZW4gbmFtZSAqLworI2RlZmluZSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT05fRVhJU1RFTlQgICAgMiAvKio8IFRoZSBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBidXMgKi8KKyNkZWZpbmUgREJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9UX09XTkVSICAgICAgIDMgLyoqPCBTZXJ2aWNlIGlzIG5vdCBhbiBvd25lciBvZiB0aGUgZ2l2ZW4gbmFtZSAqLworCisvKiBSZXBsaWVzIHRvIHNlcnZpY2Ugc3RhcnRzICovCisjZGVmaW5lIERCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUyAgICAgICAgIDEgLyoqPCBTZXJ2aWNlIHdhcyBhdXRvIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkcgMiAvKio8IFNlcnZpY2Ugd2FzIGFscmVhZHkgcnVubmluZyAqLworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWYgMAoreyAvKiBhdm9pZHMgY29uZnVzaW5nIGVtYWNzIGluZGVudGF0aW9uICovCisjZW5kaWYKK30KKyNlbmRpZgorCisjZW5kaWYgLyogREJVU19TSEFSRURfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNoZWxsLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2hlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTFkMzlkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNoZWxsLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaGVsbC5jIFNoZWxsIGNvbW1hbmQgbGluZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1tZW1vcnkuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zaGVsbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisKKy8qIFNpbmdsZSBxdW90ZXMgcHJlc2VydmUgdGhlIGxpdGVyYWwgc3RyaW5nIGV4YWN0bHkuIGVzY2FwZQorICogc2VxdWVuY2VzIGFyZSBub3QgYWxsb3dlZDsgbm90IGV2ZW4gXCcgLSBpZiB5b3Ugd2FudCBhICcKKyAqIGluIHRoZSBxdW90ZWQgdGV4dCwgeW91IGhhdmUgdG8gZG8gc29tZXRoaW5nIGxpa2UgJ2ZvbydcJydiYXInCisgKgorICogRG91YmxlIHF1b3RlcyBhbGxvdyAkIGAgIiBcIGFuZCBuZXdsaW5lIHRvIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2guCisgKiBPdGhlcndpc2UgZG91YmxlIHF1b3RlcyBwcmVzZXJ2ZSB0aGluZ3MgbGl0ZXJhbGx5LgorICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordW5xdW90ZV9zdHJpbmdfaW5wbGFjZSAoY2hhciogc3RyLCBjaGFyKiogZW5kKQoreworICBjaGFyKiBkZXN0OworICBjaGFyKiBzOworICBjaGFyIHF1b3RlX2NoYXI7CisgIAorICBkZXN0ID0gcyA9IHN0cjsKKworICBxdW90ZV9jaGFyID0gKnM7CisgIAorICBpZiAoISgqcyA9PSAnIicgfHwgKnMgPT0gJ1wnJykpCisgICAgeworICAgICAgKmVuZCA9IHN0cjsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2tpcCB0aGUgaW5pdGlhbCBxdW90ZSBtYXJrICovCisgICsrczsKKworICBpZiAocXVvdGVfY2hhciA9PSAnIicpCisgICAgeworICAgICAgd2hpbGUgKCpzKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0KHMgPiBkZXN0KTsgLyogbG9vcCBpbnZhcmlhbnQgKi8KKyAgICAgIAorICAgICAgICAgIHN3aXRjaCAoKnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgLyogRW5kIG9mIHRoZSBzdHJpbmcsIHJldHVybiBub3cgKi8KKyAgICAgICAgICAgICAgKmRlc3QgPSAnXDAnOworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICAgICplbmQgPSBzOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAvKiBQb3NzaWJsZSBlc2NhcGVkIHF1b3RlIG9yIFwgKi8KKyAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICBzd2l0Y2ggKCpzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgY2FzZSAnYCc6CisgICAgICAgICAgICAgICAgY2FzZSAnJCc6CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgKmRlc3QgPSAqczsKKyAgICAgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBlc2NhcGVkIGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICpkZXN0ID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgICAgIC8qICsrcyBhbHJlYWR5IGRvbmUuICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAqZGVzdCA9ICpzOworICAgICAgICAgICAgICArK2Rlc3Q7CisgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKCpzKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0KHMgPiBkZXN0KTsgLyogbG9vcCBpbnZhcmlhbnQgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoKnMgPT0gJ1wnJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRW5kIG9mIHRoZSBzdHJpbmcsIHJldHVybiBub3cgKi8KKyAgICAgICAgICAgICAgKmRlc3QgPSAnXDAnOworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICAgICplbmQgPSBzOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICpkZXN0ID0gKnM7CisgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfYXNzZXJ0KHMgPiBkZXN0KTsgLyogbG9vcCBpbnZhcmlhbnQgKi8KKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIElmIHdlIHJlYWNoIGhlcmUgdGhpcyBtZWFucyB0aGUgY2xvc2UgcXVvdGUgd2FzIG5ldmVyIGVuY291bnRlcmVkICovCisKKyAgKmRlc3QgPSAnXDAnOworICAKKyAgKmVuZCA9IHM7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIAorICogVW5xdW90ZXMgYSBzdHJpbmcgYXMgdGhlIHNoZWxsICgvYmluL3NoKSB3b3VsZC4gT25seSBoYW5kbGVzCisgKiBxdW90ZXM7IGlmIGEgc3RyaW5nIGNvbnRhaW5zIGZpbGUgZ2xvYnMsIGFyaXRobWV0aWMgb3BlcmF0b3JzLAorICogdmFyaWFibGVzLCBiYWNrdGlja3MsIHJlZGlyZWN0aW9ucywgb3Igb3RoZXIgc3BlY2lhbC10by10aGUtc2hlbGwKKyAqIGZlYXR1cmVzLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIHJlc3VsdCBhIHJlYWwgc2hlbGwKKyAqIHdvdWxkIHByb2R1Y2UgKHRoZSB2YXJpYWJsZXMsIGJhY2t0aWNrcywgZXRjLiB3aWxsIGJlIHBhc3NlZAorICogdGhyb3VnaCBsaXRlcmFsbHkgaW5zdGVhZCBvZiBiZWluZyBleHBhbmRlZCkuIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGd1YXJhbnRlZWQgdG8gc3VjY2VlZCBpZiBhcHBsaWVkIHRvIHRoZSByZXN1bHQgb2YKKyAqIF9kYnVzX3NoZWxsX3F1b3RlKCkuIElmIGl0IGZhaWxzLCBpdCByZXR1cm5zICVOVUxMLgorICogVGhlIEBxdW90ZWRfc3RyaW5nIG5lZWQgbm90IGFjdHVhbGx5IGNvbnRhaW4gcXVvdGVkIG9yCisgKiBlc2NhcGVkIHRleHQ7IF9kYnVzX3NoZWxsX3VucXVvdGUoKSBzaW1wbHkgZ29lcyB0aHJvdWdoIHRoZSBzdHJpbmcgYW5kCisgKiB1bnF1b3Rlcy91bmVzY2FwZXMgYW55dGhpbmcgdGhhdCB0aGUgc2hlbGwgd291bGQuIEJvdGggc2luZ2xlIGFuZAorICogZG91YmxlIHF1b3RlcyBhcmUgaGFuZGxlZCwgYXMgYXJlIGVzY2FwZXMgaW5jbHVkaW5nIGVzY2FwZWQKKyAqIG5ld2xpbmVzLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqIAorICogU2hlbGwgcXVvdGluZyBydWxlcyBhcmUgYSBiaXQgc3RyYW5nZS4gU2luZ2xlIHF1b3RlcyBwcmVzZXJ2ZSB0aGUKKyAqIGxpdGVyYWwgc3RyaW5nIGV4YWN0bHkuIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdCBhbGxvd2VkOyBub3QgZXZlbgorICogXCcgLSBpZiB5b3Ugd2FudCBhICcgaW4gdGhlIHF1b3RlZCB0ZXh0LCB5b3UgaGF2ZSB0byBkbyBzb21ldGhpbmcKKyAqIGxpa2UgJ2ZvbydcJydiYXInLiAgRG91YmxlIHF1b3RlcyBhbGxvdyAkLCBgLCAiLCBcLCBhbmQgbmV3bGluZSB0bworICogYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaC4gT3RoZXJ3aXNlIGRvdWJsZSBxdW90ZXMgcHJlc2VydmUgdGhpbmdzCisgKiBsaXRlcmFsbHkuCisgKgorICogQHF1b3RlZF9zdHJpbmc6IHNoZWxsLXF1b3RlZCBzdHJpbmcKKyAqKi8KK2NoYXIqCitfZGJ1c19zaGVsbF91bnF1b3RlIChjb25zdCBjaGFyICpxdW90ZWRfc3RyaW5nKQoreworICBjaGFyICp1bnF1b3RlZDsKKyAgY2hhciAqZW5kOworICBjaGFyICpzdGFydDsKKyAgY2hhciAqcmV0OworICBEQnVzU3RyaW5nIHJldHZhbDsKKworICB1bnF1b3RlZCA9IF9kYnVzX3N0cmR1cCAocXVvdGVkX3N0cmluZyk7CisgIGlmICh1bnF1b3RlZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0YXJ0ID0gdW5xdW90ZWQ7CisgIGVuZCA9IHVucXVvdGVkOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmV0dmFsKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGUgbG9vcCBhbGxvd3MgY2FzZXMgc3VjaCBhcworICAgKiAiZm9vImJsYWggYmxhaCdiYXInd29vIGZvbyJiYXoibGEgbGEgbGFcJ1wnJ2ZvbycKKyAgICovCisgIHdoaWxlICgqc3RhcnQpCisgICAgeworICAgICAgLyogQXBwZW5kIGFsbCBub24tcXVvdGVkIGNoYXJzLCBob25vcmluZyBiYWNrc2xhc2ggZXNjYXBlCisgICAgICAgKi8KKyAgICAgIAorICAgICAgd2hpbGUgKCpzdGFydCAmJiAhKCpzdGFydCA9PSAnIicgfHwgKnN0YXJ0ID09ICdcJycpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzdGFydCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBhbGwgY2hhcmFjdGVycyBjYW4gZ2V0IGVzY2FwZWQgYnkgYmFja3NsYXNoLAorICAgICAgICAgICAgICAgKiBleGNlcHQgbmV3bGluZSwgd2hpY2ggaXMgcmVtb3ZlZCBpZiBpdCBmb2xsb3dzCisgICAgICAgICAgICAgICAqIGEgYmFja3NsYXNoIG91dHNpZGUgb2YgcXVvdGVzCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgKytzdGFydDsKKyAgICAgICAgICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKnN0YXJ0ICE9ICdcbicpCisJCSAgICB7CisJCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmcmV0dmFsLCAqc3RhcnQpKQorCQkJZ290byBlcnJvcjsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZyZXR2YWwsICpzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghdW5xdW90ZV9zdHJpbmdfaW5wbGFjZSAoc3RhcnQsICZlbmQpKQorCSAgICBnb3RvIGVycm9yOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcmV0dmFsLCBzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcmV0dmFsKSk7CisgIGlmICghcmV0KQorICAgIGdvdG8gZXJyb3I7CisKKyAgZGJ1c19mcmVlICh1bnF1b3RlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0dmFsKTsKKyAgCisgIHJldHVybiByZXQ7CisgIAorIGVycm9yOgorICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXR2YWwpOworICByZXR1cm4gTlVMTDsKK30KKworLyogX2RidXNfc2hlbGxfcGFyc2VfYXJndigpIGRvZXMgYSBzZW1pLWFyYml0cmFyeSB3ZWlyZCBzdWJzZXQgb2YgdGhlIHdheQorICogdGhlIHNoZWxsIHBhcnNlcyBhIGNvbW1hbmQgbGluZS4gV2UgZG9uJ3QgZG8gdmFyaWFibGUgZXhwYW5zaW9uLAorICogZG9uJ3QgdW5kZXJzdGFuZCB0aGF0IG9wZXJhdG9ycyBhcmUgdG9rZW5zLCBkb24ndCBkbyB0aWxkZSBleHBhbnNpb24sCisgKiBkb24ndCBkbyBjb21tYW5kIHN1YnN0aXR1dGlvbiwgbm8gYXJpdGhtZXRpYyBleHBhbnNpb24sIElGUyBnZXRzIGlnbm9yZWQsCisgKiBkb24ndCBkbyBmaWxlbmFtZSBnbG9icywgZG9uJ3QgcmVtb3ZlIHJlZGlyZWN0aW9uIHN0dWZmLCBldGMuCisgKgorICogUkVBRCBUSEUgVU5JWDk4IFNQRUMgb24gIlNoZWxsIENvbW1hbmQgTGFuZ3VhZ2UiIGJlZm9yZSBjaGFuZ2luZworICogdGhlIGJlaGF2aW9yIG9mIHRoaXMgY29kZS4KKyAqCisgKiBTdGVwcyB0byBwYXJzaW5nIHRoZSBhcmd2IHN0cmluZzoKKyAqCisgKiAgLSB0b2tlbml6ZSB0aGUgc3RyaW5nIChidXQgc2luY2Ugd2UgaWdub3JlIG9wZXJhdG9ycywKKyAqICAgIG91ciB0b2tlbml6YXRpb24gbWF5IGRpdmVyZ2UgZnJvbSB3aGF0IHRoZSBzaGVsbCB3b3VsZCBkbykKKyAqICAgIG5vdGUgdGhhdCB0b2tlbml6YXRpb24gaWdub3JlcyB0aGUgaW50ZXJuYWxzIG9mIGEgcXVvdGVkCisgKiAgICB3b3JkIGFuZCBpdCBhbHdheXMgc3BsaXRzIG9uIHNwYWNlcywgbm90IG9uIElGUyBldmVuCisgKiAgICBpZiB3ZSB1c2VkIElGUy4gV2UgYWxzbyBpZ25vcmUgImVuZCBvZiBpbnB1dCBpbmRpY2F0b3IiCisgKiAgICAoSSBndWVzcyB0aGlzIGlzIGNvbnRyb2wtRD8pCisgKgorICogICAgVG9rZW5pemF0aW9uIHN0ZXBzLCBmcm9tIFVOSVg5OCB3aXRoIG9wZXJhdG9yIHN0dWZmIHJlbW92ZWQsCisgKiAgICBhcmU6CisgKiAKKyAqICAgIDEpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYmFja3NsYXNoLCBzaW5nbGUtcXVvdGUgb3IKKyAqICAgICAgICBkb3VibGUtcXVvdGUgKFwsICcgb3IgIikgYW5kIGl0IGlzIG5vdCBxdW90ZWQsIGl0IHdpbGwgYWZmZWN0CisgKiAgICAgICAgcXVvdGluZyBmb3Igc3Vic2VxdWVudCBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIHF1b3RlZAorICogICAgICAgIHRleHQuIFRoZSBydWxlcyBmb3IgcXVvdGluZyBhcmUgYXMgZGVzY3JpYmVkIGluIFF1b3RpbmcKKyAqICAgICAgICAuIER1cmluZyB0b2tlbiByZWNvZ25pdGlvbiBubyBzdWJzdGl0dXRpb25zIHdpbGwgYmUgYWN0dWFsbHkKKyAqICAgICAgICBwZXJmb3JtZWQsIGFuZCB0aGUgcmVzdWx0IHRva2VuIHdpbGwgY29udGFpbiBleGFjdGx5IHRoZQorICogICAgICAgIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIGlucHV0IChleGNlcHQgZm9yIG5ld2xpbmUKKyAqICAgICAgICBjaGFyYWN0ZXIgam9pbmluZyksIHVubW9kaWZpZWQsIGluY2x1ZGluZyBhbnkgZW1iZWRkZWQgb3IKKyAqICAgICAgICBlbmNsb3NpbmcgcXVvdGVzIG9yIHN1YnN0aXR1dGlvbiBvcGVyYXRvcnMsIGJldHdlZW4gdGhlIHF1b3RlCisgKiAgICAgICAgbWFyayBhbmQgdGhlIGVuZCBvZiB0aGUgcXVvdGVkIHRleHQuIFRoZSB0b2tlbiB3aWxsIG5vdCBiZQorICogICAgICAgIGRlbGltaXRlZCBieSB0aGUgZW5kIG9mIHRoZSBxdW90ZWQgZmllbGQuIgorICoKKyAqICAgIDIpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgbmV3bGluZSBjaGFyYWN0ZXIsCisgKiAgICAgICAgdGhlIGN1cnJlbnQgdG9rZW4gd2lsbCBiZSBkZWxpbWl0ZWQuIgorICoKKyAqICAgIDMpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgYmxhbmsgY2hhcmFjdGVyLCBhbnkKKyAqICAgICAgICB0b2tlbiBjb250YWluaW5nIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgZGVsaW1pdGVkIGFuZCB0aGUKKyAqICAgICAgICBjdXJyZW50IGNoYXJhY3RlciB3aWxsIGJlIGRpc2NhcmRlZC4iCisgKgorICogICAgNCkgIklmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIHBhcnQgb2YgYSB3b3JkLCB0aGUgY3VycmVudAorICogICAgICAgIGNoYXJhY3RlciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoYXQgd29yZC4iCisgKgorICogICAgNSkgIklmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhICIjIiwgaXQgYW5kIGFsbCBzdWJzZXF1ZW50CisgKiAgICAgICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IGV4Y2x1ZGluZywgdGhlIG5leHQgbmV3bGluZSBjaGFyYWN0ZXIKKyAqICAgICAgICB3aWxsIGJlIGRpc2NhcmRlZCBhcyBhIGNvbW1lbnQuIFRoZSBuZXdsaW5lIGNoYXJhY3RlciB0aGF0CisgKiAgICAgICAgZW5kcyB0aGUgbGluZSBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjb21tZW50LiBUaGUKKyAqICAgICAgICAiIyIgc3RhcnRzIGEgY29tbWVudCBvbmx5IHdoZW4gaXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgKiAgICAgICAgdG9rZW4uIFNpbmNlIHRoZSBzZWFyY2ggZm9yIHRoZSBlbmQtb2YtY29tbWVudCBkb2VzIG5vdAorICogICAgICAgIGNvbnNpZGVyIGFuIGVzY2FwZWQgbmV3bGluZSBjaGFyYWN0ZXIgc3BlY2lhbGx5LCBhIGNvbW1lbnQKKyAqICAgICAgICBjYW5ub3QgYmUgY29udGludWVkIHRvIHRoZSBuZXh0IGxpbmUuIgorICoKKyAqICAgIDYpICJUaGUgY3VycmVudCBjaGFyYWN0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBzdGFydCBvZiBhIG5ldyB3b3JkLiIKKyAqCisgKgorICogIC0gZm9yIGVhY2ggdG9rZW4gKHdvcmQpLCBwZXJmb3JtIHBvcnRpb25zIG9mIHdvcmQgZXhwYW5zaW9uLCBuYW1lbHkKKyAqICAgIGZpZWxkIHNwbGl0dGluZyAodXNpbmcgZGVmYXVsdCB3aGl0ZXNwYWNlIElGUykgYW5kIHF1b3RlCisgKiAgICByZW1vdmFsLiAgRmllbGQgc3BsaXR0aW5nIG1heSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICogICAgUXVvdGUgcmVtb3ZhbCBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICoKKyAqICAgIklmIHRoZSBjb21wbGV0ZSBleHBhbnNpb24gYXBwcm9wcmlhdGUgZm9yIGEgd29yZCByZXN1bHRzIGluIGFuCisgKiAgIGVtcHR5IGZpZWxkLCB0aGF0IGVtcHR5IGZpZWxkIHdpbGwgYmUgZGVsZXRlZCBmcm9tIHRoZSBsaXN0IG9mCisgKiAgIGZpZWxkcyB0aGF0IGZvcm0gdGhlIGNvbXBsZXRlbHkgZXhwYW5kZWQgY29tbWFuZCwgdW5sZXNzIHRoZQorICogICBvcmlnaW5hbCB3b3JkIGNvbnRhaW5lZCBzaW5nbGUtcXVvdGUgb3IgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuIgorICogICAgLSBVTklYOTggc3BlYworICoKKyAqCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitkZWxpbWl0X3Rva2VuIChEQnVzU3RyaW5nICp0b2tlbiwKKyAgICAgICAgICAgICAgIERCdXNMaXN0ICoqcmV0dmFsLAorCSAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyICpzdHI7CisKKyAgc3RyID0gX2RidXNfc3RyZHVwIChfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHRva2VuKSk7CisgIGlmICghc3RyKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmV0dmFsLCBzdHIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzTGlzdCoKK3Rva2VuaXplX2NvbW1hbmRfbGluZSAoY29uc3QgY2hhciAqY29tbWFuZF9saW5lLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyIGN1cnJlbnRfcXVvdGU7CisgIGNvbnN0IGNoYXIgKnA7CisgIERCdXNTdHJpbmcgY3VycmVudF90b2tlbjsKKyAgREJ1c0xpc3QgKnJldHZhbCA9IE5VTEw7CisgIGRidXNfYm9vbF90IHF1b3RlZDs7CisKKyAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgIHF1b3RlZCA9IEZBTFNFOworICBwID0gY29tbWFuZF9saW5lOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjdXJyZW50X3Rva2VuKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50X3F1b3RlID09ICdcXCcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJ1xuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogd2UgYXBwZW5kIG5vdGhpbmc7IGJhY2tzbGFzaC1uZXdsaW5lIGJlY29tZSBub3RoaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY3VycmVudF90b2tlbiwgJ1xcJykgfHwgCisJICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjdXJyZW50X3Rva2VuLCAqcCkpCisJCXsKKwkJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1cnJlbnRfcXVvdGUgPT0gJyMnKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzY2FyZCB1cCB0byBhbmQgaW5jbHVkaW5nIG5leHQgbmV3bGluZSAqLworICAgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQorICAgICAgICAgICAgKytwOworCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCpwID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY3VycmVudF9xdW90ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSBjdXJyZW50X3F1b3RlICYmCisgICAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgaXQgaXNuJ3QgYW4gZXNjYXBlZCBkb3VibGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgIShjdXJyZW50X3F1b3RlID09ICciJyAmJiBxdW90ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBFdmVyeXRoaW5nIGluc2lkZSBxdW90ZXMsIGFuZCB0aGUgY2xvc2UgcXVvdGUsCisgICAgICAgICAgICogZ2V0cyBhcHBlbmRlZCBsaXRlcmFsbHkuCisgICAgICAgICAgICovCisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkgICAgeworCSAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKwkJZ290byBlcnJvcjsKKworCQlfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisJCWlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjdXJyZW50X3Rva2VuKSkKKwkJICB7CisJCSAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgICBnb3RvIGluaXRfZXJyb3I7CisJCSAgfQorCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgLyogSWYgdGhlIGN1cnJlbnQgdG9rZW4gY29udGFpbnMgdGhlIHByZXZpb3VzIGNoYXIsIGRlbGltaXQKKyAgICAgICAgICAgICAgICogdGhlIGN1cnJlbnQgdG9rZW4uIEEgbm9uemVybyBsZW5ndGgKKyAgICAgICAgICAgICAgICogdG9rZW4gc2hvdWxkIGFsd2F5cyBjb250YWluIHRoZSBwcmV2aW91cyBjaGFyLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY3VycmVudF90b2tlbikgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKwkJICAgIGdvdG8gZXJyb3I7CisKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisJCSAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmN1cnJlbnRfdG9rZW4pKQorCQkgICAgeworCQkgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgICAgIGdvdG8gaW5pdF9lcnJvcjsKKwkJICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIGRpc2NhcmQgYWxsIHVucXVvdGVkIGJsYW5rcyAoZG9uJ3QgYWRkIHRoZW0gdG8gYSB0b2tlbikgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAvKiBzaW5nbGUvZG91YmxlIHF1b3RlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRva2VuLAorICAgICAgICAgICAgICAgKiBlc2NhcGVzIGFyZSBtYXliZSBhcHBlbmRlZCBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwKKyAgICAgICAgICAgICAgICogY29tbWVudCBjaGFycyBhcmUgbmV2ZXIgYXBwZW5kZWQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkJeworCQkgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkJICBnb3RvIGVycm9yOworCQl9CisKKyAgICAgICAgICAgICAgLyogRkFMTCBUSFJVICovCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIGN1cnJlbnRfcXVvdGUgPSAqcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIC8qIENvbWJpbmVzIHJ1bGVzIDQpIGFuZCA2KSAtIGlmIHdlIGhhdmUgYSB0b2tlbiwgYXBwZW5kIHRvIGl0LAorICAgICAgICAgICAgICAgKiBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IHRva2VuLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjdXJyZW50X3Rva2VuLCAqcCkpCisJCXsKKwkJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBXZSBuZWVkIHRvIGNvdW50IGNvbnNlY3V0aXZlIGJhY2tzbGFzaGVzIG1vZCAyLCAKKyAgICAgICAqIHRvIGRldGVjdCBlc2NhcGVkIGRvdWJsZXF1b3Rlcy4KKyAgICAgICAqLworICAgICAgaWYgKCpwICE9ICdcXCcpCisJcXVvdGVkID0gRkFMU0U7CisgICAgICBlbHNlCisJcXVvdGVkID0gIXF1b3RlZDsKKworICAgICAgKytwOworICAgIH0KKworICBpZiAoIWRlbGltaXRfdG9rZW4gKCZjdXJyZW50X3Rva2VuLCAmcmV0dmFsLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoY3VycmVudF9xdW90ZSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLCAiVW5jbG9zZWQgcXVvdGVzIGluIGNvbW1hbmQgbGluZSIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsICJObyB0b2tlbnMgZm91bmQgaW4gY29tbWFuZCBsaW5lIik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjdXJyZW50X3Rva2VuKTsKKyAKKyAgcmV0dXJuIHJldHZhbDsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworCisgaW5pdF9lcnJvcjoKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZyZXR2YWwsIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnJldHZhbCk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIF9kYnVzX3NoZWxsX3BhcnNlX2FyZ3Y6CisgKiAKKyAqIFBhcnNlcyBhIGNvbW1hbmQgbGluZSBpbnRvIGFuIGFyZ3VtZW50IHZlY3RvciwgaW4gbXVjaCB0aGUgc2FtZSB3YXkKKyAqIHRoZSBzaGVsbCB3b3VsZCwgYnV0IHdpdGhvdXQgbWFueSBvZiB0aGUgZXhwYW5zaW9ucyB0aGUgc2hlbGwgd291bGQKKyAqIHBlcmZvcm0gKHZhcmlhYmxlIGV4cGFuc2lvbiwgZ2xvYnMsIG9wZXJhdG9ycywgZmlsZW5hbWUgZXhwYW5zaW9uLAorICogZXRjLiBhcmUgbm90IHN1cHBvcnRlZCkuIFRoZSByZXN1bHRzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCisgKiB0aG9zZSB5b3Ugd291bGQgZ2V0IGZyb20gYSBVTklYOTggL2Jpbi9zaCwgYXMgbG9uZyBhcyB0aGUgaW5wdXQKKyAqIGNvbnRhaW5zIG5vbmUgb2YgdGhlIHVuc3VwcG9ydGVkIHNoZWxsIGV4cGFuc2lvbnMuIElmIHRoZSBpbnB1dAorICogZG9lcyBjb250YWluIHN1Y2ggZXhwYW5zaW9ucywgdGhleSBhcmUgcGFzc2VkIHRocm91Z2gKKyAqIGxpdGVyYWxseS4gRnJlZSB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpdGggZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLgorICogCisgKiBAY29tbWFuZF9saW5lOiBjb21tYW5kIGxpbmUgdG8gcGFyc2UKKyAqIEBhcmdjcDogcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgYXJncworICogQGFyZ3ZwOiByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IG9mIGFyZ3MKKyAqIEBlcnJvcjogZXJyb3IgaW5mb3JtYXRpb24KKyAqKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaGVsbF9wYXJzZV9hcmd2IChjb25zdCBjaGFyICpjb21tYW5kX2xpbmUsCisJCQlpbnQgICAgICAgICphcmdjcCwKKwkJCWNoYXIgICAgICoqKmFyZ3ZwLAorCQkJREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIC8qIENvZGUgYmFzZWQgb24gcG9wdFBhcnNlQXJndlN0cmluZygpIGZyb20gbGlicG9wdCAqLworICBpbnQgYXJnYyA9IDA7CisgIGNoYXIgKiphcmd2ID0gTlVMTDsKKyAgREJ1c0xpc3QgKnRva2VucyA9IE5VTEw7CisgIGludCBpOworICBEQnVzTGlzdCAqdG1wX2xpc3Q7CisgIAorICBpZiAoIWNvbW1hbmRfbGluZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ29tbWFuZCBsaW5lIGlzIE5VTExcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB0b2tlbnMgPSB0b2tlbml6ZV9jb21tYW5kX2xpbmUgKGNvbW1hbmRfbGluZSwgZXJyb3IpOworICBpZiAodG9rZW5zID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHRva2VucyBmb3IgY29tbWFuZCBsaW5lICclcydcbiIsIGNvbW1hbmRfbGluZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEJlY2F1c2Ugd2UgY2FuJ3QgaGF2ZSBpbnRyb2R1Y2VkIGFueSBuZXcgYmxhbmsgc3BhY2UgaW50byB0aGUKKyAgICogdG9rZW5zICh3ZSBkaWRuJ3QgZG8gYW55IG5ldyBleHBhbnNpb25zKSwgd2UgZG9uJ3QgbmVlZCB0bworICAgKiBwZXJmb3JtIGZpZWxkIHNwbGl0dGluZy4gSWYgd2Ugd2VyZSBnb2luZyB0byBob25vciBJRlMgb3IgZG8gYW55CisgICAqIGV4cGFuc2lvbnMsIHdlIHdvdWxkIGhhdmUgdG8gZG8gZmllbGQgc3BsaXR0aW5nIG9uIGVhY2ggd29yZAorICAgKiBoZXJlLiBBbHNvLCBpZiB3ZSB3ZXJlIGdvaW5nIHRvIGRvIGFueSBleHBhbnNpb24gd2Ugd291bGQgbmVlZCB0bworICAgKiByZW1vdmUgYW55IHplcm8tbGVuZ3RoIHdvcmRzIHRoYXQgZGlkbid0IGNvbnRhaW4gcXVvdGVzCisgICAqIG9yaWdpbmFsbHk7IGJ1dCBzaW5jZSB0aGVyZSdzIG5vIGV4cGFuc2lvbiB3ZSBrbm93IGFsbCB3b3JkcyBoYXZlCisgICAqIG5vbnplcm8gbGVuZ3RoLCB1bmxlc3MgdGhleSBjb250YWluIHF1b3Rlcy4KKyAgICogCisgICAqIFNvLCB3ZSBzaW1wbHkgcmVtb3ZlIHF1b3RlcywgYW5kIGRvbid0IGRvIGFueSBmaWVsZCBzcGxpdHRpbmcgb3IKKyAgICogZW1wdHkgd29yZCByZW1vdmFsLCBzaW5jZSB3ZSBrbm93IHRoZXJlIHdhcyBubyB3YXkgdG8gaW50cm9kdWNlCisgICAqIHN1Y2ggdGhpbmdzLgorICAgKi8KKworICBhcmdjID0gX2RidXNfbGlzdF9nZXRfbGVuZ3RoICgmdG9rZW5zKTsKKyAgYXJndiA9IGRidXNfbmV3IChjaGFyICosIGFyZ2MgKyAxKTsKKyAgaWYgKCFhcmd2KQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGkgPSAwOworICB0bXBfbGlzdCA9IHRva2VuczsKKyAgd2hpbGUgKHRtcF9saXN0KQorICAgIHsKKyAgICAgIGFyZ3ZbaV0gPSBfZGJ1c19zaGVsbF91bnF1b3RlICh0bXBfbGlzdC0+ZGF0YSk7CisKKyAgICAgIGlmICghYXJndltpXSkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworCSAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkgICAgZGJ1c19mcmVlKGFyZ3Zbal0pOworCisgICAgICAgICAgZGJ1c19mcmVlIChhcmd2KTsKKwkgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgdG1wX2xpc3QgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ0b2tlbnMsIHRtcF9saXN0KTsKKyAgICAgICsraTsKKyAgICB9CisgIGFyZ3ZbYXJnY10gPSBOVUxMOworICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdG9rZW5zLCAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLCBOVUxMKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJnRva2Vucyk7CisgIAorICBpZiAoYXJnY3ApCisgICAgKmFyZ2NwID0gYXJnYzsKKworICBpZiAoYXJndnApCisgICAgKmFyZ3ZwID0gYXJndjsKKyAgZWxzZQorICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRva2VucywgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0b2tlbnMpOworCisgIHJldHVybiBGQUxTRTsKKworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNoZWxsLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2hlbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRhMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNoZWxsLmgKQEAgLTAsMCArMSw0MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNoZWxsLmggU2hlbGwgY29tbWFuZCBsaW5lIHV0aWxpdHkgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisKKyNpZm5kZWYgREJVU19TSEVMTF9ICisjZGVmaW5lIERCVVNfU0hFTExfSAorCitEQlVTX0JFR0lOX0RFQ0xTCisKK2NoYXIqICAgICAgIF9kYnVzX3NoZWxsX3VucXVvdGUgICAgKGNvbnN0IGNoYXIgKnF1b3RlZF9zdHJpbmcpOworZGJ1c19ib29sX3QgX2RidXNfc2hlbGxfcGFyc2VfYXJndiAoY29uc3QgY2hhciAqY29tbWFuZF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqYXJnY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICoqKmFyZ3ZwLAorCQkJCSAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NIRUxMX0ggKi8KKworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2lnbmF0dXJlLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc2lnbmF0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxM2ZmNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zaWduYXR1cmUuYwpAQCAtMCwwICsxLDU0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNpZ25hdHVyZS5jICBSb3V0aW5lcyBmb3IgcmVhZGluZyByZWN1cnNpdmUgdHlwZSBzaWduYXR1cmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiAjREJ1c1NpZ25hdHVyZUl0ZXIsIGFsbCBmaWVsZHMgYXJlIHByaXZhdGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sgCisgIGNvbnN0IGNoYXIgKnBvczsgICAgICAgICAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc2lnbmF0dXJlIHN0cmluZyAqLworICB1bnNpZ25lZCBpbnQgZmluaXNoZWQgOiAxOyAvKio8IHRydWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgaXRlciAqLworICB1bnNpZ25lZCBpbnQgaW5fYXJyYXkgOiAxOyAvKio8IHRydWUgaWYgd2UgYXJlIGEgc3ViaXRlcmF0b3IgcG9pbnRpbmcgdG8gYW4gYXJyYXkncyBlbGVtZW50IHR5cGUgKi8KK30gREJ1c1NpZ25hdHVyZVJlYWxJdGVyOworCisvKiogbWFjcm8gdGhhdCBjaGVja3Mgd2hldGhlciBhIHR5cGVjb2RlIGlzIGEgY29udGFpbmVyIHR5cGUgKi8KKyNkZWZpbmUgVFlQRV9JU19DT05UQUlORVIodHlwZWNvZGUpICAgICAgICAgICAgIFwKKyAgICAoKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfU1RSVUNUIHx8ICAgICAgICAgIFwKKyAgICAgKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSB8fCAgICAgIFwKKyAgICAgKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCB8fCAgICAgICAgIFwKKyAgICAgKHR5cGVjb2RlKSA9PSBEQlVTX1RZUEVfQVJSQVkpCisKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1NpZ25hdHVyZSBUeXBlIHNpZ25hdHVyZSBwYXJzaW5nCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBhcnNpbmcgRC1CdXMgdHlwZSBzaWduYXR1cmVzCisgKiBAeworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSAjREJ1c1NpZ25hdHVyZUl0ZXIgZm9yIHJlYWRpbmcgYSB0eXBlIHNpZ25hdHVyZS4gIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIG5vdCBzYWZlIHRvIHVzZSBvbiBpbnZhbGlkIHNpZ25hdHVyZXM7IGJlIHN1cmUgdG8KKyAqIHZhbGlkYXRlIHBvdGVudGlhbGx5IGludmFsaWQgc2lnbmF0dXJlcyB3aXRoIGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlCisgKiBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKi8KK3ZvaWQKK2RidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCisJCQkgIGNvbnN0IGNoYXIgICAgICAgICpzaWduYXR1cmUpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworCisgIHJlYWxfaXRlci0+cG9zID0gc2lnbmF0dXJlOworICByZWFsX2l0ZXItPmZpbmlzaGVkID0gRkFMU0U7CisgIHJlYWxfaXRlci0+aW5fYXJyYXkgPSBGQUxTRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHR5cGUgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IuCisgKiBJZiB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgYXQgYSB0eXBlIGNvZGUgc3VjaCBhcyAncycsIHRoZW4KKyAqIGl0IHdpbGwgYmUgcmV0dXJuZWQgZGlyZWN0bHkuCisgKgorICogSG93ZXZlciwgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBjb250YWluZXIgdHlwZSBzdGFydAorICogY2hhcmFjdGVyIHN1Y2ggYXMgJygnIGZvciBhIHN0cnVjdHVyZSwgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBmb3IKKyAqIHRoZSBjb250YWluZXIgd2lsbCBiZSByZXR1cm5lZCwgZS5nLiAgREJVU19UWVBFX1NUUlVDVCwgbm90ICcoJy4KKyAqIEluIHRoaXMgY2FzZSwgeW91IHNob3VsZCBpbml0aWFsaXplIGEgc3ViLWl0ZXJhdG9yIHdpdGgKKyAqIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSgpIHRvIHBhcnNlIHRoZSBjb250YWluZXIgdHlwZS4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIAorICogQHJldHVybnMgY3VycmVudCB0eXBlIChlLmcuICNEQlVTX1RZUEVfU1RSSU5HLCAjREJVU19UWVBFX0FSUkFZKQorICovCitpbnQKK2RidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworCisgIHJldHVybiBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZV9jX3N0ciAocmVhbF9pdGVyLT5wb3MsIDApOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgc2luZ2xlIGNvbXBsZXRlIHR5cGUgc3RhcnRpbmcgYXQgdGhlCisgKiBnaXZlbiBpdGVyYXRvci4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZiAiKGlpKWlpIgorICogKHdoaWNoIGlzICJhIHN0cnVjdCBvZiB0d28gaW50cywgZm9sbG93ZWQgYnkgYW4gaW50LCBmb2xsb3dlZCBieSBhbgorICogaW50IiksIHRoZW4gIihpaSkiIHdvdWxkIGJlIHJldHVybmVkLiBJZiB0aGUgaXRlcmF0b3IgaXMgcG9pbnRpbmcgYXQKKyAqIG9uZSBvZiB0aGUgImkiIHRoZW4ganVzdCB0aGF0ICJpIiB3b3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIAorICogQHJldHVybnMgY3VycmVudCBzaWduYXR1cmU7IG9yICNOVUxMIGlmIG5vIG1lbW9yeS4gIFNob3VsZCBiZSBmcmVlZCB3aXRoIGRidXNfZnJlZSgpCisgKi8KK2NoYXIgKgorZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfc2lnbmF0dXJlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcikKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICpyZXQ7CisgIGludCBwb3M7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb3MgPSAwOworICBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0IChyZWFsX2l0ZXItPnBvcywgJnBvcyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoJnN0ciwgcmVhbF9pdGVyLT5wb3MsIHBvcykpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZzdHIsICZyZXQpKQorICAgIHJldCA9IE5VTEw7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICByZXR1cm4gcmV0OyAKK30KKworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIHRoZSBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXk7CisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gYXZvaWQgaW5pdGlhbGl6aW5nIGEgc3ViLWl0ZXJhdG9yIGFuZAorICogZ2V0dGluZyBpdHMgY3VycmVudCB0eXBlLgorICoKKyAqIFVuZGVmaW5lZCBiZWhhdmlvciByZXN1bHRzIGlmIHlvdSBpbnZva2UgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZQorICogY3VycmVudCB0eXBlIG9mIHRoZSBpdGVyYXRvciBpcyBub3QgI0RCVVNfVFlQRV9BUlJBWS4KKyAqCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIAorICogQHJldHVybnMgY3VycmVudCBhcnJheSBlbGVtZW50IHR5cGUKKyAqLworaW50CitkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoaXRlcikgPT0gREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgcmV0dXJuIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyIChyZWFsX2l0ZXItPnBvcywgMSk7Cit9CisKKy8qKgorICogU2tpcCB0byB0aGUgbmV4dCB2YWx1ZSBvbiB0aGlzICJsZXZlbCIuIGUuZy4gdGhlIG5leHQgZmllbGQgaW4gYQorICogc3RydWN0LCB0aGUgbmV4dCB2YWx1ZSBpbiBhbiBhcnJheS4gUmV0dXJucyAjRkFMU0UgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGN1cnJlbnQgY29udGFpbmVyLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHJldHVybnMgRkFMU0UgaWYgbm90aGluZyBtb3JlIHRvIHJlYWQgYXQgb3IgYmVsb3cgdGhpcyBsZXZlbAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0IChEQnVzU2lnbmF0dXJlSXRlciAqaXRlcikKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisKKyAgaWYgKHJlYWxfaXRlci0+ZmluaXNoZWQpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgeworICAgICAgaW50IHBvczsKKworICAgICAgaWYgKHJlYWxfaXRlci0+aW5fYXJyYXkpCisJeworCSAgcmVhbF9pdGVyLT5maW5pc2hlZCA9IFRSVUU7CisJICByZXR1cm4gRkFMU0U7CisJfQorCisgICAgICBwb3MgPSAwOworICAgICAgX2RidXNfdHlwZV9zaWduYXR1cmVfbmV4dCAocmVhbF9pdGVyLT5wb3MsICZwb3MpOworICAgICAgcmVhbF9pdGVyLT5wb3MgKz0gcG9zOworCisgICAgICBpZiAoKnJlYWxfaXRlci0+cG9zID09IERCVVNfU1RSVUNUX0VORF9DSEFSCisJICB8fCAqcmVhbF9pdGVyLT5wb3MgPT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKQorCXsKKwkgIHJlYWxfaXRlci0+ZmluaXNoZWQgPSBUUlVFOworCSAgcmV0dXJuIEZBTFNFOworCX0KKworICAgICAgcmV0dXJuICpyZWFsX2l0ZXItPnBvcyAhPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICB9Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgY3VycmVudAorICogY29udGFpbmVyLgorICogCisgKiBUaGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB0aGlzIGlmIHRoZSBjdXJyZW50IHR5cGUgaXMKKyAqIGEgbm9uLWNvbnRhaW5lciAoaS5lLiBpZiBkYnVzX3R5cGVfaXNfY29udGFpbmVyKCkgcmV0dXJucyAjRkFMU0UKKyAqIGZvciB0aGUgcmVzdWx0IG9mIGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSgpKS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgY3VycmVudCBpbnRlcmF0b3IKKyAqIEBwYXJhbSBzdWJpdGVyIGFuIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGNoaWxkCisgKi8KK3ZvaWQKK2RidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIsCisJCQkgICAgIERCdXNTaWduYXR1cmVJdGVyICAgICAgICpzdWJpdGVyKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX3N1Yl9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBzdWJpdGVyOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChkYnVzX3R5cGVfaXNfY29udGFpbmVyIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKGl0ZXIpKSk7CisKKyAgKnJlYWxfc3ViX2l0ZXIgPSAqcmVhbF9pdGVyOworICByZWFsX3N1Yl9pdGVyLT5pbl9hcnJheSA9IEZBTFNFOworICByZWFsX3N1Yl9pdGVyLT5wb3MrKzsKKworICBpZiAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlIChpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpCisgICAgcmVhbF9zdWJfaXRlci0+aW5fYXJyYXkgPSBUUlVFOworfQorCisvKioKKyAqIENoZWNrIGEgdHlwZSBzaWduYXR1cmUgZm9yIHZhbGlkaXR5LiBSZW1lbWJlciB0aGF0ICNOVUxMIGNhbiBhbHdheXMKKyAqIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGF2aW5nCisgKiBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBzaWduYXR1cmUgYSBwb3RlbnRpYWxseSBpbnZhbGlkIHR5cGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzaWduYXR1cmUgaXMgdmFsaWQgb3IgI0ZBTFNFIGlmIGFuIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKGNvbnN0IGNoYXIgICAgICAgKnNpZ25hdHVyZSwKKwkJCSBEQnVzRXJyb3IgICAgICAgICplcnJvcikKKwkJCSAKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIERCdXNWYWxpZGl0eSByZWFzb247CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNpZ25hdHVyZSk7CisgIHJlYXNvbiA9IF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKTsKKworICBpZiAocmVhc29uID09IERCVVNfVkFMSUQpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9TSUdOQVRVUkUsIF9kYnVzX3ZhbGlkaXR5X3RvX2Vycm9yX21lc3NhZ2UgKHJlYXNvbikpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBDaGVjayB0aGF0IGEgdHlwZSBzaWduYXR1cmUgaXMgYm90aCB2YWxpZCBhbmQgY29udGFpbnMgZXhhY3RseSBvbmUKKyAqIGNvbXBsZXRlIHR5cGUuICJPbmUgY29tcGxldGUgdHlwZSIgbWVhbnMgYSBzaW5nbGUgYmFzaWMgdHlwZSwKKyAqIGFycmF5LCBzdHJ1Y3QsIG9yIGRpY3Rpb25hcnksIHRob3VnaCB0aGUgc3RydWN0IG9yIGFycmF5IG1heSBiZQorICogYXJiaXRyYXJpbHkgcmVjdXJzaXZlIGFuZCBjb21wbGV4LiBNb3JlIHRoYW4gb25lIGNvbXBsZXRlIHR5cGUKKyAqIHdvdWxkIG1lYW4gZm9yIGV4YW1wbGUgImlpIiBvciB0d28gaW50ZWdlcnMgaW4gc2VxdWVuY2UuCisgKgorICogQHBhcmFtIHNpZ25hdHVyZSBhIHBvdGVudGlhbGx5IGludmFsaWQgdHlwZSBzaWduYXR1cmUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgaGFzIGV4YWN0bHkgb25lIGNvbXBsZXRlIHR5cGUKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoY29uc3QgY2hhciAgICAgICAqc2lnbmF0dXJlLAorCQkJCURCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU2lnbmF0dXJlSXRlciBpdGVyOworCisgIGlmICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZ25hdHVyZSwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWduYXR1cmUpOworICBpZiAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgZ290byBsb3NlOworICBpZiAoIWRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHJldHVybiBUUlVFOworIGxvc2U6CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX1NJR05BVFVSRSwgIkV4YWN0bHkgb25lIGNvbXBsZXRlIHR5cGUgcmVxdWlyZWQgaW4gc2lnbmF0dXJlIik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBICJjb250YWluZXIgdHlwZSIgY2FuIGNvbnRhaW4gYmFzaWMgdHlwZXMsIG9yIG5lc3RlZAorICogY29udGFpbmVyIHR5cGVzLiAjREJVU19UWVBFX0lOVkFMSUQgaXMgbm90IGEgY29udGFpbmVyIHR5cGUuCisgKgorICogSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiBpbnZhbGlkIHR5cGUtY29kZSwgb3RoZXIgdGhhbiBEQlVTX1RZUEVfSU5WQUxJRCwKKyAqIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSB2YWxpZCB0eXBlLWNvZGVzIGFyZSBkZWZpbmVkIGJ5IGRidXMtcHJvdG9jb2wuaC4KKyAqCisgKiBAcGFyYW0gdHlwZWNvZGUgZWl0aGVyIGEgdmFsaWQgdHlwZS1jb2RlIG9yIERCVVNfVFlQRV9JTlZBTElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB0eXBlIGlzIGEgY29udGFpbmVyCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3R5cGVfaXNfY29udGFpbmVyIChpbnQgdHlwZWNvZGUpCit7CisgIC8qIG9ubHkgcmVhc29uYWJsZSAobm9uLWxpbmUtbm9pc2UpIHR5cGVjb2RlcyBhcmUgYWxsb3dlZCAqLworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisgIHJldHVybiBUWVBFX0lTX0NPTlRBSU5FUiAodHlwZWNvZGUpOworfQorCisvKioKKyAqIEEgImJhc2ljIHR5cGUiIGlzIGEgc29tZXdoYXQgYXJiaXRyYXJ5IGNvbmNlcHQsIGJ1dCB0aGUgaW50ZW50IGlzCisgKiB0byBpbmNsdWRlIHRob3NlIHR5cGVzIHRoYXQgYXJlIGZ1bGx5LXNwZWNpZmllZCBieSBhIHNpbmdsZQorICogdHlwZWNvZGUsIHdpdGggbm8gYWRkaXRpb25hbCB0eXBlIGluZm9ybWF0aW9uIG9yIG5lc3RlZCB2YWx1ZXMuIFNvCisgKiBhbGwgbnVtYmVycyBhbmQgc3RyaW5ncyBhcmUgYmFzaWMgdHlwZXMgYW5kIHN0cnVjdHMsIGFycmF5cywgYW5kCisgKiB2YXJpYW50cyBhcmUgbm90IGJhc2ljIHR5cGVzLiAgI0RCVVNfVFlQRV9JTlZBTElEIGlzIG5vdCBhIGJhc2ljCisgKiB0eXBlLgorICoKKyAqIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgYW4gaW52YWxpZCB0eXBlLWNvZGUsIG90aGVyIHRoYW4gREJVU19UWVBFX0lOVkFMSUQsCisgKiB0byB0aGlzIGZ1bmN0aW9uLiBUaGUgdmFsaWQgdHlwZS1jb2RlcyBhcmUgZGVmaW5lZCBieSBkYnVzLXByb3RvY29sLmguCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGVpdGhlciBhIHZhbGlkIHR5cGUtY29kZSBvciBEQlVTX1RZUEVfSU5WQUxJRAorICogQHJldHVybnMgI1RSVUUgaWYgdHlwZSBpcyBiYXNpYworICovCitkYnVzX2Jvb2xfdAorZGJ1c190eXBlX2lzX2Jhc2ljIChpbnQgdHlwZWNvZGUpCit7CisgIC8qIG9ubHkgcmVhc29uYWJsZSAobm9uLWxpbmUtbm9pc2UpIHR5cGVjb2RlcyBhcmUgYWxsb3dlZCAqLworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisKKyAgLyogZXZlcnl0aGluZyB0aGF0IGlzbid0IGludmFsaWQgb3IgYSBjb250YWluZXIgKi8KKyAgcmV0dXJuICEodHlwZWNvZGUgPT0gREJVU19UWVBFX0lOVkFMSUQgfHwgVFlQRV9JU19DT05UQUlORVIgKHR5cGVjb2RlKSk7Cit9CisKKy8qKgorICogVGVsbHMgeW91IHdoZXRoZXIgdmFsdWVzIG9mIHRoaXMgdHlwZSBjYW4gY2hhbmdlIGxlbmd0aCBpZiB5b3Ugc2V0CisgKiB0aGVtIHRvIHNvbWUgb3RoZXIgdmFsdWUuIEZvciB0aGlzIHB1cnBvc2UsIHlvdSBhc3N1bWUgdGhhdCB0aGUKKyAqIGZpcnN0IGJ5dGUgb2YgdGhlIG9sZCBhbmQgbmV3IHZhbHVlIHdvdWxkIGJlIGluIHRoZSBzYW1lIGxvY2F0aW9uLAorICogc28gYWxpZ25tZW50IHBhZGRpbmcgaXMgbm90IGEgZmFjdG9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIGRldGVybWluZSB3aGV0aGVyCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKSBtYXkgYmUgdXNlZC4KKyAqCisgKiBTb21lIHN0cnVjdHMgYXJlIGZpeGVkLXNpemUgKGlmIHRoZXkgY29udGFpbiBvbmx5IGZpeGVkLXNpemUgdHlwZXMpCisgKiBidXQgc3RydWN0IGlzIG5vdCBjb25zaWRlcmVkIGEgZml4ZWQgdHlwZSBmb3IgcHVycG9zZXMgb2YgdGhpcworICogZnVuY3Rpb24uCisgKgorICogSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiBpbnZhbGlkIHR5cGUtY29kZSwgb3RoZXIgdGhhbiBEQlVTX1RZUEVfSU5WQUxJRCwKKyAqIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSB2YWxpZCB0eXBlLWNvZGVzIGFyZSBkZWZpbmVkIGJ5IGRidXMtcHJvdG9jb2wuaC4KKyAqCisgKiBAcGFyYW0gdHlwZWNvZGUgZWl0aGVyIGEgdmFsaWQgdHlwZS1jb2RlIG9yIERCVVNfVFlQRV9JTlZBTElECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIHR5cGUgY2FuIG9jY3VweSBkaWZmZXJlbnQgbGVuZ3RocworICovCitkYnVzX2Jvb2xfdAorZGJ1c190eXBlX2lzX2ZpeGVkIChpbnQgdHlwZWNvZGUpCit7CisgIC8qIG9ubHkgcmVhc29uYWJsZSAobm9uLWxpbmUtbm9pc2UpIHR5cGVjb2RlcyBhcmUgYWxsb3dlZCAqLworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisgIAorICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBEQnVzU2lnbmF0dXJlIGdyb3VwICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKy8qKgorICogQGluZ3JvdXAgREJ1c1NpZ25hdHVyZUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzU2lnbmF0dXJlLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zaWduYXR1cmVfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3ViaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3Vic3ViaXRlcjsKKyAgREJ1c1NpZ25hdHVyZUl0ZXIgc3Vic3Vic3ViaXRlcjsKKyAgY29uc3QgY2hhciAqc2lnOworICBkYnVzX2Jvb2xfdCBib29scmVzOworCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChEQnVzU2lnbmF0dXJlSXRlcikgPj0gc2l6ZW9mIChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIpKTsKKworICBzaWcgPSAiIjsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgIHNpZyA9IERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9TVFJJTkcpOworCisgIHNpZyA9IERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1NUUklORyk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisKKyAgc2lnID0gREJVU19UWVBFX1VJTlQxNl9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfRE9VQkxFX0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1VJTlQxNik7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfU1RSVUNUKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmaXRlciwgJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9TVFJJTkcpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX1VJTlQzMik7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfRE9VQkxFKTsKKworICBzaWcgPSBEQlVTX1RZUEVfVUlOVDE2X0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORworICAgIERCVVNfVFlQRV9ET1VCTEVfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWcpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9VSU5UMTYpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1NUUlVDVCk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJml0ZXIsICZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfVUlOVDMyKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfZWxlbWVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZzdWJpdGVyLCAmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZzdWJzdWJpdGVyKSA9PSBEQlVTX1RZUEVfRE9VQkxFKTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZzdWJzdWJpdGVyLCAmc3Vic3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0RPVUJMRSk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfU1RSVUNUKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmc3ViaXRlciwgJnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKworICBzaWcgPSBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HCisgICAgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0lOVDE2X0FTX1NUUklORworICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisgICAgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9WQVJJQU5UX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSk7CisKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmaXRlciwgJnN1Yml0ZXIpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZzdWJpdGVyLCAmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0lOVDE2KTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1YnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9TVFJJTkcpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoIWJvb2xyZXMpOworCisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0ICghYm9vbHJlcyk7CisKKyAgc2lnID0gREJVU19UWVBFX0RJQ1RfRU5UUllfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19UWVBFX0FSUkFZX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0FSUkFZX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfRElDVF9FTlRSWV9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgcmV0dXJuIFRSVUU7CisjaWYgMAorIG9vbToKKyAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zaWduYXR1cmUuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zaWduYXR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmYwMGMxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNpZ25hdHVyZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaWduYXR1cmVzLmggdXRpbGl0eSBmdW5jdGlvbnMgZm9yIEQtQnVzIHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19TSUdOQVRVUkVTX0gKKyNkZWZpbmUgREJVU19TSUdOQVRVUkVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2lnbmF0dXJlCisgKiBAeworICovCisKKy8qKgorICogREJ1c1NpZ25hdHVyZUl0ZXIgc3RydWN0OyBjb250YWlucyBubyBwdWJsaWMgZmllbGRzIAorICovCit0eXBlZGVmIHN0cnVjdAoreyAKKyAgdm9pZCAqZHVtbXkxOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqZHVtbXkyOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgZGJ1c191aW50MzJfdCBkdW1teTg7IC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTI7ICAgICAgICAgICAvKio8IERvbid0IHVzZSB0aGlzICovCisgIGludCBkdW1teTE3OyAgICAgICAgICAgLyoqPCBEb24ndCB1c2UgdGhpcyAqLworfSBEQnVzU2lnbmF0dXJlSXRlcjsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgICAgICAgICAgICAgKERCdXNTaWduYXR1cmVJdGVyICAgICAgICppdGVyLAorCQkJCQkJICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgKnNpZ25hdHVyZSk7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcik7CisKK0RCVVNfRVhQT1JUCitjaGFyICogICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfc2lnbmF0dXJlICAgIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcik7CisKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfZWxlbWVudF90eXBlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICAgICAgICAgICAgIChEQnVzU2lnbmF0dXJlSXRlciAgICAgICAqaXRlcik7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICAgICAgICAgIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlciwKKwkJCQkJCSAgICAgIERCdXNTaWduYXR1cmVJdGVyICAgICAgICpzdWJpdGVyKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgKnNpZ25hdHVyZSwKKwkJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUgICAgICAgKGNvbnN0IGNoYXIgICAgICAgKnNpZ25hdHVyZSwKKwkJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3R5cGVfaXNfYmFzaWMgICAgICAgICAgICAgICAgICAgKGludCAgICAgICAgICAgIHR5cGVjb2RlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c190eXBlX2lzX2NvbnRhaW5lciAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICB0eXBlY29kZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdHlwZV9pc19maXhlZCAgICAgICAgICAgICAgICAgICAoaW50ICAgICAgICAgICAgdHlwZWNvZGUpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0lHTkFUVVJFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zb2NrZXRzLXdpbi5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNvY2tldHMtd2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxYWI4YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zb2NrZXRzLXdpbi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zb2NrZXRzLmggV3JhcHBlcnMgYXJvdW5kIHNvY2tldCBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NPQ0tFVFNfSAorI2RlZmluZSBEQlVTX1NPQ0tFVFNfSAorCisjaWYgZGVmaW5lZChEQlVTX1dJTikgfHwgZGVmaW5lZChEQlVTX1dJTkNFKQorCisKKworI2lmbmRlZiBTVFJJQ1QKKyNkZWZpbmUgU1RSSUNUCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyN1bmRlZiBTVFJJQ1QKKyNlbmRpZgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisKKyN1bmRlZiBpbnRlcmZhY2UKKworI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2RlZmluZSBEQlVTX1NPQ0tFVF9JU19JTlZBTElEKHMpICgoU09DS0VUKShzKSA9PSBJTlZBTElEX1NPQ0tFVCkKKyNkZWZpbmUgREJVU19TT0NLRVRfQVBJX1JFVFVSTlNfRVJST1IobikgKChuKSA9PSBTT0NLRVRfRVJST1IpCisjZGVmaW5lIERCVVNfU09DS0VUX1NFVF9FUlJOTygpIChfZGJ1c193aW5fc2V0X2Vycm5vIChXU0FHZXRMYXN0RXJyb3IoKSkpCisKKyNkZWZpbmUgREJVU19DTE9TRV9TT0NLRVQocykgY2xvc2Vzb2NrZXQocykKKworI2Vsc2UKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjZGVmaW5lIERCVVNfU09DS0VUX0lTX0lOVkFMSUQocykgKChzKSA8IDApCisjZGVmaW5lIERCVVNfU09DS0VUX0FQSV9SRVRVUk5TX0VSUk9SKG4pICgobikgPCAwKQorI2RlZmluZSBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8oKQkvKiBlbXB0eSAqLworCisjZGVmaW5lIERCVVNfQ0xPU0VfU09DS0VUKHMpIGNsb3NlKHMpCisKKyNlbmRpZiAvKiAhV2luMzIgKi8KKworI2VuZGlmIC8qIERCVVNfU09DS0VUU19IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3Bhd24td2luLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3Bhd24td2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjODM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zcGF3bi13aW4uYwpAQCAtMCwwICsxLDk0MSBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisvLyNkZWZpbmUgU1BBV05fREVCVUcKKworI2lmICFkZWZpbmVkKFNQQVdOX0RFQlVHKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBQSU5HKCkKKyNlbHNlCisjZGVmaW5lIFBJTkcoKSBmcHJpbnRmIChzdGRlcnIsICIlczolczolZFxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBmZmx1c2ggKHN0ZGVycikKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNwYXduLXdpbjMyLmMgV3JhcHBlciBhcm91bmQgZ19zcGF3bgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5vdmVsbCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgImRidXMtc3Bhd24uaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorLy8jZGVmaW5lIFNUUklDVAorLy8jaW5jbHVkZSA8d2luZG93cy5oPgorLy8jdW5kZWYgU1RSSUNUCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZuZGVmIERCVVNfV0lOQ0UKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworLyoqCisgKiBCYWJ5c2l0dGVyIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqLworc3RydWN0IERCdXNCYWJ5c2l0dGVyCisgIHsKKyAgICBpbnQgcmVmY291bnQ7CisKKyAgICBIQU5ETEUgc3RhcnRfc3luY19ldmVudDsKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisKKyAgICBIQU5ETEUgZW5kX3N5bmNfZXZlbnQ7CisjZW5kaWYKKworICAgIGNoYXIgKmV4ZWN1dGFibGU7CisgICAgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgY2hpbGRfc2V0dXA7CisgICAgdm9pZCAqdXNlcl9kYXRhOworCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgY2hhciAqKmVudnA7CisKKyAgICBIQU5ETEUgY2hpbGRfaGFuZGxlOworICAgIGludCBzb2NrZXRfdG9fYmFieXNpdHRlcjsJLyogQ29ubmVjdGlvbiB0byB0aGUgYmFieXNpdHRlciB0aHJlYWQgKi8KKyAgICBpbnQgc29ja2V0X3RvX21haW47CisKKyAgICBEQnVzV2F0Y2hMaXN0ICp3YXRjaGVzOworICAgIERCdXNXYXRjaCAqc2l0dGVyX3dhdGNoOworCisgICAgZGJ1c19ib29sX3QgaGF2ZV9zcGF3bl9lcnJubzsKKyAgICBpbnQgc3Bhd25fZXJybm87CisgICAgZGJ1c19ib29sX3QgaGF2ZV9jaGlsZF9zdGF0dXM7CisgICAgaW50IGNoaWxkX3N0YXR1czsKKyAgfTsKKworc3RhdGljIERCdXNCYWJ5c2l0dGVyKgorX2RidXNfYmFieXNpdHRlcl9uZXcgKHZvaWQpCit7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisKKyAgc2l0dGVyID0gZGJ1c19uZXcwIChEQnVzQmFieXNpdHRlciwgMSk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzaXR0ZXItPnJlZmNvdW50ID0gMTsKKworICBzaXR0ZXItPnN0YXJ0X3N5bmNfZXZlbnQgPSBDcmVhdGVFdmVudCAoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgaWYgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQgPSBDcmVhdGVFdmVudCAoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgaWYgKHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgc2l0dGVyLT5jaGlsZF9oYW5kbGUgPSBOVUxMOworCisgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSBzaXR0ZXItPnNvY2tldF90b19tYWluID0gLTE7CisKKyAgc2l0dGVyLT5hcmdjID0gMDsKKyAgc2l0dGVyLT5hcmd2ID0gTlVMTDsKKyAgc2l0dGVyLT5lbnZwID0gTlVMTDsKKworICBzaXR0ZXItPndhdGNoZXMgPSBfZGJ1c193YXRjaF9saXN0X25ldyAoKTsKKyAgaWYgKHNpdHRlci0+d2F0Y2hlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc2l0dGVyLT5oYXZlX3NwYXduX2Vycm5vID0gRkFMU0U7CisgIHNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMgPSBGQUxTRTsKKworICByZXR1cm4gc2l0dGVyOworfQorCisvKioKKyAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBiYWJ5c2l0dGVyIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcmV0dXJucyB0aGUgYmFieXNpdHRlcgorICovCitEQnVzQmFieXNpdHRlciAqCitfZGJ1c19iYWJ5c2l0dGVyX3JlZiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgUElORygpOworICBfZGJ1c19hc3NlcnQgKHNpdHRlciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPnJlZmNvdW50ID4gMCk7CisKKyAgc2l0dGVyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBzaXR0ZXI7Cit9CisKKy8qKgorICogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIGJhYnlzaXR0ZXIgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqLwordm9pZAorX2RidXNfYmFieXNpdHRlcl91bnJlZiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgaW50IGk7CisKKyAgUElORygpOworICBfZGJ1c19hc3NlcnQgKHNpdHRlciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPnJlZmNvdW50ID4gMCk7CisKKyAgc2l0dGVyLT5yZWZjb3VudCAtPSAxOworCisgIGlmIChzaXR0ZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaWYgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsIE5VTEwpOworICAgICAgICAgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT5zb2NrZXRfdG9fbWFpbiAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2l0dGVyLT5zb2NrZXRfdG9fbWFpbiwgTlVMTCk7CisgICAgICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fbWFpbiA9IC0xOworICAgICAgICB9CisKKyAgICAgIFBJTkcoKTsKKyAgICAgIGlmIChzaXR0ZXItPmFyZ3YgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXR0ZXItPmFyZ2M7IGkrKykKKyAgICAgICAgICAgIGlmIChzaXR0ZXItPmFyZ3ZbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRidXNfZnJlZSAoc2l0dGVyLT5hcmd2W2ldKTsKKyAgICAgICAgICAgICAgICBzaXR0ZXItPmFyZ3ZbaV0gPSBOVUxMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgZGJ1c19mcmVlIChzaXR0ZXItPmFyZ3YpOworICAgICAgICAgIHNpdHRlci0+YXJndiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHNpdHRlci0+ZW52cCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqKmUgPSBzaXR0ZXItPmVudnA7CisKKyAgICAgICAgICB3aGlsZSAoKmUpCisgICAgICAgICAgICBkYnVzX2ZyZWUgKCplKyspOworICAgICAgICAgIGRidXNfZnJlZSAoc2l0dGVyLT5lbnZwKTsKKyAgICAgICAgICBzaXR0ZXItPmVudnAgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChzaXR0ZXItPmNoaWxkX2hhbmRsZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQ2xvc2VIYW5kbGUgKHNpdHRlci0+Y2hpbGRfaGFuZGxlKTsKKyAgICAgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICAgICAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChzaXR0ZXItPndhdGNoZXMpCisgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAoc2l0dGVyLT53YXRjaGVzKTsKKworICAgICAgaWYgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgUElORygpOworICAgICAgICAgIENsb3NlSGFuZGxlIChzaXR0ZXItPnN0YXJ0X3N5bmNfZXZlbnQpOworICAgICAgICAgIHNpdHRlci0+c3RhcnRfc3luY19ldmVudCA9IE5VTEw7CisgICAgICAgIH0KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKyAgICAgIGlmIChzaXR0ZXItPmVuZF9zeW5jX2V2ZW50ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBDbG9zZUhhbmRsZSAoc2l0dGVyLT5lbmRfc3luY19ldmVudCk7CisgICAgICAgICAgc2l0dGVyLT5lbmRfc3luY19ldmVudCA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICBkYnVzX2ZyZWUgKHNpdHRlci0+ZXhlY3V0YWJsZSk7CisKKyAgICAgIGRidXNfZnJlZSAoc2l0dGVyKTsKKyAgICB9Cit9CisKK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgUElORygpOworICBpZiAoc2l0dGVyLT5jaGlsZF9oYW5kbGUgPT0gTlVMTCkKKyAgICByZXR1cm47IC8qIGNoaWxkIGlzIGFscmVhZHkgZGVhZCwgb3Igd2UncmUgc28gaG9zZWQgd2UnbGwgbmV2ZXIgcmVjb3ZlciAqLworCisgIFBJTkcoKTsKKyAgVGVybWluYXRlUHJvY2VzcyAoc2l0dGVyLT5jaGlsZF9oYW5kbGUsIDEyMzQ1KTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgY2hpbGQgaGFzIGV4aXRlZCwgd2l0aG91dCBibG9ja2luZy4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIFBJTkcoKTsKKyAgcmV0dXJuIChzaXR0ZXItPmNoaWxkX2hhbmRsZSA9PSBOVUxMKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQuIFdlIGRvIHRoaXMgc28gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMKKyAqIGRldGFpbCBpcyBub3QgY2x1dHRlcmluZyB1cCBkYnVzLCBmb3IgZXhhbXBsZSB0aGUgc3lzdGVtIGxhdW5jaGVyIGNvZGUuCisgKiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgY2hpbGQgaGFzIGV4aXRlZCwgaS5lLiBjYWxsCisgKiBfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQoKS4gSXQgcmV0dXJucyBGQUxTRSBpZiB0aGUgY2hpbGQKKyAqIGRpZCBub3QgcmV0dXJuIGEgc3RhdHVzIGNvZGUsIGUuZy4gYmVjYXVzZSB0aGUgY2hpbGQgd2FzIHNpZ25hbGVkCisgKiBvciB3ZSBmYWlsZWQgdG8gZXZlciBsYXVuY2ggdGhlIGNoaWxkIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gc3RhdHVzIHRoZSByZXR1cm5lZCBzdGF0dXMgY29kZQorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzIChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpzdGF0dXMpCit7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNoaWxkIGhhcyBub3QgZXhpdGVkIik7CisKKyAgaWYgKCFzaXR0ZXItPmhhdmVfY2hpbGRfc3RhdHVzIHx8CisgICAgICBzaXR0ZXItPmNoaWxkX3N0YXR1cyA9PSBTVElMTF9BQ1RJVkUpCisgICAgcmV0dXJuIEZBTFNFOworCisgICpzdGF0dXMgPSBzaXR0ZXItPmNoaWxkX3N0YXR1czsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgI0RCdXNFcnJvciB3aXRoIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGUgc3Bhd25lZAorICogY2hpbGQgcHJvY2VzcyBleGl0ZWQgKG9uIGEgc2lnbmFsLCBvciB3aGF0ZXZlcikuIElmCisgKiB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgbm90IGV4aXRlZCwgZG9lcyBub3RoaW5nIChlcnJvcgorICogd2lsbCByZW1haW4gdW5zZXQpLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEBwYXJhbSBlcnJvciBhbiBlcnJvciB0byBmaWxsIGluCisgKi8KK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIFBJTkcoKTsKKyAgaWYgKCFfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKHNpdHRlcikpCisgICAgcmV0dXJuOworCisgIFBJTkcoKTsKKyAgaWYgKHNpdHRlci0+aGF2ZV9zcGF3bl9lcnJubykKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoc2l0dGVyLT5zcGF3bl9lcnJubyk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBleGVjdXRlIHByb2dyYW0gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmV4ZWN1dGFibGUsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICB9CisgIGVsc2UgaWYgKHNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMpCisgICAgeworICAgICAgUElORygpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXhlY3V0YWJsZSwgc2l0dGVyLT5jaGlsZF9zdGF0dXMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBJTkcoKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgJXMgZXhpdGVkLCBzdGF0dXMgdW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5leGVjdXRhYmxlKTsKKyAgICB9CisgIFBJTkcoKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBQSU5HKCk7CisgIHJldHVybiBfZGJ1c193YXRjaF9saXN0X3NldF9mdW5jdGlvbnMgKHNpdHRlci0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgICAgKndhdGNoLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gZGF0YTsKKworICAvKiBPbiBVbml4IGRidXMtc3Bhd24gdXNlcyBhIGJhYnlzaXR0ZXIgKnByb2Nlc3MqLCB0aHVzIGl0IGhhcyB0bworICAgKiBhY3R1YWxseSBzZW5kIHRoZSBleGl0IHN0YXR1c2VzLCBlcnJvciBjb2RlcyBhbmQgd2hhdG5vdCB0aHJvdWdoCisgICAqIHNvY2tldHMgYW5kL29yIHBpcGVzLiBPbiBXaW4zMiwgdGhlIGJhYnlzaXR0ZXIgaXMganVzIGEgdGhyZWFkLAorICAgKiBzbyBpdCBjYW4gc2V0IHRoZSBzdGF0dXMgZmllbGRzIGRpcmVjdGx5IGluIHRoZSBiYWJ5c2l0dGVyIHN0cnVjdAorICAgKiBqdXN0IGZpbmUuIFRoZSBzb2NrZXQgcGlwZSBpcyB1c2VkIGp1c3Qgc28gd2UgY2FuIHdhdGNoIGl0IHdpdGgKKyAgICogc2VsZWN0KCksIGFzIHNvb24gYXMgYW55dGhpbmcgaXMgd3JpdHRlbiB0byBpdCB3ZSBrbm93IHRoYXQgdGhlCisgICAqIGJhYnlzaXR0ZXIgdGhyZWFkIGhhcyByZWNvcmRlZCB0aGUgc3RhdHVzIGluIHRoZSBiYWJ5c2l0dGVyCisgICAqIHN0cnVjdC4KKyAgICovCisKKyAgUElORygpOworICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsIE5VTEwpOworICBQSU5HKCk7CisgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSAtMTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcHJvdGVjdF9hcmd2IGxpZnRlZCBmcm9tIEdMaWIsIHJlbGljZW5zZWQgYnkgYXV0aG9yLCBUb3IgTGlsbHF2aXN0ICovCitzdGF0aWMgaW50Citwcm90ZWN0X2FyZ3YgKGNoYXIgICoqYXJndiwKKyAgICAgICAgICAgICAgY2hhciAqKipuZXdfYXJndikKK3sKKyAgaW50IGk7CisgIGludCBhcmdjID0gMDsKKworICB3aGlsZSAoYXJndlthcmdjXSkKKyAgICArK2FyZ2M7CisgICpuZXdfYXJndiA9IGRidXNfbWFsbG9jICgoYXJnYyArIDEpICogc2l6ZW9mIChjaGFyICopKTsKKyAgaWYgKCpuZXdfYXJndiA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgICgqbmV3X2FyZ3YpW2ldID0gTlVMTDsKKworICAvKiBRdW90ZSBlYWNoIGFyZ3YgZWxlbWVudCBpZiBuZWNlc3NhcnksIHNvIHRoYXQgaXQgd2lsbCBnZXQKKyAgICogcmVjb25zdHJ1Y3RlZCBjb3JyZWN0bHkgaW4gdGhlIEMgcnVudGltZSBzdGFydHVwIGNvZGUuICBOb3RlIHRoYXQKKyAgICogdGhlIHVucXVvdGluZyBhbGdvcml0aG0gaW4gdGhlIEMgcnVudGltZSBpcyByZWFsbHkgd2VpcmQsIGFuZAorICAgKiByYXRoZXIgZGlmZmVyZW50IHRoYW4gd2hhdCBVbml4IHNoZWxscyBkby4gU2VlIHN0ZGFyZ3YuYyBpbiB0aGUgQworICAgKiBydW50aW1lIHNvdXJjZXMgKGluIHRoZSBQbGF0Zm9ybSBTREssIGluIHNyYy9jcnQpLgorICAgKgorICAgKiBOb3RlIHRoYXQgYW4gbmV3X2FyZ3ZbMF0gY29uc3RydWN0ZWQgYnkgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAgICogKm5vdCogYmUgcGFzc2VkIGFzIHRoZSBmaWxlbmFtZSBhcmd1bWVudCB0byBhIHNwYXduKiBvciBleGVjKgorICAgKiBmYW1pbHkgZnVuY3Rpb24uIFRoYXQgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSByZWFsIGZpbGUgbmFtZQorICAgKiB3aXRob3V0IGFueSBxdW90aW5nLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjaGFyICpwID0gYXJndltpXTsKKyAgICAgIGNoYXIgKnE7CisgICAgICBpbnQgbGVuID0gMDsKKyAgICAgIGludCBuZWVkX2RibHF1b3RlcyA9IEZBTFNFOworICAgICAgd2hpbGUgKCpwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorICAgICAgICAgICAgbmVlZF9kYmxxdW90ZXMgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKCpwID09ICciJykKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICAgIGVsc2UgaWYgKCpwID09ICdcXCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKnBwID0gcDsKKyAgICAgICAgICAgICAgd2hpbGUgKCpwcCAmJiAqcHAgPT0gJ1xcJykKKyAgICAgICAgICAgICAgICBwcCsrOworICAgICAgICAgICAgICBpZiAoKnBwID09ICciJykKKyAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICBwKys7CisgICAgICAgIH0KKworICAgICAgcSA9ICgqbmV3X2FyZ3YpW2ldID0gZGJ1c19tYWxsb2MgKGxlbiArIG5lZWRfZGJscXVvdGVzKjIgKyAxKTsKKworICAgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisKKyAgICAgIHAgPSBhcmd2W2ldOworCisgICAgICBpZiAobmVlZF9kYmxxdW90ZXMpCisgICAgICAgICpxKysgPSAnIic7CisKKyAgICAgIHdoaWxlICgqcCkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSAnIicpCisgICAgICAgICAgICAqcSsrID0gJ1xcJzsKKyAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICpwcCA9IHA7CisgICAgICAgICAgICAgIHdoaWxlICgqcHAgJiYgKnBwID09ICdcXCcpCisgICAgICAgICAgICAgICAgcHArKzsKKyAgICAgICAgICAgICAgaWYgKCpwcCA9PSAnIicpCisgICAgICAgICAgICAgICAgKnErKyA9ICdcXCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgKnErKyA9ICpwOworICAgICAgICAgIHArKzsKKyAgICAgICAgfQorCisgICAgICBpZiAobmVlZF9kYmxxdW90ZXMpCisgICAgICAgICpxKysgPSAnIic7CisgICAgICAqcSsrID0gJ1wwJzsKKyAgICAgIC8qIHByaW50ZiAoImFyZ3ZbJWRdOiVzLCBuZWVkX2RibHF1b3RlczolcyBsZW46JWQgPT4gJXNcbiIsIGksIGFyZ3ZbaV0sIG5lZWRfZGJscXVvdGVzPyJUUlVFIjoiRkFMU0UiLCBsZW4sICgqbmV3X2FyZ3YpW2ldKTsgKi8KKyAgICB9CisgICgqbmV3X2FyZ3YpW2FyZ2NdID0gTlVMTDsKKworICByZXR1cm4gYXJnYzsKK30KKworCisvKiBGcm9tIEdQR01FLCByZWxpY2Vuc2VkIGJ5IGcxMCBDb2RlIEdtYkguICAqLworc3RhdGljIGNoYXIgKgorY29tcG9zZV9zdHJpbmcgKGNoYXIgKipzdHJpbmdzLCBjaGFyIHNlcGFyYXRvcikKK3sKKyAgaW50IGk7CisgIGludCBuID0gMDsKKyAgY2hhciAqYnVmOworICBjaGFyICpwOworICBjb25zdCBjaGFyICpwdHI7CisgIAorICBpZiAoIXN0cmluZ3MgfHwgIXN0cmluZ3NbMF0pCisgICAgcmV0dXJuIDA7CisgIGZvciAoaSA9IDA7IHN0cmluZ3NbaV07IGkrKykKKyAgICBuICs9IHN0cmxlbiAoc3RyaW5nc1tpXSkgKyAxOworICBuKys7CisKKyAgYnVmID0gcCA9IG1hbGxvYyAobik7CisgIGlmICghYnVmKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGkgPSAwOyBzdHJpbmdzW2ldOyBpKyspCisgICAgeworICAgICAgc3RyY3B5IChwLCBzdHJpbmdzW2ldKTsKKyAgICAgIHAgKz0gc3RybGVuIChzdHJpbmdzW2ldKTsKKyAgICAgICoocCsrKSA9IHNlcGFyYXRvcjsKKyAgICB9CisgIHAtLTsKKyAgKihwKyspID0gJ1wwJzsKKyAgKnAgPSAnXDAnOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICoKK2J1aWxkX2NvbW1hbmRsaW5lIChjaGFyICoqYXJndikKK3sKKyAgcmV0dXJuIGNvbXBvc2Vfc3RyaW5nIChhcmd2LCAnICcpOworfQorCitzdGF0aWMgY2hhciAqCitidWlsZF9lbnZfc3RyaW5nIChjaGFyKiogZW52cCkKK3sKKyAgcmV0dXJuIGNvbXBvc2Vfc3RyaW5nIChlbnZwLCAnXDAnKTsKK30KKworc3RhdGljIEhBTkRMRQorc3Bhd25fcHJvZ3JhbSAoY2hhciogbmFtZSwgY2hhcioqIGFyZ3YsIGNoYXIqKiBlbnZwKQoreworICBQUk9DRVNTX0lORk9STUFUSU9OIHBpID0geyBOVUxMLCAwLCAwLCAwIH07CisgIFNUQVJUVVBJTkZPQSBzaTsKKyAgY2hhciAqYXJnX3N0cmluZywgKmVudl9zdHJpbmc7CisgIEJPT0wgcmVzdWx0OworCisjaWZkZWYgREJVU19XSU5DRQorICBpZiAoYXJndiAmJiBhcmd2WzBdKQorICAgIGFyZ19zdHJpbmcgPSBidWlsZF9jb21tYW5kbGluZSAoYXJndiArIDEpOworICBlbHNlCisgICAgYXJnX3N0cmluZyA9IE5VTEw7CisjZWxzZQorICBhcmdfc3RyaW5nID0gYnVpbGRfY29tbWFuZGxpbmUgKGFyZ3YpOworI2VuZGlmCisgIGlmICghYXJnX3N0cmluZykKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgZW52X3N0cmluZyA9IGJ1aWxkX2Vudl9zdHJpbmcoZW52cCk7CisKKyAgbWVtc2V0ICgmc2ksIDAsIHNpemVvZiAoc2kpKTsKKyAgc2kuY2IgPSBzaXplb2YgKHNpKTsKKyNpZmRlZiBEQlVTX1dJTkNFCisgIHJlc3VsdCA9IENyZWF0ZVByb2Nlc3NBIChuYW1lLCBhcmdfc3RyaW5nLCBOVUxMLCBOVUxMLCBGQUxTRSwgMCwKKyNlbHNlCisgIHJlc3VsdCA9IENyZWF0ZVByb2Nlc3NBIChOVUxMLCBhcmdfc3RyaW5nLCBOVUxMLCBOVUxMLCBGQUxTRSwgMCwKKyNlbmRpZgorCQkJICAgKExQVk9JRCllbnZfc3RyaW5nLCBOVUxMLCAmc2ksICZwaSk7CisgIGZyZWUgKGFyZ19zdHJpbmcpOworICBpZiAoZW52X3N0cmluZykKKyAgICBmcmVlIChlbnZfc3RyaW5nKTsKKworICBpZiAoIXJlc3VsdCkKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgQ2xvc2VIYW5kbGUgKHBpLmhUaHJlYWQpOworICByZXR1cm4gcGkuaFByb2Nlc3M7Cit9CisKKworc3RhdGljIERXT1JEIF9fc3RkY2FsbAorYmFieXNpdHRlciAodm9pZCAqcGFyYW1ldGVyKQoreworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gKERCdXNCYWJ5c2l0dGVyICopIHBhcmFtZXRlcjsKKyAgaW50IGZkOworICBQSU5HKCk7CisgIF9kYnVzX2JhYnlzaXR0ZXJfcmVmIChzaXR0ZXIpOworCisgIGlmIChzaXR0ZXItPmNoaWxkX3NldHVwKQorICAgIHsKKyAgICAgIFBJTkcoKTsKKyAgICAgICgqc2l0dGVyLT5jaGlsZF9zZXR1cCkgKHNpdHRlci0+dXNlcl9kYXRhKTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImJhYnlzaXR0ZXI6IHNwYXduaW5nICVzXG4iLCBzaXR0ZXItPmV4ZWN1dGFibGUpOworCisgIFBJTkcoKTsKKyAgc2l0dGVyLT5jaGlsZF9oYW5kbGUgPSBzcGF3bl9wcm9ncmFtIChzaXR0ZXItPmV4ZWN1dGFibGUsCisJCQkJCXNpdHRlci0+YXJndiwgc2l0dGVyLT5lbnZwKTsKKworICBQSU5HKCk7CisgIGlmIChzaXR0ZXItPmNoaWxkX2hhbmRsZSA9PSAoSEFORExFKSAtMSkKKyAgICB7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisgICAgICBzaXR0ZXItPmhhdmVfc3Bhd25fZXJybm8gPSBUUlVFOworICAgICAgc2l0dGVyLT5zcGF3bl9lcnJubyA9IEdldExhc3RFcnJvcigpOworICAgIH0KKyAgCisgIFBJTkcoKTsKKyAgU2V0RXZlbnQgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCk7CisKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlICE9IE5VTEwpCisgICAgeworICAgICAgaW50IHJldDsKKyAgICAgIERXT1JEIHN0YXR1czsKKworICAgICAgUElORygpOworICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCAoc2l0dGVyLT5jaGlsZF9oYW5kbGUsIElORklOSVRFKTsKKworICAgICAgUElORygpOworICAgICAgcmV0ID0gR2V0RXhpdENvZGVQcm9jZXNzIChzaXR0ZXItPmNoaWxkX2hhbmRsZSwgJnN0YXR1cyk7CisKKyAgICAgIHNpdHRlci0+Y2hpbGRfc3RhdHVzID0gc3RhdHVzOworICAgICAgc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyA9IFRSVUU7CisKKyAgICAgIENsb3NlSGFuZGxlIChzaXR0ZXItPmNoaWxkX2hhbmRsZSk7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisgICAgfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBTZXRFdmVudCAoc2l0dGVyLT5lbmRfc3luY19ldmVudCk7CisjZW5kaWYKKworICBQSU5HKCk7CisgIHNlbmQgKHNpdHRlci0+c29ja2V0X3RvX21haW4sICIgIiwgMSwgMCk7CisKKyAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICByZXR1cm4gMDsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICoqc2l0dGVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAqKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAqKmVudnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTcGF3bkNoaWxkU2V0dXBGdW5jICAgIGNoaWxkX3NldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgKmVycm9yKQoreworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBIQU5ETEUgc2l0dGVyX3RocmVhZDsKKyAgRFdPUkQgc2l0dGVyX3RocmVhZF9pZDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICpzaXR0ZXJfcCA9IE5VTEw7CisKKyAgUElORygpOworICBzaXR0ZXIgPSBfZGJ1c19iYWJ5c2l0dGVyX25ldyAoKTsKKyAgaWYgKHNpdHRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2l0dGVyLT5jaGlsZF9zZXR1cCA9IGNoaWxkX3NldHVwOworICBzaXR0ZXItPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKworICBzaXR0ZXItPmV4ZWN1dGFibGUgPSBfZGJ1c19zdHJkdXAgKGFyZ3ZbMF0pOworICBpZiAoc2l0dGVyLT5leGVjdXRhYmxlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBQSU5HKCk7CisgIGlmICghX2RidXNfZnVsbF9kdXBsZXhfcGlwZSAoJnNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpdHRlci0+c29ja2V0X3RvX21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIGVycm9yKSkKKyAgICBnb3RvIG91dDA7CisKKyAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgaGFuZGxlX3dhdGNoLCBzaXR0ZXIsIE5VTEwpOworICBQSU5HKCk7CisgIGlmIChzaXR0ZXItPnNpdHRlcl93YXRjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgUElORygpOworICBpZiAoIV9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPnNpdHRlcl93YXRjaCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBzaXR0ZXItPmFyZ2MgPSBwcm90ZWN0X2FyZ3YgKGFyZ3YsICZzaXR0ZXItPmFyZ3YpOworICBpZiAoc2l0dGVyLT5hcmdjID09IC0xKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisgIHNpdHRlci0+ZW52cCA9IGVudnA7CisKKyAgUElORygpOworICBzaXR0ZXJfdGhyZWFkID0gKEhBTkRMRSkgQ3JlYXRlVGhyZWFkIChOVUxMLCAwLCBiYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgc2l0dGVyLCAwLCAmc2l0dGVyX3RocmVhZF9pZCk7CisKKyAgaWYgKHNpdHRlcl90aHJlYWQgPT0gMCkKKyAgICB7CisgICAgICBQSU5HKCk7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRk9SS19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgbmV3IHRocmVhZCIpOworICAgICAgZ290byBvdXQwOworICAgIH0KKyAgQ2xvc2VIYW5kbGUgKHNpdHRlcl90aHJlYWQpOworCisgIFBJTkcoKTsKKyAgV2FpdEZvclNpbmdsZU9iamVjdCAoc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50LCBJTkZJTklURSk7CisKKyAgUElORygpOworICBpZiAoc2l0dGVyX3AgIT0gTlVMTCkKKyAgICAqc2l0dGVyX3AgPSBzaXR0ZXI7CisgIGVsc2UKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIFBJTkcoKTsKKyAgcmV0dXJuIFRSVUU7CisKK291dDA6CisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisjZGVmaW5lIExJVkVfQ0hJTERSRU4oc2l0dGVyKSAoKHNpdHRlciktPmNoaWxkX2hhbmRsZSAhPSBOVUxMKQorCitzdGF0aWMgdm9pZAorX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKHNpdHRlci0+ZW5kX3N5bmNfZXZlbnQsIElORklOSVRFKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9ub25leGlzdGVudCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgc2l0dGVyID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBub25leGlzdGVudCBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gIi90aGlzL2RvZXMvbm90L2V4aXN0LzMyNTQyc2RnYWZnYWZkZyI7CisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsIGFyZ3YsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBub25leGlzdGVudCBleGVjdXRhYmxlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgbm9uZXhpc3RlbnQgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9zZWdmYXVsdCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgc2l0dGVyID0gTlVMTDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBzZWdmYXVsdCBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gVEVTVF9TRUdGQVVMVF9CSU5BUlk7CisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsIGFyZ3YsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBzZWdmYXVsdGluZyBiaW5hcnlcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9leGl0ICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBzaXR0ZXIgPSBOVUxMOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIGV4aXQgZmFpbHVyZSBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gVEVTVF9FWElUX0JJTkFSWTsKKyAgaWYgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoJnNpdHRlciwgYXJndiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgbGF1bmNoaW5nIGJpbmFyeSB0aGF0IGV4aXRlZCB3aXRoIGZhaWx1cmUgY29kZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpIHx8CisgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGxhdW5jaGluZyBleGl0aW5nIGV4ZWN1dGFibGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fYW5kX2tpbGwgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHNpdHRlciA9IE5VTEw7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIC8qKiogVGVzdCBsYXVuY2hpbmcgc2xlZXBpbmcgYmluYXJ5IHRoZW4ga2lsbGluZyBpdCAqLworCisgIGFyZ3ZbMF0gPSBURVNUX1NMRUVQX0ZPUkVWRVJfQklOQVJZOworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCBhcmd2LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAoc2l0dGVyKTsKKworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgYWZ0ZXIga2lsbGluZyBzcGF3bmVkIGJpbmFyeVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpIHx8CisgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGtpbGxpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9ub25leGlzdGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX25vbmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRG9uJ3QgcnVuIHRoZSBvYm5veGlvdXMgc2VnZmF1bHQgdGVzdCBieSBkZWZhdWx0LAorICAgKiBpdCdzIGEgcGFpbiB0byBoYXZlIHRvIGNsaWNrIGFsbCB0aG9zZSBlcnJvciBib3hlcy4KKyAgICovCisgIGlmIChnZXRlbnYgKCJET19TRUdGQVVMVF9URVNUIikpCisgICAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX3NlZ2ZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9zZWdmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fZXhpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX2V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fYW5kX2tpbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9hbmRfa2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3Bhd24uYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zcGF3bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYmFiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3Bhd24uYwpAQCAtMCwwICsxLDE1MDQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zcGF3bi5jIFdyYXBwZXIgYXJvdW5kIGZvcmsvZXhlYworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJkYnVzLXNwYXduLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworLyoKKyAqIEknbSBwcmV0dHkgc3VyZSB0aGlzIHdob2xlIHNwYXduIGZpbGUgY291bGQgYmUgbWFkZSBzaW1wbGVyLAorICogaWYgeW91IHRob3VnaHQgYWJvdXQgaXQgYSBiaXQuCisgKi8KKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3Igc3RhdHVzIG9mIGEgcmVhZCgpCisgKi8KK3R5cGVkZWYgZW51bQoreworICBSRUFEX1NUQVRVU19PSywgICAgLyoqPCBSZWFkIHN1Y2NlZWRlZCAqLworICBSRUFEX1NUQVRVU19FUlJPUiwgLyoqPCBTb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgUkVBRF9TVEFUVVNfRU9GICAgIC8qKjwgRU9GIHJldHVybmVkICovCit9IFJlYWRTdGF0dXM7CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX2ludHMgKGludCAgICAgICAgZmQsCisJICAgaW50ICAgICAgICpidWYsCisJICAgaW50ICAgICAgICBuX2ludHNfaW5fYnVmLAorCSAgIGludCAgICAgICAqbl9pbnRzX3JlYWQsCisJICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsgICAgCisgIFJlYWRTdGF0dXMgcmV0dmFsOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOworICAgICAgc2l6ZV90IHRvX3JlYWQ7CisKKyAgICAgIHRvX3JlYWQgPSBzaXplb2YgKGludCkgKiBuX2ludHNfaW5fYnVmIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgYWdhaW46CisgICAgICAKKyAgICAgIGNodW5rID0gcmVhZCAoZmQsCisgICAgICAgICAgICAgICAgICAgICgoY2hhciopYnVmKSArIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICB0b19yZWFkKTsKKyAgICAgIAorICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgKm5faW50c19yZWFkID0gKGludCkoYnl0ZXMgLyBzaXplb2YoaW50KSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfcGlkIChpbnQgICAgICAgIGZkLAorICAgICAgICAgIHBpZF90ICAgICAqYnVmLAorICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIHNpemVfdCBieXRlcyA9IDA7ICAgIAorICBSZWFkU3RhdHVzIHJldHZhbDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IFJFQURfU1RBVFVTX09LOworICAKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsKKyAgICAgIHNpemVfdCB0b19yZWFkOworCisgICAgICB0b19yZWFkID0gc2l6ZW9mIChwaWRfdCkgLSBieXRlczsKKworICAgICAgaWYgKHRvX3JlYWQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICBhZ2FpbjoKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFyKilidWYpICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaW50ZXJtZWRpYXRlIGNoaWxkIGJldHdlZW4gdGhlIG1haW4gcHJvY2VzcworICogYW5kIHRoZSBncmFuZGNoaWxkLiBUaGUgZ3JhbmRjaGlsZCBpcyBvdXIgc3Bhd25lZCBwcm9jZXNzLiBUaGUgaW50ZXJtZWRpYXRlCisgKiBjaGlsZCBpcyBhIGJhYnlzaXR0ZXIgcHJvY2VzczsgaXQga2VlcHMgdHJhY2sgb2Ygd2hlbiB0aGUgZ3JhbmRjaGlsZAorICogZXhpdHMvY3Jhc2hlcywgYW5kIHJlYXBzIHRoZSBncmFuZGNoaWxkLgorICovCisKKy8qIE1lc3NhZ2VzIGZyb20gY2hpbGRyZW4gdG8gcGFyZW50cyAqLworZW51bQoreworICBDSElMRF9FWElURUQsICAgICAgICAgICAgLyogVGhpcyBtZXNzYWdlIGlzIGZvbGxvd2VkIGJ5IHRoZSBleGl0IHN0YXR1cyBpbnQgKi8KKyAgQ0hJTERfRk9SS19GQUlMRUQsICAgICAgIC8qIEZvbGxvd2VkIGJ5IGVycm5vICovCisgIENISUxEX0VYRUNfRkFJTEVELCAgICAgICAvKiBGb2xsb3dlZCBieSBlcnJubyAqLworICBDSElMRF9QSUQgICAgICAgICAgICAgICAgLyogRm9sbG93ZWQgYnkgcGlkX3QgKi8KK307CisKKy8qKgorICogQmFieXNpdHRlciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKi8KK3N0cnVjdCBEQnVzQmFieXNpdHRlcgoreworICBpbnQgcmVmY291bnQ7IC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisKKyAgY2hhciAqZXhlY3V0YWJsZTsgLyoqPCBleGVjdXRhYmxlIG5hbWUgdG8gdXNlIGluIGVycm9yIG1lc3NhZ2VzICovCisgIAorICBpbnQgc29ja2V0X3RvX2JhYnlzaXR0ZXI7IC8qKjwgQ29ubmVjdGlvbiB0byB0aGUgYmFieXNpdHRlciBwcm9jZXNzICovCisgIGludCBlcnJvcl9waXBlX2Zyb21fY2hpbGQ7IC8qKjwgQ29ubmVjdGlvbiB0byB0aGUgcHJvY2VzcyB0aGF0IGRvZXMgdGhlIGV4ZWMoKSAqLworICAKKyAgcGlkX3Qgc2l0dGVyX3BpZDsgIC8qKjwgUElEIE9mIHRoZSBiYWJ5c2l0dGVyICovCisgIHBpZF90IGdyYW5kY2hpbGRfcGlkOyAvKio8IFBJRCBvZiB0aGUgZ3JhbmRjaGlsZCAqLworCisgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7IC8qKjwgV2F0Y2hlcyAqLworCisgIERCdXNXYXRjaCAqZXJyb3Jfd2F0Y2g7IC8qKjwgRXJyb3IgcGlwZSB3YXRjaCAqLworICBEQnVzV2F0Y2ggKnNpdHRlcl93YXRjaDsgLyoqPCBTaXR0ZXIgcGlwZSB3YXRjaCAqLworCisgIGludCBlcnJudW07IC8qKjwgRXJyb3IgbnVtYmVyICovCisgIGludCBzdGF0dXM7IC8qKjwgRXhpdCBzdGF0dXMgY29kZSAqLworICB1bnNpZ25lZCBpbnQgaGF2ZV9jaGlsZF9zdGF0dXMgOiAxOyAvKio8IFRydWUgaWYgY2hpbGQgc3RhdHVzIGhhcyBiZWVuIHJlYXBlZCAqLworICB1bnNpZ25lZCBpbnQgaGF2ZV9mb3JrX2Vycm51bSA6IDE7IC8qKjwgVHJ1ZSBpZiB3ZSBoYXZlIGFuIGVycm9yIGNvZGUgZnJvbSBmb3JrKCkgKi8KKyAgdW5zaWduZWQgaW50IGhhdmVfZXhlY19lcnJudW0gOiAxOyAvKio8IFRydWUgaWYgd2UgaGF2ZSBhbiBlcnJvciBjb2RlIGZyb20gZXhlYygpICovCit9OworCitzdGF0aWMgREJ1c0JhYnlzaXR0ZXIqCitfZGJ1c19iYWJ5c2l0dGVyX25ldyAodm9pZCkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKworICBzaXR0ZXIgPSBkYnVzX25ldzAgKERCdXNCYWJ5c2l0dGVyLCAxKTsKKyAgaWYgKHNpdHRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHNpdHRlci0+cmVmY291bnQgPSAxOworCisgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSAtMTsKKyAgc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPSAtMTsKKyAgCisgIHNpdHRlci0+c2l0dGVyX3BpZCA9IC0xOworICBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkID0gLTE7CisKKyAgc2l0dGVyLT53YXRjaGVzID0gX2RidXNfd2F0Y2hfbGlzdF9uZXcgKCk7CisgIGlmIChzaXR0ZXItPndhdGNoZXMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIHJldHVybiBzaXR0ZXI7CisKKyBmYWlsZWQ6CisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBiYWJ5c2l0dGVyIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcmV0dXJucyB0aGUgYmFieXNpdHRlcgorICovCitEQnVzQmFieXNpdHRlciAqCitfZGJ1c19iYWJ5c2l0dGVyX3JlZiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT5yZWZjb3VudCA+IDApOworICAKKyAgc2l0dGVyLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBzaXR0ZXI7Cit9CisKKy8qKgorICogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIGJhYnlzaXR0ZXIgb2JqZWN0LgorICogV2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBiYWJ5c2l0dGVyIG9iamVjdCByZWFjaGVzCisgKiB6ZXJvLCB0aGUgYmFieXNpdHRlciBpcyBraWxsZWQgYW5kIHRoZSBjaGlsZCB0aGF0IHdhcyBiZWluZworICogYmFieXNhdCBnZXRzIGVtYW5jaXBhdGVkLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqLwordm9pZAorX2RidXNfYmFieXNpdHRlcl91bnJlZiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT5yZWZjb3VudCA+IDApOworICAKKyAgc2l0dGVyLT5yZWZjb3VudCAtPSAxOworICBpZiAoc2l0dGVyLT5yZWZjb3VudCA9PSAwKQorICAgIHsgICAgICAKKyAgICAgIGlmIChzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB3ZSBoYXZlbid0IGZvcmtlZCBvdGhlciBiYWJ5c2l0dGVycworICAgICAgICAgICAqIHNpbmNlIHRoaXMgYmFieXNpdHRlciBhbmQgc29ja2V0IHdlcmUKKyAgICAgICAgICAgKiBjcmVhdGVkIHRoZW4gdGhpcyBjbG9zZSB3aWxsIGNhdXNlIHRoZQorICAgICAgICAgICAqIGJhYnlzaXR0ZXIgdG8gd2FrZSB1cCBmcm9tIHBvbGwgd2l0aAorICAgICAgICAgICAqIGEgaGFuZ3VwIGFuZCB0aGVuIHRoZSBiYWJ5c2l0dGVyIHdpbGwKKyAgICAgICAgICAgKiBxdWl0IGl0c2VsZi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsIE5VTEwpOworICAgICAgICAgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQsIE5VTEwpOworICAgICAgICAgIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID0gLTE7CisgICAgICAgIH0KKworICAgICAgaWYgKHNpdHRlci0+c2l0dGVyX3BpZCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgICAvKiBJdCdzIHBvc3NpYmxlIHRoZSBiYWJ5c2l0dGVyIGRpZWQgb24gaXRzIG93biBhYm92ZSAKKyAgICAgICAgICAgKiBmcm9tIHRoZSBjbG9zZSwgb3Igd2FzIGtpbGxlZCByYW5kb21seQorICAgICAgICAgICAqIGJ5IHNvbWUgb3RoZXIgcHJvY2Vzcywgc28gZmlyc3QgdHJ5IHRvIHJlYXAgaXQKKyAgICAgICAgICAgKi8KKyAgICAgICAgICByZXQgPSB3YWl0cGlkIChzaXR0ZXItPnNpdHRlcl9waWQsICZzdGF0dXMsIFdOT0hBTkcpOworCisgICAgICAgICAgLyogSWYgd2UgY291bGRuJ3QgcmVhcCB0aGUgY2hpbGQgdGhlbiBraWxsIGl0LCBhbmQKKyAgICAgICAgICAgKiB0cnkgYWdhaW4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICBraWxsIChzaXR0ZXItPnNpdHRlcl9waWQsIFNJR0tJTEwpOworCisgICAgICAgIGFnYWluOgorICAgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgIHJldCA9IHdhaXRwaWQgKHNpdHRlci0+c2l0dGVyX3BpZCwgJnN0YXR1cywgMCk7CisKKyAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgIGdvdG8gYWdhaW47CisgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVDSElMRCkKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQmFieXNpdHRlciBwcm9jZXNzIG5vdCBhdmFpbGFibGUgdG8gYmUgcmVhcGVkOyBzaG91bGQgbm90IGhhcHBlblxuIik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBlcnJvciAlZCBpbiB3YWl0cGlkKCkgZm9yIGJhYnlzaXR0ZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWFwZWQgJWxkLCB3YWl0aW5nIGZvciBiYWJ5c2l0dGVyICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHJldCwgKGxvbmcpIHNpdHRlci0+c2l0dGVyX3BpZCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cykpCisgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkJhYnlzaXR0ZXIgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFWElUU1RBVFVTIChzaXR0ZXItPnN0YXR1cykpOworICAgICAgICAgICAgICBlbHNlIGlmIChXSUZTSUdOQUxFRCAoc2l0dGVyLT5zdGF0dXMpKQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCYWJ5c2l0dGVyIHJlY2VpdmVkIHNpZ25hbCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXVEVSTVNJRyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCYWJ5c2l0dGVyIGV4aXRlZCBhYm5vcm1hbGx5XG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHNpdHRlci0+c2l0dGVyX3BpZCA9IC0xOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChzaXR0ZXItPmVycm9yX3dhdGNoKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+ZXJyb3Jfd2F0Y2gpOworICAgICAgICAgIHNpdHRlci0+ZXJyb3Jfd2F0Y2ggPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChzaXR0ZXItPnNpdHRlcl93YXRjaCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgICAgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoc2l0dGVyLT53YXRjaGVzKQorICAgICAgICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHNpdHRlci0+d2F0Y2hlcyk7CisKKyAgICAgIGRidXNfZnJlZSAoc2l0dGVyLT5leGVjdXRhYmxlKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChzaXR0ZXIpOworICAgIH0KK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfZGF0YSAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZkKQoreworICBpbnQgd2hhdDsKKyAgaW50IGdvdDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBSZWFkU3RhdHVzIHI7CisKKyAgciA9IHJlYWRfaW50cyAoZmQsICZ3aGF0LCAxLCAmZ290LCAmZXJyb3IpOworCisgIHN3aXRjaCAocikKKyAgICB7CisgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcmVhZCBkYXRhIGZyb20gZmQgJWQ6ICVzXG4iLCBmZCwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gcjsKKworICAgIGNhc2UgUkVBRF9TVEFUVVNfRU9GOgorICAgICAgcmV0dXJuIHI7CisKKyAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgaWYgKGdvdCA9PSAxKQorICAgIHsKKyAgICAgIHN3aXRjaCAod2hhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIENISUxEX0VYSVRFRDoKKyAgICAgICAgY2FzZSBDSElMRF9GT1JLX0ZBSUxFRDoKKyAgICAgICAgY2FzZSBDSElMRF9FWEVDX0ZBSUxFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgYXJnOworICAgICAgICAgICAgCisgICAgICAgICAgICByID0gcmVhZF9pbnRzIChmZCwgJmFyZywgMSwgJmdvdCwgJmVycm9yKTsKKworICAgICAgICAgICAgc3dpdGNoIChyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byByZWFkIGFyZyBmcm9tIGZkICVkOiAlc1xuIiwgZmQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGdvdCA9PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gQ0hJTERfRVhJVEVEKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmhhdmVfY2hpbGRfc3RhdHVzID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5zdGF0dXMgPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGNoaWxkIHN0YXR1cyBleGl0ZWQgPSAlZCBzaWduYWxlZCA9ICVkIGV4aXRzdGF0dXMgPSAlZCB0ZXJtc2lnID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJRkVYSVRFRCAoc2l0dGVyLT5zdGF0dXMpLCBXSUZTSUdOQUxFRCAoc2l0dGVyLT5zdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpLCBXVEVSTVNJRyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh3aGF0ID09IENISUxEX0ZPUktfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmhhdmVfZm9ya19lcnJudW0gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmVycm51bSA9IGFyZzsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGZvcmsgZXJybnVtICVkXG4iLCBzaXR0ZXItPmVycm51bSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAod2hhdCA9PSBDSElMRF9FWEVDX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5oYXZlX2V4ZWNfZXJybnVtID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5lcnJudW0gPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWNvcmRlZCBleGVjIGVycm51bSAlZFxuIiwgc2l0dGVyLT5lcnJudW0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENISUxEX1BJRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMTsKKworICAgICAgICAgICAgciA9IHJlYWRfcGlkIChmZCwgJnBpZCwgJmVycm9yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoIChyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byByZWFkIFBJRCBmcm9tIGZkICVkOiAlc1xuIiwgZmQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9IHBpZDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGdyYW5kY2hpbGQgcGlkICVkXG4iLCBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gbWVzc2FnZSByZWNlaXZlZCBmcm9tIGJhYnlzaXR0ZXIgcHJvY2Vzc1xuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkNsb3NpbmcgYmFieXNpdHRlclxuIik7CisgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciwgTlVMTCk7CisgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK2Nsb3NlX2Vycm9yX3BpcGVfZnJvbV9jaGlsZCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkNsb3NpbmcgY2hpbGQgZXJyb3JcbiIpOworICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkLCBOVUxMKTsKKyAgc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9iYWJ5c2l0dGVyX3NvY2tldCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHJldmVudHMpCit7CisgIC8qIEV2ZW4gaWYgd2UgaGF2ZSBQT0xMSFVQLCB3ZSB3YW50IHRvIGtlZXAgcmVhZGluZworICAgKiBkYXRhIHVudGlsIFBPTExJTiBnb2VzIGF3YXk7IHNvIHRoaXMgZnVuY3Rpb24gb25seQorICAgKiBsb29rcyBhdCBIVVAvRVJSIGlmIG5vIElOIGlzIHNldC4KKyAgICovCisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWFkaW5nIGRhdGEgZnJvbSBiYWJ5c2l0dGVyXG4iKTsKKyAgICAgIGlmIChyZWFkX2RhdGEgKHNpdHRlciwgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlcikgIT0gUkVBRF9TVEFUVVNfT0spCisgICAgICAgIGNsb3NlX3NvY2tldF90b19iYWJ5c2l0dGVyIChzaXR0ZXIpOworICAgIH0KKyAgZWxzZSBpZiAocmV2ZW50cyAmIChfREJVU19QT0xMRVJSIHwgX0RCVVNfUE9MTEhVUCkpCisgICAgeworICAgICAgY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKHNpdHRlcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2Vycm9yX3BpcGUgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHJldmVudHMpCit7CisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWFkaW5nIGRhdGEgZnJvbSBjaGlsZCBlcnJvclxuIik7CisgICAgICBpZiAocmVhZF9kYXRhIChzaXR0ZXIsIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkKSAhPSBSRUFEX1NUQVRVU19PSykKKyAgICAgICAgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChzaXR0ZXIpOworICAgIH0KKyAgZWxzZSBpZiAocmV2ZW50cyAmIChfREJVU19QT0xMRVJSIHwgX0RCVVNfUE9MTEhVUCkpCisgICAgeworICAgICAgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChzaXR0ZXIpOworICAgIH0KK30KKworLyogcmV0dXJucyB3aGV0aGVyIHRoZXJlIHdlcmUgYW55IHBvbGwgZXZlbnRzIGhhbmRsZWQgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorYmFieXNpdHRlcl9pdGVyYXRpb24gKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGJsb2NrKQoreworICBEQnVzUG9sbEZEIGZkc1syXTsKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IGRlc2NyaXB0b3JzX3JlYWR5OworCisgIGRlc2NyaXB0b3JzX3JlYWR5ID0gRkFMU0U7CisgIAorICBpID0gMDsKKworICBpZiAoc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPj0gMCkKKyAgICB7CisgICAgICBmZHNbaV0uZmQgPSBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZDsKKyAgICAgIGZkc1tpXS5ldmVudHMgPSBfREJVU19QT0xMSU47CisgICAgICBmZHNbaV0ucmV2ZW50cyA9IDA7CisgICAgICArK2k7CisgICAgfQorICAKKyAgaWYgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPj0gMCkKKyAgICB7CisgICAgICBmZHNbaV0uZmQgPSBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyOworICAgICAgZmRzW2ldLmV2ZW50cyA9IF9EQlVTX1BPTExJTjsKKyAgICAgIGZkc1tpXS5yZXZlbnRzID0gMDsKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKGkgPiAwKQorICAgIHsKKyAgICAgIGludCByZXQ7CisKKyAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICByZXQgPSBfZGJ1c19wb2xsIChmZHMsIGksIDApOworICAgICAgICB9CisgICAgICB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICAgIGlmIChyZXQgPT0gMCAmJiBibG9jaykKKyAgICAgICAgeworICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldCA9IF9kYnVzX3BvbGwgKGZkcywgaSwgLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgICAgICAgfQorCisgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGRlc2NyaXB0b3JzX3JlYWR5ID0gVFJVRTsKKyAgICAgICAgICAKKyAgICAgICAgICB3aGlsZSAoaSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgICAgaWYgKGZkc1tpXS5mZCA9PSBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCkKKyAgICAgICAgICAgICAgICBoYW5kbGVfZXJyb3JfcGlwZSAoc2l0dGVyLCBmZHNbaV0ucmV2ZW50cyk7CisgICAgICAgICAgICAgIGVsc2UgaWYgKGZkc1tpXS5mZCA9PSBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyKQorICAgICAgICAgICAgICAgIGhhbmRsZV9iYWJ5c2l0dGVyX3NvY2tldCAoc2l0dGVyLCBmZHNbaV0ucmV2ZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGRlc2NyaXB0b3JzX3JlYWR5OworfQorCisvKioKKyAqIE1hY3JvIHJldHVybnMgI1RSVUUgaWYgdGhlIGJhYnlzaXR0ZXIgc3RpbGwgaGFzIGxpdmUgc29ja2V0cyBvcGVuIHRvIHRoZQorICogYmFieXNpdHRlciBjaGlsZCBvciB0aGUgZ3JhbmRjaGlsZC4KKyAqLworI2RlZmluZSBMSVZFX0NISUxEUkVOKHNpdHRlcikgKChzaXR0ZXIpLT5zb2NrZXRfdG9fYmFieXNpdHRlciA+PSAwIHx8IChzaXR0ZXIpLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPj0gMCkKKworLyoqCisgKiBCbG9ja3MgdW50aWwgdGhlIGJhYnlzaXR0ZXIgcHJvY2VzcyBnaXZlcyB1cyB0aGUgUElEIG9mIHRoZSBzcGF3bmVkIGdyYW5kY2hpbGQsCisgKiB0aGVuIGtpbGxzIHRoZSBzcGF3bmVkIGdyYW5kY2hpbGQuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlciBvYmplY3QKKyAqLwordm9pZAorX2RidXNfYmFieXNpdHRlcl9raWxsX2NoaWxkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICAvKiBiZSBzdXJlIHdlIGhhdmUgdGhlIFBJRCBvZiB0aGUgY2hpbGQgKi8KKyAgd2hpbGUgKExJVkVfQ0hJTERSRU4gKHNpdHRlcikgJiYKKyAgICAgICAgIHNpdHRlci0+Z3JhbmRjaGlsZF9waWQgPT0gLTEpCisgICAgYmFieXNpdHRlcl9pdGVyYXRpb24gKHNpdHRlciwgVFJVRSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkdvdCBjaGlsZCBQSUQgJWxkIGZvciBraWxsaW5nXG4iLAorICAgICAgICAgICAgICAgICAobG9uZykgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCk7CisgIAorICBpZiAoc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9PSAtMSkKKyAgICByZXR1cm47IC8qIGNoaWxkIGlzIGFscmVhZHkgZGVhZCwgb3Igd2UncmUgc28gaG9zZWQgd2UnbGwgbmV2ZXIgcmVjb3ZlciAqLworCisgIGtpbGwgKHNpdHRlci0+Z3JhbmRjaGlsZF9waWQsIFNJR0tJTEwpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBjaGlsZCBoYXMgZXhpdGVkLCB3aXRob3V0IGJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKworICAvKiBCZSBzdXJlIHdlJ3JlIHVwLXRvLWRhdGUgKi8KKyAgd2hpbGUgKExJVkVfQ0hJTERSRU4gKHNpdHRlcikgJiYKKyAgICAgICAgIGJhYnlzaXR0ZXJfaXRlcmF0aW9uIChzaXR0ZXIsIEZBTFNFKSkKKyAgICA7CisKKyAgLyogV2Ugd2lsbCBoYXZlIGV4aXRlZCB0aGUgYmFieXNpdHRlciB3aGVuIHRoZSBjaGlsZCBoYXMgZXhpdGVkICovCisgIHJldHVybiBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyIDwgMDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQuIFdlIGRvIHRoaXMgc28gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMKKyAqIGRldGFpbCBpcyBub3QgY2x1dHRlcmluZyB1cCBkYnVzLCBmb3IgZXhhbXBsZSB0aGUgc3lzdGVtIGxhdW5jaGVyIGNvZGUuCisgKiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgY2hpbGQgaGFzIGV4aXRlZCwgaS5lLiBjYWxsCisgKiBfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQoKS4gSXQgcmV0dXJucyBGQUxTRSBpZiB0aGUgY2hpbGQKKyAqIGRpZCBub3QgcmV0dXJuIGEgc3RhdHVzIGNvZGUsIGUuZy4gYmVjYXVzZSB0aGUgY2hpbGQgd2FzIHNpZ25hbGVkCisgKiBvciB3ZSBmYWlsZWQgdG8gZXZlciBsYXVuY2ggdGhlIGNoaWxkIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gc3RhdHVzIHRoZSByZXR1cm5lZCBzdGF0dXMgY29kZQorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzIChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpzdGF0dXMpCit7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNoaWxkIGhhcyBub3QgZXhpdGVkIik7CisgIAorICBpZiAoIXNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMgfHwKKyAgICAgICEoV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cykpKQorICAgIHJldHVybiBGQUxTRTsKKworICAqc3RhdHVzID0gV0VYSVRTVEFUVVMgKHNpdHRlci0+c3RhdHVzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgI0RCdXNFcnJvciB3aXRoIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGUgc3Bhd25lZAorICogY2hpbGQgcHJvY2VzcyBleGl0ZWQgKG9uIGEgc2lnbmFsLCBvciB3aGF0ZXZlcikuIElmCisgKiB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgbm90IGV4aXRlZCwgZG9lcyBub3RoaW5nIChlcnJvcgorICogd2lsbCByZW1haW4gdW5zZXQpLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEBwYXJhbSBlcnJvciBhbiBlcnJvciB0byBmaWxsIGluCisgKi8KK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIHJldHVybjsKKworICAvKiBOb3RlIHRoYXQgaWYgZXhlYyBmYWlscywgd2Ugd2lsbCBhbHNvIGdldCBhIGNoaWxkIHN0YXR1cworICAgKiBmcm9tIHRoZSBiYWJ5c2l0dGVyIHNheWluZyB0aGUgY2hpbGQgZXhpdGVkLAorICAgKiBzbyB3ZSBuZWVkIHRvIGdpdmUgcHJpb3JpdHkgdG8gdGhlIGV4ZWMgZXJyb3IKKyAgICovCisgIGlmIChzaXR0ZXItPmhhdmVfZXhlY19lcnJudW0pCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSBwcm9ncmFtICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5leGVjdXRhYmxlLCBfZGJ1c19zdHJlcnJvciAoc2l0dGVyLT5lcnJudW0pKTsKKyAgICB9CisgIGVsc2UgaWYgKHNpdHRlci0+aGF2ZV9mb3JrX2Vycm51bSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZm9yayBhIG5ldyBwcm9jZXNzICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5leGVjdXRhYmxlLCBfZGJ1c19zdHJlcnJvciAoc2l0dGVyLT5lcnJudW0pKTsKKyAgICB9CisgIGVsc2UgaWYgKHNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMpCisgICAgeworICAgICAgaWYgKFdJRkVYSVRFRCAoc2l0dGVyLT5zdGF0dXMpKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXhlY3V0YWJsZSwgV0VYSVRTVEFUVVMgKHNpdHRlci0+c3RhdHVzKSk7CisgICAgICBlbHNlIGlmIChXSUZTSUdOQUxFRCAoc2l0dGVyLT5zdGF0dXMpKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyAlcyByZWNlaXZlZCBzaWduYWwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5leGVjdXRhYmxlLCBXVEVSTVNJRyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCBhYm5vcm1hbGx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXhlY3V0YWJsZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzcyAlcyBleGl0ZWQsIHJlYXNvbiB1bmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmV4ZWN1dGFibGUpOworICAgIH0KK30KKworLyoqCisgKiBTZXRzIHdhdGNoIGZ1bmN0aW9ucyB0byBub3RpZnkgdXMgd2hlbiB0aGUKKyAqIGJhYnlzaXR0ZXIgb2JqZWN0IG5lZWRzIHRvIHJlYWQvd3JpdGUgZmlsZSBkZXNjcmlwdG9ycy4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlZ2luIG1vbml0b3JpbmcgYSBuZXcgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gZnVuY3Rpb24gdG8gc3RvcCBtb25pdG9yaW5nIGEgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIG5vdGlmeSB3aGVuIHRoZSB3YXRjaCBpcyBlbmFibGVkL2Rpc2FibGVkCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICByZXR1cm4gX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChzaXR0ZXItPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV93YXRjaCAoREJ1c1dhdGNoICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBjb25kaXRpb24sCisgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IGRhdGE7CisgIGludCByZXZlbnRzOworICBpbnQgZmQ7CisgIAorICByZXZlbnRzID0gMDsKKyAgaWYgKGNvbmRpdGlvbiAmIERCVVNfV0FUQ0hfUkVBREFCTEUpCisgICAgcmV2ZW50cyB8PSBfREJVU19QT0xMSU47CisgIGlmIChjb25kaXRpb24gJiBEQlVTX1dBVENIX0VSUk9SKQorICAgIHJldmVudHMgfD0gX0RCVVNfUE9MTEVSUjsKKyAgaWYgKGNvbmRpdGlvbiAmIERCVVNfV0FUQ0hfSEFOR1VQKQorICAgIHJldmVudHMgfD0gX0RCVVNfUE9MTEhVUDsKKworICBmZCA9IGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpOworCisgIGlmIChmZCA9PSBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCkKKyAgICBoYW5kbGVfZXJyb3JfcGlwZSAoc2l0dGVyLCByZXZlbnRzKTsKKyAgZWxzZSBpZiAoZmQgPT0gc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlcikKKyAgICBoYW5kbGVfYmFieXNpdHRlcl9zb2NrZXQgKHNpdHRlciwgcmV2ZW50cyk7CisKKyAgd2hpbGUgKExJVkVfQ0hJTERSRU4gKHNpdHRlcikgJiYKKyAgICAgICAgIGJhYnlzaXR0ZXJfaXRlcmF0aW9uIChzaXR0ZXIsIEZBTFNFKSkKKyAgICA7CisKKyAgLyogVGhvc2UgbWlnaHQgaGF2ZSBjbG9zZWQgdGhlIHNvY2tldHMgd2UncmUgd2F0Y2hpbmcuIEJlZm9yZSByZXR1cm5pbmcKKyAgICogdG8gdGhlIG1haW4gbG9vcCwgd2UgbXVzdCBzb3J0IHRoYXQgb3V0LiAqLworCisgIGlmIChzaXR0ZXItPmVycm9yX3dhdGNoICE9IE5VTEwgJiYgc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQgPT0gLTEpCisgICAgeworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisKKyAgICAgIGlmIChzaXR0ZXItPndhdGNoZXMgIT0gTlVMTCkKKyAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9yZW1vdmVfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+ZXJyb3Jfd2F0Y2gpOworCisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBzaXR0ZXItPmVycm9yX3dhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoICE9IE5VTEwgJiYgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciA9PSAtMSkKKyAgICB7CisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisKKyAgICAgIGlmIChzaXR0ZXItPndhdGNoZXMgIT0gTlVMTCkKKyAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9yZW1vdmVfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBIZWxwcyByZW1lbWJlciB3aGljaCBlbmQgb2YgdGhlIHBpcGUgaXMgd2hpY2ggKi8KKyNkZWZpbmUgUkVBRF9FTkQgMAorLyoqIEhlbHBzIHJlbWVtYmVyIHdoaWNoIGVuZCBvZiB0aGUgcGlwZSBpcyB3aGljaCAqLworI2RlZmluZSBXUklURV9FTkQgMQorCisKKy8qIEF2b2lkcyBhIGRhbmdlciBpbiB0aHJlYWRlZCBzaXR1YXRpb25zIChjYWxsaW5nIGNsb3NlKCkKKyAqIG9uIGEgZmlsZSBkZXNjcmlwdG9yIHR3aWNlLCBhbmQgYW5vdGhlciB0aHJlYWQgaGFzCisgKiByZS1vcGVuZWQgaXQgc2luY2UgdGhlIGZpcnN0IGNsb3NlKQorICovCitzdGF0aWMgaW50CitjbG9zZV9hbmRfaW52YWxpZGF0ZSAoaW50ICpmZCkKK3sKKyAgaW50IHJldDsKKworICBpZiAoKmZkIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICB7CisgICAgICByZXQgPSBfZGJ1c19jbG9zZV9zb2NrZXQgKCpmZCwgTlVMTCk7CisgICAgICAqZmQgPSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYWtlX3BpcGUgKGludCAgICAgICAgIHBbMl0sCisgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpbnQgcmV0dmFsOworCisjaWZkZWYgSEFWRV9QSVBFMgorICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisKKyAgcmV0dmFsID0gcGlwZTIgKHAsIE9fQ0xPRVhFQyk7CisgIGNsb2V4ZWNfZG9uZSA9IHJldHZhbCA+PSAwOworCisgIC8qIENoZWNrIGlmIGtlcm5lbCBzZWVtcyB0byBiZSB0b28gb2xkIHRvIGtub3cgcGlwZTIoKS4gV2UgYXNzdW1lCisgICAgIHRoYXQgaWYgcGlwZTIgaXMgYXZhaWxhYmxlLCBPX0NMT0VYRUMgaXMgdG9vLiAgKi8KKyAgaWYgKHJldHZhbCA8IDAgJiYgZXJybm8gPT0gRU5PU1lTKQorI2VuZGlmCisgICAgeworICAgICAgcmV0dmFsID0gcGlwZShwKTsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHJldHZhbCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZBSUxFRCwKKwkJICAgICAgIkZhaWxlZCB0byBjcmVhdGUgcGlwZSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGNoaWxkIHByb2Nlc3MgKCVzKSIsCisJCSAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIEhBVkVfUElQRTIKKyAgaWYgKCFjbG9leGVjX2RvbmUpCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAocFswXSk7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAocFsxXSk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZG9fd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgIHNpemVfdCBieXRlc193cml0dGVuOworICBpbnQgcmV0OworICAKKyAgYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorIGFnYWluOgorICAKKyAgcmV0ID0gd3JpdGUgKGZkLCAoKGNvbnN0IGNoYXIqKWJ1ZikgKyBieXRlc193cml0dGVuLCBjb3VudCAtIGJ5dGVzX3dyaXR0ZW4pOworCisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gd3JpdGUgZGF0YSB0byBwaXBlIVxuIik7CisgICAgICAgICAgZXhpdCAoMSk7IC8qIGdpdmUgdXAsIHdlIHN1Y2sgKi8KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGJ5dGVzX3dyaXR0ZW4gKz0gcmV0OworICAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCBjb3VudCkKKyAgICBnb3RvIGFnYWluOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfZXJyX2FuZF9leGl0IChpbnQgZmQsIGludCBtc2cpCit7CisgIGludCBlbiA9IGVycm5vOworCisgIGRvX3dyaXRlIChmZCwgJm1zZywgc2l6ZW9mIChtc2cpKTsKKyAgZG9fd3JpdGUgKGZkLCAmZW4sIHNpemVvZiAoZW4pKTsKKyAgCisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfcGlkIChpbnQgZmQsIHBpZF90IHBpZCkKK3sKKyAgaW50IG1zZyA9IENISUxEX1BJRDsKKyAgCisgIGRvX3dyaXRlIChmZCwgJm1zZywgc2l6ZW9mIChtc2cpKTsKKyAgZG9fd3JpdGUgKGZkLCAmcGlkLCBzaXplb2YgKHBpZCkpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfc3RhdHVzX2FuZF9leGl0IChpbnQgZmQsIGludCBzdGF0dXMpCit7CisgIGludCBtc2cgPSBDSElMRF9FWElURUQ7CisgIAorICBkb193cml0ZSAoZmQsICZtc2csIHNpemVvZiAobXNnKSk7CisgIGRvX3dyaXRlIChmZCwgJnN0YXR1cywgc2l6ZW9mIChzdGF0dXMpKTsKKyAgCisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAorZG9fZXhlYyAoaW50ICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9lcnJfcmVwb3J0X2ZkLAorCSBjaGFyICAgICAgICAgICAgICAgICAgICAqKmFyZ3YsCisJIGNoYXIgICAgICAgICAgICAgICAgICAgICoqZW52cCwKKwkgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgICBjaGlsZF9zZXR1cCwKKwkgdm9pZCAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBpbnQgaSwgbWF4X29wZW47CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlX3Jlc2V0ICgpOworICBfZGJ1c192ZXJib3NlICgiQ2hpbGQgcHJvY2VzcyBoYXMgUElEICIgREJVU19QSURfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2dldHBpZCAoKSk7CisgIAorICBpZiAoY2hpbGRfc2V0dXApCisgICAgKCogY2hpbGRfc2V0dXApICh1c2VyX2RhdGEpOworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBtYXhfb3BlbiA9IHN5c2NvbmYgKF9TQ19PUEVOX01BWCk7CisgIAorICBmb3IgKGkgPSAzOyBpIDwgbWF4X29wZW47IGkrKykKKyAgICB7CisgICAgICBpbnQgcmV0dmFsOworCisgICAgICBpZiAoaSA9PSBjaGlsZF9lcnJfcmVwb3J0X2ZkKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIAorICAgICAgcmV0dmFsID0gZmNudGwgKGksIEZfR0VURkQpOworCisgICAgICBpZiAocmV0dmFsICE9IC0xICYmICEocmV0dmFsICYgRkRfQ0xPRVhFQykpCisJX2RidXNfd2FybiAoIkZkICVkIGRpZCBub3QgaGF2ZSB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIHNldCFcbiIsIGkpOworICAgIH0KKyNlbmRpZgorCisgIGlmIChlbnZwID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChlbnZpcm9uICE9IE5VTEwpOworCisgICAgICBlbnZwID0gZW52aXJvbjsKKyAgICB9CisgIAorICBleGVjdmUgKGFyZ3ZbMF0sIGFyZ3YsIGVudnApOworICAKKyAgLyogRXhlYyBmYWlsZWQgKi8KKyAgd3JpdGVfZXJyX2FuZF9leGl0IChjaGlsZF9lcnJfcmVwb3J0X2ZkLAorICAgICAgICAgICAgICAgICAgICAgIENISUxEX0VYRUNfRkFJTEVEKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2JhYnlzaXRfZXZlbnRzIChwaWRfdCBncmFuZGNoaWxkX3BpZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICBwYXJlbnRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICByZXZlbnRzKQoreworICBwaWRfdCByZXQ7CisgIGludCBzdGF0dXM7CisgIAorICBkbworICAgIHsKKyAgICAgIHJldCA9IHdhaXRwaWQgKGdyYW5kY2hpbGRfcGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsKKyAgICAgIC8qIFRoZSBtYW4gcGFnZSBzYXlzIEVJTlRSIGNhbid0IGhhcHBlbiB3aXRoIFdOT0hBTkcsCisgICAgICAgKiBidXQgdGhlcmUgYXJlIHJlcG9ydHMgb2YgaXQgKG1heWJlIG9ubHkgd2l0aCB2YWxncmluZD8pCisgICAgICAgKi8KKyAgICB9CisgIHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIGNoaWxkIGV4aXRlZFxuIik7CisgICAgICAKKyAgICAgIDsgLyogbm8gY2hpbGQgZXhpdGVkICovCisgICAgfQorICBlbHNlIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXNuJ3Qgc3VwcG9zZWQgdG8gaGFwcGVuLiAqLworICAgICAgX2RidXNfd2FybiAoInVuZXhwZWN0ZWQgd2FpdHBpZCgpIGZhaWx1cmUgaW4gY2hlY2tfYmFieXNpdF9ldmVudHMoKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZSBpZiAocmV0ID09IGdyYW5kY2hpbGRfcGlkKQorICAgIHsKKyAgICAgIC8qIENoaWxkIGV4aXRlZCAqLworICAgICAgX2RidXNfdmVyYm9zZSAoInJlYXBlZCBjaGlsZCBwaWQgJWxkXG4iLCAobG9uZykgcmV0KTsKKyAgICAgIAorICAgICAgd3JpdGVfc3RhdHVzX2FuZF9leGl0IChwYXJlbnRfcGlwZSwgc3RhdHVzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgid2FpdHBpZCgpIHJlYXBlZCBwaWQgJWQgdGhhdCB3ZSd2ZSBuZXZlciBoZWFyZCBvZlxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpIHJldCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHJldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImJhYnlzaXR0ZXIgZ290IFBPTExJTiBmcm9tIHBhcmVudCBwaXBlXG4iKTsKKyAgICB9CisKKyAgaWYgKHJldmVudHMgJiAoX0RCVVNfUE9MTEVSUiB8IF9EQlVTX1BPTExIVVApKQorICAgIHsKKyAgICAgIC8qIFBhcmVudCBpcyBnb25lLCBzbyB3ZSBqdXN0IGV4aXQgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJiYWJ5c2l0dGVyIGdvdCBQT0xMRVJSIG9yIFBPTExIVVAgZnJvbSBwYXJlbnRcbiIpOworICAgICAgZXhpdCAoMCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGJhYnlzaXRfc2lnY2hsZF9waXBlID0gLTE7CisKK3N0YXRpYyB2b2lkCitiYWJ5c2l0X3NpZ25hbF9oYW5kbGVyIChpbnQgc2lnbm8pCit7CisgIGNoYXIgYiA9ICdcMCc7CisgYWdhaW46CisgIGlmICh3cml0ZSAoYmFieXNpdF9zaWdjaGxkX3BpcGUsICZiLCAxKSA8PSAwKSAKKyAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICBnb3RvIGFnYWluOworfQorCitzdGF0aWMgdm9pZAorYmFieXNpdCAocGlkX3QgZ3JhbmRjaGlsZF9waWQsCisgICAgICAgICBpbnQgICBwYXJlbnRfcGlwZSkKK3sKKyAgaW50IHNpZ2NobGRfcGlwZVsyXTsKKworICAvKiBXZSBkb24ndCBleGVjLCBzbyB3ZSBrZWVwIHBhcmVudCBzdGF0ZSwgc3VjaCBhcyB0aGUgcGlkIHRoYXQKKyAgICogX2RidXNfdmVyYm9zZSgpIHVzZXMuIFJlc2V0IHRoZSBwaWQgaGVyZS4KKyAgICovCisgIF9kYnVzX3ZlcmJvc2VfcmVzZXQgKCk7CisgIAorICAvKiBJIHRob3VnaHQgU0lHQ0hMRCB3b3VsZCBqdXN0IHdha2UgdXAgdGhlIHBvbGwsIGJ1dAorICAgKiB0aGF0IGRpZG4ndCBzZWVtIHRvIHdvcmssIHNvIGFkZGVkIHRoaXMgcGlwZS4KKyAgICogUHJvYmFibHkgdGhlIHBpcGUgaXMgbW9yZSBsaWtlbHkgdG8gd29yayBvbiBidXN0ZWQKKyAgICogb3BlcmF0aW5nIHN5c3RlbXMgYW55aG93LgorICAgKi8KKyAgaWYgKHBpcGUgKHNpZ2NobGRfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJOb3QgZW5vdWdoIGZpbGUgZGVzY3JpcHRvcnMgdG8gY3JlYXRlIHBpcGUgaW4gYmFieXNpdHRlciBwcm9jZXNzXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBiYWJ5c2l0X3NpZ2NobGRfcGlwZSA9IHNpZ2NobGRfcGlwZVtXUklURV9FTkRdOworCisgIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciAoU0lHQ0hMRCwgYmFieXNpdF9zaWduYWxfaGFuZGxlcik7CisgIAorICB3cml0ZV9waWQgKHBhcmVudF9waXBlLCBncmFuZGNoaWxkX3BpZCk7CisKKyAgY2hlY2tfYmFieXNpdF9ldmVudHMgKGdyYW5kY2hpbGRfcGlkLCBwYXJlbnRfcGlwZSwgMCk7CisKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgREJ1c1BvbGxGRCBwZmRzWzJdOworICAgICAgCisgICAgICBwZmRzWzBdLmZkID0gcGFyZW50X3BpcGU7CisgICAgICBwZmRzWzBdLmV2ZW50cyA9IF9EQlVTX1BPTExJTjsKKyAgICAgIHBmZHNbMF0ucmV2ZW50cyA9IDA7CisKKyAgICAgIHBmZHNbMV0uZmQgPSBzaWdjaGxkX3BpcGVbUkVBRF9FTkRdOworICAgICAgcGZkc1sxXS5ldmVudHMgPSBfREJVU19QT0xMSU47CisgICAgICBwZmRzWzFdLnJldmVudHMgPSAwOworICAgICAgCisgICAgICBpZiAoX2RidXNfcG9sbCAocGZkcywgX0RCVVNfTl9FTEVNRU5UUyAocGZkcyksIC0xKSA8IDAgJiYgZXJybm8gIT0gRUlOVFIpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiX2RidXNfcG9sbCgpIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKHBmZHNbMF0ucmV2ZW50cyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfYmFieXNpdF9ldmVudHMgKGdyYW5kY2hpbGRfcGlkLCBwYXJlbnRfcGlwZSwgcGZkc1swXS5yZXZlbnRzKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocGZkc1sxXS5yZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgICAgICB7CisgICAgICAgICAgY2hhciBiOworICAgICAgICAgIGlmIChyZWFkIChzaWdjaGxkX3BpcGVbUkVBRF9FTkRdLCAmYiwgMSkgPT0gLTEpCisgICAgICAgICAgICAvKiBpZ25vcmUgKi87CisgICAgICAgICAgLyogZG8gd2FpdHBpZCBjaGVjayAqLworICAgICAgICAgIGNoZWNrX2JhYnlzaXRfZXZlbnRzIChncmFuZGNoaWxkX3BpZCwgcGFyZW50X3BpcGUsIDApOworICAgICAgICB9CisgICAgfQorICAKKyAgZXhpdCAoMSk7Cit9CisKKy8qKgorICogU3Bhd25zIGEgbmV3IHByb2Nlc3MuIFRoZSBleGVjdXRhYmxlIG5hbWUgYW5kIGFyZ3ZbMF0KKyAqIGFyZSB0aGUgc2FtZSwgYm90aCBhcmUgcHJvdmlkZWQgaW4gYXJndlswXS4gVGhlIGNoaWxkX3NldHVwCisgKiBmdW5jdGlvbiBpcyBwYXNzZWQgdGhlIGdpdmVuIHVzZXJfZGF0YSBhbmQgaXMgcnVuIGluIHRoZSBjaGlsZAorICoganVzdCBiZWZvcmUgY2FsbGluZyBleGVjKCkuCisgKgorICogQWxzbyBjcmVhdGVzIGEgImJhYnlzaXR0ZXIiIHdoaWNoIHRyYWNrcyB0aGUgc3RhdHVzIG9mIHRoZQorICogY2hpbGQgcHJvY2VzcywgYWR2aXNpbmcgdGhlIHBhcmVudCBpZiB0aGUgY2hpbGQgZXhpdHMuCisgKiBJZiB0aGUgc3Bhd24gZmFpbHMsIG5vIGJhYnlzaXR0ZXIgaXMgY3JlYXRlZC4KKyAqIElmIHNpdHRlcl9wIGlzICNOVUxMLCBubyBiYWJ5c2l0dGVyIGlzIGtlcHQuCisgKgorICogQHBhcmFtIHNpdHRlcl9wIHJldHVybiBsb2NhdGlvbiBmb3IgYmFieXNpdHRlciBvciAjTlVMTAorICogQHBhcmFtIGFyZ3YgdGhlIGV4ZWN1dGFibGUgYW5kIGFyZ3VtZW50cworICogQHBhcmFtIGVudiB0aGUgZW52aXJvbm1lbnQgKG5vdCB1c2VkIG9uIHVuaXggeWV0KQorICogQHBhcmFtIGNoaWxkX3NldHVwIGZ1bmN0aW9uIHRvIGNhbGwgaW4gY2hpbGQgcHJlLWV4ZWMoKQorICogQHBhcmFtIHVzZXJfZGF0YSB1c2VyIGRhdGEgZm9yIHNldHVwIGZ1bmN0aW9uCisgKiBAcGFyYW0gZXJyb3IgZXJyb3Igb2JqZWN0IHRvIGJlIGZpbGxlZCBpbiBpZiBmdW5jdGlvbiBmYWlscworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIGVycm9yIGlzIGZpbGxlZCBpbgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyIChEQnVzQmFieXNpdHRlciAgICAgICAgICAqKnNpdHRlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAqKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICoqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3Bhd25DaGlsZFNldHVwRnVuYyAgIGNoaWxkX3NldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKyAgaW50IGNoaWxkX2Vycl9yZXBvcnRfcGlwZVsyXSA9IHsgLTEsIC0xIH07CisgIGludCBiYWJ5c2l0dGVyX3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBwaWRfdCBwaWQ7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoc2l0dGVyX3AgIT0gTlVMTCkKKyAgICAqc2l0dGVyX3AgPSBOVUxMOworCisgIHNpdHRlciA9IE5VTEw7CisKKyAgc2l0dGVyID0gX2RidXNfYmFieXNpdHRlcl9uZXcgKCk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2l0dGVyLT5leGVjdXRhYmxlID0gX2RidXNfc3RyZHVwIChhcmd2WzBdKTsKKyAgaWYgKHNpdHRlci0+ZXhlY3V0YWJsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgCisgIGlmICghbWFrZV9waXBlIChjaGlsZF9lcnJfcmVwb3J0X3BpcGUsIGVycm9yKSkKKyAgICBnb3RvIGNsZWFudXBfYW5kX2ZhaWw7CisKKyAgaWYgKCFfZGJ1c19mdWxsX2R1cGxleF9waXBlICgmYmFieXNpdHRlcl9waXBlWzBdLCAmYmFieXNpdHRlcl9waXBlWzFdLCBUUlVFLCBlcnJvcikpCisgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworCisgIC8qIFNldHRpbmcgdXAgdGhlIGJhYnlzaXR0ZXIgaXMgb25seSB1c2VmdWwgaW4gdGhlIHBhcmVudCwKKyAgICogYnV0IHdlIGRvbid0IHdhbnQgdG8gcnVuIG91dCBvZiBtZW1vcnkgYW5kIGZhaWwKKyAgICogYWZ0ZXIgd2UndmUgYWxyZWFkeSBmb3JrZWQsIHNpbmNlIHRoZW4gd2UnZCBsZWFrCisgICAqIGNoaWxkIHByb2Nlc3NlcyBldmVyeXdoZXJlLgorICAgKi8KKyAgc2l0dGVyLT5lcnJvcl93YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoY2hpbGRfZXJyX3JlcG9ydF9waXBlW1JFQURfRU5EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19XQVRDSF9SRUFEQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgaGFuZGxlX3dhdGNoLCBzaXR0ZXIsIE5VTEwpOworICBpZiAoc2l0dGVyLT5lcnJvcl93YXRjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgICAgICAgCisgIGlmICghX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+ZXJyb3Jfd2F0Y2gpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgICAgIAorICBzaXR0ZXItPnNpdHRlcl93YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoYmFieXNpdHRlcl9waXBlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19XQVRDSF9SRUFEQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIGhhbmRsZV93YXRjaCwgc2l0dGVyLCBOVUxMKTsKKyAgaWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGNsZWFudXBfYW5kX2ZhaWw7CisgICAgfQorICAgICAgCisgIGlmICghX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+c2l0dGVyX3dhdGNoKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBwaWQgPSBmb3JrICgpOworICAKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZPUktfRkFJTEVELAorCQkgICAgICAiRmFpbGVkIHRvIGZvcmsgKCVzKSIsCisJCSAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgZWxzZSBpZiAocGlkID09IDApCisgICAgeworICAgICAgLyogSW1tZWRpYXRlIGNoaWxkLCB0aGlzIGlzIHRoZSBiYWJ5c2l0dGVyIHByb2Nlc3MuICovCisgICAgICBpbnQgZ3JhbmRjaGlsZF9waWQ7CisgICAgICAKKyAgICAgIC8qIEJlIHN1cmUgd2UgY3Jhc2ggaWYgdGhlIHBhcmVudCBleGl0cworICAgICAgICogYW5kIHdlIHdyaXRlIHRvIHRoZSBlcnJfcmVwb3J0X3BpcGUKKyAgICAgICAqLworICAgICAgc2lnbmFsIChTSUdQSVBFLCBTSUdfREZMKTsKKworICAgICAgLyogQ2xvc2UgdGhlIHBhcmVudCdzIGVuZCBvZiB0aGUgcGlwZXMuICovCisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMF0pOworICAgICAgCisgICAgICAvKiBDcmVhdGUgdGhlIGNoaWxkIHRoYXQgd2lsbCBleGVjICgpICovCisgICAgICBncmFuZGNoaWxkX3BpZCA9IGZvcmsgKCk7CisgICAgICAKKyAgICAgIGlmIChncmFuZGNoaWxkX3BpZCA8IDApCisJeworCSAgd3JpdGVfZXJyX2FuZF9leGl0IChiYWJ5c2l0dGVyX3BpcGVbMV0sCisJCQkgICAgICBDSElMRF9GT1JLX0ZBSUxFRCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgd3JpdGVfZXJyX2FuZF9leGl0KCkiKTsKKwl9CisgICAgICBlbHNlIGlmIChncmFuZGNoaWxkX3BpZCA9PSAwKQorCXsKKwkgIGRvX2V4ZWMgKGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdLAorCQkgICBhcmd2LAorCQkgICBlbnYsCisJCSAgIGNoaWxkX3NldHVwLCB1c2VyX2RhdGEpOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdvdCB0byBjb2RlIGFmdGVyIGV4ZWMoKSAtIHNob3VsZCBoYXZlIGV4aXRlZCBvbiBlcnJvciIpOworCX0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgYmFieXNpdCAoZ3JhbmRjaGlsZF9waWQsIGJhYnlzaXR0ZXJfcGlwZVsxXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgYmFieXNpdCgpIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsgICAgICAKKyAgICAgIC8qIENsb3NlIHRoZSB1bmNhcmVkLWFib3V0IGVuZHMgb2YgdGhlIHBpcGVzICovCisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmYmFieXNpdHRlcl9waXBlWzFdKTsKKworICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciA9IGJhYnlzaXR0ZXJfcGlwZVswXTsKKyAgICAgIGJhYnlzaXR0ZXJfcGlwZVswXSA9IC0xOworICAgICAgCisgICAgICBzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA9IGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF07CisgICAgICBjaGlsZF9lcnJfcmVwb3J0X3BpcGVbUkVBRF9FTkRdID0gLTE7CisKKyAgICAgIHNpdHRlci0+c2l0dGVyX3BpZCA9IHBpZDsKKworICAgICAgaWYgKHNpdHRlcl9wICE9IE5VTEwpCisgICAgICAgICpzaXR0ZXJfcCA9IHNpdHRlcjsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52KTsKKworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworIGNsZWFudXBfYW5kX2ZhaWw6CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZjaGlsZF9lcnJfcmVwb3J0X3BpcGVbUkVBRF9FTkRdKTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZjaGlsZF9lcnJfcmVwb3J0X3BpcGVbV1JJVEVfRU5EXSk7CisgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmYmFieXNpdHRlcl9waXBlWzBdKTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMV0pOworCisgIGlmIChzaXR0ZXIgIT0gTlVMTCkKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICAKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKworc3RhdGljIHZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIHdoaWxlIChMSVZFX0NISUxEUkVOIChzaXR0ZXIpKQorICAgIGJhYnlzaXR0ZXJfaXRlcmF0aW9uIChzaXR0ZXIsIFRSVUUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX25vbmV4aXN0ZW50ICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBub25leGlzdGVudCBiaW5hcnkgKi8KKyAgCisgIGFyZ3ZbMF0gPSAiL3RoaXMvZG9lcy9ub3QvZXhpc3QvMzI1NDJzZGdhZmdhZmRnIjsKKyAgaWYgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoJnNpdHRlciwgYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgbGF1bmNoaW5nIG5vbmV4aXN0ZW50IGV4ZWN1dGFibGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm90IGV4cGVjdGluZyBlcnJvciB3aGVuIGxhdW5jaGluZyBub25leGlzdGVudCBleGVjdXRhYmxlOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fc2VnZmF1bHQgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIHNlZ2ZhdWx0IGJpbmFyeSAqLworICAKKyAgYXJndlswXSA9IFRFU1RfU0VHRkFVTFRfQklOQVJZOworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgYmluYXJ5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX2V4aXQgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIGV4aXQgZmFpbHVyZSBiaW5hcnkgKi8KKyAgCisgIGFyZ3ZbMF0gPSBURVNUX0VYSVRfQklOQVJZOworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBsYXVuY2hpbmcgYmluYXJ5IHRoYXQgZXhpdGVkIHdpdGggZmFpbHVyZSBjb2RlXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJOb3QgZXhwZWN0aW5nIGVycm9yIHdoZW4gbGF1bmNoaW5nIGV4aXRpbmcgZXhlY3V0YWJsZTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NwYXduX2FuZF9raWxsICh2b2lkICpkYXRhKQoreworICBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBzbGVlcGluZyBiaW5hcnkgdGhlbiBraWxsaW5nIGl0ICovCisKKyAgYXJndlswXSA9IFRFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlk7CisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9raWxsX2NoaWxkIChzaXR0ZXIpOworICAgICAgCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChzaXR0ZXIsICZlcnJvcik7CisgICAgfQorCisgIGlmIChzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhbiBlcnJvciBhZnRlciBraWxsaW5nIHNwYXduZWQgYmluYXJ5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBraWxsaW5nIGV4ZWN1dGFibGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9ub25leGlzdGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX25vbmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX3NlZ2ZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3Bhd25fc2VnZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fZXhpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX2V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fYW5kX2tpbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9hbmRfa2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zcGF3bi5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXNwYXduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmNTRiNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zcGF3bi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zcGF3bi5oIFdyYXBwZXIgYXJvdW5kIGZvcmsvZXhlYworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1BBV05fSAorI2RlZmluZSBEQlVTX1NQQVdOX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiB2b2lkICgqIERCdXNTcGF3bkNoaWxkU2V0dXBGdW5jKSAodm9pZCAqdXNlcl9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c0JhYnlzaXR0ZXIgREJ1c0JhYnlzaXR0ZXI7CisKK2RidXNfYm9vbF90IF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAgICAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAqKnNpdHRlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAqKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTcGF3bkNoaWxkU2V0dXBGdW5jICAgIGNoaWxkX3NldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAqZXJyb3IpOworREJ1c0JhYnlzaXR0ZXIqIF9kYnVzX2JhYnlzaXR0ZXJfcmVmICAgICAgICAgICAgICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgICAgICAgICAgICAgICAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlcik7Cit2b2lkICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgICAgICAgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIpOworZGJ1c19ib29sX3QgX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkICAgICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19iYWJ5c2l0dGVyX3NldF93YXRjaF9mdW5jdGlvbnMgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NQQVdOX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN0cmluZy1wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1ZDg5YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zdHJpbmctcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTI0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3RyaW5nLXByaXZhdGUuaCBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1RSSU5HX1BSSVZBVEVfSAorI2RlZmluZSBEQlVTX1NUUklOR19QUklWQVRFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKworI2lmbmRlZiBEQlVTX0NBTl9VU0VfREJVU19TVFJJTkdfUFJJVkFURQorI2Vycm9yICJEb24ndCBnbyBpbmNsdWRpbmcgZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIGZvciBubyBnb29kIHJlYXNvbiIKKyNlbmRpZgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzU3RyaW5nLgorICogCisgKiBEQnVzU3RyaW5nIGludGVybmFscy4gREJ1c1N0cmluZyBpcyBhbiBvcGFxdWUgb2JqZWN0cywgaXQgbXVzdCBiZQorICogdXNlZCB2aWEgYWNjZXNzb3IgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICpzdHI7ICAgICAgICAgICAgLyoqPCBTdHJpbmcgZGF0YSwgcGx1cyBudWwgdGVybWluYXRpb24gKi8KKyAgaW50ICAgICAgICAgICAgbGVuOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIHdpdGhvdXQgbnVsICovCisgIGludCAgICAgICAgICAgIGFsbG9jYXRlZDsgICAgICAvKio8IEFsbG9jYXRlZCBzaXplIG9mIGRhdGEgKi8KKyAgaW50ICAgICAgICAgICAgbWF4X2xlbmd0aDsgICAgIC8qKjwgTWF4IGxlbmd0aCBvZiB0aGlzIHN0cmluZywgd2l0aG91dCBudWwgYnl0ZSAqLworICB1bnNpZ25lZCBpbnQgICBjb25zdGFudCA6IDE7ICAgLyoqPCBTdHJpbmcgZGF0YSBpcyBub3Qgb3duZWQgYnkgREJ1c1N0cmluZyAqLworICB1bnNpZ25lZCBpbnQgICBsb2NrZWQgOiAxOyAgICAgLyoqPCBEQnVzU3RyaW5nIGhhcyBiZWVuIGxvY2tlZCBhbmQgY2FuJ3QgYmUgY2hhbmdlZCAqLworICB1bnNpZ25lZCBpbnQgICBpbnZhbGlkIDogMTsgICAgLyoqPCBEQnVzU3RyaW5nIGlzIGludmFsaWQgKGUuZy4gYWxyZWFkeSBmcmVlZCkgKi8KKyAgdW5zaWduZWQgaW50ICAgYWxpZ25fb2Zmc2V0IDogMzsgLyoqPCBzdHIgLSBhbGlnbl9vZmZzZXQgaXMgdGhlIGFjdHVhbCBtYWxsb2MgYmxvY2sgKi8KK30gREJ1c1JlYWxTdHJpbmc7CisKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1N0cmluZ0ludGVybmFscyBEQnVzU3RyaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c1N0cmluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogVGhlIGd1dHMgb2YgREJ1c1N0cmluZy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogVGhpcyBpcyB0aGUgbWF4aW11bSBtYXggbGVuZ3RoIChhbmQgdGh1cyBhbHNvIHRoZSBtYXhpbXVtIGxlbmd0aCkKKyAqIG9mIGEgREJ1c1N0cmluZworICovCisjZGVmaW5lIF9EQlVTX1NUUklOR19NQVhfTUFYX0xFTkdUSCAoX0RCVVNfSU5UMzJfTUFYIC0gX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORykKKworLyoqCisgKiBDaGVja3MgYSBidW5jaCBvZiBhc3NlcnRpb25zIGFib3V0IGEgc3RyaW5nIG9iamVjdAorICoKKyAqIEBwYXJhbSByZWFsIHRoZSBEQnVzUmVhbFN0cmluZworICovCisjZGVmaW5lIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUocmVhbCkgX2RidXNfYXNzZXJ0ICgocmVhbCkgIT0gTlVMTCk7IF9kYnVzX2Fzc2VydCAoIShyZWFsKS0+aW52YWxpZCk7IF9kYnVzX2Fzc2VydCAoKHJlYWwpLT5sZW4gPj0gMCk7IF9kYnVzX2Fzc2VydCAoKHJlYWwpLT5hbGxvY2F0ZWQgPj0gMCk7IF9kYnVzX2Fzc2VydCAoKHJlYWwpLT5tYXhfbGVuZ3RoID49IDApOyBfZGJ1c19hc3NlcnQgKChyZWFsKS0+bGVuIDw9ICgocmVhbCktPmFsbG9jYXRlZCAtIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpKTsgX2RidXNfYXNzZXJ0ICgocmVhbCktPmxlbiA8PSAocmVhbCktPm1heF9sZW5ndGgpCisKKy8qKgorICogQ2hlY2tzIGFzc2VydGlvbnMgYWJvdXQgYSBzdHJpbmcgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUKKyAqIG1vZGlmaWFibGUgLSBtYXkgbm90IGJlIGxvY2tlZCBvciBjb25zdC4gQWxzbyBkZWNsYXJlcworICogdGhlICJyZWFsIiB2YXJpYWJsZSBwb2ludGluZyB0byBEQnVzUmVhbFN0cmluZy4gCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLworI2RlZmluZSBEQlVTX1NUUklOR19QUkVBTUJMRShzdHIpIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghKHJlYWwpLT5jb25zdGFudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKCEocmVhbCktPmxvY2tlZCkKKworLyoqCisgKiBDaGVja3MgYXNzZXJ0aW9ucyBhYm91dCBhIHN0cmluZyBvYmplY3QgdGhhdCBtYXkgYmUgbG9ja2VkIGJ1dAorICogY2FuJ3QgYmUgY29uc3QuIGkuZS4gYSBzdHJpbmcgb2JqZWN0IHRoYXQgd2UgY2FuIGZyZWUuICBBbHNvCisgKiBkZWNsYXJlcyB0aGUgInJlYWwiIHZhcmlhYmxlIHBvaW50aW5nIHRvIERCdXNSZWFsU3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCisjZGVmaW5lIERCVVNfTE9DS0VEX1NUUklOR19QUkVBTUJMRShzdHIpIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoIShyZWFsKS0+Y29uc3RhbnQpCisKKy8qKgorICogQ2hlY2tzIGFzc2VydGlvbnMgYWJvdXQgYSBzdHJpbmcgdGhhdCBtYXkgYmUgY29uc3Qgb3IgbG9ja2VkLiAgQWxzbworICogZGVjbGFyZXMgdGhlICJyZWFsIiB2YXJpYWJsZSBwb2ludGluZyB0byBEQnVzUmVhbFN0cmluZy4KKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZy4KKyAqLworI2RlZmluZSBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRShzdHIpIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpCisKKy8qKgorICogQ2hlY2tzIGZvciBBU0NJSSBibGFuayBieXRlCisgKiBAcGFyYW0gYyB0aGUgYnl0ZQorICovCisjZGVmaW5lIERCVVNfSVNfQVNDSUlfQkxBTksoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcpCisKKy8qKgorICogQ2hlY2tzIGZvciBBU0NJSSB3aGl0ZXNwYWNlIGJ5dGUKKyAqIEBwYXJhbSBjIHRoZSBieXRlCisgKi8KKyNkZWZpbmUgREJVU19JU19BU0NJSV9XSElURShjKSAoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJ1xuJyB8fCAoYykgPT0gJ1xyJykKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NUUklOR19QUklWQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zdHJpbmctdXRpbC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0MmJiMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zdHJpbmctdXRpbC5jCkBAIC0wLDAgKzEsOTQzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3RyaW5nLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLXN0cmluZy5jLCBidXQgbm90IHVzZWQgaW4gbGliZGJ1cworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNkZWZpbmUgREJVU19DQU5fVVNFX0RCVVNfU1RSSU5HX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtc3RyaW5nLXByaXZhdGUuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3RyaW5nCisgKiBAeworICovCisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4CisgKgorICogQHRvZG8gbWVtY21wIG1pZ2h0IG1ha2UgdGhpcyBmYXN0ZXIuCisgKiAKKyAqIEBwYXJhbSBhIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBjX3N0ciB0aGUgQy1zdHlsZSBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzdWZmaXgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpjX3N0cikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgdW5zaWduZWQgbG9uZyBjX3N0cl9sZW47CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBfZGJ1c19hc3NlcnQgKGNfc3RyICE9IE5VTEwpOworICAKKyAgY19zdHJfbGVuID0gc3RybGVuIChjX3N0cik7CisgIGlmICgoKHVuc2lnbmVkIGxvbmcpcmVhbF9hLT5sZW4pIDwgY19zdHJfbGVuKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGFwID0gcmVhbF9hLT5zdHIgKyAocmVhbF9hLT5sZW4gLSBjX3N0cl9sZW4pOworICBicCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgY19zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyByZWFsX2EtPmxlbjsKKyAgd2hpbGUgKGFwICE9IGFfZW5kKQorICAgIHsKKyAgICAgIGlmICgqYXAgIT0gKmJwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICsrYXA7CisgICAgICArK2JwOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKCphcCA9PSAnXDAnKTsKKyAgX2RidXNfYXNzZXJ0ICgqYnAgPT0gJ1wwJyk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBGaW5kIHRoZSBnaXZlbiBieXRlIHNjYW5uaW5nIGJhY2t3YXJkIGZyb20gdGhlIGdpdmVuIHN0YXJ0LgorICogU2V0cyAqZm91bmQgdG8gLTEgaWYgdGhlIGJ5dGUgaXMgbm90IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBwbGFjZSB0byBzdGFydCBzY2FubmluZyAod2lsbCBub3QgZmluZCB0aGUgYnl0ZSBhdCB0aGlzIHBvaW50KQorICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUgdG8gZmluZAorICogQHBhcmFtIGZvdW5kIHJldHVybiBsb2NhdGlvbiBmb3Igd2hlcmUgaXQgd2FzIGZvdW5kCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChmb3VuZCAhPSBOVUxMKTsKKworICBpID0gc3RhcnQgLSAxOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5zdHJbaV0gPT0gYnl0ZSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIC0taTsKKyAgICB9CisKKyAgaWYgKGZvdW5kKQorICAgICpmb3VuZCA9IGk7CisKKyAgcmV0dXJuIGkgPj0gMDsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQKK3Rlc3RfbWF4X2xlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICBpbnQgICAgICAgICBtYXhfbGVuKQoreworICBpZiAobWF4X2xlbiA+IDApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBtYXhfbGVuIC0gMSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgbGVuIHRvIG9uZSBsZXNzIHRoYW4gbWF4IHNob3VsZCBoYXZlIHdvcmtlZCIpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG1heF9sZW4pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgbGVuIHRvIG1heCBsZW4gc2hvdWxkIGhhdmUgd29ya2VkIik7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG1heF9sZW4gKyAxKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIGxlbiB0byBvbmUgbW9yZSB0aGFuIG1heCBsZW4gc2hvdWxkIG5vdCBoYXZlIHdvcmtlZCIpOworCisgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyBsZW4gdG8gemVybyBzaG91bGQgaGF2ZSB3b3JrZWQiKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaGV4X3JvdW5kdHJpcCAoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuKQoreworICBEQnVzU3RyaW5nIG9yaWc7CisgIERCdXNTdHJpbmcgZW5jb2RlZDsKKyAgREJ1c1N0cmluZyBkZWNvZGVkOworICBpbnQgZW5kOworCisgIGlmIChsZW4gPCAwKQorICAgIGxlbiA9IHN0cmxlbiAoZGF0YSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmb3JpZykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVuY29kZWQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRlY29kZWQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKCZvcmlnLCBkYXRhLCBsZW4pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFwcGVuZCBvcmlnIGRhdGEiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmb3JpZywgMCwgJmVuY29kZWQsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBlbmNvZGUiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZGVjb2RlICgmZW5jb2RlZCwgMCwgJmVuZCwgJmRlY29kZWQsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBkZWNvZGUiKTsKKyAgICAKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmVuY29kZWQpID09IGVuZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZvcmlnLCAmZGVjb2RlZCkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqczsKKyAgICAgIAorICAgICAgcHJpbnRmICgiT3JpZ2luYWwgc3RyaW5nICVkIGJ5dGVzIGVuY29kZWQgJWQgYnl0ZXMgZGVjb2RlZCAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvcmlnKSwKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZlbmNvZGVkKSwKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkZWNvZGVkKSk7CisgICAgICBwcmludGYgKCJPcmlnaW5hbDogJXNcbiIsIGRhdGEpOworICAgICAgcyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmRlY29kZWQpOworICAgICAgcHJpbnRmICgiRGVjb2RlZDogJXNcbiIsIHMpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3JpZ2luYWwgc3RyaW5nIG5vdCB0aGUgc2FtZSBhcyBzdHJpbmcgZGVjb2RlZCBmcm9tIGhleCIpOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3JpZyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZW5jb2RlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVjb2RlZCk7ICAKK30KKwordHlwZWRlZiB2b2lkICgqIFRlc3RSb3VuZHRyaXBGdW5jKSAoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGxlbik7CitzdGF0aWMgdm9pZAordGVzdF9yb3VuZHRyaXBzIChUZXN0Um91bmR0cmlwRnVuYyBmdW5jKQoreworICAoKiBmdW5jKSAoIkhlbGxvIHRoaXMgaXMgYSBzdHJpbmdcbiIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xIiwgLTEpOworICAoKiBmdW5jKSAoIkhlbGxvIHRoaXMgaXMgYSBzdHJpbmdcbjEyIiwgLTEpOworICAoKiBmdW5jKSAoIkhlbGxvIHRoaXMgaXMgYSBzdHJpbmdcbjEyMyIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xMjM0IiwgLTEpOworICAoKiBmdW5jKSAoIkhlbGxvIHRoaXMgaXMgYSBzdHJpbmdcbjEyMzQ1IiwgLTEpOworICAoKiBmdW5jKSAoIiIsIDApOworICAoKiBmdW5jKSAoIjEiLCAxKTsKKyAgKCogZnVuYykgKCIxMiIsIDIpOworICAoKiBmdW5jKSAoIjEyMyIsIDMpOworICAoKiBmdW5jKSAoIjEyMzQiLCA0KTsKKyAgKCogZnVuYykgKCIxMjM0NSIsIDUpOworICAoKiBmdW5jKSAoIiIsIDEpOworICAoKiBmdW5jKSAoIjEiLCAyKTsKKyAgKCogZnVuYykgKCIxMiIsIDMpOworICAoKiBmdW5jKSAoIjEyMyIsIDQpOworICAoKiBmdW5jKSAoIjEyMzQiLCA1KTsKKyAgKCogZnVuYykgKCIxMjM0NSIsIDYpOworICB7CisgICAgdW5zaWduZWQgY2hhciBidWZbNTEyXTsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGJ1ZikpCisgICAgICB7CisgICAgICAgIGJ1ZltpXSA9IGk7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICBpID0gMDsKKyAgICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGJ1ZikpCisgICAgICB7CisgICAgICAgICgqIGZ1bmMpIChidWYsIGkpOworICAgICAgICArK2k7CisgICAgICB9CisgIH0KK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qIFRoZSBtYXggbGVuZ3RoIHRoaW5nIGlzIHNvcnQgb2YgYSBoaXN0b3JpY2FsIGFydGlmYWN0CisgKiBmcm9tIGEgZmVhdHVyZSB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgZHVtYjsgcGVyaGFwcworICogd2Ugc2hvdWxkIHB1cmdlIGl0IGVudGlyZWx5LiBUaGUgcHJvYmxlbSB3aXRoCisgKiB0aGUgZmVhdHVyZSBpcyB0aGF0IGl0IGxvb2tzIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24KKyAqIGZhaWx1cmUsIGJ1dCBpcyBub3QgYSB0cmFuc2llbnQgb3IgcmVzb2x2YWJsZSBmYWlsdXJlLgorICovCitzdGF0aWMgdm9pZAorc2V0X21heF9sZW5ndGggKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtYXhfbGVuZ3RoKQoreworICBEQnVzUmVhbFN0cmluZyAqcmVhbDsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxTdHJpbmcqKSBzdHI7CisKKyAgcmVhbC0+bWF4X2xlbmd0aCA9IG1heF9sZW5ndGg7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKioKKyAqIEBpbmdyb3VwIERCdXNTdHJpbmdJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c1N0cmluZy4KKyAqCisgKiBAdG9kbyBOZWVkIHRvIHdyaXRlIHRlc3RzIGZvciBfZGJ1c19zdHJpbmdfY29weSgpIGFuZAorICogX2RidXNfc3RyaW5nX21vdmUoKSBtb3ZpbmcgdG8vZnJvbSBlYWNoIG9mIHN0YXJ0L21pZGRsZS9lbmQgb2YgYQorICogc3RyaW5nLiBBbHNvIG5lZWQgdGVzdHMgZm9yIF9kYnVzX3N0cmluZ19tb3ZlX2xlbiAoKQorICogCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3Rlc3QgKHZvaWQpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzU3RyaW5nIG90aGVyOworICBpbnQgaSwgZW5kOworICBsb25nIHY7CisgIGRvdWJsZSBkOworICBpbnQgbGVuc1tdID0geyAwLCAxLCAyLCAzLCA0LCA1LCAxMCwgMTYsIDE3LCAxOCwgMjUsIDMxLCAzMiwgMzMsIDM0LCAzNSwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgMTI3LCAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2IH07CisgIGNoYXIgKnM7CisgIGRidXNfdW5pY2hhcl90IGNoOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAobGVucykpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgICAgICBzZXRfbWF4X2xlbmd0aCAoJnN0ciwgbGVuc1tpXSk7CisgICAgICAKKyAgICAgIHRlc3RfbWF4X2xlbiAoJnN0ciwgbGVuc1tpXSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogVGVzdCBzaG9ydGVuaW5nIGFuZCBzZXR0aW5nIGxlbmd0aCAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChsZW5zKSkKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgICAgICBzZXRfbWF4X2xlbmd0aCAoJnN0ciwgbGVuc1tpXSk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIGxlbnNbaV0pKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc2V0IHN0cmluZyBsZW5ndGgiKTsKKworICAgICAgaiA9IGxlbnNbaV07CisgICAgICB3aGlsZSAoaiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBqKTsKKyAgICAgICAgICBpZiAoaiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zaG9ydGVuICgmc3RyLCAxKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gKGogLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgLS1qOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAgICAgKytpOworICAgIH0KKworICAvKiBUZXN0IGVxdWFsaXR5ICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZvdGhlciwgIkgiKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAwLCAxLCAmb3RoZXIsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAxLCAwLCAmb3RoZXIsIDEpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZvdGhlciwgIkhlbGxvIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMCwgNSwgJm90aGVyLCAwKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMSwgNCwgJm90aGVyLCAxKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMiwgMywgJm90aGVyLCAyKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMywgMiwgJm90aGVyLCAzKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNCwgMSwgJm90aGVyLCA0KSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNSwgMCwgJm90aGVyLCA1KSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDAsIDUsICZzdHIsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDEsIDQsICZzdHIsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDIsIDMsICZzdHIsIDIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDMsIDIsICZzdHIsIDMpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDQsIDEsICZzdHIsIDQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDUsIDAsICZzdHIsIDUpKTsKKworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZvdGhlciwgIldvcmxkIik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNiwgIDUsICZvdGhlciwgMCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDcsICA0LCAmb3RoZXIsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA4LCAgMywgJm90aGVyLCAyKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgOSwgIDIsICZvdGhlciwgMykpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDEwLCAxLCAmb3RoZXIsIDQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAxMSwgMCwgJm90aGVyLCA1KSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDAsIDUsICZzdHIsIDYpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDEsIDQsICZzdHIsIDcpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDIsIDMsICZzdHIsIDgpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDMsIDIsICZzdHIsIDkpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDQsIDEsICZzdHIsIDEwKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJm90aGVyLCA1LCAwLCAmc3RyLCAxMSkpOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAKKyAgLyogVGVzdCBhcHBlbmRpbmcgZGF0YSAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJhIikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgc3RyaW5nIHRvIHN0cmluZ1xuIik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkgKiAyICsgMSk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnYicpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGJ5dGUgdG8gc3RyaW5nXG4iKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSAqIDIgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiBDaGVjayBzdGVhbF9kYXRhICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZzdHIsICZzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc3RlYWwgZGF0YSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IDApOworICBfZGJ1c19hc3NlcnQgKCgoaW50KXN0cmxlbiAocykpID09IGkpOworCisgIGRidXNfZnJlZSAocyk7CisKKyAgLyogQ2hlY2sgbW92ZSAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworCisgIGkgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZzdHIsIDAsICZvdGhlciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IG1vdmUiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmc3RyLCAwLCAmb3RoZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgbW92ZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IDApOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAyKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZzdHIsIDAsICZvdGhlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgLyAyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgbW92ZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IDApOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAzKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworCisgIC8qIENoZWNrIGNvcHkgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZzdHIsIDAsICZvdGhlciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGNvcHkiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmc3RyLCAwLCAmb3RoZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgY29weSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyBXb3JsZEhlbGxvIFdvcmxkIikpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZzdHIsIDAsICZvdGhlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgLyAyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgY29weSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkgKiAzKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyBXb3JsZEhlbGxvIFdvcmxkSGVsbG8gV29ybGQiKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmb3RoZXIpOworCisgIC8qIENoZWNrIHJlcGxhY2UgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLCAiSGVsbG8gV29ybGQiKSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLCA1LCAxKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBjZW50ZXIgc3BhY2UiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMiAtIDEpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvSGVsbG8gV29ybGRXb3JsZCIpKTsKKworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcmVwbGFjZSBlbmQgY2hhcmFjdGVyIik7CisgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMiAtIDEpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvSGVsbG8gV29ybGRXb3JsZSIpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZvdGhlcik7CisgIAorICAvKiBDaGVjayBhcHBlbmQvZ2V0IHVuaWNoYXIgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgIGNoID0gMDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3VuaWNoYXIgKCZzdHIsIDB4ZmZmYykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFwcGVuZCB1bmljaGFyIik7CisKKyAgX2RidXNfc3RyaW5nX2dldF91bmljaGFyICgmc3RyLCAwLCAmY2gsICZpKTsKKworICBfZGJ1c19hc3NlcnQgKGNoID09IDB4ZmZmYyk7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiBDaGVjayBpbnNlcnQvc2V0L2dldCBieXRlICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgSGVsbG8iKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMCkgPT0gJ0gnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDEpID09ICdlJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAyKSA9PSAnbCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMykgPT0gJ2wnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDQpID09ICdvJyk7CisKKyAgX2RidXNfc3RyaW5nX3NldF9ieXRlICgmc3RyLCAxLCAncScpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMSkgPT0gJ3EnKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZzdHIsIDAsIDEsIDI1NSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY2FuJ3QgaW5zZXJ0IGJ5dGUiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZzdHIsIDIsIDQsICdaJykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY2FuJ3QgaW5zZXJ0IGJ5dGUiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSwgMSwgJ1cnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjYW4ndCBpbnNlcnQgYnl0ZSIpOworICAKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDApID09IDI1NSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAxKSA9PSAnSCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMikgPT0gJ1onKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDMpID09ICdaJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA0KSA9PSAnWicpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgNSkgPT0gJ1onKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDYpID09ICdxJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA3KSA9PSAnbCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgOCkgPT0gJ2wnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDkpID09ICdvJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAxMCkgPT0gJ1cnKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIAorICAvKiBDaGVjayBhcHBlbmQvcGFyc2UgaW50L2RvdWJsZSAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJnN0ciwgMjcpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgaW50Iik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZzdHIsIDAsICZ2LCAmZW5kKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcGFyc2UgaW50Iik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IDI3KTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPT0gaSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfZG91YmxlICgmc3RyLCA1MC4zKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGZsb2F0Iik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9kb3VibGUgKCZzdHIsIDAsICZkLCAmZW5kKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcGFyc2UgZmxvYXQiKTsKKworICBfZGJ1c19hc3NlcnQgKGQgPiAoNTAuMyAtIDFlLTYpICYmIGQgPCAoNTAuMyArIDFlLTYpKTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPT0gaSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIC8qIFRlc3QgZmluZCAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFwcGVuZCB0byBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJIZSIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnSGUnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAwKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiSGVsbG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ0hlbGxvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMCk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiZWxsbyIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnZWxsbyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDEpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJsbyIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnbG8nIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAzKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAyLCAibG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ2xvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMyk7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCA0LCAibG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkIGZpbmQgJ2xvJyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgImwiLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ2wnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiSCIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnSCciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDApOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICIiLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDApOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiSGVsbG8hIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ0hlbGxvISciKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJPaCwgSGVsbG8iLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnT2gsIEhlbGxvJyIpOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiaWxsIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ2lsbCciKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJxIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ3EnIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF90byAoJnN0ciwgMCwgMiwgIkhlIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkbid0IGZpbmQgJ0hlJyIpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF90byAoJnN0ciwgMCwgMiwgIkhlbGxvIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ0hlbGxvJyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoJnN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpLCAnSCcsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGZpbmQgJ0gnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAwKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSwgJ28nLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIG5vdCBmaW5kICdvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIC0gMSk7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSAtIDEsICdvJywgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gLTEpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkICgmc3RyLCAxLCAnZScsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnZSciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IC0xKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIDIsICdlJywgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCBmaW5kICdlJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgLyogSGV4IGVuY29kaW5nICovCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiY2FmZWJhYmUsIHRoaXMgaXMgYSBib2d1cyBoZXggc3RyaW5nIik7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvdGhlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJnN0ciwgMCwgJmVuZCwgJm90aGVyLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkZWNjb2RlZCBib2d1cyBoZXggc3RyaW5nIHdpdGggbm8gZXJyb3IiKTsKKworICBfZGJ1c19hc3NlcnQgKGVuZCA9PSA4KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKworICB0ZXN0X3JvdW5kdHJpcHMgKHRlc3RfaGV4X3JvdW5kdHJpcCk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpbnQgZm91bmQsIGZvdW5kX2xlbjsgIAorCisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICIwMTJcclxuNTY3XG45MCIpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCAwLCAmZm91bmQsICZmb3VuZF9sZW4pIHx8IGZvdW5kICE9IDMgfHwgZm91bmRfbGVuICE9IDIpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGZpbmQgJ1xcclxcbiciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoZm91bmQgIT0gMyB8fCBmb3VuZF9sZW4gIT0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCByZXR1cm4gdmFsdWVzIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZzdHIsIDUsICZmb3VuZCwgJmZvdW5kX2xlbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGZpbmQgJ1xcbiciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoZm91bmQgIT0gOCB8fCBmb3VuZF9sZW4gIT0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCByZXR1cm4gdmFsdWVzIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgOSwgJmZvdW5kLCAmZm91bmRfbGVuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJGb3VuZCBub3QgZXhwZWN0ZWQgJ1xcbiciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBlbHNlIGlmIChmb3VuZCAhPSAxMSB8fCBmb3VuZF9sZW4gIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCByZXR1cm4gdmFsdWVzICdcXG4nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBmb3VuZCA9IC0xOworICAgIGZvdW5kX2xlbiA9IC0xOworICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiIik7CisgICAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgMCwgJmZvdW5kLCAmZm91bmRfbGVuKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZvdW5kIGFuIGVvbCBpbiBhbiBlbXB0eSBzdHJpbmciKTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kID09IDApOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmRfbGVuID09IDApOworICAgIAorICAgIGZvdW5kID0gLTE7CisgICAgZm91bmRfbGVuID0gLTE7CisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICJmb29iYXIiKTsKKyAgICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCAwLCAmZm91bmQsICZmb3VuZF9sZW4pKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZm91bmQgZW9sIGluIHN0cmluZyB0aGF0IGxhY2tzIG9uZSIpOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmQgPT0gNik7CisgICAgX2RidXNfYXNzZXJ0IChmb3VuZF9sZW4gPT0gMCk7CisKKyAgICBmb3VuZCA9IC0xOworICAgIGZvdW5kX2xlbiA9IC0xOworICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiZm9vYmFyXG4iKTsKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgMCwgJmZvdW5kLCAmZm91bmRfbGVuKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZCBub3QgZmluZCBlb2wgaW4gc3RyaW5nIHRoYXQgaGFzIG9uZSBhdCBlbmQiKTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kID09IDYpOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmRfbGVuID09IDEpOworICB9CisKKyAgeworICAgIERCdXNTdHJpbmcgbGluZTsKKworI2RlZmluZSBGSVJTVF9MSU5FICJ0aGlzIGlzIGEgbGluZSIKKyNkZWZpbmUgU0VDT05EX0xJTkUgInRoaXMgaXMgYSBzZWNvbmQgbGluZSIKKyAgICAvKiB0aGlyZCBsaW5lIGlzIGVtcHR5ICovCisjZGVmaW5lIFRISVJEX0xJTkUgIiIKKyNkZWZpbmUgRk9VUlRIX0xJTkUgInRoaXMgaXMgYSBmb3VydGggbGluZSIKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCBGSVJTVF9MSU5FICJcbiIgU0VDT05EX0xJTkUgIlxyXG4iIFRISVJEX0xJTkUgIlxuIiBGT1VSVEhfTElORSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnN0ciwgJmxpbmUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHBvcCBmaXJzdCBsaW5lIik7CisKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmxpbmUsIEZJUlNUX0xJTkUpKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnN0ciwgJmxpbmUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHBvcCBzZWNvbmQgbGluZSIpOworCisgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZsaW5lLCBTRUNPTkRfTElORSkpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmc3RyLCAmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcG9wIHRoaXJkIGxpbmUiKTsKKworICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmbGluZSwgVEhJUkRfTElORSkpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmc3RyLCAmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcG9wIGZvdXJ0aCBsaW5lIik7CisKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmxpbmUsIEZPVVJUSF9MSU5FKSk7CisgICAgCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgIH0KKworICB7CisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKQorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCAxMCkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc2V0IGxlbmd0aCIpOworCisgICAgLyogYWN0dWFsbHkgY29tcGFjdCAqLworICAgIGlmICghX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzdHIsIDIwNDgpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGNvbXBhY3QgYWZ0ZXIgc2V0X2xlbmd0aCIpOworCisgICAgLyogcGVlayBpbnNpZGUgdG8gbWFrZSBzdXJlIGl0IHdvcmtlZCAqLworICAgIGlmICgoKERCdXNSZWFsU3RyaW5nICopJnN0ciktPmFsbG9jYXRlZCA+IDMwKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY29tcGFjdGluZyBzdHJpbmcgZGlkbid0IGRvIGFueXRoaW5nIik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCBhZnRlciBjb21wYWN0Iik7CisKKyAgICAvKiBjb21wYWN0IG5vdGhpbmcgKi8KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19jb21wYWN0ICgmc3RyLCAyMDQ4KSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBjb21wYWN0IDJuZCB0aW1lIik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCBhZnRlciAybmQgY29tcGFjdCIpOworCisgICAgLyogYW5kIG1ha2Ugc3VyZSBpdCBzdGlsbCB3b3Jrcy4uLiovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiMTIzNDU2IikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGFmdGVyIGNvbXBhY3QiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCAiYWJjZGVmZ2hpajEyMzQ1NiIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBjb250ZW50IGFmdGVyIGFwcGVuZCIpOworCisgICAgLyogYWZ0ZXIgZ3Jvd2luZyBhdXRvbWF0aWNhbGx5LCB0aGlzIHNob3VsZCBkbyBub3RoaW5nICovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnN0ciwgMjAwMDApKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGNvbXBhY3QgYWZ0ZXIgZ3JvdyIpOworCisgICAgLyogYnV0IHRoaXMgb25lIHdpbGwgZG8gc29tZXRoaW5nICovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnN0ciwgMCkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gY29tcGFjdCBhZnRlciBncm93Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoxMjM0NTYiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiIUAjJCUiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgYWZ0ZXIgY29tcGFjdCIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsICJhYmNkZWZnaGlqMTIzNDU2IUAjJCUiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCIpOworCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICB9CisKKyAgeworICAgIGNvbnN0IGNoYXIgdHdvX3N0cmluZ3NbXSA9ICJvbmVcdHR3byI7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCB0d29fc3RyaW5ncykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX3NwbGl0X29uX2J5dGUgKCZzdHIsICdcdCcsICZvdGhlcikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgb3IgZGVsaW1pdGVyIG5vdCBmb3VuZCIpOworCisgICAgaWYgKHN0cmNtcCAoX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSwgIm9uZSIpICE9IDApCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJsZWZ0IHNpZGUgYWZ0ZXIgc3BsaXQgb24gdGFiIGlzIHdyb25nIik7CisKKyAgICBpZiAoc3RyY21wIChfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZvdGhlciksICJ0d28iKSAhPSAwKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmlnaHQgc2lkZSBhZnRlciBzcGxpdCBvbiB0YWIgaXMgd3JvbmciKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBjaGFyIHVwcGVyX3N0cmluZ1tdID0gIlRPVVBQRVJTVFJJTkciOworICAgIGNvbnN0IGNoYXIgbG93ZXJfc3RyaW5nW10gPSAidG91cHBlcnN0cmluZyI7CisgICAgY29uc3QgY2hhciBsb3dlcjJfc3RyaW5nW10gPSAidG91cHBlclNUUklORyI7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCB1cHBlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgoJnN0cikpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIGxvd2VyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSBmYWlsZWQiKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIHVwcGVyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIF9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpICgmc3RyLCAwLCA3KTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCBsb3dlcjJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIl9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpIGZhaWxlZCBpbiBwYXJ0aWFsIGNvbnZlcnNpb24iKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBjaGFyIGxvd2VyX3N0cmluZ1tdID0gInRvdXBwZXJzdHJpbmciOworICAgIGNvbnN0IGNoYXIgdXBwZXJfc3RyaW5nW10gPSAiVE9VUFBFUlNUUklORyI7CisgICAgY29uc3QgY2hhciB1cHBlcjJfc3RyaW5nW10gPSAiVE9VUFBFUnN0cmluZyI7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCBsb3dlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgoJnN0cikpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIHVwcGVyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSBmYWlsZWQiKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIGxvd2VyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIF9kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpICgmc3RyLCAwLCA3KTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCB1cHBlcjJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIl9kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpIGZhaWxlZCBpbiBwYXJ0aWFsIGNvbnZlcnNpb24iKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN0cmluZy5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWI5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3RyaW5nLmMKQEAgLTAsMCArMSwyOTc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3RyaW5nLmMgU3RyaW5nIHV0aWxpdHkgY2xhc3MgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKy8qIHdlIGFsbG93IGEgc3lzdGVtIGhlYWRlciBoZXJlLCBmb3Igc3BlZWQvY29udmVuaWVuY2UgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKy8qIGZvciB2c25wcmludGYgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBEQlVTX0NBTl9VU0VfREJVU19TVFJJTkdfUFJJVkFURSAxCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIiAvKiBwcm9iYWJseSBzaG91bGQgYmUgcmVtb3ZlZCBieSBtb3ZpbmcgdGhlIHVzYWdlIG9mIERCVVNfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRvIHRoZSBtYXJzaGFsaW5nLXJlbGF0ZWQgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmb3IgREJVU19WQV9DT1BZICovCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTdHJpbmcgREJ1c1N0cmluZyBjbGFzcworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzU3RyaW5nIGRhdGEgc3RydWN0dXJlIGZvciBzYWZlciBzdHJpbmcgaGFuZGxpbmcKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1N0cmluZy4gREJ1c1N0cmluZyBpcyBpbnRlbmRlZAorICogdG8gYmUgYSBzdHJpbmcgY2xhc3MgdGhhdCBtYWtlcyBpdCBoYXJkIHRvIG1lc3MgdXAgc2VjdXJpdHkgaXNzdWVzCisgKiAoYW5kIGp1c3QgaW4gZ2VuZXJhbCBoYXJkZXIgdG8gd3JpdGUgYnVnZ3kgY29kZSkuICBJdCBzaG91bGQgYmUKKyAqIHVzZWQgKG9yIGV4dGVuZGVkIGFuZCB0aGVuIHVzZWQpIHJhdGhlciB0aGFuIHRoZSBsaWJjIHN0dWZmIGluCisgKiBzdHJpbmcuaC4gIFRoZSBzdHJpbmcgY2xhc3MgaXMgYSBiaXQgaW5jb252ZW5pZW50IGF0IHNwb3RzIGJlY2F1c2UKKyAqIGl0IGhhbmRsZXMgb3V0LW9mLW1lbW9yeSBmYWlsdXJlcyBhbmQgdHJpZXMgdG8gYmUgZXh0cmEtcm9idXN0LgorICogCisgKiBBIERCdXNTdHJpbmcgaGFzIGEgbWF4aW11bSBsZW5ndGggc2V0IGF0IGluaXRpYWxpemF0aW9uIHRpbWU7IHRoaXMKKyAqIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IGEgYnVmZmVyIGRvZXNuJ3QgZ2V0IHRvbyBiaWcuICBUaGUKKyAqIF9kYnVzX3N0cmluZ19sZW5ndGhlbigpIG1ldGhvZCBjaGVja3MgZm9yIG92ZXJmbG93LCBhbmQgZm9yIG1heAorICogbGVuZ3RoIGJlaW5nIGV4Y2VlZGVkLgorICogCisgKiBUcnkgdG8gYXZvaWQgY29udmVyc2lvbiB0byBhIHBsYWluIEMgc3RyaW5nLCBpLmUuIGFkZCBtZXRob2RzIG9uCisgKiB0aGUgc3RyaW5nIG9iamVjdCBpbnN0ZWFkLCBvbmx5IGNvbnZlcnQgdG8gQyBzdHJpbmcgd2hlbiBwYXNzaW5nCisgKiB0aGluZ3Mgb3V0IHRvIHRoZSBwdWJsaWMgQVBJLiBJbiBwYXJ0aWN1bGFyLCBubyBzcHJpbnRmLCBzdHJjcHksCisgKiBzdHJjYXQsIGFueSBvZiB0aGF0IHNob3VsZCBiZSB1c2VkLiBUaGUgR1N0cmluZyBmZWF0dXJlIG9mCisgKiBhY2NlcHRpbmcgbmVnYXRpdmUgbnVtYmVycyBmb3IgImxlbmd0aCBvZiBzdHJpbmciIGlzIGFsc28gYWJzZW50LAorICogYmVjYXVzZSBpdCBjb3VsZCBrZWVwIHVzIGZyb20gZGV0ZWN0aW5nIGJvZ3VzIGh1Z2UgbGVuZ3Rocy4gaS5lLiBpZgorICogd2UgcGFzc2VkIGluIHNvbWUgYm9ndXMgaHVnZSBsZW5ndGggaXQgd291bGQgYmUgdGFrZW4gdG8gbWVhbgorICogImN1cnJlbnQgbGVuZ3RoIG9mIHN0cmluZyIgaW5zdGVhZCBvZiAiYnJva2VuIGNyYWNrIgorICoKKyAqIEB0b2RvICNEQnVzU3RyaW5nIG5lZWRzIGEgbG90IG9mIGNsZWFuaW5nIHVwOyBzb21lIG9mIHRoZQorICogQVBJIGlzIG5vIGxvbmdlciB1c2VkLCBhbmQgdGhlIEFQSSBpcyBwcmV0dHkgaW5jb25zaXN0ZW50LgorICogSW4gcGFydGljdWxhciBhbGwgdGhlICJhcHBlbmQiIEFQSXMsIGVzcGVjaWFsbHkgdGhvc2UgaW52b2x2aW5nCisgKiBhbGlnbm1lbnQgYnV0IHByb2JhYmx5IGxvdHMgb2YgdGhlbSwgYXJlIG5vIGxvbmdlciB1c2VkIGJ5IHRoZQorICogbWFyc2hhbGluZyBjb2RlIHdoaWNoIGFsd2F5cyBkb2VzICJpbnNlcnRzIiBub3cuCisgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3RyaW5nCisgKiBAeworICovCisKK3N0YXRpYyB2b2lkCitmaXh1cF9hbGlnbm1lbnQgKERCdXNSZWFsU3RyaW5nICpyZWFsKQoreworICB1bnNpZ25lZCBjaGFyICphbGlnbmVkOworICB1bnNpZ25lZCBjaGFyICpyZWFsX2Jsb2NrOworICB1bnNpZ25lZCBpbnQgb2xkX2FsaWduX29mZnNldDsKKworICAvKiB3ZSBoYXZlIHRvIGhhdmUgZXh0cmEgc3BhY2UgaW4gcmVhbC0+YWxsb2NhdGVkIGZvciB0aGUgYWxpZ24gb2Zmc2V0IGFuZCBudWwgYnl0ZSAqLworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmxlbiA8PSByZWFsLT5hbGxvY2F0ZWQgLSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKTsKKyAgCisgIG9sZF9hbGlnbl9vZmZzZXQgPSByZWFsLT5hbGlnbl9vZmZzZXQ7CisgIHJlYWxfYmxvY2sgPSByZWFsLT5zdHIgLSBvbGRfYWxpZ25fb2Zmc2V0OworICAKKyAgYWxpZ25lZCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHJlYWxfYmxvY2ssIDgpOworCisgIHJlYWwtPmFsaWduX29mZnNldCA9IGFsaWduZWQgLSByZWFsX2Jsb2NrOworICByZWFsLT5zdHIgPSBhbGlnbmVkOworICAKKyAgaWYgKG9sZF9hbGlnbl9vZmZzZXQgIT0gcmVhbC0+YWxpZ25fb2Zmc2V0KQorICAgIHsKKyAgICAgIC8qIEhlcmUgY29tZXMgdGhlIHN1Y2sgKi8KKyAgICAgIG1lbW1vdmUgKHJlYWxfYmxvY2sgKyByZWFsLT5hbGlnbl9vZmZzZXQsCisgICAgICAgICAgICAgICByZWFsX2Jsb2NrICsgb2xkX2FsaWduX29mZnNldCwKKyAgICAgICAgICAgICAgIHJlYWwtPmxlbiArIDEpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmFsaWduX29mZnNldCA8IDgpOworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKHJlYWwtPnN0ciwgOCkgPT0gcmVhbC0+c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3VuZG9fYWxpZ25tZW50IChEQnVzUmVhbFN0cmluZyAqcmVhbCkKK3sKKyAgaWYgKHJlYWwtPmFsaWduX29mZnNldCAhPSAwKQorICAgIHsKKyAgICAgIG1lbW1vdmUgKHJlYWwtPnN0ciAtIHJlYWwtPmFsaWduX29mZnNldCwKKyAgICAgICAgICAgICAgIHJlYWwtPnN0ciwKKyAgICAgICAgICAgICAgIHJlYWwtPmxlbiArIDEpOworCisgICAgICByZWFsLT5zdHIgPSByZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQ7CisgICAgICByZWFsLT5hbGlnbl9vZmZzZXQgPSAwOworICAgIH0KK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1cCB0byB0aGUgZ2l2ZW4gYWxsb2NhdGlvbiBzaXplCisgKiBiZWZvcmUgaXQgaGFzIHRvIHJlYWxsb2MuIFRoZSBzdHJpbmcgc3RhcnRzIGxpZmUgd2l0aCB6ZXJvIGxlbmd0aC4KKyAqIFRoZSBzdHJpbmcgbXVzdCBldmVudHVhbGx5IGJlIGZyZWVkIHdpdGggX2RidXNfc3RyaW5nX2ZyZWUoKS4KKyAqIAorICogQHBhcmFtIHN0ciBtZW1vcnkgdG8gaG9sZCB0aGUgc3RyaW5nCisgKiBAcGFyYW0gYWxsb2NhdGVfc2l6ZSBhbW91bnQgdG8gcHJlYWxsb2NhdGUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhbGxvY2F0ZV9zaXplKQoreworICBEQnVzUmVhbFN0cmluZyAqcmVhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc3RyICE9IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoc2l6ZW9mIChEQnVzU3RyaW5nKSA9PSBzaXplb2YgKERCdXNSZWFsU3RyaW5nKSk7CisgIAorICByZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOworCisgIC8qIEl0J3MgdmVyeSBpbXBvcnRhbnQgbm90IHRvIHRvdWNoIGFueXRoaW5nCisgICAqIG90aGVyIHRoYW4gcmVhbC0+c3RyIGlmIHdlJ3JlIGdvaW5nIHRvIGZhaWwsCisgICAqIHNpbmNlIHdlIGFsc28gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcmVzZXQKKyAgICogYW4gZXhpc3Rpbmcgc3RyaW5nLCBlLmcuIGluIF9kYnVzX3N0cmluZ19zdGVhbF9kYXRhKCkKKyAgICovCisgIAorICByZWFsLT5zdHIgPSBkYnVzX21hbGxvYyAoX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyArIGFsbG9jYXRlX3NpemUpOworICBpZiAocmVhbC0+c3RyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOyAgCisgIAorICByZWFsLT5hbGxvY2F0ZWQgPSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HICsgYWxsb2NhdGVfc2l6ZTsKKyAgcmVhbC0+bGVuID0gMDsKKyAgcmVhbC0+c3RyW3JlYWwtPmxlbl0gPSAnXDAnOworICAKKyAgcmVhbC0+bWF4X2xlbmd0aCA9IF9EQlVTX1NUUklOR19NQVhfTUFYX0xFTkdUSDsKKyAgcmVhbC0+Y29uc3RhbnQgPSBGQUxTRTsKKyAgcmVhbC0+bG9ja2VkID0gRkFMU0U7CisgIHJlYWwtPmludmFsaWQgPSBGQUxTRTsKKyAgcmVhbC0+YWxpZ25fb2Zmc2V0ID0gMDsKKyAgCisgIGZpeHVwX2FsaWdubWVudCAocmVhbCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIHN0cmluZy4gVGhlIHN0cmluZyBzdGFydHMgbGlmZSB3aXRoIHplcm8gbGVuZ3RoLiAgVGhlCisgKiBzdHJpbmcgbXVzdCBldmVudHVhbGx5IGJlIGZyZWVkIHdpdGggX2RidXNfc3RyaW5nX2ZyZWUoKS4KKyAqIAorICogQHBhcmFtIHN0ciBtZW1vcnkgdG8gaG9sZCB0aGUgc3RyaW5nCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5pdCAoREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIChzdHIsIDApOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyogVGhlIG1heCBsZW5ndGggdGhpbmcgaXMgc29ydCBvZiBhIGhpc3RvcmljYWwgYXJ0aWZhY3QKKyAqIGZyb20gYSBmZWF0dXJlIHRoYXQgdHVybmVkIG91dCB0byBiZSBkdW1iOyBwZXJoYXBzCisgKiB3ZSBzaG91bGQgcHVyZ2UgaXQgZW50aXJlbHkuIFRoZSBwcm9ibGVtIHdpdGgKKyAqIHRoZSBmZWF0dXJlIGlzIHRoYXQgaXQgbG9va3MgbGlrZSBtZW1vcnkgYWxsb2NhdGlvbgorICogZmFpbHVyZSwgYnV0IGlzIG5vdCBhIHRyYW5zaWVudCBvciByZXNvbHZhYmxlIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfbWF4X2xlbmd0aCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1heF9sZW5ndGgpCit7CisgIERCdXNSZWFsU3RyaW5nICpyZWFsOworICAKKyAgcmVhbCA9IChEQnVzUmVhbFN0cmluZyopIHN0cjsKKworICByZWFsLT5tYXhfbGVuZ3RoID0gbWF4X2xlbmd0aDsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBjb25zdGFudCBzdHJpbmcuIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMgbm90IGNvcGllZAorICogKHNob3VsZCBiZSBzdGF0aWMpLCBhbmQgdGhlIHN0cmluZyBtYXkgbmV2ZXIgYmUgbW9kaWZpZWQuCisgKiBJdCBpcyBzYWZlIGJ1dCBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgX2RidXNfc3RyaW5nX2ZyZWUoKQorICogb24gYSBjb25zdCBzdHJpbmcuIFRoZSBzdHJpbmcgaGFzIGEgbGVuZ3RoIGxpbWl0IG9mIE1BWElOVCAtIDguCisgKiAKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHRvIHVzZSBmb3IgdGhlIHN0cmluZworICogQHBhcmFtIHZhbHVlIGEgc3RyaW5nIHRvIGJlIHN0b3JlZCBpbiBzdHIgKG5vdCBjb3BpZWQhISEpCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19pbml0X2NvbnN0IChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIF9kYnVzX2Fzc2VydCAodmFsdWUgIT0gTlVMTCk7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKHN0ciwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuICh2YWx1ZSkpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgY29uc3RhbnQgc3RyaW5nIHdpdGggYSBsZW5ndGguIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMKKyAqIG5vdCBjb3BpZWQgKHNob3VsZCBiZSBzdGF0aWMpLCBhbmQgdGhlIHN0cmluZyBtYXkgbmV2ZXIgYmUKKyAqIG1vZGlmaWVkLiAgSXQgaXMgc2FmZSBidXQgbm90IG5lY2Vzc2FyeSB0byBjYWxsIF9kYnVzX3N0cmluZ19mcmVlKCkKKyAqIG9uIGEgY29uc3Qgc3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIG1lbW9yeSB0byB1c2UgZm9yIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSBhIHN0cmluZyB0byBiZSBzdG9yZWQgaW4gc3RyIChub3QgY29waWVkISEhKQorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIHRvIHVzZQorICovCit2b2lkCitfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHN0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPT0gMCB8fCB2YWx1ZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gX0RCVVNfU1RSSU5HX01BWF9NQVhfTEVOR1RIKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIAorICByZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOworICAKKyAgcmVhbC0+c3RyID0gKHVuc2lnbmVkIGNoYXIqKSB2YWx1ZTsKKyAgcmVhbC0+bGVuID0gbGVuOworICByZWFsLT5hbGxvY2F0ZWQgPSByZWFsLT5sZW4gKyBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HOyAvKiBhIGxpZSwganVzdCB0byBhdm9pZCBzcGVjaWFsLWNhc2UgYXNzZXJ0aW9ucy4uLiAqLworICByZWFsLT5tYXhfbGVuZ3RoID0gcmVhbC0+bGVuICsgMTsKKyAgcmVhbC0+Y29uc3RhbnQgPSBUUlVFOworICByZWFsLT5sb2NrZWQgPSBUUlVFOworICByZWFsLT5pbnZhbGlkID0gRkFMU0U7CisgIHJlYWwtPmFsaWduX29mZnNldCA9IDA7CisKKyAgLyogV2UgZG9uJ3QgcmVxdWlyZSBjb25zdCBzdHJpbmdzIHRvIGJlIDgtYnl0ZSBhbGlnbmVkIGFzIHRoZQorICAgKiBtZW1vcnkgaXMgY29taW5nIGZyb20gZWxzZXdoZXJlLgorICAgKi8KK30KKworLyoqCisgKiBGcmVlcyBhIHN0cmluZyBjcmVhdGVkIGJ5IF9kYnVzX3N0cmluZ19pbml0KCkuCisgKgorICogQHBhcmFtIHN0ciBtZW1vcnkgd2hlcmUgdGhlIHN0cmluZyBpcyBzdG9yZWQuCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19mcmVlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsKTsKKyAgCisgIGlmIChyZWFsLT5jb25zdGFudCkKKyAgICByZXR1cm47CisgIGRidXNfZnJlZSAocmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0KTsKKworICByZWFsLT5pbnZhbGlkID0gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb21wYWN0IChEQnVzUmVhbFN0cmluZyAqcmVhbCwKKyAgICAgICAgIGludCAgICAgICAgICAgICBtYXhfd2FzdGUpCit7CisgIHVuc2lnbmVkIGNoYXIgKm5ld19zdHI7CisgIGludCBuZXdfYWxsb2NhdGVkOworICBpbnQgd2FzdGU7CisKKyAgd2FzdGUgPSByZWFsLT5hbGxvY2F0ZWQgLSAocmVhbC0+bGVuICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyk7CisKKyAgaWYgKHdhc3RlIDw9IG1heF93YXN0ZSkKKyAgICByZXR1cm4gVFJVRTsKKworICBuZXdfYWxsb2NhdGVkID0gcmVhbC0+bGVuICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORzsKKworICBuZXdfc3RyID0gZGJ1c19yZWFsbG9jIChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQsIG5ld19hbGxvY2F0ZWQpOworICBpZiAoX0RCVVNfVU5MSUtFTFkgKG5ld19zdHIgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlYWwtPnN0ciA9IG5ld19zdHIgKyByZWFsLT5hbGlnbl9vZmZzZXQ7CisgIHJlYWwtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7CisgIGZpeHVwX2FsaWdubWVudCAocmVhbCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKiBOb3QgdXNpbmcgdGhpcyBmZWF0dXJlIGF0IHRoZSBtb21lbnQsCisgKiBzbyBtYXJrZWQgREJVU19CVUlMRF9URVNUUy1vbmx5CisgKi8KKy8qKgorICogTG9ja3MgYSBzdHJpbmcgc3VjaCB0aGF0IGFueSBhdHRlbXB0cyB0byBjaGFuZ2UgdGhlIHN0cmluZyB3aWxsCisgKiByZXN1bHQgaW4gYWJvcnRpbmcgdGhlIHByb2dyYW0uIEFsc28sIGlmIHRoZSBzdHJpbmcgaXMgd2FzdGluZyBhCisgKiBsb3Qgb2YgbWVtb3J5IChhbGxvY2F0aW9uIGlzIHN1ZmZpY2llbnRseSBsYXJnZXIgdGhhbiB3aGF0IHRoZQorICogc3RyaW5nIGlzIHJlYWxseSB1c2luZyksIF9kYnVzX3N0cmluZ19sb2NrKCkgd2lsbCByZWFsbG9jIHRoZQorICogc3RyaW5nJ3MgZGF0YSB0byAiY29tcGFjdCIgaXQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGxvY2suCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19sb2NrIChEQnVzU3RyaW5nICpzdHIpCit7ICAKKyAgREJVU19MT0NLRURfU1RSSU5HX1BSRUFNQkxFIChzdHIpOyAvKiBjYW4gbG9jayBtdWx0aXBsZSB0aW1lcyAqLworCisgIHJlYWwtPmxvY2tlZCA9IFRSVUU7CisKKyAgLyogVHJ5IHRvIHJlYWxsb2MgdG8gYXZvaWQgZXhjZXNzIG1lbW9yeSB1c2FnZSwgc2luY2UKKyAgICogd2Uga25vdyB3ZSB3b24ndCBjaGFuZ2UgdGhlIHN0cmluZyBmdXJ0aGVyCisgICAqLworI2RlZmluZSBNQVhfV0FTVEUgNDgKKyAgY29tcGFjdCAocmVhbCwgTUFYX1dBU1RFKTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVhbGxvY2F0ZV9mb3JfbGVuZ3RoIChEQnVzUmVhbFN0cmluZyAqcmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5ld19sZW5ndGgpCit7CisgIGludCBuZXdfYWxsb2NhdGVkOworICB1bnNpZ25lZCBjaGFyICpuZXdfc3RyOworCisgIC8qIGF0IGxlYXN0IGRvdWJsZSBvdXIgb2xkIGFsbG9jYXRpb24gdG8gYXZvaWQgTyhuKSwgYXZvaWRpbmcKKyAgICogb3ZlcmZsb3cKKyAgICovCisgIGlmIChyZWFsLT5hbGxvY2F0ZWQgPiAoX0RCVVNfU1RSSU5HX01BWF9NQVhfTEVOR1RIICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORykgLyAyKQorICAgIG5ld19hbGxvY2F0ZWQgPSBfREJVU19TVFJJTkdfTUFYX01BWF9MRU5HVEggKyBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HOworICBlbHNlCisgICAgbmV3X2FsbG9jYXRlZCA9IHJlYWwtPmFsbG9jYXRlZCAqIDI7CisKKyAgLyogaWYgeW91IGNoYW5nZSB0aGUgY29kZSBqdXN0IGFib3ZlIGhlcmUsIHJ1biB0aGUgdGVzdHMgd2l0aG91dAorICAgKiB0aGUgZm9sbG93aW5nIGFzc2VydC1vbmx5IGhhY2sgYmVmb3JlIHlvdSBjb21taXQKKyAgICovCisgIC8qIFRoaXMgaXMga2V5ZWQgb2ZmIGFzc2VydHMgaW4gYWRkaXRpb24gdG8gdGVzdHMgc28gd2hlbiB5b3UKKyAgICogZGlzYWJsZSBhc3NlcnRzIHRvIHByb2ZpbGUsIHlvdSBkb24ndCBnZXQgdGhpcyBkZXN0cm95ZXIKKyAgICogb2YgcHJvZmlsZXMuCisgICAqLworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyNlbHNlCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICBuZXdfYWxsb2NhdGVkID0gMDsgLyogZW5zdXJlIGEgcmVhbGxvYyBldmVyeSB0aW1lIHNvIHRoYXQgd2UgZ28KKyAgICAgICAgICAgICAgICAgICAgICAqIHRocm91Z2ggYWxsIG1hbGxvYyBmYWlsdXJlIGNvZGVwYXRocworICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQVNTRVJUICovCisKKyAgLyogQnV0IGJlIHN1cmUgd2UgYWx3YXlzIGFsbG9jIGF0IGxlYXN0IHNwYWNlIGZvciB0aGUgbmV3IGxlbmd0aCAqLworICBuZXdfYWxsb2NhdGVkID0gTUFYIChuZXdfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdfbGVuZ3RoICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyk7CisKKyAgX2RidXNfYXNzZXJ0IChuZXdfYWxsb2NhdGVkID49IHJlYWwtPmFsbG9jYXRlZCk7IC8qIGNvZGUgcmVsaWVzIG9uIHRoaXMgKi8KKyAgbmV3X3N0ciA9IGRidXNfcmVhbGxvYyAocmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0LCBuZXdfYWxsb2NhdGVkKTsKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChuZXdfc3RyID09IE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZWFsLT5zdHIgPSBuZXdfc3RyICsgcmVhbC0+YWxpZ25fb2Zmc2V0OworICByZWFsLT5hbGxvY2F0ZWQgPSBuZXdfYWxsb2NhdGVkOworICBmaXh1cF9hbGlnbm1lbnQgKHJlYWwpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvbXBhY3RzIHRoZSBzdHJpbmcgdG8gYXZvaWQgd2FzdGVkIG1lbW9yeS4gIFdhc3RlZCBtZW1vcnkgaXMKKyAqIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBidXQgbm90IGFjdHVhbGx5IHJlcXVpcmVkIHRvIHN0b3JlIHRoZQorICogY3VycmVudCBsZW5ndGggb2YgdGhlIHN0cmluZy4gIFRoZSBjb21wYWN0IGlzIG9ubHkgZG9uZSBpZiBtb3JlCisgKiB0aGFuIHRoZSBnaXZlbiBhbW91bnQgb2YgbWVtb3J5IGlzIGJlaW5nIHdhc3RlZCAob3RoZXJ3aXNlIHRoZQorICogd2FzdGUgaXMgaWdub3JlZCBhbmQgdGhlIGNhbGwgZG9lcyBub3RoaW5nKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBtYXhfd2FzdGUgdGhlIG1heGltdW0gYW1vdW50IG9mIHdhc3RlIHRvIGlnbm9yZQorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBjb21wYWN0IGZhaWxlZCBkdWUgdG8gcmVhbGxvYyBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfY29tcGFjdCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1heF93YXN0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgcmV0dXJuIGNvbXBhY3QgKHJlYWwsIG1heF93YXN0ZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X2xlbmd0aCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbmV3X2xlbmd0aCkKK3sKKyAgLyogTm90ZSwgd2UgYXJlIHNldHRpbmcgdGhlIGxlbmd0aCBub3QgaW5jbHVkaW5nIG51bCB0ZXJtaW5hdGlvbiAqLworCisgIC8qIGV4Y2VlZGluZyBtYXggbGVuZ3RoIGlzIHRoZSBzYW1lIGFzIGZhaWx1cmUgdG8gYWxsb2NhdGUgbWVtb3J5ICovCisgIGlmIChfREJVU19VTkxJS0VMWSAobmV3X2xlbmd0aCA+IHJlYWwtPm1heF9sZW5ndGgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZSBpZiAobmV3X2xlbmd0aCA+IChyZWFsLT5hbGxvY2F0ZWQgLSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKSAmJgorICAgICAgICAgICBfREJVU19VTkxJS0VMWSAoIXJlYWxsb2NhdGVfZm9yX2xlbmd0aCAocmVhbCwgbmV3X2xlbmd0aCkpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJlYWwtPmxlbiA9IG5ld19sZW5ndGg7CisgICAgICByZWFsLT5zdHJbbmV3X2xlbmd0aF0gPSAnXDAnOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29wZW5fZ2FwIChpbnQgICAgICAgICAgICAgbGVuLAorICAgICAgICAgIERCdXNSZWFsU3RyaW5nICpkZXN0LAorICAgICAgICAgIGludCAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAobGVuID4gZGVzdC0+bWF4X2xlbmd0aCAtIGRlc3QtPmxlbikKKyAgICByZXR1cm4gRkFMU0U7IC8qIGRldGVjdGVkIG92ZXJmbG93IG9mIGRlc3QtPmxlbiArIGxlbiBiZWxvdyAqLworICAKKyAgaWYgKCFzZXRfbGVuZ3RoIChkZXN0LCBkZXN0LT5sZW4gKyBsZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZW1tb3ZlIChkZXN0LT5zdHIgKyBpbnNlcnRfYXQgKyBsZW4sIAorICAgICAgICAgICBkZXN0LT5zdHIgKyBpbnNlcnRfYXQsCisgICAgICAgICAgIGRlc3QtPmxlbiAtIGxlbiAtIGluc2VydF9hdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9kYXRhCisvKioKKyAqIEdldHMgdGhlIHJhdyBjaGFyYWN0ZXIgYnVmZmVyIGZyb20gdGhlIHN0cmluZy4gIFRoZSByZXR1cm5lZCBidWZmZXIKKyAqIHdpbGwgYmUgbnVsLXRlcm1pbmF0ZWQsIGJ1dCBub3RlIHRoYXQgc3RyaW5ncyBtYXkgY29udGFpbiBiaW5hcnkKKyAqIGRhdGEgc28gdGhlcmUgbWF5IGJlIGV4dHJhIG51bCBjaGFyYWN0ZXJzIHByaW9yIHRvIHRoZSB0ZXJtaW5hdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGxpdHRsZS11c2VkLCBleHRlbmQgREJ1c1N0cmluZyBvciBhZGQKKyAqIHN0dWZmIHRvIGRidXMtc3lzZGVwcy5jIGluc3RlYWQuIEl0J3MgYW4gZXJyb3IgdG8gdXNlIHRoaXMKKyAqIGZ1bmN0aW9uIG9uIGEgY29uc3Qgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHJldHVybnMgdGhlIGRhdGEKKyAqLworY2hhcioKK19kYnVzX3N0cmluZ19nZXRfZGF0YSAoREJ1c1N0cmluZyAqc3RyKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIHJldHVybiAoY2hhciopIHJlYWwtPnN0cjsKK30KKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKi8KKworLyogb25seSBkbyB0aGUgZnVuY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhCisvKioKKyAqIEdldHMgdGhlIHJhdyBjaGFyYWN0ZXIgYnVmZmVyIGZyb20gYSBjb25zdCBzdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcmV0dXJucyB0aGUgc3RyaW5nIGRhdGEKKyAqLworY29uc3QgY2hhcioKK19kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoY29uc3QgREJ1c1N0cmluZyAgKnN0cikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIAorICByZXR1cm4gKGNvbnN0IGNoYXIqKSByZWFsLT5zdHI7Cit9CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICovCisKKy8qKgorICogR2V0cyBhIHN1Yi1wb3J0aW9uIG9mIHRoZSByYXcgY2hhcmFjdGVyIGJ1ZmZlciBmcm9tIHRoZQorICogc3RyaW5nLiBUaGUgImxlbiIgZmllbGQgaXMgcmVxdWlyZWQgc2ltcGx5IGZvciBlcnJvcgorICogY2hlY2tpbmcsIHRvIGJlIHN1cmUgeW91IGRvbid0IHRyeSB0byB1c2UgbW9yZQorICogc3RyaW5nIHRoYW4gZXhpc3RzLiBUaGUgbnVsIHRlcm1pbmF0aW9uIG9mIHRoZQorICogcmV0dXJuZWQgYnVmZmVyIHJlbWFpbnMgYXQgdGhlIGVuZCBvZiB0aGUgZW50aXJlCisgKiBzdHJpbmcsIG5vdCBhdCBzdGFydCArIGxlbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBieXRlIG9mZnNldCB0byByZXR1cm4KKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gcmV0dXJuCisgKiBAcmV0dXJucyB0aGUgc3RyaW5nIGRhdGEKKyAqLworY2hhcioKK19kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworICAKKyAgcmV0dXJuIChjaGFyKikgcmVhbC0+c3RyICsgc3RhcnQ7Cit9CisKKy8qIG9ubHkgZG8gdGhlIGZ1bmN0aW9uIGlmIHdlIGRvbid0IGhhdmUgdGhlIG1hY3JvICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4KKy8qKgorICogY29uc3QgdmVyc2lvbiBvZiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuKCkuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgYnl0ZSBvZmZzZXQgdG8gcmV0dXJuCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBzZWdtZW50IHRvIHJldHVybgorICogQHJldHVybnMgdGhlIHN0cmluZyBkYXRhCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IHJlYWwtPmxlbiAtIHN0YXJ0KTsKKyAgCisgIHJldHVybiAoY29uc3QgY2hhciopIHJlYWwtPnN0ciArIHN0YXJ0OworfQorI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKi8KKworLyogb25seSBkbyB0aGUgZnVuY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX3NldF9ieXRlCisvKioKKyAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBpIHRoZSBwb3NpdGlvbgorICogQHBhcmFtIGJ5dGUgdGhlIG5ldyB2YWx1ZQorICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgYnl0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoaSA8IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoaSA+PSAwKTsKKyAgCisgIHJlYWwtPnN0cltpXSA9IGJ5dGU7Cit9CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX3NldF9ieXRlICovCisKKy8qIG9ubHkgaGF2ZSB0aGUgZnVuY3Rpb24gaWYgd2UgZGlkbid0IGNyZWF0ZSBhIG1hY3JvICovCisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZQorLyoqCisgKiBHZXRzIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gSXQgaXMKKyAqIGFsbG93ZWQgdG8gYXNrIGZvciB0aGUgbnVsIGJ5dGUgYXQgdGhlIGVuZCBvZgorICogdGhlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgcG9zaXRpb24KKyAqIEByZXR1cm5zIHRoZSBieXRlIGF0IHRoYXQgcG9zaXRpb24KKyAqLwordW5zaWduZWQgY2hhcgorX2RidXNfc3RyaW5nX2dldF9ieXRlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQpCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIAorICByZXR1cm4gcmVhbC0+c3RyW3N0YXJ0XTsKK30KKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKi8KKworLyoqCisgKiBJbnNlcnRzIGEgbnVtYmVyIG9mIGJ5dGVzIG9mIGEgZ2l2ZW4gdmFsdWUgYXQgdGhlCisgKiBnaXZlbiBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBpIHRoZSBwb3NpdGlvbgorICogQHBhcmFtIG5fYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzCisgKiBAcGFyYW0gYnl0ZSB0aGUgdmFsdWUgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzIChEQnVzU3RyaW5nICAgKnN0ciwKKwkJCSAgIGludCAgICAgICAgICAgaSwKKwkJCSAgIGludCAgICAgICAgICAgbl9ieXRlcywKKwkJCSAgIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoaSA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGkgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobl9ieXRlcyA+PSAwKTsKKworICBpZiAobl9ieXRlcyA9PSAwKQorICAgIHJldHVybiBUUlVFOworICAKKyAgaWYgKCFvcGVuX2dhcCAobl9ieXRlcywgcmVhbCwgaSkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgbWVtc2V0IChyZWFsLT5zdHIgKyBpLCBieXRlLCBuX2J5dGVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnNlcnRzIGEgc2luZ2xlIGJ5dGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGkgdGhlIHBvc2l0aW9uCisgKiBAcGFyYW0gYnl0ZSB0aGUgdmFsdWUgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKERCdXNTdHJpbmcgICAqc3RyLAorCQkJICAgaW50ICAgICAgICAgICBpLAorCQkJICAgdW5zaWduZWQgY2hhciBieXRlKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChpIDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoaSA+PSAwKTsKKyAgCisgIGlmICghb3Blbl9nYXAgKDEsIHJlYWwsIGkpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZWFsLT5zdHJbaV0gPSBieXRlOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIExpa2UgX2RidXNfc3RyaW5nX2dldF9kYXRhKCksIGJ1dCByZW1vdmVzIHRoZQorICogZ290dGVuIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgc3RyaW5nLiBUaGUgY2FsbGVyCisgKiBtdXN0IGZyZWUgdGhlIGRhdGEgcmV0dXJuZWQuIFRoaXMgZnVuY3Rpb24gbWF5CisgKiBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgYW5kIHJldHVybiAjRkFMU0UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZGF0YV9yZXR1cm4gbG9jYXRpb24gdG8gcmV0dXJuIHRoZSBidWZmZXIKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zdGVhbF9kYXRhIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybikKK3sKKyAgaW50IG9sZF9tYXhfbGVuZ3RoOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChkYXRhX3JldHVybiAhPSBOVUxMKTsKKworICB1bmRvX2FsaWdubWVudCAocmVhbCk7CisgIAorICAqZGF0YV9yZXR1cm4gPSAoY2hhciopIHJlYWwtPnN0cjsKKworICBvbGRfbWF4X2xlbmd0aCA9IHJlYWwtPm1heF9sZW5ndGg7CisgIAorICAvKiByZXNldCB0aGUgc3RyaW5nICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKHN0cikpCisgICAgeworICAgICAgLyogaHJtLCBwdXQgaXQgYmFjayB0aGVuICovCisgICAgICByZWFsLT5zdHIgPSAodW5zaWduZWQgY2hhciopICpkYXRhX3JldHVybjsKKyAgICAgICpkYXRhX3JldHVybiA9IE5VTEw7CisgICAgICBmaXh1cF9hbGlnbm1lbnQgKHJlYWwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZWFsLT5tYXhfbGVuZ3RoID0gb2xkX21heF9sZW5ndGg7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIExpa2UgX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbigpLCBidXQgcmVtb3ZlcyB0aGUgZ290dGVuIGRhdGEgZnJvbQorICogdGhlIG9yaWdpbmFsIHN0cmluZy4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIGRhdGEgcmV0dXJuZWQuIFRoaXMKKyAqIGZ1bmN0aW9uIG1heSBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgYW5kIHJldHVybiAjRkFMU0UuCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG51bC10ZXJtaW5hdGVkIGFuZCBoYXMgbGVuZ3RoIGxlbi4KKyAqCisgKiBAdG9kbyB0aGlzIGZ1bmN0aW9uIGlzIGJyb2tlbiBiZWNhdXNlIG9uIGZhaWx1cmUgaXQKKyAqIG1heSBjb3JydXB0IHRoZSBzb3VyY2Ugc3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBkYXRhX3JldHVybiBsb2NhdGlvbiB0byByZXR1cm4gdGhlIGJ1ZmZlcgorICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiBzZWdtZW50IHRvIHN0ZWFsCisgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2Ygc2VnbWVudCB0byBzdGVhbAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGFfbGVuIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgREJ1c1N0cmluZyBkZXN0OworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChkYXRhX3JldHVybiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZXN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc2V0X21heF9sZW5ndGggKCZkZXN0LCByZWFsLT5tYXhfbGVuZ3RoKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmVfbGVuIChzdHIsIHN0YXJ0LCBsZW4sICZkZXN0LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlc3QpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c193YXJuICgiQnJva2VuIGNvZGUgaW4gX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGFfbGVuKCksIHNlZSBAdG9kbywgRklYTUVcbiIpOworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmZGVzdCwgZGF0YV9yZXR1cm4pKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVzdCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVzdCk7CisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBDb3BpZXMgdGhlIGRhdGEgZnJvbSB0aGUgc3RyaW5nIGludG8gYSBjaGFyKgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGRhdGFfcmV0dXJuIHBsYWNlIHRvIHJldHVybiB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoZGF0YV9yZXR1cm4gIT0gTlVMTCk7CisgIAorICAqZGF0YV9yZXR1cm4gPSBkYnVzX21hbGxvYyAocmVhbC0+bGVuICsgMSk7CisgIGlmICgqZGF0YV9yZXR1cm4gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWVtY3B5ICgqZGF0YV9yZXR1cm4sIHJlYWwtPnN0ciwgcmVhbC0+bGVuICsgMSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ29waWVzIHRoZSBjb250ZW50cyBvZiBhIERCdXNTdHJpbmcgaW50byBhIGRpZmZlcmVudCBidWZmZXIuIEl0IGlzCisgKiBhIGJ1ZyBpZiBhdmFpbF9sZW4gaXMgdG9vIHNob3J0IHRvIGhvbGQgdGhlIHN0cmluZyBjb250ZW50cy4gbnVsCisgKiB0ZXJtaW5hdGlvbiBpcyBub3QgY29waWVkLCBqdXN0IHRoZSBzdXBwbGllZCBieXRlcy4KKyAqIAorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGJ1ZmZlciBhIEMgYnVmZmVyIHRvIGNvcHkgZGF0YSB0bworICogQHBhcmFtIGF2YWlsX2xlbiBtYXhpbXVtIGxlbmd0aCBvZiBDIGJ1ZmZlcgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisJCQkgICAgIGNoYXIgICAgICAgICAgICAgICpidWZmZXIsCisJCQkgICAgIGludCAgICAgICAgICAgICAgICBhdmFpbF9sZW4pCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworCisgIF9kYnVzX2Fzc2VydCAoYXZhaWxfbGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKGF2YWlsX2xlbiA+PSByZWFsLT5sZW4pOworICAKKyAgbWVtY3B5IChidWZmZXIsIHJlYWwtPnN0ciwgcmVhbC0+bGVuKTsKK30KKworLyoqCisgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGEgREJ1c1N0cmluZyBpbnRvIGEgZGlmZmVyZW50IGJ1ZmZlci4gSXQgaXMKKyAqIGEgYnVnIGlmIGF2YWlsX2xlbiBpcyB0b28gc2hvcnQgdG8gaG9sZCB0aGUgc3RyaW5nIGNvbnRlbnRzIHBsdXMgYQorICogbnVsIGJ5dGUuIAorICogCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gYnVmZmVyIGEgQyBidWZmZXIgdG8gY29weSBkYXRhIHRvCisgKiBAcGFyYW0gYXZhaWxfbGVuIG1heGltdW0gbGVuZ3RoIG9mIEMgYnVmZmVyCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGF2YWlsX2xlbikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgX2RidXNfYXNzZXJ0IChhdmFpbF9sZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoYXZhaWxfbGVuID4gcmVhbC0+bGVuKTsKKyAgCisgIG1lbWNweSAoYnVmZmVyLCByZWFsLT5zdHIsIHJlYWwtPmxlbisxKTsKK30KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogQ29waWVzIGEgc2VnbWVudCBvZiB0aGUgc3RyaW5nIGludG8gYSBjaGFyKgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGRhdGFfcmV0dXJuIHBsYWNlIHRvIHJldHVybiB0aGUgZGF0YQorICogQHBhcmFtIHN0YXJ0IHN0YXJ0IGluZGV4CisgKiBAcGFyYW0gbGVuIGxlbmd0aCB0byBjb3B5CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfY29weV9kYXRhX2xlbiAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIERCdXNTdHJpbmcgZGVzdDsKKworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChkYXRhX3JldHVybiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZXN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc2V0X21heF9sZW5ndGggKCZkZXN0LCByZWFsLT5tYXhfbGVuZ3RoKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoc3RyLCBzdGFydCwgbGVuLCAmZGVzdCwgMCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZXN0KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmRlc3QsIGRhdGFfcmV0dXJuKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlc3QpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlc3QpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qIE9ubHkgaGF2ZSB0aGUgZnVuY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgKKy8qKgorICogR2V0cyB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIChub3QgaW5jbHVkaW5nIG51bCB0ZXJtaW5hdGlvbikuCisgKgorICogQHJldHVybnMgdGhlIGxlbmd0aC4KKyAqLworaW50CitfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoY29uc3QgREJ1c1N0cmluZyAgKnN0cikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIAorICByZXR1cm4gcmVhbC0+bGVuOworfQorI2VuZGlmIC8qICFfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAqLworCisvKioKKyAqIE1ha2VzIGEgc3RyaW5nIGxvbmdlciBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLiAgQ2hlY2tzIHdoZXRoZXIKKyAqIGFkZGluZyBhZGRpdGlvbmFsX2xlbmd0aCB0byB0aGUgY3VycmVudCBsZW5ndGggd291bGQgb3ZlcmZsb3cgYW4KKyAqIGludGVnZXIsIGFuZCBjaGVja3MgZm9yIGV4Y2VlZGluZyBhIHN0cmluZydzIG1heCBsZW5ndGguCisgKiBUaGUgbmV3IGJ5dGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQsIG90aGVyIHRoYW4gbnVsLXRlcm1pbmF0aW5nCisgKiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIFRoZSB1bmluaXRpYWxpemVkIGJ5dGVzIG1heSBjb250YWluCisgKiBudWwgYnl0ZXMgb3Igb3RoZXIganVuay4KKyAqCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gYWRkaXRpb25hbF9sZW5ndGggbGVuZ3RoIHRvIGFkZCB0byB0aGUgc3RyaW5nLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19sZW5ndGhlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhZGRpdGlvbmFsX2xlbmd0aCkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7ICAKKyAgX2RidXNfYXNzZXJ0IChhZGRpdGlvbmFsX2xlbmd0aCA+PSAwKTsKKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKGFkZGl0aW9uYWxfbGVuZ3RoID4gcmVhbC0+bWF4X2xlbmd0aCAtIHJlYWwtPmxlbikpCisgICAgcmV0dXJuIEZBTFNFOyAvKiB3b3VsZCBvdmVyZmxvdyAqLworICAKKyAgcmV0dXJuIHNldF9sZW5ndGggKHJlYWwsCisgICAgICAgICAgICAgICAgICAgICByZWFsLT5sZW4gKyBhZGRpdGlvbmFsX2xlbmd0aCk7Cit9CisKKy8qKgorICogTWFrZXMgYSBzdHJpbmcgc2hvcnRlciBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBsZW5ndGhfdG9fcmVtb3ZlIGxlbmd0aCB0byByZW1vdmUgZnJvbSB0aGUgc3RyaW5nLgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2hvcnRlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbmd0aF90b19yZW1vdmUpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGxlbmd0aF90b19yZW1vdmUgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuZ3RoX3RvX3JlbW92ZSA8PSByZWFsLT5sZW4pOworCisgIHNldF9sZW5ndGggKHJlYWwsCisgICAgICAgICAgICAgIHJlYWwtPmxlbiAtIGxlbmd0aF90b19yZW1vdmUpOworfQorCisvKioKKyAqIFNldHMgdGhlIGxlbmd0aCBvZiBhIHN0cmluZy4gQ2FuIGJlIHVzZWQgdG8gdHJ1bmNhdGUgb3IgbGVuZ3RoZW4KKyAqIHRoZSBzdHJpbmcuIElmIHRoZSBzdHJpbmcgaXMgbGVuZ3RoZW5lZCwgdGhlIGZ1bmN0aW9uIG1heSBmYWlsIGFuZAorICogcmV0dXJuICNGQUxTRS4gTmV3bHktYWRkZWQgYnl0ZXMgYXJlIG5vdCBpbml0aWFsaXplZCwgYXMgd2l0aAorICogX2RidXNfc3RyaW5nX2xlbmd0aGVuKCkuCisgKgorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGxlbmd0aCBuZXcgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuZ3RoKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChsZW5ndGggPj0gMCk7CisKKyAgcmV0dXJuIHNldF9sZW5ndGggKHJlYWwsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICppbnNlcnRfYXRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZ2FwX3NpemUpCit7CisgIHVuc2lnbmVkIGxvbmcgbmV3X2xlbjsgLyogdWxvbmcgdG8gYXZvaWQgX0RCVVNfQUxJR05fVkFMVUUgb3ZlcmZsb3cgKi8KKyAgdW5zaWduZWQgbG9uZyBnYXBfcG9zOworICBpbnQgaW5zZXJ0X2F0OworICBpbnQgZGVsdGE7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGFsaWdubWVudCA+PSAxKTsKKyAgX2RidXNfYXNzZXJ0IChhbGlnbm1lbnQgPD0gOCk7IC8qIGl0IGhhcyB0byBiZSBhIGJ1ZyBpZiA+IDggKi8KKworICBpbnNlcnRfYXQgPSAqaW5zZXJ0X2F0X3A7CisKKyAgX2RidXNfYXNzZXJ0IChpbnNlcnRfYXQgPD0gcmVhbC0+bGVuKTsKKyAgCisgIGdhcF9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoaW5zZXJ0X2F0LCBhbGlnbm1lbnQpOworICBuZXdfbGVuID0gcmVhbC0+bGVuICsgKGdhcF9wb3MgLSBpbnNlcnRfYXQpICsgZ2FwX3NpemU7CisgIAorICBpZiAoX0RCVVNfVU5MSUtFTFkgKG5ld19sZW4gPiAodW5zaWduZWQgbG9uZykgcmVhbC0+bWF4X2xlbmd0aCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZGVsdGEgPSBuZXdfbGVuIC0gcmVhbC0+bGVuOworICBfZGJ1c19hc3NlcnQgKGRlbHRhID49IDApOworCisgIGlmIChkZWx0YSA9PSAwKSAvKiBvbmx5IGhhcHBlbnMgaWYgZ2FwX3NpemUgPT0gMCBhbmQgaW5zZXJ0X2F0IGlzIGFsaWduZWQgYWxyZWFkeSAqLworICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKCh1bnNpZ25lZCBsb25nKSAqaW5zZXJ0X2F0X3ApID09IGdhcF9wb3MpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfREJVU19VTkxJS0VMWSAoIW9wZW5fZ2FwIChuZXdfbGVuIC0gcmVhbC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCwgaW5zZXJ0X2F0KSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIG51bCB0aGUgcGFkZGluZyBpZiB3ZSBoYWQgdG8gYWRkIGFueSBwYWRkaW5nICovCisgIGlmIChnYXBfc2l6ZSA8IGRlbHRhKQorICAgIHsKKyAgICAgIG1lbXNldCAoJnJlYWwtPnN0cltpbnNlcnRfYXRdLCAnXDAnLAorICAgICAgICAgICAgICBnYXBfcG9zIC0gaW5zZXJ0X2F0KTsKKyAgICB9CisKKyAgKmluc2VydF9hdF9wID0gZ2FwX3BvczsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsaWduX2xlbmd0aF90aGVuX2xlbmd0aGVuIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHRoZW5fbGVuZ3RoZW5fYnkpCit7CisgIGludCBpbnNlcnRfYXQ7CisKKyAgaW5zZXJ0X2F0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIAorICByZXR1cm4gYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCwgdGhlbl9sZW5ndGhlbl9ieSk7Cit9CisKKy8qKgorICogQWxpZ24gdGhlIGxlbmd0aCBvZiBhIHN0cmluZyB0byBhIHNwZWNpZmljIGFsaWdubWVudCAodHlwaWNhbGx5IDQgb3IgOCkKKyAqIGJ5IGFwcGVuZGluZyBudWwgYnl0ZXMgdG8gdGhlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gYWxpZ25tZW50IHRoZSBhbGlnbm1lbnQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hbGlnbl9sZW5ndGggKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFsaWdubWVudCkKK3sKKyAgcmV0dXJuIGFsaWduX2xlbmd0aF90aGVuX2xlbmd0aGVuIChzdHIsIGFsaWdubWVudCwgMCk7Cit9CisKKy8qKgorICogUHJlYWxsb2NhdGUgZXh0cmFfYnl0ZXMgc3VjaCB0aGF0IGEgZnV0dXJlIGxlbmd0aGVuaW5nIG9mIHRoZQorICogc3RyaW5nIGJ5IGV4dHJhX2J5dGVzIGlzIGd1YXJhbnRlZWQgdG8gc3VjY2VlZCB3aXRob3V0IGFuIG91dCBvZgorICogbWVtb3J5IGVycm9yLgorICoKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBleHRyYV9ieXRlcyBieXRlcyB0byBhbGxvYworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXMpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChzdHIsIGV4dHJhX2J5dGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChzdHIsIGV4dHJhX2J5dGVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcHBlbmQgKERCdXNSZWFsU3RyaW5nICpyZWFsLAorICAgICAgICBjb25zdCBjaGFyICAgICAqYnVmZmVyLAorICAgICAgICBpbnQgICAgICAgICAgICAgYnVmZmVyX2xlbikKK3sKKyAgaWYgKGJ1ZmZlcl9sZW4gPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoKERCdXNTdHJpbmcqKXJlYWwsIGJ1ZmZlcl9sZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZW1jcHkgKHJlYWwtPnN0ciArIChyZWFsLT5sZW4gLSBidWZmZXJfbGVuKSwKKyAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgYnVmZmVyX2xlbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIG51bC10ZXJtaW5hdGVkIEMtc3R5bGUgc3RyaW5nIHRvIGEgREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBudWwtdGVybWluYXRlZCBjaGFyYWN0ZXJzIHRvIGFwcGVuZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyKQoreworICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9sZW47CisgIAorICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIgIT0gTlVMTCk7CisgIAorICBidWZmZXJfbGVuID0gc3RybGVuIChidWZmZXIpOworICBpZiAoYnVmZmVyX2xlbiA+ICh1bnNpZ25lZCBsb25nKSByZWFsLT5tYXhfbGVuZ3RoKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHJldHVybiBhcHBlbmQgKHJlYWwsIGJ1ZmZlciwgYnVmZmVyX2xlbik7Cit9CisKKy8qKiBhc3NpZ24gMiBieXRlcyBmcm9tIG9uZSBzdHJpbmcgdG8gYW5vdGhlciAqLworI2RlZmluZSBBU1NJR05fMl9PQ1RFVFMocCwgb2N0ZXRzKSBcCisgICooKGRidXNfdWludDE2X3QqKShwKSkgPSAqKChkYnVzX3VpbnQxNl90Kikob2N0ZXRzKSk7CisKKy8qKiBhc3NpZ24gNCBieXRlcyBmcm9tIG9uZSBzdHJpbmcgdG8gYW5vdGhlciAqLworI2RlZmluZSBBU1NJR05fNF9PQ1RFVFMocCwgb2N0ZXRzKSBcCisgICooKGRidXNfdWludDMyX3QqKShwKSkgPSAqKChkYnVzX3VpbnQzMl90Kikob2N0ZXRzKSk7CisKKyNpZmRlZiBEQlVTX0hBVkVfSU5UNjQKKy8qKiBhc3NpZ24gOCBieXRlcyBmcm9tIG9uZSBzdHJpbmcgdG8gYW5vdGhlciAqLworI2RlZmluZSBBU1NJR05fOF9PQ1RFVFMocCwgb2N0ZXRzKSBcCisgICooKGRidXNfdWludDY0X3QqKShwKSkgPSAqKChkYnVzX3VpbnQ2NF90Kikob2N0ZXRzKSk7CisjZWxzZQorLyoqIGFzc2lnbiA4IGJ5dGVzIGZyb20gb25lIHN0cmluZyB0byBhbm90aGVyICovCisjZGVmaW5lIEFTU0lHTl84X09DVEVUUyhwLCBvY3RldHMpICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuc2lnbmVkIGNoYXIgKmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGIgPSBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbNV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpiKysgPSBvY3RldHNbN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoYiA9PSBwICsgOCk7ICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2VuZGlmIC8qIERCVVNfSEFWRV9JTlQ2NCAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyoqCisgKiBBcHBlbmRzIDQgYnl0ZXMgYWxpZ25lZCBvbiBhIDQgYnl0ZSBib3VuZGFyeQorICogd2l0aCBhbnkgYWxpZ25tZW50IHBhZGRpbmcgaW5pdGlhbGl6ZWQgdG8gMC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gb2N0ZXRzIDQgYnl0ZXMgdG8gYXBwZW5kCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kXzRfYWxpZ25lZCAoREJ1c1N0cmluZyAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbNF0pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9sZW5ndGhfdGhlbl9sZW5ndGhlbiAoc3RyLCA0LCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQVNTSUdOXzRfT0NURVRTIChyZWFsLT5zdHIgKyAocmVhbC0+bGVuIC0gNCksIG9jdGV0cyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyoqCisgKiBBcHBlbmRzIDggYnl0ZXMgYWxpZ25lZCBvbiBhbiA4IGJ5dGUgYm91bmRhcnkKKyAqIHdpdGggYW55IGFsaWdubWVudCBwYWRkaW5nIGluaXRpYWxpemVkIHRvIDAuCisgKgorICogQHBhcmFtIHN0ciB0aGUgREJ1c1N0cmluZworICogQHBhcmFtIG9jdGV0cyA4IGJ5dGVzIHRvIGFwcGVuZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF84X2FsaWduZWQgKERCdXNTdHJpbmcgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzhdKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIGlmICghYWxpZ25fbGVuZ3RoX3RoZW5fbGVuZ3RoZW4gKHN0ciwgOCwgOCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEFTU0lHTl84X09DVEVUUyAocmVhbC0+c3RyICsgKHJlYWwtPmxlbiAtIDgpLCBvY3RldHMpOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBJbnNlcnRzIDIgYnl0ZXMgYWxpZ25lZCBvbiBhIDIgYnl0ZSBib3VuZGFyeQorICogd2l0aCBhbnkgYWxpZ25tZW50IHBhZGRpbmcgaW5pdGlhbGl6ZWQgdG8gMC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydAorICogQHBhcmFtIG9jdGV0cyAyIGJ5dGVzIHRvIGluc2VydAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF8yX2FsaWduZWQgKERCdXNTdHJpbmcgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzRdKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIGlmICghYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwgJmluc2VydF9hdCwgMiwgMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEFTU0lHTl8yX09DVEVUUyAocmVhbC0+c3RyICsgaW5zZXJ0X2F0LCBvY3RldHMpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluc2VydHMgNCBieXRlcyBhbGlnbmVkIG9uIGEgNCBieXRlIGJvdW5kYXJ5CisgKiB3aXRoIGFueSBhbGlnbm1lbnQgcGFkZGluZyBpbml0aWFsaXplZCB0byAwLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gaW5zZXJ0CisgKiBAcGFyYW0gb2N0ZXRzIDQgYnl0ZXMgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0XzRfYWxpZ25lZCAoREJ1c1N0cmluZyAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbNF0pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCAmaW5zZXJ0X2F0LCA0LCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQVNTSUdOXzRfT0NURVRTIChyZWFsLT5zdHIgKyBpbnNlcnRfYXQsIG9jdGV0cyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5zZXJ0cyA4IGJ5dGVzIGFsaWduZWQgb24gYW4gOCBieXRlIGJvdW5kYXJ5CisgKiB3aXRoIGFueSBhbGlnbm1lbnQgcGFkZGluZyBpbml0aWFsaXplZCB0byAwLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gaW5zZXJ0CisgKiBAcGFyYW0gb2N0ZXRzIDggYnl0ZXMgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAoREJ1c1N0cmluZyAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbOF0pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCAmaW5zZXJ0X2F0LCA4LCA4KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAoaW5zZXJ0X2F0LCA4KSA9PSAodW5zaWduZWQpIGluc2VydF9hdCk7CisgIAorICBBU1NJR05fOF9PQ1RFVFMgKHJlYWwtPnN0ciArIGluc2VydF9hdCwgb2N0ZXRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEluc2VydHMgcGFkZGluZyBhdCAqaW5zZXJ0X2F0IHN1Y2ggdG8gYWxpZ24gaXQgdG8gdGhlIGdpdmVuCisgKiBib3VuZGFyeS4gSW5pdGlhbGl6ZXMgdGhlIHBhZGRpbmcgdG8gbnVsIGJ5dGVzLiBTZXRzICppbnNlcnRfYXQKKyAqIHRvIHRoZSBhbGlnbmVkIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgbG9jYXRpb24gdG8gYmUgYWxpZ25lZAorICogQHBhcmFtIGFsaWdubWVudCBhbGlnbm1lbnQgYm91bmRhcnkgKDEsIDIsIDQsIG9yIDgpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhbGlnbm1lbnQpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCBpbnNlcnRfYXQsIGFsaWdubWVudCwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKCppbnNlcnRfYXQsIGFsaWdubWVudCkgPT0gKHVuc2lnbmVkKSAqaW5zZXJ0X2F0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgcHJpbnRmLXN0eWxlIGZvcm1hdHRlZCBzdHJpbmcKKyAqIHRvIHRoZSAjREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBmb3JtYXQgcHJpbnRmIGZvcm1hdAorICogQHBhcmFtIGFyZ3MgdmFyaWFibGUgYXJndW1lbnQgbGlzdAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgYXJncykKK3sKKyAgaW50IGxlbjsKKyAgdmFfbGlzdCBhcmdzX2NvcHk7CisKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgREJVU19WQV9DT1BZIChhcmdzX2NvcHksIGFyZ3MpOworCisgIC8qIE1lYXN1cmUgdGhlIG1lc3NhZ2UgbGVuZ3RoIHdpdGhvdXQgdGVybWluYXRpbmcgbnVsICovCisgIGxlbiA9IF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQgKGZvcm1hdCwgYXJncyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgbGVuKSkKKyAgICB7CisgICAgICAvKiBkb24ndCBsZWFrIHRoZSBjb3B5ICovCisgICAgICB2YV9lbmQgKGFyZ3NfY29weSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgdnNwcmludGYgKChjaGFyKikgKHJlYWwtPnN0ciArIChyZWFsLT5sZW4gLSBsZW4pKSwKKyAgICAgICAgICAgIGZvcm1hdCwgYXJnc19jb3B5KTsKKworICB2YV9lbmQgKGFyZ3NfY29weSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIHByaW50Zi1zdHlsZSBmb3JtYXR0ZWQgc3RyaW5nCisgKiB0byB0aGUgI0RCdXNTdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZm9ybWF0IHByaW50ZiBmb3JtYXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgKHN0ciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIEFwcGVuZHMgYmxvY2sgb2YgYnl0ZXMgd2l0aCB0aGUgZ2l2ZW4gbGVuZ3RoIHRvIGEgREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBieXRlcyB0byBhcHBlbmQKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKworICByZXR1cm4gYXBwZW5kIChyZWFsLCBidWZmZXIsIGxlbik7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJpbmcsIHJldHVybmluZyAjRkFMU0UKKyAqIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUgdG8gYXBwZW5kCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgYnl0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgaWYgKCFzZXRfbGVuZ3RoIChyZWFsLCByZWFsLT5sZW4gKyAxKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVhbC0+c3RyW3JlYWwtPmxlbi0xXSA9IGJ5dGU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIEFwcGVuZHMgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIsIGVuY29kaW5nIHRoZSBjaGFyYWN0ZXIKKyAqIGluIFVURi04IGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBjaCB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfdW5pY2hhciAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VuaWNoYXJfdCBjaCkKK3sKKyAgaW50IGxlbjsKKyAgaW50IGZpcnN0OworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciAqb3V0OworICAKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgLyogdGhpcyBjb2RlIGlzIGZyb20gR0xpYiBidXQgaXMgcHJldHR5IHN0YW5kYXJkIEkgdGhpbmsgKi8KKyAgCisgIGxlbiA9IDA7CisgIAorICBpZiAoY2ggPCAweDgwKQorICAgIHsKKyAgICAgIGZpcnN0ID0gMDsKKyAgICAgIGxlbiA9IDE7CisgICAgfQorICBlbHNlIGlmIChjaCA8IDB4ODAwKQorICAgIHsKKyAgICAgIGZpcnN0ID0gMHhjMDsKKyAgICAgIGxlbiA9IDI7CisgICAgfQorICBlbHNlIGlmIChjaCA8IDB4MTAwMDApCisgICAgeworICAgICAgZmlyc3QgPSAweGUwOworICAgICAgbGVuID0gMzsKKyAgICB9CisgICBlbHNlIGlmIChjaCA8IDB4MjAwMDAwKQorICAgIHsKKyAgICAgIGZpcnN0ID0gMHhmMDsKKyAgICAgIGxlbiA9IDQ7CisgICAgfQorICBlbHNlIGlmIChjaCA8IDB4NDAwMDAwMCkKKyAgICB7CisgICAgICBmaXJzdCA9IDB4Zjg7CisgICAgICBsZW4gPSA1OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZpcnN0ID0gMHhmYzsKKyAgICAgIGxlbiA9IDY7CisgICAgfQorCisgIGlmIChsZW4gPiAocmVhbC0+bWF4X2xlbmd0aCAtIHJlYWwtPmxlbikpCisgICAgcmV0dXJuIEZBTFNFOyAvKiByZWFsLT5sZW4gKyBsZW4gd291bGQgb3ZlcmZsb3cgKi8KKyAgCisgIGlmICghc2V0X2xlbmd0aCAocmVhbCwgcmVhbC0+bGVuICsgbGVuKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgb3V0ID0gcmVhbC0+c3RyICsgKHJlYWwtPmxlbiAtIGxlbik7CisgIAorICBmb3IgKGkgPSBsZW4gLSAxOyBpID4gMDsgLS1pKQorICAgIHsKKyAgICAgIG91dFtpXSA9IChjaCAmIDB4M2YpIHwgMHg4MDsKKyAgICAgIGNoID4+PSA2OworICAgIH0KKyAgb3V0WzBdID0gY2ggfCBmaXJzdDsKKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKK3N0YXRpYyB2b2lkCitkZWxldGUgKERCdXNSZWFsU3RyaW5nICpyZWFsLAorICAgICAgICBpbnQgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgIGludCAgICAgICAgICAgICBsZW4pCit7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm47CisgIAorICBtZW1tb3ZlIChyZWFsLT5zdHIgKyBzdGFydCwgcmVhbC0+c3RyICsgc3RhcnQgKyBsZW4sIHJlYWwtPmxlbiAtIChzdGFydCArIGxlbikpOworICByZWFsLT5sZW4gLT0gbGVuOworICByZWFsLT5zdHJbcmVhbC0+bGVuXSA9ICdcMCc7Cit9CisKKy8qKgorICogRGVsZXRlcyBhIHNlZ21lbnQgb2YgYSBEQnVzU3RyaW5nIHdpdGggbGVuZ3RoIGxlbiBzdGFydGluZyBhdAorICogc3RhcnQuIChIaW50OiB0byBjbGVhciBhbiBlbnRpcmUgc3RyaW5nLCBzZXR0aW5nIGxlbmd0aCB0byAwCisgKiB3aXRoIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoKCkgaXMgZWFzaWVyLikKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQgZGVsZXRpbmcKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBkZWxldGUKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2RlbGV0ZSAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsLT5sZW4gLSBzdGFydCk7CisgIAorICBkZWxldGUgKHJlYWwsIHN0YXJ0LCBsZW4pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NvcHkgKERCdXNSZWFsU3RyaW5nICpzb3VyY2UsCisgICAgICBpbnQgICAgICAgICAgICAgc3RhcnQsCisgICAgICBpbnQgICAgICAgICAgICAgbGVuLAorICAgICAgREJ1c1JlYWxTdHJpbmcgKmRlc3QsCisgICAgICBpbnQgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFvcGVuX2dhcCAobGVuLCBkZXN0LCBpbnNlcnRfYXQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIG1lbW1vdmUgKGRlc3QtPnN0ciArIGluc2VydF9hdCwKKyAgICAgICAgICAgc291cmNlLT5zdHIgKyBzdGFydCwKKyAgICAgICAgICAgbGVuKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgYXNzZXJ0aW9ucyBmb3IgdHdvIHN0cmluZ3Mgd2UncmUgY29weWluZyBhIHNlZ21lbnQgYmV0d2VlbiwKKyAqIGFuZCBkZWNsYXJlcyByZWFsX3NvdXJjZS9yZWFsX2Rlc3QgdmFyaWFibGVzLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgb2Zmc2V0CisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdCBzdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdGhlIGNvcGllZCBzZWdtZW50IGlzIGluc2VydGVkCisgKi8KKyNkZWZpbmUgREJVU19TVFJJTkdfQ09QWV9QUkVBTUJMRShzb3VyY2UsIHN0YXJ0LCBkZXN0LCBpbnNlcnRfYXQpICAgICAgIFwKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWxfc291cmNlID0gKERCdXNSZWFsU3RyaW5nKikgc291cmNlOyAgICAgICAgICAgICAgIFwKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWxfZGVzdCA9IChEQnVzUmVhbFN0cmluZyopIGRlc3Q7ICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoc291cmNlKSAhPSAoZGVzdCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9zb3VyY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9kZXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghcmVhbF9kZXN0LT5jb25zdGFudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghcmVhbF9kZXN0LT5sb2NrZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoc3RhcnQpID49IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoc3RhcnQpIDw9IHJlYWxfc291cmNlLT5sZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoaW5zZXJ0X2F0KSA+PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICgoaW5zZXJ0X2F0KSA8PSByZWFsX2Rlc3QtPmxlbikKKworLyoqCisgKiBNb3ZlcyB0aGUgZW5kIG9mIG9uZSBzdHJpbmcgaW50byBhbm90aGVyIHN0cmluZy4gQm90aCBzdHJpbmdzCisgKiBtdXN0IGJlIGluaXRpYWxpemVkLCB2YWxpZCBzdHJpbmdzLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBjaG9wIG9mZiB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBtb3ZlIHRoZSBjaG9wcGVkLW9mZiBwYXJ0IG9mIHNvdXJjZSBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX21vdmUgKERCdXNTdHJpbmcgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCkKK3sKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWxfc291cmNlID0gKERCdXNSZWFsU3RyaW5nKikgc291cmNlOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWxfc291cmNlLT5sZW4pOworICAKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19tb3ZlX2xlbiAoc291cmNlLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF9zb3VyY2UtPmxlbiAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LCBpbnNlcnRfYXQpOworfQorCisvKioKKyAqIExpa2UgX2RidXNfc3RyaW5nX21vdmUoKSwgYnV0IGRvZXMgbm90IGRlbGV0ZSB0aGUgc2VjdGlvbgorICogb2YgdGhlIHNvdXJjZSBzdHJpbmcgdGhhdCdzIGNvcGllZCB0byB0aGUgZGVzdCBzdHJpbmcuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gcGxhY2UgdGhlIGNvcGllZCBwYXJ0IG9mIHNvdXJjZSBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2NvcHkgKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCkKK3sKKyAgREJVU19TVFJJTkdfQ09QWV9QUkVBTUJMRSAoc291cmNlLCBzdGFydCwgZGVzdCwgaW5zZXJ0X2F0KTsKKworICByZXR1cm4gY29weSAocmVhbF9zb3VyY2UsIHN0YXJ0LAorICAgICAgICAgICAgICAgcmVhbF9zb3VyY2UtPmxlbiAtIHN0YXJ0LAorICAgICAgICAgICAgICAgcmVhbF9kZXN0LAorICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3N0cmluZ19tb3ZlKCksIGJ1dCBjYW4gbW92ZSBhIHNlZ21lbnQgZnJvbQorICogdGhlIG1pZGRsZSBvZiB0aGUgc291cmNlIHN0cmluZy4KKyAqCisgKiBAdG9kbyB0aGlzIGRvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCBtYXhfbGVuZ3RoIGZpZWxkLgorICogd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3Qga2lsbCB0aGUgbWF4X2xlbmd0aCBmaWVsZCB0aG91Z2guCisgKiAKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIG9mIHNvdXJjZSBzdHJpbmcgdG8gbW92ZQorICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygc2VnbWVudCB0byBtb3ZlCisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gc3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIG1vdmUgdGhlIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX21vdmVfbGVuIChEQnVzU3RyaW5nICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCkKKworeworICBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFIChzb3VyY2UsIHN0YXJ0LCBkZXN0LCBpbnNlcnRfYXQpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICgoc3RhcnQgKyBsZW4pIDw9IHJlYWxfc291cmNlLT5sZW4pOworCisKKyAgaWYgKGxlbiA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoc3RhcnQgPT0gMCAmJgorICAgICAgICAgICBsZW4gPT0gcmVhbF9zb3VyY2UtPmxlbiAmJgorICAgICAgICAgICByZWFsX2Rlc3QtPmxlbiA9PSAwKQorICAgIHsKKyAgICAgIC8qIFNob3J0LWNpcmN1aXQgbW92aW5nIGFuIGVudGlyZSBleGlzdGluZyBzdHJpbmcgdG8gYW4gZW1wdHkgc3RyaW5nCisgICAgICAgKiBieSBqdXN0IHN3YXBwaW5nIHRoZSBidWZmZXJzLgorICAgICAgICovCisgICAgICAvKiB3ZSBhc3N1bWUgLT5jb25zdGFudCBkb2Vzbid0IG1hdHRlciBhcyB5b3UgY2FuJ3QgaGF2ZQorICAgICAgICogYSBjb25zdGFudCBzdHJpbmcgaW52b2x2ZWQgaW4gYSBtb3ZlLgorICAgICAgICovCisjZGVmaW5lIEFTU0lHTl9EQVRBKGEsIGIpIGRvIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhKS0+c3RyID0gKGIpLT5zdHI7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhKS0+bGVuID0gKGIpLT5sZW47ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhKS0+YWxsb2NhdGVkID0gKGIpLT5hbGxvY2F0ZWQ7ICAgICAgICBcCisgICAgICAgIChhKS0+YWxpZ25fb2Zmc2V0ID0gKGIpLT5hbGlnbl9vZmZzZXQ7ICBcCisgICAgICB9IHdoaWxlICgwKQorICAgICAgCisgICAgICBEQnVzUmVhbFN0cmluZyB0bXA7CisKKyAgICAgIEFTU0lHTl9EQVRBICgmdG1wLCByZWFsX3NvdXJjZSk7CisgICAgICBBU1NJR05fREFUQSAocmVhbF9zb3VyY2UsIHJlYWxfZGVzdCk7CisgICAgICBBU1NJR05fREFUQSAocmVhbF9kZXN0LCAmdG1wKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFjb3B5IChyZWFsX3NvdXJjZSwgc3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgcmVhbF9kZXN0LAorICAgICAgICAgICAgICAgICBpbnNlcnRfYXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGRlbGV0ZSAocmVhbF9zb3VyY2UsIHN0YXJ0LAorICAgICAgICAgICAgICBsZW4pOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c19zdHJpbmdfY29weSgpLCBidXQgY2FuIGNvcHkgYSBzZWdtZW50IGZyb20gdGhlIG1pZGRsZSBvZgorICogdGhlIHNvdXJjZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gY29weQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBwbGFjZSB0aGUgY29waWVkIHNlZ21lbnQgb2Ygc291cmNlIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfY29weV9sZW4gKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFIChzb3VyY2UsIHN0YXJ0LCBkZXN0LCBpbnNlcnRfYXQpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsX3NvdXJjZS0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbF9zb3VyY2UtPmxlbiAtIHN0YXJ0KTsKKyAgCisgIHJldHVybiBjb3B5IChyZWFsX3NvdXJjZSwgc3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgIHJlYWxfZGVzdCwKKyAgICAgICAgICAgICAgIGluc2VydF9hdCk7Cit9CisKKy8qKgorICogUmVwbGFjZXMgYSBzZWdtZW50IG9mIGRlc3Qgc3RyaW5nIHdpdGggYSBzZWdtZW50IG9mIHNvdXJjZSBzdHJpbmcuCisgKgorICogQHRvZG8gb3B0aW1pemUgdGhlIGNhc2Ugd2hlcmUgdGhlIHR3byBsZW5ndGhzIGFyZSB0aGUgc2FtZSwgYW5kCisgKiBhdm9pZCBtZW1tb3ZpbmcgdGhlIGRhdGEgaW4gdGhlIHRyYWlsaW5nIHBhcnQgb2YgdGhlIHN0cmluZyB0d2ljZS4KKyAqCisgKiBAdG9kbyBhdm9pZCBpbnNlcnRpbmcgdGhlIHNvdXJjZSBpbnRvIGRlc3QsIHRoZW4gZGVsZXRpbmcKKyAqIHRoZSByZXBsYWNlZCBjaHVuayBvZiBkZXN0ICh3aGljaCBjcmVhdGVzIGEgcG90ZW50aWFsbHkgbGFyZ2UKKyAqIGludGVybWVkaWF0ZSBzdHJpbmcpLiBJbnN0ZWFkLCBleHRlbmQgdGhlIHJlcGxhY2VkIGNodW5rCisgKiBvZiBkZXN0IHdpdGggcGFkZGluZyB0byB0aGUgc2FtZSBzaXplIGFzIHRoZSBzb3VyY2UgY2h1bmssCisgKiB0aGVuIGNvcHkgaW4gdGhlIHNvdXJjZSBieXRlcy4KKyAqIAorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gY29weQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIHJlcGxhY2VfYXQgc3RhcnQgb2Ygc2VnbWVudCBvZiBkZXN0IHN0cmluZyB0byByZXBsYWNlCisgKiBAcGFyYW0gcmVwbGFjZV9sZW4gbGVuZ3RoIG9mIHNlZ21lbnQgb2YgZGVzdCBzdHJpbmcgdG8gcmVwbGFjZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuIChjb25zdCBEQnVzU3RyaW5nICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHJlcGxhY2VfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHJlcGxhY2VfbGVuKQoreworICBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFIChzb3VyY2UsIHN0YXJ0LCBkZXN0LCByZXBsYWNlX2F0KTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbF9zb3VyY2UtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IHJlYWxfc291cmNlLT5sZW4gLSBzdGFydCk7CisgIF9kYnVzX2Fzc2VydCAocmVwbGFjZV9hdCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChyZXBsYWNlX2F0IDw9IHJlYWxfZGVzdC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChyZXBsYWNlX2xlbiA8PSByZWFsX2Rlc3QtPmxlbiAtIHJlcGxhY2VfYXQpOworCisgIGlmICghY29weSAocmVhbF9zb3VyY2UsIHN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgcmVhbF9kZXN0LCByZXBsYWNlX2F0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZGVsZXRlIChyZWFsX2Rlc3QsIHJlcGxhY2VfYXQgKyBsZW4sIHJlcGxhY2VfbGVuKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMb29rcyBmb3IgdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiBhIGJ5dGUsIGRlbGV0ZXMgdGhhdCBieXRlLAorICogYW5kIG1vdmVzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGJ5dGUgdG8gdGhlIGJlZ2lubmluZyBvZiBhCisgKiBzZXBhcmF0ZSBzdHJpbmcuICBCb3RoIHN0cmluZ3MgbXVzdCBiZSBpbml0aWFsaXplZCwgdmFsaWQKKyAqIHN0cmluZ3MuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUgdG8gcmVtb3ZlIGFuZCBzcGxpdCB0aGUgc3RyaW5nIGF0CisgKiBAcGFyYW0gdGFpbCB0aGUgc3BsaXQgb2ZmIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIGlmIGJ5dGUgY291bGQgbm90IGJlIGZvdW5kCisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3NwbGl0X29uX2J5dGUgKERCdXNTdHJpbmcgICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKnRhaWwpCit7CisgIGludCBieXRlX3Bvc2l0aW9uOworICBjaGFyIGJ5dGVfc3RyaW5nWzJdID0gIiI7CisgIGludCBoZWFkX2xlbmd0aDsKKyAgaW50IHRhaWxfbGVuZ3RoOworCisgIGJ5dGVfc3RyaW5nWzBdID0gKGNoYXIpIGJ5dGU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoc291cmNlLCAwLCBieXRlX3N0cmluZywgJmJ5dGVfcG9zaXRpb24pKQorICAgIHJldHVybiBGQUxTRTsKKworICBoZWFkX2xlbmd0aCA9IGJ5dGVfcG9zaXRpb247CisgIHRhaWxfbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNvdXJjZSkgLSBoZWFkX2xlbmd0aCAtIDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZV9sZW4gKHNvdXJjZSwgYnl0ZV9wb3NpdGlvbiArIDEsIHRhaWxfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHJlbW92ZSB0aGUgdHJhaWxpbmcgZGVsaW1pdGVyIGJ5dGUgZnJvbSB0aGUgaGVhZCBub3cuCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzb3VyY2UsIGhlYWRfbGVuZ3RoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFVuaWNvZGUgbWFjcm9zIGFuZCB1dGY4X3ZhbGlkYXRlKCkgZnJvbSBHTGliIE93ZW4gVGF5bG9yLCBIYXZvYworICogUGVubmluZ3RvbiwgYW5kIFRvbSBUcm9tZXkgYXJlIHRoZSBhdXRob3JzIGFuZCBhdXRob3JpemVkIHJlbGljZW5zZS4KKyAqLworCisvKiogY29tcHV0ZXMgbGVuZ3RoIGFuZCBtYXNrIG9mIGEgdW5pY29kZSBjaGFyYWN0ZXIKKyAqIEBwYXJhbSBDaGFyIHRoZSBjaGFyCisgKiBAcGFyYW0gTWFzayB0aGUgbWFzayB2YXJpYWJsZSB0byBhc3NpZ24gdG8KKyAqIEBwYXJhbSBMZW4gdGhlIGxlbmd0aCB2YXJpYWJsZSB0byBhc3NpZ24gdG8KKyAqLworI2RlZmluZSBVVEY4X0NPTVBVVEUoQ2hhciwgTWFzaywgTGVuKQkJCQkJICAgICAgXAorICBpZiAoQ2hhciA8IDEyOCkJCQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSAxOwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4N2Y7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlIGlmICgoQ2hhciAmIDB4ZTApID09IDB4YzApCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDI7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHgxZjsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgaWYgKChDaGFyICYgMHhmMCkgPT0gMHhlMCkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gMzsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDBmOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSBpZiAoKENoYXIgJiAweGY4KSA9PSAweGYwKQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSA0OwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4MDc7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlIGlmICgoQ2hhciAmIDB4ZmMpID09IDB4ZjgpCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDU7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHgwMzsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgaWYgKChDaGFyICYgMHhmZSkgPT0gMHhmYykJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gNjsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDAxOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIExlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTWFzayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLyoqCisgKiBjb21wdXRlcyBsZW5ndGggb2YgYSB1bmljb2RlIGNoYXJhY3RlciBpbiBVVEYtOAorICogQHBhcmFtIENoYXIgdGhlIGNoYXIKKyAqLworI2RlZmluZSBVVEY4X0xFTkdUSChDaGFyKSAgICAgICAgICAgICAgXAorICAoKENoYXIpIDwgMHg4MCA/IDEgOiAgICAgICAgICAgICAgICAgXAorICAgKChDaGFyKSA8IDB4ODAwID8gMiA6ICAgICAgICAgICAgICAgXAorICAgICgoQ2hhcikgPCAweDEwMDAwID8gMyA6ICAgICAgICAgICAgXAorICAgICAoKENoYXIpIDwgMHgyMDAwMDAgPyA0IDogICAgICAgICAgXAorICAgICAgKChDaGFyKSA8IDB4NDAwMDAwMCA/IDUgOiA2KSkpKSkKKyAgIAorLyoqCisgKiBHZXRzIGEgVVRGLTggdmFsdWUuCisgKgorICogQHBhcmFtIFJlc3VsdCB2YXJpYWJsZSBmb3IgZXh0cmFjdGVkIHVuaWNvZGUgY2hhci4KKyAqIEBwYXJhbSBDaGFycyB0aGUgYnl0ZXMgdG8gZGVjb2RlCisgKiBAcGFyYW0gQ291bnQgY291bnRlciB2YXJpYWJsZQorICogQHBhcmFtIE1hc2sgbWFzayBmb3IgdGhpcyBjaGFyCisgKiBAcGFyYW0gTGVuIGxlbmd0aCBmb3IgdGhpcyBjaGFyIGluIGJ5dGVzCisgKi8KKyNkZWZpbmUgVVRGOF9HRVQoUmVzdWx0LCBDaGFycywgQ291bnQsIE1hc2ssIExlbikJCQkgICAgICBcCisgIChSZXN1bHQpID0gKENoYXJzKVswXSAmIChNYXNrKTsJCQkJCSAgICAgIFwKKyAgZm9yICgoQ291bnQpID0gMTsgKENvdW50KSA8IChMZW4pOyArKyhDb3VudCkpCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgaWYgKCgoQ2hhcnMpWyhDb3VudCldICYgMHhjMCkgIT0gMHg4MCkJCQkJICAgICAgXAorCXsJCQkJCQkJCSAgICAgIFwKKwkgIChSZXN1bHQpID0gLTE7CQkJCQkJICAgICAgXAorCSAgYnJlYWs7CQkJCQkJCSAgICAgIFwKKwl9CQkJCQkJCQkgICAgICBcCisgICAgICAoUmVzdWx0KSA8PD0gNjsJCQkJCQkJICAgICAgXAorICAgICAgKFJlc3VsdCkgfD0gKChDaGFycylbKENvdW50KV0gJiAweDNmKTsJCQkJICAgICAgXAorICAgIH0KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGEgVW5pY29kZSAoNS4yKSBjaGFyIGlzIGluIGEgdmFsaWQgcmFuZ2UuCisgKgorICogVGhlIGZpcnN0IGNoZWNrIGNvbWVzIGZyb20gdGhlIFVuaWNvZGUgZ3VhcmFudGVlIHRvIG5ldmVyIGVuY29kZQorICogYSBwb2ludCBhYm92ZSAweDAwMTBmZmZmLCBzaW5jZSBVVEYtMTYgY291bGRuJ3QgcmVwcmVzZW50IGl0LgorICoKKyAqIFRoZSBzZWNvbmQgY2hlY2sgY292ZXJzIHN1cnJvZ2F0ZSBwYWlycyAoY2F0ZWdvcnkgQ3MpLgorICoKKyAqIFRoZSBsYXN0IHR3byBjaGVja3MgY292ZXIgIk5vbmNoYXJhY3RlciI6IGRlZmluZWQgYXM6CisgKiAgICJBIGNvZGUgcG9pbnQgdGhhdCBpcyBwZXJtYW5lbnRseSByZXNlcnZlZCBmb3IKKyAqICAgIGludGVybmFsIHVzZSwgYW5kIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGludGVyY2hhbmdlZC4gSW4KKyAqICAgIFVuaWNvZGUgMy4xLCB0aGVzZSBjb25zaXN0IG9mIHRoZSB2YWx1ZXMgVStuRkZGRSBhbmQgVStuRkZGRgorICogICAgKHdoZXJlIG4gaXMgZnJvbSAwIHRvIDEwXzE2KSBhbmQgdGhlIHZhbHVlcyBVK0ZERDAuLlUrRkRFRi4iCisgKgorICogQHBhcmFtIENoYXIgdGhlIGNoYXJhY3RlcgorICovCisjZGVmaW5lIFVOSUNPREVfVkFMSUQoQ2hhcikgICAgICAgICAgICAgICAgICAgXAorICAgICgoQ2hhcikgPCAweDExMDAwMCAmJiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoQ2hhcikgJiAweEZGRkZGODAwKSAhPSAweEQ4MDApICYmICAgICBcCisgICAgICgoQ2hhcikgPCAweEZERDAgfHwgKENoYXIpID4gMHhGREVGKSAmJiAgXAorICAgICAoKENoYXIpICYgMHhGRkZFKSAhPSAweEZGRkUpCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIEdldHMgYSB1bmljb2RlIGNoYXJhY3RlciBmcm9tIGEgVVRGLTggc3RyaW5nLiBEb2VzIG5vIHZhbGlkYXRpb247CisgKiB5b3UgbXVzdCB2ZXJpZnkgdGhhdCB0aGUgc3RyaW5nIGlzIHZhbGlkIFVURi04IGluIGFkdmFuY2UgYW5kIG11c3QKKyAqIHBhc3MgaW4gdGhlIHN0YXJ0IG9mIGEgY2hhcmFjdGVyLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgVVRGLTggY2hhcmFjdGVyLgorICogQHBhcmFtIGNoX3JldHVybiBsb2NhdGlvbiB0byByZXR1cm4gdGhlIGNoYXJhY3RlcgorICogQHBhcmFtIGVuZF9yZXR1cm4gbG9jYXRpb24gdG8gcmV0dXJuIHRoZSBieXRlIGluZGV4IG9mIG5leHQgY2hhcmFjdGVyCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19nZXRfdW5pY2hhciAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191bmljaGFyX3QgICAqY2hfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICplbmRfcmV0dXJuKQoreworICBpbnQgaSwgbWFzaywgbGVuOworICBkYnVzX3VuaWNoYXJfdCByZXN1bHQ7CisgIHVuc2lnbmVkIGNoYXIgYzsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgCisgIGlmIChjaF9yZXR1cm4pCisgICAgKmNoX3JldHVybiA9IDA7CisgIGlmIChlbmRfcmV0dXJuKQorICAgICplbmRfcmV0dXJuID0gcmVhbC0+bGVuOworICAKKyAgbWFzayA9IDA7CisgIHAgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgYyA9ICpwOworICAKKyAgVVRGOF9DT01QVVRFIChjLCBtYXNrLCBsZW4pOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuOworICBVVEY4X0dFVCAocmVzdWx0LCBwLCBpLCBtYXNrLCBsZW4pOworCisgIGlmIChyZXN1bHQgPT0gKGRidXNfdW5pY2hhcl90KS0xKQorICAgIHJldHVybjsKKworICBpZiAoY2hfcmV0dXJuKQorICAgICpjaF9yZXR1cm4gPSByZXN1bHQ7CisgIGlmIChlbmRfcmV0dXJuKQorICAgICplbmRfcmV0dXJuID0gc3RhcnQgKyBsZW47Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisvKioKKyAqIEZpbmRzIHRoZSBnaXZlbiBzdWJzdHJpbmcgaW4gdGhlIHN0cmluZywKKyAqIHJldHVybmluZyAjVFJVRSBhbmQgZmlsbGluZyBpbiB0aGUgYnl0ZSBpbmRleAorICogd2hlcmUgdGhlIHN1YnN0cmluZyB3YXMgZm91bmQsIGlmIGl0IHdhcyBmb3VuZC4KKyAqIFJldHVybnMgI0ZBTFNFIGlmIHRoZSBzdWJzdHJpbmcgd2Fzbid0IGZvdW5kLgorICogU2V0cyAqc3RhcnQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlmIHRoZSBzdWJzdHJpbmcKKyAqIGlzIG5vdCBmb3VuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBsb29raW5nCisgKiBAcGFyYW0gc3Vic3RyIHRoZSBzdWJzdHJpbmcKKyAqIEBwYXJhbSBmb3VuZCByZXR1cm4gbG9jYXRpb24gZm9yIHdoZXJlIGl0IHdhcyBmb3VuZCwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNUUlVFIGlmIGZvdW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZmluZCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19maW5kX3RvIChzdHIsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29uc3QgREJ1c1JlYWxTdHJpbmcqKXN0ciktPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIsIGZvdW5kKTsKK30KKworLyoqCisgKiBGaW5kcyBlbmQgb2YgbGluZSAoIlxyXG4iIG9yICJcbiIpIGluIHRoZSBzdHJpbmcsCisgKiByZXR1cm5pbmcgI1RSVUUgYW5kIGZpbGxpbmcgaW4gdGhlIGJ5dGUgaW5kZXgKKyAqIHdoZXJlIHRoZSBlb2wgc3RyaW5nIHdhcyBmb3VuZCwgaWYgaXQgd2FzIGZvdW5kLgorICogUmV0dXJucyAjRkFMU0UgaWYgZW9sIHdhc24ndCBmb3VuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBsb29raW5nCisgKiBAcGFyYW0gZm91bmQgcmV0dXJuIGxvY2F0aW9uIGZvciB3aGVyZSBlb2wgd2FzIGZvdW5kIG9yIHN0cmluZyBsZW5ndGggb3RoZXJ3aXNlCisgKiBAcGFyYW0gZm91bmRfbGVuIHJldHVybiBsZW5ndGggb2YgZm91bmQgZW9sIHN0cmluZyBvciB6ZXJvIG90aGVyd2lzZQorICogQHJldHVybnMgI1RSVUUgaWYgZm91bmQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19maW5kX2VvbCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kX2xlbikKK3sKKyAgaW50IGk7CisKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKHJlYWwtPnN0cltpXSA9PSAnXHInKSAKKyAgICAgICAgeworICAgICAgICAgIGlmICgoaSsxKSA8IHJlYWwtPmxlbiAmJiByZWFsLT5zdHJbaSsxXSA9PSAnXG4nKSAvKiAiXHJcbiIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGZvdW5kKSAKKyAgICAgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgICAgICBpZiAoZm91bmRfbGVuKQorICAgICAgICAgICAgICAgICpmb3VuZF9sZW4gPSAyOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgZWxzZSAvKiBvbmx5ICJcciIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGZvdW5kKSAKKyAgICAgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgICAgICBpZiAoZm91bmRfbGVuKQorICAgICAgICAgICAgICAgICpmb3VuZF9sZW4gPSAxOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgIGVsc2UgaWYgKHJlYWwtPnN0cltpXSA9PSAnXG4nKSAgLyogb25seSAiXG4iICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZm91bmQpIAorICAgICAgICAgICAgKmZvdW5kID0gaTsKKyAgICAgICAgICBpZiAoZm91bmRfbGVuKQorICAgICAgICAgICAgKmZvdW5kX2xlbiA9IDE7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKGZvdW5kKQorICAgICpmb3VuZCA9IHJlYWwtPmxlbjsKKworICBpZiAoZm91bmRfbGVuKQorICAgICpmb3VuZF9sZW4gPSAwOworICAKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBnaXZlbiBzdWJzdHJpbmcgaW4gdGhlIHN0cmluZywKKyAqIHVwIHRvIGEgY2VydGFpbiBwb3NpdGlvbiwKKyAqIHJldHVybmluZyAjVFJVRSBhbmQgZmlsbGluZyBpbiB0aGUgYnl0ZSBpbmRleAorICogd2hlcmUgdGhlIHN1YnN0cmluZyB3YXMgZm91bmQsIGlmIGl0IHdhcyBmb3VuZC4KKyAqIFJldHVybnMgI0ZBTFNFIGlmIHRoZSBzdWJzdHJpbmcgd2Fzbid0IGZvdW5kLgorICogU2V0cyAqc3RhcnQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlmIHRoZSBzdWJzdHJpbmcKKyAqIGlzIG5vdCBmb3VuZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBsb29raW5nCisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0b3AgbG9va2luZworICogQHBhcmFtIHN1YnN0ciB0aGUgc3Vic3RyaW5nCisgKiBAcGFyYW0gZm91bmQgcmV0dXJuIGxvY2F0aW9uIGZvciB3aGVyZSBpdCB3YXMgZm91bmQsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfdG8gKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKwkJICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisJCSAgICAgIGludCAgICAgICAgICAgICAgIGVuZCwKKwkJICAgICAgY29uc3QgY2hhciAgICAgICAqc3Vic3RyLAorCQkgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN1YnN0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN1YnN0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBlbmQpOworCisgIC8qIHdlIGFsd2F5cyAiZmluZCIgYW4gZW1wdHkgc3RyaW5nICovCisgIGlmICgqc3Vic3RyID09ICdcMCcpCisgICAgeworICAgICAgaWYgKGZvdW5kKQorICAgICAgICAqZm91bmQgPSBzdGFydDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpID0gc3RhcnQ7CisgIHdoaWxlIChpIDwgZW5kKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5zdHJbaV0gPT0gc3Vic3RyWzBdKQorICAgICAgICB7CisgICAgICAgICAgaW50IGogPSBpICsgMTsKKyAgICAgICAgICAKKyAgICAgICAgICB3aGlsZSAoaiA8IGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHN1YnN0cltqIC0gaV0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZWxzZSBpZiAocmVhbC0+c3RyW2pdICE9IHN1YnN0cltqIC0gaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc3Vic3RyW2ogLSBpXSA9PSAnXDAnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAgICAgKmZvdW5kID0gaTsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgKmZvdW5kID0gZW5kOworICAKKyAgcmV0dXJuIEZBTFNFOyAgCit9CisKKy8qKgorICogRmluZHMgYSBibGFuayAoc3BhY2Ugb3IgdGFiKSBpbiB0aGUgc3RyaW5nLiBSZXR1cm5zICNUUlVFCisgKiBpZiBmb3VuZCwgI0ZBTFNFIG90aGVyd2lzZS4gSWYgYSBibGFuayBpcyBub3QgZm91bmQgc2V0cworICogKmZvdW5kIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBieXRlIGluZGV4IHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBmb3VuZCBwbGFjZSB0byBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGJsYW5rCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIGJsYW5rIHdhcyBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIAorICBpID0gc3RhcnQ7CisgIHdoaWxlIChpIDwgcmVhbC0+bGVuKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5zdHJbaV0gPT0gJyAnIHx8CisgICAgICAgICAgcmVhbC0+c3RyW2ldID09ICdcdCcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKGZvdW5kKQorICAgICpmb3VuZCA9IHJlYWwtPmxlbjsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTa2lwcyBibGFua3MgZnJvbSBzdGFydCwgc3RvcmluZyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGluICplbmQKKyAqIChibGFuayBpcyBzcGFjZSBvciB0YWIpLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0CisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0b3JlIHRoZSBmaXJzdCBub24tYmxhbmsgYnl0ZSBpbmRleAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmVuZCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIAorICBpID0gc3RhcnQ7CisgIHdoaWxlIChpIDwgcmVhbC0+bGVuKQorICAgIHsKKyAgICAgIGlmICghREJVU19JU19BU0NJSV9CTEFOSyAocmVhbC0+c3RyW2ldKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpID09IHJlYWwtPmxlbiB8fCAhREJVU19JU19BU0NJSV9XSElURSAocmVhbC0+c3RyW2ldKSk7CisgIAorICBpZiAoZW5kKQorICAgICplbmQgPSBpOworfQorCisKKy8qKgorICogU2tpcHMgd2hpdGVzcGFjZSBmcm9tIHN0YXJ0LCBzdG9yaW5nIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBpbiAqZW5kLgorICogKHdoaXRlc3BhY2UgaXMgc3BhY2UsIHRhYiwgbmV3bGluZSwgQ1IpLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0CisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0b3JlIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBieXRlIGluZGV4CisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19za2lwX3doaXRlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKCFEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaV0pKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGkgPT0gcmVhbC0+bGVuIHx8ICEoREJVU19JU19BU0NJSV9XSElURSAocmVhbC0+c3RyW2ldKSkpOworICAKKyAgaWYgKGVuZCkKKyAgICAqZW5kID0gaTsKK30KKworLyoqCisgKiBTa2lwcyB3aGl0ZXNwYWNlIGZyb20gZW5kLCBzdG9yaW5nIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdHJhaWxpbmcKKyAqIHdoaXRlc3BhY2UgaW4gKnN0YXJ0LiAod2hpdGVzcGFjZSBpcyBzcGFjZSwgdGFiLCBuZXdsaW5lLCBDUikuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gZW5kIHdoZXJlIHRvIHN0YXJ0IHNjYW5uaW5nIGJhY2t3YXJkCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RvcmUgdGhlIHN0YXJ0IG9mIHdoaXRlc3BhY2UgY2hhcnMKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3NraXBfd2hpdGVfcmV2ZXJzZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqc3RhcnQpCit7CisgIGludCBpOworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPj0gMCk7CisgIAorICBpID0gZW5kOworICB3aGlsZSAoaSA+IDApCisgICAgeworICAgICAgaWYgKCFEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaS0xXSkpCisgICAgICAgIGJyZWFrOworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGkgPj0gMCAmJiAoaSA9PSAwIHx8ICEoREJVU19JU19BU0NJSV9XSElURSAocmVhbC0+c3RyW2ktMV0pKSkpOworICAKKyAgaWYgKHN0YXJ0KQorICAgICpzdGFydCA9IGk7Cit9CisKKy8qKgorICogQXNzaWducyBhIG5ld2xpbmUtdGVybWluYXRlZCBvciBcXHJcXG4tdGVybWluYXRlZCBsaW5lIGZyb20gdGhlIGZyb250CisgKiBvZiB0aGUgc3RyaW5nIHRvIHRoZSBnaXZlbiBkZXN0IHN0cmluZy4gVGhlIGRlc3Qgc3RyaW5nJ3MgcHJldmlvdXMKKyAqIGNvbnRlbnRzIGFyZSBkZWxldGVkLiBJZiB0aGUgc291cmNlIHN0cmluZyBjb250YWlucyBubyBuZXdsaW5lLAorICogbW92ZXMgdGhlIGVudGlyZSBzb3VyY2Ugc3RyaW5nIHRvIHRoZSBkZXN0IHN0cmluZy4KKyAqCisgKiBAdG9kbyBvd2VuIGNvcnJlY3RseSBub3RlcyB0aGF0IHRoaXMgaXMgYSBzdHVwaWQgZnVuY3Rpb24gKGl0IHdhcworICogd3JpdHRlbiBwdXJlbHkgZm9yIHRlc3QgY29kZSwKKyAqIGUuZy4gZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYykuIFByb2JhYmx5IHNob3VsZCBiZSBlbmZvcmNlZCBhcyB0ZXN0CisgKiBjb2RlIG9ubHkgd2l0aCBpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgKiAKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgKGNvbnRlbnRzIGFyZSByZXBsYWNlZCkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnksIG9yIHNvdXJjZSBoYXMgbGVuZ3RoIDAKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19wb3BfbGluZSAoREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpkZXN0KQoreworICBpbnQgZW9sLCBlb2xfbGVuOworICAKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRlc3QsIDApOworICAKKyAgZW9sID0gMDsKKyAgZW9sX2xlbiA9IDA7CisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sIChzb3VyY2UsIDAsICZlb2wsICZlb2xfbGVuKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGVvbCA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKSk7CisgICAgICBpZiAoZW9sID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGVyZSdzIG5vIG5ld2xpbmUgYW5kIHNvdXJjZSBoYXMgemVybyBsZW5ndGgsIHdlJ3JlIGRvbmUgKi8KKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIC8qIG90aGVyd2lzZSwgdGhlIGxhc3QgbGluZSBvZiB0aGUgZmlsZSBoYXMgbm8gZW9sIGNoYXJhY3RlcnMgKi8KKyAgICB9CisKKyAgLyogcmVtZW1iZXIgZW9sIGNhbiBiZSAwIGlmIGl0J3MgYW4gZW1wdHkgbGluZSwgYnV0IGVvbF9sZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFsc28KKyAgICogc2luY2UgZmluZF9lb2wgcmV0dXJuZWQgVFJVRQorICAgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmVfbGVuIChzb3VyY2UsIDAsIGVvbCArIGVvbF9sZW4sIGRlc3QsIDApKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIC8qIHJlbW92ZSBsaW5lIGVuZGluZyAqLworICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkZXN0LCBlb2wpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkgd2hlbiBzaG9ydGVuaW5nIGEgc3RyaW5nIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyoqCisgKiBEZWxldGVzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGZpcnN0IGJsYW5rIHNwYWNlCisgKiBpbiB0aGUgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCit2b2lkCitfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgaW50IGk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKHN0ciwgMCwgJmkpKQorICAgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsIGksICZpKTsKKworICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIDAsIGkpOworfQorI2VuZGlmCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIERlbGV0ZXMgYW55IGxlYWRpbmcgYmxhbmtzIGluIHRoZSBzdHJpbmcKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKyAgCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChzdHIsIDAsICZpKTsKKworICBpZiAoaSA+IDApCisgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoc3RyLCAwLCBpKTsKK30KKyNlbmRpZgorCisvKioKKyAqIERlbGV0ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2Nob3Bfd2hpdGUoREJ1c1N0cmluZyAqc3RyKQoreworICBpbnQgaTsKKyAgCisgIF9kYnVzX3N0cmluZ19za2lwX3doaXRlIChzdHIsIDAsICZpKTsKKworICBpZiAoaSA+IDApCisgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoc3RyLCAwLCBpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19za2lwX3doaXRlX3JldmVyc2UgKHN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0ciksICZpKTsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBpKTsKK30KKworLyoqCisgKiBUZXN0cyB0d28gREJ1c1N0cmluZyBmb3IgZXF1YWxpdHkuCisgKgorICogQHRvZG8gbWVtY21wIGlzIHByb2JhYmx5IGZhc3RlcgorICoKKyAqIEBwYXJhbSBhIGZpcnN0IHN0cmluZworICogQHBhcmFtIGIgc2Vjb25kIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgZXF1YWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbCAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYSA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGE7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2IgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBiOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2IpOworCisgIGlmIChyZWFsX2EtPmxlbiAhPSByZWFsX2ItPmxlbikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYXAgPSByZWFsX2EtPnN0cjsKKyAgYnAgPSByZWFsX2ItPnN0cjsKKyAgYV9lbmQgPSByZWFsX2EtPnN0ciArIHJlYWxfYS0+bGVuOworICB3aGlsZSAoYXAgIT0gYV9lbmQpCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFRlc3RzIHR3byBEQnVzU3RyaW5nIGZvciBlcXVhbGl0eSB1cCB0byB0aGUgZ2l2ZW4gbGVuZ3RoLgorICogVGhlIHN0cmluZ3MgbWF5IGJlIHNob3J0ZXIgdGhhbiB0aGUgZ2l2ZW4gbGVuZ3RoLgorICoKKyAqIEB0b2RvIHdyaXRlIGEgdW5pdCB0ZXN0CisgKgorICogQHRvZG8gbWVtY21wIGlzIHByb2JhYmx5IGZhc3RlcgorICoKKyAqIEBwYXJhbSBhIGZpcnN0IHN0cmluZworICogQHBhcmFtIGIgc2Vjb25kIHN0cmluZworICogQHBhcmFtIGxlbiB0aGUgbWF4aW11bSBsZW5ndGggdG8gbG9vayBhdAorICogQHJldHVybnMgI1RSVUUgaWYgZXF1YWwgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbF9sZW4gKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYiA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGI7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYik7CisKKyAgaWYgKHJlYWxfYS0+bGVuICE9IHJlYWxfYi0+bGVuICYmCisgICAgICAocmVhbF9hLT5sZW4gPCBsZW4gfHwgcmVhbF9iLT5sZW4gPCBsZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBhcCA9IHJlYWxfYS0+c3RyOworICBicCA9IHJlYWxfYi0+c3RyOworICBhX2VuZCA9IHJlYWxfYS0+c3RyICsgTUlOIChyZWFsX2EtPmxlbiwgbGVuKTsKKyAgd2hpbGUgKGFwICE9IGFfZW5kKQorICAgIHsKKyAgICAgIGlmICgqYXAgIT0gKmJwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICsrYXA7CisgICAgICArK2JwOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBUZXN0cyB0d28gc3ViLXBhcnRzIG9mIHR3byBEQnVzU3RyaW5nIGZvciBlcXVhbGl0eS4gIFRoZSBzcGVjaWZpZWQKKyAqIHJhbmdlIG9mIHRoZSBmaXJzdCBzdHJpbmcgbXVzdCBleGlzdDsgdGhlIHNwZWNpZmllZCBzdGFydCBwb3NpdGlvbgorICogb2YgdGhlIHNlY29uZCBzdHJpbmcgbXVzdCBleGlzdC4KKyAqCisgKiBAdG9kbyB3cml0ZSBhIHVuaXQgdGVzdAorICoKKyAqIEB0b2RvIG1lbWNtcCBpcyBwcm9iYWJseSBmYXN0ZXIKKyAqCisgKiBAcGFyYW0gYSBmaXJzdCBzdHJpbmcKKyAqIEBwYXJhbSBhX3N0YXJ0IHdoZXJlIHRvIHN0YXJ0IHN1YnN0cmluZyBpbiBmaXJzdCBzdHJpbmcKKyAqIEBwYXJhbSBhX2xlbiBsZW5ndGggb2Ygc3Vic3RyaW5nIGluIGZpcnN0IHN0cmluZworICogQHBhcmFtIGIgc2Vjb25kIHN0cmluZworICogQHBhcmFtIGJfc3RhcnQgd2hlcmUgdG8gc3RhcnQgc3Vic3RyaW5nIGluIHNlY29uZCBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB0d28gc3Vic3RyaW5ncyBhcmUgZXF1YWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGFfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBiX3N0YXJ0KQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYiA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGI7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYik7CisgIF9kYnVzX2Fzc2VydCAoYV9zdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChhX2xlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChhX3N0YXJ0IDw9IHJlYWxfYS0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChhX2xlbiA8PSByZWFsX2EtPmxlbiAtIGFfc3RhcnQpOworICBfZGJ1c19hc3NlcnQgKGJfc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoYl9zdGFydCA8PSByZWFsX2ItPmxlbik7CisgIAorICBpZiAoYV9sZW4gPiByZWFsX2ItPmxlbiAtIGJfc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGFwID0gcmVhbF9hLT5zdHIgKyBhX3N0YXJ0OworICBicCA9IHJlYWxfYi0+c3RyICsgYl9zdGFydDsKKyAgYV9lbmQgPSBhcCArIGFfbGVuOworICB3aGlsZSAoYXAgIT0gYV9lbmQpCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYnAgPD0gKHJlYWxfYi0+c3RyICsgcmVhbF9iLT5sZW4pKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgc3RyaW5nIGlzIGVxdWFsIHRvIGEgQyBzdHJpbmcuCisgKgorICogQHBhcmFtIGEgdGhlIHN0cmluZworICogQHBhcmFtIGNfc3RyIHRoZSBDIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgZXF1YWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqY19zdHIpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYV9lbmQ7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBfZGJ1c19hc3NlcnQgKGNfc3RyICE9IE5VTEwpOworICAKKyAgYXAgPSByZWFsX2EtPnN0cjsKKyAgYnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIGNfc3RyOworICBhX2VuZCA9IHJlYWxfYS0+c3RyICsgcmVhbF9hLT5sZW47CisgIHdoaWxlIChhcCAhPSBhX2VuZCAmJiAqYnApCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIGlmIChhcCAhPSBhX2VuZCB8fCAqYnApCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBDIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gYSB0aGUgc3RyaW5nCisgKiBAcGFyYW0gY19zdHIgdGhlIEMgc3RyaW5nCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzdHJpbmcgc3RhcnRzIHdpdGggaXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqY19zdHIpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYV9lbmQ7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBfZGJ1c19hc3NlcnQgKGNfc3RyICE9IE5VTEwpOworICAKKyAgYXAgPSByZWFsX2EtPnN0cjsKKyAgYnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIGNfc3RyOworICBhX2VuZCA9IHJlYWxfYS0+c3RyICsgcmVhbF9hLT5sZW47CisgIHdoaWxlIChhcCAhPSBhX2VuZCAmJiAqYnApCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIGlmICgqYnAgPT0gJ1wwJykKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qKgorICogQXBwZW5kcyBhIHR3by1jaGFyYWN0ZXIgaGV4IGRpZ2l0IHRvIGEgc3RyaW5nLCB3aGVyZSB0aGUgaGV4IGRpZ2l0CisgKiBoYXMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBieXRlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXggKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGJ5dGUpCit7CisgIGNvbnN0IGNoYXIgaGV4ZGlnaXRzWzE2XSA9IHsKKyAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJworICB9OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhkaWdpdHNbKGJ5dGUgPj4gNCldKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZGlnaXRzWyhieXRlICYgMHgwZildKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gMSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEVuY29kZXMgYSBzdHJpbmcgaW4gaGV4LCB0aGUgd2F5IE1ENSBhbmQgU0hBLTEgYXJlIHVzdWFsbHkKKyAqIGVuY29kZWQuIChFYWNoIGJ5dGUgaXMgdHdvIGhleCBkaWdpdHMuKQorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyB0byBlbmNvZGUKKyAqIEBwYXJhbSBzdGFydCBieXRlIGluZGV4IHRvIHN0YXJ0IGVuY29kaW5nCisgKiBAcGFyYW0gZGVzdCBzdHJpbmcgd2hlcmUgZW5jb2RlZCBkYXRhIHNob3VsZCBiZSBwbGFjZWQKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gcGxhY2UgZW5jb2RlZCBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlbmNvZGluZyB3YXMgc3VjY2Vzc2Z1bCwgI0ZBTFNFIGlmIG5vIG1lbW9yeSBldGMuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoY29uc3QgREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzb3VyY2UpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVzdWx0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKTsKKyAgcCArPSBzdGFydDsKKyAgCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXggKCZyZXN1bHQsICpwKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAKKyAgICAgICsrcDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnJlc3VsdCwgMCwgZGVzdCwgaW5zZXJ0X2F0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIGhleCBlbmNvZGluZy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzdHJpbmcgdG8gZGVjb2RlCisgKiBAcGFyYW0gc3RhcnQgYnl0ZSBpbmRleCB0byBzdGFydCBkZWNvZGUKKyAqIEBwYXJhbSBlbmRfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBoZXggZGF0YSwgb3IgI05VTEwKKyAqIEBwYXJhbSBkZXN0IHN0cmluZyB3aGVyZSBkZWNvZGVkIGRhdGEgc2hvdWxkIGJlIHBsYWNlZAorICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBwbGFjZSBkZWNvZGVkIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIGRlY29kaW5nIHdhcyBzdWNjZXNzZnVsLCAjRkFMU0UgaWYgbm8gbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKwkJCSBpbnQgICAgICAgICAgICAgICplbmRfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQnVzU3RyaW5nIHJlc3VsdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfYm9vbF90IGhpZ2hfYml0czsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNvdXJjZSkpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBoaWdoX2JpdHMgPSBUUlVFOworICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKTsKKyAgcCArPSBzdGFydDsKKyAgCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgdmFsOworCisgICAgICBzd2l0Y2ggKCpwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgIHZhbCA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgIHZhbCA9IDM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgIHZhbCA9IDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgIHZhbCA9IDU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgIHZhbCA9IDY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgIHZhbCA9IDc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgIHZhbCA9IDg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgIHZhbCA9IDk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICB2YWwgPSAxMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgIHZhbCA9IDExOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgdmFsID0gMTI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICB2YWwgPSAxMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZSc6CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgIHZhbCA9IDE0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgdmFsID0gMTU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgIGlmIChoaWdoX2JpdHMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIDw8IDQpKQorCSAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgICAgICAgICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnJlc3VsdCk7CisgICAgICAgICAgCisgICAgICAgICAgYiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnJlc3VsdCwgbGVuIC0gMSk7CisKKyAgICAgICAgICBiIHw9IHZhbDsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoJnJlc3VsdCwgbGVuIC0gMSwgYik7CisgICAgICAgIH0KKworICAgICAgaGlnaF9iaXRzID0gIWhpZ2hfYml0czsKKworICAgICAgKytwOworICAgIH0KKworIGRvbmU6CisgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZyZXN1bHQsIDAsIGRlc3QsIGluc2VydF9hdCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBwIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNvdXJjZSk7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlc3VsdCk7ICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyB2YWxpZCBBU0NJSSB3aXRoIG5vCisgKiBudWwgYnl0ZXMuIElmIHRoZSBnaXZlbiByYW5nZSBpcyBub3QgZW50aXJlbHkgY29udGFpbmVkIGluIHRoZQorICogc3RyaW5nLCByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGFsbCB2YWxpZCBBU0NJSQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIAorICBpZiAobGVuID4gcmVhbC0+bGVuIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghX0RCVVNfSVNBU0NJSSAoKnMpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAKKyAgICAgICsrczsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyB0byBsb3dlciBjYXNlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY29udmVydAorICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgdW5zaWduZWQgY2hhciAqczsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIHMgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID49ICdBJyAmJiAqcyA8PSAnWicpCisgICAgICAgICAgKnMgKz0gJ2EnIC0gJ0EnOworICAgICAgKytzOworICAgIH0KK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyB0byB1cHBlciBjYXNlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY29udmVydAorICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydAorICovCit2b2lkCitfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgdW5zaWduZWQgY2hhciAqczsKKyAgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworCisgIHMgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID49ICdhJyAmJiAqcyA8PSAneicpCisgICAgICAgICAgKnMgKz0gJ0EnIC0gJ2EnOworICAgICAgKytzOworICAgIH0KK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyB2YWxpZCBVVEYtOC4gSWYgdGhlCisgKiBnaXZlbiByYW5nZSBpcyBub3QgZW50aXJlbHkgY29udGFpbmVkIGluIHRoZSBzdHJpbmcsIHJldHVybnMKKyAqICNGQUxTRS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkgbnVsIGJ5dGVzIGluIHRoZSBnaXZlbiByYW5nZSwKKyAqIHJldHVybnMgI0ZBTFNFLiBJZiB0aGUgc3RhcnQgYW5kIHN0YXJ0K2xlbiBhcmUgbm90IG9uIGNoYXJhY3RlcgorICogYm91bmRhcmllcywgcmV0dXJucyAjRkFMU0UuCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhbGwgdmFsaWQgVVRGLTgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworCisgIC8qIHdlIGFyZSBkb2luZyBfREJVU19VTkxJS0VMWSgpIGhlcmUgd2hpY2ggbWlnaHQgYmUKKyAgICogZHViaW91cyBpbiBhIGdlbmVyaWMgbGlicmFyeSBsaWtlIEdMaWIsIGJ1dCBpbiBELUJ1cworICAgKiB3ZSBrbm93IHdlJ3JlIHZhbGlkYXRpbmcgbWVzc2FnZXMgYW5kIHRoYXQgaXQgd291bGQKKyAgICogb25seSBiZSBldmlsL2Jyb2tlbiBhcHBzIHRoYXQgd291bGQgaGF2ZSBpbnZhbGlkCisgICAqIFVURi04LiBBbHNvLCB0aGlzIGZ1bmN0aW9uIHNlZW1zIHRvIGJlIGEgcGVyZm9ybWFuY2UKKyAgICogYm90dGxlbmVjayBpbiBwcm9maWxlcy4KKyAgICovCisgIAorICBpZiAoX0RCVVNfVU5MSUtFTFkgKGxlbiA+IHJlYWwtPmxlbiAtIHN0YXJ0KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBwID0gcmVhbC0+c3RyICsgc3RhcnQ7CisgIGVuZCA9IHAgKyBsZW47CisgIAorICB3aGlsZSAocCA8IGVuZCkKKyAgICB7CisgICAgICBpbnQgaSwgbWFzaywgY2hhcl9sZW47CisgICAgICBkYnVzX3VuaWNoYXJfdCByZXN1bHQ7CisKKyAgICAgIC8qIG51bCBieXRlcyBjb25zaWRlcmVkIGludmFsaWQgKi8KKyAgICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgLyogU3BlY2lhbC1jYXNlIEFTQ0lJOyB0aGlzIG1ha2VzIHVzIGdvIGEgbG90IGZhc3RlciBpbgorICAgICAgICogRC1CdXMgcHJvZmlsZXMgd2hlcmUgd2UgYXJlIHR5cGljYWxseSB2YWxpZGF0aW5nCisgICAgICAgKiBmdW5jdGlvbiBuYW1lcyBhbmQgc3VjaC4gV2UgaGF2ZSB0byBrbm93IHRoYXQKKyAgICAgICAqIGFsbCBmb2xsb3dpbmcgY2hlY2tzIHdpbGwgcGFzcyBmb3IgQVNDSUkgdGhvdWdoLAorICAgICAgICogY29tbWVudHMgZm9sbG93IC4uLgorICAgICAgICovICAgICAgCisgICAgICBpZiAoKnAgPCAxMjgpCisgICAgICAgIHsKKyAgICAgICAgICArK3A7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgVVRGOF9DT01QVVRFICgqcCwgbWFzaywgY2hhcl9sZW4pOworCisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKGNoYXJfbGVuID09IDApKSAgLyogQVNDSUk6IGNoYXJfbGVuID09IDEgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBieXRlcyBleGlzdHMgaW4gdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoKGVuZCAtIHApIDwgY2hhcl9sZW4pKSAvKiBBU0NJSTogcCA8IGVuZCBhbmQgY2hhcl9sZW4gPT0gMSAqLworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBVVEY4X0dFVCAocmVzdWx0LCBwLCBpLCBtYXNrLCBjaGFyX2xlbik7CisKKyAgICAgIC8qIENoZWNrIGZvciBvdmVybG9uZyBVVEYtOCAqLworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChVVEY4X0xFTkdUSCAocmVzdWx0KSAhPSBjaGFyX2xlbikpIC8qIEFTQ0lJOiBVVEY4X0xFTkdUSCA9PSAxICovCisgICAgICAgIGJyZWFrOworI2lmIDAKKyAgICAgIC8qIFRoZSBVTklDT0RFX1ZBTElEIGNoZWNrIGJlbG93IHdpbGwgY2F0Y2ggdGhpcyAqLworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChyZXN1bHQgPT0gKGRidXNfdW5pY2hhcl90KS0xKSkgLyogQVNDSUk6IHJlc3VsdCA9IGFzY2lpIHZhbHVlICovCisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoIVVOSUNPREVfVkFMSUQgKHJlc3VsdCkpKSAvKiBBU0NJSTogYWx3YXlzIHZhbGlkICovCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBVTklDT0RFX1ZBTElEIHNob3VsZCBoYXZlIGNhdWdodCBpdCAqLworICAgICAgX2RidXNfYXNzZXJ0IChyZXN1bHQgIT0gKGRidXNfdW5pY2hhcl90KS0xKTsKKyAgICAgIAorICAgICAgcCArPSBjaGFyX2xlbjsKKyAgICB9CisKKyAgLyogU2VlIHRoYXQgd2UgY292ZXJlZCB0aGUgZW50aXJlIGxlbmd0aCBpZiBhIGxlbmd0aCB3YXMKKyAgICogcGFzc2VkIGluCisgICAqLworICBpZiAoX0RCVVNfVU5MSUtFTFkgKHAgIT0gZW5kKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhbGwgbnVsIGJ5dGVzLiBJZiB0aGUKKyAqIGdpdmVuIHJhbmdlIGlzIG5vdCBlbnRpcmVseSBjb250YWluZWQgaW4gdGhlIHN0cmluZywgcmV0dXJucworICogI0ZBTFNFLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqIAorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYWxsIG51bCBieXRlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIAorICBpZiAobGVuID4gcmVhbC0+bGVuIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgqcyAhPSAnXDAnKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgKytzOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENsZWFycyBhbGwgYWxsb2NhdGVkIGJ5dGVzIGluIHRoZSBzdHJpbmcgdG8gemVyby4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3plcm8gKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgbWVtc2V0IChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQsICdcMCcsIHJlYWwtPmFsbG9jYXRlZCk7Cit9CisvKiogQH0gKi8KKworLyogdGVzdHMgYXJlIGluIGRidXMtc3RyaW5nLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN0cmluZy5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWVkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3RyaW5nLmgKQEAgLTAsMCArMSwzMzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zdHJpbmcuaCBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1RSSU5HX0gKKyNkZWZpbmUgREJVU19TVFJJTkdfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogREJ1c1N0cmluZyBvYmplY3QKKyAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzU3RyaW5nIERCdXNTdHJpbmc7CisKK3N0cnVjdCBEQnVzU3RyaW5nCit7CisjaWYgZGVmaW5lZChEQlVTX1dJTikgJiYgZGVmaW5lZChfREVCVUcpCisgIGNvbnN0IGNoYXIgKmR1bW15MTsgLyoqPCBwbGFjZWhvbGRlciAqLworI2Vsc2UKKyAgY29uc3Qgdm9pZCAqZHVtbXkxOyAvKio8IHBsYWNlaG9sZGVyICovCisjZW5kaWYKKyAgaW50ICAgZHVtbXkyOyAgICAgICAvKio8IHBsYWNlaG9sZGVyICovCisgIGludCAgIGR1bW15MzsgICAgICAgLyoqPCBwbGFjZWhvbGRlciAqLworICBpbnQgICBkdW1teTQ7ICAgICAgIC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NSA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NiA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15NyA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15OCA6IDM7IC8qKjwgcGxhY2Vob2xkZXIgKi8KK307CisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisvKiBTb21lIHNpbXBsZSBpbmxpbmluZyBoYWNrczsgdGhlIGN1cnJlbnQgbGlua2VyIGlzIG5vdCBzbWFydCBlbm91Z2gKKyAqIHRvIGlubGluZSBub24tZXhwb3J0ZWQgc3ltYm9scyBhY3Jvc3MgZmlsZXMgaW4gdGhlIGxpYnJhcnkuCisgKiBOb3RlIHRoYXQgdGhlc2UgYnJlYWsgdHlwZSBzYWZldHkgKGR1ZSB0byB0aGUgY2FzdHMpCisgKi8KKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9kYXRhKHMpICgoY2hhciopKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkxKSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgocykgKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkyKQorI2RlZmluZSBfZGJ1c19zdHJpbmdfc2V0X2J5dGUocywgaSwgYikgKCgoKHVuc2lnbmVkIGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpWyhpKV0pID0gKHVuc2lnbmVkIGNoYXIpIChiKSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9ieXRlKHMsIGkpICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpWyhpKV0pCisjZGVmaW5lIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShzKSAoKGNvbnN0IGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpCisjZGVmaW5lIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4ocyxzdGFydCxsZW4pICgoKGNvbnN0IGNoYXIqKSgoKERCdXNTdHJpbmcqKShzKSktPmR1bW15MSkpICsgKHN0YXJ0KSkKKyNlbmRpZgorCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbml0ICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxsb2NhdGVfc2l6ZSk7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfbG9jayAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2NvbXBhY3QgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIG1heF93YXN0ZSk7CisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfZGF0YQorY2hhciogICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhCitjb25zdCBjaGFyKiAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIpOworI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAqLworY2hhciogICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuCitjb25zdCBjaGFyKiAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CisjZW5kaWYKKyNpZm5kZWYgX2RidXNfc3RyaW5nX3NldF9ieXRlCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSk7CisjZW5kaWYKKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9ieXRlCit1bnNpZ25lZCBjaGFyIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCk7CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9ieXRlICovCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpLAorCQkJCQkJICBpbnQgICAgICAgICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YV9sZW4gICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGEgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGFfbGVuICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKmJ1ZmZlciwKKwkJCQkJCSAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhdmFpbF9sZW4pOworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aAoraW50ICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyKTsKKyNlbmRpZiAvKiAhX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKi8KKworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9sZW5ndGgpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuZ3RoX3RvX3JlbW92ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW5ndGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxpZ25tZW50KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZCAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmJ1ZmZlcik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgdmFsdWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgdmFsdWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2RvdWJsZSAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgICAgICAgdmFsdWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfdW5pY2hhciAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdW5pY2hhcl90ICAgICBjaCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfNF9hbGlnbmVkICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzRdKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF84X2FsaWduZWQgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbOF0pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgyLCAzKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgICAgICAgIGFyZ3MpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0XzJfYWxpZ25lZCAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG9jdGV0c1syXSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfNF9hbGlnbmVkICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzRdKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2luc2VydF84X2FsaWduZWQgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbOF0pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxpZ25tZW50KTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX21vdmUgICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5ICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfbW92ZV9sZW4gICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2NvcHlfbGVuICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICByZXBsYWNlX2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgcmVwbGFjZV9sZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3BsaXRfb25fYnl0ZSAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKnRhaWwpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X3VuaWNoYXIgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdW5pY2hhcl90ICAgICpjaF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmRfcmV0dXJuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3BhcnNlX2ludCAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAqdmFsdWVfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZW5kX3JldHVybik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19wYXJzZV91aW50ICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgKnZhbHVlX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmVuZF9yZXR1cm4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfcGFyc2VfZG91YmxlICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmVuZF9yZXR1cm4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZmluZCAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpzdWJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmb3VuZCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19maW5kX2VvbCAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmb3VuZF9sZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZmluZF90byAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpzdWJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmb3VuZCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmb3VuZCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZW5kKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX3NraXBfd2hpdGUgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZW5kKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX3NraXBfd2hpdGVfcmV2ZXJzZSAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnN0YXJ0KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2VxdWFsICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpiKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpjX3N0cik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19lcXVhbF9sZW4gICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJfc3RhcnQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmNfc3RyKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpjX3N0cik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19wb3BfbGluZSAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0KTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7Cit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfbGVhZGluZ19ibGFua3MgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsgCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXggICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19oZXhfZGVjb2RlICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKwkJCQkJCSAgaW50ICAgICAgICAgICAgICAgKmVuZF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX3RvbG93ZXJfYXNjaWkgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX3RvdXBwZXJfYXNjaWkgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3ZhbGlkYXRlX251bCAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX3plcm8gICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7CisKKworLyoqCisgKiBXZSBhbGxvY2F0ZSAxIGJ5dGUgZm9yIG51bCB0ZXJtaW5hdGlvbiwgcGx1cyA3IGJ5dGVzIGZvciBwb3NzaWJsZQorICogYWxpZ25fb2Zmc2V0LCBzbyB3ZSBhbHdheXMgbmVlZCA4IGJ5dGVzIG9uIHRvcCBvZiB0aGUgc3RyaW5nJ3MKKyAqIGxlbmd0aCB0byBiZSBpbiB0aGUgYWxsb2NhdGVkIGJsb2NrLgorICovCisjZGVmaW5lIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcgOAorCisvKioKKyAqIERlZmluZXMgYSBzdGF0aWMgY29uc3QgdmFyaWFibGUgd2l0aCB0eXBlICNEQnVzU3RyaW5nIGNhbGxlZCAibmFtZSIKKyAqIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHN0cmluZyBsaXRlcmFsLgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZQorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHZhbHVlCisgKi8KKyNkZWZpbmUgX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMobmFtZSwgc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGNvbnN0IGNoYXIgX2RidXNfc3RhdGljX3N0cmluZ18jI25hbWVbXSA9IHN0cjsgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGNvbnN0IERCdXNTdHJpbmcgbmFtZSA9IHsgX2RidXNfc3RhdGljX3N0cmluZ18jI25hbWUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9kYnVzX3N0YXRpY19zdHJpbmdfIyNuYW1lKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9kYnVzX3N0YXRpY19zdHJpbmdfIyNuYW1lKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9kYnVzX3N0YXRpY19zdHJpbmdfIyNuYW1lKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgVFJVRSwgRkFMU0UsIDAgfQorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzM3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMKQEAgLTAsMCArMSwzNjQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyBJbXBsZW1lbnRzIHRocmVhZHMgdXNpbmcgcHRocmVhZHMgKGludGVybmFsIHRvIGxpYmRidXMpCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy8qIFdoZXRoZXIgd2UgaGF2ZSBhICJtb25vdG9uaWMiIGNsb2NrOyBpLmUuIGEgY2xvY2sgbm90IGFmZmVjdGVkIGJ5CisgKiBjaGFuZ2VzIGluIHN5c3RlbSB0aW1lLgorICogVGhpcyBpcyBpbml0aWFsaXplZCBvbmNlIGluIGNoZWNrX21vbm90b25pY19jbG9jayBiZWxvdy4KKyAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MTIxCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYXZlX21vbm90b25pY19jbG9jayA9IDA7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgcHRocmVhZF9tdXRleF90IGxvY2s7IC8qKjwgbG9jayBwcm90ZWN0aW5nIGNvdW50IGZpZWxkICovCisgIHZvbGF0aWxlIGludCBjb3VudDsgICAvKio8IGNvdW50IG9mIGhvdyBtYW55IHRpbWVzIGxvY2sgaG9sZGVyIGhhcyByZWN1cnNpdmVseSBsb2NrZWQgKi8KKyAgdm9sYXRpbGUgcHRocmVhZF90IGhvbGRlcjsgLyoqPCBob2xkZXIgb2YgdGhlIGxvY2sgaWYgY291bnQgPjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGJ1dCBhcmJpdHJhcnkgdGhyZWFkIGlmIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBldmVyIGJlZW4gPjAsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvdW50IGhhcyBuZXZlciBiZWVuID4wICovCit9IERCdXNNdXRleFBUaHJlYWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgcHRocmVhZF9jb25kX3QgY29uZDsgLyoqPCB0aGUgY29uZGl0aW9uICovCit9IERCdXNDb25kVmFyUFRocmVhZDsKKworI2RlZmluZSBEQlVTX01VVEVYKG0pICAgICAgICAgKChEQnVzTXV0ZXgqKSBtKQorI2RlZmluZSBEQlVTX01VVEVYX1BUSFJFQUQobSkgKChEQnVzTXV0ZXhQVGhyZWFkKikgbSkKKworI2RlZmluZSBEQlVTX0NPTkRfVkFSKGMpICAgICAgICAgKChEQnVzQ29uZFZhciopIGMpCisjZGVmaW5lIERCVVNfQ09ORF9WQVJfUFRIUkVBRChjKSAoKERCdXNDb25kVmFyUFRocmVhZCopIGMpCisKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKy8qICh0bXAgIT0gMCkgaXMgYSBuby1vcCB1c2FnZSB0byBzaWxlbmNlIGNvbXBpbGVyICovCisjZGVmaW5lIFBUSFJFQURfQ0hFQ0soZnVuY19uYW1lLCByZXN1bHRfb3JfY2FsbCkgICAgXAorICAgIGRvIHsgaW50IHRtcCA9IChyZXN1bHRfb3JfY2FsbCk7IGlmICh0bXAgIT0gMCkgezt9IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBQVEhSRUFEX0NIRUNLKGZ1bmNfbmFtZSwgcmVzdWx0X29yX2NhbGwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0bXAgPSAocmVzdWx0X29yX2NhbGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh0bXAgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJwdGhyZWFkIGZ1bmN0aW9uICVzIGZhaWxlZCB3aXRoICVkICVzIGluICVzXG4iLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgdG1wLCBzdHJlcnJvcih0bXApLCBfREJVU19GVU5DVElPTl9OQU1FKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiAhREJVU19ESVNBQkxFX0FTU0VSVCAqLworCitzdGF0aWMgREJ1c011dGV4KgorX2RidXNfcHRocmVhZF9tdXRleF9uZXcgKHZvaWQpCit7CisgIERCdXNNdXRleFBUaHJlYWQgKnBtdXRleDsKKyAgaW50IHJlc3VsdDsKKyAgCisgIHBtdXRleCA9IGRidXNfbmV3IChEQnVzTXV0ZXhQVGhyZWFkLCAxKTsKKyAgaWYgKHBtdXRleCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfaW5pdCAoJnBtdXRleC0+bG9jaywgTlVMTCk7CisKKyAgaWYgKHJlc3VsdCA9PSBFTk9NRU0gfHwgcmVzdWx0ID09IEVBR0FJTikKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBtdXRleCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9pbml0IiwgcmVzdWx0KTsKKyAgICB9CisKKyAgLyogT25seSB3cml0dGVuICovCisgIHBtdXRleC0+Y291bnQgPSAwOworCisgIC8qIFRoZXJlJ3Mgbm8gcG9ydGFibGUgd2F5IHRvIGhhdmUgYSAibnVsbCIgcHRocmVhZCBhZmFpayBzbyB3ZQorICAgKiBjYW4ndCBzZXQgcG11dGV4LT5ob2xkZXIgdG8gYW55dGhpbmcgc2Vuc2libGUuICBXZSBvbmx5IGFjY2VzcyBpdAorICAgKiBvbmNlIHRoZSBsb2NrIGlzIGhlbGQgKHdoaWNoIG1lYW5zIHdlJ3ZlIHNldCBpdCkuCisgICAqLworICAKKyAgcmV0dXJuIERCVVNfTVVURVggKHBtdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19wdGhyZWFkX211dGV4X2ZyZWUgKERCdXNNdXRleCAqbXV0ZXgpCit7CisgIERCdXNNdXRleFBUaHJlYWQgKnBtdXRleCA9IERCVVNfTVVURVhfUFRIUkVBRCAobXV0ZXgpOworCisgIF9kYnVzX2Fzc2VydCAocG11dGV4LT5jb3VudCA9PSAwKTsKKyAgCisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZwbXV0ZXgtPmxvY2spKTsKKworICBkYnVzX2ZyZWUgKHBtdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19wdGhyZWFkX211dGV4X2xvY2sgKERCdXNNdXRleCAqbXV0ZXgpCit7CisgIERCdXNNdXRleFBUaHJlYWQgKnBtdXRleCA9IERCVVNfTVVURVhfUFRIUkVBRCAobXV0ZXgpOworICBwdGhyZWFkX3Qgc2VsZiA9IHB0aHJlYWRfc2VsZiAoKTsKKworICAvKiBJZiB0aGUgY291bnQgaXMgPiAwIHRoZW4gc29tZW9uZSBoYWQgdGhlIGxvY2ssIG1heWJlIHVzLiBJZiBpdCBpcworICAgKiAwLCB0aGVuIGl0IG1pZ2h0IGltbWVkaWF0ZWx5IGNoYW5nZSByaWdodCBhZnRlciB3ZSByZWFkIGl0LAorICAgKiBidXQgaXQgd2lsbCBiZSBjaGFuZ2VkIGJ5IGFub3RoZXIgdGhyZWFkOyBpLmUuIGlmIHdlIHJlYWQgMCwKKyAgICogd2UgYXNzdW1lIHRoYXQgdGhpcyB0aHJlYWQgZG9lc24ndCBoYXZlIHRoZSBsb2NrLgorICAgKgorICAgKiBOb3QgMTAwJSBzdXJlIHRoaXMgaXMgc2FmZSwgYnV0IC4uLiBzZWVtcyBsaWtlIGl0IHNob3VsZCBiZS4KKyAgICovCisgIGlmIChwbXV0ZXgtPmNvdW50ID09IDApCisgICAgeworICAgICAgLyogV2Uga25vdyB3ZSBkb24ndCBoYXZlIHRoZSBsb2NrOyBzb21lb25lIG1heSBoYXZlIHRoZSBsb2NrLiAqLworICAgICAgCisgICAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9sb2NrIiwgcHRocmVhZF9tdXRleF9sb2NrICgmcG11dGV4LT5sb2NrKSk7CisKKyAgICAgIC8qIFdlIG5vdyBoYXZlIHRoZSBsb2NrLiBDb3VudCBtdXN0IGJlIDAgc2luY2UgaXQgbXVzdCBiZSAwIHdoZW4KKyAgICAgICAqIHRoZSBsb2NrIGlzIHJlbGVhc2VkIGJ5IGFub3RoZXIgdGhyZWFkLCBhbmQgd2UganVzdCBub3cgZ290CisgICAgICAgKiB0aGUgbG9jay4KKyAgICAgICAqLworICAgICAgX2RidXNfYXNzZXJ0IChwbXV0ZXgtPmNvdW50ID09IDApOworICAgICAgCisgICAgICBwbXV0ZXgtPmhvbGRlciA9IHNlbGY7CisgICAgICBwbXV0ZXgtPmNvdW50ID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBrbm93IHNvbWVvbmUgaGFkIHRoZSBsb2NrLCBwb3NzaWJseSB1cy4gVGh1cworICAgICAgICogcG11dGV4LT5ob2xkZXIgaXMgbm90IHBvaW50aW5nIHRvIGp1bmssIHRob3VnaCBpdCBtYXkgbm90IGJlCisgICAgICAgKiB0aGUgbG9jayBob2xkZXIgYW55bW9yZSBpZiB0aGUgbG9jayBob2xkZXIgaXMgbm90IHVzLiAgSWYgdGhlCisgICAgICAgKiBsb2NrIGhvbGRlciBpcyB1cywgdGhlbiB3ZSBkZWZpbml0ZWx5IGhhdmUgdGhlIGxvY2suCisgICAgICAgKi8KKworICAgICAgaWYgKHB0aHJlYWRfZXF1YWwgKHBtdXRleC0+aG9sZGVyLCBzZWxmKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFdlIGFscmVhZHkgaGF2ZSB0aGUgbG9jay4gKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHBtdXRleC0+Y291bnQgPiAwKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogV2FpdCBmb3IgdGhlIGxvY2sgKi8KKyAgICAgICAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9sb2NrIiwgcHRocmVhZF9tdXRleF9sb2NrICgmcG11dGV4LT5sb2NrKSk7CisJICBwbXV0ZXgtPmhvbGRlciA9IHNlbGY7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChwbXV0ZXgtPmNvdW50ID09IDApOworICAgICAgICB9CisKKyAgICAgIHBtdXRleC0+Y291bnQgKz0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19wdGhyZWFkX211dGV4X3VubG9jayAoREJ1c011dGV4ICptdXRleCkKK3sKKyAgREJ1c011dGV4UFRocmVhZCAqcG11dGV4ID0gREJVU19NVVRFWF9QVEhSRUFEIChtdXRleCk7CisKKyAgX2RidXNfYXNzZXJ0IChwbXV0ZXgtPmNvdW50ID4gMCk7CisgIAorICBwbXV0ZXgtPmNvdW50IC09IDE7CisKKyAgaWYgKHBtdXRleC0+Y291bnQgPT0gMCkKKyAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF91bmxvY2siLCBwdGhyZWFkX211dGV4X3VubG9jayAoJnBtdXRleC0+bG9jaykpOworICAKKyAgLyogV2UgbGVhdmUgcG11dGV4LT5ob2xkZXIgc2V0IHRvIG91cnNlbHZlcywgaXRzIGNvbnRlbnQgaXMgdW5kZWZpbmVkIGlmIGNvdW50IGlzIDAgKi8KK30KKworc3RhdGljIERCdXNDb25kVmFyICoKK19kYnVzX3B0aHJlYWRfY29uZHZhcl9uZXcgKHZvaWQpCit7CisgIERCdXNDb25kVmFyUFRocmVhZCAqcGNvbmQ7CisgIHB0aHJlYWRfY29uZGF0dHJfdCBhdHRyOworICBpbnQgcmVzdWx0OworICAKKyAgcGNvbmQgPSBkYnVzX25ldyAoREJ1c0NvbmRWYXJQVGhyZWFkLCAxKTsKKyAgaWYgKHBjb25kID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcHRocmVhZF9jb25kYXR0cl9pbml0ICgmYXR0cik7CisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKyAgaWYgKGhhdmVfbW9ub3RvbmljX2Nsb2NrKQorICAgIHB0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sgKCZhdHRyLCBDTE9DS19NT05PVE9OSUMpOworI2VuZGlmCisKKyAgcmVzdWx0ID0gcHRocmVhZF9jb25kX2luaXQgKCZwY29uZC0+Y29uZCwgJmF0dHIpOworICBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kgKCZhdHRyKTsKKworICBpZiAocmVzdWx0ID09IEVBR0FJTiB8fCByZXN1bHQgPT0gRU5PTUVNKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocGNvbmQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF9pbml0IiwgcmVzdWx0KTsKKyAgICB9CisgIAorICByZXR1cm4gREJVU19DT05EX1ZBUiAocGNvbmQpOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfcHRocmVhZF9jb25kdmFyX2ZyZWUgKERCdXNDb25kVmFyICpjb25kKQoreyAgCisgIERCdXNDb25kVmFyUFRocmVhZCAqcGNvbmQgPSBEQlVTX0NPTkRfVkFSX1BUSFJFQUQgKGNvbmQpOworICAKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF9kZXN0cm95IiwgcHRocmVhZF9jb25kX2Rlc3Ryb3kgKCZwY29uZC0+Y29uZCkpOworCisgIGRidXNfZnJlZSAocGNvbmQpOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfcHRocmVhZF9jb25kdmFyX3dhaXQgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICptdXRleCkKK3sKKyAgREJ1c011dGV4UFRocmVhZCAqcG11dGV4ID0gREJVU19NVVRFWF9QVEhSRUFEIChtdXRleCk7CisgIERCdXNDb25kVmFyUFRocmVhZCAqcGNvbmQgPSBEQlVTX0NPTkRfVkFSX1BUSFJFQUQgKGNvbmQpOworICBpbnQgb2xkX2NvdW50OworICAKKyAgX2RidXNfYXNzZXJ0IChwbXV0ZXgtPmNvdW50ID4gMCk7CisgIF9kYnVzX2Fzc2VydCAocHRocmVhZF9lcXVhbCAocG11dGV4LT5ob2xkZXIsIHB0aHJlYWRfc2VsZiAoKSkpOworCisgIG9sZF9jb3VudCA9IHBtdXRleC0+Y291bnQ7CisgIHBtdXRleC0+Y291bnQgPSAwOwkJLyogYWxsb3cgb3RoZXIgdGhyZWFkcyB0byBsb2NrICovCisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX2NvbmRfd2FpdCIsIHB0aHJlYWRfY29uZF93YWl0ICgmcGNvbmQtPmNvbmQsICZwbXV0ZXgtPmxvY2spKTsKKyAgX2RidXNfYXNzZXJ0IChwbXV0ZXgtPmNvdW50ID09IDApOworICBwbXV0ZXgtPmNvdW50ID0gb2xkX2NvdW50OworICBwbXV0ZXgtPmhvbGRlciA9IHB0aHJlYWRfc2VsZigpOyAvKiBvdGhlciB0aHJlYWRzIG1heSBoYXZlIGxvY2tlZCB0aGUgbXV0ZXggaW4gdGhlIG1lYW50aW1lICovCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfcHRocmVhZF9jb25kdmFyX3dhaXRfdGltZW91dCAoREJ1c0NvbmRWYXIgICAgICAgICAgICAgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICAgICAgICAgICAgICAgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIERCdXNNdXRleFBUaHJlYWQgKnBtdXRleCA9IERCVVNfTVVURVhfUFRIUkVBRCAobXV0ZXgpOworICBEQnVzQ29uZFZhclBUaHJlYWQgKnBjb25kID0gREJVU19DT05EX1ZBUl9QVEhSRUFEIChjb25kKTsKKyAgc3RydWN0IHRpbWV2YWwgdGltZV9ub3c7CisgIHN0cnVjdCB0aW1lc3BlYyBlbmRfdGltZTsKKyAgaW50IHJlc3VsdDsKKyAgaW50IG9sZF9jb3VudDsKKyAgCisgIF9kYnVzX2Fzc2VydCAocG11dGV4LT5jb3VudCA+IDApOworICBfZGJ1c19hc3NlcnQgKHB0aHJlYWRfZXF1YWwgKHBtdXRleC0+aG9sZGVyLCBwdGhyZWFkX3NlbGYgKCkpKTsgIAorCisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKyAgaWYgKGhhdmVfbW9ub3RvbmljX2Nsb2NrKQorICAgIHsKKyAgICAgIHN0cnVjdCB0aW1lc3BlYyBtb25vdG9uaWNfdGltZXI7CisgICAgICBjbG9ja19nZXR0aW1lIChDTE9DS19NT05PVE9OSUMsJm1vbm90b25pY190aW1lcik7CisgICAgICB0aW1lX25vdy50dl9zZWMgPSBtb25vdG9uaWNfdGltZXIudHZfc2VjOworICAgICAgdGltZV9ub3cudHZfdXNlYyA9IG1vbm90b25pY190aW1lci50dl9uc2VjIC8gMTAwMDsKKyAgICB9CisgIGVsc2UKKyAgICAvKiBUaGlzIGVsc2UgZmFsbHMgdGhyb3VnaCB0byBnZXR0aW1lb2ZkYXkgKi8KKyNlbmRpZgorICBnZXR0aW1lb2ZkYXkgKCZ0aW1lX25vdywgTlVMTCk7CisgIAorICBlbmRfdGltZS50dl9zZWMgPSB0aW1lX25vdy50dl9zZWMgKyB0aW1lb3V0X21pbGxpc2Vjb25kcyAvIDEwMDA7CisgIGVuZF90aW1lLnR2X25zZWMgPSAodGltZV9ub3cudHZfdXNlYyArICh0aW1lb3V0X21pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMCkgKiAxMDAwOworICBpZiAoZW5kX3RpbWUudHZfbnNlYyA+IDEwMDAqMTAwMCoxMDAwKQorICAgIHsKKyAgICAgIGVuZF90aW1lLnR2X3NlYyArPSAxOworICAgICAgZW5kX3RpbWUudHZfbnNlYyAtPSAxMDAwKjEwMDAqMTAwMDsKKyAgICB9CisKKyAgb2xkX2NvdW50ID0gcG11dGV4LT5jb3VudDsKKyAgcG11dGV4LT5jb3VudCA9IDA7CisgIHJlc3VsdCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQgKCZwY29uZC0+Y29uZCwgJnBtdXRleC0+bG9jaywgJmVuZF90aW1lKTsKKyAgCisgIGlmIChyZXN1bHQgIT0gRVRJTUVET1VUKQorICAgIHsKKyAgICAgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX2NvbmRfdGltZWR3YWl0IiwgcmVzdWx0KTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChwbXV0ZXgtPmNvdW50ID09IDApOworICBwbXV0ZXgtPmNvdW50ID0gb2xkX2NvdW50OworICBwbXV0ZXgtPmhvbGRlciA9IHB0aHJlYWRfc2VsZigpOyAvKiBvdGhlciB0aHJlYWRzIG1heSBoYXZlIGxvY2tlZCB0aGUgbXV0ZXggaW4gdGhlIG1lYW50aW1lICovCisgIAorICAvKiByZXR1cm4gdHJ1ZSBpZiB3ZSBkaWQgbm90IHRpbWUgb3V0ICovCisgIHJldHVybiByZXN1bHQgIT0gRVRJTUVET1VUOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfcHRocmVhZF9jb25kdmFyX3dha2Vfb25lIChEQnVzQ29uZFZhciAqY29uZCkKK3sKKyAgREJ1c0NvbmRWYXJQVGhyZWFkICpwY29uZCA9IERCVVNfQ09ORF9WQVJfUFRIUkVBRCAoY29uZCk7CisKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF9zaWduYWwiLCBwdGhyZWFkX2NvbmRfc2lnbmFsICgmcGNvbmQtPmNvbmQpKTsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX3B0aHJlYWRfY29uZHZhcl93YWtlX2FsbCAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIERCdXNDb25kVmFyUFRocmVhZCAqcGNvbmQgPSBEQlVTX0NPTkRfVkFSX1BUSFJFQUQgKGNvbmQpOworICAKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF9icm9hZGNhc3QiLCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0ICgmcGNvbmQtPmNvbmQpKTsKK30KKworc3RhdGljIGNvbnN0IERCdXNUaHJlYWRGdW5jdGlvbnMgcHRocmVhZF9mdW5jdGlvbnMgPQoreworICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX05FV19NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9GUkVFX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX0xPQ0tfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfVU5MT0NLX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9ORVdfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX0ZSRUVfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBSVRfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBSVRfVElNRU9VVF9NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FLRV9PTkVfTUFTS3wKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FLRV9BTExfTUFTSywKKyAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgX2RidXNfcHRocmVhZF9jb25kdmFyX25ldywKKyAgX2RidXNfcHRocmVhZF9jb25kdmFyX2ZyZWUsCisgIF9kYnVzX3B0aHJlYWRfY29uZHZhcl93YWl0LAorICBfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FpdF90aW1lb3V0LAorICBfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FrZV9vbmUsCisgIF9kYnVzX3B0aHJlYWRfY29uZHZhcl93YWtlX2FsbCwKKyAgX2RidXNfcHRocmVhZF9tdXRleF9uZXcsCisgIF9kYnVzX3B0aHJlYWRfbXV0ZXhfZnJlZSwKKyAgX2RidXNfcHRocmVhZF9tdXRleF9sb2NrLAorICBfZGJ1c19wdGhyZWFkX211dGV4X3VubG9jaworfTsKKworc3RhdGljIHZvaWQKK2NoZWNrX21vbm90b25pY19jbG9jayAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX01PTk9UT05JQ19DTE9DSworICBzdHJ1Y3QgdGltZXNwZWMgZHVtbXk7CisgIGlmIChjbG9ja19nZXRyZXMgKENMT0NLX01PTk9UT05JQywgJmR1bW15KSA9PSAwKQorICAgIGhhdmVfbW9ub3RvbmljX2Nsb2NrID0gVFJVRTsKKyNlbmRpZgorfQorCitkYnVzX2Jvb2xfdAorX2RidXNfdGhyZWFkc19pbml0X3BsYXRmb3JtX3NwZWNpZmljICh2b2lkKQoreworICBjaGVja19tb25vdG9uaWNfY2xvY2sgKCk7CisgIHJldHVybiBkYnVzX3RocmVhZHNfaW5pdCAoJnB0aHJlYWRfZnVuY3Rpb25zKTsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXRocmVhZC13aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjk3MmEzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy1wdGhyZWFkLmMgSW1wbGVtZW50cyB0aHJlYWRzIHVzaW5nIFdpbmRvd3MgdGhyZWFkcyAoaW50ZXJuYWwgdG8gbGliZGJ1cykKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RydWN0IERCdXNDb25kVmFyIHsKKyAgREJ1c0xpc3QgKmxpc3Q7ICAgICAgICAvKio8IGxpc3QgdGhyZWFkLWxvY2FsLXN0b3JlZCBldmVudHMgd2FpdGluZyBvbiB0aGUgY29uZCB2YXJpYWJsZSAqLworICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7IC8qKjwgbG9jayBwcm90ZWN0aW5nIHRoZSBsaXN0ICovCit9OworCitzdGF0aWMgRFdPUkQgZGJ1c19jb25kX2V2ZW50X3RscyA9IFRMU19PVVRfT0ZfSU5ERVhFUzsKKworCitzdGF0aWMgSE1PRFVMRSBkYnVzX2RsbF9obW9kdWxlOworCit2b2lkICoKK19kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUgKHZvaWQpCit7CisgIHJldHVybiBkYnVzX2RsbF9obW9kdWxlOworfQorCisjaWZkZWYgREJVU19XSU5DRQorI2RlZmluZSBoaW5zdF90IEhBTkRMRQorI2Vsc2UKKyNkZWZpbmUgaGluc3RfdCBISU5TVEFOQ0UKKyNlbmRpZgorCitCT09MIFdJTkFQSSBEbGxNYWluIChoaW5zdF90LCBEV09SRCwgTFBWT0lEKTsKKworLyogV2UgbmVlZCB0aGlzIHRvIGZyZWUgdGhlIFRMUyBldmVudHMgb24gdGhyZWFkIGV4aXQgKi8KK0JPT0wgV0lOQVBJCitEbGxNYWluIChoaW5zdF90IGhpbnN0RExMLAorCSBEV09SRCAgICAgZmR3UmVhc29uLAorCSBMUFZPSUQgICAgbHB2UmVzZXJ2ZWQpCit7CisgIEhBTkRMRSBldmVudDsKKyAgc3dpdGNoIChmZHdSZWFzb24pIAorICAgIHsgCisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICBkYnVzX2RsbF9obW9kdWxlID0gaGluc3RETEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIERMTF9USFJFQURfREVUQUNIOgorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6IAorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisKKwkgIFRsc0ZyZWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7IAorCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IAorICAgICAgYnJlYWs7IAorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzTXV0ZXgqCitfZGJ1c193aW5kb3dzX211dGV4X25ldyAodm9pZCkKK3sKKyAgSEFORExFIGhhbmRsZTsKKyAgaGFuZGxlID0gQ3JlYXRlTXV0ZXggKE5VTEwsIEZBTFNFLCBOVUxMKTsKKyAgcmV0dXJuIChEQnVzTXV0ZXggKikgaGFuZGxlOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfd2luZG93c19tdXRleF9mcmVlIChEQnVzTXV0ZXggKm11dGV4KQoreworICBDbG9zZUhhbmRsZSAoKEhBTkRMRSAqKSBtdXRleCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfd2luZG93c19tdXRleF9sb2NrIChEQnVzTXV0ZXggKm11dGV4KQoreworICByZXR1cm4gV2FpdEZvclNpbmdsZU9iamVjdCAoKEhBTkRMRSAqKSBtdXRleCwgSU5GSU5JVEUpICE9IFdBSVRfRkFJTEVEOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3dpbmRvd3NfbXV0ZXhfdW5sb2NrIChEQnVzTXV0ZXggKm11dGV4KQoreworICByZXR1cm4gUmVsZWFzZU11dGV4ICgoSEFORExFICopIG11dGV4KSAhPSAwOworfQorCitzdGF0aWMgREJ1c0NvbmRWYXIgKgorX2RidXNfd2luZG93c19jb25kdmFyX25ldyAodm9pZCkKK3sKKyAgREJ1c0NvbmRWYXIgKmNvbmQ7CisgICAgCisgIGNvbmQgPSBkYnVzX25ldyAoREJ1c0NvbmRWYXIsIDEpOworICBpZiAoY29uZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgY29uZC0+bGlzdCA9IE5VTEw7CisgIAorICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIHJldHVybiAoREJ1c0NvbmRWYXIgKikgY29uZDsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX3dpbmRvd3NfY29uZHZhcl9mcmVlIChEQnVzQ29uZFZhciAqY29uZCkKK3sKKyAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb25kLT5saXN0KTsKKyAgZGJ1c19mcmVlIChjb25kKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25kdmFyX3dhaXRfd2luMzIgKERCdXNDb25kVmFyICpjb25kLAorCQkJICBEQnVzTXV0ZXggKm11dGV4LAorCQkJICBpbnQgbWlsbGlzZWNvbmRzKQoreworICBEV09SRCByZXR2YWw7CisgIGRidXNfYm9vbF90IHJldDsKKyAgSEFORExFIGV2ZW50ID0gVGxzR2V0VmFsdWUgKGRidXNfY29uZF9ldmVudF90bHMpOworCisgIGlmICghZXZlbnQpCisgICAgeworICAgICAgZXZlbnQgPSBDcmVhdGVFdmVudCAoMCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICAgIGlmIChldmVudCA9PSAwKQorCXJldHVybiBGQUxTRTsKKyAgICAgIFRsc1NldFZhbHVlIChkYnVzX2NvbmRfZXZlbnRfdGxzLCBldmVudCk7CisgICAgfQorCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisKKyAgLyogVGhlIGV2ZW50IG11c3Qgbm90IGJlIHNpZ25hbGVkLiBDaGVjayB0aGlzICovCisgIF9kYnVzX2Fzc2VydCAoV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIDApID09IFdBSVRfVElNRU9VVCk7CisKKyAgcmV0ID0gX2RidXNfbGlzdF9hcHBlbmQgKCZjb25kLT5saXN0LCBldmVudCk7CisgIAorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIEZBTFNFOyAvKiBQcmVwZW5kIGZhaWxlZCAqLworCisgIF9kYnVzX211dGV4X3VubG9jayAobXV0ZXgpOworICByZXR2YWwgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0IChldmVudCwgbWlsbGlzZWNvbmRzKTsKKyAgX2RidXNfbXV0ZXhfbG9jayAobXV0ZXgpOworICAKKyAgaWYgKHJldHZhbCA9PSBXQUlUX1RJTUVPVVQpCisgICAgeworICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlICgmY29uZC0+bGlzdCwgZXZlbnQpOworCisgICAgICAvKiBJbiB0aGUgbWVhbnRpbWUgd2UgY291bGQgaGF2ZSBiZWVuIHNpZ25hbGVkLCBzbyB3ZSBtdXN0IGFnYWluCisgICAgICAgKiB3YWl0IGZvciB0aGUgc2lnbmFsLCB0aGlzIHRpbWUgd2l0aCBubyB0aW1lb3V0LCB0byByZXNldAorICAgICAgICogaXQuIHJldHZhbCBpcyBzZXQgYWdhaW4gdG8gaG9ub3VyIHRoZSBsYXRlIGFycml2YWwgb2YgdGhlCisgICAgICAgKiBzaWduYWwgKi8KKyAgICAgIHJldHZhbCA9IFdhaXRGb3JTaW5nbGVPYmplY3QgKGV2ZW50LCAwKTsKKworICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyAgICB9CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworCisgIC8qIE5vdyBldmVudCBtdXN0IG5vdCBiZSBpbnNpZGUgdGhlIGFycmF5LCBjaGVjayB0aGlzICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9yZW1vdmUgKCZjb25kLT5saXN0LCBldmVudCkgPT0gRkFMU0UpOworCisgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisjZW5kaWYgLyogIUdfRElTQUJMRV9BU1NFUlQgKi8KKworICByZXR1cm4gcmV0dmFsICE9IFdBSVRfVElNRU9VVDsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX3dpbmRvd3NfY29uZHZhcl93YWl0IChEQnVzQ29uZFZhciAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAqbXV0ZXgpCit7CisgIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIElORklOSVRFKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c193aW5kb3dzX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAgICAgICAgICAgICAgICpjb25kLAorCQkJCSAgICAgREJ1c011dGV4ICAgICAgICAgICAgICAgICAqbXV0ZXgsCisJCQkJICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgcmV0dXJuIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX3dpbmRvd3NfY29uZHZhcl93YWtlX29uZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIAorICBpZiAoY29uZC0+bGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIFNldEV2ZW50IChfZGJ1c19saXN0X3BvcF9maXJzdCAoJmNvbmQtPmxpc3QpKTsKKyAgICAgIC8qIEF2b2lkIGxpdmUgbG9jayBieSBwdXNoaW5nIHRoZSB3YWl0ZXIgdG8gdGhlIG11dGV4IGxvY2sKKyAgICAgICAgIGluc3RydWN0aW9uLCB3aGljaCBpcyBmYWlyLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UgY291bGQKKyAgICAgICAgIGFjcXVpcmUgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhZ2FpbiBiZWZvcmUgdGhlIHdhaXRlciBoYXMgYQorICAgICAgICAgY2hhbmNlIGl0c2VsZiwgbGVhZGluZyB0byBzdGFydmF0aW9uLiAgKi8KKyAgICAgIFNsZWVwICgwKTsKKyAgICB9CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c193aW5kb3dzX2NvbmR2YXJfd2FrZV9hbGwgKERCdXNDb25kVmFyICpjb25kKQoreworICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworCisgIHdoaWxlIChjb25kLT5saXN0ICE9IE5VTEwpCisgICAgU2V0RXZlbnQgKF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmY29uZC0+bGlzdCkpOworCisgIGlmIChjb25kLT5saXN0ICE9IE5VTEwpCisgICAgeworICAgICAgLyogQXZvaWQgbGl2ZSBsb2NrIGJ5IHB1c2hpbmcgdGhlIHdhaXRlciB0byB0aGUgbXV0ZXggbG9jaworICAgICAgICAgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIGZhaXIuICBJZiB3ZSBkb24ndCBkbyB0aGlzLCB3ZSBjb3VsZAorICAgICAgICAgYWNxdWlyZSB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGFnYWluIGJlZm9yZSB0aGUgd2FpdGVyIGhhcyBhCisgICAgICAgICBjaGFuY2UgaXRzZWxmLCBsZWFkaW5nIHRvIHN0YXJ2YXRpb24uICAqLworICAgICAgU2xlZXAgKDApOworICAgIH0KKworICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworfQorCitzdGF0aWMgY29uc3QgREJ1c1RocmVhZEZ1bmN0aW9ucyB3aW5kb3dzX2Z1bmN0aW9ucyA9Cit7CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9ORVdfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9GUkVFX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfTE9DS19NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX1VOTE9DS19NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfTkVXX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9GUkVFX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUlUX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUlUX1RJTUVPVVRfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBS0VfT05FX01BU0t8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBS0VfQUxMX01BU0ssCisgIF9kYnVzX3dpbmRvd3NfbXV0ZXhfbmV3LAorICBfZGJ1c193aW5kb3dzX211dGV4X2ZyZWUsCisgIF9kYnVzX3dpbmRvd3NfbXV0ZXhfbG9jaywKKyAgX2RidXNfd2luZG93c19tdXRleF91bmxvY2ssCisgIF9kYnVzX3dpbmRvd3NfY29uZHZhcl9uZXcsCisgIF9kYnVzX3dpbmRvd3NfY29uZHZhcl9mcmVlLAorICBfZGJ1c193aW5kb3dzX2NvbmR2YXJfd2FpdCwKKyAgX2RidXNfd2luZG93c19jb25kdmFyX3dhaXRfdGltZW91dCwKKyAgX2RidXNfd2luZG93c19jb25kdmFyX3dha2Vfb25lLAorICBfZGJ1c193aW5kb3dzX2NvbmR2YXJfd2FrZV9hbGwKK307CisKK2RidXNfYm9vbF90CitfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIC8qIFdlIHJldXNlIHRoaXMgb3ZlciBzZXZlcmFsIGdlbmVyYXRpb25zLCBiZWNhdXNlIHdlIGNhbid0CisgICAqIGZyZWUgdGhlIGV2ZW50cyBvbmNlIHRoZXkgYXJlIGluIHVzZQorICAgKi8KKyAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgPT0gVExTX09VVF9PRl9JTkRFWEVTKQorICAgIHsKKyAgICAgIGRidXNfY29uZF9ldmVudF90bHMgPSBUbHNBbGxvYyAoKTsKKyAgICAgIGlmIChkYnVzX2NvbmRfZXZlbnRfdGxzID09IFRMU19PVVRfT0ZfSU5ERVhFUykKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBkYnVzX3RocmVhZHNfaW5pdCAoJndpbmRvd3NfZnVuY3Rpb25zKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTE3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy11bml4LmMKQEAgLTAsMCArMSwzODgyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy11bml4LmMgV3JhcHBlcnMgYXJvdW5kIFVOSVggc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXVzZXJkYi5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJkYnVzLW5vbmNlLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxncnAuaD4KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1dSSVRFVgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfUE9MTAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0JBQ0tUUkFDRQorI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0dFVFBFRVJVQ1JFRAorI2luY2x1ZGUgPHVjcmVkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQURUCisjaW5jbHVkZSA8YnNtL2FkdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzZC1kYWVtb24uaCIKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworI2lmbmRlZiBBSV9BRERSQ09ORklHCisjZGVmaW5lIEFJX0FERFJDT05GSUcgMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TT0NLTEVOX1QKKyNkZWZpbmUgc29ja2xlbl90IGludAorI2VuZGlmCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfb3Blbl9zb2NrZXQgKGludCAgICAgICAgICAgICAgKmZkX3AsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZG9tYWluLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisjaWZkZWYgU09DS19DTE9FWEVDCisgIGRidXNfYm9vbF90IGNsb2V4ZWNfZG9uZTsKKworICAqZmRfcCA9IHNvY2tldCAoZG9tYWluLCB0eXBlIHwgU09DS19DTE9FWEVDLCBwcm90b2NvbCk7CisgIGNsb2V4ZWNfZG9uZSA9ICpmZF9wID49IDA7CisKKyAgLyogQ2hlY2sgaWYga2VybmVsIHNlZW1zIHRvIGJlIHRvbyBvbGQgdG8ga25vdyBTT0NLX0NMT0VYRUMgKi8KKyAgaWYgKCpmZF9wIDwgMCAmJiBlcnJubyA9PSBFSU5WQUwpCisjZW5kaWYKKyAgICB7CisgICAgICAqZmRfcCA9IHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQorCisgIGlmICgqZmRfcCA+PSAwKQorICAgIHsKKyNpZmRlZiBTT0NLX0NMT0VYRUMKKyAgICAgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYygqZmRfcCk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoInNvY2tldCBmZCAlZCBvcGVuZWRcbiIsICpmZF9wKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorX2RidXNfb3Blbl90Y3Bfc29ja2V0IChpbnQgICAgICAgICAgICAgICpmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIHJldHVybiBfZGJ1c19vcGVuX3NvY2tldChmZCwgQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIGVycm9yKTsKK30KKworLyoqCisgKiBPcGVucyBhIFVOSVggZG9tYWluIHNvY2tldCAoYXMgaW4gdGhlIHNvY2tldCgpIGNhbGwpLgorICogRG9lcyBub3QgYmluZCB0aGUgc29ja2V0LgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZAorICoKKyAqIEBwYXJhbSBmZCByZXR1cm4gbG9jYXRpb24gZm9yIHNvY2tldCBkZXNjcmlwdG9yCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfb3Blbl91bml4X3NvY2tldCAoaW50ICAgICAgICAgICAgICAqZmQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX29wZW5fc29ja2V0KGZkLCBQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZXJyb3IpOworfQorCisvKioKKyAqIENsb3NlcyBhIHNvY2tldC4gU2hvdWxkIG5vdCBiZSB1c2VkIG9uIG5vbi1zb2NrZXQKKyAqIGZpbGUgZGVzY3JpcHRvcnMgb3IgaGFuZGxlcy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIHNvY2tldAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlX3NvY2tldCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICByZXR1cm4gX2RidXNfY2xvc2UgKGZkLCBlcnJvcik7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c19yZWFkKCksIGJ1dCBvbmx5IHdvcmtzIG9uIHNvY2tldHMgc28gaXMKKyAqIGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgc29ja2V0CisgKiBAcGFyYW0gYnVmZmVyIHN0cmluZyB0byBhcHBlbmQgZGF0YSB0bworICogQHBhcmFtIGNvdW50IG1heCBhbW91bnQgb2YgZGF0YSB0byByZWFkCisgKiBAcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYXBwZW5kZWQgdG8gdGhlIHN0cmluZworICovCitpbnQKK19kYnVzX3JlYWRfc29ja2V0IChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQpCit7CisgIHJldHVybiBfZGJ1c19yZWFkIChmZCwgYnVmZmVyLCBjb3VudCk7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c193cml0ZSgpLCBidXQgb25seSBzdXBwb3J0cyBzb2NrZXRzCisgKiBhbmQgaXMgdGh1cyBhdmFpbGFibGUgb24gV2luZG93cy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3dyaXRlX3NvY2tldCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyNpZiBIQVZFX0RFQ0xfTVNHX05PU0lHTkFMCisgIGNvbnN0IGNoYXIgKmRhdGE7CisgIGludCBieXRlc193cml0dGVuOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIsIHN0YXJ0LCBsZW4pOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmQgKGZkLCBkYXRhLCBsZW4sIE1TR19OT1NJR05BTCk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisKKyNlbHNlCisgIHJldHVybiBfZGJ1c193cml0ZSAoZmQsIGJ1ZmZlciwgc3RhcnQsIGxlbik7CisjZW5kaWYKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3JlYWRfc29ja2V0KCkgYnV0IGFsc28gdHJpZXMgdG8gcmVhZCB1bml4IGZkcyBmcm9tIHRoZQorICogc29ja2V0LiBXaGVuIHRoZXJlIGFyZSBtb3JlIGZkcyB0byByZWFkIHRoYW4gc3BhY2UgaW4gdGhlIGFycmF5CisgKiBwYXNzZWQgdGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgd2l0aCBFTk9TUEMuCisgKgorICogQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqIEBwYXJhbSBidWZmZXIgc3RyaW5nIHRvIGFwcGVuZCBkYXRhIHRvCisgKiBAcGFyYW0gY291bnQgbWF4IGFtb3VudCBvZiBkYXRhIHRvIHJlYWQKKyAqIEBwYXJhbSBmZHMgYXJyYXkgdG8gcGxhY2UgcmVhZCBmaWxlIGRlc2NyaXB0b3JzIGluCisgKiBAcGFyYW0gbl9mZHMgb24gaW5wdXQgc3BhY2UgaW4gZmRzIGFycmF5LCBvbiBvdXRwdXQgaG93IG1hbnkgZmRzIGFjdHVhbGx5IGdvdCByZWFkCisgKiBAcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYXBwZW5kZWQgdG8gc3RyaW5nCisgKi8KK2ludAorX2RidXNfcmVhZF9zb2NrZXRfd2l0aF91bml4X2ZkcyAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5fZmRzKSB7CisjaWZuZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGludCByOworCisgIGlmICgociA9IF9kYnVzX3JlYWRfc29ja2V0KGZkLCBidWZmZXIsIGNvdW50KSkgPCAwKQorICAgIHJldHVybiByOworCisgICpuX2ZkcyA9IDA7CisgIHJldHVybiByOworCisjZWxzZQorICBpbnQgYnl0ZXNfcmVhZDsKKyAgaW50IHN0YXJ0OworICBzdHJ1Y3QgbXNnaGRyIG07CisgIHN0cnVjdCBpb3ZlYyBpb3Y7CisKKyAgX2RidXNfYXNzZXJ0IChjb3VudCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICgqbl9mZHMgPj0gMCk7CisKKyAgc3RhcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoYnVmZmVyLCBjb3VudCkpCisgICAgeworICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIF9EQlVTX1pFUk8oaW92KTsKKyAgaW92Lmlvdl9iYXNlID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworICBpb3YuaW92X2xlbiA9IGNvdW50OworCisgIF9EQlVTX1pFUk8obSk7CisgIG0ubXNnX2lvdiA9ICZpb3Y7CisgIG0ubXNnX2lvdmxlbiA9IDE7CisKKyAgLyogSG1tLCB3ZSBoYXZlIG5vIGNsdWUgaG93IGxvbmcgdGhlIGNvbnRyb2wgZGF0YSB3aWxsIGFjdHVhbGx5IGJlCisgICAgIHRoYXQgaXMgcXVldWVkIGZvciB1cy4gVGhlIGxlYXN0IHdlIGNhbiBkbyBpcyBhc3N1bWUgdGhhdCB0aGUKKyAgICAgY2FsbGVyIGtub3dzLiBIZW5jZSBsZXQncyBtYWtlIHNwYWNlIGZvciB0aGUgbnVtYmVyIG9mIGZkcyB0aGF0CisgICAgIHdlIHNoYWxsIHJlYWQgYXQgbWF4IHBsdXMgdGhlIGNtc2cgaGVhZGVyLiAqLworICBtLm1zZ19jb250cm9sbGVuID0gQ01TR19TUEFDRSgqbl9mZHMgKiBzaXplb2YoaW50KSk7CisKKyAgLyogSXQncyBwcm9iYWJseSBzYWZlIHRvIGFzc3VtZSB0aGF0IHN5c3RlbXMgd2l0aCBTQ01fUklHSFRTIGFsc28KKyAgICAga25vdyBhbGxvY2EoKSAqLworICBtLm1zZ19jb250cm9sID0gYWxsb2NhKG0ubXNnX2NvbnRyb2xsZW4pOworICBtZW1zZXQobS5tc2dfY29udHJvbCwgMCwgbS5tc2dfY29udHJvbGxlbik7CisKKyBhZ2FpbjoKKworICBieXRlc19yZWFkID0gcmVjdm1zZyhmZCwgJm0sIDAKKyNpZmRlZiBNU0dfQ01TR19DTE9FWEVDCisgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfQ01TR19DTE9FWEVDCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MgYW55dGhpbmcpICovCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBjbXNnaGRyICpjbTsKKyAgICAgIGRidXNfYm9vbF90IGZvdW5kID0gRkFMU0U7CisKKyAgICAgIGlmIChtLm1zZ19mbGFncyAmIE1TR19DVFJVTkMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBIbW0sIGFwcGFyZW50bHkgdGhlIGNvbnRyb2wgZGF0YSB3YXMgdHJ1bmNhdGVkLiBUaGUgYmFkCisgICAgICAgICAgICAgdGhpbmcgaXMgdGhhdCB3ZSBtaWdodCBoYXZlIGNvbXBsZXRlbHkgbG9zdCBhIGNvdXBsZSBvZiBmZHMKKyAgICAgICAgICAgICB3aXRob3V0IGNoYW5jZSB0byByZWNvdmVyIHRoZW0uIEhlbmNlIGxldCdzIHRyZWF0IHRoaXMgYXMgYQorICAgICAgICAgICAgIHNlcmlvdXMgZXJyb3IuICovCisKKyAgICAgICAgICBlcnJubyA9IEVOT1NQQzsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgIGZvciAoY20gPSBDTVNHX0ZJUlNUSERSKCZtKTsgY207IGNtID0gQ01TR19OWFRIRFIoJm0sIGNtKSkKKyAgICAgICAgaWYgKGNtLT5jbXNnX2xldmVsID09IFNPTF9TT0NLRVQgJiYgY20tPmNtc2dfdHlwZSA9PSBTQ01fUklHSFRTKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGk7CisKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydChjbS0+Y21zZ19sZW4gPD0gQ01TR19MRU4oKm5fZmRzICogc2l6ZW9mKGludCkpKTsKKyAgICAgICAgICAgICpuX2ZkcyA9IChjbS0+Y21zZ19sZW4gLSBDTVNHX0xFTigwKSkgLyBzaXplb2YoaW50KTsKKworICAgICAgICAgICAgbWVtY3B5KGZkcywgQ01TR19EQVRBKGNtKSwgKm5fZmRzICogc2l6ZW9mKGludCkpOworICAgICAgICAgICAgZm91bmQgPSBUUlVFOworCisgICAgICAgICAgICAvKiBMaW51eCBkb2Vzbid0IHRlbGwgdXMgd2hldGhlciBNU0dfQ01TR19DTE9FWEVDIGFjdHVhbGx5CisgICAgICAgICAgICAgICB3b3JrZWQsIGhlbmNlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGlzIGxpc3QgYW5kIHNldAorICAgICAgICAgICAgICAgQ0xPRVhFQyBldmVyeXdoZXJlIGluIGFueSBjYXNlICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKm5fZmRzOyBpKyspCisgICAgICAgICAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKGZkc1tpXSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgKm5fZmRzID0gMDsKKworICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MpICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCArIGJ5dGVzX3JlYWQpOworCisjaWYgMAorICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoYnVmZmVyLCBzdGFydCwgYnl0ZXNfcmVhZCk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7CisgICAgfQorI2VuZGlmCit9CisKK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHMoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzKSB7CisKKyNpZm5kZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAobl9mZHMgPiAwKSB7CisgICAgZXJybm8gPSBFTk9UU1VQOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBfZGJ1c193cml0ZV9zb2NrZXQoZmQsIGJ1ZmZlciwgc3RhcnQsIGxlbik7CisjZWxzZQorICByZXR1cm4gX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvKGZkLCBidWZmZXIsIHN0YXJ0LCBsZW4sIE5VTEwsIDAsIDAsIGZkcywgbl9mZHMpOworI2VuZGlmCit9CisKK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMpIHsKKworI2lmbmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmIChuX2ZkcyA+IDApIHsKKyAgICBlcnJubyA9IEVOT1RTVVA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIF9kYnVzX3dyaXRlX3NvY2tldF90d28oZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyNlbHNlCisKKyAgc3RydWN0IG1zZ2hkciBtOworICBzdHJ1Y3QgY21zZ2hkciAqY207CisgIHN0cnVjdCBpb3ZlYyBpb3ZbMl07CisgIGludCBieXRlc193cml0dGVuOworCisgIF9kYnVzX2Fzc2VydCAobGVuMSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4yID49IDApOworICBfZGJ1c19hc3NlcnQgKG5fZmRzID49IDApOworCisgIF9EQlVTX1pFUk8oaW92KTsKKyAgaW92WzBdLmlvdl9iYXNlID0gKGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIxLCBzdGFydDEsIGxlbjEpOworICBpb3ZbMF0uaW92X2xlbiA9IGxlbjE7CisKKyAgaWYgKGJ1ZmZlcjIpCisgICAgeworICAgICAgaW92WzFdLmlvdl9iYXNlID0gKGNoYXIqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIyLCBzdGFydDIsIGxlbjIpOworICAgICAgaW92WzFdLmlvdl9sZW4gPSBsZW4yOworICAgIH0KKworICBfREJVU19aRVJPKG0pOworICBtLm1zZ19pb3YgPSBpb3Y7CisgIG0ubXNnX2lvdmxlbiA9IGJ1ZmZlcjIgPyAyIDogMTsKKworICBpZiAobl9mZHMgPiAwKQorICAgIHsKKyAgICAgIG0ubXNnX2NvbnRyb2xsZW4gPSBDTVNHX1NQQUNFKG5fZmRzICogc2l6ZW9mKGludCkpOworICAgICAgbS5tc2dfY29udHJvbCA9IGFsbG9jYShtLm1zZ19jb250cm9sbGVuKTsKKyAgICAgIG1lbXNldChtLm1zZ19jb250cm9sLCAwLCBtLm1zZ19jb250cm9sbGVuKTsKKworICAgICAgY20gPSBDTVNHX0ZJUlNUSERSKCZtKTsKKyAgICAgIGNtLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgICAgIGNtLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgICAgY20tPmNtc2dfbGVuID0gQ01TR19MRU4obl9mZHMgKiBzaXplb2YoaW50KSk7CisgICAgICBtZW1jcHkoQ01TR19EQVRBKGNtKSwgZmRzLCBuX2ZkcyAqIHNpemVvZihpbnQpKTsKKyAgICB9CisKKyBhZ2FpbjoKKworICBieXRlc193cml0dGVuID0gc2VuZG1zZyAoZmQsICZtLCAwCisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1TR19OT1NJR05BTAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisjaWYgMAorICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3dyaXR0ZW4pOworI2VuZGlmCisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisjZW5kaWYKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3dyaXRlX3R3bygpIGJ1dCBvbmx5IHdvcmtzIG9uIHNvY2tldHMgYW5kIGlzIHRodXMKKyAqIGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gYnVmZmVyMSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBzdGFydDEgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBsZW4xIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBmcm9tIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIGJ1ZmZlcjIgc2Vjb25kIGJ1ZmZlciwgb3IgI05VTEwKKyAqIEBwYXJhbSBzdGFydDIgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBzZWNvbmQgYnVmZmVyCisgKiBAcGFyYW0gbGVuMiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHJldHVybnMgdG90YWwgYnl0ZXMgd3JpdHRlbiBmcm9tIGJvdGggYnVmZmVycywgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c193cml0ZV9zb2NrZXRfdHdvIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpCit7CisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICBzdHJ1Y3QgaW92ZWMgdmVjdG9yc1syXTsKKyAgY29uc3QgY2hhciAqZGF0YTE7CisgIGNvbnN0IGNoYXIgKmRhdGEyOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgc3RydWN0IG1zZ2hkciBtOworCisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworICBkYXRhMSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSk7CisKKyAgaWYgKGJ1ZmZlcjIgIT0gTlVMTCkKKyAgICBkYXRhMiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgIGVsc2UKKyAgICB7CisgICAgICBkYXRhMiA9IE5VTEw7CisgICAgICBzdGFydDIgPSAwOworICAgICAgbGVuMiA9IDA7CisgICAgfQorCisgIHZlY3RvcnNbMF0uaW92X2Jhc2UgPSAoY2hhciopIGRhdGExOworICB2ZWN0b3JzWzBdLmlvdl9sZW4gPSBsZW4xOworICB2ZWN0b3JzWzFdLmlvdl9iYXNlID0gKGNoYXIqKSBkYXRhMjsKKyAgdmVjdG9yc1sxXS5pb3ZfbGVuID0gbGVuMjsKKworICBfREJVU19aRVJPKG0pOworICBtLm1zZ19pb3YgPSB2ZWN0b3JzOworICBtLm1zZ19pb3ZsZW4gPSBkYXRhMiA/IDIgOiAxOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmRtc2cgKGZkLCAmbSwgTVNHX05PU0lHTkFMKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKKworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX3dyaXRlX3R3byAoZmQsIGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyNlbmRpZgorfQorCitkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X2lzX2ludmFsaWQgKGludCBmZCkKK3sKKyAgICByZXR1cm4gZmQgPCAwID8gVFJVRSA6IEZBTFNFOworfQorCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHJlYWQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFwcGVuZHMKKyAqIHRoZSBkYXRhIGl0IHJlYWRzIHRvIHRoZSBEQnVzU3RyaW5nIGJ1ZmZlci4gSXQgYXBwZW5kcworICogdXAgdG8gdGhlIGdpdmVuIGNvdW50LCBhbmQgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZQorICogYW5kIHNhbWUgZXJybm8gYXMgcmVhZCgpLiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhhdAorICogX2RidXNfcmVhZCgpIGhhbmRsZXMgRUlOVFIgZm9yIHlvdS4gQWxzbywgX2RidXNfcmVhZCgpIGNhbgorICogcmV0dXJuIEVOT01FTSwgZXZlbiB0aG91Z2ggcmVndWxhciBVTklYIHJlYWQgZG9lc24ndC4KKyAqCisgKiBVbmxpa2UgX2RidXNfcmVhZF9zb2NrZXQoKSwgX2RidXNfcmVhZCgpIGlzIG5vdCBhdmFpbGFibGUKKyAqIG9uIFdpbmRvd3MuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KK2ludAorX2RidXNfcmVhZCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCkKK3sKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworCisgYWdhaW46CisKKyAgYnl0ZXNfcmVhZCA9IHJlYWQgKGZkLCBkYXRhLCBjb3VudCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAobm90ZSB0aGF0IHRoaXMgZG9lc24ndCBhY3R1YWxseSByZWFsbG9jIGFueXRoaW5nKSAqLworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0KTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBwdXQgbGVuZ3RoIGJhY2sgKGRvZXNuJ3QgYWN0dWFsbHkgcmVhbGxvYykgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0ICsgYnl0ZXNfcmVhZCk7CisKKyNpZiAwCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc19yZWFkKTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gYnl0ZXNfcmVhZDsKKyAgICB9Cit9CisKKy8qKgorICogVGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgd3JpdGUoKSBzeXN0ZW0gY2FsbCB0aGF0IHdyaXRlcyBhIHBhcnQgb2YgYQorICogREJ1c1N0cmluZyBhbmQgaGFuZGxlcyBFSU5UUiBmb3IgeW91LgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGUgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IGNoYXIgKmRhdGE7CisgIGludCBieXRlc193cml0dGVuOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIsIHN0YXJ0LCBsZW4pOworCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRlIChmZCwgZGF0YSwgbGVuKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworI2lmIDAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwKQorICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc193cml0dGVuKTsKKyNlbmRpZgorCisgIHJldHVybiBieXRlc193cml0dGVuOworfQorCisvKioKKyAqIExpa2UgX2RidXNfd3JpdGUoKSBidXQgd2lsbCB1c2Ugd3JpdGV2KCkgaWYgcG9zc2libGUKKyAqIHRvIHdyaXRlIGJvdGggYnVmZmVycyBpbiBzZXF1ZW5jZS4gVGhlIHJldHVybiB2YWx1ZQorICogaXMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIHRoZSBmaXJzdCBidWZmZXIsCisgKiBwbHVzIHRoZSBudW1iZXIgd3JpdHRlbiBpbiB0aGUgc2Vjb25kLiBJZiB0aGUgZmlyc3QKKyAqIGJ1ZmZlciBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBhbmQgYW4gZXJyb3Igb2NjdXJzCisgKiB3cml0aW5nIHRoZSBzZWNvbmQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpcnN0CisgKiBpcyByZXR1cm5lZCAoaS5lLiB0aGUgZXJyb3IgaXMgaWdub3JlZCksIG9uIHN5c3RlbXMgdGhhdAorICogZG9uJ3QgaGF2ZSB3cml0ZXYuIEhhbmRsZXMgRUlOVFIgZm9yIHlvdS4KKyAqIFRoZSBzZWNvbmQgYnVmZmVyIG1heSBiZSAjTlVMTC4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGJ1ZmZlcjEgZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gc3RhcnQxIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gbGVuMSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgZnJvbSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBidWZmZXIyIHNlY29uZCBidWZmZXIsIG9yICNOVUxMCisgKiBAcGFyYW0gc3RhcnQyIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHBhcmFtIGxlbjIgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEByZXR1cm5zIHRvdGFsIGJ5dGVzIHdyaXR0ZW4gZnJvbSBib3RoIGJ1ZmZlcnMsIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfdHdvIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpCit7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworI2lmZGVmIEhBVkVfV1JJVEVWCisgIHsKKyAgICBzdHJ1Y3QgaW92ZWMgdmVjdG9yc1syXTsKKyAgICBjb25zdCBjaGFyICpkYXRhMTsKKyAgICBjb25zdCBjaGFyICpkYXRhMjsKKyAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICAgIGRhdGExID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKworICAgIGlmIChidWZmZXIyICE9IE5VTEwpCisgICAgICBkYXRhMiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYXRhMiA9IE5VTEw7CisgICAgICAgIHN0YXJ0MiA9IDA7CisgICAgICAgIGxlbjIgPSAwOworICAgICAgfQorCisgICAgdmVjdG9yc1swXS5pb3ZfYmFzZSA9IChjaGFyKikgZGF0YTE7CisgICAgdmVjdG9yc1swXS5pb3ZfbGVuID0gbGVuMTsKKyAgICB2ZWN0b3JzWzFdLmlvdl9iYXNlID0gKGNoYXIqKSBkYXRhMjsKKyAgICB2ZWN0b3JzWzFdLmlvdl9sZW4gPSBsZW4yOworCisgIGFnYWluOgorCisgICAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRldiAoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiA/IDIgOiAxKTsKKworICAgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgIGdvdG8gYWdhaW47CisKKyAgICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKKyAgfQorI2Vsc2UgLyogSEFWRV9XUklURVYgKi8KKyAgeworICAgIGludCByZXQxOworCisgICAgcmV0MSA9IF9kYnVzX3dyaXRlIChmZCwgYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKyAgICBpZiAocmV0MSA9PSBsZW4xICYmIGJ1ZmZlcjIgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgcmV0MiA9IF9kYnVzX3dyaXRlIChmZCwgYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyAgICAgICAgaWYgKHJldDIgPCAwKQorICAgICAgICAgIHJldDIgPSAwOyAvKiB3ZSBjYW4ndCByZXBvcnQgYW4gZXJyb3IgYXMgdGhlIGZpcnN0IHdyaXRlIHdhcyBPSyAqLworCisgICAgICAgIHJldHVybiByZXQxICsgcmV0MjsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gcmV0MTsKKyAgfQorI2VuZGlmIC8qICFIQVZFX1dSSVRFViAqLworfQorCisjZGVmaW5lIF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEggOTkKKworLyoqCisgKiBAZGVmIF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEgKKyAqCisgKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgcGF0aCB0byBhIFVOSVggZG9tYWluIHNvY2tldCwKKyAqIHNvY2thZGRyX3VuOjpzdW5fcGF0aCBtZW1iZXIuIFBPU0lYIHJlcXVpcmVzIHRoYXQgYWxsIHN5c3RlbXMKKyAqIHN1cHBvcnQgYXQgbGVhc3QgMTAwIGJ5dGVzIGhlcmUsIGluY2x1ZGluZyB0aGUgbnVsIHRlcm1pbmF0aW9uLgorICogV2UgdXNlIDk5IGZvciB0aGUgbWF4IHZhbHVlIHRvIGFsbG93IGZvciB0aGUgbnVsLgorICoKKyAqIFdlIGNvdWxkIHByb2JhYmx5IGFsc28gZG8gc2l6ZW9mIChhZGRyLnN1bl9wYXRoKQorICogYnV0IHRoaXMgd2F5IHdlIGFyZSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zCisgKiB3aGljaCBpcyBwcm9iYWJseSBhIGdvb2QgaWRlYS4KKyAqLworCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBVTklYIGRvbWFpbiBzb2NrZXQgYXQgdGhlCisgKiBnaXZlbiBwYXRoLiAgVGhlIGNvbm5lY3Rpb24gZmQgaXMgcmV0dXJuZWQsIGFuZCBpcyBzZXQgdXAgYXMKKyAqIG5vbmJsb2NraW5nLgorICoKKyAqIFVzZXMgYWJzdHJhY3Qgc29ja2V0cyBpbnN0ZWFkIG9mIGZpbGVzeXN0ZW0tbGlua2VkIHNvY2tldHMgaWYKKyAqIHJlcXVlc3RlZCAoaXQncyBwb3NzaWJsZSBvbmx5IG9uIExpbnV4OyBzZWUgIm1hbiA3IHVuaXgiIG9uIExpbnV4KS4KKyAqIE9uIG5vbi1MaW51eCBhYnN0cmFjdCBzb2NrZXQgdXNhZ2UgYWx3YXlzIGZhaWxzLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBVTklYIGRvbWFpbiBzb2NrZXQKKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKiBAcmV0dXJucyBjb25uZWN0aW9uIGZpbGUgZGVzY3JpcHRvciBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIHNpemVfdCBwYXRoX2xlbjsKKyAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3RpbmcgdG8gdW5peCBzb2NrZXQgJXMgYWJzdHJhY3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgsIGFic3RyYWN0KTsKKworCisgIGlmICghX2RidXNfb3Blbl91bml4X3NvY2tldCAoJmZkLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGFkZHIpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBwYXRoX2xlbiA9IHN0cmxlbiAocGF0aCk7CisKKyAgaWYgKGFic3RyYWN0KQorICAgIHsKKyNpZmRlZiBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMKKyAgICAgIGFkZHIuc3VuX3BhdGhbMF0gPSAnXDAnOyAvKiB0aGlzIGlzIHdoYXQgc2F5cyAidXNlIGFic3RyYWN0IiAqLworICAgICAgcGF0aF9sZW4rKzsgLyogQWNjb3VudCBmb3IgdGhlIGV4dHJhIG51bCBieXRlIGFkZGVkIHRvIHRoZSBzdGFydCBvZiBzdW5fcGF0aCAqLworCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisgICAgICBzdHJuY3B5ICgmYWRkci5zdW5fcGF0aFsxXSwgcGF0aCwgcGF0aF9sZW4pOworICAgICAgLyogX2RidXNfdmVyYm9zZV9ieXRlcyAoYWRkci5zdW5fcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSk7ICovCisjZWxzZSAvKiBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZVxuIik7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworI2VuZGlmIC8qICEgSEFWRV9BQlNUUkFDVF9TT0NLRVRTICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHBhdGhfbGVuID4gX0RCVVNfTUFYX1NVTl9QQVRIX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiU29ja2V0IG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoYWRkci5zdW5fcGF0aCwgcGF0aCwgcGF0aF9sZW4pOworICAgIH0KKworICBpZiAoY29ubmVjdCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgX0RCVVNfU1RSVUNUX09GRlNFVCAoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyBwYXRoX2xlbikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgZmQgPSAtMTsKKworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICBmZCA9IC0xOworCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBmZDsKK30KKworLyoqCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSByZWNlcHRpb24gb2YgY3JlZGVudGlhbHMgb24gdGhlIGdpdmVuIHNvY2tldCBkdXJpbmcKKyAqIHRoZSBuZXh0IG1lc3NhZ2UgdHJhbnNtaXNzaW9uLiAgVGhpcyBpcyBvbmx5IGVmZmVjdGl2ZSBpZiB0aGUgI0xPQ0FMX0NSRURTCisgKiBzeXN0ZW0gZmVhdHVyZSBleGlzdHMsIGluIHdoaWNoIGNhc2UgdGhlIG90aGVyIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24gZG9lcworICogbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCB0byBzZW5kIHRoZSBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gZmQgc29ja2V0IG9uIHdoaWNoIHRvIGNoYW5nZSB0aGUgI0xPQ0FMX0NSRURTIGZsYWcuCisgKiBAcGFyYW0gb24gd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgI0xPQ0FMX0NSRURTIGZsYWcuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfc2V0X2xvY2FsX2NyZWRzIChpbnQgZmQsIGRidXNfYm9vbF90IG9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBUUlVFOworCisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKQorICAvKiBOT09QIGp1c3QgdG8gbWFrZSBzdXJlIG9ubHkgb25lIGNvZGVwYXRoIGlzIHVzZWQKKyAgICogICAgICBhbmQgdG8gcHJlZmVyIENNU0dDUkVECisgICAqLworI2VsaWYgZGVmaW5lZChMT0NBTF9DUkVEUykKKyAgaW50IHZhbCA9IG9uID8gMSA6IDA7CisgIGlmIChzZXRzb2Nrb3B0IChmZCwgMCwgTE9DQUxfQ1JFRFMsICZ2YWwsIHNpemVvZiAodmFsKSkgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVbmFibGUgdG8gc2V0IExPQ0FMX0NSRURTIHNvY2tldCBvcHRpb24gb24gZmQgJWRcbiIsIGZkKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIF9kYnVzX3ZlcmJvc2UgKCJMT0NBTF9DUkVEUyAlcyBmb3IgZnVydGhlciBtZXNzYWdlcyBvbiBmZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBvbiA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIGZkKTsKKyNlbmRpZgorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBhdGgsCisgKiB0aGVuIGxpc3RlbnMgb24gdGhlIHNvY2tldC4gVGhlIHNvY2tldCBpcworICogc2V0IHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIFVzZXMgYWJzdHJhY3Qgc29ja2V0cyBpbnN0ZWFkIG9mIGZpbGVzeXN0ZW0tbGlua2VkCisgKiBzb2NrZXRzIGlmIHJlcXVlc3RlZCAoaXQncyBwb3NzaWJsZSBvbmx5IG9uIExpbnV4OworICogc2VlICJtYW4gNyB1bml4IiBvbiBMaW51eCkuCisgKiBPbiBub24tTGludXggYWJzdHJhY3Qgc29ja2V0IHVzYWdlIGFsd2F5cyBmYWlscy4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQKKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgc29ja2V0IG5hbWUKKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBsaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0IChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICBzaXplX3QgcGF0aF9sZW47CisgIHVuc2lnbmVkIGludCByZXVzZWFkZHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoImxpc3RlbmluZyBvbiB1bml4IHNvY2tldCAlcyBhYnN0cmFjdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgcGF0aCwgYWJzdHJhY3QpOworCisgIGlmICghX2RidXNfb3Blbl91bml4X3NvY2tldCAoJmxpc3Rlbl9mZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKworICBfREJVU19aRVJPIChhZGRyKTsKKyAgYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgcGF0aF9sZW4gPSBzdHJsZW4gKHBhdGgpOworCisgIGlmIChhYnN0cmFjdCkKKyAgICB7CisjaWZkZWYgSEFWRV9BQlNUUkFDVF9TT0NLRVRTCisgICAgICAvKiByZW1lbWJlciB0aGF0IGFic3RyYWN0IG5hbWVzIGFyZW4ndCBudWwtdGVybWluYXRlZCBzbyB3ZSByZWx5CisgICAgICAgKiBvbiBzdW5fcGF0aCBiZWluZyBmaWxsZWQgaW4gd2l0aCB6ZXJvZXMgYWJvdmUuCisgICAgICAgKi8KKyAgICAgIGFkZHIuc3VuX3BhdGhbMF0gPSAnXDAnOyAvKiB0aGlzIGlzIHdoYXQgc2F5cyAidXNlIGFic3RyYWN0IiAqLworICAgICAgcGF0aF9sZW4rKzsgLyogQWNjb3VudCBmb3IgdGhlIGV4dHJhIG51bCBieXRlIGFkZGVkIHRvIHRoZSBzdGFydCBvZiBzdW5fcGF0aCAqLworCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoJmFkZHIuc3VuX3BhdGhbMV0sIHBhdGgsIHBhdGhfbGVuKTsKKyAgICAgIC8qIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgKGFkZHIuc3VuX3BhdGgsIHNpemVvZiAoYWRkci5zdW5fcGF0aCkpOyAqLworI2Vsc2UgLyogSEFWRV9BQlNUUkFDVF9TT0NLRVRTICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2VcbiIpOworICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisjZW5kaWYgLyogISBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBEaXNjdXNzZWQgc2VjdXJpdHkgaW1wbGljYXRpb25zIG9mIHRoaXMgd2l0aCBOYWxpbiwKKyAgICAgICAqIGFuZCB3ZSBjb3VsZG4ndCB0aGluayBvZiB3aGVyZSBpdCB3b3VsZCBraWNrIG91ciBhc3MsIGJ1dAorICAgICAgICogaXQgc3RpbGwgc2VlbXMgYSBiaXQgc3Vja3kuIEl0IGFsc28gaGFzIG5vbi1zZWN1cml0eSBzdWNrYWdlOworICAgICAgICogcmVhbGx5IHdlJ2QgcHJlZmVyIHRvIGV4aXQgaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGluIHVzZS4KKyAgICAgICAqIEJ1dCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBnb29kIHdheSB0byBkbyB0aGlzLgorICAgICAgICoKKyAgICAgICAqIEp1c3QgdG8gYmUgZXh0cmEgY2FyZWZ1bCwgSSB0aHJldyBpbiB0aGUgc3RhdCgpIC0gY2xlYXJseQorICAgICAgICogdGhlIHN0YXQoKSBjYW4ndCAqZml4KiBhbnkgc2VjdXJpdHkgaXNzdWUsIGJ1dCBpdCBhdCBsZWFzdAorICAgICAgICogYXZvaWRzIGluYWR2ZXJ0ZW50L2FjY2lkZW50YWwgZGF0YSBsb3NzLgorICAgICAgICovCisgICAgICB7CisgICAgICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgICAgIGlmIChzdGF0IChwYXRoLCAmc2IpID09IDAgJiYKKyAgICAgICAgICAgIFNfSVNTT0NLIChzYi5zdF9tb2RlKSkKKyAgICAgICAgICB1bmxpbmsgKHBhdGgpOworICAgICAgfQorCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoYWRkci5zdW5fcGF0aCwgcGF0aCwgcGF0aF9sZW4pOworICAgIH0KKworICByZXVzZWFkZHIgPSAxOworICBpZiAoc2V0c29ja29wdCAgKGxpc3Rlbl9mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmcmV1c2VhZGRyLCBzaXplb2YocmV1c2VhZGRyKSk9PS0xKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc2V0IHNvY2tldCBvcHRpb25cIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKworICBpZiAoYmluZCAobGlzdGVuX2ZkLCAoc3RydWN0IHNvY2thZGRyKikgJmFkZHIsIF9EQlVTX1NUUlVDVF9PRkZTRVQgKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpICsgcGF0aF9sZW4pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChsaXN0ZW4gKGxpc3Rlbl9mZCwgMzAgLyogYmFja2xvZyAqLykgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbGlzdGVuIG9uIHNvY2tldCBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIV9kYnVzX3NldF9sb2NhbF9jcmVkcyAobGlzdGVuX2ZkLCBUUlVFKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGVuYWJsZSBMT0NBTF9DUkVEUyBvbiBzb2NrZXQgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBjbG9zZSAobGlzdGVuX2ZkKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGxpc3Rlbl9mZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBUcnkgb3BlbmluZyB1cCB0aGUgcGVybWlzc2lvbnMsIGJ1dCBpZiB3ZSBjYW4ndCwganVzdCBnbyBhaGVhZAorICAgKiBhbmQgY29udGludWUsIG1heWJlIGl0IHdpbGwgYmUgZ29vZCBlbm91Z2guCisgICAqLworICBpZiAoIWFic3RyYWN0ICYmIGNobW9kIChwYXRoLCAwNzc3KSA8IDApCisgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBzZXQgbW9kZSAwNzc3IG9uIHNvY2tldCAlc1xuIiwKKyAgICAgICAgICAgICAgICBwYXRoKTsKKworICByZXR1cm4gbGlzdGVuX2ZkOworfQorCisvKioKKyAqIEFjcXVpcmVzIG9uZSBvciBtb3JlIHNvY2tldHMgcGFzc2VkIGluIGZyb20gc3lzdGVtZC4gVGhlIHNvY2tldHMKKyAqIGFyZSBzZXQgdG8gYmUgbm9uYmxvY2tpbmcuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0cyByZXR1cm5lZC4KKyAqCisgKiBAb2FyYW0gZmRzIHRoZSBmaWxlIGRlc2NyaXB0b3JzCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycworICovCitpbnQKK19kYnVzX2xpc3Rlbl9zeXN0ZW1kX3NvY2tldHMgKGludCAgICAgICAqKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGludCByLCBuOworICB1bnNpZ25lZCBmZDsKKyAgaW50ICpuZXdfZmRzOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG4gPSBzZF9saXN0ZW5fZmRzIChUUlVFKTsKKyAgaWYgKG4gPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoLW4pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWNxdWlyZSBzeXN0ZW1kIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yICgtbikpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobiA8PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiTm8gc29ja2V0IHJlY2VpdmVkLiIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBmb3IgKGZkID0gU0RfTElTVEVOX0ZEU19TVEFSVDsgZmQgPCBTRF9MSVNURU5fRkRTX1NUQVJUICsgbjsgZmQgKyspCisgICAgeworICAgICAgciA9IHNkX2lzX3NvY2tldCAoZmQsIEFGX1VOU1BFQywgU09DS19TVFJFQU0sIDEpOworICAgICAgaWYgKHIgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vICgtciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gdmVyaWZ5IHN5c3RlbWQgc29ja2V0IHR5cGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKC1yKSk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgIGlmICghcikKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCBzb2NrZXQgaGFzIHdyb25nIHR5cGUuIik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgIC8qIE9LLCB0aGUgZmlsZSBkZXNjcmlwdG9ycyBhcmUgYWxsIGdvb2QsIHNvIGxldCdzIHRha2UgcG9zZXNzaW9uIG9mCisgICAgIHRoZW0gdGhlbi4gKi8KKworICBuZXdfZmRzID0gZGJ1c19uZXcgKGludCwgbik7CisgIGlmICghbmV3X2ZkcykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZmlsZSBoYW5kbGUgYXJyYXkuIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIGZvciAoZmQgPSBTRF9MSVNURU5fRkRTX1NUQVJUOyBmZCA8IFNEX0xJU1RFTl9GRFNfU1RBUlQgKyBuOyBmZCArKykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3NldF9sb2NhbF9jcmVkcyAoZmQsIFRSVUUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZW5hYmxlIExPQ0FMX0NSRURTIG9uIHN5c3RlbWQgc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgbmV3X2Zkc1tmZCAtIFNEX0xJU1RFTl9GRFNfU1RBUlRdID0gZmQ7CisgICAgfQorCisgICpmZHMgPSBuZXdfZmRzOworICByZXR1cm4gbjsKKworIGZhaWw6CisKKyAgZm9yIChmZCA9IFNEX0xJU1RFTl9GRFNfU1RBUlQ7IGZkIDwgU0RfTElTVEVOX0ZEU19TVEFSVCArIG47IGZkICsrKQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgfQorCisgIGRidXNfZnJlZSAobmV3X2Zkcyk7CisgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgc29ja2V0IGFuZCBjb25uZWN0cyB0byBhIHNvY2tldCBhdCB0aGUgZ2l2ZW4gaG9zdAorICogYW5kIHBvcnQuIFRoZSBjb25uZWN0aW9uIGZkIGlzIHJldHVybmVkLCBhbmQgaXMgc2V0IHVwIGFzCisgKiBub25ibG9ja2luZy4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQKKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRvIGNvbm5lY3QgdG8KKyAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8KKyAqIEBwYXJhbSBmYW1pbHkgdGhlIGFkZHJlc3MgZmFtaWx5IHRvIGxpc3RlbiBvbiwgTlVMTCBmb3IgYWxsCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKiBAcmV0dXJucyBjb25uZWN0aW9uIGZpbGUgZGVzY3JpcHRvciBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgICAgcmV0dXJuIF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChob3N0LCBwb3J0LCBmYW1pbHksIChjb25zdCBjaGFyKilOVUxMLCBlcnJvcik7Cit9CisKK2ludAorX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBzYXZlZF9lcnJubyA9IDA7CisgIGludCBmZCA9IC0xLCByZXM7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvICphaSwgKnRtcDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX29wZW5fdGNwX3NvY2tldCAoJmZkLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgX0RCVVNfWkVSTyAoaGludHMpOworCisgIGlmICghZmFtaWx5KQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY0IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY2IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIGZhbWlseSAlcyIsIGZhbWlseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBoaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUc7CisKKyAgaWYgKChyZXMgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZhaSkpICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvb2t1cCBob3N0L3BvcnQ6IFwiJXM6JXNcIjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgZ2FpX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICB0bXAgPSBhaTsKKyAgd2hpbGUgKHRtcCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX29wZW5fc29ja2V0ICgmZmQsIHRtcC0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgICAgIGlmIChjb25uZWN0IChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgIF9kYnVzX2Nsb3NlKGZkLCBOVUxMKTsKKyAgICAgICAgICBmZCA9IC0xOworICAgICAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCBcIiVzOiVzXCIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yKHNhdmVkX2Vycm5vKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChub25jZWZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIG5vbmNlZmlsZVN0cjsKKyAgICAgIGRidXNfYm9vbF90IHJldDsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmbm9uY2VmaWxlU3RyLCBub25jZWZpbGUpOworICAgICAgcmV0ID0gX2RidXNfc2VuZF9ub25jZSAoZmQsICZub25jZWZpbGVTdHIsIGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlU3RyKTsKKworICAgICAgaWYgKCFyZXQpCisgICAgeworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGZkLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIGZkOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwYXRoLCB0aGVuIGxpc3RlbnMgb24KKyAqIHRoZSBzb2NrZXQuIFRoZSBzb2NrZXQgaXMgc2V0IHRvIGJlIG5vbmJsb2NraW5nLiAgSW4gY2FzZSBvZiBwb3J0PTAKKyAqIGEgcmFuZG9tIGZyZWUgcG9ydCBpcyB1c2VkIGFuZCByZXR1cm5lZCBpbiB0aGUgcG9ydCBwYXJhbWV0ZXIuCisgKiBJZiBpbmFkZHJfYW55IGlzIHNwZWNpZmllZCwgdGhlIGhvc3RuYW1lIGlzIGlnbm9yZWQuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0IHJldHVybmVkCisgKgorICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgbmFtZSB0byBsaXN0ZW4gb24KKyAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiwgaWYgemVybyBhIGZyZWUgcG9ydCB3aWxsIGJlIHVzZWQKKyAqIEBwYXJhbSBmYW1pbHkgdGhlIGFkZHJlc3MgZmFtaWx5IHRvIGxpc3RlbiBvbiwgTlVMTCBmb3IgYWxsCisgKiBAcGFyYW0gcmV0cG9ydCBzdHJpbmcgdG8gcmV0dXJuIHRoZSBhY3R1YWwgcG9ydCBsaXN0ZW5lZCBvbgorICogQHBhcmFtIGZkc19wIGxvY2F0aW9uIHRvIHN0b3JlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvcnMKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgdGhlIG51bWJlciBvZiBsaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9ycyBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX2xpc3Rlbl90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpyZXRwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKipmZHNfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBzYXZlZF9lcnJubzsKKyAgaW50IG5saXN0ZW5fZmQgPSAwLCAqbGlzdGVuX2ZkID0gTlVMTCwgcmVzLCBpOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWksICp0bXA7CisgIHVuc2lnbmVkIGludCByZXVzZWFkZHI7CisKKyAgKmZkc19wID0gTlVMTDsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX0RCVVNfWkVSTyAoaGludHMpOworCisgIGlmICghZmFtaWx5KQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY0IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY2IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIGZhbWlseSAlcyIsIGZhbWlseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRyB8IEFJX1BBU1NJVkU7CisKKyByZWRvX2xvb2t1cF93aXRoX3BvcnQ6CisgIGlmICgocmVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpKSAhPSAwIHx8ICFhaSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgZ2FpX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHRtcCA9IGFpOworICB3aGlsZSAodG1wKQorICAgIHsKKyAgICAgIGludCBmZCA9IC0xLCAqbmV3bGlzdGVuX2ZkOworICAgICAgaWYgKCFfZGJ1c19vcGVuX3NvY2tldCAoJmZkLCB0bXAtPmFpX2ZhbWlseSwgU09DS19TVFJFQU0sIDAsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgICAgICByZXVzZWFkZHIgPSAxOworICAgICAgaWYgKHNldHNvY2tvcHQgKGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZyZXVzZWFkZHIsIHNpemVvZihyZXVzZWFkZHIpKT09LTEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHNldCBzb2NrZXQgb3B0aW9uIFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoYmluZCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSB0bXAtPmFpX2FkZHIsIHRtcC0+YWlfYWRkcmxlbikgPCAwKQorICAgICAgICB7CisgICAgICAgICAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICBfZGJ1c19jbG9zZShmZCwgTlVMTCk7CisgICAgICAgICAgaWYgKHNhdmVkX2Vycm5vID09IEVBRERSSU5VU0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIERlcGVuZGluZyBvbiBrZXJuZWwgcG9saWN5LCBpdCBtYXkgb3IgbWF5IG5vdAorICAgICAgICAgICAgICAgICBiZSBuZWNjZXNzYXJ5IHRvIGJpbmQgdG8gYm90aCBJUHY0ICYgNiBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgc28gaWdub3JlIEVBRERSSU5VU0UgaGVyZSAqLworICAgICAgICAgICAgICB0bXAgPSB0bXAtPmFpX25leHQ7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoc2F2ZWRfZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGxpc3RlbiAoZmQsIDMwIC8qIGJhY2tsb2cgKi8pIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHNhdmVkX2Vycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsaXN0ZW4gb24gc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgbmV3bGlzdGVuX2ZkID0gZGJ1c19yZWFsbG9jKGxpc3Rlbl9mZCwgc2l6ZW9mKGludCkqKG5saXN0ZW5fZmQrMSkpOworICAgICAgaWYgKCFuZXdsaXN0ZW5fZmQpCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZmlsZSBoYW5kbGUgYXJyYXk6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGxpc3Rlbl9mZCA9IG5ld2xpc3Rlbl9mZDsKKyAgICAgIGxpc3Rlbl9mZFtubGlzdGVuX2ZkXSA9IGZkOworICAgICAgbmxpc3Rlbl9mZCsrOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKHJldHBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgLyogSWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBwb3J0LCBvciB1c2VkIDAsIHRoZW4KKyAgICAgICAgICAgICB0aGUga2VybmVsIGNob29zZXMgYSBwb3J0LiBBZnRlciB0aGUgZmlyc3QgYWRkcmVzcworICAgICAgICAgICAgIGlzIGJvdW5kIHRvLCB3ZSBuZWVkIHRvIGZvcmNlIGFsbCByZW1haW5pbmcgYWRkcmVzc2VzCisgICAgICAgICAgICAgdG8gdXNlIHRoZSBzYW1lIHBvcnQgKi8KKyAgICAgICAgICBpZiAoIXBvcnQgfHwgIXN0cmNtcChwb3J0LCAiMCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworICAgICAgICAgICAgICBzb2NrbGVuX3QgYWRkcmxlbjsKKyAgICAgICAgICAgICAgY2hhciBwb3J0YnVmWzUwXTsKKworICAgICAgICAgICAgICBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgICAgICAgICByZXN1bHQgPSBnZXRzb2NrbmFtZShmZCwgKHN0cnVjdCBzb2NrYWRkciopICZhZGRyLCAmYWRkcmxlbik7CisKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSB8fAorICAgICAgICAgICAgICAgICAgKHJlcyA9IGdldG5hbWVpbmZvICgoc3RydWN0IHNvY2thZGRyKikmYWRkciwgYWRkcmxlbiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydGJ1Ziwgc2l6ZW9mKHBvcnRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVCkpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIHBvcnQgXCIlczolc1wiOiAlcyAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgZ2FpX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZChyZXRwb3J0LCBwb3J0YnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBSZWxlYXNlIGN1cnJlbnQgYWRkcmVzcyBsaXN0ICYgcmVkbyBsb29rdXAgKi8KKyAgICAgICAgICAgICAgcG9ydCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShyZXRwb3J0KTsKKyAgICAgICAgICAgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgICAgICAgICAgICAgZ290byByZWRvX2xvb2t1cF93aXRoX3BvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQocmV0cG9ydCwgcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisgIGFpID0gTlVMTDsKKworICBpZiAoIW5saXN0ZW5fZmQpCisgICAgeworICAgICAgZXJybm8gPSBFQUREUklOVVNFOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiaW5kIHNvY2tldCBcIiVzOiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgZm9yIChpID0gMCA7IGkgPCBubGlzdGVuX2ZkIDsgaSsrKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChsaXN0ZW5fZmRbaV0sIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorCisgICpmZHNfcCA9IGxpc3Rlbl9mZDsKKworICByZXR1cm4gbmxpc3Rlbl9mZDsKKworIGZhaWxlZDoKKyAgaWYgKGFpKQorICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgIGZvciAoaSA9IDAgOyBpIDwgbmxpc3Rlbl9mZCA7IGkrKykKKyAgICBfZGJ1c19jbG9zZShsaXN0ZW5fZmRbaV0sIE5VTEwpOworICBkYnVzX2ZyZWUobGlzdGVuX2ZkKTsKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlX2NyZWRlbnRpYWxzX2J5dGUgKGludCAgICAgICAgICAgICBzZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBieXRlc193cml0dGVuOworICBjaGFyIGJ1ZlsxXSA9IHsgJ1wwJyB9OworI2lmIGRlZmluZWQoSEFWRV9DTVNHQ1JFRCkKKyAgdW5pb24geworCSAgc3RydWN0IGNtc2doZHIgaGRyOworCSAgY2hhciBjcmVkW0NNU0dfU1BBQ0UgKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSldOworICB9IGNtc2c7CisgIHN0cnVjdCBpb3ZlYyBpb3Y7CisgIHN0cnVjdCBtc2doZHIgbXNnOworICBpb3YuaW92X2Jhc2UgPSBidWY7CisgIGlvdi5pb3ZfbGVuID0gMTsKKworICBfREJVU19aRVJPKG1zZyk7CisgIG1zZy5tc2dfaW92ID0gJmlvdjsKKyAgbXNnLm1zZ19pb3ZsZW4gPSAxOworCisgIG1zZy5tc2dfY29udHJvbCA9IChjYWRkcl90KSAmY21zZzsKKyAgbXNnLm1zZ19jb250cm9sbGVuID0gQ01TR19TUEFDRSAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKTsKKyAgX0RCVVNfWkVSTyhjbXNnKTsKKyAgY21zZy5oZHIuY21zZ19sZW4gPSBDTVNHX0xFTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKTsKKyAgY21zZy5oZHIuY21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7CisgIGNtc2cuaGRyLmNtc2dfdHlwZSA9IFNDTV9DUkVEUzsKKyNlbmRpZgorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgYWdhaW46CisKKyNpZiBkZWZpbmVkKEhBVkVfQ01TR0NSRUQpCisgIGJ5dGVzX3dyaXR0ZW4gPSBzZW5kbXNnIChzZXJ2ZXJfZmQsICZtc2csIDAKKyNpZiBIQVZFX0RFQ0xfTVNHX05PU0lHTkFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8TVNHX05PU0lHTkFMCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZWxzZQorICBieXRlc193cml0dGVuID0gc2VuZCAoc2VydmVyX2ZkLCBidWYsIDEsIDAKKyNpZiBIQVZFX0RFQ0xfTVNHX05PU0lHTkFMCisgICAgICAgICAgICAgICAgICAgICAgICB8TVNHX05PU0lHTkFMCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisjZW5kaWYKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB3cml0ZSBjcmVkZW50aWFscyBieXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKGJ5dGVzX3dyaXR0ZW4gPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIndyb3RlIHplcm8gYnl0ZXMgd3JpdGluZyBjcmVkZW50aWFscyBieXRlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChieXRlc193cml0dGVuID09IDEpOworICAgICAgX2RidXNfdmVyYm9zZSAoIndyb3RlIGNyZWRlbnRpYWxzIGJ5dGVcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgd2hpY2ggbXVzdCBiZSBudWwgKGFuIGVycm9yIG9jY3VycyBvdGhlcndpc2UpLAorICogYW5kIHJlYWRzIHVuaXggY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlLiBDbGVhcnMgdGhlIGNyZWRlbnRpYWxzCisgKiBvYmplY3QsIHRoZW4gYWRkcyBwaWQvdWlkIGlmIGF2YWlsYWJsZSwgc28gYW55IHByZXZpb3VzIGNyZWRlbnRpYWxzCisgKiBzdG9yZWQgaW4gdGhlIG9iamVjdCBhcmUgbG9zdC4KKyAqCisgKiBSZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgYSBieXRlIHdhcyByZWFkLCBub3Qgd2hldGhlcgorICogd2UgZ290IHZhbGlkIGNyZWRlbnRpYWxzLiBPbiBzb21lIHN5c3RlbXMsIHN1Y2ggYXMgTGludXgsCisgKiByZWFkaW5nL3dyaXRpbmcgdGhlIGJ5dGUgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQsIGJ1dCB3ZSBkbyBpdAorICogYW55d2F5IGp1c3QgdG8gYXZvaWQgbXVsdGlwbGUgY29kZXBhdGhzLgorICoKKyAqIEZhaWxzIGlmIG5vIGJ5dGUgaXMgYXZhaWxhYmxlLCBzbyB5b3UgbXVzdCBzZWxlY3QoKSBmaXJzdC4KKyAqCisgKiBUaGUgcG9pbnQgb2YgdGhlIGJ5dGUgaXMgdGhhdCBvbiBzb21lIHN5c3RlbXMgd2UgaGF2ZSB0bworICogdXNlIHNlbmRtc2coKS9yZWN2bXNnKCkgdG8gdHJhbnNtaXQgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNsaWVudF9mZCB0aGUgY2xpZW50IGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGNyZWRlbnRpYWxzIG9iamVjdCB0byBhZGQgY2xpZW50IGNyZWRlbnRpYWxzIHRvCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgZXJyb3IgY29kZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF9jcmVkZW50aWFsc19zb2NrZXQgIChpbnQgICAgICAgICAgICAgIGNsaWVudF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgc3RydWN0IG1zZ2hkciBtc2c7CisgIHN0cnVjdCBpb3ZlYyBpb3Y7CisgIGNoYXIgYnVmOworICBkYnVzX3VpZF90IHVpZF9yZWFkOworICBkYnVzX3BpZF90IHBpZF9yZWFkOworICBpbnQgYnl0ZXNfcmVhZDsKKworI2lmZGVmIEhBVkVfQ01TR0NSRUQKKyAgdW5pb24geworICAgIHN0cnVjdCBjbXNnaGRyIGhkcjsKKyAgICBjaGFyIGNyZWRbQ01TR19TUEFDRSAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKV07CisgIH0gY21zZzsKKworI2VsaWYgZGVmaW5lZChMT0NBTF9DUkVEUykKKyAgc3RydWN0IHsKKyAgICBzdHJ1Y3QgY21zZ2hkciBoZHI7CisgICAgc3RydWN0IHNvY2tjcmVkIGNyZWQ7CisgIH0gY21zZzsKKyNlbmRpZgorCisgIHVpZF9yZWFkID0gREJVU19VSURfVU5TRVQ7CisgIHBpZF9yZWFkID0gREJVU19QSURfVU5TRVQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogVGhlIFBPU0lYIHNwZWMgY2VydGFpbmx5IGRvZXNuJ3QgcHJvbWlzZSB0aGlzLCBidXQKKyAgICogd2UgbmVlZCB0aGVzZSBhc3NlcnRpb25zIHRvIGZhaWwgYXMgc29vbiBhcyB3ZSdyZSB3cm9uZyBhYm91dAorICAgKiBpdCBzbyB3ZSBjYW4gZG8gdGhlIHBvcnRpbmcgZml4dXBzCisgICAqLworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAocGlkX3QpIDw9IHNpemVvZiAoZGJ1c19waWRfdCkpOworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAodWlkX3QpIDw9IHNpemVvZiAoZGJ1c191aWRfdCkpOworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoZ2lkX3QpIDw9IHNpemVvZiAoZGJ1c19naWRfdCkpOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChjcmVkZW50aWFscyk7CisKKyAgLyogU3lzdGVtcyBzdXBwb3J0aW5nIExPQ0FMX0NSRURTIGFyZSBjb25maWd1cmVkIHRvIGhhdmUgdGhpcyBmZWF0dXJlCisgICAqIGVuYWJsZWQgKGlmIGl0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggSEFWRV9DTVNHQ1JFRCkgcHJpb3IgYWNjZXB0aW5nCisgICAqIHRoZSBjb25uZWN0aW9uLiAgVGhlcmVmb3JlLCB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBtdXN0IGNhcnJ5IHRoZQorICAgKiBjcmVkZW50aWFscyBpbmZvcm1hdGlvbiB3aXRob3V0IGRvaW5nIGFueXRoaW5nIHNwZWNpYWwuCisgICAqLworCisgIGlvdi5pb3ZfYmFzZSA9ICZidWY7CisgIGlvdi5pb3ZfbGVuID0gMTsKKworICBfREJVU19aRVJPKG1zZyk7CisgIG1zZy5tc2dfaW92ID0gJmlvdjsKKyAgbXNnLm1zZ19pb3ZsZW4gPSAxOworCisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKSB8fCBkZWZpbmVkKExPQ0FMX0NSRURTKQorICBfREJVU19aRVJPKGNtc2cpOworICBtc2cubXNnX2NvbnRyb2wgPSAoY2FkZHJfdCkgJmNtc2c7CisgIG1zZy5tc2dfY29udHJvbGxlbiA9IENNU0dfU1BBQ0UgKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSk7CisjZW5kaWYKKworIGFnYWluOgorICBieXRlc19yZWFkID0gcmVjdm1zZyAoY2xpZW50X2ZkLCAmbXNnLCAwKTsKKworICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorCWdvdG8gYWdhaW47CisKKyAgICAgIC8qIEVBR0FJTiBvciBFV09VTERCTE9DSyB3b3VsZCBiZSB1bmV4cGVjdGVkIGhlcmUgc2luY2Ugd2Ugd291bGQKKyAgICAgICAqIG5vcm1hbGx5IG9ubHkgY2FsbCByZWFkX2NyZWRlbnRpYWxzIGlmIHRoZSBzb2NrZXQgd2FzIHJlYWR5CisgICAgICAgKiBmb3IgcmVhZGluZworICAgICAgICovCisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBjcmVkZW50aWFscyBieXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChieXRlc19yZWFkID09IDApCisgICAgeworICAgICAgLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3Mgd2UgYXJlIHVzaW5nIHJlY3Ztc2cgd3JvbmcsCisgICAgICAgKiBzbyBpcyBlc3NlbnRpYWxseSBoZXJlIGZvciBwYXJhbm9pYQorICAgICAgICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBjcmVkZW50aWFscyBieXRlICh6ZXJvLWxlbmd0aCByZWFkKSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoYnVmICE9ICdcMCcpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbHMgYnl0ZSB3YXMgbm90IG51bCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmIGRlZmluZWQoSEFWRV9DTVNHQ1JFRCkgfHwgZGVmaW5lZChMT0NBTF9DUkVEUykKKyAgaWYgKGNtc2cuaGRyLmNtc2dfbGVuIDwgQ01TR19MRU4gKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSkKKwkJICB8fCBjbXNnLmhkci5jbXNnX3R5cGUgIT0gU0NNX0NSRURTKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgZnJvbSByZWN2bXNnKCkgd2FzIG5vdCBTQ01fQ1JFRFMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlICgicmVhZCBjcmVkZW50aWFscyBieXRlXG4iKTsKKworICB7CisjaWZkZWYgU09fUEVFUkNSRUQKKyNpZmRlZiBfX09wZW5CU0RfXworICAgIHN0cnVjdCBzb2NrcGVlcmNyZWQgY3I7CisjZWxzZQorICAgIHN0cnVjdCB1Y3JlZCBjcjsKKyNlbmRpZgorICAgIGludCBjcl9sZW4gPSBzaXplb2YgKGNyKTsKKworICAgIGlmIChnZXRzb2Nrb3B0IChjbGllbnRfZmQsIFNPTF9TT0NLRVQsIFNPX1BFRVJDUkVELCAmY3IsICZjcl9sZW4pID09IDAgJiYKKwljcl9sZW4gPT0gc2l6ZW9mIChjcikpCisgICAgICB7CisJcGlkX3JlYWQgPSBjci5waWQ7CisJdWlkX3JlYWQgPSBjci51aWQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCV9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0c29ja29wdCgpIGNyZWRlbnRpYWxzLCByZXR1cm5lZCBsZW4gJWQvJWQ6ICVzXG4iLAorCQkgICAgICAgY3JfbGVuLCAoaW50KSBzaXplb2YgKGNyKSwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfQ01TR0NSRUQpCisgICAgc3RydWN0IGNtc2djcmVkICpjcmVkOworCisgICAgY3JlZCA9IChzdHJ1Y3QgY21zZ2NyZWQgKikgQ01TR19EQVRBICgmY21zZy5oZHIpOworICAgIHBpZF9yZWFkID0gY3JlZC0+Y21jcmVkX3BpZDsKKyAgICB1aWRfcmVhZCA9IGNyZWQtPmNtY3JlZF9ldWlkOworI2VsaWYgZGVmaW5lZChMT0NBTF9DUkVEUykKKyAgICBwaWRfcmVhZCA9IERCVVNfUElEX1VOU0VUOworICAgIHVpZF9yZWFkID0gY21zZy5jcmVkLnNjX3VpZDsKKyAgICAvKiBTaW5jZSB3ZSBoYXZlIGFscmVhZHkgZ290IHRoZSBjcmVkZW50aWFscyBmcm9tIHRoaXMgc29ja2V0LCB3ZSBjYW4KKyAgICAgKiBkaXNhYmxlIGl0cyBMT0NBTF9DUkVEUyBmbGFnIGlmIGl0IHdhcyBldmVyIHNldC4gKi8KKyAgICBfZGJ1c19zZXRfbG9jYWxfY3JlZHMgKGNsaWVudF9mZCwgRkFMU0UpOworI2VsaWYgZGVmaW5lZChIQVZFX0dFVFBFRVJFSUQpCisgICAgdWlkX3QgZXVpZDsKKyAgICBnaWRfdCBlZ2lkOworICAgIGlmIChnZXRwZWVyZWlkIChjbGllbnRfZmQsICZldWlkLCAmZWdpZCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgdWlkX3JlYWQgPSBldWlkOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRwZWVyZWlkKCkgY3JlZGVudGlhbHM6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRQRUVSVUNSRUQpCisgICAgdWNyZWRfdCAqIHVjcmVkID0gTlVMTDsKKyAgICBpZiAoZ2V0cGVlcnVjcmVkIChjbGllbnRfZmQsICZ1Y3JlZCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgcGlkX3JlYWQgPSB1Y3JlZF9nZXRwaWQgKHVjcmVkKTsKKyAgICAgICAgdWlkX3JlYWQgPSB1Y3JlZF9nZXRldWlkICh1Y3JlZCk7CisjaWZkZWYgSEFWRV9BRFQKKyAgICAgICAgLyogZ2VuZXJhdGUgYXVkaXQgc2Vzc2lvbiBkYXRhIGJhc2VkIG9uIHNvY2tldCB1Y3JlZCAqLworICAgICAgICBhZHRfc2Vzc2lvbl9kYXRhX3QgKmFkdGggPSBOVUxMOworICAgICAgICBhZHRfZXhwb3J0X2RhdGFfdCAqZGF0YSA9IE5VTEw7CisgICAgICAgIHNpemVfdCBzaXplID0gMDsKKyAgICAgICAgaWYgKGFkdF9zdGFydF9zZXNzaW9uICgmYWR0aCwgTlVMTCwgMCkgfHwgKGFkdGggPT0gTlVMTCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZHRfc3RhcnRfc2Vzc2lvbigpOiAlc1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkdF9zZXRfZnJvbV91Y3JlZCAoYWR0aCwgdWNyZWQsIEFEVF9ORVcpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZHRfc2V0X2Zyb21fdWNyZWQoKTogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gYWR0X2V4cG9ydF9zZXNzaW9uX2RhdGEgKGFkdGgsICZkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkdF9leHBvcnRfc2Vzc2lvbl9kYXRhKCk6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9hZHRfYXVkaXRfZGF0YSAoY3JlZGVudGlhbHMsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBmcmVlIChkYXRhKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpIGFkdF9lbmRfc2Vzc2lvbiAoYWR0aCk7CisgICAgICAgICAgfQorI2VuZGlmIC8qIEhBVkVfQURUICovCisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdldHBlZXJ1Y3JlZCgpIGNyZWRlbnRpYWxzOiAlc1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICB9CisgICAgaWYgKHVjcmVkICE9IE5VTEwpCisgICAgICB1Y3JlZF9mcmVlICh1Y3JlZCk7CisjZWxzZSAvKiAhU09fUEVFUkNSRUQgJiYgIUhBVkVfQ01TR0NSRUQgJiYgIUhBVkVfR0VUUEVFUkVJRCAmJiAhSEFWRV9HRVRQRUVSVUNSRUQgKi8KKyAgICBfZGJ1c192ZXJib3NlICgiU29ja2V0IGNyZWRlbnRpYWxzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBPU1xuIik7CisjZW5kaWYKKyAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDcmVkZW50aWFsczoiCisgICAgICAgICAgICAgICAgICIgIHBpZCAiREJVU19QSURfRk9STUFUCisgICAgICAgICAgICAgICAgICIgIHVpZCAiREJVU19VSURfRk9STUFUCisgICAgICAgICAgICAgICAgICJcbiIsCisJCSBwaWRfcmVhZCwKKwkJIHVpZF9yZWFkKTsKKworICBpZiAocGlkX3JlYWQgIT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF9waWQgKGNyZWRlbnRpYWxzLCBwaWRfcmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIGlmICh1aWRfcmVhZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZCAoY3JlZGVudGlhbHMsIHVpZF9yZWFkKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2VuZHMgYSBzaW5nbGUgbnVsIGJ5dGUgd2l0aCBvdXIgVU5JWCBjcmVkZW50aWFscyBhcyBhbmNpbGxhcnkKKyAqIGRhdGEuICBSZXR1cm5zICNUUlVFIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbi4gIE9uCisgKiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzZW5kaW5nIGNyZWRlbnRpYWxzLCBqdXN0IHdyaXRlcyBhIGJ5dGUsCisgKiBkb2Vzbid0IHNlbmQgYW55IGNyZWRlbnRpYWxzLiAgT24gc29tZSBzeXN0ZW1zLCBzdWNoIGFzIExpbnV4LAorICogcmVhZGluZy93cml0aW5nIHRoZSBieXRlIGlzbid0IGFjdHVhbGx5IHJlcXVpcmVkLCBidXQgd2UgZG8gaXQKKyAqIGFueXdheSBqdXN0IHRvIGF2b2lkIG11bHRpcGxlIGNvZGVwYXRocy4KKyAqCisgKiBGYWlscyBpZiBubyBieXRlIGNhbiBiZSB3cml0dGVuLCBzbyB5b3UgbXVzdCBzZWxlY3QoKSBmaXJzdC4KKyAqCisgKiBUaGUgcG9pbnQgb2YgdGhlIGJ5dGUgaXMgdGhhdCBvbiBzb21lIHN5c3RlbXMgd2UgaGF2ZSB0bworICogdXNlIHNlbmRtc2coKS9yZWN2bXNnKCkgdG8gdHJhbnNtaXQgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIHNlcnZlcl9mZCBmaWxlIGRlc2NyaXB0b3IgZm9yIGNvbm5lY3Rpb24gdG8gc2VydmVyCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSB3YXMgc2VudAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2VuZF9jcmVkZW50aWFsc19zb2NrZXQgIChpbnQgICAgICAgICAgICAgIHNlcnZlcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHdyaXRlX2NyZWRlbnRpYWxzX2J5dGUgKHNlcnZlcl9mZCwgZXJyb3IpKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFjY2VwdHMgYSBjb25uZWN0aW9uIG9uIGEgbGlzdGVuaW5nIHNvY2tldC4KKyAqIEhhbmRsZXMgRUlOVFIgZm9yIHlvdS4KKyAqCisgKiBUaGlzIHdpbGwgZW5hYmxlIEZEX0NMT0VYRUMgZm9yIHRoZSByZXR1cm5lZCBzb2NrZXQuCisgKgorICogQHBhcmFtIGxpc3Rlbl9mZCB0aGUgbGlzdGVuIGZpbGUgZGVzY3JpcHRvcgorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gZmQgb2YgdGhlIGNsaWVudCwgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19hY2NlcHQgIChpbnQgbGlzdGVuX2ZkKQoreworICBpbnQgY2xpZW50X2ZkOworICBzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsKKyAgc29ja2xlbl90IGFkZHJsZW47CisjaWZkZWYgSEFWRV9BQ0NFUFQ0CisgIGRidXNfYm9vbF90IGNsb2V4ZWNfZG9uZTsKKyNlbmRpZgorCisgIGFkZHJsZW4gPSBzaXplb2YgKGFkZHIpOworCisgcmV0cnk6CisKKyNpZmRlZiBIQVZFX0FDQ0VQVDQKKyAgLyogV2UgYXNzdW1lIHRoYXQgaWYgYWNjZXB0NCBpcyBhdmFpbGFibGUgU09DS19DTE9FWEVDIGlzIHRvbyAqLworICBjbGllbnRfZmQgPSBhY2NlcHQ0IChsaXN0ZW5fZmQsICZhZGRyLCAmYWRkcmxlbiwgU09DS19DTE9FWEVDKTsKKyAgY2xvZXhlY19kb25lID0gY2xpZW50X2ZkID49IDA7CisKKyAgaWYgKGNsaWVudF9mZCA8IDAgJiYgZXJybm8gPT0gRU5PU1lTKQorI2VuZGlmCisgICAgeworICAgICAgY2xpZW50X2ZkID0gYWNjZXB0IChsaXN0ZW5fZmQsICZhZGRyLCAmYWRkcmxlbik7CisgICAgfQorCisgIGlmIChjbGllbnRfZmQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImNsaWVudCBmZCAlZCBhY2NlcHRlZFxuIiwgY2xpZW50X2ZkKTsKKworI2lmZGVmIEhBVkVfQUNDRVBUNAorICBpZiAoIWNsb2V4ZWNfZG9uZSkKKyNlbmRpZgorICAgIHsKKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKGNsaWVudF9mZCk7CisgICAgfQorCisgIHJldHVybiBjbGllbnRfZmQ7Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGlzCisgKiBwcml2YXRlIHRvIHRoZSB1c2VyCisgKgorICogQHBhcmFtIGRpciB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICoqLworZGJ1c19ib29sX3QKK19kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIgKERCdXNTdHJpbmcgKmRpciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZGlyZWN0b3J5OworICBzdHJ1Y3Qgc3RhdCBzYjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBkaXJlY3RvcnkgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRpcik7CisKKyAgaWYgKHN0YXQgKGRpcmVjdG9yeSwgJnNiKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKChTX0lST1RIICYgc2Iuc3RfbW9kZSkgfHwgKFNfSVdPVEggJiBzYi5zdF9tb2RlKSB8fAorICAgICAgKFNfSVJHUlAgJiBzYi5zdF9tb2RlKSB8fCAoU19JV0dSUCAmIHNiLnN0X21vZGUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAiJXMgZGlyZWN0b3J5IGlzIG5vdCBwcml2YXRlIHRvIHRoZSB1c2VyIiwgZGlyZWN0b3J5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmlsbF91c2VyX2luZm9fZnJvbV9wYXNzd2QgKHN0cnVjdCBwYXNzd2QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1VzZXJJbmZvICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgX2RidXNfYXNzZXJ0IChwLT5wd19uYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHAtPnB3X2RpciAhPSBOVUxMKTsKKworICBpbmZvLT51aWQgPSBwLT5wd191aWQ7CisgIGluZm8tPnByaW1hcnlfZ2lkID0gcC0+cHdfZ2lkOworICBpbmZvLT51c2VybmFtZSA9IF9kYnVzX3N0cmR1cCAocC0+cHdfbmFtZSk7CisgIGluZm8tPmhvbWVkaXIgPSBfZGJ1c19zdHJkdXAgKHAtPnB3X2Rpcik7CisKKyAgaWYgKGluZm8tPnVzZXJuYW1lID09IE5VTEwgfHwKKyAgICAgIGluZm8tPmhvbWVkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmlsbF91c2VyX2luZm8gKERCdXNVc2VySW5mbyAgICAgICAqaW5mbywKKyAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnVzZXJuYW1lX2M7CisKKyAgLyogZXhhY3RseSBvbmUgb2YgdXNlcm5hbWUvdWlkIHByb3ZpZGVkICovCisgIF9kYnVzX2Fzc2VydCAodXNlcm5hbWUgIT0gTlVMTCB8fCB1aWQgIT0gREJVU19VSURfVU5TRVQpOworICBfZGJ1c19hc3NlcnQgKHVzZXJuYW1lID09IE5VTEwgfHwgdWlkID09IERCVVNfVUlEX1VOU0VUKTsKKworICBpbmZvLT51aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgaW5mby0+cHJpbWFyeV9naWQgPSBEQlVTX0dJRF9VTlNFVDsKKyAgaW5mby0+Z3JvdXBfaWRzID0gTlVMTDsKKyAgaW5mby0+bl9ncm91cF9pZHMgPSAwOworICBpbmZvLT51c2VybmFtZSA9IE5VTEw7CisgIGluZm8tPmhvbWVkaXIgPSBOVUxMOworCisgIGlmICh1c2VybmFtZSAhPSBOVUxMKQorICAgIHVzZXJuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHVzZXJuYW1lKTsKKyAgZWxzZQorICAgIHVzZXJuYW1lX2MgPSBOVUxMOworCisgIC8qIEZvciBub3cgYXNzdW1pbmcgdGhhdCB0aGUgZ2V0cHduYW0oKSBhbmQgZ2V0cHd1aWQoKSBmbGF2b3JzCisgICAqIGFyZSBhbHdheXMgc3ltbWV0cmljYWwsIGlmIG5vdCB3ZSBoYXZlIHRvIGFkZCBtb3JlIGNvbmZpZ3VyZQorICAgKiBjaGVja3MKKyAgICovCisKKyNpZiBkZWZpbmVkIChIQVZFX1BPU0lYX0dFVFBXTkFNX1IpIHx8IGRlZmluZWQgKEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUikKKyAgeworICAgIHN0cnVjdCBwYXNzd2QgKnA7CisgICAgaW50IHJlc3VsdDsKKyAgICBzaXplX3QgYnVmbGVuOworICAgIGNoYXIgKmJ1ZjsKKyAgICBzdHJ1Y3QgcGFzc3dkIHBfc3RyOworCisgICAgLyogcmV0cmlldmUgbWF4aW11bSBuZWVkZWQgc2l6ZSBmb3IgYnVmICovCisgICAgYnVmbGVuID0gc3lzY29uZiAoX1NDX0dFVFBXX1JfU0laRV9NQVgpOworCisgICAgLyogc3lzY29uZiBhY3R1YWxseSByZXR1cm5zIGEgbG9uZywgYnV0IGV2ZXJ5dGhpbmcgZWxzZSBleHBlY3RzIHNpemVfdCwKKyAgICAgKiBzbyBqdXN0IHJlY2FzdCBoZXJlLgorICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MDYxCisgICAgICovCisgICAgaWYgKChsb25nKSBidWZsZW4gPD0gMCkKKyAgICAgIGJ1ZmxlbiA9IDEwMjQ7CisKKyAgICByZXN1bHQgPSAtMTsKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKyAgICAgICAgYnVmID0gZGJ1c19tYWxsb2MgKGJ1Zmxlbik7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgcCA9IE5VTEw7CisjaWZkZWYgSEFWRV9QT1NJWF9HRVRQV05BTV9SCisgICAgICAgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgICAgICAgcmVzdWx0ID0gZ2V0cHd1aWRfciAodWlkLCAmcF9zdHIsIGJ1ZiwgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlc3VsdCA9IGdldHB3bmFtX3IgKHVzZXJuYW1lX2MsICZwX3N0ciwgYnVmLCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnApOworI2Vsc2UKKyAgICAgICAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICAgICAgICBwID0gZ2V0cHd1aWRfciAodWlkLCAmcF9zdHIsIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHAgPSBnZXRwd25hbV9yICh1c2VybmFtZV9jLCAmcF9zdHIsIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyNlbmRpZiAvKiAhSEFWRV9QT1NJWF9HRVRQV05BTV9SICovCisgICAgICAgIC8vVHJ5IGEgYmlnZ2VyIGJ1ZmZlciBpZiBFUkFOR0Ugd2FzIHJldHVybmVkCisgICAgICAgIGlmIChyZXN1bHQgPT0gRVJBTkdFICYmIGJ1ZmxlbiA8IDUxMiAqIDEwMjQpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICAgICAgYnVmbGVuICo9IDI7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorICAgIGlmIChyZXN1bHQgPT0gMCAmJiBwID09ICZwX3N0cikKKyAgICAgIHsKKyAgICAgICAgaWYgKCFmaWxsX3VzZXJfaW5mb19mcm9tX3Bhc3N3ZCAocCwgaW5mbywgZXJyb3IpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXIgXCIlc1wiIHVua25vd24gb3Igbm8gbWVtb3J5IHRvIGFsbG9jYXRlIHBhc3N3b3JkIGVudHJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWVfYyA/IHVzZXJuYW1lX2MgOiAiPz8/Iik7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2VyICVzIHVua25vd25cbiIsIHVzZXJuYW1lX2MgPyB1c2VybmFtZV9jIDogIj8/PyIpOworICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorI2Vsc2UgLyogISBIQVZFX0dFVFBXTkFNX1IgKi8KKyAgeworICAgIC8qIEkgZ3Vlc3Mgd2UncmUgc2NyZXdlZCBvbiB0aHJlYWQgc2FmZXR5IGhlcmUgKi8KKyAgICBzdHJ1Y3QgcGFzc3dkICpwOworCisgICAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICAgIHAgPSBnZXRwd3VpZCAodWlkKTsKKyAgICBlbHNlCisgICAgICBwID0gZ2V0cHduYW0gKHVzZXJuYW1lX2MpOworCisgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCFmaWxsX3VzZXJfaW5mb19mcm9tX3Bhc3N3ZCAocCwgaW5mbywgZXJyb3IpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyIFwiJXNcIiB1bmtub3duIG9yIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSBwYXNzd29yZCBlbnRyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lX2MgPyB1c2VybmFtZV9jIDogIj8/PyIpOworICAgICAgICBfZGJ1c192ZXJib3NlICgiVXNlciAlcyB1bmtub3duXG4iLCB1c2VybmFtZV9jID8gdXNlcm5hbWVfYyA6ICI/Pz8iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisjZW5kaWYgIC8qICEgSEFWRV9HRVRQV05BTV9SICovCisKKyAgLyogRmlsbCB0aGlzIGluIHNvIHdlIGNhbiB1c2UgaXQgdG8gZ2V0IGdyb3VwcyAqLworICB1c2VybmFtZV9jID0gaW5mby0+dXNlcm5hbWU7CisKKyNpZmRlZiBIQVZFX0dFVEdST1VQTElTVAorICB7CisgICAgZ2lkX3QgKmJ1ZjsKKyAgICBpbnQgYnVmX2NvdW50OworICAgIGludCBpOworICAgIGludCBpbml0aWFsX2J1Zl9jb3VudDsKKworICAgIGluaXRpYWxfYnVmX2NvdW50ID0gMTc7CisgICAgYnVmX2NvdW50ID0gaW5pdGlhbF9idWZfY291bnQ7CisgICAgYnVmID0gZGJ1c19uZXcgKGdpZF90LCBidWZfY291bnQpOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgaWYgKGdldGdyb3VwbGlzdCAodXNlcm5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5wcmltYXJ5X2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICBidWYsICZidWZfY291bnQpIDwgMCkKKyAgICAgIHsKKyAgICAgICAgZ2lkX3QgKm5ldzsKKyAgICAgICAgLyogUHJlc3VtZWQgY2F1c2Ugb2YgbmVnYXRpdmUgcmV0dXJuIGNvZGU6IGJ1ZiBoYXMgaW5zdWZmaWNpZW50CisgICAgICAgICAgIGVudHJpZXMgdG8gaG9sZCB0aGUgZW50aXJlIGdyb3VwIGxpc3QuIFRoZSBMaW51eCBiZWhhdmlvciBpbiB0aGlzCisgICAgICAgICAgIGNhc2UgaXMgdG8gcGFzcyBiYWNrIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGdyb3VwcyBpbiBidWZfY291bnQsIGJ1dAorICAgICAgICAgICBvbiBNYWMgT1MgWCAxMC41LCBidWZfY291bnQgaXMgdW5oZWxwZnVsbHkgbGVmdCBhbG9uZS4KKyAgICAgICAgICAgU28gYXMgYSBoYWNrLCB0cnkgdG8gaGVscCBvdXQgYSBiaXQgYnkgZ3Vlc3NpbmcgYSBsYXJnZXIKKyAgICAgICAgICAgbnVtYmVyIG9mIGdyb3Vwcywgd2l0aGluIHJlYXNvbi4uIG1pZ2h0IHN0aWxsIGZhaWwsIG9mIGNvdXJzZSwKKyAgICAgICAgICAgYnV0IHdlIGNhbiBhdCBsZWFzdCBwcmludCBhIG1vcmUgaW5mb3JtYXRpdmUgbWVzc2FnZS4gIEkgbG9va2VkIHVwCisgICAgICAgICAgIHRoZSAicmlnaHQgd2F5IiB0byBkbyB0aGlzIGJ5IGRvd25sb2FkaW5nIEFwcGxlJ3Mgb3duIHNvdXJjZSBjb2RlCisgICAgICAgICAgIGZvciB0aGUgImlkIiBjb21tYW5kLCBhbmQgaXQgdHVybnMgb3V0IHRoYXQgdGhleSB1c2UgYW4KKyAgICAgICAgICAgdW5kb2N1bWVudGVkIGxpYnJhcnkgZnVuY3Rpb24gZ2V0Z3JvdXBsaXN0XzIgKCEpIHdoaWNoIGlzIG5vdAorICAgICAgICAgICBkZWNsYXJlZCBpbiBhbnkgaGVhZGVyIGluIC91c3IvaW5jbHVkZSAoISEpLiBUaGF0IGRpZCBub3Qgc2VlbQorICAgICAgICAgICBsaWtlIHRoZSB3YXkgdG8gZ28gaGVyZS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGJ1Zl9jb3VudCA9PSBpbml0aWFsX2J1Zl9jb3VudCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBidWZfY291bnQgKj0gMTY7IC8qIFJldHJ5IHdpdGggYW4gYXJiaXRyYXJpbHkgc2NhbGVkLXVwIGFycmF5ICovCisgICAgICAgICAgfQorICAgICAgICBuZXcgPSBkYnVzX3JlYWxsb2MgKGJ1ZiwgYnVmX2NvdW50ICogc2l6ZW9mIChidWZbMF0pKTsKKyAgICAgICAgaWYgKG5ldyA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorCisgICAgICAgIGJ1ZiA9IG5ldzsKKworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGlmIChnZXRncm91cGxpc3QgKHVzZXJuYW1lX2MsIGluZm8tPnByaW1hcnlfZ2lkLCBidWYsICZidWZfY291bnQpIDwgMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJJdCBhcHBlYXJzIHRoYXQgdXNlcm5hbWUgXCIlc1wiIGlzIGluIG1vcmUgdGhhbiAlZCBncm91cHMuXG5Qcm9jZWVkaW5nIHdpdGgganVzdCB0aGUgZmlyc3QgJWQgZ3JvdXBzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWVfYywgYnVmX2NvdW50LCBidWZfY291bnQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgZ3JvdXBzIGZvciB1c2VybmFtZSBcIiVzXCIgcHJpbWFyeSBHSUQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0dJRF9GT1JNQVQgIjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lX2MsIGluZm8tPnByaW1hcnlfZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBpbmZvLT5ncm91cF9pZHMgPSBkYnVzX25ldyAoZGJ1c19naWRfdCwgYnVmX2NvdW50KTsKKyAgICBpZiAoaW5mby0+Z3JvdXBfaWRzID09IE5VTEwpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9jb3VudDsgKytpKQorICAgICAgaW5mby0+Z3JvdXBfaWRzW2ldID0gYnVmW2ldOworCisgICAgaW5mby0+bl9ncm91cF9pZHMgPSBidWZfY291bnQ7CisKKyAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgIH0KKyNlbHNlICAvKiBIQVZFX0dFVEdST1VQTElTVCAqLworICB7CisgICAgLyogV2UganVzdCBnZXQgdGhlIG9uZSBncm91cCBJRCAqLworICAgIGluZm8tPmdyb3VwX2lkcyA9IGRidXNfbmV3IChkYnVzX2dpZF90LCAxKTsKKyAgICBpZiAoaW5mby0+Z3JvdXBfaWRzID09IE5VTEwpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIGluZm8tPm5fZ3JvdXBfaWRzID0gMTsKKworICAgIChpbmZvLT5ncm91cF9pZHMpWzBdID0gaW5mby0+cHJpbWFyeV9naWQ7CisgIH0KKyNlbmRpZiAvKiBIQVZFX0dFVEdST1VQTElTVCAqLworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBHZXRzIHVzZXIgaW5mbyBmb3IgdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIEBwYXJhbSBpbmZvIHVzZXIgaW5mbyBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9pbmZvX2ZpbGwgKERCdXNVc2VySW5mbyAgICAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIHJldHVybiBmaWxsX3VzZXJfaW5mbyAoaW5mbywgREJVU19VSURfVU5TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsIGVycm9yKTsKK30KKworLyoqCisgKiBHZXRzIHVzZXIgaW5mbyBmb3IgdGhlIGdpdmVuIHVzZXIgSUQuCisgKgorICogQHBhcmFtIGluZm8gdXNlciBpbmZvIG9iamVjdCB0byBpbml0aWFsaXplCisgKiBAcGFyYW0gdWlkIHRoZSB1c2VyIElECisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyX2luZm9fZmlsbF91aWQgKERCdXNVc2VySW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAqZXJyb3IpCit7CisgIHJldHVybiBmaWxsX3VzZXJfaW5mbyAoaW5mbywgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVycm9yKTsKK30KKworLyoqCisgKiBBZGRzIHRoZSBjcmVkZW50aWFscyBvZiB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHRoZQorICogcGFzc2VkLWluIGNyZWRlbnRpYWxzIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gYWRkIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5OyBkb2VzIG5vdCBwcm9wZXJseSByb2xsIGJhY2sgb24gZmFpbHVyZSwgc28gb25seSBzb21lIGNyZWRlbnRpYWxzIG1heSBoYXZlIGJlZW4gYWRkZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscykKK3sKKyAgLyogVGhlIFBPU0lYIHNwZWMgY2VydGFpbmx5IGRvZXNuJ3QgcHJvbWlzZSB0aGlzLCBidXQKKyAgICogd2UgbmVlZCB0aGVzZSBhc3NlcnRpb25zIHRvIGZhaWwgYXMgc29vbiBhcyB3ZSdyZSB3cm9uZyBhYm91dAorICAgKiBpdCBzbyB3ZSBjYW4gZG8gdGhlIHBvcnRpbmcgZml4dXBzCisgICAqLworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAocGlkX3QpIDw9IHNpemVvZiAoZGJ1c19waWRfdCkpOworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAodWlkX3QpIDw9IHNpemVvZiAoZGJ1c191aWRfdCkpOworICBfZGJ1c19hc3NlcnQgKHNpemVvZiAoZ2lkX3QpIDw9IHNpemVvZiAoZGJ1c19naWRfdCkpOworCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfcGlkKGNyZWRlbnRpYWxzLCBfZGJ1c19nZXRwaWQoKSkpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZChjcmVkZW50aWFscywgX2RidXNfZ2V0ZXVpZCgpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kIHRvIHRoZSBzdHJpbmcgdGhlIGlkZW50aXR5IHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSB3aGVuIHdlCisgKiBhdXRoZW50aWNhdGUsIG9uIFVOSVggdGhpcyBpcyB0aGUgY3VycmVudCBwcm9jZXNzIFVJRCBhbmQgb24KKyAqIFdpbmRvd3Mgc29tZXRoaW5nIGVsc2UsIHByb2JhYmx5IGEgV2luZG93cyBTSUQgc3RyaW5nLiAgTm8gZXNjYXBpbmcKKyAqIGlzIHJlcXVpcmVkLCB0aGF0IGlzIGRvbmUgaW4gZGJ1cy1hdXRoLmMuIFRoZSB1c2VybmFtZSBoZXJlCisgKiBuZWVkIG5vdCBiZSBhbnl0aGluZyBodW1hbi1yZWFkYWJsZSwgaXQgY2FuIGJlIHRoZSBtYWNoaW5lLXJlYWRhYmxlCisgKiBmb3JtIGkuZS4gYSB1c2VyIGlkLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzIChEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgKHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0ZXVpZCAoKSk7Cit9CisKKy8qKgorICogR2V0cyBvdXIgcHJvY2VzcyBJRAorICogQHJldHVybnMgcHJvY2VzcyBJRAorICovCitkYnVzX3BpZF90CitfZGJ1c19nZXRwaWQgKHZvaWQpCit7CisgIHJldHVybiBnZXRwaWQgKCk7Cit9CisKKy8qKiBHZXRzIG91ciBVSUQKKyAqIEByZXR1cm5zIHByb2Nlc3MgVUlECisgKi8KK2RidXNfdWlkX3QKK19kYnVzX2dldHVpZCAodm9pZCkKK3sKKyAgcmV0dXJuIGdldHVpZCAoKTsKK30KKworLyoqIEdldHMgb3VyIGVmZmVjdGl2ZSBVSUQKKyAqIEByZXR1cm5zIHByb2Nlc3MgZWZmZWN0aXZlIFVJRAorICovCitkYnVzX3VpZF90CitfZGJ1c19nZXRldWlkICh2b2lkKQoreworICByZXR1cm4gZ2V0ZXVpZCAoKTsKK30KKworLyoqCisgKiBUaGUgb25seSByZWFzb24gdGhpcyBpcyBzZXBhcmF0ZSBmcm9tIF9kYnVzX2dldHBpZCgpIGlzIHRvIGFsbG93IGl0CisgKiBvbiBXaW5kb3dzIGZvciBsb2dnaW5nIGJ1dCBub3QgZm9yIG90aGVyIHB1cnBvc2VzLgorICoKKyAqIEByZXR1cm5zIHByb2Nlc3MgSUQgdG8gcHV0IGluIGxvZyBtZXNzYWdlcworICovCit1bnNpZ25lZCBsb25nCitfZGJ1c19waWRfZm9yX2xvZyAodm9pZCkKK3sKKyAgcmV0dXJuIGdldHBpZCAoKTsKK30KKworLyoqCisgKiBHZXRzIGEgVUlEIGZyb20gYSBVSUQgc3RyaW5nLgorICoKKyAqIEBwYXJhbSB1aWRfc3RyIHRoZSBVSUQgaW4gc3RyaW5nIGZvcm0KKyAqIEBwYXJhbSB1aWQgVUlEIHRvIGZpbGwgaW4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHN1Y2Nlc3NmdWxseSBmaWxsZWQgaW4gVUlECisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91aWQgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqdWlkX3N0ciwKKyAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgICAgICp1aWQpCit7CisgIGludCBlbmQ7CisgIGxvbmcgdmFsOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodWlkX3N0cikgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiVUlEIHN0cmluZyB3YXMgemVybyBsZW5ndGhcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB2YWwgPSAtMTsKKyAgZW5kID0gMDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICh1aWRfc3RyLCAwLCAmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb3VsZCBub3QgcGFyc2Ugc3RyaW5nIGFzIGEgVUlEXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGVuZCAhPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodWlkX3N0cikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoInN0cmluZyBjb250YWluZWQgdHJhaWxpbmcgc3R1ZmYgYWZ0ZXIgVUlEXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnVpZCA9IHZhbDsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmICFEQlVTX1VTRV9TWU5DCitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKGF0b21pYyk7CisjZW5kaWYKKworLyoqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgYW4gaW50ZWdlcgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBpbmNyZW1lbnQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBiZWZvcmUgaW5jcmVtZW50aW5nCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2luYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworI2lmIERCVVNfVVNFX1NZTkMKKyAgcmV0dXJuIF9fc3luY19hZGRfYW5kX2ZldGNoKCZhdG9taWMtPnZhbHVlLCAxKS0xOworI2Vsc2UKKyAgZGJ1c19pbnQzMl90IHJlczsKKyAgX0RCVVNfTE9DSyAoYXRvbWljKTsKKyAgcmVzID0gYXRvbWljLT52YWx1ZTsKKyAgYXRvbWljLT52YWx1ZSArPSAxOworICBfREJVU19VTkxPQ0sgKGF0b21pYyk7CisgIHJldHVybiByZXM7CisjZW5kaWYKK30KKworLyoqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudCBhbiBpbnRlZ2VyCisgKgorICogQHBhcmFtIGF0b21pYyBwb2ludGVyIHRvIHRoZSBpbnRlZ2VyIHRvIGRlY3JlbWVudAorICogQHJldHVybnMgdGhlIHZhbHVlIGJlZm9yZSBkZWNyZW1lbnRpbmcKKyAqLworZGJ1c19pbnQzMl90CitfZGJ1c19hdG9taWNfZGVjIChEQnVzQXRvbWljICphdG9taWMpCit7CisjaWYgREJVU19VU0VfU1lOQworICByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2goJmF0b21pYy0+dmFsdWUsIDEpKzE7CisjZWxzZQorICBkYnVzX2ludDMyX3QgcmVzOworCisgIF9EQlVTX0xPQ0sgKGF0b21pYyk7CisgIHJlcyA9IGF0b21pYy0+dmFsdWU7CisgIGF0b21pYy0+dmFsdWUgLT0gMTsKKyAgX0RCVVNfVU5MT0NLIChhdG9taWMpOworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKiogR2V0cyBvdXIgR0lECisgKiBAcmV0dXJucyBwcm9jZXNzIEdJRAorICovCitkYnVzX2dpZF90CitfZGJ1c19nZXRnaWQgKHZvaWQpCit7CisgIHJldHVybiBnZXRnaWQgKCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBXcmFwcGVyIGZvciBwb2xsKCkuCisgKgorICogQHBhcmFtIGZkcyB0aGUgZmlsZSBkZXNjcmlwdG9ycyB0byBwb2xsCisgKiBAcGFyYW0gbl9mZHMgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSBhcnJheQorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIHRpbWVvdXQgb3IgLTEgZm9yIGluZmluaXRlCisgKiBAcmV0dXJucyBudW1iZXJzIG9mIGZkcyB3aXRoIHJldmVudHMsIG9yIDwwIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfcG9sbCAoREJ1c1BvbGxGRCAqZmRzLAorICAgICAgICAgICAgaW50ICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICBpbnQgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoQlJPS0VOX1BPTEwpCisgIC8qIFRoaXMgYmlnIHRoaW5nIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBhbmQgc2hvdWxkIGdldCBvcHRpbWl6ZWQKKyAgICogb3V0IG9mIGV4aXN0ZW5jZS4gU28gaXQncyBtb3JlIHJvYnVzdCB0aGFuIGEgY29uZmlndXJlIGNoZWNrIGF0CisgICAqIG5vIGNvc3QuCisgICAqLworICBpZiAoX0RCVVNfUE9MTElOID09IFBPTExJTiAmJgorICAgICAgX0RCVVNfUE9MTFBSSSA9PSBQT0xMUFJJICYmCisgICAgICBfREJVU19QT0xMT1VUID09IFBPTExPVVQgJiYKKyAgICAgIF9EQlVTX1BPTExFUlIgPT0gUE9MTEVSUiAmJgorICAgICAgX0RCVVNfUE9MTEhVUCA9PSBQT0xMSFVQICYmCisgICAgICBfREJVU19QT0xMTlZBTCA9PSBQT0xMTlZBTCAmJgorICAgICAgc2l6ZW9mIChEQnVzUG9sbEZEKSA9PSBzaXplb2YgKHN0cnVjdCBwb2xsZmQpICYmCisgICAgICBfREJVU19TVFJVQ1RfT0ZGU0VUIChEQnVzUG9sbEZELCBmZCkgPT0KKyAgICAgIF9EQlVTX1NUUlVDVF9PRkZTRVQgKHN0cnVjdCBwb2xsZmQsIGZkKSAmJgorICAgICAgX0RCVVNfU1RSVUNUX09GRlNFVCAoREJ1c1BvbGxGRCwgZXZlbnRzKSA9PQorICAgICAgX0RCVVNfU1RSVUNUX09GRlNFVCAoc3RydWN0IHBvbGxmZCwgZXZlbnRzKSAmJgorICAgICAgX0RCVVNfU1RSVUNUX09GRlNFVCAoREJ1c1BvbGxGRCwgcmV2ZW50cykgPT0KKyAgICAgIF9EQlVTX1NUUlVDVF9PRkZTRVQgKHN0cnVjdCBwb2xsZmQsIHJldmVudHMpKQorICAgIHsKKyAgICAgIHJldHVybiBwb2xsICgoc3RydWN0IHBvbGxmZCopIGZkcywKKyAgICAgICAgICAgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBEQnVzUG9sbEZEIHRvIGFuIGFycmF5IG9mCisgICAgICAgKiBzdHJ1Y3QgcG9sbGZkLCBwb2xsLCBhbmQgY29udmVydCBiYWNrLgorICAgICAgICovCisgICAgICBfZGJ1c193YXJuICgiZGlkbid0IGltcGxlbWVudCBwb2xsKCkgcHJvcGVybHkgZm9yIHRoaXMgc3lzdGVtIHlldFxuIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorI2Vsc2UgLyogISBIQVZFX1BPTEwgKi8KKworICBmZF9zZXQgcmVhZF9zZXQsIHdyaXRlX3NldCwgZXJyX3NldDsKKyAgaW50IG1heF9mZCA9IDA7CisgIGludCBpOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgaW50IHJlYWR5OworCisgIEZEX1pFUk8gKCZyZWFkX3NldCk7CisgIEZEX1pFUk8gKCZ3cml0ZV9zZXQpOworICBGRF9aRVJPICgmZXJyX3NldCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgeworICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTElOKQorCUZEX1NFVCAoZmRwLT5mZCwgJnJlYWRfc2V0KTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKwlGRF9TRVQgKGZkcC0+ZmQsICZ3cml0ZV9zZXQpOworCisgICAgICBGRF9TRVQgKGZkcC0+ZmQsICZlcnJfc2V0KTsKKworICAgICAgbWF4X2ZkID0gTUFYIChtYXhfZmQsIGZkcC0+ZmQpOworICAgIH0KKworICB0di50dl9zZWMgPSB0aW1lb3V0X21pbGxpc2Vjb25kcyAvIDEwMDA7CisgIHR2LnR2X3VzZWMgPSAodGltZW91dF9taWxsaXNlY29uZHMgJSAxMDAwKSAqIDEwMDA7CisKKyAgcmVhZHkgPSBzZWxlY3QgKG1heF9mZCArIDEsICZyZWFkX3NldCwgJndyaXRlX3NldCwgJmVycl9zZXQsCisgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyA8IDAgPyBOVUxMIDogJnR2KTsKKworICBpZiAocmVhZHkgPiAwKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorCXsKKwkgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisKKwkgIGZkcC0+cmV2ZW50cyA9IDA7CisKKwkgIGlmIChGRF9JU1NFVCAoZmRwLT5mZCwgJnJlYWRfc2V0KSkKKwkgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworCSAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmd3JpdGVfc2V0KSkKKwkgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisKKwkgIGlmIChGRF9JU1NFVCAoZmRwLT5mZCwgJmVycl9zZXQpKQorCSAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTEVSUjsKKwl9CisgICAgfQorCisgIHJldHVybiByZWFkeTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldCBjdXJyZW50IHRpbWUsIGFzIGluIGdldHRpbWVvZmRheSgpLiBVc2UgdGhlIG1vbm90b25pYyBjbG9jayBpZgorICogYXZhaWxhYmxlLCB0byBhdm9pZCBwcm9ibGVtcyB3aGVuIHRoZSBzeXN0ZW0gdGltZSBjaGFuZ2VzLgorICoKKyAqIEBwYXJhbSB0dl9zZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2Ygc2Vjb25kcworICogQHBhcmFtIHR2X3VzZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgbWljcm9zZWNvbmRzICh0aG91c2FuZHRocykKKyAqLwordm9pZAorX2RidXNfZ2V0X2N1cnJlbnRfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYykKK3sKKyAgc3RydWN0IHRpbWV2YWwgdDsKKworI2lmZGVmIEhBVkVfTU9OT1RPTklDX0NMT0NLCisgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgY2xvY2tfZ2V0dGltZSAoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHRzLnR2X3NlYzsKKyAgaWYgKHR2X3VzZWMpCisgICAgKnR2X3VzZWMgPSB0cy50dl9uc2VjIC8gMTAwMDsKKyNlbHNlCisgIGdldHRpbWVvZmRheSAoJnQsIE5VTEwpOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHQudHZfc2VjOworICBpZiAodHZfdXNlYykKKyAgICAqdHZfdXNlYyA9IHQudHZfdXNlYzsKKyNlbmRpZgorfQorCisvKioKKyAqIENyZWF0ZXMgYSBkaXJlY3Rvcnk7IHN1Y2NlZWRzIGlmIHRoZSBkaXJlY3RvcnkKKyAqIGlzIGNyZWF0ZWQgb3IgYWxyZWFkeSBleGlzdGVkLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChta2RpciAoZmlsZW5hbWVfYywgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFRVhJU1QpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAqCisgKiBAdG9kbyBpdCBtaWdodCBiZSBjdXRlIHRvIGNvbGxhcHNlIG11bHRpcGxlICcvJyBzdWNoIGFzICJmb28vLyIKKyAqIGNvbmNhdCAiLy9iYXIiCisgKgorICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IG5hbWUKKyAqIEBwYXJhbSBuZXh0X2NvbXBvbmVudCB0aGUgZmlsZW5hbWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKERCdXNTdHJpbmcgICAgICAgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKm5leHRfY29tcG9uZW50KQoreworICBkYnVzX2Jvb2xfdCBkaXJfZW5kc19pbl9zbGFzaDsKKyAgZGJ1c19ib29sX3QgZmlsZV9zdGFydHNfd2l0aF9zbGFzaDsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikgPT0gMCB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5leHRfY29tcG9uZW50KSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGRpcl9lbmRzX2luX3NsYXNoID0gJy8nID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpIC0gMSk7CisKKyAgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCA9ICcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKG5leHRfY29tcG9uZW50LCAwKTsKKworICBpZiAoZGlyX2VuZHNfaW5fc2xhc2ggJiYgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoZGlyLCAxKTsKKyAgICB9CisgIGVsc2UgaWYgKCEoZGlyX2VuZHNfaW5fc2xhc2ggfHwgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRpciwgJy8nKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKG5leHRfY29tcG9uZW50LCAwLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikpOworfQorCisvKiogbmFub3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgICAxMDAwMDAwMDAwCisvKiogbWljcm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EICAgICAgMTAwMDAwMAorLyoqIG1pbGxpc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAKKy8qKiBuYW5vc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCAgMTAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfTUlMTElTRUNPTkQgMTAwMAorCisvKioKKyAqIFNsZWVwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBtaWxsaXNlY29uZHMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICovCit2b2lkCitfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKGludCBtaWxsaXNlY29uZHMpCit7CisjaWZkZWYgSEFWRV9OQU5PU0xFRVAKKyAgc3RydWN0IHRpbWVzcGVjIHJlcTsKKyAgc3RydWN0IHRpbWVzcGVjIHJlbTsKKworICByZXEudHZfc2VjID0gbWlsbGlzZWNvbmRzIC8gTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQ7CisgIHJlcS50dl9uc2VjID0gKG1pbGxpc2Vjb25kcyAlIE1JTExJU0VDT05EU19QRVJfU0VDT05EKSAqIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORDsKKyAgcmVtLnR2X3NlYyA9IDA7CisgIHJlbS50dl9uc2VjID0gMDsKKworICB3aGlsZSAobmFub3NsZWVwICgmcmVxLCAmcmVtKSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgcmVxID0gcmVtOworI2VsaWYgZGVmaW5lZCAoSEFWRV9VU0xFRVApCisgIHVzbGVlcCAobWlsbGlzZWNvbmRzICogTUlDUk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCk7CisjZWxzZSAvKiAhIEhBVkVfVVNMRUVQICovCisgIHNsZWVwIChNQVggKG1pbGxpc2Vjb25kcyAvIDEwMDAsIDEpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlcyAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2J5dGVzKQoreworICBpbnQgb2xkX2xlbjsKKyAgY2hhciAqcDsKKworICBvbGRfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgbl9ieXRlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9sZF9sZW4sIG5fYnl0ZXMpOworCisgIF9kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlc19idWZmZXIgKHAsIG5fYnl0ZXMpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHJhbmRvbSBieXRlcywKKyAqIHVzaW5nIHRoZSBiZXN0IG1lY2hhbmlzbSB3ZSBjYW4gY29tZSB1cCB3aXRoLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gYXBwZW5kIHRvIHN0cmluZworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMpCit7CisgIGludCBvbGRfbGVuOworICBpbnQgZmQ7CisKKyAgLyogRkFMU0UgcmV0dXJuIG1lYW5zICJubyBtZW1vcnkiLCBpZiBpdCBjb3VsZAorICAgKiBtZWFuIHNvbWV0aGluZyBlbHNlIHRoZW4gd2UnZCBuZWVkIHRvIHJldHVybgorICAgKiBhIERCdXNFcnJvci4gU28gd2UgYWx3YXlzIGZhbGwgYmFjayB0byBwc2V1ZG9yYW5kb20KKyAgICogaWYgdGhlIEkvTyBmYWlscy4KKyAgICovCisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICBmZCA9IC0xOworCisgIC8qIG5vdGUsIHVyYW5kb20gb24gbGludXggd2lsbCBmYWxsIGJhY2sgdG8gcHNldWRvcmFuZG9tICovCisgIGZkID0gb3BlbiAoIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkKKyAgICByZXR1cm4gX2RidXNfZ2VuZXJhdGVfcHNldWRvcmFuZG9tX2J5dGVzIChzdHIsIG5fYnl0ZXMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIvZGV2L3VyYW5kb20gZmQgJWQgb3BlbmVkXG4iLCBmZCk7CisKKyAgaWYgKF9kYnVzX3JlYWQgKGZkLCBzdHIsIG5fYnl0ZXMpICE9IG5fYnl0ZXMpCisgICAgeworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9sZF9sZW4pOworICAgICAgcmV0dXJuIF9kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlcyAoc3RyLCBuX2J5dGVzKTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlYWQgJWQgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb21cbiIsCisgICAgICAgICAgICAgICAgIG5fYnl0ZXMpOworCisgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRXhpdCB0aGUgcHJvY2VzcywgcmV0dXJuaW5nIHRoZSBnaXZlbiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY29kZSB0aGUgZXhpdCBjb2RlCisgKi8KK3ZvaWQKK19kYnVzX2V4aXQgKGludCBjb2RlKQoreworICBfZXhpdCAoY29kZSk7Cit9CisKKy8qKgorICogQSB3cmFwcGVyIGFyb3VuZCBzdHJlcnJvcigpIGJlY2F1c2Ugc29tZSBwbGF0Zm9ybXMKKyAqIG1heSBiZSBsYW1lIGFuZCBub3QgaGF2ZSBzdHJlcnJvcigpLiBBbHNvLCBuZXZlcgorICogcmV0dXJucyBOVUxMLgorICoKKyAqIEBwYXJhbSBlcnJvcl9udW1iZXIgZXJybm8uCisgKiBAcmV0dXJucyBlcnJvciBkZXNjcmlwdGlvbi4KKyAqLworY29uc3QgY2hhcioKK19kYnVzX3N0cmVycm9yIChpbnQgZXJyb3JfbnVtYmVyKQoreworICBjb25zdCBjaGFyICptc2c7CisKKyAgbXNnID0gc3RyZXJyb3IgKGVycm9yX251bWJlcik7CisgIGlmIChtc2cgPT0gTlVMTCkKKyAgICBtc2cgPSAidW5rbm93biI7CisKKyAgcmV0dXJuIG1zZzsKK30KKworLyoqCisgKiBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworICovCit2b2lkCitfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpCit7CisgIHNpZ25hbCAoU0lHUElQRSwgU0lHX0lHTik7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlCisgKiBvbiBleGVjLiBTaG91bGQgYmUgY2FsbGVkIGZvciBhbGwgZmlsZQorICogZGVzY3JpcHRvcnMgaW4gRC1CdXMgY29kZS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICovCit2b2lkCitfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoaW50cHRyX3QgZmQpCit7CisgIGludCB2YWw7CisKKyAgdmFsID0gZmNudGwgKGZkLCBGX0dFVEZELCAwKTsKKworICBpZiAodmFsIDwgMCkKKyAgICByZXR1cm47CisKKyAgdmFsIHw9IEZEX0NMT0VYRUM7CisKKyAgZmNudGwgKGZkLCBGX1NFVEZELCB2YWwpOworfQorCisvKioKKyAqIENsb3NlcyBhIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGVycm9yIGVycm9yIG9iamVjdAorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2xvc2UgKGludCAgICAgICAgZmQsCisgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgaWYgKGNsb3NlIChmZCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmZCAlZCIsIGZkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRHVwbGljYXRlcyBhIGZpbGUgZGVzY3JpcHRvci4gTWFrZXMgc3VyZSB0aGUgZmQgcmV0dXJuZWQgaXMgPj0gMworICogKGkuZS4gYXZvaWRzIHN0ZGluL3N0ZG91dC9zdGRlcnIpLiBTZXRzIE9fQ0xPRVhFQy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBkdXBsaWNhdGUKKyAqIEByZXR1cm5zIGR1cGxpY2F0ZWQgZmlsZSBkZXNjcmlwdG9yCisgKiAqLworaW50CitfZGJ1c19kdXAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBpbnQgbmV3X2ZkOworCisjaWZkZWYgRl9EVVBGRF9DTE9FWEVDCisgIGRidXNfYm9vbF90IGNsb2V4ZWNfZG9uZTsKKworICBuZXdfZmQgPSBmY250bChmZCwgRl9EVVBGRF9DTE9FWEVDLCAzKTsKKyAgY2xvZXhlY19kb25lID0gbmV3X2ZkID49IDA7CisKKyAgaWYgKG5ld19mZCA8IDAgJiYgZXJybm8gPT0gRUlOVkFMKQorI2VuZGlmCisgICAgeworICAgICAgbmV3X2ZkID0gZmNudGwoZmQsIEZfRFVQRkQsIDMpOworICAgIH0KKworICBpZiAobmV3X2ZkIDwgMCkgeworCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZHVwbGljYXRlIGZkICVkIiwgZmQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisjaWZkZWYgRl9EVVBGRF9DTE9FWEVDCisgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMobmV3X2ZkKTsKKyAgICB9CisKKyAgcmV0dXJuIG5ld19mZDsKK30KKworLyoqCisgKiBTZXRzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgb2YgZXJyb3IgbG9jYXRpb24uCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChpbnQgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IHZhbDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICB2YWwgPSBmY250bCAoZmQsIEZfR0VURkwsIDApOworICBpZiAodmFsIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBmbGFncyBmcm9tIGZpbGUgZGVzY3JpcHRvciAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0IGZsYWdzIGZvciBmZCAlZDogJXNcbiIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmY250bCAoZmQsIEZfU0VURkwsIHZhbCB8IE9fTk9OQkxPQ0spIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBub25ibG9ja2luZyBmbGFnIG9mIGZpbGUgZGVzY3JpcHRvciAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gc2V0IGZkICVkIG5vbmJsb2NraW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBPbiBHTlUgbGliYyBzeXN0ZW1zLCBwcmludCBhIGNydWRlIGJhY2t0cmFjZSB0byBzdGRlcnIuICBPbiBvdGhlcgorICogc3lzdGVtcywgcHJpbnQgIm5vIGJhY2t0cmFjZSBzdXBwb3J0IiBhbmQgYmxvY2sgZm9yIHBvc3NpYmxlIGdkYgorICogYXR0YWNobWVudCBpZiBhbiBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuCisgKi8KK3ZvaWQKK19kYnVzX3ByaW50X2JhY2t0cmFjZSAodm9pZCkKK3sKKyNpZiBkZWZpbmVkIChIQVZFX0JBQ0tUUkFDRSkgJiYgZGVmaW5lZCAoREJVU19CVUlMVF9SX0RZTkFNSUMpCisgIHZvaWQgKmJ0WzUwMF07CisgIGludCBidF9zaXplOworICBpbnQgaTsKKyAgY2hhciAqKnN5bXM7CisKKyAgYnRfc2l6ZSA9IGJhY2t0cmFjZSAoYnQsIDUwMCk7CisKKyAgc3ltcyA9IGJhY2t0cmFjZV9zeW1ib2xzIChidCwgYnRfc2l6ZSk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgYnRfc2l6ZSkKKyAgICB7CisgICAgICAvKiBkb24ndCB1c2UgZGJ1c193YXJuIHNpbmNlIGl0IGNhbiBfZGJ1c19hYm9ydCgpICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgICVzXG4iLCBzeW1zW2ldKTsKKyAgICAgICsraTsKKyAgICB9CisgIGZmbHVzaCAoc3RkZXJyKTsKKworICBmcmVlIChzeW1zKTsKKyNlbGlmIGRlZmluZWQgKEhBVkVfQkFDS1RSQUNFKSAmJiAhIGRlZmluZWQgKERCVVNfQlVJTFRfUl9EWU5BTUlDKQorICBmcHJpbnRmIChzdGRlcnIsICIgIEQtQnVzIG5vdCBidWlsdCB3aXRoIC1yZHluYW1pYyBzbyB1bmFibGUgdG8gcHJpbnQgYSBiYWNrdHJhY2VcbiIpOworI2Vsc2UKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBELUJ1cyBub3QgY29tcGlsZWQgd2l0aCBiYWNrdHJhY2Ugc3VwcG9ydCBzbyB1bmFibGUgdG8gcHJpbnQgYSBiYWNrdHJhY2VcbiIpOworI2VuZGlmCit9CisKKy8qKgorICogQ3JlYXRlcyBhIGZ1bGwtZHVwbGV4IHBpcGUgKGFzIGluIHNvY2tldHBhaXIoKSkuCisgKiBTZXRzIGJvdGggZW5kcyBvZiB0aGUgcGlwZSBub25ibG9ja2luZy4KKyAqCisgKiBNYXJrcyBib3RoIGZpbGUgZGVzY3JpcHRvcnMgYXMgY2xvc2Utb24tZXhlYworICoKKyAqIEB0b2RvIGxpYmRidXMgb25seSB1c2VzIHRoaXMgZm9yIHRoZSBkZWJ1Zy1waXBlIHNlcnZlciwgc28gaW4KKyAqIHByaW5jaXBsZSBpdCBjb3VsZCBiZSBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jLCBleGNlcHQgdGhhdAorICogZGJ1cy1zeXNkZXBzLXV0aWwuYyBpc24ndCBpbiBsaWJkYnVzIHdoZW4gdGVzdHMgYXJlIGVuYWJsZWQgYW5kIHRoZQorICogZGVidWctcGlwZSBzZXJ2ZXIgaXMgdXNlZC4KKyAqCisgKiBAcGFyYW0gZmQxIHJldHVybiBsb2NhdGlvbiBmb3Igb25lIGVuZAorICogQHBhcmFtIGZkMiByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvdGhlciBlbmQKKyAqIEBwYXJhbSBibG9ja2luZyAjVFJVRSBpZiBwaXBlIHNob3VsZCBiZSBibG9ja2luZworICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKGlmIGVycm9yIGlzIHNldCkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Z1bGxfZHVwbGV4X3BpcGUgKGludCAgICAgICAgKmZkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKmZkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGJsb2NraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgSEFWRV9TT0NLRVRQQUlSCisgIGludCBmZHNbMl07CisgIGludCByZXR2YWw7CisKKyNpZmRlZiBTT0NLX0NMT0VYRUMKKyAgZGJ1c19ib29sX3QgY2xvZXhlY19kb25lOworCisgIHJldHZhbCA9IHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU18U09DS19DTE9FWEVDLCAwLCBmZHMpOworICBjbG9leGVjX2RvbmUgPSByZXR2YWwgPj0gMDsKKworICBpZiAocmV0dmFsIDwgMCAmJiBlcnJubyA9PSBFSU5WQUwpCisjZW5kaWYKKyAgICB7CisgICAgICByZXR2YWwgPSBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZHMpOworICAgIH0KKworICBpZiAocmV0dmFsIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBmdWxsLWR1cGxleCBwaXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisjaWZkZWYgU09DS19DTE9FWEVDCisgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkc1swXSk7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoZmRzWzFdKTsKKyAgICB9CisKKyAgaWYgKCFibG9ja2luZyAmJgorICAgICAgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGZkc1swXSwgTlVMTCkgfHwKKyAgICAgICAhX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZHNbMV0sIE5VTEwpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBmdWxsLWR1cGxleCBwaXBlIG5vbmJsb2NraW5nIik7CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZHNbMF0sIE5VTEwpOworICAgICAgX2RidXNfY2xvc2UgKGZkc1sxXSwgTlVMTCk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKmZkMSA9IGZkc1swXTsKKyAgKmZkMiA9IGZkc1sxXTsKKworICBfZGJ1c192ZXJib3NlICgiZnVsbC1kdXBsZXggcGlwZSAlZCA8LT4gJWRcbiIsCisgICAgICAgICAgICAgICAgICpmZDEsICpmZDIpOworCisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgX2RidXNfd2FybiAoIl9kYnVzX2Z1bGxfZHVwbGV4X3BpcGUoKSBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBPU1xuIik7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAiX2RidXNfZnVsbF9kdXBsZXhfcGlwZSgpIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIE9TIik7CisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKioKKyAqIE1lYXN1cmUgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZyBhbmQgYXJndW1lbnRzLAorICogbm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsLgorICoKKyAqIEBwYXJhbSBmb3JtYXQgYSBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZworICogQHBhcmFtIGFyZ3MgYXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZworICogQHJldHVybnMgbGVuZ3RoIG9mIHRoZSBnaXZlbiBmb3JtYXQgc3RyaW5nIGFuZCBhcmdzCisgKi8KK2ludAorX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZCAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgYXJncykKK3sKKyAgY2hhciBjOworICByZXR1cm4gdnNucHJpbnRmICgmYywgMSwgZm9ybWF0LCBhcmdzKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0ZW1wb3JhcnkgZmlsZXMgZGlyZWN0b3J5IGJ5IGluc3BlY3RpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworICogVE1QRElSLCBUTVAsIGFuZCBURU1QIGluIHRoYXQgb3JkZXIuIElmIG5vbmUgb2YgdGhvc2UgYXJlIHNldCAiL3RtcCIgaXMgcmV0dXJuZWQKKyAqCisgKiBAcmV0dXJucyBsb2NhdGlvbiBvZiB0ZW1wIGRpcmVjdG9yeQorICovCitjb25zdCBjaGFyKgorX2RidXNfZ2V0X3RtcGRpcih2b2lkKQoreworICBzdGF0aWMgY29uc3QgY2hhciogdG1wZGlyID0gTlVMTDsKKworICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgeworICAgICAgLyogVE1QRElSIGlzIHdoYXQgZ2xpYmMgdXNlcywgdGhlbgorICAgICAgICogZ2xpYmMgZmFsbHMgYmFjayB0byB0aGUgUF90bXBkaXIgbWFjcm8gd2hpY2gKKyAgICAgICAqIGp1c3QgZXhwYW5kcyB0byAiL3RtcCIKKyAgICAgICAqLworICAgICAgaWYgKHRtcGRpciA9PSBOVUxMKQorICAgICAgICB0bXBkaXIgPSBnZXRlbnYoIlRNUERJUiIpOworCisgICAgICAvKiBUaGVzZSB0d28gZW52IHZhcmlhYmxlcyBhcmUgcHJvYmFibHkKKyAgICAgICAqIGJyb2tlbiwgYnV0IG1heWJlIHNvbWUgT1MgdXNlcyB0aGVtPworICAgICAgICovCisgICAgICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgICAgIHRtcGRpciA9IGdldGVudigiVE1QIik7CisgICAgICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgICAgIHRtcGRpciA9IGdldGVudigiVEVNUCIpOworCisgICAgICAvKiBBbmQgdGhpcyBpcyB0aGUgc2FuZSBmYWxsYmFjay4gKi8KKyAgICAgIGlmICh0bXBkaXIgPT0gTlVMTCkKKyAgICAgICAgdG1wZGlyID0gIi90bXAiOworICAgIH0KKworICBfZGJ1c19hc3NlcnQodG1wZGlyICE9IE5VTEwpOworCisgIHJldHVybiB0bXBkaXI7Cit9CisKKy8qKgorICogRXhlY3V0ZSBhIHN1YnByb2Nlc3MsIHJldHVybmluZyB1cCB0byAxMDI0IGJ5dGVzIG9mIG91dHB1dAorICogaW50byBAcCByZXN1bHQuCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyAjVFJVRSBhbmQgYXBwZW5kcyB0aGUgb3V0cHV0IHRvIEBwCisgKiByZXN1bHQuIElmIGEgZmFpbHVyZSBoYXBwZW5zLCByZXR1cm5zICNGQUxTRSBhbmQKKyAqIHNldHMgYW4gZXJyb3IgaW4gQHAgZXJyb3IuCisgKgorICogQG5vdGUgSXQncyBub3QgYW4gZXJyb3IgaWYgdGhlIHN1YnByb2Nlc3MgdGVybWluYXRlcyBub3JtYWxseQorICogd2l0aG91dCB3cml0aW5nIGFueSBkYXRhIHRvIHN0ZG91dC4gVmVyaWZ5IHRoZSBAcCByZXN1bHQgbGVuZ3RoCisgKiBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbCB0byBjb3ZlciB0aGlzIGNhc2UuCisgKgorICogQHBhcmFtIHByb2duYW1lIGluaXRpYWwgcGF0aCB0byBleGVjIChtYXkgb3IgbWF5IG5vdCBiZSBhYnNvbHV0ZSkKKyAqIEBwYXJhbSBwYXRoX2ZhbGxiYWNrIGlmICVUUlVFLCBzZWFyY2ggUEFUSCBmb3IgZXhlY3V0YWJsZQorICogQHBhcmFtIGFyZ3YgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgYXJndW1lbnRzCisgKiBAcGFyYW0gcmVzdWx0IGEgREJ1c1N0cmluZyB3aGVyZSB0aGUgb3V0cHV0IGNhbiBiZSBhcHBlbmQKKyAqIEBwYXJhbSBlcnJvciBhIERCdXNFcnJvciB0byBzdG9yZSB0aGUgZXJyb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgYW4gZXJyb3IgaGFwcGVuZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndiAoY29uc3QgY2hhciAqcHJvZ3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgcGF0aF9mYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICogY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpbnQgcmVzdWx0X3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBpbnQgZXJyb3JzX3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBwaWRfdCBwaWQ7CisgIGludCByZXQ7CisgIGludCBzdGF0dXM7CisgIGludCBvcmlnX2xlbjsKKyAgaW50IGk7CisKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBzaWdzZXRfdCBuZXdfc2V0LCBvbGRfc2V0OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBXZSBuZWVkIHRvIGJsb2NrIGFueSBleGlzdGluZyBoYW5kbGVycyBmb3IgU0lHQ0hMRCB0ZW1wb3JhcmlseTsgdGhleQorICAgKiB3aWxsIGNhdXNlIHdhaXRwaWQoKSBiZWxvdyB0byBmYWlsLgorICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTM0NworICAgKi8KKyAgc2lnZW1wdHlzZXQgKCZuZXdfc2V0KTsKKyAgc2lnYWRkc2V0ICgmbmV3X3NldCwgU0lHQ0hMRCk7CisgIHNpZ3Byb2NtYXNrIChTSUdfQkxPQ0ssICZuZXdfc2V0LCAmb2xkX3NldCk7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzdWx0KTsKKworI2RlZmluZSBSRUFEX0VORCAgICAgICAgMAorI2RlZmluZSBXUklURV9FTkQgICAgICAgMQorICBpZiAocGlwZSAocmVzdWx0X3BpcGUpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBhIHBpcGUgdG8gY2FsbCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIGEgcGlwZSB0byBjYWxsICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaWYgKHBpcGUgKGVycm9yc19waXBlKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIHRvIGNhbGwgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNyZWF0ZSBhIHBpcGUgdG8gY2FsbCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcGlkID0gZm9yayAoKTsKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmb3JrKCkgdG8gY2FsbCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZm9yaygpIHRvIGNhbGwgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICAvKiBjaGlsZCBwcm9jZXNzICovCisgICAgICBpbnQgbWF4ZmRzOworICAgICAgaW50IGZkOworCisgICAgICBmZCA9IG9wZW4gKCIvZGV2L251bGwiLCBPX1JEV1IpOworICAgICAgaWYgKGZkID09IC0xKQorICAgICAgICAvKiBodWg/ISBjYW4ndCBvcGVuIC9kZXYvbnVsbD8gKi8KKyAgICAgICAgX2V4aXQgKDEpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiL2Rldi9udWxsIGZkICVkIG9wZW5lZFxuIiwgZmQpOworCisgICAgICAvKiBzZXQtdXAgc3RkWFhYICovCisgICAgICBjbG9zZSAocmVzdWx0X3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgIGNsb3NlIChlcnJvcnNfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2UgKDApOyAgICAgICAgICAgICAgICAvKiBjbG9zZSBzdGRpbiAqLworICAgICAgY2xvc2UgKDEpOyAgICAgICAgICAgICAgICAvKiBjbG9zZSBzdGRvdXQgKi8KKyAgICAgIGNsb3NlICgyKTsgICAgICAgICAgICAgICAgLyogY2xvc2Ugc3RkZXJyICovCisKKyAgICAgIGlmIChkdXAyIChmZCwgMCkgPT0gLTEpCisgICAgICAgIF9leGl0ICgxKTsKKyAgICAgIGlmIChkdXAyIChyZXN1bHRfcGlwZVtXUklURV9FTkRdLCAxKSA9PSAtMSkKKyAgICAgICAgX2V4aXQgKDEpOworICAgICAgaWYgKGR1cDIgKGVycm9yc19waXBlW1dSSVRFX0VORF0sIDIpID09IC0xKQorICAgICAgICBfZXhpdCAoMSk7CisKKyAgICAgIG1heGZkcyA9IHN5c2NvbmYgKF9TQ19PUEVOX01BWCk7CisgICAgICAvKiBQaWNrIHNvbWV0aGluZyByZWFzb25hYmxlIGlmIGZvciBzb21lIHJlYXNvbiBzeXNjb25mCisgICAgICAgKiBzYXlzIHVubGltaXRlZC4KKyAgICAgICAqLworICAgICAgaWYgKG1heGZkcyA8IDApCisgICAgICAgIG1heGZkcyA9IDEwMjQ7CisgICAgICAvKiBjbG9zZSBhbGwgaW5oZXJpdGVkIGZkcyAqLworICAgICAgZm9yIChpID0gMzsgaSA8IG1heGZkczsgaSsrKQorICAgICAgICBjbG9zZSAoaSk7CisKKyAgICAgIHNpZ3Byb2NtYXNrIChTSUdfU0VUTUFTSywgJm9sZF9zZXQsIE5VTEwpOworCisgICAgICAvKiBJZiBpdCBsb29rcyBmdWxseS1xdWFsaWZpZWQsIHRyeSBleGVjdiBmaXJzdCAqLworICAgICAgaWYgKHByb2dwYXRoWzBdID09ICcvJykKKyAgICAgICAgeworICAgICAgICAgIGV4ZWN2IChwcm9ncGF0aCwgYXJndik7CisgICAgICAgICAgLyogT2ssIHRoYXQgZmFpbGVkLiAgTm93IGlmIHBhdGhfZmFsbGJhY2sgaXMgZ2l2ZW4sIGxldCdzCisgICAgICAgICAgICogdHJ5IHVucXVhbGlmaWVkLiAgVGhpcyBpcyBtb3N0bHkgYSBoYWNrIHRvIHdvcmsKKyAgICAgICAgICAgKiBhcm91bmQgc3lzdGVtcyB3aGljaCBzaGlwIGRidXMtbGF1bmNoIGluIC91c3IvYmluCisgICAgICAgICAgICogYnV0IGV2ZXJ5dGhpbmcgZWxzZSBpbiAvYmluIChiZWNhdXNlIGRidXMtbGF1bmNoCisgICAgICAgICAgICogZGVwZW5kcyBvbiBYMTEpLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwYXRoX2ZhbGxiYWNrKQorICAgICAgICAgICAgLyogV2UgbXVzdCBoYXZlIGEgc2xhc2gsIGJlY2F1c2Ugd2UgY2hlY2tlZCBhYm92ZSAqLworICAgICAgICAgICAgZXhlY3ZwIChzdHJyY2hyIChwcm9ncGF0aCwgJy8nKSsxLCBhcmd2KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBleGVjdnAgKHByb2dwYXRoLCBhcmd2KTsKKworICAgICAgLyogc3RpbGwgbm90aGluZywgd2UgZmFpbGVkICovCisgICAgICBfZXhpdCAoMSk7CisgICAgfQorCisgIC8qIHBhcmVudCBwcm9jZXNzICovCisgIGNsb3NlIChyZXN1bHRfcGlwZVtXUklURV9FTkRdKTsKKyAgY2xvc2UgKGVycm9yc19waXBlW1dSSVRFX0VORF0pOworICByZXN1bHRfcGlwZVtXUklURV9FTkRdID0gLTE7CisgIGVycm9yc19waXBlW1dSSVRFX0VORF0gPSAtMTsKKworICByZXQgPSAwOworICBkbworICAgIHsKKyAgICAgIHJldCA9IF9kYnVzX3JlYWQgKHJlc3VsdF9waXBlW1JFQURfRU5EXSwgcmVzdWx0LCAxMDI0KTsKKyAgICB9CisgIHdoaWxlIChyZXQgPiAwKTsKKworICAvKiByZWFwIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGF2b2lkIGl0IGxpbmdlcmluZyBhcyB6b21iaWUgKi8KKyAgZG8KKyAgICB7CisgICAgICByZXQgPSB3YWl0cGlkIChwaWQsICZzdGF0dXMsIDApOworICAgIH0KKyAgd2hpbGUgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgLyogV2Ugc3VjY2VlZGVkIGlmIHRoZSBwcm9jZXNzIGV4aXRlZCB3aXRoIHN0YXR1cyAwIGFuZAorICAgICBhbnl0aGluZyB3YXMgcmVhZCAqLworICBpZiAoIVdJRkVYSVRFRCAoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyAoc3RhdHVzKSAhPSAwICkKKyAgICB7CisgICAgICAvKiBUaGUgcHJvY2VzcyBlbmRlZCB3aXRoIGVycm9yICovCisgICAgICBEQnVzU3RyaW5nIGVycm9yX21lc3NhZ2U7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXJyb3JfbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgcmV0ID0gMDsKKyAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICByZXQgPSBfZGJ1c19yZWFkIChlcnJvcnNfcGlwZVtSRUFEX0VORF0sICZlcnJvcl9tZXNzYWdlLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgd2hpbGUgKHJldCA+IDApOworCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAocmVzdWx0LCBvcmlnX2xlbik7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZlcnJvcl9tZXNzYWdlKSA+IDApCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmZXJyb3JfbWVzc2FnZSkpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IHdpdGhvdXQgYW55IGVycm9yIG1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHNpZ3Byb2NtYXNrIChTSUdfU0VUTUFTSywgJm9sZF9zZXQsIE5VTEwpOworCisgIGlmIChyZXR2YWwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIGVsc2UKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgaWYgKHJlc3VsdF9waXBlWzBdICE9IC0xKQorICAgIGNsb3NlIChyZXN1bHRfcGlwZVswXSk7CisgIGlmIChyZXN1bHRfcGlwZVsxXSAhPSAtMSkKKyAgICBjbG9zZSAocmVzdWx0X3BpcGVbMV0pOworICBpZiAoZXJyb3JzX3BpcGVbMF0gIT0gLTEpCisgICAgY2xvc2UgKGVycm9yc19waXBlWzBdKTsKKyAgaWYgKGVycm9yc19waXBlWzFdICE9IC0xKQorICAgIGNsb3NlIChlcnJvcnNfcGlwZVsxXSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIGEgbmV3IHNlc3Npb24gYnVzLgorICoKKyAqIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgI1RSVUUgYW5kIGFwcGVuZHMgdGhlIGFkZHJlc3MgdG8gQHAKKyAqIGFkZHJlc3MuIElmIGEgZmFpbHVyZSBoYXBwZW5zLCByZXR1cm5zICNGQUxTRSBhbmQKKyAqIHNldHMgYW4gZXJyb3IgaW4gQHAgZXJyb3IuCisgKgorICogQHBhcmFtIGFkZHJlc3MgYSBEQnVzU3RyaW5nIHdoZXJlIHRoZSBhZGRyZXNzIGNhbiBiZSBzdG9yZWQKKyAqIEBwYXJhbSBlcnJvciBhIERCdXNFcnJvciB0byBzdG9yZSB0aGUgZXJyb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgYW4gZXJyb3IgaGFwcGVuZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MgKGNvbnN0IGNoYXIgKnNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworI2lmZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICisgIC8qIFBlcmZvcm0gWDExLWJhc2VkIGF1dG9sYXVuY2guIChXZSBhbHNvIHN1cHBvcnQgbGF1bmNoZC1iYXNlZCBhdXRvbGF1bmNoLAorICAgKiBidXQgdGhhdCdzIGRvbmUgZWxzZXdoZXJlLCBhbmQgaWYgaXQgd29ya2VkLCB0aGlzIGZ1bmN0aW9uIHdvdWxkbid0CisgICAqIGJlIGNhbGxlZC4pICovCisgIGNvbnN0IGNoYXIgKmRpc3BsYXk7CisgIHN0YXRpYyBjaGFyICphcmd2WzZdOworICBpbnQgaTsKKyAgREJ1c1N0cmluZyB1dWlkOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIGZkLm8gIzE5OTk3OiBpZiAkRElTUExBWSBpc24ndCBzZXQgdG8gc29tZXRoaW5nIHVzZWZ1bCwgdGhlbgorICAgKiBkYnVzLWxhdW5jaC14MTEgaXMganVzdCBnb2luZyB0byBmYWlsLiBSYXRoZXIgdGhhbiB0cnlpbmcgdG8KKyAgICogcnVuIGl0LCB3ZSBtaWdodCBhcyB3ZWxsIGJhaWwgb3V0IGVhcmx5IHdpdGggYSBuaWNlIGVycm9yLiAqLworICBkaXNwbGF5ID0gX2RidXNfZ2V0ZW52ICgiRElTUExBWSIpOworCisgIGlmIChkaXNwbGF5ID09IE5VTEwgfHwgZGlzcGxheVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICJVbmFibGUgdG8gYXV0b2xhdW5jaCBhIGRidXMtZGFlbW9uIHdpdGhvdXQgYSAkRElTUExBWSBmb3IgWDExIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1dWlkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkICgmdXVpZCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGkgPSAwOworICBhcmd2W2ldID0gImRidXMtbGF1bmNoIjsKKyAgKytpOworICBhcmd2W2ldID0gIi0tYXV0b2xhdW5jaCI7CisgICsraTsKKyAgYXJndltpXSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnV1aWQpOworICArK2k7CisgIGFyZ3ZbaV0gPSAiLS1iaW5hcnktc3ludGF4IjsKKyAgKytpOworICBhcmd2W2ldID0gIi0tY2xvc2Utc3RkZXJyIjsKKyAgKytpOworICBhcmd2W2ldID0gTlVMTDsKKyAgKytpOworCisgIF9kYnVzX2Fzc2VydCAoaSA9PSBfREJVU19OX0VMRU1FTlRTIChhcmd2KSk7CisKKyAgcmV0dmFsID0gX3JlYWRfc3VicHJvY2Vzc19saW5lX2FyZ3YgKERCVVNfQklORElSICIvZGJ1cy1sYXVuY2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3YsIGFkZHJlc3MsIGVycm9yKTsKKworIG91dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgcmV0dXJuIHJldHZhbDsKKyNlbHNlCisgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgIlVzaW5nIFgxMSBmb3IgZGJ1cy1kYWVtb24gYXV0b2xhdW5jaCB3YXMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLCAiCisgICAgICAic2V0IHlvdXIgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGluc3RlYWQiKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKy8qKgorICogUmVhZHMgdGhlIHV1aWQgb2YgdGhlIG1hY2hpbmUgd2UncmUgcnVubmluZyBvbiBmcm9tCisgKiB0aGUgZGJ1cyBjb25maWd1cmF0aW9uLiBPcHRpb25hbGx5IHRyeSB0byBjcmVhdGUgaXQKKyAqIChvbmx5IHJvb3QgY2FuIGRvIHRoaXMgdXN1YWxseSkuCisgKgorICogT24gVU5JWCwgcmVhZHMgYSBmaWxlIHRoYXQgZ2V0cyBjcmVhdGVkIGJ5IGRidXMtdXVpZGdlbgorICogaW4gYSBwb3N0LWluc3RhbGwgc2NyaXB0LiBPbiBXaW5kb3dzLCBpZiB0aGVyZSdzIGEgc3RhbmRhcmQKKyAqIG1hY2hpbmUgdXVpZCB3ZSBjb3VsZCBqdXN0IHVzZSB0aGF0LCBidXQgSSBjYW4ndCBmaW5kIG9uZQorICogd2l0aCB0aGUgcmlnaHQgcHJvcGVydGllcyAodGhlIGhhcmR3YXJlIHByb2ZpbGUgZ3VpZCBjYW4gY2hhbmdlCisgKiB3aXRob3V0IHJlYm9vdGluZyBJIGJlbGlldmUpLiBJZiB0aGVyZSdzIG5vIHN0YW5kYXJkIG9uZQorICogd2UgbWlnaHQgd2FudCB0byB1c2UgdGhlIHJlZ2lzdHJ5IGluc3RlYWQgb2YgYSBmaWxlIGZvcgorICogdGhpcywgYW5kIEknbSBub3Qgc3VyZSBob3cgd2UnZCBlbnN1cmUgdGhlIHV1aWQgZ2V0cyBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSBtYWNoaW5lX2lkIGd1aWQgdG8gaW5pdCB3aXRoIHRoZSBtYWNoaW5lJ3MgdXVpZAorICogQHBhcmFtIGNyZWF0ZV9pZl9ub3RfZm91bmQgdHJ5IHRvIGNyZWF0ZSB0aGUgdXVpZCBpZiBpdCBkb2Vzbid0IGV4aXN0CisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHJldHVybgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkIChEQnVzR1VJRCAgICptYWNoaW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIGRidXNfYm9vbF90IGI7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgREJVU19NQUNISU5FX1VVSURfRklMRSk7CisKKyAgYiA9IF9kYnVzX3JlYWRfdXVpZF9maWxlICgmZmlsZW5hbWUsIG1hY2hpbmVfaWQsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGVycm9yKTsKKyAgaWYgKGIpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19lcnJvcl9mcmVlIChlcnJvcik7CisKKyAgLyogRmFsbGJhY2sgdG8gdGhlIHN5c3RlbSBtYWNoaW5lIElEICovCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsICIvZXRjL21hY2hpbmUtaWQiKTsKKyAgcmV0dXJuIF9kYnVzX3JlYWRfdXVpZF9maWxlICgmZmlsZW5hbWUsIG1hY2hpbmVfaWQsIEZBTFNFLCBlcnJvcik7Cit9CisKKyNkZWZpbmUgREJVU19VTklYX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUiAiL2RidXMtMS9zZXJ2aWNlcyIKKyNkZWZpbmUgREJVU19VTklYX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSICIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIKKworLyoqCisgKiBxdXJpZXMgbGF1bmNoZCBmb3IgYSBzcGVjaWZpYyBlbnYgdmFyIHdoaWNoIGhvbGRzIHRoZSBzb2NrZXQgcGF0aC4KKyAqIEBwYXJhbSBsYXVuY2hkX2Vudl92YXIgdGhlIGVudiB2YXIgdG8gbG9vayB1cAorICogQHBhcmFtIGVycm9yIGEgREJ1c0Vycm9yIHRvIHN0b3JlIHRoZSBlcnJvciBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBlbnYgdmFyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19sb29rdXBfbGF1bmNoZF9zb2NrZXQgKERCdXNTdHJpbmcgKnNvY2tldF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXVuY2hkX2Vudl92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyAgY2hhciAqYXJndls0XTsKKyAgaW50IGk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaSA9IDA7CisgIGFyZ3ZbaV0gPSAibGF1bmNoY3RsIjsKKyAgKytpOworICBhcmd2W2ldID0gImdldGVudiI7CisgICsraTsKKyAgYXJndltpXSA9IChjaGFyKilsYXVuY2hkX2Vudl92YXI7CisgICsraTsKKyAgYXJndltpXSA9IE5VTEw7CisgICsraTsKKworICBfZGJ1c19hc3NlcnQgKGkgPT0gX0RCVVNfTl9FTEVNRU5UUyAoYXJndikpOworCisgIGlmICghX3JlYWRfc3VicHJvY2Vzc19saW5lX2FyZ3YoYXJndlswXSwgVFJVRSwgYXJndiwgc29ja2V0X3BhdGgsIGVycm9yKSkKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIG5vIGVycm9yLCBidXQgbm8gcmVzdWx0IGVpdGhlciAqLworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGgoc29ja2V0X3BhdGgpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBzdHJpcCB0aGUgY2FycmlhZ2UtcmV0dXJuICovCisgIF9kYnVzX3N0cmluZ19zaG9ydGVuKHNvY2tldF9wYXRoLCAxKTsKKyAgcmV0dXJuIFRSVUU7CisjZWxzZSAvKiBEQlVTX0VOQUJMRV9MQVVOQ0hEICovCisgIGRidXNfc2V0X2Vycm9yKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgImNhbid0IGxvb2t1cCBzb2NrZXQgZnJvbSBsYXVuY2hkOyBsYXVuY2hkIHN1cHBvcnQgbm90IGNvbXBpbGVkIGluIik7CisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3NfbGF1bmNoZCAoREJ1c1N0cmluZyAqYWRkcmVzcywgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICBkYnVzX2Jvb2xfdCB2YWxpZF9zb2NrZXQ7CisgIERCdXNTdHJpbmcgc29ja2V0X3BhdGg7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNvY2tldF9wYXRoKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHZhbGlkX3NvY2tldCA9IF9kYnVzX2xvb2t1cF9sYXVuY2hkX3NvY2tldCAoJnNvY2tldF9wYXRoLCAiREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCIsIGVycm9yKTsKKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghdmFsaWRfc29ja2V0KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yKGVycm9yLCAibm8gc29ja2V0IHBhdGgiLAorICAgICAgICAgICAgICAgICJsYXVuY2hkIGRpZCBub3QgcHJvdmlkZSBhIHNvY2tldCBwYXRoLCAiCisgICAgICAgICAgICAgICAgInZlcmlmeSB0aGF0IG9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QgaXMgbG9hZGVkISIpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoYWRkcmVzcywgInVuaXg6cGF0aD0iKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmc29ja2V0X3BhdGgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnNvY2tldF9wYXRoLCAwLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYWRkcmVzcykpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgZGJ1c19zZXRfZXJyb3IoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgbG9va3VwIHNlc3Npb24gYWRkcmVzcyBmcm9tIGxhdW5jaGQ7IGxhdW5jaGQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4iKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKy8qKgorICogRGV0ZXJtaW5lcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2Vzc2lvbiBidXMgYnkgcXVlcnlpbmcgYQorICogcGxhdGZvcm0tc3BlY2lmaWMgbWV0aG9kLgorICoKKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgd2lsbCBiZSBhIGJvb2xlYW4gc3BlY2lmeWluZyB3aGV0aGVyCisgKiBvciBub3QgYSBkeW5hbWljIHNlc3Npb24gbG9va3VwIGlzIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLgorICoKKyAqIElmIHN1cHBvcnRlZCBpcyBUUlVFIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzICNUUlVFLCB0aGUKKyAqIGFkZHJlc3Mgd2lsbCBiZSAgYXBwZW5kZWQgdG8gQHAgYWRkcmVzcy4KKyAqIElmIGEgZmFpbHVyZSBoYXBwZW5zLCByZXR1cm5zICNGQUxTRSBhbmQgc2V0cyBhbiBlcnJvciBpbgorICogQHAgZXJyb3IuCisgKgorICogSWYgc3VwcG9ydGVkIGlzIEZBTFNFLCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gc3VwcG9ydGVkIHJldHVybnMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBzdXBwb3J0ZWQKKyAqIEBwYXJhbSBhZGRyZXNzIGEgREJ1c1N0cmluZyB3aGVyZSB0aGUgYWRkcmVzcyBjYW4gYmUgc3RvcmVkCisgKiBAcGFyYW0gZXJyb3IgYSBEQnVzRXJyb3IgdG8gc3RvcmUgdGhlIGVycm9yIGluIGNhc2Ugb2YgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIGFuIGVycm9yIGhhcHBlbmVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19sb29rdXBfc2Vzc2lvbl9hZGRyZXNzIChkYnVzX2Jvb2xfdCAqc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICAqc3VwcG9ydGVkID0gVFJVRTsKKyAgcmV0dXJuIF9kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3NfbGF1bmNoZCAoYWRkcmVzcywgZXJyb3IpOworI2Vsc2UKKyAgLyogT24gbm9uLU1hYyBVbml4IHBsYXRmb3JtcywgaWYgdGhlIHNlc3Npb24gYWRkcmVzcyBpc24ndCBhbHJlYWR5CisgICAqIHNldCBpbiBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdlIHB1bnQgYW5kCisgICAqIGZhbGwgYmFjayB0byB0aGUgYXV0b2xhdW5jaDogZ2xvYmFsIGRlZmF1bHQ7IHNlZQorICAgKiBpbml0X3Nlc3Npb25fYWRkcmVzcyBpbiBkYnVzL2RidXMtYnVzLmMuICovCisgICpzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzZXNzaW9uIGJ1cyB0byBsb29rIGZvciBzZXJ2aWNlCisgKiBhY3RpdmF0aW9uIGZpbGVzCisgKgorICogT24gVU5JWCB0aGlzIHNob3VsZCBiZSB0aGUgc3RhbmRhcmQgeGRnIGZyZWVkZXNrdG9wLm9yZyBkYXRhIGRpcmVjdG9yaWVzOgorICoKKyAqIFhER19EQVRBX0hPTUU9JHtYREdfREFUQV9IT01FLSRIT01FLy5sb2NhbC9zaGFyZX0KKyAqIFhER19EQVRBX0RJUlM9JHtYREdfREFUQV9ESVJTLS91c3IvbG9jYWwvc2hhcmU6L3Vzci9zaGFyZX0KKyAqCisgKiBhbmQKKyAqCisgKiBEQlVTX0RBVEFESVIKKyAqCisgKiBAcGFyYW0gZGlycyB0aGUgZGlyZWN0b3J5IGxpc3Qgd2UgYXJlIHJldHVybmluZworICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9ob21lOworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9kaXJzOworICBEQnVzU3RyaW5nIHNlcnZpY2VkaXJfcGF0aDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmljZWRpcl9wYXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgeGRnX2RhdGFfaG9tZSA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0hPTUUiKTsKKyAgeGRnX2RhdGFfZGlycyA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0RJUlMiKTsKKworICBpZiAoeGRnX2RhdGFfaG9tZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgeGRnX2RhdGFfaG9tZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmhvbWVkaXI7CisgICAgICBEQnVzU3RyaW5nIGxvY2FsX3NoYXJlOworCisgICAgICBpZiAoIV9kYnVzX2hvbWVkaXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZob21lZGlyKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChob21lZGlyKSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmxvY2FsX3NoYXJlLCAiLy5sb2NhbC9zaGFyZSIpOworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmc2VydmljZWRpcl9wYXRoLCAmbG9jYWxfc2hhcmUpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAiOiIpKQorICAgIGdvdG8gb29tOworCisgIGlmICh4ZGdfZGF0YV9kaXJzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCB4ZGdfZGF0YV9kaXJzKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgIjoiKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAiL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlOiIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyoKKyAgICogYWRkIGNvbmZpZ3VyZWQgZGF0YWRpciB0byBkZWZhdWx0cworICAgKiB0aGlzIG1heSBiZSB0aGUgc2FtZSBhcyBhbiB4ZGcgZGlyCisgICAqIGhvd2V2ZXIgdGhlIGNvbmZpZyBwYXJzZXIgc2hvdWxkIHRha2UKKyAgICogY2FyZSBvZiBkdXBsaWNhdGVzCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIERCVVNfREFUQURJUikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVU5JWF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycykpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzeXN0ZW0gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UKKyAqIGFjdGl2YXRpb24gZmlsZXMKKyAqCisgKiBPbiBVTklYIHRoaXMgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB4ZGcgZnJlZWRlc2t0b3Aub3JnIGRhdGEgZGlyZWN0b3JpZXM6CisgKgorICogWERHX0RBVEFfRElSUz0ke1hER19EQVRBX0RJUlMtL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlfQorICoKKyAqIGFuZAorICoKKyAqIERCVVNfREFUQURJUgorICoKKyAqIE9uIFdpbmRvd3MgdGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBhbmQgdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIG5vdGhpbmcuCisgKgorICogQHBhcmFtIGRpcnMgdGhlIGRpcmVjdG9yeSBsaXN0IHdlIGFyZSByZXR1cm5pbmcKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBPT00KKyAqLworCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9kaXJzOworICBEQnVzU3RyaW5nIHNlcnZpY2VkaXJfcGF0aDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmljZWRpcl9wYXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgeGRnX2RhdGFfZGlycyA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0RJUlMiKTsKKworICBpZiAoeGRnX2RhdGFfZGlycyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgeGRnX2RhdGFfZGlycykpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsICI6IikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgIi91c3IvbG9jYWwvc2hhcmU6L3Vzci9zaGFyZToiKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIC8qCisgICAqIGFkZCBjb25maWd1cmVkIGRhdGFkaXIgdG8gZGVmYXVsdHMKKyAgICogdGhpcyBtYXkgYmUgdGhlIHNhbWUgYXMgYW4geGRnIGRpcgorICAgKiBob3dldmVyIHRoZSBjb25maWcgcGFyc2VyIHNob3VsZCB0YWtlCisgICAqIGNhcmUgb2YgZHVwbGljYXRlcworICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBEQlVTX0RBVEFESVIiOiIpKQorICAgICAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19VTklYX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmljZWRpcl9wYXRoKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmljZWRpcl9wYXRoKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFwcGVuZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3lzdGVtLmNvbmYgZmlsZQorICogKHRoZXJlIGlzIG5vIHN5c3RlbSBidXMgb24gV2luZG93cyBzbyB0aGlzIGNhbiBqdXN0CisgKiByZXR1cm4gRkFMU0UgYW5kIHByaW50IGEgd2FybmluZyBvciBzb21ldGhpbmcpCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3N5c3RlbV9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCBEQlVTX1NZU1RFTV9DT05GSUdfRklMRSk7Cit9CisKKy8qKgorICogQXBwZW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBzZXNzaW9uLmNvbmYgZmlsZS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCBEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEUpOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBidXMgZGFlbW9uIGlzIHNpZ25hbGVkIHRvIHJlbG9hZCBpdHMgY29uZmlndXJhdGlvbjsgYW55CisgKiBjYWNoZXMgc2hvdWxkIGJlIG51a2VkLiBPZiBjb3Vyc2UgYW55IGNhY2hlcyB0aGF0IG5lZWQgZXhwbGljaXQgcmVsb2FkCisgKiBhcmUgcHJvYmFibHkgYnJva2VuLCBidXQgYydlc3QgbGEgdmllLgorICoKKyAqCisgKi8KK3ZvaWQKK19kYnVzX2ZsdXNoX2NhY2hlcyAodm9pZCkKK3sKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaF9zeXN0ZW0gKCk7Cit9CisKKy8qKgorICogQXBwZW5kcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGEga2V5cmluZyBmb3IgdGhlIGdpdmVuIGNyZWRlbnRpYWxzCisgKiBzaG91bGQgYmUgc3RvcmVkLiAgVGhlIGNyZWRlbnRpYWxzIHNob3VsZCBoYXZlIGVpdGhlciBhIFdpbmRvd3Mgb3IKKyAqIFVOSVggdXNlciBpbiB0aGVtLiAgVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgYW4gYWJzb2x1dGUgcGF0aC4KKyAqCisgKiBPbiBVTklYIHRoZSBkaXJlY3RvcnkgaXMgfi8uZGJ1cy1rZXlyaW5ncyB3aGlsZSBvbiBXaW5kb3dzIGl0IHNob3VsZCBwcm9iYWJseQorICogYmUgc29tZXRoaW5nIGVsc2UsIHNpbmNlIHRoZSBkb3RmaWxlIGNvbnZlbnRpb24gaXMgbm90IG5vcm1hbCBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBkaXJlY3Rvcnkgc3RyaW5nIHRvIGFwcGVuZCBkaXJlY3RvcnkgdG8KKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0aGUgZGlyZWN0b3J5IHNob3VsZCBiZSBmb3IKKyAqCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfa2V5cmluZ19kaXJlY3RvcnlfZm9yX2NyZWRlbnRpYWxzIChEQnVzU3RyaW5nICAgICAgKmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIERCdXNTdHJpbmcgaG9tZWRpcjsKKyAgREJ1c1N0cmluZyBkb3RkaXI7CisgIGRidXNfdWlkX3QgdWlkOworCisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRlbnRpYWxzKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmhvbWVkaXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICB1aWQgPSBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGNyZWRlbnRpYWxzKTsKKyAgX2RidXNfYXNzZXJ0ICh1aWQgIT0gREJVU19VSURfVU5TRVQpOworCisgIGlmICghX2RidXNfaG9tZWRpcl9mcm9tX3VpZCAodWlkLCAmaG9tZWRpcikpCisgICAgZ290byBmYWlsZWQ7CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIHsKKyAgICBjb25zdCBjaGFyICpvdmVycmlkZTsKKworICAgIG92ZXJyaWRlID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX0hPTUVESVIiKTsKKyAgICBpZiAob3ZlcnJpZGUgIT0gTlVMTCAmJiAqb3ZlcnJpZGUgIT0gJ1wwJykKKyAgICAgIHsKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZob21lZGlyLCAwKTsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmaG9tZWRpciwgb3ZlcnJpZGUpKQorICAgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2luZyBmYWtlIGhvbWVkaXIgZm9yIHRlc3Rpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZob21lZGlyKSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGF0aWMgZGJ1c19ib29sX3QgYWxyZWFkeV93YXJuZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKCFhbHJlYWR5X3dhcm5lZCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiVXNpbmcgeW91ciByZWFsIGhvbWUgZGlyZWN0b3J5IGZvciB0ZXN0aW5nLCBzZXQgREJVU19URVNUX0hPTUVESVIgdG8gYXZvaWRcbiIpOworICAgICAgICAgICAgYWxyZWFkeV93YXJuZWQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZkb3RkaXIsICIuZGJ1cy1rZXlyaW5ncyIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3RkaXIpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZob21lZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnksIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJlY3RvcnkpKSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmaG9tZWRpcik7CisgIHJldHVybiBGQUxTRTsKK30KKworLy9QRU5ESU5HKGtkYWIpIGRvY3MKK2RidXNfYm9vbF90CitfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIChjb25zdCBjaGFyKiBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIHJldHVybiBUUlVFOworfQorCisvL1BFTkRJTkcoa2RhYikgZG9jcwordm9pZAorX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzICh2b2lkKQoreworCit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIEVBR0FJTiBvciBFV09VTERCTE9DSyAodGhpcyBoYXMgdG8gYmUgZG9uZSBkaWZmZXJlbnRseQorICogZm9yIFdpbnNvY2sgc28gaXMgYWJzdHJhY3RlZCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcnJubyA9PSBFQUdBSU4gb3IgZXJybm8gPT0gRVdPVUxEQkxPQ0sKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKHZvaWQpCit7CisgIHJldHVybiBlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0s7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIGRpcmVjdG9yeTsgRGlyZWN0b3J5IG11c3QgYmUgZW1wdHkKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZGlyZWN0b3J5IGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgaW5pdGlhbGl6ZWQgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kZWxldGVfZGlyZWN0b3J5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAocm1kaXIgKGZpbGVuYW1lX2MpICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlbW92ZSBkaXJlY3RvcnkgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiAgQ2hlY2tzIHdoZXRoZXIgZmlsZSBkZXNjcmlwdG9ycyBtYXkgYmUgcGFzc2VkIHZpYSB0aGUgc29ja2V0CisgKgorICogIEBwYXJhbSBmZCB0aGUgc29ja2V0CisgKiAgQHJldHVybiBUUlVFIHdoZW4gZmQgcGFzc2luZyBvdmVyIHRoaXMgc29ja2V0IGlzIHN1cHBvcnRlZAorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NvY2tldF9jYW5fcGFzc191bml4X2ZkKGludCBmZCkgeworCisjaWZkZWYgU0NNX1JJR0hUUworICB1bmlvbiB7CisgICAgc3RydWN0IHNvY2thZGRyIHNhOworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0b3JhZ2U7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIHVuOworICB9IHNhX2J1ZjsKKworICBzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhX2J1Zik7CisKKyAgX0RCVVNfWkVSTyhzYV9idWYpOworCisgIGlmIChnZXRzb2NrbmFtZShmZCwgJnNhX2J1Zi5zYSwgJnNhX2xlbikgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gc2FfYnVmLnNhLnNhX2ZhbWlseSA9PSBBRl9VTklYOworCisjZWxzZQorICByZXR1cm4gRkFMU0U7CisKKyNlbmRpZgorfQorCisKKy8qCisgKiByZXBsYWNlcyB0aGUgdGVybSBEQlVTX1BSRUZJWCBpbiBjb25maWd1cmVfdGltZV9wYXRoIGJ5IHRoZQorICogY3VycmVudCBkYnVzIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIE9uIHVuaXggdGhpcyBmdW5jdGlvbiBpcyBhIG5vb3AKKyAqCisgKiBAcGFyYW0gY29uZmlndXJlX3RpbWVfcGF0aAorICogQHJldHVybiByZWFsIHBhdGgKKyAqLworY29uc3QgY2hhciAqCitfZGJ1c19yZXBsYWNlX2luc3RhbGxfcHJlZml4IChjb25zdCBjaGFyICpjb25maWd1cmVfdGltZV9wYXRoKQoreworICByZXR1cm4gY29uZmlndXJlX3RpbWVfcGF0aDsKK30KKworLyogdGVzdHMgaW4gZGJ1cy1zeXNkZXBzLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDIyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy11bml4LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXVuaXguaCBVTklYLXNwZWNpZmljIHdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TWVNERVBTX1VOSVhfSAorI2RlZmluZSBEQlVTX1NZU0RFUFNfVU5JWF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCisjaWZkZWYgREJVU19XSU4KKyNlcnJvciAiRG9uJ3QgaW5jbHVkZSB0aGlzIG9uIFdpbmRvd3MiCisjZW5kaWYKKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU3lzZGVwc1VuaXggVU5JWC1zcGVjaWZpYyBpbnRlcm5hbCBBUEkKKyAqIEBpbmdyb3VwIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbnRlcm5hbCBzeXN0ZW0tZGVwZW5kZW50IEFQSSBhdmFpbGFibGUgb24gVU5JWCBvbmx5CisgKiBAeworICovCisKK2RidXNfYm9vbF90CitfZGJ1c19jbG9zZSAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitpbnQgX2RidXNfZHVwICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitpbnQKK19kYnVzX3JlYWQgICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQpOworaW50CitfZGJ1c193cml0ZSAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pOworaW50CitfZGJ1c193cml0ZV90d28gKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMik7CisKK2RidXNfYm9vbF90IF9kYnVzX29wZW5fdW5peF9zb2NrZXQgKGludCAgICAgICAgICAgICAgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworaW50IF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworaW50IF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCAgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitpbnQgX2RidXNfbGlzdGVuX3N5c3RlbWRfc29ja2V0cyAoaW50ICAgICAgICoqZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfcmVhZF9jcmVkZW50aWFscyAoaW50ICAgICAgICAgICAgICAgY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZW5kX2NyZWRlbnRpYWxzIChpbnQgICAgICAgICAgICAgIHNlcnZlcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29rdXBfbGF1bmNoZF9zb2NrZXQgKERCdXNTdHJpbmcgKnNvY2tldF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYXVuY2hkX2Vudl92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgVU5JWCB1c2VyICovCit0eXBlZGVmIHN0cnVjdCBEQnVzVXNlckluZm8gIERCdXNVc2VySW5mbzsKKy8qKiBJbmZvcm1hdGlvbiBhYm91dCBhIFVOSVggZ3JvdXAgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNHcm91cEluZm8gREJ1c0dyb3VwSW5mbzsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIFVOSVggdXNlcgorICovCitzdHJ1Y3QgREJ1c1VzZXJJbmZvCit7CisgIGRidXNfdWlkX3QgIHVpZDsgICAgICAgICAgICAvKio8IFVJRCAqLworICBkYnVzX2dpZF90ICBwcmltYXJ5X2dpZDsgICAgLyoqPCBHSUQgKi8KKyAgZGJ1c19naWRfdCAqZ3JvdXBfaWRzOyAgICAgIC8qKjwgR3JvdXBzIElEcywgKmluY2x1ZGluZyogYWJvdmUgcHJpbWFyeSBncm91cCAqLworICBpbnQgICAgICAgICBuX2dyb3VwX2lkczsgICAgLyoqPCBTaXplIG9mIGdyb3VwIElEcyBhcnJheSAqLworICBjaGFyICAgICAgICp1c2VybmFtZTsgICAgICAgLyoqPCBVc2VybmFtZSAqLworICBjaGFyICAgICAgICpob21lZGlyOyAgICAgICAgLyoqPCBIb21lIGRpcmVjdG9yeSAqLworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIFVOSVggZ3JvdXAKKyAqLworc3RydWN0IERCdXNHcm91cEluZm8KK3sKKyAgZGJ1c19naWRfdCAgZ2lkOyAgICAgICAgICAgIC8qKjwgR0lEICovCisgIGNoYXIgICAgICAgKmdyb3VwbmFtZTsgICAgICAvKio8IEdyb3VwIG5hbWUgKi8KK307CisKK2RidXNfYm9vbF90IF9kYnVzX3VzZXJfaW5mb19maWxsICAgICAoREJ1c1VzZXJJbmZvICAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3VzZXJfaW5mb19maWxsX3VpZCAoREJ1c1VzZXJJbmZvICAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICBfZGJ1c191c2VyX2luZm9fZnJlZSAgICAgKERCdXNVc2VySW5mbyAgICAgKmluZm8pOworCitkYnVzX2Jvb2xfdCBfZGJ1c19ncm91cF9pbmZvX2ZpbGwgICAgIChEQnVzR3JvdXBJbmZvICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfZ3JvdXBfaW5mb19maWxsX2dpZCAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fZnJlZSAgICAgKERCdXNHcm91cEluZm8gICAgKmluZm8pOworCitkYnVzX3VpZF90ICAgIF9kYnVzX2dldHVpZCAodm9pZCk7CitkYnVzX3VpZF90ICAgIF9kYnVzX2dldGV1aWQgKHZvaWQpOworZGJ1c19naWRfdCAgICBfZGJ1c19nZXRnaWQgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19wYXJzZV91aWQgKGNvbnN0IERCdXNTdHJpbmcgICp1aWRfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NZU0RFUFNfVU5JWF9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MGY2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYwpAQCAtMCwwICsxLDExNDggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIFdvdWxkIGJlIGluIGRidXMtc3lzZGVwcy11bml4LmMsIGJ1dCBub3QgdXNlZCBpbiBsaWJkYnVzCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1waXBlLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjZGVmaW5lIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtdXNlcmRiLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworI2lmZGVmIEhBVkVfU1lTX1NZU0xJTUlUU19ICisjaW5jbHVkZSA8c3lzL3N5c2xpbWl0cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0ludGVybmFsc1V0aWxzCisgKiBAeworICovCisKKworLyoqCisgKiBEb2VzIHRoZSBjaGRpciwgZm9yaywgc2V0c2lkLCBldGMuIHRvIGJlY29tZSBhIGRhZW1vbiBwcm9jZXNzLgorICoKKyAqIEBwYXJhbSBwaWRmaWxlICNOVUxMLCBvciBwaWRmaWxlIHRvIGNyZWF0ZQorICogQHBhcmFtIHByaW50X3BpZF9waXBlIHBpcGUgdG8gcHJpbnQgZGFlbW9uJ3MgcGlkIHRvLCBvciAtMSBmb3Igbm9uZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcGFyYW0ga2VlcF91bWFzayAjVFJVRSB0byBrZWVwIHRoZSBvcmlnaW5hbCB1bWFzaworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2JlY29tZV9kYWVtb24gKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAga2VlcF91bWFzaykKK3sKKyAgY29uc3QgY2hhciAqczsKKyAgcGlkX3QgY2hpbGRfcGlkOworICBpbnQgZGV2X251bGxfZmQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIkJlY29taW5nIGEgZGFlbW9uLi4uXG4iKTsKKworICBfZGJ1c192ZXJib3NlICgiY2hkaXIgdG8gL1xuIik7CisgIGlmIChjaGRpciAoIi8iKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNoZGlyKCkgdG8gcm9vdCBkaXJlY3RvcnkiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImZvcmtpbmcuLi5cbiIpOworICBzd2l0Y2ggKChjaGlsZF9waWQgPSBmb3JrICgpKSkKKyAgICB7CisgICAgY2FzZSAtMToKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmb3JrIGZhaWxlZFxuIik7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcmsgZGFlbW9uOiAlcyIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDA6CisgICAgICBfZGJ1c192ZXJib3NlICgiaW4gY2hpbGQsIGNsb3Npbmcgc3RkIGZpbGUgZGVzY3JpcHRvcnNcbiIpOworCisgICAgICAvKiBzaWxlbnRseSBpZ25vcmUgZmFpbHVyZXMgaGVyZSwgaWYgc29tZW9uZQorICAgICAgICogZG9lc24ndCBoYXZlIC9kZXYvbnVsbCB3ZSBtYXkgYXMgd2VsbCB0cnkKKyAgICAgICAqIHRvIGNvbnRpbnVlIGFueWhvdworICAgICAgICovCisgICAgICAKKyAgICAgIGRldl9udWxsX2ZkID0gb3BlbiAoIi9kZXYvbnVsbCIsIE9fUkRXUik7CisgICAgICBpZiAoZGV2X251bGxfZmQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIGR1cDIgKGRldl9udWxsX2ZkLCAwKTsKKyAgICAgICAgICBkdXAyIChkZXZfbnVsbF9mZCwgMSk7CisgICAgICAgICAgCisgICAgICAgICAgcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfREVCVUdfT1VUUFVUIik7CisgICAgICAgICAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSAnXDAnKQorICAgICAgICAgICAgZHVwMiAoZGV2X251bGxfZmQsIDIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJrZWVwaW5nIHN0ZGVyciBvcGVuIGR1ZSB0byBEQlVTX0RFQlVHX09VVFBVVFxuIik7CisgICAgICAgIH0KKworICAgICAgaWYgKCFrZWVwX3VtYXNrKQorICAgICAgICB7CisgICAgICAgICAgLyogR2V0IGEgcHJlZGljdGFibGUgdW1hc2sgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2V0dGluZyB1bWFza1xuIik7CisgICAgICAgICAgdW1hc2sgKDAyMik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoImNhbGxpbmcgc2V0c2lkKClcbiIpOworICAgICAgaWYgKHNldHNpZCAoKSA9PSAtMSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0c2lkKCkgZmFpbGVkIik7CisgICAgICAKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKHBpZGZpbGUsIHByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfcGlkLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicGlkIGZpbGUgb3IgcGlwZSB3cml0ZSBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBraWxsIChjaGlsZF9waWQsIFNJR1RFUk0pOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgicGFyZW50IGV4aXRpbmdcbiIpOworICAgICAgX2V4aXQgKDApOworICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBDcmVhdGVzIGEgZmlsZSBjb250YWluaW5nIHRoZSBwcm9jZXNzIElELgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSBwaWQgb3VyIHByb2Nlc3MgSUQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c193cml0ZV9waWRfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcGlkLAorCQkgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqY2ZpbGVuYW1lOworICBpbnQgZmQ7CisgIEZJTEUgKmY7CisKKyAgY2ZpbGVuYW1lID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICBmZCA9IG9wZW4gKGNmaWxlbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX0VYQ0x8T19CSU5BUlksIDA2NDQpOworICAKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiOiAlcyIsIGNmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKChmID0gZmRvcGVuIChmZCwgInciKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZkb3BlbiBmZCAlZDogJXMiLCBmZCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChmcHJpbnRmIChmLCAiJWx1XG4iLCBwaWQpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIHRvIFwiJXNcIjogJXMiLCBjZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAKKyAgICAgIGZjbG9zZSAoZik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmY2xvc2UgKGYpID09IEVPRikKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNsb3NlIFwiJXNcIjogJXMiLCBjZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBnaXZlbiBwaWRfdG9fd3JpdGUgdG8gYSBwaWRmaWxlIChpZiBub24tTlVMTCkgYW5kL29yIHRvIGEKKyAqIHBpcGUgKGlmIG5vbi1OVUxMKS4gRG9lcyBub3RoaW5nIGlmIHBpZGZpbGUgYW5kIHByaW50X3BpZF9waXBlIGFyZSBib3RoCisgKiBOVUxMLgorICoKKyAqIEBwYXJhbSBwaWRmaWxlIHRoZSBmaWxlIHRvIHdyaXRlIHRvIG9yICNOVUxMCisgKiBAcGFyYW0gcHJpbnRfcGlkX3BpcGUgdGhlIHBpcGUgdG8gd3JpdGUgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwaWRfdG9fd3JpdGUgdGhlIHBpZCB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvbiBmYWlsdXJlCisgKiBAcmV0dXJucyBGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKHBpZGZpbGUpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgcGlkIGZpbGUgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAocGlkZmlsZSkpOworICAgICAgaWYgKCFfZGJ1c193cml0ZV9waWRfZmlsZSAocGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwaWQgZmlsZSB3cml0ZSBmYWlsZWRcbiIpOworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgZmlsZSByZXF1ZXN0ZWRcbiIpOworICAgIH0KKworICBpZiAocHJpbnRfcGlkX3BpcGUgIT0gTlVMTCAmJiBfZGJ1c19waXBlX2lzX3ZhbGlkIChwcmludF9waWRfcGlwZSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBwaWQ7CisgICAgICBpbnQgYnl0ZXM7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nIG91ciBwaWQgdG8gcGlwZSAlIlBSSXVQVFIiXG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJpbnRfcGlkX3BpcGUtPmZkX29yX2hhbmRsZSk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwaWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCSAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmcGlkLCBwaWRfdG9fd3JpdGUpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwaWQsICJcbiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwkgIAorICAgICAgYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBpZCk7CisgICAgICBpZiAoX2RidXNfcGlwZV93cml0ZSAocHJpbnRfcGlkX3BpcGUsICZwaWQsIDAsIGJ5dGVzLCBlcnJvcikgIT0gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBfZGJ1c19waXBlX3dyaXRlIHNldHMgZXJyb3Igb25seSBvbiBmYWlsdXJlLCBub3Qgc2hvcnQgd3JpdGUgKi8KKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQoZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50aW5nIG1lc3NhZ2UgYnVzIFBJRDogZGlkIG5vdCB3cml0ZSBlbm91Z2ggYnl0ZXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGlkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwkgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgcGlwZSB0byB3cml0ZSB0b1xuIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IGFmdGVyIHRoZSBmb3JrIHdlIGNhbiBzdWNjZXNzZnVsbHkgY2hhbmdlIHRvIHRoaXMgdXNlci4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWUgZ2l2ZW4gaW4gdGhlIGRhZW1vbiBjb25maWd1cmF0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyKQoreworICBEQnVzU3RyaW5nIHU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCB1c2VyKTsKKworICByZXR1cm4gX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKCZ1LCBOVUxMLCBOVUxMKTsKK30KKworCisvKiBUaGUgSEFWRV9MSUJBVURJVCBjYXNlIGxpdmVzIGluIHNlbGludXguYyAqLworI2lmbmRlZiBIQVZFX0xJQkFVRElUCisvKioKKyAqIENoYW5nZXMgdGhlIHVzZXIgYW5kIGdyb3VwIHRoZSBidXMgaXMgcnVubmluZyBhcy4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlciB0byBiZWNvbWUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NoYW5nZV90b19kYWVtb25fdXNlciAgKGNvbnN0IGNoYXIgICAgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgZGJ1c191aWRfdCB1aWQ7CisgIGRidXNfZ2lkX3QgZ2lkOworICBEQnVzU3RyaW5nIHU7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCB1c2VyKTsKKworICBpZiAoIV9kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwICgmdSwgJnVpZCwgJmdpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVXNlciAnJXMnIGRvZXMgbm90IGFwcGVhciB0byBleGlzdD8iLAorICAgICAgICAgICAgICAgICAgICAgIHVzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBzZXRncm91cHMoKSBvbmx5IHdvcmtzIGlmIHdlIGFyZSBhIHByaXZpbGVnZWQgcHJvY2VzcywKKyAgICogc28gd2UgZG9uJ3QgcmV0dXJuIGVycm9yIG9uIGZhaWx1cmU7IHRoZSBvbmx5IHBvc3NpYmxlCisgICAqIGZhaWx1cmUgaXMgdGhhdCB3ZSBkb24ndCBoYXZlIHBlcm1zIHRvIGRvIGl0LgorICAgKgorICAgKiBub3Qgc3VyZSB0aGlzIGlzIHJpZ2h0LCBtYXliZSBpZiBzZXR1aWQoKQorICAgKiBpcyBnb2luZyB0byB3b3JrIHRoZW4gc2V0Z3JvdXBzKCkgc2hvdWxkIGFsc28gd29yay4KKyAgICovCisgIGlmIChzZXRncm91cHMgKDAsIE5VTEwpIDwgMCkKKyAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGRyb3Agc3VwcGxlbWVudGFyeSBncm91cHM6ICVzXG4iLAorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgIC8qIFNldCBHSUQgZmlyc3QsIG9yIHRoZSBzZXR1aWQgbWF5IHJlbW92ZSBvdXIgcGVybWlzc2lvbgorICAgKiB0byBjaGFuZ2UgdGhlIEdJRAorICAgKi8KKyAgaWYgKHNldGdpZCAoZ2lkKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgR0lEIHRvICVsdTogJXMiLCBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChzZXR1aWQgKHVpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFVJRCB0byAlbHU6ICVzIiwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiAhSEFWRV9MSUJBVURJVCAqLworCisKKy8qKgorICogQXR0ZW1wdCB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCBwcm9jZXNzIGNhbiBvcGVuCisgKiBhdCBsZWFzdCBAbGltaXQgZmlsZSBkZXNjcmlwdG9ycy4KKyAqCisgKiBJZiBAbGltaXQgaXMgbG93ZXIgdGhhbiB0aGUgY3VycmVudCwgaXQgd2lsbCBub3QgYmUKKyAqIGxvd2VyZWQuICBObyBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdCBjYW4KKyAqIG5vdCBiZSBzYXRpc2ZpZWQuCisgKgorICogQGxpbWl0IE51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCisgKi8KK3ZvaWQKK19kYnVzX3JlcXVlc3RfZmlsZV9kZXNjcmlwdG9yX2xpbWl0ICh1bnNpZ25lZCBpbnQgbGltaXQpCit7CisjaWZkZWYgSEFWRV9TRVRSTElNSVQKKyAgc3RydWN0IHJsaW1pdCBsaW07CisgIHN0cnVjdCBybGltaXQgdGFyZ2V0X2xpbTsKKyAgdW5zaWduZWQgaW50IGN1cnJlbnRfbGltaXQ7CisKKyAgLyogTm8gcG9pbnQgdG8gZG9pbmcgdGhpcyBwcmFjdGljYWxseSBzcGVha2luZworICAgKiBpZiB3ZSdyZSBub3QgdWlkIDAuICBXZSBleHBlY3QgdGhlIHN5c3RlbQorICAgKiBidXMgdG8gdXNlIHRoaXMgYmVmb3JlIHdlIGNoYW5nZSBVSUQsIGFuZAorICAgKiB0aGUgc2Vzc2lvbiBidXMgdGFrZXMgdGhlIExpbnV4IGRlZmF1bHQKKyAgICogb2YgMTAyNCBmb3IgYm90aCBjdXIgYW5kIG1heC4KKyAgICovCisgIGlmIChnZXR1aWQgKCkgIT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGdldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJmxpbSkgPCAwKQorICAgIHJldHVybjsKKworICBpZiAobGltLnJsaW1fY3VyID49IGxpbWl0KQorICAgIHJldHVybjsKKworICAvKiBJZ25vcmUgIm1heGltdW0gbGltaXQiLCBhc3N1bWUgd2UgaGF2ZSB0aGUgInN1cGVydXNlciIKKyAgICogcHJpdmlsZWdlcy4gIE9uIExpbnV4IHRoaXMgaXMgQ0FQX1NZU19SRVNPVVJDRS4KKyAgICovCisgIHRhcmdldF9saW0ucmxpbV9jdXIgPSB0YXJnZXRfbGltLnJsaW1fbWF4ID0gbGltaXQ7CisgIC8qIEFsc28gaWdub3JlIGVycm9yczsgaWYgd2UgZmFpbCwgd2Ugd2lsbCBhdCBsZWFzdCB3b3JrCisgICAqIHVwIHRvIHdoYXRldmVyIGxpbWl0IHdlIGhhZCwgd2hpY2ggc2VlbXMgYmV0dGVyIHRoYW4KKyAgICoganVzdCBvdXRyaWdodCBhYm9ydGluZy4KKyAgICoKKyAgICogSG93ZXZlciwgaW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgcHJvYmFibHkgbG9nIHRoaXMgc28gT1MgYnVpbGRlcnMKKyAgICogaGF2ZSBhIGNoYW5jZSB0byBub3RpY2UgYW55IG1pc2NvbmZpZ3VyYXRpb24gbGlrZSBkYnVzLWRhZW1vbgorICAgKiBiZWluZyBzdGFydGVkIHdpdGhvdXQgQ0FQX1NZU19SRVNPVVJDRS4KKyAgICovCisgIHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJnRhcmdldF9saW0pOworI2VuZGlmCit9CisKK3ZvaWQgCitfZGJ1c19pbml0X3N5c3RlbV9sb2cgKHZvaWQpCit7CisgIG9wZW5sb2cgKCJkYnVzIiwgTE9HX1BJRCB8IExPR19QRVJST1IsIExPR19EQUVNT04pOworfQorLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3N5c3RlbV9sb2cgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICB2YV9zdGFydCAoYXJncywgbXNnKTsKKworICBfZGJ1c19zeXN0ZW1fbG9ndiAoc2V2ZXJpdHksIG1zZywgYXJncyk7CisKKyAgdmFfZW5kIChhcmdzKTsKK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKiBJZiB0aGUgRkFUQUwgc2V2ZXJpdHkgaXMgZ2l2ZW4sIHRoaXMgZnVuY3Rpb24gd2lsbCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0KKyAqIHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZAorX2RidXNfc3lzdGVtX2xvZ3YgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFyZ3MpCit7CisgIGludCBmbGFnczsKKyAgc3dpdGNoIChzZXZlcml0eSkKKyAgICB7CisgICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19JTkZPOgorICAgICAgICBmbGFncyA9ICBMT0dfREFFTU9OIHwgTE9HX05PVElDRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWToKKyAgICAgICAgZmxhZ3MgPSBMT0dfQVVUSCB8IExPR19OT1RJQ0U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfRkFUQUw6CisgICAgICAgIGZsYWdzID0gTE9HX0RBRU1PTnxMT0dfQ1JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm47CisgICAgfQorCisgIHZzeXNsb2cgKGZsYWdzLCBtc2csIGFyZ3MpOworCisgIGlmIChzZXZlcml0eSA9PSBEQlVTX1NZU1RFTV9MT0dfRkFUQUwpCisgICAgZXhpdCAoMSk7Cit9CisKKy8qKiBJbnN0YWxscyBhIFVOSVggc2lnbmFsIGhhbmRsZXIKKyAqCisgKiBAcGFyYW0gc2lnIHRoZSBzaWduYWwgdG8gaGFuZGxlCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlcgorICovCit2b2lkCitfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKGludCAgICAgICAgICAgICAgIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NpZ25hbEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisgIHNpZ3NldF90IGVtcHR5X21hc2s7CisgIAorICBzaWdlbXB0eXNldCAoJmVtcHR5X21hc2spOworICBhY3Quc2FfaGFuZGxlciA9IGhhbmRsZXI7CisgIGFjdC5zYV9tYXNrICAgID0gZW1wdHlfbWFzazsKKyAgYWN0LnNhX2ZsYWdzICAgPSAwOworICBzaWdhY3Rpb24gKHNpZywgICZhY3QsIE5VTEwpOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgcmV0dXJuIChhY2Nlc3MgKGZpbGUsIEZfT0spID09IDApOworfQorCisvKiogQ2hlY2tzIGlmIHVzZXIgaXMgYXQgdGhlIGNvbnNvbGUKKyoKKyogQHBhcmFtIHVzZXJuYW1lIHVzZXIgdG8gY2hlY2sKKyogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisqIEByZXR1cm5zICNUUlVFIGlzIHRoZSB1c2VyIGlzIGF0IHRoZSBjb25zb2xlaSBhbmQgdGhlcmUgYXJlIG5vIGVycm9ycworKi8KK2RidXNfYm9vbF90IAorX2RidXNfdXNlcl9hdF9jb25zb2xlIChjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisKKyAgREJ1c1N0cmluZyBmOworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gRkFMU0U7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmYsIERCVVNfQ09OU09MRV9BVVRIX0RJUikpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZiwgdXNlcm5hbWUpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXN1bHQgPSBfZGJ1c19maWxlX2V4aXN0cyAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZikpOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmYpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgZmlsZW5hbWUgaXMgYW4gYWJzb2x1dGUgcGF0aAorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIGFuIGFic29sdXRlIHBhdGgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGZpbGVuYW1lKSA+IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDApID09ICcvJzsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBzdGF0KCkgd3JhcHBlci4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvIHN0YXQKKyAqIEBwYXJhbSBzdGF0YnVmIHRoZSBzdGF0IGluZm8gdG8gZmlsbCBpbgorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdGF0IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgIERCdXNTdGF0ICAgICAgICAgKnN0YXRidWYsCisgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKyAgc3RydWN0IHN0YXQgc2I7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaWYgKHN0YXQgKGZpbGVuYW1lX2MsICZzYikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICIlcyIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzdGF0YnVmLT5tb2RlID0gc2Iuc3RfbW9kZTsKKyAgc3RhdGJ1Zi0+bmxpbmsgPSBzYi5zdF9ubGluazsKKyAgc3RhdGJ1Zi0+dWlkID0gc2Iuc3RfdWlkOworICBzdGF0YnVmLT5naWQgPSBzYi5zdF9naWQ7CisgIHN0YXRidWYtPnNpemUgPSBzYi5zdF9zaXplOworICBzdGF0YnVmLT5hdGltZSA9IHNiLnN0X2F0aW1lOworICBzdGF0YnVmLT5tdGltZSA9IHNiLnN0X210aW1lOworICBzdGF0YnVmLT5jdGltZSA9IHNiLnN0X2N0aW1lOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogSW50ZXJuYWxzIG9mIGRpcmVjdG9yeSBpdGVyYXRvcgorICovCitzdHJ1Y3QgREJ1c0Rpckl0ZXIKK3sKKyAgRElSICpkOyAvKio8IFRoZSBESVIqIGZyb20gb3BlbmRpcigpICovCisgIAorfTsKKworLyoqCisgKiBPcGVuIGEgZGlyZWN0b3J5IHRvIGl0ZXJhdGUgb3Zlci4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGRpcmVjdG9yeSBuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXhjZXB0aW9uIHJldHVybiBvYmplY3Qgb3IgI05VTEwKKyAqIEByZXR1cm5zIG5ldyBpdGVyYXRvciwgb3IgI05VTEwgb24gZXJyb3IKKyAqLworREJ1c0Rpckl0ZXIqCitfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERJUiAqZDsKKyAgREJ1c0Rpckl0ZXIgKml0ZXI7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgZCA9IG9wZW5kaXIgKGZpbGVuYW1lX2MpOworICBpZiAoZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgaXRlciA9IGRidXNfbmV3MCAoREJ1c0Rpckl0ZXIsIDEpOworICBpZiAoaXRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNsb3NlZGlyIChkKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRpcmVjdG9yeSBpdGVyYXRvciIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGl0ZXItPmQgPSBkOworCisgIHJldHVybiBpdGVyOworfQorCisvKioKKyAqIEdldCBuZXh0IGZpbGUgaW4gdGhlIGRpcmVjdG9yeS4gV2lsbCBub3QgcmV0dXJuICIuIiBvciAiLi4iICBvbgorICogVU5JWC4gSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgY29udGVudHMgb2YgImZpbGVuYW1lIiBhcmUKKyAqIHVuZGVmaW5lZC4gVGhlIGVycm9yIGlzIG5ldmVyIHNldCBpZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgcmUtZW50cmFudCwgYW5kIG5vdCBuZWNlc3NhcmlseSB0aHJlYWQtc2FmZS4KKyAqIE9ubHkgdXNlIGl0IGZvciB0ZXN0IGNvZGUgb3Igc2luZ2xlLXRocmVhZGVkIHV0aWxpdGllcy4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBmaWxlbmFtZSBzdHJpbmcgdG8gYmUgc2V0IHRvIHRoZSBuZXh0IGZpbGUgaW4gdGhlIGRpcgorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IKKyAqIEByZXR1cm5zICNUUlVFIGlmIGZpbGVuYW1lIHdhcyBmaWxsZWQgaW4gd2l0aCBhIG5ldyBmaWxlbmFtZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKERCdXNEaXJJdGVyICAgICAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIHN0cnVjdCBkaXJlbnQgKmVudDsKKyAgaW50IGVycjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworIGFnYWluOgorICBlcnJubyA9IDA7CisgIGVudCA9IHJlYWRkaXIgKGl0ZXItPmQpOworCisgIGlmICghZW50KQorICAgIHsKKyAgICAgIGVyciA9IGVycm5vOworCisgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVyciksCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJyKSk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKGVudC0+ZF9uYW1lWzBdID09ICcuJyAmJgorICAgICAgICAgICAoZW50LT5kX25hbWVbMV0gPT0gJ1wwJyB8fAorICAgICAgICAgICAgKGVudC0+ZF9uYW1lWzFdID09ICcuJyAmJiBlbnQtPmRfbmFtZVsyXSA9PSAnXDAnKSkpCisgICAgZ290byBhZ2FpbjsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChmaWxlbmFtZSwgMCk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGZpbGVuYW1lLCBlbnQtPmRfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbWVtb3J5IHRvIHJlYWQgZGlyZWN0b3J5IGVudHJ5Iik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBDbG9zZXMgYSBkaXJlY3RvcnkgaXRlcmF0aW9uLgorICovCit2b2lkCitfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKERCdXNEaXJJdGVyICppdGVyKQoreworICBjbG9zZWRpciAoaXRlci0+ZCk7CisgIGRidXNfZnJlZSAoaXRlcik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmlsbF91c2VyX2luZm9fZnJvbV9ncm91cCAoc3RydWN0IGdyb3VwICAqZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNHcm91cEluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgX2RidXNfYXNzZXJ0IChnLT5ncl9uYW1lICE9IE5VTEwpOworICAKKyAgaW5mby0+Z2lkID0gZy0+Z3JfZ2lkOworICBpbmZvLT5ncm91cG5hbWUgPSBfZGJ1c19zdHJkdXAgKGctPmdyX25hbWUpOworCisgIC8qIGluZm8tPm1lbWJlcnMgPSBkYnVzX3N0cmR1cHYgKGctPmdyX21lbSkgKi8KKyAgCisgIGlmIChpbmZvLT5ncm91cG5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmlsbF9ncm91cF9pbmZvIChEQnVzR3JvdXBJbmZvICAgICppbmZvLAorICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmdyb3VwX2Nfc3RyOworCisgIF9kYnVzX2Fzc2VydCAoZ3JvdXBuYW1lICE9IE5VTEwgfHwgZ2lkICE9IERCVVNfR0lEX1VOU0VUKTsKKyAgX2RidXNfYXNzZXJ0IChncm91cG5hbWUgPT0gTlVMTCB8fCBnaWQgPT0gREJVU19HSURfVU5TRVQpOworCisgIGlmIChncm91cG5hbWUpCisgICAgZ3JvdXBfY19zdHIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGdyb3VwbmFtZSk7CisgIGVsc2UKKyAgICBncm91cF9jX3N0ciA9IE5VTEw7CisgIAorICAvKiBGb3Igbm93IGFzc3VtaW5nIHRoYXQgdGhlIGdldGdybmFtKCkgYW5kIGdldGdyZ2lkKCkgZmxhdm9ycworICAgKiBhbHdheXMgY29ycmVzcG9uZCB0byB0aGUgcHduYW0gZmxhdm9ycywgaWYgbm90IHdlIGhhdmUKKyAgICogdG8gYWRkIG1vcmUgY29uZmlndXJlIGNoZWNrcy4KKyAgICovCisgIAorI2lmIGRlZmluZWQgKEhBVkVfUE9TSVhfR0VUUFdOQU1fUikgfHwgZGVmaW5lZCAoSEFWRV9OT05QT1NJWF9HRVRQV05BTV9SKQorICB7CisgICAgc3RydWN0IGdyb3VwICpnOworICAgIGludCByZXN1bHQ7CisgICAgc2l6ZV90IGJ1ZmxlbjsKKyAgICBjaGFyICpidWY7CisgICAgc3RydWN0IGdyb3VwIGdfc3RyOworICAgIGRidXNfYm9vbF90IGI7CisKKyAgICAvKiByZXRyaWV2ZSBtYXhpbXVtIG5lZWRlZCBzaXplIGZvciBidWYgKi8KKyAgICBidWZsZW4gPSBzeXNjb25mIChfU0NfR0VUR1JfUl9TSVpFX01BWCk7CisKKyAgICAvKiBzeXNjb25mIGFjdHVhbGx5IHJldHVybnMgYSBsb25nLCBidXQgZXZlcnl0aGluZyBlbHNlIGV4cGVjdHMgc2l6ZV90LAorICAgICAqIHNvIGp1c3QgcmVjYXN0IGhlcmUuCisgICAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcwNjEKKyAgICAgKi8KKyAgICBpZiAoKGxvbmcpIGJ1ZmxlbiA8PSAwKQorICAgICAgYnVmbGVuID0gMTAyNDsKKworICAgIHJlc3VsdCA9IC0xOworICAgIHdoaWxlICgxKQorICAgICAgeworICAgICAgICBidWYgPSBkYnVzX21hbGxvYyAoYnVmbGVuKTsKKyAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBnID0gTlVMTDsKKyNpZmRlZiBIQVZFX1BPU0lYX0dFVFBXTkFNX1IKKyAgICAgICAgaWYgKGdyb3VwX2Nfc3RyKQorICAgICAgICAgIHJlc3VsdCA9IGdldGdybmFtX3IgKGdyb3VwX2Nfc3RyLCAmZ19zdHIsIGJ1ZiwgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlc3VsdCA9IGdldGdyZ2lkX3IgKGdpZCwgJmdfc3RyLCBidWYsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZyk7CisjZWxzZQorICAgICAgICBnID0gZ2V0Z3JuYW1fciAoZ3JvdXBfY19zdHIsICZnX3N0ciwgYnVmLCBidWZsZW4pOworICAgICAgICByZXN1bHQgPSAwOworI2VuZGlmIC8qICFIQVZFX1BPU0lYX0dFVFBXTkFNX1IgKi8KKyAgICAgICAgLyogVHJ5IGEgYmlnZ2VyIGJ1ZmZlciBpZiBFUkFOR0Ugd2FzIHJldHVybmVkOgorICAgICAgICAgICBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjcyNworICAgICAgICAqLworICAgICAgICBpZiAocmVzdWx0ID09IEVSQU5HRSAmJiBidWZsZW4gPCA1MTIgKiAxMDI0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgICAgIGJ1ZmxlbiAqPSAyOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gMCAmJiBnID09ICZnX3N0cikKKyAgICAgIHsKKyAgICAgICAgYiA9IGZpbGxfdXNlcl9pbmZvX2Zyb21fZ3JvdXAgKGcsIGluZm8sIGVycm9yKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICByZXR1cm4gYjsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdyb3VwICVzIHVua25vd24gb3IgZmFpbGVkIHRvIGxvb2sgaXQgdXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9jX3N0ciA/IGdyb3VwX2Nfc3RyIDogIj8/PyIpOworICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorI2Vsc2UgLyogISBIQVZFX0dFVFBXTkFNX1IgKi8KKyAgeworICAgIC8qIEkgZ3Vlc3Mgd2UncmUgc2NyZXdlZCBvbiB0aHJlYWQgc2FmZXR5IGhlcmUgKi8KKyAgICBzdHJ1Y3QgZ3JvdXAgKmc7CisKKyAgICBnID0gZ2V0Z3JuYW0gKGdyb3VwX2Nfc3RyKTsKKworICAgIGlmIChnICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHJldHVybiBmaWxsX3VzZXJfaW5mb19mcm9tX2dyb3VwIChnLCBpbmZvLCBlcnJvcik7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHcm91cCAlcyB1bmtub3duIG9yIGZhaWxlZCB0byBsb29rIGl0IHVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfY19zdHIgPyBncm91cF9jX3N0ciA6ICI/Pz8iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisjZW5kaWYgIC8qICEgSEFWRV9HRVRQV05BTV9SICovCit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIERCdXNHcm91cEluZm8gc3RydWN0CisgKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBncm91cCBuYW1lLgorICoKKyAqIEBwYXJhbSBpbmZvIHRoZSBncm91cCBpbmZvIHN0cnVjdAorICogQHBhcmFtIGdyb3VwbmFtZSBuYW1lIG9mIGdyb3VwCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHJldHVybgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ3JvdXBfaW5mb19maWxsIChEQnVzR3JvdXBJbmZvICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICByZXR1cm4gZmlsbF9ncm91cF9pbmZvIChpbmZvLCBEQlVTX0dJRF9VTlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBuYW1lLCBlcnJvcik7CisKK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gREJ1c0dyb3VwSW5mbyBzdHJ1Y3QKKyAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuIGdyb3VwIElELgorICoKKyAqIEBwYXJhbSBpbmZvIHRoZSBncm91cCBpbmZvIHN0cnVjdAorICogQHBhcmFtIGdpZCBncm91cCBJRAorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dyb3VwX2luZm9fZmlsbF9naWQgKERCdXNHcm91cEluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIGZpbGxfZ3JvdXBfaW5mbyAoaW5mbywgZ2lkLCBOVUxMLCBlcnJvcik7Cit9CisKKy8qKgorICogUGFyc2UgYSBVTklYIHVzZXIgZnJvbSB0aGUgYnVzIGNvbmZpZyBmaWxlLiBPbiBXaW5kb3dzLCB0aGlzIHNob3VsZAorICogc2ltcGx5IGFsd2F5cyBmYWlsIChqdXN0IHJldHVybiAjRkFMU0UpLgorICoKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUgdGV4dAorICogQHBhcmFtIHVpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgdWlkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X3VzZXJfZnJvbV9jb25maWcgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wKQoreworICByZXR1cm4gX2RidXNfZ2V0X3VzZXJfaWQgKHVzZXJuYW1lLCB1aWRfcCk7CisKK30KKworLyoqCisgKiBQYXJzZSBhIFVOSVggZ3JvdXAgZnJvbSB0aGUgYnVzIGNvbmZpZyBmaWxlLiBPbiBXaW5kb3dzLCB0aGlzIHNob3VsZAorICogc2ltcGx5IGFsd2F5cyBmYWlsIChqdXN0IHJldHVybiAjRkFMU0UpLgorICoKKyAqIEBwYXJhbSBncm91cG5hbWUgdGhlIGdyb3VwbmFtZSB0ZXh0CisgKiBAcGFyYW0gZ2lkX3AgcGxhY2UgdG8gcmV0dXJuIHRoZSBnaWQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VuaXhfZ3JvdXBfZnJvbV9jb25maWcgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkX3ApCit7CisgIHJldHVybiBfZGJ1c19nZXRfZ3JvdXBfaWQgKGdyb3VwbmFtZSwgZ2lkX3ApOworfQorCisvKioKKyAqIEdldHMgYWxsIGdyb3VwcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVTklYIHVzZXIgSUQuIE9uIFVOSVgsCisgKiBqdXN0IGNhbGxzIF9kYnVzX2dyb3Vwc19mcm9tX3VpZCgpLiBPbiBXaW5kb3dzLCBzaG91bGQgYWx3YXlzCisgKiBmYWlsIHNpbmNlIHdlIGRvbid0IGtub3cgYW55IFVOSVggZ3JvdXBzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVJRAorICogQHBhcmFtIGdyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IG9mIGdyb3VwIElEcworICogQHBhcmFtIG5fZ3JvdXBfaWRzIHJldHVybiBsb2NhdGlvbiBmb3IgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X2dyb3Vwc19mcm9tX3VpZCAoZGJ1c191aWRfdCAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAgICoqZ3JvdXBfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpuX2dyb3VwX2lkcykKK3sKKyAgcmV0dXJuIF9kYnVzX2dyb3Vwc19mcm9tX3VpZCAodWlkLCBncm91cF9pZHMsIG5fZ3JvdXBfaWRzKTsKK30KKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBVTklYIHVzZXIgSUQgaXMgYXQgdGhlIGNvbnNvbGUuCisgKiBTaG91bGQgYWx3YXlzIGZhaWwgb24gV2luZG93cyAoc2V0IHRoZSBlcnJvciB0bworICogI0RCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCkuCisgKgorICogQHBhcmFtIHVpZCBVSUQgb2YgcGVyc29uIHRvIGNoZWNrIAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25zb2xlIHVzZXIgYW5kIHRoZXJlIGFyZSBubyBlcnJvcnMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19hdF9jb25zb2xlIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX2lzX2NvbnNvbGVfdXNlciAodWlkLCBlcnJvcik7CisKK30KKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBVTklYIHVzZXIgSUQgbWF0Y2hlcyB0aGUgVUlEIG9mCisgKiB0aGUgcHJvY2Vzcy4gU2hvdWxkIGFsd2F5cyByZXR1cm4gI0ZBTFNFIG9uIFdpbmRvd3MuCisgKgorICogQHBhcmFtIHVpZCB0aGUgVU5JWCB1c2VyIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGlzIHVpZCBvd25zIHRoZSBwcm9jZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdW5peF91c2VyX2lzX3Byb2Nlc3Nfb3duZXIgKGRidXNfdWlkX3QgdWlkKQoreworICByZXR1cm4gdWlkID09IF9kYnVzX2dldGV1aWQgKCk7Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgV2luZG93cyB1c2VyIFNJRCBtYXRjaGVzIHRoZSBvd25lciBvZgorICogdGhlIHByb2Nlc3MuIFNob3VsZCBhbHdheXMgcmV0dXJuICNGQUxTRSBvbiBVTklYLgorICoKKyAqIEBwYXJhbSB3aW5kb3dzX3NpZCB0aGUgV2luZG93cyB1c2VyIFNJRAorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyB1c2VyIG93bnMgdGhlIHByb2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAoY29uc3QgY2hhciAqd2luZG93c19zaWQpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBEQnVzSW50ZXJuYWxzVXRpbHMgZnVuY3Rpb25zICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1N0cmluZworICoKKyAqIEB7CisgKi8KKy8qKgorICogR2V0IHRoZSBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgY29tcGxldGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBkaXJuYW1lIHN0cmluZyB0byBhcHBlbmQgZGlyZWN0b3J5IG5hbWUgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19nZXRfZGlybmFtZSAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGlybmFtZSkKK3sKKyAgaW50IHNlcDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoZmlsZW5hbWUgIT0gZGlybmFtZSk7CisgIF9kYnVzX2Fzc2VydCAoZmlsZW5hbWUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZGlybmFtZSAhPSBOVUxMKTsKKworICAvKiBJZ25vcmUgYW55IHNlcGFyYXRvcnMgb24gdGhlIGVuZCAqLworICBzZXAgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZmlsZW5hbWUpOworICBpZiAoc2VwID09IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIuIik7IC8qIGVtcHR5IHN0cmluZyBwYXNzZWQgaW4gKi8KKyAgICAKKyAgd2hpbGUgKHNlcCA+IDAgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJy8nKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworICAKKyAgaWYgKHNlcCA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLyIpOworICAKKyAgLyogTm93IGZpbmQgdGhlIHByZXZpb3VzIHNlcGFyYXRvciAqLworICBfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkIChmaWxlbmFtZSwgc2VwLCAnLycsICZzZXApOworICBpZiAoc2VwIDwgMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoZGlybmFtZSwgIi4iKTsKKyAgCisgIC8qIHNraXAgbXVsdGlwbGUgc2VwYXJhdG9ycyAqLworICB3aGlsZSAoc2VwID4gMCAmJiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCBzZXAgLSAxKSA9PSAnLycpCisgICAgLS1zZXA7CisKKyAgX2RidXNfYXNzZXJ0IChzZXAgPj0gMCk7CisgIAorICBpZiAoc2VwID09IDAgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDApID09ICcvJykKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoZGlybmFtZSwgIi8iKTsKKyAgZWxzZQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weV9sZW4gKGZpbGVuYW1lLCAwLCBzZXAgLSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJuYW1lKSk7Cit9CisvKiogQH0gKi8gLyogREJ1c1N0cmluZyBzdHVmZiAqLworCitzdGF0aWMgdm9pZAorc3RyaW5nX3NxdWFzaF9ub25wcmludGFibGUgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgdW5zaWduZWQgY2hhciAqYnVmOworICBpbnQgaSwgbGVuOyAKKyAgCisgIGJ1ZiA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoc3RyKTsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBjID0gKHVuc2lnbmVkIGNoYXIpIGJ1ZltpXTsKKyAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgIGJ1ZltpXSA9ICcgJzsKKyAgICAgIGVsc2UgaWYgKGMgPCAweDIwIHx8IGMgPiAxMjcpCisgICAgICAgIGJ1ZltpXSA9ICc/JzsKKyAgICB9Cit9CisKKy8qKgorICogR2V0IGEgcHJpbnRhYmxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb21tYW5kIHVzZWQgdG8gZXhlY3V0ZQorICogdGhlIHByb2Nlc3Mgd2l0aCBwaWQuICBUaGlzIHN0cmluZyBzaG91bGQgb25seSBiZSB1c2VkIGZvcgorICogaW5mb3JtYXRpdmUgcHVycG9zZXMgc3VjaCBhcyBsb2dnaW5nOyBpdCBtYXkgbm90IGJlIHRydXN0ZWQuCisgKiAKKyAqIFRoZSBjb21tYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUgcHJpbnRhYmxlIEFTQ0lJIGFuZCBubyBsb25nZXIKKyAqIHRoYW4gbWF4X2xlbi4KKyAqIAorICogQHBhcmFtIHBpZCBQcm9jZXNzIGlkCisgKiBAcGFyYW0gc3RyIEFwcGVuZCBjb21tYW5kIHRvIHRoaXMgc3RyaW5nCisgKiBAcGFyYW0gbWF4X2xlbiBNYXhpbXVtIGxlbmd0aCBvZiByZXR1cm5lZCBjb21tYW5kCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBlcnJvcgorICovCitkYnVzX2Jvb2xfdCAKK19kYnVzX2NvbW1hbmRfZm9yX3BpZCAodW5zaWduZWQgbG9uZyAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1heF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICAvKiBUaGlzIGlzIGFsbCBMaW51eC1zcGVjaWZpYyBmb3Igbm93ICovCisgIERCdXNTdHJpbmcgcGF0aDsKKyAgREJ1c1N0cmluZyBjbWRsaW5lOworICBpbnQgZmQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGF0aCkpIAorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY21kbGluZSkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmcGF0aCwgIi9wcm9jLyVsZC9jbWRsaW5lIiwgcGlkKSkKKyAgICBnb3RvIG9vbTsKKyAgCisgIGZkID0gb3BlbiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcGF0aCksIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkgCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19yZWFkIChmZCwgJmNtZGxpbmUsIG1heF9sZW4pKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGZyb20gXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7ICAgICAgCisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19jbG9zZSAoZmQsIGVycm9yKSkKKyAgICBnb3RvIGZhaWw7CisgIAorICBzdHJpbmdfc3F1YXNoX25vbnByaW50YWJsZSAoJmNtZGxpbmUpOyAgCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNtZGxpbmUsIDAsIHN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY21kbGluZSk7ICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgcmV0dXJuIFRSVUU7Citvb206CisgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKK2ZhaWw6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY21kbGluZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy11dGlsLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjQ2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy11dGlsLXdpbi5jCkBAIC0wLDAgKzEsMTUzMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtc3lzZGVwcy5jLCBidXQgbm90IHVzZWQgaW4gbGliZGJ1cworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNkZWZpbmUgU1RSU0FGRV9OT19ERVBSRUNBVEUKKworI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtc29ja2V0cy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtcGlwZS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8d2luc29jazIuaD4gICAvLyBXU0EgZXJyb3IgY29kZXMKKworI2lmbmRlZiBEQlVTX1dJTkNFCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxsbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworCisvKioKKyAqIERvZXMgdGhlIGNoZGlyLCBmb3JrLCBzZXRzaWQsIGV0Yy4gdG8gYmVjb21lIGEgZGFlbW9uIHByb2Nlc3MuCisgKgorICogQHBhcmFtIHBpZGZpbGUgI05VTEwsIG9yIHBpZGZpbGUgdG8gY3JlYXRlCisgKiBAcGFyYW0gcHJpbnRfcGlkX2ZkIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCBkYWVtb24ncyBwaWQgdG8sIG9yIC0xIGZvciBub25lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEBwYXJhbSBrZWVwX3VtYXNrICNUUlVFIHRvIGtlZXAgdGhlIG9yaWdpbmFsIHVtYXNrCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmVjb21lX2RhZW1vbiAoY29uc3QgREJ1c1N0cmluZyAqcGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBrZWVwX3VtYXNrKQoreworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgZmlsZSBjb250YWluaW5nIHRoZSBwcm9jZXNzIElELgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSBwaWQgb3VyIHByb2Nlc3MgSUQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c193cml0ZV9waWRfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpjZmlsZW5hbWU7CisgIEhBTkRMRSBobmQ7CisgIGNoYXIgcGlkc3RyWzIwXTsKKyAgaW50IHRvdGFsOworICBpbnQgYnl0ZXNfdG9fd3JpdGU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgY2ZpbGVuYW1lID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaG5kID0gQ3JlYXRlRmlsZUEgKGNmaWxlbmFtZSwgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCBDUkVBVEVfTkVXLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisgIGlmIChobmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgUElEIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBjZmlsZW5hbWUsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNucHJpbnRmIChwaWRzdHIsIHNpemVvZiAocGlkc3RyKSwgIiVsdVxuIiwgcGlkKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX3N5c3RlbV9lcnJubyAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcm1hdCBQSUQgZm9yIFwiJXNcIjogJXMiLCBjZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdG90YWwgPSAwOworICBieXRlc190b193cml0ZSA9IHN0cmxlbiAocGlkc3RyKTs7CisKKyAgd2hpbGUgKHRvdGFsIDwgYnl0ZXNfdG9fd3JpdGUpCisgICAgeworICAgICAgRFdPUkQgYnl0ZXNfd3JpdHRlbjsKKyAgICAgIEJPT0wgcmVzOworCisgICAgICByZXMgPSBXcml0ZUZpbGUgKGhuZCwgcGlkc3RyICsgdG90YWwsIGJ5dGVzX3RvX3dyaXRlIC0gdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuLCBOVUxMKTsKKworICAgICAgaWYgKHJlcyA9PSAwIHx8IGJ5dGVzX3dyaXR0ZW4gPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gJXM6ICVzIiwgY2ZpbGVuYW1lLCBlbXNnKTsKKyAgICAgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgICAgIENsb3NlSGFuZGxlIChobmQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICB0b3RhbCArPSBieXRlc193cml0dGVuOworICAgIH0KKworICBpZiAoQ2xvc2VIYW5kbGUgKGhuZCkgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgY2ZpbGVuYW1lLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBnaXZlbiBwaWRfdG9fd3JpdGUgdG8gYSBwaWRmaWxlIChpZiBub24tTlVMTCkgYW5kL29yIHRvIGEKKyAqIHBpcGUgKGlmIG5vbi1OVUxMKS4gRG9lcyBub3RoaW5nIGlmIHBpZGZpbGUgYW5kIHByaW50X3BpZF9waXBlIGFyZSBib3RoCisgKiBOVUxMLgorICoKKyAqIEBwYXJhbSBwaWRmaWxlIHRoZSBmaWxlIHRvIHdyaXRlIHRvIG9yICNOVUxMCisgKiBAcGFyYW0gcHJpbnRfcGlkX3BpcGUgdGhlIHBpcGUgdG8gd3JpdGUgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwaWRfdG9fd3JpdGUgdGhlIHBpZCB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvbiBmYWlsdXJlCisgKiBAcmV0dXJucyBGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKHBpZGZpbGUpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgcGlkIGZpbGUgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAocGlkZmlsZSkpOworICAgICAgaWYgKCFfZGJ1c193cml0ZV9waWRfZmlsZSAocGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90b193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwaWQgZmlsZSB3cml0ZSBmYWlsZWRcbiIpOworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgZmlsZSByZXF1ZXN0ZWRcbiIpOworICAgIH0KKworICBpZiAocHJpbnRfcGlkX3BpcGUgIT0gTlVMTCAmJiBfZGJ1c19waXBlX2lzX3ZhbGlkIChwcmludF9waWRfcGlwZSkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBwaWQ7CisgICAgICBpbnQgYnl0ZXM7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nIG91ciBwaWQgdG8gcGlwZSAlZFxuIiwgcHJpbnRfcGlkX3BpcGUtPmZkX29yX2hhbmRsZSk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwaWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmcGlkLCBwaWRfdG9fd3JpdGUpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwaWQsICJcbiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBpZCk7CisgICAgICBpZiAoX2RidXNfcGlwZV93cml0ZSAocHJpbnRfcGlkX3BpcGUsICZwaWQsIDAsIGJ5dGVzLCBlcnJvcikgIT0gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBfZGJ1c19waXBlX3dyaXRlIHNldHMgZXJyb3Igb25seSBvbiBmYWlsdXJlLCBub3Qgc2hvcnQgd3JpdGUgKi8KKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQoZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50aW5nIG1lc3NhZ2UgYnVzIFBJRDogZGlkIG5vdCB3cml0ZSBlbm91Z2ggYnl0ZXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGlkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgcGlwZSB0byB3cml0ZSB0b1xuIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IGFmdGVyIHRoZSBmb3JrIHdlIGNhbiBzdWNjZXNzZnVsbHkgY2hhbmdlIHRvIHRoaXMgdXNlci4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWUgZ2l2ZW4gaW4gdGhlIGRhZW1vbiBjb25maWd1cmF0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyKQoreworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGFuZ2VzIHRoZSB1c2VyIGFuZCBncm91cCB0aGUgYnVzIGlzIHJ1bm5pbmcgYXMuCisgKgorICogQHBhcmFtIHVzZXIgdGhlIHVzZXIgdG8gYmVjb21lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgIChjb25zdCBjaGFyICAgICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c19yZXF1ZXN0X2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAodW5zaWduZWQgaW50IGxpbWl0KQoreworfQorCit2b2lkCitfZGJ1c19pbml0X3N5c3RlbV9sb2cgKHZvaWQpCit7CisgIC8qIE91dHB1dERlYnVnU3RyaW5nQSBkb2Vzbid0IG5lZWQgYW55IHNwZWNpYWwgaW5pdGlhbGl6YXRpb24sIGRvIG5vdGhpbmcgKi8KK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3N5c3RlbV9sb2cgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICB2YV9zdGFydCAoYXJncywgbXNnKTsKKworICBfZGJ1c19zeXN0ZW1fbG9ndiAoc2V2ZXJpdHksIG1zZywgYXJncyk7CisKKyAgdmFfZW5kIChhcmdzKTsKK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKiBJZiB0aGUgRkFUQUwgc2V2ZXJpdHkgaXMgZ2l2ZW4sIHRoaXMgZnVuY3Rpb24gd2lsbCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0KKyAqIHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZAorX2RidXNfc3lzdGVtX2xvZ3YgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFyZ3MpCit7CisgIGNoYXIgKnMgPSAiIjsKKyAgY2hhciBidWZbMTAyNF07CisgIAorICBzd2l0Y2goc2V2ZXJpdHkpIAorICAgeworICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19JTkZPOiBzID0gImluZm8iOyBicmVhazsKKyAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFk6IHMgPSAic2VjdXJpdHkiOyBicmVhazsKKyAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfRkFUQUw6IHMgPSAiZmF0YWwiOyBicmVhazsKKyAgIH0KKyAgIAorICBzcHJpbnRmKGJ1ZiwiJXMlcyIscyxtc2cpOworICB2c3ByaW50ZihidWYsYnVmLGFyZ3MpOworICBPdXRwdXREZWJ1Z1N0cmluZ0EoYnVmKTsKKyAgCisgIGlmIChzZXZlcml0eSA9PSBEQlVTX1NZU1RFTV9MT0dfRkFUQUwpCisgICAgZXhpdCAoMSk7Cit9CisKKy8qKiBJbnN0YWxscyBhIHNpZ25hbCBoYW5kbGVyCisgKgorICogQHBhcmFtIHNpZyB0aGUgc2lnbmFsIHRvIGhhbmRsZQorICogQHBhcmFtIGhhbmRsZXIgdGhlIGhhbmRsZXIKKyAqLwordm9pZAorX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIChpbnQgICAgICAgICAgICAgICBzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTaWduYWxIYW5kbGVyIGhhbmRsZXIpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIoKSBoYXMgdG8gYmUgaW1wbGVtZW50ZWRcbiIpOworfQorCisvKioKKyAqIHN0YXQoKSB3cmFwcGVyLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gc3RhdAorICogQHBhcmFtIHN0YXRidWYgdGhlIHN0YXQgaW5mbyB0byBmaWxsIGluCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIHdhcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0YXQoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgIERCdXNTdGF0ICAgICAgICAgKnN0YXRidWYsCisgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHdmYWQ7CisgIGNoYXIgKmxhc3Rkb3Q7CisgIERXT1JEIHJjOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAoIUdldEZpbGVBdHRyaWJ1dGVzRXhBIChmaWxlbmFtZV9jLCBHZXRGaWxlRXhJbmZvU3RhbmRhcmQsICZ3ZmFkKSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHdmYWQuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkKKyAgICBzdGF0YnVmLT5tb2RlID0gX1NfSUZESVI7CisgIGVsc2UKKyAgICBzdGF0YnVmLT5tb2RlID0gX1NfSUZSRUc7CisKKyAgc3RhdGJ1Zi0+bW9kZSB8PSBfU19JUkVBRDsKKyAgaWYgKHdmYWQuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKQorICAgIHN0YXRidWYtPm1vZGUgfD0gX1NfSVdSSVRFOworCisgIGxhc3Rkb3QgPSBzdHJyY2hyIChmaWxlbmFtZV9jLCAnLicpOworICBpZiAobGFzdGRvdCAmJiBzdHJpY21wIChsYXN0ZG90LCAiLmV4ZSIpID09IDApCisgICAgc3RhdGJ1Zi0+bW9kZSB8PSBfU19JRVhFQzsKKworICBzdGF0YnVmLT5tb2RlIHw9IChzdGF0YnVmLT5tb2RlICYgMDcwMCkgPj4gMzsKKyAgc3RhdGJ1Zi0+bW9kZSB8PSAoc3RhdGJ1Zi0+bW9kZSAmIDA3MDApID4+IDY7CisKKyAgc3RhdGJ1Zi0+bmxpbmsgPSAxOworCisjaWZkZWYgRU5BQkxFX1VJRF9UT19TSUQKKyAgeworICAgIFBTSUQgb3duZXJfc2lkLCBncm91cF9zaWQ7CisgICAgUFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7CisKKyAgICBzZCA9IE5VTEw7CisgICAgcmMgPSBHZXROYW1lZFNlY3VyaXR5SW5mbyAoKGNoYXIgKikgZmlsZW5hbWVfYywgU0VfRklMRV9PQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1dORVJfU0VDVVJJVFlfSU5GT1JNQVRJT04gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdST1VQX1NFQ1VSSVRZX0lORk9STUFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvd25lcl9zaWQsICZncm91cF9zaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2QpOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgeworICAgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgcmMpOworICAgICAgICBpZiAoc2QgIT0gTlVMTCkKKyAgICAgICAgICBMb2NhbEZyZWUgKHNkKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIAorICAgIC8qIEZJWE1FICovCisgICAgc3RhdGJ1Zi0+dWlkID0gX2RidXNfd2luX3NpZF90b191aWRfdCAob3duZXJfc2lkKTsKKyAgICBzdGF0YnVmLT5naWQgPSBfZGJ1c193aW5fc2lkX3RvX3VpZF90IChncm91cF9zaWQpOworCisgICAgTG9jYWxGcmVlIChzZCk7CisgIH0KKyNlbHNlCisgIHN0YXRidWYtPnVpZCA9IERCVVNfVUlEX1VOU0VUOworICBzdGF0YnVmLT5naWQgPSBEQlVTX0dJRF9VTlNFVDsKKyNlbmRpZgorCisgIHN0YXRidWYtPnNpemUgPSAoKGRidXNfaW50NjRfdCkgd2ZhZC5uRmlsZVNpemVIaWdoIDw8IDMyKSArIHdmYWQubkZpbGVTaXplTG93OworCisgIHN0YXRidWYtPmF0aW1lID0KKyAgICAoKChkYnVzX2ludDY0X3QpIHdmYWQuZnRMYXN0QWNjZXNzVGltZS5kd0hpZ2hEYXRlVGltZSA8PCAzMikgKworICAgICB3ZmFkLmZ0TGFzdEFjY2Vzc1RpbWUuZHdMb3dEYXRlVGltZSkgLyAxMDAwMDAwMCAtIERCVVNfSU5UNjRfQ09OU1RBTlQgKDExNjQ0NDczNjAwMDAwMDAwMCk7CisKKyAgc3RhdGJ1Zi0+bXRpbWUgPQorICAgICgoKGRidXNfaW50NjRfdCkgd2ZhZC5mdExhc3RXcml0ZVRpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKKyAgICAgd2ZhZC5mdExhc3RXcml0ZVRpbWUuZHdMb3dEYXRlVGltZSkgLyAxMDAwMDAwMCAtIERCVVNfSU5UNjRfQ09OU1RBTlQgKDExNjQ0NDczNjAwMDAwMDAwMCk7CisKKyAgc3RhdGJ1Zi0+Y3RpbWUgPQorICAgICgoKGRidXNfaW50NjRfdCkgd2ZhZC5mdENyZWF0aW9uVGltZS5kd0hpZ2hEYXRlVGltZSA8PCAzMikgKworICAgICB3ZmFkLmZ0Q3JlYXRpb25UaW1lLmR3TG93RGF0ZVRpbWUpIC8gMTAwMDAwMDAgLSBEQlVTX0lOVDY0X0NPTlNUQU5UICgxMTY0NDQ3MzYwMDAwMDAwMDApOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdAorQ29weXJpZ2h0IChDKSAyMDAwIFdlcm5lciBBbG1lc2JlcmdlcgorCitsaWJjL3N5cy9saW51eC9zeXMvZGlyZW50LmggLSBEaXJlY3RvcnkgZW50cnkgYXMgcmV0dXJuZWQgYnkgcmVhZGRpcgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKK0Jvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKyNkZWZpbmUgSEFWRV9OT19EX05BTUxFTgkvKiBubyBzdHJ1Y3QgZGlyZW50LT5kX25hbWxlbiAqLworI2RlZmluZSBIQVZFX0REX0xPQ0sgIAkJLyogaGF2ZSBsb2NraW5nIG1lY2hhbmlzbSAqLworCisjZGVmaW5lIE1BWE5BTUxFTiAyNTUJCS8qIHNpemVvZihzdHJ1Y3QgZGlyZW50LmRfbmFtZSktMSAqLworCisjZGVmaW5lIF9fZGlyZmQoZGlyKSAoZGlyKS0+ZGRfZmQKKworLyogc3RydWN0IGRpcmVudCAtIHNhbWUgYXMgVW5peCAqLworc3RydWN0IGRpcmVudAorICB7CisgICAgbG9uZyBkX2lubzsgICAgICAgICAgICAgICAgICAgIC8qIGlub2RlIChhbHdheXMgMSBpbiBXSU4zMikgKi8KKyAgICBvZmZfdCBkX29mZjsgICAgICAgICAgICAgICAgLyogb2Zmc2V0IHRvIHRoaXMgZGlyZW50ICovCisgICAgdW5zaWduZWQgc2hvcnQgZF9yZWNsZW47ICAgIC8qIGxlbmd0aCBvZiBkX25hbWUgKi8KKyAgICBjaGFyIGRfbmFtZVtfTUFYX0ZOQU1FKzFdOyAgICAvKiBmaWxlbmFtZSAobnVsbCB0ZXJtaW5hdGVkKSAqLworICB9OworCisvKiB0eXBlZGVmIERJUiAtIG5vdCB0aGUgc2FtZSBhcyBVbml4ICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgSEFORExFIGhhbmRsZTsgICAgICAgICAgICAgIC8qIEZpbmRGaXJzdC9GaW5kTmV4dCBoYW5kbGUgKi8KKyAgICBzaG9ydCBvZmZzZXQ7ICAgICAgICAgICAgICAgLyogb2Zmc2V0IGludG8gZGlyZWN0b3J5ICovCisgICAgc2hvcnQgZmluaXNoZWQ7ICAgICAgICAgICAgIC8qIDEgaWYgdGhlcmUgYXJlIG5vdCBtb3JlIGZpbGVzICovCisgICAgV0lOMzJfRklORF9EQVRBQSBmaWxlaW5mbzsgIC8qIGZyb20gRmluZEZpcnN0L0ZpbmROZXh0ICovCisgICAgY2hhciAqZGlyOyAgICAgICAgICAgICAgICAgIC8qIHRoZSBkaXIgd2UgYXJlIHJlYWRpbmcgKi8KKyAgICBzdHJ1Y3QgZGlyZW50IGRlbnQ7ICAgICAgICAgLyogdGhlIGRpcmVudCB0byByZXR1cm4gKi8KKyAgfQorRElSOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnQgZGlyZW50LXN0eWxlIG9wZW5kaXIvcmVhZGRpci9jbG9zZWRpciBvbiBXaW5kb3cgOTUvTlQKKyoKKyogRnVuY3Rpb25zIGRlZmluZWQgYXJlIG9wZW5kaXIoKSwgcmVhZGRpcigpIGFuZCBjbG9zZWRpcigpIHdpdGggdGhlCisqIHNhbWUgcHJvdG90eXBlcyBhcyB0aGUgbm9ybWFsIGRpcmVudC5oIGltcGxlbWVudGF0aW9uLgorKgorKiBEb2VzIG5vdCBpbXBsZW1lbnQgdGVsbGRpcigpLCBzZWVrZGlyKCksIHJld2luZGRpcigpIG9yIHNjYW5kaXIoKS4KKyogVGhlIGRpcmVudCBzdHJ1Y3QgaXMgY29tcGF0aWJsZSB3aXRoIFVuaXgsIGV4Y2VwdCB0aGF0IGRfaW5vIGlzCisqIGFsd2F5cyAxIGFuZCBkX29mZiBpcyBtYWRlIHVwIGFzIHdlIGdvIGFsb25nLgorKgorKiBFcnJvciBjb2RlcyBhcmUgbm90IGF2YWlsYWJsZSB3aXRoIGVycm5vIGJ1dCBHZXRMYXN0RXJyb3IuCisqCisqIFRoZSBESVIgdHlwZWRlZiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFVuaXguCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRElSICogX2RidXNfb3BlbmRpcihjb25zdCBjaGFyICpkaXIpCit7CisgIERJUiAqZHA7CisgIGNoYXIgKmZpbGVzcGVjOworICBIQU5ETEUgaGFuZGxlOworICBpbnQgaW5kZXg7CisKKyAgZmlsZXNwZWMgPSBtYWxsb2Moc3RybGVuKGRpcikgKyAyICsgMSk7CisgIHN0cmNweShmaWxlc3BlYywgZGlyKTsKKyAgaW5kZXggPSBzdHJsZW4oZmlsZXNwZWMpIC0gMTsKKyAgaWYgKGluZGV4ID49IDAgJiYgKGZpbGVzcGVjW2luZGV4XSA9PSAnLycgfHwgZmlsZXNwZWNbaW5kZXhdID09ICdcXCcpKQorICAgIGZpbGVzcGVjW2luZGV4XSA9ICdcMCc7CisgIHN0cmNhdChmaWxlc3BlYywgIlxcKiIpOworCisgIGRwID0gKERJUiAqKW1hbGxvYyhzaXplb2YoRElSKSk7CisgIGRwLT5vZmZzZXQgPSAwOworICBkcC0+ZmluaXNoZWQgPSAwOworICBkcC0+ZGlyID0gc3RyZHVwKGRpcik7CisKKyAgaGFuZGxlID0gRmluZEZpcnN0RmlsZUEoZmlsZXNwZWMsICYoZHAtPmZpbGVpbmZvKSk7CisgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX05PX01PUkVfRklMRVMpCisgICAgICAgIGRwLT5maW5pc2hlZCA9IDE7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkcC0+aGFuZGxlID0gaGFuZGxlOworICBmcmVlKGZpbGVzcGVjKTsKKworICByZXR1cm4gZHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlyZW50ICogX2RidXNfcmVhZGRpcihESVIgKmRwKQoreworICBpbnQgc2F2ZWRfZXJyID0gR2V0TGFzdEVycm9yKCk7CisKKyAgaWYgKCFkcCB8fCBkcC0+ZmluaXNoZWQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGRwLT5vZmZzZXQgIT0gMCkKKyAgICB7CisgICAgICBpZiAoRmluZE5leHRGaWxlQShkcC0+aGFuZGxlLCAmKGRwLT5maWxlaW5mbykpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfTk9fTU9SRV9GSUxFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU2V0TGFzdEVycm9yKHNhdmVkX2Vycik7CisgICAgICAgICAgICAgIGRwLT5maW5pc2hlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGRwLT5vZmZzZXQrKzsKKyAgCisgIHN0cm5jcHkoZHAtPmRlbnQuZF9uYW1lLCBkcC0+ZmlsZWluZm8uY0ZpbGVOYW1lLCBfTUFYX0ZOQU1FKTsKKyAgZHAtPmRlbnQuZF9pbm8gPSAxOworICBkcC0+ZGVudC5kX3JlY2xlbiA9IHN0cmxlbihkcC0+ZGVudC5kX25hbWUpOworICBkcC0+ZGVudC5kX29mZiA9IGRwLT5vZmZzZXQ7CisgIAorICByZXR1cm4gJihkcC0+ZGVudCk7Cit9CisKKworc3RhdGljIGludCBfZGJ1c19jbG9zZWRpcihESVIgKmRwKQoreworICBpZiAoIWRwKQorICAgIHJldHVybiAwOworICBGaW5kQ2xvc2UoZHAtPmhhbmRsZSk7CisgIGlmIChkcC0+ZGlyKQorICAgIGZyZWUoZHAtPmRpcik7CisgIGlmIChkcCkKKyAgICBmcmVlKGRwKTsKKworICByZXR1cm4gMDsKK30KKworCisvKioKKyAqIEludGVybmFscyBvZiBkaXJlY3RvcnkgaXRlcmF0b3IKKyAqLworc3RydWN0IERCdXNEaXJJdGVyCisgIHsKKyAgICBESVIgKmQ7IC8qKjwgVGhlIERJUiogZnJvbSBvcGVuZGlyKCkgKi8KKworICB9OworCisvKioKKyAqIE9wZW4gYSBkaXJlY3RvcnkgdG8gaXRlcmF0ZSBvdmVyLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZGlyZWN0b3J5IG5hbWUKKyAqIEBwYXJhbSBlcnJvciBleGNlcHRpb24gcmV0dXJuIG9iamVjdCBvciAjTlVMTAorICogQHJldHVybnMgbmV3IGl0ZXJhdG9yLCBvciAjTlVMTCBvbiBlcnJvcgorICovCitEQnVzRGlySXRlcioKK19kYnVzX2RpcmVjdG9yeV9vcGVuIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgRElSICpkOworICBEQnVzRGlySXRlciAqaXRlcjsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgZCA9IF9kYnVzX29wZW5kaXIgKGZpbGVuYW1lX2MpOworICBpZiAoZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBpdGVyID0gZGJ1c19uZXcwIChEQnVzRGlySXRlciwgMSk7CisgIGlmIChpdGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2VkaXIgKGQpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGlyZWN0b3J5IGl0ZXJhdG9yIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaXRlci0+ZCA9IGQ7CisKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKgorICogR2V0IG5leHQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiBXaWxsIG5vdCByZXR1cm4gIi4iIG9yICIuLiIgIG9uCisgKiBVTklYLiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBjb250ZW50cyBvZiAiZmlsZW5hbWUiIGFyZQorICogdW5kZWZpbmVkLiBUaGUgZXJyb3IgaXMgbmV2ZXIgc2V0IGlmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcy4KKyAqCisgKiBAdG9kbyBmb3IgdGhyZWFkIHNhZmV0eSwgSSB0aGluayB3ZSBoYXZlIHRvIHVzZQorICogcmVhZGRpcl9yKCkuIChHTGliIGhhcyB0aGUgc2FtZSBpc3N1ZSwgc2hvdWxkIGZpbGUgYSBidWcuKQorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGZpbGVuYW1lIHN0cmluZyB0byBiZSBzZXQgdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUgZGlyCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcgorICogQHJldHVybnMgI1RSVUUgaWYgZmlsZW5hbWUgd2FzIGZpbGxlZCBpbiB3aXRoIGEgbmV3IGZpbGVuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoREJ1c0Rpckl0ZXIgICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgc3RydWN0IGRpcmVudCAqZW50OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCithZ2FpbjoKKyAgU2V0TGFzdEVycm9yICgwKTsKKyAgZW50ID0gX2RidXNfcmVhZGRpciAoaXRlci0+ZCk7CisgIGlmIChlbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbmV4dCBpbiBkaXJlY3Rvcnk6ICVzIiwgZW1zZyk7CisgICAgICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoZW50LT5kX25hbWVbMF0gPT0gJy4nICYmCisgICAgICAgICAgIChlbnQtPmRfbmFtZVsxXSA9PSAnXDAnIHx8CisgICAgICAgICAgICAoZW50LT5kX25hbWVbMV0gPT0gJy4nICYmIGVudC0+ZF9uYW1lWzJdID09ICdcMCcpKSkKKyAgICBnb3RvIGFnYWluOworICBlbHNlCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGZpbGVuYW1lLCAwKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoZmlsZW5hbWUsIGVudC0+ZF9uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtZW1vcnkgdG8gcmVhZCBkaXJlY3RvcnkgZW50cnkiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIENsb3NlcyBhIGRpcmVjdG9yeSBpdGVyYXRpb24uCisgKi8KK3ZvaWQKK19kYnVzX2RpcmVjdG9yeV9jbG9zZSAoREJ1c0Rpckl0ZXIgKml0ZXIpCit7CisgIF9kYnVzX2Nsb3NlZGlyIChpdGVyLT5kKTsKKyAgZGJ1c19mcmVlIChpdGVyKTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBEQnVzSW50ZXJuYWxzVXRpbHMgZnVuY3Rpb25zICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1N0cmluZworICoKKyAqIEB7CisgKi8KKy8qKgorICogR2V0IHRoZSBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgY29tcGxldGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBkaXJuYW1lIHN0cmluZyB0byBhcHBlbmQgZGlyZWN0b3J5IG5hbWUgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19nZXRfZGlybmFtZShjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkaXJuYW1lKQoreworICBpbnQgc2VwOworCisgIF9kYnVzX2Fzc2VydCAoZmlsZW5hbWUgIT0gZGlybmFtZSk7CisgIF9kYnVzX2Fzc2VydCAoZmlsZW5hbWUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZGlybmFtZSAhPSBOVUxMKTsKKworICAvKiBJZ25vcmUgYW55IHNlcGFyYXRvcnMgb24gdGhlIGVuZCAqLworICBzZXAgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZmlsZW5hbWUpOworICBpZiAoc2VwID09IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIuIik7IC8qIGVtcHR5IHN0cmluZyBwYXNzZWQgaW4gKi8KKworICB3aGlsZSAoc2VwID4gMCAmJgorICAgICAgICAgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICcvJyB8fAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICdcXCcpKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworCisgIGlmIChzZXAgPT0gMCB8fAorICAgICAgKHNlcCA9PSAyICYmCisgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMSkgPT0gJzonICYmCisgICAgICAgaXNhbHBoYSAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkpKSkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworCisgIHsKKyAgICBpbnQgc2VwMSwgc2VwMjsKKyAgICBfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkIChmaWxlbmFtZSwgc2VwLCAnLycsICZzZXAxKTsKKyAgICBfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkIChmaWxlbmFtZSwgc2VwLCAnXFwnLCAmc2VwMik7CisKKyAgICBzZXAgPSBNQVggKHNlcDEsIHNlcDIpOworICB9CisgIGlmIChzZXAgPCAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLiIpOworCisgIHdoaWxlIChzZXAgPiAwICYmCisgICAgICAgICAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJy8nIHx8CisgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJ1xcJykpCisgICAgLS1zZXA7CisKKyAgX2RidXNfYXNzZXJ0IChzZXAgPj0gMCk7CisKKyAgaWYgKChzZXAgPT0gMCB8fAorICAgICAgIChzZXAgPT0gMiAmJgorICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAxKSA9PSAnOicgJiYKKyAgICAgICAgaXNhbHBoYSAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkpKSkKKyAgICAgICYmCisgICAgICAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwKSA9PSAnLycgfHwKKyAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCBzZXApID09ICdcXCcpKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weV9sZW4gKGZpbGVuYW1lLCAwLCBzZXAgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJuYW1lKSk7CisgIGVsc2UKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwIC0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworfQorCisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIG1hdGNoZXMgdGhlIFVJRCBvZgorICogdGhlIHByb2Nlc3MuIFNob3VsZCBhbHdheXMgcmV0dXJuICNGQUxTRSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVOSVggdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyB1aWQgb3ducyB0aGUgcHJvY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyIChkYnVzX3VpZF90IHVpZCkKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdCBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAoY29uc3QgY2hhciAqd2luZG93c19zaWQpCit7CisgIHJldHVybiBUUlVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICB1bml4IGVtdWxhdGlvbiBmdW5jdGlvbnMgLSBzaG91bGQgYmUgcmVtb3ZlZCBzb21ldGltZSBpbiB0aGUgZnV0dXJlCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBVTklYIHVzZXIgSUQgaXMgYXQgdGhlIGNvbnNvbGUuCisgKiBTaG91bGQgYWx3YXlzIGZhaWwgb24gV2luZG93cyAoc2V0IHRoZSBlcnJvciB0bworICogI0RCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCkuCisgKgorICogQHBhcmFtIHVpZCBVSUQgb2YgcGVyc29uIHRvIGNoZWNrIAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25zb2xlIHVzZXIgYW5kIHRoZXJlIGFyZSBubyBlcnJvcnMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19hdF9jb25zb2xlIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAiVU5JWCB1c2VyIElEcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NcbiIpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBQYXJzZSBhIFVOSVggZ3JvdXAgZnJvbSB0aGUgYnVzIGNvbmZpZyBmaWxlLiBPbiBXaW5kb3dzLCB0aGlzIHNob3VsZAorICogc2ltcGx5IGFsd2F5cyBmYWlsIChqdXN0IHJldHVybiAjRkFMU0UpLgorICoKKyAqIEBwYXJhbSBncm91cG5hbWUgdGhlIGdyb3VwbmFtZSB0ZXh0CisgKiBAcGFyYW0gZ2lkX3AgcGxhY2UgdG8gcmV0dXJuIHRoZSBnaWQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VuaXhfZ3JvdXBfZnJvbV9jb25maWcgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkX3ApCit7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBQYXJzZSBhIFVOSVggdXNlciBmcm9tIHRoZSBidXMgY29uZmlnIGZpbGUuIE9uIFdpbmRvd3MsIHRoaXMgc2hvdWxkCisgKiBzaW1wbHkgYWx3YXlzIGZhaWwgKGp1c3QgcmV0dXJuICNGQUxTRSkuCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZSB0ZXh0CisgKiBAcGFyYW0gdWlkX3AgcGxhY2UgdG8gcmV0dXJuIHRoZSB1aWQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VuaXhfdXNlcl9mcm9tX2NvbmZpZyAoY29uc3QgREJ1c1N0cmluZyAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkX3ApCit7CisgIHJldHVybiBGQUxTRTsKK30KKworCisvKioKKyAqIEdldHMgYWxsIGdyb3VwcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVTklYIHVzZXIgSUQuIE9uIFVOSVgsCisgKiBqdXN0IGNhbGxzIF9kYnVzX2dyb3Vwc19mcm9tX3VpZCgpLiBPbiBXaW5kb3dzLCBzaG91bGQgYWx3YXlzCisgKiBmYWlsIHNpbmNlIHdlIGRvbid0IGtub3cgYW55IFVOSVggZ3JvdXBzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVJRAorICogQHBhcmFtIGdyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGFycmF5IG9mIGdyb3VwIElEcworICogQHBhcmFtIG5fZ3JvdXBfaWRzIHJldHVybiBsb2NhdGlvbiBmb3IgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5CisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgVUlEIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X2dyb3Vwc19mcm9tX3VpZCAoZGJ1c191aWRfdCAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAgICoqZ3JvdXBfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpuX2dyb3VwX2lkcykKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKworLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgc3R1ZmYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIGVycm9yIGhhbmRsaW5nCisgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworCisKKy8qIGxhbiBtYW5hZ2VyIGVycm9yIGNvZGVzICovCitjb25zdCBjaGFyKgorX2RidXNfbG1fc3RyZXJyb3IoaW50IGVycm9yX251bWJlcikKK3sKKyNpZmRlZiBEQlVTX1dJTkNFCisgIC8vIFRPRE8KKyAgcmV0dXJuICJ1bmtub3duIjsKKyNlbHNlCisgIGNvbnN0IGNoYXIgKm1zZzsKKyAgc3dpdGNoIChlcnJvcl9udW1iZXIpCisgICAgeworICAgIGNhc2UgTkVSUl9OZXROb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgd29ya3N0YXRpb24gZHJpdmVyIGlzIG5vdCBpbnN0YWxsZWQuIjsKKyAgICBjYXNlIE5FUlJfVW5rbm93blNlcnZlcjoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBjb3VsZCBub3QgYmUgbG9jYXRlZC4iOworICAgIGNhc2UgTkVSUl9TaGFyZU1lbToKKyAgICAgIHJldHVybiAiQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSBuZXR3b3JrIGNhbm5vdCBhY2Nlc3MgYSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuIjsKKyAgICBjYXNlIE5FUlJfTm9OZXR3b3JrUmVzb3VyY2U6CisgICAgICByZXR1cm4gIkEgbmV0d29yayByZXNvdXJjZSBzaG9ydGFnZSBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9SZW1vdGVPbmx5OgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHdvcmtzdGF0aW9ucy4iOworICAgIGNhc2UgTkVSUl9EZXZOb3RSZWRpcmVjdGVkOgorICAgICAgcmV0dXJuICJUaGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmVyTm90U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIFNlcnZlciBzZXJ2aWNlIGlzIG5vdCBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0l0ZW1Ob3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHF1ZXVlIGlzIGVtcHR5LiI7CisgICAgY2FzZSBORVJSX1Vua25vd25EZXZEaXI6CisgICAgICByZXR1cm4gIlRoZSBkZXZpY2Ugb3IgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX1JlZGlyZWN0ZWRQYXRoOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIGludmFsaWQgb24gYSByZWRpcmVjdGVkIHJlc291cmNlLiI7CisgICAgY2FzZSBORVJSX0R1cGxpY2F0ZVNoYXJlOgorICAgICAgcmV0dXJuICJUaGUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHNoYXJlZC4iOworICAgIGNhc2UgTkVSUl9Ob1Jvb206CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG91dCBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlJdGVtczoKKyAgICAgIHJldHVybiAiUmVxdWVzdGVkIGFkZGl0aW9uIG9mIGl0ZW1zIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZC4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkTWF4VXNlcnM6CisgICAgICByZXR1cm4gIlRoZSBQZWVyIHNlcnZpY2Ugc3VwcG9ydHMgb25seSB0d28gc2ltdWx0YW5lb3VzIHVzZXJzLiI7CisgICAgY2FzZSBORVJSX0J1ZlRvb1NtYWxsOgorICAgICAgcmV0dXJuICJUaGUgQVBJIHJldHVybiBidWZmZXIgaXMgdG9vIHNtYWxsLiI7CisgICAgY2FzZSBORVJSX1JlbW90ZUVycjoKKyAgICAgIHJldHVybiAiQSByZW1vdGUgQVBJIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0xhbm1hbkluaUVycm9yOgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIG9wZW5pbmcgb3IgcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiI7CisgICAgY2FzZSBORVJSX05ldHdvcmtFcnJvcjoKKyAgICAgIHJldHVybiAiQSBnZW5lcmFsIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfV2tzdGFJbmNvbnNpc3RlbnRTdGF0ZToKKyAgICAgIHJldHVybiAiVGhlIFdvcmtzdGF0aW9uIHNlcnZpY2UgaXMgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBSZXN0YXJ0IHRoZSBjb21wdXRlciBiZWZvcmUgcmVzdGFydGluZyB0aGUgV29ya3N0YXRpb24gc2VydmljZS4iOworICAgIGNhc2UgTkVSUl9Xa3N0YU5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBXb3Jrc3RhdGlvbiBzZXJ2aWNlIGhhcyBub3QgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0Jyb3dzZXJOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIjsKKyAgICBjYXNlIE5FUlJfSW50ZXJuYWxFcnJvcjoKKyAgICAgIHJldHVybiAiQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkVHJhbnNhY3RDb25maWc6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIHRyYW5zYWN0aW9ucy4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkQVBJOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIEFQSSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSByZW1vdGUgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0JhZEV2ZW50TmFtZToKKyAgICAgIHJldHVybiAiVGhlIGV2ZW50IG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EdXBOYW1lUmVib290OgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgbmFtZSBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgbmV0d29yay4gQ2hhbmdlIGl0IGFuZCByZXN0YXJ0IHRoZSBjb21wdXRlci4iOworICAgIGNhc2UgTkVSUl9DZmdDb21wTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4iOworICAgIGNhc2UgTkVSUl9DZmdQYXJhbU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIjsKKyAgICBjYXNlIE5FUlJfTGluZVRvb0xvbmc6CisgICAgICByZXR1cm4gIkEgbGluZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIHRvbyBsb25nLiI7CisgICAgY2FzZSBORVJSX1FOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfSm9iTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludCBqb2IgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfRGVzdE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnRlciBkZXN0aW5hdGlvbiBjYW5ub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfRGVzdEV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfUUV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgcXVldWUgYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfUU5vUm9vbToKKyAgICAgIHJldHVybiAiTm8gbW9yZSBwcmludGVycyBjYW4gYmUgYWRkZWQuIjsKKyAgICBjYXNlIE5FUlJfSm9iTm9Sb29tOgorICAgICAgcmV0dXJuICJObyBtb3JlIHByaW50IGpvYnMgY2FuIGJlIGFkZGVkLiI7CisgICAgY2FzZSBORVJSX0Rlc3ROb1Jvb206CisgICAgICByZXR1cm4gIk5vIG1vcmUgcHJpbnRlciBkZXN0aW5hdGlvbnMgY2FuIGJlIGFkZGVkLiI7CisgICAgY2FzZSBORVJSX0Rlc3RJZGxlOgorICAgICAgcmV0dXJuICJUaGlzIHByaW50ZXIgZGVzdGluYXRpb24gaXMgaWRsZSBhbmQgY2Fubm90IGFjY2VwdCBjb250cm9sIG9wZXJhdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfRGVzdEludmFsaWRPcDoKKyAgICAgIHJldHVybiAiVGhpcyBwcmludGVyIGRlc3RpbmF0aW9uIHJlcXVlc3QgY29udGFpbnMgYW4gaW52YWxpZCBjb250cm9sIGZ1bmN0aW9uLiI7CisgICAgY2FzZSBORVJSX1Byb2NOb1Jlc3BvbmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludCBwcm9jZXNzb3IgaXMgbm90IHJlc3BvbmRpbmcuIjsKKyAgICBjYXNlIE5FUlJfU3Bvb2xlck5vdExvYWRlZDoKKyAgICAgIHJldHVybiAiVGhlIHNwb29sZXIgaXMgbm90IHJ1bm5pbmcuIjsKKyAgICBjYXNlIE5FUlJfRGVzdEludmFsaWRTdGF0ZToKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgcHJpbnQgZGVzdGluYXRpb24gaW4gaXRzIGN1cnJlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfUUludmFsaWRTdGF0ZToKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgcHJpbnRlciBxdWV1ZSBpbiBpdHMgY3VycmVudCBzdGF0ZS4iOworICAgIGNhc2UgTkVSUl9Kb2JJbnZhbGlkU3RhdGU6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHByaW50IGpvYiBpbiBpdHMgY3VycmVudCBzdGF0ZS4iOworICAgIGNhc2UgTkVSUl9TcG9vbE5vTWVtb3J5OgorICAgICAgcmV0dXJuICJBIHNwb29sZXIgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9Ecml2ZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIGRldmljZSBkcml2ZXIgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfRGF0YVR5cGVJbnZhbGlkOgorICAgICAgcmV0dXJuICJUaGUgZGF0YSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHByaW50IHByb2Nlc3Nvci4iOworICAgIGNhc2UgTkVSUl9Qcm9jTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludCBwcm9jZXNzb3IgaXMgbm90IGluc3RhbGxlZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlVGFibGVMb2NrZWQ6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGRhdGFiYXNlIGlzIGxvY2tlZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlVGFibGVGdWxsOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSB0YWJsZSBpcyBmdWxsLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VJbnN0YWxsZWQ6CisgICAgICByZXR1cm4gIlRoZSByZXF1ZXN0ZWQgc2VydmljZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUVudHJ5TG9ja2VkOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBkb2VzIG5vdCByZXNwb25kIHRvIGNvbnRyb2wgYWN0aW9ucy4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlTm90SW5zdGFsbGVkOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9CYWRTZXJ2aWNlTmFtZToKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgbmFtZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VDdGxUaW1lb3V0OgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBpcyBub3QgcmVzcG9uZGluZyB0byB0aGUgY29udHJvbCBmdW5jdGlvbi4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlQ3RsQnVzeToKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY29udHJvbCBpcyBidXN5LiI7CisgICAgY2FzZSBORVJSX0JhZFNlcnZpY2VQcm9nTmFtZToKKyAgICAgIHJldHVybiAiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWlucyBhbiBpbnZhbGlkIHNlcnZpY2UgcHJvZ3JhbSBuYW1lLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VOb3RDdHJsOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBjb3VsZCBub3QgYmUgY29udHJvbGxlZCBpbiBpdHMgcHJlc2VudCBzdGF0ZS4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlS2lsbFByb2M6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGVuZGVkIGFibm9ybWFsbHkuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUN0bE5vdFZhbGlkOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIHBhdXNlIG9yIHN0b3AgaXMgbm90IHZhbGlkIGZvciB0aGlzIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfTm90SW5EaXNwYXRjaFRibDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY29udHJvbCBkaXNwYXRjaGVyIGNvdWxkIG5vdCBmaW5kIHRoZSBzZXJ2aWNlIG5hbWUgaW4gdGhlIGRpc3BhdGNoIHRhYmxlLiI7CisgICAgY2FzZSBORVJSX0JhZENvbnRyb2xSZWN2OgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBjb250cm9sIGRpc3BhdGNoZXIgcGlwZSByZWFkIGZhaWxlZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlTm90U3RhcnRpbmc6CisgICAgICByZXR1cm4gIkEgdGhyZWFkIGZvciB0aGUgbmV3IHNlcnZpY2UgY291bGQgbm90IGJlIGNyZWF0ZWQuIjsKKyAgICBjYXNlIE5FUlJfQWxyZWFkeUxvZ2dlZE9uOgorICAgICAgcmV0dXJuICJUaGlzIHdvcmtzdGF0aW9uIGlzIGFscmVhZHkgbG9nZ2VkIG9uIHRvIHRoZSBsb2NhbC1hcmVhIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfTm90TG9nZ2VkT246CisgICAgICByZXR1cm4gIlRoZSB3b3Jrc3RhdGlvbiBpcyBub3QgbG9nZ2VkIG9uIHRvIHRoZSBsb2NhbC1hcmVhIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfQmFkVXNlcm5hbWU6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIG5hbWUgb3IgZ3JvdXAgbmFtZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9CYWRQYXNzd29yZDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIHBhcmFtZXRlciBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX1VuYWJsZVRvQWRkTmFtZV9XOgorICAgICAgcmV0dXJuICJAVyBUaGUgbG9nb24gcHJvY2Vzc29yIGRpZCBub3QgYWRkIHRoZSBtZXNzYWdlIGFsaWFzLiI7CisgICAgY2FzZSBORVJSX1VuYWJsZVRvQWRkTmFtZV9GOgorICAgICAgcmV0dXJuICJUaGUgbG9nb24gcHJvY2Vzc29yIGRpZCBub3QgYWRkIHRoZSBtZXNzYWdlIGFsaWFzLiI7CisgICAgY2FzZSBORVJSX1VuYWJsZVRvRGVsTmFtZV9XOgorICAgICAgcmV0dXJuICJAVyBUaGUgbG9nb2ZmIHByb2Nlc3NvciBkaWQgbm90IGRlbGV0ZSB0aGUgbWVzc2FnZSBhbGlhcy4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0RlbE5hbWVfRjoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29mZiBwcm9jZXNzb3IgZGlkIG5vdCBkZWxldGUgdGhlIG1lc3NhZ2UgYWxpYXMuIjsKKyAgICBjYXNlIE5FUlJfTG9nb25zUGF1c2VkOgorICAgICAgcmV0dXJuICJOZXR3b3JrIGxvZ29ucyBhcmUgcGF1c2VkLiI7CisgICAgY2FzZSBORVJSX0xvZ29uU2VydmVyQ29uZmxpY3Q6CisgICAgICByZXR1cm4gIkEgY2VudHJhbGl6ZWQgbG9nb24tc2VydmVyIGNvbmZsaWN0IG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0xvZ29uTm9Vc2VyUGF0aDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSB2YWxpZCB1c2VyIHBhdGguIjsKKyAgICBjYXNlIE5FUlJfTG9nb25TY3JpcHRFcnJvcjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBvciBydW5uaW5nIHRoZSBsb2dvbiBzY3JpcHQuIjsKKyAgICBjYXNlIE5FUlJfU3RhbmRhbG9uZUxvZ29uOgorICAgICAgcmV0dXJuICJUaGUgbG9nb24gc2VydmVyIHdhcyBub3Qgc3BlY2lmaWVkLiBZb3VyIGNvbXB1dGVyIHdpbGwgYmUgbG9nZ2VkIG9uIGFzIFNUQU5EQUxPTkUuIjsKKyAgICBjYXNlIE5FUlJfTG9nb25TZXJ2ZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29uIHNlcnZlciBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfTG9nb25Eb21haW5FeGlzdHM6CisgICAgICByZXR1cm4gIlRoZXJlIGlzIGFscmVhZHkgYSBsb2dvbiBkb21haW4gZm9yIHRoaXMgY29tcHV0ZXIuIjsKKyAgICBjYXNlIE5FUlJfTm9uVmFsaWRhdGVkTG9nb246CisgICAgICByZXR1cm4gIlRoZSBsb2dvbiBzZXJ2ZXIgY291bGQgbm90IHZhbGlkYXRlIHRoZSBsb2dvbi4iOworICAgIGNhc2UgTkVSUl9BQ0ZOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNlY3VyaXR5IGRhdGFiYXNlIGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9Hcm91cE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgZ3JvdXAgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfVXNlck5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9SZXNvdXJjZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcmVzb3VyY2UgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfR3JvdXBFeGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBncm91cCBhbHJlYWR5IGV4aXN0cy4iOworICAgIGNhc2UgTkVSUl9Vc2VyRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBhY2NvdW50IGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX1Jlc291cmNlRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgcmVzb3VyY2UgcGVybWlzc2lvbiBsaXN0IGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX05vdFByaW1hcnk6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgYWxsb3dlZCBvbiB0aGUgcHJpbWFyeSBkb21haW4gY29udHJvbGxlciBvZiB0aGUgZG9tYWluLiI7CisgICAgY2FzZSBORVJSX0FDRk5vdExvYWRlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlY3VyaXR5IGRhdGFiYXNlIGhhcyBub3QgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0FDRk5vUm9vbToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHRvbyBtYW55IG5hbWVzIGluIHRoZSB1c2VyIGFjY291bnRzIGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX0FDRkZpbGVJT0ZhaWw6CisgICAgICByZXR1cm4gIkEgZGlzayBJL08gZmFpbHVyZSBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9BQ0ZUb29NYW55TGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBsaW1pdCBvZiA2NCBlbnRyaWVzIHBlciByZXNvdXJjZSB3YXMgZXhjZWVkZWQuIjsKKyAgICBjYXNlIE5FUlJfVXNlckxvZ29uOgorICAgICAgcmV0dXJuICJEZWxldGluZyBhIHVzZXIgd2l0aCBhIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuIjsKKyAgICBjYXNlIE5FUlJfQUNGTm9QYXJlbnQ6CisgICAgICByZXR1cm4gIlRoZSBwYXJlbnQgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBsb2NhdGVkLiI7CisgICAgY2FzZSBORVJSX0Nhbk5vdEdyb3dTZWdtZW50OgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gYWRkIHRvIHRoZSBzZWN1cml0eSBkYXRhYmFzZSBzZXNzaW9uIGNhY2hlIHNlZ21lbnQuIjsKKyAgICBjYXNlIE5FUlJfU3BlR3JvdXBPcDoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgb24gdGhpcyBzcGVjaWFsIGdyb3VwLiI7CisgICAgY2FzZSBORVJSX05vdEluQ2FjaGU6CisgICAgICByZXR1cm4gIlRoaXMgdXNlciBpcyBub3QgY2FjaGVkIGluIHVzZXIgYWNjb3VudHMgZGF0YWJhc2Ugc2Vzc2lvbiBjYWNoZS4iOworICAgIGNhc2UgTkVSUl9Vc2VySW5Hcm91cDoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWxyZWFkeSBiZWxvbmdzIHRvIHRoaXMgZ3JvdXAuIjsKKyAgICBjYXNlIE5FUlJfVXNlck5vdEluR3JvdXA6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGdyb3VwLiI7CisgICAgY2FzZSBORVJSX0FjY291bnRVbmRlZmluZWQ6CisgICAgICByZXR1cm4gIlRoaXMgdXNlciBhY2NvdW50IGlzIHVuZGVmaW5lZC4iOworICAgIGNhc2UgTkVSUl9BY2NvdW50RXhwaXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyB1c2VyIGFjY291bnQgaGFzIGV4cGlyZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZFdvcmtzdGF0aW9uOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBpcyBub3QgYWxsb3dlZCB0byBsb2cgb24gZnJvbSB0aGlzIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRMb2dvbkhvdXJzOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBpcyBub3QgYWxsb3dlZCB0byBsb2cgb24gYXQgdGhpcyB0aW1lLiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkRXhwaXJlZDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIG9mIHRoaXMgdXNlciBoYXMgZXhwaXJlZC4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZENhbnRDaGFuZ2U6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBvZiB0aGlzIHVzZXIgY2Fubm90IGNoYW5nZS4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZEhpc3RDb25mbGljdDoKKyAgICAgIHJldHVybiAiVGhpcyBwYXNzd29yZCBjYW5ub3QgYmUgdXNlZCBub3cuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRUb29TaG9ydDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIHBhc3N3b3JkIHBvbGljeSByZXF1aXJlbWVudHMuIENoZWNrIHRoZSBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aCwgcGFzc3dvcmQgY29tcGxleGl0eSBhbmQgcGFzc3dvcmQgaGlzdG9yeSByZXF1aXJlbWVudHMuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRUb29SZWNlbnQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBvZiB0aGlzIHVzZXIgaXMgdG9vIHJlY2VudCB0byBjaGFuZ2UuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZERhdGFiYXNlOgorICAgICAgcmV0dXJuICJUaGUgc2VjdXJpdHkgZGF0YWJhc2UgaXMgY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX0RhdGFiYXNlVXBUb0RhdGU6CisgICAgICByZXR1cm4gIk5vIHVwZGF0ZXMgYXJlIG5lY2Vzc2FyeSB0byB0aGlzIHJlcGxpY2FudCBuZXR3b3JrL2xvY2FsIHNlY3VyaXR5IGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX1N5bmNSZXF1aXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyByZXBsaWNhbnQgZGF0YWJhc2UgaXMgb3V0ZGF0ZWQ7IHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZC4iOworICAgIGNhc2UgTkVSUl9Vc2VOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIG5ldHdvcmsgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfQmFkQXNnVHlwZToKKyAgICAgIHJldHVybiAiVGhpcyBhc2dfdHlwZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0RldmljZUlzU2hhcmVkOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBpcyBjdXJyZW50bHkgYmVpbmcgc2hhcmVkLiI7CisgICAgY2FzZSBORVJSX05vQ29tcHV0ZXJOYW1lOgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgbmFtZSBjb3VsZCBub3QgYmUgYWRkZWQgYXMgYSBtZXNzYWdlIGFsaWFzLiBUaGUgbmFtZSBtYXkgYWxyZWFkeSBleGlzdCBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9Nc2dBbHJlYWR5U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIE1lc3NlbmdlciBzZXJ2aWNlIGlzIGFscmVhZHkgc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9Nc2dJbml0RmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgTWVzc2VuZ2VyIHNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0LiI7CisgICAgY2FzZSBORVJSX05hbWVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgY291bGQgbm90IGJlIGZvdW5kIG9uIHRoZSBuZXR3b3JrLiI7CisgICAgY2FzZSBORVJSX0FscmVhZHlGb3J3YXJkZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbWVzc2FnZSBhbGlhcyBoYXMgYWxyZWFkeSBiZWVuIGZvcndhcmRlZC4iOworICAgIGNhc2UgTkVSUl9BZGRGb3J3YXJkZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbWVzc2FnZSBhbGlhcyBoYXMgYmVlbiBhZGRlZCBidXQgaXMgc3RpbGwgZm9yd2FyZGVkLiI7CisgICAgY2FzZSBORVJSX0FscmVhZHlFeGlzdHM6CisgICAgICByZXR1cm4gIlRoaXMgbWVzc2FnZSBhbGlhcyBhbHJlYWR5IGV4aXN0cyBsb2NhbGx5LiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlOYW1lczoKKyAgICAgIHJldHVybiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZGVkIG1lc3NhZ2UgYWxpYXNlcyBoYXMgYmVlbiBleGNlZWRlZC4iOworICAgIGNhc2UgTkVSUl9EZWxDb21wdXRlck5hbWU6CisgICAgICByZXR1cm4gIlRoZSBjb21wdXRlciBuYW1lIGNvdWxkIG5vdCBiZSBkZWxldGVkLiI7CisgICAgY2FzZSBORVJSX0xvY2FsRm9yd2FyZDoKKyAgICAgIHJldHVybiAiTWVzc2FnZXMgY2Fubm90IGJlIGZvcndhcmRlZCBiYWNrIHRvIHRoZSBzYW1lIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX0dycE1zZ1Byb2Nlc3NvcjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGRvbWFpbiBtZXNzYWdlIHByb2Nlc3Nvci4iOworICAgIGNhc2UgTkVSUl9QYXVzZWRSZW1vdGU6CisgICAgICByZXR1cm4gIlRoZSBtZXNzYWdlIHdhcyBzZW50LCBidXQgdGhlIHJlY2lwaWVudCBoYXMgcGF1c2VkIHRoZSBNZXNzZW5nZXIgc2VydmljZS4iOworICAgIGNhc2UgTkVSUl9CYWRSZWNlaXZlOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSB3YXMgc2VudCBidXQgbm90IHJlY2VpdmVkLiI7CisgICAgY2FzZSBORVJSX05hbWVJblVzZToKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgaXMgY3VycmVudGx5IGluIHVzZS4gVHJ5IGFnYWluIGxhdGVyLiI7CisgICAgY2FzZSBORVJSX01zZ05vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBNZXNzZW5nZXIgc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9Ob3RMb2NhbE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBuYW1lIGlzIG5vdCBvbiB0aGUgbG9jYWwgY29tcHV0ZXIuIjsKKyAgICBjYXNlIE5FUlJfTm9Gb3J3YXJkTmFtZToKKyAgICAgIHJldHVybiAiVGhlIGZvcndhcmRlZCBtZXNzYWdlIGFsaWFzIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9SZW1vdGVGdWxsOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSBhbGlhcyB0YWJsZSBvbiB0aGUgcmVtb3RlIHN0YXRpb24gaXMgZnVsbC4iOworICAgIGNhc2UgTkVSUl9OYW1lTm90Rm9yd2FyZGVkOgorICAgICAgcmV0dXJuICJNZXNzYWdlcyBmb3IgdGhpcyBhbGlhcyBhcmUgbm90IGN1cnJlbnRseSBiZWluZyBmb3J3YXJkZWQuIjsKKyAgICBjYXNlIE5FUlJfVHJ1bmNhdGVkQnJvYWRjYXN0OgorICAgICAgcmV0dXJuICJUaGUgYnJvYWRjYXN0IG1lc3NhZ2Ugd2FzIHRydW5jYXRlZC4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkRGV2aWNlOgorICAgICAgcmV0dXJuICJUaGlzIGlzIGFuIGludmFsaWQgZGV2aWNlIG5hbWUuIjsKKyAgICBjYXNlIE5FUlJfV3JpdGVGYXVsdDoKKyAgICAgIHJldHVybiAiQSB3cml0ZSBmYXVsdCBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9EdXBsaWNhdGVOYW1lOgorICAgICAgcmV0dXJuICJBIGR1cGxpY2F0ZSBtZXNzYWdlIGFsaWFzIGV4aXN0cyBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9EZWxldGVMYXRlcjoKKyAgICAgIHJldHVybiAiQFcgVGhpcyBtZXNzYWdlIGFsaWFzIHdpbGwgYmUgZGVsZXRlZCBsYXRlci4iOworICAgIGNhc2UgTkVSUl9JbmNvbXBsZXRlRGVsOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSBhbGlhcyB3YXMgbm90IHN1Y2Nlc3NmdWxseSBkZWxldGVkIGZyb20gYWxsIG5ldHdvcmtzLiI7CisgICAgY2FzZSBORVJSX011bHRpcGxlTmV0czoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBjb21wdXRlcnMgd2l0aCBtdWx0aXBsZSBuZXR3b3Jrcy4iOworICAgIGNhc2UgTkVSUl9OZXROYW1lTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoaXMgc2hhcmVkIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0RldmljZU5vdFNoYXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgaXMgbm90IHNoYXJlZC4iOworICAgIGNhc2UgTkVSUl9DbGllbnROYW1lTm90Rm91bmQ6CisgICAgICByZXR1cm4gIkEgc2Vzc2lvbiBkb2VzIG5vdCBleGlzdCB3aXRoIHRoYXQgY29tcHV0ZXIgbmFtZS4iOworICAgIGNhc2UgTkVSUl9GaWxlSWROb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlcmUgaXMgbm90IGFuIG9wZW4gZmlsZSB3aXRoIHRoYXQgaWRlbnRpZmljYXRpb24gbnVtYmVyLiI7CisgICAgY2FzZSBORVJSX0V4ZWNGYWlsdXJlOgorICAgICAgcmV0dXJuICJBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBleGVjdXRpbmcgYSByZW1vdGUgYWRtaW5pc3RyYXRpb24gY29tbWFuZC4iOworICAgIGNhc2UgTkVSUl9UbXBGaWxlOgorICAgICAgcmV0dXJuICJBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBvcGVuaW5nIGEgcmVtb3RlIHRlbXBvcmFyeSBmaWxlLiI7CisgICAgY2FzZSBORVJSX1Rvb011Y2hEYXRhOgorICAgICAgcmV0dXJuICJUaGUgZGF0YSByZXR1cm5lZCBmcm9tIGEgcmVtb3RlIGFkbWluaXN0cmF0aW9uIGNvbW1hbmQgaGFzIGJlZW4gdHJ1bmNhdGVkIHRvIDY0Sy4iOworICAgIGNhc2UgTkVSUl9EZXZpY2VTaGFyZUNvbmZsaWN0OgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBjYW5ub3QgYmUgc2hhcmVkIGFzIGJvdGggYSBzcG9vbGVkIGFuZCBhIG5vbi1zcG9vbGVkIHJlc291cmNlLiI7CisgICAgY2FzZSBORVJSX0Jyb3dzZXJUYWJsZUluY29tcGxldGU6CisgICAgICByZXR1cm4gIlRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgbGlzdCBvZiBzZXJ2ZXJzIG1heSBiZSBpbmNvcnJlY3QuIjsKKyAgICBjYXNlIE5FUlJfTm90TG9jYWxEb21haW46CisgICAgICByZXR1cm4gIlRoZSBjb21wdXRlciBpcyBub3QgYWN0aXZlIGluIHRoaXMgZG9tYWluLiI7CisjaWZkZWYgTkVSUl9Jc0Rmc1NoYXJlCisKKyAgICBjYXNlIE5FUlJfSXNEZnNTaGFyZToKKyAgICAgIHJldHVybiAiVGhlIHNoYXJlIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBEaXN0cmlidXRlZCBGaWxlIFN5c3RlbSBiZWZvcmUgaXQgY2FuIGJlIGRlbGV0ZWQuIjsKKyNlbmRpZgorCisgICAgY2FzZSBORVJSX0RldkludmFsaWRPcENvZGU6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgaW52YWxpZCBmb3IgdGhpcyBkZXZpY2UuIjsKKyAgICBjYXNlIE5FUlJfRGV2Tm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIGNhbm5vdCBiZSBzaGFyZWQuIjsKKyAgICBjYXNlIE5FUlJfRGV2Tm90T3BlbjoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2Ugd2FzIG5vdCBvcGVuLiI7CisgICAgY2FzZSBORVJSX0JhZFF1ZXVlRGV2U3RyaW5nOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBuYW1lIGxpc3QgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9CYWRRdWV1ZVByaW9yaXR5OgorICAgICAgcmV0dXJuICJUaGUgcXVldWUgcHJpb3JpdHkgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9Ob0NvbW1EZXZzOgorICAgICAgcmV0dXJuICJUaGVyZSBhcmUgbm8gc2hhcmVkIGNvbW11bmljYXRpb24gZGV2aWNlcy4iOworICAgIGNhc2UgTkVSUl9RdWV1ZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcXVldWUgeW91IHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdC4iOworICAgIGNhc2UgTkVSUl9CYWREZXZTdHJpbmc6CisgICAgICByZXR1cm4gIlRoaXMgbGlzdCBvZiBkZXZpY2VzIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkRGV2OgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIGRldmljZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0luVXNlQnlTcG9vbGVyOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgc3Bvb2xlci4iOworICAgIGNhc2UgTkVSUl9Db21tRGV2SW5Vc2U6CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIGlzIGFscmVhZHkgaW4gdXNlIGFzIGEgY29tbXVuaWNhdGlvbiBkZXZpY2UuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZENvbXB1dGVyOgorICAgICAgcmV0dXJuICJUaGlzIGNvbXB1dGVyIG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9NYXhMZW5FeGNlZWRlZDoKKyAgICAgIHJldHVybiAiVGhlIHN0cmluZyBhbmQgcHJlZml4IHNwZWNpZmllZCBhcmUgdG9vIGxvbmcuIjsKKyAgICBjYXNlIE5FUlJfQmFkQ29tcG9uZW50OgorICAgICAgcmV0dXJuICJUaGlzIHBhdGggY29tcG9uZW50IGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQ2FudFR5cGU6CisgICAgICByZXR1cm4gIkNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgaW5wdXQuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueUVudHJpZXM6CisgICAgICByZXR1cm4gIlRoZSBidWZmZXIgZm9yIHR5cGVzIGlzIG5vdCBiaWcgZW5vdWdoLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVGaWxlVG9vQmlnOgorICAgICAgcmV0dXJuICJQcm9maWxlIGZpbGVzIGNhbm5vdCBleGNlZWQgNjRLLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVPZmZzZXQ6CisgICAgICByZXR1cm4gIlRoZSBzdGFydCBvZmZzZXQgaXMgb3V0IG9mIHJhbmdlLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVDbGVhbnVwOgorICAgICAgcmV0dXJuICJUaGUgc3lzdGVtIGNhbm5vdCBkZWxldGUgY3VycmVudCBjb25uZWN0aW9ucyB0byBuZXR3b3JrIHJlc291cmNlcy4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlVW5rbm93bkNtZDoKKyAgICAgIHJldHVybiAiVGhlIHN5c3RlbSB3YXMgdW5hYmxlIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgaW4gdGhpcyBmaWxlLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVMb2FkRXJyOgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBwcm9maWxlIGZpbGUuIjsKKyAgICBjYXNlIE5FUlJfUHJvZmlsZVNhdmVFcnI6CisgICAgICByZXR1cm4gIkBXIEVycm9ycyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIHByb2ZpbGUgZmlsZS4gVGhlIHByb2ZpbGUgd2FzIHBhcnRpYWxseSBzYXZlZC4iOworICAgIGNhc2UgTkVSUl9Mb2dPdmVyZmxvdzoKKyAgICAgIHJldHVybiAiTG9nIGZpbGUgJTEgaXMgZnVsbC4iOworICAgIGNhc2UgTkVSUl9Mb2dGaWxlQ2hhbmdlZDoKKyAgICAgIHJldHVybiAiVGhpcyBsb2cgZmlsZSBoYXMgY2hhbmdlZCBiZXR3ZWVuIHJlYWRzLiI7CisgICAgY2FzZSBORVJSX0xvZ0ZpbGVDb3JydXB0OgorICAgICAgcmV0dXJuICJMb2cgZmlsZSAlMSBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX1NvdXJjZUlzRGlyOgorICAgICAgcmV0dXJuICJUaGUgc291cmNlIHBhdGggY2Fubm90IGJlIGEgZGlyZWN0b3J5LiI7CisgICAgY2FzZSBORVJSX0JhZFNvdXJjZToKKyAgICAgIHJldHVybiAiVGhlIHNvdXJjZSBwYXRoIGlzIGlsbGVnYWwuIjsKKyAgICBjYXNlIE5FUlJfQmFkRGVzdDoKKyAgICAgIHJldHVybiAiVGhlIGRlc3RpbmF0aW9uIHBhdGggaXMgaWxsZWdhbC4iOworICAgIGNhc2UgTkVSUl9EaWZmZXJlbnRTZXJ2ZXJzOgorICAgICAgcmV0dXJuICJUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwYXRocyBhcmUgb24gZGlmZmVyZW50IHNlcnZlcnMuIjsKKyAgICBjYXNlIE5FUlJfUnVuU3J2UGF1c2VkOgorICAgICAgcmV0dXJuICJUaGUgUnVuIHNlcnZlciB5b3UgcmVxdWVzdGVkIGlzIHBhdXNlZC4iOworICAgIGNhc2UgTkVSUl9FcnJDb21tUnVuU3J2OgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCBhIFJ1biBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfRXJyb3JFeGVjaW5nR2hvc3Q6CisgICAgICByZXR1cm4gIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gc3RhcnRpbmcgYSBiYWNrZ3JvdW5kIHByb2Nlc3MuIjsKKyAgICBjYXNlIE5FUlJfU2hhcmVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNoYXJlZCByZXNvdXJjZSB5b3UgYXJlIGNvbm5lY3RlZCB0byBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZExhbmE6CisgICAgICByZXR1cm4gIlRoZSBMQU4gYWRhcHRlciBudW1iZXIgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9PcGVuRmlsZXM6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSBvcGVuIGZpbGVzIG9uIHRoZSBjb25uZWN0aW9uLiI7CisgICAgY2FzZSBORVJSX0FjdGl2ZUNvbm5zOgorICAgICAgcmV0dXJuICJBY3RpdmUgY29ubmVjdGlvbnMgc3RpbGwgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfQmFkUGFzc3dvcmRDb3JlOgorICAgICAgcmV0dXJuICJUaGlzIHNoYXJlIG5hbWUgb3IgcGFzc3dvcmQgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EZXZJblVzZToKKyAgICAgIHJldHVybiAiVGhlIGRldmljZSBpcyBiZWluZyBhY2Nlc3NlZCBieSBhbiBhY3RpdmUgcHJvY2Vzcy4iOworICAgIGNhc2UgTkVSUl9Mb2NhbERyaXZlOgorICAgICAgcmV0dXJuICJUaGUgZHJpdmUgbGV0dGVyIGlzIGluIHVzZSBsb2NhbGx5LiI7CisgICAgY2FzZSBORVJSX0FsZXJ0RXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIGNsaWVudCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueUFsZXJ0czoKKyAgICAgIHJldHVybiAiVGhlIGFsZXJ0IHRhYmxlIGlzIGZ1bGwuIjsKKyAgICBjYXNlIE5FUlJfTm9TdWNoQWxlcnQ6CisgICAgICByZXR1cm4gIkFuIGludmFsaWQgb3Igbm9uZXhpc3RlbnQgYWxlcnQgbmFtZSB3YXMgcmFpc2VkLiI7CisgICAgY2FzZSBORVJSX0JhZFJlY2lwaWVudDoKKyAgICAgIHJldHVybiAiVGhlIGFsZXJ0IHJlY2lwaWVudCBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0FjY3RMaW1pdEV4Y2VlZGVkOgorICAgICAgcmV0dXJuICJBIHVzZXIncyBzZXNzaW9uIHdpdGggdGhpcyBzZXJ2ZXIgaGFzIGJlZW4gZGVsZXRlZC4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkTG9nU2VlazoKKyAgICAgIHJldHVybiAiVGhlIGxvZyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVlc3RlZCByZWNvcmQgbnVtYmVyLiI7CisgICAgY2FzZSBORVJSX0JhZFVhc0NvbmZpZzoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWNjb3VudHMgZGF0YWJhc2UgaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRVQVNPcDoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IHBlcm1pdHRlZCB3aGVuIHRoZSBOZXRsb2dvbiBzZXJ2aWNlIGlzIHJ1bm5pbmcuIjsKKyAgICBjYXNlIE5FUlJfTGFzdEFkbWluOgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiB0aGUgbGFzdCBhZG1pbmlzdHJhdGl2ZSBhY2NvdW50LiI7CisgICAgY2FzZSBORVJSX0RDTm90Rm91bmQ6CisgICAgICByZXR1cm4gIkNvdWxkIG5vdCBmaW5kIGRvbWFpbiBjb250cm9sbGVyIGZvciB0aGlzIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9Mb2dvblRyYWNraW5nRXJyb3I6CisgICAgICByZXR1cm4gIkNvdWxkIG5vdCBzZXQgbG9nb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgdXNlci4iOworICAgIGNhc2UgTkVSUl9OZXRsb2dvbk5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBOZXRsb2dvbiBzZXJ2aWNlIGhhcyBub3QgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX0Nhbk5vdEdyb3dVQVNGaWxlOgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gYWRkIHRvIHRoZSB1c2VyIGFjY291bnRzIGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX1RpbWVEaWZmQXREQzoKKyAgICAgIHJldHVybiAiVGhpcyBzZXJ2ZXIncyBjbG9jayBpcyBub3Qgc3luY2hyb25pemVkIHdpdGggdGhlIHByaW1hcnkgZG9tYWluIGNvbnRyb2xsZXIncyBjbG9jay4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZE1pc21hdGNoOgorICAgICAgcmV0dXJuICJBIHBhc3N3b3JkIG1pc21hdGNoIGhhcyBiZWVuIGRldGVjdGVkLiI7CisgICAgY2FzZSBORVJSX05vU3VjaFNlcnZlcjoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBpZGVudGlmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX05vU3VjaFNlc3Npb246CisgICAgICByZXR1cm4gIlRoZSBzZXNzaW9uIGlkZW50aWZpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBzZXNzaW9uLiI7CisgICAgY2FzZSBORVJSX05vU3VjaENvbm5lY3Rpb246CisgICAgICByZXR1cm4gIlRoZSBjb25uZWN0aW9uIGlkZW50aWZpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBjb25uZWN0aW9uLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlTZXJ2ZXJzOgorICAgICAgcmV0dXJuICJUaGVyZSBpcyBubyBzcGFjZSBmb3IgYW5vdGhlciBlbnRyeSBpbiB0aGUgdGFibGUgb2YgYXZhaWxhYmxlIHNlcnZlcnMuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueVNlc3Npb25zOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGhhcyByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucyBpdCBzdXBwb3J0cy4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55Q29ubmVjdGlvbnM6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaGFzIHJlYWNoZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGl0IHN1cHBvcnRzLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlGaWxlczoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBjYW5ub3Qgb3BlbiBtb3JlIGZpbGVzIGJlY2F1c2UgaXQgaGFzIHJlYWNoZWQgaXRzIG1heGltdW0gbnVtYmVyLiI7CisgICAgY2FzZSBORVJSX05vQWx0ZXJuYXRlU2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIG5vIGFsdGVybmF0ZSBzZXJ2ZXJzIHJlZ2lzdGVyZWQgb24gdGhpcyBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfVHJ5RG93bkxldmVsOgorICAgICAgcmV0dXJuICJUcnkgZG93bi1sZXZlbCAocmVtb3RlIGFkbWluIHByb3RvY29sKSB2ZXJzaW9uIG9mIEFQSSBpbnN0ZWFkLiI7CisgICAgY2FzZSBORVJSX1VQU0RyaXZlck5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBVUFMgZHJpdmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCBieSB0aGUgVVBTIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfVVBTSW52YWxpZENvbmZpZzoKKyAgICAgIHJldHVybiAiVGhlIFVQUyBzZXJ2aWNlIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4iOworICAgIGNhc2UgTkVSUl9VUFNJbnZhbGlkQ29tbVBvcnQ6CisgICAgICByZXR1cm4gIlRoZSBVUFMgc2VydmljZSBjb3VsZCBub3QgYWNjZXNzIHRoZSBzcGVjaWZpZWQgQ29tbSBQb3J0LiI7CisgICAgY2FzZSBORVJSX1VQU1NpZ25hbEFzc2VydGVkOgorICAgICAgcmV0dXJuICJUaGUgVVBTIGluZGljYXRlZCBhIGxpbmUgZmFpbCBvciBsb3cgYmF0dGVyeSBzaXR1YXRpb24uIFNlcnZpY2Ugbm90IHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfVVBTU2h1dGRvd25GYWlsZWQ6CisgICAgICByZXR1cm4gIlRoZSBVUFMgc2VydmljZSBmYWlsZWQgdG8gcGVyZm9ybSBhIHN5c3RlbSBzaHV0IGRvd24uIjsKKyAgICBjYXNlIE5FUlJfQmFkRG9zUmV0Q29kZToKKyAgICAgIHJldHVybiAiVGhlIHByb2dyYW0gYmVsb3cgcmV0dXJuZWQgYW4gTVMtRE9TIGVycm9yIGNvZGU6IjsKKyAgICBjYXNlIE5FUlJfUHJvZ05lZWRzRXh0cmFNZW06CisgICAgICByZXR1cm4gIlRoZSBwcm9ncmFtIGJlbG93IG5lZWRzIG1vcmUgbWVtb3J5OiI7CisgICAgY2FzZSBORVJSX0JhZERvc0Z1bmN0aW9uOgorICAgICAgcmV0dXJuICJUaGUgcHJvZ3JhbSBiZWxvdyBjYWxsZWQgYW4gdW5zdXBwb3J0ZWQgTVMtRE9TIGZ1bmN0aW9uOiI7CisgICAgY2FzZSBORVJSX1JlbW90ZUJvb3RGYWlsZWQ6CisgICAgICByZXR1cm4gIlRoZSB3b3Jrc3RhdGlvbiBmYWlsZWQgdG8gYm9vdC4iOworICAgIGNhc2UgTkVSUl9CYWRGaWxlQ2hlY2tTdW06CisgICAgICByZXR1cm4gIlRoZSBmaWxlIGJlbG93IGlzIGNvcnJ1cHQuIjsKKyAgICBjYXNlIE5FUlJfTm9ScGxCb290U3lzdGVtOgorICAgICAgcmV0dXJuICJObyBsb2FkZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBib290LWJsb2NrIGRlZmluaXRpb24gZmlsZS4iOworICAgIGNhc2UgTkVSUl9ScGxMb2Fkck5ldEJpb3NFcnI6CisgICAgICByZXR1cm4gIk5ldEJJT1MgcmV0dXJuZWQgYW4gZXJyb3I6ICAgICAgVGhlIE5DQiBhbmQgU01CIGFyZSBkdW1wZWQgYWJvdmUuIjsKKyAgICBjYXNlIE5FUlJfUnBsTG9hZHJEaXNrRXJyOgorICAgICAgcmV0dXJuICJBIGRpc2sgSS9PIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0ltYWdlUGFyYW1FcnI6CisgICAgICByZXR1cm4gIkltYWdlIHBhcmFtZXRlciBzdWJzdGl0dXRpb24gZmFpbGVkLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlJbWFnZVBhcmFtczoKKyAgICAgIHJldHVybiAiVG9vIG1hbnkgaW1hZ2UgcGFyYW1ldGVycyBjcm9zcyBkaXNrIHNlY3RvciBib3VuZGFyaWVzLiI7CisgICAgY2FzZSBORVJSX05vbkRvc0Zsb3BweVVzZWQ6CisgICAgICByZXR1cm4gIlRoZSBpbWFnZSB3YXMgbm90IGdlbmVyYXRlZCBmcm9tIGFuIE1TLURPUyBkaXNrZXR0ZSBmb3JtYXR0ZWQgd2l0aCAvUy4iOworICAgIGNhc2UgTkVSUl9ScGxCb290UmVzdGFydDoKKyAgICAgIHJldHVybiAiUmVtb3RlIGJvb3Qgd2lsbCBiZSByZXN0YXJ0ZWQgbGF0ZXIuIjsKKyAgICBjYXNlIE5FUlJfUnBsU3J2ckNhbGxGYWlsZWQ6CisgICAgICByZXR1cm4gIlRoZSBjYWxsIHRvIHRoZSBSZW1vdGVib290IHNlcnZlciBmYWlsZWQuIjsKKyAgICBjYXNlIE5FUlJfQ2FudENvbm5lY3RScGxTcnZyOgorICAgICAgcmV0dXJuICJDYW5ub3QgY29ubmVjdCB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfQ2FudE9wZW5JbWFnZUZpbGU6CisgICAgICByZXR1cm4gIkNhbm5vdCBvcGVuIGltYWdlIGZpbGUgb24gdGhlIFJlbW90ZWJvb3Qgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0NhbGxpbmdScGxTcnZyOgorICAgICAgcmV0dXJuICJDb25uZWN0aW5nIHRvIHRoZSBSZW1vdGVib290IHNlcnZlci4uLiI7CisgICAgY2FzZSBORVJSX1N0YXJ0aW5nUnBsQm9vdDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGluZyB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIuLi4iOworICAgIGNhc2UgTkVSUl9ScGxCb290U2VydmljZVRlcm06CisgICAgICByZXR1cm4gIlJlbW90ZSBib290IHNlcnZpY2Ugd2FzIHN0b3BwZWQ7IGNoZWNrIHRoZSBlcnJvciBsb2cgZm9yIHRoZSBjYXVzZSBvZiB0aGUgcHJvYmxlbS4iOworICAgIGNhc2UgTkVSUl9ScGxCb290U3RhcnRGYWlsZWQ6CisgICAgICByZXR1cm4gIlJlbW90ZSBib290IHN0YXJ0dXAgZmFpbGVkOyBjaGVjayB0aGUgZXJyb3IgbG9nIGZvciB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0uIjsKKyAgICBjYXNlIE5FUlJfUlBMX0NPTk5FQ1RFRDoKKyAgICAgIHJldHVybiAiQSBzZWNvbmQgY29ubmVjdGlvbiB0byBhIFJlbW90ZWJvb3QgcmVzb3VyY2UgaXMgbm90IGFsbG93ZWQuIjsKKyAgICBjYXNlIE5FUlJfQnJvd3NlckNvbmZpZ3VyZWRUb05vdFJ1bjoKKyAgICAgIHJldHVybiAiVGhlIGJyb3dzZXIgc2VydmljZSB3YXMgY29uZmlndXJlZCB3aXRoIE1haW50YWluU2VydmVyTGlzdD1Oby4iOworICAgIGNhc2UgTkVSUl9ScGxOb0FkYXB0ZXJzU3RhcnRlZDoKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgc2luY2Ugbm9uZSBvZiB0aGUgbmV0d29yayBhZGFwdGVycyBzdGFydGVkIHdpdGggdGhpcyBzZXJ2aWNlLiI7CisgICAgY2FzZSBORVJSX1JwbEJhZFJlZ2lzdHJ5OgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBkdWUgdG8gYmFkIHN0YXJ0dXAgaW5mb3JtYXRpb24gaW4gdGhlIHJlZ2lzdHJ5LiI7CisgICAgY2FzZSBORVJSX1JwbEJhZERhdGFiYXNlOgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBiZWNhdXNlIGl0cyBkYXRhYmFzZSBpcyBhYnNlbnQgb3IgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9ScGxScGxmaWxlc1NoYXJlOgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBiZWNhdXNlIFJQTEZJTEVTIHNoYXJlIGlzIGFic2VudC4iOworICAgIGNhc2UgTkVSUl9ScGxOb3RScGxTZXJ2ZXI6CisgICAgICByZXR1cm4gIlNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0IGJlY2F1c2UgUlBMVVNFUiBncm91cCBpcyBhYnNlbnQuIjsKKyAgICBjYXNlIE5FUlJfUnBsQ2Fubm90RW51bToKKyAgICAgIHJldHVybiAiQ2Fubm90IGVudW1lcmF0ZSBzZXJ2aWNlIHJlY29yZHMuIjsKKyAgICBjYXNlIE5FUlJfUnBsV2tzdGFJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJXb3Jrc3RhdGlvbiByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhTm90Rm91bmQ6CisgICAgICByZXR1cm4gIldvcmtzdGF0aW9uIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJXb3Jrc3RhdGlvbiBuYW1lIGlzIGluIHVzZSBieSBzb21lIG90aGVyIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJQcm9maWxlIHJlY29yZCBpbmZvcm1hdGlvbiBoYXMgYmVlbiBjb3JydXB0ZWQuIjsKKyAgICBjYXNlIE5FUlJfUnBsUHJvZmlsZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJQcm9maWxlIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVOYW1lVW5hdmFpbGFibGU6CisgICAgICByZXR1cm4gIlByb2ZpbGUgbmFtZSBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciBwcm9maWxlLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVOb3RFbXB0eToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHdvcmtzdGF0aW9ucyB1c2luZyB0aGlzIHByb2ZpbGUuIjsKKyAgICBjYXNlIE5FUlJfUnBsQ29uZmlnSW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiQ29uZmlndXJhdGlvbiByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ05vdEZvdW5kOgorICAgICAgcmV0dXJuICJDb25maWd1cmF0aW9uIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbEFkYXB0ZXJJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJBZGFwdGVyIElEIHJlY29yZCBpbmZvcm1hdGlvbiBoYXMgYmVlbiBjb3JydXB0ZWQuIjsKKyAgICBjYXNlIE5FUlJfUnBsSW50ZXJuYWw6CisgICAgICByZXR1cm4gIkFuIGludGVybmFsIHNlcnZpY2UgZXJyb3IgaGFzIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX1JwbFZlbmRvckluZm9Db3JydXB0ZWQ6CisgICAgICByZXR1cm4gIlZlbmRvciBJRCByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbEJvb3RJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJCb290IGJsb2NrIHJlY29yZCBpbmZvcm1hdGlvbiBoYXMgYmVlbiBjb3JydXB0ZWQuIjsKKyAgICBjYXNlIE5FUlJfUnBsV2tzdGFOZWVkc1VzZXJBY2N0OgorICAgICAgcmV0dXJuICJUaGUgdXNlciBhY2NvdW50IGZvciB0aGlzIHdvcmtzdGF0aW9uIHJlY29yZCBpcyBtaXNzaW5nLiI7CisgICAgY2FzZSBORVJSX1JwbE5lZWRzUlBMVVNFUkFjY3Q6CisgICAgICByZXR1cm4gIlRoZSBSUExVU0VSIGxvY2FsIGdyb3VwIGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxCb290Tm90Rm91bmQ6CisgICAgICByZXR1cm4gIkJvb3QgYmxvY2sgcmVjb3JkIHdhcyBub3QgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsSW5jb21wYXRpYmxlUHJvZmlsZToKKyAgICAgIHJldHVybiAiQ2hvc2VuIHByb2ZpbGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxBZGFwdGVyTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJDaG9zZW4gbmV0d29yayBhZGFwdGVyIElEIGlzIGluIHVzZSBieSBzb21lIG90aGVyIHdvcmtzdGF0aW9uLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ05vdEVtcHR5OgorICAgICAgcmV0dXJuICJUaGVyZSBhcmUgcHJvZmlsZXMgdXNpbmcgdGhpcyBjb25maWd1cmF0aW9uLiI7CisgICAgY2FzZSBORVJSX1JwbEJvb3RJblVzZToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHdvcmtzdGF0aW9ucywgcHJvZmlsZXMsIG9yIGNvbmZpZ3VyYXRpb25zIHVzaW5nIHRoaXMgYm9vdCBibG9jay4iOworICAgIGNhc2UgTkVSUl9ScGxCYWNrdXBEYXRhYmFzZToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gYmFja3VwIFJlbW90ZWJvb3QgZGF0YWJhc2UuIjsKKyAgICBjYXNlIE5FUlJfUnBsQWRhcHRlck5vdEZvdW5kOgorICAgICAgcmV0dXJuICJBZGFwdGVyIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFZlbmRvck5vdEZvdW5kOgorICAgICAgcmV0dXJuICJWZW5kb3IgcmVjb3JkIHdhcyBub3QgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsVmVuZG9yTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJWZW5kb3IgbmFtZSBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciB2ZW5kb3IgcmVjb3JkLiI7CisgICAgY2FzZSBORVJSX1JwbEJvb3ROYW1lVW5hdmFpbGFibGU6CisgICAgICByZXR1cm4gIihib290IG5hbWUsIHZlbmRvciBJRCkgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgYm9vdCBibG9jayByZWNvcmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsQ29uZmlnTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJDb25maWd1cmF0aW9uIG5hbWUgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgY29uZmlndXJhdGlvbi4iOworICAgIGNhc2UgTkVSUl9EZnNJbnRlcm5hbENvcnJ1cHRpb246CisgICAgICByZXR1cm4gIlRoZSBpbnRlcm5hbCBkYXRhYmFzZSBtYWludGFpbmVkIGJ5IHRoZSBEZnMgc2VydmljZSBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZURhdGFDb3JydXB0OgorICAgICAgcmV0dXJuICJPbmUgb2YgdGhlIHJlY29yZHMgaW4gdGhlIGludGVybmFsIERmcyBkYXRhYmFzZSBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX0Rmc05vU3VjaFZvbHVtZToKKyAgICAgIHJldHVybiAiVGhlcmUgaXMgbm8gREZTIG5hbWUgd2hvc2UgZW50cnkgcGF0aCBtYXRjaGVzIHRoZSBpbnB1dCBFbnRyeSBQYXRoLiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZUFscmVhZHlFeGlzdHM6CisgICAgICByZXR1cm4gIkEgcm9vdCBvciBsaW5rIHdpdGggdGhlIGdpdmVuIG5hbWUgYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfRGZzQWxyZWFkeVNoYXJlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBzaGFyZSBzcGVjaWZpZWQgaXMgYWxyZWFkeSBzaGFyZWQgaW4gdGhlIERmcy4iOworICAgIGNhc2UgTkVSUl9EZnNOb1N1Y2hTaGFyZToKKyAgICAgIHJldHVybiAiVGhlIGluZGljYXRlZCBzZXJ2ZXIgc2hhcmUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW5kaWNhdGVkIERGUyBuYW1lc3BhY2UuIjsKKyAgICBjYXNlIE5FUlJfRGZzTm90QUxlYWZWb2x1bWU6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgbm90IHZhbGlkIG9uIHRoaXMgcG9ydGlvbiBvZiB0aGUgbmFtZXNwYWNlLiI7CisgICAgY2FzZSBORVJSX0Rmc0xlYWZWb2x1bWU6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgbm90IHZhbGlkIG9uIHRoaXMgcG9ydGlvbiBvZiB0aGUgbmFtZXNwYWNlLiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZUhhc011bHRpcGxlU2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlIG9wZXJhdGlvbiBpcyBhbWJpZ3VvdXMgYmVjYXVzZSB0aGUgbGluayBoYXMgbXVsdGlwbGUgc2VydmVycy4iOworICAgIGNhc2UgTkVSUl9EZnNDYW50Q3JlYXRlSnVuY3Rpb25Qb2ludDoKKyAgICAgIHJldHVybiAiVW5hYmxlIHRvIGNyZWF0ZSBhIGxpbmsuIjsKKyAgICBjYXNlIE5FUlJfRGZzU2VydmVyTm90RGZzQXdhcmU6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgbm90IERmcyBBd2FyZS4iOworICAgIGNhc2UgTkVSUl9EZnNCYWRSZW5hbWVQYXRoOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIHJlbmFtZSB0YXJnZXQgcGF0aCBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0Rmc1ZvbHVtZUlzT2ZmbGluZToKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBERlMgbGluayBpcyBvZmZsaW5lLiI7CisgICAgY2FzZSBORVJSX0Rmc05vU3VjaFNlcnZlcjoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBzZXJ2ZXIgaXMgbm90IGEgc2VydmVyIGZvciB0aGlzIGxpbmsuIjsKKyAgICBjYXNlIE5FUlJfRGZzQ3ljbGljYWxOYW1lOgorICAgICAgcmV0dXJuICJBIGN5Y2xlIGluIHRoZSBEZnMgbmFtZSB3YXMgZGV0ZWN0ZWQuIjsKKyAgICBjYXNlIE5FUlJfRGZzTm90U3VwcG9ydGVkSW5TZXJ2ZXJEZnM6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBhIHNlcnZlci1iYXNlZCBEZnMuIjsKKyAgICBjYXNlIE5FUlJfRGZzRHVwbGljYXRlU2VydmljZToKKyAgICAgIHJldHVybiAiVGhpcyBsaW5rIGlzIGFscmVhZHkgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgc2VydmVyLXNoYXJlLiI7CisgICAgY2FzZSBORVJSX0Rmc0NhbnRSZW1vdmVMYXN0U2VydmVyU2hhcmU6CisgICAgICByZXR1cm4gIkNhbid0IHJlbW92ZSB0aGUgbGFzdCBzZXJ2ZXItc2hhcmUgc3VwcG9ydGluZyB0aGlzIHJvb3Qgb3IgbGluay4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVJc0ludGVyRGZzOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFuIEludGVyLURGUyBsaW5rLiI7CisgICAgY2FzZSBORVJSX0Rmc0luY29uc2lzdGVudDoKKyAgICAgIHJldHVybiAiVGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBEZnMgU2VydmljZSBoYXMgYmVjb21lIGluY29uc2lzdGVudC4iOworICAgIGNhc2UgTkVSUl9EZnNTZXJ2ZXJVcGdyYWRlZDoKKyAgICAgIHJldHVybiAiVGhlIERmcyBTZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCBvbiB0aGUgc3BlY2lmaWVkIHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9EZnNEYXRhSXNJZGVudGljYWw6CisgICAgICByZXR1cm4gIlRoZSBEZnMgZGF0YSBiZWluZyByZWNvbmNpbGVkIGlzIGlkZW50aWNhbC4iOworICAgIGNhc2UgTkVSUl9EZnNDYW50UmVtb3ZlRGZzUm9vdDoKKyAgICAgIHJldHVybiAiVGhlIERGUyByb290IGNhbm5vdCBiZSBkZWxldGVkLiBVbmluc3RhbGwgREZTIGlmIHJlcXVpcmVkLiI7CisgICAgY2FzZSBORVJSX0Rmc0NoaWxkT3JQYXJlbnRJbkRmczoKKyAgICAgIHJldHVybiAiQSBjaGlsZCBvciBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBzaGFyZSBpcyBhbHJlYWR5IGluIGEgRGZzLiI7CisgICAgY2FzZSBORVJSX0Rmc0ludGVybmFsRXJyb3I6CisgICAgICByZXR1cm4gIkRmcyBpbnRlcm5hbCBlcnJvci4iOworICAgICAgLyogdGhlIGZvbGxvd2luZyBhcmUgbm90IGRlZmluZWQgaW4gbWluZ3cgKi8KKyNpZiAwCisKKyAgICBjYXNlIE5FUlJfU2V0dXBBbHJlYWR5Sm9pbmVkOgorICAgICAgcmV0dXJuICJUaGlzIG1hY2hpbmUgaXMgYWxyZWFkeSBqb2luZWQgdG8gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfU2V0dXBOb3RKb2luZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbWFjaGluZSBpcyBub3QgY3VycmVudGx5IGpvaW5lZCB0byBhIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9TZXR1cERvbWFpbkNvbnRyb2xsZXI6CisgICAgICByZXR1cm4gIlRoaXMgbWFjaGluZSBpcyBhIGRvbWFpbiBjb250cm9sbGVyIGFuZCBjYW5ub3QgYmUgdW5qb2luZWQgZnJvbSBhIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9EZWZhdWx0Sm9pblJlcXVpcmVkOgorICAgICAgcmV0dXJuICJUaGUgZGVzdGluYXRpb24gZG9tYWluIGNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGluZyBtYWNoaW5lIGFjY291bnRzIGluIE9Vcy4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkV29ya2dyb3VwTmFtZToKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCB3b3JrZ3JvdXAgbmFtZSBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX05hbWVVc2VzSW5jb21wYXRpYmxlQ29kZVBhZ2U6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgY29tcHV0ZXIgbmFtZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZGVmYXVsdCBsYW5ndWFnZSB1c2VkIG9uIHRoZSBkb21haW4gY29udHJvbGxlci4iOworICAgIGNhc2UgTkVSUl9Db21wdXRlckFjY291bnROb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBjb21wdXRlciBhY2NvdW50IGNvdWxkIG5vdCBiZSBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9QZXJzb25hbFNrdToKKyAgICAgIHJldHVybiAiVGhpcyB2ZXJzaW9uIG9mIFdpbmRvd3MgY2Fubm90IGJlIGpvaW5lZCB0byBhIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZE11c3RDaGFuZ2U6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBtdXN0IGNoYW5nZSBhdCB0aGUgbmV4dCBsb2dvbi4iOworICAgIGNhc2UgTkVSUl9BY2NvdW50TG9ja2VkT3V0OgorICAgICAgcmV0dXJuICJUaGUgYWNjb3VudCBpcyBsb2NrZWQgb3V0LiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkVG9vTG9uZzoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIGlzIHRvbyBsb25nLiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkTm90Q29tcGxleEVub3VnaDoKKyAgICAgIHJldHVybiAiVGhlIHBhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIGNvbXBsZXhpdHkgcG9saWN5LiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkRmlsdGVyRXJyb3I6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHBhc3N3b3JkIGZpbHRlciBETExzLiI7CisjZW5kaWYKKworICAgIH0KKyAgbXNnID0gc3RyZXJyb3IgKGVycm9yX251bWJlcik7CisgIGlmIChtc2cgPT0gTlVMTCkKKyAgICBtc2cgPSAidW5rbm93biI7CisKKyAgcmV0dXJuIG1zZzsKKyNlbmRpZiAvL0RCVVNfV0lOQ0UKK30KKworLyoqCisgKiBHZXQgYSBwcmludGFibGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbW1hbmQgdXNlZCB0byBleGVjdXRlCisgKiB0aGUgcHJvY2VzcyB3aXRoIHBpZC4gIFRoaXMgc3RyaW5nIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yCisgKiBpbmZvcm1hdGl2ZSBwdXJwb3NlcyBzdWNoIGFzIGxvZ2dpbmc7IGl0IG1heSBub3QgYmUgdHJ1c3RlZC4KKyAqCisgKiBUaGUgY29tbWFuZCBpcyBndWFyYW50ZWVkIHRvIGJlIHByaW50YWJsZSBBU0NJSSBhbmQgbm8gbG9uZ2VyCisgKiB0aGFuIG1heF9sZW4uCisgKgorICogQHBhcmFtIHBpZCBQcm9jZXNzIGlkCisgKiBAcGFyYW0gc3RyIEFwcGVuZCBjb21tYW5kIHRvIHRoaXMgc3RyaW5nCisgKiBAcGFyYW0gbWF4X2xlbiBNYXhpbXVtIGxlbmd0aCBvZiByZXR1cm5lZCBjb21tYW5kCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBlcnJvcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29tbWFuZF9mb3JfcGlkICh1bnNpZ25lZCBsb25nICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIC8vIEZJWE1FCisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY2OWNmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy11dGlsLmMgVGVzdHMgZm9yIGRidXMtc3lzZGVwcy5oIEFQSQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorc3RhdGljIHZvaWQKK2NoZWNrX2Rpcm5hbWUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlybmFtZSkKK3sKKyAgREJ1c1N0cmluZyBmLCBkOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lICgmZiwgJmQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmZCwgZGlybmFtZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZvciBmaWxlbmFtZSBcIiVzXCIgZ290IGRpcm5hbWUgXCIlc1wiIGFuZCBleHBlY3RlZCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmQpLAorICAgICAgICAgICAgICAgICAgZGlybmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BhdGhfYWJzb2x1dGUgKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBleHBlY3RlZCkKK3sKKyAgREJ1c1N0cmluZyBwOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcCwgcGF0aCk7CisKKyAgaWYgKF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKCZwKSAhPSBleHBlY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRm9yIHBhdGggXCIlc1wiIGV4cGVjdGVkIGFic29sdXRlID0gJWQgZ290ICVkXG4iLAorICAgICAgICAgICAgICAgICAgcGF0aCwgZXhwZWN0ZWQsIF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKCZwKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBkYnVzLXN5c2RlcHMuYy4KKyAqIAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N5c2RlcHNfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGRvdWJsZSB2YWw7CisgIGludCBwb3M7CisKKyNpZmRlZiBEQlVTX1dJTgorICBjaGVja19kaXJuYW1lICgiZm9vXFxiYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb29cXFxcYmFyIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vL1xcL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvb1xcYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vYmFyXFwiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb29cXGJhci8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vYmFyXFxcXCIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIlxcZm9vIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJcXFxcZm9vIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJcXCIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFxcXCIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFwvIiwgIlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvXFwvIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6XFxmb29cXGJhciIsICJjOlxcZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJjOlxcZm9vIiwgImM6XFwiKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6L2ZvbyIsICJjOi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6XFwiLCAiYzpcXCIpOworICBjaGVja19kaXJuYW1lICgiYzovIiwgImM6LyIpOworICBjaGVja19kaXJuYW1lICgiIiwgIi4iKTsgIAorI2Vsc2UgIAorICBjaGVja19kaXJuYW1lICgiZm9vIiwgIi4iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vL2JhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIvIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vLy9iYXIvIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vLy8vYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9iYXIvLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vYmFyLy8vLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vL2Jhci8vLy8vLy8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvZm9vIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi8vLy9mb28iLCAiLyIpOworICBjaGVja19kaXJuYW1lICgiL2Zvby9iYXIiLCAiL2ZvbyIpOworICBjaGVja19kaXJuYW1lICgiL2Zvby8vYmFyIiwgIi9mb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi9mb28vLy9iYXIiLCAiL2ZvbyIpOworICBjaGVja19kaXJuYW1lICgiLyIsICIvIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvLy8iLCAiLyIpOworICBjaGVja19kaXJuYW1lICgiIiwgIi4iKTsgIAorI2VuZGlmCisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICIzLjUiKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfZG91YmxlICgmc3RyLAorCQkJCSAgMCwgJnZhbCwgJnBvcykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwYXJzZSBkb3VibGUiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgaWYgKEFCUygzLjUgLSB2YWwpID4gMWUtNikKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBhcnNlIDMuNSBjb3JyZWN0bHksIGdvdDogJWYiLCB2YWwpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBpZiAocG9zICE9IDMpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIl9kYnVzX3N0cmluZ19wYXJzZV9kb3VibGUgb2YgXCIzLjVcIiByZXR1cm5lZCB3cm9uZyBwb3NpdGlvbiAlZCIsIHBvcyk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICIweGZmIik7CisgIGlmIChfZGJ1c19zdHJpbmdfcGFyc2VfZG91YmxlICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJnZhbCwgJnBvcykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlNob3VsZCBub3QgaGF2ZSBwYXJzZWQgaGV4IGFzIGRvdWJsZVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX1dJTgorICBjaGVja19wYXRoX2Fic29sdXRlICgiYzovIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOi9mb28iLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoIiIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImZvbyIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImZvby9iYXIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb29cXGJhciIsIEZBTFNFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6XFwiLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6XFxmb28iLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6IiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOlxcZm9vXFxiYXIiLCBUUlVFKTsKKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoIlxcIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvIiwgVFJVRSk7CisjZWxzZSAgCisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIvZm9vIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28iLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28vYmFyIiwgRkFMU0UpOworI2VuZGlmCisgIAorICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy13aW4uYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjZmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy13aW4uYwpAQCAtMCwwICsxLDM1NzkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLmMgV3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJVUyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBQZXRlciBLw7xtbWVsICA8c3ludGhldGljcHBAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RpYW4gRWhybGljaGVyIDxjaC5laHJsaWNoZXJAZ214LmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNkZWZpbmUgU1RSU0FGRV9OT19ERVBSRUNBVEUKKworI2lmbmRlZiBEQlVTX1dJTkNFCisjaWZuZGVmIF9XSU4zMl9XSU5OVAorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNoYS5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zb2NrZXRzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorCisvKiBEZWNsYXJhdGlvbnMgbWlzc2luZyBpbiBtaW5ndydzIGhlYWRlcnMgKi8KK2V4dGVybiBCT09MIFdJTkFQSSBDb252ZXJ0U3RyaW5nU2lkVG9TaWRBIChMUENTVFIgIFN0cmluZ1NpZCwgUFNJRCAqU2lkKTsKK2V4dGVybiBCT09MIFdJTkFQSSBDb252ZXJ0U2lkVG9TdHJpbmdTaWRBIChQU0lEIFNpZCwgTFBTVFIgKlN0cmluZ1NpZCk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmbmRlZiBEQlVTX1dJTkNFCisjaW5jbHVkZSA8bWJzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1dTMlRDUElQX0gKKy8qIGdldGFkZHJpbmZvIGZvciBXaW5kb3dzIENFIChhbmQgV2luZG93cykuICAqLworI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfV1NQSUFQSV9ICisvLyBuZWVkZWQgZm9yIHcyayBjb21wYXRpYmlsaXR5IChnZXRhZGRyaW5mby9mcmVlYWRkcmluZm8vZ2V0bmFtZWluZm8pCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgX2lubGluZQorI2luY2x1ZGUgIndzcGlhcGkuaCIKKyNlbHNlCisjaW5jbHVkZSA8d3NwaWFwaS5oPgorI2VuZGlmCisjZW5kaWYgLy8gSEFWRV9XU1BJQVBJX0gKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKwordHlwZWRlZiBpbnQgc29ja2xlbl90OworCisKK3ZvaWQKK19kYnVzX3dpbl9zZXRfZXJybm8gKGludCBlcnIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICBTZXRMYXN0RXJyb3IgKGVycik7CisjZWxzZQorICBlcnJubyA9IGVycjsKKyNlbmRpZgorfQorCisKKy8qIENvbnZlcnQgR2V0TGFzdEVycm9yKCkgdG8gYSBkYnVzIGVycm9yLiAgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICh2b2lkKQoreworICBzd2l0Y2ggKEdldExhc3RFcnJvcigpKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7CisgICAgCisgICAgY2FzZSBFUlJPUl9OT19NT1JFX0ZJTEVTOgorICAgIGNhc2UgRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUzoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRDsgLyoga2VybmVsIG91dCBvZiBtZW1vcnkgKi8KKworICAgIGNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKKyAgICBjYXNlIEVSUk9SX0NBTk5PVF9NQUtFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRDsKKworICAgIGNhc2UgRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19NRU1PUlk7CisKKyAgICBjYXNlIEVSUk9SX0ZJTEVfRVhJU1RTOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRklMRV9FWElTVFM7CisKKyAgICBjYXNlIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOgorICAgIGNhc2UgRVJST1JfUEFUSF9OT1RfRk9VTkQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GSUxFX05PVF9GT1VORDsKKyAgICB9CisgIAorICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7Cit9CisKKworY2hhcioKK19kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKGludCBlcnJvcl9udW1iZXIpCit7CisgIGNoYXIgKm1zZzsKKworICBGb3JtYXRNZXNzYWdlQSAoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKKyAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTIHwKKyAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgICAgTlVMTCwgZXJyb3JfbnVtYmVyLCAwLAorICAgICAgICAgICAgICAgICAgKExQU1RSKSAmbXNnLCAwLCBOVUxMKTsKKworICBpZiAobXNnW3N0cmxlbiAobXNnKSAtIDFdID09ICdcbicpCisgICAgbXNnW3N0cmxlbiAobXNnKSAtIDFdID0gJ1wwJzsKKyAgaWYgKG1zZ1tzdHJsZW4gKG1zZykgLSAxXSA9PSAnXHInKQorICAgIG1zZ1tzdHJsZW4gKG1zZykgLSAxXSA9ICdcMCc7CisKKyAgcmV0dXJuIG1zZzsKK30KKwordm9pZAorX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChjaGFyICpzdHJpbmcpCit7CisgIExvY2FsRnJlZSAoc3RyaW5nKTsKK30KKworLyoqCisgKiBTb2NrZXQgaW50ZXJmYWNlCisgKgorICovCisKKy8qKgorICogVGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgcmVhZCgpIHN5c3RlbSBjYWxsIHRoYXQgYXBwZW5kcworICogdGhlIGRhdGEgaXQgcmVhZHMgdG8gdGhlIERCdXNTdHJpbmcgYnVmZmVyLiBJdCBhcHBlbmRzCisgKiB1cCB0byB0aGUgZ2l2ZW4gY291bnQsIGFuZCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlCisgKiBhbmQgc2FtZSBlcnJubyBhcyByZWFkKCkuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGF0CisgKiBfZGJ1c19yZWFkX3NvY2tldCgpIGhhbmRsZXMgRUlOVFIgZm9yIHlvdS4gCisgKiBfZGJ1c19yZWFkX3NvY2tldCgpIGNhbiByZXR1cm4gRU5PTUVNLCBldmVuIHRob3VnaCAKKyAqIHJlZ3VsYXIgVU5JWCByZWFkIGRvZXNuJ3QuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KKworaW50CitfZGJ1c19yZWFkX3NvY2tldCAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50KQoreworICBpbnQgYnl0ZXNfcmVhZDsKKyAgaW50IHN0YXJ0OworICBjaGFyICpkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoY291bnQgPj0gMCk7CisKKyAgc3RhcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoYnVmZmVyLCBjb3VudCkpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJubyAoRU5PTUVNKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKGJ1ZmZlciwgc3RhcnQsIGNvdW50KTsKKworIGFnYWluOgorIAorICBfZGJ1c192ZXJib3NlICgicmVjdjogY291bnQ9JWQgZmQ9JWRcbiIsIGNvdW50LCBmZCk7CisgIGJ5dGVzX3JlYWQgPSByZWN2IChmZCwgZGF0YSwgY291bnQsIDApOworICAKKyAgaWYgKGJ5dGVzX3JlYWQgPT0gU09DS0VUX0VSUk9SKQorCXsKKwkgIERCVVNfU09DS0VUX1NFVF9FUlJOTygpOworCSAgX2RidXNfdmVyYm9zZSAoInJlY3Y6IGZhaWxlZDogJXMgKCVkKVxuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSwgZXJybm8pOworCSAgYnl0ZXNfcmVhZCA9IC0xOworCX0KKwllbHNlCisJICBfZGJ1c192ZXJib3NlICgicmVjdjogPSAlZFxuIiwgYnl0ZXNfcmVhZCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UgICAgCQorICAgICAgICB7CisgICAgICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MgYW55dGhpbmcpICovCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAoZG9lc24ndCBhY3R1YWxseSByZWFsbG9jKSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQgKyBieXRlc19yZWFkKTsKKworI2lmIDAKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3JlYWQpOworI2VuZGlmCisKKyAgICAgIHJldHVybiBieXRlc19yZWFkOworICAgIH0KK30KKworLyoqCisgKiBUaGluIHdyYXBwZXIgYXJvdW5kIHRoZSB3cml0ZSgpIHN5c3RlbSBjYWxsIHRoYXQgd3JpdGVzIGEgcGFydCBvZiBhCisgKiBEQnVzU3RyaW5nIGFuZCBoYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKiAKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfc29ja2V0IChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCBjaGFyICpkYXRhOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgbGVuKTsKKworIGFnYWluOgorCisgIF9kYnVzX3ZlcmJvc2UgKCJzZW5kOiBsZW49JWQgZmQ9JWRcbiIsIGxlbiwgZmQpOworICBieXRlc193cml0dGVuID0gc2VuZCAoZmQsIGRhdGEsIGxlbiwgMCk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTygpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlbmQ6IGZhaWxlZDogJXNcbiIsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgYnl0ZXNfd3JpdHRlbiA9IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgICBfZGJ1c192ZXJib3NlICgic2VuZDogPSAlZFxuIiwgYnl0ZXNfd3JpdHRlbik7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisgICAgCisjaWYgMAorICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3dyaXR0ZW4pOworI2VuZGlmCisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKKworLyoqCisgKiBDbG9zZXMgYSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlX3NvY2tldCAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgaWYgKGNsb3Nlc29ja2V0IChmZCkgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIAorICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2Ugc29ja2V0OiBzb2NrZXQ9JWQsICwgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIF9kYnVzX3ZlcmJvc2UgKCJfZGJ1c19jbG9zZV9zb2NrZXQ6IHNvY2tldD0lZCwgXG4iLCBmZCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlCisgKiBvbiBleGVjLiBTaG91bGQgYmUgY2FsbGVkIGZvciBhbGwgZmlsZQorICogZGVzY3JpcHRvcnMgaW4gRC1CdXMgY29kZS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICovCit2b2lkCitfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoaW50cHRyX3QgaGFuZGxlKQoreworICBpZiAoICFTZXRIYW5kbGVJbmZvcm1hdGlvbiggKEhBTkRMRSkgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZMQUdfSU5IRVJJVCB8IEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLypkaXNhYmxlIGJvdGggZmxhZ3MqLyApICkKKyAgICB7CisgICAgICBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgKCJEaXNhYmxpbmcgc29ja2V0IGhhbmRsZSBpbmhlcml0YW5jZSBmYWlsZWQ6IiwgR2V0TGFzdEVycm9yKCkpOworICAgIH0KK30KKworLyoqCisgKiBTZXRzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgb2YgZXJyb3IgbG9jYXRpb24uCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChpbnQgICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIHVfbG9uZyBvbmUgPSAxOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChpb2N0bHNvY2tldCAoaGFuZGxlLCBGSU9OQklPLCAmb25lKSA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgc29ja2V0ICVkOiVkIHRvIG5vbmJsb2NraW5nOiAlcyIsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBMaWtlIF9kYnVzX3dyaXRlKCkgYnV0IHdpbGwgdXNlIHdyaXRldigpIGlmIHBvc3NpYmxlCisgKiB0byB3cml0ZSBib3RoIGJ1ZmZlcnMgaW4gc2VxdWVuY2UuIFRoZSByZXR1cm4gdmFsdWUKKyAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiB0aGUgZmlyc3QgYnVmZmVyLAorICogcGx1cyB0aGUgbnVtYmVyIHdyaXR0ZW4gaW4gdGhlIHNlY29uZC4gSWYgdGhlIGZpcnN0CisgKiBidWZmZXIgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgYW5kIGFuIGVycm9yIG9jY3VycworICogd3JpdGluZyB0aGUgc2Vjb25kLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmaXJzdAorICogaXMgcmV0dXJuZWQgKGkuZS4gdGhlIGVycm9yIGlzIGlnbm9yZWQpLCBvbiBzeXN0ZW1zIHRoYXQKKyAqIGRvbid0IGhhdmUgd3JpdGV2LiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKiBUaGUgc2Vjb25kIGJ1ZmZlciBtYXkgYmUgI05VTEwuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBidWZmZXIxIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIHN0YXJ0MSBmaXJzdCBieXRlIHRvIHdyaXRlIGluIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIGxlbjEgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGZyb20gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gYnVmZmVyMiBzZWNvbmQgYnVmZmVyLCBvciAjTlVMTAorICogQHBhcmFtIHN0YXJ0MiBmaXJzdCBieXRlIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEBwYXJhbSBsZW4yIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBpbiBzZWNvbmQgYnVmZmVyCisgKiBAcmV0dXJucyB0b3RhbCBieXRlcyB3cml0dGVuIGZyb20gYm90aCBidWZmZXJzLCBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3dyaXRlX3NvY2tldF90d28gKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMikKK3sKKyAgV1NBQlVGIHZlY3RvcnNbMl07CisgIGNvbnN0IGNoYXIgKmRhdGExOworICBjb25zdCBjaGFyICpkYXRhMjsKKyAgaW50IHJjOworICBEV09SRCBieXRlc193cml0dGVuOworCisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydDEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQyID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKworCisgIGRhdGExID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKworICBpZiAoYnVmZmVyMiAhPSBOVUxMKQorICAgIGRhdGEyID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRhdGEyID0gTlVMTDsKKyAgICAgIHN0YXJ0MiA9IDA7CisgICAgICBsZW4yID0gMDsKKyAgICB9CisKKyAgdmVjdG9yc1swXS5idWYgPSAoY2hhciopIGRhdGExOworICB2ZWN0b3JzWzBdLmxlbiA9IGxlbjE7CisgIHZlY3RvcnNbMV0uYnVmID0gKGNoYXIqKSBkYXRhMjsKKyAgdmVjdG9yc1sxXS5sZW4gPSBsZW4yOworCisgYWdhaW46CisgCisgIF9kYnVzX3ZlcmJvc2UgKCJXU0FTZW5kOiBsZW4xKzI9JWQrJWQgZmQ9JWRcbiIsIGxlbjEsIGxlbjIsIGZkKTsKKyAgcmMgPSBXU0FTZW5kIChmZCwgCisgICAgICAgICAgICAgICAgdmVjdG9ycywKKyAgICAgICAgICAgICAgICBkYXRhMiA/IDIgOiAxLCAKKyAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAwLCAKKyAgICAgICAgICAgICAgICBOVUxMLCAKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAKKyAgaWYgKHJjID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiV1NBU2VuZDogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICBieXRlc193cml0dGVuID0gLTE7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfdmVyYm9zZSAoIldTQVNlbmQ6ID0gJWxkXG4iLCBieXRlc193cml0dGVuKTsKKyAgICAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisgICAgICAKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19zb2NrZXRfaXNfaW52YWxpZCAoaW50IGZkKQoreworICAgIHJldHVybiBmZCA9PSBJTlZBTElEX1NPQ0tFVCA/IFRSVUUgOiBGQUxTRTsKK30KKworI2lmIDAKKworLyoqCisgKiBPcGVucyB0aGUgY2xpZW50IHNpZGUgb2YgYSBXaW5kb3dzIG5hbWVkIHBpcGUuIFRoZSBjb25uZWN0aW9uIEQtQlVTCisgKiBmaWxlIGRlc2NyaXB0b3IgaW5kZXggaXMgcmV0dXJuZWQuIEl0IGlzIHNldCB1cCBhcyBub25ibG9ja2luZy4KKyAqIAorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gbmFtZWQgcGlwZSBzb2NrZXQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zIGNvbm5lY3Rpb24gRC1CVVMgZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfY29ubmVjdF9uYW1lZF9waXBlIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgaW1wbGVtZW50ZWQiKTsKK30KKworI2VuZGlmCisKKworCit2b2lkCitfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICh2b2lkKQoreworICAvKiBTdHJhaWdodCBmcm9tIE1TRE4sIGRldWdsaWZpZWQgKi8KKworICBzdGF0aWMgZGJ1c19ib29sX3QgYmVlbmhlcmUgPSBGQUxTRTsKKworICBXT1JEIHdWZXJzaW9uUmVxdWVzdGVkOworICBXU0FEQVRBIHdzYURhdGE7CisgIGludCBlcnI7CisKKyAgaWYgKGJlZW5oZXJlKQorICAgIHJldHVybjsKKworICB3VmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEICgyLCAwKTsKKworICBlcnIgPSBXU0FTdGFydHVwICh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpOworICBpZiAoZXJyICE9IDApCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ291bGQgbm90IGluaXRpYWxpemUgV2luU29jayIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorCisgIC8qIENvbmZpcm0gdGhhdCB0aGUgV2luU29jayBETEwgc3VwcG9ydHMgMi4wLiAgTm90ZSB0aGF0IGlmIHRoZSBETEwKKyAgICogc3VwcG9ydHMgdmVyc2lvbnMgZ3JlYXRlciB0aGFuIDIuMCBpbiBhZGRpdGlvbiB0byAyLjAsIGl0IHdpbGwKKyAgICogc3RpbGwgcmV0dXJuIDIuMCBpbiB3VmVyc2lvbiBzaW5jZSB0aGF0IGlzIHRoZSB2ZXJzaW9uIHdlCisgICAqIHJlcXVlc3RlZC4KKyAgICovCisgIGlmIChMT0JZVEUgKHdzYURhdGEud1ZlcnNpb24pICE9IDIgfHwKKyAgICAgIEhJQllURSAod3NhRGF0YS53VmVyc2lvbikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJObyB1c2FibGUgV2luU29jayBmb3VuZCIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorCisgIGJlZW5oZXJlID0gVFJVRTsKK30KKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKKyBVVEYgLyBzdHJpbmcgY29kZQorIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBNZWFzdXJlIHRoZSBtZXNzYWdlIGxlbmd0aCB3aXRob3V0IHRlcm1pbmF0aW5nIG51bCAKKyAqLworaW50IF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpCit7CisgIC8qIE1TVkNSVCdzIHZzbnByaW50ZiBzZW1hbnRpY3MgYXJlIGEgYml0IGRpZmZlcmVudCAqLworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgaW50IGJ1ZnNpemU7CisgIGludCBsZW47CisKKyAgYnVmc2l6ZSA9IHNpemVvZiAoYnVmKTsKKyAgbGVuID0gX3ZzbnByaW50ZiAoYnVmLCBidWZzaXplIC0gMSwgZm9ybWF0LCBhcmdzKTsKKworICB3aGlsZSAobGVuID09IC0xKSAvKiB0cnkgYWdhaW4gKi8KKyAgICB7CisgICAgICBjaGFyICpwOworCisgICAgICBidWZzaXplICo9IDI7CisKKyAgICAgIHAgPSBtYWxsb2MgKGJ1ZnNpemUpOworICAgICAgbGVuID0gX3ZzbnByaW50ZiAocCwgYnVmc2l6ZSAtIDEsIGZvcm1hdCwgYXJncyk7CisgICAgICBmcmVlIChwKTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbjsKK30KKworCisvKioKKyAqIFJldHVybnMgdGhlIFVURi0xNiBmb3JtIG9mIGEgVVRGLTggc3RyaW5nLiBUaGUgcmVzdWx0IHNob3VsZCBiZQorICogZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgVVRGLTggc3RyaW5nCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKi8KK3djaGFyX3QgKgorX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzOworICBpbnQgbjsKKyAgd2NoYXJfdCAqcmV0dmFsOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcywgc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmcywgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkludmFsaWQgVVRGLTgiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBuID0gTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgTlVMTCwgMCk7CisKKyAgaWYgKG4gPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR2YWwgPSBkYnVzX25ldyAod2NoYXJfdCwgbik7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChNdWx0aUJ5dGVUb1dpZGVDaGFyIChDUF9VVEY4LCAwLCBzdHIsIC0xLCByZXR2YWwsIG4pICE9IG4pCisgICAgeworICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIk11bHRpQnl0ZVRvV2lkZUNoYXIgaW5jb25zaXN0ZW5jeSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgVVRGLTggZm9ybSBvZiBhIFVURi0xNiBzdHJpbmcuIFRoZSByZXN1bHQgc2hvdWxkIGJlCisgKiBmcmVlZCB3aXRoIGRidXNfZnJlZSgpIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBVVEYtMTYgc3RyaW5nCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKi8KK2NoYXIgKgorX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGNvbnN0IHdjaGFyX3QgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgaW50IG47CisgIGNoYXIgKnJldHZhbDsKKworICBuID0gV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKG4gPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR2YWwgPSBkYnVzX21hbGxvYyAobik7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9VVEY4LCAwLCBzdHIsIC0xLCByZXR2YWwsIG4sIE5VTEwsIE5VTEwpICE9IG4pCisgICAgeworICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIldpZGVDaGFyVG9NdWx0aUJ5dGUgaW5jb25zaXN0ZW5jeSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgCisgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitkYnVzX2Jvb2xfdAorX2RidXNfd2luX2FjY291bnRfdG9fc2lkIChjb25zdCB3Y2hhcl90ICp3YWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIAkgKipwcHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yIAkgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIERXT1JEIHNpZF9sZW5ndGgsIHdkb21haW5fbGVuZ3RoOworICBTSURfTkFNRV9VU0UgdXNlOworICB3Y2hhcl90ICp3ZG9tYWluOworCisgICpwcHNpZCA9IE5VTEw7CisKKyAgc2lkX2xlbmd0aCA9IDA7CisgIHdkb21haW5fbGVuZ3RoID0gMDsKKyAgaWYgKCFMb29rdXBBY2NvdW50TmFtZVcgKE5VTEwsIHdhY2NvdW50LCBOVUxMLCAmc2lkX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZ3ZG9tYWluX2xlbmd0aCwgJnVzZSkgJiYKKyAgICAgIEdldExhc3RFcnJvciAoKSAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl9zZXRfZXJyb3JfZnJvbV93aW5fZXJyb3IgKGVycm9yLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqcHBzaWQgPSBkYnVzX21hbGxvYyAoc2lkX2xlbmd0aCk7CisgIGlmICghKnBwc2lkKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgd2RvbWFpbiA9IGRidXNfbmV3ICh3Y2hhcl90LCB3ZG9tYWluX2xlbmd0aCk7CisgIGlmICghd2RvbWFpbikKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDE7CisgICAgfQorCisgIGlmICghTG9va3VwQWNjb3VudE5hbWVXIChOVUxMLCB3YWNjb3VudCwgKFBTSUQpICpwcHNpZCwgJnNpZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZG9tYWluLCAmd2RvbWFpbl9sZW5ndGgsICZ1c2UpKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl9zZXRfZXJyb3JfZnJvbV93aW5fZXJyb3IgKGVycm9yLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZ290byBvdXQyOworICAgIH0KKworICBpZiAoIUlzVmFsaWRTaWQgKChQU0lEKSAqcHBzaWQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJJbnZhbGlkIFNJRCIpOworICAgICAgZ290byBvdXQyOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCitvdXQyOgorICBkYnVzX2ZyZWUgKHdkb21haW4pOworb3V0MToKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgZGJ1c19mcmVlICgqcHBzaWQpOworICAgICAgKnBwc2lkID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIEB9IGVuZCBvZiBzeXNkZXBzLXdpbiAqLworCisKKy8qKgorICogVGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgc2VwYXJhdGUgZnJvbSBfZGJ1c19nZXRwaWQoKSBpcyB0byBhbGxvdyBpdAorICogb24gV2luZG93cyBmb3IgbG9nZ2luZyBidXQgbm90IGZvciBvdGhlciBwdXJwb3Nlcy4KKyAqIAorICogQHJldHVybnMgcHJvY2VzcyBJRCB0byBwdXQgaW4gbG9nIG1lc3NhZ2VzCisgKi8KK3Vuc2lnbmVkIGxvbmcKK19kYnVzX3BpZF9mb3JfbG9nICh2b2lkKQoreworICByZXR1cm4gX2RidXNfZ2V0cGlkICgpOworfQorCisKKyNpZm5kZWYgREJVU19XSU5DRQorLyoqIEdldHMgb3VyIFNJRAorICogQHBhcmFtIHBvaW50cyB0byBzaWQgYnVmZmVyLCBuZWVkIHRvIGJlIGZyZWVkIHdpdGggTG9jYWxGcmVlKCkKKyAqIEByZXR1cm5zIHByb2Nlc3Mgc2lkCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZ2V0c2lkKGNoYXIgKipzaWQpCit7CisgIEhBTkRMRSBwcm9jZXNzX3Rva2VuID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIFRPS0VOX1VTRVIgKnRva2VuX3VzZXIgPSBOVUxMOworICBEV09SRCBuOworICBQU0lEIHBzaWQ7CisgIGludCByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghT3BlblByb2Nlc3NUb2tlbiAoR2V0Q3VycmVudFByb2Nlc3MgKCksIFRPS0VOX1FVRVJZLCAmcHJvY2Vzc190b2tlbikpIAorICAgIHsKKyAgICAgIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoIk9wZW5Qcm9jZXNzVG9rZW4gZmFpbGVkIiwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgaWYgKCghR2V0VG9rZW5JbmZvcm1hdGlvbiAocHJvY2Vzc190b2tlbiwgVG9rZW5Vc2VyLCBOVUxMLCAwLCAmbikKKyAgICAgICAgICAgICYmIEdldExhc3RFcnJvciAoKSAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQorICAgICAgICAgICB8fCAodG9rZW5fdXNlciA9IGFsbG9jYSAobikpID09IE5VTEwKKyAgICAgICAgICAgfHwgIUdldFRva2VuSW5mb3JtYXRpb24gKHByb2Nlc3NfdG9rZW4sIFRva2VuVXNlciwgdG9rZW5fdXNlciwgbiwgJm4pKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoIkdldFRva2VuSW5mb3JtYXRpb24gZmFpbGVkIiwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgcHNpZCA9IHRva2VuX3VzZXItPlVzZXIuU2lkOworICBpZiAoIUlzVmFsaWRTaWQgKHBzaWQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UoIiVzIGludmFsaWQgc2lkXG4iLF9fRlVOQ1RJT05fXyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICghQ29udmVydFNpZFRvU3RyaW5nU2lkQSAocHNpZCwgc2lkKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlKCIlcyBpbnZhbGlkIHNpZFxuIixfX0ZVTkNUSU9OX18pOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorLy9va2F5OgorICByZXR2YWwgPSBUUlVFOworCitmYWlsZWQ6CisgIGlmIChwcm9jZXNzX3Rva2VuICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIENsb3NlSGFuZGxlIChwcm9jZXNzX3Rva2VuKTsKKworICBfZGJ1c192ZXJib3NlKCJfZGJ1c19nZXRzaWQoKSByZXR1cm5zICVkXG4iLHJldHZhbCk7CisgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIHBpcGVzCisgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENyZWF0ZXMgYSBmdWxsLWR1cGxleCBwaXBlIChhcyBpbiBzb2NrZXRwYWlyKCkpLgorICogU2V0cyBib3RoIGVuZHMgb2YgdGhlIHBpcGUgbm9uYmxvY2tpbmcuCisgKgorICogQHRvZG8gbGliZGJ1cyBvbmx5IHVzZXMgdGhpcyBmb3IgdGhlIGRlYnVnLXBpcGUgc2VydmVyLCBzbyBpbgorICogcHJpbmNpcGxlIGl0IGNvdWxkIGJlIGluIGRidXMtc3lzZGVwcy11dGlsLmMsIGV4Y2VwdCB0aGF0CisgKiBkYnVzLXN5c2RlcHMtdXRpbC5jIGlzbid0IGluIGxpYmRidXMgd2hlbiB0ZXN0cyBhcmUgZW5hYmxlZCBhbmQgdGhlCisgKiBkZWJ1Zy1waXBlIHNlcnZlciBpcyB1c2VkLgorICogCisgKiBAcGFyYW0gZmQxIHJldHVybiBsb2NhdGlvbiBmb3Igb25lIGVuZAorICogQHBhcmFtIGZkMiByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvdGhlciBlbmQKKyAqIEBwYXJhbSBibG9ja2luZyAjVFJVRSBpZiBwaXBlIHNob3VsZCBiZSBibG9ja2luZworICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKGlmIGVycm9yIGlzIHNldCkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Z1bGxfZHVwbGV4X3BpcGUgKGludCAgICAgICAgKmZkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKmZkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGJsb2NraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIFNPQ0tFVCB0ZW1wLCBzb2NrZXQxID0gLTEsIHNvY2tldDIgPSAtMTsKKyAgc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworICBpbnQgbGVuOworICB1X2xvbmcgYXJnOworICBmZF9zZXQgcmVhZF9zZXQsIHdyaXRlX3NldDsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGludCByZXM7CisKKyAgX2RidXNfd2luX3N0YXJ0dXBfd2luc29jayAoKTsKKworICB0ZW1wID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmICh0ZW1wID09IElOVkFMSURfU09DS0VUKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgX0RCVVNfWkVSTyAoc2FkZHIpOworICBzYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc2FkZHIuc2luX3BvcnQgPSAwOworICBzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCAoSU5BRERSX0xPT1BCQUNLKTsKKworICBpZiAoYmluZCAodGVtcCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgc2l6ZW9mIChzYWRkcikpID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIGlmIChsaXN0ZW4gKHRlbXAsIDEpID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIGxlbiA9IHNpemVvZiAoc2FkZHIpOworICBpZiAoZ2V0c29ja25hbWUgKHRlbXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHIsICZsZW4pID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIHNvY2tldDEgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHNvY2tldDEgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBpZiAoY29ubmVjdCAoc29ja2V0MSwgKHN0cnVjdCBzb2NrYWRkciAgKikmc2FkZHIsIGxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MTsKKyAgICB9CisKKyAgc29ja2V0MiA9IGFjY2VwdCAodGVtcCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsICZsZW4pOworICBpZiAoc29ja2V0MiA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDE7CisgICAgfQorCisgIGlmICghYmxvY2tpbmcpCisgICAgeworICAgICAgYXJnID0gMTsKKyAgICAgIGlmIChpb2N0bHNvY2tldCAoc29ja2V0MSwgRklPTkJJTywgJmFyZykgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGdvdG8gb3V0MjsKKyAgICAgICAgfQorCisgICAgICBhcmcgPSAxOworICAgICAgaWYgKGlvY3Rsc29ja2V0IChzb2NrZXQyLCBGSU9OQklPLCAmYXJnKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgZ290byBvdXQyOworICAgICAgICB9CisgICAgfQorCisgICpmZDEgPSBzb2NrZXQxOworICAqZmQyID0gc29ja2V0MjsKKworICBfZGJ1c192ZXJib3NlICgiZnVsbC1kdXBsZXggcGlwZSAlZDolZCA8LT4gJWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICpmZDEsIHNvY2tldDEsICpmZDIsIHNvY2tldDIpOworCisgIGNsb3Nlc29ja2V0ICh0ZW1wKTsKKworICByZXR1cm4gVFJVRTsKKworb3V0MjoKKyAgY2xvc2Vzb2NrZXQgKHNvY2tldDIpOworb3V0MToKKyAgY2xvc2Vzb2NrZXQgKHNvY2tldDEpOworb3V0MDoKKyAgY2xvc2Vzb2NrZXQgKHRlbXApOworCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXR1cCBzb2NrZXQgcGFpcjogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFdyYXBwZXIgZm9yIHBvbGwoKS4KKyAqCisgKiBAcGFyYW0gZmRzIHRoZSBmaWxlIGRlc2NyaXB0b3JzIHRvIHBvbGwKKyAqIEBwYXJhbSBuX2ZkcyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIGFycmF5CisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGltZW91dCBvciAtMSBmb3IgaW5maW5pdGUKKyAqIEByZXR1cm5zIG51bWJlcnMgb2YgZmRzIHdpdGggcmV2ZW50cywgb3IgPDAgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19wb2xsIChEQnVzUG9sbEZEICpmZHMsCisgICAgICAgICAgICBpbnQgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgIGludCAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworI2RlZmluZSBVU0VfQ0hSSVNfSU1QTCAwCisKKyNpZiBVU0VfQ0hSSVNfSU1QTAorCisjZGVmaW5lIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFIDIwMDAKKyAgY2hhciBtc2dbREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkVdOworICBjaGFyICptc2dwOworCisgIGludCByZXQgPSAwOworICBpbnQgaTsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGludCByZWFkeTsKKworI2RlZmluZSBEQlVTX1NUQUNLX1dTQUVWRU5UUyAyNTYKKyAgV1NBRVZFTlQgZXZlbnRzT25TdGFja1tEQlVTX1NUQUNLX1dTQUVWRU5UU107CisgIFdTQUVWRU5UICpwRXZlbnRzID0gTlVMTDsKKyAgaWYgKG5fZmRzID4gREJVU19TVEFDS19XU0FFVkVOVFMpCisgICAgcEV2ZW50cyA9IGNhbGxvYyhzaXplb2YoV1NBRVZFTlQpLCBuX2Zkcyk7CisgIGVsc2UKKyAgICBwRXZlbnRzID0gZXZlbnRzT25TdGFjazsKKworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIG1zZ3AgPSBtc2c7CisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIldTQUV2ZW50U2VsZWN0OiB0bz0lZFxuXHQiLCB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIHN0YXRpYyBkYnVzX2Jvb2xfdCB3YXJuZWQgPSBGQUxTRTsKKyAgICAgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJSOiVkICIsIGZkcC0+ZmQpOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJXOiVkICIsIGZkcC0+ZmQpOworCisgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVkXG5cdCIsIGZkcC0+ZmQpOworCisgICAgICAvLyBGSVhNRTogbW9yZSByb2J1c3QgY29kZSBmb3IgbG9uZyAgbXNnCisgICAgICAvLyAgICAgICAgY3JlYXRlIG9uIGhlYXAgd2hlbiBtc2dbXSBiZWNvbWVzIHRvbyBzbWFsbAorICAgICAgaWYgKG1zZ3AgPj0gbXNnICsgREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJidWZmZXIgb3ZlcmZsb3cgaW4gX2RidXNfcG9sbCIpOworICAgICAgICB9CisgICAgfQorCisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlxuIik7CisgIF9kYnVzX3ZlcmJvc2UgKCIlcyIsbXNnKTsKKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworICAgICAgV1NBRVZFTlQgZXY7CisgICAgICBsb25nIGxOZXR3b3JrRXZlbnRzID0gRkRfT09COworCisgICAgICBldiA9IFdTQUNyZWF0ZUV2ZW50KCk7CisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgbE5ldHdvcmtFdmVudHMgfD0gRkRfUkVBRCB8IEZEX0FDQ0VQVCB8IEZEX0NMT1NFOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgICAgICBsTmV0d29ya0V2ZW50cyB8PSBGRF9XUklURSB8IEZEX0NPTk5FQ1Q7CisKKyAgICAgIFdTQUV2ZW50U2VsZWN0KGZkcC0+ZmQsIGV2LCBsTmV0d29ya0V2ZW50cyk7CisKKyAgICAgIHBFdmVudHNbaV0gPSBldjsKKyAgICB9CisKKworICByZWFkeSA9IFdTQVdhaXRGb3JNdWx0aXBsZUV2ZW50cyAobl9mZHMsIHBFdmVudHMsIEZBTFNFLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgRkFMU0UpOworCisgIGlmIChEQlVTX1NPQ0tFVF9BUElfUkVUVVJOU19FUlJPUiAocmVhZHkpKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGlmIChlcnJubyAhPSBXU0FFV09VTERCTE9DSykKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXQgPSAtMTsKKyAgICB9CisgIGVsc2UgaWYgKHJlYWR5ID09IFdTQV9XQUlUX1RJTUVPVVQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogV1NBX1dBSVRfVElNRU9VVFxuIik7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAocmVhZHkgPj0gV1NBX1dBSVRfRVZFTlRfMCAmJiByZWFkeSA8IChpbnQpKFdTQV9XQUlUX0VWRU5UXzAgKyBuX2ZkcykpCisgICAgeworICAgICAgbXNncCA9IG1zZzsKKyAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogPSVkXG5cdCIsIHJlYWR5KTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworICAgICAgICAgIFdTQU5FVFdPUktFVkVOVFMgbmU7CisKKyAgICAgICAgICBmZHAtPnJldmVudHMgPSAwOworCisgICAgICAgICAgV1NBRW51bU5ldHdvcmtFdmVudHMoZmRwLT5mZCwgcEV2ZW50c1tpXSwgJm5lKTsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9SRUFEIHwgRkRfQUNDRVBUIHwgRkRfQ0xPU0UpKQorICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9XUklURSB8IEZEX0NPTk5FQ1QpKQorICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisKKyAgICAgICAgICBpZiAobmUubE5ldHdvcmtFdmVudHMgJiAoRkRfT09CKSkKKyAgICAgICAgICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworCisgICAgICAgICAgaWYgKG5lLmxOZXR3b3JrRXZlbnRzICYgKEZEX1JFQUQgfCBGRF9BQ0NFUFQgfCBGRF9DTE9TRSkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlI6JWQgIiwgZmRwLT5mZCk7CisKKyAgICAgICAgICBpZiAobmUubE5ldHdvcmtFdmVudHMgJiAoRkRfV1JJVEUgfCBGRF9DT05ORUNUKSkKKyAgICAgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolZCAiLCBmZHAtPmZkKTsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9PT0IpKQorICAgICAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVkICIsIGZkcC0+ZmQpOworCisgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAibE5ldHdvcmtFdmVudHM6JWQgIiwgbmUubE5ldHdvcmtFdmVudHMpOworCisgICAgICAgICAgaWYobmUubE5ldHdvcmtFdmVudHMpCisgICAgICAgICAgICByZXQrKzsKKworICAgICAgICAgIFdTQUV2ZW50U2VsZWN0KGZkcC0+ZmQsIHBFdmVudHNbaV0sIDApOworICAgICAgICB9CisKKyAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlxuIik7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXMiLG1zZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogZmFpbGVkIGZvciB1bmtub3duIHJlYXNvbiEiKTsKKyAgICAgIHJldCA9IC0xOworICAgIH0KKworICBmb3IoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgIHsKKyAgICAgIFdTQUNsb3NlRXZlbnQocEV2ZW50c1tpXSk7CisgICAgfQorCisgIGlmIChuX2ZkcyA+IERCVVNfU1RBQ0tfV1NBRVZFTlRTKQorICAgIGZyZWUocEV2ZW50cyk7CisKKyAgcmV0dXJuIHJldDsKKworI2Vsc2UgICAvKiBVU0VfQ0hSSVNfSU1QTCAqLworCisjZGVmaW5lIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFIDIwMDAKKyAgY2hhciBtc2dbREJVU19QT0xMX0NIQVJfQlVGRkVSX1NJWkVdOworICBjaGFyICptc2dwOworCisgIGZkX3NldCByZWFkX3NldCwgd3JpdGVfc2V0LCBlcnJfc2V0OworICBpbnQgbWF4X2ZkID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBpbnQgcmVhZHk7CisKKyAgRkRfWkVSTyAoJnJlYWRfc2V0KTsKKyAgRkRfWkVSTyAoJndyaXRlX3NldCk7CisgIEZEX1pFUk8gKCZlcnJfc2V0KTsKKworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIG1zZ3AgPSBtc2c7CisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgInNlbGVjdDogdG89JWRcblx0IiwgdGltZW91dF9taWxsaXNlY29uZHMpOworICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBzdGF0aWMgZGJ1c19ib29sX3Qgd2FybmVkID0gRkFMU0U7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiUjolZCAiLCBmZHAtPmZkKTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolZCAiLCBmZHAtPmZkKTsKKworICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiRTolZFxuXHQiLCBmZHAtPmZkKTsKKworICAgICAgLy8gRklYTUU6IG1vcmUgcm9idXN0IGNvZGUgZm9yIGxvbmcgIG1zZworICAgICAgLy8gICAgICAgIGNyZWF0ZSBvbiBoZWFwIHdoZW4gbXNnW10gYmVjb21lcyB0b28gc21hbGwKKyAgICAgIGlmIChtc2dwID49IG1zZyArIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnVmZmVyIG92ZXJmbG93IGluIF9kYnVzX3BvbGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJcbiIpOworICBfZGJ1c192ZXJib3NlICgiJXMiLG1zZyk7CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgeworICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsgCisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgRkRfU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorICAgICAgICBGRF9TRVQgKGZkcC0+ZmQsICZ3cml0ZV9zZXQpOworCisgICAgICBGRF9TRVQgKGZkcC0+ZmQsICZlcnJfc2V0KTsKKworICAgICAgbWF4X2ZkID0gTUFYIChtYXhfZmQsIGZkcC0+ZmQpOworICAgIH0KKworICAvLyBBdm9pZCByYW5kb20gbG9ja3VwcyB3aXRoIHNlbmQoKSwgZm9yIGxhY2sgb2YgYSBiZXR0ZXIgc29sdXRpb24gc28gZmFyCisgIHR2LnR2X3NlYyA9IHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMCA/IDEgOiB0aW1lb3V0X21pbGxpc2Vjb25kcyAvIDEwMDA7CisgIHR2LnR2X3VzZWMgPSB0aW1lb3V0X21pbGxpc2Vjb25kcyA8IDAgPyAwIDogKHRpbWVvdXRfbWlsbGlzZWNvbmRzICUgMTAwMCkgKiAxMDAwOworCisgIHJlYWR5ID0gc2VsZWN0IChtYXhfZmQgKyAxLCAmcmVhZF9zZXQsICZ3cml0ZV9zZXQsICZlcnJfc2V0LCAmdHYpOworCisgIGlmIChEQlVTX1NPQ0tFVF9BUElfUkVUVVJOU19FUlJPUiAocmVhZHkpKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGlmIChlcnJubyAhPSBXU0FFV09VTERCTE9DSykKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoInNlbGVjdDogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgfQorICBlbHNlIGlmIChyZWFkeSA9PSAwKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWxlY3Q6ID0gMFxuIik7CisgIGVsc2UKKyAgICBpZiAocmVhZHkgPiAwKQorICAgICAgeworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgICBtc2dwID0gbXNnOworICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJzZWxlY3Q6ID0gJWQ6XG5cdCIsIHJlYWR5KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZyZWFkX3NldCkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlI6JWQgIiwgZmRwLT5mZCk7CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZCwgJndyaXRlX3NldCkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlc6JWQgIiwgZmRwLT5mZCk7CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZCwgJmVycl9zZXQpKQorICAgICAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJFOiVkXG5cdCIsIGZkcC0+ZmQpOworICAgICAgICAgIH0KKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiXG4iKTsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzIixtc2cpOworI2VuZGlmCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKworICAgICAgICAgICAgZmRwLT5yZXZlbnRzID0gMDsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpKQorICAgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZ3cml0ZV9zZXQpKQorICAgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmZXJyX3NldCkpCisgICAgICAgICAgICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgcmV0dXJuIHJlYWR5OworI2VuZGlmICAvKiBVU0VfQ0hSSVNfSU1QTCAqLworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgCitPcmlnaW5hbCBDVlMgdmVyc2lvbiBvZiBkYnVzLXN5c2RlcHMuYworIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuYyBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5vdmVsbCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisKKy8qKgorICogRXhpdCB0aGUgcHJvY2VzcywgcmV0dXJuaW5nIHRoZSBnaXZlbiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY29kZSB0aGUgZXhpdCBjb2RlCisgKi8KK3ZvaWQKK19kYnVzX2V4aXQgKGludCBjb2RlKQoreworICBfZXhpdCAoY29kZSk7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgY29ubmVjdHMgdG8gYSBzb2NrZXQgYXQgdGhlIGdpdmVuIGhvc3QgCisgKiBhbmQgcG9ydC4gVGhlIGNvbm5lY3Rpb24gZmQgaXMgcmV0dXJuZWQsIGFuZCBpcyBzZXQgdXAgYXMKKyAqIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0IG5hbWUgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gbGlzdGVuIG9uLCBOVUxMIGZvciBhbGwKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zIGNvbm5lY3Rpb24gZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChob3N0LCBwb3J0LCBmYW1pbHksIChjb25zdCBjaGFyKilOVUxMLCBlcnJvcik7Cit9CisKK2ludAorX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBmZCA9IC0xLCByZXM7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvICphaSwgKnRtcDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICgpOworCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgZmFtaWx5ICVzIiwgZmFtaWx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisjaWZkZWYgQUlfQUREUkNPTkZJRworICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUc7CisjZWxzZQorICBoaW50cy5haV9mbGFncyA9IDA7CisjZW5kaWYKKworICBpZiAoKHJlcyA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKSkgIT0gMCB8fCAhYWkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHJlcyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb29rdXAgaG9zdC9wb3J0OiBcIiVzOiVzXCI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHRtcCA9IGFpOworICB3aGlsZSAodG1wKQorICAgIHsKKyAgICAgIGlmICgoZmQgPSBzb2NrZXQgKHRtcC0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCkpID09IElOVkFMSURfU09DS0VUKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgICAgICBpZiAoY29ubmVjdCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSB0bXAtPmFpX2FkZHIsIHRtcC0+YWlfYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICAgICAgICBmZCA9IC0xOworICAgICAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCBcIiVzOiVzXCIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobm9uY2VmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c1N0cmluZyBub25jZWZpbGVTdHI7CisgICAgICBkYnVzX2Jvb2xfdCByZXQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbm9uY2VmaWxlU3RyKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kKCZub25jZWZpbGVTdHIsIG5vbmNlZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZXNvY2tldCAoZmQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICByZXQgPSBfZGJ1c19zZW5kX25vbmNlIChmZCwgJm5vbmNlZmlsZVN0ciwgZXJyb3IpOworCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZVN0cik7CisKKyAgICAgIGlmICghcmV0KQorICAgICAgICB7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkKTsKKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBjbG9zZXNvY2tldCAoZmQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gZmQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBhdGgsIHRoZW4gbGlzdGVucyBvbgorICogdGhlIHNvY2tldC4gVGhlIHNvY2tldCBpcyBzZXQgdG8gYmUgbm9uYmxvY2tpbmcuICBJbiBjYXNlIG9mIHBvcnQ9MAorICogYSByYW5kb20gZnJlZSBwb3J0IGlzIHVzZWQgYW5kIHJldHVybmVkIGluIHRoZSBwb3J0IHBhcmFtZXRlci4KKyAqIElmIGluYWRkcl9hbnkgaXMgc3BlY2lmaWVkLCB0aGUgaG9zdG5hbWUgaXMgaWdub3JlZC4KKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRvIGxpc3RlbiBvbgorICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIG9uLCBpZiB6ZXJvIGEgZnJlZSBwb3J0IHdpbGwgYmUgdXNlZCAKKyAqIEBwYXJhbSBmYW1pbHkgdGhlIGFkZHJlc3MgZmFtaWx5IHRvIGxpc3RlbiBvbiwgTlVMTCBmb3IgYWxsCisgKiBAcGFyYW0gcmV0cG9ydCBzdHJpbmcgdG8gcmV0dXJuIHRoZSBhY3R1YWwgcG9ydCBsaXN0ZW5lZCBvbgorICogQHBhcmFtIGZkc19wIGxvY2F0aW9uIHRvIHN0b3JlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvcnMKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgdGhlIG51bWJlciBvZiBsaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9ycyBvciAtMSBvbiBlcnJvcgorICovCisKK2ludAorX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnJldHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqKmZkc19wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IG5saXN0ZW5fZmQgPSAwLCAqbGlzdGVuX2ZkID0gTlVMTCwgcmVzLCBpLCBwb3J0X251bSA9IC0xOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWksICp0bXA7CisKKyAgLy8gT24gVmlzdGEsIHNvY2thZGRyX2dlbiBtdXN0IGJlIGEgc29ja2FkZHJfaW42LCBhbmQgbm90IGEgc29ja2FkZHJfaW42X29sZAorICAvL1RoYXQncyByZXF1aXJlZCBmb3IgZmFtaWx5ID09IElQdjYod2hpY2ggaXMgdGhlIGRlZmF1bHQgb24gVmlzdGEgaWYgZmFtaWx5IGlzIG5vdCBnaXZlbikKKyAgLy9TbyB3ZSB1c2Ugb3VyIG93biB1bmlvbiBpbnN0ZWFkIG9mIHNvY2thZGRyX2dlbjoKKworICB0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3Qgc29ja2FkZHIgQWRkcmVzczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gQWRkcmVzc0luOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgQWRkcmVzc0luNjsKKyAgfSBteXNvY2thZGRyX2dlbjsKKworICAqZmRzX3AgPSBOVUxMOworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICgpOworCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgZmFtaWx5ICVzIiwgZmFtaWx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyNpZmRlZiBBSV9BRERSQ09ORklHCisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRyB8IEFJX1BBU1NJVkU7CisjZWxzZQorICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisjZW5kaWYKKworIHJlZG9fbG9va3VwX3dpdGhfcG9ydDoKKyAgaWYgKChyZXMgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZhaSkpICE9IDAgfHwgIWFpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaW50IGZkID0gLTEsICpuZXdsaXN0ZW5fZmQ7CisgICAgICBpZiAoKGZkID0gc29ja2V0ICh0bXAtPmFpX2ZhbWlseSwgU09DS19TVFJFQU0sIDApKSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgICAgIGlmIChiaW5kIChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYmluZCBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBjbG9zZXNvY2tldCAoZmQpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgICAgaWYgKGxpc3RlbiAoZmQsIDMwIC8qIGJhY2tsb2cgKi8pID09IFNPQ0tFVF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsaXN0ZW4gb24gc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBuZXdsaXN0ZW5fZmQgPSBkYnVzX3JlYWxsb2MobGlzdGVuX2ZkLCBzaXplb2YoaW50KSoobmxpc3Rlbl9mZCsxKSk7CisgICAgICBpZiAoIW5ld2xpc3Rlbl9mZCkKKyAgICAgICAgeworICAgICAgICAgIGNsb3Nlc29ja2V0IChmZCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWxlIGhhbmRsZSBhcnJheSIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBsaXN0ZW5fZmQgPSBuZXdsaXN0ZW5fZmQ7CisgICAgICBsaXN0ZW5fZmRbbmxpc3Rlbl9mZF0gPSBmZDsKKyAgICAgIG5saXN0ZW5fZmQrKzsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aChyZXRwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgcG9ydCwgb3IgdXNlZCAwLCB0aGVuCisgICAgICAgICAgICAgdGhlIGtlcm5lbCBjaG9vc2VzIGEgcG9ydC4gQWZ0ZXIgdGhlIGZpcnN0IGFkZHJlc3MKKyAgICAgICAgICAgICBpcyBib3VuZCB0bywgd2UgbmVlZCB0byBmb3JjZSBhbGwgcmVtYWluaW5nIGFkZHJlc3NlcworICAgICAgICAgICAgIHRvIHVzZSB0aGUgc2FtZSBwb3J0ICovCisgICAgICAgICAgaWYgKCFwb3J0IHx8ICFzdHJjbXAocG9ydCwgIjAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXlzb2NrYWRkcl9nZW4gYWRkcjsKKyAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgICAgICAgICAgIGNoYXIgcG9ydGJ1ZlsxMF07CisKKyAgICAgICAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAmYWRkci5BZGRyZXNzLCAmYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzb2x2ZSBwb3J0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vKCkpOworICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzbnByaW50ZiggcG9ydGJ1Ziwgc2l6ZW9mKCBwb3J0YnVmICkgLSAxLCAiJWQiLCBhZGRyLkFkZHJlc3NJbi5zaW5fcG9ydCApOworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQocmV0cG9ydCwgcG9ydGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogUmVsZWFzZSBjdXJyZW50IGFkZHJlc3MgbGlzdCAmIHJlZG8gbG9va3VwICovCisgICAgICAgICAgICAgIHBvcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEocmV0cG9ydCk7CisgICAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgICAgIGdvdG8gcmVkb19sb29rdXBfd2l0aF9wb3J0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKHJldHBvcnQsIHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAKKyAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisgIGFpID0gTlVMTDsKKworICBpZiAoIW5saXN0ZW5fZmQpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJubyAoV1NBRUFERFJJTlVTRSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgc3NjYW5mKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShyZXRwb3J0KSwgIiVkIiwgJnBvcnRfbnVtKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGxpc3Rlbl9mZFtpXSk7CisgICAgICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAobGlzdGVuX2ZkW2ldLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAqZmRzX3AgPSBsaXN0ZW5fZmQ7CisKKyAgcmV0dXJuIG5saXN0ZW5fZmQ7CisKKyBmYWlsZWQ6CisgIGlmIChhaSkKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgY2xvc2Vzb2NrZXQgKGxpc3Rlbl9mZFtpXSk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmQpOworICByZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBBY2NlcHRzIGEgY29ubmVjdGlvbiBvbiBhIGxpc3RlbmluZyBzb2NrZXQuCisgKiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKgorICogQHBhcmFtIGxpc3Rlbl9mZCB0aGUgbGlzdGVuIGZpbGUgZGVzY3JpcHRvcgorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gZmQgb2YgdGhlIGNsaWVudCwgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19hY2NlcHQgIChpbnQgbGlzdGVuX2ZkKQoreworICBpbnQgY2xpZW50X2ZkOworCisgcmV0cnk6CisgIGNsaWVudF9mZCA9IGFjY2VwdCAobGlzdGVuX2ZkLCBOVUxMLCBOVUxMKTsKKworICBpZiAoREJVU19TT0NLRVRfSVNfSU5WQUxJRCAoY2xpZW50X2ZkKSkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJjbGllbnQgZmQgJWQgYWNjZXB0ZWRcbiIsIGNsaWVudF9mZCk7CisgIAorICByZXR1cm4gY2xpZW50X2ZkOworfQorCisKKworCitkYnVzX2Jvb2xfdAorX2RidXNfc2VuZF9jcmVkZW50aWFsc19zb2NrZXQgKGludCAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKy8qIEZJWE1FOiBmb3IgdGhlIHNlc3Npb24gYnVzIGNyZWRlbnRpYWxzIHNob3VsZG4ndCBtYXR0ZXIgKD8pLCBidXQKKyAqIGZvciB0aGUgc3lzdGVtIGJ1cyB0aGV5IGFyZSBwcmVzdW1hYmx5IGVzc2VudGlhbC4gQSByb3VnaCBvdXRsaW5lCisgKiBvZiBhIHdheSB0byBpbXBsZW1lbnQgdGhlIGNyZWRlbnRpYWwgdHJhbnNmZXIgd291bGQgYmUgdGhpczoKKyAqCisgKiBjbGllbnQgd2FpdHMgdG8gKnJlYWQqIGEgYnl0ZS4KKyAqCisgKiBzZXJ2ZXIgY3JlYXRlcyBhIG5hbWVkIHBpcGUgd2l0aCBhIHJhbmRvbSBuYW1lLCBzZW5kcyBhIGJ5dGUKKyAqIGNvbnRpbmluZyBpdHMgbGVuZ3RoLCBhbmQgaXRzIG5hbWUuCisgKgorICogY2xpZW50IHJlYWRzIHRoZSBuYW1lLCBjb25uZWN0cyB0byBpdCAodXNpbmcgV2luMzIgQVBJKS4KKyAqCisgKiBzZXJ2ZXIgd2FpdHMgZm9yIGNvbm5lY3Rpb24gdG8gdGhlIG5hbWVkIHBpcGUsIHRoZW4gY2FsbHMKKyAqIEltcGVyc29uYXRlTmFtZWRQaXBlQ2xpZW50KCksIG5vdGVzIGl0cyBub3ctY3VycmVudCBjcmVkZW50aWFscywKKyAqIGNhbGxzIFJldmVydFRvU2VsZigpLCBjbG9zZXMgaXRzIGhhbmRsZXMgdG8gdGhlIG5hbWVkIHBpcGUsIGFuZAorICogaXMgZG9uZS4gKE1heWJlIHRoZXJlIGlzIHNvbWUgb3RoZXIgd2F5IHRvIGdldCB0aGUgU0lEIG9mIGEgbmFtZWQKKyAqIHBpcGUgY2xpZW50IHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBpbXBlcnNvbmF0aW9uPykKKyAqCisgKiBjbGllbnQgY2xvc2VzIGl0cyBoYW5kbGVzIGFuZCBpcyBkb25lLgorICogCisgKiBSYWxmOiBXaHkgbm90IHNlbmRpbmcgY3JlZGVudGlhbHMgb3ZlciB0aGUgZ2l2ZW4gdGhpcyBjb25uZWN0aW9uID8KKyAqIFVzaW5nIG5hbWVkIHBpcGVzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gYmUgY29ubmVjdGVkIGZyb20gYSB1bml4IGNsaWVudC4gIAorICoKKyAqLworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgREJ1c1N0cmluZyBidWY7IAorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmJ1ZiwgIlwwIiwgMSk7CithZ2FpbjoKKyAgYnl0ZXNfd3JpdHRlbiA9IF9kYnVzX3dyaXRlX3NvY2tldCAoaGFuZGxlLCAmYnVmLCAwLCAxICk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3JpdGUgY3JlZGVudGlhbHMgYnl0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChieXRlc193cml0dGVuID09IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJ3cm90ZSB6ZXJvIGJ5dGVzIHdyaXRpbmcgY3JlZGVudGlhbHMgYnl0ZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZXNfd3JpdHRlbiA9PSAxKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cm90ZSAxIHplcm8gYnl0ZSwgY3JlZGVudGlhbCBzZW5kaW5nIGlzbid0IGltcGxlbWVudGVkIHlldFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgd2hpY2ggbXVzdCBiZSBudWwgKGFuIGVycm9yIG9jY3VycyBvdGhlcndpc2UpLAorICogYW5kIHJlYWRzIHVuaXggY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlLiBGaWxscyBpbiBwaWQvdWlkL2dpZCB3aXRoCisgKiAtMSBpZiBubyBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlLiBSZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIKKyAqIGEgYnl0ZSB3YXMgcmVhZCwgbm90IHdoZXRoZXIgd2UgZ290IHZhbGlkIGNyZWRlbnRpYWxzLiBPbiBzb21lCisgKiBzeXN0ZW1zLCBzdWNoIGFzIExpbnV4LCByZWFkaW5nL3dyaXRpbmcgdGhlIGJ5dGUgaXNuJ3QgYWN0dWFsbHkKKyAqIHJlcXVpcmVkLCBidXQgd2UgZG8gaXQgYW55d2F5IGp1c3QgdG8gYXZvaWQgbXVsdGlwbGUgY29kZXBhdGhzLgorICogCisgKiBGYWlscyBpZiBubyBieXRlIGlzIGF2YWlsYWJsZSwgc28geW91IG11c3Qgc2VsZWN0KCkgZmlyc3QuCisgKgorICogVGhlIHBvaW50IG9mIHRoZSBieXRlIGlzIHRoYXQgb24gc29tZSBzeXN0ZW1zIHdlIGhhdmUgdG8KKyAqIHVzZSBzZW5kbXNnKCkvcmVjdm1zZygpIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjbGllbnRfZmQgdGhlIGNsaWVudCBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBzdHJ1Y3QgdG8gZmlsbCB3aXRoIGNyZWRlbnRpYWxzIG9mIGNsaWVudAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0ICAoaW50ICAgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIGludCBieXRlc19yZWFkID0gMDsKKyAgREJ1c1N0cmluZyBidWY7CisgIAorICAvLyBjb3VsZCBmYWlsIGR1ZSB0b28gT09NCisgIGlmIChfZGJ1c19zdHJpbmdfaW5pdCgmYnVmKSkKKyAgICB7CisgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXQoaGFuZGxlLCAmYnVmLCAxICk7CisKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkgCisgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBvbmUgemVybyBieXRlIGZyb20gc2VydmVyIik7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZidWYpOworICAgIH0KKworICBfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNyZWRlbnRpYWxzKTsKKyAgX2RidXNfdmVyYm9zZSgiRklYTUU6IGdldCBmYWtlZCBjcmVkZW50aWFscyBmcm9tIGN1cnJlbnQgcHJvY2VzcyIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyogQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGlzIAorKiBwcml2YXRlIHRvIHRoZSB1c2VyIAorKgorKiBAcGFyYW0gZGlyIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorKiovCitkYnVzX2Jvb2xfdAorX2RidXNfY2hlY2tfZGlyX2lzX3ByaXZhdGVfdG9fdXNlciAoREJ1c1N0cmluZyAqZGlyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICAvKiBUT0RPICovCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEFwcGVuZHMgdGhlIGdpdmVuIGZpbGVuYW1lIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgKgorICogQHRvZG8gaXQgbWlnaHQgYmUgY3V0ZSB0byBjb2xsYXBzZSBtdWx0aXBsZSAnLycgc3VjaCBhcyAiZm9vLy8iCisgKiBjb25jYXQgIi8vYmFyIgorICoKKyAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBuYW1lCisgKiBAcGFyYW0gbmV4dF9jb21wb25lbnQgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChEQnVzU3RyaW5nICAgICAgICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpuZXh0X2NvbXBvbmVudCkKK3sKKyAgZGJ1c19ib29sX3QgZGlyX2VuZHNfaW5fc2xhc2g7CisgIGRidXNfYm9vbF90IGZpbGVfc3RhcnRzX3dpdGhfc2xhc2g7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpID09IDAgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuZXh0X2NvbXBvbmVudCkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkaXJfZW5kc19pbl9zbGFzaCA9CisgICAgKCcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRpciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikgLSAxKSB8fAorICAgICAnXFwnID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGlyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlyKSAtIDEpKTsKKworICBmaWxlX3N0YXJ0c193aXRoX3NsYXNoID0KKyAgICAoJy8nID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAobmV4dF9jb21wb25lbnQsIDApIHx8CisgICAgICdcXCcgPT0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChuZXh0X2NvbXBvbmVudCwgMCkpOworCisgIGlmIChkaXJfZW5kc19pbl9zbGFzaCAmJiBmaWxlX3N0YXJ0c193aXRoX3NsYXNoKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChkaXIsIDEpOworICAgIH0KKyAgZWxzZSBpZiAoIShkaXJfZW5kc19pbl9zbGFzaCB8fCBmaWxlX3N0YXJ0c193aXRoX3NsYXNoKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZGlyLCAnXFwnKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKG5leHRfY29tcG9uZW50LCAwLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0gREJ1c0NyZWRlbnRpYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBmaWxsIGluIAorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSkKK3sKKyAgcmV0dXJuIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSh1c2VybmFtZSkpOworfQorCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gdGhlCisgKiBwYXNzZWQtaW4gY3JlZGVudGlhbHMgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBhZGQgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnk7IGRvZXMgbm90IHByb3Blcmx5IHJvbGwgYmFjayBvbiBmYWlsdXJlLCBzbyBvbmx5IHNvbWUgY3JlZGVudGlhbHMgbWF5IGhhdmUgYmVlbiBhZGRlZAorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIGRidXNfYm9vbF90IHJldHZhbCA9IEZBTFNFOworICBjaGFyICpzaWQgPSBOVUxMOworCisgIGlmICghX2RidXNfZ2V0c2lkKCZzaWQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfcGlkKGNyZWRlbnRpYWxzLCBfZGJ1c19nZXRwaWQoKSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLHNpZCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgZ290byBlbmQ7CitmYWlsZWQ6CisgIHJldHZhbCA9IEZBTFNFOworZW5kOgorICBpZiAoc2lkKQorICAgIExvY2FsRnJlZShzaWQpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQXBwZW5kIHRvIHRoZSBzdHJpbmcgdGhlIGlkZW50aXR5IHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSB3aGVuIHdlCisgKiBhdXRoZW50aWNhdGUsIG9uIFVOSVggdGhpcyBpcyB0aGUgY3VycmVudCBwcm9jZXNzIFVJRCBhbmQgb24KKyAqIFdpbmRvd3Mgc29tZXRoaW5nIGVsc2UsIHByb2JhYmx5IGEgV2luZG93cyBTSUQgc3RyaW5nLiAgTm8gZXNjYXBpbmcKKyAqIGlzIHJlcXVpcmVkLCB0aGF0IGlzIGRvbmUgaW4gZGJ1cy1hdXRoLmMuIFRoZSB1c2VybmFtZSBoZXJlCisgKiBuZWVkIG5vdCBiZSBhbnl0aGluZyBodW1hbi1yZWFkYWJsZSwgaXQgY2FuIGJlIHRoZSBtYWNoaW5lLXJlYWRhYmxlCisgKiBmb3JtIGkuZS4gYSB1c2VyIGlkLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKiBAdG9kbyB0byB3aGljaCBjbGFzcyBiZWxvbmdzIHRoaXMgCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoREJ1c1N0cmluZyAqc3RyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBGQUxTRTsKKyAgY2hhciAqc2lkID0gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldHNpZCgmc2lkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLHNpZCk7CisKKyAgTG9jYWxGcmVlKHNpZCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogR2V0cyBvdXIgcHJvY2VzcyBJRAorICogQHJldHVybnMgcHJvY2VzcyBJRAorICovCitkYnVzX3BpZF90CitfZGJ1c19nZXRwaWQgKHZvaWQpCit7CisgIHJldHVybiBHZXRDdXJyZW50UHJvY2Vzc0lkICgpOworfQorCisvKiogbmFub3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgICAxMDAwMDAwMDAwCisvKiogbWljcm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EICAgICAgMTAwMDAwMAorLyoqIG1pbGxpc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAKKy8qKiBuYW5vc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCAgMTAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfTUlMTElTRUNPTkQgMTAwMAorCisvKioKKyAqIFNsZWVwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBtaWxsaXNlY29uZHMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICovCit2b2lkCitfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKGludCBtaWxsaXNlY29uZHMpCit7CisgIFNsZWVwIChtaWxsaXNlY29uZHMpOworfQorCisKKy8qKgorICogR2V0IGN1cnJlbnQgdGltZSwgYXMgaW4gZ2V0dGltZW9mZGF5KCkuCisgKgorICogQHBhcmFtIHR2X3NlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBzZWNvbmRzCisgKiBAcGFyYW0gdHZfdXNlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKyAqLwordm9pZAorX2RidXNfZ2V0X2N1cnJlbnRfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYykKK3sKKyAgRklMRVRJTUUgZnQ7CisgIGRidXNfdWludDY0X3QgdGltZTY0OworCisgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lICgmZnQpOworCisgIG1lbWNweSAoJnRpbWU2NCwgJmZ0LCBzaXplb2YgKHRpbWU2NCkpOworCisgIC8qIENvbnZlcnQgZnJvbSAxMDBzIG9mIG5hbm9zZWNvbmRzIHNpbmNlIDE2MDEtMDEtMDEKKyAgKiB0byBVbml4IGVwb2NoLiBZZXMsIHRoaXMgaXMgWTIwMzggdW5zYWZlLgorICAqLworICB0aW1lNjQgLT0gREJVU19JTlQ2NF9DT05TVEFOVCAoMTE2NDQ0NzM2MDAwMDAwMDAwKTsKKyAgdGltZTY0IC89IDEwOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHRpbWU2NCAvIDEwMDAwMDA7CisKKyAgaWYgKHR2X3VzZWMpCisgICAgKnR2X3VzZWMgPSB0aW1lNjQgJSAxMDAwMDAwOworfQorCisKKy8qKgorICogc2lnbmFsIChTSUdQSVBFLCBTSUdfSUdOKTsKKyAqLwordm9pZAorX2RidXNfZGlzYWJsZV9zaWdwaXBlICh2b2lkKQoreworfQorCisvKioKKyAqIENyZWF0ZXMgYSBkaXJlY3Rvcnk7IHN1Y2NlZWRzIGlmIHRoZSBkaXJlY3RvcnkKKyAqIGlzIGNyZWF0ZWQgb3IgYWxyZWFkeSBleGlzdGVkLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmICghQ3JlYXRlRGlyZWN0b3J5QSAoZmlsZW5hbWVfYywgTlVMTCkpCisgICAgeworICAgICAgaWYgKEdldExhc3RFcnJvciAoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHJhbmRvbSBieXRlcywKKyAqIHVzaW5nIHRoZSBiZXN0IG1lY2hhbmlzbSB3ZSBjYW4gY29tZSB1cCB3aXRoLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gYXBwZW5kIHRvIHN0cmluZworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMpCit7CisgIGludCBvbGRfbGVuOworICBjaGFyICpwOworICBIQ1JZUFRQUk9WIGhwcm92OworCisgIG9sZF9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBuX2J5dGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb2xkX2xlbiwgbl9ieXRlcyk7CisKKyAgaWYgKCFDcnlwdEFjcXVpcmVDb250ZXh0ICgmaHByb3YsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsIENSWVBUX1ZFUklGWUNPTlRFWFQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIUNyeXB0R2VuUmFuZG9tIChocHJvdiwgbl9ieXRlcywgcCkpCisgICAgeworICAgICAgQ3J5cHRSZWxlYXNlQ29udGV4dCAoaHByb3YsIDApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBDcnlwdFJlbGVhc2VDb250ZXh0IChocHJvdiwgMCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdGVtcG9yYXJ5IGZpbGVzIGRpcmVjdG9yeSBieSBpbnNwZWN0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgCisgKiBUTVBESVIsIFRNUCwgYW5kIFRFTVAgaW4gdGhhdCBvcmRlci4gSWYgbm9uZSBvZiB0aG9zZSBhcmUgc2V0ICIvdG1wIiBpcyByZXR1cm5lZAorICoKKyAqIEByZXR1cm5zIGxvY2F0aW9uIG9mIHRlbXAgZGlyZWN0b3J5CisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19nZXRfdG1wZGlyKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyKiB0bXBkaXIgPSBOVUxMOworICBzdGF0aWMgY2hhciBidWZbMTAwMF07CisKKyAgaWYgKHRtcGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKmxhc3Rfc2xhc2g7CisKKyAgICAgIGlmICghR2V0VGVtcFBhdGhBIChzaXplb2YgKGJ1ZiksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiR2V0VGVtcFBhdGggZmFpbGVkXG4iKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICAvKiBEcm9wIHRlcm1pbmF0aW5nIGJhY2tzbGFzaCBvciBzbGFzaCAqLworICAgICAgbGFzdF9zbGFzaCA9IF9tYnNyY2hyIChidWYsICdcXCcpOworICAgICAgaWYgKGxhc3Rfc2xhc2ggPiBidWYgJiYgbGFzdF9zbGFzaFsxXSA9PSAnXDAnKQorICAgICAgICBsYXN0X3NsYXNoWzBdID0gJ1wwJzsKKyAgICAgIGxhc3Rfc2xhc2ggPSBfbWJzcmNociAoYnVmLCAnLycpOworICAgICAgaWYgKGxhc3Rfc2xhc2ggPiBidWYgJiYgbGFzdF9zbGFzaFsxXSA9PSAnXDAnKQorICAgICAgICBsYXN0X3NsYXNoWzBdID0gJ1wwJzsKKworICAgICAgdG1wZGlyID0gYnVmOworICAgIH0KKworICBfZGJ1c19hc3NlcnQodG1wZGlyICE9IE5VTEwpOworCisgIHJldHVybiB0bXBkaXI7Cit9CisKKworLyoqCisgKiBEZWxldGVzIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1bmxpbmsoKSBzdWNjZWVkZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaWYgKERlbGV0ZUZpbGVBIChmaWxlbmFtZV9jKSA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBkZWxldGUgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiByZXBsYWNlcyB0aGUgdGVybSBEQlVTX1BSRUZJWCBpbiBjb25maWd1cmVfdGltZV9wYXRoIGJ5IHRoZQorICogY3VycmVudCBkYnVzIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIE9uIHVuaXggdGhpcyBmdW5jdGlvbiBpcyBhIG5vb3AKKyAqCisgKiBAcGFyYW0gY29uZmlndXJlX3RpbWVfcGF0aAorICogQHJldHVybiByZWFsIHBhdGgKKyAqLworY29uc3QgY2hhciAqCitfZGJ1c19yZXBsYWNlX2luc3RhbGxfcHJlZml4IChjb25zdCBjaGFyICpjb25maWd1cmVfdGltZV9wYXRoKQoreworI2lmbmRlZiBEQlVTX1BSRUZJWAorICByZXR1cm4gY29uZmlndXJlX3RpbWVfcGF0aDsKKyNlbHNlCisgIHN0YXRpYyBjaGFyIHJldHZhbFsxMDAwXTsKKyAgc3RhdGljIGNoYXIgcnVudGltZV9wcmVmaXhbMTAwMF07CisgIGludCBsZW4gPSAxMDAwOworICBpbnQgaTsKKworICBpZiAoIWNvbmZpZ3VyZV90aW1lX3BhdGgpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCghX2RidXNfZ2V0X2luc3RhbGxfcm9vdChydW50aW1lX3ByZWZpeCwgbGVuKSB8fAorICAgICAgIHN0cm5jbXAgKGNvbmZpZ3VyZV90aW1lX3BhdGgsIERCVVNfUFJFRklYICIvIiwKKyAgICAgICAgICAgICAgICBzdHJsZW4gKERCVVNfUFJFRklYKSArIDEpKSkgeworICAgICBzdHJjYXQgKHJldHZhbCwgY29uZmlndXJlX3RpbWVfcGF0aCk7CisgICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICBzdHJjcHkgKHJldHZhbCwgcnVudGltZV9wcmVmaXgpOworICBzdHJjYXQgKHJldHZhbCwgY29uZmlndXJlX3RpbWVfcGF0aCArIHN0cmxlbiAoREJVU19QUkVGSVgpICsgMSk7CisKKyAgLyogU29tZWhvdywgaW4gc29tZSBzaXR1YXRpb25zLCBiYWNrc2xhc2hlcyBnZXQgY29sbGFwc2VkIGluIHRoZSBzdHJpbmcuCisgICAqIFNpbmNlIHdpbmRvd3MgQyBsaWJyYXJ5IGFjY2VwdHMgYm90aCBmb3J3YXJkIGFuZCBiYWNrc2xhc2hlcyBhcworICAgKiBwYXRoIHNlcGFyYXRvcnMsIGNvbnZlcnQgYWxsIGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcy4KKyAgICovCisKKyAgZm9yKGkgPSAwOyByZXR2YWxbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYocmV0dmFsW2ldID09ICdcXCcpCisgICAgICByZXR2YWxbaV0gPSAnLyc7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKKyNlbmRpZgorfQorCisjaWYgIWRlZmluZWQgKERCVVNfRElTQUJMRV9BU1NFUlRTKSB8fCBkZWZpbmVkKERCVVNfQlVJTERfVEVTVFMpCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKERCVVNfV0lOQ0UpCisjIGlmZGVmIEJBQ0tUUkFDRVMKKyMgIHVuZGVmIEJBQ0tUUkFDRVMKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBCQUNLVFJBQ0VTCisjZW5kaWYKKworI2lmZGVmIEJBQ0tUUkFDRVMKKy8qCisgKiBCYWNrdHJhY2UgR2VuZXJhdG9yCisgKgorICogQ29weXJpZ2h0IDIwMDQgRXJpYyBQb2VjaAorICogQ29weXJpZ2h0IDIwMDQgUm9iZXJ0IFNoZWFybWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8d2ludmVyLmg+CisjaW5jbHVkZSA8aW1hZ2VobHAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIERQUklOVEYgX2RidXNfd2FybgorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgQk9PTCBpbnQKKworI2RlZmluZSBfX2kzODZfXworI2VuZGlmCisKKy8vI2RlZmluZSBNQUtFX0ZVTkNQVFIoZikgc3RhdGljIHR5cGVvZihmKSAqIHAjI2YKKworLy9NQUtFX0ZVTkNQVFIoU3RhY2tXYWxrKTsKKy8vTUFLRV9GVU5DUFRSKFN5bUdldE1vZHVsZUJhc2UpOworLy9NQUtFX0ZVTkNQVFIoU3ltRnVuY3Rpb25UYWJsZUFjY2Vzcyk7CisvL01BS0VfRlVOQ1BUUihTeW1Jbml0aWFsaXplKTsKKy8vTUFLRV9GVU5DUFRSKFN5bUdldFN5bUZyb21BZGRyKTsKKy8vTUFLRV9GVU5DUFRSKFN5bUdldE1vZHVsZUluZm8pOworc3RhdGljIEJPT0wgKFdJTkFQSSAqcFN0YWNrV2FsaykoCisgIERXT1JEIE1hY2hpbmVUeXBlLAorICBIQU5ETEUgaFByb2Nlc3MsCisgIEhBTkRMRSBoVGhyZWFkLAorICBMUFNUQUNLRlJBTUUgU3RhY2tGcmFtZSwKKyAgUFZPSUQgQ29udGV4dFJlY29yZCwKKyAgUFJFQURfUFJPQ0VTU19NRU1PUllfUk9VVElORSBSZWFkTWVtb3J5Um91dGluZSwKKyAgUEZVTkNUSU9OX1RBQkxFX0FDQ0VTU19ST1VUSU5FIEZ1bmN0aW9uVGFibGVBY2Nlc3NSb3V0aW5lLAorICBQR0VUX01PRFVMRV9CQVNFX1JPVVRJTkUgR2V0TW9kdWxlQmFzZVJvdXRpbmUsCisgIFBUUkFOU0xBVEVfQUREUkVTU19ST1VUSU5FIFRyYW5zbGF0ZUFkZHJlc3MKKyk7CisjaWZkZWYgX1dJTjY0CitzdGF0aWMgRFdPUkQ2NCAoV0lOQVBJICpwU3ltR2V0TW9kdWxlQmFzZSkoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQ2NCBkd0FkZHIKKyk7CitzdGF0aWMgUFZPSUQgIChXSU5BUEkgKnBTeW1GdW5jdGlvblRhYmxlQWNjZXNzKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRDY0IEFkZHJCYXNlCispOworI2Vsc2UKK3N0YXRpYyBEV09SRCAoV0lOQVBJICpwU3ltR2V0TW9kdWxlQmFzZSkoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgZHdBZGRyCispOworc3RhdGljIFBWT0lEICAoV0lOQVBJICpwU3ltRnVuY3Rpb25UYWJsZUFjY2VzcykoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgQWRkckJhc2UKKyk7CisjZW5kaWYKK3N0YXRpYyBCT09MICAoV0lOQVBJICpwU3ltSW5pdGlhbGl6ZSkoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgUFNUUiBVc2VyU2VhcmNoUGF0aCwKKyAgQk9PTCBmSW52YWRlUHJvY2VzcworKTsKK3N0YXRpYyBCT09MICAoV0lOQVBJICpwU3ltR2V0U3ltRnJvbUFkZHIpKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JEIEFkZHJlc3MsCisgIFBEV09SRCBEaXNwbGFjZW1lbnQsCisgIFBJTUFHRUhMUF9TWU1CT0wgU3ltYm9sCispOworc3RhdGljIEJPT0wgIChXSU5BUEkgKnBTeW1HZXRNb2R1bGVJbmZvKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBkd0FkZHIsCisgIFBJTUFHRUhMUF9NT0RVTEUgTW9kdWxlSW5mbworKTsKK3N0YXRpYyBEV09SRCAgKFdJTkFQSSAqcFN5bVNldE9wdGlvbnMpKAorICBEV09SRCBTeW1PcHRpb25zCispOworCisKK3N0YXRpYyBCT09MIGluaXRfYmFja3RyYWNlKCkKK3sKKyAgICBITU9EVUxFIGhtb2REYmdIZWxwID0gTG9hZExpYnJhcnlBKCJkYmdoZWxwIik7CisvKgorICAgICNkZWZpbmUgR0VURlVOQyh4KSBcCisgICAgcCMjeCA9ICh0eXBlb2YoeCkqKUdldFByb2NBZGRyZXNzKGhtb2REYmdIZWxwLCAjeCk7IFwKKyAgICBpZiAoIXAjI3gpIFwKKyAgICB7IFwKKyAgICAgICAgcmV0dXJuIEZBTFNFOyBcCisgICAgfQorICAgICovCisKKworLy8gICAgR0VURlVOQyhTdGFja1dhbGspOworLy8gICAgR0VURlVOQyhTeW1HZXRNb2R1bGVCYXNlKTsKKy8vICAgIEdFVEZVTkMoU3ltRnVuY3Rpb25UYWJsZUFjY2Vzcyk7CisvLyAgICBHRVRGVU5DKFN5bUluaXRpYWxpemUpOworLy8gICAgR0VURlVOQyhTeW1HZXRTeW1Gcm9tQWRkcik7CisvLyAgICBHRVRGVU5DKFN5bUdldE1vZHVsZUluZm8pOworCisjZGVmaW5lIEZVTkMoeCkgI3gKKworICAgICAgcFN0YWNrV2FsayA9IChCT09MICAoV0lOQVBJICopKAorRFdPUkQgTWFjaGluZVR5cGUsCitIQU5ETEUgaFByb2Nlc3MsCitIQU5ETEUgaFRocmVhZCwKK0xQU1RBQ0tGUkFNRSBTdGFja0ZyYW1lLAorUFZPSUQgQ29udGV4dFJlY29yZCwKK1BSRUFEX1BST0NFU1NfTUVNT1JZX1JPVVRJTkUgUmVhZE1lbW9yeVJvdXRpbmUsCitQRlVOQ1RJT05fVEFCTEVfQUNDRVNTX1JPVVRJTkUgRnVuY3Rpb25UYWJsZUFjY2Vzc1JvdXRpbmUsCitQR0VUX01PRFVMRV9CQVNFX1JPVVRJTkUgR2V0TW9kdWxlQmFzZVJvdXRpbmUsCitQVFJBTlNMQVRFX0FERFJFU1NfUk9VVElORSBUcmFuc2xhdGVBZGRyZXNzCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTdGFja1dhbGspKTsKKyNpZmRlZiBfV0lONjQKKyAgICBwU3ltR2V0TW9kdWxlQmFzZT0oRFdPUkQ2NCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRDY0IGR3QWRkcgorKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltR2V0TW9kdWxlQmFzZSkpOworICAgIHBTeW1GdW5jdGlvblRhYmxlQWNjZXNzPShQVk9JRCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRDY0IEFkZHJCYXNlCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTeW1GdW5jdGlvblRhYmxlQWNjZXNzKSk7CisjZWxzZQorICAgIHBTeW1HZXRNb2R1bGVCYXNlPShEV09SRCAgKFdJTkFQSSAqKSgKKyAgSEFORExFIGhQcm9jZXNzLAorICBEV09SRCBkd0FkZHIKKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUdldE1vZHVsZUJhc2UpKTsKKyAgICBwU3ltRnVuY3Rpb25UYWJsZUFjY2Vzcz0oUFZPSUQgIChXSU5BUEkgKikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgQWRkckJhc2UKKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MpKTsKKyNlbmRpZgorICAgIHBTeW1Jbml0aWFsaXplID0gKEJPT0wgIChXSU5BUEkgKikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgUFNUUiBVc2VyU2VhcmNoUGF0aCwKKyAgQk9PTCBmSW52YWRlUHJvY2VzcworKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltSW5pdGlhbGl6ZSkpOworICAgIHBTeW1HZXRTeW1Gcm9tQWRkciA9IChCT09MICAoV0lOQVBJICopKAorICBIQU5ETEUgaFByb2Nlc3MsCisgIERXT1JEIEFkZHJlc3MsCisgIFBEV09SRCBEaXNwbGFjZW1lbnQsCisgIFBJTUFHRUhMUF9TWU1CT0wgU3ltYm9sCispKUdldFByb2NBZGRyZXNzIChobW9kRGJnSGVscCwgRlVOQyhTeW1HZXRTeW1Gcm9tQWRkcikpOworICAgIHBTeW1HZXRNb2R1bGVJbmZvID0gKEJPT0wgIChXSU5BUEkgKikoCisgIEhBTkRMRSBoUHJvY2VzcywKKyAgRFdPUkQgZHdBZGRyLAorICBQSU1BR0VITFBfTU9EVUxFIE1vZHVsZUluZm8KKykpR2V0UHJvY0FkZHJlc3MgKGhtb2REYmdIZWxwLCBGVU5DKFN5bUdldE1vZHVsZUluZm8pKTsKK3BTeW1TZXRPcHRpb25zID0gKERXT1JEICAoV0lOQVBJICopKAorRFdPUkQgU3ltT3B0aW9ucworKSlHZXRQcm9jQWRkcmVzcyAoaG1vZERiZ0hlbHAsIEZVTkMoU3ltU2V0T3B0aW9ucykpOworCisKKyAgICBwU3ltU2V0T3B0aW9ucyhTWU1PUFRfVU5ETkFNRSk7CisKKyAgICBwU3ltSW5pdGlhbGl6ZShHZXRDdXJyZW50UHJvY2VzcygpLCBOVUxMLCBUUlVFKTsKKworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2JhY2t0cmFjZV9mb3JfdGhyZWFkKEhBTkRMRSBoVGhyZWFkKQoreworICAgIFNUQUNLRlJBTUUgc2Y7CisgICAgQ09OVEVYVCBjb250ZXh0OworICAgIERXT1JEIGR3SW1hZ2VUeXBlOworCisgICAgaWYgKCFwU3RhY2tXYWxrKQorICAgICAgICBpZiAoIWluaXRfYmFja3RyYWNlKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAvKiBjYW4ndCB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgY3VycmVudCB0aHJlYWQgYXMgR2V0VGhyZWFkQ29udGV4dAorICAgICAqIGRvZXNuJ3Qgc3VwcG9ydCBnZXR0aW5nIGNvbnRleHQgZnJvbSBjdXJyZW50IHRocmVhZCAqLworICAgIGlmIChoVGhyZWFkID09IEdldEN1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRFBSSU5URigiQmFja3RyYWNlOlxuIik7CisKKyAgICBfREJVU19aRVJPKGNvbnRleHQpOworICAgIGNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9GVUxMOworCisgICAgU3VzcGVuZFRocmVhZChoVGhyZWFkKTsKKworICAgIGlmICghR2V0VGhyZWFkQ29udGV4dChoVGhyZWFkLCAmY29udGV4dCkpCisgICAgeworICAgICAgICBEUFJJTlRGKCJDb3VsZG4ndCBnZXQgdGhyZWFkIGNvbnRleHQgKGVycm9yICVsZClcbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgUmVzdW1lVGhyZWFkKGhUaHJlYWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX0RCVVNfWkVSTyhzZik7CisKKyNpZmRlZiBfX2kzODZfXworICAgIHNmLkFkZHJGcmFtZS5PZmZzZXQgPSBjb250ZXh0LkVicDsKKyAgICBzZi5BZGRyRnJhbWUuTW9kZSA9IEFkZHJNb2RlRmxhdDsKKyAgICBzZi5BZGRyUEMuT2Zmc2V0ID0gY29udGV4dC5FaXA7CisgICAgc2YuQWRkclBDLk1vZGUgPSBBZGRyTW9kZUZsYXQ7CisgICAgZHdJbWFnZVR5cGUgPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NjsKKyNlbGlmIF9NX1g2NAorICBkd0ltYWdlVHlwZSAgICAgICAgICAgICAgICA9IElNQUdFX0ZJTEVfTUFDSElORV9BTUQ2NDsKKyAgc2YuQWRkclBDLk9mZnNldCAgICA9IGNvbnRleHQuUmlwOworICBzZi5BZGRyUEMuTW9kZSAgICAgID0gQWRkck1vZGVGbGF0OworICBzZi5BZGRyRnJhbWUuT2Zmc2V0ID0gY29udGV4dC5Sc3A7CisgIHNmLkFkZHJGcmFtZS5Nb2RlICAgPSBBZGRyTW9kZUZsYXQ7CisgIHNmLkFkZHJTdGFjay5PZmZzZXQgPSBjb250ZXh0LlJzcDsKKyAgc2YuQWRkclN0YWNrLk1vZGUgICA9IEFkZHJNb2RlRmxhdDsKKyNlbGlmIF9NX0lBNjQKKyAgZHdJbWFnZVR5cGUgICAgICAgICAgICAgICAgID0gSU1BR0VfRklMRV9NQUNISU5FX0lBNjQ7CisgIHNmLkFkZHJQQy5PZmZzZXQgICAgPSBjb250ZXh0LlN0SUlQOworICBzZi5BZGRyUEMuTW9kZSAgICAgID0gQWRkck1vZGVGbGF0OworICBzZi5BZGRyRnJhbWUuT2Zmc2V0ID0gY29udGV4dC5JbnRTcDsKKyAgc2YuQWRkckZyYW1lLk1vZGUgICA9IEFkZHJNb2RlRmxhdDsKKyAgc2YuQWRkckJTdG9yZS5PZmZzZXQ9IGNvbnRleHQuUnNCU1A7CisgIHNmLkFkZHJCU3RvcmUuTW9kZSAgPSBBZGRyTW9kZUZsYXQ7CisgIHNmLkFkZHJTdGFjay5PZmZzZXQgPSBjb250ZXh0LkludFNwOworICBzZi5BZGRyU3RhY2suTW9kZSAgID0gQWRkck1vZGVGbGF0OworI2Vsc2UKKyMgZXJyb3IgWW91IG5lZWQgdG8gZmlsbCBpbiB0aGUgU1RBQ0tGUkFNRSBzdHJ1Y3R1cmUgZm9yIHlvdXIgYXJjaGl0ZWN0dXJlCisjZW5kaWYKKworICAgIHdoaWxlIChwU3RhY2tXYWxrKGR3SW1hZ2VUeXBlLCBHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgaFRocmVhZCwgJnNmLCAmY29udGV4dCwgTlVMTCwgcFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICBwU3ltR2V0TW9kdWxlQmFzZSwgTlVMTCkpCisgICAgeworICAgICAgICBCWVRFIGJ1ZmZlclsyNTZdOworICAgICAgICBJTUFHRUhMUF9TWU1CT0wgKiBwU3ltYm9sID0gKElNQUdFSExQX1NZTUJPTCAqKWJ1ZmZlcjsKKyAgICAgICAgRFdPUkQgZHdEaXNwbGFjZW1lbnQ7CisKKyAgICAgICAgcFN5bWJvbC0+U2l6ZU9mU3RydWN0ID0gc2l6ZW9mKElNQUdFSExQX1NZTUJPTCk7CisgICAgICAgIHBTeW1ib2wtPk1heE5hbWVMZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIHNpemVvZihJTUFHRUhMUF9TWU1CT0wpICsgMTsKKworICAgICAgICBpZiAoIXBTeW1HZXRTeW1Gcm9tQWRkcihHZXRDdXJyZW50UHJvY2VzcygpLCBzZi5BZGRyUEMuT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHdEaXNwbGFjZW1lbnQsIHBTeW1ib2wpKQorICAgICAgICB7CisgICAgICAgICAgICBJTUFHRUhMUF9NT0RVTEUgTW9kdWxlSW5mbzsKKyAgICAgICAgICAgIE1vZHVsZUluZm8uU2l6ZU9mU3RydWN0ID0gc2l6ZW9mKE1vZHVsZUluZm8pOworCisgICAgICAgICAgICBpZiAoIXBTeW1HZXRNb2R1bGVJbmZvKEdldEN1cnJlbnRQcm9jZXNzKCksIHNmLkFkZHJQQy5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNb2R1bGVJbmZvKSkKKyAgICAgICAgICAgICAgICBEUFJJTlRGKCIxXHQlcFxuIiwgKHZvaWQqKXNmLkFkZHJQQy5PZmZzZXQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIERQUklOVEYoIjJcdCVzKzB4JWx4XG4iLCBNb2R1bGVJbmZvLkltYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc2YuQWRkclBDLk9mZnNldCAtIE1vZHVsZUluZm8uQmFzZU9mSW1hZ2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGR3RGlzcGxhY2VtZW50KQorICAgICAgICAgICAgRFBSSU5URigiM1x0JXMrMHglbHhcbiIsIHBTeW1ib2wtPk5hbWUsIGR3RGlzcGxhY2VtZW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRFBSSU5URigiNFx0JXNcbiIsIHBTeW1ib2wtPk5hbWUpOworICAgIH0KKworICAgIFJlc3VtZVRocmVhZChoVGhyZWFkKTsKK30KKworc3RhdGljIERXT1JEIFdJTkFQSSBkdW1wX3RocmVhZF9wcm9jKExQVk9JRCBscFBhcmFtZXRlcikKK3sKKyAgICBkdW1wX2JhY2t0cmFjZV9mb3JfdGhyZWFkKChIQU5ETEUpbHBQYXJhbWV0ZXIpOworICAgIHJldHVybiAwOworfQorCisvKiBjYW5ub3QgZ2V0IHZhbGlkIGNvbnRleHQgZnJvbSBjdXJyZW50IHRocmVhZCwgc28gd2UgaGF2ZSB0byBleGVjdXRlCisgKiBiYWNrdHJhY2UgZnJvbSBhbm90aGVyIHRocmVhZCAqLworc3RhdGljIHZvaWQgZHVtcF9iYWNrdHJhY2UoKQoreworICAgIEhBTkRMRSBoQ3VycmVudFRocmVhZDsKKyAgICBIQU5ETEUgaFRocmVhZDsKKyAgICBEV09SRCBkd1RocmVhZElkOworICAgIER1cGxpY2F0ZUhhbmRsZShHZXRDdXJyZW50UHJvY2VzcygpLCBHZXRDdXJyZW50VGhyZWFkKCksCisgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksICZoQ3VycmVudFRocmVhZCwgMCwgRkFMU0UsIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7CisgICAgaFRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBkdW1wX3RocmVhZF9wcm9jLCAoTFBWT0lEKWhDdXJyZW50VGhyZWFkLAorICAgICAgICAwLCAmZHdUaHJlYWRJZCk7CisgICAgV2FpdEZvclNpbmdsZU9iamVjdChoVGhyZWFkLCBJTkZJTklURSk7CisgICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CisgICAgQ2xvc2VIYW5kbGUoaEN1cnJlbnRUaHJlYWQpOworfQorI2VuZGlmCisjZW5kaWYgLyogYXNzZXJ0cyBvciB0ZXN0cyBlbmFibGVkICovCisKKyNpZmRlZiBCQUNLVFJBQ0VTCit2b2lkIF9kYnVzX3ByaW50X2JhY2t0cmFjZSh2b2lkKQoreworICBpbml0X2JhY2t0cmFjZSgpOworICBkdW1wX2JhY2t0cmFjZSgpOworfQorI2Vsc2UKK3ZvaWQgX2RidXNfcHJpbnRfYmFja3RyYWNlKHZvaWQpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCIgIEQtQnVzIG5vdCBjb21waWxlZCB3aXRoIGJhY2t0cmFjZSBzdXBwb3J0XG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgZGJ1c191aW50MzJfdCBmcm9tQXNjaWkoY2hhciBhc2NpaSkKK3sKKyAgICBpZihhc2NpaSA+PSAnMCcgJiYgYXNjaWkgPD0gJzknKQorICAgICAgICByZXR1cm4gYXNjaWkgLSAnMCc7CisgICAgaWYoYXNjaWkgPj0gJ0EnICYmIGFzY2lpIDw9ICdGJykKKyAgICAgICAgcmV0dXJuIGFzY2lpIC0gJ0EnICsgMTA7CisgICAgaWYoYXNjaWkgPj0gJ2EnICYmIGFzY2lpIDw9ICdmJykKKyAgICAgICAgcmV0dXJuIGFzY2lpIC0gJ2EnICsgMTA7CisgICAgcmV0dXJuIDA7ICAgIAorfQorCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAgIChEQnVzR1VJRCAgICAgICAgICptYWNoaW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworI2lmZGVmIERCVVNfV0lOQ0UKKwlyZXR1cm4gVFJVRTsKKyAgLy8gVE9ETworI2Vsc2UKKyAgICBIV19QUk9GSUxFX0lORk9BIGluZm87CisgICAgY2hhciAqbHBjID0gJmluZm8uc3pId1Byb2ZpbGVHdWlkWzBdOworICAgIGRidXNfdWludDMyX3QgdTsKKworICAgIC8vICB0aGUgaHctcHJvZmlsZSBndWlkIGxpdmVzIGxvbmcgZW5vdWdoCisgICAgaWYoIUdldEN1cnJlbnRId1Byb2ZpbGVBKCZpbmZvKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7IC8vIEZJWE1FCisgICAgICAgIHJldHVybiBGQUxTRTsgIAorICAgICAgfQorCisgICAgLy8gRm9ybTogezEyMzQwMDAxLTQ5ODAtMTkyMC02Nzg4LTEyMzQ1Njc4OTAxMn0KKyAgICBscGMrKzsKKyAgICAvLyAxMjM0MDAwMQorICAgIHUgPSAoKGZyb21Bc2NpaShscGNbMF0pIDw8ICAwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1sxXSkgPDwgIDQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzJdKSA8PCAgOCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbM10pIDw8IDEyKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s0XSkgPDwgMTYpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzVdKSA8PCAyMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNl0pIDw8IDI0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s3XSkgPDwgMjgpKTsKKyAgICBtYWNoaW5lX2lkLT5hc191aW50MzJzWzBdID0gdTsKKworICAgIGxwYyArPSA5OworICAgIC8vIDQ5ODAtMTkyMAorICAgIHUgPSAoKGZyb21Bc2NpaShscGNbMF0pIDw8ICAwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1sxXSkgPDwgIDQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzJdKSA8PCAgOCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbM10pIDw8IDEyKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s1XSkgPDwgMTYpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzZdKSA8PCAyMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbN10pIDw8IDI0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s4XSkgPDwgMjgpKTsKKyAgICBtYWNoaW5lX2lkLT5hc191aW50MzJzWzFdID0gdTsKKyAgICAKKyAgICBscGMgKz0gMTA7CisgICAgLy8gNjc4OC0xMjM0CisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzVdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNl0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s3XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzhdKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbMl0gPSB1OworICAgIAorICAgIGxwYyArPSA5OworICAgIC8vIDU2Nzg5MDEyCisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzRdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNV0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s2XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzddKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbM10gPSB1OworI2VuZGlmCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYworSEFORExFIF9kYnVzX2dsb2JhbF9sb2NrIChjb25zdCBjaGFyICptdXRleG5hbWUpCit7CisgIEhBTkRMRSBtdXRleDsKKyAgRFdPUkQgZ290TXV0ZXg7CisKKyAgbXV0ZXggPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBtdXRleG5hbWUgKTsKKyAgaWYoICFtdXRleCApCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgZ290TXV0ZXggPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBtdXRleCwgSU5GSU5JVEUgKTsKKyAgIHN3aXRjaCggZ290TXV0ZXggKQorICAgICB7CisgICAgICAgY2FzZSBXQUlUX0FCQU5ET05FRDoKKyAgICAgICAgICAgICAgIFJlbGVhc2VNdXRleCAobXV0ZXgpOworICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUgKG11dGV4KTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIGNhc2UgV0FJVF9GQUlMRUQ6CisgICAgICAgY2FzZSBXQUlUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgfQorCisgICByZXR1cm4gbXV0ZXg7Cit9CisKK3N0YXRpYwordm9pZCBfZGJ1c19nbG9iYWxfdW5sb2NrIChIQU5ETEUgbXV0ZXgpCit7CisgIFJlbGVhc2VNdXRleCAobXV0ZXgpOworICBDbG9zZUhhbmRsZSAobXV0ZXgpOyAKK30KKworLy8gZm9yIHByb3BlciBjbGVhbnVwIGluIGRidXMtZGFlbW9uCitzdGF0aWMgSEFORExFIGhEQnVzRGFlbW9uTXV0ZXggPSBOVUxMOworc3RhdGljIEhBTkRMRSBoREJ1c1NoYXJlZE1lbSA9IE5VTEw7CisvLyBzeW5jIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MsIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyBhbmQgX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucworc3RhdGljIGNvbnN0IGNoYXIgKmNVbmlxdWVEQnVzSW5pdE11dGV4ID0gIlVuaXF1ZURCdXNJbml0TXV0ZXgiOworLy8gc3luYyBfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzCitzdGF0aWMgY29uc3QgY2hhciAqY0RCdXNBdXRvbGF1bmNoTXV0ZXggPSAiREJ1c0F1dG9sYXVuY2hNdXRleCI7CisvLyBtdXRleCB0byBkZXRlcm1pbmUgaWYgZGJ1cy1kYWVtb24gaXMgYWxyZWFkeSBzdGFydGVkIChwZXIgdXNlcikKK3N0YXRpYyBjb25zdCBjaGFyICpjREJ1c0RhZW1vbk11dGV4ID0gIkRCdXNEYWVtb25NdXRleCI7CisvLyBuYW1lZCBzaG0gZm9yIGRidXMgYWRyZXNzIGluZm8gKHBlciB1c2VyKQorc3RhdGljIGNvbnN0IGNoYXIgKmNEQnVzRGFlbW9uQWRkcmVzc0luZm8gPSAiREJ1c0RhZW1vbkFkZHJlc3NJbmZvIjsKKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfaW5zdGFsbF9yb290X2FzX2hhc2goREJ1c1N0cmluZyAqb3V0KQoreworICAgIERCdXNTdHJpbmcgaW5zdGFsbF9wYXRoOworCisgICAgY2hhciBwYXRoW01BWF9QQVRIKjJdOworICAgIGludCBwYXRoX3NpemUgPSBzaXplb2YocGF0aCk7CisKKyAgICBpZiAoIV9kYnVzX2dldF9pbnN0YWxsX3Jvb3QocGF0aCxwYXRoX3NpemUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBfZGJ1c19zdHJpbmdfaW5pdCgmaW5zdGFsbF9wYXRoKTsKKyAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKCZpbnN0YWxsX3BhdGgscGF0aCk7CisKKyAgICBfZGJ1c19zdHJpbmdfaW5pdChvdXQpOworICAgIF9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpKCZpbnN0YWxsX3BhdGgsMCxfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmaW5zdGFsbF9wYXRoKSk7CisKKyAgICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmaW5zdGFsbF9wYXRoLCBvdXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfYWRkcmVzc19zdHJpbmcgKERCdXNTdHJpbmcgKm91dCwgY29uc3QgY2hhciAqYmFzZXN0cmluZywgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIF9kYnVzX3N0cmluZ19pbml0KG91dCk7CisgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LGJhc2VzdHJpbmcpOworCisgIGlmICghc2NvcGUpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAoc2NvcGUsIippbnN0YWxsLXBhdGgiKSA9PSAwCisgICAgICAgIC8vIGZvciAxLjMgY29tcGF0aWJpbGl0eQorICAgICAgICB8fCBzdHJjbXAoc2NvcGUsImluc3RhbGwtcGF0aCIpID09IDApCisgICAgeworICAgICAgREJ1c1N0cmluZyB0ZW1wOworICAgICAgaWYgKCFfZGJ1c19nZXRfaW5zdGFsbF9yb290X2FzX2hhc2goJnRlbXApKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUob3V0KTsKKyAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCwiLSIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKCZ0ZW1wKSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmdGVtcCk7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAoc2NvcGUsIip1c2VyIikgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCwiLSIpOworICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyhvdXQpKQorICAgICAgICB7CisgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKG91dCk7CisgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoc3RybGVuKHNjb3BlKSA+IDApCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsIi0iKTsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LHNjb3BlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3NobV9uYW1lIChEQnVzU3RyaW5nICpvdXQsY29uc3QgY2hhciAqc2NvcGUpCit7CisgIHJldHVybiBfZGJ1c19nZXRfYWRkcmVzc19zdHJpbmcgKG91dCxjREJ1c0RhZW1vbkFkZHJlc3NJbmZvLHNjb3BlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfbXV0ZXhfbmFtZSAoREJ1c1N0cmluZyAqb3V0LGNvbnN0IGNoYXIgKnNjb3BlKQoreworICByZXR1cm4gX2RidXNfZ2V0X2FkZHJlc3Nfc3RyaW5nIChvdXQsY0RCdXNEYWVtb25NdXRleCxzY29wZSk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19kYWVtb25faXNfc2Vzc2lvbl9idXNfYWRkcmVzc19wdWJsaXNoZWQgKGNvbnN0IGNoYXIgKnNjb3BlKQoreworICBIQU5ETEUgbG9jazsKKyAgSEFORExFIG11dGV4OworICBEQnVzU3RyaW5nIG11dGV4X25hbWU7CisgIERXT1JEIHJldDsKKworICBpZiAoIV9kYnVzX2dldF9tdXRleF9uYW1lKCZtdXRleF9uYW1lLHNjb3BlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSggJm11dGV4X25hbWUgKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGhEQnVzRGFlbW9uTXV0ZXgpCisgICAgICByZXR1cm4gVFJVRTsKKworICAvLyBzeW5jIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MsIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyBhbmQgX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucworICBsb2NrID0gX2RidXNfZ2xvYmFsX2xvY2soIGNVbmlxdWVEQnVzSW5pdE11dGV4ICk7CisKKyAgLy8gd2UgdXNlIENyZWF0ZU11dGV4IGluc3RlYWQgb2YgT3Blbk11dGV4IGJlY2F1c2Ugb2YgcG9zc2libGUgcmFjZSBjb25kaXRpb25zLAorICAvLyBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNjg0MzE1JTI4VlMuODUlMjkuYXNweAorICBoREJ1c0RhZW1vbk11dGV4ID0gQ3JlYXRlTXV0ZXhBKCBOVUxMLCBGQUxTRSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKCZtdXRleF9uYW1lKSApOworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSggJm11dGV4X25hbWUgKTsKKworICBpZiAoaERCdXNEYWVtb25NdXRleCAgPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgIHsKKyAgICAgIENsb3NlSGFuZGxlKGhEQnVzRGFlbW9uTXV0ZXgpOworICAgICAgaERCdXNEYWVtb25NdXRleCA9IE5VTEw7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIC8vIG11dGV4IHdhc24ndCBjcmVhdGVkIGJlZm9yZSwgc28gcmV0dXJuIGZhbHNlLgorICAvLyBXZSBsZWF2ZSB0aGUgbXV0ZXggbmFtZSBhbGxvY2F0ZWQgZm9yIGxhdGVyIHJldXNhZ2UKKyAgLy8gaW4gX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcy4KKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAoY29uc3QgY2hhciogYWRkcmVzcywgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIEhBTkRMRSBsb2NrOworICBjaGFyICpzaGFyZWRfYWRkciA9IE5VTEw7CisgIERXT1JEIHJldDsKKyAgY2hhciBhZGRyZXNzSW5mb1sxMDI0XTsKKyAgREJ1c1N0cmluZyBzaG1fbmFtZTsKKyAgREJ1c1N0cmluZyBtdXRleF9uYW1lOworCisgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyk7CisKKyAgaWYgKCFfZGJ1c19nZXRfbXV0ZXhfbmFtZSgmbXV0ZXhfbmFtZSxzY29wZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCisgIGxvY2sgPSBfZGJ1c19nbG9iYWxfbG9jayggY1VuaXF1ZURCdXNJbml0TXV0ZXggKTsKKworICBpZiAoIWhEQnVzRGFlbW9uTXV0ZXgpCisgICAgeworICAgICAgaERCdXNEYWVtb25NdXRleCA9IENyZWF0ZU11dGV4QSggTlVMTCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmbXV0ZXhfbmFtZSkgKTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworCisgIGlmICghX2RidXNfZ2V0X3NobV9uYW1lKCZzaG1fbmFtZSxzY29wZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZzaG1fbmFtZSApOworICAgICAgX2RidXNfZ2xvYmFsX3VubG9jayggbG9jayApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvLyBjcmVhdGUgc2htCisgIGhEQnVzU2hhcmVkTWVtID0gQ3JlYXRlRmlsZU1hcHBpbmdBKCBJTlZBTElEX0hBTkRMRV9WQUxVRSwgTlVMTCwgUEFHRV9SRUFEV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzdHJsZW4oIGFkZHJlc3MgKSArIDEsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmc2htX25hbWUpICk7CisgIF9kYnVzX2Fzc2VydCggaERCdXNTaGFyZWRNZW0gKTsKKworICBzaGFyZWRfYWRkciA9IE1hcFZpZXdPZkZpbGUoIGhEQnVzU2hhcmVkTWVtLCBGSUxFX01BUF9XUklURSwgMCwgMCwgMCApOworCisgIF9kYnVzX2Fzc2VydCAoc2hhcmVkX2FkZHIpOworCisgIHN0cmNweSggc2hhcmVkX2FkZHIsIGFkZHJlc3MpOworCisgIC8vIGNsZWFudXAKKyAgVW5tYXBWaWV3T2ZGaWxlKCBzaGFyZWRfYWRkciApOworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKyAgX2RidXNfdmVyYm9zZSggInB1Ymxpc2hlZCBzZXNzaW9uIGJ1cyBhZGRyZXNzIGF0ICVzXG4iLF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnNobV9uYW1lKSApOworCisgIF9kYnVzX3N0cmluZ19mcmVlKCAmc2htX25hbWUgKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAodm9pZCkKK3sKKyAgSEFORExFIGxvY2s7CisKKyAgLy8gc3luYyBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzLCBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgYW5kIF9kYnVzX2RhZW1vbl9hbHJlYWR5X3J1bnMKKyAgbG9jayA9IF9kYnVzX2dsb2JhbF9sb2NrKCBjVW5pcXVlREJ1c0luaXRNdXRleCApOworCisgIENsb3NlSGFuZGxlKCBoREJ1c1NoYXJlZE1lbSApOworCisgIGhEQnVzU2hhcmVkTWVtID0gTlVMTDsKKworICBSZWxlYXNlTXV0ZXgoIGhEQnVzRGFlbW9uTXV0ZXggKTsKKworICBDbG9zZUhhbmRsZSggaERCdXNEYWVtb25NdXRleCApOworCisgIGhEQnVzRGFlbW9uTXV0ZXggPSBOVUxMOworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfYXV0b2xhdW5jaF9zaG0gKERCdXNTdHJpbmcgKmFkZHJlc3MsIERCdXNTdHJpbmcgKnNobV9uYW1lKQoreworICBIQU5ETEUgc2hhcmVkTWVtOworICBjaGFyICpzaGFyZWRfYWRkcjsKKyAgaW50IGk7CisKKyAgLy8gcmVhZCBzaG0KKyAgZm9yKGk9MDtpPDIwOysraSkgeworICAgICAgLy8gd2Uga25vdyB0aGF0IGRidXMtZGFlbW9uIGlzIGF2YWlsYWJsZSwgc28gd2Ugd2FpdCB1bnRpbCBzaG0gaXMgYXZhaWxhYmxlCisgICAgICBzaGFyZWRNZW0gPSBPcGVuRmlsZU1hcHBpbmdBKCBGSUxFX01BUF9SRUFELCBGQUxTRSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKHNobV9uYW1lKSk7CisgICAgICBpZiggc2hhcmVkTWVtID09IDAgKQorICAgICAgICAgIFNsZWVwKCAxMDAgKTsKKyAgICAgIGlmICggc2hhcmVkTWVtICE9IDApCisgICAgICAgICAgYnJlYWs7CisgIH0KKworICBpZiggc2hhcmVkTWVtID09IDAgKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgIHNoYXJlZF9hZGRyID0gTWFwVmlld09mRmlsZSggc2hhcmVkTWVtLCBGSUxFX01BUF9SRUFELCAwLCAwLCAwICk7CisKKyAgaWYoICFzaGFyZWRfYWRkciApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfc3RyaW5nX2luaXQoIGFkZHJlc3MgKTsKKworICBfZGJ1c19zdHJpbmdfYXBwZW5kKCBhZGRyZXNzLCBzaGFyZWRfYWRkciApOworCisgIC8vIGNsZWFudXAKKyAgVW5tYXBWaWV3T2ZGaWxlKCBzaGFyZWRfYWRkciApOworCisgIENsb3NlSGFuZGxlKCBzaGFyZWRNZW0gKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zIChEQnVzU3RyaW5nICphZGRyZXNzLCBEQnVzU3RyaW5nICpzaG1fbmFtZSwgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIEhBTkRMRSBsb2NrOworICBIQU5ETEUgZGFlbW9uOworICBEQnVzU3RyaW5nIG11dGV4X25hbWU7CisgIGRidXNfYm9vbF90IGJSZXQgPSBUUlVFOworCisgIGlmICghX2RidXNfZ2V0X211dGV4X25hbWUoJm11dGV4X25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvLyBzeW5jIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MsIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyBhbmQgX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucworICBsb2NrID0gX2RidXNfZ2xvYmFsX2xvY2soIGNVbmlxdWVEQnVzSW5pdE11dGV4ICk7CisKKyAgLy8gZG8gY2hlY2tzCisgIGRhZW1vbiA9IENyZWF0ZU11dGV4QSggTlVMTCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmbXV0ZXhfbmFtZSkgKTsKKyAgaWYoV2FpdEZvclNpbmdsZU9iamVjdCggZGFlbW9uLCAxMCApICE9IFdBSVRfVElNRU9VVCkKKyAgICB7CisgICAgICBSZWxlYXNlTXV0ZXggKGRhZW1vbik7CisgICAgICBDbG9zZUhhbmRsZSAoZGFlbW9uKTsKKworICAgICAgX2RidXNfZ2xvYmFsX3VubG9jayggbG9jayApOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8vIHJlYWQgc2htCisgIGJSZXQgPSBfZGJ1c19nZXRfYXV0b2xhdW5jaF9zaG0oIGFkZHJlc3MsIHNobV9uYW1lICk7CisKKyAgLy8gY2xlYW51cAorICBDbG9zZUhhbmRsZSAoIGRhZW1vbiApOworCisgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzIChjb25zdCBjaGFyICpzY29wZSwgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIEhBTkRMRSBtdXRleDsKKyAgU1RBUlRVUElORk9BIHNpOworICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBGQUxTRTsKKyAgTFBTVFIgbHBGaWxlOworICBjaGFyIGRidXNfZXhlX3BhdGhbTUFYX1BBVEhdOworICBjaGFyIGRidXNfYXJnc1tNQVhfUEFUSCAqIDJdOworICBjb25zdCBjaGFyICogZGFlbW9uX25hbWUgPSBEQlVTX0RBRU1PTl9OQU1FICIuZXhlIjsKKyAgREJ1c1N0cmluZyBzaG1fbmFtZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX2dldF9zaG1fbmFtZSgmc2htX25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgImNvdWxkIG5vdCBkZXRlcm1pbmUgc2htIG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBtdXRleCA9IF9kYnVzX2dsb2JhbF9sb2NrICggY0RCdXNBdXRvbGF1bmNoTXV0ZXggKTsKKworICBpZiAoX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucyhhZGRyZXNzLCZzaG1fbmFtZSxzY29wZSkpCisgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlKCAiZm91bmQgcnVubmluZyBkYnVzIGRhZW1vbiBhdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc2htX25hbWUpICk7CisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIVNlYXJjaFBhdGhBKE5VTEwsIGRhZW1vbl9uYW1lLCBOVUxMLCBzaXplb2YoZGJ1c19leGVfcGF0aCksIGRidXNfZXhlX3BhdGgsICZscEZpbGUpKQorICAgIHsKKyAgICAgIHByaW50ZiAoInBsZWFzZSBhZGQgdGhlIHBhdGggdG8gJXMgdG8geW91ciBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlXG4iLCBkYWVtb25fbmFtZSk7CisgICAgICBwcmludGYgKCJvciBzdGFydCB0aGUgZGFlbW9uIG1hbnVhbGx5XG5cbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8vIENyZWF0ZSBwcm9jZXNzCisgIFplcm9NZW1vcnkoICZzaSwgc2l6ZW9mKHNpKSApOworICBzaS5jYiA9IHNpemVvZihzaSk7CisgIFplcm9NZW1vcnkoICZwaSwgc2l6ZW9mKHBpKSApOworCisgIF9zbnByaW50ZihkYnVzX2FyZ3MsIHNpemVvZihkYnVzX2FyZ3MpIC0gMSwgIlwiJXNcIiAlcyIsIGRidXNfZXhlX3BhdGgsICAiIC0tc2Vzc2lvbiIpOworCisvLyAgYXJndltpXSA9ICItLWNvbmZpZy1maWxlPWJ1c1xcc2Vzc2lvbi5jb25mIjsKKy8vICBwcmludGYoImNyZWF0ZSBwcm9jZXNzIFwiJXNcIiAlc1xuIiwgZGJ1c19leGVfcGF0aCwgZGJ1c19hcmdzKTsKKyAgaWYoQ3JlYXRlUHJvY2Vzc0EoZGJ1c19leGVfcGF0aCwgZGJ1c19hcmdzLCBOVUxMLCBOVUxMLCBGQUxTRSwgQ1JFQVRFX05PX1dJTkRPVywgTlVMTCwgTlVMTCwgJnNpLCAmcGkpKQorICAgIHsKKyAgICAgIENsb3NlSGFuZGxlIChwaS5oVGhyZWFkKTsKKyAgICAgIENsb3NlSGFuZGxlIChwaS5oUHJvY2Vzcyk7CisgICAgICByZXR2YWwgPSBfZGJ1c19nZXRfYXV0b2xhdW5jaF9zaG0oIGFkZHJlc3MsICZzaG1fbmFtZSApOworICAgICAgaWYgKHJldHZhbCA9PSBGQUxTRSkKKyAgICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkZhaWxlZCB0byBnZXQgYXV0b2xhdW5jaCBhZGRyZXNzIGZyb20gbGF1bmNoZWQgZGJ1cy1kYWVtb24iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELCAiRmFpbGVkIHRvIGxhdW5jaCBkYnVzLWRhZW1vbiIpOworICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgfQorCitvdXQ6CisgIGlmIChyZXR2YWwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIGVsc2UKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIAorICBfZGJ1c19nbG9iYWxfdW5sb2NrIChtdXRleCk7CisKKyAgcmV0dXJuIHJldHZhbDsKKyB9CisKKworLyoqIE1ha2VzIHRoZSBmaWxlIHJlYWRhYmxlIGJ5IGV2ZXJ5IHVzZXIgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBmaWxlJ3MgcGVybWlzc2lvbnMgY291bGQgYmUgY2hhbmdlZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZShjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICAvLyBUT0RPCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIHJldHVybiB0aGUgcmVsb2NhdGVkIERBVEFESVIKKyAqCisgKiBAcmV0dXJucyByZWxvY2F0ZWQgREFUQURJUiBzdGF0aWMgc3RyaW5nCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorX2RidXNfd2luZG93c19nZXRfZGF0YWRpciAodm9pZCkKK3sKKwlyZXR1cm4gX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeChEQlVTX0RBVEFESVIpOworfQorCisjdW5kZWYgREJVU19EQVRBRElSCisjZGVmaW5lIERCVVNfREFUQURJUiBfZGJ1c193aW5kb3dzX2dldF9kYXRhZGlyICgpCisKKworI2RlZmluZSBEQlVTX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUiAiL2RidXMtMS9zZXJ2aWNlcyIKKyNkZWZpbmUgREJVU19TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUiAiL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiCisKKy8qKgorICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlyZWN0b3JpZXMgZm9yIGEgc2Vzc2lvbiBidXMgdG8gbG9vayBmb3Igc2VydmljZSAKKyAqIGFjdGl2YXRpb24gZmlsZXMgCisgKgorICogT24gV2luZG93cyB0aGlzIHNob3VsZCBiZSBkYXRhIGRpcmVjdG9yaWVzOgorICoKKyAqICVDb21tb25Qcm9ncmFtRmlsZXMlL2RidXMKKyAqCisgKiBhbmQKKyAqCisgKiByZWxvY2F0ZWQgREJVU19EQVRBRElSCisgKgorICogQHBhcmFtIGRpcnMgdGhlIGRpcmVjdG9yeSBsaXN0IHdlIGFyZSByZXR1cm5pbmcKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBPT00gCisgKi8KKworZGJ1c19ib29sX3QgCitfZGJ1c19nZXRfc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICBjb25zdCBjaGFyICpjb21tb25fcHJvZ3M7CisgIERCdXNTdHJpbmcgc2VydmljZWRpcl9wYXRoOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzZXJ2aWNlZGlyX3BhdGgpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIERCVVNfV0lOQ0UKKyAgeworICAgIC8qIE9uIFdpbmRvd3MgQ0UsIHdlIGFkanVzdCBkYXRhZGlyIGR5bmFtaWNhbGx5IHRvIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4gICovCisgICAgY29uc3QgY2hhciAqZGF0YV9kaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX0RBVEFESVIiKTsKKworICAgIGlmIChkYXRhX2RpciAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIGRhdGFfZGlyKSkKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgX0RCVVNfUEFUSF9TRVBBUkFUT1IpKQorICAgICAgICAgIGdvdG8gb29tOworICAgICAgfQorICB9CisjZWxzZQorLyoKKyB0aGUgY29kZSBmb3IgYWNjZXNzaW5nIHNlcnZpY2VzIHJlcXVpcmVzIGFic29sdXRlIGJhc2UgcGF0aGVzCisgaW4gY2FzZSBEQlVTX0RBVEFESVIgaXMgcmVsYXRpdmUgbWFrZSBpdCBhYnNvbHV0ZQorKi8KKyNpZmRlZiBEQlVTX1dJTgorICB7CisgICAgREJ1c1N0cmluZyBwOworCisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZwLCBEQlVTX0RBVEFESVIpOworCisgICAgaWYgKCFfZGJ1c19wYXRoX2lzX2Fic29sdXRlICgmcCkpCisgICAgICB7CisgICAgICAgIGNoYXIgaW5zdGFsbF9yb290WzEwMDBdOworICAgICAgICBpZiAoX2RidXNfZ2V0X2luc3RhbGxfcm9vdCAoaW5zdGFsbF9yb290LCBzaXplb2YoaW5zdGFsbF9yb290KSkpCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBpbnN0YWxsX3Jvb3QpKQorICAgICAgICAgICAgZ290byBvb207CisgICAgICB9CisgIH0KKyNlbmRpZgorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIERCVVNfREFUQURJUikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBfREJVU19QQVRIX1NFUEFSQVRPUikpCisgICAgZ290byBvb207CisjZW5kaWYKKworICBjb21tb25fcHJvZ3MgPSBfZGJ1c19nZXRlbnYgKCJDb21tb25Qcm9ncmFtRmlsZXMiKTsKKworICBpZiAoY29tbW9uX3Byb2dzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBjb21tb25fcHJvZ3MpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCBfREJVU19QQVRIX1NFUEFSQVRPUikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoIV9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZpY2VkaXJfcGF0aCk7ICAKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmljZWRpcl9wYXRoKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZvciBhIHN5c3RlbSBidXMgdG8gbG9vayBmb3Igc2VydmljZQorICogYWN0aXZhdGlvbiBmaWxlcworICoKKyAqIE9uIFVOSVggdGhpcyBzaG91bGQgYmUgdGhlIHN0YW5kYXJkIHhkZyBmcmVlZGVza3RvcC5vcmcgZGF0YSBkaXJlY3RvcmllczoKKyAqCisgKiBYREdfREFUQV9ESVJTPSR7WERHX0RBVEFfRElSUy0vdXNyL2xvY2FsL3NoYXJlOi91c3Ivc2hhcmV9CisgKgorICogYW5kCisgKgorICogREJVU19EQVRBRElSCisgKgorICogT24gV2luZG93cyB0aGVyZSBpcyBubyBzeXN0ZW0gYnVzIGFuZCB0aGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gbm90aGluZy4KKyAqCisgKiBAcGFyYW0gZGlycyB0aGUgZGlyZWN0b3J5IGxpc3Qgd2UgYXJlIHJldHVybmluZworICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpCit7CisgICpkaXJzID0gTlVMTDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK19EQlVTX0RFRklORV9HTE9CQUxfTE9DSyAoYXRvbWljKTsKKworLyoqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgYW4gaW50ZWdlcgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBpbmNyZW1lbnQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBiZWZvcmUgaW5jcmVtZW50aW5nCisgKgorICovCitkYnVzX2ludDMyX3QKK19kYnVzX2F0b21pY19pbmMgKERCdXNBdG9taWMgKmF0b21pYykKK3sKKyAgLy8gKy8tIDEgaXMgbmVlZGVkIGhlcmUhCisgIC8vIG5vIHZvbGF0aWxlIGFyZ3VtZW50IHdpdGggbWluZ3cKKyAgcmV0dXJuIEludGVybG9ja2VkSW5jcmVtZW50ICgmYXRvbWljLT52YWx1ZSkgLSAxOworfQorCisvKioKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50IGFuIGludGVnZXIKKyAqCisgKiBAcGFyYW0gYXRvbWljIHBvaW50ZXIgdG8gdGhlIGludGVnZXIgdG8gZGVjcmVtZW50CisgKiBAcmV0dXJucyB0aGUgdmFsdWUgYmVmb3JlIGRlY3JlbWVudGluZworICoKKyAqLworZGJ1c19pbnQzMl90CitfZGJ1c19hdG9taWNfZGVjIChEQnVzQXRvbWljICphdG9taWMpCit7CisgIC8vICsvLSAxIGlzIG5lZWRlZCBoZXJlIQorICAvLyBubyB2b2xhdGlsZSBhcmd1bWVudCB3aXRoIG1pbmd3CisgIHJldHVybiBJbnRlcmxvY2tlZERlY3JlbWVudCAoJmF0b21pYy0+dmFsdWUpICsgMTsKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiB0aGUgYnVzIGRhZW1vbiBpcyBzaWduYWxlZCB0byByZWxvYWQgaXRzIGNvbmZpZ3VyYXRpb247IGFueQorICogY2FjaGVzIHNob3VsZCBiZSBudWtlZC4gT2YgY291cnNlIGFueSBjYWNoZXMgdGhhdCBuZWVkIGV4cGxpY2l0IHJlbG9hZAorICogYXJlIHByb2JhYmx5IGJyb2tlbiwgYnV0IGMnZXN0IGxhIHZpZS4KKyAqCisgKiAKKyAqLwordm9pZAorX2RidXNfZmx1c2hfY2FjaGVzICh2b2lkKQoreworfQorCisvKioKKyAqIFNlZSBpZiBlcnJubyBpcyBFQUdBSU4gb3IgRVdPVUxEQkxPQ0sgKHRoaXMgaGFzIHRvIGJlIGRvbmUgZGlmZmVyZW50bHkKKyAqIGZvciBXaW5zb2NrIHNvIGlzIGFic3RyYWN0ZWQpCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgZXJybm8gPT0gRUFHQUlOIG9yIGVycm5vID09IEVXT1VMREJMT0NLCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrICh2b2lkKQoreworICByZXR1cm4gZXJybm8gPT0gV1NBRVdPVUxEQkxPQ0s7Cit9CisKKy8qKgorICogcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkYnVzIGluc3RhbGxhdGlvbiAKKyAqCisgKiBAcGFyYW0gcyBidWZmZXIgZm9yIGluc3RhbGxhdGlvbiBwYXRoCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBidWZmZXIKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfaW5zdGFsbF9yb290KGNoYXIgKnByZWZpeCwgaW50IGxlbikKK3sKKyAgICAvL1RvIGZpbmQgdGhlIHByZWZpeCwgd2UgY3V0IHRoZSBmaWxlbmFtZSBhbmQgYWxzbyBcYmluXCBpZiBwcmVzZW50CisgICAgY2hhciogcCA9IDA7CisgICAgaW50IGk7CisgICAgRFdPUkQgcGF0aExlbmd0aDsKKyAgICBjaGFyICpsYXN0U2xhc2g7CisgICAgU2V0TGFzdEVycm9yKCAwICk7CisgICAgcGF0aExlbmd0aCA9IEdldE1vZHVsZUZpbGVOYW1lQShfZGJ1c193aW5fZ2V0X2RsbF9obW9kdWxlKCksIHByZWZpeCwgbGVuKTsKKyAgICBpZiAoIHBhdGhMZW5ndGggPT0gMCB8fCBHZXRMYXN0RXJyb3IoKSAhPSAwICkgeworICAgICAgICAqcHJlZml4ID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBsYXN0U2xhc2ggPSBfbWJzcmNocihwcmVmaXgsICdcXCcpOworICAgIGlmIChsYXN0U2xhc2ggPT0gTlVMTCkgeworICAgICAgICAqcHJlZml4ID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAvL2N1dCBvZmYgYmluYXJ5IG5hbWUKKyAgICBsYXN0U2xhc2hbMV0gPSAwOworCisgICAgLy9jdXQgcG9zc2libGUgIlxcYmluIgorCisgICAgLy90aGlzIGZhaWxzIGlmIHdlIGFyZSBpbiBhIGRvdWJsZS1ieXRlIHN5c3RlbSBjb2RlcGFnZSBhbmQgdGhlCisgICAgLy9mb2xkZXIncyBuYW1lIGhhcHBlbnMgdG8gZW5kIHdpdGggdGhlICpieXRlcyoKKyAgICAvLyJcXGJpbiIuLi4gKEkuZS4gdGhlIHNlY29uZCBieXRlIG9mIHNvbWUgSGFuIGNoYXJhY3RlciBhbmQgdGhlbgorICAgIC8vdGhlIExhdGluICJiaW4iLCBidXQgdGhhdCBpcyBub3QgbGlrZWx5IEkgdGhpbmsuLi4KKyAgICBpZiAobGFzdFNsYXNoIC0gcHJlZml4ID49IDQgJiYgc3RybmljbXAobGFzdFNsYXNoIC0gNCwgIlxcYmluIiwgNCkgPT0gMCkKKyAgICAgICAgbGFzdFNsYXNoWy0zXSA9IDA7CisgICAgZWxzZSBpZiAobGFzdFNsYXNoIC0gcHJlZml4ID49IDEwICYmIHN0cm5pY21wKGxhc3RTbGFzaCAtIDEwLCAiXFxiaW5cXGRlYnVnIiwgMTApID09IDApCisgICAgICAgIGxhc3RTbGFzaFstOV0gPSAwOworICAgIGVsc2UgaWYgKGxhc3RTbGFzaCAtIHByZWZpeCA+PSAxMiAmJiBzdHJuaWNtcChsYXN0U2xhc2ggLSAxMiwgIlxcYmluXFxyZWxlYXNlIiwgMTIpID09IDApCisgICAgICAgIGxhc3RTbGFzaFstMTFdID0gMDsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKiogCisgIGZpbmQgY29uZmlnIGZpbGUgZWl0aGVyIGZyb20gaW5zdGFsbGF0aW9uIG9yIGJ1aWxkIHJvb3QgYWNjb3JkaW5nIHRvIAorICB0aGUgZm9sbG93aW5nIHBhdGggbGF5b3V0IAorICAgIGluc3RhbGwtcm9vdC8KKyAgICAgIGJpbi9kYnVzLWRhZW1vbltkXS5leGUKKyAgICAgIGV0Yy88Y29uZmlnLWZpbGU+LmNvbmYgKm9yKiBldGMvZGJ1cy0xLzxjb25maWctZmlsZT4uY29uZgorICAgICAgKHRoZSBmb3JtZXIgYWJvdmUgaXMgd2hhdCBkYnVzNHdpbiB1c2VzLCB0aGUgbGF0dGVyIGFib3ZlIGlzCisgICAgICB3aGF0IGEgIm5vcm1hbCIgVW5peC1zdHlsZSAibWFrZSBpbnN0YWxsIiB1c2VzKQorCisgICAgYnVpbGQtcm9vdC8KKyAgICAgIGJpbi9kYnVzLWRhZW1vbltkXS5leGUKKyAgICAgIGJ1cy88Y29uZmlnLWZpbGU+LmNvbmYgCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19nZXRfY29uZmlnX2ZpbGVfbmFtZShEQnVzU3RyaW5nICpjb25maWdfZmlsZSwgY2hhciAqcykKK3sKKyAgY2hhciBwYXRoW01BWF9QQVRIKjJdOworICBpbnQgcGF0aF9zaXplID0gc2l6ZW9mKHBhdGgpOworCisgIGlmICghX2RidXNfZ2V0X2luc3RhbGxfcm9vdChwYXRoLHBhdGhfc2l6ZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmKHN0cmxlbihzKSArIDQgKyBzdHJsZW4ocGF0aCkgPiBzaXplb2YocGF0aCktMikKKyAgICByZXR1cm4gRkFMU0U7CisgIHN0cmNhdChwYXRoLCJldGNcXCIpOworICBzdHJjYXQocGF0aCxzKTsKKyAgaWYgKF9kYnVzX2ZpbGVfZXhpc3RzKHBhdGgpKSAKKyAgICB7CisgICAgICAvLyBmaW5kIHBhdGggZnJvbSBleGVjdXRhYmxlIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChjb25maWdfZmlsZSwgcGF0aCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19nZXRfaW5zdGFsbF9yb290KHBhdGgscGF0aF9zaXplKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYoc3RybGVuKHMpICsgMTEgKyBzdHJsZW4ocGF0aCkgPiBzaXplb2YocGF0aCktMikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgc3RyY2F0KHBhdGgsImV0Y1xcZGJ1cy0xXFwiKTsKKyAgICAgIHN0cmNhdChwYXRoLHMpOworICAKKyAgICAgIGlmIChfZGJ1c19maWxlX2V4aXN0cyhwYXRoKSkgCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGNvbmZpZ19maWxlLCBwYXRoKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19nZXRfaW5zdGFsbF9yb290KHBhdGgscGF0aF9zaXplKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBpZihzdHJsZW4ocykgKyA0ICsgc3RybGVuKHBhdGgpID4gc2l6ZW9mKHBhdGgpLTIpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgc3RyY2F0KHBhdGgsImJ1c1xcIik7CisgICAgICAgICAgc3RyY2F0KHBhdGgscyk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKF9kYnVzX2ZpbGVfZXhpc3RzKHBhdGgpKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChjb25maWdfZmlsZSwgcGF0aCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICByZXR1cm4gVFJVRTsKK30gICAgCisKKy8qKgorICogQXBwZW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBzeXN0ZW0uY29uZiBmaWxlCisgKiAodGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBvbiBXaW5kb3dzIHNvIHRoaXMgY2FuIGp1c3QKKyAqIHJldHVybiBGQUxTRSBhbmQgcHJpbnQgYSB3YXJuaW5nIG9yIHNvbWV0aGluZykKKyAqIAorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3N5c3RlbV9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gX2RidXNfZ2V0X2NvbmZpZ19maWxlX25hbWUoc3RyLCAic3lzdGVtLmNvbmYiKTsKK30KKworLyoqCisgKiBBcHBlbmQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHNlc3Npb24uY29uZiBmaWxlLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKQoreworICByZXR1cm4gX2RidXNfZ2V0X2NvbmZpZ19maWxlX25hbWUoc3RyLCAic2Vzc2lvbi5jb25mIik7Cit9CisKKy8qIFNlZSBjb21tZW50IGluIGRidXMtc3lzZGVwcy11bml4LmMgKi8KK2RidXNfYm9vbF90CitfZGJ1c19sb29rdXBfc2Vzc2lvbl9hZGRyZXNzIChkYnVzX2Jvb2xfdCAqc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisgIC8qIFByb2JhYmx5IGZpbGwgdGhpcyBpbiB3aXRoIHNvbWV0aGluZyBiYXNlZCBvbiBDT00/ICovCisgICpzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGEga2V5cmluZyBmb3IgdGhlIGdpdmVuIGNyZWRlbnRpYWxzCisgKiBzaG91bGQgYmUgc3RvcmVkLiAgVGhlIGNyZWRlbnRpYWxzIHNob3VsZCBoYXZlIGVpdGhlciBhIFdpbmRvd3Mgb3IKKyAqIFVOSVggdXNlciBpbiB0aGVtLiAgVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgYW4gYWJzb2x1dGUgcGF0aC4KKyAqCisgKiBPbiBVTklYIHRoZSBkaXJlY3RvcnkgaXMgfi8uZGJ1cy1rZXlyaW5ncyB3aGlsZSBvbiBXaW5kb3dzIGl0IHNob3VsZCBwcm9iYWJseQorICogYmUgc29tZXRoaW5nIGVsc2UsIHNpbmNlIHRoZSBkb3RmaWxlIGNvbnZlbnRpb24gaXMgbm90IG5vcm1hbCBvbiBXaW5kb3dzLgorICogCisgKiBAcGFyYW0gZGlyZWN0b3J5IHN0cmluZyB0byBhcHBlbmQgZGlyZWN0b3J5IHRvCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgZm9yCisgKiAgCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfa2V5cmluZ19kaXJlY3RvcnlfZm9yX2NyZWRlbnRpYWxzIChEQnVzU3RyaW5nICAgICAgKmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIERCdXNTdHJpbmcgaG9tZWRpcjsKKyAgREJ1c1N0cmluZyBkb3RkaXI7CisgIGRidXNfdWlkX3QgdWlkOworICBjb25zdCBjaGFyICpob21lcGF0aDsKKyAgY29uc3QgY2hhciAqaG9tZWRyaXZlOworCisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRlbnRpYWxzKSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmaG9tZWRpcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGhvbWVkcml2ZSA9IF9kYnVzX2dldGVudigiSE9NRURSSVZFIik7CisgIGlmIChob21lZHJpdmUgIT0gTlVMTCAmJiAqaG9tZWRyaXZlICE9ICdcMCcpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCgmaG9tZWRpcixob21lZHJpdmUpOworICAgIH0KKworICBob21lcGF0aCA9IF9kYnVzX2dldGVudigiSE9NRVBBVEgiKTsKKyAgaWYgKGhvbWVwYXRoICE9IE5VTEwgJiYgKmhvbWVwYXRoICE9ICdcMCcpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCgmaG9tZWRpcixob21lcGF0aCk7CisgICAgfQorICAKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIHsKKyAgICBjb25zdCBjaGFyICpvdmVycmlkZTsKKyAgICAKKyAgICBvdmVycmlkZSA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9IT01FRElSIik7CisgICAgaWYgKG92ZXJyaWRlICE9IE5VTEwgJiYgKm92ZXJyaWRlICE9ICdcMCcpCisgICAgICB7CisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmaG9tZWRpciwgMCk7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmhvbWVkaXIsIG92ZXJyaWRlKSkKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgICBfZGJ1c192ZXJib3NlICgiVXNpbmcgZmFrZSBob21lZGlyIGZvciB0ZXN0aW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmaG9tZWRpcikpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIGRidXNfYm9vbF90IGFscmVhZHlfd2FybmVkID0gRkFMU0U7CisgICAgICAgIGlmICghYWxyZWFkeV93YXJuZWQpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoIlVzaW5nIHlvdXIgcmVhbCBob21lIGRpcmVjdG9yeSBmb3IgdGVzdGluZywgc2V0IERCVVNfVEVTVF9IT01FRElSIHRvIGF2b2lkXG4iKTsKKyAgICAgICAgICAgIGFscmVhZHlfd2FybmVkID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU5DRQorICAvKiBJdCdzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSAuc29tZXRoaW5nIGRpcmVjdG9yeSBpbiBXaW5kb3dzIENFCisgICAgIHVzaW5nIHRoZSBmaWxlIGV4cGxvcmVyLiAgKi8KKyNkZWZpbmUgS0VZUklOR19ESVIgImRidXMta2V5cmluZ3MiCisjZWxzZQorI2RlZmluZSBLRVlSSU5HX0RJUiAiLmRidXMta2V5cmluZ3MiCisjZW5kaWYKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRvdGRpciwgS0VZUklOR19ESVIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3RkaXIpKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhvbWVkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcmVjdG9yeSkpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhvbWVkaXIpOworICByZXR1cm4gVFJVRTsKKyAgCisgZmFpbGVkOiAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzQSAoZmlsZSk7CisKKyAgaWYgKGF0dHJpYnV0ZXMgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfUEFUSF9OT1RfRk9VTkQpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7ICAKK30KKworLyoqCisgKiBBIHdyYXBwZXIgYXJvdW5kIHN0cmVycm9yKCkgYmVjYXVzZSBzb21lIHBsYXRmb3JtcworICogbWF5IGJlIGxhbWUgYW5kIG5vdCBoYXZlIHN0cmVycm9yKCkuCisgKgorICogQHBhcmFtIGVycm9yX251bWJlciBlcnJuby4KKyAqIEByZXR1cm5zIGVycm9yIGRlc2NyaXB0aW9uLgorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyZXJyb3IgKGludCBlcnJvcl9udW1iZXIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICAvLyBUT0RPCisgIHJldHVybiAidW5rbm93biI7CisjZWxzZQorICBjb25zdCBjaGFyICptc2c7CisKKyAgc3dpdGNoIChlcnJvcl9udW1iZXIpCisgICAgeworICAgIGNhc2UgV1NBRUlOVFI6CisgICAgICByZXR1cm4gIkludGVycnVwdGVkIGZ1bmN0aW9uIGNhbGwiOworICAgIGNhc2UgV1NBRUFDQ0VTOgorICAgICAgcmV0dXJuICJQZXJtaXNzaW9uIGRlbmllZCI7CisgICAgY2FzZSBXU0FFRkFVTFQ6CisgICAgICByZXR1cm4gIkJhZCBhZGRyZXNzIjsKKyAgICBjYXNlIFdTQUVJTlZBTDoKKyAgICAgIHJldHVybiAiSW52YWxpZCBhcmd1bWVudCI7CisgICAgY2FzZSBXU0FFTUZJTEU6CisgICAgICByZXR1cm4gIlRvbyBtYW55IG9wZW4gZmlsZXMiOworICAgIGNhc2UgV1NBRVdPVUxEQkxPQ0s6CisgICAgICByZXR1cm4gIlJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIjsKKyAgICBjYXNlIFdTQUVJTlBST0dSRVNTOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQUVBTFJFQURZOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyI7CisgICAgY2FzZSBXU0FFTk9UU09DSzoKKyAgICAgIHJldHVybiAiU29ja2V0IG9wZXJhdGlvbiBvbiBub25zb2NrZXQiOworICAgIGNhc2UgV1NBRURFU1RBRERSUkVROgorICAgICAgcmV0dXJuICJEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIjsKKyAgICBjYXNlIFdTQUVNU0dTSVpFOgorICAgICAgcmV0dXJuICJNZXNzYWdlIHRvbyBsb25nIjsKKyAgICBjYXNlIFdTQUVQUk9UT1RZUEU6CisgICAgICByZXR1cm4gIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCI7CisgICAgY2FzZSBXU0FFTk9QUk9UT09QVDoKKyAgICAgIHJldHVybiAiQmFkIHByb3RvY29sIG9wdGlvbiI7CisgICAgY2FzZSBXU0FFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRVNPQ0tUTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVPUE5PVFNVUFA6CisgICAgICByZXR1cm4gIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVQRk5PU1VQUE9SVDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRUFGTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIGZhbWlseSI7CisgICAgY2FzZSBXU0FFQUREUklOVVNFOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIjsKKyAgICBjYXNlIFdTQUVBRERSTk9UQVZBSUw6CisgICAgICByZXR1cm4gIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiOworICAgIGNhc2UgV1NBRU5FVERPV046CisgICAgICByZXR1cm4gIk5ldHdvcmsgaXMgZG93biI7CisgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSI7CisgICAgY2FzZSBXU0FFTkVUUkVTRVQ6CisgICAgICByZXR1cm4gIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIG9uIHJlc2V0IjsKKyAgICBjYXNlIFdTQUVDT05OQUJPUlRFRDoKKyAgICAgIHJldHVybiAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiOworICAgIGNhc2UgV1NBRUNPTk5SRVNFVDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIjsKKyAgICBjYXNlIFdTQUVOT0JVRlM6CisgICAgICByZXR1cm4gIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiOworICAgIGNhc2UgV1NBRUlTQ09OTjoKKyAgICAgIHJldHVybiAiU29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIjsKKyAgICBjYXNlIFdTQUVOT1RDT05OOgorICAgICAgcmV0dXJuICJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCI7CisgICAgY2FzZSBXU0FFU0hVVERPV046CisgICAgICByZXR1cm4gIkNhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93biI7CisgICAgY2FzZSBXU0FFVElNRURPVVQ6CisgICAgICByZXR1cm4gIkNvbm5lY3Rpb24gdGltZWQgb3V0IjsKKyAgICBjYXNlIFdTQUVDT05OUkVGVVNFRDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZWZ1c2VkIjsKKyAgICBjYXNlIFdTQUVIT1NURE9XTjoKKyAgICAgIHJldHVybiAiSG9zdCBpcyBkb3duIjsKKyAgICBjYXNlIFdTQUVIT1NUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTm8gcm91dGUgdG8gaG9zdCI7CisgICAgY2FzZSBXU0FFUFJPQ0xJTToKKyAgICAgIHJldHVybiAiVG9vIG1hbnkgcHJvY2Vzc2VzIjsKKyAgICBjYXNlIFdTQUVESVNDT046CisgICAgICByZXR1cm4gIkdyYWNlZnVsIHNodXRkb3duIGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQVRZUEVfTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuICJDbGFzcyB0eXBlIG5vdCBmb3VuZCI7CisgICAgY2FzZSBXU0FIT1NUX05PVF9GT1VORDoKKyAgICAgIHJldHVybiAiSG9zdCBub3QgZm91bmQiOworICAgIGNhc2UgV1NBVFJZX0FHQUlOOgorICAgICAgcmV0dXJuICJOb25hdXRob3JpdGF0aXZlIGhvc3Qgbm90IGZvdW5kIjsKKyAgICBjYXNlIFdTQU5PX1JFQ09WRVJZOgorICAgICAgcmV0dXJuICJUaGlzIGlzIGEgbm9ucmVjb3ZlcmFibGUgZXJyb3IiOworICAgIGNhc2UgV1NBTk9fREFUQToKKyAgICAgIHJldHVybiAiVmFsaWQgbmFtZSwgbm8gZGF0YSByZWNvcmQgb2YgcmVxdWVzdGVkIHR5cGUiOworICAgIGNhc2UgV1NBX0lOVkFMSURfSEFORExFOgorICAgICAgcmV0dXJuICJTcGVjaWZpZWQgZXZlbnQgb2JqZWN0IGhhbmRsZSBpcyBpbnZhbGlkIjsKKyAgICBjYXNlIFdTQV9JTlZBTElEX1BBUkFNRVRFUjoKKyAgICAgIHJldHVybiAiT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZCI7CisgICAgY2FzZSBXU0FfSU9fSU5DT01QTEVURToKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBJL08gZXZlbnQgb2JqZWN0IG5vdCBpbiBzaWduYWxlZCBzdGF0ZSI7CisgICAgY2FzZSBXU0FfSU9fUEVORElORzoKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBvcGVyYXRpb25zIHdpbGwgY29tcGxldGUgbGF0ZXIiOworICAgIGNhc2UgV1NBX05PVF9FTk9VR0hfTUVNT1JZOgorICAgICAgcmV0dXJuICJJbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZSI7CisgICAgY2FzZSBXU0FfT1BFUkFUSU9OX0FCT1JURUQ6CisgICAgICByZXR1cm4gIk92ZXJsYXBwZWQgb3BlcmF0aW9uIGFib3J0ZWQiOworI2lmZGVmIFdTQUlOVkFMSURQUk9DVEFCTEUKKworICAgIGNhc2UgV1NBSU5WQUxJRFBST0NUQUJMRToKKyAgICAgIHJldHVybiAiSW52YWxpZCBwcm9jZWR1cmUgdGFibGUgZnJvbSBzZXJ2aWNlIHByb3ZpZGVyIjsKKyNlbmRpZgorI2lmZGVmIFdTQUlOVkFMSURQUk9WSURFUgorCisgICAgY2FzZSBXU0FJTlZBTElEUFJPVklERVI6CisgICAgICByZXR1cm4gIkludmFsaWQgc2VydmljZSBwcm92aWRlciB2ZXJzaW9uIG51bWJlciI7CisjZW5kaWYKKyNpZmRlZiBXU0FQUk9WSURFUkZBSUxFRElOSVQKKworICAgIGNhc2UgV1NBUFJPVklERVJGQUlMRURJTklUOgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhIHNlcnZpY2UgcHJvdmlkZXIiOworI2VuZGlmCisKKyAgICBjYXNlIFdTQVNZU0NBTExGQUlMVVJFOgorICAgICAgcmV0dXJuICJTeXN0ZW0gY2FsbCBmYWlsdXJlIjsKKyAgICB9CisgIG1zZyA9IHN0cmVycm9yIChlcnJvcl9udW1iZXIpOworICBpZiAobXNnID09IE5VTEwpCisgICAgbXNnID0gInVua25vd24iOworCisgIHJldHVybiBtc2c7CisjZW5kaWYgLy9EQlVTX1dJTkNFCit9CisKKy8qKgorICogQXNzaWducyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gYSBXaW4zMiBlcnJvcgorICogY29kZSB0byBhIERCdXNFcnJvci4gRG9lcyBub3RoaW5nIGlmIGVycm9yIGlzICNOVUxMLgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IuCisgKiBAcGFyYW0gY29kZSB0aGUgV2luMzIgZXJyb3IgY29kZQorICovCit2b2lkCitfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChEQnVzRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBjb2RlKQoreworICBjaGFyICptc2c7CisKKyAgLyogQXMgd2Ugd2FudCB0aGUgRW5nbGlzaCBtZXNzYWdlLCB1c2UgdGhlIEEgQVBJICovCisgIEZvcm1hdE1lc3NhZ2VBIChGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgICAgICAgICAgICBOVUxMLCBjb2RlLCBNQUtFTEFOR0lEIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksCisgICAgICAgICAgICAgICAgICAoTFBTVFIpICZtc2csIDAsIE5VTEwpOworICBpZiAobXNnKQorICAgIHsKKyAgICAgIGNoYXIgKm1zZ19jb3B5OworCisgICAgICBtc2dfY29weSA9IGRidXNfbWFsbG9jIChzdHJsZW4gKG1zZykpOworICAgICAgc3RyY3B5IChtc2dfY29weSwgbXNnKTsKKyAgICAgIExvY2FsRnJlZSAobXNnKTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCAid2luMzIuZXJyb3IiLCAiJXMiLCBtc2dfY29weSk7CisgICAgfQorICBlbHNlCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCAid2luMzIuZXJyb3IiLCAiVW5rbm93biBlcnJvciBjb2RlICVkIG9yIEZvcm1hdE1lc3NhZ2UgZmFpbGVkIiwgY29kZSk7Cit9CisKK3ZvaWQKK19kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgY29kZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoJmVycm9yLCBjb2RlKTsKKyAgX2RidXNfd2FybiAoIiVzOiAlc1xuIiwgbWVzc2FnZSwgZXJyb3IubWVzc2FnZSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgZGlyZWN0b3J5OyBEaXJlY3RvcnkgbXVzdCBiZSBlbXB0eQorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChSZW1vdmVEaXJlY3RvcnlBIChmaWxlbmFtZV9jKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIGRpcmVjdG9yeSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGVuYW1lIGlzIGFuIGFic29sdXRlIHBhdGgKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhbiBhYnNvbHV0ZSBwYXRoCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXRoX2lzX2Fic29sdXRlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChmaWxlbmFtZSkgPiAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAxKSA9PSAnOicKKyAgICAgICAgICAgfHwgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkgPT0gJ1xcJworICAgICAgICAgICB8fCBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLyc7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSBlbmQgb2Ygc3lzZGVwcy13aW4gKi8KKy8qIHRlc3RzIGluIGRidXMtc3lzZGVwcy11dGlsLmMgKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy13aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDYyNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmgKQEAgLTAsMCArMSw5MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuYyBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQlVTIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5vdmVsbCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1lTREVQU19XSU5fSAorI2RlZmluZSBEQlVTX1NZU0RFUFNfV0lOX0gKKworZXh0ZXJuIHZvaWQgKl9kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUgKHZvaWQpOworI2RlZmluZSBfV0lOU09DS0FQSV8KKworI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjdW5kZWYgaW50ZXJmYWNlCisKKyNkZWZpbmUgREJVU19DT05TT0xFX0RJUiAiL3Zhci9ydW4vY29uc29sZS8iCisKKwordm9pZCBfZGJ1c193aW5fc2V0X2Vycm5vIChpbnQgZXJyKTsKK2NvbnN0IGNoYXIqIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKHZvaWQpOworCit2b2lkIF9kYnVzX3dpbl9zdGFydHVwX3dpbnNvY2sgKHZvaWQpOwordm9pZCBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgIChjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitjaGFyICogX2RidXNfd2luX2Vycm9yX3N0cmluZyAoaW50IGVycm9yX251bWJlcik7Cit2b2lkIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoY2hhciAqc3RyaW5nKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIF9kYnVzX2xtX3N0cmVycm9yICAoaW50IGVycm9yX251bWJlcik7CisKKworZGJ1c19ib29sX3QgX2RidXNfd2luX2FjY291bnRfdG9fc2lkIChjb25zdCB3Y2hhcl90ICp3YWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICoqcHBzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QKK19kYnVzX3dpbjMyX3NpZF90b19uYW1lX2FuZF9kb21haW4gKGRidXNfdWlkX3QgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgICAqKnduYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgICoqd2RvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworCisvKiBEb24ndCBkZWZpbmUgREJVU19DT05TT0xFX0RJUiBvbiBXaW4zMiAqLworCit3Y2hhcl90ICAgICpfZGJ1c193aW5fdXRmOF90b191dGYxNiAoY29uc3QgY2hhciAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpOworY2hhciAgICAgICAqX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGNvbnN0IHdjaGFyX3QgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKwordm9pZCAgICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoREJ1c0Vycm9yICplcnJvciwgaW50IGNvZGUpOworCitkYnVzX2Jvb2xfdAorX2RidXNfd2luX3NpZF90b19uYW1lX2FuZF9kb21haW4gKGRidXNfdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgICoqd25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgKip3ZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfY29uZmlnX2ZpbGVfbmFtZShEQnVzU3RyaW5nICpjb25maWdfZmlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2luc3RhbGxfcm9vdChjaGFyICpwcmVmaXgsIGludCBsZW4pOworCisjZW5kaWYKKworLyoqIEB9IGVuZCBvZiBzeXNkZXBzLXdpbi5oICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiMTM3MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYwpAQCAtMCwwICsxLDExNjUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuYyBXcmFwcGVycyBmb3IgV2luZG93cyBDRSBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQlVTIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5vdmVsbCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBQZXRlciBLw7xtbWVsICA8c3ludGhldGljcHBAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RpYW4gRWhybGljaGVyIDxjaC5laHJsaWNoZXJAZ214LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisvKiBJbmNsdWRpbmcgc2hsb2JqLmggY3JlYXRlcyB0cm91YmxlIG9uIHNvbWUgY29tcGlsZXJzLiAgSnVzdCBjaGlja2VuCisgICBvdXQgaGVyZSBieSBkZWZpbmluZyBqdXN0IHdoYXQgd2UgbmVlZC4gICovCisjaWZuZGVmIENTSURMX1BFUlNPTkFMCisjZGVmaW5lIENTSURMX1BFUlNPTkFMIDUKKyNlbmRpZgorCisKKy8qIENvcHkgU1JDIHRvIERFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbiBERVNULiAgKi8KK3N0YXRpYyBjaGFyICoKK3N0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQoreworICBjaGFyICpkID0gZGVzdDsKKyAgY29uc3QgY2hhciAqcyA9IHNyYzsKKworICBkbworICAgICpkKysgPSAqczsKKyAgd2hpbGUgKCpzKysgIT0gJ1wwJyk7CisKKyAgcmV0dXJuIGQgLSAxOworfQorCisKKy8qIFRoaXMgaXMgc3BlY2lhbCBjYXNlZCwgYmVjYXVzZSB3ZSBtdXN0IGF2b2lkIHVzaW5nIG1hbnkgZGJ1cworICAgZnVuY3Rpb25zIChzdWNoIGFzIG1lbW9yeSBhbGxvY2F0aW9ucyk6IFRob3NlIGZ1bmN0aW9ucyBtYXkgaW4gdHVybgorICAgY2F1c2UgdmVyYm9zZSBvdXRwdXQgYW5kIGNoZWNrIHRoZSBmbGFnISAgKi8KK3N0YXRpYyBjaGFyICoKK2dldF92ZXJib3NlX3NldHRpbmcoKQoreworICBjb25zdCB3Y2hhcl90IGRpcltdID0gTCJTb2Z0d2FyZVxcZnJlZWRlc2t0b3BcXERCdXMiOworICBjb25zdCB3Y2hhcl90IG5hbWVbXSA9IEwiVmVyYm9zZSI7CisgIEhLRVkgcm9vdF9rZXk7CisgIEhLRVkga2V5X2hhbmRsZTsKKyAgRFdPUkQgbmJ5dGVzOworICBEV09SRCBuMTsKKyAgRFdPUkQgdHlwZTsKKyAgd2NoYXJfdCAqcmVzdWx0X3cgPSBOVUxMOworICBjaGFyICpyZXN1bHQ7CisgIGludCBsZW47CisKKyAgcm9vdF9rZXkgPSBIS0VZX0xPQ0FMX01BQ0hJTkU7CisgIGlmIChSZWdPcGVuS2V5RXhXIChyb290X2tleSwgZGlyLCAwLCBLRVlfUkVBRCwgJmtleV9oYW5kbGUpKQorICAgIHJldHVybiBOVUxMOworCisgIG5ieXRlcyA9IDE7CisgIGlmIChSZWdRdWVyeVZhbHVlRXhXIChrZXlfaGFuZGxlLCBuYW1lLCAwLCBOVUxMLCBOVUxMLCAmbmJ5dGVzKSkKKyAgICB7CisgICAgICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIC8qIFJvdW5kIHVwIHRvIG11bHRpcGxlIG9mIHdjaGFyX3QsIGNvbnZlcnQgdG8gbnVtYmVyIG9mIHdjaGFyX3QncywgYW5kIGFkZCAxLiAgKi8KKyAgbjEgPSAoKG5ieXRlcyArIHNpemVvZih3Y2hhcl90KSAtIDEpIC8gc2l6ZW9mICh3Y2hhcl90KSkgKyAxOworICByZXN1bHRfdyA9IG1hbGxvYyAobjEgKiBzaXplb2YgKHdjaGFyX3QpKTsKKyAgaWYgKCFyZXN1bHRfdykKKyAgICB7CisgICAgICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGlmIChSZWdRdWVyeVZhbHVlRXhXIChrZXlfaGFuZGxlLCBuYW1lLCAwLCAmdHlwZSwgKExQQllURSkgcmVzdWx0X3csICZuYnl0ZXMpKQorICAgIHsKKyAgICAgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgICAgIGZyZWUgKHJlc3VsdF93KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgUmVnQ2xvc2VLZXkgKGtleV9oYW5kbGUpOworICByZXN1bHRfd1tuMSAtIDFdID0gMDsgLyogTWFrZSBzdXJlIGl0IGlzIHJlYWxseSBhIHN0cmluZy4gICovCisKKyAgLyogTk9URTogUkVHX01VTFRJX1NaIGFuZCBSRUdfRVhQQU5EX1NaIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2UgdGhleQorICAgICBhcmUgbm90IG5lZWRlZCBpbiB0aGlzIG1vZHVsZS4gICovCisgIGlmICh0eXBlICE9IFJFR19TWikKKyAgICB7CisgICAgICBmcmVlIChyZXN1bHRfdyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfVVRGOCwgMCwgcmVzdWx0X3csIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgaWYgKGxlbiA8IDApCisgICAgeworICAgICAgZnJlZSAocmVzdWx0X3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJlc3VsdCA9IG1hbGxvYyAobGVuICsgMSk7CisgIGlmICghcmVzdWx0KQorICAgIHsKKyAgICAgIGZyZWUgKHJlc3VsdF93KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9VVEY4LCAwLCByZXN1bHRfdywgLTEsIHJlc3VsdCwgbGVuLCBOVUxMLCBOVUxMKTsKKyAgZnJlZSAocmVzdWx0X3cpOworICBpZiAobGVuIDwgMCkKKyAgICB7CisgICAgICBmcmVlIChyZXN1bHQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFJldHVybiBhIHN0cmluZyBmcm9tIHRoZSBXMzIgUmVnaXN0cnkgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorICAgQ2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgcmV0dXJuIHZhbHVlLiAgQSBOVUxMIGZvciByb290IGlzIGFuIGFsaWFzCisgICBmb3IgSEtFWV9DVVJSRU5UX1VTRVIsIEhLRVlfTE9DQUxfTUFDSElORSBpbiB0dXJuLiAqLworc3RhdGljIGNoYXIgKgorcmVhZF93MzJfcmVnaXN0cnlfc3RyaW5nIChjb25zdCBjaGFyICpyb290LCBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIEhLRVkgcm9vdF9rZXksIGtleV9oYW5kbGU7CisgIERXT1JEIG4xLCBuYnl0ZXMsIHR5cGU7CisgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisJCisgIGlmICggIXJvb3QgKQorICAgIHJvb3Rfa2V5ID0gSEtFWV9DVVJSRU5UX1VTRVI7CisgIGVsc2UgaWYgKCAhc3RyY21wKCByb290LCAiSEtFWV9DTEFTU0VTX1JPT1QiICkgKQorICAgIHJvb3Rfa2V5ID0gSEtFWV9DTEFTU0VTX1JPT1Q7CisgIGVsc2UgaWYgKCAhc3RyY21wKCByb290LCAiSEtFWV9DVVJSRU5UX1VTRVIiICkgKQorICAgIHJvb3Rfa2V5ID0gSEtFWV9DVVJSRU5UX1VTRVI7CisgIGVsc2UgaWYgKCAhc3RyY21wKCByb290LCAiSEtFWV9MT0NBTF9NQUNISU5FIiApICkKKyAgICByb290X2tleSA9IEhLRVlfTE9DQUxfTUFDSElORTsKKyAgZWxzZSBpZiAoICFzdHJjbXAoIHJvb3QsICJIS0VZX1VTRVJTIiApICkKKyAgICByb290X2tleSA9IEhLRVlfVVNFUlM7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoUmVnT3BlbktleUV4QSAocm9vdF9rZXksIGRpciwgMCwgS0VZX1JFQUQsICZrZXlfaGFuZGxlKSkKKyAgICB7CisgICAgICBpZiAocm9vdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIG5vIG5lZWQgZm9yIGEgUmVnQ2xvc2UsIHNvIHJldHVybiBkaXJlY3QgKi8KKyAgICAgIC8qIEl0IHNlZW1zIHRvIGJlIGNvbW1vbiBwcmFjdGlzZSB0byBmYWxsIGJhY2sgdG8gSEtMTS4gKi8KKyAgICAgIGlmIChSZWdPcGVuS2V5RXhBIChIS0VZX0xPQ0FMX01BQ0hJTkUsIGRpciwgMCwgS0VZX1JFQUQsICZrZXlfaGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIHN0aWxsIG5vIG5lZWQgZm9yIGEgUmVnQ2xvc2UsIHNvIHJldHVybiBkaXJlY3QgKi8KKyAgICB9CisKKyAgbmJ5dGVzID0gMTsKKyAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeEEgKGtleV9oYW5kbGUsIG5hbWUsIDAsIE5VTEwsIE5VTEwsICZuYnl0ZXMpKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIC8qIFRyeSB0byBmYWxsYmFjayB0byBIS0xNIGFsc28gZm9yIGEgbWlzc2luZyB2YWx1ZS4gICovCisgICAgICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgICAgICBpZiAoUmVnT3BlbktleUV4QSAoSEtFWV9MT0NBTF9NQUNISU5FLCBkaXIsIDAsIEtFWV9SRUFELCAma2V5X2hhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOyAvKiBOb3BlLiAgKi8KKyAgICAgIGlmIChSZWdRdWVyeVZhbHVlRXhBIChrZXlfaGFuZGxlLCBuYW1lLCAwLCBOVUxMLCBOVUxMLCAmbmJ5dGVzKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBuMSA9IG5ieXRlcyArIDE7CisgIHJlc3VsdCA9IG1hbGxvYyAobjEpOworICBpZiAoIXJlc3VsdCkKKyAgICBnb3RvIG91dDsKKyAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeEEgKGtleV9oYW5kbGUsIG5hbWUsIDAsICZ0eXBlLCByZXN1bHQsICZuMSkpCisgICAgeworICAgICAgZnJlZShyZXN1bHQpOworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgcmVzdWx0W25ieXRlc10gPSAwOyAvKiBNYWtlIHN1cmUgaXQgaXMgcmVhbGx5IGEgc3RyaW5nLiAgKi8KKworIG91dDoKKyAgUmVnQ2xvc2VLZXkgKGtleV9oYW5kbGUpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfaW5zdF9kaXIgKCkKK3sKKyAgcmV0dXJuIHJlYWRfdzMyX3JlZ2lzdHJ5X3N0cmluZyAoIkhLRVlfTE9DQUxfTUFDSElORSIsCisJCQkJICAiU29mdHdhcmVcXGZyZWVkZXNrdG9wXFxEQnVzIiwKKwkJCQkgICJJbnN0YWxsIERpcmVjdG9yeSIpOworfQorCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfZW52X2luX3JlZ2lzdHJ5IChjb25zdCBjaGFyICpuYW1lKQoreworICByZXR1cm4gcmVhZF93MzJfcmVnaXN0cnlfc3RyaW5nICgiSEtFWV9MT0NBTF9NQUNISU5FIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlXFxmcmVlZGVza3RvcFxcREJ1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworfQorCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfcHJvZ3JhbV9pbl9pbnN0X2RpciAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgY2hhciAqdG1wOworCisgIHRtcCA9IGZpbmRfaW5zdF9kaXIgKCk7CisgIGlmICghdG1wKQorICAgIHJldHVybiBOVUxMOworCisgIHJlc3VsdCA9IG1hbGxvYyAoc3RybGVuICh0bXApICsgNSArIHN0cmxlbiAobmFtZSkgKyAxKTsKKyAgaWYgKCFyZXN1bHQpCisgICAgeworICAgICAgZnJlZSAodG1wKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzdHJjcHkgKHN0cGNweSAoc3RwY3B5IChyZXN1bHQsIHRtcCksICJcXGJpblxcIiksIG5hbWUpOworICBmcmVlICh0bXApOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGNoYXIgKgorZmluZF9pbnN0X3N1YmRpciAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgY2hhciAqdG1wOworCisgIHRtcCA9IGZpbmRfaW5zdF9kaXIgKCk7CisgIGlmICghdG1wKQorICAgIHJldHVybiBOVUxMOworCisgIHJlc3VsdCA9IG1hbGxvYyAoc3RybGVuICh0bXApICsgMSArIHN0cmxlbiAobmFtZSkgKyAxKTsKKyAgaWYgKCFyZXN1bHQpCisgICAgeworICAgICAgZnJlZSAodG1wKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzdHJjcHkgKHN0cGNweSAoc3RwY3B5IChyZXN1bHQsIHRtcCksICJcXCIpLCBuYW1lKTsKKyAgZnJlZSAodG1wKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfbXlfZG9jdW1lbnRzX2ZvbGRlciAoKQoreworICAvKiBPbmUgZm9yIHNhZmV0eSwganVzdCBpbiBjYXNlLiAgKi8KKyAgY2hhciBkaXJbTUFYX1BBVEggKyAxXTsKKyAgY2hhciAqcmVzdWx0OworCisgIGRpclswXSA9ICdcMCc7CisgIC8qIE1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiBzdWNjZXNzZnVsLiAgKi8KKyAgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEgKDAsIGRpciwgQ1NJRExfUEVSU09OQUwsIDApOworICBpZiAoZGlyWzBdID09ICdcMCcpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0ID0gbWFsbG9jIChzdHJsZW4gKGRpcikgKyAxKTsKKyAgaWYgKCFyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIHN0cmNweSAocmVzdWx0LCBkaXIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKKyNkZWZpbmUgTUFYX0VOViAzMAorCitjaGFyICplbnZpcm9uW01BWF9FTlYgKyAxXTsKKworY2hhciAqCitnZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHN0YXRpYyBjaGFyICpwYXN0X3Jlc3VsdDsKKyAgY2hhciAqKmVudnA7CisgIGludCBpZHg7CisKKyAgaWYgKHBhc3RfcmVzdWx0KQorICAgIHsKKyAgICAgIGZyZWUgKHBhc3RfcmVzdWx0KTsKKyAgICAgIHBhc3RfcmVzdWx0ID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKCEgc3RyY21wIChuYW1lLCAiREJVU19WRVJCT1NFIikpCisgICAgcmV0dXJuIHBhc3RfcmVzdWx0ID0gZ2V0X3ZlcmJvc2Vfc2V0dGluZyAoKTsKKyAgZWxzZSBpZiAoISBzdHJjbXAgKG5hbWUsICJIT01FUEFUSCIpKQorICAgIHJldHVybiBwYXN0X3Jlc3VsdCA9IGZpbmRfbXlfZG9jdW1lbnRzX2ZvbGRlciAoKTsKKyAgZWxzZSBpZiAoISBzdHJjbXAgKG5hbWUsICJEQlVTX0RBVEFESVIiKSkKKyAgICByZXR1cm4gcGFzdF9yZXN1bHQgPSBmaW5kX2luc3Rfc3ViZGlyICgic2hhcmUiKTsKKworICBmb3IgKGVudnAgPSBlbnZpcm9uOyAqZW52cCAhPSAwOyBlbnZwKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqdmFycCA9IG5hbWU7CisgICAgICBjaGFyICplcCA9ICplbnZwOworICAgICAgaW50IHNhbWVfbmFtZSA9IDA7CisKKyAgICAgIHdoaWxlICgqdmFycCA9PSAqZXAgJiYgKnZhcnAgIT0gJ1wwJykKKwl7CisJICArK2VwOworCSAgKyt2YXJwOworCX07CisKKyAgICAgIGlmICgqdmFycCA9PSAnXDAnICYmICplcCA9PSAnPScpCisJcmV0dXJuIGVwICsgMTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworaW50CitwdXRlbnYgKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqKmVudnA7CisgIGludCBpZHg7CisgIGZvciAoZW52cCA9IGVudmlyb247ICplbnZwICE9IDA7IGVudnArKykKKyAgICB7CisgICAgICBjaGFyICp2YXJwID0gc3RyOworICAgICAgY2hhciAqZXAgPSAqZW52cDsKKyAgICAgIGludCBzYW1lX25hbWUgPSAwOworCisgICAgICB3aGlsZSAoKnZhcnAgPT0gKmVwICYmICp2YXJwICE9ICdcMCcpCisJeworCSAgaWYgKCp2YXJwID09ICc9JykKKwkgICAgc2FtZV9uYW1lID0gMTsKKwkgICsrZXA7CisJICArK3ZhcnA7CisJfTsKKworICAgICAgaWYgKCp2YXJwID09ICplcCAmJiAqdmFycCA9PSAnXDAnKQorCXJldHVybiAwOworICAgICAgaWYgKHNhbWVfbmFtZSkKKwl7CisJICAqZW52cCA9IHN0cjsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgaWR4ID0gZW52cCAtIGVudmlyb247CisgIGlmIChpZHggPiBNQVhfRU5WKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl9zZXRfZXJybm8gKEVOT01FTSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGVudmlyb25baWR4XSA9IHN0cjsKKyAgcmV0dXJuIDA7Cit9CisKKworY2xvY2tfdAorY2xvY2sgKHZvaWQpCit7CisgIHJldHVybiBHZXRUaWNrQ291bnQgKCk7Cit9CisKKwordm9pZAorYWJvcnQgKHZvaWQpCit7CisgIC8qIFRoaXMgaXMgd2hhdCB3aW5kb3dzIGRvZXMuICAqLworICBleGl0ICgzKTsKK30KKworCit2b2lkCitHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSAoTFBGSUxFVElNRSBmdHApCit7CisgIFNZU1RFTVRJTUUgc3Q7CisgIEdldFN5c3RlbVRpbWUgKCZzdCk7CisgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lICgmc3QsIGZ0cCk7Cit9CisKKwordW5zaWduZWQgY2hhcioKK19tYnNyY2hyIChjb25zdCB1bnNpZ25lZCBjaGFyKiBzdHIsIHVuc2lnbmVkIGludCBjaCkKK3sKKyAgLyogRklYTUUuICBUaGlzIGlzIG5vdCBtdWx0aS1ieXRlIHNhZmUuICAqLworICByZXR1cm4gc3RycmNociAoc3RyLCBjaCk7Cit9CisKKworSEFORExFIE9wZW5GaWxlTWFwcGluZ0EoRFdPUkQgZHdEZXNpcmVkQWNjZXNzLAorCQkJQk9PTCBiSW5oZXJpdEhhbmRsZSwKKwkJCUxQQ1NUUiBscE5hbWUpCit7CisgIERXT1JEIGZsUHJvdGVjdCA9IDA7CisgIEhBTkRMRSBoTWFwcGluZzsKKworICBpZiAoZHdEZXNpcmVkQWNjZXNzICYgRklMRV9NQVBfUkVBRCkKKyAgICBmbFByb3RlY3QgfD0gUEFHRV9SRUFET05MWTsKKworICBpZiAoZHdEZXNpcmVkQWNjZXNzICYgRklMRV9NQVBfV1JJVEUpCisgICAgZmxQcm90ZWN0IHw9IFBBR0VfUkVBRFdSSVRFOworCisgIFNldExhc3RFcnJvciAoMCk7CisgIGhNYXBwaW5nID0gQ3JlYXRlRmlsZU1hcHBpbmdBKElOVkFMSURfSEFORExFX1ZBTFVFLAorCQkJCU5VTEwsIGZsUHJvdGVjdCwgMCwgMCwgbHBOYW1lKTsKKyAgaWYgKGhNYXBwaW5nICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIC8qIEp1c3QgaW4gY2FzZSBXaW5kb3dzIENFIGNoYW5nZXMgaXRzIGJlaGF2aW91ciwgd2UgY2hlY2sgZm9yCisgICAgICAgICB0aGUgcmlnaHQgZXJyb3IgdmFsdWUgaGVyZS4gICovCisgICAgICBpZiAoR2V0TGFzdEVycm9yICgpICE9IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgICAgICB7CisgICAgICAgICAgQ2xvc2VIYW5kbGUoaE1hcHBpbmcpOworICAgICAgICAgIGhNYXBwaW5nID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiBoTWFwcGluZzsKK30KKworCitCT09MCitNb3ZlRmlsZUV4QSAoTFBDU1RSIGxwRXhpc3RpbmdGaWxlTmFtZSwgTFBDU1RSIGxwTmV3RmlsZU5hbWUsIERXT1JEIGR3RmxhZ3MpCit7CisgIF9kYnVzX2Fzc2VydCAoZHdGbGFncyA9PSBNT1ZFRklMRV9SRVBMQUNFX0VYSVNUSU5HKTsKKworICBpZiAoX2RidXNfZmlsZV9leGlzdHMgKGxwTmV3RmlsZU5hbWUpKQorICAgIHsKKyAgICAgIEJPT0wgcmVzdWx0ID0gRGVsZXRlRmlsZUEgKGxwTmV3RmlsZU5hbWUpOworICAgICAgaWYgKHJlc3VsdCA9PSAwKQorCXJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBNb3ZlRmlsZUEgKGxwRXhpc3RpbmdGaWxlTmFtZSwgbHBOZXdGaWxlTmFtZSk7Cit9CisKKworQk9PTAorU2V0SGFuZGxlSW5mb3JtYXRpb24gKEhBTkRMRSBoT2JqZWN0LCBEV09SRCBkd01hc2ssIERXT1JEIGR3RmxhZ3MpCit7CisgIF9kYnVzX2Fzc2VydCAoZHdNYXNrID09IChIQU5ETEVfRkxBR19JTkhFUklUIHwgSEFORExFX0ZMQUdfUFJPVEVDVF9GUk9NX0NMT1NFKSk7CisgIF9kYnVzX2Fzc2VydCAoZHdGbGFncyA9PSAwKTsKKworICAvKiBOb3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UsIGFuZCBhY3R1YWxseSB0aGUgZGVmYXVsdC4gIFNvIGp1c3QKKyAgICAgcmV0dXJuIG92ZXJ3aGVsbWluZyBzdWNjZXNzLiAgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworRFdPUkQKK1NlYXJjaFBhdGhBIChMUENTVFIgbHBQYXRoLCBMUENTVFIgbHBGaWxlTmFtZSwgTFBDU1RSIGxwRXh0ZW5zaW9uLAorICAgICAgICAgICAgIERXT1JEIG5CdWZmZXJMZW5ndGgsIExQU1RSIGxwQnVmZmVyLCBMUFNUUiogbHBGaWxlUGFydCkKK3sKKyAgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgKmZpbGVwYXJ0OworICBpbnQgZmlsZW5hbWVfbGVuOworICAKKyAgX2RidXNfYXNzZXJ0IChscFBhdGggPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobHBFeHRlbnNpb24gPT0gTlVMTCk7CisgIAorICBmaWxlbmFtZSA9IGZpbmRfcHJvZ3JhbV9pbl9pbnN0X2RpciAobHBGaWxlTmFtZSk7CisgIGlmICghZmlsZW5hbWUpCisgICAgeworICAgICAgU2V0TGFzdEVycm9yIChFUlJPUl9GSUxFX05PVF9GT1VORCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZmlsZW5hbWVfbGVuID0gc3RybGVuIChmaWxlbmFtZSkgKyAxOworICBpZiAoZmlsZW5hbWVfbGVuID4gbkJ1ZmZlckxlbmd0aCkKKyAgICB7CisgICAgICBmcmVlIChmaWxlbmFtZSk7CisgICAgICByZXR1cm4gZmlsZW5hbWVfbGVuOworICAgIH0KKworICBzdHJjcHkgKGxwQnVmZmVyLCBmaWxlbmFtZSk7CisgIGZyZWUgKGZpbGVuYW1lKTsKKworICBmaWxlcGFydCA9IF9tYnNyY2hyIChscEJ1ZmZlciwgJ1xcJyk7CisgIGlmICghZmlsZXBhcnQpCisgICAgZmlsZXBhcnQgPSBscEJ1ZmZlcjsKKyAgKmxwRmlsZVBhcnQgPSBmaWxlcGFydDsKKworICByZXR1cm4gZmlsZW5hbWVfbGVuIC0gMTsKK30KKworCisvKiogR2V0cyBvdXIgU0lECisgKiBAcGFyYW0gcG9pbnRzIHRvIHNpZCBidWZmZXIsIG5lZWQgdG8gYmUgZnJlZWQgd2l0aCBMb2NhbEZyZWUoKQorICogQHJldHVybnMgcHJvY2VzcyBzaWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldHNpZChjaGFyICoqc2lkKQoreworICAvKiBUaGVyZSBpcyBub3RoaW5nIGxpa2UgdGhpcyBvbiBXaW5kb3dzIENFLCBzbyB3ZSBmYWtlIGl0LiAgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgYXNpZFtdID0gIlMtMS01LTIxLTUxNTk2Nzg5OS05MjAwMjYyNjYtMTcwODUzNzc2OC0xMDAwIjsKKyAgY2hhciAqYnVmID0gTG9jYWxBbGxvYyAoTE1FTV9GSVhFRCwgc2l6ZW9mIChhc2lkKSk7CisgIGlmICghYnVmKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoIkxvY2FsQWxsb2MgZmFpbGVkIiwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbWVtY3B5IChidWYsIGFzaWQsIHNpemVvZiAoYXNpZCkpOworICAqc2lkID0gYnVmOworICByZXR1cm4gVFJVRTsKK30KKworCitCT09MCitMb29rdXBBY2NvdW50TmFtZVcgKExQQ1dTVFIgbHBTeXN0ZW1OYW1lLCBMUENXU1RSIGxwQWNjb3VudE5hbWUsIFBTSUQgU2lkLCBQRFdPUkQgY2JTaWQsCisgICAgICAgICAgICAgICAgICAgIExQV1NUUiBSZWZlcmVuY2VkRG9tYWluTmFtZSwgUERXT1JEIGNjaFJlZmVyZW5jZWREb21haW5OYW1lLCBQU0lEX05BTUVfVVNFIHBlVXNlKQoreworICAvKiBDdXJyZW50bHkgbm90IG5lZWRlZC4gICovCisgIHJldHVybiBGQUxTRTsKK30KKworCitCT09MCitJc1ZhbGlkU2lkIChQU0lEIHBzaWQpCit7CisgIC8qIEN1cnJlbnRseSBub3QgbmVlZGVkLiAgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCisKK0hBTkRMRQorQ3JlYXRlRmlsZUEgKExQQ1NUUiBscEZpbGVOYW1lLCBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsIERXT1JEIGR3U2hhcmVkTW9kZSwKKwkgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlcywKKwkgICAgIERXT1JEIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgRFdPUkQgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsCisJICAgICBIQU5ETEUgaFRlbXBsYXRlRmlsZSkKK3sKKyAgd2NoYXJfdCAqZmlsZW5hbWU7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghZmlsZW5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIHJlc3VsdCA9IENyZWF0ZUZpbGVXIChmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlZE1vZGUsCisJCQlscFNlY3VyaXR5QXR0cmlidXRlcywgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLAorCQkJZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIGhUZW1wbGF0ZUZpbGUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitEZWxldGVGaWxlQSAoTFBDU1RSIGxwRmlsZU5hbWUpCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBmaWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVzdWx0ID0gRGVsZXRlRmlsZVcgKGZpbGVuYW1lKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoZmlsZW5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworQk9PTAorTW92ZUZpbGVBIChMUENTVFIgbHBFeGlzdGluZ0ZpbGVOYW1lLCBMUENTVFIgbHBOZXdGaWxlTmFtZSkKK3sKKyAgd2NoYXJfdCAqZXhpc3RpbmdfZmlsZW5hbWU7CisgIHdjaGFyX3QgKm5ld19maWxlbmFtZTsKKyAgQk9PTCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZXhpc3RpbmdfZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBFeGlzdGluZ0ZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCEgZXhpc3RpbmdfZmlsZW5hbWUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG5ld19maWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscE5ld0ZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCEgbmV3X2ZpbGVuYW1lKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZXhpc3RpbmdfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXN1bHQgPSBNb3ZlRmlsZVcgKGV4aXN0aW5nX2ZpbGVuYW1lLCBuZXdfZmlsZW5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChleGlzdGluZ19maWxlbmFtZSk7CisgIGRidXNfZnJlZSAobmV3X2ZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0RXT1JECitHZXRGaWxlQXR0cmlidXRlc0EoTFBDU1RSIGxwRmlsZU5hbWUpCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lOworICBEV09SRCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghZmlsZW5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfRklMRV9BVFRSSUJVVEVTOworCisgIHJlc3VsdCA9IEdldEZpbGVBdHRyaWJ1dGVzVyAoZmlsZW5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitHZXRGaWxlQXR0cmlidXRlc0V4QSAoTFBDU1RSIGxwRmlsZU5hbWUsIEdFVF9GSUxFRVhfSU5GT19MRVZFTFMgZkluZm9MZXZlbElkLAorICAgICAgICAgICAgICAgICAgICAgIFBWT0lEIGxwRmlsZUluZm9ybWF0aW9uKQoreworICB3Y2hhcl90ICpmaWxlbmFtZTsKKyAgRFdPUkQgcmVzdWx0OworICBpbnQgZXJyOworCisgIGZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwRmlsZU5hbWUsIE5VTEwpOworICBpZiAoIWZpbGVuYW1lKQorICAgIHJldHVybiBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUzsKKworICByZXN1bHQgPSBHZXRGaWxlQXR0cmlidXRlc0V4VyAoZmlsZW5hbWUsIGZJbmZvTGV2ZWxJZCwgbHBGaWxlSW5mb3JtYXRpb24pOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitIQU5ETEUKK0NyZWF0ZUZpbGVNYXBwaW5nQSAoSEFORExFIGhGaWxlLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBBdHRyaWJ1dGVzLAorCQkgICAgRFdPUkQgZmxQcm90ZWN0LCBEV09SRCBkd01heGltdW1TaXplSGlnaCwKKwkJICAgIERXT1JEIGR3TWF4aW11bVNpemVMb3csIExQQ1NUUiBscE5hbWUpCit7CisgIHdjaGFyX3QgKm5hbWU7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgaWYgKGxwTmFtZSkKKyAgICB7CisgICAgICBuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIW5hbWUpCisJcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KKyAgZWxzZQorICAgIG5hbWUgPSBOVUxMOworCisgIHJlc3VsdCA9IENyZWF0ZUZpbGVNYXBwaW5nVyAoaEZpbGUsIGxwQXR0cmlidXRlcywgZmxQcm90ZWN0LAorCQkJICAgICAgIGR3TWF4aW11bVNpemVIaWdoLCBkd01heGltdW1TaXplTG93LAorCQkJICAgICAgIG5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0NyZWF0ZURpcmVjdG9yeUEgKExQQ1NUUiBscFBhdGhOYW1lLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXMpCit7CisgIHdjaGFyX3QgKnBhdGhuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBwYXRobmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFBhdGhOYW1lLCBOVUxMKTsKKyAgaWYgKCFwYXRobmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5VyAocGF0aG5hbWUsIGxwU2VjdXJpdHlBdHRyaWJ1dGVzKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAocGF0aG5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworQk9PTAorUmVtb3ZlRGlyZWN0b3J5QSAoTFBDU1RSIGxwUGF0aE5hbWUpCit7CisgIHdjaGFyX3QgKnBhdGhuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBwYXRobmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFBhdGhOYW1lLCBOVUxMKTsKKyAgaWYgKCFwYXRobmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVzdWx0ID0gUmVtb3ZlRGlyZWN0b3J5VyAocGF0aG5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChwYXRobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgQk9PTAorY29udmVydF9maW5kX2RhdGEgKExQV0lOMzJfRklORF9EQVRBVyBmZHcsIExQV0lOMzJfRklORF9EQVRBQSBmZGEpCit7CisgIGNoYXIgKmZpbGVuYW1lOworICBpbnQgbGVuOworCisgIGZkYS0+ZHdGaWxlQXR0cmlidXRlcyA9IGZkdy0+ZHdGaWxlQXR0cmlidXRlczsKKyAgZmRhLT5mdENyZWF0aW9uVGltZSA9IGZkdy0+ZnRDcmVhdGlvblRpbWU7CisgIGZkYS0+ZnRMYXN0QWNjZXNzVGltZSA9IGZkdy0+ZnRMYXN0QWNjZXNzVGltZTsKKyAgZmRhLT5mdExhc3RXcml0ZVRpbWUgPSBmZHctPmZ0TGFzdFdyaXRlVGltZTsKKyAgZmRhLT5uRmlsZVNpemVIaWdoID0gZmR3LT5uRmlsZVNpemVIaWdoOworICBmZGEtPm5GaWxlU2l6ZUxvdyA9IGZkdy0+bkZpbGVTaXplTG93OworCisgIGZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGZkdy0+Y0ZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGVuID0gc2l6ZW9mIChmZGEtPmNGaWxlTmFtZSk7CisgIHN0cm5jcHkgKGZkYS0+Y0ZpbGVOYW1lLCBmaWxlbmFtZSwgbGVuKTsKKyAgZmRhLT5jRmlsZU5hbWVbbGVuIC0gMV0gPSAnXDAnOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworSEFORExFCitGaW5kRmlyc3RGaWxlQSAoTFBDU1RSIGxwRmlsZU5hbWUsIExQV0lOMzJfRklORF9EQVRBQSBscEZpbmRGaWxlRGF0YSkKK3sKKyAgd2NoYXJfdCAqcGF0aG5hbWU7CisgIFdJTjMyX0ZJTkRfREFUQVcgZmluZF9maWxlX2RhdGE7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgcGF0aG5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghcGF0aG5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCisgIHJlc3VsdCA9IEZpbmRGaXJzdEZpbGVXIChwYXRobmFtZSwgJmZpbmRfZmlsZV9kYXRhKTsKKyAgaWYgKHJlc3VsdCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBCT09MIHJlcyA9IGNvbnZlcnRfZmluZF9kYXRhICgmZmluZF9maWxlX2RhdGEsIGxwRmluZEZpbGVEYXRhKTsKKyAgICAgIGlmICghIHJlcykKKyAgICAgICAgeworICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgICAgICAgICBGaW5kQ2xvc2UgKHJlc3VsdCk7CisgICAgICAgICAgU2V0TGFzdEVycm9yIChlcnIpOworICAgICAgICAgIHJlc3VsdCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChwYXRobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitGaW5kTmV4dEZpbGVBIChIQU5ETEUgaEZpbmRGaWxlLCBMUFdJTjMyX0ZJTkRfREFUQUEgbHBGaW5kRmlsZURhdGEpCit7CisgIFdJTjMyX0ZJTkRfREFUQVcgZmluZF9maWxlX2RhdGE7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIHJlc3VsdCA9IEZpbmROZXh0RmlsZVcgKGhGaW5kRmlsZSwgJmZpbmRfZmlsZV9kYXRhKTsKKyAgaWYgKHJlc3VsdCkKKyAgICByZXN1bHQgPSBjb252ZXJ0X2ZpbmRfZGF0YSAoJmZpbmRfZmlsZV9kYXRhLCBscEZpbmRGaWxlRGF0YSk7CisKKyAgcmV0dXJuIHJlc3VsdDsgIAorfQorCisKK0hBTkRMRQorQ3JlYXRlTXV0ZXhBIChMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBNdXRleEF0dHJpYnV0ZXMsIEJPT0wgYkluaXRpYWxPd25lciwKKwkgICAgICBMUENTVFIgbHBOYW1lKQoreworICB3Y2hhcl90ICpuYW1lOworICBIQU5ETEUgcmVzdWx0OworICBpbnQgZXJyOworCisgIGlmIChscE5hbWUpCisgICAgeworICAgICAgbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscE5hbWUsIE5VTEwpOworICAgICAgaWYgKCFuYW1lKQorCXJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CisgIGVsc2UKKyAgICBuYW1lID0gTlVMTDsKKworICByZXN1bHQgPSBDcmVhdGVNdXRleFcgKGxwTXV0ZXhBdHRyaWJ1dGVzLCBiSW5pdGlhbE93bmVyLCBuYW1lKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitDcmVhdGVQcm9jZXNzQSAoTFBDU1RSIHBzekltYWdlTmFtZSwgTFBTVFIgcHN6Q21kTGluZSwKKyAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhUHJvY2VzcywKKyAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhVGhyZWFkLCBCT09MIGZJbmhlcml0SGFuZGxlcywKKyAgICAgICAgICAgICAgICBEV09SRCBmZHdDcmVhdGUsIFBWT0lEIHB2RW52aXJvbm1lbnQsIExQQ1NUUiBwc3pDdXJEaXIsCisgICAgICAgICAgICAgICAgTFBTVEFSVFVQSU5GT0EgcHNpU3RhcnRJbmZvLAorICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBwUHJvY0luZm8pCit7CisgIHdjaGFyX3QgKmltYWdlX25hbWUgPSBOVUxMOworICB3Y2hhcl90ICpjbWRfbGluZSA9IE5VTEw7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIF9kYnVzX2Fzc2VydCAocHNhUHJvY2VzcyA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwc2FUaHJlYWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZkluaGVyaXRIYW5kbGVzID09IEZBTFNFKTsKKyAgX2RidXNfYXNzZXJ0IChwdkVudmlyb25tZW50ID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBzekN1ckRpciA9PSBOVUxMKTsKKyAgLyogcHNpU3RhcnRJbmZvIGlzIGdlbmVyYWxseSBub3QgTlVMTC4gICovCisKKyAgaWYgKHBzekltYWdlTmFtZSkKKyAgICB7CisgICAgICBpbWFnZV9uYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKHBzekltYWdlTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIWltYWdlX25hbWUpCisJcmV0dXJuIDA7CisgICAgfQorICBpZiAocHN6Q21kTGluZSkKKyAgICB7CisgICAgICBjbWRfbGluZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChwc3pDbWRMaW5lLCBOVUxMKTsKKyAgICAgIGlmICghY21kX2xpbmUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaW1hZ2VfbmFtZSkKKyAgICAgICAgICAgIGRidXNfZnJlZSAoaW1hZ2VfbmFtZSk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmVzdWx0ID0gQ3JlYXRlUHJvY2Vzc1cgKGltYWdlX25hbWUsIGNtZF9saW5lLCBOVUxMLCBOVUxMLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkd0NyZWF0ZSwgTlVMTCwgTlVMTCwgTlVMTCwgcFByb2NJbmZvKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoaW1hZ2VfbmFtZSk7CisgIGRidXNfZnJlZSAoY21kX2xpbmUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworTE9ORworUmVnT3BlbktleUV4QSAoSEtFWSBoS2V5LCBMUENTVFIgbHBTdWJLZXksIERXT1JEIHVsT3B0aW9ucywKKyAgICAgICAgICAgICAgIFJFR1NBTSBzYW1EZXNpcmVkLCBQSEtFWSBwaGtSZXN1bHQpCit7CisgIHdjaGFyX3QgKnN1YmtleTsKKyAgTE9ORyByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgaWYgKGxwU3ViS2V5KQorICAgIHsKKyAgICAgIHN1YmtleSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFN1YktleSwgTlVMTCk7CisgICAgICBpZiAoIXN1YmtleSkKKwlyZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICBzdWJrZXkgPSBOVUxMOworCisgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeCAoaEtleSwgc3Via2V5LCB1bE9wdGlvbnMsIHNhbURlc2lyZWQsIHBoa1Jlc3VsdCk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHN1YmtleSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitMT05HCitSZWdRdWVyeVZhbHVlRXhBIChIS0VZIGhLZXksIExQQ1NUUiBscFZhbHVlTmFtZSwgTFBEV09SRCBscFJlc2VydmVkLAorICAgICAgICAgICAgICAgICAgTFBEV09SRCBscFR5cGUsIExQQllURSBscERhdGEsIExQRFdPUkQgbHBjYkRhdGEpCit7CisgIHdjaGFyX3QgKm5hbWU7CisgIExPTkcgZXJyOworICBCWVRFICpkYXRhOworICBEV09SRCBkYXRhX2xlbjsKKyAgRFdPUkQgdHlwZTsKKworICBpZiAobHBWYWx1ZU5hbWUpCisgICAgeworICAgICAgbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscFZhbHVlTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIW5hbWUpCisJcmV0dXJuIEdldExhc3RFcnJvciAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBuYW1lID0gTlVMTDsKKworICBkYXRhX2xlbiA9IDA7CisgIGVyciA9IFJlZ1F1ZXJ5VmFsdWVFeFcgKGhLZXksIG5hbWUsIGxwUmVzZXJ2ZWQsIGxwVHlwZSwgTlVMTCwgJmRhdGFfbGVuKTsKKyAgaWYgKGVyciB8fCAhbHBjYkRhdGEpCisgICAgeworICAgICAgZGJ1c19mcmVlIChuYW1lKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgIGRhdGEgPSBtYWxsb2MgKGRhdGFfbGVuICsgc2l6ZW9mICh3Y2hhcl90KSk7CisgIGlmICghZGF0YSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG5hbWUpOworICAgICAgcmV0dXJuIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgIH0KKyAgCisgIGVyciA9IFJlZ1F1ZXJ5VmFsdWVFeFcgKGhLZXksIG5hbWUsIGxwUmVzZXJ2ZWQsICZ0eXBlLCBkYXRhLCAmZGF0YV9sZW4pOworICBpZiAobHBUeXBlKQorICAgICpscFR5cGUgPSB0eXBlOworICBkYnVzX2ZyZWUgKG5hbWUpOworICAvKiBJZiBlcnIgaXMgRVJST1JfTU9SRV9EQVRBLCB0aGVyZSBwcm9iYWJseSB3YXMgYSByYWNlIGNvbmRpdGlvbi4KKyAgICAgV2UgY2FuIHB1bnQgdGhpcyB0byB0aGUgY2FsbGVyIGp1c3QgYXMgd2VsbC4gICovCisgIGlmIChlcnIpCisgICAgeworICAgICAgZnJlZSAoZGF0YSk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAvKiBOT1RFOiBSRUdfTVVMVElfU1ogYW5kIFJFR19FWFBBTkRfU1ogbm90IHN1cHBvcnRlZCwgYmVjYXVzZSB0aGV5CisgICAgIGFyZSBub3QgbmVlZGVkIGluIHRoaXMgbW9kdWxlLiAgKi8KKyAgaWYgKHR5cGUgPT0gUkVHX1NaKQorICAgIHsKKyAgICAgIGNoYXIgKmRhdGFfYzsKKyAgICAgIGludCBkYXRhX2NfbGVuOworCisgICAgICAvKiBUaGlzIGlzIHZhbGlkIHNpbmNlIHdlIGFsbG9jYXRlZCBvbmUgbW9yZSBhYm92ZS4gICovCisgICAgICBkYXRhW2RhdGFfbGVuXSA9ICdcMCc7CisgICAgICBkYXRhW2RhdGFfbGVuICsgMV0gPSAnXDAnOworCisgICAgICAvKiBUaGUgY2FzdCBpcyB2YWxpZCBiZWNhdXNlIG1hbGxvYyBndWFyYW50ZWVzIGFsaWdubWVudCBvZgorICAgICAgICAgYmFzaWMgdHlwZXMuICAqLworICAgICAgZGF0YV9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKCh3Y2hhcl90KikgZGF0YSwgTlVMTCk7CisgICAgICBpZiAoIWRhdGFfYykKKyAgICAgICAgeworICAgICAgICAgIGZyZWUgKGRhdGEpOworICAgICAgICAgIHJldHVybiBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgfQorCisgICAgICBkYXRhX2NfbGVuID0gc3RybGVuIChkYXRhX2MpICsgMTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YV9jX2xlbiA8PSBkYXRhX2xlbiArIHNpemVvZiAod2NoYXJfdCkpOworICAgICAgbWVtY3B5IChkYXRhLCBkYXRhX2MsIGRhdGFfY19sZW4pOworICAgICAgZGF0YV9sZW4gPSBkYXRhX2NfbGVuOworICAgICAgZGJ1c19mcmVlIChkYXRhX2MpOworICAgIH0KKworICAvKiBEQVRBIGFuZCBEQVRBX0xFTiBub3cgY29udGFpbiB0aGUgcmVzdWx0LiAgKi8KKyAgaWYgKGxwRGF0YSkKKyAgICB7CisgICAgICBpZiAoZGF0YV9sZW4gPiAqbHBjYkRhdGEpCisgICAgICAgIGVyciA9IEVSUk9SX01PUkVfREFUQTsKKyAgICAgIGVsc2UKKyAgICAgICAgbWVtY3B5IChscERhdGEsIGRhdGEsIGRhdGFfbGVuKTsKKyAgICB9CisgIGZyZWUgKGRhdGEpOworICAqbHBjYkRhdGEgPSBkYXRhX2xlbjsKKyAgcmV0dXJuIGVycjsKK30KKworCitEV09SRAorRm9ybWF0TWVzc2FnZUEgKERXT1JEIGR3RmxhZ3MsIFBDVk9JRCBscFNvdXJjZSwgRFdPUkQgZHdNZXNzYWdlSWQsCisJCURXT1JEIGR3TGFuZ3VhZ2VJZCwgTFBTVFIgbHBCdWZmZXIsIERXT1JEIG5TaXplLAorCQl2YV9saXN0KiBBcmd1bWVudHMpCit7CisgIExQV1NUUiBidWZmZXJfdyA9IE5VTEw7CisgIExQU1RSIGJ1ZmZlcl9jOworICBEV09SRCBsZW47CisgIGNoYXIgKmJ1ZmZlcl9uZXc7CisgIERXT1JEIGJ1ZmZlcl9uZXdfbGVuOworICBCT09MIGJ1ZmZlcl93X2ZyZWU7CisKKyAgbGVuID0gRm9ybWF0TWVzc2FnZVcgKGR3RmxhZ3MgfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCisJCQlscFNvdXJjZSwgZHdNZXNzYWdlSWQsIGR3TGFuZ3VhZ2VJZCwKKwkJCShMUFdTVFIpICZidWZmZXJfdywgMCwgQXJndW1lbnRzKTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiAwOworCisgIGJ1ZmZlcl9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGJ1ZmZlcl93LCBOVUxMKTsKKyAgaWYgKCEgYnVmZmVyX2MpCisgICAgeworICAgICAgTG9jYWxGcmVlIChidWZmZXJfdyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byByZXR1cm4gYSBidWZmZXIgdGhhdCdzIGZyZWVhYmxlIHdpdGggTG9jYWxGcmVlLiAgKi8KKyAgICAgIGJ1ZmZlcl9uZXcgPSAoY2hhciAqKSBidWZmZXJfdzsKKyAgICAgIGJ1ZmZlcl9uZXdfbGVuID0gc2l6ZW9mICh3Y2hhcl90KSAqIChsZW4gKyAxKTsKKyAgICAgIGJ1ZmZlcl93X2ZyZWUgPSBGQUxTRTsKKyAgICAgIC8qIEF2b2lkIGFsaWdubWVudCBpc3N1ZSBieSB1c2luZyBtZW1jcHkuICAqLworICAgICAgbWVtY3B5IChscEJ1ZmZlciwgJmJ1ZmZlcl9uZXcsIHNpemVvZiAoYnVmZmVyX25ldykpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1ZmZlcl9uZXcgPSBscEJ1ZmZlcjsKKyAgICAgIGJ1ZmZlcl9uZXdfbGVuID0gblNpemU7CisgICAgICBidWZmZXJfd19mcmVlID0gVFJVRTsKKyAgICB9CisKKyAgc3RybmNweSAoYnVmZmVyX25ldywgYnVmZmVyX2MsIGJ1ZmZlcl9uZXdfbGVuKTsKKyAgZGJ1c19mcmVlIChidWZmZXJfYyk7CisgIGJ1ZmZlcl9uZXdbYnVmZmVyX25ld19sZW4gLSAxXSA9ICdcMCc7CisgIGlmIChidWZmZXJfd19mcmVlKQorICAgIExvY2FsRnJlZSAoYnVmZmVyX3cpOworCisgIC8qIHN0cmxlbiBpcyBjb3JyZWN0IChub3QgX21ic3RybGVuKSwgYmVjYXVzZSB3ZSB3YW50IHN0b3JhZ2UgYW5kCisgICAgIG5vdCBzdHJpbmcgbGVuZ3RoLiAgKi8KKyAgcmV0dXJuIHN0cmxlbiAoYnVmZmVyX25ldyk7Cit9CisKKworRFdPUkQKK0dldE1vZHVsZUZpbGVOYW1lQSAoSElOU1RBTkNFIGhNb2R1bGUsIExQU1RSIGxwRmlsZW5hbWUsIERXT1JEIG5TaXplKQoreworICB3Y2hhcl90ICpmaWxlbmFtZV93OworICBjaGFyICpmaWxlbmFtZV9jOworICBEV09SRCBsZW47CisKKyAgaWYgKG5TaXplID09IDApCisgICAgeworICAgICAgLyogV2luZG93cyBYUC8yMDAwLiAgKi8KKyAgICAgIFNldExhc3RFcnJvciAoMCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZmlsZW5hbWVfdyA9IG1hbGxvYyAoc2l6ZW9mICh3Y2hhcl90KSAqIG5TaXplKTsKKyAgaWYgKCEgZmlsZW5hbWVfdykKKyAgICByZXR1cm4gMDsKKworICBsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZVcgKGhNb2R1bGUsIGZpbGVuYW1lX3csIG5TaXplKTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHsKKyAgICAgIC8qIE5vdGU6IElmIHdlIGZhaWwgd2l0aCBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSLCB0aGlzIGlzIHN0aWxsCisgICAgICAgKGFwcHJveGltYXRlbHkpIGNvcnJlY3QuICAqLworICAgICAgZnJlZSAoZmlsZW5hbWVfdyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZmlsZW5hbWVfd1tuU2l6ZSAtIDFdID0gJ1wwJzsKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3dpbl91dGYxNl90b191dGY4IChmaWxlbmFtZV93LCBOVUxMKTsKKyAgZnJlZSAoZmlsZW5hbWVfdyk7CisgIGlmICghIGZpbGVuYW1lX2MpCisgICAgcmV0dXJuIDA7CisKKyAgc3RybmNweSAobHBGaWxlbmFtZSwgZmlsZW5hbWVfYywgblNpemUpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lX2MpOworICBscEZpbGVuYW1lW25TaXplIC0gMV0gPSAnXDAnOworICAvKiBzdHJsZW4gaXMgY29ycmVjdCAobm90IF9tYnN0cmxlbiksIGJlY2F1c2Ugd2Ugd2FudCBzdG9yYWdlIGFuZAorICAgICBub3Qgc3RyaW5nIGxlbmd0aC4gICovCisgIHJldHVybiBzdHJsZW4gKGxwRmlsZW5hbWUpOworfQorCisKK0RXT1JECitHZXRUZW1wUGF0aEEgKERXT1JEIG5CdWZmZXJMZW5ndGgsIExQU1RSIGxwQnVmZmVyKQoreworICB3Y2hhcl90IGR1bW15WzFdOworICBEV09SRCBsZW47CisKKyAgbGVuID0gR2V0VGVtcFBhdGhXICgwLCBkdW1teSk7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSBNQVhfUEFUSCk7CisKKyAgLyogQmV0dGVyIGJlIHNhZmUgdGhhbiBzb3JyeS4gIE1TRE4gZG9lc24ndCBzYXkgaWYgbGVuIGlzIHdpdGggb3IKKyAgICAgd2l0aG91dCB0ZXJtaW5hdGluZyAwLiAgKi8KKyAgbGVuKys7CisKKyAgeworICAgIHdjaGFyX3QgKmJ1ZmZlcl93OworICAgIERXT1JEIGxlbl93OworICAgIGNoYXIgKmJ1ZmZlcl9jOworICAgIERXT1JEIGxlbl9jOworCisgICAgYnVmZmVyX3cgPSBtYWxsb2MgKHNpemVvZiAod2NoYXJfdCkgKiBsZW4pOworICAgIGlmICghIGJ1ZmZlcl93KQorICAgICAgcmV0dXJuIDA7CisKKyAgICBsZW5fdyA9IEdldFRlbXBQYXRoVyAobGVuLCBidWZmZXJfdyk7CisgICAgLyogR2l2ZSB1cCBpZiB3ZSBzdGlsbCBjYW4ndCBnZXQgYXQgaXQuICAqLworICAgIGlmIChsZW5fdyA9PSAwIHx8IGxlbl93ID49IGxlbikKKyAgICAgIHsKKyAgICAgICAgZnJlZSAoYnVmZmVyX3cpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgIC8qIEJldHRlciBiZSByZWFsbHkgc2FmZS4gICovCisgICAgYnVmZmVyX3dbbGVuX3ddID0gJ1wwJzsKKworICAgIGJ1ZmZlcl9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGJ1ZmZlcl93LCBOVUxMKTsKKyAgICBmcmVlIChidWZmZXJfdyk7CisgICAgaWYgKCEgYnVmZmVyX2MpCisgICAgICByZXR1cm4gMDsKKworICAgIC8qIHN0cmxlbiBpcyBjb3JyZWN0IChub3QgX21ic3RybGVuKSwgYmVjYXVzZSB3ZSB3YW50IHN0b3JhZ2UgYW5kCisgICAgICAgbm90IHN0cmluZyBsZW5ndGguICAqLworICAgIGxlbl9jID0gc3RybGVuIChidWZmZXJfYykgKyAxOworICAgIGlmIChsZW5fYyA+IG5CdWZmZXJMZW5ndGgpCisgICAgICByZXR1cm4gbGVuX2M7CisKKyAgICBzdHJjcHkgKGxwQnVmZmVyLCBidWZmZXJfYyk7CisgICAgZGJ1c19mcmVlIChidWZmZXJfYyk7CisgICAgcmV0dXJuIGxlbl9jIC0gMTsKKyAgfQorfQorCisKK0JPT0wKK1NIR2V0U3BlY2lhbEZvbGRlclBhdGhBIChIV05EIGh3bmRPd25lciwgTFBTVFIgbHBzelBhdGgsIGludCBuRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgZkNyZWF0ZSkKK3sKKyAgd2NoYXJfdCBwYXRoW01BWF9QQVRIXTsKKyAgY2hhciAqcGF0aF9jOworICBCT09MIHJlc3VsdDsKKworICBwYXRoWzBdID0gKHdjaGFyX3QpIDA7CisgIHJlc3VsdCA9IFNIR2V0U3BlY2lhbEZvbGRlclBhdGhXIChod25kT3duZXIsIHBhdGgsIG5Gb2xkZXIsIGZDcmVhdGUpOworICAvKiBOb3RlOiBNYXkgcmV0dXJuIGZhbHNlIGV2ZW4gaWYgc3VjY2VlZHMuICAqLworCisgIHBhdGhbTUFYX1BBVEggLSAxXSA9ICh3Y2hhcl90KSAwOworICBwYXRoX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAocGF0aCwgTlVMTCk7CisgIGlmICghIHBhdGhfYykKKyAgICByZXR1cm4gMDsKKyAgCisgIHN0cm5jcHkgKGxwc3pQYXRoLCBwYXRoX2MsIE1BWF9QQVRIKTsKKyAgZGJ1c19mcmVlIChwYXRoX2MpOworICBscHN6UGF0aFtNQVhfUEFUSCAtIDFdID0gJ1wwJzsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkCitPdXRwdXREZWJ1Z1N0cmluZ0EgKExQQ1NUUiBscE91dHB1dFN0cmluZykKK3sKKyAgd2NoYXJfdCAqc3RyOworICBIQU5ETEUgcmVzdWx0OworICBpbnQgZXJyOworCisgIHN0ciA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscE91dHB1dFN0cmluZywgTlVMTCk7CisgIGlmICghc3RyKQorICAgIHJldHVybjsKKworICBPdXRwdXREZWJ1Z1N0cmluZ1cgKHN0cik7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHN0cik7CisgIFNldExhc3RFcnJvciAoZXJyKTsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWFjNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmggRW11bGF0aW9uIG9mIHN5c3RlbS9saWJjIGZlYXR1cmVzIGZvciBXaW5kb3dzIENFIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NZU0RFUFNfV0lOQ0VfR0xVRV9ICisjZGVmaW5lIERCVVNfU1lTREVQU19XSU5DRV9HTFVFX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogRm9yIGdldGFkZHJpbmZvLCBjb25maWd1cmUvY21ha2UgZGVmaW5lZCBfV0lOMzJfV0NFIHRvIHNvbWV0aGluZyA+PSAweDA0MDEuICAqLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKworREJVU19CRUdJTl9ERUNMUworCisvKiBzaGxvYmouaCBkZWNsYXJlcyB0aGVzZSBvbmx5IGZvciBfV0lOMzJfSUUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGRlZmluZS4KKyAgIEluIGFueSBjYXNlLCB3aXRoIG1pbmd3MzJjZSB3ZSBvbmx5IGdldCBhIFNIR2V0U3BlY2lhbEZvbGRlclBhdGguICAqLworI2RlZmluZSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoVyBTSEdldFNwZWNpYWxGb2xkZXJQYXRoCitCT09MIFdJTkFQSSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoQShIV05ELExQU1RSLGludCxCT09MKTsKK0JPT0wgV0lOQVBJIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhXKEhXTkQsTFBXU1RSLGludCxCT09MKTsKKworI2lmbmRlZiBUTFNfT1VUX09GX0lOREVYRVMKKyNkZWZpbmUgVExTX09VVF9PRl9JTkRFWEVTIDB4ZmZmZmZmZmYKKyNlbmRpZgorCisKKy8qIFNlcmlvdXNseS4gIFdpbmRvd3MgQ0UgZG9lcyBub3QgaGF2ZSBlcnJuby4gIERvbid0IHlvdSBoYXRlIGl0IHdoZW4KKyAgIHRoYXQgaGFwcGVucz8gICovCisjZGVmaW5lIGVycm5vICgoaW50KUdldExhc3RFcnJvciAoKSkKKworI2RlZmluZSBFTk9FTlQgICAgICAgICAgRVJST1JfRklMRV9OT1RfRk9VTkQKKyNkZWZpbmUgRU1GSUxFICAgICAgICAgIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVMKKyNkZWZpbmUgRUFDQ0VTICAgICAgICAgIEVSUk9SX0FDQ0VTU19ERU5JRUQKKyNkZWZpbmUgRUJBREYgICAgICAgICAgIEVSUk9SX0lOVkFMSURfSEFORExFCisjZGVmaW5lIEVOT01FTSAgICAgICAgICBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWQorI2RlZmluZSBFWERFViAgICAgICAgICAgRVJST1JfTk9UX1NBTUVfREVWSUNFCisjZGVmaW5lIEVORklMRSAgICAgICAgICBFUlJPUl9OT19NT1JFX0ZJTEVTCisjZGVmaW5lIEVST0ZTICAgICAgICAgICBFUlJPUl9XUklURV9QUk9URUNUCisjZGVmaW5lIEVOT0xDSyAgICAgICAgICBFUlJPUl9TSEFSSU5HX0JVRkZFUl9FWENFRURFRAorI2RlZmluZSBFTk9TWVMgICAgICAgICAgRVJST1JfTk9UX1NVUFBPUlRFRAorI2RlZmluZSBFRVhJU1QgICAgICAgICAgRVJST1JfRklMRV9FWElTVFMKKyNkZWZpbmUgRVBFUk0gICAgICAgICAgIEVSUk9SX0NBTk5PVF9NQUtFCisjZGVmaW5lIEVJTlZBTCAgICAgICAgICBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUgorI2RlZmluZSBFSU5UUiAgICAgICAgICAgRVJST1JfSU5WQUxJRF9BVF9JTlRFUlJVUFRfVElNRQorI2RlZmluZSBFUElQRSAgICAgICAgICAgRVJST1JfQlJPS0VOX1BJUEUKKyNkZWZpbmUgRU5PU1BDICAgICAgICAgIEVSUk9SX0RJU0tfRlVMTAorI2RlZmluZSBFTk9URU1QVFkgICAgICAgRVJST1JfRElSX05PVF9FTVBUWQorI2RlZmluZSBFQlVTWSAgICAgICAgICAgRVJST1JfQlVTWQorI2RlZmluZSBFTkFNRVRPT0xPTkcgICAgRVJST1JfRklMRU5BTUVfRVhDRURfUkFOR0UKKyNkZWZpbmUgRUFHQUlOICAgICAgICAgIEVSUk9SX01PUkVfREFUQQorI2RlZmluZSBFTk9URElSICAgICAgICAgRVJST1JfRElSRUNUT1JZCisjZGVmaW5lIEVSQU5HRSAgICAgICAgICBFUlJPUl9BUklUSE1FVElDX09WRVJGTE9XCisjZGVmaW5lIEVOWElPICAgICAgICAgICBFUlJPUl9GSUxFX0lOVkFMSUQKKyNkZWZpbmUgRUZBVUxUICAgICAgICAgIEVSUk9SX1BST0NFU1NfQUJPUlRFRAorI2RlZmluZSBFSU8gICAgICAgICAgICAgRVJST1JfSU9fREVWSUNFCisjZGVmaW5lIEVERUFETE9DSyAgICAgICBFUlJPUl9QT1NTSUJMRV9ERUFETE9DSworI2RlZmluZSBFTk9ERVYgICAgICAgICAgRVJST1JfQkFEX0RFVklDRQorCisvKiBXaW5kb3dzIENFIGlzIG1pc3NpbmcgbW9yZSBzdHVmZiB0aGF0IGlzIHByZXR0eSBzdGFuZGFyZC4gICovCisKKyNkZWZpbmUgc3RyZHVwIF9zdHJkdXAKKyNkZWZpbmUgc3RyaWNtcCBfc3RyaWNtcAorI2RlZmluZSBzdHJuaWNtcCBfc3RybmljbXAKKworI2RlZmluZSBlbnZpcm9uIF9kYnVzX3dpbmNlX2Vudmlyb24KK2V4dGVybiBjaGFyICplbnZpcm9uW107CisKKyNkZWZpbmUgZ2V0ZW52IF9kYnVzX3dpbmNlX2dldGVudgorY2hhciAqZ2V0ZW52IChjb25zdCBjaGFyICpuYW1lKTsKKworI2RlZmluZSBwdXRlbnYgX2RidXNfd2luY2VfcHV0ZW52CitpbnQgcHV0ZW52IChjaGFyICpzdHIpOworCisjZGVmaW5lIGNsb2NrIF9kYnVzX3dpbmNlX2Nsb2NrCitjbG9ja190IGNsb2NrICh2b2lkKTsKKworI2RlZmluZSBhYm9ydCBfZGJ1c193aW5jZV9hYm9ydAordm9pZCBhYm9ydCAodm9pZCk7CisKKyNkZWZpbmUgX1NfSUZNVCAgICAgICAgIDAxNzAwMDAgICAgICAgICAvKiBmaWxlIHR5cGUgbWFzayAqLworI2RlZmluZSBfU19JRkRJUiAgICAgICAgMDA0MDAwMCAgICAgICAgIC8qIGRpcmVjdG9yeSAqLworI2RlZmluZSBfU19JRkNIUiAgICAgICAgMDAyMDAwMCAgICAgICAgIC8qIGNoYXJhY3RlciBzcGVjaWFsICovCisjZGVmaW5lIF9TX0lGSUZPICAgICAgICAwMDEwMDAwICAgICAgICAgLyogcGlwZSAqLworI2RlZmluZSBfU19JRlJFRyAgICAgICAgMDEwMDAwMCAgICAgICAgIC8qIHJlZ3VsYXIgKi8KKyNkZWZpbmUgX1NfSVJFQUQgICAgICAgIDAwMDA0MDAgICAgICAgICAvKiByZWFkIHBlcm1pc3Npb24sIG93bmVyICovCisjZGVmaW5lIF9TX0lXUklURSAgICAgICAwMDAwMjAwICAgICAgICAgLyogd3JpdGUgcGVybWlzc2lvbiwgb3duZXIgKi8KKyNkZWZpbmUgX1NfSUVYRUMgICAgICAgIDAwMDAxMDAgICAgICAgICAvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uLCBvd25lciAqLworCisjaWZuZGVmIF9fT0ZGX1RfREVGSU5FRAordHlwZWRlZiBsb25nIG9mZl90OworI2RlZmluZSBfX09GRl9UX0RFRklORUQKKyNlbmRpZgorI2lmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAordHlwZWRlZiBpbnQgaW50cHRyX3Q7CisjZGVmaW5lIF9JTlRQVFJfVF9ERUZJTkVECisjZW5kaWYKKyNpZm5kZWYgX1VJTlRQVFJfVF9ERUZJTkVECit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50cHRyX3Q7CisjZGVmaW5lIF9VSU5UUFRSX1RfREVGSU5FRAorI2VuZGlmCisKKyNpZm5kZWYgX01BWF9GTkFNRQorI2RlZmluZSBfTUFYX0ZOQU1FIDI1NgorI2VuZGlmCisKKyNpZm5kZWYgX0lPRkJGCisjZGVmaW5lIF9JT0ZCRgkwCisjZW5kaWYKKyNpZm5kZWYgX0lPTEJGCisjZGVmaW5lIF9JT0xCRgkxCisjZW5kaWYKKyNpZm5kZWYgX0lPTkJGCisjZGVmaW5lIF9JT05CRgkyCisjZW5kaWYKKworCisvKiBXaW5kb3dzIENFIGlzIG1pc3Npbmcgc29tZSBXaW5kb3dzIGZ1bmN0aW9ucyB0aGF0IHdlIHdhbnQuICAqLworCisjZGVmaW5lIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIF9kYnVzX3dpbmNlX0dldFN5c3RlbVRpbWVBc0ZpbGVUaW1lCit2b2lkIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIChMUEZJTEVUSU1FIGZ0cCk7CisKKyNkZWZpbmUgX21ic3JjaHIgX2RidXNfd2luY2VfbWJzcmNocgordW5zaWduZWQgY2hhciogX21ic3JjaHIgKGNvbnN0IHVuc2lnbmVkIGNoYXIqLCB1bnNpZ25lZCBpbnQpOworCisjZGVmaW5lIE9wZW5GaWxlTWFwcGluZ0EgX2RidXNfd2luY2VfT3BlbkZpbGVNYXBwaW5nQQorSEFORExFIE9wZW5GaWxlTWFwcGluZ0EoRFdPUkQsQk9PTCxMUENTVFIpOworCisjZGVmaW5lIE1vdmVGaWxlRXhBIF9kYnVzX3dpbmNlX01vdmVGaWxlRXhBCitCT09MIE1vdmVGaWxlRXhBKExQQ1NUUixMUENTVFIsRFdPUkQpOworI2lmbmRlZiBNT1ZFRklMRV9SRVBMQUNFX0VYSVNUSU5HCisjZGVmaW5lIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcgMHgwMDAwMDAwMQorI2VuZGlmCisKKyNkZWZpbmUgU2V0SGFuZGxlSW5mb3JtYXRpb24gX2RidXNfd2luY2VfU2V0SGFuZGxlSW5mb3JtYXRpb24KK0JPT0wgU2V0SGFuZGxlSW5mb3JtYXRpb24oSEFORExFLERXT1JELERXT1JEKTsKKyNpZm5kZWYgSEFORExFX0ZMQUdfSU5IRVJJVAorI2RlZmluZSBIQU5ETEVfRkxBR19JTkhFUklUIDB4MDEKKyNlbmRpZgorI2lmbmRlZiBIQU5ETEVfRkxBR19QUk9URUNUCisjZGVmaW5lIEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSAweDAyCisjZW5kaWYKKworI2RlZmluZSBTZWFyY2hQYXRoQSBfZGJ1c193aW5jZV9TZWFyY2hQYXRoQQorRFdPUkQgU2VhcmNoUGF0aEEoTFBDU1RSLExQQ1NUUixMUENTVFIsRFdPUkQsTFBTVFIsTFBTVFIqKTsKKworLyogSW5zdGVhZCBvZiBlbXVsYXRpbmcgYWxsIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHRoaXMsIHdlIHJlcGxhY2UgdGhlCisgICB3aG9sZSB0aGluZy4gICovCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRzaWQoY2hhciAqKnNpZCk7CisKKworI2RlZmluZSBMb29rdXBBY2NvdW50TmFtZVcgX2RidXNfd2luY2VfTG9va3VwQWNjb3VudE5hbWVXCitCT09MIExvb2t1cEFjY291bnROYW1lVyhMUENXU1RSLExQQ1dTVFIsUFNJRCxQRFdPUkQsTFBXU1RSLFBEV09SRCxQU0lEX05BTUVfVVNFKTsKKworI2RlZmluZSBJc1ZhbGlkU2lkIF9kYnVzX3dpbmNlX0lzVmFsaWRTaWQKK0JPT0wgSXNWYWxpZFNpZChQU0lEKTsKKworCisvKiBXaW5kb3dzIENFIGRvZXMgb25seSBoYXZlIHRoZSBVTklDT0RFIGludGVyZmFjZXMgKEZvb1cpLCBidXQgd2UKKyAgIHdhbnQgdG8gdXNlIHRoZSBBU0NJSSBpbnRlcmZhY2VzIChGb29BKS4gIFdlIGltcGxlbWVudCB0aGVtCisgICBoZXJlLiAgKi8KKworI2RlZmluZSBDcmVhdGVGaWxlQSBfZGJ1c193aW5jZV9DcmVhdGVGaWxlQQorSEFORExFIENyZWF0ZUZpbGVBKExQQ1NUUixEV09SRCxEV09SRCxMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsRFdPUkQsSEFORExFKTsKKworI2RlZmluZSBEZWxldGVGaWxlQSBfZGJ1c193aW5jZV9EZWxldGVGaWxlQQorQk9PTCBEZWxldGVGaWxlQShMUENTVFIpOworCisjZGVmaW5lIEdldEZpbGVBdHRyaWJ1dGVzQSBfZGJ1c193aW5jZV9HZXRGaWxlQXR0cmlidXRlc0EKK0RXT1JEIEdldEZpbGVBdHRyaWJ1dGVzQShMUENTVFIpOworCisjZGVmaW5lIEdldEZpbGVBdHRyaWJ1dGVzRXhBIF9kYnVzX3dpbmNlX0dldEZpbGVBdHRyaWJ1dGVzRXhBCitCT09MIEdldEZpbGVBdHRyaWJ1dGVzRXhBKExQQ1NUUixHRVRfRklMRUVYX0lORk9fTEVWRUxTLFBWT0lEKTsKKworI2RlZmluZSBDcmVhdGVGaWxlTWFwcGluZ0EgX2RidXNfd2luY2VfQ3JlYXRlRmlsZU1hcHBpbmdBCitIQU5ETEUgQ3JlYXRlRmlsZU1hcHBpbmdBKEhBTkRMRSxMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsRFdPUkQsRFdPUkQsTFBDU1RSKTsKKworI2RlZmluZSBDcmVhdGVEaXJlY3RvcnlBIF9kYnVzX3dpbmNlX0NyZWF0ZURpcmVjdG9yeUEKK0JPT0wgQ3JlYXRlRGlyZWN0b3J5QShMUENTVFIsTFBTRUNVUklUWV9BVFRSSUJVVEVTKTsKKworI2RlZmluZSBSZW1vdmVEaXJlY3RvcnlBIF9kYnVzX3dpbmNlX1JlbW92ZURpcmVjdG9yeUEKK0JPT0wgUmVtb3ZlRGlyZWN0b3J5QShMUENTVFIpOworCisjZGVmaW5lIEZpbmRGaXJzdEZpbGVBIF9kYnVzX3dpbmNlX0ZpbmRGaXJzdEZpbGVBCitIQU5ETEUgRmluZEZpcnN0RmlsZUEoTFBDU1RSLExQV0lOMzJfRklORF9EQVRBQSk7CisKKyNkZWZpbmUgRmluZE5leHRGaWxlQSBfZGJ1c193aW5jZV9GaW5kTmV4dEZpbGVBCitCT09MIEZpbmROZXh0RmlsZUEoSEFORExFLExQV0lOMzJfRklORF9EQVRBQSk7CisKKyNkZWZpbmUgQ3JlYXRlTXV0ZXhBIF9kYnVzX3dpbmNlX0NyZWF0ZU11dGV4QQorSEFORExFIENyZWF0ZU11dGV4QShMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTCxMUENTVFIpOworCisjZGVmaW5lIENyZWF0ZVByb2Nlc3NBIF9kYnVzX3dpbmNlX0NyZWF0ZVByb2Nlc3NBCitCT09MIENyZWF0ZVByb2Nlc3NBKExQQ1NUUixMUFNUUixMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTFBTRUNVUklUWV9BVFRSSUJVVEVTLEJPT0wsRFdPUkQsUFZPSUQsTFBDU1RSLExQU1RBUlRVUElORk9BLExQUFJPQ0VTU19JTkZPUk1BVElPTik7CisjaWZuZGVmIENSRUFURV9OT19XSU5ET1cKKyNkZWZpbmUgQ1JFQVRFX05PX1dJTkRPVyAweDA4MDAwMDAwCisjZW5kaWYKKworCisjZGVmaW5lIFJlZ09wZW5LZXlFeEEgX2RidXNfd2luY2VfUmVnT3BlbktleUV4QQorTE9ORyBSZWdPcGVuS2V5RXhBKEhLRVksTFBDU1RSLERXT1JELFJFR1NBTSxQSEtFWSk7CisKKyNkZWZpbmUgUmVnUXVlcnlWYWx1ZUV4QSBfZGJ1c193aW5jZV9SZWdRdWVyeVZhbHVlRXhBCitMT05HIFdJTkFQSSBSZWdRdWVyeVZhbHVlRXhBKEhLRVksTFBDU1RSLExQRFdPUkQsTFBEV09SRCxMUEJZVEUsTFBEV09SRCk7CisKKworI2RlZmluZSBGb3JtYXRNZXNzYWdlQSBfZGJ1c193aW5jZV9Gb3JtYXRNZXNzYWdlQQorRFdPUkQgRm9ybWF0TWVzc2FnZUEoRFdPUkQsUENWT0lELERXT1JELERXT1JELExQU1RSLERXT1JELHZhX2xpc3QqKTsKKworI2RlZmluZSBHZXRNb2R1bGVGaWxlTmFtZUEgX2RidXNfd2luY2VfR2V0TW9kdWxlRmlsZU5hbWVBCitEV09SRCBHZXRNb2R1bGVGaWxlTmFtZUEoSElOU1RBTkNFLExQU1RSLERXT1JEKTsKKworI2RlZmluZSBHZXRUZW1wUGF0aEEgX2RidXNfd2luY2VfR2V0VGVtcFBhdGhBCitEV09SRCBHZXRUZW1wUGF0aEEoRFdPUkQsTFBTVFIpOworCisjZGVmaW5lIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBIF9kYnVzX3dpbmNlX1NIR2V0U3BlY2lhbEZvbGRlclBhdGhBCitCT09MIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBKEhXTkQsTFBTVFIsaW50LEJPT0wpOworCisKKyNkZWZpbmUgT3V0cHV0RGVidWdTdHJpbmdBIF9kYnVzX3dpbmNlX091dHB1dERlYnVnU3RyaW5nQQordm9pZCBPdXRwdXREZWJ1Z1N0cmluZ0EoTFBDU1RSKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TWVNERVBTX1dJTkNFX0dMVUVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiNTE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy1zeXNkZXBzLmMKQEAgLTAsMCArMSwxMDcyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy5jIFdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyBzaGFyZWQgYmV0d2VlbiBVTklYIGFuZCBXaW5kb3dzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisKKy8qIE5PVEU6IElmIHlvdSBpbmNsdWRlIGFueSB1bml4L3dpbmRvd3Mtc3BlY2lmaWMgaGVhZGVycyBoZXJlLCB5b3UgYXJlIHByb2JhYmx5IGRvaW5nIHNvbWV0aGluZworICogd3JvbmcgYW5kIHNob3VsZCBiZSBwdXR0aW5nIHNvbWUgY29kZSBpbiBkYnVzLXN5c2RlcHMtdW5peC5jIG9yIGRidXMtc3lzZGVwcy13aW4uYy4KKyAqCisgKiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIEFOU0kgQyBoZWFkZXJzLi4uCisgKi8KKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKHdpbl9mZHMpOworX0RCVVNfREVGSU5FX0dMT0JBTF9MT0NLIChzaWRfYXRvbV9jYWNoZSk7CitfREJVU19ERUZJTkVfR0xPQkFMX0xPQ0sgKHN5c3RlbV91c2Vycyk7CisKKyNpZmRlZiBEQlVTX1dJTgorICAjaW5jbHVkZSA8c3RkbGliLmg+CisjZWxpZiAoZGVmaW5lZCBfX0FQUExFX18pCisjIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGRlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorI2Vsc2UKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU3lzZGVwcyBJbnRlcm5hbCBzeXN0ZW0tZGVwZW5kZW50IEFQSQorICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFsIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGF2YWlsYWJsZSBvbiBVTklYIGFuZCBXaW5kb3dzCisgKgorICogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGhhcyBhIGR1YWwgcHVycG9zZS4gRmlyc3QsIGl0IGVuY2Fwc3VsYXRlcworICogYWxsIHVzYWdlIG9mIG9wZXJhdGluZyBzeXN0ZW0gQVBJcyBmb3IgZWFzZSBvZiBhdWRpdGluZyBhbmQgdG8KKyAqIGF2b2lkIGNsdXR0ZXJpbmcgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgd2l0aCBiaXphcnJlIE9TIHF1aXJrcyBhbmQKKyAqIGhlYWRlcnMuIFNlY29uZCwgaXQgYWJzdHJhY3RzIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtIEFQSXMgZm9yCisgKiBwb3J0YWJpbGl0eS4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEFib3J0cyB0aGUgcHJvZ3JhbSB3aXRoIFNJR0FCUlQgKGR1bXBpbmcgY29yZSkuCisgKi8KK3ZvaWQKK19kYnVzX2Fib3J0ICh2b2lkKQoreworICBjb25zdCBjaGFyICpzOworICAKKyAgX2RidXNfcHJpbnRfYmFja3RyYWNlICgpOworICAKKyAgcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfQkxPQ0tfT05fQUJPUlQiKTsKKyAgaWYgKHMgJiYgKnMpCisgICAgeworICAgICAgLyogZG9uJ3QgdXNlIF9kYnVzX3dhcm4gaGVyZSBzaW5jZSBpdCBjYW4gX2RidXNfYWJvcnQoKSAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBQcm9jZXNzICVsdSBzbGVlcGluZyBmb3IgZ2RiIGF0dGFjaFxuIiwgX2RidXNfcGlkX2Zvcl9sb2cgKCkpOworICAgICAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICgxMDAwICogMTgwKTsKKyAgICB9CisgIAorICBhYm9ydCAoKTsKKyAgX2RidXNfZXhpdCAoMSk7IC8qIGluIGNhc2Ugc29tZW9uZSBtYW5hZ2VzIHRvIGlnbm9yZSBTSUdBQlJUID8gKi8KK30KKworLyoqCisgKiBXcmFwcGVyIGZvciBzZXRlbnYoKS4gSWYgdGhlIHZhbHVlIGlzICNOVUxMLCB1bnNldHMKKyAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAqCisgKiBUaGVyZSBpcyBhbiB1bmZpeGFibGUgbWVtbGVhayBpbiB0aGF0IGl0IGlzIHVuc2FmZSB0bworICogZnJlZSBtZW1vcnkgbWFsbG9jZWQgZm9yIHVzZSB3aXRoIHNldGVudi4gVGhpcyBpcyBiZWNhdXNlCisgKiB3ZSBjYW4gbm90IHJlbHkgb24gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZgorICogdGhlIHVuZGVybHlpbmcgbGliYyBsaWJyYXJ5LgorICoKKyAqIEBwYXJhbSB2YXJuYW1lIG5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NldGVudiAoY29uc3QgY2hhciAqdmFybmFtZSwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIF9kYnVzX2Fzc2VydCAodmFybmFtZSAhPSBOVUxMKTsKKyAgCisgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgIHsKKyNpZmRlZiBIQVZFX1VOU0VURU5WCisgICAgICB1bnNldGVudiAodmFybmFtZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyNlbHNlCisgICAgICBjaGFyICpwdXRlbnZfdmFsdWU7CisgICAgICBzaXplX3QgbGVuOworCisgICAgICBsZW4gPSBzdHJsZW4gKHZhcm5hbWUpOworCisgICAgICAvKiBVc2Ugc3lzdGVtIG1hbGxvYyB0byBhdm9pZCBtZW1sZWFrcyB0aGF0IGRidXNfbWFsbG9jCisgICAgICAgKiB3aWxsIGdldCB1cHNldCBhYm91dC4KKyAgICAgICAqLworICAgICAgCisgICAgICBwdXRlbnZfdmFsdWUgPSBtYWxsb2MgKGxlbiArIDIpOworICAgICAgaWYgKHB1dGVudl92YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHN0cmNweSAocHV0ZW52X3ZhbHVlLCB2YXJuYW1lKTsKKyNpZiBkZWZpbmVkKERCVVNfV0lOKQorICAgICAgc3RyY2F0IChwdXRlbnZfdmFsdWUsICI9Iik7CisjZW5kaWYKKyAgICAgIAorICAgICAgcmV0dXJuIChwdXRlbnYgKHB1dGVudl92YWx1ZSkgPT0gMCk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9TRVRFTlYKKyAgICAgIHJldHVybiAoc2V0ZW52ICh2YXJuYW1lLCB2YWx1ZSwgVFJVRSkgPT0gMCk7CisjZWxzZQorICAgICAgY2hhciAqcHV0ZW52X3ZhbHVlOworICAgICAgc2l6ZV90IGxlbjsKKyAgICAgIHNpemVfdCB2YXJuYW1lX2xlbjsKKyAgICAgIHNpemVfdCB2YWx1ZV9sZW47CisKKyAgICAgIHZhcm5hbWVfbGVuID0gc3RybGVuICh2YXJuYW1lKTsKKyAgICAgIHZhbHVlX2xlbiA9IHN0cmxlbiAodmFsdWUpOworICAgICAgCisgICAgICBsZW4gPSB2YXJuYW1lX2xlbiArIHZhbHVlX2xlbiArIDEgLyogJz0nICovIDsKKworICAgICAgLyogVXNlIHN5c3RlbSBtYWxsb2MgdG8gYXZvaWQgbWVtbGVha3MgdGhhdCBkYnVzX21hbGxvYworICAgICAgICogd2lsbCBnZXQgdXBzZXQgYWJvdXQuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgcHV0ZW52X3ZhbHVlID0gbWFsbG9jIChsZW4gKyAxKTsKKyAgICAgIGlmIChwdXRlbnZfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzdHJjcHkgKHB1dGVudl92YWx1ZSwgdmFybmFtZSk7CisgICAgICBzdHJjcHkgKHB1dGVudl92YWx1ZSArIHZhcm5hbWVfbGVuLCAiPSIpOworICAgICAgc3RyY3B5IChwdXRlbnZfdmFsdWUgKyB2YXJuYW1lX2xlbiArIDEsIHZhbHVlKTsKKyAgICAgIAorICAgICAgcmV0dXJuIChwdXRlbnYgKHB1dGVudl92YWx1ZSkgPT0gMCk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qKgorICogV3JhcHBlciBmb3IgZ2V0ZW52KCkuCisgKgorICogQHBhcmFtIHZhcm5hbWUgbmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICogQHJldHVybnMgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgI05VTEwgaWYgdW5zZXQKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2dldGVudiAoY29uc3QgY2hhciAqdmFybmFtZSkKK3sgIAorICByZXR1cm4gZ2V0ZW52ICh2YXJuYW1lKTsKK30KKworLyoqCisgKiBXcmFwcGVyIGZvciBjbGVhcmVudigpLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jbGVhcmVudiAodm9pZCkKK3sKKyAgZGJ1c19ib29sX3QgcmMgPSBUUlVFOworCisjaWZkZWYgSEFWRV9DTEVBUkVOVgorICBpZiAoY2xlYXJlbnYgKCkgIT0gMCkKKyAgICAgcmMgPSBGQUxTRTsKKyNlbHNlCisKKyAgaWYgKGVudmlyb24gIT0gTlVMTCkKKyAgICBlbnZpcm9uWzBdID0gTlVMTDsKKyNlbmRpZgorCisgIHJldHVybiByYzsKK30KKworLyoqCisgKiBHZXRzIGEgI05VTEwtdGVybWluYXRlZCBsaXN0IG9mIGtleT12YWx1ZSBwYWlycyBmcm9tIHRoZQorICogZW52aXJvbm1lbnQuIFVzZSBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IHRvIGZyZWUgaXQuCisgKgorICogQHJldHVybnMgdGhlIGVudmlyb25tZW50IG9yICNOVUxMIG9uIE9PTQorICovCitjaGFyICoqCitfZGJ1c19nZXRfZW52aXJvbm1lbnQgKHZvaWQpCit7CisgIGludCBpLCBsZW5ndGg7CisgIGNoYXIgKiplbnZpcm9ubWVudDsKKworICBfZGJ1c19hc3NlcnQgKGVudmlyb24gIT0gTlVMTCk7CisKKyAgZm9yIChsZW5ndGggPSAwOyBlbnZpcm9uW2xlbmd0aF0gIT0gTlVMTDsgbGVuZ3RoKyspOworCisgIC8qIEFkZCBvbmUgZm9yIE5VTEwgKi8KKyAgbGVuZ3RoKys7CisKKyAgZW52aXJvbm1lbnQgPSBkYnVzX25ldzAgKGNoYXIgKiwgbGVuZ3RoKTsKKworICBpZiAoZW52aXJvbm1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IgKGkgPSAwOyBlbnZpcm9uW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBlbnZpcm9ubWVudFtpXSA9IF9kYnVzX3N0cmR1cCAoZW52aXJvbltpXSk7CisKKyAgICAgIGlmIChlbnZpcm9ubWVudFtpXSA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGVudmlyb25baV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisgICAgICBlbnZpcm9ubWVudCA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBlbnZpcm9ubWVudDsKK30KKworLyoqCisgKiBTcGxpdCBwYXRocyBpbnRvIGEgbGlzdCBvZiBjaGFyIHN0cmluZ3MKKyAqIAorICogQHBhcmFtIGRpcnMgc3RyaW5nIHdpdGggcGF0aGVzIAorICogQHBhcmFtIHN1ZmZpeCBzdHJpbmcgY29uY2F0ZWQgdG8gZWFjaCBwYXRoIGluIGRpcnMKKyAqIEBwYXJhbSBkaXJfbGlzdCBjb250YWlucyBhIGxpc3Qgb2Ygc3BsaXR0ZWQgcGF0aGVzCisgKiByZXR1cm4gI1RSVUUgaXMgcGF0aGVzIGNvdWxkIGJlIHNwbGl0dGVzLCNGQUxTRSBpbiBvb20gY2FzZSAKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKERCdXNTdHJpbmcgKmRpcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VmZml4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqKmRpcl9saXN0KQoreworICAgaW50IHN0YXJ0OworICAgaW50IGk7CisgICBpbnQgbGVuOworICAgY2hhciAqY3BhdGg7CisgICBEQnVzU3RyaW5nIGZpbGVfc3VmZml4OworCisgICBzdGFydCA9IDA7CisgICBpID0gMDsKKworICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlX3N1ZmZpeCwgc3VmZml4KTsKKworICAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcnMpOworCisgICB3aGlsZSAoX2RidXNfc3RyaW5nX2ZpbmQgKGRpcnMsIHN0YXJ0LCBfREJVU19QQVRIX1NFUEFSQVRPUiwgJmkpKQorICAgICB7CisgICAgICAgREJ1c1N0cmluZyBwYXRoOworCisgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBhdGgpKQorICAgICAgICAgIGdvdG8gb29tOworCisgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGRpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX3N0cmluZ19jaG9wX3doaXRlICgmcGF0aCk7CisKKyAgICAgICAgLyogY2hlY2sgZm9yIGFuIGVtcHR5IHBhdGggKi8KKyAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGF0aCkgPT0gMCkKKyAgICAgICAgICBnb3RvIG5leHQ7CisKKyAgICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZV9zdWZmaXgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhKCZwYXRoLCAmY3BhdGgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoZGlyX2xpc3QsIGNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkYnVzX2ZyZWUgKGNwYXRoKTsKKyAgICAgICAgICAgIGdvdG8gb29tOworICAgICAgICAgIH0KKworICAgICAgIG5leHQ6CisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgIHN0YXJ0ID0gaSArIDE7CisgICAgfSAKKyAgICAgIAorICBpZiAoc3RhcnQgIT0gbGVuKQorICAgIHsgCisgICAgICBEQnVzU3RyaW5nIHBhdGg7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXRoKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZV9zdWZmaXgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEoJnBhdGgsICZjcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKGRpcl9saXN0LCBjcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOyAgICAgICAgICAgICAgCisgICAgICAgICAgZGJ1c19mcmVlIChjcGF0aCk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsgCisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19saXN0X2ZvcmVhY2ggKGRpcl9saXN0LCAoREJ1c0ZvcmVhY2hGdW5jdGlvbilkYnVzX2ZyZWUsIE5VTEwpOyAKKyAgX2RidXNfbGlzdF9jbGVhciAoZGlyX2xpc3QpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqCisgKiBAeworICovCisvKioKKyAqIEFwcGVuZHMgYW4gaW50ZWdlciB0byBhIERCdXNTdHJpbmcuCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHZhbHVlIHRoZSBpbnRlZ2VyIHZhbHVlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgb3Igb3RoZXIgZmFpbHVyZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfaW50IChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgdmFsdWUpCit7CisgIC8qIHRoaXMgY2FsY3VsYXRpb24gaXMgZnJvbSBjb21wLmxhbmcuYyBmYXEgKi8KKyNkZWZpbmUgTUFYX0xPTkdfTEVOICgoc2l6ZW9mIChsb25nKSAqIDggKyAyKSAvIDMgKyAxKSAgLyogKzEgZm9yICctJyAqLworICBpbnQgb3JpZ19sZW47CisgIGludCBpOworICBjaGFyICpidWY7CisgIAorICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChzdHIsIE1BWF9MT05HX0xFTikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1ZiA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb3JpZ19sZW4sIE1BWF9MT05HX0xFTik7CisKKyAgc25wcmludGYgKGJ1ZiwgTUFYX0xPTkdfTEVOLCAiJWxkIiwgdmFsdWUpOworCisgIGkgPSAwOworICB3aGlsZSAoKmJ1ZikKKyAgICB7CisgICAgICArK2J1ZjsKKyAgICAgICsraTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoc3RyLCBNQVhfTE9OR19MRU4gLSBpKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFwcGVuZHMgYW4gdW5zaWduZWQgaW50ZWdlciB0byBhIERCdXNTdHJpbmcuCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHZhbHVlIHRoZSBpbnRlZ2VyIHZhbHVlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgb3Igb3RoZXIgZmFpbHVyZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICB2YWx1ZSkKK3sKKyAgLyogdGhpcyBpcyB3cm9uZywgYnV0IGRlZmluaXRlbHkgb24gdGhlIGhpZ2ggc2lkZS4gKi8KKyNkZWZpbmUgTUFYX1VMT05HX0xFTiAoTUFYX0xPTkdfTEVOICogMikKKyAgaW50IG9yaWdfbGVuOworICBpbnQgaTsKKyAgY2hhciAqYnVmOworICAKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBNQVhfVUxPTkdfTEVOKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYnVmID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoc3RyLCBvcmlnX2xlbiwgTUFYX1VMT05HX0xFTik7CisKKyAgc25wcmludGYgKGJ1ZiwgTUFYX1VMT05HX0xFTiwgIiVsdSIsIHZhbHVlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKCpidWYpCisgICAgeworICAgICAgKytidWY7CisgICAgICArK2k7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKHN0ciwgTUFYX1VMT05HX0xFTiAtIGkpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIEFwcGVuZHMgYSBkb3VibGUgdG8gYSBEQnVzU3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeSBvciBvdGhlciBmYWlsdXJlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF9kb3VibGUgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICB2YWx1ZSkKK3sKKyNkZWZpbmUgTUFYX0RPVUJMRV9MRU4gNjQgLyogdGhpcyBpcyBjb21wbGV0ZWx5IG1hZGUgdXAgOi0vICovCisgIGludCBvcmlnX2xlbjsKKyAgY2hhciAqYnVmOworICBpbnQgaTsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgTUFYX0RPVUJMRV9MRU4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBidWYgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9yaWdfbGVuLCBNQVhfRE9VQkxFX0xFTik7CisKKyAgc25wcmludGYgKGJ1ZiwgTUFYX0xPTkdfTEVOLCAiJWciLCB2YWx1ZSk7CisKKyAgaSA9IDA7CisgIHdoaWxlICgqYnVmKQorICAgIHsKKyAgICAgICsrYnVmOworICAgICAgKytpOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChzdHIsIE1BWF9ET1VCTEVfTEVOIC0gaSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qKgorICogUGFyc2VzIGFuIGludGVnZXIgY29udGFpbmVkIGluIGEgREJ1c1N0cmluZy4gRWl0aGVyIHJldHVybiBwYXJhbWV0ZXIKKyAqIG1heSBiZSAjTlVMTCBpZiB5b3UgYXJlbid0IGludGVyZXN0ZWQgaW4gaXQuIFRoZSBpbnRlZ2VyIGlzIHBhcnNlZAorICogYW5kIHN0b3JlZCBpbiB2YWx1ZV9yZXR1cm4uIFJldHVybiBwYXJhbWV0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAqIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB0aGUgYnl0ZSBpbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlIGludGVnZXIKKyAqIEBwYXJhbSB2YWx1ZV9yZXR1cm4gcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBpbnRlZ2VyIHZhbHVlIG9yICNOVUxMCisgKiBAcGFyYW0gZW5kX3JldHVybiByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgaW50ZWdlciwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19wYXJzZV9pbnQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAqdmFsdWVfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kX3JldHVybikKK3sKKyAgbG9uZyB2OworICBjb25zdCBjaGFyICpwOworICBjaGFyICplbmQ7CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KTsKKworICBlbmQgPSBOVUxMOworICBfZGJ1c19zZXRfZXJybm9fdG9femVybyAoKTsKKyAgdiA9IHN0cnRvbCAocCwgJmVuZCwgMCk7CisgIGlmIChlbmQgPT0gTlVMTCB8fCBlbmQgPT0gcCB8fCBlcnJubyAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodmFsdWVfcmV0dXJuKQorICAgICp2YWx1ZV9yZXR1cm4gPSB2OworICBpZiAoZW5kX3JldHVybikKKyAgICAqZW5kX3JldHVybiA9IHN0YXJ0ICsgKGVuZCAtIHApOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFBhcnNlcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5lZCBpbiBhIERCdXNTdHJpbmcuIEVpdGhlciByZXR1cm4KKyAqIHBhcmFtZXRlciBtYXkgYmUgI05VTEwgaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIGl0LiBUaGUgaW50ZWdlcgorICogaXMgcGFyc2VkIGFuZCBzdG9yZWQgaW4gdmFsdWVfcmV0dXJuLiBSZXR1cm4gcGFyYW1ldGVycyBhcmUgbm90CisgKiBpbml0aWFsaXplZCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIGJ5dGUgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlZ2VyCisgKiBAcGFyYW0gdmFsdWVfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgaW50ZWdlciB2YWx1ZSBvciAjTlVMTAorICogQHBhcmFtIGVuZF9yZXR1cm4gcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGludGVnZXIsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfcGFyc2VfdWludCAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgKnZhbHVlX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICplbmRfcmV0dXJuKQoreworICB1bnNpZ25lZCBsb25nIHY7CisgIGNvbnN0IGNoYXIgKnA7CisgIGNoYXIgKmVuZDsKKworICBwID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoc3RyLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpOworCisgIGVuZCA9IE5VTEw7CisgIF9kYnVzX3NldF9lcnJub190b196ZXJvICgpOworICB2ID0gc3RydG91bCAocCwgJmVuZCwgMCk7CisgIGlmIChlbmQgPT0gTlVMTCB8fCBlbmQgPT0gcCB8fCBlcnJubyAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodmFsdWVfcmV0dXJuKQorICAgICp2YWx1ZV9yZXR1cm4gPSB2OworICBpZiAoZW5kX3JldHVybikKKyAgICAqZW5kX3JldHVybiA9IHN0YXJ0ICsgKGVuZCAtIHApOworCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworc3RhdGljIGRidXNfYm9vbF90Cithc2NpaV9pc3NwYWNlIChjaGFyIGMpCit7CisgIHJldHVybiAoYyA9PSAnICcgfHwKKwkgIGMgPT0gJ1xmJyB8fAorCSAgYyA9PSAnXG4nIHx8CisJICBjID09ICdccicgfHwKKwkgIGMgPT0gJ1x0JyB8fAorCSAgYyA9PSAnXHYnKTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCitzdGF0aWMgZGJ1c19ib29sX3QKK2FzY2lpX2lzZGlnaXQgKGNoYXIgYykKK3sKKyAgcmV0dXJuIGMgPj0gJzAnICYmIGMgPD0gJzknOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXNjaWlfaXN4ZGlnaXQgKGNoYXIgYykKK3sKKyAgcmV0dXJuIChhc2NpaV9pc2RpZ2l0IChjKSB8fAorCSAgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB8fAorCSAgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSk7Cit9CisjZW5kaWYgLyogREJVU19CVUlMRF9URVNUUyAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworLyogQ2FsbHMgc3RydG9kIGluIGEgbG9jYWxlLWluZGVwZW5kZW50IGZhc2hpb24sIGJ5IGxvb2tpbmcgYXQKKyAqIHRoZSBsb2NhbGUgZGF0YSBhbmQgcGF0Y2hpbmcgdGhlIGRlY2ltYWwgY29tbWEgdG8gYSBwb2ludC4KKyAqCisgKiBSZWxpY2Vuc2VkIGZyb20gZ2xpYi4KKyAqLworc3RhdGljIGRvdWJsZQorYXNjaWlfc3RydG9kIChjb25zdCBjaGFyICpucHRyLAorCSAgICAgIGNoYXIgICAgICAqKmVuZHB0cikKK3sKKyAgLyogRklYTUU6IFRoZSBXaW4zMiBDIGxpYnJhcnkncyBzdHJ0b2QoKSBkb2Vzbid0IGhhbmRsZSBoZXguCisgICAqIFByZXN1bWFibHkgbWFueSBVbml4ZXMgZG9uJ3QgZWl0aGVyLgorICAgKi8KKworICBjaGFyICpmYWlsX3BvczsKKyAgZG91YmxlIHZhbDsKKyAgc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YTsKKyAgY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludDsKKyAgaW50IGRlY2ltYWxfcG9pbnRfbGVuOworICBjb25zdCBjaGFyICpwLCAqZGVjaW1hbF9wb2ludF9wb3M7CisgIGNvbnN0IGNoYXIgKmVuZCA9IE5VTEw7IC8qIFNpbGVuY2UgZ2NjICovCisKKyAgZmFpbF9wb3MgPSBOVUxMOworCisjaWYgSEFWRV9MT0NBTEVDT05WCisgIGxvY2FsZV9kYXRhID0gbG9jYWxlY29udiAoKTsKKyAgZGVjaW1hbF9wb2ludCA9IGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50OworI2Vsc2UKKyAgZGVjaW1hbF9wb2ludCA9ICIuIjsKKyNlbmRpZgorCisgIGRlY2ltYWxfcG9pbnRfbGVuID0gc3RybGVuIChkZWNpbWFsX3BvaW50KTsKKyAgX2RidXNfYXNzZXJ0IChkZWNpbWFsX3BvaW50X2xlbiAhPSAwKTsKKyAgCisgIGRlY2ltYWxfcG9pbnRfcG9zID0gTlVMTDsKKyAgaWYgKGRlY2ltYWxfcG9pbnRbMF0gIT0gJy4nIHx8CisgICAgICBkZWNpbWFsX3BvaW50WzFdICE9IDApCisgICAgeworICAgICAgcCA9IG5wdHI7CisgICAgICAvKiBTa2lwIGxlYWRpbmcgc3BhY2UgKi8KKyAgICAgIHdoaWxlIChhc2NpaV9pc3NwYWNlICgqcCkpCisJcCsrOworICAgICAgCisgICAgICAvKiBTa2lwIGxlYWRpbmcgb3B0aW9uYWwgc2lnbiAqLworICAgICAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCisJcCsrOworICAgICAgCisgICAgICBpZiAocFswXSA9PSAnMCcgJiYKKwkgIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpCisJeworCSAgcCArPSAyOworCSAgLyogSEVYIC0gZmluZCB0aGUgKG9wdGlvbmFsKSBkZWNpbWFsIHBvaW50ICovCisJICAKKwkgIHdoaWxlIChhc2NpaV9pc3hkaWdpdCAoKnApKQorCSAgICBwKys7CisJICAKKwkgIGlmICgqcCA9PSAnLicpCisJICAgIHsKKwkgICAgICBkZWNpbWFsX3BvaW50X3BvcyA9IHArKzsKKwkgICAgICAKKwkgICAgICB3aGlsZSAoYXNjaWlfaXN4ZGlnaXQgKCpwKSkKKwkJcCsrOworCSAgICAgIAorCSAgICAgIGlmICgqcCA9PSAncCcgfHwgKnAgPT0gJ1AnKQorCQlwKys7CisJICAgICAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCisJCXArKzsKKwkgICAgICB3aGlsZSAoYXNjaWlfaXNkaWdpdCAoKnApKQorCQlwKys7CisJICAgICAgZW5kID0gcDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICB3aGlsZSAoYXNjaWlfaXNkaWdpdCAoKnApKQorCSAgICBwKys7CisJICAKKwkgIGlmICgqcCA9PSAnLicpCisJICAgIHsKKwkgICAgICBkZWNpbWFsX3BvaW50X3BvcyA9IHArKzsKKwkgICAgICAKKwkgICAgICB3aGlsZSAoYXNjaWlfaXNkaWdpdCAoKnApKQorCQlwKys7CisJICAgICAgCisJICAgICAgaWYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpCisJCXArKzsKKwkgICAgICBpZiAoKnAgPT0gJysnIHx8ICpwID09ICctJykKKwkJcCsrOworCSAgICAgIHdoaWxlIChhc2NpaV9pc2RpZ2l0ICgqcCkpCisJCXArKzsKKwkgICAgICBlbmQgPSBwOworCSAgICB9CisJfQorICAgICAgLyogRm9yIHRoZSBvdGhlciBjYXNlcywgd2UgbmVlZCBub3QgY29udmVydCB0aGUgZGVjaW1hbCBwb2ludCAqLworICAgIH0KKworICAvKiBTZXQgZXJybm8gdG8gemVybywgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggemVybyByZXN1bHRzCisgICAgIGFuZCB1bmRlcmZsb3dzICovCisgIF9kYnVzX3NldF9lcnJub190b196ZXJvICgpOworICAKKyAgaWYgKGRlY2ltYWxfcG9pbnRfcG9zKQorICAgIHsKKyAgICAgIGNoYXIgKmNvcHksICpjOworCisgICAgICAvKiBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlICcuJyB0byB0aGUgbG9jYWxlIHNwZWNpZmljIGRlY2ltYWwgcG9pbnQgKi8KKyAgICAgIGNvcHkgPSBkYnVzX21hbGxvYyAoZW5kIC0gbnB0ciArIDEgKyBkZWNpbWFsX3BvaW50X2xlbik7CisgICAgICAKKyAgICAgIGMgPSBjb3B5OworICAgICAgbWVtY3B5IChjLCBucHRyLCBkZWNpbWFsX3BvaW50X3BvcyAtIG5wdHIpOworICAgICAgYyArPSBkZWNpbWFsX3BvaW50X3BvcyAtIG5wdHI7CisgICAgICBtZW1jcHkgKGMsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKTsKKyAgICAgIGMgKz0gZGVjaW1hbF9wb2ludF9sZW47CisgICAgICBtZW1jcHkgKGMsIGRlY2ltYWxfcG9pbnRfcG9zICsgMSwgZW5kIC0gKGRlY2ltYWxfcG9pbnRfcG9zICsgMSkpOworICAgICAgYyArPSBlbmQgLSAoZGVjaW1hbF9wb2ludF9wb3MgKyAxKTsKKyAgICAgICpjID0gMDsKKworICAgICAgdmFsID0gc3RydG9kIChjb3B5LCAmZmFpbF9wb3MpOworCisgICAgICBpZiAoZmFpbF9wb3MpCisJeworCSAgaWYgKGZhaWxfcG9zID4gZGVjaW1hbF9wb2ludF9wb3MpCisJICAgIGZhaWxfcG9zID0gKGNoYXIgKilucHRyICsgKGZhaWxfcG9zIC0gY29weSkgLSAoZGVjaW1hbF9wb2ludF9sZW4gLSAxKTsKKwkgIGVsc2UKKwkgICAgZmFpbF9wb3MgPSAoY2hhciAqKW5wdHIgKyAoZmFpbF9wb3MgLSBjb3B5KTsKKwl9CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoY29weSk7CisJICAKKyAgICB9CisgIGVsc2UKKyAgICB2YWwgPSBzdHJ0b2QgKG5wdHIsICZmYWlsX3Bvcyk7CisKKyAgaWYgKGVuZHB0cikKKyAgICAqZW5kcHRyID0gZmFpbF9wb3M7CisgIAorICByZXR1cm4gdmFsOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKgorICogUGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNvbnRhaW5lZCBpbiBhIERCdXNTdHJpbmcuIEVpdGhlcgorICogcmV0dXJuIHBhcmFtZXRlciBtYXkgYmUgI05VTEwgaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIGl0LiBUaGUKKyAqIGludGVnZXIgaXMgcGFyc2VkIGFuZCBzdG9yZWQgaW4gdmFsdWVfcmV0dXJuLiBSZXR1cm4gcGFyYW1ldGVycyBhcmUKKyAqIG5vdCBpbml0aWFsaXplZCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIGJ5dGUgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBmbG9hdAorICogQHBhcmFtIHZhbHVlX3JldHVybiByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGZsb2F0IHZhbHVlIG9yICNOVUxMCisgKiBAcGFyYW0gZW5kX3JldHVybiByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgZmxvYXQsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfcGFyc2VfZG91YmxlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgICAgKnZhbHVlX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmVuZF9yZXR1cm4pCit7CisgIGRvdWJsZSB2OworICBjb25zdCBjaGFyICpwOworICBjaGFyICplbmQ7CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KTsKKworICAvKiBwYXJzaW5nIGhleCB3b3JrcyBvbiBsaW51eCBidXQgaXNuJ3QgcG9ydGFibGUsIHNvIGludGVyY2VwdCBpdAorICAgKiBoZXJlIHRvIGdldCB1bmlmb3JtIGJlaGF2aW9yLgorICAgKi8KKyAgaWYgKHBbMF0gPT0gJzAnICYmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZW5kID0gTlVMTDsKKyAgX2RidXNfc2V0X2Vycm5vX3RvX3plcm8gKCk7CisgIHYgPSBhc2NpaV9zdHJ0b2QgKHAsICZlbmQpOworICBpZiAoZW5kID09IE5VTEwgfHwgZW5kID09IHAgfHwgZXJybm8gIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZhbHVlX3JldHVybikKKyAgICAqdmFsdWVfcmV0dXJuID0gdjsKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBzdGFydCArIChlbmQgLSBwKTsKKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qKiBAfSAqLyAvKiBEQnVzU3RyaW5nIGdyb3VwICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0ludGVybmFsc1V0aWxzCisgKiBAeworICovCisKK3ZvaWQKK19kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlc19idWZmZXIgKGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG5fYnl0ZXMpCit7CisgIGxvbmcgdHZfdXNlYzsKKyAgaW50IGk7CisgIAorICAvKiBmYWxsIGJhY2sgdG8gcHNldWRvcmFuZG9tICovCisgIF9kYnVzX3ZlcmJvc2UgKCJGYWxsaW5nIGJhY2sgdG8gcHNldWRvcmFuZG9tIGZvciAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgbl9ieXRlcyk7CisgIAorICBfZGJ1c19nZXRfY3VycmVudF90aW1lIChOVUxMLCAmdHZfdXNlYyk7CisgIHNyYW5kICh0dl91c2VjKTsKKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fYnl0ZXMpCisgICAgeworICAgICAgZG91YmxlIHI7CisgICAgICB1bnNpZ25lZCBpbnQgYjsKKyAgICAgICAgICAKKyAgICAgIHIgPSByYW5kICgpOworICAgICAgYiA9IChyIC8gKGRvdWJsZSkgUkFORF9NQVgpICogMjU1LjA7CisKKyAgICAgIGJ1ZmZlcltpXSA9IGI7CisKKyAgICAgICsraTsKKyAgICB9Cit9CisKKy8qKgorICogRmlsbHMgbl9ieXRlcyBvZiB0aGUgZ2l2ZW4gYnVmZmVyIHdpdGggcmFuZG9tIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBidWZmZXIgYW4gYWxsb2NhdGVkIGJ1ZmZlcgorICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiBidWZmZXIgdG8gd3JpdGUgdG8KKyAqLwordm9pZAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlciAoY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbl9ieXRlcykKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgeworICAgICAgX2RidXNfZ2VuZXJhdGVfcHNldWRvcmFuZG9tX2J5dGVzX2J1ZmZlciAoYnVmZmVyLCBuX2J5dGVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZzdHIsIG5fYnl0ZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIF9kYnVzX2dlbmVyYXRlX3BzZXVkb3JhbmRvbV9ieXRlc19idWZmZXIgKGJ1ZmZlciwgbl9ieXRlcyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlciAoJnN0ciwgYnVmZmVyLCBuX2J5dGVzKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzLCB3aGVyZSB0aGUgYnl0ZXMgYXJlCisgKiBjaG9zZW4gZnJvbSB0aGUgYWxwaGFudW1lcmljIEFTQ0lJIHN1YnNldC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBuX2J5dGVzIHRoZSBudW1iZXIgb2YgcmFuZG9tIEFTQ0lJIGJ5dGVzIHRvIGFwcGVuZCB0byBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkgb3Igb3RoZXIgZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIGxldHRlcnNbXSA9CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgaW50IGk7CisgIGludCBsZW47CisgIAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoc3RyLCBuX2J5dGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKyAgaSA9IGxlbiAtIG5fYnl0ZXM7CisgIHdoaWxlIChpIDwgbGVuKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoc3RyLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzW19kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBpKSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiAobGV0dGVycykgLSAxKV0pOworCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpIChzdHIsIGxlbiAtIG5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2J5dGVzKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ29udmVydHMgYSBVTklYIGVycm5vLCBvciBXaW5kb3dzIGVycm5vIG9yIFdpblNvY2sgZXJyb3IgdmFsdWUgaW50bworICogYSAjREJ1c0Vycm9yIG5hbWUuCisgKgorICogQHRvZG8gc2hvdWxkIGNvdmVyIG1vcmUgZXJybm9zLCBzcGVjaWZpY2FsbHkgdGhvc2UKKyAqIGZyb20gb3BlbigpLgorICogCisgKiBAcGFyYW0gZXJyb3JfbnVtYmVyIHRoZSBlcnJuby4KKyAqIEByZXR1cm5zIGFuIGVycm9yIG5hbWUKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGludCBlcnJvcl9udW1iZXIpCit7CisgIHN3aXRjaCAoZXJyb3JfbnVtYmVyKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7CisgICAgICAKKyNpZmRlZiBFUFJPVE9OT1NVUFBPUlQKKyAgICBjYXNlIEVQUk9UT05PU1VQUE9SVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKKyNpZmRlZiBXU0FFUFJPVE9OT1NVUFBPUlQKKyAgICBjYXNlIFdTQUVQUk9UT05PU1VQUE9SVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKKyNpZmRlZiBFQUZOT1NVUFBPUlQKKyAgICBjYXNlIEVBRk5PU1VQUE9SVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKKyNpZmRlZiBXU0FFQUZOT1NVUFBPUlQKKyAgICBjYXNlIFdTQUVBRk5PU1VQUE9SVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKKyNpZmRlZiBFTkZJTEUKKyAgICBjYXNlIEVORklMRToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRDsgLyoga2VybmVsIG91dCBvZiBtZW1vcnkgKi8KKyNlbmRpZgorI2lmZGVmIEVNRklMRQorICAgIGNhc2UgRU1GSUxFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVEOworI2VuZGlmCisjaWZkZWYgRUFDQ0VTCisgICAgY2FzZSBFQUNDRVM6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEOworI2VuZGlmCisjaWZkZWYgRVBFUk0KKyAgICBjYXNlIEVQRVJNOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRDsKKyNlbmRpZgorI2lmZGVmIEVOT0JVRlMKKyAgICBjYXNlIEVOT0JVRlM6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19NRU1PUlk7CisjZW5kaWYKKyNpZmRlZiBFTk9NRU0KKyAgICBjYXNlIEVOT01FTToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX01FTU9SWTsKKyNlbmRpZgorI2lmZGVmIEVDT05OUkVGVVNFRAorICAgIGNhc2UgRUNPTk5SRUZVU0VEOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fU0VSVkVSOworI2VuZGlmCisjaWZkZWYgV1NBRUNPTk5SRUZVU0VECisgICAgY2FzZSBXU0FFQ09OTlJFRlVTRUQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19TRVJWRVI7CisjZW5kaWYKKyNpZmRlZiBFVElNRURPVVQKKyAgICBjYXNlIEVUSU1FRE9VVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX1RJTUVPVVQ7CisjZW5kaWYKKyNpZmRlZiBXU0FFVElNRURPVVQKKyAgICBjYXNlIFdTQUVUSU1FRE9VVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX1RJTUVPVVQ7CisjZW5kaWYKKyNpZmRlZiBFTkVUVU5SRUFDSAorICAgIGNhc2UgRU5FVFVOUkVBQ0g6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19ORVRXT1JLOworI2VuZGlmCisjaWZkZWYgV1NBRU5FVFVOUkVBQ0gKKyAgICBjYXNlIFdTQUVORVRVTlJFQUNIOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTkVUV09SSzsKKyNlbmRpZgorI2lmZGVmIEVBRERSSU5VU0UKKyAgICBjYXNlIEVBRERSSU5VU0U6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRTsKKyNlbmRpZgorI2lmZGVmIFdTQUVBRERSSU5VU0UKKyAgICBjYXNlIFdTQUVBRERSSU5VU0U6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRTsKKyNlbmRpZgorI2lmZGVmIEVFWElTVAorICAgIGNhc2UgRUVYSVNUOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRklMRV9FWElTVFM7CisjZW5kaWYKKyNpZmRlZiBFTk9FTlQKKyAgICBjYXNlIEVOT0VOVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0ZJTEVfTk9UX0ZPVU5EOworI2VuZGlmCisgICAgfQorCisgIHJldHVybiBEQlVTX0VSUk9SX0ZBSUxFRDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgY3VycmVudCBzeXN0ZW0gZXJybm8gdmFsdWUgaW50byBhICNEQnVzRXJyb3IgbmFtZS4KKyAqCisgKiBAcmV0dXJucyBhbiBlcnJvciBuYW1lCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19lcnJvcl9mcm9tX3N5c3RlbV9lcnJubyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKTsKK30KKworLyoqCisgKiBBc3NpZ24gMCB0byB0aGUgZ2xvYmFsIGVycm5vIHZhcmlhYmxlCisgKi8KK3ZvaWQKK19kYnVzX3NldF9lcnJub190b196ZXJvICh2b2lkKQoreworI2lmZGVmIERCVVNfV0lOQ0UKKyAgU2V0TGFzdEVycm9yICgwKTsKKyNlbHNlCisgIGVycm5vID0gMDsKKyNlbmRpZgorfQorCisvKioKKyAqIFNlZSBpZiBlcnJubyBpcyBzZXQKKyAqIEByZXR1cm5zICNUUlVFIGlmIGVycm5vIGlzIG5vdCAwCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfaXNfZXJybm9fbm9uemVybyAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vICE9IDA7Cit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIEVOT01FTQorICogQHJldHVybnMgI1RSVUUgaWYgZXJybm8gPT0gRU5PTUVNCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfaXNfZXJybm9fZW5vbWVtICh2b2lkKQoreworICByZXR1cm4gZXJybm8gPT0gRU5PTUVNOworfQorCisvKioKKyAqIFNlZSBpZiBlcnJubyBpcyBFSU5UUgorICogQHJldHVybnMgI1RSVUUgaWYgZXJybm8gPT0gRUlOVFIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19laW50ciAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vID09IEVJTlRSOworfQorCisvKioKKyAqIFNlZSBpZiBlcnJubyBpcyBFUElQRQorICogQHJldHVybnMgI1RSVUUgaWYgZXJybm8gPT0gRVBJUEUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lcGlwZSAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vID09IEVQSVBFOworfQorCisvKioKKyAqIEdldCBlcnJvciBtZXNzYWdlIGZyb20gZXJybm8KKyAqIEByZXR1cm5zIF9kYnVzX3N0cmVycm9yKGVycm5vKQorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmVycm9yIChlcnJubyk7Cit9CisKKy8qKiBAfSBlbmQgb2Ygc3lzZGVwcyAqLworCisvKiB0ZXN0cyBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtc3lzZGVwcy5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQ3OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXN5c2RlcHMuaApAQCAtMCwwICsxLDU0MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuaCBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1lTREVQU19ICisjZGVmaW5lIERCVVNfU1lTREVQU19ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1maWxlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCisvKiB0aGlzIGlzIHBlcmhhcHMgYm9ndXMsIGJ1dCBzdHJjbXAoKSBldGMuIGFyZSBmYXN0ZXIgaWYgd2UgdXNlIHRoZQorICogc3R1ZmYgc3RyYWlnaHQgb3V0IG9mIHN0cmluZy5oLCBzbyBoYXZlIHRoaXMgaGVyZSBmb3Igbm93LgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIEFJWCBzeXMvcG9sbC5oIGRvZXMgI2RlZmluZSBldmVudHMgcmVxZXZlbnRzLCBhbmQgb3RoZXIKKyAqIHdvbmRlcm91c25lc3MsIHNvIG11c3QgaW5jbHVkZSBzeXMvcG9sbCBiZWZvcmUgZGVjbGFyaW5nCisgKiBEQnVzUG9sbEZECisgKi8gCisjaWZkZWYgSEFWRV9QT0xMCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU5DRQorLyogV2luZG93cyBDRSBsYWNrcyBzb21lIHN5c3RlbSBmdW5jdGlvbnMgKHN1Y2ggYXMgZXJybm8gYW5kIGNsb2NrKS4KKyAgIFdlIGJyaW5nIHRoZW0gaW4gaGVyZS4gICovCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCIKKyNlbmRpZgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBEQlVTX1dJTgorI2RlZmluZSBfREJVU19QQVRIX1NFUEFSQVRPUiAiOyIKKyNlbHNlCisjZGVmaW5lIF9EQlVTX1BBVEhfU0VQQVJBVE9SICI6IgorI2VuZGlmCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCisKKworLyoqIEFuIG9wYXF1ZSBsaXN0IHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNMaXN0IERCdXNMaXN0OworCisvKiogT2JqZWN0IHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGNyZWRlbnRpYWxzIHN1Y2ggYXMgVU5JWCBvciBXaW5kb3dzIHVzZXIgSUQgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNDcmVkZW50aWFscyBEQnVzQ3JlZGVudGlhbHM7CisKKy8qKiBBIHdyYXBwZXIgYXJvdW5kIGEgcGlwZSBkZXNjcmlwdG9yIG9yIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1BpcGUgREJ1c1BpcGU7CisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1N5c2RlcHMKKyAqCisgKiBAeworICovCisKK3ZvaWQgX2RidXNfYWJvcnQgKHZvaWQpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK2NvbnN0IGNoYXIqIF9kYnVzX2dldGVudiAoY29uc3QgY2hhciAqdmFybmFtZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zZXRlbnYgKGNvbnN0IGNoYXIgKnZhcm5hbWUsCisJCQkgIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2RidXNfYm9vbF90IF9kYnVzX2NsZWFyZW52ICh2b2lkKTsKK2NoYXIgKiogICAgIF9kYnVzX2dldF9lbnZpcm9ubWVudCAodm9pZCk7CisKKy8qKiBBIHByb2Nlc3MgSUQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkYnVzX3BpZF90OworLyoqIEEgdXNlciBJRCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRidXNfdWlkX3Q7CisvKiogQSBncm91cCBJRCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRidXNfZ2lkX3Q7CisKKy8qKiBhbiBpbnZhbGlkIFBJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfcGlkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19QSURfVU5TRVQgKChkYnVzX3BpZF90KSAtMSkKKy8qKiBhbiBpbnZhbGlkIFVJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfdWlkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19VSURfVU5TRVQgKChkYnVzX3VpZF90KSAtMSkKKy8qKiBhbiBpbnZhbGlkIEdJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfZ2lkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19HSURfVU5TRVQgKChkYnVzX2dpZF90KSAtMSkKKworLyoqIGFuIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGRidXNfcGlkX3QgKi8KKyNkZWZpbmUgREJVU19QSURfRk9STUFUICIlbHUiCisvKiogYW4gYXBwcm9wcmlhdGUgcHJpbnRmIGZvcm1hdCBmb3IgZGJ1c191aWRfdCAqLworI2RlZmluZSBEQlVTX1VJRF9GT1JNQVQgIiVsdSIKKy8qKiBhbiBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBkYnVzX2dpZF90ICovCisjZGVmaW5lIERCVVNfR0lEX0ZPUk1BVCAiJWx1IgorCisKKy8qKgorICogU29ja2V0IGludGVyZmFjZQorICoKKyAqICBAdG9kbyBVc2UgZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGEgc3RydWN0CisgKiAgICAgICAgICAgLSBzdHJ1Y3QgREJ1c1NvY2tldHsgaW50IGQ7IH07IC0KKyAqICAgICAgICBpbnN0ZWFkIG9mIGludCB0byBnZXQgdHlwZS1zYWZldHkgd2hpY2ggCisgKiAgICAgICAgd2lsbCBiZSBjaGVja2VkIGJ5IHRoZSBjb21waWxlci4KKyAqIAorICovCisKK2RidXNfYm9vbF90IF9kYnVzX29wZW5fdGNwX3NvY2tldCAgKGludCAgICAgICAgICAgICAgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfY2xvc2Vfc29ja2V0ICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitpbnQgICAgICAgICBfZGJ1c19yZWFkX3NvY2tldCAgICAgIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50KTsKK2ludCAgICAgICAgIF9kYnVzX3dyaXRlX3NvY2tldCAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pOworaW50ICAgICAgICAgX2RidXNfd3JpdGVfc29ja2V0X3R3byAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yKTsKKworaW50IF9kYnVzX3JlYWRfc29ja2V0X3dpdGhfdW5peF9mZHMgICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5fZmRzKTsKK2ludCBfZGJ1c193cml0ZV9zb2NrZXRfd2l0aF91bml4X2ZkcyAgICAgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2Zkcyk7CitpbnQgX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2Zkcyk7CisKK2RidXNfYm9vbF90IF9kYnVzX3NvY2tldF9pc19pbnZhbGlkIChpbnQgICAgICAgICAgICAgIGZkKTsKKworaW50IF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCAgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2ludCBfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXRfd2l0aF9ub25jZSAgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitpbnQgX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgICAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqcmV0cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICoqZmRzX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2ludCBfZGJ1c19hY2NlcHQgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICAgbGlzdGVuX2ZkKTsKKworCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3NvY2tldCAoaW50ICAgICAgICAgICAgICAgY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3NlbmRfY3JlZGVudGlhbHNfc29ja2V0IChpbnQgICAgICAgICAgICAgIHNlcnZlcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fdXNlciAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUpOworZGJ1c19ib29sX3QgX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19wYXJzZV91bml4X3VzZXJfZnJvbV9jb25maWcgICAoY29uc3QgREJ1c1N0cmluZyAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWRfcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnICAoY29uc3QgREJ1c1N0cmluZyAgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkX3ApOworZGJ1c19ib29sX3QgX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgICAgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpOworZGJ1c19ib29sX3QgX2RidXNfdW5peF91c2VyX2lzX2F0X2NvbnNvbGUgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkKTsKK2RidXNfYm9vbF90IF9kYnVzX3dpbmRvd3NfdXNlcl9pc19wcm9jZXNzX293bmVyIChjb25zdCBjaGFyICAgICAgICAqd2luZG93c19zaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19hcHBlbmRfa2V5cmluZ19kaXJlY3RvcnlfZm9yX2NyZWRlbnRpYWxzIChEQnVzU3RyaW5nICAgICAgKmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19kYWVtb25faXNfc2Vzc2lvbl9idXNfYWRkcmVzc19wdWJsaXNoZWQgKGNvbnN0IGNoYXIgKnNjb3BlKTsKKworZGJ1c19ib29sX3QgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAoY29uc3QgY2hhciogYWRkcmVzcywgY29uc3QgY2hhciogc2htX25hbWUpOworCit2b2lkIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3NvY2tldF9jYW5fcGFzc191bml4X2ZkKGludCBmZCk7CisKKy8qKiBPcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYW4gYXRvbWljYWxseS1tb2RpZmlhYmxlIGludGVnZXIKKyAqIHRoYXQgY2FuIGJlIHVzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzQXRvbWljIERCdXNBdG9taWM7CisKKy8qKgorICogQW4gYXRvbWljIGludGVnZXIgc2FmZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAqLworc3RydWN0IERCdXNBdG9taWMKK3sKKyNpZmRlZiBEQlVTX1dJTgorICB2b2xhdGlsZSBsb25nIHZhbHVlOyAvKio8IFZhbHVlIG9mIHRoZSBhdG9taWMgaW50ZWdlci4gKi8KKyNlbHNlCisgIHZvbGF0aWxlIGRidXNfaW50MzJfdCB2YWx1ZTsgLyoqPCBWYWx1ZSBvZiB0aGUgYXRvbWljIGludGVnZXIuICovCisjZW5kaWYKK307CisKKy8qIFRoZSB2YWx1ZSB3ZSBnZXQgZnJvbSBhdXRvZm9vIGlzIGluIHRoZSBmb3JtIG9mIGEgY3BwIGV4cHJlc3Npb247CisgKiBjb252ZXJ0IHRoYXQgdG8gYSBjb252ZW50aW9uYWwgZGVmaW5lZC91bmRlZiBzd2l0Y2guIChXZSBjYW4ndCBnZXQKKyAqIHRoZSBjb252ZW50aW9uYWwgZGVmaW5lZC91bmRlZiBiZWNhdXNlIG9mIG11bHRpYXJjaCBidWlsZHMgb25seSBydW5uaW5nCisgKiAuL2NvbmZpZ3VyZSBvbmNlLCBvbiBEYXJ3aW4uKSAqLworI2lmIERCVVNfSEFWRV9BVE9NSUNfSU5UX0NPTkQKKyMgICBkZWZpbmUgREJVU19IQVZFX0FUT01JQ19JTlQgMQorI2Vsc2UKKyMgICB1bmRlZiBEQlVTX0hBVkVfQVRPTUlDX0lOVAorI2VuZGlmCisKK2RidXNfaW50MzJfdCBfZGJ1c19hdG9taWNfaW5jIChEQnVzQXRvbWljICphdG9taWMpOworZGJ1c19pbnQzMl90IF9kYnVzX2F0b21pY19kZWMgKERCdXNBdG9taWMgKmF0b21pYyk7CisKKworLyogQUlYIHVzZXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgcG9sbCAqLworCisjaWZkZWYgX0FJWAorLyoqIFRoZXJlIGlzIGRhdGEgdG8gcmVhZCAqLworI2RlZmluZSBfREJVU19QT0xMSU4gICAgICAweDAwMDEKKy8qKiBUaGVyZSBpcyB1cmdlbnQgZGF0YSB0byByZWFkICovCisjZGVmaW5lIF9EQlVTX1BPTExQUkkgICAgIDB4MDAwNAorLyoqIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrICovCisjZGVmaW5lIF9EQlVTX1BPTExPVVQgICAgIDB4MDAwMgorLyoqIEVycm9yIGNvbmRpdGlvbiAqLworI2RlZmluZSBfREJVU19QT0xMRVJSICAgICAweDQwMDAKKy8qKiBIdW5nIHVwICovCisjZGVmaW5lIF9EQlVTX1BPTExIVVAgICAgIDB4MjAwMAorLyoqIEludmFsaWQgcmVxdWVzdDogZmQgbm90IG9wZW4gKi8KKyNkZWZpbmUgX0RCVVNfUE9MTE5WQUwgICAgMHg4MDAwCisjZWxpZiBkZWZpbmVkKF9fSEFJS1VfXykKKy8qKiBUaGVyZSBpcyBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTElOICAgICAgMHgwMDAxCisvKiogV3JpdGluZyBub3cgd2lsbCBub3QgYmxvY2sgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTE9VVCAgICAgMHgwMDAyCisvKiogRXJyb3IgY29uZGl0aW9uICovCisjZGVmaW5lIF9EQlVTX1BPTExFUlIgICAgIDB4MDAwNAorLyoqIFRoZXJlIGlzIHVyZ2VudCBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTFBSSSAgICAgMHgwMDIwCisvKiogSHVuZyB1cCAqLworI2RlZmluZSBfREJVU19QT0xMSFVQICAgICAweDAwODAKKy8qKiBJbnZhbGlkIHJlcXVlc3Q6IGZkIG5vdCBvcGVuICovCisjZGVmaW5lIF9EQlVTX1BPTExOVkFMICAgIDB4MTAwMAorI2Vsc2UKKy8qKiBUaGVyZSBpcyBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTElOICAgICAgMHgwMDAxCisvKiogVGhlcmUgaXMgdXJnZW50IGRhdGEgdG8gcmVhZCAqLworI2RlZmluZSBfREJVU19QT0xMUFJJICAgICAweDAwMDIKKy8qKiBXcml0aW5nIG5vdyB3aWxsIG5vdCBibG9jayAqLworI2RlZmluZSBfREJVU19QT0xMT1VUICAgICAweDAwMDQKKy8qKiBFcnJvciBjb25kaXRpb24gKi8KKyNkZWZpbmUgX0RCVVNfUE9MTEVSUiAgICAgMHgwMDA4CisvKiogSHVuZyB1cCAqLworI2RlZmluZSBfREJVU19QT0xMSFVQICAgICAweDAwMTAKKy8qKiBJbnZhbGlkIHJlcXVlc3Q6IGZkIG5vdCBvcGVuICovCisjZGVmaW5lIF9EQlVTX1BPTExOVkFMICAgIDB4MDAyMAorI2VuZGlmCisKKy8qKgorICogQSBwb3J0YWJsZSBzdHJ1Y3QgcG9sbGZkIHdyYXBwZXIuIAorICovCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgZmQ7ICAgICAgICAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3IgKi8KKyAgc2hvcnQgZXZlbnRzOyAgICAgIC8qKjwgRXZlbnRzIHRvIHBvbGwgZm9yICovCisgIHNob3J0IHJldmVudHM7ICAgICAvKio8IEV2ZW50cyB0aGF0IG9jY3VycmVkICovCit9IERCdXNQb2xsRkQ7CisKK2ludCBfZGJ1c19wb2xsIChEQnVzUG9sbEZEICpmZHMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworCit2b2lkIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoaW50IG1pbGxpc2Vjb25kcyk7CisKK3ZvaWQgX2RidXNfZ2V0X2N1cnJlbnRfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjKTsKKworLyoqCisgKiBkaXJlY3RvcnkgaW50ZXJmYWNlCisgKi8KK2RidXNfYm9vbF90ICAgIF9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19kZWxldGVfZGlyZWN0b3J5ICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisJCQkJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoREJ1c1N0cmluZyAgICAgICAqZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqbmV4dF9jb21wb25lbnQpOworZGJ1c19ib29sX3QgX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkaXJuYW1lKTsKK2RidXNfYm9vbF90IF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKERCdXNMaXN0ICoqZGlycyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfc3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19hcHBlbmRfc3lzdGVtX2NvbmZpZ19maWxlICAoREJ1c1N0cmluZyAqc3RyKTsKK2RidXNfYm9vbF90IF9kYnVzX2FwcGVuZF9zZXNzaW9uX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpOworCisvKiogT3BhcXVlIHR5cGUgZm9yIHJlYWRpbmcgYSBkaXJlY3RvcnkgbGlzdGluZyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0Rpckl0ZXIgREJ1c0Rpckl0ZXI7CisKK0RCdXNEaXJJdGVyKiBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICBfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoREJ1c0Rpckl0ZXIgICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgICAgICAgICAoREJ1c0Rpckl0ZXIgICAgICAqaXRlcik7CisKK2RidXNfYm9vbF90ICBfZGJ1c19jaGVja19kaXJfaXNfcHJpdmF0ZV90b191c2VyICAgIChEQnVzU3RyaW5nICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK3ZvaWQgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGludHB0cl90IGZkKTsKKworY29uc3QgY2hhciogX2RidXNfZ2V0X3RtcGRpciAgICAgICh2b2lkKTsKKworLyoqCisgKiBSYW5kb20gbnVtYmVycyAKKyAqLwordm9pZCAgICAgICAgX2RidXNfZ2VuZXJhdGVfcHNldWRvcmFuZG9tX2J5dGVzX2J1ZmZlciAoY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbl9ieXRlcyk7Cit2b2lkICAgICAgICBfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyIChjaGFyICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2J5dGVzKTsKK2RidXNfYm9vbF90IF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAgICAgICAgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMpOworZGJ1c19ib29sX3QgX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICAgICAgICAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcyk7CisKK2NvbnN0IGNoYXIqIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGludCBlcnJvcl9udW1iZXIpOworY29uc3QgY2hhciogX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKHZvaWQpOworCit2b2lkICAgICAgICBfZGJ1c19zZXRfZXJybm9fdG9femVybyAgICAgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19ub256ZXJvICAgICAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaXNfZXJybm9fZW5vbWVtICAgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19laW50ciAgICAgICAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2lzX2Vycm5vX2VwaXBlICAgICAgICAgICAgICAgICAodm9pZCk7Citjb25zdCBjaGFyKiBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICAgICAgICAgICAgICAgICh2b2lkKTsKKwordm9pZCBfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpOworCisKK3ZvaWQgX2RidXNfZXhpdCAoaW50IGNvZGUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK2ludCBfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKTsKKworCisvKioKKyAqIFBvcnRhYmxlIHN0cnVjdCB3aXRoIHN0YXQoKSByZXN1bHRzCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgbW9kZTsgIC8qKjwgRmlsZSBtb2RlICovCisgIHVuc2lnbmVkIGxvbmcgbmxpbms7IC8qKjwgTnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KKyAgZGJ1c191aWRfdCAgICB1aWQ7ICAgLyoqPCBVc2VyIG93bmluZyBmaWxlICovCisgIGRidXNfZ2lkX3QgICAgZ2lkOyAgIC8qKjwgR3JvdXAgb3duaW5nIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyBzaXplOyAgLyoqPCBTaXplIG9mIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyBhdGltZTsgLyoqPCBBY2Nlc3MgdGltZSAqLworICB1bnNpZ25lZCBsb25nIG10aW1lOyAvKio8IE1vZGlmeSB0aW1lICovCisgIHVuc2lnbmVkIGxvbmcgY3RpbWU7IC8qKjwgQ3JlYXRpb24gdGltZSAqLworfSBEQnVzU3RhdDsKKworZGJ1c19ib29sX3QgX2RidXNfc3RhdCAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RhdCAgICAgICAgICpzdGF0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfZnVsbF9kdXBsZXhfcGlwZSAoaW50ICAgICAgICAgICAgICAqZmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYmxvY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK3ZvaWQgICAgICAgIF9kYnVzX3ByaW50X2JhY2t0cmFjZSAgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19iZWNvbWVfZGFlbW9uICAgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAga2VlcF91bWFzayk7CisKK2RidXNfYm9vbF90IF9kYnVzX3ZlcmlmeV9kYWVtb25fdXNlciAgICAoY29uc3QgY2hhciAqdXNlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgKGNvbnN0IGNoYXIgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgICAgICAgcGlkX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfY29tbWFuZF9mb3JfcGlkICh1bnNpZ25lZCBsb25nICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpOworCisvKiogQSBVTklYIHNpZ25hbCBoYW5kbGVyICovCit0eXBlZGVmIHZvaWQgKCogREJ1c1NpZ25hbEhhbmRsZXIpIChpbnQgc2lnKTsKKwordm9pZCBfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKGludCAgICAgICAgICAgICAgIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2lnbmFsSGFuZGxlciBoYW5kbGVyKTsKKworZGJ1c19ib29sX3QgX2RidXNfdXNlcl9hdF9jb25zb2xlIChjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCit2b2lkIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAodm9pZCk7CisKK3R5cGVkZWYgZW51bSB7CisgIERCVVNfU1lTVEVNX0xPR19JTkZPLAorICBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFksCisgIERCVVNfU1lTVEVNX0xPR19GQVRBTAorfSBEQnVzU3lzdGVtTG9nU2V2ZXJpdHk7CisKK3ZvaWQgX2RidXNfc3lzdGVtX2xvZyAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDIsIDMpOwordm9pZCBfZGJ1c19zeXN0ZW1fbG9ndiAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyICptc2csIHZhX2xpc3QgYXJncyk7CisKKy8qIERlZmluZSBEQlVTX1ZBX0NPUFkoKSB0byBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIGNvcHlpbmcgdmFfbGlzdCB2YXJpYWJsZXMuCisgKiBjb25maWcuaCBtYXkgaGF2ZSBhbHJlYWR5IGRlZmluZWQgREJVU19WQV9DT1BZIGFzIHZhX2NvcHkgb3IgX192YV9jb3B5LgorICovCisjaWYgIWRlZmluZWQgKERCVVNfVkFfQ09QWSkKKyMgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX1BQQ19fKSAmJiAoZGVmaW5lZCAoX0NBTExfU1lTVikgfHwgZGVmaW5lZCAoX1dJTjMyKSkKKyMgICAgZGVmaW5lIERCVVNfVkFfQ09QWShhcDEsIGFwMikgICAoKihhcDEpID0gKihhcDIpKQorIyAgZWxpZiBkZWZpbmVkIChEQlVTX1ZBX0NPUFlfQVNfQVJSQVkpCisjICAgIGRlZmluZSBEQlVTX1ZBX0NPUFkoYXAxLCBhcDIpICAgbWVtY3B5ICgoYXAxKSwgKGFwMiksIHNpemVvZiAodmFfbGlzdCkpCisjICBlbHNlIC8qIHZhX2xpc3QgaXMgYSBwb2ludGVyICovCisjICAgIGRlZmluZSBEQlVTX1ZBX0NPUFkoYXAxLCBhcDIpICAgKChhcDEpID0gKGFwMikpCisjICBlbmRpZiAvKiB2YV9saXN0IGlzIGEgcG9pbnRlciAqLworI2VuZGlmIC8qICFEQlVTX1ZBX0NPUFkgKi8KKworCisvKioKKyAqIENhc3RzIGEgcHJpbWl0aXZlIEMgdHlwZSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gaW5kZXhlcworICogYSBwYXJ0aWN1bGFyIGJ5dGUgb2YgdGhlIGFycmF5LgorICovCisjZGVmaW5lIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFKHAsIGkpIFwKKyAgICAoKChjb25zdCBjaGFyKikmKHApKVsoaSldKQorLyoqIE9uIHg4NiB0aGVyZSBpcyBhbiA4MC1iaXQgRlBVLCBhbmQgaWYgeW91IGRvICJhID09IGIiIGl0IG1heSBoYXZlIGEKKyAqIG9yIGIgaW4gYW4gODAtYml0IHJlZ2lzdGVyLCB0aHVzIGZhaWxpbmcgdG8gY29tcGFyZSB0aGUgdHdvIDY0LWJpdAorICogZG91YmxlcyBmb3IgYml0d2lzZSBlcXVhbGl0eS4gU28gdGhpcyBtYWNybyBjb21wYXJlcyB0aGUgdHdvIGRvdWJsZXMKKyAqIGJpdHdpc2UuCisgKi8KKyNkZWZpbmUgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDApID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCAwKSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgMSkgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDEpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCAyKSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgMikgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDMpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCAzKSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgNCkgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDQpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCA1KSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgNSkgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDYpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCA2KSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgNykgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDcpKQorCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzIChjb25zdCBjaGFyICpzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgKmFkZHJlc3MsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3MgKGRidXNfYm9vbF90ICpzdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcik7CisKKy8qKiBUeXBlIHJlcHJlc2VudGluZyBhIHVuaXZlcnNhbGx5IHVuaXF1ZSBJRAorICogQHRvZG8gcmVuYW1lIHRvIFVVSUQgaW5zdGVhZCBvZiBHVUlECisgKi8KK3R5cGVkZWYgdW5pb24gREJ1c0dVSUQgREJ1c0dVSUQ7CisKK2RidXNfYm9vbF90IF9kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkICAgKERCdXNHVUlEICAgICAgICAgKm1hY2hpbmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhyZWFkcyBhcyBpbiBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCksIGFwcHJvcHJpYXRlbHkKKyAqIGZvciB0aGUgcGxhdGZvcm0uCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90IF9kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKERCdXNTdHJpbmcgKmRpcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VmZml4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGlyX2xpc3QpOworCit1bnNpZ25lZCBsb25nIF9kYnVzX3BpZF9mb3JfbG9nICh2b2lkKTsKKworLyogRklYTUUgbW92ZSBiYWNrIHRvIGRidXMtc3lzZGVwcy11bml4LmggcHJvYmFibHkgLQorICogdGhlIFBJRCBmaWxlIGhhbmRsaW5nIGp1c3QgbmVlZHMgYSBsaXR0bGUgbW9yZSBhYnN0cmFjdGlvbgorICogaW4gdGhlIGJ1cyBkYWVtb24gZmlyc3QuCisgKi8KK2RidXNfcGlkX3QgICAgX2RidXNfZ2V0cGlkICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK3ZvaWQgX2RidXNfZmx1c2hfY2FjaGVzICh2b2lkKTsKKwordm9pZCBfZGJ1c19yZXF1ZXN0X2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAodW5zaWduZWQgaW50IGxpbWl0KTsKKworLyoKKyAqIHJlcGxhY2VzIHRoZSB0ZXJtIERCVVNfUFJFRklYIGluIGNvbmZpZ3VyZV90aW1lX3BhdGggYnkgdGhlCisgKiBjdXJyZW50IGRidXMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gT24gdW5peCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm9vcAorICoKKyAqIEBwYXJhbSBjb25maWd1cmVfdGltZV9wYXRoCisgKiBAcmV0dXJuIHJlYWwgcGF0aAorICovCitjb25zdCBjaGFyICoKK19kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKGNvbnN0IGNoYXIgKmNvbmZpZ3VyZV90aW1lX3BhdGgpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworCisjaWZkZWYgREJVU19XSU4KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luLmgiCisjZW5kaWYKKworI2VuZGlmIC8qIERCVVNfU1lTREVQU19IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGVzdC1tYWluLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGVzdC1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlZjc4MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10ZXN0LW1haW4uYwpAQCAtMCwwICsxLDU4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGVzdC5jICBQcm9ncmFtIHRvIHJ1biBhbGwgdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXR5cGVzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyOworICBjb25zdCBjaGFyICpzcGVjaWZpY190ZXN0OworCisjaWYgSEFWRV9TRVRMT0NBTEUKKyAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOworI2VuZGlmCisgIAorICBpZiAoYXJnYyA+IDEpCisgICAgdGVzdF9kYXRhX2RpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICB0ZXN0X2RhdGFfZGlyID0gTlVMTDsKKworICBpZiAoYXJnYyA+IDIpCisgICAgc3BlY2lmaWNfdGVzdCA9IGFyZ3ZbMl07CisgIGVsc2UKKyAgICBzcGVjaWZpY190ZXN0ID0gTlVMTDsKKyAgCisgIGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMgKHRlc3RfZGF0YV9kaXIsIHNwZWNpZmljX3Rlc3QpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGVzdC5jIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI0YzkzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRlc3QuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QuYyAgUHJvZ3JhbSB0byBydW4gYWxsIHRlc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVuaXQgdGVzdCBmYWlsZWQ6ICVzXG4iLCBmYWlsdXJlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAodm9pZCkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBwcmludGYgKCIlczogY2hlY2tpbmcgZm9yIG1lbWxlYWtzXG4iLCAiZGJ1cy10ZXN0Iik7CisgIGlmIChfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlZCBkYnVzX21hbGxvYyBibG9ja3Mgd2VyZSBub3QgZnJlZWRcbiIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSk7CisgICAgICBkaWUgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKlRlc3RGdW5jKSh2b2lkKTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCpUZXN0RGF0YUZ1bmMpKGNvbnN0IGNoYXIgKmRhdGEpOworCitzdGF0aWMgdm9pZAorcnVuX3Rlc3QgKGNvbnN0IGNoYXIgICAgICAgICAgICAgKnRlc3RfbmFtZSwKKwkgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKnNwZWNpZmljX3Rlc3QsCisJICBUZXN0RnVuYyAgICAgICAgICAgICAgICB0ZXN0KQoreworICBpZiAoIXNwZWNpZmljX3Rlc3QgfHwgc3RyY21wIChzcGVjaWZpY190ZXN0LCB0ZXN0X25hbWUpID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiJXM6IHJ1bm5pbmcgJXMgdGVzdHNcbiIsICJkYnVzLXRlc3QiLCB0ZXN0X25hbWUpOworICAgICAgaWYgKCF0ZXN0ICgpKQorCWRpZSAodGVzdF9uYW1lKTsKKyAgICB9CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitydW5fZGF0YV90ZXN0IChjb25zdCBjaGFyICAgICAgICAgICAgICp0ZXN0X25hbWUsCisJICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKnNwZWNpZmljX3Rlc3QsCisJICAgICAgIFRlc3REYXRhRnVuYyAgICAgICAgICAgIHRlc3QsCisJICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICghc3BlY2lmaWNfdGVzdCB8fCBzdHJjbXAgKHNwZWNpZmljX3Rlc3QsIHRlc3RfbmFtZSkgPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIlczogcnVubmluZyAlcyB0ZXN0c1xuIiwgImRidXMtdGVzdCIsIHRlc3RfbmFtZSk7CisgICAgICBpZiAoIXRlc3QgKHRlc3RfZGF0YV9kaXIpKQorCWRpZSAodGVzdF9uYW1lKTsKKyAgICB9CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCisKKy8qKgorICogQW4gZXhwb3J0ZWQgc3ltYm9sIHRvIGJlIHJ1biBpbiBvcmRlciB0byBleGVjdXRlCisgKiB1bml0IHRlc3RzLiBTaG91bGQgbm90IGJlIHVzZWQgYnkKKyAqIGFueSBhcHAgb3RoZXIgdGhhbiBvdXIgdGVzdCBhcHAsIHRoaXMgc3ltYm9sCisgKiB3b24ndCBleGlzdCBpbiBzb21lIGJ1aWxkcyBvZiB0aGUgbGlicmFyeS4KKyAqICh3aXRoIC0tZW5hYmxlLXRlc3RzPW5vKQorICoKKyAqIEBwYXJhbSB0ZXN0X2RhdGFfZGlyIHRoZSBkaXJlY3Rvcnkgd2l0aCB0ZXN0IGRhdGEgKHRlc3QvZGF0YSBub3JtYWxseSkKKyAqLwordm9pZAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpciwgY29uc3QgY2hhciAqc3BlY2lmaWNfdGVzdCkKK3sKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisgIGlmICghX2RidXNfdGhyZWFkc19pbml0X2RlYnVnICgpKQorICAgIGRpZSAoImRlYnVnIHRocmVhZHMgaW5pdCIpOworICAKKyAgaWYgKHRlc3RfZGF0YV9kaXIgPT0gTlVMTCkKKyAgICB0ZXN0X2RhdGFfZGlyID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKTsKKworICBpZiAodGVzdF9kYXRhX2RpciAhPSBOVUxMKQorICAgIHByaW50ZiAoIlRlc3QgZGF0YSBpbiAlc1xuIiwgdGVzdF9kYXRhX2Rpcik7CisgIGVsc2UKKyAgICBwcmludGYgKCJObyB0ZXN0IGRhdGEhXG4iKTsKKworICBydW5fdGVzdCAoInN0cmluZyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3N0cmluZ190ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgic3lzZGVwcyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3N5c2RlcHNfdGVzdCk7CisgIAorICBydW5fdGVzdCAoImRhdGEtc2xvdCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2RhdGFfc2xvdF90ZXN0KTsKKworICBydW5fdGVzdCAoIm1pc2MiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19taXNjX3Rlc3QpOworICAKKyAgcnVuX3Rlc3QgKCJhZGRyZXNzIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfYWRkcmVzc190ZXN0KTsKKworICBydW5fdGVzdCAoInNlcnZlciIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3NlcnZlcl90ZXN0KTsKKworICBydW5fdGVzdCAoIm9iamVjdC10cmVlIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfb2JqZWN0X3RyZWVfdGVzdCk7CisKKyAgcnVuX3Rlc3QgKCJzaWduYXR1cmUiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zaWduYXR1cmVfdGVzdCk7CisgIAorICBydW5fdGVzdCAoIm1hcnNoYWxsaW5nIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWFyc2hhbF90ZXN0KTsKKworI2lmIDAKKyAgcHJpbnRmICgiJXM6IHJ1bm5pbmcgcmVjdXJzaXZlIG1hcnNoYWxsaW5nIHRlc3RzXG4iLCAiZGJ1cy10ZXN0Iik7CisgIGlmICghX2RidXNfbWFyc2hhbF9yZWN1cnNpdmVfdGVzdCAoKSkKKyAgICBkaWUgKCJyZWN1cnNpdmUgbWFyc2hhbCIpOworCisgIGNoZWNrX21lbWxlYWtzICgpOworI2Vsc2UKKyAgX2RidXNfd2FybiAoInJlY3Vyc2l2ZSBtYXJzaGFsIHRlc3RzIGRpc2FibGVkXG4iKTsKKyNlbmRpZgorCisgIHJ1bl90ZXN0ICgiYnl0ZXN3YXAiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwX3Rlc3QpOworICAKKyAgcnVuX3Rlc3QgKCJtZW1vcnkiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tZW1vcnlfdGVzdCk7CisKKyNpZiAxCisgIHJ1bl90ZXN0ICgibWVtLXBvb2wiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tZW1fcG9vbF90ZXN0KTsKKyNlbmRpZgorICAKKyAgcnVuX3Rlc3QgKCJsaXN0Iiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbGlzdF90ZXN0KTsKKworICBydW5fdGVzdCAoIm1hcnNoYWwtdmFsaWRhdGUiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgibWFyc2hhbC1oZWFkZXIiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX2hlYWRlcl90ZXN0KTsKKyAgCisgIHJ1bl9kYXRhX3Rlc3QgKCJtZXNzYWdlIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWVzc2FnZV90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKyAgCisgIHJ1bl90ZXN0ICgiaGFzaCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2hhc2hfdGVzdCk7CisKKyNpZiAhZGVmaW5lZChEQlVTX1dJTkNFKQorICBydW5fZGF0YV90ZXN0ICgic3Bhd24iLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zcGF3bl90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKyNlbmRpZgorICAKKyAgcnVuX2RhdGFfdGVzdCAoImNyZWRlbnRpYWxzIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfY3JlZGVudGlhbHNfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgcnVuX2RhdGFfdGVzdCAoInVzZXJkYiIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3VzZXJkYl90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKyNlbmRpZgorICAKKyAgcnVuX3Rlc3QgKCJrZXlyaW5nIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfa2V5cmluZ190ZXN0KTsKKworICBydW5fZGF0YV90ZXN0ICgic2hhIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc2hhX3Rlc3QsIHRlc3RfZGF0YV9kaXIpOworICAKKyAgcnVuX2RhdGFfdGVzdCAoImF1dGgiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19hdXRoX3Rlc3QsIHRlc3RfZGF0YV9kaXIpOworCisgIHJ1bl9kYXRhX3Rlc3QgKCJwZW5kaW5nLWNhbGwiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19wZW5kaW5nX2NhbGxfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisgIAorICBwcmludGYgKCIlczogY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuIiwgImRidXMtdGVzdCIpOworI2Vsc2UKKyAgcHJpbnRmICgiTm90IGNvbXBpbGVkIHdpdGggdW5pdCB0ZXN0cywgbm90IHJ1bm5pbmcgYW55XG4iKTsKKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGVzdC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM4YjBjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRlc3QuaApAQCAtMCwwICsxLDgzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGVzdC5oICBEZWNsYXJhdGlvbnMgb2YgdGVzdCBmdW5jdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1RFU1RfSAorI2RlZmluZSBEQlVTX1RFU1RfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK2RidXNfYm9vbF90IF9kYnVzX2hhc2hfdGVzdCAgICAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZGljdF90ZXN0ICAgICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X3Rlc3QgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX21hcnNoYWxfdGVzdCAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWFyc2hhbF9yZWN1cnNpdmVfdGVzdCAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwX3Rlc3QgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX21hcnNoYWxfaGVhZGVyX3Rlc3QgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWFyc2hhbF92YWxpZGF0ZV90ZXN0ICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19taXNjX3Rlc3QgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX3NpZ25hdHVyZV90ZXN0ICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWVtX3Bvb2xfdGVzdCAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zdHJpbmdfdGVzdCAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2FkZHJlc3NfdGVzdCAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfc2VydmVyX3Rlc3QgICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19tZXNzYWdlX3Rlc3QgICAgICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IF9kYnVzX2F1dGhfdGVzdCAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgX2RidXNfbWQ1X3Rlc3QgICAgICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zaGFfdGVzdCAgICAgICAgICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IF9kYnVzX2tleXJpbmdfdGVzdCAgICAgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfZGF0YV9zbG90X3Rlc3QgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zeXNkZXBzX3Rlc3QgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX3NwYXduX3Rlc3QgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgX2RidXNfdXNlcmRiX3Rlc3QgICAgICAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19tZW1vcnlfdGVzdCAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX29iamVjdF90cmVlX3Rlc3QgICAgICAgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfcGVuZGluZ19jYWxsX3Rlc3QgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19jcmVkZW50aWFsc190ZXN0ICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKKwordm9pZCAgICAgICAgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICp0ZXN0X2RhdGFfZGlyLAorCQkJCQkJCWNvbnN0IGNoYXIgICAgICAgICAgKnNwZWNpZmljX3Rlc3QpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2ZpbGUgIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHkpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2RhdGEgIChjb25zdCBEQnVzU3RyaW5nICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSk7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfbG9hZF9tZXNzYWdlX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhKTsKKworCisvKiByZXR1cm5zIEZBTFNFIG9uIGZhdGFsIGZhaWx1cmUgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0ZvcmVhY2hNZXNzYWdlRmlsZUZ1bmMpIChjb25zdCBEQnVzU3RyaW5nICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhKTsKKworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2ZvcmVhY2hfbWVzc2FnZV9maWxlIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqdGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hNZXNzYWdlRmlsZUZ1bmMgIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAgICAoaW50ICAgICAgICAgICBzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICpib2R5KTsKKworCisjZW5kaWYgLyogREJVU19URVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGhyZWFkcy1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjljZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGhyZWFkcy1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10aHJlYWRzLWludGVybmFsLmggIEQtQnVzIHRocmVhZCBwcmltaXRpdmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RIUkVBRFNfSU5URVJOQUxfSAorI2RlZmluZSBEQlVTX1RIUkVBRFNfSU5URVJOQUxfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aHJlYWRzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c011dGV4KiAgIF9kYnVzX211dGV4X25ldyAgICAgICAgICAgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgIF9kYnVzX211dGV4X2ZyZWUgICAgICAgICAgICAgICAgKERCdXNNdXRleCAgICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfbXV0ZXhfbG9jayAgICAgICAgICAgICAgICAoREJ1c011dGV4ICAgICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19tdXRleF91bmxvY2sgICAgICAgICAgICAgIChEQnVzTXV0ZXggICAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX211dGV4X25ld19hdF9sb2NhdGlvbiAgICAgKERCdXNNdXRleCAgICAgICAgKipsb2NhdGlvbl9wKTsKK3ZvaWQgICAgICAgICBfZGJ1c19tdXRleF9mcmVlX2F0X2xvY2F0aW9uICAgIChEQnVzTXV0ZXggICAgICAgICoqbG9jYXRpb25fcCk7CisKK0RCdXNDb25kVmFyKiBfZGJ1c19jb25kdmFyX25ldyAgICAgICAgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX2ZyZWUgICAgICAgICAgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCk7Cit2b2lkICAgICAgICAgX2RidXNfY29uZHZhcl93YWl0ICAgICAgICAgICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgICAgICAgKm11dGV4KTsKK2RidXNfYm9vbF90ICBfZGJ1c19jb25kdmFyX3dhaXRfdGltZW91dCAgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAgICAgICAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX3dha2Vfb25lICAgICAgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCk7Cit2b2lkICAgICAgICAgX2RidXNfY29uZHZhcl93YWtlX2FsbCAgICAgICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQpOwordm9pZCAgICAgICAgIF9kYnVzX2NvbmR2YXJfbmV3X2F0X2xvY2F0aW9uICAgKERCdXNDb25kVmFyICAgICAgKipsb2NhdGlvbl9wKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gIChEQnVzQ29uZFZhciAgICAgICoqbG9jYXRpb25fcCk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RIUkVBRFNfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRocmVhZHMuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiNjhiYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aHJlYWRzLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10aHJlYWRzLmggIEQtQnVzIHRocmVhZHMgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworc3RhdGljIERCdXNUaHJlYWRGdW5jdGlvbnMgdGhyZWFkX2Z1bmN0aW9ucyA9Cit7CisgIDAsCisgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgIAorICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCit9OworCitzdGF0aWMgaW50IHRocmVhZF9pbml0X2dlbmVyYXRpb24gPSAwOworIAorc3RhdGljIERCdXNMaXN0ICp1bmluaXRpYWxpemVkX211dGV4X2xpc3QgPSBOVUxMOworc3RhdGljIERCdXNMaXN0ICp1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdCA9IE5VTEw7CisKKy8qKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuby1vcCBkZWZhdWx0IG11dGV4IHBvaW50ZXIsIGp1c3QgdG8gYmUgZGlzdGluY3QgZnJvbSAjTlVMTCAqLworI2RlZmluZSBfREJVU19EVU1NWV9NVVRFWCAoKERCdXNNdXRleCopMHhBQkNERUYpCisKKy8qKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuby1vcCBkZWZhdWx0IG11dGV4IHBvaW50ZXIsIGp1c3QgdG8gYmUgZGlzdGluY3QgZnJvbSAjTlVMTCAqLworI2RlZmluZSBfREJVU19EVU1NWV9DT05EVkFSICgoREJ1c0NvbmRWYXIqKTB4QUJDREVGMikKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RocmVhZHNJbnRlcm5hbHMgVGhyZWFkIGZ1bmN0aW9ucworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBfZGJ1c19tdXRleF9sb2NrKCksIGV0Yy4KKyAqCisgKiBGdW5jdGlvbnMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRocmVhZHMgYW5kIHRocmVhZCBsb2Nrcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtdXRleCB1c2luZyB0aGUgZnVuY3Rpb24gc3VwcGxpZWQgdG8gZGJ1c190aHJlYWRzX2luaXQoKSwKKyAqIG9yIGNyZWF0ZXMgYSBuby1vcCBtdXRleCBpZiB0aHJlYWRzIGFyZSBub3QgaW5pdGlhbGl6ZWQuCisgKiBNYXkgcmV0dXJuICNOVUxMIGV2ZW4gaWYgdGhyZWFkcyBhcmUgaW5pdGlhbGl6ZWQsIGluZGljYXRpbmcKKyAqIG91dC1vZi1tZW1vcnkuCisgKgorICogQHJldHVybnMgbmV3IG11dGV4IG9yICNOVUxMCisgKi8KK0RCdXNNdXRleCoKK19kYnVzX211dGV4X25ldyAodm9pZCkKK3sKKyAgaWYgKHRocmVhZF9mdW5jdGlvbnMucmVjdXJzaXZlX211dGV4X25ldykKKyAgICByZXR1cm4gKCogdGhyZWFkX2Z1bmN0aW9ucy5yZWN1cnNpdmVfbXV0ZXhfbmV3KSAoKTsKKyAgZWxzZSBpZiAodGhyZWFkX2Z1bmN0aW9ucy5tdXRleF9uZXcpCisgICAgcmV0dXJuICgqIHRocmVhZF9mdW5jdGlvbnMubXV0ZXhfbmV3KSAoKTsKKyAgZWxzZQorICAgIHJldHVybiBfREJVU19EVU1NWV9NVVRFWDsKK30KKworLyoqCisgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgX2RidXNfbXV0ZXhfbmV3LiAgSXQgaG93ZXZlcgorICogZ2l2ZXMgYW5vdGhlciBsZXZlbCBvZiBpbmRpcmVjdGlvbiBieSBhbGxvY2F0aW5nIGEgcG9pbnRlcgorICogdG8gcG9pbnQgdG8gdGhlIG11dGV4IGxvY2F0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIHRocmVhZGluZworICogbW9kdWxlIHRvIHN3YXAgb3V0IGR1bW15IG11dGV4ZXMgZm9yIHJlYWwgYSByZWFsIG11dGV4IHNvIGxpYnJhcmllcworICogY2FuIGluaXRpYWxpemUgdGhyZWFkcyBldmVuIGFmdGVyIHRoZSBELUJ1cyBBUEkgaGFzIGJlZW4gdXNlZC4KKyAqCisgKiBAcGFyYW0gbG9jYXRpb25fcCB0aGUgbG9jYXRpb24gb2YgdGhlIG5ldyBtdXRleCwgY2FuIHJldHVybiAjTlVMTCBvbiBPT00KKyAqLwordm9pZAorX2RidXNfbXV0ZXhfbmV3X2F0X2xvY2F0aW9uIChEQnVzTXV0ZXggKipsb2NhdGlvbl9wKQoreworICBfZGJ1c19hc3NlcnQgKGxvY2F0aW9uX3AgIT0gTlVMTCk7CisKKyAgKmxvY2F0aW9uX3AgPSBfZGJ1c19tdXRleF9uZXcoKTsKKworICBpZiAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiAhPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gJiYgKmxvY2F0aW9uX3ApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnVuaW5pdGlhbGl6ZWRfbXV0ZXhfbGlzdCwgbG9jYXRpb25fcCkpCisgICAgICAgIHsKKwkgIF9kYnVzX211dGV4X2ZyZWUgKCpsb2NhdGlvbl9wKTsKKwkgICpsb2NhdGlvbl9wID0gTlVMTDsKKwl9CisgICAgfQorfQorCisvKioKKyAqIEZyZWVzIGEgbXV0ZXggY3JlYXRlZCB3aXRoIGRidXNfbXV0ZXhfbmV3KCk7IGRvZXMKKyAqIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfbXV0ZXhfZnJlZSAoREJ1c011dGV4ICptdXRleCkKK3sKKyAgaWYgKG11dGV4KQorICAgIHsKKyAgICAgIGlmIChtdXRleCAmJiB0aHJlYWRfZnVuY3Rpb25zLnJlY3Vyc2l2ZV9tdXRleF9mcmVlKQorICAgICAgICAoKiB0aHJlYWRfZnVuY3Rpb25zLnJlY3Vyc2l2ZV9tdXRleF9mcmVlKSAobXV0ZXgpOworICAgICAgZWxzZSBpZiAobXV0ZXggJiYgdGhyZWFkX2Z1bmN0aW9ucy5tdXRleF9mcmVlKQorICAgICAgICAoKiB0aHJlYWRfZnVuY3Rpb25zLm11dGV4X2ZyZWUpIChtdXRleCk7CisgICAgfQorfQorCisvKioKKyAqIEZyZWVzIGEgbXV0ZXggYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgCisgKiB1bmluaXRpYWxpemVkX211dGV4X2xpc3Q7CisgKiBkb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoREJ1c011dGV4ICoqbG9jYXRpb25fcCkKK3sKKyAgaWYgKGxvY2F0aW9uX3ApCisgICAgeworICAgICAgaWYgKHRocmVhZF9pbml0X2dlbmVyYXRpb24gIT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKQorICAgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnVuaW5pdGlhbGl6ZWRfbXV0ZXhfbGlzdCwgbG9jYXRpb25fcCk7CisKKyAgICAgIF9kYnVzX211dGV4X2ZyZWUgKCpsb2NhdGlvbl9wKTsKKyAgICB9Cit9CisKKy8qKgorICogTG9ja3MgYSBtdXRleC4gRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKiBMb2NrcyBtYXkgYmUgcmVjdXJzaXZlIGlmIHRocmVhZGluZyBpbXBsZW1lbnRhdGlvbiBpbml0aWFsaXplZAorICogcmVjdXJzaXZlIGxvY2tzLgorICovCit2b2lkCitfZGJ1c19tdXRleF9sb2NrIChEQnVzTXV0ZXggKm11dGV4KQoreworICBpZiAobXV0ZXgpIAorICAgIHsKKyAgICAgIGlmICh0aHJlYWRfZnVuY3Rpb25zLnJlY3Vyc2l2ZV9tdXRleF9sb2NrKQorICAgICAgICAoKiB0aHJlYWRfZnVuY3Rpb25zLnJlY3Vyc2l2ZV9tdXRleF9sb2NrKSAobXV0ZXgpOworICAgICAgZWxzZSBpZiAodGhyZWFkX2Z1bmN0aW9ucy5tdXRleF9sb2NrKQorICAgICAgICAoKiB0aHJlYWRfZnVuY3Rpb25zLm11dGV4X2xvY2spIChtdXRleCk7CisgICAgfQorfQorCisvKioKKyAqIFVubG9ja3MgYSBtdXRleC4gRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCit2b2lkCitfZGJ1c19tdXRleF91bmxvY2sgKERCdXNNdXRleCAqbXV0ZXgpCit7CisgIGlmIChtdXRleCkKKyAgICB7CisgICAgICBpZiAodGhyZWFkX2Z1bmN0aW9ucy5yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrKQorICAgICAgICAoKiB0aHJlYWRfZnVuY3Rpb25zLnJlY3Vyc2l2ZV9tdXRleF91bmxvY2spIChtdXRleCk7CisgICAgICBlbHNlIGlmICh0aHJlYWRfZnVuY3Rpb25zLm11dGV4X3VubG9jaykKKyAgICAgICAgKCogdGhyZWFkX2Z1bmN0aW9ucy5tdXRleF91bmxvY2spIChtdXRleCk7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHZhcmlhYmxlIHVzaW5nIHRoZSBmdW5jdGlvbiBzdXBwbGllZAorICogdG8gZGJ1c190aHJlYWRzX2luaXQoKSwgb3IgY3JlYXRlcyBhIG5vLW9wIGNvbmRpdGlvbiB2YXJpYWJsZQorICogaWYgdGhyZWFkcyBhcmUgbm90IGluaXRpYWxpemVkLiBNYXkgcmV0dXJuICNOVUxMIGV2ZW4gaWYKKyAqIHRocmVhZHMgYXJlIGluaXRpYWxpemVkLCBpbmRpY2F0aW5nIG91dC1vZi1tZW1vcnkuCisgKgorICogQHJldHVybnMgbmV3IG11dGV4IG9yICNOVUxMCisgKi8KK0RCdXNDb25kVmFyICoKK19kYnVzX2NvbmR2YXJfbmV3ICh2b2lkKQoreworICBpZiAodGhyZWFkX2Z1bmN0aW9ucy5jb25kdmFyX25ldykKKyAgICByZXR1cm4gKCogdGhyZWFkX2Z1bmN0aW9ucy5jb25kdmFyX25ldykgKCk7CisgIGVsc2UKKyAgICByZXR1cm4gX0RCVVNfRFVNTVlfQ09ORFZBUjsKK30KKworCisvKioKKyAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBfZGJ1c19jb25kdmFyX25ldy4gIEl0IGhvd2V2ZXIKKyAqIGdpdmVzIGFub3RoZXIgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYnkgYWxsb2NhdGluZyBhIHBvaW50ZXIKKyAqIHRvIHBvaW50IHRvIHRoZSBjb25kdmFyIGxvY2F0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIHRocmVhZGluZworICogbW9kdWxlIHRvIHN3YXAgb3V0IGR1bW15IGNvbmR2YXJzIGZvciByZWFsIGEgcmVhbCBjb25kdmFyIHNvIGxpYnJhcmllcworICogY2FuIGluaXRpYWxpemUgdGhyZWFkcyBldmVuIGFmdGVyIHRoZSBELUJ1cyBBUEkgaGFzIGJlZW4gdXNlZC4KKyAqCisgKiBAcmV0dXJucyB0aGUgbG9jYXRpb24gb2YgYSBuZXcgY29uZHZhciBvciAjTlVMTCBvbiBPT00KKyAqLworCit2b2lkIAorX2RidXNfY29uZHZhcl9uZXdfYXRfbG9jYXRpb24gKERCdXNDb25kVmFyICoqbG9jYXRpb25fcCkKK3sKKyAgKmxvY2F0aW9uX3AgPSBfZGJ1c19jb25kdmFyX25ldygpOworCisgIGlmICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uICE9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiAmJiAqbG9jYXRpb25fcCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdW5pbml0aWFsaXplZF9jb25kdmFyX2xpc3QsIGxvY2F0aW9uX3ApKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY29uZHZhcl9mcmVlICgqbG9jYXRpb25fcCk7CisgICAgICAgICAgKmxvY2F0aW9uX3AgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qKgorICogRnJlZXMgYSBjb25kaXRpb25hbCB2YXJpYWJsZSBjcmVhdGVkIHdpdGggZGJ1c19jb25kdmFyX25ldygpOyBkb2VzCisgKiBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NvbmR2YXJfZnJlZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIGlmIChjb25kICYmIHRocmVhZF9mdW5jdGlvbnMuY29uZHZhcl9mcmVlKQorICAgICgqIHRocmVhZF9mdW5jdGlvbnMuY29uZHZhcl9mcmVlKSAoY29uZCk7Cit9CisKKy8qKgorICogRnJlZXMgYSBjb25kaXRpb25hbCB2YXJpYWJsZSBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSAKKyAqIHVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0OyAKKyAqIGRvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKERCdXNDb25kVmFyICoqbG9jYXRpb25fcCkKK3sKKyAgaWYgKGxvY2F0aW9uX3ApCisgICAgeworICAgICAgaWYgKHRocmVhZF9pbml0X2dlbmVyYXRpb24gIT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKQorICAgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0LCBsb2NhdGlvbl9wKTsKKworICAgICAgX2RidXNfY29uZHZhcl9mcmVlICgqbG9jYXRpb25fcCk7CisgICAgfQorfQorCisvKioKKyAqIEF0b21pY2FsbHkgdW5sb2NrcyB0aGUgbXV0ZXggYW5kIHdhaXRzIGZvciB0aGUgY29uZGl0aW9ucworICogdmFyaWFibGUgdG8gYmUgc2lnbmFsbGVkLiBMb2NrcyB0aGUgbXV0ZXggYWdhaW4gYmVmb3JlCisgKiByZXR1cm5pbmcuCisgKiBEb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfY29uZHZhcl93YWl0IChEQnVzQ29uZFZhciAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgKm11dGV4KQoreworICBpZiAoY29uZCAmJiBtdXRleCAmJiB0aHJlYWRfZnVuY3Rpb25zLmNvbmR2YXJfd2FpdCkKKyAgICAoKiB0aHJlYWRfZnVuY3Rpb25zLmNvbmR2YXJfd2FpdCkgKGNvbmQsIG11dGV4KTsKK30KKworLyoqCisgKiBBdG9taWNhbGx5IHVubG9ja3MgdGhlIG11dGV4IGFuZCB3YWl0cyBmb3IgdGhlIGNvbmRpdGlvbnMgdmFyaWFibGUKKyAqIHRvIGJlIHNpZ25hbGxlZCwgb3IgZm9yIGEgdGltZW91dC4gTG9ja3MgdGhlIG11dGV4IGFnYWluIGJlZm9yZQorICogcmV0dXJuaW5nLiAgRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuICBSZXR1cm4gdmFsdWUKKyAqIGlzICNGQUxTRSBpZiB3ZSB0aW1lZCBvdXQsICNUUlVFIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gY29uZCB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgKiBAcGFyYW0gbXV0ZXggdGhlIG11dGV4CisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIHRpbWVvdXQgb2NjdXJyZWQsICNUUlVFIGlmIG5vdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29uZHZhcl93YWl0X3RpbWVvdXQgKERCdXNDb25kVmFyICAgICAgICAgICAgICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgICAgICAgICAgICAgICAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIGlmIChjb25kICYmIG11dGV4ICYmIHRocmVhZF9mdW5jdGlvbnMuY29uZHZhcl93YWl0KQorICAgIHJldHVybiAoKiB0aHJlYWRfZnVuY3Rpb25zLmNvbmR2YXJfd2FpdF90aW1lb3V0KSAoY29uZCwgbXV0ZXgsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIElmIHRoZXJlIGFyZSB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgd2FrZQorICogdXAgZXhhY3RseSBvbmUuIAorICogRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NvbmR2YXJfd2FrZV9vbmUgKERCdXNDb25kVmFyICpjb25kKQoreworICBpZiAoY29uZCAmJiB0aHJlYWRfZnVuY3Rpb25zLmNvbmR2YXJfd2FrZV9vbmUpCisgICAgKCogdGhyZWFkX2Z1bmN0aW9ucy5jb25kdmFyX3dha2Vfb25lKSAoY29uZCk7Cit9CisKKy8qKgorICogSWYgdGhlcmUgYXJlIHRocmVhZHMgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLCB3YWtlCisgKiB1cCBhbGwgb2YgdGhlbS4gCisgKiBEb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfY29uZHZhcl93YWtlX2FsbCAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIGlmIChjb25kICYmIHRocmVhZF9mdW5jdGlvbnMuY29uZHZhcl93YWtlX2FsbCkKKyAgICAoKiB0aHJlYWRfZnVuY3Rpb25zLmNvbmR2YXJfd2FrZV9hbGwpIChjb25kKTsKK30KKworc3RhdGljIHZvaWQKK3NodXRkb3duX2dsb2JhbF9sb2NrcyAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c011dGV4ICoqKmxvY2tzID0gZGF0YTsKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9HTE9CQUxfTE9DS1MpCisgICAgeworICAgICAgX2RidXNfbXV0ZXhfZnJlZSAoKihsb2Nrc1tpXSkpOworICAgICAgKihsb2Nrc1tpXSkgPSBOVUxMOworICAgICAgKytpOworICAgIH0KKyAgCisgIGRidXNfZnJlZSAobG9ja3MpOworfQorCitzdGF0aWMgdm9pZAorc2h1dGRvd25fdW5pbml0aWFsaXplZF9sb2NrcyAodm9pZCAqZGF0YSkKK3sKKyAgX2RidXNfbGlzdF9jbGVhciAoJnVuaW5pdGlhbGl6ZWRfbXV0ZXhfbGlzdCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5pdF91bmluaXRpYWxpemVkX2xvY2tzICh2b2lkKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c19hc3NlcnQgKHRocmVhZF9pbml0X2dlbmVyYXRpb24gIT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKTsKKworICBsaW5rID0gdW5pbml0aWFsaXplZF9tdXRleF9saXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNdXRleCAqKm1wOworCisgICAgICBtcCA9IChEQnVzTXV0ZXggKiopbGluay0+ZGF0YTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKm1wID09IF9EQlVTX0RVTU1ZX01VVEVYKTsKKworICAgICAgKm1wID0gX2RidXNfbXV0ZXhfbmV3ICgpOworICAgICAgaWYgKCptcCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxfbXV0ZXg7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ1bmluaXRpYWxpemVkX211dGV4X2xpc3QsIGxpbmspOworICAgIH0KKworICBsaW5rID0gdW5pbml0aWFsaXplZF9jb25kdmFyX2xpc3Q7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0NvbmRWYXIgKipjcDsKKworICAgICAgY3AgPSAoREJ1c0NvbmRWYXIgKiopbGluay0+ZGF0YTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKmNwID09IF9EQlVTX0RVTU1ZX0NPTkRWQVIpOworCisgICAgICAqY3AgPSBfZGJ1c19jb25kdmFyX25ldyAoKTsKKyAgICAgIGlmICgqY3AgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsX2NvbmR2YXI7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdCwgbGluayk7CisgICAgfQorCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ1bmluaXRpYWxpemVkX211dGV4X2xpc3QpOworICBfZGJ1c19saXN0X2NsZWFyICgmdW5pbml0aWFsaXplZF9jb25kdmFyX2xpc3QpOworCisgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoc2h1dGRvd25fdW5pbml0aWFsaXplZF9sb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBnb3RvIGZhaWxfY29uZHZhcjsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxfY29uZHZhcjoKKyAgbGluayA9IHVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25kVmFyICoqY3A7CisKKyAgICAgIGNwID0gKERCdXNDb25kVmFyICoqKWxpbmstPmRhdGE7CisKKyAgICAgIGlmICgqY3AgIT0gX0RCVVNfRFVNTVlfQ09ORFZBUikKKyAgICAgICAgX2RidXNfY29uZHZhcl9mcmVlICgqY3ApOworICAgICAgZWxzZQorICAgICAgICBicmVhazsKKworICAgICAgKmNwID0gX0RCVVNfRFVNTVlfQ09ORFZBUjsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnVuaW5pdGlhbGl6ZWRfY29uZHZhcl9saXN0LCBsaW5rKTsKKyAgICB9CisKKyBmYWlsX211dGV4OgorICBsaW5rID0gdW5pbml0aWFsaXplZF9tdXRleF9saXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNdXRleCAqKm1wOworCisgICAgICBtcCA9IChEQnVzTXV0ZXggKiopbGluay0+ZGF0YTsKKworICAgICAgaWYgKCptcCAhPSBfREJVU19EVU1NWV9NVVRFWCkKKyAgICAgICAgX2RidXNfbXV0ZXhfZnJlZSAoKm1wKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICptcCA9IF9EQlVTX0RVTU1ZX01VVEVYOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdW5pbml0aWFsaXplZF9tdXRleF9saXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfbG9ja3MgKHZvaWQpCit7CisgIGludCBpOworICBEQnVzTXV0ZXggKioqZHluYW1pY19nbG9iYWxfbG9ja3M7CisgIAorICBEQnVzTXV0ZXggKipnbG9iYWxfbG9ja3NbXSA9IHsKKyNkZWZpbmUgTE9DS19BRERSKG5hbWUpICgmIF9kYnVzX2xvY2tfIyNuYW1lKQorICAgIExPQ0tfQUREUiAod2luX2ZkcyksCisgICAgTE9DS19BRERSIChzaWRfYXRvbV9jYWNoZSksCisgICAgTE9DS19BRERSIChsaXN0KSwKKyAgICBMT0NLX0FERFIgKGNvbm5lY3Rpb25fc2xvdHMpLAorICAgIExPQ0tfQUREUiAocGVuZGluZ19jYWxsX3Nsb3RzKSwKKyAgICBMT0NLX0FERFIgKHNlcnZlcl9zbG90cyksCisgICAgTE9DS19BRERSIChtZXNzYWdlX3Nsb3RzKSwKKyNpZiAhREJVU19VU0VfU1lOQworICAgIExPQ0tfQUREUiAoYXRvbWljKSwKKyNlbmRpZgorICAgIExPQ0tfQUREUiAoYnVzKSwKKyAgICBMT0NLX0FERFIgKGJ1c19kYXRhcyksCisgICAgTE9DS19BRERSIChzaHV0ZG93bl9mdW5jcyksCisgICAgTE9DS19BRERSIChzeXN0ZW1fdXNlcnMpLAorICAgIExPQ0tfQUREUiAobWVzc2FnZV9jYWNoZSksCisgICAgTE9DS19BRERSIChzaGFyZWRfY29ubmVjdGlvbnMpLAorICAgIExPQ0tfQUREUiAobWFjaGluZV91dWlkKQorI3VuZGVmIExPQ0tfQUREUgorICB9OworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfTl9FTEVNRU5UUyAoZ2xvYmFsX2xvY2tzKSA9PQorICAgICAgICAgICAgICAgIF9EQlVTX05fR0xPQkFMX0xPQ0tTKTsKKworICBpID0gMDsKKyAgCisgIGR5bmFtaWNfZ2xvYmFsX2xvY2tzID0gZGJ1c19uZXcgKERCdXNNdXRleCoqLCBfREJVU19OX0dMT0JBTF9MT0NLUyk7CisgIGlmIChkeW5hbWljX2dsb2JhbF9sb2NrcyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChnbG9iYWxfbG9ja3MpKQorICAgIHsKKyAgICAgICpnbG9iYWxfbG9ja3NbaV0gPSBfZGJ1c19tdXRleF9uZXcgKCk7CisgICAgICAKKyAgICAgIGlmICgqZ2xvYmFsX2xvY2tzW2ldID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICBkeW5hbWljX2dsb2JhbF9sb2Nrc1tpXSA9IGdsb2JhbF9sb2Nrc1tpXTsKKworICAgICAgKytpOworICAgIH0KKyAgCisgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoc2h1dGRvd25fZ2xvYmFsX2xvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfZ2xvYmFsX2xvY2tzKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIWluaXRfdW5pbml0aWFsaXplZF9sb2NrcyAoKSkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBkYnVzX2ZyZWUgKGR5bmFtaWNfZ2xvYmFsX2xvY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIF9kYnVzX211dGV4X2ZyZWUgKCpnbG9iYWxfbG9ja3NbaV0pOworICAgICAgKmdsb2JhbF9sb2Nrc1tpXSA9IE5VTEw7CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgaW50ZXJuYWxzICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUaHJlYWRzIFRocmVhZCBmdW5jdGlvbnMKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgZGJ1c190aHJlYWRzX2luaXQoKSBhbmQgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpCisgKgorICogRnVuY3Rpb25zIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aHJlYWRzIGFuZCB0aHJlYWQgbG9ja3MuCisgKgorICogSWYgdGhyZWFkcyBhcmUgaW5pdGlhbGl6ZWQsIHRoZSBELUJ1cyBsaWJyYXJ5IGhhcyBsb2NrcyBvbiBhbGwKKyAqIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiwgZWFjaCAjREJ1c0Nvbm5lY3Rpb24gaGFzIGEKKyAqIGxvY2ssIHNvIG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUgY2FuIHRvdWNoIHRoZSBjb25uZWN0aW9uLiAgKFNlZQorICogQHJlZiBEQnVzQ29ubmVjdGlvbiBmb3IgbW9yZSBvbiBjb25uZWN0aW9uIGxvY2tpbmcuKQorICoKKyAqIE1vc3Qgb3RoZXIgb2JqZWN0cywgaG93ZXZlciwgZG8gbm90IGhhdmUgbG9ja3MgLSB0aGV5IGNhbiBvbmx5IGJlCisgKiB1c2VkIGZyb20gYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZSwgdW5sZXNzIHlvdSBsb2NrIHRoZW0geW91cnNlbGYuCisgKiBGb3IgZXhhbXBsZSwgYSAjREJ1c01lc3NhZ2UgY2FuJ3QgYmUgbW9kaWZpZWQgZnJvbSB0d28gdGhyZWFkcworICogYXQgb25jZS4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIAorICogSW5pdGlhbGl6ZXMgdGhyZWFkcy4gSWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkLCB0aGUgRC1CdXMKKyAqIGxpYnJhcnkgd2lsbCBub3QgbG9jayBhbnkgZGF0YSBzdHJ1Y3R1cmVzLiAgSWYgaXQgaXMgY2FsbGVkLCBELUJ1cworICogd2lsbCBkbyBsb2NraW5nLCBhdCBzb21lIGNvc3QgaW4gZWZmaWNpZW5jeS4gTm90ZSB0aGF0IHRoaXMKKyAqIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIEJFRk9SRSB0aGUgc2Vjb25kIHRocmVhZCBpcyBzdGFydGVkLgorICoKKyAqIEFsbW9zdCBhbHdheXMsIHlvdSBzaG91bGQgdXNlIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSBpbnN0ZWFkLgorICogVGhlIHJhdyBkYnVzX3RocmVhZHNfaW5pdCgpIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSByZXF1aXJlIGEKKyAqIHBhcnRpY3VsYXIgdGhyZWFkIGltcGxlbWVudGF0aW9uIGZvciBzb21lIHJlYXNvbi4KKyAqCisgKiBBIHBvc3NpYmxlIHJlYXNvbiB0byB1c2UgZGJ1c190aHJlYWRzX2luaXQoKSByYXRoZXIgdGhhbgorICogZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpIGlzIHRvIGluc2VydCBkZWJ1Z2dpbmcgY2hlY2tzIG9yIHByaW50CisgKiBzdGF0ZW1lbnRzLgorICoKKyAqIGRidXNfdGhyZWFkc19pbml0KCkgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gIFRoZSBmaXJzdCBvbmUKKyAqIHdpbnMgYW5kIHN1YnNlcXVlbnQgY2FsbHMgYXJlIGlnbm9yZWQuIChVbmxlc3MgeW91IHVzZQorICogZGJ1c19zaHV0ZG93bigpIHRvIHJlc2V0IGxpYmRidXMsIHdoaWNoIHdpbGwgbGV0IHlvdSByZS1pbml0CisgKiB0aHJlYWRzLikKKyAqCisgKiBFaXRoZXIgcmVjdXJzaXZlIG9yIG5vbnJlY3Vyc2l2ZSBtdXRleCBmdW5jdGlvbnMgbXVzdCBiZSBzcGVjaWZpZWQsCisgKiBidXQgbm90IGJvdGguIE5ldyBjb2RlIHNob3VsZCBwcm92aWRlIG9ubHkgdGhlIHJlY3Vyc2l2ZSBmdW5jdGlvbnMKKyAqIC0gc3BlY2lmeWluZyB0aGUgbm9ucmVjdXJzaXZlIG9uZXMgaXMgZGVwcmVjYXRlZC4KKyAqCisgKiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gZWZmZWN0aXZlbHkgc2V0cyBnbG9iYWwgc3RhdGUsIGFsbCBjb2RlCisgKiBydW5uaW5nIGluIGEgZ2l2ZW4gYXBwbGljYXRpb24gbXVzdCBhZ3JlZSBvbiB0aGUgdGhyZWFkCisgKiBpbXBsZW1lbnRhdGlvbi4gTW9zdCBjb2RlIHdvbid0IGNhcmUgd2hpY2ggdGhyZWFkIGltcGxlbWVudGF0aW9uIGlzCisgKiB1c2VkLCBzbyB0aGVyZSdzIG5vIHByb2JsZW0uIEhvd2V2ZXIsIHVzdWFsbHkgbGlicmFyaWVzIHNob3VsZCBub3QKKyAqIGNhbGwgZGJ1c190aHJlYWRzX2luaXQoKSBvciBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCksIGluc3RlYWQKKyAqIGxlYXZpbmcgdGhpcyBwb2xpY3kgY2hvaWNlIHRvIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBUaGUgZXhjZXB0aW9uIGlzIGZvciBhcHBsaWNhdGlvbiBmcmFtZXdvcmtzIChHTGliLCBRdCwgZXRjLikgIGFuZAorICogRC1CdXMgYmluZGluZ3MgYmFzZWQgb24gYXBwbGljYXRpb24gZnJhbWV3b3Jrcy4gVGhlc2UgZnJhbWV3b3JrcworICogZGVmaW5lIGEgY3Jvc3MtcGxhdGZvcm0gdGhyZWFkIGFic3RyYWN0aW9uIGFuZCBjYW4gYXNzdW1lCisgKiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGZyYW1ld29yayBhcmUgT0sgd2l0aCB1c2luZyB0aGF0IHRocmVhZAorICogYWJzdHJhY3Rpb24uCisgKgorICogSG93ZXZlciwgZXZlbiB0aGVzZSBhcHAgZnJhbWV3b3JrcyBtYXkgZmluZCBpdCBlYXNpZXIgdG8gc2ltcGx5IGNhbGwKKyAqIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSwgYW5kIHRoZXJlJ3Mgbm8gcmVhc29uIHRoZXkgc2hvdWxkbid0LgorICogCisgKiBAcGFyYW0gZnVuY3Rpb25zIGZ1bmN0aW9ucyBmb3IgdXNpbmcgdGhyZWFkcworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c190aHJlYWRzX2luaXQgKGNvbnN0IERCdXNUaHJlYWRGdW5jdGlvbnMgKmZ1bmN0aW9ucykKK3sKKyAgZGJ1c19ib29sX3QgbXV0ZXhfc2V0OworICBkYnVzX2Jvb2xfdCByZWN1cnNpdmVfbXV0ZXhfc2V0OworCisgIF9kYnVzX2Fzc2VydCAoZnVuY3Rpb25zICE9IE5VTEwpOworCisgIC8qIHRoZXNlIGJhc2UgZnVuY3Rpb25zIGFyZSByZXF1aXJlZC4gRnV0dXJlIGFkZGl0aW9ucyB0bworICAgKiBEQnVzVGhyZWFkRnVuY3Rpb25zIG1heSBiZSBvcHRpb25hbC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfTkVXX01BU0spOworICBfZGJ1c19hc3NlcnQgKGZ1bmN0aW9ucy0+bWFzayAmIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX0ZSRUVfTUFTSyk7CisgIF9kYnVzX2Fzc2VydCAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FJVF9NQVNLKTsKKyAgX2RidXNfYXNzZXJ0IChmdW5jdGlvbnMtPm1hc2sgJiBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUlUX1RJTUVPVVRfTUFTSyk7CisgIF9kYnVzX2Fzc2VydCAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FLRV9PTkVfTUFTSyk7CisgIF9kYnVzX2Fzc2VydCAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FLRV9BTExfTUFTSyk7CisgIF9kYnVzX2Fzc2VydCAoZnVuY3Rpb25zLT5jb25kdmFyX25ldyAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChmdW5jdGlvbnMtPmNvbmR2YXJfZnJlZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChmdW5jdGlvbnMtPmNvbmR2YXJfd2FpdCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChmdW5jdGlvbnMtPmNvbmR2YXJfd2FpdF90aW1lb3V0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGZ1bmN0aW9ucy0+Y29uZHZhcl93YWtlX29uZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChmdW5jdGlvbnMtPmNvbmR2YXJfd2FrZV9hbGwgIT0gTlVMTCk7CisKKyAgLyogRWl0aGVyIHRoZSBtdXRleCBmdW5jdGlvbiBzZXQgb3IgcmVjdXJzaXZlIG11dGV4IHNldCBuZWVkcyAKKyAgICogdG8gYmUgYXZhaWxhYmxlIGJ1dCBub3QgYm90aAorICAgKi8KKyAgbXV0ZXhfc2V0ID0gKGZ1bmN0aW9ucy0+bWFzayAmIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9ORVdfTUFTSykgJiYgIAorICAgICAgICAgICAgICAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX0ZSRUVfTUFTSykgJiYgCisgICAgICAgICAgICAgIChmdW5jdGlvbnMtPm1hc2sgJiBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfTE9DS19NQVNLKSAmJgorICAgICAgICAgICAgICAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX1VOTE9DS19NQVNLKSAmJgorICAgICAgICAgICAgICAgZnVuY3Rpb25zLT5tdXRleF9uZXcgJiYKKyAgICAgICAgICAgICAgIGZ1bmN0aW9ucy0+bXV0ZXhfZnJlZSAmJgorICAgICAgICAgICAgICAgZnVuY3Rpb25zLT5tdXRleF9sb2NrICYmCisgICAgICAgICAgICAgICBmdW5jdGlvbnMtPm11dGV4X3VubG9jazsKKworICByZWN1cnNpdmVfbXV0ZXhfc2V0ID0gCisgICAgICAgICAgICAgIChmdW5jdGlvbnMtPm1hc2sgJiBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX05FV19NQVNLKSAmJiAKKyAgICAgICAgICAgICAgKGZ1bmN0aW9ucy0+bWFzayAmIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfRlJFRV9NQVNLKSAmJiAKKyAgICAgICAgICAgICAgKGZ1bmN0aW9ucy0+bWFzayAmIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfTE9DS19NQVNLKSAmJiAKKyAgICAgICAgICAgICAgKGZ1bmN0aW9ucy0+bWFzayAmIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfVU5MT0NLX01BU0spICYmCisgICAgICAgICAgICAgICAgZnVuY3Rpb25zLT5yZWN1cnNpdmVfbXV0ZXhfbmV3ICYmCisgICAgICAgICAgICAgICAgZnVuY3Rpb25zLT5yZWN1cnNpdmVfbXV0ZXhfZnJlZSAmJgorICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy0+cmVjdXJzaXZlX211dGV4X2xvY2sgJiYKKyAgICAgICAgICAgICAgICBmdW5jdGlvbnMtPnJlY3Vyc2l2ZV9tdXRleF91bmxvY2s7CisKKyAgaWYgKCEobXV0ZXhfc2V0IHx8IHJlY3Vyc2l2ZV9tdXRleF9zZXQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkVpdGhlciB0aGUgbm9ucmVjdXNyaXZlIG9yIHJlY3Vyc2l2ZSBtdXRleCAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9ucyBzZXRzIHNob3VsZCBiZSBwYXNzZWQgaW50byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGJ1c190aHJlYWRzX2luaXQuIE5laXRoZXIgc2V0cyB3ZXJlIHBhc3NlZC4iKTsKKworICBpZiAobXV0ZXhfc2V0ICYmIHJlY3Vyc2l2ZV9tdXRleF9zZXQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRWl0aGVyIHRoZSBub25yZWN1c3JpdmUgb3IgcmVjdXJzaXZlIG11dGV4ICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb25zIHNldHMgc2hvdWxkIGJlIHBhc3NlZCBpbnRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYnVzX3RocmVhZHNfaW5pdC4gQm90aCBzZXRzIHdlcmUgcGFzc2VkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG1vc3QgbGlrZWx5IGp1c3Qgd2FudCB0byBzZXQgdGhlIHJlY3Vyc2l2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXV0ZXggZnVuY3Rpb25zIHRvIGF2b2lkIGRlYWRsb2NrcyBpbiBELUJ1cy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8qIENoZWNrIHRoYXQgYWxsIGJpdHMgaW4gdGhlIG1hc2sgYWN0dWFsbHkgYXJlIHZhbGlkIG1hc2sgYml0cy4KKyAgICogZW5zdXJlcyBwZW9wbGUgd29uJ3Qgd3JpdGUgY29kZSB0aGF0IGJyZWFrcyB3aGVuIHdlIGFkZAorICAgKiBuZXcgYml0cy4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoKGZ1bmN0aW9ucy0+bWFzayAmIH5EQlVTX1RIUkVBRF9GVU5DVElPTlNfQUxMX01BU0spID09IDApOworCisgIGlmICh0aHJlYWRfaW5pdF9nZW5lcmF0aW9uICE9IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbikKKyAgICB0aHJlYWRfZnVuY3Rpb25zLm1hc2sgPSAwOyAvKiBhbGxvdyByZS1pbml0IGluIG5ldyBnZW5lcmF0aW9uICovCisgCisgIC8qIFNpbGVudGx5IGFsbG93IG11bHRpcGxlIGluaXQKKyAgICogRmlyc3QgaW5pdCB3aW5zIGFuZCBELUJ1cyB3aWxsIGFsd2F5cyB1c2UgaXRzIHRocmVhZGluZyBzeXN0ZW0gCisgICAqLyAKKyAgaWYgKHRocmVhZF9mdW5jdGlvbnMubWFzayAhPSAwKQorICAgIHJldHVybiBUUlVFOworICAKKyAgdGhyZWFkX2Z1bmN0aW9ucy5tdXRleF9uZXcgPSBmdW5jdGlvbnMtPm11dGV4X25ldzsKKyAgdGhyZWFkX2Z1bmN0aW9ucy5tdXRleF9mcmVlID0gZnVuY3Rpb25zLT5tdXRleF9mcmVlOworICB0aHJlYWRfZnVuY3Rpb25zLm11dGV4X2xvY2sgPSBmdW5jdGlvbnMtPm11dGV4X2xvY2s7CisgIHRocmVhZF9mdW5jdGlvbnMubXV0ZXhfdW5sb2NrID0gZnVuY3Rpb25zLT5tdXRleF91bmxvY2s7CisgIAorICB0aHJlYWRfZnVuY3Rpb25zLmNvbmR2YXJfbmV3ID0gZnVuY3Rpb25zLT5jb25kdmFyX25ldzsKKyAgdGhyZWFkX2Z1bmN0aW9ucy5jb25kdmFyX2ZyZWUgPSBmdW5jdGlvbnMtPmNvbmR2YXJfZnJlZTsKKyAgdGhyZWFkX2Z1bmN0aW9ucy5jb25kdmFyX3dhaXQgPSBmdW5jdGlvbnMtPmNvbmR2YXJfd2FpdDsKKyAgdGhyZWFkX2Z1bmN0aW9ucy5jb25kdmFyX3dhaXRfdGltZW91dCA9IGZ1bmN0aW9ucy0+Y29uZHZhcl93YWl0X3RpbWVvdXQ7CisgIHRocmVhZF9mdW5jdGlvbnMuY29uZHZhcl93YWtlX29uZSA9IGZ1bmN0aW9ucy0+Y29uZHZhcl93YWtlX29uZTsKKyAgdGhyZWFkX2Z1bmN0aW9ucy5jb25kdmFyX3dha2VfYWxsID0gZnVuY3Rpb25zLT5jb25kdmFyX3dha2VfYWxsOworIAorICBpZiAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9ORVdfTUFTSykKKyAgICB0aHJlYWRfZnVuY3Rpb25zLnJlY3Vyc2l2ZV9tdXRleF9uZXcgPSBmdW5jdGlvbnMtPnJlY3Vyc2l2ZV9tdXRleF9uZXc7CisgIAorICBpZiAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9GUkVFX01BU0spCisgICAgdGhyZWFkX2Z1bmN0aW9ucy5yZWN1cnNpdmVfbXV0ZXhfZnJlZSA9IGZ1bmN0aW9ucy0+cmVjdXJzaXZlX211dGV4X2ZyZWU7CisgIAorICBpZiAoZnVuY3Rpb25zLT5tYXNrICYgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9MT0NLX01BU0spCisgICAgdGhyZWFkX2Z1bmN0aW9ucy5yZWN1cnNpdmVfbXV0ZXhfbG9jayA9IGZ1bmN0aW9ucy0+cmVjdXJzaXZlX211dGV4X2xvY2s7CisKKyAgaWYgKGZ1bmN0aW9ucy0+bWFzayAmIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfVU5MT0NLX01BU0spCisgICAgdGhyZWFkX2Z1bmN0aW9ucy5yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrID0gZnVuY3Rpb25zLT5yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrOworCisgIHRocmVhZF9mdW5jdGlvbnMubWFzayA9IGZ1bmN0aW9ucy0+bWFzazsKKworICBpZiAoIWluaXRfbG9ja3MgKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRocmVhZF9pbml0X2dlbmVyYXRpb24gPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb247CisgIAorICByZXR1cm4gVFJVRTsKK30KKworCisKKy8qIERlZmF1bHQgdGhyZWFkIGltcGxlbWVuYXRpb24gKi8KKworLyoqCisgKgorICogQ2FsbHMgZGJ1c190aHJlYWRzX2luaXQoKSB3aXRoIGEgZGVmYXVsdCBzZXQgb2YKKyAqICNEQnVzVGhyZWFkRnVuY3Rpb25zIGFwcHJvcHJpYXRlIGZvciB0aGUgcGxhdGZvcm0uCisgKgorICogTW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGlzIHJhdGhlciB0aGFuIGRidXNfdGhyZWFkc19pbml0KCkuCisgKgorICogSXQncyBzYWZlIHRvIGNhbGwgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpIGFzIG1hbnkgdGltZXMgYXMgeW91CisgKiB3YW50LCBidXQgb25seSB0aGUgZmlyc3QgdGltZSB3aWxsIGhhdmUgYW4gZWZmZWN0LgorICoKKyAqIGRidXNfc2h1dGRvd24oKSByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiB0aGlzIGZ1bmN0aW9uIHdoZW4gaXQKKyAqIHJlc2V0cyBhbGwgZ2xvYmFsIHN0YXRlIGluIGxpYmRidXMuCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYyAoKTsKK30KKworCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfQlVJTERfVEVTVFMKKy8qKiBGYWtlIG11dGV4IHVzZWQgZm9yIGRlYnVnZ2luZyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0Zha2VNdXRleCBEQnVzRmFrZU11dGV4OworLyoqIEZha2UgbXV0ZXggdXNlZCBmb3IgZGVidWdnaW5nICovCitzdHJ1Y3QgREJ1c0Zha2VNdXRleAoreworICBkYnVzX2Jvb2xfdCBsb2NrZWQ7IC8qKjwgTXV0ZXggaXMgImxvY2tlZCIgKi8KK307CQorCitzdGF0aWMgREJ1c011dGV4ICogIGRidXNfZmFrZV9tdXRleF9uZXcgICAgICAgICAgICAodm9pZCk7CitzdGF0aWMgdm9pZCAgICAgICAgIGRidXNfZmFrZV9tdXRleF9mcmVlICAgICAgICAgICAoREJ1c011dGV4ICAgKm11dGV4KTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCAgZGJ1c19mYWtlX211dGV4X2xvY2sgICAgICAgICAgIChEQnVzTXV0ZXggICAqbXV0ZXgpOworc3RhdGljIGRidXNfYm9vbF90ICBkYnVzX2Zha2VfbXV0ZXhfdW5sb2NrICAgICAgICAgKERCdXNNdXRleCAgICptdXRleCk7CitzdGF0aWMgREJ1c0NvbmRWYXIqIGRidXNfZmFrZV9jb25kdmFyX25ldyAgICAgICAgICAodm9pZCk7CitzdGF0aWMgdm9pZCAgICAgICAgIGRidXNfZmFrZV9jb25kdmFyX2ZyZWUgICAgICAgICAoREJ1c0NvbmRWYXIgKmNvbmQpOworc3RhdGljIHZvaWQgICAgICAgICBkYnVzX2Zha2VfY29uZHZhcl93YWl0ICAgICAgICAgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICptdXRleCk7CitzdGF0aWMgZGJ1c19ib29sX3QgIGRidXNfZmFrZV9jb25kdmFyX3dhaXRfdGltZW91dCAoREJ1c0NvbmRWYXIgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB0aW1lb3V0X21zZWMpOworc3RhdGljIHZvaWQgICAgICAgICBkYnVzX2Zha2VfY29uZHZhcl93YWtlX29uZSAgICAgKERCdXNDb25kVmFyICpjb25kKTsKK3N0YXRpYyB2b2lkICAgICAgICAgZGJ1c19mYWtlX2NvbmR2YXJfd2FrZV9hbGwgICAgIChEQnVzQ29uZFZhciAqY29uZCk7CisKKworc3RhdGljIGNvbnN0IERCdXNUaHJlYWRGdW5jdGlvbnMgZmFrZV9mdW5jdGlvbnMgPQoreworICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfTkVXX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfRlJFRV9NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX0xPQ0tfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9VTkxPQ0tfTUFTSyB8CisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX05FV19NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfRlJFRV9NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FJVF9NQVNLIHwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FJVF9USU1FT1VUX01BU0sgfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUtFX09ORV9NQVNLfAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9XQUtFX0FMTF9NQVNLLAorICBkYnVzX2Zha2VfbXV0ZXhfbmV3LAorICBkYnVzX2Zha2VfbXV0ZXhfZnJlZSwKKyAgZGJ1c19mYWtlX211dGV4X2xvY2ssCisgIGRidXNfZmFrZV9tdXRleF91bmxvY2ssCisgIGRidXNfZmFrZV9jb25kdmFyX25ldywKKyAgZGJ1c19mYWtlX2NvbmR2YXJfZnJlZSwKKyAgZGJ1c19mYWtlX2NvbmR2YXJfd2FpdCwKKyAgZGJ1c19mYWtlX2NvbmR2YXJfd2FpdF90aW1lb3V0LAorICBkYnVzX2Zha2VfY29uZHZhcl93YWtlX29uZSwKKyAgZGJ1c19mYWtlX2NvbmR2YXJfd2FrZV9hbGwKK307CisKK3N0YXRpYyBEQnVzTXV0ZXggKgorZGJ1c19mYWtlX211dGV4X25ldyAodm9pZCkKK3sKKyAgREJ1c0Zha2VNdXRleCAqbXV0ZXg7CisKKyAgbXV0ZXggPSBkYnVzX25ldzAgKERCdXNGYWtlTXV0ZXgsIDEpOworCisgIHJldHVybiAoREJ1c011dGV4ICopbXV0ZXg7Cit9CisKK3N0YXRpYyB2b2lkCitkYnVzX2Zha2VfbXV0ZXhfZnJlZSAoREJ1c011dGV4ICptdXRleCkKK3sKKyAgREJ1c0Zha2VNdXRleCAqZmFrZSA9IChEQnVzRmFrZU11dGV4KikgbXV0ZXg7CisKKyAgX2RidXNfYXNzZXJ0ICghZmFrZS0+bG9ja2VkKTsKKyAgCisgIGRidXNfZnJlZSAoZmFrZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGJ1c19mYWtlX211dGV4X2xvY2sgKERCdXNNdXRleCAqbXV0ZXgpCit7CisgIERCdXNGYWtlTXV0ZXggKmZha2UgPSAoREJ1c0Zha2VNdXRleCopIG11dGV4OworCisgIF9kYnVzX2Fzc2VydCAoIWZha2UtPmxvY2tlZCk7CisKKyAgZmFrZS0+bG9ja2VkID0gVFJVRTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RidXNfZmFrZV9tdXRleF91bmxvY2sgKERCdXNNdXRleCAqbXV0ZXgpCit7CisgIERCdXNGYWtlTXV0ZXggKmZha2UgPSAoREJ1c0Zha2VNdXRleCopIG11dGV4OworCisgIF9kYnVzX2Fzc2VydCAoZmFrZS0+bG9ja2VkKTsKKworICBmYWtlLT5sb2NrZWQgPSBGQUxTRTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgREJ1c0NvbmRWYXIqCitkYnVzX2Zha2VfY29uZHZhcl9uZXcgKHZvaWQpCit7CisgIHJldHVybiAoREJ1c0NvbmRWYXIqKSBfZGJ1c19zdHJkdXAgKCJGYWtlQ29uZHZhciIpOworfQorCitzdGF0aWMgdm9pZAorZGJ1c19mYWtlX2NvbmR2YXJfZnJlZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIGRidXNfZnJlZSAoY29uZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkYnVzX2Zha2VfY29uZHZhcl93YWl0IChEQnVzQ29uZFZhciAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICptdXRleCkKK3sKKyAgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGJ1c19mYWtlX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB0aW1lb3V0X21zZWMpCit7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZGJ1c19mYWtlX2NvbmR2YXJfd2FrZV9vbmUgKERCdXNDb25kVmFyICpjb25kKQoreworCit9CisKK3N0YXRpYyB2b2lkCitkYnVzX2Zha2VfY29uZHZhcl93YWtlX2FsbCAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAodm9pZCkKK3sKKyNpZmRlZiBEQlVTX1dJTgorICByZXR1cm4gX2RidXNfdGhyZWFkc19pbml0X3BsYXRmb3JtX3NwZWNpZmljKCk7CisjZWxzZQorICByZXR1cm4gZGJ1c190aHJlYWRzX2luaXQgKCZmYWtlX2Z1bmN0aW9ucyk7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aHJlYWRzLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDdjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdGhyZWFkcy5oCkBAIC0wLDAgKzEsMTk4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGhyZWFkcy5oICBELUJ1cyB0aHJlYWRzIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfVEhSRUFEU19ICisjZGVmaW5lIERCVVNfVEhSRUFEU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzVGhyZWFkcworICogQHsKKyAqLworCisvKiogQW4gb3BhcXVlIG11dGV4IHR5cGUgcHJvdmlkZWQgYnkgdGhlICNEQnVzVGhyZWFkRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uIGluc3RhbGxlZCBieSBkYnVzX3RocmVhZHNfaW5pdCgpLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c011dGV4IERCdXNNdXRleDsKKy8qKiBBbiBvcGFxdWUgY29uZGl0aW9uIHZhcmlhYmxlIHR5cGUgcHJvdmlkZWQgYnkgdGhlICNEQnVzVGhyZWFkRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uIGluc3RhbGxlZCBieSBkYnVzX3RocmVhZHNfaW5pdCgpLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0NvbmRWYXIgREJ1c0NvbmRWYXI7CisKKy8qKiBEZXByZWNhdGVkLCBwcm92aWRlIERCdXNSZWN1cnNpdmVNdXRleE5ld0Z1bmN0aW9uIGluc3RlYWQuICovCit0eXBlZGVmIERCdXNNdXRleCogICgqIERCdXNNdXRleE5ld0Z1bmN0aW9uKSAgICAodm9pZCk7CisvKiogRGVwcmVjYXRlZCwgcHJvdmlkZSBEQnVzUmVjdXJzaXZlTXV0ZXhGcmVlRnVuY3Rpb24gaW5zdGVhZC4gKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c011dGV4RnJlZUZ1bmN0aW9uKSAgIChEQnVzTXV0ZXggKm11dGV4KTsKKy8qKiBEZXByZWNhdGVkLCBwcm92aWRlIERCdXNSZWN1cnNpdmVNdXRleExvY2tGdW5jdGlvbiBpbnN0ZWFkLiBSZXR1cm4gdmFsdWUgaXMgbG9jayBzdWNjZXNzLCBidXQgZ2V0cyBpZ25vcmVkIGluIHByYWN0aWNlLiAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzTXV0ZXhMb2NrRnVuY3Rpb24pICAgKERCdXNNdXRleCAqbXV0ZXgpOworLyoqIERlcHJlY2F0ZWQsIHByb3ZpZGUgREJ1c1JlY3Vyc2l2ZU11dGV4VW5sb2NrRnVuY3Rpb24gaW5zdGVhZC4gUmV0dXJuIHZhbHVlIGlzIHVubG9jayBzdWNjZXNzLCBidXQgZ2V0cyBpZ25vcmVkIGluIHByYWN0aWNlLiAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzTXV0ZXhVbmxvY2tGdW5jdGlvbikgKERCdXNNdXRleCAqbXV0ZXgpOworCisvKiogQ3JlYXRlcyBhIG5ldyByZWN1cnNpdmVseS1sb2NrYWJsZSBtdXRleCwgb3IgcmV0dXJucyAjTlVMTCBpZiBub3QKKyAqIGVub3VnaCBtZW1vcnkuICBDYW4gb25seSBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4gIEZvdW5kIGluCisgKiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4gRG8gbm90IGp1c3QgdXNlIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFIGZvcgorICogdGhpcywgYmVjYXVzZSBpdCBkb2VzIG5vdCBzYXZlL3Jlc3RvcmUgdGhlIHJlY3Vyc2lvbiBjb3VudCB3aGVuCisgKiB3YWl0aW5nIG9uIGEgY29uZGl0aW9uLiBsaWJkYnVzIHJlcXVpcmVzIHRoZSBKYXZhLXN0eWxlIGJlaGF2aW9yCisgKiB3aGVyZSB0aGUgbXV0ZXggaXMgZnVsbHkgdW5sb2NrZWQgdG8gd2FpdCBvbiBhIGNvbmRpdGlvbi4KKyAqLwordHlwZWRlZiBEQnVzTXV0ZXgqICAoKiBEQnVzUmVjdXJzaXZlTXV0ZXhOZXdGdW5jdGlvbikgICAgKHZvaWQpOworLyoqIEZyZWVzIGEgcmVjdXJzaXZlbHktbG9ja2FibGUgbXV0ZXguICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVjdXJzaXZlTXV0ZXhGcmVlRnVuY3Rpb24pICAgKERCdXNNdXRleCAqbXV0ZXgpOworLyoqIExvY2tzIGEgcmVjdXJzaXZlbHktbG9ja2FibGUgbXV0ZXguICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqIENhbiBvbmx5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNSZWN1cnNpdmVNdXRleExvY2tGdW5jdGlvbikgICAoREJ1c011dGV4ICptdXRleCk7CisvKiogVW5sb2NrcyBhIHJlY3Vyc2l2ZWx5LWxvY2thYmxlIG11dGV4LiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKiBDYW4gb25seSBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVjdXJzaXZlTXV0ZXhVbmxvY2tGdW5jdGlvbikgKERCdXNNdXRleCAqbXV0ZXgpOworCisvKiogQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqIENhbiBvbmx5IGZhaWwgKHJldHVybmluZyAjTlVMTCkgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICovCit0eXBlZGVmIERCdXNDb25kVmFyKiAgKCogREJ1c0NvbmRWYXJOZXdGdW5jdGlvbikgICAgICAgICAodm9pZCk7CisvKiogRnJlZXMgYSBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICgqIERCdXNDb25kVmFyRnJlZUZ1bmN0aW9uKSAgICAgICAgKERCdXNDb25kVmFyICpjb25kKTsKKworLyoqIFdhaXRzIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgRm91bmQgaW4KKyAqICNEQnVzVGhyZWFkRnVuY3Rpb25zLiBNdXN0IHdvcmsgd2l0aCBlaXRoZXIgYSByZWN1cnNpdmUgb3IKKyAqIG5vbnJlY3Vyc2l2ZSBtdXRleCwgd2hpY2hldmVyIHRoZSB0aHJlYWQgaW1wbGVtZW50YXRpb24KKyAqIHByb3ZpZGVzLiBOb3RlIHRoYXQgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgZG9lcyBub3Qgd29yayB3aXRoCisgKiBjb25kaXRpb24gdmFyaWFibGVzIChkb2VzIG5vdCBzYXZlL3Jlc3RvcmUgdGhlIHJlY3Vyc2lvbiBjb3VudCkgc28KKyAqIGRvbid0IHRyeSB1c2luZyBzaW1wbHkgcHRocmVhZF9jb25kX3dhaXQoKSBhbmQgYQorICogUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgdG8gaW1wbGVtZW50IHRoaXMsIGl0IHdvbid0IHdvcmsgcmlnaHQuCisgKgorICogSGFzIG5vIGVycm9yIGNvbmRpdGlvbnMuIE11c3Qgc3VjY2VlZCBpZiBpdCByZXR1cm5zLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICAgKCogREJ1c0NvbmRWYXJXYWl0RnVuY3Rpb24pICAgICAgICAoREJ1c0NvbmRWYXIgKmNvbmQsCisJCQkJCQkJICBEQnVzTXV0ZXggICAqbXV0ZXgpOworCisvKiogV2FpdHMgb24gYSBjb25kaXRpb24gdmFyaWFibGUgd2l0aCBhIHRpbWVvdXQuICBGb3VuZCBpbgorICogICNEQnVzVGhyZWFkRnVuY3Rpb25zLiBSZXR1cm5zICNUUlVFIGlmIHRoZSB3YWl0IGRpZCBub3QKKyAqICB0aW1lIG91dCwgYW5kICNGQUxTRSBpZiBpdCBkaWQuCisgKgorICogSGFzIG5vIGVycm9yIGNvbmRpdGlvbnMuIE11c3Qgc3VjY2VlZCBpZiBpdCByZXR1cm5zLiAKKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAgICgqIERCdXNDb25kVmFyV2FpdFRpbWVvdXRGdW5jdGlvbikgKERCdXNDb25kVmFyICpjb25kLAorCQkJCQkJCSAgREJ1c011dGV4ICAgKm11dGV4LAorCQkJCQkJCSAgaW50ICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKy8qKiBXYWtlcyBvbmUgd2FpdGluZyB0aHJlYWQgb24gYSBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqCisgKiBIYXMgbm8gZXJyb3IgY29uZGl0aW9ucy4gTXVzdCBzdWNjZWVkIGlmIGl0IHJldHVybnMuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAoKiBEQnVzQ29uZFZhcldha2VPbmVGdW5jdGlvbikgKERCdXNDb25kVmFyICpjb25kKTsKKworLyoqIFdha2VzIGFsbCB3YWl0aW5nIHRocmVhZHMgb24gYSBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqCisgKiBIYXMgbm8gZXJyb3IgY29uZGl0aW9ucy4gTXVzdCBzdWNjZWVkIGlmIGl0IHJldHVybnMuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAoKiBEQnVzQ29uZFZhcldha2VBbGxGdW5jdGlvbikgKERCdXNDb25kVmFyICpjb25kKTsKKworLyoqCisgKiBGbGFncyBpbmRpY2F0aW5nIHdoaWNoIGZ1bmN0aW9ucyBhcmUgcHJlc2VudCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4gVXNlZCB0byBhbGxvdworICogdGhlIGxpYnJhcnkgdG8gZGV0ZWN0IG9sZGVyIGNhbGxlcnMgb2YgZGJ1c190aHJlYWRzX2luaXQoKSBpZiBuZXcgcG9zc2libGUgZnVuY3Rpb25zCisgKiBhcmUgYWRkZWQgdG8gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX05FV19NQVNLICAgICAgPSAxIDw8IDAsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9GUkVFX01BU0sgICAgID0gMSA8PCAxLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfTE9DS19NQVNLICAgICA9IDEgPDwgMiwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX1VOTE9DS19NQVNLICAgPSAxIDw8IDMsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX05FV19NQVNLICAgID0gMSA8PCA0LAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9GUkVFX01BU0sgICA9IDEgPDwgNSwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FJVF9NQVNLICAgPSAxIDw8IDYsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBSVRfVElNRU9VVF9NQVNLICAgPSAxIDw8IDcsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBS0VfT05FX01BU0sgPSAxIDw8IDgsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBS0VfQUxMX01BU0sgPSAxIDw8IDksCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfTkVXX01BU0sgICAgPSAxIDw8IDEwLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX0ZSRUVfTUFTSyAgID0gMSA8PCAxMSwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9MT0NLX01BU0sgICA9IDEgPDwgMTIsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfVU5MT0NLX01BU0sgPSAxIDw8IDEzLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQUxMX01BU0sgICAgID0gKDEgPDwgMTQpIC0gMQorfSBEQnVzVGhyZWFkRnVuY3Rpb25zTWFzazsKKworLyoqCisgKiBGdW5jdGlvbnMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIG1ha2UgdGhlIEQtQnVzIGxpYnJhcnkKKyAqIHRocmVhZC1hd2FyZS4gVGhlIHJlY3Vyc2l2ZSBtdXRleCBmdW5jdGlvbnMgc2hvdWxkIGJlIHNwZWNpZmllZAorICogcmF0aGVyIHRoYW4gdGhlIG9sZCwgZGVwcmVjYXRlZCBub25yZWN1cnNpdmUgb25lcy4KKyAqCisgKiBUaGUgY29uZGl0aW9uIHZhcmlhYmxlIGZ1bmN0aW9ucyBoYXZlIHRvIHdvcmsgd2l0aCByZWN1cnNpdmUKKyAqIG11dGV4ZXMgaWYgeW91IHByb3ZpZGUgdGhvc2UsIG9yIHdpdGggbm9ucmVjdXJzaXZlIG11dGV4ZXMgaWYgeW91CisgKiBwcm92aWRlIHRob3NlLgorICoKKyAqIElmIGltcGxlbWVudGluZyB0aHJlYWRzIHVzaW5nIHB0aHJlYWRzLCBiZSBhd2FyZSB0aGF0CisgKiBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSBpcyBicm9rZW4gaW4gY29tYmluYXRpb24gd2l0aCBjb25kaXRpb24KKyAqIHZhcmlhYmxlcy4gbGliZGJ1cyByZWxpZXMgb24gdGhlIEphdmEtc3R5bGUgYmVoYXZpb3IgdGhhdCB3aGVuCisgKiB3YWl0aW5nIG9uIGEgY29uZGl0aW9uLCB0aGUgcmVjdXJzaW9uIGNvdW50IGlzIHNhdmVkIGFuZCByZXN0b3JlZCwKKyAqIGFuZCB0aGUgbXV0ZXggaXMgY29tcGxldGVseSB1bmxvY2tlZCwgbm90IGp1c3QgZGVjcmVtZW50ZWQgb25lCisgKiBsZXZlbCBvZiByZWN1cnNpb24uCisgKgorICogVGh1cyB3aXRoIHB0aHJlYWRzIHlvdSBwcm9iYWJseSBoYXZlIHRvIHJvbGwgeW91ciBvd24gZW11bGF0ZWQKKyAqIHJlY3Vyc2l2ZSBtdXRleGVzLCB5b3UgY2FuJ3QgdXNlIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLiBUaGlzIGlzCisgKiB3aGF0IGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSBkb2VzIG9uIHBsYXRmb3JtcyB0aGF0IHVzZQorICogcHRocmVhZHMuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGludCBtYXNrOyAvKio8IE1hc2sgaW5kaWNhdGluZyB3aGljaCBmdW5jdGlvbnMgYXJlIHByZXNlbnQuICovCisKKyAgREJ1c011dGV4TmV3RnVuY3Rpb24gbXV0ZXhfbmV3OyAvKio8IEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKyAgREJ1c011dGV4RnJlZUZ1bmN0aW9uIG11dGV4X2ZyZWU7IC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKyAgREJ1c011dGV4TG9ja0Z1bmN0aW9uIG11dGV4X2xvY2s7IC8qKjwgRnVuY3Rpb24gdG8gbG9jayBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKyAgREJ1c011dGV4VW5sb2NrRnVuY3Rpb24gbXV0ZXhfdW5sb2NrOyAvKio8IEZ1bmN0aW9uIHRvIHVubG9jayBhIG11dGV4OyBvcHRpb25hbCBhbmQgZGVwcmVjYXRlZC4gKi8KKworICBEQnVzQ29uZFZhck5ld0Z1bmN0aW9uIGNvbmR2YXJfbmV3OyAvKio8IEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLworICBEQnVzQ29uZFZhckZyZWVGdW5jdGlvbiBjb25kdmFyX2ZyZWU7IC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBhIGNvbmRpdGlvbiB2YXJpYWJsZSAqLworICBEQnVzQ29uZFZhcldhaXRGdW5jdGlvbiBjb25kdmFyX3dhaXQ7IC8qKjwgRnVuY3Rpb24gdG8gd2FpdCBvbiBhIGNvbmRpdGlvbiAqLworICBEQnVzQ29uZFZhcldhaXRUaW1lb3V0RnVuY3Rpb24gY29uZHZhcl93YWl0X3RpbWVvdXQ7IC8qKjwgRnVuY3Rpb24gdG8gd2FpdCBvbiBhIGNvbmRpdGlvbiB3aXRoIGEgdGltZW91dCAqLworICBEQnVzQ29uZFZhcldha2VPbmVGdW5jdGlvbiBjb25kdmFyX3dha2Vfb25lOyAvKio8IEZ1bmN0aW9uIHRvIHdha2Ugb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gKi8KKyAgREJ1c0NvbmRWYXJXYWtlQWxsRnVuY3Rpb24gY29uZHZhcl93YWtlX2FsbDsgLyoqPCBGdW5jdGlvbiB0byB3YWtlIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiAqLworIAorICBEQnVzUmVjdXJzaXZlTXV0ZXhOZXdGdW5jdGlvbiByZWN1cnNpdmVfbXV0ZXhfbmV3OyAvKio8IEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHJlY3Vyc2l2ZSBtdXRleCAqLworICBEQnVzUmVjdXJzaXZlTXV0ZXhGcmVlRnVuY3Rpb24gcmVjdXJzaXZlX211dGV4X2ZyZWU7IC8qKjwgRnVuY3Rpb24gdG8gZnJlZSBhIHJlY3Vyc2l2ZSBtdXRleCAqLworICBEQnVzUmVjdXJzaXZlTXV0ZXhMb2NrRnVuY3Rpb24gcmVjdXJzaXZlX211dGV4X2xvY2s7IC8qKjwgRnVuY3Rpb24gdG8gbG9jayBhIHJlY3Vyc2l2ZSBtdXRleCAqLworICBEQnVzUmVjdXJzaXZlTXV0ZXhVbmxvY2tGdW5jdGlvbiByZWN1cnNpdmVfbXV0ZXhfdW5sb2NrOyAvKio8IEZ1bmN0aW9uIHRvIHVubG9jayBhIHJlY3Vyc2l2ZSBtdXRleCAqLworCisgIHZvaWQgKCogcGFkZGluZzEpICh2b2lkKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIHBhZGRpbmcyKSAodm9pZCk7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBwYWRkaW5nMykgKHZvaWQpOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogcGFkZGluZzQpICh2b2lkKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAKK30gREJ1c1RocmVhZEZ1bmN0aW9uczsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3RocmVhZHNfaW5pdCAgICAgICAgIChjb25zdCBEQnVzVGhyZWFkRnVuY3Rpb25zICpmdW5jdGlvbnMpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICh2b2lkKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RIUkVBRFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRpbWVvdXQuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aW1lb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkNmNlNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aW1lb3V0LmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10aW1lb3V0LmMgREJ1c1RpbWVvdXQgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGltZW91dC5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVGltZW91dEludGVybmFscyBEQnVzVGltZW91dCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIERCdXNUaW1lb3V0CisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c1RpbWVvdXQKKyAqLworc3RydWN0IERCdXNUaW1lb3V0Cit7CisgIGludCByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIGludCBpbnRlcnZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuICovCisKKyAgREJ1c1RpbWVvdXRIYW5kbGVyIGhhbmRsZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0IGhhbmRsZXIuICovCisgIHZvaWQgKmhhbmRsZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCBoYW5kbGVyIGRhdGEuICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb247IC8qKjwgRnJlZSB0aGUgdGltZW91dCBoYW5kbGVyIGRhdGEuICovCisgIAorICB2b2lkICpkYXRhOwkJICAgCSAgICAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gZGF0YS4gKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuY3Rpb247ICAgICAgICAgLyoqPCBGcmVlIHRoZSBhcHBsaWNhdGlvbiBkYXRhLiAqLworICB1bnNpZ25lZCBpbnQgZW5hYmxlZCA6IDE7ICAgICAgICAgICAgICAgICAgICAvKio8IFRydWUgaWYgdGltZW91dCBpcyBhY3RpdmUuICovCit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgREJ1c1RpbWVvdXQsIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAqIEBwYXJhbSBpbnRlcnZhbCB0aGUgdGltZW91dCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuCisgKiBAcGFyYW0gaGFuZGxlciBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHRpbWVvdXQgb2NjdXJzLgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgdGhlIG5ldyBEQnVzVGltZW91dCBvYmplY3QsCisgKi8KK0RCdXNUaW1lb3V0KgorX2RidXNfdGltZW91dF9uZXcgKGludCAgICAgICAgICAgICAgICAgaW50ZXJ2YWwsCisJCSAgIERCdXNUaW1lb3V0SGFuZGxlciAgaGFuZGxlciwKKwkJICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhLAorCQkgICBEQnVzRnJlZUZ1bmN0aW9uICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisKKyAgdGltZW91dCA9IGRidXNfbmV3MCAoREJ1c1RpbWVvdXQsIDEpOworICBpZiAodGltZW91dCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgdGltZW91dC0+cmVmY291bnQgPSAxOworICB0aW1lb3V0LT5pbnRlcnZhbCA9IGludGVydmFsOworCisgIHRpbWVvdXQtPmhhbmRsZXIgPSBoYW5kbGVyOworICB0aW1lb3V0LT5oYW5kbGVyX2RhdGEgPSBkYXRhOworICB0aW1lb3V0LT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICB0aW1lb3V0LT5lbmFibGVkID0gVFJVRTsKKyAgCisgIHJldHVybiB0aW1lb3V0OworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNUaW1lb3V0IG9iamVjdC4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgdGltZW91dCBvYmplY3QuCisgKi8KK0RCdXNUaW1lb3V0ICoKK19kYnVzX3RpbWVvdXRfcmVmIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgdGltZW91dC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gdGltZW91dDsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzVGltZW91dCBvYmplY3QKKyAqIGFuZCBmaW5hbGl6ZXMgdGhlIG9iamVjdCBpZiB0aGUgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IG9iamVjdC4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF91bnJlZiAoREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIF9kYnVzX2Fzc2VydCAodGltZW91dCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0aW1lb3V0LT5yZWZjb3VudCA+IDApOworICAKKyAgdGltZW91dC0+cmVmY291bnQgLT0gMTsKKyAgaWYgKHRpbWVvdXQtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgZGJ1c190aW1lb3V0X3NldF9kYXRhICh0aW1lb3V0LCBOVUxMLCBOVUxMKTsgLyogY2FsbCBmcmVlX2RhdGFfZnVuY3Rpb24gKi8KKworICAgICAgaWYgKHRpbWVvdXQtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKQorCSgqIHRpbWVvdXQtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKSAodGltZW91dC0+aGFuZGxlcl9kYXRhKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlICh0aW1lb3V0KTsKKyAgICB9Cit9CisKKy8qKgorICogQ2hhbmdlcyB0aGUgdGltZW91dCBpbnRlcnZhbC4gTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGRpc2FibGUgYW5kCisgKiByZS1lbmFibGUgdGhlIHRpbWVvdXQgdXNpbmcgdGhlIHRpbWVvdXQgdG9nZ2xlIGZ1bmN0aW9uCisgKiAoX2RidXNfY29ubmVjdGlvbl90b2dnbGVfdGltZW91dF91bmxvY2tlZCgpIGV0Yy4pIHRvIG5vdGlmeSB0aGUKKyAqIGFwcGxpY2F0aW9uIG9mIHRoaXMgY2hhbmdlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0CisgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIG5ldyBpbnRlcnZhbAorICovCit2b2lkCitfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGludGVydmFsKQoreworICBfZGJ1c19hc3NlcnQgKGludGVydmFsID49IDApOworICAKKyAgdGltZW91dC0+aW50ZXJ2YWwgPSBpbnRlcnZhbDsKK30KKworLyoqCisgKiBDaGFuZ2VzIHRoZSB0aW1lb3V0J3MgZW5hYmxlZC1uZXNzLiBOb3RlIHRoYXQgeW91IHNob3VsZCB1c2UKKyAqIF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3RpbWVvdXRfdW5sb2NrZWQoKSBldGMuIGluc3RlYWQsIGlmCisgKiB0aGUgdGltZW91dCBpcyBwYXNzZWQgb3V0IHRvIGFuIGFwcGxpY2F0aW9uIG1haW4gbG9vcC4KKyAqIGkuZS4geW91IGNhbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBELUJ1cyBsaWJyYXJ5LCBpdCdzCisgKiBvbmx5IHVzZWQgaW4gdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dAorICogQHBhcmFtIGVuYWJsZWQgI1RSVUUgaWYgdGltZW91dCBzaG91bGQgYmUgZW5hYmxlZC4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCAoREJ1c1RpbWVvdXQgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICBlbmFibGVkKQoreworICB0aW1lb3V0LT5lbmFibGVkID0gZW5hYmxlZCAhPSBGQUxTRTsKK30KKworCisvKioKKyAqIEB0eXBlZGVmIERCdXNUaW1lb3V0TGlzdAorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiB0aW1lb3V0cworICogYW5kIGEgc2V0IG9mIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24vREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbi4KKyAqIEF1dG9tYXRpY2FsbHkgaGFuZGxlcyByZW1vdmluZy9yZS1hZGRpbmcgdGltZW91dHMKKyAqIHdoZW4gdGhlIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gaXMgdXBkYXRlZCBvciBjaGFuZ2VkLgorICogSG9sZHMgYSByZWZlcmVuY2UgY291bnQgdG8gZWFjaCB0aW1lb3V0LgorICoKKyAqLworCisvKioKKyAqIERCdXNUaW1lb3V0TGlzdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBBbGwgZmllbGRzCisgKiBhcmUgcHJpdmF0ZS4KKyAqCisgKi8KK3N0cnVjdCBEQnVzVGltZW91dExpc3QKK3sKKyAgREJ1c0xpc3QgKnRpbWVvdXRzOyAvKio8IFRpbWVvdXQgb2JqZWN0cy4gKi8KKworICBEQnVzQWRkVGltZW91dEZ1bmN0aW9uIGFkZF90aW1lb3V0X2Z1bmN0aW9uOyAgICAgICAvKio8IENhbGxiYWNrIGZvciBhZGRpbmcgYSB0aW1lb3V0LiAqLworICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uIHJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIGZvciByZW1vdmluZyBhIHRpbWVvdXQuICovCisgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRpbWVvdXRfdG9nZ2xlZF9mdW5jdGlvbjsgLyoqPCBDYWxsYmFjayB3aGVuIHRpbWVvdXQgaXMgZW5hYmxlZC9kaXNhYmxlZCBvciBjaGFuZ2VzIGludGVydmFsICovCisgIHZvaWQgKnRpbWVvdXRfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YSBmb3IgdGltZW91dCBjYWxsYmFja3MgKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiB0aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbjsgICAgICAgLyoqPCBGcmVlIGZ1bmN0aW9uIGZvciB0aW1lb3V0IGNhbGxiYWNrIGRhdGEgKi8KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0aW1lb3V0IGxpc3QuIFJldHVybnMgI05VTEwgaWYgaW5zdWZmaWNpZW50CisgKiBtZW1vcnkgZXhpc3RzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgdGltZW91dCBsaXN0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzVGltZW91dExpc3QqCitfZGJ1c190aW1lb3V0X2xpc3RfbmV3ICh2b2lkKQoreworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdDsKKworICB0aW1lb3V0X2xpc3QgPSBkYnVzX25ldzAgKERCdXNUaW1lb3V0TGlzdCwgMSk7CisgIGlmICh0aW1lb3V0X2xpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gdGltZW91dF9saXN0OworfQorCisvKioKKyAqIEZyZWVzIGEgREJ1c1RpbWVvdXRMaXN0LgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF9saXN0X2ZyZWUgKERCdXNUaW1lb3V0TGlzdCAqdGltZW91dF9saXN0KQoreworICAvKiBmcmVlIHRpbWVvdXRfZGF0YSBhbmQgcmVtb3ZlIHRpbWVvdXRzIGFzIGEgc2lkZSBlZmZlY3QgKi8KKyAgX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgKHRpbWVvdXRfbGlzdCwKKwkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdGltZW91dF9saXN0LT50aW1lb3V0cywKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIF9kYnVzX3RpbWVvdXRfdW5yZWYsCisJCSAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmdGltZW91dF9saXN0LT50aW1lb3V0cyk7CisKKyAgZGJ1c19mcmVlICh0aW1lb3V0X2xpc3QpOworfQorCisvKioKKyAqIFNldHMgdGhlIHRpbWVvdXQgZnVuY3Rpb25zLiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSAiYmFja2VuZCIKKyAqIGZvciBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkuCisgKgorICogQHBhcmFtIHRpbWVvdXRfbGlzdCB0aGUgdGltZW91dCBsaXN0CisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIHRoZSBhZGQgdGltZW91dCBmdW5jdGlvbi4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gdGhlIHJlbW92ZSB0aW1lb3V0IGZ1bmN0aW9uLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gdG9nZ2xlIG5vdGlmeSBmdW5jdGlvbiwgb3IgI05VTEwKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aG9zZSBmdW5jdGlvbnMuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIHRoZSBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RpbWVvdXRfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJICBEQnVzQWRkVGltZW91dEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisJCQkJICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gdG9nZ2xlZF9mdW5jdGlvbiwKKwkJCQkgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIC8qIEFkZCB0aW1lb3V0cyB3aXRoIHRoZSBuZXcgZnVuY3Rpb24sIGZhaWxpbmcgb24gT09NICovCisgIGlmIChhZGRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgCisgICAgICAgICAgaWYgKCEoKiBhZGRfZnVuY3Rpb24pIChsaW5rLT5kYXRhLCBkYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogcmVtb3ZlIGl0IGFsbCBhZ2FpbiBhbmQgcmV0dXJuIEZBTFNFICovCisgICAgICAgICAgICAgIERCdXNMaXN0ICpsaW5rMjsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGxpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMpOworICAgICAgICAgICAgICB3aGlsZSAobGluazIgIT0gbGluaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazIpOworCisgICAgICAgICAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pIChsaW5rMi0+ZGF0YSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGxpbmsyID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisgIAorICAvKiBSZW1vdmUgYWxsIGN1cnJlbnQgdGltZW91dHMgZnJvbSBwcmV2aW91cyB0aW1lb3V0IGhhbmRsZXJzICovCisKKyAgaWYgKHRpbWVvdXRfbGlzdC0+cmVtb3ZlX3RpbWVvdXRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLAorCQkJICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgdGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbiwKKwkJCSAgdGltZW91dF9saXN0LT50aW1lb3V0X2RhdGEpOworICAgIH0KKworICBpZiAodGltZW91dF9saXN0LT50aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHRpbWVvdXRfbGlzdC0+dGltZW91dF9mcmVlX2RhdGFfZnVuY3Rpb24pICh0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSk7CisKKyAgdGltZW91dF9saXN0LT5hZGRfdGltZW91dF9mdW5jdGlvbiA9IGFkZF9mdW5jdGlvbjsKKyAgdGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbiA9IHJlbW92ZV9mdW5jdGlvbjsKKyAgdGltZW91dF9saXN0LT50aW1lb3V0X3RvZ2dsZWRfZnVuY3Rpb24gPSB0b2dnbGVkX2Z1bmN0aW9uOworICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSA9IGRhdGE7CisgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQWRkcyBhIG5ldyB0aW1lb3V0IHRvIHRoZSB0aW1lb3V0IGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24gREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byBhZGQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgSWYgbm8gbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdGltZW91dF9saXN0X2FkZF90aW1lb3V0IChEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdCwKKwkJCQlEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLCB0aW1lb3V0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdGltZW91dF9yZWYgKHRpbWVvdXQpOworCisgIGlmICh0aW1lb3V0X2xpc3QtPmFkZF90aW1lb3V0X2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEoKiB0aW1lb3V0X2xpc3QtPmFkZF90aW1lb3V0X2Z1bmN0aW9uKSAodGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLCB0aW1lb3V0KTsKKyAgICAgICAgICBfZGJ1c190aW1lb3V0X3VucmVmICh0aW1lb3V0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHRpbWVvdXQgZnJvbSB0aGUgdGltZW91dCBsaXN0LCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uJ3MgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byByZW1vdmUuCisgKi8KK3ZvaWQKK19kYnVzX3RpbWVvdXRfbGlzdF9yZW1vdmVfdGltZW91dCAoREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0X2xpc3QsCisJCQkJICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KQoreworICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmdGltZW91dF9saXN0LT50aW1lb3V0cywgdGltZW91dCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiTm9uZXhpc3RlbnQgdGltZW91dCB3YXMgcmVtb3ZlZCIpOworCisgIGlmICh0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbikgKHRpbWVvdXQsCisJCQkJCSAgICAgICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSk7CisKKyAgX2RidXNfdGltZW91dF91bnJlZiAodGltZW91dCk7Cit9CisKKy8qKgorICogU2V0cyBhIHRpbWVvdXQgdG8gdGhlIGdpdmVuIGVuYWJsZWQgc3RhdGUsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24ncyBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QuCisgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byB0b2dnbGUuCisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSB0byBlbmFibGUKKyAqLwordm9pZAorX2RidXNfdGltZW91dF9saXN0X3RvZ2dsZV90aW1lb3V0IChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIGVuYWJsZWQgPSAhIWVuYWJsZWQ7CisgIAorICBpZiAoZW5hYmxlZCA9PSB0aW1lb3V0LT5lbmFibGVkKQorICAgIHJldHVybjsKKworICB0aW1lb3V0LT5lbmFibGVkID0gZW5hYmxlZDsKKyAgCisgIGlmICh0aW1lb3V0X2xpc3QtPnRpbWVvdXRfdG9nZ2xlZF9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHRpbWVvdXRfbGlzdC0+dGltZW91dF90b2dnbGVkX2Z1bmN0aW9uKSAodGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKTsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUaW1lb3V0IERCdXNUaW1lb3V0CisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIE9iamVjdCByZXByZXNlbnRpbmcgYSB0aW1lb3V0CisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNUaW1lb3V0LiBBIHRpbWVvdXQKKyAqIHJlcHJlc2VudHMgYSB0aW1lb3V0IHRoYXQgdGhlIG1haW4gbG9vcCBuZWVkcyB0byBtb25pdG9yLAorICogYXMgaW4gUXQncyBRVGltZXIgb3IgR0xpYidzIGdfdGltZW91dF9hZGQoKS4KKyAqCisgKiBVc2UgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yIGRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpCisgKiB0byBiZSBub3RpZmllZCB3aGVuIGxpYmRidXMgbmVlZHMgdG8gYWRkIG9yIHJlbW92ZSB0aW1lb3V0cy4KKyAqIAorICogQHsKKyAqLworCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1RpbWVvdXQKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHRpbWVvdXQuCisgKi8KKworLyoqCisgKiBHZXRzIHRoZSB0aW1lb3V0IGludGVydmFsLiBUaGUgZGJ1c190aW1lb3V0X2hhbmRsZSgpCisgKiBzaG91bGQgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGlzIGludGVydmFsIGVsYXBzZXMsCisgKiBzdGFydGluZyBhZnRlciBpdCBlbGFwc2VzIG9uY2UuCisgKgorICogVGhlIGludGVydmFsIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIG9mIHRoZQorICogdGltZW91dDsgaWYgc28sIHRoZSB0aW1lb3V0IHdpbGwgYmUgZGlzYWJsZWQgYW5kCisgKiByZS1lbmFibGVkIChjYWxsaW5nIHRoZSAidGltZW91dCB0b2dnbGVkIGZ1bmN0aW9uIikKKyAqIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgREJ1c1RpbWVvdXQgb2JqZWN0LgorICogQHJldHVybnMgdGhlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4KKyAqLworaW50CitkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuIHRpbWVvdXQtPmludGVydmFsOworfQorCisvKioKKyAqIEdldHMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfdGltZW91dF9zZXRfZGF0YSgpCisgKiBvciAjTlVMTCBpZiBub25lLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyBwcmV2aW91c2x5LXNldCBkYXRhLgorICovCit2b2lkKgorZGJ1c190aW1lb3V0X2dldF9kYXRhIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuIHRpbWVvdXQtPmRhdGE7Cit9CisKKy8qKgorICogU2V0cyBkYXRhIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBkYnVzX3RpbWVvdXRfZ2V0X2RhdGEoKS4KKyAqIEludGVuZGVkIGZvciB1c2UgYnkgdGhlIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gYW5kCisgKiBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uIHRvIHN0b3JlIHRoZWlyIG93biBkYXRhLiAgRm9yIGV4YW1wbGUgd2l0aAorICogUXQgeW91IG1pZ2h0IHN0b3JlIHRoZSBRVGltZXIgZm9yIHRoaXMgdGltZW91dCBhbmQgd2l0aCBHTGliCisgKiB5b3UgbWlnaHQgc3RvcmUgYSBnX3RpbWVvdXRfYWRkIHJlc3VsdCBpZC4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgREJ1c1RpbWVvdXQgb2JqZWN0LgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICovCit2b2lkCitkYnVzX3RpbWVvdXRfc2V0X2RhdGEgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQsCisJCSAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorCQkgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBpZiAodGltZW91dC0+ZnJlZV9kYXRhX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dC0+ZnJlZV9kYXRhX2Z1bmN0aW9uKSAodGltZW91dC0+ZGF0YSk7CisKKyAgdGltZW91dC0+ZGF0YSA9IGRhdGE7CisgIHRpbWVvdXQtPmZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKK30KKworLyoqCisgKiBDYWxscyB0aGUgdGltZW91dCBoYW5kbGVyIGZvciB0aGlzIHRpbWVvdXQuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZW91dAorICogb2NjdXJzLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UsIHRoZW4gdGhlcmUgd2Fzbid0CisgKiBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSB0aGUgdGltZW91dC4gVHlwaWNhbGx5IGp1c3QKKyAqIGxldHRpbmcgdGhlIHRpbWVvdXQgZmlyZSBhZ2FpbiBuZXh0IHRpbWUgaXQgbmF0dXJhbGx5CisgKiB0aW1lcyBvdXQgaXMgYW4gYWRlcXVhdGUgcmVzcG9uc2UgdG8gdGhhdCBwcm9ibGVtLAorICogYnV0IHlvdSBjb3VsZCB0cnkgdG8gZG8gbW9yZSBpZiB5b3Ugd2FudGVkLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgd2Fzbid0IGVub3VnaCBtZW1vcnkgCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3RpbWVvdXRfaGFuZGxlIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuICgqIHRpbWVvdXQtPmhhbmRsZXIpICh0aW1lb3V0LT5oYW5kbGVyX2RhdGEpOworfQorCisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgdGltZW91dCBpcyBlbmFibGVkIG9yIG5vdC4gSWYgbm90CisgKiBlbmFibGVkLCBpdCBzaG91bGQgbm90IGJlIHBvbGxlZCBieSB0aGUgbWFpbiBsb29wLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB0aW1lb3V0IGlzIGVuYWJsZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdGltZW91dF9nZXRfZW5hYmxlZCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIHJldHVybiB0aW1lb3V0LT5lbmFibGVkOworfQorCisvKiogQH0gZW5kIHB1YmxpYyBBUEkgZG9jcyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRpbWVvdXQuaCBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aW1lb3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhOGFmNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10aW1lb3V0LmgKQEAgLTAsMCArMSw3NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRpbWVvdXQuaCBEQnVzVGltZW91dCBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RJTUVPVVRfSAorI2RlZmluZSBEQlVTX1RJTUVPVVRfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzVGltZW91dEludGVybmFscworICogQHsKKyAqLworCisvKiBQdWJsaWMgbWV0aG9kcyBvbiBEQnVzVGltZW91dCBhcmUgaW4gZGJ1cy1jb25uZWN0aW9uLmggKi8KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RpbWVvdXRMaXN0IERCdXNUaW1lb3V0TGlzdDsKKworLyoqIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSB0aW1lb3V0IGlzIGhhbmRsZWQgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c1RpbWVvdXRIYW5kbGVyKSAodm9pZCAqZGF0YSk7CisKK0RCdXNUaW1lb3V0KiBfZGJ1c190aW1lb3V0X25ldyAgICAgICAgICAoaW50ICAgICAgICAgICAgICAgICBpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyICBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCdXNUaW1lb3V0KiBfZGJ1c190aW1lb3V0X3JlZiAgICAgICAgICAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0KTsKK3ZvaWQgICAgICAgICBfZGJ1c190aW1lb3V0X3VucmVmICAgICAgICAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0KTsKK3ZvaWQgICAgICAgICBfZGJ1c190aW1lb3V0X3NldF9pbnRlcnZhbCAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGludGVydmFsKTsKK3ZvaWQgICAgICAgICBfZGJ1c190aW1lb3V0X3NldF9lbmFibGVkICAoREJ1c1RpbWVvdXQgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGVuYWJsZWQpOworCitEQnVzVGltZW91dExpc3QgKl9kYnVzX3RpbWVvdXRfbGlzdF9uZXcgICAgICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlICAgICAgICAgICAoREJ1c1RpbWVvdXRMaXN0ICAgICAgICAgICAqdGltZW91dF9saXN0KTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJCQkgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorCQkJCQkJICAgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCQkJICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJCQkgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfdGltZW91dF9saXN0X2FkZF90aW1lb3V0ICAgIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJCQkgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9yZW1vdmVfdGltZW91dCAoREJ1c1RpbWVvdXRMaXN0ICAgICAgICAgICAqdGltZW91dF9saXN0LAorCQkJCQkJICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgIGVuYWJsZWQpOworCisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19USU1FT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjlkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIFVzZWQgYnkgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0IG9iamVjdCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19UUkFOU1BPUlRfUFJPVEVDVEVEX0gKKyNkZWZpbmUgREJVU19UUkFOU1BPUlRfUFJPVEVDVEVEX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWF1dGguaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcmVzb3VyY2VzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RyYW5zcG9ydFZUYWJsZSBEQnVzVHJhbnNwb3J0VlRhYmxlOworCisvKioKKyAqIFRoZSB2aXJ0dWFsIHRhYmxlIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0bworICogY3JlYXRlIGEgbmV3IGtpbmQgb2YgdHJhbnNwb3J0LgorICovCitzdHJ1Y3QgREJ1c1RyYW5zcG9ydFZUYWJsZQoreworICB2b2lkICAgICAgICAoKiBmaW5hbGl6ZSkgICAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpOworICAvKio8IFRoZSBmaW5hbGl6ZSBtZXRob2QgbXVzdCBmcmVlIHRoZSB0cmFuc3BvcnQuICovCisKKyAgZGJ1c19ib29sX3QgKCogaGFuZGxlX3dhdGNoKSAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MpOworICAvKio8IFRoZSBoYW5kbGVfd2F0Y2ggbWV0aG9kIGhhbmRsZXMgcmVhZGluZy93cml0aW5nCisgICAqIGRhdGEgYXMgaW5kaWNhdGVkIGJ5IHRoZSBmbGFncy4KKyAgICovCisKKyAgdm9pZCAgICAgICAgKCogZGlzY29ubmVjdCkgICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKyAgLyoqPCBEaXNjb25uZWN0IHRoaXMgdHJhbnNwb3J0LiAqLworCisgIGRidXNfYm9vbF90ICgqIGNvbm5lY3Rpb25fc2V0KSAgICAgICAgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisgIC8qKjwgQ2FsbGVkIHdoZW4gdHJhbnNwb3J0LT5jb25uZWN0aW9uIGhhcyBiZWVuIGZpbGxlZCBpbiAqLworCisgIHZvaWQgICAgICAgICgqIGRvX2l0ZXJhdGlvbikgICAgICAgICAgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgLyoqPCBDYWxsZWQgdG8gZG8gYSBzaW5nbGUgIml0ZXJhdGlvbiIgKGJsb2NrIG9uIHNlbGVjdC9wb2xsCisgICAqIGZvbGxvd2VkIGJ5IHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhKS4KKyAgICovCisKKyAgdm9pZCAgICAgICAgKCogbGl2ZV9tZXNzYWdlc19jaGFuZ2VkKSAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKyAgLyoqPCBPdXRzdGFuZGluZyBtZXNzYWdlcyBjb3VudGVyIGNoYW5nZWQgKi8KKworICBkYnVzX2Jvb2xfdCAoKiBnZXRfc29ja2V0X2ZkKSAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqZmRfcCk7CisgIC8qKjwgR2V0IHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KK307CisKKy8qKgorICogT2JqZWN0IHJlcHJlc2VudGluZyBhIHRyYW5zcG9ydCBzdWNoIGFzIGEgc29ja2V0LgorICogQSB0cmFuc3BvcnQgY2FuIHNodXR0bGUgbWVzc2FnZXMgZnJvbSBwb2ludCBBIHRvIHBvaW50IEIsCisgKiBhbmQgaXMgdGhlIGJhY2tlbmQgZm9yIGEgI0RCdXNDb25uZWN0aW9uLgorICoKKyAqLworc3RydWN0IERCdXNUcmFuc3BvcnQKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudC4gKi8KKworICBjb25zdCBEQnVzVHJhbnNwb3J0VlRhYmxlICp2dGFibGU7ICAgICAgICAgIC8qKjwgVmlydHVhbCBtZXRob2RzIGZvciB0aGlzIGluc3RhbmNlLiAqLworCisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOyAgICAgICAgICAgICAgICAgLyoqPCBDb25uZWN0aW9uIG93bmluZyB0aGlzIHRyYW5zcG9ydC4gKi8KKworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOyAgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZS1sb2FkaW5nIGJ1ZmZlci4gKi8KKworICBEQnVzQXV0aCAqYXV0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXV0aGVudGljYXRpb24gY29udmVyc2F0aW9uICovCisKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFsczsgICAgICAgICAgICAgICAvKio8IENyZWRlbnRpYWxzIG9mIG90aGVyIGVuZCByZWFkIGZyb20gdGhlIHNvY2tldCAqLyAgCisKKyAgbG9uZyBtYXhfbGl2ZV9tZXNzYWdlc19zaXplOyAgICAgICAgICAgICAgICAvKio8IE1heCB0b3RhbCBzaXplIG9mIHJlY2VpdmVkIG1lc3NhZ2VzLiAqLworICBsb25nIG1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzOyAgICAgICAgICAgIC8qKjwgTWF4IHRvdGFsIHVuaXggZmRzIG9mIHJlY2VpdmVkIG1lc3NhZ2VzLiAqLworCisgIERCdXNDb3VudGVyICpsaXZlX21lc3NhZ2VzOyAgICAgICAgICAgICAgICAgLyoqPCBDb3VudGVyIGZvciBzaXplL3VuaXggZmRzIG9mIGFsbCBsaXZlIG1lc3NhZ2VzLiAqLworCisgIGNoYXIgKmFkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgd2UgYXJlIGNvbm5lY3RpbmcgdG8gKCNOVUxMIGZvciB0aGUgc2VydmVyIHNpZGUgb2YgYSB0cmFuc3BvcnQpICovCisKKyAgY2hhciAqZXhwZWN0ZWRfZ3VpZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEdVSUQgd2UgZXhwZWN0IHRoZSBzZXJ2ZXIgdG8gaGF2ZSwgI05VTEwgb24gc2VydmVyIHNpZGUgb3IgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBleHBlY3RhdGlvbiAqLworICAKKyAgREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbiB1bml4X3VzZXJfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gZm9yIGNoZWNraW5nIHdoZXRoZXIgYSB1c2VyIGlzIGF1dGhvcml6ZWQuICovCisgIHZvaWQgKnVuaXhfdXNlcl9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgZm9yIHVuaXhfdXNlcl9mdW5jdGlvbiAqLworICAKKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX3VuaXhfdXNlcl9kYXRhOyAgICAgICAgIC8qKjwgRnVuY3Rpb24gdG8gZnJlZSB1bml4X3VzZXJfZGF0YSAqLworCisgIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24gd2luZG93c191c2VyX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIGZvciBjaGVja2luZyB3aGV0aGVyIGEgdXNlciBpcyBhdXRob3JpemVkLiAqLworICB2b2lkICp3aW5kb3dzX3VzZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciB3aW5kb3dzX3VzZXJfZnVuY3Rpb24gKi8KKyAgCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV93aW5kb3dzX3VzZXJfZGF0YTsgICAgICAgICAgICAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgd2luZG93c191c2VyX2RhdGEgKi8KKyAgCisgIHVuc2lnbmVkIGludCBkaXNjb25uZWN0ZWQgOiAxOyAgICAgICAgICAgICAgLyoqPCAjVFJVRSBpZiB3ZSBhcmUgZGlzY29ubmVjdGVkLiAqLworICB1bnNpZ25lZCBpbnQgYXV0aGVudGljYXRlZCA6IDE7ICAgICAgICAgICAgIC8qKjwgQ2FjaGUgb2YgYXV0aCBzdGF0ZTsgdXNlIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCgpIHRvIHF1ZXJ5IHZhbHVlICovCisgIHVuc2lnbmVkIGludCBzZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgOiAxOyAgLyoqPCAjVFJVRSBpZiB3ZSBuZWVkIHRvIHNlbmQgY3JlZGVudGlhbHMgKi8KKyAgdW5zaWduZWQgaW50IHJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA6IDE7IC8qKjwgI1RSVUUgaWYgd2UgbmVlZCB0byByZWNlaXZlIGNyZWRlbnRpYWxzICovCisgIHVuc2lnbmVkIGludCBpc19zZXJ2ZXIgOiAxOyAgICAgICAgICAgICAgICAgLyoqPCAjVFJVRSBpZiBvbiB0aGUgc2VydmVyIHNpZGUgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZF9ieXRlc19yZWNvdmVyZWQgOiAxOyAgICAvKio8ICNUUlVFIGlmIHdlJ3ZlIHJlY292ZXJlZCB1bnVzZWQgYnl0ZXMgZnJvbSBhdXRoICovCisgIHVuc2lnbmVkIGludCBhbGxvd19hbm9ueW1vdXMgOiAxOyAgICAgICAgICAgLyoqPCAjVFJVRSBpZiBhbiBhbm9ueW1vdXMgY2xpZW50IGNhbiBjb25uZWN0ICovCit9OworCitkYnVzX2Jvb2xfdCBfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUcmFuc3BvcnRWVGFibGUgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICpzZXJ2ZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICphZGRyZXNzKTsKK3ZvaWQgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9maW5hbGl6ZV9iYXNlIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCisKK3R5cGVkZWYgZW51bQoreworICBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVELCAgICAvKio8IHdlIGFyZW4ndCBpbiBjaGFyZ2Ugb2YgdGhpcyBhZGRyZXNzIHR5cGUgKi8KKyAgREJVU19UUkFOU1BPUlRfT1BFTl9PSywgICAgICAgICAgICAgLyoqPCB3ZSBzZXQgdXAgdGhlIGxpc3RlbiAqLworICBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTLCAgICAvKio8IG1hbGZvcm1lZCBhZGRyZXNzICovCisgIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUIC8qKjwgd2VsbC1mb3JtZWQgYWRkcmVzcyBidXQgZmFpbGVkIHRvIHNldCBpdCB1cCAqLworfSBEQnVzVHJhbnNwb3J0T3BlblJlc3VsdDsKKworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9DQU5fU0VORF9VTklYX0ZEKHgpICAgICAgXAorICBfZGJ1c19hdXRoX2dldF91bml4X2ZkX25lZ290aWF0ZWQoKHgpLT5hdXRoKQorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19UUkFOU1BPUlRfUFJPVEVDVEVEX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGMyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jCkBAIC0wLDAgKzEsMTQzNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyAgU29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0U29ja2V0IERCdXNUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGZvciBzb2NrZXRzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1RyYW5zcG9ydCBvbiBzb2NrZXRzCisgKgorICogQHsKKyAqLworCisvKioKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNUcmFuc3BvcnRTb2NrZXQgREJ1c1RyYW5zcG9ydFNvY2tldDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNUcmFuc3BvcnRTb2NrZXQuIEFsbCBtZW1iZXJzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1RyYW5zcG9ydFNvY2tldAoreworICBEQnVzVHJhbnNwb3J0IGJhc2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgUGFyZW50IGluc3RhbmNlICovCisgIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3IuICovCisgIERCdXNXYXRjaCAqcmVhZF93YXRjaDsgICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBmb3IgcmVhZGFiaWxpdHkuICovCisgIERCdXNXYXRjaCAqd3JpdGVfd2F0Y2g7ICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBmb3Igd3JpdGFiaWxpdHkuICovCisKKyAgaW50IG1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb247ICAgICAvKio8IFRvIGF2b2lkIGJsb2NraW5nIHRvbyBsb25nLiAqLworICBpbnQgbWF4X2J5dGVzX3dyaXR0ZW5fcGVyX2l0ZXJhdGlvbjsgIC8qKjwgVG8gYXZvaWQgYmxvY2tpbmcgdG9vIGxvbmcuICovCisKKyAgaW50IG1lc3NhZ2VfYnl0ZXNfd3JpdHRlbjsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyBvZiBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBvdXRnb2luZyBtZXNzYWdlIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYmVlbiB3cml0dGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQnVzU3RyaW5nIGVuY29kZWRfb3V0Z29pbmc7ICAgICAgICAgIC8qKjwgRW5jb2RlZCB2ZXJzaW9uIG9mIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG91dGdvaW5nIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNTdHJpbmcgZW5jb2RlZF9pbmNvbWluZzsgICAgICAgICAgLyoqPCBFbmNvZGVkIHZlcnNpb24gb2YgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5jb21pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK3N0YXRpYyB2b2lkCitmcmVlX3dhdGNoZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCkKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5jb25uZWN0aW9uKQorICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPSBOVUxMOworICAgIH0KKworICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpCisgICAgeworICAgICAgaWYgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikKKyAgICAgICAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCk7CisgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9IE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2ZpbmFsaXplIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKyAgCisgIGZyZWVfd2F0Y2hlcyAodHJhbnNwb3J0KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpOworICAKKyAgX2RidXNfdHJhbnNwb3J0X2ZpbmFsaXplX2Jhc2UgKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID09IE5VTEwpOworICAKKyAgZGJ1c19mcmVlICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfd3JpdGVfd2F0Y2ggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBkYnVzX2Jvb2xfdCBuZWVkZWQ7CisKKyAgaWYgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9PSBOVUxMKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworCisgIGlmIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKHRyYW5zcG9ydCkpCisgICAgbmVlZGVkID0gX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZykKKyAgICAgICAgbmVlZGVkID0gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIERCdXNBdXRoU3RhdGUgYXV0aF9zdGF0ZTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRoX3N0YXRlID0gX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIHdlIG5lZWQgbWVtb3J5IHdlIGluc3RhbGwgdGhlIHdyaXRlIHdhdGNoIGp1c3QgaW4gY2FzZSwKKyAgICAgICAgICAgKiBpZiB0aGVyZSdzIG5vIG5lZWQgZm9yIGl0LCBpdCB3aWxsIGdldCBkZS1pbnN0YWxsZWQKKyAgICAgICAgICAgKiBuZXh0IHRpbWUgd2UgdHJ5IHJlYWRpbmcuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGF1dGhfc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX0hBVkVfQllURVNfVE9fU0VORCB8fAorICAgICAgICAgICAgICBhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlkpCisgICAgICAgICAgICBuZWVkZWQgPSBUUlVFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5lZWRlZCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja193cml0ZV93YXRjaCgpOiBuZWVkZWQgPSAlZCBvbiBjb25uZWN0aW9uICVwIHdhdGNoICVwIGZkID0gJWQgb3V0Z29pbmcgbWVzc2FnZXMgZXhpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgIG5lZWRlZCwgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdG9nZ2xlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCk7CisKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcmVhZF93YXRjaCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIGRidXNfYm9vbF90IG5lZWRfcmVhZF93YXRjaDsKKworICBfZGJ1c192ZXJib3NlICgiZmQgPSAlZFxuIixzb2NrZXRfdHJhbnNwb3J0LT5mZCk7CisgIAorICBpZiAodHJhbnNwb3J0LT5jb25uZWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPT0gTlVMTCk7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKworICBpZiAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkICh0cmFuc3BvcnQpKQorICAgIG5lZWRfcmVhZF93YXRjaCA9CisgICAgICAoX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSA8IHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSkgJiYKKyAgICAgIChfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpIDwgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2Zkcyk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgICAgIG5lZWRfcmVhZF93YXRjaCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgcmVhc29uIHRvIGRpc2FibGUgbmVlZF9yZWFkX3dhdGNoIHdoZW4gbm90IFdBSVRJTkdfRk9SX0lOUFVUCisgICAgICAgICAgICogaXMgdG8gYXZvaWQgc3Bpbm5pbmcgb24gdGhlIGZpbGUgZGVzY3JpcHRvciB3aGVuIHdlJ3JlIHdhaXRpbmcKKyAgICAgICAgICAgKiB0byB3cml0ZSBvciBmb3Igc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBhdXRoIHByb2Nlc3MKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBEQnVzQXV0aFN0YXRlIGF1dGhfc3RhdGU7CisgICAgICAgICAgCisgICAgICAgICAgYXV0aF9zdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKTsKKworICAgICAgICAgIC8qIElmIHdlIG5lZWQgbWVtb3J5IHdlIGluc3RhbGwgdGhlIHJlYWQgd2F0Y2gganVzdCBpbiBjYXNlLAorICAgICAgICAgICAqIGlmIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgaXQsIGl0IHdpbGwgZ2V0IGRlLWluc3RhbGxlZAorICAgICAgICAgICAqIG5leHQgdGltZSB3ZSB0cnkgcmVhZGluZy4gSWYgd2UncmUgYXV0aGVudGljYXRlZCB3ZQorICAgICAgICAgICAqIGluc3RhbGwgaXQgc2luY2Ugd2Ugbm9ybWFsbHkgaGF2ZSBpdCBpbnN0YWxsZWQgd2hpbGUKKyAgICAgICAgICAgKiBhdXRoZW50aWNhdGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9JTlBVVCB8fAorICAgICAgICAgICAgICBhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlkgfHwKKyAgICAgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRCkKKyAgICAgICAgICAgIG5lZWRfcmVhZF93YXRjaCA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbmVlZF9yZWFkX3dhdGNoID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgc2V0dGluZyByZWFkIHdhdGNoIGVuYWJsZWQgPSAlZFxuIiwgbmVlZF9yZWFkX3dhdGNoKTsKKyAgX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3JlYWRfd2F0Y2gpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2RvX2lvX2Vycm9yIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7Cit9CisKKy8qIHJldHVybiB2YWx1ZSBpcyB3aGV0aGVyIHdlIHN1Y2Nlc3NmdWxseSByZWFkIGFueSBuZXcgZGF0YS4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVhZF9kYXRhX2ludG9fYXV0aCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAqb29tKQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIAorICAqb29tID0gRkFMU0U7CisKKyAgX2RidXNfYXV0aF9nZXRfYnVmZmVyICh0cmFuc3BvcnQtPmF1dGgsICZidWZmZXIpOworICAKKyAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24pOworCisgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5hdXRoLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCA+IDAgPyBieXRlc19yZWFkIDogMCk7CisKKyAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgcmVhZCAlZCBieXRlcyBpbiBhdXRoIHBoYXNlXG4iLCBieXRlc19yZWFkKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICAvKiBFSU5UUiBhbHJlYWR5IGhhbmRsZWQgZm9yIHVzICovCisKKyAgICAgIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZW5vbWVtICgpKQorICAgICAgICB7CisgICAgICAgICAgKm9vbSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKCkpCisgICAgICAgIDsgLyogZG8gbm90aGluZywganVzdCByZXR1cm4gRkFMU0UgYmVsb3cgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIGFwcDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZXNfcmVhZCA9PSAwKTsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RlZCBmcm9tIHJlbW90ZSBhcHBcbiIpOworICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB2YWx1ZSBpcyB3aGV0aGVyIHdlIHN1Y2Nlc3NmdWxseSB3cm90ZSBhbnkgYnl0ZXMgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfZGF0YV9mcm9tX2F1dGggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyOworCisgIGlmICghX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGJ5dGVzX3dyaXR0ZW4gPSBfZGJ1c193cml0ZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgeworICAgICAgX2RidXNfYXV0aF9ieXRlc19zZW50ICh0cmFuc3BvcnQtPmF1dGgsIGJ5dGVzX3dyaXR0ZW4pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChieXRlc193cml0dGVuIDwgMCkKKyAgICB7CisgICAgICAvKiBFSU5UUiBhbHJlYWR5IGhhbmRsZWQgZm9yIHVzICovCisgICAgICAKKyAgICAgIGlmIChfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrICgpKQorICAgICAgICA7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igd3JpdGluZyB0byByZW1vdGUgYXBwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIEZBTFNFIG9uIE9PTSAqLworc3RhdGljIGRidXNfYm9vbF90CitleGNoYW5nZV9jcmVkZW50aWFscyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGRvX3JlYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgZG9fd3JpdGluZykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImV4Y2hhbmdlX2NyZWRlbnRpYWxzOiBkb19yZWFkaW5nID0gJWQsIGRvX3dyaXRpbmcgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGRvX3JlYWRpbmcsIGRvX3dyaXRpbmcpOworCisgIGlmIChkb193cml0aW5nICYmIHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHdyaXRlIGNyZWRlbnRpYWxzOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKGRvX3JlYWRpbmcgJiYgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgeworICAgICAgLyogRklYTUUgdGhpcyBjYW4gZmFpbCBkdWUgdG8gSU8gZXJyb3IgX29yXyBPT00sIGJyb2tlbgorICAgICAgICogKHNvbWV3aGF0IHRyaWNreSB0byBmaXggc2luY2UgdGhlIE9PTSBlcnJvciBjYW4gYmUgc2V0IGFmdGVyCisgICAgICAgKiB3ZSBhbHJlYWR5IHJlYWQgdGhlIGNyZWRlbnRpYWxzIGJ5dGUsIHNvIGJhc2ljYWxseSB3ZSBuZWVkIHRvCisgICAgICAgKiBzZXBhcmF0ZSByZWFkaW5nIHRoZSBieXRlIGFuZCBzdG9yaW5nIGl0IGluIHRoZQorICAgICAgICogdHJhbnNwb3J0LT5jcmVkZW50aWFscykuIERvZXMgbm90IHJlYWxseSBtYXR0ZXIgZm9yIG5vdworICAgICAgICogYmVjYXVzZSBzdG9yaW5nIGluIGNyZWRlbnRpYWxzIG5ldmVyIGFjdHVhbGx5IGZhaWxzIG9uIHVuaXguCisgICAgICAgKi8gICAgICAKKyAgICAgIGlmIChfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+Y3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoISh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZykpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jcmVkZW50aWFscykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fYXV0aGVudGljYXRpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBkb19yZWFkaW5nLAorICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGRvX3dyaXRpbmcsCisJCSAgIGRidXNfYm9vbF90ICAgKmF1dGhfY29tcGxldGVkKQoreworICBkYnVzX2Jvb2xfdCBvb207CisgIGRidXNfYm9vbF90IG9yaWdfYXV0aF9zdGF0ZTsKKworICBvb20gPSBGQUxTRTsKKyAgCisgIG9yaWdfYXV0aF9zdGF0ZSA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KTsKKworICAvKiBUaGlzIGlzIGVzc2VudGlhbCB0byBhdm9pZCB0aGUgY2hlY2tfd3JpdGVfd2F0Y2goKSBhdCB0aGUgZW5kLAorICAgKiB3ZSBkb24ndCB3YW50IHRvIGFkZCBhIHdyaXRlIHdhdGNoIGluIGRvX2l0ZXJhdGlvbiBiZWZvcmUKKyAgICogd2UgdHJ5IHdyaXRpbmcgYW5kIGdldCBFQUdBSU4KKyAgICovCisgIGlmIChvcmlnX2F1dGhfc3RhdGUpCisgICAgeworICAgICAgaWYgKGF1dGhfY29tcGxldGVkKQorICAgICAgICAqYXV0aF9jb21wbGV0ZWQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIAorICB3aGlsZSAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSAmJgorICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgKHRyYW5zcG9ydCkpCisgICAgeyAgICAgIAorICAgICAgaWYgKCFleGNoYW5nZV9jcmVkZW50aWFscyAodHJhbnNwb3J0LCBkb19yZWFkaW5nLCBkb193cml0aW5nKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIE9PTSAqLworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nIHx8CisgICAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2VuZF9jcmVkZW50aWFsc19wZW5kaW5nID0gJWQgcmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyNkZWZpbmUgVFJBTlNQT1JUX1NJREUodCkgKCh0KS0+aXNfc2VydmVyID8gInNlcnZlciIgOiAiY2xpZW50IikKKyAgICAgIHN3aXRjaCAoX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogd2FpdGluZyBmb3IgaW5wdXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NJREUgKHRyYW5zcG9ydCkpOworICAgICAgICAgIGlmICghZG9fcmVhZGluZyB8fCAhcmVhZF9kYXRhX2ludG9fYXV0aCAodHJhbnNwb3J0LCAmb29tKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWToKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICVzIGF1dGggc3RhdGU6IHdhaXRpbmcgZm9yIG1lbW9yeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfU0lERSAodHJhbnNwb3J0KSk7CisgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQ6CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAlcyBhdXRoIHN0YXRlOiBieXRlcyB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TSURFICh0cmFuc3BvcnQpKTsKKyAgICAgICAgICBpZiAoIWRvX3dyaXRpbmcgfHwgIXdyaXRlX2RhdGFfZnJvbV9hdXRoICh0cmFuc3BvcnQpKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfTkVFRF9ESVNDT05ORUNUOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogbmVlZCB0byBkaXNjb25uZWN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TSURFICh0cmFuc3BvcnQpKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVEOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogYXV0aGVudGljYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfU0lERSAodHJhbnNwb3J0KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyBvdXQ6CisgIGlmIChhdXRoX2NvbXBsZXRlZCkKKyAgICAqYXV0aF9jb21wbGV0ZWQgPSAob3JpZ19hdXRoX3N0YXRlICE9IF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSk7CisgIAorICBjaGVja19yZWFkX3dhdGNoICh0cmFuc3BvcnQpOworICBjaGVja193cml0ZV93YXRjaCAodHJhbnNwb3J0KTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIGlmIChvb20pCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHJldHVybnMgZmFsc2Ugb24gb29tICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3dyaXRpbmcgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaW50IHRvdGFsOworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIGRidXNfYm9vbF90IG9vbTsKKyAgCisgIC8qIE5vIG1lc3NhZ2VzIHdpdGhvdXQgYXV0aGVudGljYXRpb24hICovCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJOb3QgYXV0aGVudGljYXRlZCwgbm90IHdyaXRpbmcgYW55dGhpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm90IGNvbm5lY3RlZCwgbm90IHdyaXRpbmcgYW55dGhpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisjaWYgMQorICBfZGJ1c192ZXJib3NlICgiZG9fd3JpdGluZygpLCBoYXZlX21lc3NhZ2VzID0gJWQsIGZkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPmZkKTsKKyNlbmRpZgorICAKKyAgb29tID0gRkFMU0U7CisgIHRvdGFsID0gMDsKKworICB3aGlsZSAoIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkICYmCisgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGludCBieXRlc193cml0dGVuOworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICpoZWFkZXI7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICpib2R5OworICAgICAgaW50IGhlYWRlcl9sZW4sIGJvZHlfbGVuOworICAgICAgaW50IHRvdGFsX2J5dGVzX3RvX3dyaXRlOworICAgICAgCisgICAgICBpZiAodG90YWwgPiBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfd3JpdHRlbl9wZXJfaXRlcmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVkIGJ5dGVzIGV4Y2VlZHMgJWQgYnl0ZXMgd3JpdHRlbiBwZXIgaXRlcmF0aW9uLCByZXR1cm5pbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwsIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc193cml0dGVuX3Blcl9pdGVyYXRpb24pOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9tZXNzYWdlX3RvX3NlbmQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgICAgICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgid3JpdGluZyBtZXNzYWdlICVwXG4iLCBtZXNzYWdlKTsKKyNlbmRpZgorICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIsICZib2R5KTsKKworICAgICAgaGVhZGVyX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChoZWFkZXIpOworICAgICAgYm9keV9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYm9keSk7CisKKyAgICAgIGlmIChfZGJ1c19hdXRoX25lZWRzX2VuY29kaW5nICh0cmFuc3BvcnQtPmF1dGgpKQorICAgICAgICB7CisgICAgICAgICAgLyogRG9lcyBmZCBwYXNzaW5nIGV2ZW4gbWFrZSBzZW5zZSB3aXRoIGVuY29kZWQgZGF0YT8gKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQoIURCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSk7CisKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfZW5jb2RlX2RhdGEgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19hdXRoX2VuY29kZV9kYXRhICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwgJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZywgMCk7CisgICAgICAgICAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nKTsKKworI2lmIDAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZW5jb2RlZCBtZXNzYWdlIGlzICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPQorICAgICAgICAgICAgX2RidXNfd3JpdGVfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUgLSBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSA9IGhlYWRlcl9sZW4gKyBib2R5X2xlbjsKKworI2lmIDAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibWVzc2FnZSBpcyAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgaWYgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA8PSAwICYmIERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogU2VuZCB0aGUgZmRzIGFsb25nIHdpdGggdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICAgY29uc3QgaW50ICp1bml4X2ZkczsKKyAgICAgICAgICAgICAgdW5zaWduZWQgbjsKKworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2dldF91bml4X2ZkcyhtZXNzYWdlLCAmdW5peF9mZHMsICZuKTsKKworICAgICAgICAgICAgICBieXRlc193cml0dGVuID0KKyAgICAgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXRfd2l0aF91bml4X2Zkc190d28gKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiAtIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbik7CisKKyAgICAgICAgICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwICYmIG4gPiAwKQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoIldyb3RlICVpIHVuaXggZmRzXG4iLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA8IGhlYWRlcl9sZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dyaXRlX3NvY2tldF90d28gKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiAtIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYm9keV9sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPQorICAgICAgICAgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiAtIGhlYWRlcl9sZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuIC0gaGVhZGVyX2xlbikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFSU5UUiBhbHJlYWR5IGhhbmRsZWQgZm9yIHVzICovCisgICAgICAgICAgCisgICAgICAgICAgLyogRm9yIHNvbWUgZGlzY3Vzc2lvbiBvZiB3aHkgd2UgYWxzbyBpZ25vcmUgRVBJUEUgaGVyZSwgc2VlCisgICAgICAgICAgICogaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDgtTWFyY2gvMDA5NTI2Lmh0bWwKKyAgICAgICAgICAgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAoKSB8fCBfZGJ1c19nZXRfaXNfZXJybm9fZXBpcGUgKCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciB3cml0aW5nIHRvIHJlbW90ZSBhcHA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIHdyb3RlICVkIGJ5dGVzIG9mICVkXG4iLCBieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgICAKKyAgICAgICAgICB0b3RhbCArPSBieXRlc193cml0dGVuOworICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiArPSBieXRlc193cml0dGVuOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPD0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuID09IHRvdGFsX2J5dGVzX3RvX3dyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsIDApOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsIDIwNDgpOworCisgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50ICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworIG91dDoKKyAgaWYgKG9vbSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBmYWxzZSBvbiBvdXQtb2YtbWVtb3J5ICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3JlYWRpbmcgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzU3RyaW5nICpidWZmZXI7CisgIGludCBieXRlc19yZWFkOworICBpbnQgdG90YWw7CisgIGRidXNfYm9vbF90IG9vbTsKKworICBfZGJ1c192ZXJib3NlICgiZmQgPSAlZFxuIixzb2NrZXRfdHJhbnNwb3J0LT5mZCk7CisgIAorICAvKiBObyBtZXNzYWdlcyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uISAqLworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSkKKyAgICByZXR1cm4gVFJVRTsKKworICBvb20gPSBGQUxTRTsKKyAgCisgIHRvdGFsID0gMDsKKworIGFnYWluOgorICAKKyAgLyogU2VlIGlmIHdlJ3ZlIGV4Y2VlZGVkIG1heCBtZXNzYWdlcyBhbmQgbmVlZCB0byBkaXNhYmxlIHJlYWRpbmcgKi8KKyAgY2hlY2tfcmVhZF93YXRjaCAodHJhbnNwb3J0KTsKKyAgCisgIGlmICh0b3RhbCA+IHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVkIGJ5dGVzIGV4Y2VlZHMgJWQgYnl0ZXMgcmVhZCBwZXIgaXRlcmF0aW9uLCByZXR1cm5pbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICB0b3RhbCwgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCk7CisgIAorICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX3dhdGNoX2dldF9lbmFibGVkIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGlmIChfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nICh0cmFuc3BvcnQtPmF1dGgpKQorICAgIHsKKyAgICAgIC8qIERvZXMgZmQgcGFzc2luZyBldmVuIG1ha2Ugc2Vuc2Ugd2l0aCBlbmNvZGVkIGRhdGE/ICovCisgICAgICBfZGJ1c19hc3NlcnQoIURCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpID4gMCkKKyAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZyk7CisgICAgICBlbHNlCisgICAgICAgIGJ5dGVzX3JlYWQgPSBfZGJ1c19yZWFkX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nKSA9PQorICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkKTsKKyAgICAgIAorICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IG9yaWdfbGVuOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIpOworCisgICAgICAgICAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfZGVjb2RlX2RhdGEgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk91dCBvZiBtZW1vcnkgZGVjb2RpbmcgaW5jb21pbmcgZGF0YVxuIik7CisgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSAtIG9yaWdfbGVuKTsKKworICAgICAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSAtIG9yaWdfbGVuKTsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZywgMCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLCAyMDQ4KTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcik7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgaWYgKERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIGludCAqZmRzLCBuX2ZkczsKKworICAgICAgICAgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKHRyYW5zcG9ydC0+bG9hZGVyLCAmZmRzLCAmbl9mZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiT3V0IG9mIG1lbW9yeSByZWFkaW5nIGZpbGUgZGVzY3JpcHRvcnNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwgYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXRfd2l0aF91bml4X2Zkcyhzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHMsICZuX2Zkcyk7CisKKyAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA+PSAwICYmIG5fZmRzID4gMCkKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoIlJlYWQgJWkgdW5peCBmZHNcbiIsIG5fZmRzKTsKKworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2Zkcyh0cmFuc3BvcnQtPmxvYWRlciwgZmRzLCBieXRlc19yZWFkIDwgMCA/IDAgOiBuX2Zkcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkIDwgMCA/IDAgOiBieXRlc19yZWFkKTsKKyAgICB9CisgIAorICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgLyogRUlOVFIgYWxyZWFkeSBoYW5kbGVkIGZvciB1cyAqLworCisgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2Vub21lbSAoKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJPdXQgb2YgbWVtb3J5IGluIHJlYWQoKS9kb19yZWFkaW5nKClcbiIpOworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKCkpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgYXBwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaXNjb25uZWN0ZWQgZnJvbSByZW1vdGUgYXBwXG4iKTsKKyAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiByZWFkICVkIGJ5dGVzXG4iLCBieXRlc19yZWFkKTsKKyAgICAgIAorICAgICAgdG90YWwgKz0gYnl0ZXNfcmVhZDsgICAgICAKKworICAgICAgaWYgKCFfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMgKHRyYW5zcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgb3V0IG9mIG1lbW9yeSB3aGVuIHF1ZXVlaW5nIG1lc3NhZ2VzIHdlIGp1c3QgcmVhZCBpbiB0aGUgdHJhbnNwb3J0XG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICAvKiBUcnkgcmVhZGluZyBtb3JlIGRhdGEgdW50aWwgd2UgZ2V0IEVBR0FJTiBhbmQgcmV0dXJuLCBvcgorICAgICAgICogZXhjZWVkIG1heCBieXRlcyBwZXIgaXRlcmF0aW9uLiAgSWYgaW4gYmxvY2tpbmcgbW9kZSBvZgorICAgICAgICogY291cnNlIHdlJ2xsIGJsb2NrIGluc3RlYWQgb2YgcmV0dXJuaW5nLgorICAgICAgICovCisgICAgICBnb3RvIGFnYWluOworICAgIH0KKworIG91dDoKKyAgaWYgKG9vbSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit1bml4X2Vycm9yX3dpdGhfcmVhZF90b19jb21lIChEQnVzVHJhbnNwb3J0ICppdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQgKikgaXRyYW5zcG9ydDsKKworICBpZiAoIShmbGFncyAmIERCVVNfV0FUQ0hfSEFOR1VQIHx8IGZsYWdzICYgREJVU19XQVRDSF9FUlJPUikpCisgICAgcmV0dXJuIEZBTFNFOworICAgCisgIC8qIElmIHdlIGhhdmUgYSByZWFkIHdhdGNoIGVuYWJsZWQgLi4uCisgICAgIHdlIC1taWdodCBoYXZlIGRhdGEgaW5jb21pbmcgLi4uID0+IGhhbmRsZSB0aGUgSEFOR1VQIHRoZXJlICovCisgIGlmICh3YXRjaCAhPSB0cmFuc3BvcnQtPnJlYWRfd2F0Y2ggJiYKKyAgICAgIF9kYnVzX3dhdGNoX2dldF9lbmFibGVkICh0cmFuc3BvcnQtPnJlYWRfd2F0Y2gpKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICByZXR1cm4gVFJVRTsgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc29ja2V0X2hhbmRsZV93YXRjaCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZsYWdzKQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoIHx8CisgICAgICAgICAgICAgICAgd2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICBfZGJ1c19hc3NlcnQgKHdhdGNoICE9IE5VTEwpOworICAKKyAgLyogSWYgd2UgaGl0IGFuIGVycm9yIGhlcmUgb24gYSB3cml0ZSB3YXRjaCwgZG9uJ3QgZGlzY29ubmVjdCB0aGUgdHJhbnNwb3J0IHlldCBiZWNhdXNlIGRhdGEgY2FuCisgICAqIHN0aWxsIGJlIGluIHRoZSBidWZmZXIgYW5kIGRvX3JlYWRpbmcgbWF5IG5lZWQgc2V2ZXJhbCBpdGVyYXRpb24gdG8gcmVhZAorICAgKiBpdCBhbGwgKGJlY2F1c2Ugb2YgaXRzIG1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24gbGltaXQpLiAKKyAgICovCisgIGlmICghKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkgJiYgdW5peF9lcnJvcl93aXRoX3JlYWRfdG9fY29tZSAodHJhbnNwb3J0LCB3YXRjaCwgZmxhZ3MpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJIYW5nIHVwIG9yIGVycm9yIG9uIHdhdGNoXG4iKTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgaWYgKHdhdGNoID09IHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggJiYKKyAgICAgIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpKQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IGF1dGhfZmluaXNoZWQ7CisjaWYgMQorICAgICAgX2RidXNfdmVyYm9zZSAoImhhbmRsaW5nIHJlYWQgd2F0Y2ggJXAgZmxhZ3MgPSAleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHdhdGNoLCBmbGFncyk7CisjZW5kaWYKKyAgICAgIGlmICghZG9fYXV0aGVudGljYXRpb24gKHRyYW5zcG9ydCwgVFJVRSwgRkFMU0UsICZhdXRoX2ZpbmlzaGVkKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGRvIGEgcmVhZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAgICAgICAqIGEgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbi4gIFRoaXMgaXMgc28gd2UKKyAgICAgICAqIGhhdmUgYSBjaGFuY2UgdG8gcHJvcGFnYXRlIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgICogc3RhdGUgZnVydGhlciB1cC4gIFNwZWNpZmljYWxseSwgd2UgbmVlZCB0bworICAgICAgICogcHJvY2VzcyBhbnkgcGVuZGluZyBkYXRhIGZyb20gdGhlIGF1dGggb2JqZWN0LgorICAgICAgICovCisgICAgICBpZiAoIWF1dGhfZmluaXNoZWQpCisJeworCSAgaWYgKCFkb19yZWFkaW5nICh0cmFuc3BvcnQpKQorCSAgICB7CisJICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSB0byByZWFkXG4iKTsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm90IHJlYWRpbmcgYW55dGhpbmcgc2luY2Ugd2UganVzdCBjb21wbGV0ZWQgdGhlIGF1dGhlbnRpY2F0aW9uXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAod2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2ggJiYKKyAgICAgICAgICAgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkpCisgICAgeworI2lmIDEKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJoYW5kbGluZyB3cml0ZSB3YXRjaCwgaGF2ZV9vdXRnb2luZ19tZXNzYWdlcyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKSk7CisjZW5kaWYKKyAgICAgIGlmICghZG9fYXV0aGVudGljYXRpb24gKHRyYW5zcG9ydCwgRkFMU0UsIFRSVUUsIE5VTEwpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmICghZG9fd3JpdGluZyAodHJhbnNwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gd3JpdGVcbiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAvKiBTZWUgaWYgd2Ugc3RpbGwgbmVlZCB0aGUgd3JpdGUgd2F0Y2ggKi8KKyAgICAgIGNoZWNrX3dyaXRlX3dhdGNoICh0cmFuc3BvcnQpOworICAgIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiYXNrZWQgdG8gaGFuZGxlIHJlYWQgd2F0Y2ggd2l0aCBub24tcmVhZCBjb25kaXRpb24gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgZWxzZSBpZiAod2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhc2tlZCB0byBoYW5kbGUgd3JpdGUgd2F0Y2ggd2l0aCBub24td3JpdGUgY29uZGl0aW9uIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoImFza2VkIHRvIGhhbmRsZSB3YXRjaCAlcCBvbiBmZCAlZCB0aGF0IHdlIGRvbid0IHJlY29nbml6ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpKTsKKyAgICB9CisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfZGlzY29ubmVjdCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisgIAorICBmcmVlX3dhdGNoZXMgKHRyYW5zcG9ydCk7CisgIAorICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLCBOVUxMKTsKKyAgc29ja2V0X3RyYW5zcG9ydC0+ZmQgPSAtMTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfY29ubmVjdGlvbl9zZXQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX3dhdGNoX3NldF9oYW5kbGVyIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBOVUxMKTsKKworICBfZGJ1c193YXRjaF9zZXRfaGFuZGxlciAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jb25uZWN0aW9uLCBOVUxMKTsKKyAgCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjaGVja19yZWFkX3dhdGNoICh0cmFuc3BvcnQpOworICBjaGVja193cml0ZV93YXRjaCAodHJhbnNwb3J0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBAdG9kbyBXZSBuZWVkIHRvIGhhdmUgYSB3YXkgdG8gd2FrZSB1cCB0aGUgc2VsZWN0IHNsZWVwIGlmCisgKiBhIG5ldyBpdGVyYXRpb24gcmVxdWVzdCBjb21lcyBpbiB3aXRoIGEgZmxhZyAocmVhZC93cml0ZSkgdGhhdAorICogd2UncmUgbm90IGN1cnJlbnRseSBzZXJ2aW5nLiBPdGhlcndpc2UgYSBjYWxsIHRoYXQganVzdCByZWFkcworICogY291bGQgYmxvY2sgYSB3cml0ZSBjYWxsIGZvcmV2ZXIgKGlmIHRoZXJlIGFyZSBubyBpbmNvbWluZworICogbWVzc2FnZXMpLgorICovCitzdGF0aWMgIHZvaWQKK3NvY2tldF9kb19pdGVyYXRpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzUG9sbEZEIHBvbGxfZmQ7CisgIGludCBwb2xsX3JlczsKKyAgaW50IHBvbGxfdGltZW91dDsKKworICBfZGJ1c192ZXJib3NlICgiIGl0ZXJhdGlvbiBmbGFncyA9ICVzJXMgdGltZW91dCA9ICVkIHJlYWRfd2F0Y2ggPSAlcCB3cml0ZV93YXRjaCA9ICVwIGZkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyA/ICJyZWFkIiA6ICIiLAorICAgICAgICAgICAgICAgICBmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgPyAid3JpdGUiIDogIiIsCisgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoLAorICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+ZmQpOworICAKKyAgLyogdGhlIHBhc3NlZCBpbiBET19SRUFESU5HL0RPX1dSSVRJTkcgZmxhZ3MgaW5kaWNhdGUgd2hldGhlciB0bworICAgKiByZWFkL3dyaXRlIG1lc3NhZ2VzLCBidXQgcmVnYXJkbGVzcyBvZiB0aG9zZSB3ZSBtYXkgbmVlZCB0byBibG9jaworICAgKiBmb3IgcmVhZGluZy93cml0aW5nIHRvIGRvIGF1dGguICBCdXQgaWYgd2UgZG8gcmVhZGluZyBmb3IgYXV0aCwKKyAgICogd2UgZG9uJ3Qgd2FudCB0byByZWFkIGFueSBtZXNzYWdlcyB5ZXQgaWYgbm90IGdpdmVuIERPX1JFQURJTkcuCisgICAqLworCisgIHBvbGxfZmQuZmQgPSBzb2NrZXRfdHJhbnNwb3J0LT5mZDsKKyAgcG9sbF9mZC5ldmVudHMgPSAwOworICAKKyAgaWYgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGtpbmQgb2YgYSBoYWNrOyBpZiB3ZSBoYXZlIHN0dWZmIHRvIHdyaXRlLCB0aGVuIHRyeQorICAgICAgICogdG8gYXZvaWQgdGhlIHBvbGwuIFRoaXMgaXMgcHJvYmFibHkgYWJvdXQgYSA1JSBzcGVlZHVwIG9uIGFuCisgICAgICAgKiBlY2hvIGNsaWVudC9zZXJ2ZXIuCisgICAgICAgKgorICAgICAgICogSWYgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nIHdlcmUgcmVxdWVzdGVkLCB3ZSB3YW50IHRvIGF2b2lkIHRoaXMKKyAgICAgICAqIHNpbmNlIGl0IGNvdWxkIGhhdmUgZnVua3kgZWZmZWN0czoKKyAgICAgICAqICAgLSBib3RoIGVuZHMgc3Bpbm5pbmcgd2FpdGluZyBmb3IgdGhlIG90aGVyIG9uZSB0byByZWFkCisgICAgICAgKiAgICAgZGF0YSBzbyB0aGV5IGNhbiBmaW5pc2ggd3JpdGluZworICAgICAgICogICAtIHByaW9yaXRpemluZyBhbGwgd3JpdGluZyBhaGVhZCBvZiByZWFkaW5nCisgICAgICAgKi8KKyAgICAgIGlmICgoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9ET19XUklUSU5HKSAmJgorICAgICAgICAgICEoZmxhZ3MgJiAoREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8IERCVVNfSVRFUkFUSU9OX0JMT0NLKSkgJiYKKyAgICAgICAgICAhdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgJiYKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgZG9fd3JpdGluZyAodHJhbnNwb3J0KTsKKworICAgICAgICAgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCB8fAorICAgICAgICAgICAgICAhX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBkZWNpZGVkIHRvIGRvIHRoZSBwb2xsKCkgYWZ0ZXIgYWxsICovCisgICAgICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpOworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORykKKwlwb2xsX2ZkLmV2ZW50cyB8PSBfREJVU19QT0xMSU47CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fV1JJVElORykKKyAgICAgICAgcG9sbF9mZC5ldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzQXV0aFN0YXRlIGF1dGhfc3RhdGU7CisgICAgICAKKyAgICAgIGF1dGhfc3RhdGUgPSBfZGJ1c19hdXRoX2RvX3dvcmsgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgICAgIGlmICh0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICAgIGF1dGhfc3RhdGUgPT0gREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVUKQorCXBvbGxfZmQuZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworICAgICAgaWYgKHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nIHx8CisgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EKQorCXBvbGxfZmQuZXZlbnRzIHw9IF9EQlVTX1BPTExPVVQ7CisgICAgfQorCisgIGlmIChwb2xsX2ZkLmV2ZW50cykKKyAgICB7CisgICAgICBpZiAoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9CTE9DSykKKwlwb2xsX3RpbWVvdXQgPSB0aW1lb3V0X21pbGxpc2Vjb25kczsKKyAgICAgIGVsc2UKKwlwb2xsX3RpbWVvdXQgPSAwOworCisgICAgICAvKiBGb3IgYmxvY2tpbmcgc2VsZWN0cyB3ZSBkcm9wIHRoZSBjb25uZWN0aW9uIGxvY2sgaGVyZQorICAgICAgICogdG8gYXZvaWQgYmxvY2tpbmcgb3V0IGNvbm5lY3Rpb24gYWNjZXNzIGR1cmluZyBhIHBvdGVudGlhbGx5CisgICAgICAgKiBpbmRlZmluaXRlIGJsb2NraW5nIGNhbGwuIFRoZSBpbyBwYXRoIGlzIHN0aWxsIHByb3RlY3RlZAorICAgICAgICogYnkgdGhlIGlvX3BhdGhfY29uZCBjb25kdmFyLCBzbyB3ZSB3b24ndCByZWVudGVyIHRoaXMuCisgICAgICAgKi8KKyAgICAgIGlmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0JMT0NLKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9jayBwcmUgcG9sbFxuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgIGFnYWluOgorICAgICAgcG9sbF9yZXMgPSBfZGJ1c19wb2xsICgmcG9sbF9mZCwgMSwgcG9sbF90aW1lb3V0KTsKKworICAgICAgaWYgKHBvbGxfcmVzIDwgMCAmJiBfZGJ1c19nZXRfaXNfZXJybm9fZWludHIgKCkpCisJZ290byBhZ2FpbjsKKworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fQkxPQ0spCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibG9jayBwb3N0IHBvbGxcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocG9sbF9yZXMgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChwb2xsX3JlcyA9PSAwKQorICAgICAgICAgICAgcG9sbF9mZC5yZXZlbnRzID0gMDsgLyogc29tZSBjb25jZXJuIHRoYXQgcG9zaXggZG9lcyBub3QgZ3VhcmFudGVlIHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWxncmluZCBmbGFncyBpdCBhcyBhbiBlcnJvci4gdGhvdWdoIGl0IHByb2JhYmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBndWFyYW50ZWVkIG9uIGxpbnV4IGF0IGxlYXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgCisgICAgICAgICAgaWYgKHBvbGxfZmQucmV2ZW50cyAmIF9EQlVTX1BPTExFUlIpCisgICAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG5lZWRfcmVhZCA9IChwb2xsX2ZkLnJldmVudHMgJiBfREJVU19QT0xMSU4pID4gMDsKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3QgbmVlZF93cml0ZSA9IChwb2xsX2ZkLnJldmVudHMgJiBfREJVU19QT0xMT1VUKSA+IDA7CisJICAgICAgZGJ1c19ib29sX3QgYXV0aGVudGljYXRpb25fY29tcGxldGVkOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJpbiBpdGVyYXRpb24sIG5lZWRfcmVhZD0lZCBuZWVkX3dyaXRlPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3JlYWQsIG5lZWRfd3JpdGUpOworICAgICAgICAgICAgICBkb19hdXRoZW50aWNhdGlvbiAodHJhbnNwb3J0LCBuZWVkX3JlYWQsIG5lZWRfd3JpdGUsCisJCQkJICZhdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpOworCisJICAgICAgLyogU2VlIGNvbW1lbnQgaW4gc29ja2V0X2hhbmRsZV93YXRjaC4gKi8KKwkgICAgICBpZiAoYXV0aGVudGljYXRpb25fY29tcGxldGVkKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChuZWVkX3JlYWQgJiYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fUkVBRElORykpCisgICAgICAgICAgICAgICAgZG9fcmVhZGluZyAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgaWYgKG5lZWRfd3JpdGUgJiYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fRE9fV1JJVElORykpCisgICAgICAgICAgICAgICAgZG9fd3JpdGluZyAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGZyb20gX2RidXNfcG9sbCgpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgb3V0OgorICAvKiBXZSBuZWVkIHRvIGluc3RhbGwgdGhlIHdyaXRlIHdhdGNoIG9ubHkgaWYgd2UgZGlkIG5vdAorICAgKiBzdWNjZXNzZnVsbHkgd3JpdGUgZXZlcnl0aGluZy4gTm90ZSB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCB3ZQorICAgKiBkb24ndCBjYWxsIGNoZWNrX3dyaXRlX3dhdGNoICpiZWZvcmUqIGRvX3dyaXRpbmcsIHNpbmNlIGl0J3MKKyAgICogaW5lZmZpY2llbnQgdG8gYWRkIHRoZSB3cml0ZSB3YXRjaCwgYW5kIHdlIGNhbiBhdm9pZCBpdCBtb3N0IG9mCisgICAqIHRoZSB0aW1lIHNpbmNlIHdlIGNhbiB3cml0ZSBpbW1lZGlhdGVseS4KKyAgICogCisgICAqIEhvd2V2ZXIsIHdlIE1VU1QgYWx3YXlzIGNhbGwgY2hlY2tfd3JpdGVfd2F0Y2goKTsgREJ1c0Nvbm5lY3Rpb24gY29kZQorICAgKiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBydW5uaW5nIGFuIGl0ZXJhdGlvbiB3aWxsIG5vdGljZSB0aGF0CisgICAqIG1lc3NhZ2VzIGFyZSBwZW5kaW5nLgorICAgKi8KKyAgY2hlY2tfd3JpdGVfd2F0Y2ggKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAuLi4gbGVhdmluZyBkb19pdGVyYXRpb24oKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfbGl2ZV9tZXNzYWdlc19jaGFuZ2VkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIC8qIFNlZSBpZiB3ZSBzaG91bGQgbG9vayBmb3IgaW5jb21pbmcgbWVzc2FnZXMgYWdhaW4gKi8KKyAgY2hlY2tfcmVhZF93YXRjaCAodHJhbnNwb3J0KTsKK30KKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9nZXRfc29ja2V0X2ZkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqZmRfcCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICAKKyAgKmZkX3AgPSBzb2NrZXRfdHJhbnNwb3J0LT5mZDsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgREJ1c1RyYW5zcG9ydFZUYWJsZSBzb2NrZXRfdnRhYmxlID0geworICBzb2NrZXRfZmluYWxpemUsCisgIHNvY2tldF9oYW5kbGVfd2F0Y2gsCisgIHNvY2tldF9kaXNjb25uZWN0LAorICBzb2NrZXRfY29ubmVjdGlvbl9zZXQsCisgIHNvY2tldF9kb19pdGVyYXRpb24sCisgIHNvY2tldF9saXZlX21lc3NhZ2VzX2NoYW5nZWQsCisgIHNvY2tldF9nZXRfc29ja2V0X2ZkCit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gc29ja2V0IGZpbGUgZGVzY3JpcHRvci4gIFRoZSBmaWxlCisgKiBkZXNjcmlwdG9yIG11c3QgYmUgbm9uYmxvY2tpbmcgKHVzZSBfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcoKSB0bworICogbWFrZSBpdCBzbykuIFRoaXMgZnVuY3Rpb24gaXMgc2hhcmVkIGJ5IHZhcmlvdXMgdHJhbnNwb3J0cyB0aGF0CisgKiBib2lsIGRvd24gdG8gYSBmdWxsIGR1cGxleCBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gc2VydmVyX2d1aWQgbm9uLSNOVUxMIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBvZiBhIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSB0cmFuc3BvcnQncyBhZGRyZXNzCisgKiBAcmV0dXJucyB0aGUgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgaWYgbm8gbWVtb3J5LgorICovCitEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X25ld19mb3Jfc29ja2V0IChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmVyX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQ7CisgIAorICBzb2NrZXRfdHJhbnNwb3J0ID0gZGJ1c19uZXcwIChEQnVzVHJhbnNwb3J0U29ja2V0LCAxKTsKKyAgaWYgKHNvY2tldF90cmFuc3BvcnQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZykpCisgICAgZ290byBmYWlsZWRfMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZykpCisgICAgZ290byBmYWlsZWRfMTsKKyAgCisgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1dSSVRBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2ggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8yOworICAKKyAgc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8zOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2luaXRfYmFzZSAoJnNvY2tldF90cmFuc3BvcnQtPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2d1aWQsIGFkZHJlc3MpKQorICAgIGdvdG8gZmFpbGVkXzQ7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19hdXRoX3NldF91bml4X2ZkX3Bvc3NpYmxlKHNvY2tldF90cmFuc3BvcnQtPmJhc2UuYXV0aCwgX2RidXNfc29ja2V0X2Nhbl9wYXNzX3VuaXhfZmQoZmQpKTsKKyNlbmRpZgorCisgIHNvY2tldF90cmFuc3BvcnQtPmZkID0gZmQ7CisgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorICAvKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHByb2JhYmx5IGJlIHR1bmFibGUgb3Igc29tZXRoaW5nLiAqLyAgICAgCisgIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24gPSAyMDQ4OworICBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfd3JpdHRlbl9wZXJfaXRlcmF0aW9uID0gMjA0ODsKKyAgCisgIHJldHVybiAoREJ1c1RyYW5zcG9ydCopIHNvY2tldF90cmFuc3BvcnQ7CisKKyBmYWlsZWRfNDoKKyAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpOworIGZhaWxlZF8zOgorICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworIGZhaWxlZF8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpOworIGZhaWxlZF8xOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpOworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHNvY2tldF90cmFuc3BvcnQpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIGhvc3RuYW1lIGFuZCBwb3J0LgorICogSWYgaG9zdCBpcyBOVUxMLCBpdCB3aWxsIGRlZmF1bHQgdG8gbG9jYWxob3N0CisgKgorICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBhdGggdG8gbm9uY2UgZmlsZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoaG9zdCA9PSBOVUxMKQorICAgIGhvc3QgPSAibG9jYWxob3N0IjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBub25jZWZpbGUgPyAibm9uY2UtdGNwOiIgOiAidGNwOiIpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgImhvc3Q9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgaG9zdCkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLHBvcnQ9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgcG9ydCkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoZmFtaWx5ICE9IE5VTEwgJiYKKyAgICAgICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJmYW1pbHk9IikgfHwKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGZhbWlseSkpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKG5vbmNlZmlsZSAhPSBOVUxMICYmCisgICAgICAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAibm9uY2VmaWxlPSIpIHx8CisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBub25jZWZpbGUpKSkKKyAgICBnb3RvIGVycm9yOworCisgIGZkID0gX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgKGhvc3QsIHBvcnQsIGZhbWlseSwgbm9uY2VmaWxlLCBlcnJvcik7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0Y3Agc29ja2V0ICVzOiVzXG4iLAorICAgICAgICAgICAgICAgICBob3N0LCBwb3J0KTsKKyAgCisgIHRyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoZmQsIE5VTEwsICZhZGRyZXNzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChmZCwgTlVMTCk7CisgICAgICBmZCA9IC0xOworICAgIH0KKworICByZXR1cm4gdHJhbnNwb3J0OworCitlcnJvcjoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIE9wZW5zIGEgVENQIHNvY2tldCB0cmFuc3BvcnQuCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeSB0byB0cnkgb3BlbmluZyBhcyBhIHRjcCB0cmFuc3BvcnQuCisgKiBAcGFyYW0gdHJhbnNwb3J0X3AgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgb3BlbmVkIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIHNldAorICogQHJldHVybnMgcmVzdWx0IG9mIHRoZSBhdHRlbXB0CisgKi8KK0RCdXNUcmFuc3BvcnRPcGVuUmVzdWx0CitfZGJ1c190cmFuc3BvcnRfb3Blbl9zb2NrZXQoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUcmFuc3BvcnQgICAgKip0cmFuc3BvcnRfcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisgIGRidXNfYm9vbF90IGlzVGNwOworICBkYnVzX2Jvb2xfdCBpc05vbmNlVGNwOworICAKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKyAgX2RidXNfYXNzZXJ0IChtZXRob2QgIT0gTlVMTCk7CisKKyAgaXNUY3AgPSBzdHJjbXAgKG1ldGhvZCwgInRjcCIpID09IDA7CisgIGlzTm9uY2VUY3AgPSBzdHJjbXAgKG1ldGhvZCwgIm5vbmNlLXRjcCIpID09IDA7CisKKyAgaWYgKGlzVGNwIHx8IGlzTm9uY2VUY3ApCisgICAgeworICAgICAgY29uc3QgY2hhciAqaG9zdCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiaG9zdCIpOworICAgICAgY29uc3QgY2hhciAqcG9ydCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAicG9ydCIpOworICAgICAgY29uc3QgY2hhciAqZmFtaWx5ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJmYW1pbHkiKTsKKyAgICAgIGNvbnN0IGNoYXIgKm5vbmNlZmlsZSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAibm9uY2VmaWxlIik7CisKKyAgICAgIGlmICgoaXNOb25jZVRjcCA9PSBUUlVFKSAhPSAobm9uY2VmaWxlICE9IE5VTEwpKSB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgbWV0aG9kLCAibm9uY2VmaWxlIiwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICB9CisKKyAgICAgIGlmIChwb3J0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCBtZXRob2QsICJwb3J0IiwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgKnRyYW5zcG9ydF9wID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfdGNwX3NvY2tldCAoaG9zdCwgcG9ydCwgZmFtaWx5LCBub25jZWZpbGUsIGVycm9yKTsKKyAgICAgIGlmICgqdHJhbnNwb3J0X3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX09LOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKiBAfSAqLworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVmYWUzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuaApAQCAtMCwwICsxLDQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXNvY2tldC5oIFNvY2tldCBzdWJjbGFzc2VzIG9mIERCdXNUcmFuc3BvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RSQU5TUE9SVF9TT0NLRVRfSAorI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9TT0NLRVRfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzVHJhbnNwb3J0KiAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9zb2NrZXQgICAgIChpbnQgICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc2VydmVyX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqYWRkcmVzcyk7CitEQnVzVHJhbnNwb3J0KiAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fc29ja2V0ICAgICAgICAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RSQU5TUE9SVF9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDc3NTZmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtdW5peC5jIFVOSVggc29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RyYW5zcG9ydFVuaXggREJ1c1RyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgZm9yIFVOSVgKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzVHJhbnNwb3J0IG9uIFVOSVgKKyAqCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgZm9yIHRoZSBnaXZlbiBVbml4IGRvbWFpbiBzb2NrZXQKKyAqIHBhdGguIFRoaXMgY3JlYXRlcyBhIGNsaWVudC1zaWRlIG9mIGEgdHJhbnNwb3J0LgorICoKKyAqIEB0b2RvIG9uY2Ugd2UgYWRkIGEgd2F5IHRvIGVzY2FwZSBwYXRocyBpbiBhIGRidXMKKyAqIGFkZHJlc3MsIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gZG8gZXNjYXBpbmcuCisgKgorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGRvbWFpbiBzb2NrZXQuCisgKiBAcGFyYW0gYWJzdHJhY3QgI1RSVUUgdG8gdXNlIGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2UKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGZkID0gLTE7CisKKyAgaWYgKChhYnN0cmFjdCAmJgorICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgInVuaXg6YWJzdHJhY3Q9IikpIHx8CisgICAgICAoIWFic3RyYWN0ICYmCisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDpwYXRoPSIpKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBwYXRoKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzA7CisgICAgfQorICAKKyAgZmQgPSBfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0IChwYXRoLCBhYnN0cmFjdCwgZXJyb3IpOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkXzA7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHVuaXggc29ja2V0ICVzXG4iLAorICAgICAgICAgICAgICAgICBwYXRoKTsKKworICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9zb2NrZXQgKGZkLCBOVUxMLCAmYWRkcmVzcyk7CisgIGlmICh0cmFuc3BvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gZmFpbGVkXzE7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgCisgIHJldHVybiB0cmFuc3BvcnQ7CisKKyBmYWlsZWRfMToKKyAgX2RidXNfY2xvc2Vfc29ja2V0IChmZCwgTlVMTCk7CisgZmFpbGVkXzA6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIE9wZW5zIHBsYXRmb3JtIHNwZWNpZmljIHRyYW5zcG9ydCB0eXBlcy4KKyAqIAorICogQHBhcmFtIGVudHJ5IHRoZSBhZGRyZXNzIGVudHJ5IHRvIHRyeSBvcGVuaW5nCisgKiBAcGFyYW0gdHJhbnNwb3J0X3AgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgb3BlbmVkIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIHNldAorICogQHJldHVybnMgcmVzdWx0IG9mIHRoZSBhdHRlbXB0CisgKi8KK0RCdXNUcmFuc3BvcnRPcGVuUmVzdWx0CitfZGJ1c190cmFuc3BvcnRfb3Blbl9wbGF0Zm9ybV9zcGVjaWZpYyAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUcmFuc3BvcnQgICAgKip0cmFuc3BvcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIF9kYnVzX2Fzc2VydCAobWV0aG9kICE9IE5VTEwpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgInVuaXgiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnBhdGggPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInBhdGgiKTsKKyAgICAgIGNvbnN0IGNoYXIgKnRtcGRpciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAidG1wZGlyIik7CisgICAgICBjb25zdCBjaGFyICphYnN0cmFjdCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiYWJzdHJhY3QiKTsKKyAgICAgICAgICAKKyAgICAgIGlmICh0bXBkaXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHVzZSB0aGUgXCJ0bXBkaXJcIiBvcHRpb24gZm9yIGFuIGFkZHJlc3MgdG8gY29ubmVjdCB0bywgb25seSBpbiBhbiBhZGRyZXNzIHRvIGxpc3RlbiBvbiIpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisgICAgICAgICAgCisgICAgICBpZiAocGF0aCA9PSBOVUxMICYmIGFic3RyYWN0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAidW5peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCBvciBhYnN0cmFjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICBpZiAocGF0aCAhPSBOVUxMICYmIGFic3RyYWN0ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNwZWNpZnkgYm90aCBcInBhdGhcIiBhbmQgXCJhYnN0cmFjdFwiIG9wdGlvbnMgaW4gYW4gYWRkcmVzcyIpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIGlmIChwYXRoKQorICAgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0IChwYXRoLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgZWxzZQorICAgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0IChhYnN0cmFjdCwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0gICAgICAKKyAgICB9CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICBlbHNlIGlmIChzdHJjbXAgKG1ldGhvZCwgImxhdW5jaGQiKSA9PSAwKQorICAgIHsKKyAgICAgIERCdXNFcnJvciB0bXBfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgICAgICBjb25zdCBjaGFyICpsYXVuY2hkX2Vudl92YXIgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImVudiIpOworICAgICAgY29uc3QgY2hhciAqbGF1bmNoZF9zb2NrZXQ7CisgICAgICBEQnVzU3RyaW5nIHNvY2tldF9wYXRoOworICAgICAgZGJ1c19ib29sX3QgdmFsaWRfc29ja2V0OworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAobGF1bmNoZF9lbnZfdmFyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAibGF1bmNoZCIsICJlbnYiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICB2YWxpZF9zb2NrZXQgPSBfZGJ1c19sb29rdXBfbGF1bmNoZF9zb2NrZXQgKCZzb2NrZXRfcGF0aCwgbGF1bmNoZF9lbnZfdmFyLCBlcnJvcik7CisKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldChlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmc29ja2V0X3BhdGgpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIXZhbGlkX3NvY2tldCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxhdW5jaGQncyBlbnYgdmFyICVzIGRvZXMgbm90IGV4aXN0IiwgbGF1bmNoZF9lbnZfdmFyKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUoZXJyb3IpOworICAgICAgICAgIGRidXNfbW92ZV9lcnJvcigmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisKKyAgICAgIGxhdW5jaGRfc29ja2V0ID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKCZzb2NrZXRfcGF0aCk7CisgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0IChsYXVuY2hkX3NvY2tldCwgRkFMU0UsIGVycm9yKTsKKworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzYTgzMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtdW5peC5oIFVOSVggc29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1VOSVhfSAorI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9VTklYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzVHJhbnNwb3J0KiBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0IChjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX1VOSVhfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhZjFiZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmMKQEAgLTAsMCArMSw4OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC13aW4uYyBXaW5kb3dzIHNvY2tldCBzdWJjbGFzc2VzIG9mIERCdXNUcmFuc3BvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RyYW5zcG9ydFVuaXggREJ1c1RyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgZm9yIFVOSVgKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzVHJhbnNwb3J0IG9uIFVOSVgKKyAqCisgKiBAeworICovCisKKy8qKgorICogT3BlbnMgcGxhdGZvcm0gc3BlY2lmaWMgdHJhbnNwb3J0IHR5cGVzLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkgdG8gdHJ5IG9wZW5pbmcKKyAqIEBwYXJhbSB0cmFuc3BvcnRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvcGVuZWQgdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgc2V0CisgKiBAcmV0dXJucyByZXN1bHQgb2YgdGhlIGF0dGVtcHQKKyAqLworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQKK19kYnVzX3RyYW5zcG9ydF9vcGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworCisgIGNvbnN0IGNoYXIgKmhvc3QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImhvc3QiKTsKKyAgY29uc3QgY2hhciAqcG9ydCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAicG9ydCIpOworICBjb25zdCBjaGFyICpmYW1pbHkgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImZhbWlseSIpOworICBjb25zdCBjaGFyICpub25jZWZpbGUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgIm5vbmNlZmlsZSIpOworCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIF9kYnVzX2Fzc2VydCAobWV0aG9kICE9IE5VTEwpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgIm5vbmNlLXRjcCIpICE9IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9OT1RfSEFORExFRDsKKyAgICB9CisKKyAgaWYgKHBvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCAibm9uY2UtdGNwIiwgInBvcnQiLCBOVUxMKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgIH0KKworICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0IChob3N0LCBwb3J0LCBmYW1pbHksIG5vbmNlZmlsZSwgZXJyb3IpOworICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgfQorfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTk3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LXdpbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtd2luLmggV2luZG93cyBzb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1dJTl9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1dJTl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX1dJTl9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2YmQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE0ODUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQuYyBEQnVzVHJhbnNwb3J0IG9iamVjdCAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXdhdGNoLmgiCisjaW5jbHVkZSAiZGJ1cy1hdXRoLmgiCisjaW5jbHVkZSAiZGJ1cy1hZGRyZXNzLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgImRidXMtbWFpbmxvb3AuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1oZWFkZXIuaCIKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oIgorI2VuZGlmCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUcmFuc3BvcnQgREJ1c1RyYW5zcG9ydCBvYmplY3QKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgIkJhY2tlbmQiIGZvciBhIERCdXNDb25uZWN0aW9uLgorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzVHJhbnNwb3J0LiAgQSB0cmFuc3BvcnQgaXMgYW4KKyAqIGFic3RyYWN0aW9uIHRoYXQgY2FuIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSB2aWEgdmFyaW91cyBraW5kcyBvZgorICogbmV0d29yayBjb25uZWN0aW9ucyBvciBvdGhlciBJUEMgbWVjaGFuaXNtcy4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNUcmFuc3BvcnQKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIHdheSBtZXNzYWdlIHN0cmVhbS4KKyAqIERCdXNUcmFuc3BvcnQgYWJzdHJhY3RzIHZhcmlvdXMga2luZHMgb2YgYWN0dWFsCisgKiB0cmFuc3BvcnQgbWVjaGFuaXNtLCBzdWNoIGFzIGRpZmZlcmVudCBuZXR3b3JrIHByb3RvY29scywKKyAqIG9yIGVuY3J5cHRpb24gc2NoZW1lcy4KKyAqLworCitzdGF0aWMgdm9pZAorbGl2ZV9tZXNzYWdlc19ub3RpZnkgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gdXNlcl9kYXRhOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJTaXplIGNvdW50ZXIgdmFsdWUgaXMgbm93ICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KSBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlIChjb3VudGVyKSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJVbml4IEZEIGNvdW50ZXIgdmFsdWUgaXMgbm93ICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KSBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChjb3VudGVyKSk7CisjZW5kaWYKKyAgCisgIC8qIGRpc2FibGUgb3IgcmUtZW5hYmxlIHRoZSByZWFkIHdhdGNoIGZvciB0aGUgdHJhbnNwb3J0IGlmCisgICAqIHJlcXVpcmVkLgorICAgKi8KKyAgaWYgKHRyYW5zcG9ydC0+dnRhYmxlLT5saXZlX21lc3NhZ2VzX2NoYW5nZWQpCisgICAgKCogdHJhbnNwb3J0LT52dGFibGUtPmxpdmVfbWVzc2FnZXNfY2hhbmdlZCkgKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSBiYXNlIGNsYXNzIG1lbWJlcnMgb2YgREJ1c1RyYW5zcG9ydC4gIENoYWluZWQgdXAgdG8KKyAqIGJ5IHN1YmNsYXNzZXMgaW4gdGhlaXIgY29uc3RydWN0b3IuICBUaGUgc2VydmVyIEdVSUQgaXMgdGhlCisgKiBnbG9iYWxseSB1bmlxdWUgSUQgZm9yIHRoZSBzZXJ2ZXIgY3JlYXRpbmcgdGhpcyBjb25uZWN0aW9uCisgKiBhbmQgd2lsbCBiZSAjTlVMTCBmb3IgdGhlIGNsaWVudCBzaWRlIG9mIGEgY29ubmVjdGlvbi4gVGhlIEdVSUQKKyAqIGlzIGluIGhleCBmb3JtYXQuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0IGJlaW5nIGNyZWF0ZWQuCisgKiBAcGFyYW0gdnRhYmxlIHRoZSBzdWJjbGFzcyB2dGFibGUuCisgKiBAcGFyYW0gc2VydmVyX2d1aWQgbm9uLSNOVUxMIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBvZiBhIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHJhbnNwb3J0VlRhYmxlICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICpzZXJ2ZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKmFkZHJlc3MpCit7CisgIERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXI7CisgIERCdXNBdXRoICphdXRoOworICBEQnVzQ291bnRlciAqY291bnRlcjsKKyAgY2hhciAqYWRkcmVzc19jb3B5OworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworICAKKyAgbG9hZGVyID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICgpOworICBpZiAobG9hZGVyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKHNlcnZlcl9ndWlkKQorICAgIGF1dGggPSBfZGJ1c19hdXRoX3NlcnZlcl9uZXcgKHNlcnZlcl9ndWlkKTsKKyAgZWxzZQorICAgIGF1dGggPSBfZGJ1c19hdXRoX2NsaWVudF9uZXcgKCk7CisgIGlmIChhdXRoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNvdW50ZXIgPSBfZGJ1c19jb3VudGVyX25ldyAoKTsKKyAgaWYgKGNvdW50ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorCisgIGNyZWRzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3ICgpOworICBpZiAoY3JlZHMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19jb3VudGVyX3VucmVmIChjb3VudGVyKTsKKyAgICAgIF9kYnVzX2F1dGhfdW5yZWYgKGF1dGgpOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKHNlcnZlcl9ndWlkKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyA9PSBOVUxMKTsKKyAgICAgIGFkZHJlc3NfY29weSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChhZGRyZXNzICE9IE5VTEwpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGFkZHJlc3MsICZhZGRyZXNzX2NvcHkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzKTsKKyAgICAgICAgICBfZGJ1c19jb3VudGVyX3VucmVmIChjb3VudGVyKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIAorICB0cmFuc3BvcnQtPnJlZmNvdW50ID0gMTsKKyAgdHJhbnNwb3J0LT52dGFibGUgPSB2dGFibGU7CisgIHRyYW5zcG9ydC0+bG9hZGVyID0gbG9hZGVyOworICB0cmFuc3BvcnQtPmF1dGggPSBhdXRoOworICB0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMgPSBjb3VudGVyOworICB0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQgPSBGQUxTRTsKKyAgdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgPSBGQUxTRTsKKyAgdHJhbnNwb3J0LT5pc19zZXJ2ZXIgPSAoc2VydmVyX2d1aWQgIT0gTlVMTCk7CisgIHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nID0gIXRyYW5zcG9ydC0+aXNfc2VydmVyOworICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA9IHRyYW5zcG9ydC0+aXNfc2VydmVyOworICB0cmFuc3BvcnQtPmFkZHJlc3MgPSBhZGRyZXNzX2NvcHk7CisgIAorICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9mdW5jdGlvbiA9IE5VTEw7CisgIHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGEgPSBOVUxMOworICB0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEgPSBOVUxMOworCisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2Z1bmN0aW9uID0gTlVMTDsKKyAgdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YSA9IE5VTEw7CisgIHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSA9IE5VTEw7CisgIAorICB0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQgPSBOVUxMOworICAKKyAgLyogVHJ5IHRvIGRlZmF1bHQgdG8gc29tZXRoaW5nIHRoYXQgd29uJ3QgdG90YWxseSBob3NlIHRoZSBzeXN0ZW0sCisgICAqIGJ1dCBkb2Vzbid0IGltcG9zZSB0b28gbXVjaCBvZiBhIGxpbWl0YXRpb24uCisgICAqLworICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUgPSBfREJVU19PTkVfTUVHQUJZVEUgKiA2MzsKKworICAvKiBPbiBMaW51eCBSTElNSVRfTk9GSUxFIGRlZmF1bHRzIHRvIDEwMjQsIHNvIGFsbG93aW5nIDQwOTYgZmRzIGxpdmUKKyAgICAgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2ggKi8KKyAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcyA9IDQwOTY7CisKKyAgLyogY3JlZGVudGlhbHMgcmVhZCBmcm9tIHNvY2tldCBpZiBhbnkgKi8KKyAgdHJhbnNwb3J0LT5jcmVkZW50aWFscyA9IGNyZWRzOworCisgIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVfbWVzc2FnZXNfbm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+YWRkcmVzcykKKyAgICBfZGJ1c192ZXJib3NlICgiSW5pdGlhbGl6ZWQgdHJhbnNwb3J0IG9uIGFkZHJlc3MgJXNcbiIsIHRyYW5zcG9ydC0+YWRkcmVzcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRmluYWxpemVzIGJhc2UgY2xhc3MgbWVtYmVycyBvZiBEQnVzVHJhbnNwb3J0LgorICogQ2hhaW5lZCB1cCB0byBmcm9tIHN1YmNsYXNzIGZpbmFsaXplcnMuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfZmluYWxpemVfYmFzZSAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBpZiAoIXRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworCisgIGlmICh0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEgIT0gTlVMTCkKKyAgICAoKiB0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEpICh0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhKTsKKworICBpZiAodHJhbnNwb3J0LT5mcmVlX3dpbmRvd3NfdXNlcl9kYXRhICE9IE5VTEwpCisgICAgKCogdHJhbnNwb3J0LT5mcmVlX3dpbmRvd3NfdXNlcl9kYXRhKSAodHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YSk7CisgIAorICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAodHJhbnNwb3J0LT5sb2FkZXIpOworICBfZGJ1c19hdXRoX3VucmVmICh0cmFuc3BvcnQtPmF1dGgpOworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBOVUxMLCBOVUxMKTsKKyAgX2RidXNfY291bnRlcl91bnJlZiAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKTsKKyAgZGJ1c19mcmVlICh0cmFuc3BvcnQtPmFkZHJlc3MpOworICBkYnVzX2ZyZWUgKHRyYW5zcG9ydC0+ZXhwZWN0ZWRfZ3VpZCk7CisgIGlmICh0cmFuc3BvcnQtPmNyZWRlbnRpYWxzKQorICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmICh0cmFuc3BvcnQtPmNyZWRlbnRpYWxzKTsKK30KKworCisvKioKKyAqIFZlcmlmaWVzIGlmIGEgZ2l2ZW4gRC1CdXMgYWRkcmVzcyBpcyBhIHZhbGlkIGFkZHJlc3MKKyAqIGJ5IGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBpdC4gSWYgaXQgaXMsIHJldHVybnMgdGhlCisgKiBvcGVuZWQgREJ1c1RyYW5zcG9ydCBvYmplY3QuIElmIGl0IGlzbid0LCByZXR1cm5zICNOVUxMCisgKiBhbmQgc2V0cyBAcCBlcnJvci4KKyAqCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBhIG5ldyB0cmFuc3BvcnQsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBEQnVzVHJhbnNwb3J0KgorY2hlY2tfYWRkcmVzcyAoY29uc3QgY2hhciAqYWRkcmVzcywgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJpZXM7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIGludCBsZW4sIGk7CisKKyAgX2RidXNfYXNzZXJ0IChhZGRyZXNzICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKCphZGRyZXNzICE9ICdcMCcpOworCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzIChhZGRyZXNzLCAmZW50cmllcywgJmxlbiwgZXJyb3IpKQorICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgLyogbm90IGEgdmFsaWQgYWRkcmVzcyAqLworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfb3BlbiAoZW50cmllc1tpXSwgZXJyb3IpOworICAgICAgaWYgKHRyYW5zcG9ydCAhPSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoZW50cmllcyk7CisgIHJldHVybiB0cmFuc3BvcnQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgZm9yIHRoZSAiYXV0b3N0YXJ0IiBtZXRob2QuCisgKiBUaGlzIGNyZWF0ZXMgYSBjbGllbnQtc2lkZSBvZiBhIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBhIG5ldyB0cmFuc3BvcnQsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X25ld19mb3JfYXV0b2xhdW5jaCAoY29uc3QgY2hhciAqc2NvcGUsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgREJ1c1RyYW5zcG9ydCAqcmVzdWx0ID0gTlVMTDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzIChzY29wZSwgJmFkZHJlc3MsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmVzdWx0ID0gY2hlY2tfYWRkcmVzcyAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYWRkcmVzcyksIGVycm9yKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgZWxzZQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQKK19kYnVzX3RyYW5zcG9ydF9vcGVuX2F1dG9sYXVuY2ggKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUcmFuc3BvcnQgICAgKip0cmFuc3BvcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworICAKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKyAgX2RidXNfYXNzZXJ0IChtZXRob2QgIT0gTlVMTCk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAiYXV0b2xhdW5jaCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2NvcGUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInNjb3BlIik7CisKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2F1dG9sYXVuY2ggKHNjb3BlLCBlcnJvcik7CisKKyAgICAgIGlmICgqdHJhbnNwb3J0X3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX09LOworICAgICAgICB9ICAgICAgCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICBEQnVzVHJhbnNwb3J0T3BlblJlc3VsdCAoKiBmdW5jKSAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgKip0cmFuc3BvcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK30gb3Blbl9mdW5jc1tdID0geworICB7IF9kYnVzX3RyYW5zcG9ydF9vcGVuX3NvY2tldCB9LAorICB7IF9kYnVzX3RyYW5zcG9ydF9vcGVuX3BsYXRmb3JtX3NwZWNpZmljIH0sCisgIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fYXV0b2xhdW5jaCB9CisjaWZkZWYgREJVU19CVUlMRF9URVNUUworICAsIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSB9CisjZW5kaWYKK307CisKKy8qKgorICogVHJ5IHRvIG9wZW4gYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gYWRkcmVzcyBlbnRyeS4gIChUaGlzCisgKiBvcGVucyBhIGNsaWVudC1zaWRlLW9mLXRoZS1jb25uZWN0aW9uIHRyYW5zcG9ydC4pCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIG5ldyB0cmFuc3BvcnQgb2YgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9vcGVuIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBjb25zdCBjaGFyICpleHBlY3RlZF9ndWlkX29yaWc7CisgIGNoYXIgKmV4cGVjdGVkX2d1aWQ7CisgIGludCBpOworICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgdHJhbnNwb3J0ID0gTlVMTDsKKyAgZXhwZWN0ZWRfZ3VpZF9vcmlnID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJndWlkIik7CisgIGV4cGVjdGVkX2d1aWQgPSBfZGJ1c19zdHJkdXAgKGV4cGVjdGVkX2d1aWRfb3JpZyk7CisKKyAgaWYgKGV4cGVjdGVkX2d1aWRfb3JpZyAhPSBOVUxMICYmIGV4cGVjdGVkX2d1aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKG9wZW5fZnVuY3MpOyArK2kpCisgICAgeworICAgICAgREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgcmVzdWx0OworCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworICAgICAgcmVzdWx0ID0gKCogb3Blbl9mdW5jc1tpXS5mdW5jKSAoZW50cnksICZ0cmFuc3BvcnQsICZ0bXBfZXJyb3IpOworCisgICAgICBzd2l0Y2ggKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFJBTlNQT1JUX09QRU5fT0s6CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisgICAgICAgICAgLyoga2VlcCBnb2luZyB0aHJvdWdoIHRoZSBsb29wIG9mIG9wZW4gZnVuY3MgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICAKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKCZ0bXBfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIHR5cGUgKGV4YW1wbGVzIG9mIHZhbGlkIHR5cGVzIGFyZSBcInRjcFwiIGFuZCBvbiBVTklYIFwidW5peFwiKSIpOworICAgICAgCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgIGRidXNfbW92ZV9lcnJvcigmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBkYnVzX2ZyZWUgKGV4cGVjdGVkX2d1aWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisKKyAgICAgIC8qIEluIHRoZSBjYXNlIG9mIGF1dG9zdGFydCB0aGUgaW5pdGlhbCBndWlkIGlzIE5VTEwKKyAgICAgICAqIGFuZCB0aGUgYXV0b3N0YXJ0IHRyYW5zcG9ydCByZWN1cnNpdmVseSBjYWxscworICAgICAgICogX2RidXNfb3Blbl90cmFuc3BvcnQgd2ljaCByZXR1cm5zIGEgdHJhbnNwb3J0CisgICAgICAgKiB3aXRoIGEgZ3VpZC4gIFRoYXQgZ3VpZCBpcyB0aGUgZGVmaW5pdGl2ZSBvbmUuCisgICAgICAgKgorICAgICAgICogRklYTUU6IGlmIG1vcmUgdHJhbnNwb3J0cyBhcmUgYWRkZWQgdGhleSBtYXkgaGF2ZQorICAgICAgICogYW4gZWZmZWN0IG9uIHRoZSBleHBlY3RlZF9ndWlkIHNlbWFudGljcyAoaS5lLiAKKyAgICAgICAqIGV4cGVjdGVkX2d1aWQgYW5kIHRyYW5zcG9ydC0+ZXhwZWN0ZWRfZ3VpZCBtYXkKKyAgICAgICAqIGJvdGggaGF2ZSB2YWx1ZXMpLiAgVGhpcyBpcyB2ZXJ5IHVubGlrZWx5IHRob3VnaAorICAgICAgICogd2Ugc2hvdWxkIGVpdGhlciB0aHJvdyBhc3NlcnRzIGhlcmUgZm9yIHRob3NlIAorICAgICAgICogY29ybmVyIGNhc2VzIG9yIHJlZmFjdG9yIHRoZSBjb2RlIHNvIGl0IGlzIAorICAgICAgICogY2xlYXJlciBvbiB3aGF0IGlzIGV4cGVjdGVkIGFuZCB3aGF0IGlzIG5vdAorICAgICAgICovCisgICAgICBpZihleHBlY3RlZF9ndWlkKQorICAgICAgICB0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQgPSBleHBlY3RlZF9ndWlkOworICAgIH0KKworICByZXR1cm4gdHJhbnNwb3J0OworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcmV0dXJucyB0aGUgdHJhbnNwb3J0LgorICovCitEQnVzVHJhbnNwb3J0ICoKK19kYnVzX3RyYW5zcG9ydF9yZWYgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnJlZmNvdW50ID4gMCk7CisgIAorICB0cmFuc3BvcnQtPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHRyYW5zcG9ydDsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIHRoZSB0cmFuc3BvcnQuCisgKiBEaXNjb25uZWN0cyBhbmQgZmluYWxpemVzIHRoZSB0cmFuc3BvcnQgaWYKKyAqIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3VucmVmIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+cmVmY291bnQgPiAwKTsKKyAgCisgIHRyYW5zcG9ydC0+cmVmY291bnQgLT0gMTsKKyAgaWYgKHRyYW5zcG9ydC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmluYWxpemluZ1xuIik7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT52dGFibGUtPmZpbmFsaXplICE9IE5VTEwpOworICAgICAgCisgICAgICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+ZmluYWxpemUpICh0cmFuc3BvcnQpOworICAgIH0KK30KKworLyoqCisgKiBDbG9zZXMgb3VyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhcHBsaWNhdGlvbi4gRnVydGhlcgorICogYXR0ZW1wdHMgdG8gdXNlIHRoaXMgdHJhbnNwb3J0IHdpbGwgZmFpbC4gT25seSB0aGUgZmlyc3QgY2FsbCB0bworICogX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QoKSB3aWxsIGhhdmUgYW4gZWZmZWN0LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIAorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnZ0YWJsZS0+ZGlzY29ubmVjdCAhPSBOVUxMKTsKKyAgCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICByZXR1cm47CisKKyAgKCogdHJhbnNwb3J0LT52dGFibGUtPmRpc2Nvbm5lY3QpICh0cmFuc3BvcnQpOworICAKKyAgdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgPSBUUlVFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCisvKioKKyAqIFJldHVybnMgI1RSVUUgaWYgdGhlIHRyYW5zcG9ydCBoYXMgbm90IGJlZW4gZGlzY29ubmVjdGVkLgorICogRGlzY29ubmVjdGlvbiBjYW4gcmVzdWx0IGZyb20gX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QoKQorICogb3IgYmVjYXVzZSB0aGUgc2VydmVyIGRyb3BzIGl0cyBlbmQgb2YgdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHJldHVybnMgd2hldGhlciB3ZSdyZSBjb25uZWN0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiAhdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXV0aF92aWFfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKyAgZGJ1c19ib29sX3QgYWxsb3c7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uIHVuaXhfdXNlcl9mdW5jdGlvbjsKKyAgdm9pZCAqdW5peF91c2VyX2RhdGE7CisgIGRidXNfdWlkX3QgdWlkOworCisgIC8qIERyb3BwaW5nIHRoZSBsb2NrIGhlcmUgcHJvYmFibHkgaXNuJ3QgdGhhdCBzYWZlLiAqLworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworICBfZGJ1c19hc3NlcnQgKGF1dGhfaWRlbnRpdHkgIT0gTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IHRyYW5zcG9ydC0+Y29ubmVjdGlvbjsKKyAgdW5peF91c2VyX2Z1bmN0aW9uID0gdHJhbnNwb3J0LT51bml4X3VzZXJfZnVuY3Rpb247CisgIHVuaXhfdXNlcl9kYXRhID0gdHJhbnNwb3J0LT51bml4X3VzZXJfZGF0YTsKKyAgdWlkID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChhdXRoX2lkZW50aXR5KTsKKyAgICAgICAgICAgICAgCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoY29ubmVjdGlvbik7CisKKyAgYWxsb3cgPSAoKiB1bml4X3VzZXJfZnVuY3Rpb24pIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml4X3VzZXJfZGF0YSk7CisgICAgICAgICAgICAgIAorICBfZGJ1c192ZXJib3NlICgibG9jayBwb3N0IHVuaXggdXNlciBmdW5jdGlvblxuIik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAoY29ubmVjdGlvbik7CisKKyAgaWYgKGFsbG93KQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgVUlEICJEQlVTX1VJRF9GT1JNQVQiIGF1dGhvcml6ZWRcbiIsIHVpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBVSUQgIkRCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAgICAgIiB3YXMgcmVqZWN0ZWQsIGRpc2Nvbm5lY3RpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGF1dGhfaWRlbnRpdHkpKTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgIH0KKworICByZXR1cm4gYWxsb3c7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXV0aF92aWFfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsgIAorICBkYnVzX2Jvb2xfdCBhbGxvdzsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24gd2luZG93c191c2VyX2Z1bmN0aW9uOworICB2b2lkICp3aW5kb3dzX3VzZXJfZGF0YTsKKyAgY2hhciAqd2luZG93c19zaWQ7CisKKyAgLyogRHJvcHBpbmcgdGhlIGxvY2sgaGVyZSBwcm9iYWJseSBpc24ndCB0aGF0IHNhZmUuICovCisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aF9pZGVudGl0eSAhPSBOVUxMKTsKKworICBjb25uZWN0aW9uID0gdHJhbnNwb3J0LT5jb25uZWN0aW9uOworICB3aW5kb3dzX3VzZXJfZnVuY3Rpb24gPSB0cmFuc3BvcnQtPndpbmRvd3NfdXNlcl9mdW5jdGlvbjsKKyAgd2luZG93c191c2VyX2RhdGEgPSB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhOworICB3aW5kb3dzX3NpZCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChhdXRoX2lkZW50aXR5KSk7CisKKyAgaWYgKHdpbmRvd3Nfc2lkID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgICAgICAgICAgIAorICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKGNvbm5lY3Rpb24pOworCisgIGFsbG93ID0gKCogd2luZG93c191c2VyX2Z1bmN0aW9uKSAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzX3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzX3VzZXJfZGF0YSk7CisgICAgICAgICAgICAgIAorICBfZGJ1c192ZXJib3NlICgibG9jayBwb3N0IHdpbmRvd3MgdXNlciBmdW5jdGlvblxuIik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAoY29ubmVjdGlvbik7CisKKyAgaWYgKGFsbG93KQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgU0lEICclcycgYXV0aG9yaXplZFxuIiwgd2luZG93c19zaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgU0lEICclcycgd2FzIHJlamVjdGVkLCBkaXNjb25uZWN0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChhdXRoX2lkZW50aXR5KSk7CisgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2F1dGhfdmlhX2RlZmF1bHRfcnVsZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OworICBEQnVzQ3JlZGVudGlhbHMgKm91cl9pZGVudGl0eTsKKyAgZGJ1c19ib29sX3QgYWxsb3c7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aF9pZGVudGl0eSAhPSBOVUxMKTsKKworICAvKiBCeSBkZWZhdWx0LCBjb25uZWN0aW9uIGlzIGFsbG93ZWQgaWYgdGhlIGNsaWVudCBpcyAxKSByb290IG9yIDIpCisgICAqIGhhcyB0aGUgc2FtZSBVSUQgYXMgdXMgb3IgMykgYW5vbnltb3VzIGlzIGFsbG93ZWQuCisgICAqLworICAKKyAgb3VyX2lkZW50aXR5ID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICBpZiAob3VyX2lkZW50aXR5ID09IE5VTEwpCisgICAgeworICAgICAgLyogT09NICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgICAgICAgICAKKyAgaWYgKHRyYW5zcG9ydC0+YWxsb3dfYW5vbnltb3VzIHx8CisgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGF1dGhfaWRlbnRpdHkpID09IDAgfHwKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAob3VyX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2lkZW50aXR5KSkKKyAgICB7CisgICAgICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZShvdXJfaWRlbnRpdHksREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSkKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IGF1dGhvcml6ZWQgYXMgU0lEICclcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoaW5nIG91ciBTSUQgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQoYXV0aF9pZGVudGl0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKG91cl9pZGVudGl0eSkpOworICAgICAgZWxzZQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgYXV0aG9yaXplZCBhcyBVSUQgIkRCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAgICAgICAgICIgbWF0Y2hpbmcgb3VyIFVJRCAiREJVU19VSURfRk9STUFUIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQoYXV0aF9pZGVudGl0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkKG91cl9pZGVudGl0eSkpOworICAgICAgLyogV2UgaGF2ZSBhdXRoZW50aWNhdGVkISAqLworICAgICAgYWxsb3cgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlKG91cl9pZGVudGl0eSxEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgYXV0aG9yaXplZCBhcyBTSUQgJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBvdXIgU0lEIGlzICclcycsIGRpc2Nvbm5lY3RpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChhdXRoX2lkZW50aXR5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChhdXRoX2lkZW50aXR5KSA6ICI8bnVsbD4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKG91cl9pZGVudGl0eSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQob3VyX2lkZW50aXR5KSA6ICI8bnVsbD4iKSk7CisgICAgICBlbHNlCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBhdXRob3JpemVkIGFzIFVJRCAiREJVU19VSURfRk9STUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBidXQgb3VyIFVJRCBpcyAiREJVU19VSURfRk9STUFUIiwgZGlzY29ubmVjdGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQoYXV0aF9pZGVudGl0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkKG91cl9pZGVudGl0eSkpOworICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgICBhbGxvdyA9IEZBTFNFOworICAgIH0gIAorCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChvdXJfaWRlbnRpdHkpOworICAKKyAgcmV0dXJuIGFsbG93OworfQorCisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB3ZSBoYXZlIGJlZW4gYXV0aGVudGljYXRlZC4gIFdpbGwgcmV0dXJuICNUUlVFCisgKiBldmVuIGlmIHRoZSB0cmFuc3BvcnQgaXMgZGlzY29ubmVjdGVkLgorICoKKyAqIEB0b2RvIHdlIGRyb3AgY29ubmVjdGlvbi0+bXV0ZXggd2hlbiBjYWxsaW5nIHRoZSB1bml4X3VzZXJfZnVuY3Rpb24sCisgKiBhbmQgd2luZG93c191c2VyX2Z1bmN0aW9uLCB3aGljaCBtYXkgbm90IGJlIHNhZmUgcmVhbGx5LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgd2hldGhlciB3ZSdyZSBhdXRoZW50aWNhdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sgIAorICBpZiAodHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgeworICAgICAgZGJ1c19ib29sX3QgbWF5YmVfYXV0aGVudGljYXRlZDsKKyAgICAgIAorICAgICAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIHBhcmFub2lhIHJlZiBzaW5jZSB3ZSBjYWxsIHVzZXIgY2FsbGJhY2tzIHNvbWV0aW1lcyAqLworICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIG1heWJlX2F1dGhlbnRpY2F0ZWQgPQorICAgICAgICAoISh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZykpOworCisgICAgICBpZiAobWF5YmVfYXV0aGVudGljYXRlZCkKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDoKKyAgICAgICAgICAgICAgLyogbGVhdmUgYXMgbWF5YmVfYXV0aGVudGljYXRlZCAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIG1heWJlX2F1dGhlbnRpY2F0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBJZiB3ZSdyZSB0aGUgY2xpZW50LCB2ZXJpZnkgdGhlIEdVSUQKKyAgICAgICAqLworICAgICAgaWYgKG1heWJlX2F1dGhlbnRpY2F0ZWQgJiYgIXRyYW5zcG9ydC0+aXNfc2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqc2VydmVyX2d1aWQ7CisKKyAgICAgICAgICBzZXJ2ZXJfZ3VpZCA9IF9kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIgKHRyYW5zcG9ydC0+YXV0aCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXJfZ3VpZCAhPSBOVUxMKTsKKworICAgICAgICAgIGlmICh0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQgJiYKKyAgICAgICAgICAgICAgc3RyY21wICh0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQsIHNlcnZlcl9ndWlkKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IGV4cGVjdGVkIEdVSUQgJyVzJyBhbmQgd2UgZ290ICclcycgZnJvbSB0aGUgc2VydmVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQsIHNlcnZlcl9ndWlkKTsKKyAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBJZiB3ZSdyZSB0aGUgc2VydmVyLCBzZWUgaWYgd2Ugd2FudCB0byBhbGxvdyB0aGlzIGlkZW50aXR5IHRvIHByb2NlZWQuCisgICAgICAgKi8KKyAgICAgIGlmIChtYXliZV9hdXRoZW50aWNhdGVkICYmIHRyYW5zcG9ydC0+aXNfc2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19ib29sX3QgYWxsb3c7CisgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OworICAgICAgICAgIAorICAgICAgICAgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGF1dGhfaWRlbnRpdHkgIT0gTlVMTCk7CisgICAgICAgICAgCisgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhbiBhdXRoJ2QgdXNlciBhbmQgYSB1c2VyIGZ1bmN0aW9uLCBkZWxlZ2F0ZQorICAgICAgICAgICAqIGRlY2lkaW5nIHdoZXRoZXIgYXV0aCBjcmVkZW50aWFscyBhcmUgZ29vZCBlbm91Z2ggdG8gdGhlCisgICAgICAgICAgICogYXBwOyBvdGhlcndpc2UsIHVzZSBvdXIgZGVmYXVsdCBkZWNpc2lvbiBwcm9jZXNzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICh0cmFuc3BvcnQtPnVuaXhfdXNlcl9mdW5jdGlvbiAhPSBOVUxMICYmCisgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhbGxvdyA9IGF1dGhfdmlhX3VuaXhfdXNlcl9mdW5jdGlvbiAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICh0cmFuc3BvcnQtPndpbmRvd3NfdXNlcl9mdW5jdGlvbiAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoYXV0aF9pZGVudGl0eSwgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb3cgPSBhdXRoX3ZpYV93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9ICAgICAgCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhbGxvdyA9IGF1dGhfdmlhX2RlZmF1bHRfcnVsZXMgKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFhbGxvdykKKyAgICAgICAgICAgIG1heWJlX2F1dGhlbnRpY2F0ZWQgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICB0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQgPSBtYXliZV9hdXRoZW50aWNhdGVkOworCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIG1heWJlX2F1dGhlbnRpY2F0ZWQ7CisgICAgfQorfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Fub255bW91cygpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgI1RSVUUgaWYgbm90IGF1dGhlbnRpY2F0ZWQgb3IgYXV0aGVudGljYXRlZCBhcyBhbm9ueW1vdXMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYW5vbnltb3VzIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKyAgCisgIGlmICghdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBUUlVFOworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChhdXRoX2lkZW50aXR5KSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIHRyYW5zcG9ydCBzdXBwb3J0cyBzZW5kaW5nIHVuaXggZmRzLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgI1RSVUUgaWYgVFJVRSBpdCBpcyBwb3NzaWJsZSB0byBzZW5kIHVuaXggZmRzIGFjcm9zcyB0aGUgdHJhbnNwb3J0LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gREJVU19UUkFOU1BPUlRfQ0FOX1NFTkRfVU5JWF9GRCh0cmFuc3BvcnQpOworfQorCisvKioKKyAqIEdldHMgdGhlIGFkZHJlc3Mgb2YgYSB0cmFuc3BvcnQuIEl0IHdpbGwgYmUKKyAqICNOVUxMIGZvciBhIHNlcnZlci1zaWRlIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIHRyYW5zcG9ydCdzIGFkZHJlc3MKKyAqLworY29uc3QgY2hhcioKK19kYnVzX3RyYW5zcG9ydF9nZXRfYWRkcmVzcyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gdHJhbnNwb3J0LT5hZGRyZXNzOworfQorCisvKioKKyAqIEdldHMgdGhlIGlkIG9mIHRoZSBzZXJ2ZXIgd2UgYXJlIGNvbm5lY3RlZCB0byAoc2VlCisgKiBkYnVzX3NlcnZlcl9nZXRfaWQoKSkuIE9ubHkgd29ya3Mgb24gY2xpZW50IHNpZGUuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyB0cmFuc3BvcnQncyBzZXJ2ZXIncyBpZCBvciAjTlVMTCBpZiB3ZSBhcmUgdGhlIHNlcnZlciBzaWRlCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c190cmFuc3BvcnRfZ2V0X3NlcnZlcl9pZCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBpZiAodHJhbnNwb3J0LT5pc19zZXJ2ZXIpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKHRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gX2RidXNfYXV0aF9nZXRfZ3VpZF9mcm9tX3NlcnZlciAodHJhbnNwb3J0LT5hdXRoKTsKKyAgZWxzZQorICAgIHJldHVybiB0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQ7Cit9CisKKy8qKgorICogSGFuZGxlcyBhIHdhdGNoIGJ5IHJlYWRpbmcgZGF0YSwgd3JpdGluZyBkYXRhLCBvciBkaXNjb25uZWN0aW5nCisgKiB0aGUgdHJhbnNwb3J0LCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbi4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoLgorICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgd2F0Y2hlZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkgdG8gZnVsbHkgaGFuZGxlIHRoZSB3YXRjaAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2hhbmRsZV93YXRjaCAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBjb25kaXRpb24pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT52dGFibGUtPmhhbmRsZV93YXRjaCAhPSBOVUxMKTsKKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIlRyaWVkIHRvIGhhbmRsZSBhbiBpbnZhbGlkYXRlZCB3YXRjaDsgdGhpcyB3YXRjaCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgX2RidXNfd2F0Y2hfc2FuaXRpemVfY29uZGl0aW9uICh3YXRjaCwgJmNvbmRpdGlvbik7CisKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKyAgX2RidXNfd2F0Y2hfcmVmICh3YXRjaCk7CisgIHJldHZhbCA9ICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5oYW5kbGVfd2F0Y2gpICh0cmFuc3BvcnQsIHdhdGNoLCBjb25kaXRpb24pOworICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZXRzIHRoZSBjb25uZWN0aW9uIHVzaW5nIHRoaXMgdHJhbnNwb3J0LiBBbGxvd3MgdGhlIHRyYW5zcG9ydAorICogdG8gYWRkIHdhdGNoZXMgdG8gdGhlIGNvbm5lY3Rpb24sIHF1ZXVlIGluY29taW5nIG1lc3NhZ2VzLAorICogYW5kIHB1bGwgb3V0Z29pbmcgbWVzc2FnZXMuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9zZXRfY29ubmVjdGlvbiAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT52dGFibGUtPmNvbm5lY3Rpb25fc2V0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiA9PSBOVUxMKTsKKyAgCisgIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKyAgaWYgKCEoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+Y29ubmVjdGlvbl9zZXQpICh0cmFuc3BvcnQpKQorICAgIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiA9IE5VTEw7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKworICByZXR1cm4gdHJhbnNwb3J0LT5jb25uZWN0aW9uICE9IE5VTEw7Cit9CisKKy8qKgorICogR2V0IHRoZSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yLCBpZiBhbnkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gZmRfcCBwb2ludGVyIHRvIGZpbGwgaW4gd2l0aCB0aGUgZGVzY3JpcHRvcgorICogQHJldHVybnMgI1RSVUUgaWYgYSBkZXNjcmlwdG9yIHdhcyBhdmFpbGFibGUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfc29ja2V0X2ZkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqZmRfcCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgaWYgKHRyYW5zcG9ydC0+dnRhYmxlLT5nZXRfc29ja2V0X2ZkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKworICByZXR2YWwgPSAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+Z2V0X3NvY2tldF9mZCkgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9wKTsKKyAgCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFBlcmZvcm1zIGEgc2luZ2xlIHBvbGwoKS9zZWxlY3QoKSBvbiB0aGUgdHJhbnNwb3J0J3MgZmlsZQorICogZGVzY3JpcHRvcnMgYW5kIHRoZW4gcmVhZHMvd3JpdGVzIGRhdGEgYXMgYXBwcm9wcmlhdGUsCisgKiBxdWV1ZWluZyBpbmNvbWluZyBtZXNzYWdlcyBhbmQgc2VuZGluZyBvdXRnb2luZyBtZXNzYWdlcy4KKyAqIFRoaXMgaXMgdGhlIGJhY2tlbmQgZm9yIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uKCkuCisgKiBTZWUgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb24oKSBmb3IgZnVsbCBkZXRhaWxzLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSBmbGFncyBpbmRpY2F0ZXMgd2hldGhlciB0byByZWFkIG9yIHdyaXRlLCBhbmQgd2hldGhlciB0byBibG9jay4KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBpZiBibG9ja2luZywgdGltZW91dCBvciAtMSBmb3Igbm8gdGltZW91dC4KKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X2RvX2l0ZXJhdGlvbiAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnZ0YWJsZS0+ZG9faXRlcmF0aW9uICE9IE5VTEwpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUcmFuc3BvcnQgaXRlcmF0aW9uIGZsYWdzIDB4JXggdGltZW91dCAlZCBjb25uZWN0ZWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgZmxhZ3MsIHRpbWVvdXRfbWlsbGlzZWNvbmRzLCAhdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpOworICAKKyAgaWYgKChmbGFncyAmIChEQlVTX0lURVJBVElPTl9ET19XUklUSU5HIHwKKyAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HKSkgPT0gMCkKKyAgICByZXR1cm47IC8qIE5vdGhpbmcgdG8gZG8gKi8KKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5kb19pdGVyYXRpb24pICh0cmFuc3BvcnQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgX2RidXNfdmVyYm9zZSAoImVuZFxuIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVjb3Zlcl91bnVzZWRfYnl0ZXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKF9kYnVzX2F1dGhfbmVlZHNfZGVjb2RpbmcgKHRyYW5zcG9ydC0+YXV0aCkpCisgICAgeworICAgICAgREJ1c1N0cmluZyBwbGFpbnRleHQ7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICplbmNvZGVkOworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworICAgICAgaW50IG9yaWdfbGVuOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGxhaW50ZXh0KSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIAorICAgICAgX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGVkKTsKKworICAgICAgaWYgKCFfZGJ1c19hdXRoX2RlY29kZV9kYXRhICh0cmFuc3BvcnQtPmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWQsICZwbGFpbnRleHQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKTsKKyAgICAgIAorICAgICAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnBsYWludGV4dCwgMCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ19sZW4pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIiAlZCB1bnVzZWQgYnl0ZXMgc2VudCB0byBtZXNzYWdlIGxvYWRlclxuIiwgCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSAtCisgICAgICAgICAgICAgICAgICAgICBvcmlnX2xlbik7CisgICAgICAKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ19sZW4pOworCisgICAgICBfZGJ1c19hdXRoX2RlbGV0ZV91bnVzZWRfYnl0ZXMgKHRyYW5zcG9ydC0+YXV0aCk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICpieXRlczsKKyAgICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgICAgIGludCBvcmlnX2xlbjsKKyAgICAgIGRidXNfYm9vbF90IHN1Y2NlZWRlZDsKKworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKKworICAgICAgc3VjY2VlZGVkID0gVFJVRTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGJ5dGVzLCAwLCBidWZmZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpKSkKKyAgICAgICAgc3VjY2VlZGVkID0gRkFMU0U7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJWQgdW51c2VkIGJ5dGVzIHNlbnQgdG8gbWVzc2FnZSBsb2FkZXJcbiIsIAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAgb3JpZ19sZW4pOworICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfbGVuKTsKKworICAgICAgaWYgKHN1Y2NlZWRlZCkKKyAgICAgICAgX2RidXNfYXV0aF9kZWxldGVfdW51c2VkX2J5dGVzICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgZWxzZQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBfZGJ1c192ZXJib3NlICgiTm90IGVub3VnaCBtZW1vcnkgdG8gdHJhbnNmZXIgdW51c2VkIGJ5dGVzIGZyb20gYXV0aCBjb252ZXJzYXRpb25cbiIpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmVwb3J0cyBvdXIgY3VycmVudCBkaXNwYXRjaCBzdGF0dXMgKHdoZXRoZXIgdGhlcmUncyBidWZmZXJlZAorICogZGF0YSB0byBiZSBxdWV1ZWQgYXMgbWVzc2FnZXMsIG9yIG5vdCwgb3Igd2UgbmVlZCBtZW1vcnkpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgY3VycmVudCBzdGF0dXMKKyAqLworREJ1c0Rpc3BhdGNoU3RhdHVzCitfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBpZiAoX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSA+PSB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUgfHwKKyAgICAgIF9kYnVzX2NvdW50ZXJfZ2V0X3VuaXhfZmRfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcykgPj0gdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcykKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9DT01QTEVURTsgLyogY29tcGxldGUgZm9yIG5vdyAqLworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19hdXRoX2RvX3dvcmsgKHRyYW5zcG9ydC0+YXV0aCkgPT0KKyAgICAgICAgICBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZKQorICAgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKyAgICAgIGVsc2UgaWYgKCFfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKHRyYW5zcG9ydCkpCisgICAgICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0NPTVBMRVRFOworICAgIH0KKworICBpZiAoIXRyYW5zcG9ydC0+dW51c2VkX2J5dGVzX3JlY292ZXJlZCAmJgorICAgICAgIXJlY292ZXJfdW51c2VkX2J5dGVzICh0cmFuc3BvcnQpKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworCisgIHRyYW5zcG9ydC0+dW51c2VkX2J5dGVzX3JlY292ZXJlZCA9IFRSVUU7CisgIAorICBpZiAoIV9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzICh0cmFuc3BvcnQtPmxvYWRlcikpCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BlZWtfbWVzc2FnZSAodHJhbnNwb3J0LT5sb2FkZXIpICE9IE5VTEwpCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfREFUQV9SRU1BSU5TOworICBlbHNlCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfQ09NUExFVEU7Cit9CisKKy8qKgorICogUHJvY2Vzc2VzIGRhdGEgd2UndmUgcmVhZCB3aGlsZSBoYW5kbGluZyBhIHdhdGNoLCBwb3RlbnRpYWxseQorICogY29udmVydGluZyBzb21lIG9mIGl0IHRvIG1lc3NhZ2VzIGFuZCBxdWV1ZWluZyB0aG9zZSBtZXNzYWdlcyBvbgorICogdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBoYWQgZW5vdWdoIG1lbW9yeSB0byBxdWV1ZSBhbGwgbWVzc2FnZXMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiX2RidXNfdHJhbnNwb3J0X3F1ZXVlX21lc3NhZ2VzKClcbiIpOworI2VuZGlmCisgIAorICAvKiBRdWV1ZSBhbnkgbWVzc2FnZXMgKi8KKyAgd2hpbGUgKChzdGF0dXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyAodHJhbnNwb3J0KSkgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgbGluayA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlX2xpbmsgKHRyYW5zcG9ydC0+bG9hZGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgbWVzc2FnZSA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJxdWV1ZWluZyByZWNlaXZlZCBtZXNzYWdlICVwXG4iLCBtZXNzYWdlKTsKKworICAgICAgaWYgKCFfZGJ1c19tZXNzYWdlX2FkZF9jb3VudGVyIChtZXNzYWdlLCB0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcHV0YmFja19tZXNzYWdlX2xpbmsgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgICBzdGF0dXMgPSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBwYXNzIG93bmVyc2hpcCBvZiBsaW5rIGFuZCBtZXNzYWdlIHJlZiB0byBjb25uZWN0aW9uICovCisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmsgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKHRyYW5zcG9ydC0+bG9hZGVyKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ29ycnVwdGVkIG1lc3NhZ2Ugc3RyZWFtLCBkaXNjb25uZWN0aW5nXG4iKTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgIH0KKworICByZXR1cm4gc3RhdHVzICE9IERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHNpemUgdGhlIG1heCBzaXplIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfbWVzc2FnZV9zaXplIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSkKK3sKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3NpemUgKHRyYW5zcG9ydC0+bG9hZGVyLCBzaXplKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIG4gdGhlIG1heCBudW1iZXIgb2YgdW5peCBmZHMgb2YgYSBzaW5nbGUgbWVzc2FnZQorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pCit7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAodHJhbnNwb3J0LT5sb2FkZXIsIG4pOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIG1heCBtZXNzYWdlIHNpemUKKyAqLworbG9uZworX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV9zaXplIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0KQoreworICByZXR1cm4gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3NpemUgKHRyYW5zcG9ydC0+bG9hZGVyKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgbWF4IG1lc3NhZ2UgdW5peCBmZHMKKyAqLworbG9uZworX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAodHJhbnNwb3J0LT5sb2FkZXIpOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF9zaXplKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gc2l6ZSB0aGUgbWF4IHNpemUgb2YgYWxsIGluY29taW5nIG1lc3NhZ2VzCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSkKK3sKKyAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplID0gc2l6ZTsKKyAgX2RidXNfY291bnRlcl9zZXRfbm90aWZ5ICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZV9tZXNzYWdlc19ub3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBuIHRoZSBtYXggdW5peCBmZHMgb2YgYWxsIGluY29taW5nIG1lc3NhZ2VzCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBuKQoreworICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzID0gbjsKKyAgX2RidXNfY291bnRlcl9zZXRfbm90aWZ5ICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZV9tZXNzYWdlc19ub3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgbWF4IGJ5dGVzIGZvciBhbGwgbGl2ZSBtZXNzYWdlcworICovCitsb25nCitfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0KQoreworICByZXR1cm4gdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgbWF4IHVuaXggZmRzIGZvciBhbGwgbGl2ZSBtZXNzYWdlcworICovCitsb25nCitfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHM7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gdWlkIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIHVzZXIgSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVpZCBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHVzZXIgSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF91c2VyIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqdWlkKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisKKyAgKnVpZCA9IF9EQlVTX0lOVDMyX01BWDsgLyogYmV0dGVyIHRoYW4gc29tZSByb290IG9yIHN5c3RlbSB1c2VyIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhc2Ugb2YgYnVncyBpbiB0aGUgY2FsbGVyLiBDYWxsZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5ldmVyIHVzZSB0aGlzIHZhbHVlIG9uIHB1cnBvc2UsIGhvd2V2ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgaWYgKCF0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCkpCisgICAgeworICAgICAgKnVpZCA9IF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoYXV0aF9pZGVudGl0eSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gcGlkIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIHByb2Nlc3MgSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVpZCBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHByb2Nlc3MgSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF9wcm9jZXNzX2lkIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICpwaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqcGlkID0gREJVU19QSURfVU5TRVQ7IC8qIENhbGxlciBzaG91bGQgbmV2ZXIgdXNlIHRoaXMgdmFsdWUgb24gcHVycG9zZSwKKwkJCSAgKiBidXQgd2Ugc2V0IGl0IHRvIGEgc2FmZSBudW1iZXIsIElOVF9NQVgsCisJCQkgICoganVzdCB0byByb290IG91dCBwb3NzaWJsZSBidWdzIGluIGJhZCBjYWxsZXJzLgorCQkJICAqLworICAKKyAgaWYgKCF0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCkpCisgICAgeworICAgICAgKnBpZCA9IF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3BpZCAoYXV0aF9pZGVudGl0eSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGRhdGEgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgQURUIGF1ZGl0IGRhdGEgCisgKiBAcGFyYW0gZGF0YV9zaXplIHJldHVybiBsZW5ndGggb2YgYXVkaXQgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgYXVkaXQgZGF0YSBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHVjcmVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKERCdXNUcmFuc3BvcnQgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqZGF0YV9zaXplKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisKKyAgKmRhdGEgPSBOVUxMOworICAqZGF0YV9zaXplID0gMDsKKyAgCisgIGlmICghdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoYXV0aF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCkpCisgICAgeworICAgICAgKmRhdGEgPSAodm9pZCAqKSBfZGJ1c19jcmVkZW50aWFsc19nZXRfYWR0X2F1ZGl0X2RhdGEgKGF1dGhfaWRlbnRpdHkpOworICAgICAgKmRhdGFfc2l6ZSA9IF9kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YV9zaXplIChhdXRoX2lkZW50aXR5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24oKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKiBAcGFyYW0gb2xkX2RhdGEgdGhlIG9sZCB1c2VyIGRhdGEgdG8gYmUgZnJlZWQKKyAqIEBwYXJhbSBvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uIG9sZCBmcmVlIGRhdGEgZnVuY3Rpb24gdG8gZnJlZSBpdCB3aXRoCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAqb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbikKK3sgIAorICAqb2xkX2RhdGEgPSB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhOworICAqb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbiA9IHRyYW5zcG9ydC0+ZnJlZV91bml4X3VzZXJfZGF0YTsKKworICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9mdW5jdGlvbiA9IGZ1bmN0aW9uOworICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhID0gZGF0YTsKKyAgdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlcigpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHdpbmRvd3Nfc2lkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdXNlciBpcyBhdmFpbGFibGU7IHRoZSByZXR1cm5lZCB2YWx1ZSBtYXkgc3RpbGwgYmUgI05VTEwgaWYgbm8gbWVtb3J5IHRvIGNvcHkgaXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfd2luZG93c191c2VyIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKip3aW5kb3dzX3NpZF9wKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisKKyAgKndpbmRvd3Nfc2lkX3AgPSBOVUxMOworICAKKyAgaWYgKCF0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSkKKyAgICB7CisgICAgICAvKiBJZiBubyBtZW1vcnksIHdlIGFyZSBzdXBwb3NlZCB0byByZXR1cm4gVFJVRSBhbmQgc2V0IE5VTEwgKi8KKyAgICAgICp3aW5kb3dzX3NpZF9wID0gX2RidXNfc3RyZHVwIChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKGF1dGhfaWRlbnRpdHkpKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbigpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqIEBwYXJhbSBvbGRfZGF0YSB0aGUgb2xkIHVzZXIgZGF0YSB0byBiZSBmcmVlZAorICogQHBhcmFtIG9sZF9mcmVlX2RhdGFfZnVuY3Rpb24gb2xkIGZyZWUgZGF0YSBmdW5jdGlvbiB0byBmcmVlIGl0IHdpdGgKKyAqLworCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgKm9sZF9mcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgICpvbGRfZGF0YSA9IHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGE7CisgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uID0gdHJhbnNwb3J0LT5mcmVlX3dpbmRvd3NfdXNlcl9kYXRhOworCisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGEgPSBkYXRhOworICB0cmFuc3BvcnQtPmZyZWVfd2luZG93c191c2VyX2RhdGEgPSBmcmVlX2RhdGFfZnVuY3Rpb247Cit9CisKKy8qKgorICogU2V0cyB0aGUgU0FTTCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBieSB0aGlzIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBtZWNoYW5pc21zIHRoZSAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIG1lY2hhbmlzbXMKKyAqCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICoqbWVjaGFuaXNtcykKK3sKKyAgcmV0dXJuIF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMgKHRyYW5zcG9ydC0+YXV0aCwgbWVjaGFuaXNtcyk7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzKCkKKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSB2YWx1ZSAjVFJVRSB0byBhbGxvdyBhbm9ueW1vdXMgY29ubmVjdGlvbgorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X2FsbG93X2Fub255bW91cyAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisgIHRyYW5zcG9ydC0+YWxsb3dfYW5vbnltb3VzID0gdmFsdWUgIT0gRkFMU0U7Cit9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjA0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQuaCBEQnVzVHJhbnNwb3J0IG9iamVjdCAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19UUkFOU1BPUlRfSAorI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtYWRkcmVzcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNUcmFuc3BvcnQgREJ1c1RyYW5zcG9ydDsKKworREJ1c1RyYW5zcG9ydCogICAgIF9kYnVzX3RyYW5zcG9ydF9vcGVuICAgICAgICAgICAgICAgICAgIChEQnVzQWRkcmVzc0VudHJ5ICAgICAgICAgICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICplcnJvcik7CitEQnVzVHJhbnNwb3J0KiAgICAgX2RidXNfdHJhbnNwb3J0X3JlZiAgICAgICAgICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAgICAgICAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAgICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Fub255bW91cyAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCitjb25zdCBjaGFyKiAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9hZGRyZXNzICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworY29uc3QgY2hhciogICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfc2VydmVyX2lkICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfaGFuZGxlX3dhdGNoICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgY29uZGl0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X2Nvbm5lY3Rpb24gICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kb19pdGVyYXRpb24gICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQnVzRGlzcGF0Y2hTdGF0dXMgX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKKwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV9zaXplICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3NpemUgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbik7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbik7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CisKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3NvY2tldF9mZCAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgKmZkX3ApOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF91c2VyICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqdWlkKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfcHJvY2Vzc19pZCAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICpwaWQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKipkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF91bml4X3VzZXJfZnVuY3Rpb24gKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgKm9sZF9mcmVlX2RhdGFfZnVuY3Rpb24pOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfd2luZG93c191c2VyICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqd2luZG93c19zaWRfcCk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgKm9sZF9mcmVlX2RhdGFfZnVuY3Rpb24pOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfYXV0aF9tZWNoYW5pc21zICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICoqbWVjaGFuaXNtcyk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9hbGxvd19hbm9ueW1vdXMgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICB2YWx1ZSk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy10eXBlcy5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmMzQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy10eXBlcy5oCkBAIC0wLDAgKzEsMTM5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHlwZXMuaCAgdHlwZXMgc3VjaCBhcyBkYnVzX2Jvb2xfdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1RZUEVTX0gKKyNkZWZpbmUgREJVU19UWVBFU19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtYXJjaC1kZXBzLmg+CisKK3R5cGVkZWYgZGJ1c191aW50MzJfdCAgZGJ1c191bmljaGFyX3Q7CisvKiBib29sZWFuIHNpemUgbXVzdCBiZSBmaXhlZCBhdCA0IGJ5dGVzIGR1ZSB0byB3aXJlIHByb3RvY29sISAqLwordHlwZWRlZiBkYnVzX3VpbnQzMl90ICBkYnVzX2Jvb2xfdDsKKworLyogTm9ybWFsbHkgZG9jcyBhcmUgaW4gLmMgZmlsZXMsIGJ1dCB0aGVyZSBpc24ndCBhIC5jIGZpbGUgZm9yIHRoaXMuICovCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHlwZXMgQmFzaWMgdHlwZXMKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgZGJ1c19ib29sX3QsIGRidXNfaW50MzJfdCwgZXRjLgorICoKKyAqIFR5cGVkZWZzIGZvciBjb21tb24gcHJpbWl0aXZlIHR5cGVzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX2Jvb2xfdAorICoKKyAqIEEgYm9vbGVhbiwgdmFsaWQgdmFsdWVzIGFyZSAjVFJVRSBhbmQgI0ZBTFNFLgorICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c191aW50MzJfdAorICoKKyAqIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHBsYXRmb3Jtcy4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfaW50MzJfdAorICoKKyAqIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBwbGF0Zm9ybXMuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX3VpbnQxNl90CisgKgorICogQSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zLgorICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c19pbnQxNl90CisgKgorICogQSAxNi1iaXQgc2lnbmVkIGludGVnZXIgb24gYWxsIHBsYXRmb3Jtcy4KKyAqLworCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c191aW50NjRfdAorICoKKyAqIEEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQuCisgKiBJZiBzdXBwb3J0ZWQsICNEQlVTX0hBVkVfSU5UNjQgd2lsbCBiZSBkZWZpbmVkLgorICoKKyAqIEM5OSByZXF1aXJlcyBhIDY0LWJpdCB0eXBlIGFuZCBtb3N0IGxpa2VseSBhbGwgaW50ZXJlc3RpbmcKKyAqIGNvbXBpbGVycyBzdXBwb3J0IG9uZS4gR0xpYiBmb3IgZXhhbXBsZSBmbGF0LW91dCByZXF1aXJlcworICogYSA2NC1iaXQgdHlwZS4KKyAqCisgKiBZb3UgcHJvYmFibHkgd2FudCB0byBqdXN0IGFzc3VtZSAjREJVU19IQVZFX0lOVDY0IGlzIGFsd2F5cyBkZWZpbmVkLgorICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c19pbnQ2NF90CisgKgorICogQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQuCisgKiBJZiBzdXBwb3J0ZWQsICNEQlVTX0hBVkVfSU5UNjQgd2lsbCBiZSBkZWZpbmVkLgorICoKKyAqIEM5OSByZXF1aXJlcyBhIDY0LWJpdCB0eXBlIGFuZCBtb3N0IGxpa2VseSBhbGwgaW50ZXJlc3RpbmcKKyAqIGNvbXBpbGVycyBzdXBwb3J0IG9uZS4gR0xpYiBmb3IgZXhhbXBsZSBmbGF0LW91dCByZXF1aXJlcworICogYSA2NC1iaXQgdHlwZS4KKyAqIAorICogWW91IHByb2JhYmx5IHdhbnQgdG8ganVzdCBhc3N1bWUgI0RCVVNfSEFWRV9JTlQ2NCBpcyBhbHdheXMgZGVmaW5lZC4KKyAqLworCisvKioKKyAqIEBkZWYgREJVU19IQVZFX0lOVDY0CisgKgorICogRGVmaW5lZCBpZiA2NC1iaXQgaW50ZWdlcnMgYXJlIGF2YWlsYWJsZS4gV2lsbCBiZSBkZWZpbmVkCisgKiBvbiBhbnkgcGxhdGZvcm0geW91IGNhcmUgYWJvdXQsIHVubGVzcyB5b3UgY2FyZSBhYm91dAorICogc29tZSB0cnVseSBhbmNpZW50IFVOSVgsIG9yIHNvbWUgYml6YXJyZSBlbWJlZGRlZCBwbGF0Zm9ybS4KKyAqCisgKiBDOTkgcmVxdWlyZXMgYSA2NC1iaXQgdHlwZSBhbmQgbW9zdCBsaWtlbHkgYWxsIGludGVyZXN0aW5nCisgKiBjb21waWxlcnMgc3VwcG9ydCBvbmUuIEdMaWIgZm9yIGV4YW1wbGUgZmxhdC1vdXQgcmVxdWlyZXMKKyAqIGEgNjQtYml0IHR5cGUuCisgKgorICogWW91IHNob3VsZCBmZWVsIGNvbWZvcnRhYmxlIGlnbm9yaW5nIHRoaXMgbWFjcm8gYW5kIGp1c3QgdXNpbmcKKyAqIGludDY0IHVuY29uZGl0aW9uYWxseS4KKyAqIAorICovCisKKy8qKgorICogQGRlZiBEQlVTX0lOVDY0X0NPTlNUQU5UCisgKgorICogRGVjbGFyZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBjb25zdGFudC4gVGhlIG1hY3JvCisgKiBhZGRzIHRoZSBuZWNlc3NhcnkgIkxMIiBvciB3aGF0ZXZlciBhZnRlciB0aGUgaW50ZWdlciwKKyAqIGdpdmluZyBhIGxpdGVyYWwgc3VjaCBhcyAiMzI1MTQ1MjQ2NzY1TEwiCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVUlOVDY0X0NPTlNUQU5UCisgKgorICogRGVjbGFyZSBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50LiBUaGUgbWFjcm8KKyAqIGFkZHMgdGhlIG5lY2Vzc2FyeSAiVUxMIiBvciB3aGF0ZXZlciBhZnRlciB0aGUgaW50ZWdlciwKKyAqIGdpdmluZyBhIGxpdGVyYWwgc3VjaCBhcyAiMzI1MTQ1MjQ2NzY1VUxMIgorICovCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19UWVBFU19IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXNlcmRiLXV0aWwuYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy11c2VyZGItdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGMwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXNlcmRiLXV0aWwuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXVzZXJkYi11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy11c2VyZGIuYywgYnV0IG5vdCB1c2VkIGluIGxpYmRidXMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZGVmaW5lIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtdXNlcmRiLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0ludGVybmFsc1V0aWxzCisgKiBAeworICovCisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVUlEIHNlbnQgaW4gaXMgdGhlIGNvbnNvbGUgdXNlcgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19pc19jb25zb2xlX3VzZXIgKGRidXNfdWlkX3QgdWlkLAorCQkgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICBkYnVzX2Jvb2xfdCByZXN1bHQgPSBGQUxTRTsgCisKKyNpZmRlZiBIQVZFX0NPTlNPTEVfT1dORVJfRklMRQorCisgIERCdXNTdHJpbmcgZjsKKyAgREJ1c1N0YXQgc3Q7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmYpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKCZmLCBEQlVTX0NPTlNPTEVfT1dORVJfRklMRSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJmYpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RhdCgmZiwgJnN0LCBOVUxMKSAmJiAoc3QudWlkID09IHVpZCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJmYpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlKCZmKTsKKworI2VuZGlmIC8qIEhBVkVfQ09OU09MRV9PV05FUl9GSUxFICovCisKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkNvdWxkIG5vdCBnZXQgc3lzdGVtIGRhdGFiYXNlLiIpOworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBUUFREOiB0aGlzIHNob3VsZCBiZSBjYWNoZS1zYWZlLCB3ZSd2ZSBsb2NrZWQgdGhlIERCIGFuZAorICAgIF9kYnVzX3VzZXJfYXRfY29uc29sZSBkb2Vzbid0IHBhc3MgaXQgb24uICovCisgIGluZm8gPSBfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCAoZGIsIHVpZCwgTlVMTCwgZXJyb3IpOworCisgIGlmIChpbmZvID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmVzdWx0ID0gX2RidXNfdXNlcl9hdF9jb25zb2xlIChpbmZvLT51c2VybmFtZSwgZXJyb3IpOworCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEdldHMgdXNlciBJRCBnaXZlbiB1c2VybmFtZQorICoKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUKKyAqIEBwYXJhbSB1aWQgcmV0dXJuIGxvY2F0aW9uIGZvciBVSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCB0aGUgVUlECisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfdXNlcl9pZCAoY29uc3QgREJ1c1N0cmluZyAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWQpCit7CisgIHJldHVybiBfZGJ1c19nZXRfdXNlcl9pZF9hbmRfcHJpbWFyeV9ncm91cCAodXNlcm5hbWUsIHVpZCwgTlVMTCk7Cit9CisKKy8qKgorICogR2V0cyBncm91cCBJRCBnaXZlbiBncm91cG5hbWUKKyAqCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cG5hbWUKKyAqIEBwYXJhbSBnaWQgcmV0dXJuIGxvY2F0aW9uIGZvciBHSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIGdyb3VwIG5hbWUgZXhpc3RlZCBhbmQgd2UgZ290IHRoZSBHSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9ncm91cF9pZCAoY29uc3QgREJ1c1N0cmluZyAgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZCkKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNHcm91cEluZm8gKmluZm87CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9ncm91cG5hbWUgKGRiLCBncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqZ2lkID0gaW5mby0+Z2lkOworICAKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHVzZXIgSUQgYW5kIHByaW1hcnkgZ3JvdXAgZ2l2ZW4gdXNlcm5hbWUKKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lCisgKiBAcGFyYW0gdWlkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciBVSUQKKyAqIEBwYXJhbSBnaWRfcCByZXR1cm4gbG9jYXRpb24gZm9yIEdJRAorICogQHJldHVybnMgI1RSVUUgaWYgdXNlcm5hbWUgZXhpc3RlZCBhbmQgd2UgZ290IHRoZSBVSUQgYW5kIEdJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICBfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpOworCisgIGRiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICgpOworICBpZiAoZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdXNlcm5hbWUgKGRiLCB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHVpZF9wKQorICAgICp1aWRfcCA9IGluZm8tPnVpZDsKKyAgaWYgKGdpZF9wKQorICAgICpnaWRfcCA9IGluZm8tPnByaW1hcnlfZ2lkOworICAKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMb29rcyB1cCBhIGdpZCBvciBncm91cCBuYW1lIGluIHRoZSB1c2VyIGRhdGFiYXNlLiAgT25seSBvbmUgb2YKKyAqIG5hbWUgb3IgR0lEIGNhbiBiZSBwcm92aWRlZC4gVGhlcmUgYXJlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGlzCisgKiB0aGF0IGFyZSBiZXR0ZXIgdG8gdXNlLCB0aGlzIG9uZSBkb2VzIG5vIGxvY2tpbmcgb3IgYW55dGhpbmcgb24gdGhlCisgKiBkYXRhYmFzZSBhbmQgb3RoZXJ3aXNlIHNvcnQgb2Ygc3Vja3MuCisgKgorICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZQorICogQHBhcmFtIGdpZCB0aGUgZ3JvdXAgSUQgb3IgI0RCVVNfR0lEX1VOU0VUCisgKiBAcGFyYW0gZ3JvdXBuYW1lIGdyb3VwIG5hbWUgb3IgI05VTEwgCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gZmlsbCBpbgorICogQHJldHVybnMgdGhlIGVudHJ5IGluIHRoZSBkYXRhYmFzZQorICovCitEQnVzR3JvdXBJbmZvKgorX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXAgKERCdXNVc2VyRGF0YWJhc2UgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNHcm91cEluZm8gKmluZm87CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgIC8qIFNlZSBpZiB0aGUgZ3JvdXAgaXMgcmVhbGx5IGEgbnVtYmVyICovCisgICBpZiAoZ2lkID09IERCVVNfVUlEX1VOU0VUKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbjsKKworICAgICAgaWYgKF9kYnVzX2lzX2FfbnVtYmVyIChncm91cG5hbWUsICZuKSkKKyAgICAgICAgZ2lkID0gbjsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9VU0VSREJfQ0FDSEUKKyAgaWYgKGdpZCAhPSBEQlVTX0dJRF9VTlNFVCkKKyAgICBpbmZvID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAoZGItPmdyb3VwcywgZ2lkKTsKKyAgZWxzZQorICAgIGluZm8gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGRiLT5ncm91cHNfYnlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGdyb3VwbmFtZSkpOworICBpZiAoaW5mbykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiVXNpbmcgY2FjaGUgZm9yIEdJRCAiREJVU19HSURfRk9STUFUIiBpbmZvcm1hdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdpZCk7CisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgIGVsc2UKKyNlbHNlCisgIGlmICgxKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKGdpZCAhPSBEQlVTX0dJRF9VTlNFVCkKKwlfZGJ1c192ZXJib3NlICgiTm8gY2FjaGUgZm9yIEdJRCAiREJVU19HSURfRk9STUFUIlxuIiwKKwkJICAgICAgIGdpZCk7CisgICAgICBlbHNlCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciBncm91cG5hbWUgXCIlc1wiXG4iLAorCQkgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChncm91cG5hbWUpKTsKKyAgICAgIAorICAgICAgaW5mbyA9IGRidXNfbmV3MCAoREJ1c0dyb3VwSW5mbywgMSk7CisgICAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGdpZCAhPSBEQlVTX0dJRF9VTlNFVCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfZ3JvdXBfaW5mb19maWxsX2dpZCAoaW5mbywgZ2lkLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2dyb3VwX2luZm9fZmlsbCAoaW5mbywgZ3JvdXBuYW1lLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIGRvbid0IHVzZSB0aGVzZSBwYXN0IGhlcmUgKi8KKyAgICAgIGdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgZ3JvdXBuYW1lID0gTlVMTDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF91aW50cHRyIChkYi0+Z3JvdXBzLCBpbmZvLT5naWQsIGluZm8pKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoZGItPmdyb3Vwc19ieV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3VpbnRwdHIgKGRiLT5ncm91cHMsIGluZm8tPmdpZCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIGluZm87CisgICAgfQorfQorCisKKy8qKgorICogR2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGdyb3VwIG5hbWUsCisgKiByZXR1cm5lZCBncm91cCBpbmZvIHNob3VsZCBub3QgYmUgZnJlZWQuIAorICoKKyAqIEBwYXJhbSBkYiB1c2VyIGRhdGFiYXNlCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cCBuYW1lCisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byBncm91cCBpbmZvCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwbmFtZSAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR3JvdXBJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKQoreworICAqaW5mbyA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwX2dyb3VwIChkYiwgREJVU19HSURfVU5TRVQsIGdyb3VwbmFtZSwgZXJyb3IpOworICByZXR1cm4gKmluZm8gIT0gTlVMTDsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gR0lELAorICogcmV0dXJuZWQgZ3JvdXAgaW5mbyBzaG91bGQgbm90IGJlIGZyZWVkLiAKKyAqCisgKiBAcGFyYW0gZGIgdXNlciBkYXRhYmFzZQorICogQHBhcmFtIGdpZCB0aGUgZ3JvdXAgSUQKKyAqIEBwYXJhbSBpbmZvIHJldHVybiBsb2NhdGlvbiBmb3IgY29uc3QgcmVmIHRvIGdyb3VwIGluZm8KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ2lkIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNHcm91cEluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgICppbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXAgKGRiLCBnaWQsIE5VTEwsIGVycm9yKTsKKyAgcmV0dXJuICppbmZvICE9IE5VTEw7Cit9CisKKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVJRC4gUmV0dXJucyAjRkFMU0UKKyAqIGlmIG5vIG1lbW9yeSwgb3IgdXNlciBpc24ndCBrbm93biwgYnV0IGFsd2F5cyBpbml0aWFsaXplcworICogZ3JvdXBfaWRzIHRvIGEgTlVMTCBhcnJheS4gCisgKgorICogQHBhcmFtIHVpZCB0aGUgVUlECisgKiBAcGFyYW0gZ3JvdXBfaWRzIHJldHVybiBsb2NhdGlvbiBmb3IgYXJyYXkgb2YgZ3JvdXAgSURzCisgKiBAcGFyYW0gbl9ncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBsZW5ndGggb2YgcmV0dXJuZWQgYXJyYXkKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBVSUQgZXhpc3RlZCBhbmQgd2UgZ290IHNvbWUgY3JlZGVudGlhbHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dyb3Vwc19mcm9tX3VpZCAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKm5fZ3JvdXBfaWRzKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICAqZ3JvdXBfaWRzID0gTlVMTDsKKyAgKm5fZ3JvdXBfaWRzID0gMDsKKworICBfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpOworCisgIGRiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICgpOworICBpZiAoZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdWlkIChkYiwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpbmZvLT51aWQgPT0gdWlkKTsKKyAgCisgIGlmIChpbmZvLT5uX2dyb3VwX2lkcyA+IDApCisgICAgeworICAgICAgKmdyb3VwX2lkcyA9IGRidXNfbmV3IChkYnVzX2dpZF90LCBpbmZvLT5uX2dyb3VwX2lkcyk7CisgICAgICBpZiAoKmdyb3VwX2lkcyA9PSBOVUxMKQorICAgICAgICB7CisJICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICpuX2dyb3VwX2lkcyA9IGluZm8tPm5fZ3JvdXBfaWRzOworCisgICAgICBtZW1jcHkgKCpncm91cF9pZHMsIGluZm8tPmdyb3VwX2lkcywgaW5mby0+bl9ncm91cF9pZHMgKiBzaXplb2YgKGRidXNfZ2lkX3QpKTsKKyAgICB9CisKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICByZXR1cm4gVFJVRTsKK30KKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19CVUlMRF9URVNUUworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBkYnVzLXVzZXJkYi5jLgorICogCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcmRiX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lOworICBjb25zdCBEQnVzU3RyaW5nICpob21lZGlyOworICBkYnVzX3VpZF90IHVpZDsKKyAgdW5zaWduZWQgbG9uZyAqZ3JvdXBfaWRzOworICBpbnQgbl9ncm91cF9pZHMsIGk7CisKKyAgaWYgKCFfZGJ1c191c2VybmFtZV9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZ2V0IHVzZXJuYW1lIik7CisKKyAgaWYgKCFfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzICgmaG9tZWRpcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGdldCBob21lZGlyIik7ICAKKworICBpZiAoIV9kYnVzX2dldF91c2VyX2lkICh1c2VybmFtZSwgJnVpZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGdldCB1aWQiKTsKKworICBpZiAoIV9kYnVzX2dyb3Vwc19mcm9tX3VpZCAodWlkLCAmZ3JvdXBfaWRzLCAmbl9ncm91cF9pZHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgZ3JvdXBzIik7CisKKyAgcHJpbnRmICgiICAgIEN1cnJlbnQgdXNlcjogJXMgaG9tZWRpcjogJXMgZ2lkczoiLAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodXNlcm5hbWUpLAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoaG9tZWRpcikpOworCisgIGZvciAoaT0wOyBpPG5fZ3JvdXBfaWRzOyBpKyspCisgICAgICBwcmludGYoIiAlbGQiLCBncm91cF9pZHNbaV0pOworCisgIHByaW50ZiAoIlxuIik7CisgCisgIGRidXNfZnJlZSAoZ3JvdXBfaWRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXNlcmRiLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXNlcmRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4YjM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy11c2VyZGIuYwpAQCAtMCwwICsxLDY2OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXVzZXJkYi5jIFVzZXIgZGF0YWJhc2UgYWJzdHJhY3Rpb24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZGVmaW5lIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtdXNlcmRiLmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNJbnRlcm5hbHNVdGlscworICogQHsKKyAqLworCisvKioKKyAqIEZyZWVzIHRoZSBnaXZlbiAjREJ1c1VzZXJJbmZvJ3MgbWVtYmVycyB3aXRoIF9kYnVzX3VzZXJfaW5mb19mcmVlKCkKKyAqIGFuZCBhbHNvIGNhbGxzIGRidXNfZnJlZSgpIG9uIHRoZSBibG9jayBpdHNlbGYKKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgaW5mbworICovCit2b2lkCitfZGJ1c191c2VyX2luZm9fZnJlZV9hbGxvY2F0ZWQgKERCdXNVc2VySW5mbyAqaW5mbykKK3sKKyAgaWYgKGluZm8gPT0gTlVMTCkgLyogaGFzaCB0YWJsZSB3aWxsIHBhc3MgTlVMTCAqLworICAgIHJldHVybjsKKworICBfZGJ1c191c2VyX2luZm9fZnJlZSAoaW5mbyk7CisgIGRidXNfZnJlZSAoaW5mbyk7Cit9CisKKy8qKgorICogRnJlZXMgdGhlIGdpdmVuICNEQnVzR3JvdXBJbmZvJ3MgbWVtYmVycyB3aXRoIF9kYnVzX2dyb3VwX2luZm9fZnJlZSgpCisgKiBhbmQgYWxzbyBjYWxscyBkYnVzX2ZyZWUoKSBvbiB0aGUgYmxvY2sgaXRzZWxmCisgKgorICogQHBhcmFtIGluZm8gdGhlIGluZm8KKyAqLwordm9pZAorX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAoREJ1c0dyb3VwSW5mbyAqaW5mbykKK3sKKyAgaWYgKGluZm8gPT0gTlVMTCkgLyogaGFzaCB0YWJsZSB3aWxsIHBhc3MgTlVMTCAqLworICAgIHJldHVybjsKKworICBfZGJ1c19ncm91cF9pbmZvX2ZyZWUgKGluZm8pOworICBkYnVzX2ZyZWUgKGluZm8pOworfQorCisvKioKKyAqIEZyZWVzIHRoZSBtZW1iZXJzIG9mIGluZm8KKyAqIChidXQgbm90IGluZm8gaXRzZWxmKQorICogQHBhcmFtIGluZm8gdGhlIHVzZXIgaW5mbyBzdHJ1Y3QKKyAqLwordm9pZAorX2RidXNfdXNlcl9pbmZvX2ZyZWUgKERCdXNVc2VySW5mbyAqaW5mbykKK3sKKyAgZGJ1c19mcmVlIChpbmZvLT5ncm91cF9pZHMpOworICBkYnVzX2ZyZWUgKGluZm8tPnVzZXJuYW1lKTsKKyAgZGJ1c19mcmVlIChpbmZvLT5ob21lZGlyKTsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgbWVtYmVycyBvZiBpbmZvIChidXQgbm90IGluZm8gaXRzZWxmKS4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbworICovCit2b2lkCitfZGJ1c19ncm91cF9pbmZvX2ZyZWUgKERCdXNHcm91cEluZm8gICAgKmluZm8pCit7CisgIGRidXNfZnJlZSAoaW5mby0+Z3JvdXBuYW1lKTsKK30KKworLyoqCisgKiBDaGVja3MgaWYgYSBnaXZlbiBzdHJpbmcgaXMgYWN0dWFsbHkgYSBudW1iZXIgCisgKiBhbmQgY29udmVydHMgaXQgaWYgaXQgaXMgCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGNoZWNrCisgKiBAcGFyYW0gbnVtIHRoZSBtZW1vcnkgbG9jYXRpb24gb2YgdGhlIHVuc2lnbmVkIGxvbmcgdG8gZmlsbCBpbgorICogQHJldHVybnMgVFJVRSBpZiBzdHIgaXMgYSBudW1iZXIgYW5kIG51bSBpcyBmaWxsZWQgaW4gCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19pc19hX251bWJlciAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgKm51bSkKK3sKKyAgaW50IGVuZDsKKworICBpZiAoX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKHN0ciwgMCwgbnVtLCAmZW5kKSAmJgorICAgICAgZW5kID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIExvb2tzIHVwIGEgdWlkIG9yIHVzZXJuYW1lIGluIHRoZSB1c2VyIGRhdGFiYXNlLiAgT25seSBvbmUgb2YgbmFtZQorICogb3IgVUlEIGNhbiBiZSBwcm92aWRlZC4gVGhlcmUgYXJlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGlzIHRoYXQKKyAqIGFyZSBiZXR0ZXIgdG8gdXNlLCB0aGlzIG9uZSBkb2VzIG5vIGxvY2tpbmcgb3IgYW55dGhpbmcgb24gdGhlCisgKiBkYXRhYmFzZSBhbmQgb3RoZXJ3aXNlIHNvcnQgb2Ygc3Vja3MuCisgKgorICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZQorICogQHBhcmFtIHVpZCB0aGUgdXNlciBJRCBvciAjREJVU19VSURfVU5TRVQKKyAqIEBwYXJhbSB1c2VybmFtZSB1c2VybmFtZSBvciAjTlVMTCAKKyAqIEBwYXJhbSBlcnJvciBlcnJvciB0byBmaWxsIGluCisgKiBAcmV0dXJucyB0aGUgZW50cnkgaW4gdGhlIGRhdGFiYXNlCisgKi8KK0RCdXNVc2VySW5mbyoKK19kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwIChEQnVzVXNlckRhdGFiYXNlICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNVc2VySW5mbyAqaW5mbzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX2RidXNfYXNzZXJ0ICh1aWQgIT0gREJVU19VSURfVU5TRVQgfHwgdXNlcm5hbWUgIT0gTlVMTCk7CisKKyAgLyogU2VlIGlmIHRoZSB1c2VybmFtZSBpcyByZWFsbHkgYSBudW1iZXIgKi8KKyAgaWYgKHVpZCA9PSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIG47CisKKyAgICAgIGlmIChfZGJ1c19pc19hX251bWJlciAodXNlcm5hbWUsICZuKSkKKyAgICAgICAgdWlkID0gbjsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9VU0VSREJfQ0FDSEUgIAorICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgIGluZm8gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChkYi0+dXNlcnMsIHVpZCk7CisgIGVsc2UKKyAgICBpbmZvID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChkYi0+dXNlcnNfYnlfbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1c2VybmFtZSkpOworCisgIGlmIChpbmZvKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2luZyBjYWNoZSBmb3IgVUlEICJEQlVTX1VJRF9GT1JNQVQiIGluZm9ybWF0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dWlkKTsKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgZWxzZQorI2Vsc2UgCisgIGlmICgxKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKwlfZGJ1c192ZXJib3NlICgiTm8gY2FjaGUgZm9yIFVJRCAiREJVU19VSURfRk9STUFUIlxuIiwKKwkJICAgICAgIHVpZCk7CisgICAgICBlbHNlCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciB1c2VyIFwiJXNcIlxuIiwKKwkJICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodXNlcm5hbWUpKTsKKyAgICAgIAorICAgICAgaW5mbyA9IGRidXNfbmV3MCAoREJ1c1VzZXJJbmZvLCAxKTsKKyAgICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c191c2VyX2luZm9fZmlsbF91aWQgKGluZm8sIHVpZCwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3VzZXJfaW5mb19maWxsIChpbmZvLCB1c2VybmFtZSwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIGJlIHN1cmUgd2UgZG9uJ3QgdXNlIHRoZXNlIGFmdGVyIGhlcmUgKi8KKyAgICAgIHVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgdXNlcm5hbWUgPSBOVUxMOworCisgICAgICAvKiBpbnNlcnQgaW50byBoYXNoICovCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGRiLT51c2VycywgaW5mby0+dWlkLCBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19mcmVlX2FsbG9jYXRlZCAoaW5mbyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGRiLT51c2Vyc19ieV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAoZGItPnVzZXJzLCBpbmZvLT51aWQpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90IGRhdGFiYXNlX2xvY2tlZCA9IEZBTFNFOworc3RhdGljIERCdXNVc2VyRGF0YWJhc2UgKnN5c3RlbV9kYiA9IE5VTEw7CitzdGF0aWMgREJ1c1N0cmluZyBwcm9jZXNzX3VzZXJuYW1lOworc3RhdGljIERCdXNTdHJpbmcgcHJvY2Vzc19ob21lZGlyOworICAgICAgCitzdGF0aWMgdm9pZAorc2h1dGRvd25fc3lzdGVtX2RiICh2b2lkICpkYXRhKQoreworICBpZiAoc3lzdGVtX2RiICE9IE5VTEwpCisgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgc3lzdGVtX2RiID0gTlVMTDsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX2hvbWVkaXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfc3lzdGVtX2RiICh2b2lkKQoreworICBfZGJ1c19hc3NlcnQgKGRhdGFiYXNlX2xvY2tlZCk7CisgICAgCisgIGlmIChzeXN0ZW1fZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgICAgICBjb25zdCBEQnVzVXNlckluZm8gKmluZm87CisgICAgICAKKyAgICAgIHN5c3RlbV9kYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbmV3ICgpOworICAgICAgaWYgKHN5c3RlbV9kYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdWlkIChzeXN0ZW1fZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0dWlkICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFRoaXMgcmVhbGx5IHNob3VsZCBub3QgaGFwcGVuLiAqLworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IGdldCBwYXNzd29yZCBkYXRhYmFzZSBpbmZvcm1hdGlvbiBmb3IgVUlEIG9mIGN1cnJlbnQgcHJvY2VzczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcHJvY2Vzc191c2VybmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwcm9jZXNzX2hvbWVkaXIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnByb2Nlc3NfdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnVzZXJuYW1lKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvY2Vzc19ob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5ob21lZGlyKSB8fAorICAgICAgICAgICFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChzaHV0ZG93bl9zeXN0ZW1fZGIsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2Nlc3NfaG9tZWRpcik7CisgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgICAgICAgICBzeXN0ZW1fZGIgPSBOVUxMOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMb2NrcyBnbG9iYWwgc3lzdGVtIHVzZXIgZGF0YWJhc2UuCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKHZvaWQpCit7CisgIF9EQlVTX0xPQ0sgKHN5c3RlbV91c2Vycyk7CisgIGRhdGFiYXNlX2xvY2tlZCA9IFRSVUU7Cit9CisKKy8qKgorICogVW5sb2NrcyBnbG9iYWwgc3lzdGVtIHVzZXIgZGF0YWJhc2UuCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAodm9pZCkKK3sKKyAgZGF0YWJhc2VfbG9ja2VkID0gRkFMU0U7CisgIF9EQlVTX1VOTE9DSyAoc3lzdGVtX3VzZXJzKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBzeXN0ZW0gZ2xvYmFsIHVzZXIgZGF0YWJhc2U7CisgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZCAoX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSgpKS4KKyAqCisgKiBAcmV0dXJucyB0aGUgZGF0YWJhc2Ugb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNVc2VyRGF0YWJhc2UqCitfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZGF0YWJhc2VfbG9ja2VkKTsKKworICBpbml0X3N5c3RlbV9kYiAoKTsKKyAgCisgIHJldHVybiBzeXN0ZW1fZGI7Cit9CisKKy8qKgorICogRmx1c2hlcyB0aGUgc3lzdGVtIGdsb2JhbCB1c2VyIGRhdGFiYXNlOworICovCit2b2lkCitfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoX3N5c3RlbSAodm9pZCkKK3sKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKyAgIAorICAgaWYgKHN5c3RlbV9kYiAhPSBOVUxMKQorICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2ggKHN5c3RlbV9kYik7CisKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworfQorCisvKioKKyAqIEdldHMgdXNlcm5hbWUgb2YgdXNlciBvd25pbmcgY3VycmVudCBwcm9jZXNzLiAgVGhlIHJldHVybmVkIHN0cmluZworICogaXMgdmFsaWQgdW50aWwgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgcGxhY2UgdG8gc3RvcmUgcG9pbnRlciB0byB1c2VybmFtZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNvbnN0IERCdXNTdHJpbmcgKip1c2VybmFtZSkKK3sKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKyAgaWYgKCFpbml0X3N5c3RlbV9kYiAoKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAqdXNlcm5hbWUgPSAmcHJvY2Vzc191c2VybmFtZTsKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOyAgCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyBob21lZGlyIG9mIHVzZXIgb3duaW5nIGN1cnJlbnQgcHJvY2Vzcy4gIFRoZSByZXR1cm5lZCBzdHJpbmcKKyAqIGlzIHZhbGlkIHVudGlsIGRidXNfc2h1dGRvd24oKSBpcyBjYWxsZWQuCisgKgorICogQHBhcmFtIGhvbWVkaXIgcGxhY2UgdG8gc3RvcmUgcG9pbnRlciB0byBob21lZGlyCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzIChjb25zdCBEQnVzU3RyaW5nICAqKmhvbWVkaXIpCit7CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisgIGlmICghaW5pdF9zeXN0ZW1fZGIgKCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgKmhvbWVkaXIgPSAmcHJvY2Vzc19ob21lZGlyOworICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiB1c2VyLgorICoKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUKKyAqIEBwYXJhbSBob21lZGlyIHN0cmluZyB0byBhcHBlbmQgaG9tZSBkaXJlY3RvcnkgdG8KKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXIgZXhpc3RlZCBhbmQgd2UgYXBwZW5kZWQgdGhlaXIgaG9tZWRpcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lIChjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqaG9tZWRpcikKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VzZXJuYW1lIChkYiwgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoaG9tZWRpciwgaW5mby0+aG9tZWRpcikpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiB1c2VyLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIHVpZAorICogQHBhcmFtIGhvbWVkaXIgc3RyaW5nIHRvIGFwcGVuZCBob21lIGRpcmVjdG9yeSB0bworICogQHJldHVybnMgI1RSVUUgaWYgdXNlciBleGlzdGVkIGFuZCB3ZSBhcHBlbmRlZCB0aGVpciBob21lZGlyCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ob21lZGlyX2Zyb21fdWlkIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmhvbWVkaXIpCit7CisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzVXNlckluZm8gKmluZm87CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91aWQgKGRiLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGhvbWVkaXIsIGluZm8tPmhvbWVkaXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIFVzZWQgYW1vbmcgb3RoZXIgcHVycG9zZXMgdG8gcGFyc2VzIGEgZGVzaXJlZCBpZGVudGl0eSBwcm92aWRlZAorICogZnJvbSBhIGNsaWVudCBpbiB0aGUgYXV0aCBwcm90b2NvbC4gT24gVU5JWCB0aGlzIG1lYW5zIHBhcnNpbmcgYQorICogVUlELCBvbiBXaW5kb3dzIHByb2JhYmx5IHBhcnNpbmcgYW4gU0lEIHN0cmluZy4KKyAqIAorICogQHRvZG8gdGhpcyBpcyBicm9rZW4gYmVjYXVzZSBpdCB0cmVhdHMgT09NIGFuZCBwYXJzZSBlcnJvcgorICogdGhlIHNhbWUgd2F5LiBOZWVkcyBhICNEQnVzRXJyb3IuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBmaWxsIGluIAorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCk7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91c2VybmFtZSAoZGIsIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZChjcmVkZW50aWFscywgaW5mby0+dWlkKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHVzZXIgZGF0YWJhc2Ugb2JqZWN0IHVzZWQgdG8gbG9vayB1cCBhbmQKKyAqIGNhY2hlIHVzZXIgaW5mb3JtYXRpb24uCisgKiBAcmV0dXJucyBuZXcgZGF0YWJhc2UsIG9yICNOVUxMIG9uIG91dCBvZiBtZW1vcnkKKyAqLworREJ1c1VzZXJEYXRhYmFzZSoKK19kYnVzX3VzZXJfZGF0YWJhc2VfbmV3ICh2b2lkKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgCisgIGRiID0gZGJ1c19uZXcwIChEQnVzVXNlckRhdGFiYXNlLCAxKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZGItPnJlZmNvdW50ID0gMTsKKworICBkYi0+dXNlcnMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAoREJ1c0ZyZWVGdW5jdGlvbikgX2RidXNfdXNlcl9pbmZvX2ZyZWVfYWxsb2NhdGVkKTsKKyAgCisgIGlmIChkYi0+dXNlcnMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBkYi0+Z3JvdXBzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIChEQnVzRnJlZUZ1bmN0aW9uKSBfZGJ1c19ncm91cF9pbmZvX2ZyZWVfYWxsb2NhdGVkKTsKKyAgCisgIGlmIChkYi0+Z3JvdXBzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgZGItPnVzZXJzX2J5X25hbWUgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgIGlmIChkYi0+dXNlcnNfYnlfbmFtZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgZGItPmdyb3Vwc19ieV9uYW1lID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgaWYgKGRiLT5ncm91cHNfYnlfbmFtZSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgcmV0dXJuIGRiOworICAKKyBmYWlsZWQ6CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKGRiKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogRmx1c2ggYWxsIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgdXNlciBkYXRhYmFzZS4gCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2ggKERCdXNVc2VyRGF0YWJhc2UgKmRiKSAKK3sKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGRiLT51c2Vyc19ieV9uYW1lKTsKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGRiLT5ncm91cHNfYnlfbmFtZSk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbChkYi0+dXNlcnMpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9hbGwoZGItPmdyb3Vwcyk7Cit9CisKKyNpZmRlZiBEQlVTX0JVSUxEX1RFU1RTCisvKioKKyAqIEluY3JlbWVudHMgcmVmY291bnQgb2YgdXNlciBkYXRhYmFzZS4KKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqIEByZXR1cm5zIHRoZSBkYXRhYmFzZQorICovCitEQnVzVXNlckRhdGFiYXNlICoKK19kYnVzX3VzZXJfZGF0YWJhc2VfcmVmIChEQnVzVXNlckRhdGFiYXNlICAqZGIpCit7CisgIF9kYnVzX2Fzc2VydCAoZGItPnJlZmNvdW50ID4gMCk7CisKKyAgZGItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGRiOworfQorI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworLyoqCisgKiBEZWNyZW1lbnRzIHJlZmNvdW50IG9mIHVzZXIgZGF0YWJhc2UuCisgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKERCdXNVc2VyRGF0YWJhc2UgICpkYikKK3sKKyAgX2RidXNfYXNzZXJ0IChkYi0+cmVmY291bnQgPiAwKTsKKworICBkYi0+cmVmY291bnQgLT0gMTsKKyAgaWYgKGRiLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGlmIChkYi0+dXNlcnMpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGRiLT51c2Vycyk7CisKKyAgICAgIGlmIChkYi0+Z3JvdXBzKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkYi0+Z3JvdXBzKTsKKworICAgICAgaWYgKGRiLT51c2Vyc19ieV9uYW1lKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkYi0+dXNlcnNfYnlfbmFtZSk7CisKKyAgICAgIGlmIChkYi0+Z3JvdXBzX2J5X25hbWUpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGRiLT5ncm91cHNfYnlfbmFtZSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoZGIpOworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gVUlELAorICogcmV0dXJuZWQgdXNlciBpbmZvIHNob3VsZCBub3QgYmUgZnJlZWQuIAorICoKKyAqIEBwYXJhbSBkYiB1c2VyIGRhdGFiYXNlCisgKiBAcGFyYW0gdWlkIHRoZSB1c2VyIElECisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byB1c2VyIGluZm8KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdWlkIChEQnVzVXNlckRhdGFiYXNlICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVXNlckluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICplcnJvcikKK3sKKyAgKmluZm8gPSBfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCAoZGIsIHVpZCwgTlVMTCwgZXJyb3IpOworICByZXR1cm4gKmluZm8gIT0gTlVMTDsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gdXNlcm5hbWUuCisgKgorICogQHBhcmFtIGRiIHVzZXIgZGF0YWJhc2UKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlciBuYW1lCisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byB1c2VyIGluZm8KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdXNlcm5hbWUgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1VzZXJJbmZvICAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcikKK3sKKyAgKmluZm8gPSBfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCAoZGIsIERCVVNfVUlEX1VOU0VULCB1c2VybmFtZSwgZXJyb3IpOworICByZXR1cm4gKmluZm8gIT0gTlVMTDsKK30KKworLyoqIEB9ICovCisKKy8qIFRlc3RzIGluIGRidXMtdXNlcmRiLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXVzZXJkYi5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXVzZXJkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDlkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXNlcmRiLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11c2VyZGIuaCBVc2VyIGRhdGFiYXNlIGFic3RyYWN0aW9uCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfVVNFUkRCX0gKKyNkZWZpbmUgREJVU19VU0VSREJfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oPgorCisjaWZkZWYgREJVU19XSU4KKyNlcnJvciAiRG9uJ3QgaW5jbHVkZSB0aGlzIG9uIFdpbmRvd3MiCisjZW5kaWYKKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzVXNlckRhdGFiYXNlIERCdXNVc2VyRGF0YWJhc2U7CisKKyNpZmRlZiBEQlVTX1VTRVJEQl9JTkNMVURFU19QUklWQVRFCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c1VzZXJEYXRhYmFzZQorICovCitzdHJ1Y3QgREJ1c1VzZXJEYXRhYmFzZQoreworICBpbnQgcmVmY291bnQ7IC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisKKyAgREJ1c0hhc2hUYWJsZSAqdXNlcnM7IC8qKjwgVXNlcnMgaW4gdGhlIGRhdGFiYXNlIGJ5IFVJRCAqLworICBEQnVzSGFzaFRhYmxlICpncm91cHM7IC8qKjwgR3JvdXBzIGluIHRoZSBkYXRhYmFzZSBieSBHSUQgKi8KKyAgREJ1c0hhc2hUYWJsZSAqdXNlcnNfYnlfbmFtZTsgLyoqPCBVc2VycyBpbiB0aGUgZGF0YWJhc2UgYnkgbmFtZSAqLworICBEQnVzSGFzaFRhYmxlICpncm91cHNfYnlfbmFtZTsgLyoqPCBHcm91cHMgaW4gdGhlIGRhdGFiYXNlIGJ5IG5hbWUgKi8KKworfTsKKworCitEQnVzVXNlckRhdGFiYXNlKiBfZGJ1c191c2VyX2RhdGFiYXNlX25ldyAgICAgICAgICAgKHZvaWQpOworREJ1c1VzZXJEYXRhYmFzZSogX2RidXNfdXNlcl9kYXRhYmFzZV9yZWYgICAgICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaCAgICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAgICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdWlkICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNVc2VySW5mbyAgKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ2lkICAgICAgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNHcm91cEluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdXNlcm5hbWUgIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1VzZXJJbmZvICAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9ncm91cG5hbWUgKERCdXNVc2VyRGF0YWJhc2UgICAgICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0dyb3VwSW5mbyAqKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CisKK0RCdXNVc2VySW5mbyogIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwICAgICAgIChEQnVzVXNlckRhdGFiYXNlICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJ1c0dyb3VwSW5mbyogX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXAgKERCdXNVc2VyRGF0YWJhc2UgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgICAgX2RidXNfdXNlcl9pbmZvX2ZyZWVfYWxsb2NhdGVkICAgKERCdXNVc2VySW5mbyAgICAgKmluZm8pOwordm9pZCAgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19mcmVlX2FsbG9jYXRlZCAgKERCdXNHcm91cEluZm8gICAgKmluZm8pOworI2VuZGlmIC8qIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgKi8KKworREJ1c1VzZXJEYXRhYmFzZSogX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaF9zeXN0ZW0gICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X3VzZXJfaWQgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9ncm91cF9pZCAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWRfcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19jcmVkZW50aWFsc19mcm9tX3VpZCAgICAgICAgICAoZGJ1c191aWRfdCAgICAgICAgIHVzZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90IF9kYnVzX2dyb3Vwc19mcm9tX3VpZAkJKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpOworZGJ1c19ib29sX3QgX2RidXNfaXNfY29uc29sZV91c2VyICAgICAgICAgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfaXNfYV9udW1iZXIgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAqbnVtKTsKKworZGJ1c19ib29sX3QgX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNvbnN0IERCdXNTdHJpbmcgKip1c2VybmFtZSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzICAoY29uc3QgREJ1c1N0cmluZyAqKmhvbWVkaXIpOworZGJ1c19ib29sX3QgX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqaG9tZWRpcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2hvbWVkaXJfZnJvbV91aWQgICAgICAgICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpob21lZGlyKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVVNFUkRCX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy11dWlkZ2VuLmMgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXVpZGdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkN2MwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXVpZGdlbi5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdXVpZGdlbi5jICBUaGUgZ3V0cyBvZiB0aGUgZGJ1cy11dWlkZ2VuIGJpbmFyeSBsaXZlIGluIGxpYmRidXMsIGluIHRoaXMgZmlsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXV1aWRnZW4uaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisjaWZkZWYgREJVU19XSU4KKyNlcnJvciAiZGJ1cy11dWlkZ2VuIHNob3VsZCBub3QgYmUgbmVlZGVkIG9uIFdpbmRvd3MiCisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0ludGVybmFsc1V1aWRnZW4gZGJ1cy11dWlkZ2VuIGltcGxlbWVudGF0aW9uCisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgRnVuY3Rpb25zIGZvciBkYnVzLXV1aWRnZW4gYmluYXJ5CisgKgorICogVGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIEFCSSwgYW5kIGlmIHlvdSBjYWxsIHRoZW0KKyAqIHlvdSB3aWxsIGdldCBzY3Jld2VkIGJ5IGZ1dHVyZSBjaGFuZ2VzLgorICogCisgKiBAeworICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmV0dXJuX3V1aWQgKERCdXNHVUlEICAgKnV1aWQsCisgICAgICAgICAgICAgY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpZiAodXVpZF9wKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZW5jb2RlZDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVuY29kZWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3V1aWRfZW5jb2RlICh1dWlkLCAmZW5jb2RlZCkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZlbmNvZGVkLCB1dWlkX3ApKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZW5jb2RlZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRm9yIHVzZSBieSB0aGUgZGJ1cy11dWlkZ2VuIGJpbmFyeSBPTkxZLCBkbyBub3QgY2FsbCB0aGlzLgorICogV2UgY2FuIGFuZCB3aWxsIGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgbW9kaWZ5aW5nCisgKiB0aGUgbGliZGJ1cyBzb25hbWUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIG9yICNOVUxMIGZvciB0aGUgbWFjaGluZSBJRCBmaWxlCisgKiBAcGFyYW0gdXVpZF9wIG91dCBwYXJhbSB0byByZXR1cm4gdGhlIHV1aWQKKyAqIEBwYXJhbSBjcmVhdGVfaWZfbm90X2ZvdW5kIHdoZXRoZXIgdG8gY3JlYXRlIGl0IGlmIG5vdCBhbHJlYWR5IHRoZXJlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2V0X3V1aWQgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKip1dWlkX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzR1VJRCB1dWlkOworICAKKyAgaWYgKGZpbGVuYW1lKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWVfc3RyOworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZV9zdHIsIGZpbGVuYW1lKTsKKyAgICAgIGlmICghX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZV9zdHIsICZ1dWlkLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBlcnJvcikpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAoJnV1aWQsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGVycm9yKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKCFyZXR1cm5fdXVpZCgmdXVpZCwgdXVpZF9wLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEZvciB1c2UgYnkgdGhlIGRidXMtdXVpZGdlbiBiaW5hcnkgT05MWSwgZG8gbm90IGNhbGwgdGhpcy4KKyAqIFdlIGNhbiBhbmQgd2lsbCBjaGFuZ2UgdGhpcyBmdW5jdGlvbiB3aXRob3V0IG1vZGlmeWluZworICogdGhlIGxpYmRidXMgc29uYW1lLgorICoKKyAqIEBwYXJhbSB1dWlkX3Agb3V0IHBhcmFtIHRvIHJldHVybiB0aGUgdXVpZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2NyZWF0ZV91dWlkIChjaGFyICAgICAgKip1dWlkX3ApCit7CisgIERCdXNHVUlEIHV1aWQ7CisKKyAgX2RidXNfZ2VuZXJhdGVfdXVpZCAoJnV1aWQpOworICByZXR1cm4gcmV0dXJuX3V1aWQgKCZ1dWlkLCB1dWlkX3AsIE5VTEwpOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy11dWlkZ2VuLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXVpZGdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWI4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtdXVpZGdlbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11dWlkZ2VuLmggIFRoZSBndXRzIG9mIHRoZSBkYnVzLXV1aWRnZW4gYmluYXJ5IGxpdmUgaW4gbGliZGJ1cywgaW4gdGhpcyBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmZGVmIERCVVNfSU5TSURFX0RCVVNfSAorI2Vycm9yICJZb3UgY2FuJ3QgaW5jbHVkZSBkYnVzLXV1aWRnZW4uaCBpbiB0aGUgcHVibGljIGhlYWRlciBkYnVzLmgiCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1VVSURHRU5fSAorI2RlZmluZSBEQlVTX1VVSURHRU5fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZXRfdXVpZCAgICAoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnV1aWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworZGJ1c19ib29sX3QgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2Vuc3VyZV91dWlkIChjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfY3JlYXRlX3V1aWQgKGNoYXIgICAgICAqKnV1aWRfcCk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVVVJREdFTl9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL2RidXMtd2F0Y2guYyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy13YXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzU5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtd2F0Y2guYwpAQCAtMCwwICsxLDY4OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXdhdGNoLmMgREJ1c1dhdGNoIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzV2F0Y2hJbnRlcm5hbHMgREJ1c1dhdGNoIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgaW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgREJ1c1dhdGNoCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBEQnVzV2F0Y2gKKyAqLworc3RydWN0IERCdXNXYXRjaAoreworICBpbnQgcmVmY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yLiAqLworICB1bnNpZ25lZCBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBDb25kaXRpb25zIHRvIHdhdGNoLiAqLworCisgIERCdXNXYXRjaEhhbmRsZXIgaGFuZGxlcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgV2F0Y2ggaGFuZGxlci4gKi8KKyAgdm9pZCAqaGFuZGxlcl9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXYXRjaCBoYW5kbGVyIGRhdGEuICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb247IC8qKjwgRnJlZSB0aGUgd2F0Y2ggaGFuZGxlciBkYXRhLiAqLworICAKKyAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gZGF0YS4gKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuY3Rpb247IC8qKjwgRnJlZSB0aGUgYXBwbGljYXRpb24gZGF0YS4gKi8KKyAgdW5zaWduZWQgaW50IGVuYWJsZWQgOiAxOyAgICAgICAgICAgIC8qKjwgV2hldGhlciBpdCdzIGVuYWJsZWQuICovCit9OworCitkYnVzX2Jvb2xfdAorX2RidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIHJldHVybiB3YXRjaC0+ZW5hYmxlZDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IERCdXNXYXRjaC4gVXNlZCB0byBhZGQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgcG9sbGVkCisgKiBieSBhIG1haW4gbG9vcC4KKyAqIAorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgd2F0Y2hlZC4KKyAqIEBwYXJhbSBmbGFncyB0aGUgY29uZGl0aW9ucyB0byB3YXRjaCBmb3Igb24gdGhlIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gZW5hYmxlZCB0aGUgaW5pdGlhbCBlbmFibGVkIHN0YXRlCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlciBmdW5jdGlvbgorICogQHBhcmFtIGRhdGEgZGF0YSBmb3IgaGFuZGxlciBmdW5jdGlvbgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKiBAcmV0dXJucyB0aGUgbmV3IERCdXNXYXRjaCBvYmplY3QuCisgKi8KK0RCdXNXYXRjaCoKK19kYnVzX3dhdGNoX25ldyAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hIYW5kbGVyICBoYW5kbGVyLAorICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIERCdXNXYXRjaCAqd2F0Y2g7CisKKyNkZWZpbmUgVkFMSURfV0FUQ0hfRkxBR1MgKERCVVNfV0FUQ0hfV1JJVEFCTEUgfCBEQlVTX1dBVENIX1JFQURBQkxFKQorICAKKyAgX2RidXNfYXNzZXJ0ICgoZmxhZ3MgJiBWQUxJRF9XQVRDSF9GTEFHUykgPT0gZmxhZ3MpOworICAKKyAgd2F0Y2ggPSBkYnVzX25ldzAgKERCdXNXYXRjaCwgMSk7CisgIGlmICh3YXRjaCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgd2F0Y2gtPnJlZmNvdW50ID0gMTsKKyAgd2F0Y2gtPmZkID0gZmQ7CisgIHdhdGNoLT5mbGFncyA9IGZsYWdzOworICB3YXRjaC0+ZW5hYmxlZCA9IGVuYWJsZWQ7CisKKyAgd2F0Y2gtPmhhbmRsZXIgPSBoYW5kbGVyOworICB3YXRjaC0+aGFuZGxlcl9kYXRhID0gZGF0YTsKKyAgd2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICAKKyAgcmV0dXJuIHdhdGNoOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNXYXRjaCBvYmplY3QuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgd2F0Y2ggb2JqZWN0LgorICovCitEQnVzV2F0Y2ggKgorX2RidXNfd2F0Y2hfcmVmIChEQnVzV2F0Y2ggKndhdGNoKQoreworICB3YXRjaC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gd2F0Y2g7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1dhdGNoIG9iamVjdAorICogYW5kIGZpbmFsaXplcyB0aGUgb2JqZWN0IGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCBvYmplY3QuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX3VucmVmIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19hc3NlcnQgKHdhdGNoICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHdhdGNoLT5yZWZjb3VudCA+IDApOworCisgIHdhdGNoLT5yZWZjb3VudCAtPSAxOworICBpZiAod2F0Y2gtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgZGJ1c193YXRjaF9zZXRfZGF0YSAod2F0Y2gsIE5VTEwsIE5VTEwpOyAvKiBjYWxsIGZyZWVfZGF0YV9mdW5jdGlvbiAqLworCisgICAgICBpZiAod2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKQorCSgqIHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbikgKHdhdGNoLT5oYW5kbGVyX2RhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHdhdGNoKTsKKyAgICB9Cit9CisKKy8qKgorICogQ2xlYXJzIHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5vdy1pbnZhbGlkIHdhdGNoIG9iamVjdCBzbyB0aGF0CisgKiBubyBvbmUgdHJpZXMgdG8gdXNlIGl0LiAgVGhpcyBpcyBiZWNhdXNlIGEgd2F0Y2ggbWF5IHN0YXkgYWxpdmUgZHVlCisgKiB0byByZWZlcmVuY2UgY291bnRzIGFmdGVyIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkLgorICogSW52YWxpZGF0aW9uIG1ha2VzIGl0IGVhc2llciB0byBjYXRjaCBidWdzLiBJdCBhbHNvCisgKiBrZWVwcyBwZW9wbGUgZnJvbSBkb2luZyBkb3JreSB0aGluZ3MgbGlrZSBhc3N1bWluZyBmaWxlIGRlc2NyaXB0b3JzCisgKiBhcmUgdW5pcXVlIChuZXZlciByZWN5Y2xlZCkuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCBvYmplY3QuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX2ludmFsaWRhdGUgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIHdhdGNoLT5mZCA9IC0xOworICB3YXRjaC0+ZmxhZ3MgPSAwOworfQorCisvKioKKyAqIFNhbml0aXplcyB0aGUgZ2l2ZW4gY29uZGl0aW9uIHNvIHRoYXQgaXQgb25seSBjb250YWlucworICogZmxhZ3MgdGhhdCB0aGUgREJ1c1dhdGNoIHJlcXVlc3RlZC4gZS5nLiBpZiB0aGUKKyAqIHdhdGNoIGlzIGEgREJVU19XQVRDSF9SRUFEQUJMRSB3YXRjaCB0aGVuCisgKiBEQlVTX1dBVENIX1dSSVRBQkxFIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgY29uZGl0aW9uLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggb2JqZWN0LgorICogQHBhcmFtIGNvbmRpdGlvbiBhZGRyZXNzIG9mIHRoZSBjb25kaXRpb24gdG8gc2FuaXRpemUuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX3Nhbml0aXplX2NvbmRpdGlvbiAoREJ1c1dhdGNoICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjb25kaXRpb24pCit7CisgIGlmICghKHdhdGNoLT5mbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpKQorICAgICpjb25kaXRpb24gJj0gfkRCVVNfV0FUQ0hfUkVBREFCTEU7CisgIGlmICghKHdhdGNoLT5mbGFncyAmIERCVVNfV0FUQ0hfV1JJVEFCTEUpKQorICAgICpjb25kaXRpb24gJj0gfkRCVVNfV0FUQ0hfV1JJVEFCTEU7Cit9CisKKworLyoqCisgKiBAdHlwZWRlZiBEQnVzV2F0Y2hMaXN0CisgKgorICogT3BhcXVlIGRhdGEgdHlwZSByZXByZXNlbnRpbmcgYSBsaXN0IG9mIHdhdGNoZXMKKyAqIGFuZCBhIHNldCBvZiBEQnVzQWRkV2F0Y2hGdW5jdGlvbi9EQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbi4KKyAqIEF1dG9tYXRpY2FsbHkgaGFuZGxlcyByZW1vdmluZy9yZS1hZGRpbmcgd2F0Y2hlcworICogd2hlbiB0aGUgREJ1c0FkZFdhdGNoRnVuY3Rpb24gaXMgdXBkYXRlZCBvciBjaGFuZ2VkLgorICogSG9sZHMgYSByZWZlcmVuY2UgY291bnQgdG8gZWFjaCB3YXRjaC4KKyAqCisgKiBVc2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIERCdXNTZXJ2ZXIgYW5kCisgKiBEQnVzQ2xpZW50LgorICoKKyAqLworCisvKioKKyAqIERCdXNXYXRjaExpc3QgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gQWxsIGZpZWxkcworICogYXJlIHByaXZhdGUuCisgKgorICovCitzdHJ1Y3QgREJ1c1dhdGNoTGlzdAoreworICBEQnVzTGlzdCAqd2F0Y2hlczsgICAgICAgICAgIC8qKjwgV2F0Y2ggb2JqZWN0cy4gKi8KKworICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiBhZGRfd2F0Y2hfZnVuY3Rpb247ICAgIC8qKjwgQ2FsbGJhY2sgZm9yIGFkZGluZyBhIHdhdGNoLiAqLworICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiByZW1vdmVfd2F0Y2hfZnVuY3Rpb247IC8qKjwgQ2FsbGJhY2sgZm9yIHJlbW92aW5nIGEgd2F0Y2guICovCisgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiB3YXRjaF90b2dnbGVkX2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIG9uIHRvZ2dsaW5nIGVuYWJsZW1lbnQgKi8KKyAgdm9pZCAqd2F0Y2hfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgZm9yIHdhdGNoIGNhbGxiYWNrcyAqLworICBEQnVzRnJlZUZ1bmN0aW9uIHdhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbjsgIC8qKjwgRnJlZSBmdW5jdGlvbiBmb3Igd2F0Y2ggY2FsbGJhY2sgZGF0YSAqLworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHdhdGNoIGxpc3QuIFJldHVybnMgI05VTEwgaWYgaW5zdWZmaWNpZW50CisgKiBtZW1vcnkgZXhpc3RzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgd2F0Y2ggbGlzdCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1dhdGNoTGlzdCoKK19kYnVzX3dhdGNoX2xpc3RfbmV3ICh2b2lkKQoreworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0OworCisgIHdhdGNoX2xpc3QgPSBkYnVzX25ldzAgKERCdXNXYXRjaExpc3QsIDEpOworICBpZiAod2F0Y2hfbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiB3YXRjaF9saXN0OworfQorCisvKioKKyAqIEZyZWVzIGEgREJ1c1dhdGNoTGlzdC4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqLwordm9pZAorX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0KQoreworICAvKiBmcmVlIHdhdGNoX2RhdGEgYW5kIHJlbW92ZXMgd2F0Y2hlcyBhcyBhIHNpZGUgZWZmZWN0ICovCisgIF9kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAod2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgX2RidXNfd2F0Y2hfdW5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ3YXRjaF9saXN0LT53YXRjaGVzKTsKKworICBkYnVzX2ZyZWUgKHdhdGNoX2xpc3QpOworfQorCisvKioKKyAqIFNldHMgdGhlIHdhdGNoIGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbiBpcyB0aGUgImJhY2tlbmQiCisgKiBmb3IgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBhbmQKKyAqIGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMoKS4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gdGhlIGFkZCB3YXRjaCBmdW5jdGlvbi4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gdGhlIHJlbW92ZSB3YXRjaCBmdW5jdGlvbi4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIG9uIHRvZ2dsaW5nIGVuYWJsZWQgZmxhZywgb3IgI05VTEwKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aG9zZSBmdW5jdGlvbnMuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIHRoZSBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICAvKiBBZGQgd2F0Y2hlcyB3aXRoIHRoZSBuZXcgd2F0Y2ggZnVuY3Rpb24sIGZhaWxpbmcgb24gT09NICovCisgIGlmIChhZGRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZ3YXRjaF9saXN0LT53YXRjaGVzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJndhdGNoX2xpc3QtPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqd2F0Y2hfdHlwZTsKKyAgICAgICAgICAgIGludCBmbGFnczsKKworICAgICAgICAgICAgZmxhZ3MgPSBkYnVzX3dhdGNoX2dldF9mbGFncyAobGluay0+ZGF0YSk7CisgICAgICAgICAgICBpZiAoKGZsYWdzICYgREJVU19XQVRDSF9SRUFEQUJMRSkgJiYKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKSkKKyAgICAgICAgICAgICAgd2F0Y2hfdHlwZSA9ICJyZWFkd3JpdGUiOworICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgICAgICAgICAgICB3YXRjaF90eXBlID0gInJlYWQiOworICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKQorICAgICAgICAgICAgICB3YXRjaF90eXBlID0gIndyaXRlIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgd2F0Y2hfdHlwZSA9ICJub3QgcmVhZCBvciB3cml0ZSI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRpbmcgYSAlcyB3YXRjaCBvbiBmZCAlZCB1c2luZyBuZXdseS1zZXQgYWRkIHdhdGNoIGZ1bmN0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAobGluay0+ZGF0YSkpOworICAgICAgICAgIH0KKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoISgqIGFkZF9mdW5jdGlvbikgKGxpbmstPmRhdGEsIGRhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiByZW1vdmUgaXQgYWxsIGFnYWluIGFuZCByZXR1cm4gRkFMU0UgKi8KKyAgICAgICAgICAgICAgREJ1c0xpc3QgKmxpbmsyOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcyk7CisgICAgICAgICAgICAgIHdoaWxlIChsaW5rMiAhPSBsaW5rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rMik7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyB3YXRjaCBvbiBmZCAlZCB1c2luZyBuZXdseS1zZXQgcmVtb3ZlIGZ1bmN0aW9uIGJlY2F1c2UgaW5pdGlhbCBhZGQgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c193YXRjaF9nZXRfc29ja2V0IChsaW5rMi0+ZGF0YSkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pIChsaW5rMi0+ZGF0YSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGxpbmsyID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisgIAorICAvKiBSZW1vdmUgYWxsIGN1cnJlbnQgd2F0Y2hlcyBmcm9tIHByZXZpb3VzIHdhdGNoIGhhbmRsZXJzICovCisKKyAgaWYgKHdhdGNoX2xpc3QtPnJlbW92ZV93YXRjaF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyBhbGwgcHJlLWV4aXN0aW5nIHdhdGNoZXNcbiIpOworICAgICAgCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ3YXRjaF9saXN0LT53YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgd2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaF9saXN0LT53YXRjaF9kYXRhKTsKKyAgICB9CisKKyAgaWYgKHdhdGNoX2xpc3QtPndhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHdhdGNoX2xpc3QtPndhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbikgKHdhdGNoX2xpc3QtPndhdGNoX2RhdGEpOworICAKKyAgd2F0Y2hfbGlzdC0+YWRkX3dhdGNoX2Z1bmN0aW9uID0gYWRkX2Z1bmN0aW9uOworICB3YXRjaF9saXN0LT5yZW1vdmVfd2F0Y2hfZnVuY3Rpb24gPSByZW1vdmVfZnVuY3Rpb247CisgIHdhdGNoX2xpc3QtPndhdGNoX3RvZ2dsZWRfZnVuY3Rpb24gPSB0b2dnbGVkX2Z1bmN0aW9uOworICB3YXRjaF9saXN0LT53YXRjaF9kYXRhID0gZGF0YTsKKyAgd2F0Y2hfbGlzdC0+d2F0Y2hfZnJlZV9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZHMgYSBuZXcgd2F0Y2ggdG8gdGhlIHdhdGNoIGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24gREJ1c0FkZFdhdGNoRnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIGFkZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c193YXRjaF9saXN0X2FkZF93YXRjaCAoREJ1c1dhdGNoTGlzdCAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJndhdGNoX2xpc3QtPndhdGNoZXMsIHdhdGNoKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBfZGJ1c193YXRjaF9yZWYgKHdhdGNoKTsKKworICBpZiAod2F0Y2hfbGlzdC0+YWRkX3dhdGNoX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkFkZGluZyB3YXRjaCBvbiBmZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpKTsKKyAgICAgIAorICAgICAgaWYgKCEoKiB3YXRjaF9saXN0LT5hZGRfd2F0Y2hfZnVuY3Rpb24pICh3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywgd2F0Y2gpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHdhdGNoIGZyb20gdGhlIHdhdGNoIGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24ncyBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAgKERCdXNXYXRjaExpc3QgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoKQoreworICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywgd2F0Y2gpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIk5vbmV4aXN0ZW50IHdhdGNoIHdhcyByZW1vdmVkIik7CisgIAorICBpZiAod2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIHdhdGNoIG9uIGZkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c193YXRjaF9nZXRfc29ja2V0ICh3YXRjaCkpOworICAgICAgCisgICAgICAoKiB3YXRjaF9saXN0LT5yZW1vdmVfd2F0Y2hfZnVuY3Rpb24pICh3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX2xpc3QtPndhdGNoX2RhdGEpOworICAgIH0KKyAgCisgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7Cit9CisKKy8qKgorICogU2V0cyBhIHdhdGNoIHRvIHRoZSBnaXZlbiBlbmFibGVkIHN0YXRlLCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uJ3MgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB3YXRjaF9saXN0IHRoZSB3YXRjaCBsaXN0LgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byB0b2dnbGUuCisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSB0byBlbmFibGUKKyAqLwordm9pZAorX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2ggKERCdXNXYXRjaExpc3QgICAgICAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgZW5hYmxlZCA9ICEhZW5hYmxlZDsKKyAgCisgIGlmIChlbmFibGVkID09IHdhdGNoLT5lbmFibGVkKQorICAgIHJldHVybjsKKworICB3YXRjaC0+ZW5hYmxlZCA9IGVuYWJsZWQ7CisgIAorICBpZiAod2F0Y2hfbGlzdC0+d2F0Y2hfdG9nZ2xlZF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUb2dnbGluZyB3YXRjaCAlcCBvbiBmZCAlZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHdhdGNoLCBkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKSwgd2F0Y2gtPmVuYWJsZWQpOworICAgICAgCisgICAgICAoKiB3YXRjaF9saXN0LT53YXRjaF90b2dnbGVkX2Z1bmN0aW9uKSAod2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgdGhlIGhhbmRsZXIgZm9yIHRoZSB3YXRjaC4KKyAqCisgKiBAdG9kbyB0aGlzIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIGJlY2F1c2Ugb2YgdGhlIHdlaXJkCisgKiB3YXkgY29ubmVjdGlvbiB3YXRjaGVzIGFyZSBkb25lLCBzZWUgdGhlIG5vdGUKKyAqIGluIGRvY3MgZm9yIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoKCkuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaAorICogQHBhcmFtIGhhbmRsZXIgdGhlIG5ldyBoYW5kbGVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmcmVlIGRhdGEgd2l0aCB0aGlzCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX3NldF9oYW5kbGVyIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hIYW5kbGVyICBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBpZiAod2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKQorICAgICgqIHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbikgKHdhdGNoLT5oYW5kbGVyX2RhdGEpOworCisgIHdhdGNoLT5oYW5kbGVyID0gaGFuZGxlcjsKKyAgd2F0Y2gtPmhhbmRsZXJfZGF0YSA9IGRhdGE7CisgIHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNXYXRjaCBEQnVzV2F0Y2gKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgT2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3YXRjaGVkLgorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzV2F0Y2guIEEgd2F0Y2ggcmVwcmVzZW50cworICogYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0aGUgbWFpbiBsb29wIG5lZWRzIHRvIG1vbml0b3IsCisgKiBhcyBpbiBRdCdzIFFTb2NrZXROb3RpZmllciBvciBHTGliJ3MgZ19pb19hZGRfd2F0Y2goKS4KKyAqCisgKiBVc2UgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBvciBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkKKyAqIHRvIGJlIG5vdGlmaWVkIHdoZW4gbGliZGJ1cyBuZWVkcyB0byBhZGQgb3IgcmVtb3ZlIHdhdGNoZXMuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzV2F0Y2gKKyAqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgZGVzY3JpcHRvcgorICogdG8gYmUgd2F0Y2hlZCBmb3IgY2hhbmdlcyBpbiByZWFkYWJpbGl0eSwKKyAqIHdyaXRhYmlsaXR5LCBvciBoYW5ndXAuCisgKi8KKworLyoqCisgKiBEZXByZWNhdGVkIGZvcm1lciBuYW1lIG9mIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKS4KKyAqIAorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3YXRjaC4KKyAqLworaW50CitkYnVzX3dhdGNoX2dldF9mZCAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCAtMSk7CisKKyAgcmV0dXJuIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQod2F0Y2gpOworfQorCisvKioKKyAqIFJldHVybnMgYSBVTklYIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3YXRjaGVkLAorICogd2hpY2ggbWF5IGJlIGEgcGlwZSwgc29ja2V0LCBvciBvdGhlciB0eXBlIG9mCisgKiBkZXNjcmlwdG9yLiBPbiBVTklYIHRoaXMgaXMgcHJlZmVycmVkIHRvCisgKiBkYnVzX3dhdGNoX2dldF9zb2NrZXQoKSBzaW5jZSBpdCB3b3JrcyB3aXRoCisgKiBtb3JlIGtpbmRzIG9mICNEQnVzV2F0Y2guCisgKgorICogQWx3YXlzIHJldHVybnMgLTEgb24gV2luZG93cy4gT24gV2luZG93cyB5b3UgdXNlCisgKiBkYnVzX3dhdGNoX2dldF9zb2NrZXQoKSB0byBnZXQgYSBXaW5zb2NrIHNvY2tldCB0byB3YXRjaC4KKyAqIAorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3YXRjaC4KKyAqLworaW50CitkYnVzX3dhdGNoX2dldF91bml4X2ZkIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIC0xKTsKKworICAvKiBGSVhNRSByZW1vdmUgI2lmZGVmIGFuZCBkbyB0aGlzIG9uIGEgbG93ZXIgbGV2ZWwKKyAgICogKHdhdGNoIHNob3VsZCBoYXZlIHNldF9zb2NrZXQgYW5kIHNldF91bml4X2ZkIGFuZCB0cmFjaworICAgKiB3aGljaCBpdCBoYXMsIGFuZCB0aGUgdHJhbnNwb3J0IHNob3VsZCBwcm92aWRlIHRoZQorICAgKiBhcHByb3ByaWF0ZSB3YXRjaCB0eXBlKQorICAgKi8KKyNpZmRlZiBEQlVTX1VOSVgKKyAgcmV0dXJuIHdhdGNoLT5mZDsKKyNlbHNlCisgIHJldHVybiBkYnVzX3dhdGNoX2dldF9zb2NrZXQoIHdhdGNoICk7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc29ja2V0IHRvIGJlIHdhdGNoZWQsIG9uIFVOSVggdGhpcyB3aWxsIHJldHVybiAtMSBpZiBvdXIKKyAqIHRyYW5zcG9ydCBpcyBub3Qgc29ja2V0LWJhc2VkIHNvIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKSBpcworICogcHJlZmVycmVkLgorICoKKyAqIE9uIFdpbmRvd3MsIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKSByZXR1cm5zIC0xIGJ1dCB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIGEgV2luc29jayBzb2NrZXQgKGFzc3VtaW5nIHRoZSB0cmFuc3BvcnQgaXMgc29ja2V0LWJhc2VkLAorICogYXMgaXQgYWx3YXlzIGlzIGZvciBub3cpLgorICogCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgc29ja2V0IHRvIHdhdGNoLgorICovCitpbnQKK2RidXNfd2F0Y2hfZ2V0X3NvY2tldCAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCAtMSk7CisKKyAgcmV0dXJuIHdhdGNoLT5mZDsKK30KKworLyoqCisgKiBHZXRzIGZsYWdzIGZyb20gREJ1c1dhdGNoRmxhZ3MgaW5kaWNhdGluZworICogd2hhdCBjb25kaXRpb25zIHNob3VsZCBiZSBtb25pdG9yZWQgb24gdGhlCisgKiBmaWxlIGRlc2NyaXB0b3IuCisgKiAKKyAqIFRoZSBmbGFncyByZXR1cm5lZCB3aWxsIG9ubHkgY29udGFpbiBEQlVTX1dBVENIX1JFQURBQkxFCisgKiBhbmQgREJVU19XQVRDSF9XUklUQUJMRSwgbmV2ZXIgREJVU19XQVRDSF9IQU5HVVAgb3IKKyAqIERCVVNfV0FUQ0hfRVJST1I7IGFsbCB3YXRjaGVzIGltcGxpY2l0bHkgaW5jbHVkZSBhIHdhdGNoCisgKiBmb3IgaGFuZ3VwcywgZXJyb3JzLCBhbmQgb3RoZXIgZXhjZXB0aW9uYWwgY29uZGl0aW9ucy4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgY29uZGl0aW9ucyB0byB3YXRjaC4KKyAqLwordW5zaWduZWQgaW50CitkYnVzX3dhdGNoX2dldF9mbGFncyAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh3YXRjaCAhPSBOVUxMLCAwKTsKKyAgX2RidXNfYXNzZXJ0ICgod2F0Y2gtPmZsYWdzICYgVkFMSURfV0FUQ0hfRkxBR1MpID09IHdhdGNoLT5mbGFncyk7CisKKyAgcmV0dXJuIHdhdGNoLT5mbGFnczsKK30KKworLyoqCisgKiBHZXRzIGRhdGEgcHJldmlvdXNseSBzZXQgd2l0aCBkYnVzX3dhdGNoX3NldF9kYXRhKCkKKyAqIG9yICNOVUxMIGlmIG5vbmUuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgcHJldmlvdXNseS1zZXQgZGF0YS4KKyAqLwordm9pZCoKK2RidXNfd2F0Y2hfZ2V0X2RhdGEgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgTlVMTCk7CisKKyAgcmV0dXJuIHdhdGNoLT5kYXRhOworfQorCisvKioKKyAqIFNldHMgZGF0YSB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHdpdGggZGJ1c193YXRjaF9nZXRfZGF0YSgpLgorICogSW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgREJ1c0FkZFdhdGNoRnVuY3Rpb24gYW5kCisgKiBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiB0byBzdG9yZSB0aGVpciBvd24gZGF0YS4gIEZvciBleGFtcGxlIHdpdGgKKyAqIFF0IHlvdSBtaWdodCBzdG9yZSB0aGUgUVNvY2tldE5vdGlmaWVyIGZvciB0aGlzIHdhdGNoIGFuZCB3aXRoIEdMaWIKKyAqIHlvdSBtaWdodCBzdG9yZSBhIEdTb3VyY2UuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICovCit2b2lkCitkYnVzX3dhdGNoX3NldF9kYXRhIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICh3YXRjaCAhPSBOVUxMKTsKKworICBfZGJ1c192ZXJib3NlICgiU2V0dGluZyB3YXRjaCBmZCAlZCBkYXRhIHRvIGRhdGEgPSAlcCBmdW5jdGlvbiA9ICVwIGZyb20gZGF0YSA9ICVwIGZ1bmN0aW9uID0gJXBcbiIsCisgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCAod2F0Y2gpLAorICAgICAgICAgICAgICAgICBkYXRhLCBmcmVlX2RhdGFfZnVuY3Rpb24sIHdhdGNoLT5kYXRhLCB3YXRjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKyAgCisgIGlmICh3YXRjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogd2F0Y2gtPmZyZWVfZGF0YV9mdW5jdGlvbikgKHdhdGNoLT5kYXRhKTsKKyAgCisgIHdhdGNoLT5kYXRhID0gZGF0YTsKKyAgd2F0Y2gtPmZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgYSB3YXRjaCBpcyBlbmFibGVkIG9yIG5vdC4gSWYgbm90CisgKiBlbmFibGVkLCBpdCBzaG91bGQgbm90IGJlIHBvbGxlZCBieSB0aGUgbWFpbiBsb29wLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHdhdGNoIGlzIGVuYWJsZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiB3YXRjaC0+ZW5hYmxlZDsKK30KKworCisvKioKKyAqIENhbGxlZCB0byBub3RpZnkgdGhlIEQtQnVzIGxpYnJhcnkgd2hlbiBhIHByZXZpb3VzbHktYWRkZWQgd2F0Y2ggaXMKKyAqIHJlYWR5IGZvciByZWFkaW5nIG9yIHdyaXRpbmcsIG9yIGhhcyBhbiBleGNlcHRpb24gc3VjaCBhcyBhIGhhbmd1cC4KKyAqIAorICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zICNGQUxTRSwgdGhlbiB0aGUgZmlsZSBkZXNjcmlwdG9yIG1heSBzdGlsbAorICogYmUgcmVhZHkgZm9yIHJlYWRpbmcgb3Igd3JpdGluZywgYnV0IG1vcmUgbWVtb3J5IGlzIG5lZWRlZCBpbiBvcmRlcgorICogdG8gZG8gdGhlIHJlYWRpbmcgb3Igd3JpdGluZy4gSWYgeW91IGlnbm9yZSB0aGUgI0ZBTFNFIHJldHVybiwgeW91cgorICogYXBwbGljYXRpb24gbWF5IHNwaW4gaW4gYSBidXN5IGxvb3Agb24gdGhlIGZpbGUgZGVzY3JpcHRvciB1bnRpbAorICogbWVtb3J5IGJlY29tZXMgYXZhaWxhYmxlLCBidXQgbm90aGluZyBtb3JlIGNhdGFzdHJvcGhpYyBzaG91bGQKKyAqIGhhcHBlbi4KKyAqCisgKiBkYnVzX3dhdGNoX2hhbmRsZSgpIGNhbm5vdCBiZSBjYWxsZWQgZHVyaW5nIHRoZQorICogREJ1c0FkZFdhdGNoRnVuY3Rpb24sIGFzIHRoZSBjb25uZWN0aW9uIHdpbGwgbm90IGJlIHJlYWR5IHRvIGhhbmRsZQorICogdGhhdCB3YXRjaCB5ZXQuCisgKiAKKyAqIEl0IGlzIG5vdCBhbGxvd2VkIHRvIHJlZmVyZW5jZSBhIERCdXNXYXRjaCBhZnRlciBpdCBoYXMgYmVlbiBwYXNzZWQKKyAqIHRvIHJlbW92ZV9mdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcGFyYW0gZmxhZ3MgdGhlIHBvbGwgY29uZGl0aW9uIHVzaW5nICNEQnVzV2F0Y2hGbGFncyB2YWx1ZXMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGVyZSB3YXNuJ3QgZW5vdWdoIG1lbW9yeSAKKyAqLworZGJ1c19ib29sX3QKK2RidXNfd2F0Y2hfaGFuZGxlIChEQnVzV2F0Y2ggICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZmxhZ3MpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgRkFMU0UpOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaWYgKHdhdGNoLT5mZCA8IDAgfHwgd2F0Y2gtPmZsYWdzID09IDApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJXYXRjaCBpcyBpbnZhbGlkLCBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorI2VuZGlmCisgICAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2gtPmZkID49IDAgLyogZmFpbHMgaWYgd2F0Y2ggd2FzIHJlbW92ZWQgKi8sIFRSVUUpOworICAKKyAgX2RidXNfd2F0Y2hfc2FuaXRpemVfY29uZGl0aW9uICh3YXRjaCwgJmZsYWdzKTsKKworICBpZiAoZmxhZ3MgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQWZ0ZXIgc2FuaXRpemF0aW9uLCB3YXRjaCBmbGFncyBvbiBmZCAlZCB3ZXJlIDBcbiIsCisgICAgICAgICAgICAgICAgICAgICB3YXRjaC0+ZmQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgqIHdhdGNoLT5oYW5kbGVyKSAod2F0Y2gsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLT5oYW5kbGVyX2RhdGEpOworfQorCisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXdhdGNoLmggYi9kYnVzLTEuNC4xMC9kYnVzL2RidXMtd2F0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTk1M2VjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLXdhdGNoLmgKQEAgLTAsMCArMSw4MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXdhdGNoLmggREJ1c1dhdGNoIGludGVybmFsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1dBVENIX0gKKyNkZWZpbmUgREJVU19XQVRDSF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNXYXRjaEludGVybmFscworICogQHsKKyAqLworCisvKiBQdWJsaWMgbWV0aG9kcyBvbiBEQnVzV2F0Y2ggYXJlIGluIGRidXMtY29ubmVjdGlvbi5oICovCisKK3R5cGVkZWYgc3RydWN0IERCdXNXYXRjaExpc3QgREJ1c1dhdGNoTGlzdDsKKworLyoqIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSB3YXRjaCBpcyBoYW5kbGVkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEhhbmRsZXIpIChEQnVzV2F0Y2ggICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqZGF0YSk7CisKK0RCdXNXYXRjaCogX2RidXNfd2F0Y2hfbmV3ICAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJ1c1dhdGNoKiBfZGJ1c193YXRjaF9yZWYgICAgICAgICAgICAgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgICAgICAgICAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICBfZGJ1c193YXRjaF9zYW5pdGl6ZV9jb25kaXRpb24gKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKmNvbmRpdGlvbik7Cit2b2lkICAgICAgIF9kYnVzX3dhdGNoX3NldF9oYW5kbGVyICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoSGFuZGxlciAgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKworREJ1c1dhdGNoTGlzdCogX2RidXNfd2F0Y2hfbGlzdF9uZXcgICAgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAgICAgICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QpOworZGJ1c19ib29sX3QgICAgX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgIF9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAgKERCdXNXYXRjaExpc3QgICAgICAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2ggIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgKndhdGNoKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1dBVENIX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvZGJ1cy5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9kYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwOTk1MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvZGJ1cy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMuaCAgQ29udmVuaWVuY2UgaGVhZGVyIGluY2x1ZGluZyBhbGwgb3RoZXIgaGVhZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19ICisjZGVmaW5lIERCVVNfSAorCisjZGVmaW5lIERCVVNfSU5TSURFX0RCVVNfSCAxCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtYXJjaC1kZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFkZHJlc3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1pc2MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcGVuZGluZy1jYWxsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zaGFyZWQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2lnbmF0dXJlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRocmVhZHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKworI3VuZGVmIERCVVNfSU5TSURFX0RCVVNfSAorCisvKioKKyAqIEBkZWZncm91cCBEQnVzIEQtQnVzIGxvdy1sZXZlbCBwdWJsaWMgQVBJCisgKiBAYnJpZWYgVGhlIGxvdy1sZXZlbCBwdWJsaWMgQVBJIG9mIHRoZSBELUJ1cyBsaWJyYXJ5CisgKgorICogbGliZGJ1cyBwcm92aWRlcyBhIGxvdy1sZXZlbCBDIEFQSSBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIHVzZSBieQorICogYmluZGluZ3MgdG8gc3BlY2lmaWMgb2JqZWN0IHN5c3RlbXMgYW5kIGxhbmd1YWdlcy4gIEQtQnVzIGlzIG1vc3QKKyAqIGNvbnZlbmllbnQgd2hlbiB1c2VkIHdpdGggdGhlIEdMaWIgYmluZGluZ3MsIFB5dGhvbiBiaW5kaW5ncywgUXQKKyAqIGJpbmRpbmdzLCBNb25vIGJpbmRpbmdzLCBhbmQgc28gZm9ydGguICBUaGlzIGxvdy1sZXZlbCBBUEkgaGFzIGEKKyAqIGxvdCBvZiBjb21wbGV4aXR5IHVzZWZ1bCBvbmx5IGZvciBiaW5kaW5ncy4KKyAqIAorICogQHsKKyAqLworCisvKiogQH0gKi8KKworLyoqCisgKiBAbWFpbnBhZ2UKKyAqCisgKiBUaGlzIG1hbnVhbCBkb2N1bWVudHMgdGhlIDxlbT5sb3ctbGV2ZWw8L2VtPiBELUJ1cyBDIEFQSS4gPGI+SWYgeW91IHVzZQorICogdGhpcyBsb3ctbGV2ZWwgQVBJIGRpcmVjdGx5LCB5b3UncmUgc2lnbmluZyB1cCBmb3Igc29tZSBwYWluLjwvYj4KKyAqCisgKiBDYXZlYXRzIGFzaWRlLCB5b3UgbWlnaHQgZ2V0IHN0YXJ0ZWQgbGVhcm5pbmcgdGhlIGxvdy1sZXZlbCBBUEkgYnkgcmVhZGluZworICogYWJvdXQgQHJlZiBEQnVzQ29ubmVjdGlvbiBhbmQgQHJlZiBEQnVzTWVzc2FnZS4KKyAqIAorICogVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgcGxhY2VzIHRvIGxvb2sgZm9yIEQtQnVzIGluZm9ybWF0aW9uLCBzdWNoCisgKiBhcyB0aGUgdHV0b3JpYWwgYW5kIHRoZSBzcGVjaWZpY2F0aW9uOyB0aG9zZSBjYW4gYmUgZm91bmQgYXQgPGEKKyAqIGhyZWY9Imh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3dpa2kvU29mdHdhcmUvZGJ1cyI+dGhlIEQtQnVzCisgKiB3ZWJzaXRlPC9hPi4gSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gYSBzeXNhZG1pbiBvciBwYWNrYWdlCisgKiBtYWludGFpbmVyJ3MgcGVyc3BlY3RpdmUgb24gdGhlIGRidXMtZGFlbW9uIGl0c2VsZiBhbmQgaXRzCisgKiBjb25maWd1cmF0aW9uLCBiZSBzdXJlIHRvIGNoZWNrIG91dCB0aGUgbWFuIHBhZ2VzIGFzIHdlbGwuCisgKgorICogVGhlIGxvdy1sZXZlbCBBUEkgZG9jdW1lbnRlZCBpbiB0aGlzIG1hbnVhbCBkZWxpYmVyYXRlbHkgbGFja3MKKyAqIG1vc3QgY29udmVuaWVuY2UgZnVuY3Rpb25zIC0gdGhvc2UgYXJlIGxlZnQgdXAgdG8gaGlnaGVyLWxldmVsIGxpYnJhcmllcworICogYmFzZWQgb24gZnJhbWV3b3JrcyBzdWNoIGFzIEdMaWIsIFF0LCBQeXRob24sIE1vbm8sIEphdmEsCisgKiBldGMuIFRoZXNlIGhpZ2hlci1sZXZlbCBsaWJyYXJpZXMgKG9mdGVuIGNhbGxlZCAiRC1CdXMgYmluZGluZ3MiKQorICogaGF2ZSBmZWF0dXJlcyBzdWNoIGFzIG9iamVjdCBzeXN0ZW1zIGFuZCBtYWluIGxvb3BzIHRoYXQgYWxsb3cgYQorICogPGVtPm11Y2g8L2VtPiBtb3JlIGNvbnZlbmllbnQgQVBJLgorICogCisgKiBUaGUgbG93LWxldmVsIEFQSSBhbHNvIGNvbnRhaW5zIHBsZW50eSBvZiBjbHV0dGVyIHRvIHN1cHBvcnQKKyAqIGludGVncmF0aW9uIHdpdGggYXJiaXRyYXJ5IG9iamVjdCBzeXN0ZW1zLCBsYW5ndWFnZXMsIG1haW4gbG9vcHMsCisgKiBhbmQgc28gZm9ydGguIFRoZXNlIGZlYXR1cmVzIGFkZCBhIGxvdCBvZiBub2lzZSB0byB0aGUgQVBJIHRoYXQgeW91CisgKiBwcm9iYWJseSBkb24ndCBjYXJlIGFib3V0IHVubGVzcyB5b3UncmUgY29kaW5nIGEgYmluZGluZy4KKyAqCisgKiBUaGlzIG1hbnVhbCBhbHNvIGNvbnRhaW5zIGRvY3MgZm9yIEByZWYgREJ1c0ludGVybmFscyAiRC1CdXMgaW50ZXJuYWxzIiwKKyAqIHNvIHlvdSBjYW4gdXNlIGl0IHRvIGdldCBvcmllbnRlZCB0byB0aGUgRC1CdXMgc291cmNlIGNvZGUgaWYgeW91J3JlCisgKiBpbnRlcmVzdGVkIGluIHBhdGNoaW5nIHRoZSBjb2RlLiBZb3Ugc2hvdWxkIGFsc28gcmVhZCB0aGUKKyAqIGZpbGUgSEFDS0lORyB3aGljaCBjb21lcyB3aXRoIHRoZSBzb3VyY2UgY29kZSBpZiB5b3UgcGxhbiB0byBjb250cmlidXRlIHRvCisgKiBELUJ1cy4KKyAqCisgKiBBcyB5b3UgcmVhZCB0aGUgY29kZSwgeW91IGNhbiBpZGVudGlmeSBpbnRlcm5hbCBELUJ1cyBmdW5jdGlvbnMKKyAqIGJlY2F1c2UgdGhleSBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUgKCdfJykgY2hhcmFjdGVyLiBBbHNvLCBhbnkKKyAqIGlkZW50aWZpZXIgb3IgbWFjcm8gdGhhdCBsYWNrcyBhIERCdXMsIGRidXNfLCBvciBEQlVTXyBuYW1lcGFjZQorICogcHJlZml4IGlzIGludGVybmFsLCB3aXRoIGEgY291cGxlIG9mIGV4Y2VwdGlvbnMgc3VjaCBhcyAjTlVMTCwKKyAqICNUUlVFLCBhbmQgI0ZBTFNFLgorICovCisKKyNlbmRpZiAvKiBEQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RidXMvc2QtZGFlbW9uLmMgYi9kYnVzLTEuNC4xMC9kYnVzL3NkLWRhZW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjNiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kYnVzL3NkLWRhZW1vbi5jCkBAIC0wLDAgKzEsNDM1IEBACisvKi0qLSBNb2RlOiBDOyBjLWJhc2ljLW9mZnNldDogODsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLSovCisKKy8qKioKKyAgQ29weXJpZ2h0IDIwMTAgTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgIFNPRlRXQVJFLgorKioqLworCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJzZC1kYWVtb24uaCIKKworaW50IHNkX2xpc3Rlbl9mZHMoaW50IHVuc2V0X2Vudmlyb25tZW50KSB7CisKKyNpZiBkZWZpbmVkKERJU0FCTEVfU1lTVEVNRCkgfHwgIWRlZmluZWQoX19saW51eF9fKQorICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgICAgIGludCByLCBmZDsKKyAgICAgICAgY29uc3QgY2hhciAqZTsKKyAgICAgICAgY2hhciAqcCA9IE5VTEw7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbDsKKworICAgICAgICBpZiAoIShlID0gZ2V0ZW52KCJMSVNURU5fUElEIikpKSB7CisgICAgICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGwgPSBzdHJ0b3VsKGUsICZwLCAxMCk7CisKKyAgICAgICAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgICAgICAgICByID0gLWVycm5vOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwIHx8ICpwIHx8IGwgPD0gMCkgeworICAgICAgICAgICAgICAgIHIgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CisKKyAgICAgICAgLyogSXMgdGhpcyBmb3IgdXM/ICovCisgICAgICAgIGlmIChnZXRwaWQoKSAhPSAocGlkX3QpIGwpIHsKKyAgICAgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGUgPSBnZXRlbnYoIkxJU1RFTl9GRFMiKSkpIHsKKyAgICAgICAgICAgICAgICByID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgbCA9IHN0cnRvdWwoZSwgJnAsIDEwKTsKKworICAgICAgICBpZiAoZXJybm8gIT0gMCkgeworICAgICAgICAgICAgICAgIHIgPSAtZXJybm87CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXAgfHwgKnApIHsKKyAgICAgICAgICAgICAgICByID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmQgPSBTRF9MSVNURU5fRkRTX1NUQVJUOyBmZCA8IFNEX0xJU1RFTl9GRFNfU1RBUlQgKyAoaW50KSBsOyBmZCArKykgeworICAgICAgICAgICAgICAgIGludCBmbGFnczsKKworICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGRCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgciA9IC1lcnJubzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZEX0NMT0VYRUMpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAtZXJybm87CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByID0gKGludCkgbDsKKworZmluaXNoOgorICAgICAgICBpZiAodW5zZXRfZW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgICAgICB1bnNldGVudigiTElTVEVOX1BJRCIpOworICAgICAgICAgICAgICAgIHVuc2V0ZW52KCJMSVNURU5fRkRTIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyNlbmRpZgorfQorCitpbnQgc2RfaXNfZmlmbyhpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc3RfZmQ7CisKKyAgICAgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBtZW1zZXQoJnN0X2ZkLCAwLCBzaXplb2Yoc3RfZmQpKTsKKyAgICAgICAgaWYgKGZzdGF0KGZkLCAmc3RfZmQpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgICAgIGlmICghU19JU0ZJRk8oc3RfZmQuc3RfbW9kZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKHBhdGgpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdF9wYXRoOworCisgICAgICAgICAgICAgICAgbWVtc2V0KCZzdF9wYXRoLCAwLCBzaXplb2Yoc3RfcGF0aCkpOworICAgICAgICAgICAgICAgIGlmIChzdGF0KHBhdGgsICZzdF9wYXRoKSA8IDApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTk9URElSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0X3BhdGguc3RfZGV2ID09IHN0X2ZkLnN0X2RldiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RfcGF0aC5zdF9pbm8gPT0gc3RfZmQuc3RfaW5vOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2RfaXNfc29ja2V0X2ludGVybmFsKGludCBmZCwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc3RfZmQ7CisKKyAgICAgICAgaWYgKGZkIDwgMCB8fCB0eXBlIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZiAoZnN0YXQoZmQsICZzdF9mZCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICAgICAgaWYgKCFTX0lTU09DSyhzdF9mZC5zdF9tb2RlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAodHlwZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW50IG90aGVyX3R5cGUgPSAwOworICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBsID0gc2l6ZW9mKG90aGVyX3R5cGUpOworCisgICAgICAgICAgICAgICAgaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1RZUEUsICZvdGhlcl90eXBlLCAmbCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAgICAgICAgIGlmIChsICE9IHNpemVvZihvdGhlcl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgaWYgKG90aGVyX3R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpc3RlbmluZyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IGFjY2VwdGluZyA9IDA7CisgICAgICAgICAgICAgICAgc29ja2xlbl90IGwgPSBzaXplb2YoYWNjZXB0aW5nKTsKKworICAgICAgICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19BQ0NFUFRDT05OLCAmYWNjZXB0aW5nLCAmbCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAgICAgICAgIGlmIChsICE9IHNpemVvZihhY2NlcHRpbmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBpZiAoIWFjY2VwdGluZyAhPSAhbGlzdGVuaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKK30KKwordW5pb24gc29ja2FkZHJfdW5pb24geworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpbjQ7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgaW42OworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0b3JhZ2U7Cit9OworCitpbnQgc2RfaXNfc29ja2V0KGludCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcpIHsKKyAgICAgICAgaW50IHI7CisKKyAgICAgICAgaWYgKGZhbWlseSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKChyID0gc2RfaXNfc29ja2V0X2ludGVybmFsKGZkLCB0eXBlLCBsaXN0ZW5pbmcpKSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiByOworCisgICAgICAgIGlmIChmYW1pbHkgPiAwKSB7CisgICAgICAgICAgICAgICAgdW5pb24gc29ja2FkZHJfdW5pb24gc29ja2FkZHI7CisgICAgICAgICAgICAgICAgc29ja2xlbl90IGw7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnNvY2thZGRyLCAwLCBzaXplb2Yoc29ja2FkZHIpKTsKKyAgICAgICAgICAgICAgICBsID0gc2l6ZW9mKHNvY2thZGRyKTsKKworICAgICAgICAgICAgICAgIGlmIChnZXRzb2NrbmFtZShmZCwgJnNvY2thZGRyLnNhLCAmbCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICAgICAgICAgIGlmIChsIDwgc2l6ZW9mKHNhX2ZhbWlseV90KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2thZGRyLnNhLnNhX2ZhbWlseSA9PSBmYW1pbHk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKK30KKworaW50IHNkX2lzX3NvY2tldF9pbmV0KGludCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcsIHVpbnQxNl90IHBvcnQpIHsKKyAgICAgICAgdW5pb24gc29ja2FkZHJfdW5pb24gc29ja2FkZHI7CisgICAgICAgIHNvY2tsZW5fdCBsOworICAgICAgICBpbnQgcjsKKworICAgICAgICBpZiAoZmFtaWx5ICE9IDAgJiYgZmFtaWx5ICE9IEFGX0lORVQgJiYgZmFtaWx5ICE9IEFGX0lORVQ2KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmICgociA9IHNkX2lzX3NvY2tldF9pbnRlcm5hbChmZCwgdHlwZSwgbGlzdGVuaW5nKSkgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKworICAgICAgICBtZW1zZXQoJnNvY2thZGRyLCAwLCBzaXplb2Yoc29ja2FkZHIpKTsKKyAgICAgICAgbCA9IHNpemVvZihzb2NrYWRkcik7CisKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAmc29ja2FkZHIuc2EsICZsKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICBpZiAobCA8IHNpemVvZihzYV9mYW1pbHlfdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKHNvY2thZGRyLnNhLnNhX2ZhbWlseSAhPSBBRl9JTkVUICYmCisgICAgICAgICAgICBzb2NrYWRkci5zYS5zYV9mYW1pbHkgIT0gQUZfSU5FVDYpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKGZhbWlseSA+IDApCisgICAgICAgICAgICAgICAgaWYgKHNvY2thZGRyLnNhLnNhX2ZhbWlseSAhPSBmYW1pbHkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAocG9ydCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc29ja2FkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRvbnMocG9ydCkgPT0gc29ja2FkZHIuaW40LnNpbl9wb3J0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBodG9ucyhwb3J0KSA9PSBzb2NrYWRkci5pbjYuc2luNl9wb3J0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworfQorCitpbnQgc2RfaXNfc29ja2V0X3VuaXgoaW50IGZkLCBpbnQgdHlwZSwgaW50IGxpc3RlbmluZywgY29uc3QgY2hhciAqcGF0aCwgc2l6ZV90IGxlbmd0aCkgeworICAgICAgICB1bmlvbiBzb2NrYWRkcl91bmlvbiBzb2NrYWRkcjsKKyAgICAgICAgc29ja2xlbl90IGw7CisgICAgICAgIGludCByOworCisgICAgICAgIGlmICgociA9IHNkX2lzX3NvY2tldF9pbnRlcm5hbChmZCwgdHlwZSwgbGlzdGVuaW5nKSkgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKworICAgICAgICBtZW1zZXQoJnNvY2thZGRyLCAwLCBzaXplb2Yoc29ja2FkZHIpKTsKKyAgICAgICAgbCA9IHNpemVvZihzb2NrYWRkcik7CisKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAmc29ja2FkZHIuc2EsICZsKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICBpZiAobCA8IHNpemVvZihzYV9mYW1pbHlfdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKHNvY2thZGRyLnNhLnNhX2ZhbWlseSAhPSBBRl9VTklYKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChwYXRoKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBhdGgpOworCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5uYW1lZCBzb2NrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsID09IHNpemVvZihzYV9mYW1pbHlfdCk7CisKKyAgICAgICAgICAgICAgICBpZiAocGF0aFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vcm1hbCBwYXRoIHNvY2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsID49IHNpemVvZihzYV9mYW1pbHlfdCkgKyBsZW5ndGggKyAxKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAocGF0aCwgc29ja2FkZHIudW4uc3VuX3BhdGgsIGxlbmd0aCsxKSA9PSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobCA9PSBzaXplb2Yoc2FfZmFtaWx5X3QpICsgbGVuZ3RoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAocGF0aCwgc29ja2FkZHIudW4uc3VuX3BhdGgsIGxlbmd0aCkgPT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworfQorCitpbnQgc2Rfbm90aWZ5KGludCB1bnNldF9lbnZpcm9ubWVudCwgY29uc3QgY2hhciAqc3RhdGUpIHsKKyNpZiBkZWZpbmVkKERJU0FCTEVfU1lTVEVNRCkgfHwgIWRlZmluZWQoX19saW51eF9fKSB8fCAhZGVmaW5lZChTT0NLX0NMT0VYRUMpCisgICAgICAgIHJldHVybiAwOworI2Vsc2UKKyAgICAgICAgaW50IGZkID0gLTEsIHI7CisgICAgICAgIHN0cnVjdCBtc2doZHIgbXNnaGRyOworICAgICAgICBzdHJ1Y3QgaW92ZWMgaW92ZWM7CisgICAgICAgIHVuaW9uIHNvY2thZGRyX3VuaW9uIHNvY2thZGRyOworICAgICAgICBjb25zdCBjaGFyICplOworCisgICAgICAgIGlmICghc3RhdGUpIHsKKyAgICAgICAgICAgICAgICByID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGUgPSBnZXRlbnYoIk5PVElGWV9TT0NLRVQiKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogTXVzdCBiZSBhbiBhYnN0cmFjdCBzb2NrZXQsIG9yIGFuIGFic29sdXRlIHBhdGggKi8KKyAgICAgICAgaWYgKChlWzBdICE9ICdAJyAmJiBlWzBdICE9ICcvJykgfHwgZVsxXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgciA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfREdSQU18U09DS19DTE9FWEVDLCAwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgciA9IC1lcnJubzsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmc29ja2FkZHIsIDAsIHNpemVvZihzb2NrYWRkcikpOworICAgICAgICBzb2NrYWRkci5zYS5zYV9mYW1pbHkgPSBBRl9VTklYOworICAgICAgICBzdHJuY3B5KHNvY2thZGRyLnVuLnN1bl9wYXRoLCBlLCBzaXplb2Yoc29ja2FkZHIudW4uc3VuX3BhdGgpKTsKKworICAgICAgICBpZiAoc29ja2FkZHIudW4uc3VuX3BhdGhbMF0gPT0gJ0AnKQorICAgICAgICAgICAgICAgIHNvY2thZGRyLnVuLnN1bl9wYXRoWzBdID0gMDsKKworICAgICAgICBtZW1zZXQoJmlvdmVjLCAwLCBzaXplb2YoaW92ZWMpKTsKKyAgICAgICAgaW92ZWMuaW92X2Jhc2UgPSAoY2hhciopIHN0YXRlOworICAgICAgICBpb3ZlYy5pb3ZfbGVuID0gc3RybGVuKHN0YXRlKTsKKworICAgICAgICBtZW1zZXQoJm1zZ2hkciwgMCwgc2l6ZW9mKG1zZ2hkcikpOworICAgICAgICBtc2doZHIubXNnX25hbWUgPSAmc29ja2FkZHI7CisgICAgICAgIG1zZ2hkci5tc2dfbmFtZWxlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgKyBzdHJsZW4oZSk7CisKKyAgICAgICAgaWYgKG1zZ2hkci5tc2dfbmFtZWxlbiA+IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKQorICAgICAgICAgICAgICAgIG1zZ2hkci5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOworCisgICAgICAgIG1zZ2hkci5tc2dfaW92ID0gJmlvdmVjOworICAgICAgICBtc2doZHIubXNnX2lvdmxlbiA9IDE7CisKKyAgICAgICAgaWYgKHNlbmRtc2coZmQsICZtc2doZHIsIE1TR19OT1NJR05BTCkgPCAwKSB7CisgICAgICAgICAgICAgICAgciA9IC1lcnJubzsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisgICAgICAgIHIgPSAxOworCitmaW5pc2g6CisgICAgICAgIGlmICh1bnNldF9lbnZpcm9ubWVudCkKKyAgICAgICAgICAgICAgICB1bnNldGVudigiTk9USUZZX1NPQ0tFVCIpOworCisgICAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKworICAgICAgICByZXR1cm4gcjsKKyNlbmRpZgorfQorCitpbnQgc2Rfbm90aWZ5ZihpbnQgdW5zZXRfZW52aXJvbm1lbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisjaWYgZGVmaW5lZChESVNBQkxFX1NZU1RFTUQpIHx8ICFkZWZpbmVkKF9fbGludXhfXykKKyAgICAgICAgcmV0dXJuIDA7CisjZWxzZQorICAgICAgICB2YV9saXN0IGFwOworICAgICAgICBjaGFyICpwID0gTlVMTDsKKyAgICAgICAgaW50IHI7CisKKyAgICAgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgICAgICAgIHIgPSB2YXNwcmludGYoJnAsIGZvcm1hdCwgYXApOworICAgICAgICB2YV9lbmQoYXApOworCisgICAgICAgIGlmIChyIDwgMCB8fCAhcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICByID0gc2Rfbm90aWZ5KHVuc2V0X2Vudmlyb25tZW50LCBwKTsKKyAgICAgICAgZnJlZShwKTsKKworICAgICAgICByZXR1cm4gcjsKKyNlbmRpZgorfQorCitpbnQgc2RfYm9vdGVkKHZvaWQpIHsKKyNpZiBkZWZpbmVkKERJU0FCTEVfU1lTVEVNRCkgfHwgIWRlZmluZWQoX19saW51eF9fKQorICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisKKyAgICAgICAgc3RydWN0IHN0YXQgYSwgYjsKKworICAgICAgICAvKiBXZSBzaW1wbHkgdGVzdCB3aGV0aGVyIHRoZSBzeXN0ZW1kIGNncm91cCBoaWVyYXJjaHkgaXMKKyAgICAgICAgICogbW91bnRlZCAqLworCisgICAgICAgIGlmIChsc3RhdCgiL3N5cy9mcy9jZ3JvdXAiLCAmYSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChsc3RhdCgiL3N5cy9mcy9jZ3JvdXAvc3lzdGVtZCIsICZiKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcmV0dXJuIGEuc3RfZGV2ICE9IGIuc3RfZGV2OworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kYnVzL3NkLWRhZW1vbi5oIGIvZGJ1cy0xLjQuMTAvZGJ1cy9zZC1kYWVtb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhjOTZkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGJ1cy9zZC1kYWVtb24uaApAQCAtMCwwICsxLDI1NyBAQAorLyotKi0gTW9kZTogQzsgYy1iYXNpYy1vZmZzZXQ6IDg7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0qLworCisjaWZuZGVmIGZvb3NkZGFlbW9uaGZvbworI2RlZmluZSBmb29zZGRhZW1vbmhmb28KKworLyoqKgorICBDb3B5cmlnaHQgMjAxMCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAgU09GVFdBUkUuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGZldyBzeXN0ZW1kIHJlbGF0ZWQgaW50ZXJmYWNlcyBmb3IKKyAgd3JpdGluZyBkYWVtb25zLiBUaGVzZSBpbnRlcmZhY2VzIGFyZSB0cml2aWFsIHRvIGltcGxlbWVudC4gVG8KKyAgc2ltcGxpZnkgcG9ydGluZyB3ZSBwcm92aWRlIHRoaXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgorICBBcHBsaWNhdGlvbnMgYXJlIHdlbGNvbWUgdG8gcmVpbXBsZW1lbnQgdGhlIGFsZ29yaXRobXMgZGVzY3JpYmVkCisgIGhlcmUgaWYgdGhleSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZXNlIHR3byBzb3VyY2UgZmlsZXMuCisKKyAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkOgorCisgIC0gU3VwcG9ydCBmb3IgbG9nZ2luZyB3aXRoIGxvZyBsZXZlbHMgb24gc3RkZXJyCisgIC0gRmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgZm9yIHNvY2tldC1iYXNlZCBhY3RpdmF0aW9uCisgIC0gRGFlbW9uIHN0YXJ0dXAgYW5kIHN0YXR1cyBub3RpZmljYXRpb24KKyAgLSBEZXRlY3Rpb24gb2Ygc3lzdGVtZCBib290cworCisgIFlvdSBtYXkgY29tcGlsZSB0aGlzIHdpdGggLURESVNBQkxFX1NZU1RFTUQgdG8gZGlzYWJsZSBzeXN0ZW1kCisgIHN1cHBvcnQuIFRoaXMgbWFrZXMgYWxsIHRob3NlIGNhbGxzIE5PUHMgdGhhdCBhcmUgZGlyZWN0bHkgcmVsYXRlZCB0bworICBzeXN0ZW1kIChpLmUuIG9ubHkgc2RfaXNfeHh4KCkgd2lsbCBzdGF5IHVzZWZ1bCkuCisKKyAgU2luY2UgdGhpcyBpcyBkcm9wLWluIGNvZGUgd2UgZG9uJ3Qgd2FudCBhbnkgb2Ygb3VyIHN5bWJvbHMgdG8gYmUKKyAgZXhwb3J0ZWQgaW4gYW55IGNhc2UuIEhlbmNlIHdlIGRlY2xhcmUgaGlkZGVuIHZpc2liaWxpdHkgZm9yIGFsbCBvZgorICB0aGVtLgorCisgIFlvdSBtYXkgZmluZCBhbiB1cC10by1kYXRlIHZlcnNpb24gb2YgdGhlc2Ugc291cmNlIGZpbGVzIG9ubGluZToKKworICBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvc3lzdGVtZC9wbGFpbi9zcmMvc2QtZGFlbW9uLmgKKyAgaHR0cDovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL3N5c3RlbWQvcGxhaW4vc3JjL3NkLWRhZW1vbi5jCisKKyAgVGhpcyBzaG91bGQgY29tcGlsZSBvbiBub24tTGludXggc3lzdGVtcywgdG9vLCBidXQgd2l0aCB0aGUKKyAgZXhjZXB0aW9uIG9mIHRoZSBzZF9pc194eHgoKSBjYWxscyBhbGwgZnVuY3Rpb25zIHdpbGwgYmVjb21lIE5PUHMuCisKKyAgU2VlIHNkLWRhZW1vbig3KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyovCisKKyNpZiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIF9zZF9wcmludGZfYXR0cl8oYSxiKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIGEsIGIpKSkKKyNkZWZpbmUgX3NkX2hpZGRlbl8gX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIF9zZF9wcmludGZfYXR0cl8oYSxiKQorI2RlZmluZSBfc2RfaGlkZGVuXworI2VuZGlmCisKKy8qCisgIExvZyBsZXZlbHMgZm9yIHVzYWdlIG9uIHN0ZGVycjoKKworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBTRF9OT1RJQ0UgIkhlbGxvIFdvcmxkIVxuIik7CisKKyAgVGhpcyBpcyBzaW1pbGFyIHRvIHByaW50aygpIHVzYWdlIGluIHRoZSBrZXJuZWwuCisqLworI2RlZmluZSBTRF9FTUVSRyAgICI8MD4iICAvKiBzeXN0ZW0gaXMgdW51c2FibGUgKi8KKyNkZWZpbmUgU0RfQUxFUlQgICAiPDE+IiAgLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUgU0RfQ1JJVCAgICAiPDI+IiAgLyogY3JpdGljYWwgY29uZGl0aW9ucyAqLworI2RlZmluZSBTRF9FUlIgICAgICI8Mz4iICAvKiBlcnJvciBjb25kaXRpb25zICovCisjZGVmaW5lIFNEX1dBUk5JTkcgIjw0PiIgIC8qIHdhcm5pbmcgY29uZGl0aW9ucyAqLworI2RlZmluZSBTRF9OT1RJQ0UgICI8NT4iICAvKiBub3JtYWwgYnV0IHNpZ25pZmljYW50IGNvbmRpdGlvbiAqLworI2RlZmluZSBTRF9JTkZPICAgICI8Nj4iICAvKiBpbmZvcm1hdGlvbmFsICovCisjZGVmaW5lIFNEX0RFQlVHICAgIjw3PiIgIC8qIGRlYnVnLWxldmVsIG1lc3NhZ2VzICovCisKKy8qIFRoZSBmaXJzdCBwYXNzZWQgZmlsZSBkZXNjcmlwdG9yIGlzIGZkIDMgKi8KKyNkZWZpbmUgU0RfTElTVEVOX0ZEU19TVEFSVCAzCisKKy8qCisgIFJldHVybnMgaG93IG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBoYXZlIGJlZW4gcGFzc2VkLCBvciBhIG5lZ2F0aXZlCisgIGVycm5vIGNvZGUgb24gZmFpbHVyZS4gT3B0aW9uYWxseSwgcmVtb3ZlcyB0aGUgJExJU1RFTl9GRFMgYW5kCisgICRMSVNURU5fUElEIGZpbGUgZGVzY3JpcHRvcnMgZnJvbSB0aGUgZW52aXJvbm1lbnQgKHJlY29tbWVuZGVkLCBidXQKKyAgcHJvYmxlbWF0aWMgaW4gdGhyZWFkZWQgZW52aXJvbm1lbnRzKS4gSWYgciBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mCisgIHRoaXMgZnVuY3Rpb24geW91J2xsIGZpbmQgdGhlIGZpbGUgZGVzY3JpcHRvcnMgcGFzc2VkIGFzIGZkcworICBTRF9MSVNURU5fRkRTX1NUQVJUIHRvIFNEX0xJU1RFTl9GRFNfU1RBUlQrci0xLiBSZXR1cm5zIGEgbmVnYXRpdmUKKyAgZXJybm8gc3R5bGUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBUaGlzIGZ1bmN0aW9uIGNhbGwgZW5zdXJlcyB0aGF0CisgIHRoZSBGRF9DTE9FWEVDIGZsYWcgaXMgc2V0IGZvciB0aGUgcGFzc2VkIGZpbGUgZGVzY3JpcHRvcnMsIHRvIG1ha2UKKyAgc3VyZSB0aGV5IGFyZSBub3QgcGFzc2VkIG9uIHRvIGNoaWxkIHByb2Nlc3Nlcy4gSWYgRkRfQ0xPRVhFQyBzaGFsbAorICBub3QgYmUgc2V0LCB0aGUgY2FsbGVyIG5lZWRzIHRvIHVuc2V0IGl0IGFmdGVyIHRoaXMgY2FsbCBmb3IgYWxsIGZpbGUKKyAgZGVzY3JpcHRvcnMgdGhhdCBhcmUgdXNlZC4KKworICBTZWUgc2RfbGlzdGVuX2ZkcygzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyovCitpbnQgc2RfbGlzdGVuX2ZkcyhpbnQgdW5zZXRfZW52aXJvbm1lbnQpIF9zZF9oaWRkZW5fOworCisvKgorICBIZWxwZXIgY2FsbCBmb3IgaWRlbnRpZnlpbmcgYSBwYXNzZWQgZmlsZSBkZXNjcmlwdG9yLiBSZXR1cm5zIDEgaWYKKyAgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBhIEZJRk8gaW4gdGhlIGZpbGUgc3lzdGVtIHN0b3JlZCB1bmRlciB0aGUKKyAgc3BlY2lmaWVkIHBhdGgsIDAgb3RoZXJ3aXNlLiBJZiBwYXRoIGlzIE5VTEwgYSBwYXRoIG5hbWUgY2hlY2sgd2lsbAorICBub3QgYmUgZG9uZSBhbmQgdGhlIGNhbGwgb25seSB2ZXJpZmllcyBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yCisgIHJlZmVycyB0byBhIEZJRk8uIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJubyBzdHlsZSBlcnJvciBjb2RlIG9uCisgIGZhaWx1cmUuCisKKyAgU2VlIHNkX2lzX2ZpZm8oMykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisqLworaW50IHNkX2lzX2ZpZm8oaW50IGZkLCBjb25zdCBjaGFyICpwYXRoKSBfc2RfaGlkZGVuXzsKKworLyoKKyAgSGVscGVyIGNhbGwgZm9yIGlkZW50aWZ5aW5nIGEgcGFzc2VkIGZpbGUgZGVzY3JpcHRvci4gUmV0dXJucyAxIGlmCisgIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgYSBzb2NrZXQgb2YgdGhlIHNwZWNpZmllZCBmYW1pbHkgKEFGX0lORVQsCisgIC4uLikgYW5kIHR5cGUgKFNPQ0tfREdSQU0sIFNPQ0tfU1RSRUFNLCAuLi4pLCAwIG90aGVyd2lzZS4gSWYKKyAgZmFtaWx5IGlzIDAgYSBzb2NrZXQgZmFtaWx5IGNoZWNrIHdpbGwgbm90IGJlIGRvbmUuIElmIHR5cGUgaXMgMCBhCisgIHNvY2tldCB0eXBlIGNoZWNrIHdpbGwgbm90IGJlIGRvbmUgYW5kIHRoZSBjYWxsIG9ubHkgdmVyaWZpZXMgaWYKKyAgdGhlIGZpbGUgZGVzY3JpcHRvciByZWZlcnMgdG8gYSBzb2NrZXQuIElmIGxpc3RlbmluZyBpcyA+IDAgaXQgaXMKKyAgdmVyaWZpZWQgdGhhdCB0aGUgc29ja2V0IGlzIGluIGxpc3RlbmluZyBtb2RlLiAoaS5lLiBsaXN0ZW4oKSBoYXMKKyAgYmVlbiBjYWxsZWQpIElmIGxpc3RlbmluZyBpcyA9PSAwIGl0IGlzIHZlcmlmaWVkIHRoYXQgdGhlIHNvY2tldCBpcworICBub3QgaW4gbGlzdGVuaW5nIG1vZGUuIElmIGxpc3RlbmluZyBpcyA8IDAgbm8gbGlzdGVuaW5nIG1vZGUgY2hlY2sKKyAgaXMgZG9uZS4gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm5vIHN0eWxlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKworICBTZWUgc2RfaXNfc29ja2V0KDMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKi8KK2ludCBzZF9pc19zb2NrZXQoaW50IGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IGxpc3RlbmluZykgX3NkX2hpZGRlbl87CisKKy8qCisgIEhlbHBlciBjYWxsIGZvciBpZGVudGlmeWluZyBhIHBhc3NlZCBmaWxlIGRlc2NyaXB0b3IuIFJldHVybnMgMSBpZgorICB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGFuIEludGVybmV0IHNvY2tldCwgb2YgdGhlIHNwZWNpZmllZCBmYW1pbHkKKyAgKGVpdGhlciBBRl9JTkVUIG9yIEFGX0lORVQ2KSBhbmQgdGhlIHNwZWNpZmllZCB0eXBlIChTT0NLX0RHUkFNLAorICBTT0NLX1NUUkVBTSwgLi4uKSwgMCBvdGhlcndpc2UuIElmIHZlcnNpb24gaXMgMCBhIHByb3RvY29sIHZlcnNpb24KKyAgY2hlY2sgaXMgbm90IGRvbmUuIElmIHR5cGUgaXMgMCBhIHNvY2tldCB0eXBlIGNoZWNrIHdpbGwgbm90IGJlCisgIGRvbmUuIElmIHBvcnQgaXMgMCBhIHNvY2tldCBwb3J0IGNoZWNrIHdpbGwgbm90IGJlIGRvbmUuIFRoZQorICBsaXN0ZW5pbmcgZmxhZyBpcyB1c2VkIHRoZSBzYW1lIHdheSBhcyBpbiBzZF9pc19zb2NrZXQoKS4gUmV0dXJucyBhCisgIG5lZ2F0aXZlIGVycm5vIHN0eWxlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKworICBTZWUgc2RfaXNfc29ja2V0X2luZXQoMykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisqLworaW50IHNkX2lzX3NvY2tldF9pbmV0KGludCBmZCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBsaXN0ZW5pbmcsIHVpbnQxNl90IHBvcnQpIF9zZF9oaWRkZW5fOworCisvKgorICBIZWxwZXIgY2FsbCBmb3IgaWRlbnRpZnlpbmcgYSBwYXNzZWQgZmlsZSBkZXNjcmlwdG9yLiBSZXR1cm5zIDEgaWYKKyAgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBhbiBBRl9VTklYIHNvY2tldCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKKyAgKFNPQ0tfREdSQU0sIFNPQ0tfU1RSRUFNLCAuLi4pIGFuZCBwYXRoLCAwIG90aGVyd2lzZS4gSWYgdHlwZSBpcyAwCisgIGEgc29ja2V0IHR5cGUgY2hlY2sgd2lsbCBub3QgYmUgZG9uZS4gSWYgcGF0aCBpcyBOVUxMIGEgc29ja2V0IHBhdGgKKyAgY2hlY2sgd2lsbCBub3QgYmUgZG9uZS4gRm9yIG5vcm1hbCBBRl9VTklYIHNvY2tldHMgc2V0IGxlbmd0aCB0bworICAwLiBGb3IgYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldHMgc2V0IGxlbmd0aCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICBzb2NrZXQgbmFtZSAoaW5jbHVkaW5nIHRoZSBpbml0aWFsIDAgYnl0ZSksIGFuZCBwYXNzIHRoZSBmdWxsCisgIHNvY2tldCBwYXRoIGluIHBhdGggKGluY2x1ZGluZyB0aGUgaW5pdGlhbCAwIGJ5dGUpLiBUaGUgbGlzdGVuaW5nCisgIGZsYWcgaXMgdXNlZCB0aGUgc2FtZSB3YXkgYXMgaW4gc2RfaXNfc29ja2V0KCkuIFJldHVybnMgYSBuZWdhdGl2ZQorICBlcnJubyBzdHlsZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisKKyAgU2VlIHNkX2lzX3NvY2tldF91bml4KDMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKi8KK2ludCBzZF9pc19zb2NrZXRfdW5peChpbnQgZmQsIGludCB0eXBlLCBpbnQgbGlzdGVuaW5nLCBjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgbGVuZ3RoKSBfc2RfaGlkZGVuXzsKKworLyoKKyAgSW5mb3JtcyBzeXN0ZW1kIGFib3V0IGNoYW5nZWQgZGFlbW9uIHN0YXRlLiBUaGlzIHRha2VzIGEgbnVtYmVyIG9mCisgIG5ld2xpbmUgc2VwZXJhdGVkIGVudmlyb25tZW50LXN0eWxlIHZhcmlhYmxlIGFzc2lnbm1lbnRzIGluIGEKKyAgc3RyaW5nLiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUga25vd246CisKKyAgICAgUkVBRFk9MSAgICAgIFRlbGxzIHN5c3RlbWQgdGhhdCBkYWVtb24gc3RhcnR1cCBpcyBmaW5pc2hlZCAob25seQorICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgZm9yIHNlcnZpY2VzIG9mIFR5cGU9bm90aWZ5KS4gVGhlIHBhc3NlZAorICAgICAgICAgICAgICAgICAgYXJndW1lbnQgaXMgYSBib29sZWFuICIxIiBvciAiMCIuIFNpbmNlIHRoZXJlIGlzCisgICAgICAgICAgICAgICAgICBsaXR0bGUgdmFsdWUgaW4gc2lnbmFsbGluZyBub24tcmVhZGluZXNzIHRoZSBvbmx5CisgICAgICAgICAgICAgICAgICB2YWx1ZSBkYWVtb25zIHNob3VsZCBzZW5kIGlzICJSRUFEWT0xIi4KKworICAgICBTVEFUVVM9Li4uICAgUGFzc2VzIGEgc2luZ2xlLWxpbmUgc3RhdHVzIHN0cmluZyBiYWNrIHRvIHN5c3RlbWQKKyAgICAgICAgICAgICAgICAgIHRoYXQgZGVzY3JpYmVzIHRoZSBkYWVtb24gc3RhdGUuIFRoaXMgaXMgZnJlZS1mcm9tCisgICAgICAgICAgICAgICAgICBhbmQgY2FuIGJlIHVzZWQgZm9yIHZhcmlvdXMgcHVycG9zZXM6IGdlbmVyYWwgc3RhdGUKKyAgICAgICAgICAgICAgICAgIGZlZWRiYWNrLCBmc2NrLWxpa2UgcHJvZ3JhbXMgY291bGQgcGFzcyBjb21wbGV0aW9uCisgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlcyBhbmQgZmFpbGluZyBwcm9ncmFtcyBjb3VsZCBwYXNzIGEgaHVtYW4KKyAgICAgICAgICAgICAgICAgIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuIEV4YW1wbGU6ICJTVEFUVVM9Q29tcGxldGVkCisgICAgICAgICAgICAgICAgICA2NiUgb2YgZmlsZSBzeXN0ZW0gY2hlY2suLi4iCisKKyAgICAgRVJSTk89Li4uICAgIElmIGEgZGFlbW9uIGZhaWxzLCB0aGUgZXJybm8tc3R5bGUgZXJyb3IgY29kZSwKKyAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCBhcyBzdHJpbmcuIEV4YW1wbGU6ICJFUlJOTz0yIiBmb3IgRU5PRU5ULgorCisgICAgIEJVU0VSUk9SPS4uLiBJZiBhIGRhZW1vbiBmYWlscywgdGhlIEQtQnVzIGVycm9yLXN0eWxlIGVycm9yCisgICAgICAgICAgICAgICAgICBjb2RlLiBFeGFtcGxlOiAiQlVTRVJST1I9b3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVGltZWRPdXQiCisKKyAgICAgTUFJTlBJRD0uLi4gIFRoZSBtYWluIHBpZCBvZiBhIGRhZW1vbiwgaW4gY2FzZSBzeXN0ZW1kIGRpZCBub3QKKyAgICAgICAgICAgICAgICAgIGZvcmsgb2ZmIHRoZSBwcm9jZXNzIGl0c2VsZi4gRXhhbXBsZTogIk1BSU5QSUQ9NDcxMSIKKworICBEYWVtb25zIGNhbiBjaG9vc2UgdG8gc2VuZCBhZGRpdGlvbmFsIHZhcmlhYmxlcy4gSG93ZXZlciwgaXQgaXMKKyAgcmVjb21tZW5lZCB0byBwcmVmaXggdmFyaWFibGUgbmFtZXMgbm90IGxpc3RlZCBhYm92ZSB3aXRoIFhfLgorCisgIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJuby1zdHlsZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIFJldHVybnMgPiAwCisgIGlmIHN5c3RlbWQgY291bGQgYmUgbm90aWZpZWQsIDAgaWYgaXQgY291bGRuJ3QgcG9zc2libHkgYmVjYXVzZQorICBzeXN0ZW1kIGlzIG5vdCBydW5uaW5nLgorCisgIEV4YW1wbGU6IFdoZW4gYSBkYWVtb24gZmluaXNoZWQgc3RhcnRpbmcgdXAsIGl0IGNvdWxkIGlzc3VlIHRoaXMKKyAgY2FsbCB0byBub3RpZnkgc3lzdGVtZCBhYm91dCBpdDoKKworICAgICBzZF9ub3RpZnkoMCwgIlJFQURZPTEiKTsKKworICBTZWUgc2Rfbm90aWZ5ZigpIGZvciBtb3JlIGNvbXBsZXRlIGV4YW1wbGVzLgorCisgIFNlZSBzZF9ub3RpZnkoMykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisqLworaW50IHNkX25vdGlmeShpbnQgdW5zZXRfZW52aXJvbm1lbnQsIGNvbnN0IGNoYXIgKnN0YXRlKSBfc2RfaGlkZGVuXzsKKworLyoKKyAgU2ltaWxhciB0byBzZF9ub3RpZnkoKSBidXQgdGFrZXMgYSBmb3JtYXQgc3RyaW5nLgorCisgIEV4YW1wbGUgMTogQSBkYWVtb24gY291bGQgc2VuZCB0aGUgZm9sbG93aW5nIGFmdGVyIGluaXRpYWxpemF0aW9uOgorCisgICAgIHNkX25vdGlmeWYoMCwgIlJFQURZPTFcbiIKKyAgICAgICAgICAgICAgICAgICAiU1RBVFVTPVByb2Nlc3NpbmcgcmVxdWVzdHMuLi5cbiIKKyAgICAgICAgICAgICAgICAgICAiTUFJTlBJRD0lbHUiLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBnZXRwaWQoKSk7CisKKyAgRXhhbXBsZSAyOiBBIGRhZW1vbiBjb3VsZCBzZW5kIHRoZSBmb2xsb3dpbmcgc2hvcnRseSBiZWZvcmUKKyAgZXhpdGluZywgb24gZmFpbHVyZToKKworICAgICBzZF9ub3RpZnlmKDAsICJTVEFUVVM9RmFpbGVkIHRvIHN0YXJ0IHVwOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICJFUlJOTz0laSIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLAorICAgICAgICAgICAgICAgICAgIGVycm5vKTsKKworICBTZWUgc2Rfbm90aWZ5ZigzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyovCitpbnQgc2Rfbm90aWZ5ZihpbnQgdW5zZXRfZW52aXJvbm1lbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfc2RfcHJpbnRmX2F0dHJfKDIsMykgX3NkX2hpZGRlbl87CisKKy8qCisgIFJldHVybnMgPiAwIGlmIHRoZSBzeXN0ZW0gd2FzIGJvb3RlZCB3aXRoIHN5c3RlbWQuIFJldHVybnMgPCAwIG9uCisgIGVycm9yLiBSZXR1cm5zIDAgaWYgdGhlIHN5c3RlbSB3YXMgbm90IGJvb3RlZCB3aXRoIHN5c3RlbWQuIE5vdGUKKyAgdGhhdCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSBoYW5kbGUgbm9uLXN5c3RlbWQgYm9vdHMganVzdAorICBmaW5lLiBZb3Ugc2hvdWxkIE5PVCBwcm90ZWN0IHRoZW0gd2l0aCBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4gQWxzbworICBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgc3lzdGVtLCBub3QgdGhlIHVzZXIKKyAgc2Vzc2lvbiBpcyBjb250cm9sbGVkIGJ5IHN5c3RlbWQuIEhvd2V2ZXIgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3b3JrCisgIGZvciBib3RoIHNlc3Npb24gYW5kIHN5c3RlbSBzZXJ2aWNlcy4KKworICBTZWUgc2RfYm9vdGVkKDMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKi8KK2ludCBzZF9ib290ZWQodm9pZCkgX3NkX2hpZGRlbl87CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZGJ1cy92ZXJzaW9uaW5mby5yYy5pbiBiL2RidXMtMS40LjEwL2RidXMvdmVyc2lvbmluZm8ucmMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0NWIzOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RidXMvdmVyc2lvbmluZm8ucmMuaW4KQEAgLTAsMCArMSw1MiBAQAorLyogdmVyc2lvbmluZm8ucmMuaW4gLSBmb3IgZGJ1cworICogQ29weXJpZ2h0IChDKSAyMDA1IGcxMCBDb2RlIEdtYkgKKyAqIAorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdGhlIGF1dGhvciBnaXZlcworICogdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0IGV2ZW4gdGhlCisgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworIAorLyogVGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSBjb25maWd1cmUgdG8gY3JlYXRlIHZlcnNpb25pbmZvLnJjICovCisKKyNsaW5lIF9fTElORV9fICJ2ZXJzaW9uaW5mby5yYy5pbiIKKworI2luY2x1ZGUgPGFmeHJlcy5oPgorCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIEBCVUlMRF9GSUxFVkVSU0lPTkAKKyBQUk9EVUNUVkVSU0lPTiBAQlVJTERfRklMRVZFUlNJT05ACisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyAweDIxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgyMEwKKyNlbmRpZgorIEZJTEVPUyAweDQwMDA0TAorIEZJTEVUWVBFIDB4MUwKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLCAiUHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuXDAiCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiRnJlZURlc2t0b3Aub3JnXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImRidXMgLSBGcmVlRGVza3RvcCBtZXNzYWdlIGJ1cyBzeXN0ZW1cMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICJAREJVU19WRVJTSU9OQFwwIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJkYnVzXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IKkgMjAwOSBGcmVlRGVza3RvcC5vcmdcMCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJkYnVzLTEuZGxsXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIlwwIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgImRidXNcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICJAREJVU19WRVJTSU9OQFwwIgorICAgICAgICAgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsICJAQlVJTERfVElNRVNUQU1QQFwwIgorICAgICAgICBFTkQKKyAgICBFTkQKK0VORAorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kZXBjb21wIGIvZGJ1cy0xLjQuMTAvZGVwY29tcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjhlZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZGVwY29tcApAQCAtMCwwICsxLDYzMCBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZQorIyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KKyAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRkZXBtb2RlIiB8fCB0ZXN0IC16ICIkc291cmNlIiB8fCB0ZXN0IC16ICIkb2JqZWN0IjsgdGhlbgorICBlY2hvICJkZXBjb21wOiBWYXJpYWJsZXMgc291cmNlLCBvYmplY3QgYW5kIGRlcG1vZGUgbXVzdCBiZSBzZXQiIDE+JjIKKyAgZXhpdCAxCitmaQorCisjIERlcGVuZGVuY2llcyBmb3Igc3ViL2Jhci5vIG9yIHN1Yi9iYXIub2JqIGdvIGludG8gc3ViLy5kZXBzL2Jhci5Qby4KK2RlcGZpbGU9JHtkZXBmaWxlLWBlY2hvICIkb2JqZWN0IiB8CisgIHNlZCAnc3xbXlxcL10qJHwnJHtERVBESVItLmRlcHN9Jy8mfDtzfFwuXChbXi5dKlwpJHwuUFwxfDtzfFBvYmokfFBvfCdgfQordG1wZGVwZmlsZT0ke3RtcGRlcGZpbGUtYGVjaG8gIiRkZXBmaWxlIiB8IHNlZCAncy9cLlwoW14uXSpcKSQvLlRcMS8nYH0KKworcm0gLWYgIiR0bXBkZXBmaWxlIgorCisjIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKKyMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCisjIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCisjIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgoraWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KKyAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCisgIGdjY2ZsYWc9LU0KKyAgZGVwbW9kZT1nY2MKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBkYXNobXN0ZG91dCB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50LgorICAgZGFzaG1mbGFnPS14TQorICAgZGVwbW9kZT1kYXNobXN0ZG91dAorZmkKKworY3lncGF0aF91PSJjeWdwYXRoIC11IC1mIC0iCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjbXN5czsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBtc3Zpc3VhbGNwcCBidXQgdy9vIGN5Z3BhdGggdHJhbnNsYXRpb24uCisgICAjIEp1c3QgY29udmVydCB0aGUgYmFja3NsYXNoLWVzY2FwZWQgYmFja3NsYXNoZXMgdG8gc2luZ2xlIGZvcndhcmQKKyAgICMgc2xhc2hlcyB0byBzYXRpc2Z5IGRlcGVuZC5tNAorICAgY3lncGF0aF91PSJzZWQgcyxcXFxcXFxcXCwvLGciCisgICBkZXBtb2RlPW1zdmlzdWFsY3BwCitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyMjIFVuZm9ydHVuYXRlbHksIEZyZWVCU0QgYzg5IGFjY2VwdGFuY2Ugb2YgZmxhZ3MgZGVwZW5kcyB1cG9uCisjIyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG9yZGVyOyBzbyBhZGQgdGhlIGZsYWdzIHdoZXJlIHRoZXkKKyMjIGFwcGVhciBpbiBkZXBlbmQyLmFtLiAgTm90ZSB0aGF0IHRoZSBzbG93ZG93biBpbmN1cnJlZCBoZXJlCisjIyBhZmZlY3RzIG9ubHkgY29uZmlndXJlOiBpbiBtYWtlZmlsZXMsICVGQVNUREVQJSBzaG9ydGN1dHMgdGhpcy4KKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1jKSBzZXQgZm5vcmQgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIgIiRhcmciIDs7CisgICAgKikgIHNldCBmbm9yZCAiJEAiICIkYXJnIiA7OworICAgIGVzYWMKKyAgICBzaGlmdCAjIGZub3JkCisgICAgc2hpZnQgIyAkYXJnCisgIGRvbmUKKyAgIiRAIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCisjIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKKyMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCisjIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCisjIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQorIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKKyMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgorIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQorIyMgICB0aGFuIHJlbmFtaW5nKS4KKyAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCisgICAgZ2NjZmxhZz0tTUQsCisgIGZpCisgICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisjIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCisgIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAorICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCisjIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQorIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCisjIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZworIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbworIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8CisjIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKKyMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcworIyMgd2VsbC4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcworICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKKyAgICB0ciAnCisnICcgJyA+PiAiJGRlcGZpbGUiCisgICAgZWNobyA+PiAiJGRlcGZpbGUiCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2FpeCkKKyAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcworICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQorICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCisgICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgorICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2UudQorICAgICIkQCIgLVdjLC1NCisgIGVsc2UKKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLnUKKyAgICAiJEAiIC1NCisgIGZpCisgIHN0YXQ9JD8KKworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCisgICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCisgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitpY2MpCisgICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgorICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKKyAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCisgICMgICAgZm9vLm86IHN1Yi9mb28uYworICAjICAgIGZvby5vOiBzdWIvZm9vLmgKKyAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6CisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAorICAjICAgIHN1Yi9mb28uYzoKKyAgIyAgICBzdWIvZm9vLmg6CisgICMgSUNDIDcuMSB3aWxsIG91dHB1dAorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCisgICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKKyAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCisgICMgICAgIC4uLgorCisgICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAorICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgorICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAorICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwMikKKyAgIyBUaGUgImhwIiBzdGFuemEgYWJvdmUgZG9lcyBub3Qgd29yayB3aXRoIGFDQyAoQysrKSBhbmQgSFAncyBpYTY0CisgICMgY29tcGlsZXJzLCB3aGljaCBoYXZlIGludGVncmF0ZWQgcHJlcHJvY2Vzc29ycy4gIFRoZSBjb3JyZWN0IG9wdGlvbgorICAjIHRvIHVzZSB3aXRoIHRoZXNlIGlzICtNYWtlZDsgaXQgd3JpdGVzIGRlcGVuZGVuY2llcyB0byBhIGZpbGUgbmFtZWQKKyAgIyAnZm9vLmQnLCB3aGljaCBsYW5kcyBuZXh0IHRvIHRoZSBvYmplY3QgZmlsZSwgd2hlcmV2ZXIgdGhhdAorICAjIGhhcHBlbnMgdG8gYmUuCisgICMgTXVjaCBvZiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRydTY0IGNhc2U7IHNlZSBjb21tZW50cyB0aGVyZS4KKyAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKKyAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2UuZAorICAgICIkQCIgLVdjLCtNYWtlZAorICBlbHNlCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICIkQCIgK01ha2VkCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgIyBBZGQgYGRlcGVuZGVudC5oOicgbGluZXMuCisgICAgc2VkIC1uZSAnMiwkeworCSAgICAgICBzL14gKi8vCisJICAgICAgIHMvIFxcKiQvLworCSAgICAgICBzLyQvOi8KKwkgICAgICAgcAorCSAgICAgfScgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZTIiCisgIDs7CisKK3RydTY0KQorICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQorICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgorICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisKKyAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQorICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCisgICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgorICAgICAgIworICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKKyAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCisgICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCisgICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCisgICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcworICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgorICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40CisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAorICAgICAgIiRAIiAtTUQKKyAgIGZpCisKKyAgIHN0YXQ9JD8KKyAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICAgZWxzZQorICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgICAgIGV4aXQgJHN0YXQKKyAgIGZpCisKKyAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICBkbworICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgIGRvbmUKKyAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICAgZWxzZQorICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgIGZpCisgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICA7OworCisjbm9zaWRlZWZmZWN0KQorICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKKyAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KKworZGFzaG1zdGRvdXQpCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICB0ZXN0IC16ICIkZGFzaG1mbGFnIiAmJiBkYXNobWZsYWc9LU0KKyAgIyBSZXF1aXJlIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGA6JworICAjIGluIHRoZSB0YXJnZXQgbmFtZS4gIFRoaXMgaXMgdG8gY29wZSB3aXRoIERPUy1zdHlsZSBmaWxlbmFtZXM6CisgICMgYSBkZXBlbmRlbmN5IHN1Y2ggYXMgYGM6L2Zvby9iYXInIGNvdWxkIGJlIHNlZW4gYXMgdGFyZ2V0IGBjJyBvdGhlcndpc2UuCisgICIkQCIgJGRhc2htZmxhZyB8CisgICAgc2VkICdzOl5bICBdKlteOiBdW146XVteOl0qXDpbICAgIF0qOiciJG9iamVjdCInXDogOicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworZGFzaFhtc3Rkb3V0KQorICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5CisgICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgorICBleGl0IDEKKyAgOzsKKworbWFrZWRlcGVuZCkKKyAgIiRAIiB8fCBleGl0ICQ/CisgICMgUmVtb3ZlIGFueSBMaWJ0b29sIGNhbGwKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisgICMgWCBtYWtlZGVwZW5kCisgIHNoaWZ0CisgIGNsZWFyZWQ9bm8gZWF0PW5vCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRjbGVhcmVkIGluCisgICAgbm8pCisgICAgICBzZXQgIiI7IHNoaWZ0CisgICAgICBjbGVhcmVkPXllcyA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICRlYXQgPSB5ZXM7IHRoZW4KKyAgICAgIGVhdD1ubworICAgICAgY29udGludWUKKyAgICBmaQorICAgIGNhc2UgIiRhcmciIGluCisgICAgLUQqfC1JKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQorICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KKyAgICAtYXJjaCkKKyAgICAgIGVhdD15ZXMgOzsKKyAgICAtKnwkb2JqZWN0KQorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgIGVzYWMKKyAgZG9uZQorICBvYmpfc3VmZml4PWBlY2hvICIkb2JqZWN0IiB8IHNlZCAncy9eLipcLi8uLydgCisgIHRvdWNoICIkdG1wZGVwZmlsZSIKKyAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCisnIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKKyAgOzsKKworY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIiRAIiAtRSB8CisgICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKKyAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgKikKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIiRAIiAtRSAyPi9kZXYvbnVsbCB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6XDE6cCcgfCAkY3lncGF0aF91IHwgc29ydCAtdSA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uIC1lICdzJSAlXFwgJWcnIC1lICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3ZjbXN5cykKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL01ha2VmaWxlLmFtIGIvZGJ1cy0xLjQuMTAvZG9jL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjc1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNTYgQEAKK2FwaWRpciA9IEBodG1sZGlyQC9hcGkKKworIyBhdXRvbWFrZSBub3JtYWxseSBhc3N1bWVzIHRoYXQgbWFuIHBhZ2VzIGFyZSBnZW5lcmF0ZWQgZmlsZXM7CisjIHRoZXNlIG9uZXMgYXJlbid0LCBzbyB3ZSBuZWVkIHRoZSBkaXN0XyBwcmVmaXggdG8gc2F5IHRoYXQgdGhleSdyZQorIyB0aGVpciBvd24gc291cmNlIGNvZGUKK2Rpc3RfbWFuMV9NQU5TID0gXAorCWRidXMtY2xlYW51cC1zb2NrZXRzLjEgXAorCWRidXMtbGF1bmNoLjEgXAorCWRidXMtbW9uaXRvci4xIFwKKwlkYnVzLXNlbmQuMSBcCisJZGJ1cy11dWlkZ2VuLjEKKworIyBvbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBvbmUgaXMgZ2VuZXJhdGVkCittYW4xX01BTlMgPSBcCisJZGJ1cy1kYWVtb24uMQorCitNQU5fSU5fRklMRVMgPSBkYnVzLWRhZW1vbi4xLmluCisKK01BTl9IVE1MX0ZJTEVTID0gXAorCWRidXMtY2xlYW51cC1zb2NrZXRzLjEuaHRtbCBcCisJZGJ1cy1kYWVtb24uMS5odG1sIFwKKwlkYnVzLWxhdW5jaC4xLmh0bWwgXAorCWRidXMtbW9uaXRvci4xLmh0bWwgXAorCWRidXMtc2VuZC4xLmh0bWwgXAorCWRidXMtdXVpZGdlbi4xLmh0bWwKKworRFREUyA9IFwKKwlidXNjb25maWcuZHRkIFwKKwlpbnRyb3NwZWN0LmR0ZAorCitTVEFUSUNfRE9DUyA9IFwKKwlkaWFncmFtLnBuZyBcCisJZGlhZ3JhbS5zdmcgXAorCWRidXMtZmFxLnhtbCBcCisJZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCBcCisJZGJ1cy10ZXN0LXBsYW4ueG1sIFwKKwlkYnVzLXR1dG9yaWFsLnhtbCBcCisJZGNvcC1ob3d0by50eHQgXAorCWludHJvc3BlY3QueHNsIFwKKwlzeXN0ZW0tYWN0aXZhdGlvbi50eHQgXAorCSQoRFREUykKKworRVhUUkFfRElTVCA9IFwKKwlmaWxlLWJvaWxlcnBsYXRlLmMgXAorCWRveHlnZW5fdG9fZGV2aGVscC54c2wgXAorCSQoU1RBVElDX0RPQ1MpIFwKKwkkKE1BTl9JTl9GSUxFUykKKworSFRNTF9GSUxFUz0JCQkJCVwKKwlkYnVzLWZhcS5odG1sCQkJCVwKKwlkYnVzLXNwZWNpZmljYXRpb24uaHRtbAkJCVwKKwlkYnVzLXRlc3QtcGxhbi5odG1sCQkJXAorCWRidXMtdHV0b3JpYWwuaHRtbAorCitpZiBEQlVTX1hNTF9ET0NTX0VOQUJMRUQKK2FsbC1sb2NhbDo6ICQoSFRNTF9GSUxFUykKKworRVhUUkFfRElTVCArPSAkKEhUTUxfRklMRVMpCisKK2RidXMtc3BlY2lmaWNhdGlvbi5odG1sOiBkYnVzLXNwZWNpZmljYXRpb24ueG1sCisJJChYTUxUTykgaHRtbC1ub2NodW5rcyAkPAorCitkYnVzLXRlc3QtcGxhbi5odG1sOiBkYnVzLXRlc3QtcGxhbi54bWwKKwkkKFhNTFRPKSBodG1sLW5vY2h1bmtzICQ8CisKK2RidXMtdHV0b3JpYWwuaHRtbDogZGJ1cy10dXRvcmlhbC54bWwKKwkkKFhNTFRPKSBodG1sLW5vY2h1bmtzICQ8CisKK2RidXMtZmFxLmh0bWw6IGRidXMtZmFxLnhtbAorCSQoWE1MVE8pIGh0bWwtbm9jaHVua3MgJDwKKworZW5kaWYKKworaWYgREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRAorYWxsLWxvY2FsOjogZG94eWdlbi5zdGFtcAorCitkb3h5Z2VuLnN0YW1wOiAkKHdpbGRjYXJkICQodG9wX3NyY2RpcikvZGJ1cy8qLltjaF0pCisJJChBTV9WX0dFTiljZCAkKHRvcF9idWlsZGRpcikgJiYgZG94eWdlbiBEb3h5ZmlsZQorCUB0b3VjaCAkQAorCitpZiBEQlVTX0hBVkVfWFNMVFBST0MKK2FwaV9EQVRBID0gZGJ1cy5kZXZoZWxwCisKK2RidXMuZGV2aGVscDogJChzcmNkaXIpL2RveHlnZW5fdG9fZGV2aGVscC54c2wgZG94eWdlbi5zdGFtcAorCSQoWFNMVFBST0MpIC1vICRAICQ8IGFwaS94bWwvaW5kZXgueG1sCitlbmRpZgorCisjIHRoaXMgYXNzdW1lcyBDUkVBVEVfU1VCRElSUyBpc24ndCBzZXQgdG8gWUVTIGluIERveHlmaWxlCisjICh3aGljaCBpdCBpc24ndCBjdXJyZW50bHkpCitpbnN0YWxsLWRhdGEtbG9jYWw6OiBkb3h5Z2VuLnN0YW1wCisJJChNS0RJUl9QKSAkKERFU1RESVIpJChhcGlkaXIpCisJJChJTlNUQUxMX0RBVEEpIGFwaS9odG1sLyogJChERVNURElSKSQoYXBpZGlyKQorCit1bmluc3RhbGwtbG9jYWw6OgorCXJtIC1mICQoREVTVERJUikkKGFwaWRpcikvKi5odG1sCisJcm0gLWYgJChERVNURElSKSQoYXBpZGlyKS8qLnBuZworCXJtIC1mICQoREVTVERJUikkKGFwaWRpcikvKi5jc3MKKwlybWRpciAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSAkKERFU1RESVIpJChhcGlkaXIpIHx8IFwKKwkJcm1kaXIgJChERVNURElSKSQoYXBpZGlyKQorZW5kaWYKKworaWYgREJVU19IQVZFX01BTjJIVE1MCithbGwtbG9jYWw6OiAkKE1BTl9IVE1MX0ZJTEVTKQorCislLjEuaHRtbDogJS4xCisJJChBTV9WX0dFTikoICQoTUFOMkhUTUwpICQ8ID4gJEAudG1wICYmIG12ICRALnRtcCAkQCApCitlbmRpZgorCitpZiBEQlVTX0NBTl9VUExPQURfRE9DUworQk9OVVNfRklMRVMgPSBcCisJJCh0b3Bfc3JjZGlyKS9SRUFETUUgXAorCSQodG9wX3NyY2RpcikvSEFDS0lORyBcCisJJCh0b3Bfc3JjZGlyKS9BVVRIT1JTIFwKKwkkKHRvcF9zcmNkaXIpL05FV1MgXAorCSQodG9wX3NyY2RpcikvQ09QWUlORyBcCisJJCh0b3Bfc3JjZGlyKS9DaGFuZ2VMb2cKKworZGJ1cy1kb2NzOiAkKFNUQVRJQ19ET0NTKSAkKEhUTUxfRklMRVMpICQoTUFOX0hUTUxfRklMRVMpICQoQk9OVVNfRklMRVMpIGRveHlnZW4uc3RhbXAKKwkkKEFNX1ZfYXQpcm0gLXJmICRACisJJChBTV9WX0dFTikkKE1LRElSX1ApICRAL2FwaQorCSQoQU1fVl9hdCljcCAkKFNUQVRJQ19ET0NTKSAkQAorCSQoQU1fVl9hdCljcCAkKEhUTUxfRklMRVMpICRACisJJChBTV9WX2F0KWNwICQoTUFOX0hUTUxfRklMRVMpICRACisJJChBTV9WX2F0KWNwICQoQk9OVVNfRklMRVMpICRACisJJChBTV9WX2F0KWNwIC1yIGFwaS9odG1sICRAL2FwaQorCitkYnVzLWRvY3MudGFyLmd6OiBkYnVzLWRvY3MKKwkkKEFNX1ZfR0VOKXRhciBjemYgJEAgJDwKKworRE9DX1NFUlZFUiA9IGRidXMuZnJlZWRlc2t0b3Aub3JnCitET0NfV1dXX0RJUiA9IC9zcnYvZGJ1cy5mcmVlZGVza3RvcC5vcmcvd3d3CisKK1NQRUNJRklDQVRJT05fU0VSVkVSID0gc3BlY2lmaWNhdGlvbnMuZnJlZWRlc2t0b3Aub3JnCitTUEVDSUZJQ0FUSU9OX1BBVEggPSAvc3J2L3NwZWNpZmljYXRpb25zLmZyZWVkZXNrdG9wLm9yZy93d3cvZGJ1cy8xLjAKKworbWFpbnRhaW5lci11cGxvYWQtZG9jczogZGJ1cy1kb2NzLnRhci5neiBkYnVzLWRvY3MKKwlzY3AgZGJ1cy1kb2NzLnRhci5neiAkKERPQ19TRVJWRVIpOiQoRE9DX1dXV19ESVIpCisJcnN5bmMgLXJwdnpQIC0tY2htb2Q9RGcrcyx1Zytyd1gsbz1yWCBcCisJCWRidXMtZG9jcy8gJChET0NfU0VSVkVSKTokKERPQ19XV1dfRElSKS9kb2MvCisJc2NwIC1wICQoRFREUykgJChTUEVDSUZJQ0FUSU9OX1NFUlZFUik6JChTUEVDSUZJQ0FUSU9OX1BBVEgpCitlbHNlCittYWludGFpbmVyLXVwbG9hZC1kb2NzOgorCUBlY2hvICJDYW4ndCB1cGxvYWQgZG9jdW1lbnRhdGlvbiEgUmUtcnVuIGNvbmZpZ3VyZSB3aXRoIgorCUBlY2hvICIgIC0tZW5hYmxlLWRveHlnZW4tZG9jcyAtLWVuYWJsZS14bWwtZG9jcyIKKwlAZWNobyAiYW5kIGVuc3VyZSB0aGF0IG1hbjJodG1sIGlzIGluc3RhbGxlZC4iCisJQGZhbHNlCitlbmRpZgorCitjbGVhbi1sb2NhbDoKKwlybSAtcmYgYXBpCisJcm0gLXJmIGRidXMtZG9jcworCXJtIC1mICouMS5odG1sCisJcm0gLWYgZG94eWdlbi5zdGFtcAorCittYWludGFpbmVyLWNsZWFuLWxvY2FsOgorCXJtIC1mICQoSFRNTF9GSUxFUykKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9NYWtlZmlsZS5pbiBiL2RidXMtMS40LjEwL2RvYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ0YjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZG9jL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjkzIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitAREJVU19YTUxfRE9DU19FTkFCTEVEX1RSVUVAYW1fX2FwcGVuZF8xID0gJChIVE1MX0ZJTEVTKQorc3ViZGlyID0gZG9jCitESVNUX0NPTU1PTiA9ICQoZGlzdF9tYW4xX01BTlMpICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCisJJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9kYnVzLWRhZW1vbi4xLmluIFRPRE8KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2FzLWFjLWV4cGFuZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9jb21waWxlci5tNCAkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRvcHRpb25zLm00ICQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHZlcnNpb24ubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9wa2cubTQgJCh0b3Bfc3JjZGlyKS9tNC90cC1jb21waWxlci1mbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L3RwLWNvbXBpbGVyLXdhcm5pbmdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0gZGJ1cy1kYWVtb24uMQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK0FNX1ZfR0VOID0gJChhbV9fdl9HRU5fJChWKSkKK2FtX192X0dFTl8gPSAkKGFtX192X0dFTl8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKK0FNX1ZfYXQgPSAkKGFtX192X2F0XyQoVikpCithbV9fdl9hdF8gPSAkKGFtX192X2F0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfYXRfMCA9IEAKK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK2FtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOworYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKKyAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorICAgICopIGY9JCRwOzsgXAorICBlc2FjOworYW1fX3N0cmlwX2RpciA9IGY9YGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOworYW1fX2luc3RhbGxfbWF4ID0gNDAKK2FtX19ub2Jhc2Vfc3RyaXBfc2V0dXAgPSBcCisgIHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCp8XS9cXFxcJi9nJ2AKK2FtX19ub2Jhc2Vfc3RyaXAgPSBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAtZSAic3wkJHNyY2RpcnN0cmlwL3x8IgorYW1fX25vYmFzZV9saXN0ID0gJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorICBzZWQgInN8ICQkc3JjZGlyc3RyaXAvfCB8OyInIC8gLipcLy8hcy8gLiovIC4vOyBzLFwoIC4qXCkvW14vXSokJCxcMSwnIHwgXAorICAkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiIH0geyBmaWxlc1skJDJdID0gZmlsZXNbJCQyXSAiICIgJCQxOyBcCisgICAgaWYgKCsrblskJDJdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgXAorICAgICAgeyBwcmludCAkJDIsIGZpbGVzWyQkMl07IG5bJCQyXSA9IDA7IGZpbGVzWyQkMl0gPSAiIiB9IH0gXAorICAgIEVORCB7IGZvciAoZGlyIGluIGZpbGVzKSBwcmludCBkaXIsIGZpbGVzW2Rpcl0gfScKK2FtX19iYXNlX2xpc3QgPSBcCisgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCisgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKK21hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQorYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKG1hbjFkaXIpIiAiJChERVNURElSKSQoYXBpZGlyKSIKK05ST0ZGID0gbnJvZmYKK01BTlMgPSAkKGRpc3RfbWFuMV9NQU5TKSAkKG1hbjFfTUFOUykKK0RBVEEgPSAkKGFwaV9EQVRBKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRklMRVZFUlNJT04gPSBAQlVJTERfRklMRVZFUlNJT05ACitCVUlMRF9USU1FU1RBTVAgPSBAQlVJTERfVElNRVNUQU1QQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREJVU19CSU5ESVIgPSBAREJVU19CSU5ESVJACitEQlVTX0JVU19DRkxBR1MgPSBAREJVU19CVVNfQ0ZMQUdTQAorREJVU19CVVNfTElCUyA9IEBEQlVTX0JVU19MSUJTQAorREJVU19DTElFTlRfQ0ZMQUdTID0gQERCVVNfQ0xJRU5UX0NGTEFHU0AKK0RCVVNfQ0xJRU5UX0xJQlMgPSBAREJVU19DTElFTlRfTElCU0AKK0RCVVNfQ09OU09MRV9BVVRIX0RJUiA9IEBEQlVTX0NPTlNPTEVfQVVUSF9ESVJACitEQlVTX0NPTlNPTEVfT1dORVJfRklMRSA9IEBEQlVTX0NPTlNPTEVfT1dORVJfRklMRUAKK0RCVVNfREFFTU9ORElSID0gQERCVVNfREFFTU9ORElSQAorREJVU19EQVRBRElSID0gQERCVVNfREFUQURJUkAKK0RCVVNfSEFWRV9JTlQ2NCA9IEBEQlVTX0hBVkVfSU5UNjRACitEQlVTX0lOVDE2X1RZUEUgPSBAREJVU19JTlQxNl9UWVBFQAorREJVU19JTlQzMl9UWVBFID0gQERCVVNfSU5UMzJfVFlQRUAKK0RCVVNfSU5UNjRfQ09OU1RBTlQgPSBAREJVU19JTlQ2NF9DT05TVEFOVEAKK0RCVVNfSU5UNjRfVFlQRSA9IEBEQlVTX0lOVDY0X1RZUEVACitEQlVTX0xBVU5DSEVSX0NGTEFHUyA9IEBEQlVTX0xBVU5DSEVSX0NGTEFHU0AKK0RCVVNfTEFVTkNIRVJfTElCUyA9IEBEQlVTX0xBVU5DSEVSX0xJQlNACitEQlVTX0xJQkVYRUNESVIgPSBAREJVU19MSUJFWEVDRElSQAorREJVU19NQUpPUl9WRVJTSU9OID0gQERCVVNfTUFKT1JfVkVSU0lPTkAKK0RCVVNfTUlDUk9fVkVSU0lPTiA9IEBEQlVTX01JQ1JPX1ZFUlNJT05ACitEQlVTX01JTk9SX1ZFUlNJT04gPSBAREJVU19NSU5PUl9WRVJTSU9OQAorREJVU19QQVRIX09SX0FCU1RSQUNUID0gQERCVVNfUEFUSF9PUl9BQlNUUkFDVEAKK0RCVVNfUFJFRklYID0gQERCVVNfUFJFRklYQAorREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1MgPSBAREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1NACitEQlVTX1NFU1NJT05fU09DS0VUX0RJUiA9IEBEQlVTX1NFU1NJT05fU09DS0VUX0RJUkAKK0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MgPSBAREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0AKK0RCVVNfU1lTVEVNX1BJRF9GSUxFID0gQERCVVNfU1lTVEVNX1BJRF9GSUxFQAorREJVU19TWVNURU1fU09DS0VUID0gQERCVVNfU1lTVEVNX1NPQ0tFVEAKK0RCVVNfVEVTVF9DRkxBR1MgPSBAREJVU19URVNUX0NGTEFHU0AKK0RCVVNfVEVTVF9MSUJTID0gQERCVVNfVEVTVF9MSUJTQAorREJVU19VSU5UNjRfQ09OU1RBTlQgPSBAREJVU19VSU5UNjRfQ09OU1RBTlRACitEQlVTX1VTRVIgPSBAREJVU19VU0VSQAorREJVU19WRVJTSU9OID0gQERCVVNfVkVSU0lPTkAKK0RCVVNfWF9DRkxBR1MgPSBAREJVU19YX0NGTEFHU0AKK0RCVVNfWF9MSUJTID0gQERCVVNfWF9MSUJTQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RPWFlHRU4gPSBARE9YWUdFTkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRVhQQU5ERURfQklORElSID0gQEVYUEFOREVEX0JJTkRJUkAKK0VYUEFOREVEX0RBVEFESVIgPSBARVhQQU5ERURfREFUQURJUkAKK0VYUEFOREVEX0xJQkRJUiA9IEBFWFBBTkRFRF9MSUJESVJACitFWFBBTkRFRF9MSUJFWEVDRElSID0gQEVYUEFOREVEX0xJQkVYRUNESVJACitFWFBBTkRFRF9MT0NBTFNUQVRFRElSID0gQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJACitFWFBBTkRFRF9QUkVGSVggPSBARVhQQU5ERURfUFJFRklYQAorRVhQQU5ERURfU1lTQ09ORkRJUiA9IEBFWFBBTkRFRF9TWVNDT05GRElSQAorRkdSRVAgPSBARkdSRVBACitHRVRURVhUX1BBQ0tBR0UgPSBAR0VUVEVYVF9QQUNLQUdFQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMQVVOQ0hDVEwgPSBATEFVTkNIQ1RMQAorTEFVTkNIRF9BR0VOVF9ESVIgPSBATEFVTkNIRF9BR0VOVF9ESVJACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlhNTF9DRkxBR1MgPSBATElCWE1MX0NGTEFHU0AKK0xJQlhNTF9MSUJTID0gQExJQlhNTF9MSUJTQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK0xUX0FHRSA9IEBMVF9BR0VACitMVF9DVVJSRU5UID0gQExUX0NVUlJFTlRACitMVF9SRVZJU0lPTiA9IEBMVF9SRVZJU0lPTkAKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU4ySFRNTCA9IEBNQU4ySFRNTEAKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JDID0gQFJDQAorUl9EWU5BTUlDX0xERkxBRyA9IEBSX0RZTkFNSUNfTERGTEFHQAorU0VDVElPTl9MREZMQUdTID0gQFNFQ1RJT05fTERGTEFHU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitURVNUX0JVU19CSU5BUlkgPSBAVEVTVF9CVVNfQklOQVJZQAorVEVTVF9FWElUX0JJTkFSWSA9IEBURVNUX0VYSVRfQklOQVJZQAorVEVTVF9JTlZBTElEX1NFUlZJQ0VfRElSID0gQFRFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUkAKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVIgPSBAVEVTVF9JTlZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkAKK1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkgPSBAVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWUAKK1RFU1RfUFJJVlNFUlZFUl9CSU5BUlkgPSBAVEVTVF9QUklWU0VSVkVSX0JJTkFSWUAKK1RFU1RfU0VHRkFVTFRfQklOQVJZID0gQFRFU1RfU0VHRkFVTFRfQklOQVJZQAorVEVTVF9TRVJWSUNFX0JJTkFSWSA9IEBURVNUX1NFUlZJQ0VfQklOQVJZQAorVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWSA9IEBURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZQAorVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWSA9IEBURVNUX1NMRUVQX0ZPUkVWRVJfQklOQVJZQAorVEVTVF9TT0NLRVRfRElSID0gQFRFU1RfU09DS0VUX0RJUkAKK1RFU1RfVkFMSURfU0VSVklDRV9ESVIgPSBAVEVTVF9WQUxJRF9TRVJWSUNFX0RJUkAKK1RFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSID0gQFRFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lORFJFUyA9IEBXSU5EUkVTQAorWE1LTUYgPSBAWE1LTUZACitYTUxUTyA9IEBYTUxUT0AKK1hTTFRQUk9DID0gQFhTTFRQUk9DQAorWF9DRkxBR1MgPSBAWF9DRkxBR1NACitYX0VYVFJBX0xJQlMgPSBAWF9FWFRSQV9MSUJTQAorWF9MSUJTID0gQFhfTElCU0AKK1hfUFJFX0xJQlMgPSBAWF9QUkVfTElCU0AKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0FSID0gQGFjX2N0X0FSQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc3lzdGVtZHN5c3RlbXVuaXRkaXIgPSBAc3lzdGVtZHN5c3RlbXVuaXRkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK2FwaWRpciA9IEBodG1sZGlyQC9hcGkKKworIyBhdXRvbWFrZSBub3JtYWxseSBhc3N1bWVzIHRoYXQgbWFuIHBhZ2VzIGFyZSBnZW5lcmF0ZWQgZmlsZXM7CisjIHRoZXNlIG9uZXMgYXJlbid0LCBzbyB3ZSBuZWVkIHRoZSBkaXN0XyBwcmVmaXggdG8gc2F5IHRoYXQgdGhleSdyZQorIyB0aGVpciBvd24gc291cmNlIGNvZGUKK2Rpc3RfbWFuMV9NQU5TID0gXAorCWRidXMtY2xlYW51cC1zb2NrZXRzLjEgXAorCWRidXMtbGF1bmNoLjEgXAorCWRidXMtbW9uaXRvci4xIFwKKwlkYnVzLXNlbmQuMSBcCisJZGJ1cy11dWlkZ2VuLjEKKworCisjIG9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIG9uZSBpcyBnZW5lcmF0ZWQKK21hbjFfTUFOUyA9IFwKKwlkYnVzLWRhZW1vbi4xCisKK01BTl9JTl9GSUxFUyA9IGRidXMtZGFlbW9uLjEuaW4KK01BTl9IVE1MX0ZJTEVTID0gXAorCWRidXMtY2xlYW51cC1zb2NrZXRzLjEuaHRtbCBcCisJZGJ1cy1kYWVtb24uMS5odG1sIFwKKwlkYnVzLWxhdW5jaC4xLmh0bWwgXAorCWRidXMtbW9uaXRvci4xLmh0bWwgXAorCWRidXMtc2VuZC4xLmh0bWwgXAorCWRidXMtdXVpZGdlbi4xLmh0bWwKKworRFREUyA9IFwKKwlidXNjb25maWcuZHRkIFwKKwlpbnRyb3NwZWN0LmR0ZAorCitTVEFUSUNfRE9DUyA9IFwKKwlkaWFncmFtLnBuZyBcCisJZGlhZ3JhbS5zdmcgXAorCWRidXMtZmFxLnhtbCBcCisJZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCBcCisJZGJ1cy10ZXN0LXBsYW4ueG1sIFwKKwlkYnVzLXR1dG9yaWFsLnhtbCBcCisJZGNvcC1ob3d0by50eHQgXAorCWludHJvc3BlY3QueHNsIFwKKwlzeXN0ZW0tYWN0aXZhdGlvbi50eHQgXAorCSQoRFREUykKKworRVhUUkFfRElTVCA9IGZpbGUtYm9pbGVycGxhdGUuYyBkb3h5Z2VuX3RvX2RldmhlbHAueHNsICQoU1RBVElDX0RPQ1MpIFwKKwkkKE1BTl9JTl9GSUxFUykgJChhbV9fYXBwZW5kXzEpCitIVE1MX0ZJTEVTID0gXAorCWRidXMtZmFxLmh0bWwJCQkJXAorCWRidXMtc3BlY2lmaWNhdGlvbi5odG1sCQkJXAorCWRidXMtdGVzdC1wbGFuLmh0bWwJCQlcCisJZGJ1cy10dXRvcmlhbC5odG1sCisKK0BEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX1RSVUVAQERCVVNfSEFWRV9YU0xUUFJPQ19UUlVFQGFwaV9EQVRBID0gZGJ1cy5kZXZoZWxwCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUBCT05VU19GSUxFUyA9IFwKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQAkkKHRvcF9zcmNkaXIpL1JFQURNRSBcCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUAJJCh0b3Bfc3JjZGlyKS9IQUNLSU5HIFwKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQAkkKHRvcF9zcmNkaXIpL0FVVEhPUlMgXAorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACSQodG9wX3NyY2RpcikvTkVXUyBcCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUAJJCh0b3Bfc3JjZGlyKS9DT1BZSU5HIFwKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQAkkKHRvcF9zcmNkaXIpL0NoYW5nZUxvZworCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUBET0NfU0VSVkVSID0gZGJ1cy5mcmVlZGVza3RvcC5vcmcKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQERPQ19XV1dfRElSID0gL3Nydi9kYnVzLmZyZWVkZXNrdG9wLm9yZy93d3cKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQFNQRUNJRklDQVRJT05fU0VSVkVSID0gc3BlY2lmaWNhdGlvbnMuZnJlZWRlc2t0b3Aub3JnCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUBTUEVDSUZJQ0FUSU9OX1BBVEggPSAvc3J2L3NwZWNpZmljYXRpb25zLmZyZWVkZXNrdG9wLm9yZy93d3cvZGJ1cy8xLjAKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IGRvYy9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSBkb2MvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CitkYnVzLWRhZW1vbi4xOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvZGJ1cy1kYWVtb24uMS5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCitpbnN0YWxsLW1hbjE6ICQoZGlzdF9tYW4xX01BTlMpICQobWFuMV9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuMWRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjFkaXIpIgorCUBsaXN0PSckKGRpc3RfbWFuMV9NQU5TKSAkKG1hbjFfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjFkaXIpIiB8fCBleGl0IDA7IFwKKwl7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAorCWRvbmUgfCBcCisJc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteMV1bMC05YS16XSokJCwxLDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAorCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAorCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuMWRpciknIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuMWRpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZTsgfQorCit1bmluc3RhbGwtbWFuMToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGRpc3RfbWFuMV9NQU5TKSAkKG1hbjFfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjFkaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW14xXVswLTlhLXpdKiQkLDEsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCisJdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuMWRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCSAgY2QgIiQoREVTVERJUikkKG1hbjFkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9CitpbnN0YWxsLWFwaURBVEE6ICQoYXBpX0RBVEEpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChhcGlkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChhcGlkaXIpIgorCUBsaXN0PSckKGFwaV9EQVRBKSc7IHRlc3QgLW4gIiQoYXBpZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChhcGlkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChhcGlkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLWFwaURBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChhcGlfREFUQSknOyB0ZXN0IC1uICIkKGFwaWRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwl0ZXN0IC1uICIkJGZpbGVzIiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoYXBpZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKGFwaWRpcikiICYmIHJtIC1mICQkZmlsZXMKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGxpc3Q9JyQoTUFOUyknOyBpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgICAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlbHNlIDo7IGZpOyBkb25lYDsgXAorCSAgaWYgdGVzdCAtbiAiJCRsaXN0IiAmJiBcCisJICAgIGdyZXAgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0ID4vZGV2L251bGw7IHRoZW4gXAorCSAgICBlY2hvICJlcnJvcjogZm91bmQgbWFuIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIFxgbWlzc2luZyBoZWxwMm1hbicgcmVwbGFjZW1lbnQgdGV4dDoiID4mMjsgXAorCSAgICBncmVwIC1sICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCB8IHNlZCAncy9eLyAgICAgICAgIC8nID4mMjsgXAorCSAgICBlY2hvICIgICAgICAgdG8gZml4IHRoZW0sIGluc3RhbGwgaGVscDJtYW4sIHJlbW92ZSBhbmQgcmVnZW5lcmF0ZSB0aGUgbWFuIHBhZ2VzOyIgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0eXBpY2FsbHkgXGBtYWtlIG1haW50YWluZXItY2xlYW4nIHdpbGwgcmVtb3ZlIHRoZW0iID4mMjsgXAorCSAgICBleGl0IDE7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwllbHNlIDo7IGZpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK0BEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX0ZBTFNFQEBEQlVTX0hBVkVfTUFOMkhUTUxfRkFMU0VAQERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9GQUxTRUBhbGwtbG9jYWw6CithbGwtYW06IE1ha2VmaWxlICQoTUFOUykgJChEQVRBKSBhbGwtbG9jYWwKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKG1hbjFkaXIpIiAiJChERVNURElSKSQoYXBpZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorQERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRURfRkFMU0VAdW5pbnN0YWxsLWxvY2FsOgorQERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRURfRkFMU0VAaW5zdGFsbC1kYXRhLWxvY2FsOgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbG9jYWwgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWFwaURBVEEgaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtbWFuCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46IGluc3RhbGwtbWFuMQorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKKwltYWludGFpbmVyLWNsZWFuLWxvY2FsCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1hcGlEQVRBIHVuaW5zdGFsbC1sb2NhbCB1bmluc3RhbGwtbWFuCisKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW4xCisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBhbGwgYWxsLWFtIGFsbC1sb2NhbCBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJ0b29sIGNsZWFuLWxvY2FsIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWFwaURBVEEgaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1tYW4xIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCW1haW50YWluZXItY2xlYW4tbG9jYWwgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAorCXVuaW5zdGFsbC1hcGlEQVRBIHVuaW5zdGFsbC1sb2NhbCB1bmluc3RhbGwtbWFuIHVuaW5zdGFsbC1tYW4xCisKKworQERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9UUlVFQGFsbC1sb2NhbDo6ICQoSFRNTF9GSUxFUykKKworQERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9UUlVFQGRidXMtc3BlY2lmaWNhdGlvbi5odG1sOiBkYnVzLXNwZWNpZmljYXRpb24ueG1sCitAREJVU19YTUxfRE9DU19FTkFCTEVEX1RSVUVACSQoWE1MVE8pIGh0bWwtbm9jaHVua3MgJDwKKworQERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9UUlVFQGRidXMtdGVzdC1wbGFuLmh0bWw6IGRidXMtdGVzdC1wbGFuLnhtbAorQERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9UUlVFQAkkKFhNTFRPKSBodG1sLW5vY2h1bmtzICQ8CisKK0BEQlVTX1hNTF9ET0NTX0VOQUJMRURfVFJVRUBkYnVzLXR1dG9yaWFsLmh0bWw6IGRidXMtdHV0b3JpYWwueG1sCitAREJVU19YTUxfRE9DU19FTkFCTEVEX1RSVUVACSQoWE1MVE8pIGh0bWwtbm9jaHVua3MgJDwKKworQERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9UUlVFQGRidXMtZmFxLmh0bWw6IGRidXMtZmFxLnhtbAorQERCVVNfWE1MX0RPQ1NfRU5BQkxFRF9UUlVFQAkkKFhNTFRPKSBodG1sLW5vY2h1bmtzICQ8CisKK0BEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX1RSVUVAYWxsLWxvY2FsOjogZG94eWdlbi5zdGFtcAorCitAREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFQGRveHlnZW4uc3RhbXA6ICQod2lsZGNhcmQgJCh0b3Bfc3JjZGlyKS9kYnVzLyouW2NoXSkKK0BEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX1RSVUVACSQoQU1fVl9HRU4pY2QgJCh0b3BfYnVpbGRkaXIpICYmIGRveHlnZW4gRG94eWZpbGUKK0BEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX1RSVUVACUB0b3VjaCAkQAorCitAREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFQEBEQlVTX0hBVkVfWFNMVFBST0NfVFJVRUBkYnVzLmRldmhlbHA6ICQoc3JjZGlyKS9kb3h5Z2VuX3RvX2RldmhlbHAueHNsIGRveHlnZW4uc3RhbXAKK0BEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX1RSVUVAQERCVVNfSEFWRV9YU0xUUFJPQ19UUlVFQAkkKFhTTFRQUk9DKSAtbyAkQCAkPCBhcGkveG1sL2luZGV4LnhtbAorCisjIHRoaXMgYXNzdW1lcyBDUkVBVEVfU1VCRElSUyBpc24ndCBzZXQgdG8gWUVTIGluIERveHlmaWxlCisjICh3aGljaCBpdCBpc24ndCBjdXJyZW50bHkpCitAREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFQGluc3RhbGwtZGF0YS1sb2NhbDo6IGRveHlnZW4uc3RhbXAKK0BEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVEX1RSVUVACSQoTUtESVJfUCkgJChERVNURElSKSQoYXBpZGlyKQorQERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRURfVFJVRUAJJChJTlNUQUxMX0RBVEEpIGFwaS9odG1sLyogJChERVNURElSKSQoYXBpZGlyKQorCitAREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFQHVuaW5zdGFsbC1sb2NhbDo6CitAREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFQAlybSAtZiAkKERFU1RESVIpJChhcGlkaXIpLyouaHRtbAorQERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRURfVFJVRUAJcm0gLWYgJChERVNURElSKSQoYXBpZGlyKS8qLnBuZworQERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRURfVFJVRUAJcm0gLWYgJChERVNURElSKSQoYXBpZGlyKS8qLmNzcworQERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRURfVFJVRUAJcm1kaXIgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgJChERVNURElSKSQoYXBpZGlyKSB8fCBcCitAREJVU19ET1hZR0VOX0RPQ1NfRU5BQkxFRF9UUlVFQAkJcm1kaXIgJChERVNURElSKSQoYXBpZGlyKQorCitAREJVU19IQVZFX01BTjJIVE1MX1RSVUVAYWxsLWxvY2FsOjogJChNQU5fSFRNTF9GSUxFUykKKworQERCVVNfSEFWRV9NQU4ySFRNTF9UUlVFQCUuMS5odG1sOiAlLjEKK0BEQlVTX0hBVkVfTUFOMkhUTUxfVFJVRUAJJChBTV9WX0dFTikoICQoTUFOMkhUTUwpICQ8ID4gJEAudG1wICYmIG12ICRALnRtcCAkQCApCisKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQGRidXMtZG9jczogJChTVEFUSUNfRE9DUykgJChIVE1MX0ZJTEVTKSAkKE1BTl9IVE1MX0ZJTEVTKSAkKEJPTlVTX0ZJTEVTKSBkb3h5Z2VuLnN0YW1wCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUAJJChBTV9WX2F0KXJtIC1yZiAkQAorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACSQoQU1fVl9HRU4pJChNS0RJUl9QKSAkQC9hcGkKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQAkkKEFNX1ZfYXQpY3AgJChTVEFUSUNfRE9DUykgJEAKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQAkkKEFNX1ZfYXQpY3AgJChIVE1MX0ZJTEVTKSAkQAorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACSQoQU1fVl9hdCljcCAkKE1BTl9IVE1MX0ZJTEVTKSAkQAorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACSQoQU1fVl9hdCljcCAkKEJPTlVTX0ZJTEVTKSAkQAorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACSQoQU1fVl9hdCljcCAtciBhcGkvaHRtbCAkQC9hcGkKKworQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVAZGJ1cy1kb2NzLnRhci5nejogZGJ1cy1kb2NzCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUAJJChBTV9WX0dFTil0YXIgY3pmICRAICQ8CisKK0BEQlVTX0NBTl9VUExPQURfRE9DU19UUlVFQG1haW50YWluZXItdXBsb2FkLWRvY3M6IGRidXMtZG9jcy50YXIuZ3ogZGJ1cy1kb2NzCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfVFJVRUAJc2NwIGRidXMtZG9jcy50YXIuZ3ogJChET0NfU0VSVkVSKTokKERPQ19XV1dfRElSKQorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACXJzeW5jIC1ycHZ6UCAtLWNobW9kPURnK3MsdWcrcndYLG89clggXAorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACQlkYnVzLWRvY3MvICQoRE9DX1NFUlZFUik6JChET0NfV1dXX0RJUikvZG9jLworQERCVVNfQ0FOX1VQTE9BRF9ET0NTX1RSVUVACXNjcCAtcCAkKERURFMpICQoU1BFQ0lGSUNBVElPTl9TRVJWRVIpOiQoU1BFQ0lGSUNBVElPTl9QQVRIKQorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX0ZBTFNFQG1haW50YWluZXItdXBsb2FkLWRvY3M6CitAREJVU19DQU5fVVBMT0FEX0RPQ1NfRkFMU0VACUBlY2hvICJDYW4ndCB1cGxvYWQgZG9jdW1lbnRhdGlvbiEgUmUtcnVuIGNvbmZpZ3VyZSB3aXRoIgorQERCVVNfQ0FOX1VQTE9BRF9ET0NTX0ZBTFNFQAlAZWNobyAiICAtLWVuYWJsZS1kb3h5Z2VuLWRvY3MgLS1lbmFibGUteG1sLWRvY3MiCitAREJVU19DQU5fVVBMT0FEX0RPQ1NfRkFMU0VACUBlY2hvICJhbmQgZW5zdXJlIHRoYXQgbWFuMmh0bWwgaXMgaW5zdGFsbGVkLiIKK0BEQlVTX0NBTl9VUExPQURfRE9DU19GQUxTRUAJQGZhbHNlCisKK2NsZWFuLWxvY2FsOgorCXJtIC1yZiBhcGkKKwlybSAtcmYgZGJ1cy1kb2NzCisJcm0gLWYgKi4xLmh0bWwKKwlybSAtZiBkb3h5Z2VuLnN0YW1wCisKK21haW50YWluZXItY2xlYW4tbG9jYWw6CisJcm0gLWYgJChIVE1MX0ZJTEVTKQorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kb2MvVE9ETyBiL2RidXMtMS40LjEwL2RvYy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGU3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvVE9ETwpAQCAtMCwwICsxLDE1NSBAQAorSW1wb3J0YW50IGZvciAxLjIKKz09PQorCisgLSBTeXN0ZW0gYnVzIGFjdGl2YXRpb24KKworIC0gV2luZG93cyBwb3J0CisKK0ltcG9ydGFudCBmb3IgMS4wIEdMaWIgQmluZGluZ3MKKz09PQorCisgLSBUZXN0IHBvaW50LXRvLXBvaW50IG1vZGUKKworIC0gQWRkIHN1cHBvcnQgZm9yIGdldHRpbmcgc2VuZGVyCisKKyAtIGZvcm1hdF92ZXJzaW9uIGluIHRoZSBvYmplY3QgaW5mbyBkb2Vzbid0IGxvb2sgbGlrZSBpdCdzIGhhbmRsZWQgY29ycmVjdGx5LiBUaGUgY3JlYXRvcgorICAgb2YgdGhlIG9iamVjdCBpbmZvIHNob3VsZCBzcGVjaWZ5IHNvbWUgZml4ZWQgbnVtYmVyIHBlciBzdHJ1Y3QgdmVyc2lvbjsgdGhlIGxpYnJhcnkKKyAgIHNob3VsZCBoYW5kbGUgb25seSBzcGVjaWZpYyBudW1iZXJzIGl0IGtub3dzIGFib3V0LiBUaGVyZSdzIG5vIGFzc3VtcHRpb24gdGhhdCBhbGwgCisgICBudW1iZXJzID49IHRoZSBnaXZlbiBvbmUgYXJlIGNvbXBhdGlibGUuIFRoZSBpZGVhIGlzIHRoYXQgbmV3IHZlcnNpb25zIG9mIHRoZSBsaWIKKyAgIGNhbiBvZmZlciB0b3RhbGx5IGRpZmZlcmVudCBvYmplY3QgaW5mbyBzdHJ1Y3RzLCBidXQgb2xkIHZlcnNpb25zCisgICBrZWVwIHdvcmtpbmcuCisKK0ltcG9ydGFudCBmb3IgMS4wIFB5dGhvbiBiaW5kaW5ncworPT09CisKKyAtIEhhbW1lciBkb3duIEFQSQorCisgLSBGaXggcmVtb3Zpbmcgb2Ygc2lnbmFscyBmcm9tIHRoZSBtYXRjaCB0cmVlCisKKyAtIEZpeCByZWZjb3VudGluZyBhbmQgdXNlcmRhdGEgbGlmZWN5Y2xlcworCisgLSBXcml0ZSBhIGdlbmVyaWMgbWFpbmxvb3AKKworTWlnaHQgYXMgV2VsbCBmb3IgMS4wCis9PT0KKworIC0gcHJvdG9jb2wgdmVyc2lvbiBpbiBlYWNoIG1lc3NhZ2UgaXMgcHJldHR5IHNpbGx5CisKK0NhbiBCZSBQb3N0IDEuMAorPT09CisKKyAtIHJldmFtcCBkYnVzLWxhdW5jaCBhIGJpdCwKKyAgIHNlZSBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNi1PY3RvYmVyLzAwNTkwNi5odG1sCisgICBmb3Igc29tZSB0aG91Z2h0cy4KKworIC0gY2xlYW4gdXAgdGhlIGNyZWRzIGlzc3VlIG9uICpCU0QncyBpbiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMuCisgICBUaGV5IHNob3VsZCB3b3JrIGFzIGlzIGJ1dCB3ZSBuZWVkIHRvIHJlYXJhbmdlIGl0IHRvIG1ha2UgaXQKKyAgIGNsZWFyZXIgd2hpY2ggbWV0aG9kIGlzIGJlaW5nIHVzZWQuICBjb25maWd1cmUuaW4gc2hvdWxkCisgICBiZSBmaXhlZCB1cCB0byBtYWtlIHRoYXQgZGVjaXRpb24uCisKKyAtIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQoKSBpcyBlc3NlbnRpYWxseSBhbHdheXMgYnJva2VuIGJlY2F1c2UKKyAgIHRoZSBjb25uZWN0aW9uIGZpbmFsaXplciBjYWxscyBub24tdW5sb2NrZWQgZnVuY3Rpb25zLiBPbmUgZml4IGlzIHRvIG1ha2UgCisgICB0aGUgZmluYWxpemVyIHJ1biB3aXRoIHRoZSBsb2NrIGhlbGQsIGJ1dCBzaW5jZSBpdCBjYWxscyBvdXQgdG8gdGhlIGFwcCB0aGF0IG1heSAKKyAgIGJlIHByZXR0eSBicm9rZW4uIE1vcmUgbGlrZWx5IGFsbCB0aGUgdXNlcyBvZiB1bnJlZl91bmxvY2tlZCBhcmUganVzdCB3cm9uZy4KKworIC0gaWYgdGhlIEdVSUQgaXMgb2J0YWluZWQgb25seSBkdXJpbmcgYXV0aGVudGljYXRpb24sIG5vdCBpbiB0aGUgYWRkcmVzcywgCisgICB3ZSBjb3VsZCBzdGlsbCBzaGFyZSB0aGUgY29ubmVjdGlvbgorCisgLSBBbGxvdyBhIGRidXNfZ19wcm94eV90b19zdHJpbmcoKS9nX29iamVjdF90b19zdHJpbmcoKSB0aGF0CisgICB3b3VsZCBjb252ZXJ0IHRoZSBwcm94eSB0byBhbiAiSU9SIiBhbmQgZGJ1c19nX3Byb3h5X2Zyb21fc3RyaW5nKCkKKyAgIHRoYXQgd291bGQgZGVjb2RlOyB1c2luZyB0aGVzZSwgZGJ1cy1nbGliIHVzZXJzIGNvdWxkIGF2b2lkCisgICBEQnVzQ29ubmVjdGlvbiBlbnRpcmVseS4gT2YgY291cnNlIHRoZSBzYW1lIGFwcGxpZXMgdG8gb3RoZXIga2luZHMKKyAgIG9mIGJpbmRpbmcuIFRoaXMgd291bGQgdXNlIGRidXNfY29ubmVjdGlvbl9vcGVuKCkncyBjb25uZWN0aW9uLXNoYXJpbmcKKyAgIGZlYXR1cmUgdG8gYXZvaWQgbWFzc2l2ZSBwcm9saWZlcmF0aW9uIG9mIGNvbm5lY3Rpb25zLgorCisgLSBEQnVzV2F0Y2hMaXN0L1RpbWVvdXRMaXN0IGR1cGxpY2F0ZSBhIGxvdCBvZiBjb2RlLCBhcyBkbworICAgcHJvdGVjdGVkX2NoYW5nZV93YXRjaC9wcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgaW4gZGJ1cy1jb25uZWN0aW9uLmMKKyAgIGFuZCBkYnVzLXNlcnZlci5jLiBUaGlzIGNvdWxkIGFsbCBiZSBtb3BwZWQgdXAsIGN1dC1hbmQtcGFzdGUgCisgICBmaXhlZCwgY29kZSBzaXplIHJlZHVjZWQuCisKKyAtIGNoYW5nZSAuc2VydmljZSBmaWxlcyB0byBhbGxvdyBOYW1lcz1saXN0IGluIGFkZGl0aW9uIHRvIE5hbWU9c3RyaW5nCisKKyAtIFRoZSBtZXNzYWdlIGJ1cyBpbnRlcm5hbCBjb2RlIHN0aWxsIHNheXMgInNlcnZpY2UiIGZvciAKKyAgICJuYW1lIiwgImJhc2Ugc2VydmljZSIgZm9yICJ1bmlxdWUgbmFtZSIsICJhY3RpdmF0ZSIgZm9yIAorICAgInN0YXJ0Ijsgd291bGQgYmUgbmljZSB0byBjbGVhbiB1cC4KKworIC0gUHJvcGVydHkgbGlzdCBmZWF0dXJlIG9uIG1lc3NhZ2UgYnVzIChsaXN0IG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCAKKyAgIHdpdGggYSBjb25uZWN0aW9uKS4gTWF5IGFsc28gaW5jbHVkZSBtZXNzYWdlIG1hdGNoaW5nIHJ1bGVzIAorICAgdGhhdCBpbnZvbHZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24KKyAgIGNvbm5lY3Rpb24uCisKKyAtIERpc2Nvbm5lY3RpbmcgdGhlIHJlbW90ZSBlbmQgb24gaW52YWxpZCBVVEYtOCBpcyBwcm9iYWJseSBub3QgYSBnb29kIAorICAgaWRlYS4gVGhlIGRlZmluaXRpb24gb2YgInZhbGlkIiBpcyBzbGlnaHRseSBmdXp6eS4gSSB0aGluayBpdCBtaWdodCAKKyAgIGJlIGJldHRlciB0byBqdXN0IHNpbGVudGx5ICJmaXgiIHRoZSBVVEYtOCwgb3IgcGVyaGFwcyByZXR1cm4gYW4gZXJyb3IuCisKKyAtIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBEb3h5Z2VuIG1hbnVhbCBpbiBNYWtlZmlsZSB3aGVuIC0tZW5hYmxlLWRvY3MKKworIC0gaWYgeW91IHNlbmQgdGhlIHNhbWUgbWVzc2FnZSB0byBtdWx0aXBsZSBjb25uZWN0aW9ucywgdGhlIHNlcmlhbCBudW1iZXIgCisgICB3aWxsIG9ubHkgYmUgcmlnaHQgZm9yIG9uZSBvZiB0aGVtLiBQcm9iYWJseSBuZWVkIHRvIGp1c3Qgd3JpdGUoKSB0aGUgc2VyaWFsIAorICAgbnVtYmVyLCByYXRoZXIgdGhhbiBwdXR0aW5nIGl0IGluIHRoZSBEQnVzTWVzc2FnZSwgb3Igc29tZXRoaW5nLgorCisgLSBwZXJoYXBzIHRoZSBidXMgZHJpdmVyIHNob3VsZCBoYXZlIHByb3BlcnRpZXMgdGhhdCByZWZsZWN0IGF0dHJpYnV0ZXMKKyAgIG9mIHRoZSBzZXNzaW9uLCBzdWNoIGFzIGhvc3RuYW1lLCBhcmNoaXRlY3R1cmUsIG9wZXJhdGluZyBzeXN0ZW0sIAorICAgZXRjLiBDb3VsZCBiZSB1c2VmdWwgZm9yIGNvZGUgdGhhdCB3YW50cyB0byBzcGVjaWFsLWNhc2UgYmVoYXZpb3IgCisgICBmb3IgYSBwYXJ0aWN1bGFyIGhvc3Qgb3IgY2xhc3Mgb2YgaG9zdHMsIGZvciBleGFtcGxlLgorCisgLSBjdXJyZW50bHkgdGhlIHNlY3VyaXR5IHBvbGljeSBzdHVmZiBmb3IgbWVzc2FnZXMgdG8vZnJvbSAKKyAgIHRoZSBidXMgZHJpdmVyIGlzIGtpbmQgb2Ygc3RyYW5nZTsgYmFzaWNhbGx5IGl0J3MgaGFyZGNvZGVkIHRoYXQgCisgICB5b3UgY2FuIGFsd2F5cyB0YWxrIHRvIHRoZSBkcml2ZXIsIGJ1dCB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSAKKyAgIGhhcyBydWxlcyBmb3IgaXQgYW55d2F5LCBvciBzb21ldGhpbmcuIGl0J3MgY29uY2VwdHVhbGx5IAorICAgc2NyZXd5IGF0IHRoZSBtb21lbnQuCisKKyAtIHdoZW4gbWFraW5nIGEgbWV0aG9kIGNhbGwsIGlmIHRoZSBjYWxsIHNlcmlhbCB3ZXJlIGdsb2JhbGx5IHVuaXF1ZSwKKyAgIHdlIGNvdWxkIGZvcndhcmQgdGhlIGNhbGwgc2VyaWFsIGFsb25nIHdpdGggYW55IG1ldGhvZCBjYWxscyBtYWRlCisgICBhcyBhIHJlc3VsdCBvZiB0aGUgZmlyc3QgbWV0aG9kIGNhbGwsIGFuZCBhbGxvdyByZWVudHJhbmN5IHRoYXQgd2FzCisgICBzdHJpY3RseSBwYXJ0IG9mIHRoZSBjYWxsIHN0YWNrIG9mIHNhaWQgbWV0aG9kIGNhbGwuIEJ1dCBJIGRvbid0CisgICByZWFsbHkgc2VlIGhvdyB0byBkbyB0aGlzIHdpdGhvdXQgbWFraW5nIHRoZSB1c2VyIHBhc3MgYXJvdW5kIHRoZQorICAgY2FsbCBzZXJpYWwgdG8gYWxsIG1ldGhvZCBjYWxscyBhbGwgdGhlIHRpbWUsIG9yIGRpc2FsbG93aW5nIAorICAgYXN5bmMgY2FsbHMuCisKKyAgIElmIGRvbmUgcG9zdCAxLjAgd2lsbCBwcm9iYWJseSBiZSBhbiBvcHRpb25hbC91Z2x5LUFQSSB0eXBlIAorICAgb2YgdGhpbmcuCisKKyAtIEkgZG9uJ3Qgd2FudCB0byBpbnRyb2R1Y2UgREJ1c09iamVjdCwgYnV0IHJlZmNvdW50aW5nIGFuZCBvYmplY3QKKyAgIGRhdGEgY291bGQgc3RpbGwgYmUgZmFjdG9yZWQgb3V0IGludG8gYW4gaW50ZXJuYWwgImJhc2UgY2xhc3MiIAorICAgcGVyaGFwcy4KKworIC0gS2VlcCBjb252ZW5pZW5jZSB3cmFwcGVycyBpbiBzeW5jIHdpdGggYnVzIG1ldGhvZHMKKworIC0gZG9jdW1lbnQgdGhlIGF1dGggcHJvdG9jb2wgYXMgYSBzZXQgb2Ygc3RhdGVzIGFuZCB0cmFuc2l0aW9ucywgYW5kCisgICB0aGVuIHJlaW1wbGVtZW50IGl0IGluIHRob3NlIHRlcm1zCisKKyAtIHJlY3Vyc2l2ZSBkaXNwYXRjaCwgc2VlIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpCisKKyAtIGRvIHdlIG5lZWQgcGVyLWRpc3BsYXkgYWN0aXZhdGlvbjsgaWYgc28gSSdkIGxpa2UgdG8gZG8gdGhpcyBieSBzZXR0aW5nIGEKKyAgICJkaXNwbGF5IElEIiBwcm9wZXJ0eSBvbiBzY3JlZW4gMCwgd2l0aCBhIEdVSUQsIGFuZCBrZXlpbmcgYWN0aXZhdGlvbiBieSAKKyAgIHNhaWQgR1VJRC4gT3RoZXJ3aXNlIHlvdSBnZXQgYWxsIGtpbmRzIG9mIHVucm9idXN0CisgICBzdHJpbmcvaG9zdG5hbWUtYmFzZWQgbWVzcy4gcGVyLXNjcmVlbiBpcyB0aGVuIGRvbmUgYnkgYXBwZW5kaW5nIHNjcmVlbiBudW1iZXIKKyAgIHRvIHRoZSBkaXNwbGF5LiBJZiBkaXNwbGF5cyBoYXZlIGEgZGV0ZXJtaW5pc3RpYyBJRCBsaWtlIHRoaXMsIHlvdSBjYW4gCisgICBkbyBwZXItZGlzcGxheSBieSBzaW1wbHkgaW5jbHVkaW5nIEdVSUQgaW4gdGhlIHNlcnZpY2UgbmFtZS4KKworIC0gb3B0aW1pemF0aW9uIGFuZCBwcm9maWxpbmchCisKKyAtIE1hdGNoIHJ1bGVzIGFyZW4ndCBpbiB0aGUgc3BlYyAocHJvYmFibHkgYSBsb3Qgb2YgbWV0aG9kcyBvbiB0aGUgYnVzCisgICBhcmUgbm90KQorCisgLSB0aGUgImJyZWFrIGxvYWRlciIgYW5kIHZhbGlkL2ludmFsaWQgbWVzc2FnZSB0ZXN0cyBhcmUgYWxsIGRpc2FibGVkOworICAgdGhleSBuZWVkIHRvIGJlIGZpeGVkIGFuZCByZS1lbmFibGVkIHdpdGggdGhlIG5ldyBtZXNzYWdlIGFyZ3Mgc3R1ZmYuCisgICBJIHRoaW5rIEkgd2FudCB0byBkcm9wIHRoZSAubWVzc2FnZSBmaWxlcyB0aGluZyBhbmQganVzdCBoYXZlIGNvZGUKKyAgIHRoYXQgZ2VuZXJhdGVzIG1lc3NhZ2VzLCBtb3JlIGxpa2UgdGhlIHRlc3RzIGZvcgorICAgZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jICh0aGlzIGlzIG1vc3RseSBkb25lIG5vdywganVzdCBuZWVkcyBzb21lCisgICBjbGVhbnVwKQorCisgLSBqdXN0IGJlZm9yZSAxLjAsIHRyeSBhIEhBVkVfSU5UNjQ9MCBidWlsZCBhbmQgYmUgc3VyZSBpdCBydW5zCisKKyAtIFdpbmRvd3MgcG9ydCBuZWVkcyByZWN1cnNpdmUgbXV0ZXhlcworCitTaG91bGQgQmUgUG9zdCAxLjAKKz09PQorCisgLSBsb29rIGludG8gc3VwcG9ydGluZyB0aGUgY29uY2VwdCBvZiBhICJjb25uZWN0aW9uIiBnZW5lcmljYWxseQorICAgKHdoYXQgZG9lcyB0aGlzIFRPRE8gaXRlbSBtZWFuPykKKworIC0gdGVzdC9uYW1lLXRlc3Qgc2hvdWxkIGJlIG5hbWVkIHRlc3Qvd2l0aC1idXMgb3Igc29tZXRoaW5nIGxpa2UgdGhhdAorCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9idXNjb25maWcuZHRkIGIvZGJ1cy0xLjQuMTAvZG9jL2J1c2NvbmZpZy5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjNTE5YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9idXNjb25maWcuZHRkCkBAIC0wLDAgKzEsNjUgQEAKKzwhRUxFTUVOVCBidXNjb25maWcgKHVzZXIgfAorICAgICAgICAgICAgICAgICAgICAgdHlwZSB8CisgICAgICAgICAgICAgICAgICAgICBmb3JrIHwKKyAgICAgICAgICAgICAgICAgICAgIGtlZXBfdW1hc2sgfAorICAgICAgICAgICAgICAgICAgICAgbGlzdGVuIHwgCisgICAgICAgICAgICAgICAgICAgICBwaWRmaWxlIHwKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkaXIgfAorICAgICAgICAgICAgICAgICAgICAgc2VydmljZWRpciB8CisgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlaGVscGVyIHwKKyAgICAgICAgICAgICAgICAgICAgIGF1dGggfAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSB8CisgICAgICAgICAgICAgICAgICAgICBwb2xpY3kgfAorICAgICAgICAgICAgICAgICAgICAgbGltaXQgfAorICAgICAgICAgICAgICAgICAgICAgc2VsaW51eCkqPgorCis8IUVMRU1FTlQgdXNlciAoI1BDREFUQSk+Cis8IUVMRU1FTlQgbGlzdGVuICgjUENEQVRBKT4KKzwhRUxFTUVOVCBpbmNsdWRlZGlyICgjUENEQVRBKT4KKzwhRUxFTUVOVCBzZXJ2aWNlZGlyICgjUENEQVRBKT4KKzwhRUxFTUVOVCBzZXJ2aWNlaGVscGVyICgjUENEQVRBKT4KKzwhRUxFTUVOVCBhdXRoICgjUENEQVRBKT4KKzwhRUxFTUVOVCB0eXBlICgjUENEQVRBKT4KKzwhRUxFTUVOVCBwaWRmaWxlICgjUENEQVRBKT4KKzwhRUxFTUVOVCBmb3JrIEVNUFRZPgorPCFFTEVNRU5UIGtlZXBfdW1hc2sgRU1QVFk+CisKKzwhRUxFTUVOVCBpbmNsdWRlICgjUENEQVRBKT4KKzwhQVRUTElTVCBpbmNsdWRlIAorICAgICAgICAgIGlnbm9yZV9taXNzaW5nICh5ZXN8bm8pICJubyIKKyAgICAgICAgICBpZl9zZWxpbnV4X2VuYWJsZWQgKHllc3xubykgIm5vIgorICAgICAgICAgIHNlbGludXhfcm9vdF9yZWxhdGl2ZSAoeWVzfG5vKSAibm8iPgorCis8IUVMRU1FTlQgcG9saWN5IChhbGxvd3xkZW55KSo+Cis8IUFUVExJU1QgcG9saWN5IAorICAgICAgICAgIGNvbnRleHQgKGRlZmF1bHR8bWFuZGF0b3J5KSAjSU1QTElFRAorICAgICAgICAgIHVzZXIgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBncm91cCBDREFUQSAjSU1QTElFRAorICAgICAgICAgIGF0X2NvbnNvbGUgKHllc3xubykgI0lNUExJRUQ+CisKKzwhRUxFTUVOVCBhbGxvdyBFTVBUWT4KKzwhQVRUTElTVCBhbGxvdyAKKyAgICAgICAgICB1c2VyIENEQVRBICNJTVBMSUVECisgICAgICAgICAgc2VuZCBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHJlY2VpdmUgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBvd24gQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBzZW5kX3RvIENEQVRBICNJTVBMSUVECisgICAgICAgICAgcmVjZWl2ZV9mcm9tIENEQVRBICNJTVBMSUVEPgorCis8IUVMRU1FTlQgZGVueSBFTVBUWT4KKzwhQVRUTElTVCBkZW55CisgICAgICAgICAgdXNlciBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHNlbmQgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICByZWNlaXZlIENEQVRBICNJTVBMSUVECisgICAgICAgICAgb3duIENEQVRBICNJTVBMSUVECisgICAgICAgICAgc2VuZF90byBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHJlY2VpdmVfZnJvbSBDREFUQSAjSU1QTElFRD4KKworPCFFTEVNRU5UIGxpbWl0ICgjUENEQVRBKT4KKzwhQVRUTElTVCBsaW1pdCBuYW1lIENEQVRBICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIHNlbGludXggKGFzc29jaWF0ZSkqPgorPCFFTEVNRU5UIGFzc29jaWF0ZSBFTVBUWT4KKzwhQVRUTElTVCBhc3NvY2lhdGUKKyAgICAgICAgICBvd24gQ0RBVEEgI1JFUVVJUkVECisgICAgICAgICAgY29udGV4dCBDREFUQSAjUkVRVUlSRUQ+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kb2MvZGJ1cy1jbGVhbnVwLXNvY2tldHMuMSBiL2RidXMtMS40LjEwL2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjY5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvZGJ1cy1jbGVhbnVwLXNvY2tldHMuMQpAQCAtMCwwICsxLDQzIEBACisuXCIgCisuXCIgZGJ1cy1jbGVhbnVwLXNvY2tldHMgbWFudWFsIHBhZ2UuCisuXCIgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKy5cIgorLlRIIGRidXMtY2xlYW51cC1zb2NrZXRzIDEKKy5TSCBOQU1FCitkYnVzLWNsZWFudXAtc29ja2V0cyBcLSBjbGVhbiB1cCBsZWZ0b3ZlciBzb2NrZXRzIGluIGEgZGlyZWN0b3J5CisuU0ggU1lOT1BTSVMKKy5QUAorLkIgZGJ1cy1jbGVhbnVwLXNvY2tldHMgW0RJUkVDVE9SWV0KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBcZklkYnVzLWNsZWFudXAtc29ja2V0c1xmUCBjb21tYW5kIGNsZWFucyB1cCB1bnVzZWQgRC1CdXMKK2Nvbm5lY3Rpb24gc29ja2V0cy4gU2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvIGZvcgorbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmlnIHBpY3R1cmUuCisKKy5QUAorSWYgZ2l2ZW4gbm8gYXJndW1lbnRzLCBcZklkYnVzLWNsZWFudXAtc29ja2V0c1xmUCBjbGVhbnMgdXAgc29ja2V0cyAKK2luIHRoZSBzdGFuZGFyZCBkZWZhdWx0IHNvY2tldCBkaXJlY3RvcnkgZm9yIHRoZQorcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1czsgdGhpcyBpcyB1c3VhbGx5IC90bXAuIAorT3B0aW9uYWxseSwgeW91IGNhbiBwYXNzIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisuUFAKK09uIExpbnV4LCB0aGlzIHByb2dyYW0gaXMgZXNzZW50aWFsbHkgdXNlbGVzcywgYmVjYXVzZSBELUJ1cyBkZWZhdWx0cwordG8gdXNpbmcgImFic3RyYWN0IHNvY2tldHMiIHRoYXQgZXhpc3Qgb25seSBpbiBtZW1vcnkgYW5kIGRvbid0IGhhdmUgYQorY29ycmVzcG9uZGluZyBmaWxlIGluIC90bXAuIAorCisuUFAKK09uIG1vc3Qgb3RoZXIgZmxhdm9ycyBvZiBVTklYLCBpdCdzIHBvc3NpYmxlIGZvciB0aGUgc29ja2V0IGZpbGVzIHRvCitsZWFrIHdoZW4gcHJvZ3JhbXMgdXNpbmcgRC1CdXMgZXhpdCBhYm5vcm1hbGx5IG9yIHdpdGhvdXQgY2xvc2luZwordGhlaXIgRC1CdXMgY29ubmVjdGlvbnMuIFRodXMsIGl0IG1pZ2h0IGJlIGludGVyZXN0aW5nIHRvIHJ1bgorZGJ1cy1jbGVhbnVwLXNvY2tldHMgaW4gYSBjcm9uIGpvYiB0byBtb3AgdXAgYW55IGxlYWtlZCBzb2NrZXRzLgorT3IgeW91IGNhbiBqdXN0IGlnbm9yZSB0aGUgbGVha2VkIHNvY2tldHMsIHRoZXkgYXJlbid0IHJlYWxseSBodXJ0aW5nCithbnl0aGluZywgb3RoZXIgdGhhbiBjbHV0dGVyaW5nIHRoZSBvdXRwdXQgb2YgImxzIC90bXAiCisKKy5TSCBBVVRIT1IKK2RidXMtY2xlYW51cC1zb2NrZXRzIHdhcyBhZGFwdGVkIGJ5IEhhdm9jIFBlbm5pbmd0b24gZnJvbQorbGluYy1jbGVhbnVwLXNvY2tldHMgd3JpdHRlbiBieSBNaWNoYWVsIE1lZWtzLgorCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RidXMtZGFlbW9uLjEuaW4gYi9kYnVzLTEuNC4xMC9kb2MvZGJ1cy1kYWVtb24uMS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRmODYzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtZGFlbW9uLjEuaW4KQEAgLTAsMCArMSw3NTIgQEAKKy5cIgorLlwiIGRidXMtZGFlbW9uIG1hbnVhbCBwYWdlLgorLlwiIENvcHlyaWdodCAoQykgMjAwMywyMDA4IFJlZCBIYXQsIEluYy4KKy5cIgorLlRIIGRidXMtZGFlbW9uIDEKKy5TSCBOQU1FCitkYnVzLWRhZW1vbiBcLSBNZXNzYWdlIGJ1cyBkYWVtb24KKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzLWRhZW1vbgorZGJ1cy1kYWVtb24gW1wtXC12ZXJzaW9uXSBbXC1cLXNlc3Npb25dIFtcLVwtc3lzdGVtXSBbXC1cLWNvbmZpZy1maWxlPUZJTEVdCitbXC1cLXByaW50LWFkZHJlc3NbPURFU0NSSVBUT1JdXSBbXC1cLXByaW50LXBpZFs9REVTQ1JJUFRPUl1dIFtcLVwtZm9ya10KKworLlNIIERFU0NSSVBUSU9OCitcZklkYnVzLWRhZW1vblxmUCBpcyB0aGUgRC1CdXMgbWVzc2FnZSBidXMgZGFlbW9uLiBTZWUKK2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgYmlnIHBpY3R1cmUuIEQtQnVzIGlzIGZpcnN0IGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG9uZS10by1vbmUKK2NvbW11bmljYXRpb24gYmV0d2VlbiBhbnkgdHdvIGFwcGxpY2F0aW9uczsgXGZJZGJ1cy1kYWVtb25cZlAgaXMgYW4KK2FwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGlzIGxpYnJhcnkgdG8gaW1wbGVtZW50IGEgbWVzc2FnZSBidXMKK2RhZW1vbi4gTXVsdGlwbGUgcHJvZ3JhbXMgY29ubmVjdCB0byB0aGUgbWVzc2FnZSBidXMgZGFlbW9uIGFuZCBjYW4KK2V4Y2hhbmdlIG1lc3NhZ2VzIHdpdGggb25lIGFub3RoZXIuCisuUFAKK1RoZXJlIGFyZSB0d28gc3RhbmRhcmQgbWVzc2FnZSBidXMgaW5zdGFuY2VzOiB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cworKGluc3RhbGxlZCBvbiBtYW55IHN5c3RlbXMgYXMgdGhlICJtZXNzYWdlYnVzIiBpbml0IHNlcnZpY2UpIGFuZCB0aGUKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1xmSWRidXMtZGFlbW9uXGZQIGlzIHVzZWQgZm9yIGJvdGggb2YgdGhlc2UgaW5zdGFuY2VzLCBidXQgd2l0aAorYSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBmaWxlLgorLlBQCitUaGUgXC1cLXNlc3Npb24gb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyJcLVwtY29uZmlnLWZpbGU9QEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zZXNzaW9uLmNvbmYiIGFuZCB0aGUgXC1cLXN5c3RlbQorb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyJcLVwtY29uZmlnLWZpbGU9QEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zeXN0ZW0uY29uZiIuIEJ5IGNyZWF0aW5nCithZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHVzaW5nIHRoZSBcLVwtY29uZmlnLWZpbGUgb3B0aW9uLAorYWRkaXRpb25hbCBzcGVjaWFsLXB1cnBvc2UgbWVzc2FnZSBidXMgZGFlbW9ucyBjb3VsZCBiZSBjcmVhdGVkLgorLlBQCitUaGUgc3lzdGVtd2lkZSBkYWVtb24gaXMgbm9ybWFsbHkgbGF1bmNoZWQgYnkgYW4gaW5pdCBzY3JpcHQsCitzdGFuZGFyZGx5IGNhbGxlZCBzaW1wbHkgIm1lc3NhZ2VidXMiLgorLlBQCitUaGUgc3lzdGVtd2lkZSBkYWVtb24gaXMgbGFyZ2VseSB1c2VkIGZvciBicm9hZGNhc3Rpbmcgc3lzdGVtIGV2ZW50cywKK3N1Y2ggYXMgY2hhbmdlcyB0byB0aGUgcHJpbnRlciBxdWV1ZSwgb3IgYWRkaW5nL3JlbW92aW5nIGRldmljZXMuCisuUFAKK1RoZSBwZXItc2Vzc2lvbiBkYWVtb24gaXMgdXNlZCBmb3IgdmFyaW91cyBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbgorYW1vbmcgZGVza3RvcCBhcHBsaWNhdGlvbnMgKGhvd2V2ZXIsIGl0IGlzIG5vdCB0aWVkIHRvIFggb3IgdGhlIEdVSQoraW4gYW55IHdheSkuCisuUFAKK1NJR0hVUCB3aWxsIGNhdXNlIHRoZSBELUJ1cyBkYWVtb24gdG8gUEFSVElBTExZIHJlbG9hZCBpdHMKK2NvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdG8gZmx1c2ggaXRzIHVzZXIvZ3JvdXAgaW5mb3JtYXRpb24gY2FjaGVzLiBTb21lCitjb25maWd1cmF0aW9uIGNoYW5nZXMgd291bGQgcmVxdWlyZSBraWNraW5nIGFsbCBhcHBzIG9mZiB0aGUgYnVzOyBzbyB0aGV5IHdpbGwKK29ubHkgdGFrZSBlZmZlY3QgaWYgeW91IHJlc3RhcnQgdGhlIGRhZW1vbi4gUG9saWN5IGNoYW5nZXMgc2hvdWxkIHRha2UgZWZmZWN0Cit3aXRoIFNJR0hVUC4KKworLlNIIE9QVElPTlMKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorLlRQCisuSSAiLS1jb25maWctZmlsZT1GSUxFIgorVXNlIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUuCisuVFAKKy5JICItLWZvcmsiCitGb3JjZSB0aGUgbWVzc2FnZSBidXMgdG8gZm9yayBhbmQgYmVjb21lIGEgZGFlbW9uLCBldmVuIGlmCit0aGUgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgbm90IHNwZWNpZnkgdGhhdCBpdCBzaG91bGQuCitJbiBtb3N0IGNvbnRleHRzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYWxyZWFkeSBnZXRzIHRoaXMKK3JpZ2h0LCB0aG91Z2guCisuSSAiLS1ub2ZvcmsiCitGb3JjZSB0aGUgbWVzc2FnZSBidXMgbm90IHRvIGZvcmsgYW5kIGJlY29tZSBhIGRhZW1vbiwgZXZlbiBpZgordGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBzcGVjaWZpZXMgdGhhdCBpdCBzaG91bGQuCisuVFAKKy5JICItLXByaW50LWFkZHJlc3NbPURFU0NSSVBUT1JdIgorUHJpbnQgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YW5kYXJkIG91dHB1dCwgb3IKK3RvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgaXMgdXNlZCBieSBwcm9ncmFtcyB0aGF0CitsYXVuY2ggdGhlIG1lc3NhZ2UgYnVzLgorLlRQCisuSSAiLS1wcmludC1waWRbPURFU0NSSVBUT1JdIgorUHJpbnQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YW5kYXJkIG91dHB1dCwgb3IKK3RvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgaXMgdXNlZCBieSBwcm9ncmFtcyB0aGF0CitsYXVuY2ggdGhlIG1lc3NhZ2UgYnVzLgorLlRQCisuSSAiLS1zZXNzaW9uIgorVXNlIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBwZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlCitidXMuCisuVFAKKy5JICItLXN5c3RlbSIKK1VzZSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cy4KKy5UUAorLkkgIi0tdmVyc2lvbiIKK1ByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZSBkYWVtb24uCisuVFAKKy5JICItLWludHJvc3BlY3QiCitQcmludCB0aGUgaW50cm9zcGVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWxsIEQtQnVzIGludGVybmFsIGludGVyZmFjZXMuCisuVFAKKy5JICItLWFkZHJlc3NbPUFERFJFU1NdIgorU2V0IHRoZSBhZGRyZXNzIHRvIGxpc3RlbiBvbi4gVGhpcyBvcHRpb24gb3ZlcnJpZGVzIHRoZSBhZGRyZXNzCitjb25maWd1cmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisuVFAKKy5JICItLXN5c3RlbWQtYWN0aXZhdGlvbiIKK0VuYWJsZSBzeXN0ZW1kLXN0eWxlIHNlcnZpY2UgYWN0aXZhdGlvbi4gT25seSB1c2VmdWwgaW4gY29uanVuY3Rpb24KK3dpdGggdGhlIHN5c3RlbWQgc3lzdGVtIGFuZCBzZXNzaW9uIG1hbmFnZXIgb24gTGludXguCisKKy5TSCBDT05GSUdVUkFUSU9OIEZJTEUKKworQSBtZXNzYWdlIGJ1cyBkYWVtb24gaGFzIGEgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgc3BlY2lhbGl6ZXMgaXQKK2ZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCBvbmUgY29uZmlndXJhdGlvbgorZmlsZSBtaWdodCBzZXQgdXAgdGhlIG1lc3NhZ2UgYnVzIHRvIGJlIGEgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cywKK3doaWxlIGFub3RoZXIgbWlnaHQgc2V0IGl0IHVwIHRvIGJlIGEgcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBidXMuCisuUFAKK1RoZSBjb25maWd1cmF0aW9uIGZpbGUgYWxzbyBlc3RhYmxpc2hlcyByZXNvdXJjZSBsaW1pdHMsIHNlY3VyaXR5CitwYXJhbWV0ZXJzLCBhbmQgc28gZm9ydGguCisuUFAKK1RoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IHBhcnQgb2YgYW55IGludGVyb3BlcmFiaWxpdHkKK3NwZWNpZmljYXRpb24gYW5kIGl0cyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzIG5vdCBndWFyYW50ZWVkOyB0aGlzCitkb2N1bWVudCBpcyBkb2N1bWVudGF0aW9uLCBub3Qgc3BlY2lmaWNhdGlvbi4KKy5QUAorVGhlIHN0YW5kYXJkIHN5c3RlbXdpZGUgYW5kIHBlci1zZXNzaW9uIG1lc3NhZ2UgYnVzIHNldHVwcyBhcmUKK2NvbmZpZ3VyZWQgaW4gdGhlIGZpbGVzICJARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1cy0xL3N5c3RlbS5jb25mIiBhbmQKKyJARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1cy0xL3Nlc3Npb24uY29uZiIuICBUaGVzZSBmaWxlcyBub3JtYWxseQorPGluY2x1ZGU+IGEgc3lzdGVtLWxvY2FsLmNvbmYgb3Igc2Vzc2lvbi1sb2NhbC5jb25mOyB5b3UgY2FuIHB1dCBsb2NhbAorb3ZlcnJpZGVzIGluIHRob3NlIGZpbGVzIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgcHJpbWFyeSBjb25maWd1cmF0aW9uCitmaWxlcy4KKworLlBQCitUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGFuIFhNTCBkb2N1bWVudC4gSXQgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcKK2RvY3R5cGUgZGVjbGFyYXRpb246CisubmYKKworICAgPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAgICAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorCisuZmkKKworLlBQCitUaGUgZm9sbG93aW5nIGVsZW1lbnRzIG1heSBiZSBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisKKy5UUAorLkkgIjxidXNjb25maWc+IgorCisuUFAKK1Jvb3QgZWxlbWVudC4KKworLlRQCisuSSAiPHR5cGU+IgorCisuUFAKK1RoZSB3ZWxsLWtub3duIHR5cGUgb2YgdGhlIG1lc3NhZ2UgYnVzLiBDdXJyZW50bHkga25vd24gdmFsdWVzIGFyZQorInN5c3RlbSIgYW5kICJzZXNzaW9uIjsgaWYgb3RoZXIgdmFsdWVzIGFyZSBzZXQsIHRoZXkgc2hvdWxkIGJlCitlaXRoZXIgYWRkZWQgdG8gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24sIG9yIG5hbWVzcGFjZWQuICBUaGUgbGFzdAorPHR5cGU+IGVsZW1lbnQgIndpbnMiIChwcmV2aW91cyB2YWx1ZXMgYXJlIGlnbm9yZWQpLiBUaGlzIGVsZW1lbnQKK29ubHkgY29udHJvbHMgd2hpY2ggbWVzc2FnZSBidXMgc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZQorc2V0IGluIGFjdGl2YXRlZCBjbGllbnRzLiAgTW9zdCBvZiB0aGUgcG9saWN5IHRoYXQgZGlzdGluZ3Vpc2hlcyBhCitzZXNzaW9uIGJ1cyBmcm9tIHRoZSBzeXN0ZW0gYnVzIGlzIGNvbnRyb2xsZWQgZnJvbSB0aGUgb3RoZXIgZWxlbWVudHMKK2luIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisKKy5QUAorSWYgdGhlIHdlbGwta25vd24gdHlwZSBvZiB0aGUgbWVzc2FnZSBidXMgaXMgInNlc3Npb24iLCB0aGVuIHRoZQorREJVU19TVEFSVEVSX0JVU19UWVBFIGVudmlyb25tZW50IHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvICJzZXNzaW9uIgorYW5kIHRoZSBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBzZXQKK3RvIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXNzaW9uIGJ1cy4gIExpa2V3aXNlLCBpZiB0aGUgdHlwZSBvZiB0aGUKK21lc3NhZ2UgYnVzIGlzICJzeXN0ZW0iLCB0aGVuIHRoZSBEQlVTX1NUQVJURVJfQlVTX1RZUEUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvICJzeXN0ZW0iIGFuZCB0aGUgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCitlbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGJ1cworKHdoaWNoIGlzIG5vcm1hbGx5IHdlbGwga25vd24gYW55d2F5KS4KKworLlBQCitFeGFtcGxlOiA8dHlwZT5zZXNzaW9uPC90eXBlPgorCisuVFAKKy5JICI8aW5jbHVkZT4iCisKKy5QUAorSW5jbHVkZSBhIGZpbGUgPGluY2x1ZGU+ZmlsZW5hbWUuY29uZjwvaW5jbHVkZT4gYXQgdGhpcyBwb2ludC4gIElmIHRoZQorZmlsZW5hbWUgaXMgcmVsYXRpdmUsIGl0IGlzIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorZG9pbmcgdGhlIGluY2x1ZGluZy4KKworLlBQCis8aW5jbHVkZT4gaGFzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSAiaWdub3JlX21pc3Npbmc9KHllc3xubykiCit3aGljaCBkZWZhdWx0cyB0byAibm8iIGlmIG5vdCBwcm92aWRlZC4gVGhpcyBhdHRyaWJ1dGUKK2NvbnRyb2xzIHdoZXRoZXIgaXQncyBhIGZhdGFsIGVycm9yIGZvciB0aGUgaW5jbHVkZWQgZmlsZQordG8gYmUgYWJzZW50LgorCisuVFAKKy5JICI8aW5jbHVkZWRpcj4iCisKKy5QUAorSW5jbHVkZSBhbGwgZmlsZXMgaW4gPGluY2x1ZGVkaXI+Zm9vLmQ8L2luY2x1ZGVkaXI+IGF0IHRoaXMKK3BvaW50LiBGaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGFyZSBpbmNsdWRlZCBpbiB1bmRlZmluZWQgb3JkZXIuCitPbmx5IGZpbGVzIGVuZGluZyBpbiAiLmNvbmYiIGFyZSBpbmNsdWRlZC4KKworLlBQCitUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGV4dGVuc2lvbiBvZiB0aGUgc3lzdGVtIGJ1cyBieSBwYXJ0aWN1bGFyCitwYWNrYWdlcy4gRm9yIGV4YW1wbGUsIGlmIENVUFMgd2FudHMgdG8gYmUgYWJsZSB0byBzZW5kIG91dAorbm90aWZpY2F0aW9uIG9mIHByaW50ZXIgcXVldWUgY2hhbmdlcywgaXQgY291bGQgaW5zdGFsbCBhIGZpbGUgdG8KK0BFWFBBTkRFRF9TWVNDT05GRElSQC9kYnVzLTEvc3lzdGVtLmQgdGhhdCBhbGxvd2VkIGFsbCBhcHBzIHRvIHJlY2VpdmUKK3RoaXMgbWVzc2FnZSBhbmQgYWxsb3dlZCB0aGUgcHJpbnRlciBkYWVtb24gdXNlciB0byBzZW5kIGl0LgorCisuVFAKKy5JICI8dXNlcj4iCisKKy5QUAorVGhlIHVzZXIgYWNjb3VudCB0aGUgZGFlbW9uIHNob3VsZCBydW4gYXMsIGFzIGVpdGhlciBhIHVzZXJuYW1lIG9yIGEKK1VJRC4gSWYgdGhlIGRhZW1vbiBjYW5ub3QgY2hhbmdlIHRvIHRoaXMgVUlEIG9uIHN0YXJ0dXAsIGl0IHdpbGwgZXhpdC4KK0lmIHRoaXMgZWxlbWVudCBpcyBub3QgcHJlc2VudCwgdGhlIGRhZW1vbiB3aWxsIG5vdCBjaGFuZ2Ugb3IgY2FyZQorYWJvdXQgaXRzIFVJRC4KKworLlBQCitUaGUgbGFzdCA8dXNlcj4gZW50cnkgaW4gdGhlIGZpbGUgIndpbnMiLCB0aGUgb3RoZXJzIGFyZSBpZ25vcmVkLgorCisuUFAKK1RoZSB1c2VyIGlzIGNoYW5nZWQgYWZ0ZXIgdGhlIGJ1cyBoYXMgY29tcGxldGVkIGluaXRpYWxpemF0aW9uLiAgU28KK3NvY2tldHMgZXRjLiB3aWxsIGJlIGNyZWF0ZWQgYmVmb3JlIGNoYW5naW5nIHVzZXIsIGJ1dCBubyBkYXRhIHdpbGwgYmUKK3JlYWQgZnJvbSBjbGllbnRzIGJlZm9yZSBjaGFuZ2luZyB1c2VyLiBUaGlzIG1lYW5zIHRoYXQgc29ja2V0cworYW5kIFBJRCBmaWxlcyBjYW4gYmUgY3JlYXRlZCBpbiBhIGxvY2F0aW9uIHRoYXQgcmVxdWlyZXMgcm9vdAorcHJpdmlsZWdlcyBmb3Igd3JpdGluZy4KKworLlRQCisuSSAiPGZvcms+IgorCisuUFAKK0lmIHByZXNlbnQsIHRoZSBidXMgZGFlbW9uIGJlY29tZXMgYSByZWFsIGRhZW1vbiAoZm9ya3MKK2ludG8gdGhlIGJhY2tncm91bmQsIGV0Yy4pLiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkCityYXRoZXIgdGhhbiB0aGUgXC1cLWZvcmsgY29tbWFuZCBsaW5lIG9wdGlvbi4KKworLlRQCisuSSAiPGtlZXBfdW1hc2s+IgorCisuUFAKK0lmIHByZXNlbnQsIHRoZSBidXMgZGFlbW9uIGtlZXBzIGl0cyBvcmlnaW5hbCB1bWFzayB3aGVuIGZvcmtpbmcuCitUaGlzIG1heSBiZSB1c2VmdWwgdG8gYXZvaWQgYWZmZWN0aW5nIHRoZSBiZWhhdmlvciBvZiBjaGlsZCBwcm9jZXNzZXMuCisKKy5UUAorLkkgIjxsaXN0ZW4+IgorCisuUFAKK0FkZCBhbiBhZGRyZXNzIHRoYXQgdGhlIGJ1cyBzaG91bGQgbGlzdGVuIG9uLiBUaGUKK2FkZHJlc3MgaXMgaW4gdGhlIHN0YW5kYXJkIEQtQnVzIGZvcm1hdCB0aGF0IGNvbnRhaW5zCithIHRyYW5zcG9ydCBuYW1lIHBsdXMgcG9zc2libGUgcGFyYW1ldGVycy9vcHRpb25zLgorCisuUFAKK0V4YW1wbGU6IDxsaXN0ZW4+dW5peDpwYXRoPS90bXAvZm9vPC9saXN0ZW4+CisKKy5QUAorRXhhbXBsZTogPGxpc3Rlbj50Y3A6aG9zdD1sb2NhbGhvc3QscG9ydD0xMjM0PC9saXN0ZW4+CisKKy5QUAorSWYgdGhlcmUgYXJlIG11bHRpcGxlIDxsaXN0ZW4+IGVsZW1lbnRzLCB0aGVuIHRoZSBidXMgbGlzdGVucworb24gbXVsdGlwbGUgYWRkcmVzc2VzLiBUaGUgYnVzIHdpbGwgcGFzcyBpdHMgYWRkcmVzcyB0bworc3RhcnRlZCBzZXJ2aWNlcyBvciBvdGhlciBpbnRlcmVzdGVkIHBhcnRpZXMgd2l0aAordGhlIGxhc3QgYWRkcmVzcyBnaXZlbiBpbiA8bGlzdGVuPiBmaXJzdC4gVGhhdCBpcywKK2FwcHMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byB0aGUgbGFzdCA8bGlzdGVuPiBhZGRyZXNzIGZpcnN0LgorCisuUFAKK3RjcCBzb2NrZXRzIGNhbiBhY2NlcHQgSVB2NCBhZGRyZXNzZXMsIElQdjYgYWRkcmVzc2VzIG9yIGhvc3RuYW1lcy4KK0lmIGEgaG9zdG5hbWUgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgYWRkcmVzc2VzLCB0aGUgc2VydmVyIHdpbGwgYmluZAordG8gYWxsIG9mIHRoZW0uIFRoZSBmYW1pbHk9aXB2NCBvciBmYW1pbHk9aXB2NiBvcHRpb25zIGNhbiBiZSB1c2VkCit0byBmb3JjZSBpdCB0byBiaW5kIHRvIGEgc3Vic2V0IG9mIGFkZHJlc3NlcworCisuUFAKK0V4YW1wbGU6IDxsaXN0ZW4+dGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MCxmYW1pbHk9aXB2NDwvbGlzdGVuPgorCisuUFAKK0Egc3BlY2lhbCBjYXNlIGlzIHVzaW5nIGEgcG9ydCBudW1iZXIgb2YgemVybyAob3Igb21pdHRpbmcgdGhlIHBvcnQpLAord2hpY2ggbWVhbnMgdG8gY2hvb3NlIGFuIGF2YWlsYWJsZSBwb3J0IHNlbGVjdGVkIGJ5IHRoZSBvcGVyYXRpbmcKK3N5c3RlbS4gVGhlIHBvcnQgbnVtYmVyIGNob3NlbiBjYW4gYmUgb2J0YWluZWQgd2l0aCB0aGUKKy0tcHJpbnQtYWRkcmVzcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGFuZCB3aWxsIGJlIHByZXNlbnQgaW4gb3RoZXIKK2Nhc2VzIHdoZXJlIHRoZSBzZXJ2ZXIgcmVwb3J0cyBpdHMgb3duIGFkZHJlc3MsIHN1Y2ggYXMgd2hlbgorREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIHNldC4KKworLlBQCitFeGFtcGxlOiA8bGlzdGVuPnRjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTA8L2xpc3Rlbj4KKworLlBQCit0Y3AgYWRkcmVzc2VzIGFsc28gYWxsb3cgYSBiaW5kPWhvc3RuYW1lIG9wdGlvbiwgd2hpY2ggd2lsbCBvdmVycmlkZQordGhlIGhvc3Qgb3B0aW9uIHNwZWNpZnlpbmcgd2hhdCBhZGRyZXNzIHRvIGJpbmQgdG8sIHdpdGhvdXQgY2hhbmdpbmcKK3RoZSBhZGRyZXNzIHJlcG9ydGVkIGJ5IHRoZSBidXMuIFRoZSBiaW5kIG9wdGlvbiBjYW4gYWxzbyB0YWtlIGEKK3NwZWNpYWwgbmFtZSAnKicgdG8gY2F1c2UgdGhlIGJ1cyB0byBsaXN0ZW4gb24gYWxsIGxvY2FsIGFkZHJlc3MKKyhJTkFERFJfQU5ZKS4gVGhlIHNwZWNpZmllZCBob3N0IHNob3VsZCBiZSBhIHZhbGlkIG5hbWUgb2YgdGhlIGxvY2FsCittYWNoaW5lIG9yIHdlaXJkIHN0dWZmIHdpbGwgaGFwcGVuLgorCisuUFAKK0V4YW1wbGU6IDxsaXN0ZW4+dGNwOmhvc3Q9bG9jYWxob3N0LGJpbmQ9Kixwb3J0PTA8L2xpc3Rlbj4KKworLlRQCisuSSAiPGF1dGg+IgorCisuUFAKK0xpc3RzIHBlcm1pdHRlZCBhdXRob3JpemF0aW9uIG1lY2hhbmlzbXMuIElmIHRoaXMgZWxlbWVudCBkb2Vzbid0CitleGlzdCwgdGhlbiBhbGwga25vd24gbWVjaGFuaXNtcyBhcmUgYWxsb3dlZC4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZQorPGF1dGg+IGVsZW1lbnRzLCBhbGwgdGhlIGxpc3RlZCBtZWNoYW5pc21zIGFyZSBhbGxvd2VkLiAgVGhlIG9yZGVyIGluCit3aGljaCBtZWNoYW5pc21zIGFyZSBsaXN0ZWQgaXMgbm90IG1lYW5pbmdmdWwuCisKKy5QUAorRXhhbXBsZTogPGF1dGg+RVhURVJOQUw8L2F1dGg+CisKKy5QUAorRXhhbXBsZTogPGF1dGg+REJVU19DT09LSUVfU0hBMTwvYXV0aD4KKworLlRQCisuSSAiPHNlcnZpY2VkaXI+IgorCisuUFAKK0FkZHMgYSBkaXJlY3RvcnkgdG8gc2NhbiBmb3IgLnNlcnZpY2UgZmlsZXMuIERpcmVjdG9yaWVzIGFyZQorc2Nhbm5lZCBzdGFydGluZyB3aXRoIHRoZSBsYXN0IHRvIGFwcGVhciBpbiB0aGUgY29uZmlnIGZpbGUKKyh0aGUgZmlyc3QgLnNlcnZpY2UgZmlsZSBmb3VuZCB0aGF0IHByb3ZpZGVzIGEgcGFydGljdWxhcgorc2VydmljZSB3aWxsIGJlIHVzZWQpLgorCisuUFAKK1NlcnZpY2UgZmlsZXMgdGVsbCB0aGUgYnVzIGhvdyB0byBhdXRvbWF0aWNhbGx5IHN0YXJ0IGEgcHJvZ3JhbS4KK1RoZXkgYXJlIHByaW1hcmlseSB1c2VkIHdpdGggdGhlIHBlci11c2VyLXNlc3Npb24gYnVzLAorbm90IHRoZSBzeXN0ZW13aWRlIGJ1cy4KKworLlRQCisuSSAiPHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvPiIKKworLlBQCis8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy8+IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhIHNlcmllcworb2YgPHNlcnZpY2VkaXIvPiBlbGVtZW50cyBmb3IgZWFjaCBvZiB0aGUgZGF0YSBkaXJlY3RvcmllcyBpbiB0aGUgIlhERworQmFzZSBEaXJlY3RvcnkgU3BlY2lmaWNhdGlvbiIgd2l0aCB0aGUgc3ViZGlyZWN0b3J5ICJkYnVzLTEvc2VydmljZXMiLAorc28gZm9yIGV4YW1wbGUgIi91c3Ivc2hhcmUvZGJ1cy0xL3NlcnZpY2VzIiB3b3VsZCBiZSBhbW9uZyB0aGUKK2RpcmVjdG9yaWVzIHNlYXJjaGVkLgorCisuUFAKK1RoZSAiWERHIEJhc2UgRGlyZWN0b3J5IFNwZWNpZmljYXRpb24iIGNhbiBiZSBmb3VuZCBhdAoraHR0cDovL2ZyZWVkZXNrdG9wLm9yZy93aWtpL1N0YW5kYXJkcy9iYXNlZGlyLXNwZWMgaWYgaXQgaGFzbid0IG1vdmVkLAorb3RoZXJ3aXNlIHRyeSB5b3VyIGZhdm9yaXRlIHNlYXJjaCBlbmdpbmUuCisKKy5QUAorVGhlIDxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzLz4gb3B0aW9uIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlCitwZXItdXNlci1zZXNzaW9uIGJ1cyBkYWVtb24gZGVmaW5lZCBpbgorQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zZXNzaW9uLmNvbmYuIFB1dHRpbmcgaXQgaW4gYW55IG90aGVyCitjb25maWd1cmF0aW9uIGZpbGUgd291bGQgcHJvYmFibHkgYmUgbm9uc2Vuc2UuCisKKy5UUAorLkkgIjxzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMvPiIKKworLlBQCis8c3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzLz4gc3BlY2lmaWVzIHRoZSBzdGFuZGFyZCBzeXN0ZW0td2lkZQorYWN0aXZhdGlvbiBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3Igc2VydmljZSBmaWxlcy4KK1RoaXMgb3B0aW9uIGRlZmF1bHRzIHRvIEBFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzLgorCisuUFAKK1RoZSA8c3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzLz4gb3B0aW9uIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlCitwZXItc3lzdGVtIGJ1cyBkYWVtb24gZGVmaW5lZCBpbgorQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zeXN0ZW0uY29uZi4gUHV0dGluZyBpdCBpbiBhbnkgb3RoZXIKK2NvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBwcm9iYWJseSBiZSBub25zZW5zZS4KKworLlRQCisuSSAiPHNlcnZpY2VoZWxwZXIvPiIKKworLlBQCis8c2VydmljZWhlbHBlci8+IHNwZWNpZmllcyB0aGUgc2V0dWlkIGhlbHBlciB0aGF0IGlzIHVzZWQgdG8gbGF1bmNoCitzeXN0ZW0gZGFlbW9ucyB3aXRoIGFuIGFsdGVybmF0ZSB1c2VyLiBUeXBpY2FsbHkgdGhpcyBzaG91bGQgYmUKK3RoZSBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyIGV4ZWN1dGFibGUgaW4gbG9jYXRlZCBpbiBsaWJleGVjLgorCisuUFAKK1RoZSA8c2VydmljZWhlbHBlci8+IG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZSBwZXItc3lzdGVtIGJ1cyBkYWVtb24KK2RlZmluZWQgaW4gQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zeXN0ZW0uY29uZi4gUHV0dGluZyBpdCBpbiBhbnkgb3RoZXIKK2NvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBwcm9iYWJseSBiZSBub25zZW5zZS4KKworLlRQCisuSSAiPGxpbWl0PiIKKworLlBQCis8bGltaXQ+IGVzdGFibGlzaGVzIGEgcmVzb3VyY2UgbGltaXQuIEZvciBleGFtcGxlOgorLm5mCisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV9zaXplIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj41MTI8L2xpbWl0PgorLmZpCisKKy5QUAorVGhlIG5hbWUgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KK0F2YWlsYWJsZSBsaW1pdCBuYW1lcyBhcmU6CisubmYKKyAgICAgICJtYXhfaW5jb21pbmdfYnl0ZXMiICAgICAgICAgOiB0b3RhbCBzaXplIGluIGJ5dGVzIG9mIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgZnJvbSBhIHNpbmdsZSBjb25uZWN0aW9uCisgICAgICAibWF4X2luY29taW5nX3VuaXhfZmRzIiAgICAgIDogdG90YWwgbnVtYmVyIG9mIHVuaXggZmRzIG9mIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgZnJvbSBhIHNpbmdsZSBjb25uZWN0aW9uCisgICAgICAibWF4X291dGdvaW5nX2J5dGVzIiAgICAgICAgIDogdG90YWwgc2l6ZSBpbiBieXRlcyBvZiBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlZCB1cCBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbgorICAgICAgIm1heF9vdXRnb2luZ191bml4X2ZkcyIgICAgICA6IHRvdGFsIG51bWJlciBvZiB1bml4IGZkcyBvZiBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlZCB1cCBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbgorICAgICAgIm1heF9tZXNzYWdlX3NpemUiICAgICAgICAgICA6IG1heCBzaXplIG9mIGEgc2luZ2xlIG1lc3NhZ2UgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcworICAgICAgIm1heF9tZXNzYWdlX3VuaXhfZmRzIiAgICAgICA6IG1heCB1bml4IGZkcyBvZiBhIHNpbmdsZSBtZXNzYWdlCisgICAgICAic2VydmljZV9zdGFydF90aW1lb3V0IiAgICAgIDogbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocykgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0YXJ0ZWQgc2VydmljZSBoYXMgdG8gY29ubmVjdAorICAgICAgImF1dGhfdGltZW91dCIgICAgICAgICAgICAgICA6IG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMpIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIGdpdmVuIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlCisgICAgICAibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyIgIDogbWF4IG51bWJlciBvZiBhdXRoZW50aWNhdGVkIGNvbm5lY3Rpb25zCisgICAgICAibWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMiIDogbWF4IG51bWJlciBvZiB1bmF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucworICAgICAgIm1heF9jb25uZWN0aW9uc19wZXJfdXNlciIgICA6IG1heCBudW1iZXIgb2YgY29tcGxldGVkIGNvbm5lY3Rpb25zIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSB1c2VyCisgICAgICAibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiIDogbWF4IG51bWJlciBvZiBzZXJ2aWNlIGxhdW5jaGVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgYXQgdGhlIHNhbWUgdGltZQorICAgICAgIm1heF9uYW1lc19wZXJfY29ubmVjdGlvbiIgICA6IG1heCBudW1iZXIgb2YgbmFtZXMgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGNhbiBvd24KKyAgICAgICJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iOiBtYXggbnVtYmVyIG9mIG1hdGNoIHJ1bGVzIGZvciBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiIgOiBtYXggbnVtYmVyIG9mIHBlbmRpbmcgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGllcyBwZXIgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1iZXIgb2YgY2FsbHMtaW4tcHJvZ3Jlc3MpCisgICAgICAicmVwbHlfdGltZW91dCIgICAgICAgICAgICAgIDogbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCBhIG1ldGhvZCBjYWxsIHRpbWVzIG91dAorLmZpCisKKy5QUAorVGhlIG1heCBpbmNvbWluZy9vdXRnb2luZyBxdWV1ZSBzaXplcyBhbGxvdyBhIG5ldyBtZXNzYWdlIHRvIGJlIHF1ZXVlZAoraWYgb25lIGJ5dGUgcmVtYWlucyBiZWxvdyB0aGUgbWF4LiBTbyB5b3UgY2FuIGluIGZhY3QgZXhjZWVkIHRoZSBtYXgKK2J5IG1heF9tZXNzYWdlX3NpemUuCisKKy5QUAorbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyBkaXZpZGVkIGJ5IG1heF9jb25uZWN0aW9uc19wZXJfdXNlciBpcyB0aGUKK251bWJlciBvZiB1c2VycyB0aGF0IGNhbiB3b3JrIHRvZ2V0aGVyIHRvIGRlbmlhbC1vZi1zZXJ2aWNlIGFsbCBvdGhlciB1c2VycyBieSB1c2luZwordXAgYWxsIGNvbm5lY3Rpb25zIG9uIHRoZSBzeXN0ZW13aWRlIGJ1cy4KKworLlBQCitMaW1pdHMgYXJlIG5vcm1hbGx5IG9ubHkgb2YgaW50ZXJlc3Qgb24gdGhlIHN5c3RlbXdpZGUgYnVzLCBub3QgdGhlIHVzZXIgc2Vzc2lvbgorYnVzZXMuCisKKy5UUAorLkkgIjxwb2xpY3k+IgorCisuUFAKK1RoZSA8cG9saWN5PiBlbGVtZW50IGRlZmluZXMgYSBzZWN1cml0eSBwb2xpY3kgdG8gYmUgYXBwbGllZCB0byBhIHBhcnRpY3VsYXIKK3NldCBvZiBjb25uZWN0aW9ucyB0byB0aGUgYnVzLiBBIHBvbGljeSBpcyBtYWRlIHVwIG9mCis8YWxsb3c+IGFuZCA8ZGVueT4gZWxlbWVudHMuIFBvbGljaWVzIGFyZSBub3JtYWxseSB1c2VkIHdpdGggdGhlIHN5c3RlbXdpZGUgYnVzOwordGhleSBhcmUgYW5hbG9nb3VzIHRvIGEgZmlyZXdhbGwgaW4gdGhhdCB0aGV5IGFsbG93IGV4cGVjdGVkIHRyYWZmaWMKK2FuZCBwcmV2ZW50IHVuZXhwZWN0ZWQgdHJhZmZpYy4KKworLlBQCitDdXJyZW50bHksIHRoZSBzeXN0ZW0gYnVzIGhhcyBhIGRlZmF1bHQtZGVueSBwb2xpY3kgZm9yIHNlbmRpbmcgbWV0aG9kIGNhbGxzCithbmQgb3duaW5nIGJ1cyBuYW1lcy4gIEV2ZXJ5dGhpbmcgZWxzZSwgaW4gcGFydGljdWxhciByZXBseSBtZXNzYWdlcywgcmVjZWl2ZQorY2hlY2tzLCBhbmQgc2lnbmFscyBoYXMgYSBkZWZhdWx0IGFsbG93IHBvbGljeS4KKworLlBQCitJbiBnZW5lcmFsLCBpdCBpcyBiZXN0IHRvIGtlZXAgc3lzdGVtIHNlcnZpY2VzIGFzIHNtYWxsLCB0YXJnZXRlZCBwcm9ncmFtcyB3aGljaAorcnVuIGluIHRoZWlyIG93biBwcm9jZXNzIGFuZCBwcm92aWRlIGEgc2luZ2xlIGJ1cyBuYW1lLiAgVGhlbiwgYWxsIHRoYXQgaXMgbmVlZGVkCitpcyBhbiA8YWxsb3c+IHJ1bGUgZm9yIHRoZSAib3duIiBwZXJtaXNzaW9uIHRvIGxldCB0aGUgcHJvY2VzcyBjbGFpbSB0aGUgYnVzCituYW1lLCBhbmQgYSAic2VuZF9kZXN0aW5hdGlvbiIgcnVsZSB0byBhbGxvdyB0cmFmZmljIGZyb20gc29tZSBvciBhbGwgdWlkcyB0bworeW91ciBzZXJ2aWNlLgorCisuUFAKK1RoZSA8cG9saWN5PiBlbGVtZW50IGhhcyBvbmUgb2YgZm91ciBhdHRyaWJ1dGVzOgorLm5mCisgIGNvbnRleHQ9IihkZWZhdWx0fG1hbmRhdG9yeSkiCisgIGF0X2NvbnNvbGU9Iih0cnVlfGZhbHNlKSIKKyAgdXNlcj0idXNlcm5hbWUgb3IgdXNlcmlkIgorICBncm91cD0iZ3JvdXAgbmFtZSBvciBnaWQiCisuZmkKKworLlBQCitQb2xpY2llcyBhcmUgYXBwbGllZCB0byBhIGNvbm5lY3Rpb24gYXMgZm9sbG93czoKKy5uZgorICAgLSBhbGwgY29udGV4dD0iZGVmYXVsdCIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgIC0gYWxsIGdyb3VwPSJjb25uZWN0aW9uJ3MgdXNlcidzIGdyb3VwIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgICBpbiB1bmRlZmluZWQgb3JkZXIKKyAgIC0gYWxsIHVzZXI9ImNvbm5lY3Rpb24ncyBhdXRoIHVzZXIiIHBvbGljaWVzIGFyZSBhcHBsaWVkCisgICAgIGluIHVuZGVmaW5lZCBvcmRlcgorICAgLSBhbGwgYXRfY29uc29sZT0idHJ1ZSIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgIC0gYWxsIGF0X2NvbnNvbGU9ImZhbHNlIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgLSBhbGwgY29udGV4dD0ibWFuZGF0b3J5IiBwb2xpY2llcyBhcmUgYXBwbGllZAorLmZpCisKKy5QUAorUG9saWNpZXMgYXBwbGllZCBsYXRlciB3aWxsIG92ZXJyaWRlIHRob3NlIGFwcGxpZWQgZWFybGllciwKK3doZW4gdGhlIHBvbGljaWVzIG92ZXJsYXAuIE11bHRpcGxlIHBvbGljaWVzIHdpdGggdGhlIHNhbWUKK3VzZXIvZ3JvdXAvY29udGV4dCBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIKK2luIHRoZSBjb25maWcgZmlsZS4KKworLlRQCisuSSAiPGRlbnk+IgorLkkgIjxhbGxvdz4iCisKKy5QUAorQSA8ZGVueT4gZWxlbWVudCBhcHBlYXJzIGJlbG93IGEgPHBvbGljeT4gZWxlbWVudCBhbmQgcHJvaGliaXRzIHNvbWUKK2FjdGlvbi4gVGhlIDxhbGxvdz4gZWxlbWVudCBtYWtlcyBhbiBleGNlcHRpb24gdG8gcHJldmlvdXMgPGRlbnk+CitzdGF0ZW1lbnRzLCBhbmQgd29ya3MganVzdCBsaWtlIDxkZW55PiBidXQgd2l0aCB0aGUgaW52ZXJzZSBtZWFuaW5nLgorCisuUFAKK1RoZSBwb3NzaWJsZSBhdHRyaWJ1dGVzIG9mIHRoZXNlIGVsZW1lbnRzIGFyZToKKy5uZgorICAgc2VuZF9pbnRlcmZhY2U9ImludGVyZmFjZV9uYW1lIgorICAgc2VuZF9tZW1iZXI9Im1ldGhvZF9vcl9zaWduYWxfbmFtZSIKKyAgIHNlbmRfZXJyb3I9ImVycm9yX25hbWUiCisgICBzZW5kX2Rlc3RpbmF0aW9uPSJuYW1lIgorICAgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIgfCAibWV0aG9kX3JldHVybiIgfCAic2lnbmFsIiB8ICJlcnJvciIKKyAgIHNlbmRfcGF0aD0iL3BhdGgvbmFtZSIKKworICAgcmVjZWl2ZV9pbnRlcmZhY2U9ImludGVyZmFjZV9uYW1lIgorICAgcmVjZWl2ZV9tZW1iZXI9Im1ldGhvZF9vcl9zaWduYWxfbmFtZSIKKyAgIHJlY2VpdmVfZXJyb3I9ImVycm9yX25hbWUiCisgICByZWNlaXZlX3NlbmRlcj0ibmFtZSIKKyAgIHJlY2VpdmVfdHlwZT0ibWV0aG9kX2NhbGwiIHwgIm1ldGhvZF9yZXR1cm4iIHwgInNpZ25hbCIgfCAiZXJyb3IiCisgICByZWNlaXZlX3BhdGg9Ii9wYXRoL25hbWUiCisKKyAgIHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiB8ICJmYWxzZSIKKyAgIHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiB8ICJmYWxzZSIKKworICAgZWF2ZXNkcm9wPSJ0cnVlIiB8ICJmYWxzZSIKKworICAgb3duPSJuYW1lIgorICAgdXNlcj0idXNlcm5hbWUiCisgICBncm91cD0iZ3JvdXBuYW1lIgorLmZpCisKKy5QUAorRXhhbXBsZXM6CisubmYKKyAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5TZXJ2aWNlIiBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvPgorICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgPGRlbnkgcmVjZWl2ZV9zZW5kZXI9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgIDxkZW55IHVzZXI9ImpvaG4iLz4KKyAgIDxkZW55IGdyb3VwPSJlbmVtaWVzIi8+CisuZmkKKworLlBQCitUaGUgPGRlbnk+IGVsZW1lbnQncyBhdHRyaWJ1dGVzIGRldGVybWluZSB3aGV0aGVyIHRoZSBkZW55ICJtYXRjaGVzIiBhCitwYXJ0aWN1bGFyIGFjdGlvbi4gSWYgaXQgbWF0Y2hlcywgdGhlIGFjdGlvbiBpcyBkZW5pZWQgKHVubGVzcyBsYXRlcgorcnVsZXMgaW4gdGhlIGNvbmZpZyBmaWxlIGFsbG93IGl0KS4KKy5QUAorc2VuZF9kZXN0aW5hdGlvbiBhbmQgcmVjZWl2ZV9zZW5kZXIgcnVsZXMgbWVhbiB0aGF0IG1lc3NhZ2VzIG1heSBub3QgYmUKK3NlbnQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgKm93bmVyKiBvZiB0aGUgZ2l2ZW4gbmFtZSwgbm90IHRoYXQKK3RoZXkgbWF5IG5vdCBiZSBzZW50ICp0byB0aGF0IG5hbWUqLiBUaGF0IGlzLCBpZiBhIGNvbm5lY3Rpb24KK293bnMgc2VydmljZXMgQSwgQiwgQywgYW5kIHNlbmRpbmcgdG8gQSBpcyBkZW5pZWQsIHNlbmRpbmcgdG8gQiBvciBDCit3aWxsIG5vdCB3b3JrIGVpdGhlci4KKy5QUAorVGhlIG90aGVyIHNlbmRfKiBhbmQgcmVjZWl2ZV8qIGF0dHJpYnV0ZXMgYXJlIHB1cmVseSB0ZXh0dWFsL2J5LXZhbHVlCittYXRjaGVzIGFnYWluc3QgdGhlIGdpdmVuIGZpZWxkIGluIHRoZSBtZXNzYWdlIGhlYWRlci4KKy5QUAorIkVhdmVzZHJvcHBpbmciIG9jY3VycyB3aGVuIGFuIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGEgbWVzc2FnZSB0aGF0Cit3YXMgZXhwbGljaXRseSBhZGRyZXNzZWQgdG8gYSBuYW1lIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBvd24sIG9yCitpcyBhIHJlcGx5IHRvIHN1Y2ggYSBtZXNzYWdlLiBFYXZlc2Ryb3BwaW5nIHRodXMgb25seSBhcHBsaWVzIHRvCittZXNzYWdlcyB0aGF0IGFyZSBhZGRyZXNzZWQgdG8gc2VydmljZXMgYW5kIHJlcGxpZXMgdG8gc3VjaCBtZXNzYWdlcworKGkuZS4gaXQgZG9lcyBub3QgYXBwbHkgdG8gc2lnbmFscykuCisuUFAKK0ZvciA8YWxsb3c+LCBlYXZlc2Ryb3A9InRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIG1hdGNoZXMgZXZlbgord2hlbiBlYXZlc2Ryb3BwaW5nLiBlYXZlc2Ryb3A9ImZhbHNlIiBpcyB0aGUgZGVmYXVsdCBhbmQgbWVhbnMgdGhhdAordGhlIHJ1bGUgb25seSBhbGxvd3MgbWVzc2FnZXMgdG8gZ28gdG8gdGhlaXIgc3BlY2lmaWVkIHJlY2lwaWVudC4KK0ZvciA8ZGVueT4sIGVhdmVzZHJvcD0idHJ1ZSIgaW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgbWF0Y2hlcworb25seSB3aGVuIGVhdmVzZHJvcHBpbmcuIGVhdmVzZHJvcD0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGZvciA8ZGVueT4KK2Fsc28sIGJ1dCBoZXJlIGl0IG1lYW5zIHRoYXQgdGhlIHJ1bGUgYXBwbGllcyBhbHdheXMsIGV2ZW4gd2hlbgorbm90IGVhdmVzZHJvcHBpbmcuIFRoZSBlYXZlc2Ryb3AgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGNvbWJpbmVkIHdpdGgKK3NlbmQgYW5kIHJlY2VpdmUgcnVsZXMgKHdpdGggc2VuZF8qIGFuZCByZWNlaXZlXyogYXR0cmlidXRlcykuCisuUFAKK1RoZSBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHkgYXR0cmlidXRlIHdvcmtzIHNpbWlsYXJseSB0byB0aGUgZWF2ZXNkcm9wCithdHRyaWJ1dGUuIEl0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIDxkZW55PiBvciA8YWxsb3c+IG1hdGNoZXMgYSByZXBseQordGhhdCBpcyBleHBlY3RlZCAoY29ycmVzcG9uZHMgdG8gYSBwcmV2aW91cyBtZXRob2QgY2FsbCBtZXNzYWdlKS4KK1RoaXMgYXR0cmlidXRlIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHJlcGx5IG1lc3NhZ2VzIChlcnJvcnMgYW5kIG1ldGhvZAorcmV0dXJucyksIGFuZCBpcyBpZ25vcmVkIGZvciBvdGhlciBtZXNzYWdlIHR5cGVzLgorCisuUFAKK0ZvciA8YWxsb3c+LCBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIGlzIHRoZSBkZWZhdWx0IGFuZCBpbmRpY2F0ZXMgdGhhdAorb25seSByZXF1ZXN0ZWQgcmVwbGllcyBhcmUgYWxsb3dlZCBieSB0aGUKK3J1bGUuIFtzZW5kfHJlY2VpdmVdX3JlcXVlc3RlZF9yZXBseT0iZmFsc2UiIG1lYW5zIHRoYXQgdGhlIHJ1bGUgYWxsb3dzIGFueSByZXBseQorZXZlbiBpZiB1bmV4cGVjdGVkLgorCisuUFAKK0ZvciA8ZGVueT4sIFtzZW5kfHJlY2VpdmVdX3JlcXVlc3RlZF9yZXBseT0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGJ1dCBpbmRpY2F0ZXMgdGhhdAordGhlIHJ1bGUgbWF0Y2hlcyBvbmx5IHdoZW4gdGhlIHJlcGx5IHdhcyBub3QKK3JlcXVlc3RlZC4gW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBhcHBsaWVzCithbHdheXMsIHJlZ2FyZGxlc3Mgb2YgcGVuZGluZyByZXBseSBzdGF0ZS4KKworLlBQCit1c2VyIGFuZCBncm91cCBkZW5pYWxzIG1lYW4gdGhhdCB0aGUgZ2l2ZW4gdXNlciBvciBncm91cCBtYXkKK25vdCBjb25uZWN0IHRvIHRoZSBtZXNzYWdlIGJ1cy4KKworLlBQCitGb3IgIm5hbWUiLCAidXNlcm5hbWUiLCAiZ3JvdXBuYW1lIiwgZXRjLgordGhlIGNoYXJhY3RlciAiKiIgY2FuIGJlIHN1YnN0aXR1dGVkLCBtZWFuaW5nICJhbnkuIiBDb21wbGV4IGdsb2JzCitsaWtlICJmb28uYmFyLioiIGFyZW4ndCBhbGxvd2VkIGZvciBub3cgYmVjYXVzZSB0aGV5J2QgYmUgd29yayB0bworaW1wbGVtZW50IGFuZCBtYXliZSBlbmNvdXJhZ2Ugc2xvcHB5IHNlY3VyaXR5IGFueXdheS4KKworLlBQCitJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGRlbnkgYSB1c2VyIG9yIGdyb3VwIGluc2lkZSBhIDxwb2xpY3k+Citmb3IgYSB1c2VyIG9yIGdyb3VwOyB1c2VyL2dyb3VwIGRlbmlhbHMgY2FuIG9ubHkgYmUgaW5zaWRlCitjb250ZXh0PSJkZWZhdWx0IiBvciBjb250ZXh0PSJtYW5kYXRvcnkiIHBvbGljaWVzLgorCisuUFAKK0Egc2luZ2xlIDxkZW55PiBydWxlIG1heSBzcGVjaWZ5IGNvbWJpbmF0aW9ucyBvZiBhdHRyaWJ1dGVzIHN1Y2ggYXMKK3NlbmRfZGVzdGluYXRpb24gYW5kIHNlbmRfaW50ZXJmYWNlIGFuZCBzZW5kX3R5cGUuIEluIHRoaXMgY2FzZSwgdGhlCitkZW5pYWwgYXBwbGllcyBvbmx5IGlmIGJvdGggYXR0cmlidXRlcyBtYXRjaCB0aGUgbWVzc2FnZSBiZWluZyBkZW5pZWQuCitlLmcuIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJmb28uYmFyIiBzZW5kX2Rlc3RpbmF0aW9uPSJmb28uYmxhaCIvPiB3b3VsZAorZGVueSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbiBpbnRlcmZhY2UgQU5EIHRoZSBnaXZlbiBidXMgbmFtZS4KK1RvIGdldCBhbiBPUiBlZmZlY3QgeW91IHNwZWNpZnkgbXVsdGlwbGUgPGRlbnk+IHJ1bGVzLgorCisuUFAKK1lvdSBjYW4ndCBpbmNsdWRlIGJvdGggc2VuZF8gYW5kIHJlY2VpdmVfIGF0dHJpYnV0ZXMgb24gdGhlIHNhbWUKK3J1bGUsIHNpbmNlICJ3aGV0aGVyIHRoZSBtZXNzYWdlIGNhbiBiZSBzZW50IiBhbmQgIndoZXRoZXIgaXQgY2FuIGJlCityZWNlaXZlZCIgYXJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5LgorCisuUFAKK0JlIGNhcmVmdWwgd2l0aCBzZW5kX2ludGVyZmFjZS9yZWNlaXZlX2ludGVyZmFjZSwgYmVjYXVzZSB0aGUKK2ludGVyZmFjZSBmaWVsZCBpbiBtZXNzYWdlcyBpcyBvcHRpb25hbC4gIEluIHBhcnRpY3VsYXIsIGRvIE5PVAorc3BlY2lmeSA8ZGVueSBzZW5kX2ludGVyZmFjZT0ib3JnLmZvby5CYXIiLz4hICBUaGlzIHdpbGwgY2F1c2UKK25vLWludGVyZmFjZSBtZXNzYWdlcyB0byBiZSBibG9ja2VkIGZvciBhbGwgc2VydmljZXMsIHdoaWNoIGlzCithbG1vc3QgY2VydGFpbmx5IG5vdCB3aGF0IHlvdSBpbnRlbmRlZC4gIEFsd2F5cyB1c2UgcnVsZXMgb2YKK3RoZSBmb3JtOiA8ZGVueSBzZW5kX2ludGVyZmFjZT0ib3JnLmZvby5CYXIiIHNlbmRfZGVzdGluYXRpb249Im9yZy5mb28uU2VydmljZSIvPgorCisuVFAKKy5JICI8c2VsaW51eD4iCisKKy5QUAorVGhlIDxzZWxpbnV4PiBlbGVtZW50IGNvbnRhaW5zIHNldHRpbmdzIHJlbGF0ZWQgdG8gU2VjdXJpdHkgRW5oYW5jZWQgTGludXguCitNb3JlIGRldGFpbHMgYmVsb3cuCisKKy5UUAorLkkgIjxhc3NvY2lhdGU+IgorCisuUFAKK0FuIDxhc3NvY2lhdGU+IGVsZW1lbnQgYXBwZWFycyBiZWxvdyBhbiA8c2VsaW51eD4gZWxlbWVudCBhbmQKK2NyZWF0ZXMgYSBtYXBwaW5nLiBSaWdodCBub3cgb25seSBvbmUga2luZCBvZiBhc3NvY2lhdGlvbiBpcyBwb3NzaWJsZToKKy5uZgorICAgPGFzc29jaWF0ZSBvd249Im9yZy5mcmVlZGVza3RvcC5Gb29iYXIiIGNvbnRleHQ9ImZvb190Ii8+CisuZmkKKworLlBQCitUaGlzIG1lYW5zIHRoYXQgaWYgYSBjb25uZWN0aW9uIGFza3MgdG8gb3duIHRoZSBuYW1lCisib3JnLmZyZWVkZXNrdG9wLkZvb2JhciIgdGhlbiB0aGUgc291cmNlIGNvbnRleHQgd2lsbCBiZSB0aGUgY29udGV4dAorb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZSB0YXJnZXQgY29udGV4dCB3aWxsIGJlICJmb29fdCIgLSBzZWUgdGhlCitzaG9ydCBkaXNjdXNzaW9uIG9mIFNFTGludXggYmVsb3cuCisKKy5QUAorTm90ZSwgdGhlIGNvbnRleHQgaGVyZSBpcyB0aGUgdGFyZ2V0IGNvbnRleHQgd2hlbiByZXF1ZXN0aW5nIGEgbmFtZSwKK05PVCB0aGUgY29udGV4dCBvZiB0aGUgY29ubmVjdGlvbiBvd25pbmcgdGhlIG5hbWUuCisKKy5QUAorVGhlcmUncyBjdXJyZW50bHkgbm8gd2F5IHRvIHNldCBhIGRlZmF1bHQgZm9yIG93bmluZyBhbnkgbmFtZSwgaWYKK3dlIGFkZCB0aGlzIHN5bnRheCBpdCB3aWxsIGxvb2sgbGlrZToKKy5uZgorICAgPGFzc29jaWF0ZSBvd249IioiIGNvbnRleHQ9ImZvb190Ii8+CisuZmkKK0lmIHlvdSBmaW5kIGEgcmVhc29uIHRoaXMgaXMgdXNlZnVsLCBsZXQgdGhlIGRldmVsb3BlcnMga25vdy4KK1JpZ2h0IG5vdyB0aGUgZGVmYXVsdCB3aWxsIGJlIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBidXMgaXRzZWxmLgorCisuUFAKK0lmIHR3byA8YXNzb2NpYXRlPiBlbGVtZW50cyBzcGVjaWZ5IHRoZSBzYW1lIG5hbWUsIHRoZSBlbGVtZW50CithcHBlYXJpbmcgbGF0ZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIGJlIHVzZWQuCisKKy5TSCBTRUxpbnV4CisKKy5QUAorU2VlIGh0dHA6Ly93d3cubnNhLmdvdi9zZWxpbnV4LyBmb3IgZnVsbCBkZXRhaWxzIG9uIFNFTGludXguIFNvbWUgdXNlZnVsIGV4Y2VycHRzOgorCisuSVAgIiIgOAorRXZlcnkgc3ViamVjdCAocHJvY2VzcykgYW5kIG9iamVjdCAoZS5nLiBmaWxlLCBzb2NrZXQsIElQQyBvYmplY3QsCitldGMpIGluIHRoZSBzeXN0ZW0gaXMgYXNzaWduZWQgYSBjb2xsZWN0aW9uIG9mIHNlY3VyaXR5IGF0dHJpYnV0ZXMsCitrbm93biBhcyBhIHNlY3VyaXR5IGNvbnRleHQuIEEgc2VjdXJpdHkgY29udGV4dCBjb250YWlucyBhbGwgb2YgdGhlCitzZWN1cml0eSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc3ViamVjdCBvciBvYmplY3QKK3RoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzZWN1cml0eSBwb2xpY3kuCisKKy5JUCAiIiA4CitJbiBvcmRlciB0byBiZXR0ZXIgZW5jYXBzdWxhdGUgc2VjdXJpdHkgY29udGV4dHMgYW5kIHRvIHByb3ZpZGUKK2dyZWF0ZXIgZWZmaWNpZW5jeSwgdGhlIHBvbGljeSBlbmZvcmNlbWVudCBjb2RlIG9mIFNFTGludXggdHlwaWNhbGx5CitoYW5kbGVzIHNlY3VyaXR5IGlkZW50aWZpZXJzIChTSURzKSByYXRoZXIgdGhhbiBzZWN1cml0eSBjb250ZXh0cy4gQQorU0lEIGlzIGFuIGludGVnZXIgdGhhdCBpcyBtYXBwZWQgYnkgdGhlIHNlY3VyaXR5IHNlcnZlciB0byBhIHNlY3VyaXR5Citjb250ZXh0IGF0IHJ1bnRpbWUuCisKKy5JUCAiIiA4CitXaGVuIGEgc2VjdXJpdHkgZGVjaXNpb24gaXMgcmVxdWlyZWQsIHRoZSBwb2xpY3kgZW5mb3JjZW1lbnQgY29kZQorcGFzc2VzIGEgcGFpciBvZiBTSURzICh0eXBpY2FsbHkgdGhlIFNJRCBvZiBhIHN1YmplY3QgYW5kIHRoZSBTSUQgb2YKK2FuIG9iamVjdCwgYnV0IHNvbWV0aW1lcyBhIHBhaXIgb2Ygc3ViamVjdCBTSURzIG9yIGEgcGFpciBvZiBvYmplY3QKK1NJRHMpLCBhbmQgYW4gb2JqZWN0IHNlY3VyaXR5IGNsYXNzIHRvIHRoZSBzZWN1cml0eSBzZXJ2ZXIuIFRoZSBvYmplY3QKK3NlY3VyaXR5IGNsYXNzIGluZGljYXRlcyB0aGUga2luZCBvZiBvYmplY3QsIGUuZy4gYSBwcm9jZXNzLCBhIHJlZ3VsYXIKK2ZpbGUsIGEgZGlyZWN0b3J5LCBhIFRDUCBzb2NrZXQsIGV0Yy4KKworLklQICIiIDgKK0FjY2VzcyBkZWNpc2lvbnMgc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBhIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBmb3IgYQorZ2l2ZW4gcGFpciBvZiBTSURzIGFuZCBjbGFzcy4gRWFjaCBvYmplY3QgY2xhc3MgaGFzIGEgc2V0IG9mCithc3NvY2lhdGVkIHBlcm1pc3Npb25zIGRlZmluZWQgdG8gY29udHJvbCBvcGVyYXRpb25zIG9uIG9iamVjdHMgd2l0aAordGhhdCBjbGFzcy4KKworLlBQCitELUJ1cyBwZXJmb3JtcyBTRUxpbnV4IHNlY3VyaXR5IGNoZWNrcyBpbiB0d28gcGxhY2VzLgorCisuUFAKK0ZpcnN0LCBhbnkgdGltZSBhIG1lc3NhZ2UgaXMgcm91dGVkIGZyb20gb25lIGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorY29ubmVjdGlvbiwgdGhlIGJ1cyBkYWVtb24gd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aXRoIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mCit0aGUgZmlyc3QgY29ubmVjdGlvbiBhcyBzb3VyY2UsIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIHNlY29uZCBjb25uZWN0aW9uCithcyB0YXJnZXQsIG9iamVjdCBjbGFzcyAiZGJ1cyIgYW5kIHJlcXVlc3RlZCBwZXJtaXNzaW9uICJzZW5kX21zZyIuCisKKy5QUAorSWYgYSBzZWN1cml0eSBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIGEgY29ubmVjdGlvbgorKGltcG9zc2libGUgd2hlbiB1c2luZyBVTklYIGRvbWFpbiBzb2NrZXRzKSwgdGhlbiB0aGUgdGFyZ2V0Citjb250ZXh0IHVzZWQgaXMgdGhlIGNvbnRleHQgb2YgdGhlIGJ1cyBkYWVtb24gaXRzZWxmLgorVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0LCBiZWNhdXNlIHdlJ3JlCithc3N1bWluZyB0aGF0IG9ubHkgVU5JWCBkb21haW4gc29ja2V0cyB3aWxsIGJlIHVzZWQgdG8KK2Nvbm5lY3QgdG8gdGhlIHN5c3RlbXdpZGUgYnVzLiBJZiB0aGlzIGNoYW5nZXMsIHdlJ2xsCitwcm9iYWJseSBhZGQgYSB3YXkgdG8gc2V0IHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gY29udGV4dC4KKworLlBQCitTZWNvbmQsIGFueSB0aW1lIGEgY29ubmVjdGlvbiBhc2tzIHRvIG93biBhIG5hbWUsCit0aGUgYnVzIGRhZW1vbiB3aWxsIGNoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIHNlY3VyaXR5Citjb250ZXh0IG9mIHRoZSBjb25uZWN0aW9uIGFzIHNvdXJjZSwgdGhlIHNlY3VyaXR5IGNvbnRleHQgc3BlY2lmaWVkCitmb3IgdGhlIG5hbWUgaW4gdGhlIGNvbmZpZyBmaWxlIGFzIHRhcmdldCwgb2JqZWN0CitjbGFzcyAiZGJ1cyIgYW5kIHJlcXVlc3RlZCBwZXJtaXNzaW9uICJhY3F1aXJlX3N2YyIuCisKKy5QUAorVGhlIHNlY3VyaXR5IGNvbnRleHQgZm9yIGEgYnVzIG5hbWUgaXMgc3BlY2lmaWVkIHdpdGggdGhlCis8YXNzb2NpYXRlPiBlbGVtZW50IGRlc2NyaWJlZCBlYXJsaWVyIGluIHRoaXMgZG9jdW1lbnQuCitJZiBhIG5hbWUgaGFzIG5vIHNlY3VyaXR5IGNvbnRleHQgYXNzb2NpYXRlZCBpbiB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZSwgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIGJ1cyBkYWVtb24KK2l0c2VsZiB3aWxsIGJlIHVzZWQuCisKKy5TSCBERUJVR0dJTkcKKworLlBQCitJZiB5b3UncmUgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgd2hlcmUgeW91ciBtZXNzYWdlcyBhcmUgZ29pbmcgb3Igd2h5Cit5b3UgYXJlbid0IGdldHRpbmcgbWVzc2FnZXMsIHRoZXJlIGFyZSBzZXZlcmFsIHRoaW5ncyB5b3UgY2FuIHRyeS4KKy5QUAorUmVtZW1iZXIgdGhhdCB0aGUgc3lzdGVtIGJ1cyBpcyBoZWF2aWx5IGxvY2tlZCBkb3duIGFuZCBpZiB5b3UKK2hhdmVuJ3QgaW5zdGFsbGVkIGEgc2VjdXJpdHkgcG9saWN5IGZpbGUgdG8gYWxsb3cgeW91ciBtZXNzYWdlCit0aHJvdWdoLCBpdCB3b24ndCB3b3JrLiBGb3IgdGhlIHNlc3Npb24gYnVzLCB0aGlzIGlzIG5vdCBhIGNvbmNlcm4uCisuUFAKK1RoZSBzaW1wbGVzdCB3YXkgdG8gZmlndXJlIG91dCB3aGF0J3MgaGFwcGVuaW5nIG9uIHRoZSBidXMgaXMgdG8gcnVuCit0aGUgXGZJZGJ1cy1tb25pdG9yXGZQIHByb2dyYW0sIHdoaWNoIGNvbWVzIHdpdGggdGhlIEQtQnVzCitwYWNrYWdlLiBZb3UgY2FuIGFsc28gc2VuZCB0ZXN0IG1lc3NhZ2VzIHdpdGggXGZJZGJ1cy1zZW5kXGZQLiBUaGVzZQorcHJvZ3JhbXMgaGF2ZSB0aGVpciBvd24gbWFuIHBhZ2VzLgorLlBQCitJZiB5b3Ugd2FudCB0byBrbm93IHdoYXQgdGhlIGRhZW1vbiBpdHNlbGYgaXMgZG9pbmcsIHlvdSBtaWdodCBjb25zaWRlcgorcnVubmluZyBhIHNlcGFyYXRlIGNvcHkgb2YgdGhlIGRhZW1vbiB0byB0ZXN0IGFnYWluc3QuIFRoaXMgd2lsbCBhbGxvdyB5b3UKK3RvIHB1dCB0aGUgZGFlbW9uIHVuZGVyIGEgZGVidWdnZXIsIG9yIHJ1biBpdCB3aXRoIHZlcmJvc2Ugb3V0cHV0LCB3aXRob3V0CittZXNzaW5nIHVwIHlvdXIgcmVhbCBzZXNzaW9uIGFuZCBzeXN0ZW0gZGFlbW9ucy4KKy5QUAorVG8gcnVuIGEgc2VwYXJhdGUgdGVzdCBjb3B5IG9mIHRoZSBkYWVtb24sIGZvciBleGFtcGxlIHlvdSBtaWdodCBvcGVuIGEgdGVybWluYWwKK2FuZCB0eXBlOgorLm5mCisgIERCVVNfVkVSQk9TRT0xIGRidXMtZGFlbW9uIC0tc2Vzc2lvbiAtLXByaW50LWFkZHJlc3MKKy5maQorLlBQCitUaGUgdGVzdCBkYWVtb24gYWRkcmVzcyB3aWxsIGJlIHByaW50ZWQgd2hlbiB0aGUgZGFlbW9uIHN0YXJ0cy4gWW91IHdpbGwgbmVlZAordG8gY29weS1hbmQtcGFzdGUgdGhpcyBhZGRyZXNzIGFuZCB1c2UgaXQgYXMgdGhlIHZhbHVlIG9mIHRoZQorREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4geW91IGxhdW5jaCB0aGUgYXBwbGljYXRpb25zCit5b3Ugd2FudCB0byB0ZXN0LiBUaGlzIHdpbGwgY2F1c2UgdGhvc2UgYXBwbGljYXRpb25zIHRvIGNvbm5lY3QgdG8geW91cgordGVzdCBidXMgaW5zdGVhZCBvZiB0aGUgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIG9mIHlvdXIgcmVhbCBzZXNzaW9uIGJ1cy4KKy5QUAorREJVU19WRVJCT1NFPTEgd2lsbCBoYXZlIE5PIEVGRkVDVCB1bmxlc3MgeW91ciBjb3B5IG9mIEQtQnVzCit3YXMgY29tcGlsZWQgd2l0aCB2ZXJib3NlIG1vZGUgZW5hYmxlZC4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgaW4KK3Byb2R1Y3Rpb24gYnVpbGRzIGR1ZSB0byBwZXJmb3JtYW5jZSBpbXBhY3QuIFlvdSBtYXkgbmVlZCB0byByZWJ1aWxkCitELUJ1cyBpZiB5b3VyIGNvcHkgd2FzIG5vdCBidWlsdCB3aXRoIGRlYnVnZ2luZyBpbiBtaW5kLiAoREJVU19WRVJCT1NFCithbHNvIGFmZmVjdHMgdGhlIEQtQnVzIGxpYnJhcnkgYW5kIHRodXMgYXBwbGljYXRpb25zIHVzaW5nIEQtQnVzOyBpdCBtYXkKK2JlIHVzZWZ1bCB0byBzZWUgdmVyYm9zZSBvdXRwdXQgb24gYm90aCB0aGUgY2xpZW50IHNpZGUgYW5kIGZyb20gdGhlIGRhZW1vbi4pCisuUFAKK0lmIHlvdSB3YW50IHRvIGdldCBmYW5jeSwgeW91IGNhbiBjcmVhdGUgYSBjdXN0b20gYnVzCitjb25maWd1cmF0aW9uIGZvciB5b3VyIHRlc3QgYnVzIChzZWUgdGhlIHNlc3Npb24uY29uZiBhbmQgc3lzdGVtLmNvbmYKK2ZpbGVzIHRoYXQgZGVmaW5lIHRoZSB0d28gZGVmYXVsdCBjb25maWd1cmF0aW9ucyBmb3IgZXhhbXBsZSkuIFRoaXMKK3dvdWxkIGFsbG93IHlvdSB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGRpcmVjdG9yeSBmb3IgLnNlcnZpY2UgZmlsZXMsCitmb3IgZXhhbXBsZS4KKworLlNIIEFVVEhPUgorU2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvZG9jL0FVVEhPUlMKKworLlNIIEJVR1MKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9kYnVzLWZhcS5odG1sIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtZmFxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5ZTk2YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9kYnVzLWZhcS5odG1sCkBAIC0wLDAgKzEsNDM3IEBACis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48dGl0bGU+RC1CdXMgRkFRPC90aXRsZT48bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc1LjIiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0iYXJ0aWNsZSIgdGl0bGU9IkQtQnVzIEZBUSI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iaW5kZXgiPjwvYT5ELUJ1cyBGQVE8L2gyPjwvZGl2PjxkaXY+PGRpdiBjbGFzcz0iYXV0aG9yZ3JvdXAiPjxkaXYgY2xhc3M9ImF1dGhvciI+PGgzIGNsYXNzPSJhdXRob3IiPjxzcGFuIGNsYXNzPSJmaXJzdG5hbWUiPkhhdm9jPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3VybmFtZSI+UGVubmluZ3Rvbjwvc3Bhbj48L2gzPjxkaXYgY2xhc3M9ImFmZmlsaWF0aW9uIj48c3BhbiBjbGFzcz0ib3JnbmFtZSI+UmVkIEhhdCwgSW5jLjxicj48L3NwYW4+PGRpdiBjbGFzcz0iYWRkcmVzcyI+PHA+PGJyPgorCaCgoKA8Y29kZSBjbGFzcz0iZW1haWwiPiZsdDs8YSBjbGFzcz0iZW1haWwiIGhyZWY9Im1haWx0bzpocEBwb2JveC5jb20iPmhwQHBvYm94LmNvbTwvYT4mZ3Q7PC9jb2RlPjxicj4KKwmgoDwvcD48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJhdXRob3IiPjxoMyBjbGFzcz0iYXV0aG9yIj48c3BhbiBjbGFzcz0iZmlyc3RuYW1lIj5EYXZpZDwvc3Bhbj4gPHNwYW4gY2xhc3M9Im90aGVybmFtZSI+QTwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPldoZWVsZXI8L3NwYW4+PC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2PjxwIGNsYXNzPSJyZWxlYXNlaW5mbyI+VmVyc2lvbiAwLjM8L3A+PC9kaXY+PC9kaXY+PGhyPjwvZGl2PjxkaXYgY2xhc3M9InFhbmRhc2V0IiB0aXRsZT0iRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMiPjxhIG5hbWU9ImZhcSI+PC9hPjxkbD48ZHQ+MS4gPGEgaHJlZj0iI2lkcDI0ODgwNjQwIj4KKyAgICAgICAgICBXaGF0IGlzIEQtQnVzPworICAgICAgICA8L2E+PC9kdD48ZHQ+Mi4gPGEgaHJlZj0iI2lkcDI4MTc1MTA0Ij4KKyAgICAgICAgICBJcyBELUJ1cyBzdGFibGUvZmluaXNoZWQ/CisgICAgICAgIDwvYT48L2R0PjxkdD4zLiA8YSBocmVmPSIjaWRwMjgxNzgyNzIiPgorICAgICAgICAgIEhvdyBpcyB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGxpY2Vuc2VkPyBDYW4gSSB1c2UgaXQgaW4gCisgICAgICAgICAgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zPworICAgICAgICA8L2E+PC9kdD48ZHQ+NC4gPGEgaHJlZj0iI2lkcDI0NDgwOTYwIj4KKyAgICAgICAgICBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBidXMgbmFtZSwgYW5kIG9iamVjdCBwYXRoLCAKKyAgICAgICAgICBhbmQgYW4gaW50ZXJmYWNlPworICAgICAgICA8L2E+PC9kdD48ZHQ+NS4gPGEgaHJlZj0iI3NlcnZpY2UiPgorICAgICAgICAgIFdoYXQgaXMgYSAic2VydmljZSI/CisgICAgICAgIDwvYT48L2R0PjxkdD42LiA8YSBocmVmPSIjY29tcG9uZW50cyI+CisgICAgICAgICAgSXMgRC1CdXMgYSAiY29tcG9uZW50IHN5c3RlbSI/CisgICAgICAgIDwvYT48L2R0PjxkdD43LiA8YSBocmVmPSIjc3BlZWQiPgorICAgICAgICAgIEhvdyBmYXN0IGlzIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24/CisgICAgICAgIDwvYT48L2R0PjxkdD44LiA8YSBocmVmPSIjc2l6ZSI+CisgICAgICAgICAgSG93IGxhcmdlIGlzIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24/CisgICAgICAgIDwvYT48L2R0PjxkdD45LiA8YSBocmVmPSIjb3RoZXItaXBjIj4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBvdGhlciBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbgorICAgICAgICAgIG9yIG5ldHdvcmtpbmcgcHJvdG9jb2xzPworICAgICAgICA8L2E+PC9kdD48ZHQ+MTAuIDxhIGhyZWY9IiNjb3JiYSI+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gQ09SQkE/CisgICAgICAgIDwvYT48L2R0PjxkdD4xMS4gPGEgaHJlZj0iI3htbHJwY3NvYXAiPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIFhNTC1SUEMgYW5kIFNPQVA/CisgICAgICAgIDwvYT48L2R0PjxkdD4xMi4gPGEgaHJlZj0iI2RjZSI+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gRENFPworICAgICAgICA8L2E+PC9kdD48ZHQ+MTMuIDxhIGhyZWY9IiNkY29tIj4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ09NIGFuZCBDT00/CisgICAgICAgIDwvYT48L2R0PjxkdD4xNC4gPGEgaHJlZj0iI2ludGVybmV0LWNvbW11bmljYXRpb25zLWVuZ2luZSI+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gWmVyb0MncyBJbnRlcm5ldCBDb21tdW5pY2F0aW9ucyBFbmdpbmUgKEljZSkKKyAgICAgICAgPC9hPjwvZHQ+PGR0PjE1LiA8YSBocmVmPSIjaW50ZXItY2xpZW50LWV4Y2hhbmdlIj4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBJbnRlci1DbGllbnQgRXhjaGFuZ2UgKElDRSk/CisgICAgICAgIDwvYT48L2R0PjxkdD4xNi4gPGEgaHJlZj0iI2Rjb3AiPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIERDT1A/CisgICAgICAgIDwvYT48L2R0PjxkdD4xNy4gPGEgaHJlZj0iI3lldC1tb3JlLWlwYyI+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gW3lldCBtb3JlIElQQyBtZWNoYW5pc21zXT8KKyAgICAgICAgPC9hPjwvZHQ+PGR0PjE4LiA8YSBocmVmPSIjd2hpY2gtaXBjIj4KKyAgICAgICAgICBXaGljaCBJUEMgbWVjaGFuaXNtIHNob3VsZCBJIHVzZT8KKyAgICAgICAgPC9hPjwvZHQ+PGR0PjE5LiA8YSBocmVmPSIjaWRwMjkyODI3MDQiPgorICAgICAgICAgIEhvdyBjYW4gSSBzdWJtaXQgYSBidWcgb3IgcGF0Y2g/CisgICAgICAgIDwvYT48L2R0PjwvZGw+PHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIHN1bW1hcnk9IlEgYW5kIEEgU2V0Ij48Y29sIGFsaWduPSJsZWZ0IiB3aWR0aD0iMSUiPjxjb2w+PHRib2R5Pjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxLiI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PGEgbmFtZT0iaWRwMjQ4ODA2NDAiPjwvYT48YSBuYW1lPSJpZHAyNDg4MDg5NiI+PC9hPjxwPjxiPjEuPC9iPjwvcD48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIFdoYXQgaXMgRC1CdXM/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgVGhpcyBpcyBwcm9iYWJseSBiZXN0IGFuc3dlcmVkIGJ5IHJlYWRpbmcgdGhlIEQtQnVzIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iZGJ1cy10dXRvcmlhbC5odG1sIiB0YXJnZXQ9Il90b3AiPnR1dG9yaWFsPC9hPiBvcgorICAgICAgICAgIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+c3BlY2lmaWNhdGlvbjwvYT4uIEluCisgICAgICAgICAgc2hvcnQsIGl0IGlzIGEgc3lzdGVtIGNvbnNpc3Rpbmcgb2YgMSkgYSB3aXJlIHByb3RvY29sIGZvciBleHBvc2luZyBhCisgICAgICAgICAgdHlwaWNhbCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2UvZnJhbWV3b3JrIHRvIG90aGVyIGFwcGxpY2F0aW9uczsgYW5kCisgICAgICAgICAgMikgYSBidXMgZGFlbW9uIHRoYXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBmaW5kIGFuZCBtb25pdG9yIG9uZSBhbm90aGVyLgorICAgICAgICAgIFBocmFzZWQgZGlmZmVyZW50bHksIEQtQnVzIGlzIDEpIGFuIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIChJUEMpIHN5c3RlbSBhbmQgMikgc29tZSBoaWdoZXItbGV2ZWwgCisgICAgICAgICAgc3RydWN0dXJlIChsaWZlY3ljbGUgdHJhY2tpbmcsIHNlcnZpY2UgYWN0aXZhdGlvbiwgc2VjdXJpdHkgcG9saWN5KSBwcm92aWRlZCBieSB0d28gYnVzIGRhZW1vbnMsCisgICAgICAgICAgb25lIHN5c3RlbXdpZGUgYW5kIG9uZSBwZXItdXNlci1zZXNzaW9uLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIyLiI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PGEgbmFtZT0iaWRwMjgxNzUxMDQiPjwvYT48YSBuYW1lPSJpZHAyODE3NTM2MCI+PC9hPjxwPjxiPjIuPC9iPjwvcD48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIElzIEQtQnVzIHN0YWJsZS9maW5pc2hlZD8KKyAgICAgICAgPC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9ImFuc3dlciI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBUaGUgbG93LWxldmVsIGxpYnJhcnkgImxpYmRidXMiIGFuZCB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBhcmUgY29uc2lkZXJlZCAKKyAgICAgICAgICBBQkkgc3RhYmxlLiBUaGUgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJSRUFETUUiIHRhcmdldD0iX3RvcCI+UkVBRE1FPC9hPgorICAgICAgICAgIGZpbGUgaGFzIGEgZGlzY3Vzc2lvbiBvZiB0aGUgQVBJL0FCSSBzdGFiaWxpdHkgZ3VhcmFudGVlcy4KKyAgICAgICAgICBIaWdoZXItbGV2ZWwgYmluZGluZ3MgKHN1Y2ggYXMgdGhvc2UgZm9yIFF0LCBHTGliLCBQeXRob24sIEphdmEsIEMjKSBlYWNoIAorICAgICAgICAgIGhhdmUgdGhlaXIgb3duIHJlbGVhc2Ugc2NoZWR1bGVzIGFuZCBkZWdyZWUgb2YgbWF0dXJpdHksIG5vdCBsaW5rZWQgdG8gCisgICAgICAgICAgdGhlIGxvdy1sZXZlbCBsaWJyYXJ5IGFuZCBidXMgZGFlbW9uIHJlbGVhc2UuIENoZWNrIHRoZSBwcm9qZWN0IHBhZ2UgZm9yCisgICAgICAgICAgdGhlIGJpbmRpbmcgeW91J3JlIGNvbnNpZGVyaW5nIHRvIHVuZGVyc3RhbmQgdGhhdCBwcm9qZWN0J3MgcG9saWNpZXMuCisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJxdWVzdGlvbiIgdGl0bGU9IjMuIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48YSBuYW1lPSJpZHAyODE3ODI3MiI+PC9hPjxhIG5hbWU9ImlkcDI4MTc4NTI4Ij48L2E+PHA+PGI+My48L2I+PC9wPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgSG93IGlzIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gbGljZW5zZWQ/IENhbiBJIHVzZSBpdCBpbiAKKyAgICAgICAgICBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnM/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgVGhlIHNob3J0IGFuc3dlciBpcyB5ZXMsIHlvdSBjYW4gdXNlIGl0IGluIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucy4KKyAgICAgICAgICBZb3Ugc2hvdWxkIHJlYWQgdGhlIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iQ09QWUlORyIgdGFyZ2V0PSJfdG9wIj5DT1BZSU5HPC9hPiBmaWxlLCB3aGljaAorICAgICAgICAgIG9mZmVycyB5b3UgdGhlIGNob2ljZSBvZiB0d28gbGljZW5zZXMuIFRoZXNlIGFyZSB0aGUgR1BMIGFuZCB0aGUKKyAgICAgICAgICBBRkwuIFRoZSBHUEwgcmVxdWlyZXMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAgICAgICAgICBhcyB3ZWxsLiBUaGUgQUZMIGlzIGFuICJYLXN0eWxlIiBvciAiQlNELXN0eWxlIiBsaWNlbnNlIGNvbXBhdGlibGUKKyAgICAgICAgICB3aXRoIHByb3ByaWV0YXJ5IGxpY2Vuc2luZywgYnV0IGl0IGRvZXMgaGF2ZSBzb21lIHJlcXVpcmVtZW50czsgaW4KKyAgICAgICAgICBwYXJ0aWN1bGFyIGl0IHByb2hpYml0cyB5b3UgZnJvbSBmaWxpbmcgYSBsYXdzdWl0IGFsbGVnaW5nIHRoYXQgdGhlCisgICAgICAgICAgRC1CdXMgc29mdHdhcmUgaW5mcmluZ2VzIHlvdXIgcGF0ZW50cyA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT53aGlsZSB5b3UgY29udGludWUgdG8KKyAgICAgICAgICB1c2UgRC1CdXM8L2VtPjwvc3Bhbj4uICBJZiB5b3UncmUgZ29pbmcgdG8gc3VlLCB5b3UgaGF2ZSB0byBzdG9wIHVzaW5nCisgICAgICAgICAgdGhlIHNvZnR3YXJlLiBSZWFkIHRoZSBsaWNlbnNlcyB0byBkZXRlcm1pbmUgdGhlaXIgbWVhbmluZywgdGhpcyBGQVEKKyAgICAgICAgICBlbnRyeSBpcyBub3QgaW50ZW5kZWQgdG8gY2hhbmdlIHRoZSBtZWFuaW5nIG9yIHRlcm1zIG9mIHRoZSBsaWNlbnNlcy4KKyAgICAgICAgPC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InF1ZXN0aW9uIiB0aXRsZT0iNC4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImlkcDI0NDgwOTYwIj48L2E+PGEgbmFtZT0iaWRwMjQ0ODEyMTYiPjwvYT48cD48Yj40LjwvYj48L3A+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBidXMgbmFtZSwgYW5kIG9iamVjdCBwYXRoLCAKKyAgICAgICAgICBhbmQgYW4gaW50ZXJmYWNlPworICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0iYW5zd2VyIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIElmIHlvdSBpbWFnaW5lIGEgQysrIHByb2dyYW0gdGhhdCBpbXBsZW1lbnRzIGEgbmV0d29yayBzZXJ2aWNlLCB0aGVuCisgICAgICAgICAgdGhlIGJ1cyBuYW1lIGlzIHRoZSBob3N0bmFtZSBvZiB0aGUgY29tcHV0ZXIgcnVubmluZyB0aGlzIEMrKyBwcm9ncmFtLAorICAgICAgICAgIHRoZSBvYmplY3QgcGF0aCBpcyBhIEMrKyBvYmplY3QgaW5zdGFuY2UgcG9pbnRlciwgYW5kIGFuIGludGVyZmFjZSBpcworICAgICAgICAgIGEgQysrIGNsYXNzIChhIHB1cmUgdmlydHVhbCBvciBhYnN0cmFjdCBjbGFzcywgdG8gYmUgZXhhY3QpLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgSW4gSmF2YSB0ZXJtcywgdGhlIG9iamVjdCBwYXRoIGlzIGFuIG9iamVjdCByZWZlcmVuY2UsIAorICAgICAgICAgIGFuZCBhbiBpbnRlcmZhY2UgaXMgYSBKYXZhIGludGVyZmFjZS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFBlb3BsZSBnZXQgY29uZnVzZWQgYmVjYXVzZSBpZiB0aGV5IHdyaXRlIGFuIGFwcGxpY2F0aW9uIAorICAgICAgICAgIHdpdGggYSBzaW5nbGUgb2JqZWN0IGluc3RhbmNlIGFuZCBhIHNpbmdsZSBpbnRlcmZhY2UsIAorICAgICAgICAgIHRoZW4gdGhlIGJ1cyBuYW1lLCBvYmplY3QgcGF0aCwgYW5kIGludGVyZmFjZSBsb29rIAorICAgICAgICAgIHJlZHVuZGFudC4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIGEgdGV4dCBlZGl0b3IgCisgICAgICAgICAgdGhhdCB1c2VzIHRoZSBidXMgbmFtZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3I8L2NvZGU+LAorICAgICAgICAgIGhhcyBhIGdsb2JhbCBzaW5nbGV0b24gb2JqZWN0IGNhbGxlZCAKKyAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+L29yZy9mcmVlZGVza3RvcC9UZXh0RWRpdG9yPC9jb2RlPiwgYW5kIAorICAgICAgICAgIHRoYXQgc2luZ2xldG9uIG9iamVjdCBjb3VsZCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAKKyAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3I8L2NvZGU+LgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgSG93ZXZlciwgYSB0ZXh0IGVkaXRvciBhcHBsaWNhdGlvbiBjb3VsZCBhcyBlYXNpbHkgb3duIG11bHRpcGxlIGJ1cworICAgICAgICAgIG5hbWVzIChmb3IgZXhhbXBsZSwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5rZGUuS1dyaXRlPC9jb2RlPiBpbiBhZGRpdGlvbiB0bworICAgICAgICAgIGdlbmVyaWMgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlRleHRFZGl0b3I8L2NvZGU+KSwgaGF2ZSBtdWx0aXBsZSBvYmplY3RzIChtYXliZQorICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj4vb3JnL2tkZS9kb2N1bWVudHMvNDM1MjwvY29kZT4gd2hlcmUgdGhlIG51bWJlciBjaGFuZ2VzCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudCksIGFuZCBlYWNoIG9iamVjdCBjb3VsZCBpbXBsZW1lbnQgbXVsdGlwbGUKKyAgICAgICAgICBpbnRlcmZhY2VzLCBzdWNoIGFzIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZTwvY29kZT4sCisgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5CYXNpY1RleHRGaWVsZDwvY29kZT4sCisgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5rZGUuUmljaFRleHREb2N1bWVudDwvY29kZT4uCisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJxdWVzdGlvbiIgdGl0bGU9IjUuIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48YSBuYW1lPSJzZXJ2aWNlIj48L2E+PGEgbmFtZT0iaWRwMjQ0OTgxNDQiPjwvYT48cD48Yj41LjwvYj48L3A+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBXaGF0IGlzIGEgInNlcnZpY2UiPworICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0iYW5zd2VyIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIEEgc2VydmljZSBpcyBhIHByb2dyYW0gdGhhdCBjYW4gYmUgbGF1bmNoZWQgYnkgdGhlIGJ1cyBkYWVtb24gCisgICAgICAgICAgdG8gcHJvdmlkZSBzb21lIGZ1bmN0aW9uYWxpdHkgdG8gb3RoZXIgcHJvZ3JhbXMuIFNlcnZpY2VzCisgICAgICAgICAgYXJlIG5vcm1hbGx5IGxhdW5jaGVkIGFjY29yZGluZyB0byB0aGUgYnVzIG5hbWUgdGhleSB3aWxsIAorICAgICAgICAgIGhhdmUuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBQZW9wbGUgb2Z0ZW4gbWlzdXNlIHRoZSB3b3JkICJzZXJ2aWNlIiBmb3IgYW55IAorICAgICAgICAgIGJ1cyBuYW1lLCBidXQgdGhpcyB0ZW5kcyB0byBiZSBhbWJpZ3VvdXMgYW5kIGNvbmZ1c2luZyBzbyBpcyBkaXNjb3VyYWdlZC4KKyAgICAgICAgICBJbiB0aGUgRC1CdXMgZG9jcyB3ZSB0cnkgdG8gdXNlICJzZXJ2aWNlIiBvbmx5IHdoZW4gdGFsa2luZyBhYm91dCAKKyAgICAgICAgICBwcm9ncmFtcyB0aGUgYnVzIGtub3dzIGhvdyB0byBsYXVuY2gsIGkuZS4gYSBzZXJ2aWNlIGFsd2F5cyBoYXMgYSAKKyAgICAgICAgICAuc2VydmljZSBmaWxlLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSI2LiI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PGEgbmFtZT0iY29tcG9uZW50cyI+PC9hPjxhIG5hbWU9ImlkcDI0NTAxMzYwIj48L2E+PHA+PGI+Ni48L2I+PC9wPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgSXMgRC1CdXMgYSAiY29tcG9uZW50IHN5c3RlbSI/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgSXQgaGVscHMgdG8ga2VlcCB0aGVzZSBjb25jZXB0cyBzZXBhcmF0ZSBpbiB5b3VyIG1pbmQ6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Im9yZGVyZWRsaXN0Ij48b2wgY2xhc3M9Im9yZGVyZWRsaXN0IiB0eXBlPSIxIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBPYmplY3QvY29tcG9uZW50IHN5c3RlbQorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBHVUkgY29udHJvbC93aWRnZXQgZW1iZWRkaW5nIGludGVyZmFjZXMKKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgSW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gc3lzdGVtIG9yIHdpcmUgcHJvdG9jb2wKKyAgICAgICAgICAgICAgPC9wPjwvbGk+PC9vbD48L2Rpdj48cD4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEQtQnVzIGlzIG5vdCBhIGNvbXBvbmVudCBzeXN0ZW0uICJDb21wb25lbnQgc3lzdGVtIiB3YXMgb3JpZ2luYWxseQorICAgICAgICAgIGRlZmluZWQgYnkgQ09NLCBhbmQgd2FzIGVzc2VudGlhbGx5IGEgd29ya2Fyb3VuZCBmb3IgdGhlIGxpbWl0YXRpb25zCisgICAgICAgICAgb2YgdGhlIEMrKyBvYmplY3Qgc3lzdGVtIChhZGRpbmcgaW50cm9zcGVjdGlvbiwgcnVudGltZSBsb2NhdGlvbiBvZgorICAgICAgICAgIG9iamVjdHMsIEFCSSBndWFyYW50ZWVzLCBhbmQgc28gZm9ydGgpLiBXaXRoIHRoZSBDIyBsYW5ndWFnZSBhbmQgQ0xSLAorICAgICAgICAgIE1pY3Jvc29mdCBhZGRlZCB0aGVzZSBmZWF0dXJlcyB0byB0aGUgcHJpbWFyeSBvYmplY3Qgc3lzdGVtLCBsZWF2aW5nCisgICAgICAgICAgQ09NIG9ic29sZXRlLiBTaW1pbGFybHksIEphdmEgaGFzIG11Y2ggbGVzcyBuZWVkIGZvciBzb21ldGhpbmcgbGlrZQorICAgICAgICAgIENPTSB0aGFuIEMrKyBkaWQuIEV2ZW4gUU9iamVjdCAoZnJvbSBRdCkgYW5kIEdPYmplY3QgKGZyb20gR0xpYikgb2ZmZXIKKyAgICAgICAgICBzb21lIG9mIHRoZSBzYW1lIGZlYXR1cmVzIGZvdW5kIGluIENPTS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIENvbXBvbmVudCBzeXN0ZW1zIGFyZSBub3QgYWJvdXQgR1VJIGNvbnRyb2wgZW1iZWRkaW5nLiBFbWJlZGRpbmcKKyAgICAgICAgICBhIHNwcmVhZHNoZWV0IGluIGEgd29yZCBwcm9jZXNzb3IgZG9jdW1lbnQgaXMgYSBtYXR0ZXIgb2YgZGVmaW5pbmcKKyAgICAgICAgICBzb21lIHNwZWNpZmljIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPmludGVyZmFjZXM8L2VtPjwvc3Bhbj4gdGhhdCBvYmplY3RzCisgICAgICAgICAgY2FuIGltcGxlbWVudC4gVGhlc2UgaW50ZXJmYWNlcyBwcm92aWRlIG1ldGhvZHMgcmVsYXRlZCB0byAKKyAgICAgICAgICBHVUkgY29udHJvbHMuIFNvIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhvc2UgaW50ZXJmYWNlcyAKKyAgICAgICAgICBjYW4gYmUgZW1iZWRkZWQuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgd29yZCAiY29tcG9uZW50IiBqdXN0IG1lYW5zICJvYmplY3Qgd2l0aCBzb21lIGZhbmN5IGZlYXR1cmVzIiBhbmQKKyAgICAgICAgICBpbiBtb2Rlcm4gbGFuZ3VhZ2VzIGFsbCBvYmplY3RzIGFyZSBlZmZlY3RpdmVseSAiY29tcG9uZW50cy4iCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBTbyBjb21wb25lbnRzIGFyZSBmYW5jeSBvYmplY3RzLCBhbmQgc29tZSBvYmplY3RzIGFyZSBHVUkgY29udHJvbHMuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBBIHRoaXJkLCB1bnJlbGF0ZWQgZmVhdHVyZSBpcyBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiBvciBJUEMuCisgICAgICAgICAgRC1CdXMgaXMgYW4gSVBDIHN5c3RlbS4gR2l2ZW4gYW4gb2JqZWN0IChvciAiY29tcG9uZW50IiBpZiB5b3UgbXVzdCksIAorICAgICAgICAgIHlvdSBjYW4gZXhwb3NlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoYXQgb2JqZWN0IG92ZXIgYW4gSVBDIHN5c3RlbS4KKyAgICAgICAgICBFeGFtcGxlcyBvZiBJUEMgc3lzdGVtcyBhcmUgRENPTSwgQ09SQkEsIFNPQVAsIFhNTC1SUEMsIGFuZCBELUJ1cy4KKyAgICAgICAgICBZb3UgY2FuIHVzZSBhbnkgb2YgdGhlc2UgSVBDIHN5c3RlbXMgd2l0aCBhbnkgb2JqZWN0L2NvbXBvbmVudCBzeXN0ZW0sCisgICAgICAgICAgdGhvdWdoIHNvbWUgb2YgdGhlbSBhcmUgInR1bmVkIiBmb3Igc3BlY2lmaWMgb2JqZWN0IHN5c3RlbXMuCisgICAgICAgICAgWW91IGNhbiB0aGluayBvZiBhbiBJUEMgc3lzdGVtIHByaW1hcmlseSBhcyBhIHdpcmUgcHJvdG9jb2wuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBJZiB5b3UgY29tYmluZSBhbiBJUEMgc3lzdGVtIHdpdGggYSBzZXQgb2YgR1VJIGNvbnRyb2wgaW50ZXJmYWNlcywgCisgICAgICAgICAgdGhlbiB5b3UgY2FuIGhhdmUgYW4gb3V0LW9mLXByb2Nlc3Mgb3IgZHluYW1pY2FsbHktbG9hZGVkIEdVSSBjb250cm9sLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgQW5vdGhlciByZWxhdGVkIGNvbmNlcHQgaXMgdGhlIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5wbHVnaW48L2VtPiBvcgorICAgICAgICAgIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5leHRlbnNpb248L2VtPi4gIEdlbmVyaWMgcGx1Z2luIHN5c3RlbXMgc3VjaCBhcyB0aGUKKyAgICAgICAgICA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZyIgdGFyZ2V0PSJfdG9wIj5FY2xpcHNlPC9hPiBzeXN0ZW0gYXJlIG5vdCBzbyBkaWZmZXJlbnQKKyAgICAgICAgICBmcm9tIGNvbXBvbmVudC9vYmplY3Qgc3lzdGVtcywgdGhvdWdoIHBlcmhhcHMgYSAicGx1Z2luIiB0ZW5kcyB0byBiZSBhCisgICAgICAgICAgYnVuZGxlIG9mIG9iamVjdHMgd2l0aCBhIHVzZXItdmlzaWJsZSBuYW1lIGFuZCBjYW4gYmUKKyAgICAgICAgICBkb3dubG9hZGVkL3BhY2thZ2VkIGFzIGEgdW5pdC4KKyAgICAgICAgPC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InF1ZXN0aW9uIiB0aXRsZT0iNy4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9InNwZWVkIj48L2E+PGEgbmFtZT0iaWRwMjQ1MTM5MDQiPjwvYT48cD48Yj43LjwvYj48L3A+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBIb3cgZmFzdCBpcyB0aGUgRC1CdXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uPworICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0iYW5zd2VyIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIE9mIGNvdXJzZSBpdCBkZXBlbmRzIGEgYml0IG9uIHdoYXQgeW91J3JlIGRvaW5nLiAKKyAgICAgICAgICA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvcGlwZXJtYWlsL2RidXMvMjAwNC1Ob3ZlbWJlci8wMDE3NzkuaHRtbCIgdGFyZ2V0PSJfdG9wIj4KKyAgICAgICAgICAgIFRoaXMgbWFpbDwvYT4gY29udGFpbnMgc29tZSBiZW5jaG1hcmtpbmcuICBBdCB0aGUgdGltZSBvZiB0aGF0CisgICAgICAgICAgYmVuY2htYXJrLCBELUJ1cyBvbmUtdG8tb25lIGNvbW11bmljYXRpb24gd2FzIGFib3V0IDIuNXggc2xvd2VyIHRoYW4KKyAgICAgICAgICBzaW1wbHkgcHVzaGluZyB0aGUgZGF0YSByYXcgb3ZlciBhIHNvY2tldC4gQWZ0ZXIgdGhlIHJlY2VudCByZXdyaXRlIG9mCisgICAgICAgICAgdGhlIG1hcnNoYWxpbmcgY29kZSwgRC1CdXMgaXMgc2xvd2VyIHRoYW4gdGhhdCBiZWNhdXNlIGEgbG90IG9mCisgICAgICAgICAgb3B0aW1pemF0aW9uIHdvcmsgd2FzIGxvc3QuIEJ1dCBpdCBjYW4gcHJvYmFibHkgYmUgc3BlZCB1cCBhZ2Fpbi4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEQtQnVzIGNvbW11bmljYXRpb24gd2l0aCB0aGUgaW50ZXJtZWRpYXRlIGJ1cyBkYWVtb24gc2hvdWxkIGJlIAorICAgICAgICAgIChhbmQgYXMgbGFzdCBwcm9maWxlZCwgd2FzKSBhYm91dCB0d2ljZSBhcyBzbG93IGFzIG9uZS10by1vbmUgCisgICAgICAgICAgbW9kZSwgYmVjYXVzZSBhIHJvdW5kIHRyaXAgaW52b2x2ZXMgZm91ciBzb2NrZXQgcmVhZHMvd3JpdGVzIHJhdGhlciAKKyAgICAgICAgICB0aGFuIHR3byBzb2NrZXQgcmVhZHMvd3JpdGVzLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgVGhlIG92ZXJoZWFkIGNvbWVzIGZyb20gYSBjb3VwbGUgb2YgcGxhY2VzOyBwYXJ0IG9mIGl0IGlzIHNpbXBseSAKKyAgICAgICAgICAiYWJzdHJhY3Rpb24gcGVuYWx0eSIgKHRoZXJlIGFyZSBsYXllcnMgb2YgY29kZSB0byBzdXBwb3J0IAorICAgICAgICAgIG11bHRpcGxlIG1haW4gbG9vcHMsIG11bHRpcGxlIHRyYW5zcG9ydCB0eXBlcywgc2VjdXJpdHksIGV0Yy4pLgorICAgICAgICAgIFByb2JhYmx5IHRoZSBsYXJnZXN0IHBhcnQgY29tZXMgZnJvbSBkYXRhIHZhbGlkYXRpb24KKyAgICAgICAgICAoYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHRydXN0IGluY29taW5nIGRhdGEpLgorICAgICAgICAgIEl0IHdvdWxkIGJlIHNpbXBsZSB0byBhZGQgYSAibm8gdmFsaWRhdGlvbiIgbW9kZSwgYnV0IHByb2JhYmx5IAorICAgICAgICAgIG5vdCBhIGdvb2QgaWRlYSBhbGwgdGhpbmdzIGNvbnNpZGVyZWQuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBSYXcgYmFuZHdpZHRoIGlzbid0IHRoZSBvbmx5IGNvbmNlcm47IEQtQnVzIGlzIGRlc2lnbmVkIHRvIAorICAgICAgICAgIGVuYWJsZSBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiBhbmQgYXZvaWQgcm91bmQgdHJpcHMuCisgICAgICAgICAgVGhpcyBpcyBmcmVxdWVudGx5IGEgbW9yZSBpbXBvcnRhbnQgcGVyZm9ybWFuY2UgaXNzdWUgCisgICAgICAgICAgdGhhbiB0aHJvdWdocHV0LgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSI4LiI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PGEgbmFtZT0ic2l6ZSI+PC9hPjxhIG5hbWU9ImlkcDI5MTk3NDg4Ij48L2E+PHA+PGI+OC48L2I+PC9wPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgSG93IGxhcmdlIGlzIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgQSBwcm9kdWN0aW9uIGJ1aWxkICh3aXRoIGFzc2VydGlvbnMsIHVuaXQgdGVzdHMsIGFuZCB2ZXJib3NlIGxvZ2dpbmcKKyAgICAgICAgICBkaXNhYmxlZCkgaXMgb24gdGhlIG9yZGVyIG9mIGEgMTUwSyBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEEgbXVjaCwgbXVjaCBzbWFsbGVyIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHBvc3NpYmxlIGJ5IG9taXR0aW5nIG91dAorICAgICAgICAgIG9mIG1lbW9yeSBoYW5kbGluZywgaGFyZGNvZGluZyBhIG1haW4gbG9vcCAob3IgYWx3YXlzIHVzaW5nIGJsb2NraW5nCisgICAgICAgICAgSS9PKSwgc2tpcHBpbmcgdmFsaWRhdGlvbiwgYW5kIG90aGVyd2lzZSBzaW1wbGlmeWluZyB0aGluZ3MuCisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJxdWVzdGlvbiIgdGl0bGU9IjkuIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48YSBuYW1lPSJvdGhlci1pcGMiPjwvYT48YSBuYW1lPSJpZHAyOTIwMDQ0OCI+PC9hPjxwPjxiPjkuPC9iPjwvcD48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIG90aGVyIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uCisgICAgICAgICAgb3IgbmV0d29ya2luZyBwcm90b2NvbHM/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgS2VlcCBpbiBtaW5kLCBpdCBpcyBub3Qgb25seSBhbiBJUEMgc3lzdGVtOyBpdCBhbHNvIGluY2x1ZGVzCisgICAgICAgICAgbGlmZWN5Y2xlIHRyYWNraW5nLCBzZXJ2aWNlIGFjdGl2YXRpb24sIHNlY3VyaXR5IHBvbGljeSwgYW5kIG90aGVyCisgICAgICAgICAgaGlnaGVyLWxldmVsIHN0cnVjdHVyZSBhbmQgYXNzdW1wdGlvbnMuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgYmVzdCBwbGFjZSB0byBzdGFydCBpcyB0byByZWFkIHRoZSBELUJ1cyA8YSBjbGFzcz0idWxpbmsiIGhyZWY9ImRidXMtdHV0b3JpYWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj50dXRvcmlhbDwvYT4sIHNvIAorICAgICAgICAgIHlvdSBoYXZlIGEgY29uY3JldGUgaWRlYSB3aGF0IEQtQnVzIGFjdHVhbGx5IGlzLiBJZiB5b3UgCisgICAgICAgICAgdW5kZXJzdGFuZCBvdGhlciBwcm90b2NvbHMgb24gYSB3aXJlIGZvcm1hdCBsZXZlbCwgeW91IAorICAgICAgICAgIG1heSBhbHNvIHdhbnQgdG8gcmVhZCB0aGUgRC1CdXMgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJkYnVzLXNwZWNpZmljYXRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj5zcGVjaWZpY2F0aW9uPC9hPiB0byBzZWUgd2hhdCAKKyAgICAgICAgICBELUJ1cyBsb29rcyBsaWtlIG9uIGEgbG93IGxldmVsLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgQXMgdGhlIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iZGJ1cy10dXRvcmlhbC5odG1sIiB0YXJnZXQ9Il90b3AiPnR1dG9yaWFsPC9hPiBhbmQgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJkYnVzLXNwZWNpZmljYXRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj5zcGVjaWZpY2F0aW9uPC9hPiBib3RoIGV4cGxhaW4sIEQtQnVzIGlzIHR1bmVkIAorICAgICAgICAgIGZvciBzb21lIHNwZWNpZmljIHVzZSBjYXNlcy4gVGh1cywgaXQgcHJvYmFibHkgaXNuJ3QgdHVuZWQgCisgICAgICAgICAgZm9yIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVubGVzcyB5b3UgYXJlIGRvaW5nIHRoZSB0aGluZ3MgCisgICAgICAgICAgRC1CdXMgd2FzIGRlc2lnbmVkIGZvci4gRG9uJ3QgbWFrZSB0aGUgbWlzdGFrZSBvZiB0aGlua2luZyAKKyAgICAgICAgICB0aGF0IGFueSBzeXN0ZW0gaW52b2x2aW5nICJJUEMiIGlzIHRoZSBzYW1lIHRoaW5nLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgVGhlIEQtQnVzIGF1dGhvcnMgd291bGQgbm90IHJlY29tbWVuZCB1c2luZyBELUJ1cyAKKyAgICAgICAgICBmb3IgYXBwbGljYXRpb25zIHdoZXJlIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHF1ZXN0aW9ucyBjb21wYXJlIEQtQnVzIHRvIHNvbWUgb3RoZXIgCisgICAgICAgICAgcHJvdG9jb2xzIHByaW1hcmlseSB0byBoZWxwIHlvdSB1bmRlcnN0YW5kIEQtQnVzIAorICAgICAgICAgIGFuZCBkZWNpZGUgd2hldGhlciBpdCdzIGFwcHJvcHJpYXRlOyBELUJ1cyBpcyBuZWl0aGVyIGludGVuZGVkCisgICAgICAgICAgbm9yIGNsYWltZWQgdG8gYmUgdGhlIHJpZ2h0IGNob2ljZSBmb3IgZXZlcnkgYXBwbGljYXRpb24uCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYnJpZGdlIEQtQnVzIHRvIG90aGVyIElQQyBzeXN0ZW1zLCAKKyAgICAgICAgICBqdXN0IGFzIEQtQnVzIGNhbiBiZSBicmlkZ2VkIHRvIG9iamVjdCBzeXN0ZW1zLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgTm90ZTogdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBzdWJzY3JpYmVycyBhcmUgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+dmVyeSBtdWNoIG5vdAorICAgICAgICAgIGludGVyZXN0ZWQ8L2VtPjwvc3Bhbj4gaW4gZGViYXRpbmcgd2hpY2ggSVBDIHN5c3RlbSBpcyB0aGUgT25lIFRydWUKKyAgICAgICAgICBTeXN0ZW0uIFNvIGlmIHlvdSB3YW50IHRvIGRpc2N1c3MgdGhhdCwgcGxlYXNlIHVzZSBhbm90aGVyIGZvcnVtLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxMC4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImNvcmJhIj48L2E+PGEgbmFtZT0iaWRwMjkyMDg5NzYiPjwvYT48cD48Yj4xMC48L2I+PC9wPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gQ09SQkE/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI290aGVyLWlwYyIgdGl0bGU9IjkuIj5ROqA5PC9hPi4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5vbWcub3JnIiB0YXJnZXQ9Il90b3AiPkNPUkJBPC9hPiBpcyBkZXNpZ25lZCB0byBzdXBwb3J0CisgICAgICAgICBvYmplY3Qtb3JpZW50ZWQgSVBDIGJldHdlZW4gb2JqZWN0cywgYXV0b21hdGljYWxseSBtYXJzaGFsbGluZworICAgICAgICAgcGFyYW1ldGVycyBhcyBuZWNlc3NhcnkuIENPUkJBIGlzIHN0cm9uZ2x5IHN1cHBvcnRlZCBieSB0aGUgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3Lm9tZy5vcmciIHRhcmdldD0iX3RvcCI+T3BlbiBNYW5hZ2VtZW50IEdyb3VwIChPTUcpPC9hPiwgd2hpY2gKKyAgICAgICAgIHByb2R1Y2VzIHZhcmlvdXMgc3RhbmRhcmRzIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50cyBmb3IgQ09SQkEgYW5kIGhhcworICAgICAgICAgdGhlIGJhY2tpbmcgb2YgbWFueSBsYXJnZSBvcmdhbml6YXRpb25zLiAgVGhlcmUgYXJlIG1hbnkgQ09SQkEgT1JCcworICAgICAgICAgYXZhaWxhYmxlLCBib3RoIHByb3ByaWV0YXJ5IE9SQnMgYW5kIGZyZWUgLyBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBPUkJzCisgICAgICAgICAodGhlIGxhdHRlciBpbmNsdWRlIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL29yYml0LXJlc291cmNlLnNvdXJjZWZvcmdlLm5ldC8iIHRhcmdldD0iX3RvcCI+T1JCaXQ8L2E+LCA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cubWljby5vcmcvIiB0YXJnZXQ9Il90b3AiPk1JQ088L2E+LCBhbmQgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3LnRoZWFjZW9yYi5jb20vIiB0YXJnZXQ9Il90b3AiPlRoZSBBQ0UgT3JiIChUQU8pPC9hPikuICBNYW55CisgICAgICAgICBvcmdhbml6YXRpb25zIGNvbnRpbnVlIHRvIHVzZSBDT1JCQSBPUkJzIGZvciB2YXJpb3VzIGtpbmRzIG9mIElQQy4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEJvdGggR05PTUUgYW5kIEtERSBoYXZlIHVzZWQgQ09SQkEgYW5kIHRoZW4gbW92ZWQgYXdheSBmcm9tIGl0LiAgS0RFCisgICAgICAgICAgaGFkIG1vcmUgc3VjY2VzcyB3aXRoIGEgc3lzdGVtIGNhbGxlZCBEQ09QLCBhbmQgR05PTUUgbGF5ZXJlZCBhIHN5c3RlbQorICAgICAgICAgIGNhbGxlZCBCb25vYm8gb24gdG9wIG9mIENPUkJBLiBXaXRob3V0IGN1c3RvbSBleHRlbnNpb25zLCBDT1JCQSBkb2VzCisgICAgICAgICAgbm90IHN1cHBvcnQgbWFueSBvZiB0aGUgdGhpbmdzIG9uZSB3YW50cyB0byBkbyBpbiBhIGRlc2t0b3AKKyAgICAgICAgICBlbnZpcm9ubWVudCB3aXRoIHRoZSBHTk9NRS9LREUgYXJjaGl0ZWN0dXJlLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgQ09SQkEgb24gdGhlIG90aGVyIGhhbmQgaGFzIGEgbnVtYmVyIG9mIGZlYXR1cmVzIG9mIGludGVyZXN0IGZvcgorICAgICAgICAgIGVudGVycHJpc2UgYW5kIHdlYiBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgdGhvdWdoIFhNTCBzeXN0ZW1zIHN1Y2ggYXMKKyAgICAgICAgICBTT0FQIGFyZSB0aGUgbGF0ZXN0IGZhZC4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIExpa2UgRC1CdXMsIENPUkJBIHVzZXMgYSBmYXN0IGJpbmFyeSBwcm90b2NvbCAoSUlPUCkuIEJvdGggc3lzdGVtcworICAgICAgICAgIHdvcmsgaW4gdGVybXMgb2Ygb2JqZWN0cyBhbmQgbWV0aG9kcywgYW5kIGhhdmUgY29uY2VwdHMgc3VjaCBhcworICAgICAgICAgICJvbmV3YXkiIGNhbGxzLiBPbmx5IEQtQnVzIGhhcyBkaXJlY3Qgc3VwcG9ydCBmb3IgInNpZ25hbHMiIGFzIGluCisgICAgICAgICAgR0xpYi9RdCAob3IgSmF2YSBsaXN0ZW5lcnMsIG9yIEMjIGRlbGVnYXRlcykuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBELUJ1cyBoYXJkY29kZXMgYW5kIHNwZWNpZmllcyBhIGxvdCBvZiB0aGluZ3MgdGhhdCBDT1JCQSBsZWF2ZXMgb3Blbi1lbmRlZCwKKyAgICAgICAgICBiZWNhdXNlIENPUkJBIGlzIG1vcmUgZ2VuZXJpYyBhbmQgRC1CdXMgaGFzIHR3byBzcGVjaWZpYyB1c2UtY2FzZXMgaW4gbWluZC4KKyAgICAgICAgICBUaGlzIG1ha2VzIEQtQnVzIGEgYml0IHNpbXBsZXIuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBIb3dldmVyLCB1bmxpa2UgQ09SQkEgRC1CdXMgZG9lcyA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5ub3Q8L2VtPjwvc3Bhbj4gc3BlY2lmeSB0aGUKKyAgICAgICAgICBBUEkgZm9yIHRoZSBsYW5ndWFnZSBiaW5kaW5ncy4gSW5zdGVhZCwgIm5hdGl2ZSIgYmluZGluZ3MgYWRhcHRlZAorICAgICAgICAgIHNwZWNpZmljYWxseSB0byB0aGUgY29udmVudGlvbnMgb2YgYSBmcmFtZXdvcmsgc3VjaCBhcyBRT2JqZWN0LAorICAgICAgICAgIEdPYmplY3QsIEMjLCBKYXZhLCBQeXRob24sIGV0Yy4gYXJlIGVuY291cmFnZWQuIFRoZSBsaWJkYnVzIHJlZmVyZW5jZQorICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGEgYmFja2VuZCBmb3IgYmluZGluZ3Mgb2YgdGhpcworICAgICAgICAgIG5hdHVyZSwgcmF0aGVyIHRoYW4gdG8gYmUgdXNlZCBkaXJlY3RseS4gVGhlIHJhdGlvbmFsZSBpcyB0aGF0IGFuIElQQworICAgICAgICAgIHN5c3RlbSBBUEkgc2hvdWxkIG5vdCAibGVhayIgYWxsIG92ZXIgYSBwcm9ncmFtOyBpdCBzaG91bGQgY29tZSBpbnRvCisgICAgICAgICAgcGxheSBvbmx5IGp1c3QgYmVmb3JlIGRhdGEgZ29lcyBvdmVyIHRoZSB3aXJlLiBBcyBhbiBhc2lkZSwgT01HIGlzCisgICAgICAgICAgYXBwYXJlbnRseSB3b3JraW5nIG9uIGEgc2ltcGxlciBDKysgYmluZGluZyBmb3IgQ09SQkEuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBNYW55IENPUkJBIGltcGxlbWVudGF0aW9ucyBzdWNoIGFzIE9SQml0IGFyZSBmYXN0ZXIgdGhhbiB0aGUgbGliZGJ1cworICAgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4gIE9uZSByZWFzb24gaXMgdGhhdCBELUJ1cyBjb25zaWRlcnMgZGF0YQorICAgICAgICAgIGZyb20gdGhlIG90aGVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiB0byBiZSB1bnRydXN0ZWQgYW5kIGV4dGVuc2l2ZWx5CisgICAgICAgICAgdmFsaWRhdGVzIGl0LiBCdXQgZ2VuZXJhbGx5IHNwZWFraW5nIG90aGVyIHByaW9yaXRpZXMgd2VyZSBwbGFjZWQKKyAgICAgICAgICBhaGVhZCBvZiByYXcgc3BlZWQgaW4gdGhlIGxpYmRidXMgaW1wbGVtZW50YXRpb24uIEEgZmFzdCBELUJ1cworICAgICAgICAgIGltcGxlbWVudGF0aW9uIGFsb25nIHRoZSBsaW5lcyBvZiBPUkJpdCBzaG91bGQgYmUgcG9zc2libGUsIG9mIGNvdXJzZS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIE9uIGEgbW9yZSB0cml2aWFsIG5vdGUsIEQtQnVzIGludm9sdmVzIHN1YnN0YW50aWFsbHkgZmV3ZXIgYWNyb255bXMKKyAgICAgICAgICB0aGFuIENPUkJBLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxMS4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9InhtbHJwY3NvYXAiPjwvYT48YSBuYW1lPSJpZHAyNDQ0OTY0OCI+PC9hPjxwPjxiPjExLjwvYj48L3A+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBYTUwtUlBDIGFuZCBTT0FQPworICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0iYW5zd2VyIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNvdGhlci1pcGMiIHRpdGxlPSI5LiI+UTqgOTwvYT4uCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBJbiA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAvIiB0YXJnZXQ9Il90b3AiPlNPQVA8L2E+IGFuZCA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cueG1scnBjLmNvbSIgdGFyZ2V0PSJfdG9wIj5YTUwtUlBDPC9hPiwgUlBDIGNhbGxzIGFyZSB0cmFuc2Zvcm1lZAorICAgICAgICAgIGludG8gYW4gWE1MLWJhc2VkIGZvcm1hdCwgdGhlbiBzZW50IG92ZXIgdGhlIHdpcmUgKHR5cGljYWxseSB1c2luZyB0aGUKKyAgICAgICAgICBIVFRQIHByb3RvY29sKSwgd2hlcmUgdGhleSBhcmUgcHJvY2Vzc2VkIGFuZCByZXR1cm5lZC4gIFhNTC1SUEMgaXMgdGhlCisgICAgICAgICAgc2ltcGxlIHByb3RvY29sIChpdHMgc3BlYyBpcyBvbmx5IGEgcGFnZSBvciB0d28pLCBhbmQgU09BUCBpcyB0aGUKKyAgICAgICAgICBmdWxsLWZlYXR1cmVkIHByb3RvY29sLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgWE1MLVJQQyBhbmQgU09BUCBpbXBvc2UgWE1MIHBhcnNpbmcgb3ZlcmhlYWQgdGhhdCBpcyBub3JtYWxseQorICAgICAgICAgIGlycmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIEludGVybmV0LCBidXQgc2lnbmlmaWNhbnQgZm9yCisgICAgICAgICAgY29uc3RhbnQgZmluZS1ncmFpbmVkIElQQyBhbW9uZyBhcHBsaWNhdGlvbnMgaW4gYSBkZXNrdG9wIHNlc3Npb24uCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBELUJ1cyBvZmZlcnMgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgd2l0aCB0aGUgYnVzIGRhZW1vbiAKKyAgICAgICAgICBzdXBwb3J0cyBsaWZlY3ljbGUgdHJhY2tpbmcgb2Ygb3RoZXIgYXBwbGljYXRpb25zIGNvbm5lY3RlZAorICAgICAgICAgIHRvIHRoZSBidXMuIFdpdGggWE1MLVJQQyBhbmQgU09BUCwgdHlwaWNhbGx5IGVhY2ggbWV0aG9kIGNhbGwgCisgICAgICAgICAgZXhpc3RzIGluIGlzb2xhdGlvbiBhbmQgaGFzIGl0cyBvd24gSFRUUCBjb25uZWN0aW9uLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxMi4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImRjZSI+PC9hPjxhIG5hbWU9ImlkcDI5MjQ4MDY0Ij48L2E+PHA+PGI+MTIuPC9iPjwvcD48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIERDRT8KKyAgICAgICAgPC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9ImFuc3dlciI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjb3RoZXItaXBjIiB0aXRsZT0iOS4iPlE6oDk8L2E+LgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvZGNlLyIgdGFyZ2V0PSJfdG9wIj5EaXN0cmlidXRlZCBDb21wdXRpbmcKKyAgICAgICAgICBFbnZpcm9ubWVudCAoRENFKTwvYT4gaXMgYW4gaW5kdXN0cnktc3RhbmRhcmQgdmVuZG9yLW5ldXRyYWwKKyAgICAgICAgICBzdGFuZGFyZCB0aGF0IGluY2x1ZGVzIGFuIElQQyBtZWNoYW5pc20uICA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9jb21tL3ByZXNzLzA1LTAxLTEyLmh0bSIgdGFyZ2V0PSJfdG9wIj5UaGUgT3BlbiBHcm91cAorICAgICAgICAgIGhhcyByZWxlYXNlZCBhbiBpbXBsZW1lbnRhdGlvbiBhcyBvcGVuIHNvdXJjZSBzb2Z0d2FyZTwvYT4uICBEQ0UKKyAgICAgICAgICBpcyBxdWl0ZSBjYXBhYmxlLCBhbmQgaW5jbHVkZXMgYSB2YXN0IGFtb3VudCBvZiBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMKKyAgICAgICAgICBhIGRpc3RyaWJ1dGVkIHRpbWUgc2VydmljZS4gIEFzIHRoZSBuYW1lIGltcGxpZXMsIERDRSBpcyBpbnRlbmRlZCBmb3IKKyAgICAgICAgICB1c2UgaW4gYSBsYXJnZSwgbXVsdGktY29tcHV0ZXIgZGlzdHJpYnV0ZWQgYXBwbGljYXRpb24uIEQtQnVzIHdvdWxkCisgICAgICAgICAgbm90IGJlIHdlbGwtc3VpdGVkIGZvciB0aGlzLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxMy4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImRjb20iPjwvYT48YSBuYW1lPSJpZHAyOTI1Mjg2NCI+PC9hPjxwPjxiPjEzLjwvYj48L3A+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ09NIGFuZCBDT00/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI290aGVyLWlwYyIgdGl0bGU9IjkuIj5ROqA5PC9hPi4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIENvbXBhcmluZyBELUJ1cyB0byBDT00gaXMgYXBwbGVzIGFuZCBvcmFuZ2VzOyAKKyAgICAgICAgICBzZWUgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNjb21wb25lbnRzIiB0aXRsZT0iNi4iPlE6oDY8L2E+LgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgRENPTSAoZGlzdHJpYnV0ZWQgQ09NKSBpcyBhIFdpbmRvd3MgSVBDIHN5c3RlbSBkZXNpZ25lZCBmb3IgdXNlIHdpdGgKKyAgICAgICAgICB0aGUgQ09NIG9iamVjdCBzeXN0ZW0uIEl0J3Mgc2ltaWxhciBpbiBzb21lIHdheXMgdG8gRENFIGFuZCBDT1JCQS4KKyAgICAgICAgPC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9InF1ZXN0aW9uIiB0aXRsZT0iMTQuIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48YSBuYW1lPSJpbnRlcm5ldC1jb21tdW5pY2F0aW9ucy1lbmdpbmUiPjwvYT48YSBuYW1lPSJpZHAyOTI1NzEzNiI+PC9hPjxwPjxiPjE0LjwvYj48L3A+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBaZXJvQydzIEludGVybmV0IENvbW11bmljYXRpb25zIEVuZ2luZSAoSWNlKQorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0iYW5zd2VyIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNvdGhlci1pcGMiIHRpdGxlPSI5LiI+UTqgOTwvYT4uCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3Lnplcm9jLmNvbS9pY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj4gSW50ZXJuZXQKKyAgICAgICAgICBDb21tdW5pY2F0aW9ucyBFbmdpbmUgKEljZSk8L2E+IGlzIGEgcG93ZXJmdWwgSVBDIG1lY2hhbmlzbSBtb3JlCisgICAgICAgICAgb24gdGhlIGxldmVsIG9mIFNPQVAgb3IgQ09SQkEgdGhhbiBELUJ1cy4gIEljZSBoYXMgYSAiZHVhbC1saWNlbnNlIgorICAgICAgICAgIGJ1c2luZXNzIGFyb3VuZCBpdDsgaS5lLiB5b3UgY2FuIHVzZSBpdCB1bmRlciB0aGUgR1BMLCBvciBwYXkgZm9yIGEKKyAgICAgICAgICBwcm9wcmlldGFyeSBsaWNlbnNlLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxNS4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImludGVyLWNsaWVudC1leGNoYW5nZSI+PC9hPjxhIG5hbWU9ImlkcDI5MjYxMTUyIj48L2E+PHA+PGI+MTUuPC9iPjwvcD48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIEludGVyLUNsaWVudCBFeGNoYW5nZSAoSUNFKT8KKyAgICAgICAgPC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9ImFuc3dlciI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cueC5vcmcvWDExUjYuOC4xL2RvY3MvSUNFL2ljZS5wZGYiIHRhcmdldD0iX3RvcCI+SUNFPC9hPgorICAgICAgICAgIHdhcyBkZXZlbG9wZWQgZm9yIHRoZSBYIFNlc3Npb24gTWFuYWdlbWVudCBwcm90b2NvbCAoWFNNUCksIGFzIHBhcnQgb2YKKyAgICAgICAgICB0aGUgWCBXaW5kb3cgU3lzdGVtIChYMTFSNi4xKS4gVGhlIGlkZWEgd2FzIHRvIGFsbG93IGRlc2t0b3Agc2Vzc2lvbnMKKyAgICAgICAgICB0byBjb250YWluIG5vbmdyYXBoaWNhbCBjbGllbnRzIGluIGFkZGl0aW9uIHRvIFggY2xpZW50cy4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIElDRSBpcyBhIGJpbmFyeSBwcm90b2NvbCBkZXNpZ25lZCBmb3IgZGVza3RvcCB1c2UsIGFuZCBLREUncyBEQ09QCisgICAgICAgICAgYnVpbGRzIG9uIElDRS4gIElDRSBpcyBzdWJzdGFudGlhbGx5IHNpbXBsZXIgdGhhbiBELUJ1cyAoaW4gY29udHJhc3QKKyAgICAgICAgICB0byBtb3N0IG9mIHRoZSBvdGhlciBJUEMgc3lzdGVtcyBtZW50aW9uZWQgaGVyZSwgd2hpY2ggYXJlIG1vcmUKKyAgICAgICAgICBjb21wbGV4KS4gSUNFIGRvZXNuJ3QgcmVhbGx5IGRlZmluZSBhIG1hcHBpbmcgdG8gb2JqZWN0cyBhbmQgbWV0aG9kcworICAgICAgICAgIChEQ09QIGFkZHMgdGhhdCBsYXllcikuICBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIElDRSAobGliSUNFKQorICAgICAgICAgIGlzIG9mdGVuIGNvbnNpZGVyZWQgdG8gYmUgaG9ycmlibGUgKGFuZCBob3JyaWJseSBpbnNlY3VyZSkuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBEQ09QIGFuZCBYU01QIGFyZSB0aGUgb25seSB0d28gd2lkZWx5LXVzZWQgYXBwbGljYXRpb25zIG9mIElDRSwKKyAgICAgICAgICBhbmQgYm90aCBjb3VsZCBpbiBwcmluY2lwbGUgYmUgcmVwbGFjZWQgYnkgRC1CdXMuIChUaG91Z2ggd2hldGhlciAKKyAgICAgICAgICBHTk9NRSBhbmQgS0RFIHdpbGwgYm90aGVyIGlzIGFuIG9wZW4gcXVlc3Rpb24uKQorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxNi4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImRjb3AiPjwvYT48YSBuYW1lPSJpZHAyOTI2NTc3NiI+PC9hPjxwPjxiPjE2LjwvYj48L3A+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ09QPworICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0iYW5zd2VyIj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNvdGhlci1pcGMiIHRpdGxlPSI5LiI+UTqgOTwvYT4uCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBELUJ1cyBpcyBpbnRlbnRpb25hbGx5IHByZXR0eSBzaW1pbGFyIHRvIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL2RldmVsb3Blci5rZGUub3JnL2RvY3VtZW50YXRpb24vbGlicmFyeS9rZGVxdC9kY29wLmh0bWwiIHRhcmdldD0iX3RvcCI+RENPUDwvYT4sCisgICAgICAgICAgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgIkRDT1AgdGhlIG5leHQgZ2VuZXJhdGlvbiIgc3VpdGFibGUgZm9yIAorICAgICAgICAgIHNoYXJpbmcgYmV0d2VlbiB0aGUgdmFyaW91cyBvcGVuIHNvdXJjZSBkZXNrdG9wIHByb2plY3RzLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgRC1CdXMgaXMgYSBiaXQgbW9yZSBjb21wbGV4IHRoYW4gRENPUCwgdGhvdWdoIHRoZSBRdCBiaW5kaW5nIGZvciBELUJ1cworICAgICAgICAgIHNob3VsZCBub3QgYmUgbW9yZSBjb21wbGV4IGZvciBwcm9ncmFtbWVycy4gVGhlIGFkZGl0aW9uYWwgY29tcGxleGl0eQorICAgICAgICAgIG9mIEQtQnVzIGFyaXNlcyBmcm9tIGl0cyBzZXBhcmF0aW9uIG9mIG9iamVjdCByZWZlcmVuY2VzIHZzLiBidXMgbmFtZXMKKyAgICAgICAgICB2cy4gaW50ZXJmYWNlcyBhcyBkaXN0aW5jdCBjb25jZXB0cywgYW5kIGl0cyBzdXBwb3J0IGZvciBvbmUtdG8tb25lCisgICAgICAgICAgY29ubmVjdGlvbnMgaW4gYWRkaXRpb24gdG8gY29ubmVjdGlvbnMgb3ZlciB0aGUgYnVzLiBUaGUgbGliZGJ1cworICAgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgYSBsb3Qgb2YgQVBJIHRvIHN1cHBvcnQgbXVsdGlwbGUgYmluZGluZ3MKKyAgICAgICAgICBhbmQgbWFpbiBsb29wcywgYW5kIHBlcmZvcm1zIGRhdGEgdmFsaWRhdGlvbiBhbmQgb3V0LW9mLW1lbW9yeSBoYW5kbGluZyAKKyAgICAgICAgICBpbiBvcmRlciB0byBzdXBwb3J0IHNlY3VyZSBhcHBsaWNhdGlvbnMgc3VjaCBhcyB0aGUgc3lzdGVtd2lkZSBidXMuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBELUJ1cyBpcyBwcm9iYWJseSBzb21ld2hhdCBzbG93ZXIgdGhhbiBEQ09QIGR1ZSB0byBkYXRhIHZhbGlkYXRpb24gCisgICAgICAgICAgYW5kIG1vcmUgImxheWVycyIgaW4gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4gQSBjb21wYXJpc29uIAorICAgICAgICAgIGhhc24ndCBiZWVuIHBvc3RlZCB0byB0aGUgbGlzdCB0aG91Z2guCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBBdCB0aGlzIHRpbWUsIEtERSBoYXMgbm90IGNvbW1pdHRlZCB0byB1c2luZyBELUJ1cywgYnV0IHRoZXJlIGhhdmUKKyAgICAgICAgICBiZWVuIGRpc2N1c3Npb25zIG9mIEtERSBicmlkZ2luZyBELUJ1cyBhbmQgRENPUCwgb3IgZXZlbiBjaGFuZ2luZworICAgICAgICAgIERDT1AncyBpbXBsZW1lbnRhdGlvbiB0byB1c2UgRC1CdXMgaW50ZXJuYWxseSAoc28gdGhhdCBHTk9NRSBhbmQgS0RFCisgICAgICAgICAgd291bGQgZW5kIHVwIHVzaW5nIGV4YWN0bHkgdGhlIHNhbWUgYnVzKS4gU2VlIHRoZSBLREUgbWFpbGluZyBsaXN0IAorICAgICAgICAgIGFyY2hpdmVzIGZvciBzb21lIG9mIHRoZXNlIGRpc2N1c3Npb25zLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxNy4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9InlldC1tb3JlLWlwYyI+PC9hPjxhIG5hbWU9ImlkcDI5MjcyNzY4Ij48L2E+PHA+PGI+MTcuPC9iPjwvcD48L3RkPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxwPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIFt5ZXQgbW9yZSBJUEMgbWVjaGFuaXNtc10/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI290aGVyLWlwYyIgdGl0bGU9IjkuIj5ROqA5PC9hPi4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFRoZXJlIGFyZSBjb3VudGxlc3MgdXNlcyBvZiBuZXR3b3JrIHNvY2tldHMgaW4gdGhlIHdvcmxkLiAgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3Lm1idXMub3JnLyIgdGFyZ2V0PSJfdG9wIj5NQlVTPC9hPiwgU3VuIE9OQy9SUEMsIEphYmJlci9YTVBQLAorICAgICAgICAgIFNJUCwgYXJlIHNvbWUgd2UgY2FuIHRoaW5rIG9mIHF1aWNrbHkuCisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJxdWVzdGlvbiIgdGl0bGU9IjE4LiI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PGEgbmFtZT0id2hpY2gtaXBjIj48L2E+PGEgbmFtZT0iaWRwMjkyNzY3MDQiPjwvYT48cD48Yj4xOC48L2I+PC9wPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgV2hpY2ggSVBDIG1lY2hhbmlzbSBzaG91bGQgSSB1c2U/CisgICAgICAgIDwvcD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhbnN3ZXIiPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI290aGVyLWlwYyIgdGl0bGU9IjkuIj5ROqA5PC9hPi4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIElmIHlvdSdyZSB3cml0aW5nIGFuIEludGVybmV0IG9yIEludHJhbmV0IGFwcGxpY2F0aW9uLCBYTUwtUlBDIG9yIFNPQVAKKyAgICAgICAgICB3b3JrIGZvciBtYW55IHBlb3BsZS4gVGhlc2UgYXJlIHN0YW5kYXJkLCBhdmFpbGFibGUgZm9yIG1vc3QKKyAgICAgICAgICBsYW5ndWFnZXMsIHNpbXBsZSB0byBkZWJ1ZyBhbmQgZWFzeSB0byB1c2UuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBJZiB5b3UncmUgd3JpdGluZyBhIGRlc2t0b3AgYXBwbGljYXRpb24gZm9yIFVOSVgsIAorICAgICAgICAgIHRoZW4gRC1CdXMgaXMgb2YgY291cnNlIG91ciByZWNvbW1lbmRhdGlvbiBmb3IgCisgICAgICAgICAgdGFsa2luZyB0byBvdGhlciBwYXJ0cyBvZiB0aGUgZGVza3RvcCBzZXNzaW9uLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgRC1CdXMgaXMgYWxzbyBkZXNpZ25lZCBmb3IgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiBzeXN0ZW0gZGFlbW9ucyBhbmQKKyAgICAgICAgICBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIHRoZSBkZXNrdG9wIGFuZCBzeXN0ZW0gZGFlbW9ucy4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIElmIHlvdSdyZSBkb2luZyBzb21ldGhpbmcgY29tcGxpY2F0ZWQgc3VjaCBhcyBjbHVzdGVyaW5nLCAKKyAgICAgICAgICBkaXN0cmlidXRlZCBzd2FybXMsIHBlZXItdG8tcGVlciwgb3Igd2hhdGV2ZXIgdGhlbiAKKyAgICAgICAgICB0aGUgYXV0aG9ycyBvZiB0aGlzIEZBUSBkb24ndCBoYXZlIGV4cGVydGlzZSBpbiB0aGVzZQorICAgICAgICAgIGFyZWFzIGFuZCB5b3Ugc2hvdWxkIGFzayBzb21lb25lIGVsc2Ugb3IgdHJ5IGEgc2VhcmNoIGVuZ2luZS4KKyAgICAgICAgICBELUJ1cyBpcyBtb3N0IGxpa2VseSBhIHBvb3IgY2hvaWNlIGJ1dCBjb3VsZCBiZSBhcHByb3ByaWF0ZQorICAgICAgICAgIGZvciBzb21lIHRoaW5ncy4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIE5vdGU6IHRoZSBELUJ1cyBtYWlsaW5nIGxpc3QgaXMgcHJvYmFibHkgbm90IHRoZSBwbGFjZSB0byAKKyAgICAgICAgICBkaXNjdXNzIHdoaWNoIHN5c3RlbSBpcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgCisgICAgICAgICAgdGhvdWdoIHlvdSBhcmUgd2VsY29tZSB0byBhc2sgc3BlY2lmaWMgcXVlc3Rpb25zIGFib3V0IAorICAgICAgICAgIEQtQnVzIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPmFmdGVyIHJlYWRpbmcgdGhpcyBGQVEsIHRoZSB0dXRvcmlhbCwgYW5kIAorICAgICAgICAgICAgc2VhcmNoaW5nIHRoZSBsaXN0IGFyY2hpdmVzPC9lbT48L3NwYW4+LiBUaGUgYmVzdCB3YXkgCisgICAgICAgICAgdG8gc2VhcmNoIHRoZSBsaXN0IGFyY2hpdmVzIGlzIHByb2JhYmx5IHRvIHVzZSAKKyAgICAgICAgICBhbiBJbnRlcm5ldCBlbmdpbmUgc3VjaCBhcyBHb29nbGUuIE9uIEdvb2dsZSwgCisgICAgICAgICAgaW5jbHVkZSAic2l0ZTpmcmVlZGVza3RvcC5vcmciIGluIHlvdXIgc2VhcmNoLgorICAgICAgICA8L3A+PC90ZD48L3RyPjx0ciBjbGFzcz0icXVlc3Rpb24iIHRpdGxlPSIxOS4iPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImlkcDI5MjgyNzA0Ij48L2E+PGEgbmFtZT0iaWRwMjkyODI5NjAiPjwvYT48cD48Yj4xOS48L2I+PC9wPjwvdGQ+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CisgICAgICAgICAgSG93IGNhbiBJIHN1Ym1pdCBhIGJ1ZyBvciBwYXRjaD8KKyAgICAgICAgPC9wPjwvdGQ+PC90cj48dHIgY2xhc3M9ImFuc3dlciI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PC90ZD48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48cD4KKyAgICAgICAgICBUaGUgRC1CdXMgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmciIHRhcmdldD0iX3RvcCI+d2ViIHNpdGU8L2E+CisgICAgICAgICAgaGFzIGEgbGluayB0byB0aGUgYnVnIHRyYWNrZXIsIHdoaWNoIGlzIHRoZSBiZXN0IHBsYWNlIHRvIHN0b3JlCisgICAgICAgICAgcGF0Y2hlcy4gIFlvdSBjYW4gYWxzbyBwb3N0IHRoZW0gdG8gdGhlIGxpc3QsIGVzcGVjaWFsbHkgaWYgeW91IHdhbnQKKyAgICAgICAgICB0byBkaXNjdXNzIHRoZSBwYXRjaCBvciBnZXQgZmVlZGJhY2suCisgICAgICAgIDwvcD48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kb2MvZGJ1cy1mYXEueG1sIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtZmFxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWFjM2YxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtZmFxLnhtbApAQCAtMCwwICsxLDY3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIGFydGljbGUgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiCitbCitdPgorCis8YXJ0aWNsZSBpZD0iaW5kZXgiPgorICA8YXJ0aWNsZWluZm8+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+CisKKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9kYnVzLWxhdW5jaC4xIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtbGF1bmNoLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhMTk0OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9kYnVzLWxhdW5jaC4xCkBAIC0wLDAgKzEsMTgzIEBACisuXCIgCisuXCIgZGJ1cy1sYXVuY2ggbWFudWFsIHBhZ2UuCisuXCIgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKy5cIgorLlRIIGRidXMtbGF1bmNoIDEKKy5TSCBOQU1FCitkYnVzLWxhdW5jaCBcLSBVdGlsaXR5IHRvIHN0YXJ0IGEgbWVzc2FnZSBidXMgZnJvbSBhIHNoZWxsIHNjcmlwdAorLlNIIFNZTk9QU0lTCisuUFAKKy5CIGRidXMtbGF1bmNoIFtcLVwtdmVyc2lvbl0gW1wtXC1zaC1zeW50YXhdIFtcLVwtY3NoLXN5bnRheF0gW1wtXC1hdXRvLXN5bnRheF0gW1wtXC1leGl0LXdpdGgtc2Vzc2lvbl0gW1wtXC1hdXRvbGF1bmNoPU1BQ0hJTkVJRF0gW1wtXC1jb25maWctZmlsZT1GSUxFTkFNRV0gW1BST0dSQU1dIFtBUkdTLi4uXQorCisuU0ggREVTQ1JJUFRJT04KKworVGhlIFxmSWRidXMtbGF1bmNoXGZQIGNvbW1hbmQgaXMgdXNlZCB0byBzdGFydCBhIHNlc3Npb24gYnVzIAoraW5zdGFuY2Ugb2YgXGZJZGJ1cy1kYWVtb25cZlAgZnJvbSBhIHNoZWxsIHNjcmlwdC4KK0l0IHdvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCBmcm9tIGEgdXNlcidzIGxvZ2luCitzY3JpcHRzLiBVbmxpa2UgdGhlIGRhZW1vbiBpdHNlbGYsIFxmSWRidXMtbGF1bmNoXGZQIGV4aXRzLCBzbworYmFja3RpY2tzIG9yIHRoZSAkKCkgY29uc3RydWN0IGNhbiBiZSB1c2VkIHRvIHJlYWQgaW5mb3JtYXRpb24gZnJvbQorXGZJZGJ1cy1sYXVuY2hcZlAuCisKK1dpdGggbm8gYXJndW1lbnRzLCBcZklkYnVzLWxhdW5jaFxmUCB3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzCitpbnN0YW5jZSBhbmQgcHJpbnQgdGhlIGFkZHJlc3MgYW5kIHBpZCBvZiB0aGF0IGluc3RhbmNlIHRvIHN0YW5kYXJkCitvdXRwdXQuCisKK1lvdSBtYXkgc3BlY2lmeSBhIHByb2dyYW0gdG8gYmUgcnVuOyBpbiB0aGlzIGNhc2UsIFxmSWRidXMtbGF1bmNoXGZQCit3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzIGluc3RhbmNlLCBzZXQgdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50Cit2YXJpYWJsZXMgc28gdGhlIHNwZWNpZmllZCBwcm9ncmFtIGNhbiBmaW5kIHRoZSBidXMsIGFuZCB0aGVuIGV4ZWN1dGUgdGhlCitzcGVjaWZpZWQgcHJvZ3JhbSwgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4gIFNlZSBiZWxvdyBmb3IKK2V4YW1wbGVzLgorCitJZiB5b3UgbGF1bmNoIGEgcHJvZ3JhbSwgXGZJZGJ1cy1sYXVuY2hcZlAgd2lsbCBub3QgcHJpbnQgdGhlCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3IGJ1cyB0byBzdGFuZGFyZCBvdXRwdXQuCisKK1doZW4gXGZJZGJ1cy1sYXVuY2hcZlAgcHJpbnRzIGJ1cyBpbmZvcm1hdGlvbiB0byBzdGFuZGFyZCBvdXRwdXQsIGJ5CitkZWZhdWx0IGl0IGlzIGluIGEgc2ltcGxlIGtleS12YWx1ZSBwYWlycyBmb3JtYXQuIEhvd2V2ZXIsIHlvdSBtYXkgCityZXF1ZXN0IHNldmVyYWwgYWx0ZXJuYXRlIHN5bnRheGVzIHVzaW5nIHRoZSBcLVwtc2gtc3ludGF4LCBcLVwtY3NoLXN5bnRheCwKK1wtXC1iaW5hcnktc3ludGF4LCBvcgorXC1cLWF1dG8tc3ludGF4IG9wdGlvbnMuIFNldmVyYWwgb2YgdGhlc2UgY2F1c2UgXGZJZGJ1cy1sYXVuY2hcZlAgdG8gZW1pdCBzaGVsbCBjb2RlCit0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorCitXaXRoIHRoZSBcLVwtYXV0by1zeW50YXggb3B0aW9uLCBcZklkYnVzLWxhdW5jaFxmUCBsb29rcyBhdCB0aGUgdmFsdWUKK29mIHRoZSBTSEVMTCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBkZXRlcm1pbmUgd2hpY2ggc2hlbGwgc3ludGF4CitzaG91bGQgYmUgdXNlZC4gIElmIFNIRUxMIGVuZHMgaW4gImNzaCIsIHRoZW4gY3NoLWNvbXBhdGlibGUgY29kZSBpcworZW1pdHRlZDsgb3RoZXJ3aXNlIEJvdXJuZSBzaGVsbCBjb2RlIGlzIGVtaXR0ZWQuICBJbnN0ZWFkIG9mIHBhc3NpbmcKK1wtXC1hdXRvLXN5bnRheCwgeW91IG1heSBleHBsaWNpdHkgc3BlY2lmeSBhIHBhcnRpY3VsYXIgb25lIGJ5IHVzaW5nCitcLVwtc2gtc3ludGF4IGZvciBCb3VybmUgc3ludGF4LCBvciBcLVwtY3NoLXN5bnRheCBmb3IgY3NoIHN5bnRheC4KK0luIHNjcmlwdHMsIGl0J3MgbW9yZSByb2J1c3QgdG8gYXZvaWQgXC1cLWF1dG8tc3ludGF4IGFuZCB5b3UgaG9wZWZ1bGx5Citrbm93IHdoaWNoIHNoZWxsIHlvdXIgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uCisKKy5QUAorU2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvIGZvciBtb3JlIGluZm9ybWF0aW9uCithYm91dCBELUJ1cy4gU2VlIGFsc28gdGhlIG1hbiBwYWdlIGZvciBcZklkYnVzLWRhZW1vblxmUC4KKworLlBQCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBcZklkYnVzLWxhdW5jaFxmUCB3aXRoIGFuIAorc2gtY29tcGF0aWJsZSBzaGVsbCB0byBzdGFydCB0aGUgcGVyLXNlc3Npb24gYnVzIGRhZW1vbjoKKy5uZgorCisgICMjIHRlc3QgZm9yIGFuIGV4aXN0aW5nIGJ1cyBkYWVtb24sIGp1c3QgdG8gYmUgc2FmZQorICBpZiB0ZXN0IC16ICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIiA7IHRoZW4KKyAgICAgICMjIGlmIG5vdCBmb3VuZCwgbGF1bmNoIGEgbmV3IG9uZQorICAgICAgZXZhbCBgZGJ1cy1sYXVuY2ggLS1zaC1zeW50YXggLS1leGl0LXdpdGgtc2Vzc2lvbmAKKyAgICAgIGVjaG8gIkQtQnVzIHBlci1zZXNzaW9uIGRhZW1vbiBhZGRyZXNzIGlzOiAkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorICBmaQorCisuZmkKK1lvdSBtaWdodCBydW4gc29tZXRoaW5nIGxpa2UgdGhhdCBpbiB5b3VyIGxvZ2luIHNjcmlwdHMuCisKKy5QUAorQW5vdGhlciB3YXkgdG8gdXNlIFxmSWRidXMtbGF1bmNoXGZQIGlzIHRvIHJ1biB5b3VyIG1haW4gc2Vzc2lvbgorcHJvZ3JhbSwgbGlrZSBzbzoKKy5uZgorCitkYnVzLWxhdW5jaCBnbm9tZS1zZXNzaW9uCisKKy5maQorVGhlIGFib3ZlIHdvdWxkIGxpa2VseSBiZSBhcHByb3ByaWF0ZSBmb3Igfi8ueHNlc3Npb24gb3Igfi8uWGNsaWVudHMuCisKKy5TSCBBVVRPTUFUSUMgTEFVTkNISU5HCisKKy5QUAorSWYgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIG5vdCBzZXQgZm9yIGEgcHJvY2VzcyB0aGF0IHRyaWVzIHRvIHVzZQorRC1CdXMsIGJ5IGRlZmF1bHQgdGhlIHByb2Nlc3Mgd2lsbCBhdHRlbXB0IHRvIGludm9rZSBkYnVzLWxhdW5jaCB3aXRoCit0aGUgLS1hdXRvbGF1bmNoIG9wdGlvbiB0byBzdGFydCB1cCBhIG5ldyBzZXNzaW9uIGJ1cyBvciBmaW5kIHRoZSAKK2V4aXN0aW5nIGJ1cyBhZGRyZXNzIG9uIHRoZSBYIGRpc3BsYXkgb3IgaW4gYSBmaWxlIGluCit+Ly5kYnVzL3Nlc3Npb24tYnVzLworCisuUFAKK1doZW5ldmVyIGFuIGF1dG9sYXVuY2ggb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gdGhhdCBoYWQgdG8KK3N0YXJ0IGEgbmV3IGJ1cyB3aWxsIGJlIGluIGl0cyBvd24gbGl0dGxlIHdvcmxkOyBpdCBjYW4gZWZmZWN0aXZlbHkKK2VuZCB1cCBzdGFydGluZyBhIHdob2xlIG5ldyBzZXNzaW9uIGlmIGl0IHRyaWVzIHRvIHVzZSBhIGxvdCBvZiAKK2J1cyBzZXJ2aWNlcy4gVGhpcyBjYW4gYmUgc3Vib3B0aW1hbCBvciBldmVuIHRvdGFsbHkgYnJva2VuLCBkZXBlbmRpbmcKK29uIHRoZSBhcHAgYW5kIHdoYXQgaXQgdHJpZXMgdG8gZG8uCisKKy5QUAorVGhlcmUgYXJlIHR3byBjb21tb24gcmVhc29ucyBmb3IgYXV0b2xhdW5jaC4gT25lIGlzIHNzaCB0byBhIHJlbW90ZQorbWFjaGluZS4gVGhlIGlkZWFsIGZpeCBmb3IgdGhhdCB3b3VsZCBiZSBmb3J3YXJkaW5nIG9mCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaW4gdGhlIHNhbWUgd2F5IHRoYXQgRElTUExBWSBpcyBmb3J3YXJkZWQuCitJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gZWRpdCB0aGUgc2Vzc2lvbi5jb25mIGNvbmZpZyBmaWxlIHRvIAoraGF2ZSB5b3VyIHNlc3Npb24gYnVzIGxpc3RlbiBvbiBUQ1AsIGFuZCBtYW51YWxseSBzZXQKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUywgaWYgeW91IGxpa2UuCisKKy5QUAorVGhlIHNlY29uZCBjb21tb24gcmVhc29uIGZvciBhdXRvbGF1bmNoIGlzIGFuIHN1IHRvIGFub3RoZXIgdXNlciwgYW5kCitkaXNwbGF5IG9mIFggYXBwbGljYXRpb25zIHJ1bm5pbmcgYXMgdGhlIHNlY29uZCB1c2VyIG9uIHRoZSBkaXNwbGF5CitiZWxvbmdpbmcgdG8gdGhlIGZpcnN0IHVzZXIuIFBlcmhhcHMgdGhlIGlkZWFsIGZpeCBpbiB0aGlzIGNhc2UKK3dvdWxkIGJlIHRvIGFsbG93IHRoZSBzZWNvbmQgdXNlciB0byBjb25uZWN0IHRvIHRoZSBzZXNzaW9uIGJ1cyBvZiB0aGUKK2ZpcnN0IHVzZXIsIGp1c3QgYXMgdGhleSBjYW4gY29ubmVjdCB0byB0aGUgZmlyc3QgdXNlcidzIGRpc3BsYXkuCitIb3dldmVyLCBhIG1lY2hhbmlzbSBmb3IgdGhhdCBoYXMgbm90IGJlZW4gY29kZWQuCisKKy5QUAorWW91IGNhbiBhbHdheXMgYXZvaWQgYXV0b2xhdW5jaCBieSBtYW51YWxseSBzZXR0aW5nCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MuIEF1dG9sYXVuY2ggaGFwcGVucyBiZWNhdXNlIHRoZSBkZWZhdWx0CithZGRyZXNzIGlmIG5vbmUgaXMgc2V0IGlzICJhdXRvbGF1bmNoOiIsIHNvIGlmIGFueSBvdGhlciBhZGRyZXNzIGlzCitzZXQgdGhlcmUgd2lsbCBiZSBubyBhdXRvbGF1bmNoLiBZb3UgY2FuIGhvd2V2ZXIgaW5jbHVkZSBhdXRvbGF1bmNoIGluCithbiBleHBsaWNpdCBzZXNzaW9uIGJ1cyBhZGRyZXNzIGFzIGEgZmFsbGJhY2ssIGZvciBleGFtcGxlCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9InNvbWV0aGluZzosYXV0b2xhdW5jaDoiIC0gaW4gdGhhdCBjYXNlIGlmCit0aGUgZmlyc3QgYWRkcmVzcyBkb2Vzbid0IHdvcmssIHByb2Nlc3NlcyB3aWxsIGF1dG9sYXVuY2guIChUaGUgYnVzCithZGRyZXNzIHZhcmlhYmxlIGNvbnRhaW5zIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWRkcmVzc2VzIHRvIHRyeS4pCisKKy5QUAorVGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gaXMgY29uc2lkZXJlZCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgorZGV0YWlsIG9mIGxpYmRidXMsIGFuZCBpbiBmYWN0IHRoZXJlIGFyZSBwbGFucyB0byBjaGFuZ2UgaXQuIFRoZXJlJ3MKK25vIHJlYWwgcmVhc29uIHRvIHVzZSBpdCBvdXRzaWRlIG9mIHRoZSBsaWJkYnVzIGltcGxlbWVudGF0aW9uIGFueWhvdy4KKworLlNIIE9QVElPTlMKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorLlRQCisuSSAiLS1hdXRvLXN5bnRheCIKK0Nob29zZSBcLVwtY3NoLXN5bnRheCBvciBcLVwtc2gtc3ludGF4IGJhc2VkIG9uIHRoZSBTSEVMTCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworLkkgIi0tYmluYXJ5LXN5bnRheCIKK1dyaXRlIHRvIHN0ZG91dCBhIG51bC10ZXJtaW5hdGVkIGJ1cyBhZGRyZXNzLCB0aGVuIHRoZSBidXMgUElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKHBpZF90KSwgdGhlbiB0aGUgYnVzIFggd2luZG93IElEIGFzIGEKK2JpbmFyeSBpbnRlZ2VyIG9mIHNpemUgc2l6ZW9mKGxvbmcpLiBJbnRlZ2VycyBhcmUgaW4gdGhlIG1hY2hpbmUncworYnl0ZSBvcmRlciwgbm90IG5ldHdvcmsgYnl0ZSBvcmRlciBvciBhbnkgb3RoZXIgY2Fub25pY2FsIGJ5dGUgb3JkZXIuCisKKy5UUAorLkkgIi0tY2xvc2Utc3RkZXJyIgorQ2xvc2UgdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBzdHJlYW0gYmVmb3JlIHN0YXJ0aW5nIHRoZSBELUJ1cworZGFlbW9uLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjYXB0dXJlIGRidXMtbGF1bmNoIGVycm9yCittZXNzYWdlcyBidXQgeW91IGRvbid0IHdhbnQgZGJ1cy1kYWVtb24gdG8ga2VlcCB0aGUgc3RyZWFtIG9wZW4gdG8KK3lvdXIgYXBwbGljYXRpb24uCisKKy5UUAorLkkgIi0tY29uZmlnLWZpbGU9RklMRU5BTUUiCitQYXNzIFwtXC1jb25maWctZmlsZT1GSUxFTkFNRSB0byB0aGUgYnVzIGRhZW1vbiwgaW5zdGVhZCBvZiBwYXNzaW5nIGl0IAordGhlIFwtXC1zZXNzaW9uIGFyZ3VtZW50LiBTZWUgdGhlIG1hbiBwYWdlIGZvciBkYnVzLWRhZW1vbgorCisuVFAKKy5JICItLWNzaC1zeW50YXgiCitFbWl0IGNzaCBjb21wYXRpYmxlIGNvZGUgdG8gc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworLlRQCisuSSAiLS1leGl0LXdpdGgtc2Vzc2lvbiIKK0lmIHRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkLCBhIHBlcnNpc3RlbnQgImJhYnlzaXR0ZXIiIHByb2Nlc3Mgd2lsbCBiZSAKK2NyZWF0ZWQgdGhhdCB3YXRjaGVzIHN0ZGluIGZvciBIVVAgYW5kIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIFgKK3NlcnZlci4gSWYgdGhpcyBwcm9jZXNzIGdldHMgYSBIVVAgb24gc3RkaW4gb3IgbG9zZXMgaXRzIFggY29ubmVjdGlvbiwKK2l0IGtpbGxzIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24uCisKKy5UUAorLkkgIi0tYXV0b2xhdW5jaD1NQUNISU5FSUQiCitUaGlzIG9wdGlvbiBpbXBsaWVzIHRoYXQgXGZJZGJ1cy1sYXVuY2hcZlAgc2hvdWxkIHNjYW4gZm9yIGEKK3ByZXZpb3VzbHktc3RhcnRlZCBzZXNzaW9uIGFuZCByZXVzZSB0aGUgdmFsdWVzIGZvdW5kIHRoZXJlLiBJZiBubworc2Vzc2lvbiBpcyBmb3VuZCwgaXQgd2lsbCBzdGFydCBhIG5ldyBzZXNzaW9uLiBUaGUKK1wtXC1leGl0LXdpdGgtc2Vzc2lvbiBvcHRpb24gaXMgaW1wbGllZCBpZiBcLVwtYXV0b2xhdW5jaCBpcyBnaXZlbi4KK1RoaXMgb3B0aW9uIGlzIGZvciB0aGUgZXhjbHVzaXZlIHVzZSBvZiBsaWJkYnVzLCB5b3UgZG8gbm90IHdhbnQgdG8KK3VzZSBpdCBtYW51YWxseS4gSXQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorCisuVFAKKy5JICItLXNoLXN5bnRheCIKK0VtaXQgQm91cm5lLXNoZWxsIGNvbXBhdGlibGUgY29kZSB0byBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCisuVFAKKy5JICItLXZlcnNpb24iCitQcmludCB0aGUgdmVyc2lvbiBvZiBkYnVzLWxhdW5jaAorCisuU0ggQVVUSE9SCitTZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy9kb2MvQVVUSE9SUworCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RidXMtbW9uaXRvci4xIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtbW9uaXRvci4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGMxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvZGJ1cy1tb25pdG9yLjEKQEAgLTAsMCArMSw3OCBAQAorLlwiIAorLlwiIGRidXMtbW9uaXRvciBtYW51YWwgcGFnZS4KKy5cIiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorLlwiCisuVEggZGJ1cy1tb25pdG9yIDEKKy5TSCBOQU1FCitkYnVzLW1vbml0b3IgXC0gZGVidWcgcHJvYmUgdG8gcHJpbnQgbWVzc2FnZSBidXMgbWVzc2FnZXMKKy5TSCBTWU5PUFNJUworLlBQCisuQiBkYnVzLW1vbml0b3IKK1tcLVwtc3lzdGVtIHwgXC1cLXNlc3Npb24gfCBcLVwtYWRkcmVzcyBBRERSRVNTXSBbXC1cLXByb2ZpbGUgfCBcLVwtbW9uaXRvcl0KK1t3YXRjaCBleHByZXNzaW9uc10KKworLlNIIERFU0NSSVBUSU9OCisKK1RoZSBcZklkYnVzLW1vbml0b3JcZlAgY29tbWFuZCBpcyB1c2VkIHRvIG1vbml0b3IgbWVzc2FnZXMgZ29pbmcKK3Rocm91Z2ggYSBELUJ1cyBtZXNzYWdlIGJ1cy4gIFNlZQoraHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBiaWcgcGljdHVyZS4KKworLlBQCitUaGVyZSBhcmUgdHdvIHdlbGwta25vd24gbWVzc2FnZSBidXNlczogdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMKKyhpbnN0YWxsZWQgb24gbWFueSBzeXN0ZW1zIGFzIHRoZSAibWVzc2FnZWJ1cyIgc2VydmljZSkgYW5kIHRoZQorcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1cyAoc3RhcnRlZCBlYWNoIHRpbWUgYSB1c2VyIGxvZ3MgaW4pLgorVGhlIFwtXC1zeXN0ZW0gYW5kIFwtXC1zZXNzaW9uIG9wdGlvbnMgZGlyZWN0IFxmSWRidXMtbW9uaXRvclxmUCB0bworbW9uaXRvciB0aGUgc3lzdGVtIG9yIHNlc3Npb24gYnVzZXMgcmVzcGVjdGl2ZWx5LiAgSWYgbmVpdGhlciBpcworc3BlY2lmaWVkLCBcZklkYnVzLW1vbml0b3JcZlAgbW9uaXRvcnMgdGhlIHNlc3Npb24gYnVzLgorCisuUFAKK1xmSWRidXMtbW9uaXRvclxmUCBoYXMgdHdvIGRpZmZlcmVudCBvdXRwdXQgbW9kZXMsIHRoZSAnY2xhc3NpYyctc3R5bGUKK21vbml0b3JpbmcgbW9kZSBhbmQgcHJvZmlsaW5nIG1vZGUuIFRoZSBwcm9maWxpbmcgZm9ybWF0IGlzIGEgY29tcGFjdAorZm9ybWF0IHdpdGggYSBzaW5nbGUgbGluZSBwZXIgbWVzc2FnZSBhbmQgbWljcm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1pbmcKK2luZm9ybWF0aW9uLiBUaGUgXC1cLXByb2ZpbGUgYW5kIFwtXC1tb25pdG9yIG9wdGlvbnMgc2VsZWN0IHRoZSBwcm9maWxpbmcKK2FuZCBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQgcmVzcGVjdGl2ZWx5LiBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwKK1xmSWRidXMtbW9uaXRvclxmUCB1c2VzIHRoZSBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQuCisKKy5QUAorSW4gb3JkZXIgdG8gZ2V0IFxmSWRidXMtbW9uaXRvclxmUCB0byBzZWUgdGhlIG1lc3NhZ2VzIHlvdSBhcmUgaW50ZXJlc3RlZAoraW4sIHlvdSBzaG91bGQgc3BlY2lmeSBhIHNldCBvZiB3YXRjaCBleHByZXNzaW9ucyBhcyB5b3Ugd291bGQgZXhwZWN0IHRvCitiZSBwYXNzZWQgdG8gdGhlIFxmSWRidXNfYnVzX2FkZF9tYXRjaFxmUCBmdW5jdGlvbi4KKworLlBQIAorVGhlIG1lc3NhZ2UgYnVzIGNvbmZpZ3VyYXRpb24gbWF5IGtlZXAgXGZJZGJ1cy1tb25pdG9yXGZQIGZyb20gc2VlaW5nCithbGwgbWVzc2FnZXMsIGVzcGVjaWFsbHkgaWYgeW91IHJ1biB0aGUgbW9uaXRvciBhcyBhIG5vbi1yb290IHVzZXIuCisKKy5TSCBPUFRJT05TCisuVFAKKy5JICItLXN5c3RlbSIKK01vbml0b3IgdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy4KKy5UUAorLkkgIi0tc2Vzc2lvbiIKK01vbml0b3IgdGhlIHNlc3Npb24gbWVzc2FnZSBidXMuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pCisuVFAKKy5JICItLWFkZHJlc3MgQUREUkVTUyIKK01vbml0b3IgYW4gYXJiaXRyYXJ5IG1lc3NhZ2UgYnVzIGdpdmVuIGF0IEFERFJFU1MuCisuVFAKKy5JICItLXByb2ZpbGUiCitVc2UgdGhlIHByb2ZpbGluZyBvdXRwdXQgZm9ybWF0LgorLlRQCisuSSAiLS1tb25pdG9yIgorVXNlIHRoZSBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQuICAoVGhpcyBpcyB0aGUgZGVmYXVsdC4pCisKKy5TSCBFWEFNUExFCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgZGJ1cy1tb25pdG9yIHRvIHdhdGNoIGZvciB0aGUgZ25vbWUgdHlwaW5nCittb25pdG9yIHRvIHNheSB0aGluZ3MKKy5uZgorCisgIGRidXMtbW9uaXRvciAidHlwZT0nc2lnbmFsJyxzZW5kZXI9J29yZy5nbm9tZS5UeXBpbmdNb25pdG9yJyxpbnRlcmZhY2U9J29yZy5nbm9tZS5UeXBpbmdNb25pdG9yJyIKKworLmZpCisKKy5TSCBBVVRIT1IKK2RidXMtbW9uaXRvciB3YXMgd3JpdHRlbiBieSBQaGlsaXAgQmx1bmRlbGwuCitUaGUgcHJvZmlsaW5nIG91dHB1dCBtb2RlIHdhcyBhZGRlZCBieSBPbGxpIFNhbGxpLgorCisuU0ggQlVHUworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RidXMtc2VuZC4xIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtc2VuZC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzhjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvZGJ1cy1zZW5kLjEKQEAgLTAsMCArMSw5NSBAQAorLlwiIAorLlwiIGRidXMtc2VuZCBtYW51YWwgcGFnZS4KKy5cIiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorLlwiCisuVEggZGJ1cy1zZW5kIDEKKy5TSCBOQU1FCitkYnVzLXNlbmQgXC0gU2VuZCBhIG1lc3NhZ2UgdG8gYSBtZXNzYWdlIGJ1cworLlNIIFNZTk9QU0lTCisuUFAKKy5CIGRidXMtc2VuZAorW1wtXC1zeXN0ZW0gfCBcLVwtc2Vzc2lvbl0gW1wtXC1kZXN0PU5BTUVdIFtcLVwtcHJpbnQtcmVwbHldCitbXC1cLXR5cGU9VFlQRV0gPGRlc3RpbmF0aW9uIG9iamVjdCBwYXRoPiA8bWVzc2FnZSBuYW1lPiBbY29udGVudHMgLi4uXQorCisuU0ggREVTQ1JJUFRJT04KKworVGhlIFxmSWRidXMtc2VuZFxmUCBjb21tYW5kIGlzIHVzZWQgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBELUJ1cyBtZXNzYWdlCitidXMuIFNlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyBmb3IgbW9yZSAKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBiaWcgcGljdHVyZS4KKworLlBQCitUaGVyZSBhcmUgdHdvIHdlbGwta25vd24gbWVzc2FnZSBidXNlczogdGhlIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMgCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIHNlcnZpY2UpIGFuZCB0aGUgCitwZXItdXNlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzIChzdGFydGVkIGVhY2ggdGltZSBhIHVzZXIgbG9ncyBpbikuCitUaGUgXC1cLXN5c3RlbSBhbmQgXC1cLXNlc3Npb24gb3B0aW9ucyBkaXJlY3QgXGZJZGJ1cy1zZW5kXGZQIHRvIHNlbmQKK21lc3NhZ2VzIHRvIHRoZSBzeXN0ZW0gb3Igc2Vzc2lvbiBidXNlcyByZXNwZWN0aXZlbHkuICBJZiBuZWl0aGVyIGlzCitzcGVjaWZpZWQsIFxmSWRidXMtc2VuZFxmUCBzZW5kcyB0byB0aGUgc2Vzc2lvbiBidXMuCisKKy5QUCAKK05lYXJseSBhbGwgdXNlcyBvZiBcZklkYnVzLXNlbmRcZlAgbXVzdCBwcm92aWRlIHRoZSBcLVwtZGVzdCBhcmd1bWVudAord2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBjb25uZWN0aW9uIG9uIHRoZSBidXMgdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gSWYKK1wtXC1kZXN0IGlzIG9taXR0ZWQsIG5vIGRlc3RpbmF0aW9uIGlzIHNldC4KKworLlBQCitUaGUgb2JqZWN0IHBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQgbXVzdCBhbHdheXMgYmUKK3NwZWNpZmllZC4gRm9sbG93aW5nIGFyZ3VtZW50cywgaWYgYW55LCBhcmUgdGhlIG1lc3NhZ2UgY29udGVudHMKKyhtZXNzYWdlIGFyZ3VtZW50cykuICBUaGVzZSBhcmUgZ2l2ZW4gYXMgdHlwZS1zcGVjaWZpZWQgdmFsdWVzIGFuZCAKK21heSBpbmNsdWRlIGNvbnRhaW5lcnMgKGFycmF5cywgZGljdHMsIGFuZCB2YXJpYW50cykgYXMgZGVzY3JpYmVkIGJlbG93LgorCisubmYKKzxjb250ZW50cz4gICA6Oj0gPGl0ZW0+IHwgPGNvbnRhaW5lcj4gWyA8aXRlbT4gfCA8Y29udGFpbmVyPi4uLl0KKzxpdGVtPiAgICAgICA6Oj0gPHR5cGU+Ojx2YWx1ZT4KKzxjb250YWluZXI+ICA6Oj0gPGFycmF5PiB8IDxkaWN0PiB8IDx2YXJpYW50PgorPGFycmF5PiAgICAgIDo6PSBhcnJheTo8dHlwZT46PHZhbHVlPlssPHZhbHVlPi4uLl0gCis8ZGljdD4gICAgICAgOjo9IGRpY3Q6PHR5cGU+Ojx0eXBlPjo8a2V5Piw8dmFsdWU+Wyw8a2V5Piw8dmFsdWU+Li4uXQorPHZhcmlhbnQ+ICAgIDo6PSB2YXJpYW50Ojx0eXBlPjo8dmFsdWU+Cis8dHlwZT4gICAgICAgOjo9IHN0cmluZyB8IGludDE2IHwgdWludCAxNiB8IGludDMyIHwgdWludDMyIHwgaW50NjQgfCB1aW50NjQgfCBkb3VibGUgfCBieXRlIHwgYm9vbGVhbiB8IG9ianBhdGgKKy5maQorCitELUJ1cyBzdXBwb3J0cyBtb3JlIHR5cGVzIHRoYW4gdGhlc2UsIGJ1dCBcZklkYnVzLXNlbmRcZlAgY3VycmVudGx5Citkb2VzIG5vdC4gIEFsc28sIFxmSWRidXMtc2VuZFxmUCBkb2VzIG5vdCBwZXJtaXQgZW1wdHkgY29udGFpbmVycworb3IgbmVzdGVkIGNvbnRhaW5lcnMgKGUuZy4gYXJyYXlzIG9mIHZhcmlhbnRzKS4KKworLlBQCitIZXJlIGlzIGFuIGV4YW1wbGUgaW52b2NhdGlvbjoKKy5uZgorCisgIGRidXMtc2VuZCBcLVwtZGVzdD1vcmcuZnJlZWRlc2t0b3AuRXhhbXBsZU5hbWUgICAgICAgICAgICAgICBcXAorICAgICAgICAgICAgL29yZy9mcmVlZGVza3RvcC9zYW1wbGUvb2JqZWN0L25hbWUgICAgICAgICAgICAgIFxcCisgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuRXhhbXBsZUludGVyZmFjZS5FeGFtcGxlTWV0aG9kICAgXFwKKyAgICAgICAgICAgIGludDMyOjQ3IHN0cmluZzonaGVsbG8gd29ybGQnIGRvdWJsZTo2NS4zMiAgICAgICBcXAorICAgICAgICAgICAgYXJyYXk6c3RyaW5nOiIxc3QgaXRlbSIsIm5leHQgaXRlbSIsImxhc3QgaXRlbSIgIFxcCisgICAgICAgICAgICBkaWN0OnN0cmluZzppbnQzMjoib25lIiwxLCJ0d28iLDIsInRocmVlIiwzICAgICAgXFwKKyAgICAgICAgICAgIHZhcmlhbnQ6aW50MzI6LTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAgICAgb2JqcGF0aDovb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZSAKKworLmZpCisKK05vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIHNlcGFyYXRlZCBmcm9tIGEgbWV0aG9kIG9yIHNpZ25hbCAKK25hbWUgYnkgYSBkb3QsIHRob3VnaCBpbiB0aGUgYWN0dWFsIHByb3RvY29sIHRoZSBpbnRlcmZhY2UKK2FuZCB0aGUgaW50ZXJmYWNlIG1lbWJlciBhcmUgc2VwYXJhdGUgZmllbGRzLgorCisuU0ggT1BUSU9OUworVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisuVFAKKy5JICItLWRlc3Q9TkFNRSIKK1NwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZS4KKy5UUAorLkkgIi0tcHJpbnQtcmVwbHkiCitCbG9jayBmb3IgYSByZXBseSB0byB0aGUgbWVzc2FnZSBzZW50LCBhbmQgcHJpbnQgYW55IHJlcGx5IHJlY2VpdmVkLgorLlRQCisuSSAiLS1zeXN0ZW0iCitTZW5kIHRvIHRoZSBzeXN0ZW0gbWVzc2FnZSBidXMuCisuVFAKKy5JICItLXNlc3Npb24iCitTZW5kIHRvIHRoZSBzZXNzaW9uIG1lc3NhZ2UgYnVzLiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKQorLlRQCisuSSAiLS10eXBlPVRZUEUiCitTcGVjaWZ5ICJtZXRob2RfY2FsbCIgb3IgInNpZ25hbCIgKGRlZmF1bHRzIHRvICJzaWduYWwiKS4KKworLlNIIEFVVEhPUgorZGJ1cy1zZW5kIHdhcyB3cml0dGVuIGJ5IFBoaWxpcCBCbHVuZGVsbC4KKworLlNIIEJVR1MKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCBiL2RidXMtMS40LjEwL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc3MmYyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5odG1sCkBAIC0wLDAgKzEsMjQ2NCBAQAorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PHRpdGxlPkQtQnVzIFNwZWNpZmljYXRpb248L3RpdGxlPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzUuMiI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJhcnRpY2xlIiB0aXRsZT0iRC1CdXMgU3BlY2lmaWNhdGlvbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iaW5kZXgiPjwvYT5ELUJ1cyBTcGVjaWZpY2F0aW9uPC9oMj48L2Rpdj48ZGl2PjxkaXYgY2xhc3M9ImF1dGhvcmdyb3VwIj48ZGl2IGNsYXNzPSJhdXRob3IiPjxoMyBjbGFzcz0iYXV0aG9yIj48c3BhbiBjbGFzcz0iZmlyc3RuYW1lIj5IYXZvYzwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPlBlbm5pbmd0b248L3NwYW4+PC9oMz48ZGl2IGNsYXNzPSJhZmZpbGlhdGlvbiI+PHNwYW4gY2xhc3M9Im9yZ25hbWUiPlJlZCBIYXQsIEluYy48YnI+PC9zcGFuPjxkaXYgY2xhc3M9ImFkZHJlc3MiPjxwPjxicj4KKwmgoKCgPGNvZGUgY2xhc3M9ImVtYWlsIj4mbHQ7PGEgY2xhc3M9ImVtYWlsIiBocmVmPSJtYWlsdG86aHBAcG9ib3guY29tIj5ocEBwb2JveC5jb208L2E+Jmd0OzwvY29kZT48YnI+CisJoKA8L3A+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYXV0aG9yIj48aDMgY2xhc3M9ImF1dGhvciI+PHNwYW4gY2xhc3M9ImZpcnN0bmFtZSI+QW5kZXJzPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3VybmFtZSI+Q2FybHNzb248L3NwYW4+PC9oMz48ZGl2IGNsYXNzPSJhZmZpbGlhdGlvbiI+PHNwYW4gY2xhc3M9Im9yZ25hbWUiPkNvZGVGYWN0b3J5IEFCPGJyPjwvc3Bhbj48ZGl2IGNsYXNzPSJhZGRyZXNzIj48cD48YnI+CiugoKCgoKCgoKCgoKA8Y29kZSBjbGFzcz0iZW1haWwiPiZsdDs8YSBjbGFzcz0iZW1haWwiIGhyZWY9Im1haWx0bzphbmRlcnNjYUBjb2RlZmFjdG9yeS5zZSI+YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U8L2E+Jmd0OzwvY29kZT48YnI+CiugoKCgoKCgoKCgPC9wPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImF1dGhvciI+PGgzIGNsYXNzPSJhdXRob3IiPjxzcGFuIGNsYXNzPSJmaXJzdG5hbWUiPkFsZXhhbmRlcjwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPkxhcnNzb248L3NwYW4+PC9oMz48ZGl2IGNsYXNzPSJhZmZpbGlhdGlvbiI+PHNwYW4gY2xhc3M9Im9yZ25hbWUiPlJlZCBIYXQsIEluYy48YnI+PC9zcGFuPjxkaXYgY2xhc3M9ImFkZHJlc3MiPjxwPjxicj4KK6CgoKCgoKCgoKCgoDxjb2RlIGNsYXNzPSJlbWFpbCI+Jmx0OzxhIGNsYXNzPSJlbWFpbCIgaHJlZj0ibWFpbHRvOmFsZXhsQHJlZGhhdC5jb20iPmFsZXhsQHJlZGhhdC5jb208L2E+Jmd0OzwvY29kZT48YnI+CiugoKCgoKCgoKCgPC9wPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImF1dGhvciI+PGgzIGNsYXNzPSJhdXRob3IiPjxzcGFuIGNsYXNzPSJmaXJzdG5hbWUiPlN2ZW48L3NwYW4+IDxzcGFuIGNsYXNzPSJzdXJuYW1lIj5IZXJ6YmVyZzwvc3Bhbj48L2gzPjxkaXYgY2xhc3M9ImFmZmlsaWF0aW9uIj48c3BhbiBjbGFzcz0ib3JnbmFtZSI+SW1lbmRpbyBBQjxicj48L3NwYW4+PGRpdiBjbGFzcz0iYWRkcmVzcyI+PHA+PGJyPgoroKCgoKCgoKCgoKCgPGNvZGUgY2xhc3M9ImVtYWlsIj4mbHQ7PGEgY2xhc3M9ImVtYWlsIiBocmVmPSJtYWlsdG86c3ZlbkBpbWVuZGlvLmNvbSI+c3ZlbkBpbWVuZGlvLmNvbTwvYT4mZ3Q7PC9jb2RlPjxicj4KK6CgoKCgoKCgoKA8L3A+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdj48cCBjbGFzcz0icmVsZWFzZWluZm8iPlZlcnNpb24gMC4xNTwvcD48L2Rpdj48ZGl2PjxkaXYgY2xhc3M9InJldmhpc3RvcnkiPjx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBzdW1tYXJ5PSJSZXZpc2lvbiBoaXN0b3J5Ij48dHI+PHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgY29sc3Bhbj0iMyI+PGI+UmV2aXNpb24gSGlzdG9yeTwvYj48L3RoPjwvdHI+PHRyPjx0ZCBhbGlnbj0ibGVmdCI+UmV2aXNpb24gY3VycmVudDwvdGQ+PHRkIGFsaWduPSJsZWZ0Ij48YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9kYnVzL2RidXMvbG9nL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sIiB0YXJnZXQ9Il90b3AiPmNvbW1pdCBsb2c8L2E+PC90ZD48dGQgYWxpZ249ImxlZnQiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIzIj48L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj0ibGVmdCI+UmV2aXNpb24gMC4xNTwvdGQ+PHRkIGFsaWduPSJsZWZ0Ij4zIE5vdmVtYmVyIDIwMTA8L3RkPjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD48L3RyPjx0cj48dGQgYWxpZ249ImxlZnQiIGNvbHNwYW49IjMiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0Ij5SZXZpc2lvbiAwLjE0PC90ZD48dGQgYWxpZ249ImxlZnQiPjEyIE1heSAyMDEwPC90ZD48dGQgYWxpZ249ImxlZnQiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIzIj48L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj0ibGVmdCI+UmV2aXNpb24gMC4xMzwvdGQ+PHRkIGFsaWduPSJsZWZ0Ij4yMyBEZXplbWJlciAyMDA5PC90ZD48dGQgYWxpZ249ImxlZnQiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIzIj48L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj0ibGVmdCI+UmV2aXNpb24gMC4xMjwvdGQ+PHRkIGFsaWduPSJsZWZ0Ij43IE5vdmVtYmVyLCAyMDA2PC90ZD48dGQgYWxpZ249ImxlZnQiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIzIj48L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj0ibGVmdCI+UmV2aXNpb24gMC4xMTwvdGQ+PHRkIGFsaWduPSJsZWZ0Ij42IEZlYnJ1YXJ5IDIwMDU8L3RkPjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD48L3RyPjx0cj48dGQgYWxpZ249ImxlZnQiIGNvbHNwYW49IjMiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0Ij5SZXZpc2lvbiAwLjEwPC90ZD48dGQgYWxpZ249ImxlZnQiPjI4IEphbnVhcnkgMjAwNTwvdGQ+PHRkIGFsaWduPSJsZWZ0Ij48L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMyI+PC90ZD48L3RyPjx0cj48dGQgYWxpZ249ImxlZnQiPlJldmlzaW9uIDAuOTwvdGQ+PHRkIGFsaWduPSJsZWZ0Ij43IEphbnVhciAyMDA1PC90ZD48dGQgYWxpZ249ImxlZnQiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIzIj48L3RkPjwvdHI+PHRyPjx0ZCBhbGlnbj0ibGVmdCI+UmV2aXNpb24gMC44PC90ZD48dGQgYWxpZ249ImxlZnQiPjA2IFNlcHRlbWJlciAyMDAzPC90ZD48dGQgYWxpZ249ImxlZnQiPjwvdGQ+PC90cj48dHI+PHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIzIj5GaXJzdCByZWxlYXNlZCBkb2N1bWVudC48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2Rpdj48L2Rpdj48aHI+PC9kaXY+PGRpdiBjbGFzcz0idG9jIj48cD48Yj5UYWJsZSBvZiBDb250ZW50czwvYj48L3A+PGRsPjxkdD48c3BhbiBjbGFzcz0ic2VjdDEiPjxhIGhyZWY9IiNpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L3NwYW4+PC9kdD48ZGQ+PGRsPjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNzdGFiaWxpdHkiPlByb3RvY29sIGFuZCBTcGVjaWZpY2F0aW9uIFN0YWJpbGl0eTwvYT48L3NwYW4+PC9kdD48L2RsPjwvZGQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI21lc3NhZ2UtcHJvdG9jb2wiPk1lc3NhZ2UgUHJvdG9jb2w8L2E+PC9zcGFuPjwvZHQ+PGRkPjxkbD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjbWVzc2FnZS1wcm90b2NvbC1zaWduYXR1cmVzIj5UeXBlIFNpZ25hdHVyZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI21lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZyI+TWFyc2hhbGluZyAoV2lyZSBGb3JtYXQpPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzIj5NZXNzYWdlIEZvcm1hdDwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjbWVzc2FnZS1wcm90b2NvbC1uYW1lcyI+VmFsaWQgTmFtZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI21lc3NhZ2UtcHJvdG9jb2wtdHlwZXMiPk1lc3NhZ2UgVHlwZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI21lc3NhZ2UtcHJvdG9jb2wtaGFuZGxpbmctaW52YWxpZCI+SW52YWxpZCBQcm90b2NvbCBhbmQgU3BlYyBFeHRlbnNpb25zPC9hPjwvc3Bhbj48L2R0PjwvZGw+PC9kZD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QxIj48YSBocmVmPSIjYXV0aC1wcm90b2NvbCI+QXV0aGVudGljYXRpb24gUHJvdG9jb2w8L2E+PC9zcGFuPjwvZHQ+PGRkPjxkbD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYXV0aC1wcm90b2NvbC1vdmVydmlldyI+UHJvdG9jb2wgT3ZlcnZpZXc8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2F1dGgtbnVsLWJ5dGUiPlNwZWNpYWwgY3JlZGVudGlhbHMtcGFzc2luZyBudWwgYnl0ZTwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYXV0aC1jb21tYW5kLWF1dGgiPkFVVEggY29tbWFuZDwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYXV0aC1jb21tYW5kLWNhbmNlbCI+Q0FOQ0VMIENvbW1hbmQ8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2F1dGgtY29tbWFuZC1kYXRhIj5EQVRBIENvbW1hbmQ8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2F1dGgtY29tbWFuZC1iZWdpbiI+QkVHSU4gQ29tbWFuZDwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYXV0aC1jb21tYW5kLXJlamVjdGVkIj5SRUpFQ1RFRCBDb21tYW5kPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNhdXRoLWNvbW1hbmQtb2siPk9LIENvbW1hbmQ8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2F1dGgtY29tbWFuZC1lcnJvciI+RVJST1IgQ29tbWFuZDwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYXV0aC1jb21tYW5kLW5lZ290aWF0ZS11bml4LWZkIj5ORUdPVElBVEVfVU5JWF9GRCBDb21tYW5kPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNhdXRoLWNvbW1hbmQtYWdyZWUtdW5peC1mZCI+QUdSRUVfVU5JWF9GRCBDb21tYW5kPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNhdXRoLWNvbW1hbmQtZnV0dXJlIj5GdXR1cmUgRXh0ZW5zaW9uczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYXV0aC1leGFtcGxlcyI+QXV0aGVudGljYXRpb24gZXhhbXBsZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2F1dGgtc3RhdGVzIj5BdXRoZW50aWNhdGlvbiBzdGF0ZSBkaWFncmFtczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYXV0aC1tZWNoYW5pc21zIj5BdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zPC9hPjwvc3Bhbj48L2R0PjwvZGw+PC9kZD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QxIj48YSBocmVmPSIjYWRkcmVzc2VzIj5TZXJ2ZXIgQWRkcmVzc2VzPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDEiPjxhIGhyZWY9IiN0cmFuc3BvcnRzIj5UcmFuc3BvcnRzPC9hPjwvc3Bhbj48L2R0PjxkZD48ZGw+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI3RyYW5zcG9ydHMtdW5peC1kb21haW4tc29ja2V0cyI+VW5peCBEb21haW4gU29ja2V0czwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjdHJhbnNwb3J0cy1sYXVuY2hkIj5sYXVuY2hkPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiN0cmFuc3BvcnRzLXRjcC1zb2NrZXRzIj5UQ1AgU29ja2V0czwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjdHJhbnNwb3J0cy1ub25jZS10Y3Atc29ja2V0cyI+Tm9uY2Utc2VjdXJlZCBUQ1AgU29ja2V0czwvYT48L3NwYW4+PC9kdD48L2RsPjwvZGQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI21ldGEtdHJhbnNwb3J0cyI+TWV0YSBUcmFuc3BvcnRzPC9hPjwvc3Bhbj48L2R0PjxkZD48ZGw+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI21ldGEtdHJhbnNwb3J0cy1hdXRvbGF1bmNoIj5BdXRvbGF1bmNoPC9hPjwvc3Bhbj48L2R0PjwvZGw+PC9kZD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QxIj48YSBocmVmPSIjbmFtaW5nLWNvbnZlbnRpb25zIj5OYW1pbmcgQ29udmVudGlvbnM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI3V1aWRzIj5VVUlEczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QxIj48YSBocmVmPSIjc3RhbmRhcmQtaW50ZXJmYWNlcyI+U3RhbmRhcmQgSW50ZXJmYWNlczwvYT48L3NwYW4+PC9kdD48ZGQ+PGRsPjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNzdGFuZGFyZC1pbnRlcmZhY2VzLXBlZXIiPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyPC9jb2RlPjwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjc3RhbmRhcmQtaW50ZXJmYWNlcy1pbnRyb3NwZWN0YWJsZSI+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlPC9jb2RlPjwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjc3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzIj48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllczwvY29kZT48L2E+PC9zcGFuPjwvZHQ+PC9kbD48L2RkPjxkdD48c3BhbiBjbGFzcz0ic2VjdDEiPjxhIGhyZWY9IiNpbnRyb3NwZWN0aW9uLWZvcm1hdCI+SW50cm9zcGVjdGlvbiBEYXRhIEZvcm1hdDwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QxIj48YSBocmVmPSIjbWVzc2FnZS1idXMiPk1lc3NhZ2UgQnVzIFNwZWNpZmljYXRpb248L2E+PC9zcGFuPjwvZHQ+PGRkPjxkbD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjbWVzc2FnZS1idXMtb3ZlcnZpZXciPk1lc3NhZ2UgQnVzIE92ZXJ2aWV3PC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNtZXNzYWdlLWJ1cy1uYW1lcyI+TWVzc2FnZSBCdXMgTmFtZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI21lc3NhZ2UtYnVzLXJvdXRpbmciPk1lc3NhZ2UgQnVzIE1lc3NhZ2UgUm91dGluZzwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjbWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXMiPk1lc3NhZ2UgQnVzIFN0YXJ0aW5nIFNlcnZpY2VzPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNtZXNzYWdlLWJ1cy10eXBlcyI+V2VsbC1rbm93biBNZXNzYWdlIEJ1cyBJbnN0YW5jZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI21lc3NhZ2UtYnVzLW1lc3NhZ2VzIj5NZXNzYWdlIEJ1cyBNZXNzYWdlczwvYT48L3NwYW4+PC9kdD48L2RsPjwvZGQ+PGR0PjxzcGFuIGNsYXNzPSJnbG9zc2FyeSI+PGEgaHJlZj0iI2lkcDU3ODg5OTIiPkdsb3NzYXJ5PC9hPjwvc3Bhbj48L2R0PjwvZGw+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJJbnRyb2R1Y3Rpb24iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iaW50cm9kdWN0aW9uIj48L2E+SW50cm9kdWN0aW9uPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIEQtQnVzIGlzIGEgc3lzdGVtIGZvciBsb3ctbGF0ZW5jeSwgbG93LW92ZXJoZWFkLCBlYXN5IHRvIHVzZQorICAgICAgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gKElQQykuIEluIG1vcmUgZGV0YWlsOgorICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgRC1CdXMgaXMgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+bG93LWxhdGVuY3k8L2VtPjwvc3Bhbj4gYmVjYXVzZSBpdCBpcyBkZXNpZ25lZCAKKyAgICAgICAgICAgIHRvIGF2b2lkIHJvdW5kIHRyaXBzIGFuZCBhbGxvdyBhc3luY2hyb25vdXMgb3BlcmF0aW9uLCBtdWNoIGxpa2UgCisgICAgICAgICAgICB0aGUgWCBwcm90b2NvbC4KKyAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgIEQtQnVzIGlzIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPmxvdy1vdmVyaGVhZDwvZW0+PC9zcGFuPiBiZWNhdXNlIGl0IHVzZXMgYQorICAgICAgICAgICAgYmluYXJ5IHByb3RvY29sLCBhbmQgZG9lcyBub3QgaGF2ZSB0byBjb252ZXJ0IHRvIGFuZCBmcm9tIGEgdGV4dAorICAgICAgICAgICAgZm9ybWF0IHN1Y2ggYXMgWE1MLiBCZWNhdXNlIEQtQnVzIGlzIGludGVuZGVkIGZvciBwb3RlbnRpYWxseQorICAgICAgICAgICAgaGlnaC1yZXNvbHV0aW9uIHNhbWUtbWFjaGluZSBJUEMsIG5vdCBwcmltYXJpbHkgZm9yIEludGVybmV0IElQQywKKyAgICAgICAgICAgIHRoaXMgaXMgYW4gaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9uLgorICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgRC1CdXMgaXMgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+ZWFzeSB0byB1c2U8L2VtPjwvc3Bhbj4gYmVjYXVzZSBpdCB3b3JrcyBpbiB0ZXJtcworICAgICAgICAgICAgb2YgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm1lc3NhZ2VzPC9lbT4gcmF0aGVyIHRoYW4gYnl0ZSBzdHJlYW1zLCBhbmQKKyAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBhIGxvdCBvZiB0aGUgaGFyZCBJUEMgaXNzdWVzLiBBbHNvLCB0aGUgRC1CdXMKKyAgICAgICAgICAgIGxpYnJhcnkgaXMgZGVzaWduZWQgdG8gYmUgd3JhcHBlZCBpbiBhIHdheSB0aGF0IGxldHMgZGV2ZWxvcGVycyB1c2UKKyAgICAgICAgICAgIHRoZWlyIGZyYW1ld29yaydzIGV4aXN0aW5nIG9iamVjdC90eXBlIHN5c3RlbSwgcmF0aGVyIHRoYW4gbGVhcm5pbmcKKyAgICAgICAgICAgIGEgbmV3IG9uZSBzcGVjaWZpY2FsbHkgZm9yIElQQy4KKyAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgIDwvcD48cD4KKyAgICAgIFRoZSBiYXNlIEQtQnVzIHByb3RvY29sIGlzIGEgb25lLXRvLW9uZSAocGVlci10by1wZWVyIG9yIGNsaWVudC1zZXJ2ZXIpCisgICAgICBwcm90b2NvbCwgc3BlY2lmaWVkIGluIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjbWVzc2FnZS1wcm90b2NvbCIgdGl0bGU9Ik1lc3NhZ2UgUHJvdG9jb2wiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7TWVzc2FnZSBQcm90b2NvbCYjODIyMTs8L2E+LiBUaGF0IGlzLCBpdCBpcworICAgICAgYSBzeXN0ZW0gZm9yIG9uZSBhcHBsaWNhdGlvbiB0byB0YWxrIHRvIGEgc2luZ2xlIG90aGVyCisgICAgICBhcHBsaWNhdGlvbi4gSG93ZXZlciwgdGhlIHByaW1hcnkgaW50ZW5kZWQgYXBwbGljYXRpb24gb2YgdGhlIHByb3RvY29sIGlzIHRoZQorICAgICAgRC1CdXMgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm1lc3NhZ2UgYnVzPC9lbT4sIHNwZWNpZmllZCBpbiA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI21lc3NhZ2UtYnVzIiB0aXRsZT0iTWVzc2FnZSBCdXMgU3BlY2lmaWNhdGlvbiI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtNZXNzYWdlIEJ1cyBTcGVjaWZpY2F0aW9uJiM4MjIxOzwvYT4uIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNwZWNpYWwgYXBwbGljYXRpb24gdGhhdAorICAgICAgYWNjZXB0cyBjb25uZWN0aW9ucyBmcm9tIG11bHRpcGxlIG90aGVyIGFwcGxpY2F0aW9ucywgYW5kIGZvcndhcmRzCisgICAgICBtZXNzYWdlcyBhbW9uZyB0aGVtLgorICAgIDwvcD48cD4KKyAgICAgIFVzZXMgb2YgRC1CdXMgaW5jbHVkZSBub3RpZmljYXRpb24gb2Ygc3lzdGVtIGNoYW5nZXMgKG5vdGlmaWNhdGlvbiBvZiB3aGVuCisgICAgICBhIGNhbWVyYSBpcyBwbHVnZ2VkIGluIHRvIGEgY29tcHV0ZXIsIG9yIGEgbmV3IHZlcnNpb24gb2Ygc29tZSBzb2Z0d2FyZQorICAgICAgaGFzIGJlZW4gaW5zdGFsbGVkKSwgb3IgZGVza3RvcCBpbnRlcm9wZXJhYmlsaXR5LCBmb3IgZXhhbXBsZSBhIGZpbGUKKyAgICAgIG1vbml0b3Jpbmcgc2VydmljZSBvciBhIGNvbmZpZ3VyYXRpb24gc2VydmljZS4KKyAgICA8L3A+PHA+CisgICAgICBELUJ1cyBpcyBkZXNpZ25lZCBmb3IgdHdvIHNwZWNpZmljIHVzZSBjYXNlczoKKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgIEEgInN5c3RlbSBidXMiIGZvciBub3RpZmljYXRpb25zIGZyb20gdGhlIHN5c3RlbSB0byB1c2VyIHNlc3Npb25zLAorICAgICAgICAgICAgYW5kIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gcmVxdWVzdCBpbnB1dCBmcm9tIHVzZXIgc2Vzc2lvbnMuCisgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICBBICJzZXNzaW9uIGJ1cyIgdXNlZCB0byBpbXBsZW1lbnQgZGVza3RvcCBlbnZpcm9ubWVudHMgc3VjaCBhcyAKKyAgICAgICAgICAgIEdOT01FIGFuZCBLREUuCisgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKyAgICAgIEQtQnVzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIGdlbmVyaWMgSVBDIHN5c3RlbSBmb3IgYW55IHBvc3NpYmxlIAorICAgICAgYXBwbGljYXRpb24sIGFuZCBpbnRlbnRpb25hbGx5IG9taXRzIG1hbnkgZmVhdHVyZXMgZm91bmQgaW4gb3RoZXIgCisgICAgICBJUEMgc3lzdGVtcyBmb3IgdGhpcyByZWFzb24uCisgICAgPC9wPjxwPgorICAgICAgQXQgdGhlIHNhbWUgdGltZSwgdGhlIGJ1cyBkYWVtb25zIG9mZmVyIGEgbnVtYmVyIG9mIGZlYXR1cmVzIG5vdCBmb3VuZCBpbgorICAgICAgb3RoZXIgSVBDIHN5c3RlbXMsIHN1Y2ggYXMgc2luZ2xlLW93bmVyICJidXMgbmFtZXMiIChzaW1pbGFyIHRvIFgKKyAgICAgIHNlbGVjdGlvbnMpLCBvbi1kZW1hbmQgc3RhcnR1cCBvZiBzZXJ2aWNlcywgYW5kIHNlY3VyaXR5IHBvbGljaWVzLgorICAgICAgSW4gbWFueSB3YXlzLCB0aGVzZSBmZWF0dXJlcyBhcmUgdGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3IgZGV2ZWxvcGluZyAKKyAgICAgIEQtQnVzOyBvdGhlciBzeXN0ZW1zIHdvdWxkIGhhdmUgc3VmZmljZWQgaWYgSVBDIHdlcmUgdGhlIG9ubHkgZ29hbC4KKyAgICA8L3A+PHA+CisgICAgICBELUJ1cyBtYXkgdHVybiBvdXQgdG8gYmUgdXNlZnVsIGluIHVuYW50aWNpcGF0ZWQgYXBwbGljYXRpb25zLCBidXQgZnV0dXJlCisgICAgICB2ZXJzaW9ucyBvZiB0aGlzIHNwZWMgYW5kIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcHJvYmFibHkgd2lsbCBub3QKKyAgICAgIGluY29ycG9yYXRlIGZlYXR1cmVzIHRoYXQgaW50ZXJmZXJlIHdpdGggdGhlIGNvcmUgdXNlIGNhc2VzLgorICAgIDwvcD48cD4KKyAgICAgIFRoZSBrZXkgd29yZHMgIk1VU1QiLCAiTVVTVCBOT1QiLCAiUkVRVUlSRUQiLCAiU0hBTEwiLCAiU0hBTEwgTk9UIiwKKyAgICAgICJTSE9VTEQiLCAiU0hPVUxEIE5PVCIsICJSRUNPTU1FTkRFRCIsICJNQVkiLCBhbmQgIk9QVElPTkFMIiBpbiB0aGlzCisgICAgICBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFJGQyAyMTE5LiBIb3dldmVyLCB0aGUKKyAgICAgIGRvY3VtZW50IGNvdWxkIHVzZSBhIHNlcmlvdXMgYXVkaXQgdG8gYmUgc3VyZSBpdCBtYWtlcyBzZW5zZSB0byBkbworICAgICAgc28uIEFsc28sIHRoZXkgYXJlIG5vdCBjYXBpdGFsaXplZC4KKyAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJQcm90b2NvbCBhbmQgU3BlY2lmaWNhdGlvbiBTdGFiaWxpdHkiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9InN0YWJpbGl0eSI+PC9hPlByb3RvY29sIGFuZCBTcGVjaWZpY2F0aW9uIFN0YWJpbGl0eTwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoZSBELUJ1cyBwcm90b2NvbCBpcyBmcm96ZW4gKG9ubHkgY29tcGF0aWJsZSBleHRlbnNpb25zIGFyZSBhbGxvd2VkKSBhcworICAgICAgICBvZiBOb3ZlbWJlciA4LCAyMDA2LiAgSG93ZXZlciwgdGhpcyBzcGVjaWZpY2F0aW9uIGNvdWxkIHN0aWxsIHVzZSBhIGZhaXIKKyAgICAgICAgYml0IG9mIHdvcmsgdG8gbWFrZSBpbnRlcm9wZXJhYmxlIHJlaW1wbGVtZW50YXRpb24gcG9zc2libGUgd2l0aG91dAorICAgICAgICByZWZlcmVuY2UgdG8gdGhlIEQtQnVzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4gVGh1cywgdGhpcworICAgICAgICBzcGVjaWZpY2F0aW9uIGlzIG5vdCBtYXJrZWQgMS4wLiBUbyBtYXJrIGl0IDEuMCwgd2UnZCBsaWtlIHRvIHNlZQorICAgICAgICBzb21lb25lIGludmVzdCBzaWduaWZpY2FudCBlZmZvcnQgaW4gY2xhcmlmeWluZyB0aGUgc3BlY2lmaWNhdGlvbgorICAgICAgICBsYW5ndWFnZSwgYW5kIGdyb3dpbmcgdGhlIHNwZWNpZmljYXRpb24gdG8gY292ZXIgbW9yZSBhc3BlY3RzIG9mIHRoZQorICAgICAgICByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24ncyBiZWhhdmlvci4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVW50aWwgdGhpcyB3b3JrIGlzIGNvbXBsZXRlLCBhbnkgYXR0ZW1wdCB0byByZWltcGxlbWVudCBELUJ1cyB3aWxsIAorICAgICAgICBwcm9iYWJseSByZXF1aXJlIGxvb2tpbmcgYXQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhbmQvb3IgYXNraW5nCisgICAgICAgIHF1ZXN0aW9ucyBvbiB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IGFib3V0IGludGVuZGVkIGJlaGF2aW9yLiAKKyAgICAgICAgUXVlc3Rpb25zIG9uIHRoZSBsaXN0IGFyZSB2ZXJ5IHdlbGNvbWUuCisgICAgICA8L3A+PHA+CisgICAgICAgIE5vbmV0aGVsZXNzLCB0aGlzIGRvY3VtZW50IHNob3VsZCBiZSBhIHVzZWZ1bCBzdGFydGluZyBwb2ludCBhbmQgaXMgCisgICAgICAgIHRvIG91ciBrbm93bGVkZ2UgYWNjdXJhdGUsIHRob3VnaCBpbmNvbXBsZXRlLgorICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iTWVzc2FnZSBQcm90b2NvbCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJtZXNzYWdlLXByb3RvY29sIj48L2E+TWVzc2FnZSBQcm90b2NvbDwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBBIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5tZXNzYWdlPC9lbT4gY29uc2lzdHMgb2YgYQorICAgICAgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmhlYWRlcjwvZW0+IGFuZCBhIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5ib2R5PC9lbT4uIElmIHlvdQorICAgICAgdGhpbmsgb2YgYSBtZXNzYWdlIGFzIGEgcGFja2FnZSwgdGhlIGhlYWRlciBpcyB0aGUgYWRkcmVzcywgYW5kIHRoZSBib2R5CisgICAgICBjb250YWlucyB0aGUgcGFja2FnZSBjb250ZW50cy4gVGhlIG1lc3NhZ2UgZGVsaXZlcnkgc3lzdGVtIHVzZXMgdGhlIGhlYWRlcgorICAgICAgaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGVyZSB0byBzZW5kIHRoZSBtZXNzYWdlIGFuZCBob3cgdG8gaW50ZXJwcmV0CisgICAgICBpdDsgdGhlIHJlY2lwaWVudCBpbnRlcnByZXRzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorICAgIDwvcD48cD4KKyAgICAgIFRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIGlzIG1hZGUgdXAgb2YgemVybyBvciBtb3JlCisgICAgICA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+YXJndW1lbnRzPC9lbT4sIHdoaWNoIGFyZSB0eXBlZCB2YWx1ZXMsIHN1Y2ggYXMgYW4KKyAgICAgIGludGVnZXIgb3IgYSBieXRlIGFycmF5LgorICAgIDwvcD48cD4KKyAgICAgIEJvdGggaGVhZGVyIGFuZCBib2R5IHVzZSB0aGUgc2FtZSB0eXBlIHN5c3RlbSBhbmQgZm9ybWF0IGZvciAKKyAgICAgIHNlcmlhbGl6aW5nIGRhdGEuIEVhY2ggdHlwZSBvZiB2YWx1ZSBoYXMgYSB3aXJlIGZvcm1hdC4gCisgICAgICBDb252ZXJ0aW5nIGEgdmFsdWUgZnJvbSBzb21lIG90aGVyIHJlcHJlc2VudGF0aW9uIGludG8gdGhlIHdpcmUKKyAgICAgIGZvcm1hdCBpcyBjYWxsZWQgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm1hcnNoYWxpbmc8L2VtPiBhbmQgY29udmVydGluZworICAgICAgaXQgYmFjayBmcm9tIHRoZSB3aXJlIGZvcm1hdCBpcyA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+dW5tYXJzaGFsaW5nPC9lbT4uCisgICAgPC9wPjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iVHlwZSBTaWduYXR1cmVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZXNzYWdlLXByb3RvY29sLXNpZ25hdHVyZXMiPjwvYT5UeXBlIFNpZ25hdHVyZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBUaGUgRC1CdXMgcHJvdG9jb2wgZG9lcyBub3QgaW5jbHVkZSB0eXBlIHRhZ3MgaW4gdGhlIG1hcnNoYWxlZCBkYXRhOyBhCisgICAgICAgIGJsb2NrIG9mIG1hcnNoYWxlZCB2YWx1ZXMgbXVzdCBoYXZlIGEga25vd24gPGVtIGNsYXNzPSJmaXJzdHRlcm0iPnR5cGUKKyAgICAgICAgc2lnbmF0dXJlPC9lbT4uICBUaGUgdHlwZSBzaWduYXR1cmUgaXMgbWFkZSB1cCBvZiA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+dHlwZQorICAgICAgICBjb2RlczwvZW0+LiBBIHR5cGUgY29kZSBpcyBhbiBBU0NJSSBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICB0eXBlIG9mIGEgdmFsdWUuIEJlY2F1c2UgQVNDSUkgY2hhcmFjdGVycyBhcmUgdXNlZCwgdGhlIHR5cGUgc2lnbmF0dXJlCisgICAgICAgIHdpbGwgYWx3YXlzIGZvcm0gYSB2YWxpZCBBU0NJSSBzdHJpbmcuIEEgc2ltcGxlIHN0cmluZyBjb21wYXJlIAorICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHR5cGUgc2lnbmF0dXJlcyBhcmUgZXF1aXZhbGVudC4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgQXMgYSBzaW1wbGUgZXhhbXBsZSwgdGhlIHR5cGUgY29kZSBmb3IgMzItYml0IGludGVnZXIgKDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlQzMjwvY29kZT4pIGlzCisgICAgICAgIHRoZSBBU0NJSSBjaGFyYWN0ZXIgJ2knLiBTbyB0aGUgc2lnbmF0dXJlIGZvciBhIGJsb2NrIG9mIHZhbHVlcyAKKyAgICAgICAgY29udGFpbmluZyBhIHNpbmdsZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+SU5UMzI8L2NvZGU+IHdvdWxkIGJlOgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICJpIgorICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgQSBibG9jayBvZiB2YWx1ZXMgY29udGFpbmluZyB0d28gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVDMyPC9jb2RlPiB3b3VsZCBoYXZlIHRoaXMgc2lnbmF0dXJlOgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICJpaSIKKyAgICAgICAgPC9wcmU+PHA+ICAgICAgICAKKyAgICAgIDwvcD48cD4KKyAgICAgICAgQWxsIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5iYXNpYzwvZW0+IHR5cGVzIHdvcmsgbGlrZSAKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVDMyPC9jb2RlPiBpbiB0aGlzIGV4YW1wbGUuIFRvIG1hcnNoYWwgYW5kIHVubWFyc2hhbCAKKyAgICAgICAgYmFzaWMgdHlwZXMsIHlvdSBzaW1wbHkgcmVhZCBvbmUgdmFsdWUgZnJvbSB0aGUgZGF0YQorICAgICAgICBibG9jayBjb3JyZXNwb25kaW5nIHRvIGVhY2ggdHlwZSBjb2RlIGluIHRoZSBzaWduYXR1cmUuCisgICAgICAgIEluIGFkZGl0aW9uIHRvIGJhc2ljIHR5cGVzLCB0aGVyZSBhcmUgZm91ciA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+Y29udGFpbmVyPC9lbT4gCisgICAgICAgIHR5cGVzOiA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U1RSVUNUPC9jb2RlPiwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkFSUkFZPC9jb2RlPiwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlZBUklBTlQ8L2NvZGU+LCAKKyAgICAgICAgYW5kIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5ESUNUX0VOVFJZPC9jb2RlPi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNUUlVDVDwvY29kZT4gaGFzIGEgdHlwZSBjb2RlLCBBU0NJSSBjaGFyYWN0ZXIgJ3InLCBidXQgdGhpcyB0eXBlIAorICAgICAgICBjb2RlIGRvZXMgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzLiBJbnN0ZWFkLCBBU0NJSSBjaGFyYWN0ZXJzCisgICAgICAgICcoJyBhbmQgJyknIGFyZSB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBzdHJ1Y3QuCisgICAgICAgIFNvIGZvciBleGFtcGxlLCBhIHN0cnVjdCBjb250YWluaW5nIHR3byBpbnRlZ2VycyB3b3VsZCBoYXZlIHRoaXMgCisgICAgICAgIHNpZ25hdHVyZToKKyAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAiKGlpKSIKKyAgICAgICAgPC9wcmU+PHA+CisgICAgICAgIFN0cnVjdHMgY2FuIGJlIG5lc3RlZCwgc28gZm9yIGV4YW1wbGUgYSBzdHJ1Y3QgY29udGFpbmluZyAKKyAgICAgICAgYW4gaW50ZWdlciBhbmQgYW5vdGhlciBzdHJ1Y3Q6CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgIihpKGlpKSkiCisgICAgICAgIDwvcHJlPjxwPgorICAgICAgICBUaGUgdmFsdWUgYmxvY2sgc3RvcmluZyB0aGF0IHN0cnVjdCB3b3VsZCBjb250YWluIHRocmVlIGludGVnZXJzOyB0aGUKKyAgICAgICAgdHlwZSBzaWduYXR1cmUgYWxsb3dzIHlvdSB0byBkaXN0aW5ndWlzaCAiKGkoaWkpKSIgZnJvbSAiKChpaSlpKSIgb3IKKyAgICAgICAgIihpaWkpIiBvciAiaWlpIi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJVQ1Q8L2NvZGU+IHR5cGUgY29kZSAncicgaXMgbm90IGN1cnJlbnRseSB1c2VkIGluIHRoZSBELUJ1cyBwcm90b2NvbCwKKyAgICAgICAgYnV0IGlzIHVzZWZ1bCBpbiBjb2RlIHRoYXQgaW1wbGVtZW50cyB0aGUgcHJvdG9jb2wuIFRoaXMgdHlwZSBjb2RlIAorICAgICAgICBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgc3VjaCBjb2RlIHRvIGludGVyb3BlcmF0ZSBpbiBub24tcHJvdG9jb2wgY29udGV4dHMuCisgICAgICA8L3A+PHA+CisgICAgICAgIEVtcHR5IHN0cnVjdHVyZXMgYXJlIG5vdCBhbGxvd2VkOyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZQorICAgICAgICB0eXBlIGNvZGUgYmV0d2VlbiB0aGUgcGFyZW50aGVzZXMuCisgICAgICA8L3A+PHA+CisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5BUlJBWTwvY29kZT4gaGFzIEFTQ0lJIGNoYXJhY3RlciAnYScgYXMgdHlwZSBjb2RlLiBUaGUgYXJyYXkgdHlwZSBjb2RlIG11c3QgYmUKKyAgICAgICAgZm9sbG93ZWQgYnkgYSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+c2luZ2xlIGNvbXBsZXRlIHR5cGU8L2VtPi4gVGhlIHNpbmdsZQorICAgICAgICBjb21wbGV0ZSB0eXBlIGZvbGxvd2luZyB0aGUgYXJyYXkgaXMgdGhlIHR5cGUgb2YgZWFjaCBhcnJheSBlbGVtZW50LiBTbworICAgICAgICB0aGUgc2ltcGxlIGV4YW1wbGUgaXM6CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgImFpIgorICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgd2hpY2ggaXMgYW4gYXJyYXkgb2YgMzItYml0IGludGVnZXJzLiBCdXQgYW4gYXJyYXkgY2FuIGJlIG9mIGFueSB0eXBlLCAKKyAgICAgICAgc3VjaCBhcyB0aGlzIGFycmF5LW9mLXN0cnVjdC13aXRoLXR3by1pbnQzMi1maWVsZHM6CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgImEoaWkpIgorICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgT3IgdGhpcyBhcnJheSBvZiBhcnJheSBvZiBpbnRlZ2VyOgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICJhYWkiCisgICAgICAgIDwvcHJlPjxwPgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgcGhyYXNlIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5zaW5nbGUgY29tcGxldGUgdHlwZTwvZW0+IGRlc2VydmVzIHNvbWUgCisgICAgICAgIGRlZmluaXRpb24uIEEgc2luZ2xlIGNvbXBsZXRlIHR5cGUgaXMgYSBiYXNpYyB0eXBlIGNvZGUsIGEgdmFyaWFudCB0eXBlIGNvZGUsIAorICAgICAgICBhbiBhcnJheSB3aXRoIGl0cyBlbGVtZW50IHR5cGUsIG9yIGEgc3RydWN0IHdpdGggaXRzIGZpZWxkcy4gCisgICAgICAgIFNvIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlcyBhcmUgbm90IHNpbmdsZSBjb21wbGV0ZSB0eXBlczoKKyAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAiYWEiCisgICAgICAgIDwvcHJlPjxwPgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICIoaWkiCisgICAgICAgIDwvcHJlPjxwPgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICJpaSkiCisgICAgICAgIDwvcHJlPjxwPgorICAgICAgICBBbmQgdGhlIGZvbGxvd2luZyBzaWduYXR1cmVzIGNvbnRhaW4gbXVsdGlwbGUgY29tcGxldGUgdHlwZXM6CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgImlpIgorICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAiYWlhaSIKKyAgICAgICAgPC9wcmU+PHA+CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgIihpaSkoaWkpIgorICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgTm90ZSBob3dldmVyIHRoYXQgYSBzaW5nbGUgY29tcGxldGUgdHlwZSBtYXkgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+Y29udGFpbjwvZW0+PC9zcGFuPgorICAgICAgICBtdWx0aXBsZSBvdGhlciBzaW5nbGUgY29tcGxldGUgdHlwZXMuCisgICAgICA8L3A+PHA+CisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5WQVJJQU5UPC9jb2RlPiBoYXMgQVNDSUkgY2hhcmFjdGVyICd2JyBhcyBpdHMgdHlwZSBjb2RlLiBBIG1hcnNoYWxlZCB2YWx1ZSBvZgorICAgICAgICB0eXBlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5WQVJJQU5UPC9jb2RlPiB3aWxsIGhhdmUgdGhlIHNpZ25hdHVyZSBvZiBhIHNpbmdsZSBjb21wbGV0ZSB0eXBlIGFzIHBhcnQKKyAgICAgICAgb2YgdGhlIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPnZhbHVlPC9lbT48L3NwYW4+LiAgVGhpcyBzaWduYXR1cmUgd2lsbCBiZSBmb2xsb3dlZCBieSBhCisgICAgICAgIG1hcnNoYWxlZCB2YWx1ZSBvZiB0aGF0IHR5cGUuCisgICAgICA8L3A+PHA+CisgICAgICAgIEEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRJQ1RfRU5UUlk8L2NvZGU+IHdvcmtzIGV4YWN0bHkgbGlrZSBhIHN0cnVjdCwgYnV0IHJhdGhlcgorICAgICAgICB0aGFuIHBhcmVudGhlc2VzIGl0IHVzZXMgY3VybHkgYnJhY2VzLCBhbmQgaXQgaGFzIG1vcmUgcmVzdHJpY3Rpb25zLgorICAgICAgICBUaGUgcmVzdHJpY3Rpb25zIGFyZTogaXQgb2NjdXJzIG9ubHkgYXMgYW4gYXJyYXkgZWxlbWVudCB0eXBlOyBpdCBoYXMKKyAgICAgICAgZXhhY3RseSB0d28gc2luZ2xlIGNvbXBsZXRlIHR5cGVzIGluc2lkZSB0aGUgY3VybHkgYnJhY2VzOyB0aGUgZmlyc3QKKyAgICAgICAgc2luZ2xlIGNvbXBsZXRlIHR5cGUgKHRoZSAia2V5IikgbXVzdCBiZSBhIGJhc2ljIHR5cGUgcmF0aGVyIHRoYW4gYQorICAgICAgICBjb250YWluZXIgdHlwZS4gSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IGFjY2VwdCBkaWN0IGVudHJpZXMgb3V0c2lkZSBvZgorICAgICAgICBhcnJheXMsIG11c3Qgbm90IGFjY2VwdCBkaWN0IGVudHJpZXMgd2l0aCB6ZXJvLCBvbmUsIG9yIG1vcmUgdGhhbiB0d28KKyAgICAgICAgZmllbGRzLCBhbmQgbXVzdCBub3QgYWNjZXB0IGRpY3QgZW50cmllcyB3aXRoIG5vbi1iYXNpYy10eXBlZCBrZXlzLiBBCisgICAgICAgIGRpY3QgZW50cnkgaXMgYWx3YXlzIGEga2V5LXZhbHVlIHBhaXIuCisgICAgICA8L3A+PHA+CisgICAgICAgIFRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRJQ1RfRU5UUlk8L2NvZGU+IGlzIGFsd2F5cyB0aGUga2V5LgorICAgICAgICBBIG1lc3NhZ2UgaXMgY29uc2lkZXJlZCBjb3JydXB0IGlmIHRoZSBzYW1lIGtleSBvY2N1cnMgdHdpY2UgaW4gdGhlIHNhbWUKKyAgICAgICAgYXJyYXkgb2YgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRJQ1RfRU5UUlk8L2NvZGU+LiBIb3dldmVyLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucworICAgICAgICBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byByZWplY3QgZGljdHMgd2l0aCBkdXBsaWNhdGUga2V5cy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgSW4gbW9zdCBsYW5ndWFnZXMsIGFuIGFycmF5IG9mIGRpY3QgZW50cnkgd291bGQgYmUgcmVwcmVzZW50ZWQgYXMgYSAKKyAgICAgICAgbWFwLCBoYXNoIHRhYmxlLCBvciBkaWN0IG9iamVjdC4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBELUJ1cyB0eXBlcy4KKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkNvbnZlbnRpb25hbCBOYW1lPC90aD48dGg+Q29kZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVkFMSUQ8L2NvZGU+PC90ZD48dGQ+MCAoQVNDSUkgTlVMKTwvdGQ+PHRkPk5vdCBhIHZhbGlkIHR5cGUgY29kZSwgdXNlZCB0byB0ZXJtaW5hdGUgc2lnbmF0dXJlczwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5CWVRFPC9jb2RlPjwvdGQ+PHRkPjEyMSAoQVNDSUkgJ3knKTwvdGQ+PHRkPjgtYml0IHVuc2lnbmVkIGludGVnZXI8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Qk9PTEVBTjwvY29kZT48L3RkPjx0ZD45OCAoQVNDSUkgJ2InKTwvdGQ+PHRkPkJvb2xlYW4gdmFsdWUsIDAgaXMgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkZBTFNFPC9jb2RlPiBhbmQgMSBpcyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VFJVRTwvY29kZT4uIEV2ZXJ5dGhpbmcgZWxzZSBpcyBpbnZhbGlkLjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlQxNjwvY29kZT48L3RkPjx0ZD4xMTAgKEFTQ0lJICduJyk8L3RkPjx0ZD4xNi1iaXQgc2lnbmVkIGludGVnZXI8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VUlOVDE2PC9jb2RlPjwvdGQ+PHRkPjExMyAoQVNDSUkgJ3EnKTwvdGQ+PHRkPjE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVDMyPC9jb2RlPjwvdGQ+PHRkPjEwNSAoQVNDSUkgJ2knKTwvdGQ+PHRkPjMyLWJpdCBzaWduZWQgaW50ZWdlcjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UMzI8L2NvZGU+PC90ZD48dGQ+MTE3IChBU0NJSSAndScpPC90ZD48dGQ+MzItYml0IHVuc2lnbmVkIGludGVnZXI8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+SU5UNjQ8L2NvZGU+PC90ZD48dGQ+MTIwIChBU0NJSSAneCcpPC90ZD48dGQ+NjQtYml0IHNpZ25lZCBpbnRlZ2VyPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVJTlQ2NDwvY29kZT48L3RkPjx0ZD4xMTYgKEFTQ0lJICd0Jyk8L3RkPjx0ZD42NC1iaXQgdW5zaWduZWQgaW50ZWdlcjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5ET1VCTEU8L2NvZGU+PC90ZD48dGQ+MTAwIChBU0NJSSAnZCcpPC90ZD48dGQ+SUVFRSA3NTQgZG91YmxlPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNUUklORzwvY29kZT48L3RkPjx0ZD4xMTUgKEFTQ0lJICdzJyk8L3RkPjx0ZD5VVEYtOCBzdHJpbmcgKDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPm11c3Q8L2VtPjwvc3Bhbj4gYmUgdmFsaWQgVVRGLTgpLiBNdXN0IGJlIG51bCB0ZXJtaW5hdGVkIGFuZCBjb250YWluIG5vIG90aGVyIG51bCBieXRlcy48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T0JKRUNUX1BBVEg8L2NvZGU+PC90ZD48dGQ+MTExIChBU0NJSSAnbycpPC90ZD48dGQ+TmFtZSBvZiBhbiBvYmplY3QgaW5zdGFuY2U8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U0lHTkFUVVJFPC9jb2RlPjwvdGQ+PHRkPjEwMyAoQVNDSUkgJ2cnKTwvdGQ+PHRkPkEgdHlwZSBzaWduYXR1cmU8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+QVJSQVk8L2NvZGU+PC90ZD48dGQ+OTcgKEFTQ0lJICdhJyk8L3RkPjx0ZD5BcnJheTwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJVQ1Q8L2NvZGU+PC90ZD48dGQ+MTE0IChBU0NJSSAncicpLCA0MCAoQVNDSUkgJygnKSwgNDEgKEFTQ0lJICcpJyk8L3RkPjx0ZD5TdHJ1Y3Q8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VkFSSUFOVDwvY29kZT48L3RkPjx0ZD4xMTggKEFTQ0lJICd2JykgPC90ZD48dGQ+VmFyaWFudCB0eXBlICh0aGUgdHlwZSBvZiB0aGUgdmFsdWUgaXMgcGFydCBvZiB0aGUgdmFsdWUgaXRzZWxmKTwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5ESUNUX0VOVFJZPC9jb2RlPjwvdGQ+PHRkPjEwMSAoQVNDSUkgJ2UnKSwgMTIzIChBU0NJSSAneycpLCAxMjUgKEFTQ0lJICd9JykgPC90ZD48dGQ+RW50cnkgaW4gYSBkaWN0IG9yIG1hcCAoYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzKTwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VTklYX0ZEPC9jb2RlPjwvdGQ+PHRkPjEwNCAoQVNDSUkgJ2gnKTwvdGQ+PHRkPlVuaXggZmlsZSBkZXNjcmlwdG9yPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9Ik1hcnNoYWxpbmcgKFdpcmUgRm9ybWF0KSI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nIj48L2E+TWFyc2hhbGluZyAoV2lyZSBGb3JtYXQpPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgR2l2ZW4gYSB0eXBlIHNpZ25hdHVyZSwgYSBibG9jayBvZiBieXRlcyBjYW4gYmUgY29udmVydGVkIGludG8gdHlwZWQKKyAgICAgICAgdmFsdWVzLiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2NrIG9mIGJ5dGVzLiAgQnl0ZQorICAgICAgICBvcmRlciBhbmQgYWxpZ25tZW50IGlzc3VlcyBhcmUgaGFuZGxlZCB1bmlmb3JtbHkgZm9yIGFsbCBELUJ1cyB0eXBlcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgQSBibG9jayBvZiBieXRlcyBoYXMgYW4gYXNzb2NpYXRlZCBieXRlIG9yZGVyLiBUaGUgYnl0ZSBvcmRlciAKKyAgICAgICAgaGFzIHRvIGJlIGRpc2NvdmVyZWQgaW4gc29tZSB3YXk7IGZvciBELUJ1cyBtZXNzYWdlcywgdGhlIAorICAgICAgICBieXRlIG9yZGVyIGlzIHBhcnQgb2YgdGhlIG1lc3NhZ2UgaGVhZGVyIGFzIGRlc2NyaWJlZCBpbiAKKyAgICAgICAgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzIiB0aXRsZT0iTWVzc2FnZSBGb3JtYXQiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7TWVzc2FnZSBGb3JtYXQmIzgyMjE7PC9hPi4gRm9yIG5vdywgYXNzdW1lIAorICAgICAgICB0aGF0IHRoZSBieXRlIG9yZGVyIGlzIGtub3duIHRvIGJlIGVpdGhlciBsaXR0bGUgZW5kaWFuIG9yIGJpZyAKKyAgICAgICAgICBlbmRpYW4uCisgICAgICA8L3A+PHA+CisgICAgICAgIEVhY2ggdmFsdWUgaW4gYSBibG9jayBvZiBieXRlcyBpcyBhbGlnbmVkICJuYXR1cmFsbHksIiBmb3IgZXhhbXBsZQorICAgICAgICA0LWJ5dGUgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIGEgNC1ieXRlIGJvdW5kYXJ5LCBhbmQgOC1ieXRlIHZhbHVlcyB0byBhbgorICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIFRvIHByb3Blcmx5IGFsaWduIGEgdmFsdWUsIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5hbGlnbm1lbnQKKyAgICAgICAgcGFkZGluZzwvZW0+IG1heSBiZSBuZWNlc3NhcnkuIFRoZSBhbGlnbm1lbnQgcGFkZGluZyBtdXN0IGFsd2F5cworICAgICAgICBiZSB0aGUgbWluaW11bSByZXF1aXJlZCBwYWRkaW5nIHRvIHByb3Blcmx5IGFsaWduIHRoZSBmb2xsb3dpbmcgdmFsdWU7CisgICAgICAgIGFuZCBpdCBtdXN0IGFsd2F5cyBiZSBtYWRlIHVwIG9mIG51bCBieXRlcy4gVGhlIGFsaWdubWVudCBwYWRkaW5nIG11c3QKKyAgICAgICAgbm90IGJlIGxlZnQgdW5pbml0aWFsaXplZCAoaXQgY2FuJ3QgY29udGFpbiBnYXJiYWdlKSwgYW5kIG1vcmUgcGFkZGluZworICAgICAgICB0aGFuIHJlcXVpcmVkIG11c3Qgbm90IGJlIHVzZWQuCisgICAgICA8L3A+PHA+CisgICAgICAgIEdpdmVuIGFsbCB0aGlzLCB0aGUgdHlwZXMgYXJlIG1hcnNoYWxlZCBvbiB0aGUgd2lyZSBhcyBmb2xsb3dzOgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+Q29udmVudGlvbmFsIE5hbWU8L3RoPjx0aD5FbmNvZGluZzwvdGg+PHRoPkFsaWdubWVudDwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlZBTElEPC9jb2RlPjwvdGQ+PHRkPk5vdCBhcHBsaWNhYmxlOyBjYW5ub3QgYmUgbWFyc2hhbGVkLjwvdGQ+PHRkPk4vQTwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5CWVRFPC9jb2RlPjwvdGQ+PHRkPkEgc2luZ2xlIDgtYml0IGJ5dGUuPC90ZD48dGQ+MTwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5CT09MRUFOPC9jb2RlPjwvdGQ+PHRkPkFzIGZvciA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VUlOVDMyPC9jb2RlPiwgYnV0IG9ubHkgMCBhbmQgMSBhcmUgdmFsaWQgdmFsdWVzLjwvdGQ+PHRkPjQ8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+SU5UMTY8L2NvZGU+PC90ZD48dGQ+MTYtYml0IHNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L3RkPjx0ZD4yPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVJTlQxNjwvY29kZT48L3RkPjx0ZD4xNi1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC90ZD48dGQ+MjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlQzMjwvY29kZT48L3RkPjx0ZD4zMi1iaXQgc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvdGQ+PHRkPjQ8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VUlOVDMyPC9jb2RlPjwvdGQ+PHRkPjMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L3RkPjx0ZD40PC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVDY0PC9jb2RlPjwvdGQ+PHRkPjY0LWJpdCBzaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC90ZD48dGQ+ODwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UNjQ8L2NvZGU+PC90ZD48dGQ+NjQtYml0IHVuc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvdGQ+PHRkPjg8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+RE9VQkxFPC9jb2RlPjwvdGQ+PHRkPjY0LWJpdCBJRUVFIDc1NCBkb3VibGUgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvdGQ+PHRkPjg8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U1RSSU5HPC9jb2RlPjwvdGQ+PHRkPkEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVJTlQzMjwvY29kZT4gaW5kaWNhdGluZyB0aGUgc3RyaW5nJ3MgCisgICAgICAgICAgICAgICAgICBsZW5ndGggaW4gYnl0ZXMgZXhjbHVkaW5nIGl0cyB0ZXJtaW5hdGluZyBudWwsIGZvbGxvd2VkIGJ5IAorICAgICAgICAgICAgICAgICAgbm9uLW51bCBzdHJpbmcgZGF0YSBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLCBmb2xsb3dlZCBieSBhIHRlcm1pbmF0aW5nIG51bCAKKyAgICAgICAgICAgICAgICAgIGJ5dGUuCisgICAgICAgICAgICAgICAgPC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICA0IChmb3IgdGhlIGxlbmd0aCkKKyAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T0JKRUNUX1BBVEg8L2NvZGU+PC90ZD48dGQ+RXhhY3RseSB0aGUgc2FtZSBhcyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U1RSSU5HPC9jb2RlPiBleGNlcHQgdGhlIAorICAgICAgICAgICAgICAgICAgY29udGVudCBtdXN0IGJlIGEgdmFsaWQgb2JqZWN0IHBhdGggKHNlZSBiZWxvdykuCisgICAgICAgICAgICAgICAgPC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICA0IChmb3IgdGhlIGxlbmd0aCkKKyAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U0lHTkFUVVJFPC9jb2RlPjwvdGQ+PHRkPlRoZSBzYW1lIGFzIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJJTkc8L2NvZGU+IGV4Y2VwdCB0aGUgbGVuZ3RoIGlzIGEgc2luZ2xlIAorICAgICAgICAgICAgICAgICAgYnl0ZSAodGh1cyBzaWduYXR1cmVzIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAyNTUpCisgICAgICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIHNpZ25hdHVyZSAoc2VlIGJlbG93KS4KKyAgICAgICAgICAgICAgICA8L3RkPjx0ZD4KKyAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+QVJSQVk8L2NvZGU+PC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICBBIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UMzI8L2NvZGU+IGdpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBkYXRhIGluIGJ5dGVzLCBmb2xsb3dlZCBieSAKKyAgICAgICAgICAgICAgICAgIGFsaWdubWVudCBwYWRkaW5nIHRvIHRoZSBhbGlnbm1lbnQgYm91bmRhcnkgb2YgdGhlIGFycmF5IGVsZW1lbnQgdHlwZSwgCisgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBlYWNoIGFycmF5IGVsZW1lbnQuIFRoZSBhcnJheSBsZW5ndGggaXMgZnJvbSB0aGUgCisgICAgICAgICAgICAgICAgICBlbmQgb2YgdGhlIGFsaWdubWVudCBwYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgIGkuZS4gaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcGFkZGluZyBhZnRlciB0aGUgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgb3IgYW55IHBhZGRpbmcgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudC4KKyAgICAgICAgICAgICAgICAgIEFycmF5cyBoYXZlIGEgbWF4aW11bSBsZW5ndGggZGVmaW5lZCB0byBiZSAyIHRvIHRoZSAyNnRoIHBvd2VyIG9yCisgICAgICAgICAgICAgICAgICA2NzEwODg2NC4gSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IGFycmF5cyBleGNlZWRpbmcgdGhpcworICAgICAgICAgICAgICAgICAgbGVuZ3RoLgorICAgICAgICAgICAgICAgIDwvdGQ+PHRkPgorICAgICAgICAgICAgICAgICAgNCAoZm9yIHRoZSBsZW5ndGgpCisgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNUUlVDVDwvY29kZT48L3RkPjx0ZD4KKyAgICAgICAgICAgICAgICAgIEEgc3RydWN0IG11c3Qgc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHJlZ2FyZGxlc3Mgb2YgdGhlCisgICAgICAgICAgICAgICAgICB0eXBlIG9mIHRoZSBzdHJ1Y3QgZmllbGRzLiBUaGUgc3RydWN0IHZhbHVlIGNvbnNpc3RzIG9mIGVhY2gKKyAgICAgICAgICAgICAgICAgIGZpZWxkIG1hcnNoYWxlZCBpbiBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIHRoYXQgOC1ieXRlCisgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgPC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICA4CisgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlZBUklBTlQ8L2NvZGU+PC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICBBIHZhcmlhbnQgdHlwZSBoYXMgYSBtYXJzaGFsZWQKKyAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TSUdOQVRVUkU8L2NvZGU+IGZvbGxvd2VkIGJ5IGEgbWFyc2hhbGVkCisgICAgICAgICAgICAgICAgICB2YWx1ZSB3aXRoIHRoZSB0eXBlIGdpdmVuIGluIHRoZSBzaWduYXR1cmUuICBVbmxpa2UKKyAgICAgICAgICAgICAgICAgIGEgbWVzc2FnZSBzaWduYXR1cmUsIHRoZSB2YXJpYW50IHNpZ25hdHVyZSBjYW4KKyAgICAgICAgICAgICAgICAgIGNvbnRhaW4gb25seSBhIHNpbmdsZSBjb21wbGV0ZSB0eXBlLiAgU28gImkiLCAiYWkiCisgICAgICAgICAgICAgICAgICBvciAiKGlpKSIgaXMgT0ssIGJ1dCAiaWkiIGlzIG5vdC4gIFVzZSBvZiB2YXJpYW50cyBtYXkgbm90CisgICAgICAgICAgICAgICAgICBjYXVzZSBhIHRvdGFsIG1lc3NhZ2UgZGVwdGggdG8gYmUgbGFyZ2VyIHRoYW4gNjQsIGluY2x1ZGluZworCQkgIG90aGVyIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzIHN0cnVjdHVyZXMuCisgICAgICAgICAgICAgICAgPC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICAxIChhbGlnbm1lbnQgb2YgdGhlIHNpZ25hdHVyZSkKKyAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+RElDVF9FTlRSWTwvY29kZT48L3RkPjx0ZD4KKyAgICAgICAgICAgICAgICAgIElkZW50aWNhbCB0byBTVFJVQ1QuCisgICAgICAgICAgICAgICAgPC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICA4CisgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVOSVhfRkQ8L2NvZGU+PC90ZD48dGQ+MzItYml0IHVuc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlCisgICAgICAgICAgICAgICAgb3JkZXIuIFRoZSBhY3R1YWwgZmlsZSBkZXNjcmlwdG9ycyBuZWVkIHRvIGJlCisgICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQgb3V0LW9mLWJhbmQgdmlhIHNvbWUgcGxhdGZvcm0gc3BlY2lmaWMKKyAgICAgICAgICAgICAgICBtZWNoYW5pc20uIE9uIHRoZSB3aXJlLCB2YWx1ZXMgb2YgdGhpcyB0eXBlIHN0b3JlIHRoZSBpbmRleCB0byB0aGUKKyAgICAgICAgICAgICAgICBmaWxlIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IG9mIGZpbGUgZGVzY3JpcHRvcnMgdGhhdAorICAgICAgICAgICAgICAgIGFjY29tcGFueSB0aGUgbWVzc2FnZS48L3RkPjx0ZD40PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IlZhbGlkIE9iamVjdCBQYXRocyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nLW9iamVjdC1wYXRoIj48L2E+VmFsaWQgT2JqZWN0IFBhdGhzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBbiBvYmplY3QgcGF0aCBpcyBhIG5hbWUgdXNlZCB0byByZWZlciB0byBhbiBvYmplY3QgaW5zdGFuY2UuCisgICAgICAgICAgQ29uY2VwdHVhbGx5LCBlYWNoIHBhcnRpY2lwYW50IGluIGEgRC1CdXMgbWVzc2FnZSBleGNoYW5nZSBtYXkgaGF2ZQorICAgICAgICAgIGFueSBudW1iZXIgb2Ygb2JqZWN0IGluc3RhbmNlcyAodGhpbmsgb2YgQysrIG9yIEphdmEgb2JqZWN0cykgYW5kIGVhY2gKKyAgICAgICAgICBzdWNoIGluc3RhbmNlIHdpbGwgaGF2ZSBhIHBhdGguIExpa2UgYSBmaWxlc3lzdGVtLCB0aGUgb2JqZWN0CisgICAgICAgICAgaW5zdGFuY2VzIGluIGFuIGFwcGxpY2F0aW9uIGZvcm0gYSBoaWVyYXJjaGljYWwgdHJlZS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcnVsZXMgZGVmaW5lIGEgdmFsaWQgb2JqZWN0IHBhdGguIEltcGxlbWVudGF0aW9ucyBtdXN0IAorICAgICAgICAgIG5vdCBzZW5kIG9yIGFjY2VwdCBtZXNzYWdlcyB3aXRoIGludmFsaWQgb2JqZWN0IHBhdGhzLgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBUaGUgcGF0aCBtYXkgYmUgb2YgYW55IGxlbmd0aC4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgVGhlIHBhdGggbXVzdCBiZWdpbiB3aXRoIGFuIEFTQ0lJICcvJyAoaW50ZWdlciA0NykgY2hhcmFjdGVyLCAKKyAgICAgICAgICAgICAgICBhbmQgbXVzdCBjb25zaXN0IG9mIGVsZW1lbnRzIHNlcGFyYXRlZCBieSBzbGFzaCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBFYWNoIGVsZW1lbnQgbXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMgCisgICAgICAgICAgICAgICAgIltBLVpdW2Etel1bMC05XV8iCisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIE5vIGVsZW1lbnQgbWF5IGJlIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIE11bHRpcGxlICcvJyBjaGFyYWN0ZXJzIGNhbm5vdCBvY2N1ciBpbiBzZXF1ZW5jZS4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgQSB0cmFpbGluZyAnLycgY2hhcmFjdGVyIGlzIG5vdCBhbGxvd2VkIHVubGVzcyB0aGUgCisgICAgICAgICAgICAgICAgcGF0aCBpcyB0aGUgcm9vdCBwYXRoIChhIHNpbmdsZSAnLycgY2hhcmFjdGVyKS4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKyAgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iVmFsaWQgU2lnbmF0dXJlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nLXNpZ25hdHVyZSI+PC9hPlZhbGlkIFNpZ25hdHVyZXM8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IGludmFsaWQgc2lnbmF0dXJlcy4KKyAgICAgICAgICBWYWxpZCBzaWduYXR1cmVzIHdpbGwgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBUaGUgc2lnbmF0dXJlIGVuZHMgd2l0aCBhIG51bCBieXRlLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBUaGUgc2lnbmF0dXJlIGlzIGEgbGlzdCBvZiBzaW5nbGUgY29tcGxldGUgdHlwZXMuIAorICAgICAgICAgICAgICAgIEFycmF5cyBtdXN0IGhhdmUgZWxlbWVudCB0eXBlcywgYW5kIHN0cnVjdHMgbXVzdCAKKyAgICAgICAgICAgICAgICBoYXZlIGJvdGggb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzZXMuCisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIE9ubHkgdHlwZSBjb2RlcyBhbmQgb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzZXMgYXJlIAorICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIHNpZ25hdHVyZS4gVGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJVQ1Q8L2NvZGU+IHR5cGUgY29kZQorICAgICAgICAgICAgICAgIGlzIG5vdCBhbGxvd2VkIGluIHNpZ25hdHVyZXMsIGJlY2F1c2UgcGFyZW50aGVzZXMKKyAgICAgICAgICAgICAgICBhcmUgdXNlZCBpbnN0ZWFkLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBkZXB0aCBvZiBjb250YWluZXIgdHlwZSBuZXN0aW5nIGlzIDMyIGFycmF5IHR5cGUKKyAgICAgICAgICAgICAgICBjb2RlcyBhbmQgMzIgb3BlbiBwYXJlbnRoZXNlcy4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIG1heGltdW0KKyAgICAgICAgICAgICAgICB0b3RhbCBkZXB0aCBvZiByZWN1cnNpb24gaXMgNjQsIGZvciBhbiAiYXJyYXkgb2YgYXJyYXkgb2YgYXJyYXkKKyAgICAgICAgICAgICAgICBvZiAuLi4gc3RydWN0IG9mIHN0cnVjdCBvZiBzdHJ1Y3Qgb2YgLi4uIiAgd2hlcmUgdGhlcmUgYXJlIDMyCisgICAgICAgICAgICAgICAgYXJyYXkgYW5kIDMyIHN0cnVjdC4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2lnbmF0dXJlIGlzIDI1NS4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgU2lnbmF0dXJlcyBtdXN0IGJlIG51bC10ZXJtaW5hdGVkLgorICAgICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgICA8L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJNZXNzYWdlIEZvcm1hdCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC1tZXNzYWdlcyI+PC9hPk1lc3NhZ2UgRm9ybWF0PC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgQSBtZXNzYWdlIGNvbnNpc3RzIG9mIGEgaGVhZGVyIGFuZCBhIGJvZHkuIFRoZSBoZWFkZXIgaXMgYSBibG9jayBvZgorICAgICAgICB2YWx1ZXMgd2l0aCBhIGZpeGVkIHNpZ25hdHVyZSBhbmQgbWVhbmluZy4gIFRoZSBib2R5IGlzIGEgc2VwYXJhdGUgYmxvY2sKKyAgICAgICAgb2YgdmFsdWVzLCB3aXRoIGEgc2lnbmF0dXJlIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDgsIGFsbG93aW5nIHRoZSBib2R5IHRvCisgICAgICAgIGJlZ2luIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSB3aGVuIHN0b3JpbmcgdGhlIGVudGlyZSBtZXNzYWdlIGluIGEgc2luZ2xlCisgICAgICAgIGJ1ZmZlci4gSWYgdGhlIGhlYWRlciBkb2VzIG5vdCBuYXR1cmFsbHkgZW5kIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAgICAgICAgdXAgdG8gNyBieXRlcyBvZiBudWwtaW5pdGlhbGl6ZWQgYWxpZ25tZW50IHBhZGRpbmcgbXVzdCBiZSBhZGRlZC4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhlIG1lc3NhZ2UgYm9keSBuZWVkIG5vdCBlbmQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBtZXNzYWdlLCBpbmNsdWRpbmcgaGVhZGVyLCBoZWFkZXIgYWxpZ25tZW50IHBhZGRpbmcsIAorICAgICAgICBhbmQgYm9keSBpcyAyIHRvIHRoZSAyN3RoIHBvd2VyIG9yIDEzNDIxNzcyOC4gSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IAorICAgICAgICBzZW5kIG9yIGFjY2VwdCBtZXNzYWdlcyBleGNlZWRpbmcgdGhpcyBzaXplLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgc2lnbmF0dXJlIG9mIHRoZSBoZWFkZXIgaXM6CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgInl5eXl1dWEoeXYpIgorICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgV3JpdHRlbiBvdXQgbW9yZSByZWFkYWJseSwgdGhpcyBpczoKKyAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICBCWVRFLCBCWVRFLCBCWVRFLCBCWVRFLCBVSU5UMzIsIFVJTlQzMiwgQVJSQVkgb2YgU1RSVUNUIG9mIChCWVRFLFZBUklBTlQpCisgICAgICAgIDwvcHJlPjxwPgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGVzZSB2YWx1ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPlZhbHVlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4xc3QgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkJZVEU8L2NvZGU+PC90ZD48dGQ+RW5kaWFubmVzcyBmbGFnOyBBU0NJSSAnbCcgZm9yIGxpdHRsZS1lbmRpYW4gCisgICAgICAgICAgICAgICAgICBvciBBU0NJSSAnQicgZm9yIGJpZy1lbmRpYW4uIEJvdGggaGVhZGVyIGFuZCBib2R5IGFyZSAKKyAgICAgICAgICAgICAgICBpbiB0aGlzIGVuZGlhbm5lc3MuPC90ZD48L3RyPjx0cj48dGQ+Mm5kIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5CWVRFPC9jb2RlPjwvdGQ+PHRkPjxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5NZXNzYWdlIHR5cGU8L2VtPi4gVW5rbm93biB0eXBlcyBtdXN0IGJlIGlnbm9yZWQuIAorICAgICAgICAgICAgICAgICAgQ3VycmVudGx5LWRlZmluZWQgdHlwZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD4zcmQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkJZVEU8L2NvZGU+PC90ZD48dGQ+Qml0d2lzZSBPUiBvZiBmbGFncy4gVW5rbm93biBmbGFncworICAgICAgICAgICAgICAgICAgbXVzdCBiZSBpZ25vcmVkLiBDdXJyZW50bHktZGVmaW5lZCBmbGFncyBhcmUgZGVzY3JpYmVkIGJlbG93LgorICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPjR0aCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+QllURTwvY29kZT48L3RkPjx0ZD5NYWpvciBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBzZW5kaW5nIGFwcGxpY2F0aW9uLiAgSWYKKyAgICAgICAgICAgICAgICB0aGUgbWFqb3IgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgcmVjZWl2aW5nIGFwcGxpY2F0aW9uIGRvZXMgbm90CisgICAgICAgICAgICAgICAgbWF0Y2gsIHRoZSBhcHBsaWNhdGlvbnMgd2lsbCBub3QgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgRC1CdXMgY29ubmVjdGlvbiBtdXN0IGJlIGRpc2Nvbm5lY3RlZC4gVGhlIG1ham9yIHByb3RvY29sCisgICAgICAgICAgICAgICAgdmVyc2lvbiBmb3IgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGlzIDEuCisgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+MXN0IDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UMzI8L2NvZGU+PC90ZD48dGQ+TGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBtZXNzYWdlIGJvZHksIHN0YXJ0aW5nIAorICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuIFRoZSBoZWFkZXIgZW5kcyBhZnRlciAKKyAgICAgICAgICAgICAgICAgIGl0cyBhbGlnbm1lbnQgcGFkZGluZyB0byBhbiA4LWJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPjJuZCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VUlOVDMyPC9jb2RlPjwvdGQ+PHRkPlRoZSBzZXJpYWwgb2YgdGhpcyBtZXNzYWdlLCB1c2VkIGFzIGEgY29va2llIAorICAgICAgICAgICAgICAgICAgYnkgdGhlIHNlbmRlciB0byBpZGVudGlmeSB0aGUgcmVwbHkgY29ycmVzcG9uZGluZworICAgICAgICAgICAgICAgICAgdG8gdGhpcyByZXF1ZXN0LiBUaGlzIG11c3Qgbm90IGJlIHplcm8uCisgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkFSUkFZPC9jb2RlPiBvZiA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U1RSVUNUPC9jb2RlPiBvZiAoPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkJZVEU8L2NvZGU+LDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5WQVJJQU5UPC9jb2RlPik8L3RkPjx0ZD5BbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmhlYWRlcgorICAgICAgICAgICAgICAgICAgZmllbGRzPC9lbT4gd2hlcmUgdGhlIGJ5dGUgaXMgdGhlIGZpZWxkIGNvZGUsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgIHZhcmlhbnQgaXMgdGhlIGZpZWxkIHZhbHVlLiBUaGUgbWVzc2FnZSB0eXBlIGRldGVybWluZXMgCisgICAgICAgICAgICAgICAgICB3aGljaCBmaWVsZHMgYXJlIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICA8L3A+PHA+CisgICAgICAgIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5NZXNzYWdlIHR5cGVzPC9lbT4gdGhhdCBjYW4gYXBwZWFyIGluIHRoZSBzZWNvbmQgYnl0ZQorICAgICAgICBvZiB0aGUgaGVhZGVyIGFyZToKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkNvbnZlbnRpb25hbCBuYW1lPC90aD48dGg+RGVjaW1hbCB2YWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVkFMSUQ8L2NvZGU+PC90ZD48dGQ+MDwvdGQ+PHRkPlRoaXMgaXMgYW4gaW52YWxpZCB0eXBlLjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT48L3RkPjx0ZD4xPC90ZD48dGQ+TWV0aG9kIGNhbGwuPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FVEhPRF9SRVRVUk48L2NvZGU+PC90ZD48dGQ+MjwvdGQ+PHRkPk1ldGhvZCByZXBseSB3aXRoIHJldHVybmVkIGRhdGEuPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkVSUk9SPC9jb2RlPjwvdGQ+PHRkPjM8L3RkPjx0ZD5FcnJvciByZXBseS4gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGV4aXN0cyBhbmQgaXMgYQorICAgICAgICAgICAgICAgIHN0cmluZywgaXQgaXMgYW4gZXJyb3IgbWVzc2FnZS48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U0lHTkFMPC9jb2RlPjwvdGQ+PHRkPjQ8L3RkPjx0ZD5TaWduYWwgZW1pc3Npb24uPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgRmxhZ3MgdGhhdCBjYW4gYXBwZWFyIGluIHRoZSB0aGlyZCBieXRlIG9mIHRoZSBoZWFkZXI6CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Db252ZW50aW9uYWwgbmFtZTwvdGg+PHRoPkhleCB2YWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPk5PX1JFUExZX0VYUEVDVEVEPC9jb2RlPjwvdGQ+PHRkPjB4MTwvdGQ+PHRkPlRoaXMgbWVzc2FnZSBkb2VzIG5vdCBleHBlY3QgbWV0aG9kIHJldHVybiByZXBsaWVzIG9yCisgICAgICAgICAgICAgICAgZXJyb3IgcmVwbGllczsgdGhlIHJlcGx5IGNhbiBiZSBvbWl0dGVkIGFzIGFuCisgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uLiBIb3dldmVyLCBpdCBpcyBjb21wbGlhbnQgd2l0aCB0aGlzIHNwZWNpZmljYXRpb24KKyAgICAgICAgICAgICAgICB0byByZXR1cm4gdGhlIHJlcGx5IGRlc3BpdGUgdGhpcyBmbGFnIGFuZCB0aGUgb25seSBoYXJtIAorICAgICAgICAgICAgICAgICAgZnJvbSBkb2luZyBzbyBpcyBleHRyYSBuZXR3b3JrIHRyYWZmaWMuCisgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPk5PX0FVVE9fU1RBUlQ8L2NvZGU+PC90ZD48dGQ+MHgyPC90ZD48dGQ+VGhlIGJ1cyBtdXN0IG5vdCBsYXVuY2ggYW4gb3duZXIKKyAgICAgICAgICAgICAgICAgIGZvciB0aGUgZGVzdGluYXRpb24gbmFtZSBpbiByZXNwb25zZSB0byB0aGlzIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IkhlYWRlciBGaWVsZHMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtcHJvdG9jb2wtaGVhZGVyLWZpZWxkcyI+PC9hPkhlYWRlciBGaWVsZHM8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIFRoZSBhcnJheSBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgY29udGFpbnMgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmhlYWRlcgorICAgICAgICAgIGZpZWxkczwvZW0+LCB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgMS1ieXRlIGZpZWxkIGNvZGUgZm9sbG93ZWQKKyAgICAgICAgICBieSBhIGZpZWxkIHZhbHVlLiBBIGhlYWRlciBtdXN0IGNvbnRhaW4gdGhlIHJlcXVpcmVkIGhlYWRlciBmaWVsZHMgZm9yCisgICAgICAgICAgaXRzIG1lc3NhZ2UgdHlwZSwgYW5kIHplcm8gb3IgbW9yZSBvZiBhbnkgb3B0aW9uYWwgaGVhZGVyCisgICAgICAgICAgZmllbGRzLiBGdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIG1heSBhZGQgbmV3CisgICAgICAgICAgZmllbGRzLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBpZ25vcmUgZmllbGRzIHRoZXkgZG8gbm90CisgICAgICAgICAgdW5kZXJzdGFuZC4gSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IGludmVudCB0aGVpciBvd24gaGVhZGVyIGZpZWxkczsKKyAgICAgICAgICBvbmx5IGNoYW5nZXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uIG1heSBpbnRyb2R1Y2UgbmV3IGhlYWRlciBmaWVsZHMuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBBZ2FpbiwgaWYgYW4gaW1wbGVtZW50YXRpb24gc2VlcyBhIGhlYWRlciBmaWVsZCBjb2RlIHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICAgICBleHBlY3QsIGl0IG11c3QgaWdub3JlIHRoYXQgZmllbGQsIGFzIGl0IHdpbGwgYmUgcGFydCBvZiBhIG5ldworICAgICAgICAgIChidXQgY29tcGF0aWJsZSkgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24uIFRoaXMgYWxzbyBhcHBsaWVzIAorICAgICAgICAgIHRvIGtub3duIGhlYWRlciBmaWVsZHMgYXBwZWFyaW5nIGluIHVuZXhwZWN0ZWQgbWVzc2FnZXMsIGZvciAKKyAgICAgICAgICBleGFtcGxlOiBpZiBhIHNpZ25hbCBoYXMgYSByZXBseSBzZXJpYWwgaXQgbXVzdCBiZSBpZ25vcmVkCisgICAgICAgICAgZXZlbiB0aG91Z2ggaXQgaGFzIG5vIG1lYW5pbmcgYXMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgSG93ZXZlciwgaW1wbGVtZW50YXRpb25zIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IGtub3duIGhlYWRlciBmaWVsZHMKKyAgICAgICAgICB3aXRoIHRoZSB3cm9uZyB0eXBlIHN0b3JlZCBpbiB0aGUgZmllbGQgdmFsdWUuIFNvIGZvciBleGFtcGxlIGEKKyAgICAgICAgICBtZXNzYWdlIHdpdGggYW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVEVSRkFDRTwvY29kZT4gZmllbGQgb2YgdHlwZQorICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UMzI8L2NvZGU+IHdvdWxkIGJlIGNvbnNpZGVyZWQgY29ycnVwdC4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEhlcmUgYXJlIHRoZSBjdXJyZW50bHktZGVmaW5lZCBoZWFkZXIgZmllbGRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+Q29udmVudGlvbmFsIE5hbWU8L3RoPjx0aD5EZWNpbWFsIENvZGU8L3RoPjx0aD5UeXBlPC90aD48dGg+UmVxdWlyZWQgSW48L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlZBTElEPC9jb2RlPjwvdGQ+PHRkPjA8L3RkPjx0ZD5OL0E8L3RkPjx0ZD5ub3QgYWxsb3dlZDwvdGQ+PHRkPk5vdCBhIHZhbGlkIGZpZWxkIG5hbWUgKGVycm9yIGlmIGl0IGFwcGVhcnMgaW4gYSBtZXNzYWdlKTwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5QQVRIPC9jb2RlPjwvdGQ+PHRkPjE8L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T0JKRUNUX1BBVEg8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FVEhPRF9DQUxMPC9jb2RlPiwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNJR05BTDwvY29kZT48L3RkPjx0ZD5UaGUgb2JqZWN0IHRvIHNlbmQgYSBjYWxsIHRvLAorICAgICAgICAgICAgICAgICAgICBvciB0aGUgb2JqZWN0IGEgc2lnbmFsIGlzIGVtaXR0ZWQgZnJvbS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgcGF0aAorICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+L29yZy9mcmVlZGVza3RvcC9EQnVzL0xvY2FsPC9jb2RlPiBpcyByZXNlcnZlZDsKKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3Qgc2VuZCBtZXNzYWdlcyB3aXRoIHRoaXMgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1cyBkYWVtb24gd2lsbAorICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0IGFueSBhcHBsaWNhdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGRvIHNvLgorICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVEVSRkFDRTwvY29kZT48L3RkPjx0ZD4yPC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNUUklORzwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U0lHTkFMPC9jb2RlPjwvdGQ+PHRkPgorICAgICAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIHRvIGludm9rZSBhIG1ldGhvZCBjYWxsIG9uLCBvciAKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBhIHNpZ25hbCBpcyBlbWl0dGVkIGZyb20uIE9wdGlvbmFsIGZvciAKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGxzLCByZXF1aXJlZCBmb3Igc2lnbmFscy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbDwvY29kZT4gaXMgcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHNlbmQgbWVzc2FnZXMgd2l0aCB0aGlzCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwgYW5kIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1cworICAgICAgICAgICAgICAgICAgICBkYWVtb24gd2lsbCBkaXNjb25uZWN0IGFueSBhcHBsaWNhdGlvbiB0aGF0IGF0dGVtcHRzIHRvCisgICAgICAgICAgICAgICAgICAgIGRvIHNvLgorICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FTUJFUjwvY29kZT48L3RkPjx0ZD4zPC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNUUklORzwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TUVUSE9EX0NBTEw8L2NvZGU+LCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U0lHTkFMPC9jb2RlPjwvdGQ+PHRkPlRoZSBtZW1iZXIsIGVpdGhlciB0aGUgbWV0aG9kIG5hbWUgb3Igc2lnbmFsIG5hbWUuPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkVSUk9SX05BTUU8L2NvZGU+PC90ZD48dGQ+NDwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJJTkc8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkVSUk9SPC9jb2RlPjwvdGQ+PHRkPlRoZSBuYW1lIG9mIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkLCBmb3IgZXJyb3JzPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlJFUExZX1NFUklBTDwvY29kZT48L3RkPjx0ZD41PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVJTlQzMjwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+RVJST1I8L2NvZGU+LCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TUVUSE9EX1JFVFVSTjwvY29kZT48L3RkPjx0ZD5UaGUgc2VyaWFsIG51bWJlciBvZiB0aGUgbWVzc2FnZSB0aGlzIG1lc3NhZ2UgaXMgYSByZXBseQorICAgICAgICAgICAgICAgICAgICB0by4gKFRoZSBzZXJpYWwgbnVtYmVyIGlzIHRoZSBzZWNvbmQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVJTlQzMjwvY29kZT4gaW4gdGhlIGhlYWRlci4pPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRFU1RJTkFUSU9OPC9jb2RlPjwvdGQ+PHRkPjY8L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U1RSSU5HPC9jb2RlPjwvdGQ+PHRkPm9wdGlvbmFsPC90ZD48dGQ+VGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhpcyBtZXNzYWdlIGlzIGludGVuZGVkIGZvci4KKyAgICAgICAgICAgICAgICAgICAgT25seSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UgYnVzLCBzZWUgCisgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjbWVzc2FnZS1idXMiIHRpdGxlPSJNZXNzYWdlIEJ1cyBTcGVjaWZpY2F0aW9uIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwO01lc3NhZ2UgQnVzIFNwZWNpZmljYXRpb24mIzgyMjE7PC9hPi48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U0VOREVSPC9jb2RlPjwvdGQ+PHRkPjc8L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U1RSSU5HPC9jb2RlPjwvdGQ+PHRkPm9wdGlvbmFsPC90ZD48dGQ+VW5pcXVlIG5hbWUgb2YgdGhlIHNlbmRpbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYnVzIGZpbGxzIGluIHRoaXMgZmllbGQgc28gaXQgaXMgcmVsaWFibGU7IHRoZSBmaWVsZCBpcworICAgICAgICAgICAgICAgICAgICBvbmx5IG1lYW5pbmdmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgbWVzc2FnZSBidXMuPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNJR05BVFVSRTwvY29kZT48L3RkPjx0ZD44PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNJR05BVFVSRTwvY29kZT48L3RkPjx0ZD5vcHRpb25hbDwvdGQ+PHRkPlRoZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UgYm9keS4KKyAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIAorICAgICAgICAgICAgICAgICAgZW1wdHkgc2lnbmF0dXJlICIiIChpLmUuIHRoZSBib2R5IG11c3QgYmUgMC1sZW5ndGgpLjwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VTklYX0ZEUzwvY29kZT48L3RkPjx0ZD45PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVJTlQzMjwvY29kZT48L3RkPjx0ZD5vcHRpb25hbDwvdGQ+PHRkPlRoZSBudW1iZXIgb2YgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQKKyAgICAgICAgICAgICAgICAgIGFjY29tcGFueSB0aGUgbWVzc2FnZS4gIElmIG9taXR0ZWQsIGl0IGlzIGFzc3VtZWQKKyAgICAgICAgICAgICAgICAgIHRoYXQgbm8gVW5peCBmaWxlIGRlc2NyaXB0b3JzIGFjY29tcGFueSB0aGUKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuIFRoZSBhY3R1YWwgZmlsZSBkZXNjcmlwdG9ycyBuZWVkIHRvIGJlCisgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCB2aWEgcGxhdGZvcm0gc3BlY2lmaWMgbWVjaGFuaXNtCisgICAgICAgICAgICAgICAgICBvdXQtb2YtYmFuZC4gVGhleSBtdXN0IGJlIHNlbnQgYXQgdGhlIHNhbWUgdGltZSBhcworICAgICAgICAgICAgICAgICAgcGFydCBvZiB0aGUgbWVzc2FnZSBpdHNlbGYuIFRoZXkgbWF5IG5vdCBiZSBzZW50CisgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgaXRzZWxmIGlzCisgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBvciBhZnRlciB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICBpdHNlbGYuPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iVmFsaWQgTmFtZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMiPjwvYT5WYWxpZCBOYW1lczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoZSB2YXJpb3VzIG5hbWVzIGluIEQtQnVzIG1lc3NhZ2VzIGhhdmUgc29tZSByZXN0cmljdGlvbnMuCisgICAgICA8L3A+PHA+CisgICAgICAgIFRoZXJlIGlzIGEgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm1heGltdW0gbmFtZSBsZW5ndGg8L2VtPiAKKyAgICAgICAgb2YgMjU1IHdoaWNoIGFwcGxpZXMgdG8gYnVzIG5hbWVzLCBpbnRlcmZhY2VzLCBhbmQgbWVtYmVycy4gCisgICAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJJbnRlcmZhY2UgbmFtZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIj48L2E+SW50ZXJmYWNlIG5hbWVzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBJbnRlcmZhY2VzIGhhdmUgbmFtZXMgd2l0aCB0eXBlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJJTkc8L2NvZGU+LCBtZWFuaW5nIHRoYXQgCisgICAgICAgICAgdGhleSBtdXN0IGJlIHZhbGlkIFVURi04LiBIb3dldmVyLCB0aGVyZSBhcmUgYWxzbyBzb21lIAorICAgICAgICAgIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIHRoYXQgYXBwbHkgdG8gaW50ZXJmYWNlIG5hbWVzIAorICAgICAgICAgIHNwZWNpZmljYWxseToKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+SW50ZXJmYWNlIG5hbWVzIGFyZSBjb21wb3NlZCBvZiAxIG9yIG1vcmUgZWxlbWVudHMgc2VwYXJhdGVkIGJ5CisgICAgICAgICAgICAgICAgYSBwZXJpb2QgKCcuJykgY2hhcmFjdGVyLiBBbGwgZWxlbWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0IAorICAgICAgICAgICAgICAgIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+RWFjaCBlbGVtZW50IG11c3Qgb25seSBjb250YWluIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIAorICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fIiBhbmQgbXVzdCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPkludGVyZmFjZSBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lICcuJyAocGVyaW9kKQorICAgICAgICAgICAgICBjaGFyYWN0ZXIgKGFuZCB0aHVzIGF0IGxlYXN0IHR3byBlbGVtZW50cykuCisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPkludGVyZmFjZSBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgJy4nIChwZXJpb2QpIGNoYXJhY3Rlci48L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5JbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLjwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IkJ1cyBuYW1lcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1idXMiPjwvYT5CdXMgbmFtZXM8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIENvbm5lY3Rpb25zIGhhdmUgb25lIG9yIG1vcmUgYnVzIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICAgICAgICAgIEEgY29ubmVjdGlvbiBoYXMgZXhhY3RseSBvbmUgYnVzIG5hbWUgdGhhdCBpcyBhIHVuaXF1ZSBjb25uZWN0aW9uCisgICAgICAgICAgbmFtZS4gVGhlIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWUgcmVtYWlucyB3aXRoIHRoZSBjb25uZWN0aW9uIGZvcgorICAgICAgICAgIGl0cyBlbnRpcmUgbGlmZXRpbWUuCisgICAgICAgICAgQSBidXMgbmFtZSBpcyBvZiB0eXBlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJJTkc8L2NvZGU+LAorICAgICAgICAgIG1lYW5pbmcgdGhhdCBpdCBtdXN0IGJlIHZhbGlkIFVURi04LiBIb3dldmVyLCB0aGVyZSBhcmUgYWxzbworICAgICAgICAgIHNvbWUgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgdGhhdCBhcHBseSB0byBidXMgbmFtZXMgCisgICAgICAgICAgc3BlY2lmaWNhbGx5OgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5CdXMgbmFtZXMgdGhhdCBzdGFydCB3aXRoIGEgY29sb24gKCc6JykKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYXJlIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzLgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPkJ1cyBuYW1lcyBhcmUgY29tcG9zZWQgb2YgMSBvciBtb3JlIGVsZW1lbnRzIHNlcGFyYXRlZCBieQorICAgICAgICAgICAgICAgIGEgcGVyaW9kICgnLicpIGNoYXJhY3Rlci4gQWxsIGVsZW1lbnRzIG11c3QgY29udGFpbiBhdCBsZWFzdCAKKyAgICAgICAgICAgICAgICBvbmUgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPkVhY2ggZWxlbWVudCBtdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycyAKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXy0iLiBPbmx5IGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSB1bmlxdWUKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uIG5hbWUgbWF5IGJlZ2luIHdpdGggYSBkaWdpdCwgZWxlbWVudHMgaW4KKyAgICAgICAgICAgICAgICBvdGhlciBidXMgbmFtZXMgbXVzdCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPkJ1cyBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lICcuJyAocGVyaW9kKQorICAgICAgICAgICAgICBjaGFyYWN0ZXIgKGFuZCB0aHVzIGF0IGxlYXN0IHR3byBlbGVtZW50cykuCisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPkJ1cyBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgJy4nIChwZXJpb2QpIGNoYXJhY3Rlci48L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5CdXMgbmFtZXMgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLjwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBOb3RlIHRoYXQgdGhlIGh5cGhlbiAoJy0nKSBjaGFyYWN0ZXIgaXMgYWxsb3dlZCBpbiBidXMgbmFtZXMgYnV0CisgICAgICAgICAgbm90IGluIGludGVyZmFjZSBuYW1lcy4KKyAgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iTWVtYmVyIG5hbWVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLW1lbWJlciI+PC9hPk1lbWJlciBuYW1lczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgTWVtYmVyIChpLmUuIG1ldGhvZCBvciBzaWduYWwpIG5hbWVzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5NdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fIiBhbmQgbWF5IG5vdCBiZWdpbiB3aXRoIGEKKyAgICAgICAgICAgICAgICBkaWdpdC48L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5NdXN0IG5vdCBjb250YWluIHRoZSAnLicgKHBlcmlvZCkgY2hhcmFjdGVyLjwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPk11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC48L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5NdXN0IGJlIGF0IGxlYXN0IDEgYnl0ZSBpbiBsZW5ndGguPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKyAgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iRXJyb3IgbmFtZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtZXJyb3IiPjwvYT5FcnJvciBuYW1lczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgRXJyb3IgbmFtZXMgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgaW50ZXJmYWNlIG5hbWVzLgorICAgICAgICA8L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJNZXNzYWdlIFR5cGVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzIj48L2E+TWVzc2FnZSBUeXBlczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEVhY2ggb2YgdGhlIG1lc3NhZ2UgdHlwZXMgKDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4sIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfUkVUVVJOPC9jb2RlPiwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkVSUk9SPC9jb2RlPiwgYW5kCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TSUdOQUw8L2NvZGU+KSBoYXMgaXRzIG93biBleHBlY3RlZCB1c2FnZSBjb252ZW50aW9ucyBhbmQgaGVhZGVyIGZpZWxkcy4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGVzZSBjb252ZW50aW9ucy4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Ik1ldGhvZCBDYWxscyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1tZXRob2QiPjwvYT5NZXRob2QgQ2FsbHM8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIFNvbWUgbWVzc2FnZXMgaW52b2tlIGFuIG9wZXJhdGlvbiBvbiBhIHJlbW90ZSBvYmplY3QuICBUaGVzZSBhcmUKKyAgICAgICAgICBjYWxsZWQgbWV0aG9kIGNhbGwgbWVzc2FnZXMgYW5kIGhhdmUgdGhlIHR5cGUgdGFnIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4uIFN1Y2gKKyAgICAgICAgICBtZXNzYWdlcyBtYXAgbmF0dXJhbGx5IHRvIG1ldGhvZHMgb24gb2JqZWN0cyBpbiBhIHR5cGljYWwgcHJvZ3JhbS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEEgbWV0aG9kIGNhbGwgbWVzc2FnZSBpcyByZXF1aXJlZCB0byBoYXZlIGEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FTUJFUjwvY29kZT4gaGVhZGVyIGZpZWxkCisgICAgICAgICAgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLiBPcHRpb25hbGx5LCB0aGUgbWVzc2FnZSBoYXMgYW4KKyAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+SU5URVJGQUNFPC9jb2RlPiBmaWVsZCBnaXZpbmcgdGhlIGludGVyZmFjZSB0aGUgbWV0aG9kIGlzIGEgcGFydCBvZi4gSW4gdGhlCisgICAgICAgICAgYWJzZW5jZSBvZiBhbiA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+SU5URVJGQUNFPC9jb2RlPiBmaWVsZCwgaWYgdHdvIGludGVyZmFjZXMgb24gdGhlIHNhbWUgb2JqZWN0IGhhdmUKKyAgICAgICAgICBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGl0IGlzIHVuZGVmaW5lZCB3aGljaCBvZiB0aGUgdHdvIG1ldGhvZHMKKyAgICAgICAgICB3aWxsIGJlIGludm9rZWQuIEltcGxlbWVudGF0aW9ucyBtYXkgYWxzbyBjaG9vc2UgdG8gcmV0dXJuIGFuIGVycm9yIGluCisgICAgICAgICAgdGhpcyBhbWJpZ3VvdXMgY2FzZS4gSG93ZXZlciwgaWYgYSBtZXRob2QgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgcmVxdWlyZSBhbiBpbnRlcmZhY2UgZmllbGQuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBNZXRob2QgY2FsbCBtZXNzYWdlcyBhbHNvIGluY2x1ZGUgYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+UEFUSDwvY29kZT4gZmllbGQKKyAgICAgICAgICBpbmRpY2F0aW5nIHRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uIElmIHRoZSBjYWxsIGlzIHBhc3NpbmcKKyAgICAgICAgICB0aHJvdWdoIGEgbWVzc2FnZSBidXMsIHRoZSBtZXNzYWdlIHdpbGwgYWxzbyBoYXZlIGEKKyAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REVTVElOQVRJT048L2NvZGU+IGZpZWxkIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbgorICAgICAgICAgIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhbmRsZXMgYSBtZXRob2QgY2FsbCBtZXNzYWdlLCBpdCBpcyByZXF1aXJlZCB0bworICAgICAgICAgIHJldHVybiBhIHJlcGx5LiBUaGUgcmVwbHkgaXMgaWRlbnRpZmllZCBieSBhIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5SRVBMWV9TRVJJQUw8L2NvZGU+IGhlYWRlciBmaWVsZAorICAgICAgICAgIGluZGljYXRpbmcgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4gYmVpbmcgcmVwbGllZCB0by4gVGhlCisgICAgICAgICAgcmVwbHkgY2FuIGhhdmUgb25lIG9mIHR3byB0eXBlczsgZWl0aGVyIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfUkVUVVJOPC9jb2RlPiBvciA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+RVJST1I8L2NvZGU+LgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgSWYgdGhlIHJlcGx5IGhhcyB0eXBlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfUkVUVVJOPC9jb2RlPiwgdGhlIGFyZ3VtZW50cyB0byB0aGUgcmVwbHkgbWVzc2FnZSAKKyAgICAgICAgICBhcmUgdGhlIHJldHVybiB2YWx1ZShzKSBvciAib3V0IHBhcmFtZXRlcnMiIG9mIHRoZSBtZXRob2QgY2FsbC4gCisgICAgICAgICAgSWYgdGhlIHJlcGx5IGhhcyB0eXBlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5FUlJPUjwvY29kZT4sIHRoZW4gYW4gImV4Y2VwdGlvbiIgaGFzIGJlZW4gdGhyb3duLCAKKyAgICAgICAgICBhbmQgdGhlIGNhbGwgZmFpbHM7IG5vIHJldHVybiB2YWx1ZSB3aWxsIGJlIHByb3ZpZGVkLiBJdCBtYWtlcyAKKyAgICAgICAgICBubyBzZW5zZSB0byBzZW5kIG11bHRpcGxlIHJlcGxpZXMgdG8gdGhlIHNhbWUgbWV0aG9kIGNhbGwuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBFdmVuIGlmIGEgbWV0aG9kIGNhbGwgaGFzIG5vIHJldHVybiB2YWx1ZXMsIGEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FVEhPRF9SRVRVUk48L2NvZGU+IAorICAgICAgICAgIHJlcGx5IGlzIHJlcXVpcmVkLCBzbyB0aGUgY2FsbGVyIHdpbGwga25vdyB0aGUgbWV0aG9kIAorICAgICAgICAgIHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgVGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfUkVUVVJOPC9jb2RlPiBvciA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+RVJST1I8L2NvZGU+IHJlcGx5IG1lc3NhZ2UgbXVzdCBoYXZlIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+UkVQTFlfU0VSSUFMPC9jb2RlPiAKKyAgICAgICAgICBoZWFkZXIgZmllbGQuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBJZiBhIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4gbWVzc2FnZSBoYXMgdGhlIGZsYWcgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk5PX1JFUExZX0VYUEVDVEVEPC9jb2RlPiwgCisgICAgICAgICAgdGhlbiBhcyBhbiBvcHRpbWl6YXRpb24gdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmluZyB0aGUgbWV0aG9kIAorICAgICAgICAgIGNhbGwgbWF5IGNob29zZSB0byBvbWl0IHRoZSByZXBseSBtZXNzYWdlIChyZWdhcmRsZXNzIG9mIAorICAgICAgICAgIHdoZXRoZXIgdGhlIHJlcGx5IHdvdWxkIGhhdmUgYmVlbiA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TUVUSE9EX1JFVFVSTjwvY29kZT4gb3IgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkVSUk9SPC9jb2RlPikuIAorICAgICAgICAgIEhvd2V2ZXIsIGl0IGlzIGFsc28gYWNjZXB0YWJsZSB0byBpZ25vcmUgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5OT19SRVBMWV9FWFBFQ1RFRDwvY29kZT4KKyAgICAgICAgICBmbGFnIGFuZCByZXBseSBhbnl3YXkuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBVbmxlc3MgYSBtZXNzYWdlIGhhcyB0aGUgZmxhZyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Tk9fQVVUT19TVEFSVDwvY29kZT4sIGlmIHRoZQorICAgICAgICAgIGRlc3RpbmF0aW9uIG5hbWUgZG9lcyBub3QgZXhpc3QgdGhlbiBhIHByb2dyYW0gdG8gb3duIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICAgIG5hbWUgd2lsbCBiZSBzdGFydGVkIGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQuICBUaGUgbWVzc2FnZQorICAgICAgICAgIHdpbGwgYmUgaGVsZCB1bnRpbCB0aGUgbmV3IHByb2dyYW0gaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgb3IgaGFzCisgICAgICAgICAgZmFpbGVkIHRvIHN0YXJ0OyBpbiBjYXNlIG9mIGZhaWx1cmUsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMKKyAgICAgICAgICBmbGFnIGlzIG9ubHkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgYSBtZXNzYWdlIGJ1cywgaXQgaXMgaWdub3JlZAorICAgICAgICAgIGR1cmluZyBvbmUtdG8tb25lIGNvbW11bmljYXRpb24gd2l0aCBubyBpbnRlcm1lZGlhdGUgYnVzLgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDQiIHRpdGxlPSJNYXBwaW5nIG1ldGhvZCBjYWxscyB0byBuYXRpdmUgQVBJcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg1IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1tZXRob2QtYXBpcyI+PC9hPk1hcHBpbmcgbWV0aG9kIGNhbGxzIHRvIG5hdGl2ZSBBUElzPC9oNT48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICAgIEFQSXMgZm9yIEQtQnVzIG1heSBtYXAgbWV0aG9kIGNhbGxzIHRvIGEgbWV0aG9kIGNhbGwgaW4gYSBzcGVjaWZpYworICAgICAgICAgICAgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIHN1Y2ggYXMgQysrLCBvciBtYXkgbWFwIGEgbWV0aG9kIGNhbGwgd3JpdHRlbgorICAgICAgICAgICAgaW4gYW4gSURMIHRvIGEgRC1CdXMgbWVzc2FnZS4KKyAgICAgICAgICA8L3A+PHA+CisgICAgICAgICAgICBJbiBBUElzIG9mIHRoaXMgbmF0dXJlLCBhcmd1bWVudHMgdG8gYSBtZXRob2QgYXJlIG9mdGVuIHRlcm1lZCAiaW4iCisgICAgICAgICAgICAod2hpY2ggaW1wbGllcyBzZW50IGluIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TUVUSE9EX0NBTEw8L2NvZGU+KSwgb3IgIm91dCIgKHdoaWNoIGltcGxpZXMKKyAgICAgICAgICAgIHJldHVybmVkIGluIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TUVUSE9EX1JFVFVSTjwvY29kZT4pLiBTb21lIEFQSXMgc3VjaCBhcyBDT1JCQSBhbHNvIGhhdmUKKyAgICAgICAgICAgICJpbm91dCIgYXJndW1lbnRzLCB3aGljaCBhcmUgYm90aCBzZW50IGFuZCByZWNlaXZlZCwgaS5lLiB0aGUgY2FsbGVyCisgICAgICAgICAgICBwYXNzZXMgaW4gYSB2YWx1ZSB3aGljaCBpcyBtb2RpZmllZC4gTWFwcGVkIHRvIEQtQnVzLCBhbiAiaW5vdXQiCisgICAgICAgICAgICBhcmd1bWVudCBpcyBlcXVpdmFsZW50IHRvIGFuICJpbiIgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IGFuICJvdXQiCisgICAgICAgICAgICBhcmd1bWVudC4gWW91IGNhbid0IHBhc3MgdGhpbmdzICJieSByZWZlcmVuY2UiIG92ZXIgdGhlIHdpcmUsIHNvCisgICAgICAgICAgICAiaW5vdXQiIGlzIHB1cmVseSBhbiBpbGx1c2lvbiBvZiB0aGUgaW4tcHJvY2VzcyBBUEkuCisgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgR2l2ZW4gYSBtZXRob2Qgd2l0aCB6ZXJvIG9yIG9uZSByZXR1cm4gdmFsdWVzLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUKKyAgICAgICAgICAgIGFyZ3VtZW50cywgd2hlcmUgZWFjaCBhcmd1bWVudCBtYXkgYmUgImluIiwgIm91dCIsIG9yICJpbm91dCIsIHRoZQorICAgICAgICAgICAgY2FsbGVyIGNvbnN0cnVjdHMgYSBtZXNzYWdlIGJ5IGFwcGVuZGluZyBlYWNoICJpbiIgb3IgImlub3V0IiBhcmd1bWVudCwKKyAgICAgICAgICAgIGluIG9yZGVyLiAib3V0IiBhcmd1bWVudHMgYXJlIG5vdCByZXByZXNlbnRlZCBpbiB0aGUgY2FsbGVyJ3MgbWVzc2FnZS4KKyAgICAgICAgICA8L3A+PHA+CisgICAgICAgICAgICBUaGUgcmVjaXBpZW50IGNvbnN0cnVjdHMgYSByZXBseSBieSBhcHBlbmRpbmcgZmlyc3QgdGhlIHJldHVybiB2YWx1ZSAKKyAgICAgICAgICAgIGlmIGFueSwgdGhlbiBlYWNoICJvdXQiIG9yICJpbm91dCIgYXJndW1lbnQsIGluIG9yZGVyLiAKKyAgICAgICAgICAgICJpbiIgYXJndW1lbnRzIGFyZSBub3QgcmVwcmVzZW50ZWQgaW4gdGhlIHJlcGx5IG1lc3NhZ2UuCisgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgRXJyb3IgcmVwbGllcyBhcmUgbm9ybWFsbHkgbWFwcGVkIHRvIGV4Y2VwdGlvbnMgaW4gbGFuZ3VhZ2VzIHRoYXQgaGF2ZQorICAgICAgICAgICAgZXhjZXB0aW9ucy4KKyAgICAgICAgICA8L3A+PHA+CisgICAgICAgICAgICBJbiBjb252ZXJ0aW5nIGZyb20gbmF0aXZlIEFQSXMgdG8gRC1CdXMsIGl0IGlzIHBlcmhhcHMgbmljZSB0byAKKyAgICAgICAgICAgIG1hcCBELUJ1cyBuYW1pbmcgY29udmVudGlvbnMgKCJGb29CYXIiKSB0byBuYXRpdmUgY29udmVudGlvbnMgCisgICAgICAgICAgICBzdWNoIGFzICJmb29CYXIiIG9yICJmb29fYmFyIiBhdXRvbWF0aWNhbGx5LiBUaGlzIGlzIE9LIAorICAgICAgICAgICAgYXMgbG9uZyBhcyB5b3UgY2FuIHNheSB0aGF0IHRoZSBuYXRpdmUgQVBJIGlzIG9uZSB0aGF0IAorICAgICAgICAgICAgd2FzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBELUJ1cy4gSXQgbWFrZXMgdGhlIG1vc3Qgc2Vuc2UKKyAgICAgICAgICAgIHdoZW4gd3JpdGluZyBvYmplY3QgaW1wbGVtZW50YXRpb25zIHRoYXQgd2lsbCBiZSBleHBvcnRlZCAKKyAgICAgICAgICAgIG92ZXIgdGhlIGJ1cy4gT2JqZWN0IHByb3hpZXMgdXNlZCB0byBpbnZva2UgcmVtb3RlIEQtQnVzIAorICAgICAgICAgICAgb2JqZWN0cyBwcm9iYWJseSBuZWVkIHRoZSBhYmlsaXR5IHRvIGNhbGwgYW55IEQtQnVzIG1ldGhvZCwKKyAgICAgICAgICAgIGFuZCB0aHVzIGEgbWFnaWMgbmFtZSBtYXBwaW5nIGxpa2UgdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0uCisgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhbnl0aGluZyBvZiBuYXRpdmUgQVBJIGJpbmRpbmdzOworICAgICAgICAgICAgdGhlIHByZWNlZGluZyBpcyBvbmx5IGEgc3VnZ2VzdGVkIGNvbnZlbnRpb24gZm9yIGNvbnNpc3RlbmN5IAorICAgICAgICAgICAgYW1vbmcgYmluZGluZ3MuCisgICAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iU2lnbmFsIEVtaXNzaW9uIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLXNpZ25hbCI+PC9hPlNpZ25hbCBFbWlzc2lvbjwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgVW5saWtlIG1ldGhvZCBjYWxscywgc2lnbmFsIGVtaXNzaW9ucyBoYXZlIG5vIHJlcGxpZXMuIAorICAgICAgICAgIEEgc2lnbmFsIGVtaXNzaW9uIGlzIHNpbXBseSBhIHNpbmdsZSBtZXNzYWdlIG9mIHR5cGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNJR05BTDwvY29kZT4uCisgICAgICAgICAgSXQgbXVzdCBoYXZlIHRocmVlIGhlYWRlciBmaWVsZHM6IDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5QQVRIPC9jb2RlPiBnaXZpbmcgdGhlIG9iamVjdCAKKyAgICAgICAgICB0aGUgc2lnbmFsIHdhcyBlbWl0dGVkIGZyb20sIHBsdXMgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVEVSRkFDRTwvY29kZT4gYW5kIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRU1CRVI8L2NvZGU+IGdpdmluZworICAgICAgICAgIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2lnbmFsLiBUaGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPklOVEVSRkFDRTwvY29kZT4gaGVhZGVyIGlzIHJlcXVpcmVkCisgICAgICAgICAgZm9yIHNpZ25hbHMsIHRob3VnaCBpdCBpcyBvcHRpb25hbCBmb3IgbWV0aG9kIGNhbGxzLgorICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJFcnJvcnMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtZXJyb3JzIj48L2E+RXJyb3JzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBNZXNzYWdlcyBvZiB0eXBlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5FUlJPUjwvY29kZT4gYXJlIG1vc3QgY29tbW9ubHkgcmVwbGllcyAKKyAgICAgICAgICB0byBhIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4sIGJ1dCBtYXkgYmUgcmV0dXJuZWQgaW4gcmVwbHkgCisgICAgICAgICAgdG8gYW55IGtpbmQgb2YgbWVzc2FnZS4gVGhlIG1lc3NhZ2UgYnVzIGZvciBleGFtcGxlCisgICAgICAgICAgd2lsbCByZXR1cm4gYW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkVSUk9SPC9jb2RlPiBpbiByZXBseSB0byBhIHNpZ25hbCBlbWlzc2lvbiBpZiAKKyAgICAgICAgICB0aGUgYnVzIGRvZXMgbm90IGhhdmUgZW5vdWdoIG1lbW9yeSB0byBzZW5kIHRoZSBzaWduYWwuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBBbiA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+RVJST1I8L2NvZGU+IG1heSBoYXZlIGFueSBhcmd1bWVudHMsIGJ1dCBpZiB0aGUgZmlyc3QgCisgICAgICAgICAgYXJndW1lbnQgaXMgYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+U1RSSU5HPC9jb2RlPiwgaXQgbXVzdCBiZSBhbiBlcnJvciBtZXNzYWdlLgorICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIG1heSBiZSBsb2dnZWQgb3Igc2hvd24gdG8gdGhlIHVzZXIKKyAgICAgICAgICBpbiBzb21lIHdheS4KKyAgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iTm90YXRpb24gaW4gdGhpcyBkb2N1bWVudCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1ub3RhdGlvbiI+PC9hPk5vdGF0aW9uIGluIHRoaXMgZG9jdW1lbnQ8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIFRoaXMgZG9jdW1lbnQgdXNlcyBhIHNpbXBsZSBwc2V1ZG8tSURMIHRvIGRlc2NyaWJlIHBhcnRpY3VsYXIgbWV0aG9kIAorICAgICAgICAgIGNhbGxzIGFuZCBzaWduYWxzLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRob2QgY2FsbDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuU3RhcnRTZXJ2aWNlQnlOYW1lIChpbiBTVFJJTkcgbmFtZSwgaW4gVUlOVDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgVUlOVDMyIHJlc3VsdGNvZGUpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgVGhpcyBtZWFucyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+SU5URVJGQUNFPC9jb2RlPiA9IG9yZy5mcmVlZGVza3RvcC5EQnVzLCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TUVNQkVSPC9jb2RlPiA9IFN0YXJ0U2VydmljZUJ5TmFtZSwgCisgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FVEhPRF9DQUxMPC9jb2RlPiBhcmd1bWVudHMgYXJlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJJTkc8L2NvZGU+IGFuZCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VUlOVDMyPC9jb2RlPiwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FVEhPRF9SRVRVUk48L2NvZGU+IGFyZ3VtZW50CisgICAgICAgICAgaXMgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlVJTlQzMjwvY29kZT4uIFJlbWVtYmVyIHRoYXQgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRU1CRVI8L2NvZGU+IGZpZWxkIGNhbid0IGNvbnRhaW4gYW55ICcuJyAocGVyaW9kKQorICAgICAgICAgIGNoYXJhY3RlcnMgc28gaXQncyBrbm93biB0aGF0IHRoZSBsYXN0IHBhcnQgb2YgdGhlIG5hbWUgaW4KKyAgICAgICAgICB0aGUgIklETCIgaXMgdGhlIG1lbWJlciBuYW1lLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgSW4gQysrIHRoYXQgbWlnaHQgZW5kIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3JnOjpmcmVlZGVza3RvcDo6REJ1czo6U3RhcnRTZXJ2aWNlQnlOYW1lIChjb25zdCBjaGFyICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7CisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgb3IgZXF1YWxseSB2YWxpZCwgdGhlIHJldHVybiB2YWx1ZSBjb3VsZCBiZSBkb25lIGFzIGFuIGFyZ3VtZW50OgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICB2b2lkIG9yZzo6ZnJlZWRlc2t0b3A6OkRCdXM6OlN0YXJ0U2VydmljZUJ5TmFtZSAoY29uc3QgY2hhciAgICpuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcmVzdWx0Y29kZSk7CisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgSXQncyByZWFsbHkgdXAgdG8gdGhlIEFQSSBkZXNpZ25lciBob3cgdGhleSB3YW50IHRvIG1ha2UgCisgICAgICAgICAgdGhpcyBsb29rLiBZb3UgY291bGQgZGVzaWduIGFuIEFQSSB3aGVyZSB0aGUgbmFtZXNwYWNlIHdhc24ndCB1c2VkIAorICAgICAgICAgIGluIEMrKywgdXNpbmcgU1RMIG9yIFF0LCB1c2luZyB2YXJhcmdzLCBvciB3aGF0ZXZlciB5b3Ugd2FudGVkLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgU2lnbmFscyBhcmUgd3JpdHRlbiBhcyBmb2xsb3dzOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lTG9zdCAoU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgU2lnbmFscyBkb24ndCBzcGVjaWZ5ICJpbiIgdnMuICJvdXQiIGJlY2F1c2Ugb25seSAKKyAgICAgICAgICBhIHNpbmdsZSBkaXJlY3Rpb24gaXMgcG9zc2libGUuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBJdCBpc24ndCBlc3BlY2lhbGx5IGVuY291cmFnZWQgdG8gdXNlIHRoaXMgbGFtZSBwc2V1ZG8tSURMIGluIGFjdHVhbAorICAgICAgICAgIEFQSSBpbXBsZW1lbnRhdGlvbnM7IHlvdSBtaWdodCB1c2UgdGhlIG5hdGl2ZSBub3RhdGlvbiBmb3IgdGhlCisgICAgICAgICAgbGFuZ3VhZ2UgeW91J3JlIHVzaW5nLCBvciB5b3UgbWlnaHQgdXNlIENPTSBvciBDT1JCQSBJREwsIGZvciBleGFtcGxlLgorICAgICAgICA8L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJJbnZhbGlkIFByb3RvY29sIGFuZCBTcGVjIEV4dGVuc2lvbnMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtcHJvdG9jb2wtaGFuZGxpbmctaW52YWxpZCI+PC9hPkludmFsaWQgUHJvdG9jb2wgYW5kIFNwZWMgRXh0ZW5zaW9uczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEZvciBzZWN1cml0eSByZWFzb25zLCB0aGUgRC1CdXMgcHJvdG9jb2wgc2hvdWxkIGJlIHN0cmljdGx5IHBhcnNlZCBhbmQKKyAgICAgICAgdmFsaWRhdGVkLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgZGVmaW5lZCBleHRlbnNpb24gcG9pbnRzLiBBbnkgaW52YWxpZAorICAgICAgICBwcm90b2NvbCBvciBzcGVjIHZpb2xhdGlvbnMgc2hvdWxkIHJlc3VsdCBpbiBpbW1lZGlhdGVseSBkcm9wcGluZyB0aGUKKyAgICAgICAgY29ubmVjdGlvbiB3aXRob3V0IG5vdGljZSB0byB0aGUgb3RoZXIgZW5kLiBFeGNlcHRpb25zIHNob3VsZCBiZQorICAgICAgICBjYXJlZnVsbHkgY29uc2lkZXJlZCwgZS5nLiBhbiBleGNlcHRpb24gbWF5IGJlIHdhcnJhbnRlZCBmb3IgYQorICAgICAgICB3ZWxsLXVuZGVyc3Rvb2QgaWRpb3N5bmNyYXN5IG9mIGEgd2lkZWx5LWRlcGxveWVkIGltcGxlbWVudGF0aW9uLiAgSW4KKyAgICAgICAgY2FzZXMgd2hlcmUgdGhlIG90aGVyIGVuZCBvZiBhIGNvbm5lY3Rpb24gaXMgMTAwJSB0cnVzdGVkIGFuZCBrbm93biB0bworICAgICAgICBiZSBmcmllbmRseSwgc2tpcHBpbmcgdmFsaWRhdGlvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBjb3VsZCBhbHNvIG1ha2UKKyAgICAgICAgc2Vuc2UgaW4gY2VydGFpbiBjYXNlcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgR2VuZXJhbGx5IHNwZWFraW5nIHZpb2xhdGlvbnMgb2YgdGhlICJtdXN0IiByZXF1aXJlbWVudHMgaW4gdGhpcyBzcGVjIAorICAgICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBwb3NzaWJsZSBhdHRlbXB0cyB0byBleHBsb2l0IHNlY3VyaXR5LCBhbmQgdmlvbGF0aW9ucyAKKyAgICAgICAgb2YgdGhlICJzaG91bGQiIHN1Z2dlc3Rpb25zIHNob3VsZCBiZSBjb25zaWRlcmVkIGxlZ2l0aW1hdGUgKHRob3VnaCBwZXJoYXBzCisgICAgICAgIHRoZXkgc2hvdWxkIGdlbmVyYXRlIGFuIGVycm9yIGluIHNvbWUgY2FzZXMpLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludHMgYXJlIGJ1aWx0IGluIHRvIEQtQnVzIG9uIHB1cnBvc2UgYW5kIG11c3QKKyAgICAgICAgbm90IGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBwcm90b2NvbC4gVGhlIGV4dGVuc2lvbiBwb2ludHMgYXJlIGludGVuZGVkCisgICAgICAgIGZvciB1c2UgYnkgZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgc3BlYywgdGhleSBhcmUgbm90IGludGVuZGVkIGZvciB0aGlyZAorICAgICAgICBwYXJ0aWVzLiAgQXQgdGhlIG1vbWVudCwgdGhlIG9ubHkgd2F5IGEgdGhpcmQgcGFydHkgY291bGQgZXh0ZW5kIEQtQnVzCisgICAgICAgIHdpdGhvdXQgYnJlYWtpbmcgaW50ZXJvcGVyYWJpbGl0eSB3b3VsZCBiZSB0byBpbnRyb2R1Y2UgYSB3YXkgdG8gbmVnb3RpYXRlIG5ldworICAgICAgICBmZWF0dXJlIHN1cHBvcnQgYXMgcGFydCBvZiB0aGUgYXV0aCBwcm90b2NvbCwgdXNpbmcgRVhURU5TSU9OXy1wcmVmaXhlZAorICAgICAgICBjb21tYW5kcy4gVGhlcmUgaXMgbm90IHlldCBhIHN0YW5kYXJkIHdheSB0byBuZWdvdGlhdGUgZmVhdHVyZXMuCisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgSW4gdGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIChzZWUgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNhdXRoLXByb3RvY29sIiB0aXRsZT0iQXV0aGVudGljYXRpb24gUHJvdG9jb2wiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7QXV0aGVudGljYXRpb24gUHJvdG9jb2wmIzgyMjE7PC9hPikgdW5rbm93biAKKyAgICAgICAgICAgICAgICBjb21tYW5kcyByZXN1bHQgaW4gYW4gRVJST1IgcmF0aGVyIHRoYW4gYSBkaXNjb25uZWN0LiBUaGlzIGVuYWJsZXMgCisgICAgICAgICAgICAgICAgZnV0dXJlIGV4dGVuc2lvbnMgdG8gdGhlIHByb3RvY29sLiBDb21tYW5kcyBzdGFydGluZyB3aXRoIEVYVEVOU0lPTl8gYXJlIAorICAgICAgICAgICAgICAgIHJlc2VydmVkIGZvciB0aGlyZCBwYXJ0aWVzLgorICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCBzdXBwb3J0cyBwbHVnZ2FibGUgYXV0aCBtZWNoYW5pc21zLgorICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFRoZSBhZGRyZXNzIGZvcm1hdCAoc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjYWRkcmVzc2VzIiB0aXRsZT0iU2VydmVyIEFkZHJlc3NlcyI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtTZXJ2ZXIgQWRkcmVzc2VzJiM4MjIxOzwvYT4pIHN1cHBvcnRzIG5ldworICAgICAgICAgICAgICBraW5kcyBvZiB0cmFuc3BvcnQuCisgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgTWVzc2FnZXMgd2l0aCBhbiB1bmtub3duIHR5cGUgKHNvbWV0aGluZyBvdGhlciB0aGFuCisgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4sIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfUkVUVVJOPC9jb2RlPiwKKyAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkVSUk9SPC9jb2RlPiwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPlNJR05BTDwvY29kZT4pIGFyZSBpZ25vcmVkLiAKKyAgICAgICAgICAgICAgVW5rbm93bi10eXBlIG1lc3NhZ2VzIG11c3Qgc3RpbGwgYmUgd2VsbC1mb3JtZWQgaW4gdGhlIHNhbWUgd2F5IAorICAgICAgICAgICAgICBhcyB0aGUga25vd24gbWVzc2FnZXMsIGhvd2V2ZXIuIFRoZXkgc3RpbGwgaGF2ZSB0aGUgbm9ybWFsIAorICAgICAgICAgICAgICBoZWFkZXIgYW5kIGJvZHkuCisgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgSGVhZGVyIGZpZWxkcyB3aXRoIGFuIHVua25vd24gb3IgdW5leHBlY3RlZCBmaWVsZCBjb2RlIG11c3QgYmUgaWdub3JlZCwgCisgICAgICAgICAgICAgIHRob3VnaCBhZ2FpbiB0aGV5IG11c3Qgc3RpbGwgYmUgd2VsbC1mb3JtZWQuCisgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgTmV3IHN0YW5kYXJkIGludGVyZmFjZXMgKHdpdGggbmV3IG1ldGhvZHMgYW5kIHNpZ25hbHMpIGNhbiBvZiBjb3Vyc2UgYmUgYWRkZWQuCisgICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iQXV0aGVudGljYXRpb24gUHJvdG9jb2wiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iYXV0aC1wcm90b2NvbCI+PC9hPkF1dGhlbnRpY2F0aW9uIFByb3RvY29sPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIEJlZm9yZSB0aGUgZmxvdyBvZiBtZXNzYWdlcyBiZWdpbnMsIHR3byBhcHBsaWNhdGlvbnMgbXVzdAorICAgICAgYXV0aGVudGljYXRlLiBBIHNpbXBsZSBwbGFpbi10ZXh0IHByb3RvY29sIGlzIHVzZWQgZm9yCisgICAgICBhdXRoZW50aWNhdGlvbjsgdGhpcyBwcm90b2NvbCBpcyBhIFNBU0wgcHJvZmlsZSwgYW5kIG1hcHMgZmFpcmx5CisgICAgICBkaXJlY3RseSBmcm9tIHRoZSBTQVNMIHNwZWNpZmljYXRpb24uIFRoZSBtZXNzYWdlIGVuY29kaW5nIGlzCisgICAgICBOT1QgdXNlZCBoZXJlLCBvbmx5IHBsYWluIHRleHQgbWVzc2FnZXMuCisgICAgPC9wPjxwPgorICAgICAgSW4gZXhhbXBsZXMsICJDOiIgYW5kICJTOiIgaW5kaWNhdGUgbGluZXMgc2VudCBieSB0aGUgY2xpZW50IGFuZAorICAgICAgc2VydmVyIHJlc3BlY3RpdmVseS4KKyAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJQcm90b2NvbCBPdmVydmlldyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYXV0aC1wcm90b2NvbC1vdmVydmlldyI+PC9hPlByb3RvY29sIE92ZXJ2aWV3PC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlIHByb3RvY29sIGlzIGEgbGluZS1iYXNlZCBwcm90b2NvbCwgd2hlcmUgZWFjaCBsaW5lIGVuZHMgd2l0aAorICAgICAgICBcclxuLiBFYWNoIGxpbmUgYmVnaW5zIHdpdGggYW4gYWxsLWNhcHMgQVNDSUkgY29tbWFuZCBuYW1lIGNvbnRhaW5pbmcKKyAgICAgICAgb25seSB0aGUgY2hhcmFjdGVyIHJhbmdlIFtBLVpfXSwgYSBzcGFjZSwgdGhlbiBhbnkgYXJndW1lbnRzIGZvciB0aGUKKyAgICAgICAgY29tbWFuZCwgdGhlbiB0aGUgXHJcbiBlbmRpbmcgdGhlIGxpbmUuIFRoZSBwcm90b2NvbCBpcworICAgICAgICBjYXNlLXNlbnNpdGl2ZS4gQWxsIGJ5dGVzIG11c3QgYmUgaW4gdGhlIEFTQ0lJIGNoYXJhY3RlciBzZXQuCisKKyAgICAgICAgQ29tbWFuZHMgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPkFVVEggW21lY2hhbmlzbV0gW2luaXRpYWwtcmVzcG9uc2VdPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+Q0FOQ0VMPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+QkVHSU48L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5EQVRBICZsdDtkYXRhIGluIGhleCBlbmNvZGluZyZndDs8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5FUlJPUiBbaHVtYW4tcmVhZGFibGUgZXJyb3IgZXhwbGFuYXRpb25dPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+TkVHT1RJQVRFX1VOSVhfRkQ8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorCisgICAgICAgIEZyb20gc2VydmVyIHRvIGNsaWVudCBhcmUgYXMgZm9sbG93czoKKworICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+UkVKRUNURUQgJmx0O3NwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIG1lY2hhbmlzbSBuYW1lcyZndDs8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5PSyAmbHQ7R1VJRCBpbiBoZXgmZ3Q7PC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+REFUQSAmbHQ7ZGF0YSBpbiBoZXggZW5jb2RpbmcmZ3Q7PC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+RVJST1I8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5BR1JFRV9VTklYX0ZEPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVW5vZmZpY2lhbCBleHRlbnNpb25zIHRvIHRoZSBjb21tYW5kIHNldCBtdXN0IGJlZ2luIHdpdGggdGhlIGxldHRlcnMgCisgICAgICAgICJFWFRFTlNJT05fIiwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZnV0dXJlIG9mZmljaWFsIGNvbW1hbmRzLgorICAgICAgICBGb3IgZXhhbXBsZSwgIkVYVEVOU0lPTl9DT01fTVlET01BSU5fRE9fU1RVRkYiLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iU3BlY2lhbCBjcmVkZW50aWFscy1wYXNzaW5nIG51bCBieXRlIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLW51bC1ieXRlIj48L2E+U3BlY2lhbCBjcmVkZW50aWFscy1wYXNzaW5nIG51bCBieXRlPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgSW1tZWRpYXRlbHkgYWZ0ZXIgY29ubmVjdGluZyB0byB0aGUgc2VydmVyLCB0aGUgY2xpZW50IG11c3Qgc2VuZCBhCisgICAgICAgIHNpbmdsZSBudWwgYnl0ZS4gVGhpcyBieXRlIG1heSBiZSBhY2NvbXBhbmllZCBieSBjcmVkZW50aWFscworICAgICAgICBpbmZvcm1hdGlvbiBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgdXNlIHNlbmRtc2coKSB3aXRoCisgICAgICAgIFNDTV9DUkVEUyBvciBTQ01fQ1JFREVOVElBTFMgdG8gcGFzcyBjcmVkZW50aWFscyBvdmVyIFVOSVggZG9tYWluCisgICAgICAgIHNvY2tldHMuIEhvd2V2ZXIsIHRoZSBudWwgYnl0ZSBtdXN0IGJlIHNlbnQgZXZlbiBvbiBvdGhlciBraW5kcyBvZgorICAgICAgICBzb2NrZXQsIGFuZCBldmVuIG9uIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBieXRlIHRvIGJlCisgICAgICAgIHNlbnQgaW4gb3JkZXIgdG8gdHJhbnNtaXQgY3JlZGVudGlhbHMuIFRoZSB0ZXh0IHByb3RvY29sIGRlc2NyaWJlZCBpbgorICAgICAgICB0aGlzIGRvY3VtZW50IGJlZ2lucyBhZnRlciB0aGUgc2luZ2xlIG51bCBieXRlLiBJZiB0aGUgZmlyc3QgYnl0ZQorICAgICAgICByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgaXMgbm90IGEgbnVsIGJ5dGUsIHRoZSBzZXJ2ZXIgbWF5IGRpc2Nvbm5lY3QgCisgICAgICAgIHRoYXQgY2xpZW50LgorICAgICAgPC9wPjxwPgorICAgICAgICBBIG51bCBieXRlIGluIGFueSBjb250ZXh0IG90aGVyIHRoYW4gdGhlIGluaXRpYWwgYnl0ZSBpcyBhbiBlcnJvcjsgCisgICAgICAgIHRoZSBwcm90b2NvbCBpcyBBU0NJSS1vbmx5LgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgY3JlZGVudGlhbHMgc2VudCBhbG9uZyB3aXRoIHRoZSBudWwgYnl0ZSBtYXkgYmUgdXNlZCB3aXRoIHRoZSAKKyAgICAgICAgU0FTTCBtZWNoYW5pc20gRVhURVJOQUwuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJBVVRIIGNvbW1hbmQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImF1dGgtY29tbWFuZC1hdXRoIj48L2E+QVVUSCBjb21tYW5kPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgSWYgYW4gQVVUSCBjb21tYW5kIGhhcyBubyBhcmd1bWVudHMsIGl0IGlzIGEgcmVxdWVzdCB0byBsaXN0CisgICAgICAgIGF2YWlsYWJsZSBtZWNoYW5pc21zLiBUaGUgc2VydmVyIG11c3QgcmVzcG9uZCB3aXRoIGEgUkVKRUNURUQKKyAgICAgICAgY29tbWFuZCBsaXN0aW5nIHRoZSBtZWNoYW5pc21zIGl0IHVuZGVyc3RhbmRzLCBvciB3aXRoIGFuIGVycm9yLgorICAgICAgPC9wPjxwPgorICAgICAgICBJZiBhbiBBVVRIIGNvbW1hbmQgc3BlY2lmaWVzIGEgbWVjaGFuaXNtLCBhbmQgdGhlIHNlcnZlciBzdXBwb3J0cworICAgICAgICBzYWlkIG1lY2hhbmlzbSwgdGhlIHNlcnZlciBzaG91bGQgYmVnaW4gZXhjaGFuZ2luZyBTQVNMCisgICAgICAgIGNoYWxsZW5nZS1yZXNwb25zZSBkYXRhIHdpdGggdGhlIGNsaWVudCB1c2luZyBEQVRBIGNvbW1hbmRzLgorICAgICAgPC9wPjxwPgorICAgICAgICBJZiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1lY2hhbmlzbSBnaXZlbiBpbiB0aGUgQVVUSAorICAgICAgICBjb21tYW5kLCBpdCBtdXN0IHNlbmQgZWl0aGVyIGEgUkVKRUNURUQgY29tbWFuZCBsaXN0aW5nIHRoZSBtZWNoYW5pc21zCisgICAgICAgIGl0IGRvZXMgc3VwcG9ydCwgb3IgYW4gZXJyb3IuCisgICAgICA8L3A+PHA+CisgICAgICAgIElmIHRoZSBbaW5pdGlhbC1yZXNwb25zZV0gYXJndW1lbnQgaXMgcHJvdmlkZWQsIGl0IGlzIGludGVuZGVkIGZvciB1c2UKKyAgICAgICAgd2l0aCBtZWNoYW5pc21zIHRoYXQgaGF2ZSBubyBpbml0aWFsIGNoYWxsZW5nZSAob3IgYW4gZW1wdHkgaW5pdGlhbAorICAgICAgICBjaGFsbGVuZ2UpLCBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCB0byBhbiBpbml0aWFsIERBVEEgY29tbWFuZC4gSWYKKyAgICAgICAgdGhlIHNlbGVjdGVkIG1lY2hhbmlzbSBoYXMgYW4gaW5pdGlhbCBjaGFsbGVuZ2UgYW5kIFtpbml0aWFsLXJlc3BvbnNlXQorICAgICAgICB3YXMgcHJvdmlkZWQsIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlamVjdCBhdXRoZW50aWNhdGlvbiBieSBzZW5kaW5nCisgICAgICAgIFJFSkVDVEVELgorICAgICAgPC9wPjxwPgorICAgICAgICBJZiBhdXRoZW50aWNhdGlvbiBzdWNjZWVkcyBhZnRlciBleGNoYW5naW5nIERBVEEgY29tbWFuZHMsIAorICAgICAgICBhbiBPSyBjb21tYW5kIG11c3QgYmUgc2VudCB0byB0aGUgY2xpZW50LgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciBhZnRlciB0aGUgXHJcbiBvZiB0aGUgQkVHSU4KKyAgICAgICAgY29tbWFuZCBmcm9tIHRoZSBjbGllbnQgbXVzdCBiZSB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlCisgICAgICAgIGF1dGhlbnRpY2F0ZWQvZW5jcnlwdGVkIHN0cmVhbSBvZiBELUJ1cyBtZXNzYWdlcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgSWYgQkVHSU4gaXMgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciwgdGhlIGZpcnN0IG9jdGV0IHJlY2VpdmVkCisgICAgICAgIGJ5IHRoZSBjbGllbnQgYWZ0ZXIgdGhlIFxyXG4gb2YgdGhlIE9LIGNvbW1hbmQgbXVzdCBiZSB0aGUKKyAgICAgICAgZmlyc3Qgb2N0ZXQgb2YgdGhlIGF1dGhlbnRpY2F0ZWQvZW5jcnlwdGVkIHN0cmVhbSBvZiBELUJ1cworICAgICAgICBtZXNzYWdlcy4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IkNBTkNFTCBDb21tYW5kIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLWNvbW1hbmQtY2FuY2VsIj48L2E+Q0FOQ0VMIENvbW1hbmQ8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBBdCBhbnkgdGltZSB1cCB0byBzZW5kaW5nIHRoZSBCRUdJTiBjb21tYW5kLCB0aGUgY2xpZW50IG1heSBzZW5kIGEKKyAgICAgICAgQ0FOQ0VMIGNvbW1hbmQuIE9uIHJlY2VpdmluZyB0aGUgQ0FOQ0VMIGNvbW1hbmQsIHRoZSBzZXJ2ZXIgbXVzdAorICAgICAgICBzZW5kIGEgUkVKRUNURUQgY29tbWFuZCBhbmQgYWJvcnQgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgZXhjaGFuZ2UuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJEQVRBIENvbW1hbmQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImF1dGgtY29tbWFuZC1kYXRhIj48L2E+REFUQSBDb21tYW5kPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlIERBVEEgY29tbWFuZCBtYXkgY29tZSBmcm9tIGVpdGhlciBjbGllbnQgb3Igc2VydmVyLCBhbmQgc2ltcGx5IAorICAgICAgICBjb250YWlucyBhIGhleC1lbmNvZGVkIGJsb2NrIG9mIGRhdGEgdG8gYmUgaW50ZXJwcmV0ZWQgCisgICAgICAgIGFjY29yZGluZyB0byB0aGUgU0FTTCBtZWNoYW5pc20gaW4gdXNlLgorICAgICAgPC9wPjxwPgorICAgICAgICBTb21lIFNBU0wgbWVjaGFuaXNtcyBzdXBwb3J0IHNlbmRpbmcgYW4gImVtcHR5IHN0cmluZyI7IAorICAgICAgICBGSVhNRSB3ZSBuZWVkIHNvbWUgd2F5IHRvIGRvIHRoaXMuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJCRUdJTiBDb21tYW5kIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLWNvbW1hbmQtYmVnaW4iPjwvYT5CRUdJTiBDb21tYW5kPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlIEJFR0lOIGNvbW1hbmQgYWNrbm93bGVkZ2VzIHRoYXQgdGhlIGNsaWVudCBoYXMgcmVjZWl2ZWQgYW4gCisgICAgICAgIE9LIGNvbW1hbmQgZnJvbSB0aGUgc2VydmVyLCBhbmQgdGhhdCB0aGUgc3RyZWFtIG9mIG1lc3NhZ2VzCisgICAgICAgIGlzIGFib3V0IHRvIGJlZ2luLiAKKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhlIGZpcnN0IG9jdGV0IHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIgYWZ0ZXIgdGhlIFxyXG4gb2YgdGhlIEJFR0lOCisgICAgICAgIGNvbW1hbmQgZnJvbSB0aGUgY2xpZW50IG11c3QgYmUgdGhlIGZpcnN0IG9jdGV0IG9mIHRoZQorICAgICAgICBhdXRoZW50aWNhdGVkL2VuY3J5cHRlZCBzdHJlYW0gb2YgRC1CdXMgbWVzc2FnZXMuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJSRUpFQ1RFRCBDb21tYW5kIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLWNvbW1hbmQtcmVqZWN0ZWQiPjwvYT5SRUpFQ1RFRCBDb21tYW5kPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlIFJFSkVDVEVEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgZXhjaGFuZ2UgaGFzIGZhaWxlZCwgYW5kIGZ1cnRoZXIgZXhjaGFuZ2Ugb2YgREFUQSBpcyBpbmFwcHJvcHJpYXRlLgorICAgICAgICBUaGUgY2xpZW50IHdvdWxkIG5vcm1hbGx5IHRyeSBhbm90aGVyIG1lY2hhbmlzbSwgb3IgdHJ5IHByb3ZpZGluZworICAgICAgICBkaWZmZXJlbnQgcmVzcG9uc2VzIHRvIGNoYWxsZW5nZXMuCisgICAgICA8L3A+PHA+CisgICAgICAgIE9wdGlvbmFsbHksIHRoZSBSRUpFQ1RFRCBjb21tYW5kIGhhcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICAgIGF2YWlsYWJsZSBhdXRoIG1lY2hhbmlzbXMgYXMgYXJndW1lbnRzLiBJZiBhIHNlcnZlciBldmVyIHByb3ZpZGVzCisgICAgICAgIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbWVjaGFuaXNtcywgaXQgbXVzdCBwcm92aWRlIHRoZSBzYW1lIGxpc3QgCisgICAgICAgIGVhY2ggdGltZSBpdCBzZW5kcyBhIFJFSkVDVEVEIG1lc3NhZ2UuIENsaWVudHMgYXJlIGZyZWUgdG8gCisgICAgICAgIGlnbm9yZSBhbGwgbGlzdHMgcmVjZWl2ZWQgYWZ0ZXIgdGhlIGZpcnN0LgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iT0sgQ29tbWFuZCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYXV0aC1jb21tYW5kLW9rIj48L2E+T0sgQ29tbWFuZDwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoZSBPSyBjb21tYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4KKyAgICAgICAgYXV0aGVudGljYXRlZC4gVGhlIGNsaWVudCBtYXkgbm93IHByb2NlZWQgd2l0aCBuZWdvdGlhdGluZworICAgICAgICBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUbyBkbyB0aGF0IGl0IHNoYWxsIHNlbmQKKyAgICAgICAgTkVHT1RJQVRFX1VOSVhfRkQgdG8gdGhlIHNlcnZlci4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgT3RoZXJ3aXNlLCB0aGUgY2xpZW50IG11c3QgcmVzcG9uZCB0byB0aGUgT0sgY29tbWFuZCBieQorICAgICAgICBzZW5kaW5nIGEgQkVHSU4gY29tbWFuZCwgZm9sbG93ZWQgYnkgaXRzIHN0cmVhbSBvZiBtZXNzYWdlcywKKyAgICAgICAgb3IgYnkgZGlzY29ubmVjdGluZy4gIFRoZSBzZXJ2ZXIgbXVzdCBub3QgYWNjZXB0IGFkZGl0aW9uYWwKKyAgICAgICAgY29tbWFuZHMgdXNpbmcgdGhpcyBwcm90b2NvbCBhZnRlciB0aGUgQkVHSU4gY29tbWFuZCBoYXMgYmVlbgorICAgICAgICByZWNlaXZlZC4gRnVydGhlciBjb21tdW5pY2F0aW9uIHdpbGwgYmUgYSBzdHJlYW0gb2YgRC1CdXMKKyAgICAgICAgbWVzc2FnZXMgKG9wdGlvbmFsbHkgZW5jcnlwdGVkLCBhcyBuZWdvdGlhdGVkKSByYXRoZXIgdGhhbgorICAgICAgICB0aGlzIHByb3RvY29sLgorICAgICAgPC9wPjxwPgorICAgICAgICBJZiBhIGNsaWVudCBzZW5kcyBCRUdJTiB0aGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQgYnkgdGhlIGNsaWVudAorICAgICAgICBhZnRlciB0aGUgXHJcbiBvZiB0aGUgT0sgY29tbWFuZCBtdXN0IGJlIHRoZSBmaXJzdCBvY3RldCBvZgorICAgICAgICB0aGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgT0sgY29tbWFuZCBoYXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgR1VJRCBvZiB0aGUgc2VydmVyLgorICAgICAgICBTZWUgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNhZGRyZXNzZXMiIHRpdGxlPSJTZXJ2ZXIgQWRkcmVzc2VzIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwO1NlcnZlciBBZGRyZXNzZXMmIzgyMjE7PC9hPiBmb3IgbW9yZSBvbiBzZXJ2ZXIgR1VJRHMuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJFUlJPUiBDb21tYW5kIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLWNvbW1hbmQtZXJyb3IiPjwvYT5FUlJPUiBDb21tYW5kPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlIEVSUk9SIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgZWl0aGVyIHNlcnZlciBvciBjbGllbnQgZGlkIG5vdAorICAgICAgICBrbm93IGEgY29tbWFuZCwgZG9lcyBub3QgYWNjZXB0IHRoZSBnaXZlbiBjb21tYW5kIGluIHRoZSBjdXJyZW50CisgICAgICAgIGNvbnRleHQsIG9yIGRpZCBub3QgdW5kZXJzdGFuZCB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb21tYW5kLiBUaGlzCisgICAgICAgIGFsbG93cyB0aGUgcHJvdG9jb2wgdG8gYmUgZXh0ZW5kZWQ7IGEgY2xpZW50IG9yIHNlcnZlciBjYW4gc2VuZCBhCisgICAgICAgIGNvbW1hbmQgcHJlc2VudCBvciBwZXJtaXR0ZWQgb25seSBpbiBuZXcgcHJvdG9jb2wgdmVyc2lvbnMsIGFuZCBpZgorICAgICAgICBhbiBFUlJPUiBpcyByZWNlaXZlZCBpbnN0ZWFkIG9mIGFuIGFwcHJvcHJpYXRlIHJlc3BvbnNlLCBmYWxsIGJhY2sKKyAgICAgICAgdG8gdXNpbmcgc29tZSBvdGhlciB0ZWNobmlxdWUuCisgICAgICA8L3A+PHA+CisgICAgICAgIElmIGFuIEVSUk9SIGlzIHNlbnQsIHRoZSBzZXJ2ZXIgb3IgY2xpZW50IHRoYXQgc2VudCB0aGUKKyAgICAgICAgZXJyb3IgbXVzdCBjb250aW51ZSBhcyBpZiB0aGUgY29tbWFuZCBjYXVzaW5nIHRoZSBFUlJPUiBoYWQgbmV2ZXIgYmVlbgorICAgICAgICByZWNlaXZlZC4gSG93ZXZlciwgdGhlIHRoZSBzZXJ2ZXIgb3IgY2xpZW50IHJlY2VpdmluZyB0aGUgZXJyb3IgCisgICAgICAgIHNob3VsZCB0cnkgc29tZXRoaW5nIG90aGVyIHRoYW4gd2hhdGV2ZXIgY2F1c2VkIHRoZSBlcnJvcjsgCisgICAgICAgIGlmIG9ubHkgY2FuY2VsaW5nL3JlamVjdGluZyB0aGUgYXV0aGVudGljYXRpb24uCisgICAgICA8L3A+PHA+CisgICAgICAgIElmIHRoZSBELUJ1cyBwcm90b2NvbCBjaGFuZ2VzIGluY29tcGF0aWJseSBhdCBzb21lIGZ1dHVyZSB0aW1lLAorICAgICAgICBhcHBsaWNhdGlvbnMgaW1wbGVtZW50aW5nIHRoZSBuZXcgcHJvdG9jb2wgd291bGQgcHJvYmFibHkgYmUgYWJsZSB0bworICAgICAgICBjaGVjayBmb3Igc3VwcG9ydCBvZiB0aGUgbmV3IHByb3RvY29sIGJ5IHNlbmRpbmcgYSBuZXcgY29tbWFuZCBhbmQKKyAgICAgICAgcmVjZWl2aW5nIGFuIEVSUk9SIGZyb20gYXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBpdC4gVGh1cyB0aGUKKyAgICAgICAgRVJST1IgZmVhdHVyZSBvZiB0aGUgYXV0aCBwcm90b2NvbCBpcyBhbiBlc2NhcGUgaGF0Y2ggdGhhdCBsZXRzIHVzCisgICAgICAgIG5lZ290aWF0ZSBleHRlbnNpb25zIG9yIGNoYW5nZXMgdG8gdGhlIEQtQnVzIHByb3RvY29sIGluIHRoZSBmdXR1cmUuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJORUdPVElBVEVfVU5JWF9GRCBDb21tYW5kIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLWNvbW1hbmQtbmVnb3RpYXRlLXVuaXgtZmQiPjwvYT5ORUdPVElBVEVfVU5JWF9GRCBDb21tYW5kPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlIE5FR09USUFURV9VTklYX0ZEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudAorICAgICAgICBzdXBwb3J0cyBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkKKyAgICAgICAgYmUgc2VudCBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBhdXRoZW50aWNhdGVkLCBpLmUuIGFmdGVyIE9LCisgICAgICAgIHdhcyByZWNlaXZlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudCBvbgorICAgICAgICB0cmFuc3BvcnRzIHRoYXQgc3VwcG9ydCBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLgorICAgICAgPC9wPjxwPgorICAgICAgICBPbiByZWNlaXZpbmcgTkVHT1RJQVRFX1VOSVhfRkQgdGhlIHNlcnZlciBtdXN0IHJlc3BvbmQgd2l0aAorICAgICAgICBlaXRoZXIgQUdSRUVfVU5JWF9GRCBvciBFUlJPUi4gSXQgc2hhbGwgcmVzcG9uZCB0aGUgZm9ybWVyIGlmCisgICAgICAgIHRoZSB0cmFuc3BvcnQgY2hvc2VuIHN1cHBvcnRzIFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgYW5kCisgICAgICAgIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiBJdCBzaGFsbCByZXNwb25kIHRoZSBsYXR0ZXIKKyAgICAgICAgaWYgdGhlIHRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IFVuaXggZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIHBhc3NpbmcsIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUsIG9yIHRoZQorICAgICAgICBzZXJ2ZXIgZGVjaWRlcyBub3QgdG8gZW5hYmxlIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIGR1ZSB0bworICAgICAgICBzZWN1cml0eSBvciBvdGhlciByZWFzb25zLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iQUdSRUVfVU5JWF9GRCBDb21tYW5kIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLWNvbW1hbmQtYWdyZWUtdW5peC1mZCI+PC9hPkFHUkVFX1VOSVhfRkQgQ29tbWFuZDwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoZSBBR1JFRV9VTklYX0ZEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIHNlcnZlciBzdXBwb3J0cworICAgICAgICBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudAorICAgICAgICBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBhdXRoZW50aWNhdGVkLCBhbmQgdGhlIGNsaWVudCBzZW50CisgICAgICAgIE5FR09USUFURV9VTklYX0ZEIHRvIGVuYWJsZSBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzCisgICAgICAgIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudCBvbiB0cmFuc3BvcnRzIHRoYXQgc3VwcG9ydCBVbml4IGZpbGUKKyAgICAgICAgZGVzY3JpcHRvciBwYXNzaW5nLgorICAgICAgPC9wPjxwPgorICAgICAgICBPbiByZWNlaXZpbmcgQUdSRUVfVU5JWF9GRCB0aGUgY2xpZW50IG11c3QgcmVzcG9uZCB3aXRoIEJFR0lOLAorICAgICAgICBmb2xsb3dlZCBieSBpdHMgc3RyZWFtIG9mIG1lc3NhZ2VzLCBvciBieSBkaXNjb25uZWN0aW5nLiAgVGhlCisgICAgICAgIHNlcnZlciBtdXN0IG5vdCBhY2NlcHQgYWRkaXRpb25hbCBjb21tYW5kcyB1c2luZyB0aGlzIHByb3RvY29sCisgICAgICAgIGFmdGVyIHRoZSBCRUdJTiBjb21tYW5kIGhhcyBiZWVuIHJlY2VpdmVkLiBGdXJ0aGVyCisgICAgICAgIGNvbW11bmljYXRpb24gd2lsbCBiZSBhIHN0cmVhbSBvZiBELUJ1cyBtZXNzYWdlcyAob3B0aW9uYWxseQorICAgICAgICBlbmNyeXB0ZWQsIGFzIG5lZ290aWF0ZWQpIHJhdGhlciB0aGFuIHRoaXMgcHJvdG9jb2wuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJGdXR1cmUgRXh0ZW5zaW9ucyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYXV0aC1jb21tYW5kLWZ1dHVyZSI+PC9hPkZ1dHVyZSBFeHRlbnNpb25zPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgRnV0dXJlIGV4dGVuc2lvbnMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGFuZCBuZWdvdGlhdGlvbgorICAgICAgICBwcm90b2NvbCBhcmUgcG9zc2libGUuIEZvciB0aGF0IG5ldyBjb21tYW5kcyBtYXkgYmUKKyAgICAgICAgaW50cm9kdWNlZC4gSWYgYSBjbGllbnQgb3Igc2VydmVyIHJlY2VpdmVzIGFuIHVua25vd24gY29tbWFuZAorICAgICAgICBpdCBzaGFsbCByZXNwb25kIHdpdGggRVJST1IgYW5kIG5vdCBjb25zaWRlciB0aGlzIGZhdGFsLiBOZXcKKyAgICAgICAgY29tbWFuZHMgbWF5IGJlIGludHJvZHVjZWQgYm90aCBiZWZvcmUsIGFuZCBhZnRlcgorICAgICAgICBhdXRoZW50aWNhdGlvbiwgaS5lLiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIE9LIGNvbW1hbmQuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJBdXRoZW50aWNhdGlvbiBleGFtcGxlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYXV0aC1leGFtcGxlcyI+PC9hPkF1dGhlbnRpY2F0aW9uIGV4YW1wbGVzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iaWRwNTE2MTM0NCI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJloDEuoEV4YW1wbGUgb2Ygc3VjY2Vzc2Z1bCBtYWdpYyBjb29raWUgYXV0aGVudGljYXRpb248L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgKE1BR0lDX0NPT0tJRSBpcyBhIG1hZGUgdXAgbWVjaGFuaXNtKQorCisgICAgICAgICAgICBDOiBBVVRIIE1BR0lDX0NPT0tJRSAzMTM4MzYzOTM1MzMzMTM3MzkzNjM1MzgzNjM0CisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcmU+PC9kaXY+PC9kaXY+PHA+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJpZHA1MTYzMTY4Ij48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmWgMi6gRXhhbXBsZSBvZiBmaW5kaW5nIG91dCBtZWNoYW5pc21zIHRoZW4gcGlja2luZyBvbmU8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgQzogQVVUSAorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IERBVEEgOGFjODc2ZThmNjhlZTk4MDliZmE4NzZlNmY5ODc2ZzhmYThlNzZlOThmCisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcmU+PC9kaXY+PC9kaXY+PHA+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJpZHA1MTY1MDcyIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmWgMy6gRXhhbXBsZSBvZiBjbGllbnQgc2VuZHMgdW5rbm93biBjb21tYW5kIHRoZW4gZmFsbHMgYmFjayB0byByZWd1bGFyIGF1dGg8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgQzogRk9PQkFSCisgICAgICAgICAgICBTOiBFUlJPUgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJlPjwvZGl2PjwvZGl2PjxwPjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj4KKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iaWRwNTE2Njk2MCI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJloDQuoEV4YW1wbGUgb2Ygc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBpbml0aWFsIGF1dGggbWVjaGFuaXNtPC9iPjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUtY29udGVudHMiPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDM3MzYzNDM0MzUzMTMyMzAzMzMwMzkKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJlPjwvZGl2PjwvZGl2PjxwPjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj4KKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iaWRwNTE2ODk3NiI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJloDUuoEV4YW1wbGUgb2Ygd3JvbmcgcGFzc3dvcmQgb3IgdGhlIGxpa2UgZm9sbG93ZWQgYnkgc3VjY2Vzc2Z1bCByZXRyeTwvYj48L3A+PGRpdiBjbGFzcz0iZmlndXJlLWNvbnRlbnRzIj48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBDOiBBVVRIIE1BR0lDX0NPT0tJRSAzNzM2MzQzNDM1MzEzMjMwMzMzMDM5CisgICAgICAgICAgICBTOiBSRUpFQ1RFRCBLRVJCRVJPU19WNCBTS0VZCisgICAgICAgICAgICBDOiBBVVRIIFNLRVkgN2FiODNmMzJlZQorICAgICAgICAgICAgUzogREFUQSA4Nzk5Y2FiYjJlYTkzZQorICAgICAgICAgICAgQzogREFUQSA4YWM4NzZlOGY2OGVlOTgwOWJmYTg3NmU2Zjk4NzZnOGZhOGU3NmU5OGYKKyAgICAgICAgICAgIFM6IFJFSkVDVEVECisgICAgICAgICAgICBDOiBBVVRIIFNLRVkgN2FiODNmMzJlZQorICAgICAgICAgICAgUzogREFUQSA4Nzk5Y2FiYjJlYTkzZQorICAgICAgICAgICAgQzogREFUQSA4YWM4NzZlOGY2OGVlOTgwOWJmYTg3NmU2Zjk4NzZnOGZhOGU3NmU5OGYKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3ByZT48L2Rpdj48L2Rpdj48cD48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIG5hbWU9ImlkcDUxNzExNTIiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkZpZ3VyZaA2LqBFeGFtcGxlIG9mIHNrZXkgY2FuY2VsbGVkIGFuZCByZXN0YXJ0ZWQ8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IENBTkNFTAorICAgICAgICAgICAgUzogUkVKRUNURUQKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJlPjwvZGl2PjwvZGl2PjxwPjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj4KKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iaWRwNTE3MzIxNiI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJloDcuoEV4YW1wbGUgb2Ygc3VjY2Vzc2Z1bCBtYWdpYyBjb29raWUgYXV0aGVudGljYXRpb24gd2l0aCBzdWNjZXNzZnVsIG5lZ290aWF0aW9uIG9mIFVuaXggRkQgcGFzc2luZzwvYj48L3A+PGRpdiBjbGFzcz0iZmlndXJlLWNvbnRlbnRzIj48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICAoTUFHSUNfQ09PS0lFIGlzIGEgbWFkZSB1cCBtZWNoYW5pc20pCisKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDMxMzgzNjM5MzUzMzMxMzczOTM2MzUzODM2MzQKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogTkVHT1RJQVRFX1VOSVhfRkQKKyAgICAgICAgICAgIFM6IEFHUkVFX1VOSVhfRkQKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcmU+PC9kaXY+PC9kaXY+PHA+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJpZHA1MTc1MjE2Ij48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmWgOC6gRXhhbXBsZSBvZiBzdWNjZXNzZnVsIG1hZ2ljIGNvb2tpZSBhdXRoZW50aWNhdGlvbiB3aXRoIHVuc3VjY2Vzc2Z1bCBuZWdvdGlhdGlvbiBvZiBVbml4IEZEIHBhc3Npbmc8L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgKE1BR0lDX0NPT0tJRSBpcyBhIG1hZGUgdXAgbWVjaGFuaXNtKQorCisgICAgICAgICAgICBDOiBBVVRIIE1BR0lDX0NPT0tJRSAzMTM4MzYzOTM1MzMzMTM3MzkzNjM1MzgzNjM0CisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IE5FR09USUFURV9VTklYX0ZECisgICAgICAgICAgICBTOiBFUlJPUgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3ByZT48L2Rpdj48L2Rpdj48cD48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+CisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJBdXRoZW50aWNhdGlvbiBzdGF0ZSBkaWFncmFtcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYXV0aC1zdGF0ZXMiPjwvYT5BdXRoZW50aWNhdGlvbiBzdGF0ZSBkaWFncmFtczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoaXMgc2VjdGlvbiBkb2N1bWVudHMgdGhlIGF1dGggcHJvdG9jb2wgaW4gdGVybXMgb2YgCisgICAgICAgIGEgc3RhdGUgbWFjaGluZSBmb3IgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4gVGhpcyBpcyAKKyAgICAgICAgcHJvYmFibHkgdGhlIG1vc3Qgcm9idXN0IHdheSB0byBpbXBsZW1lbnQgdGhlIHByb3RvY29sLgorICAgICAgPC9wPjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iQ2xpZW50IHN0YXRlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYXV0aC1zdGF0ZXMtY2xpZW50Ij48L2E+Q2xpZW50IHN0YXRlczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgVG8gbW9yZSBwcmVjaXNlbHkgZGVzY3JpYmUgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlCisgICAgICAgICAgcHJvdG9jb2wgc3RhdGUgbWFjaGluZSBhbmQgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgdGhlCisgICAgICAgICAgZm9sbG93aW5nIG5vdGF0aW9uIGlzIHVzZWQ6IE1FQ0goQ0hBTEwpIG1lYW5zIHRoYXQgdGhlCisgICAgICAgICAgc2VydmVyIGNoYWxsZW5nZSBDSEFMTCB3YXMgZmVkIHRvIHRoZSBtZWNoYW5pc20gTUVDSCwgd2hpY2gKKyAgICAgICAgICByZXR1cm5zIG9uZSBvZgorCisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIENPTlRJTlVFKFJFU1ApIG1lYW5zIGNvbnRpbnVlIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICAgICAgICAgICAgICAgIGFuZCBzZW5kIFJFU1AgYXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBzZXJ2ZXI7CisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIE9LKFJFU1ApIG1lYW5zIHRoYXQgYWZ0ZXIgc2VuZGluZyBSRVNQIHRvIHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgICAgICB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIGF1dGggY29udmVyc2F0aW9uIGlzIGZpbmlzaGVkCisgICAgICAgICAgICAgICAgYW5kIHRoZSBzZXJ2ZXIgc2hvdWxkIHJldHVybiAiT0siOworICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBFUlJPUiBtZWFucyB0aGF0IENIQUxMIHdhcyBpbnZhbGlkIGFuZCBjb3VsZCBub3QgYmUKKyAgICAgICAgICAgICAgICBwcm9jZXNzZWQuCisgICAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICAgICAgCisgICAgICAgICAgQm90aCBSRVNQIGFuZCBDSEFMTCBtYXkgYmUgZW1wdHkuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgQ2xpZW50IHN0YXJ0cyBieSBnZXR0aW5nIGFuIGluaXRpYWwgcmVzcG9uc2UgZnJvbSB0aGUKKyAgICAgICAgICBkZWZhdWx0IG1lY2hhbmlzbSBhbmQgc2VuZHMgQVVUSCBNRUNIIFJFU1AsIG9yIEFVVEggTUVDSCBpZgorICAgICAgICAgIHRoZSBtZWNoYW5pc20gZGlkIG5vdCBwcm92aWRlIGFuIGluaXRpYWwgcmVzcG9uc2UuICBJZiB0aGUKKyAgICAgICAgICBtZWNoYW5pc20gcmV0dXJucyBDT05USU5VRSwgdGhlIGNsaWVudCBzdGFydHMgaW4gc3RhdGUKKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yRGF0YTwvZW0+PC9zcGFuPiwgaWYgdGhlIG1lY2hhbmlzbQorICAgICAgICAgIHJldHVybnMgT0sgdGhlIGNsaWVudCBzdGFydHMgaW4gc3RhdGUKKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yT0s8L2VtPjwvc3Bhbj4uCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgY2xpZW50IHNob3VsZCBrZWVwIHRyYWNrIG9mIGF2YWlsYWJsZSBtZWNoYW5pc21zIGFuZAorICAgICAgICAgIHdoaWNoIGl0IG1lY2hhbmlzbXMgaXQgaGFzIGFscmVhZHkgYXR0ZW1wdGVkLiBUaGlzIGxpc3QgaXMKKyAgICAgICAgICB1c2VkIHRvIGRlY2lkZSB3aGljaCBBVVRIIGNvbW1hbmQgdG8gc2VuZC4gV2hlbiB0aGUgbGlzdCBpcworICAgICAgICAgIGV4aGF1c3RlZCwgdGhlIGNsaWVudCBzaG91bGQgZ2l2ZSB1cCBhbmQgY2xvc2UgdGhlCisgICAgICAgICAgY29ubmVjdGlvbi4KKyAgICAgICAgPC9wPjxwIHRpdGxlPSJXYWl0aW5nRm9yRGF0YSI+PGI+PHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckRhdGE8L2VtPjwvc3Bhbj4uoDwvYj4KKyAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgREFUQSBDSEFMTAorICAgICAgICAgICAgICAgICAgPC9wPjx0YWJsZSBib3JkZXI9IjAiIHN1bW1hcnk9IlNpbXBsZSBsaXN0IiBjbGFzcz0ic2ltcGxlbGlzdCI+PHRyPjx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKENIQUxMKSByZXR1cm5zIENPTlRJTlVFKFJFU1ApICYjODU5NDsgc2VuZAorICAgICAgICAgICAgICAgICAgICAgIERBVEEgUkVTUCwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JEYXRhPC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goQ0hBTEwpIHJldHVybnMgT0soUkVTUCkgJiM4NTk0OyBzZW5kIERBVEEKKyAgICAgICAgICAgICAgICAgICAgICBSRVNQLCBnb3RvIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JPSzwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKENIQUxMKSByZXR1cm5zIEVSUk9SICYjODU5NDsgc2VuZCBFUlJPUgorICAgICAgICAgICAgICAgICAgICAgIFttc2ddLCBnb3RvIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JEYXRhPC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3RhYmxlPjxwPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBSRUpFQ1RFRCBbbWVjaHNdICYjODU5NDsKKyAgICAgICAgICAgICAgICAgIHNlbmQgQVVUSCBbbmV4dCBtZWNoXSwgZ290bworICAgICAgICAgICAgICAgICAgV2FpdGluZ0ZvckRhdGEgb3IgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0Zvck9LPC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEVSUk9SICYjODU5NDsgc2VuZAorICAgICAgICAgICAgICAgICAgQ0FOQ0VMLCBnb3RvCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yUmVqZWN0PC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIE9LICYjODU5NDsgc2VuZAorICAgICAgICAgICAgICAgICAgQkVHSU4sIHRlcm1pbmF0ZSBhdXRoCisgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24sIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmIzg1OTQ7IHNlbmQKKyAgICAgICAgICAgICAgICAgIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yRGF0YTwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHAgdGl0bGU9IldhaXRpbmdGb3JEYXRhIj4KKyAgICAgICAgICA8L3A+PHAgdGl0bGU9IldhaXRpbmdGb3JPSyI+PGI+PHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0Zvck9LPC9lbT48L3NwYW4+LqA8L2I+CisgICAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIE9LICYjODU5NDsgc2VuZCBCRUdJTiwgdGVybWluYXRlIGF1dGgKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbiwgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+YXV0aGVudGljYXRlZDwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBSRUpFQ1QgW21lY2hzXSAmIzg1OTQ7IHNlbmQgQVVUSCBbbmV4dCBtZWNoXSwKKyAgICAgICAgICAgICAgICAgIGdvdG8gPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckRhdGE8L2VtPjwvc3Bhbj4gb3IKKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JPSzwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBEQVRBICYjODU5NDsgc2VuZCBDQU5DRUwsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JSZWplY3Q8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJiM4NTk0OyBzZW5kIENBTkNFTCwgZ290bworICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvclJlamVjdDwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICYjODU5NDsgc2VuZCBFUlJPUiwgZ290bworICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0Zvck9LPC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48cCB0aXRsZT0iV2FpdGluZ0Zvck9LIj4KKyAgICAgICAgICA8L3A+PHAgdGl0bGU9IldhaXRpbmdGb3JSZWplY3QiPjxiPjxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JSZWplY3Q8L2VtPjwvc3Bhbj4uoDwvYj4KKyAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgUkVKRUNUIFttZWNoc10gJiM4NTk0OyBzZW5kIEFVVEggW25leHQgbWVjaF0sCisgICAgICAgICAgICAgICAgICBnb3RvIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JEYXRhPC9lbT48L3NwYW4+IG9yCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yT0s8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmIzg1OTQ7IHRlcm1pbmF0ZSBhdXRoCisgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24sIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwIHRpdGxlPSJXYWl0aW5nRm9yUmVqZWN0Ij4KKyAgICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJTZXJ2ZXIgc3RhdGVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJhdXRoLXN0YXRlcy1zZXJ2ZXIiPjwvYT5TZXJ2ZXIgc3RhdGVzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBGb3IgdGhlIHNlcnZlciBNRUNIKFJFU1ApIG1lYW5zIHRoYXQgdGhlIGNsaWVudCByZXNwb25zZQorICAgICAgICAgIFJFU1Agd2FzIGZlZCB0byB0aGUgdGhlIG1lY2hhbmlzbSBNRUNILCB3aGljaCByZXR1cm5zIG9uZSBvZgorCisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIENPTlRJTlVFKENIQUxMKSBtZWFucyBjb250aW51ZSB0aGUgYXV0aCBjb252ZXJzYXRpb24gYW5kCisgICAgICAgICAgICAgICAgc2VuZCBDSEFMTCBhcyB0aGUgY2hhbGxlbmdlIHRvIHRoZSBjbGllbnQ7CisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIE9LIG1lYW5zIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkOworICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBSRUpFQ1QgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGZhaWxlZCB0byBhdXRoZW50aWNhdGUgb3IKKyAgICAgICAgICAgICAgICB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gUkVTUC4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKworICAgICAgICAgIFRoZSBzZXJ2ZXIgc3RhcnRzIG91dCBpbiBzdGF0ZQorICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JBdXRoPC9lbT48L3NwYW4+LiAgSWYgdGhlIGNsaWVudCBpcworICAgICAgICAgIHJlamVjdGVkIHRvbyBtYW55IHRpbWVzIHRoZSBzZXJ2ZXIgbXVzdCBkaXNjb25uZWN0IHRoZQorICAgICAgICAgIGNsaWVudC4KKyAgICAgICAgPC9wPjxwIHRpdGxlPSJXYWl0aW5nRm9yQXV0aCI+PGI+PHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckF1dGg8L2VtPjwvc3Bhbj4uoDwvYj4KKyAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQVVUSCAmIzg1OTQ7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckF1dGg8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQVVUSCBNRUNIIFJFU1AKKworICAgICAgICAgICAgICAgICAgPC9wPjx0YWJsZSBib3JkZXI9IjAiIHN1bW1hcnk9IlNpbXBsZSBsaXN0IiBjbGFzcz0ic2ltcGxlbGlzdCI+PHRyPjx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIIG5vdCB2YWxpZCBtZWNoYW5pc20gJiM4NTk0OyBzZW5kIFJFSkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JBdXRoPC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goUkVTUCkgcmV0dXJucyBDT05USU5VRShDSEFMTCkgJiM4NTk0OyBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgREFUQSBDSEFMTCwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JEYXRhPC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goUkVTUCkgcmV0dXJucyBPSyAmIzg1OTQ7IHNlbmQgT0ssIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yQmVnaW48L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIFJFSkVDVCAmIzg1OTQ7IHNlbmQgUkVKRUNURUQKKyAgICAgICAgICAgICAgICAgICAgICBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckF1dGg8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGFibGU+PHA+CisgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEJFR0lOICYjODU5NDsgdGVybWluYXRlCisgICAgICAgICAgICAgICAgICBhdXRoIGNvbnZlcnNhdGlvbiwgZGlzY29ubmVjdAorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmIzg1OTQ7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckF1dGg8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmIzg1OTQ7IHNlbmQKKyAgICAgICAgICAgICAgICAgIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yQXV0aDwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHAgdGl0bGU9IldhaXRpbmdGb3JBdXRoIj4KKyAgICAgICAgICA8L3A+PHAgdGl0bGU9IldhaXRpbmdGb3JEYXRhIj48Yj48c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yRGF0YTwvZW0+PC9zcGFuPi6gPC9iPgorICAgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBEQVRBIFJFU1AKKyAgICAgICAgICAgICAgICAgIDwvcD48dGFibGUgYm9yZGVyPSIwIiBzdW1tYXJ5PSJTaW1wbGUgbGlzdCIgY2xhc3M9InNpbXBsZWxpc3QiPjx0cj48dGQ+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIENPTlRJTlVFKENIQUxMKSAmIzg1OTQ7IHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBIENIQUxMLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckRhdGE8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIE9LICYjODU5NDsgc2VuZCBPSywgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JCZWdpbjwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgUkVKRUNUICYjODU5NDsgc2VuZCBSRUpFQ1RFRAorICAgICAgICAgICAgICAgICAgICAgIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yQXV0aDwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PC90YWJsZT48cD4KKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQkVHSU4gJiM4NTk0OyB0ZXJtaW5hdGUgYXV0aCBjb252ZXJzYXRpb24sCisgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIENBTkNFTCAmIzg1OTQ7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckF1dGg8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJiM4NTk0OyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JBdXRoPC9lbT48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIGFueXRoaW5nIGVsc2UgJiM4NTk0OyBzZW5kIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yRGF0YTwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHAgdGl0bGU9IldhaXRpbmdGb3JEYXRhIj4KKyAgICAgICAgICA8L3A+PHAgdGl0bGU9IldhaXRpbmdGb3JCZWdpbiI+PGI+PHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckJlZ2luPC9lbT48L3NwYW4+LqA8L2I+CisgICAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEJFR0lOICYjODU5NDsgdGVybWluYXRlIGF1dGggY29udmVyc2F0aW9uLAorICAgICAgICAgICAgICAgICAgY2xpZW50IGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQ0FOQ0VMICYjODU5NDsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5XYWl0aW5nRm9yQXV0aDwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmIzg1OTQ7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+V2FpdGluZ0ZvckF1dGg8L2VtPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgYW55dGhpbmcgZWxzZSAmIzg1OTQ7IHNlbmQgRVJST1IsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPldhaXRpbmdGb3JCZWdpbjwvZW0+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHAgdGl0bGU9IldhaXRpbmdGb3JCZWdpbiI+CisgICAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iQXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYXV0aC1tZWNoYW5pc21zIj48L2E+QXV0aGVudGljYXRpb24gbWVjaGFuaXNtczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBuZXcgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcy4KKyAgICAgICAgRC1CdXMgYWxzbyBhbGxvd3MgYW55IHN0YW5kYXJkIFNBU0wgbWVjaGFuaXNtIG9mIGNvdXJzZS4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IkRCVVNfQ09PS0lFX1NIQTEiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImF1dGgtbWVjaGFuaXNtcy1zaGEiPjwvYT5EQlVTX0NPT0tJRV9TSEExPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBUaGUgREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20gaXMgZGVzaWduZWQgdG8gZXN0YWJsaXNoIHRoYXQgYSBjbGllbnQKKyAgICAgICAgICBoYXMgdGhlIGFiaWxpdHkgdG8gcmVhZCBhIHByaXZhdGUgZmlsZSBvd25lZCBieSB0aGUgdXNlciBiZWluZworICAgICAgICAgIGF1dGhlbnRpY2F0ZWQuIElmIHRoZSBjbGllbnQgY2FuIHByb3ZlIHRoYXQgaXQgaGFzIGFjY2VzcyB0byBhIHNlY3JldAorICAgICAgICAgIGNvb2tpZSBzdG9yZWQgaW4gdGhpcyBmaWxlLCB0aGVuIHRoZSBjbGllbnQgaXMgYXV0aGVudGljYXRlZC4gCisgICAgICAgICAgVGh1cyB0aGUgc2VjdXJpdHkgb2YgREJVU19DT09LSUVfU0hBMSBkZXBlbmRzIG9uIGEgc2VjdXJlIGhvbWUgCisgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgVGhyb3VnaG91dCB0aGlzIGRlc2NyaXB0aW9uLCAiaGV4IGVuY29kaW5nIiBtdXN0IG91dHB1dCB0aGUgZGlnaXRzCisgICAgICAgICAgZnJvbSBhIHRvIGYgaW4gbG93ZXItY2FzZTsgdGhlIGRpZ2l0cyBBIHRvIEYgbXVzdCBub3QgYmUgdXNlZAorICAgICAgICAgIGluIHRoZSBEQlVTX0NPT0tJRV9TSEExIG1lY2hhbmlzbS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIHByb2NlZWRzIGFzIGZvbGxvd3M6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIFRoZSBjbGllbnQgc2VuZHMgdGhlIHVzZXJuYW1lIGl0IHdvdWxkIGxpa2UgdG8gYXV0aGVudGljYXRlIAorICAgICAgICAgICAgICAgIGFzLCBoZXgtZW5jb2RlZC4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgVGhlIHNlcnZlciBzZW5kcyB0aGUgbmFtZSBvZiBpdHMgImNvb2tpZSBjb250ZXh0IiAoc2VlIGJlbG93KTsgYQorICAgICAgICAgICAgICAgIHNwYWNlIGNoYXJhY3RlcjsgdGhlIGludGVnZXIgSUQgb2YgdGhlIHNlY3JldCBjb29raWUgdGhlIGNsaWVudAorICAgICAgICAgICAgICAgIG11c3QgZGVtb25zdHJhdGUga25vd2xlZGdlIG9mOyBhIHNwYWNlIGNoYXJhY3RlcjsgdGhlbiBhCisgICAgICAgICAgICAgICAgcmFuZG9tbHktZ2VuZXJhdGVkIGNoYWxsZW5nZSBzdHJpbmcsIGFsbCBvZiB0aGlzIGhleC1lbmNvZGVkIGludG8KKyAgICAgICAgICAgICAgICBvbmUsIHNpbmdsZSBzdHJpbmcuCisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIFRoZSBjbGllbnQgbG9jYXRlcyB0aGUgY29va2llIGFuZCBnZW5lcmF0ZXMgaXRzIG93bgorICAgICAgICAgICAgICAgIHJhbmRvbWx5LWdlbmVyYXRlZCBjaGFsbGVuZ2Ugc3RyaW5nLiBUaGUgY2xpZW50IHRoZW4gY29uY2F0ZW5hdGVzCisgICAgICAgICAgICAgICAgdGhlIHNlcnZlcidzIGRlY29kZWQgY2hhbGxlbmdlLCBhICI6IiBjaGFyYWN0ZXIsIGl0cyBvd24gY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgIGFub3RoZXIgIjoiIGNoYXJhY3RlciwgYW5kIHRoZSBjb29raWUuIEl0IGNvbXB1dGVzIHRoZSBTSEEtMSBoYXNoCisgICAgICAgICAgICAgICAgb2YgdGhpcyBjb21wb3NpdGUgc3RyaW5nIGFzIGEgaGV4IGRpZ2VzdC4gSXQgY29uY2F0ZW5hdGVzIHRoZQorICAgICAgICAgICAgICAgIGNsaWVudCdzIGNoYWxsZW5nZSBzdHJpbmcsIGEgc3BhY2UgY2hhcmFjdGVyLCBhbmQgdGhlIFNIQS0xIGhleAorICAgICAgICAgICAgICAgIGRpZ2VzdCwgaGV4LWVuY29kZXMgdGhlIHJlc3VsdCBhbmQgc2VuZHMgaXQgYmFjayB0byB0aGUgc2VydmVyLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBUaGUgc2VydmVyIGdlbmVyYXRlcyB0aGUgc2FtZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHVzZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgY2xpZW50IGFuZCBjb21wdXRlcyBpdHMgU0hBLTEgaGFzaC4gSXQgY29tcGFyZXMgdGhlIGhhc2ggd2l0aAorICAgICAgICAgICAgICAgIHRoZSBoYXNoIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudDsgaWYgdGhlIHR3byBoYXNoZXMgbWF0Y2gsIHRoZQorICAgICAgICAgICAgICAgIGNsaWVudCBpcyBhdXRoZW50aWNhdGVkLgorICAgICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgRWFjaCBzZXJ2ZXIgaGFzIGEgImNvb2tpZSBjb250ZXh0LCIgd2hpY2ggaXMgYSBuYW1lIHRoYXQgaWRlbnRpZmllcyBhCisgICAgICAgICAgc2V0IG9mIGNvb2tpZXMgdGhhdCBhcHBseSB0byB0aGF0IHNlcnZlci4gQSBzYW1wbGUgY29udGV4dCBtaWdodCBiZQorICAgICAgICAgICJvcmdfZnJlZWRlc2t0b3Bfc2Vzc2lvbl9idXMiLiBDb250ZXh0IG5hbWVzIG11c3QgYmUgdmFsaWQgQVNDSUksCisgICAgICAgICAgbm9uemVybyBsZW5ndGgsIGFuZCBtYXkgbm90IGNvbnRhaW4gdGhlIGNoYXJhY3RlcnMgc2xhc2ggKCIvIiksCisgICAgICAgICAgYmFja3NsYXNoICgiXCIpLCBzcGFjZSAoIiAiKSwgbmV3bGluZSAoIlxuIiksIGNhcnJpYWdlIHJldHVybiAoIlxyIiksCisgICAgICAgICAgdGFiICgiXHQiKSwgb3IgcGVyaW9kICgiLiIpLiBUaGVyZSBpcyBhIGRlZmF1bHQgY29udGV4dCwKKyAgICAgICAgICAib3JnX2ZyZWVkZXNrdG9wX2dlbmVyYWwiIHRoYXQncyB1c2VkIGJ5IHNlcnZlcnMgdGhhdCBkbyBub3Qgc3BlY2lmeQorICAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIENvb2tpZXMgYXJlIHN0b3JlZCBpbiBhIHVzZXIncyBob21lIGRpcmVjdG9yeSwgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgIDxjb2RlIGNsYXNzPSJmaWxlbmFtZSI+fi8uZGJ1cy1rZXlyaW5ncy88L2NvZGU+LiBUaGlzIGRpcmVjdG9yeSBtdXN0IAorICAgICAgICAgIG5vdCBiZSByZWFkYWJsZSBvciB3cml0YWJsZSBieSBvdGhlciB1c2Vycy4gSWYgaXQgaXMsIAorICAgICAgICAgIGNsaWVudHMgYW5kIHNlcnZlcnMgbXVzdCBpZ25vcmUgaXQuIFRoZSBkaXJlY3RvcnkgCisgICAgICAgICAgY29udGFpbnMgY29va2llIGZpbGVzIG5hbWVkIGFmdGVyIHRoZSBjb29raWUgY29udGV4dC4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIEEgY29va2llIGZpbGUgY29udGFpbnMgb25lIGNvb2tpZSBwZXIgbGluZS4gRWFjaCBsaW5lIAorICAgICAgICAgIGhhcyB0aHJlZSBzcGFjZS1zZXBhcmF0ZWQgZmllbGRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBUaGUgY29va2llIElEIG51bWJlciwgd2hpY2ggbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFuZAorICAgICAgICAgICAgICAgIG1heSBub3QgYmUgdXNlZCB0d2ljZSBpbiB0aGUgc2FtZSBmaWxlLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBUaGUgY29va2llJ3MgY3JlYXRpb24gdGltZSwgaW4gVU5JWCBzZWNvbmRzLXNpbmNlLXRoZS1lcG9jaAorICAgICAgICAgICAgICAgIGZvcm1hdC4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgVGhlIGNvb2tpZSBpdHNlbGYsIGEgaGV4LWVuY29kZWQgcmFuZG9tIGJsb2NrIG9mIGJ5dGVzLiBUaGUgY29va2llCisgICAgICAgICAgICAgICAgbWF5IGJlIG9mIGFueSBsZW5ndGgsIHRob3VnaCBvYnZpb3VzbHkgc2VjdXJpdHkgaW5jcmVhc2VzIAorICAgICAgICAgICAgICAgIGFzIHRoZSBsZW5ndGggaW5jcmVhc2VzLgorICAgICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgT25seSBzZXJ2ZXIgcHJvY2Vzc2VzIG1vZGlmeSB0aGUgY29va2llIGZpbGUuCisgICAgICAgICAgVGhleSBtdXN0IGRvIHNvIHdpdGggdGhpcyBwcm9jZWR1cmU6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIENyZWF0ZSBhIGxvY2tmaWxlIG5hbWUgYnkgYXBwZW5kaW5nICIubG9jayIgdG8gdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgY29va2llIGZpbGUuICBUaGUgc2VydmVyIHNob3VsZCBhdHRlbXB0IHRvIGNyZWF0ZSB0aGlzIGZpbGUKKyAgICAgICAgICAgICAgICB1c2luZyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+T19DUkVBVCB8IE9fRVhDTDwvY29kZT4uICBJZiBmaWxlIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgZmFpbHMsIHRoZSBsb2NrIGZhaWxzLiBTZXJ2ZXJzIHNob3VsZCByZXRyeSBmb3IgYSByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgcGVyaW9kIG9mIHRpbWUsIHRoZW4gdGhleSBtYXkgY2hvb3NlIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBsb2NrCisgICAgICAgICAgICAgICAgdG8ga2VlcCB1c2VycyBmcm9tIGhhdmluZyB0byBtYW51YWxseSBkZWxldGUgYSBzdGFsZQorICAgICAgICAgICAgICAgIGxvY2suIDxzdXA+WzxhIG5hbWU9ImlkcDUyNjA1NzYiIGhyZWY9IiNmdG4uaWRwNTI2MDU3NiIgY2xhc3M9ImZvb3Rub3RlIj4xPC9hPl08L3N1cD4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgT25jZSB0aGUgbG9ja2ZpbGUgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIHNlcnZlciBsb2FkcyB0aGUgY29va2llCisgICAgICAgICAgICAgICAgZmlsZS4gSXQgc2hvdWxkIHRoZW4gZGVsZXRlIGFueSBjb29raWVzIHRoYXQgYXJlIG9sZCAodGhlCisgICAgICAgICAgICAgICAgdGltZW91dCBjYW4gYmUgZmFpcmx5IHNob3J0KSwgb3IgbW9yZSB0aGFuIGEgcmVhc29uYWJsZQorICAgICAgICAgICAgICAgIHRpbWUgaW4gdGhlIGZ1dHVyZSAoc28gdGhhdCBjb29raWVzIG5ldmVyIGFjY2lkZW50YWxseSAKKyAgICAgICAgICAgICAgICBiZWNvbWUgcGVybWFuZW50LCBpZiB0aGUgY2xvY2sgd2FzIHNldCBmYXIgaW50byB0aGUgZnV0dXJlIAorICAgICAgICAgICAgICAgIGF0IHNvbWUgcG9pbnQpLiBJZiBubyByZWNlbnQga2V5cyByZW1haW4sIHRoZSAKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgbWF5IGdlbmVyYXRlIGEgbmV3IGtleS4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgVGhlIHBydW5lZCBhbmQgcG9zc2libHkgYWRkZWQtdG8gY29va2llIGZpbGUgCisgICAgICAgICAgICAgICAgbXVzdCBiZSByZXNhdmVkIGF0b21pY2FsbHkgKHVzaW5nIGEgdGVtcG9yYXJ5IAorICAgICAgICAgICAgICAgIGZpbGUgd2hpY2ggaXMgcmVuYW1lKCknZCkuCisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIFRoZSBsb2NrIG11c3QgYmUgZHJvcHBlZCBieSBkZWxldGluZyB0aGUgbG9ja2ZpbGUuCisgICAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBDbGllbnRzIG5lZWQgbm90IGxvY2sgdGhlIGZpbGUgaW4gb3JkZXIgdG8gbG9hZCBpdCwgCisgICAgICAgICAgYmVjYXVzZSBzZXJ2ZXJzIGFyZSByZXF1aXJlZCB0byBzYXZlIHRoZSBmaWxlIGF0b21pY2FsbHkuICAgICAgICAgIAorICAgICAgICA8L3A+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJTZXJ2ZXIgQWRkcmVzc2VzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9ImFkZHJlc3NlcyI+PC9hPlNlcnZlciBBZGRyZXNzZXM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgU2VydmVyIGFkZHJlc3NlcyBjb25zaXN0IG9mIGEgdHJhbnNwb3J0IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYW5kCisgICAgICB0aGVuIGFuIG9wdGlvbmFsLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlIGZvcm0ga2V5PXZhbHVlLgorICAgICAgRWFjaCB2YWx1ZSBpcyBlc2NhcGVkLgorICAgIDwvcD48cD4KKyAgICAgIEZvciBleGFtcGxlOiAKKyAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+dW5peDpwYXRoPS90bXAvZGJ1cy10ZXN0PC9wcmU+PHA+CisgICAgICBXaGljaCBpcyB0aGUgYWRkcmVzcyB0byBhIHVuaXggc29ja2V0IHdpdGggdGhlIHBhdGggL3RtcC9kYnVzLXRlc3QuCisgICAgPC9wPjxwPgorICAgICAgVmFsdWUgZXNjYXBpbmcgaXMgc2ltaWxhciB0byBVUkkgZXNjYXBpbmcgYnV0IHNpbXBsZXIuCisgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICBUaGUgc2V0IG9mIG9wdGlvbmFsbHktZXNjYXBlZCBieXRlcyBpczoKKyAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5bMC05QS1aYS16Xy0vLlxdPC9jb2RlPi4gVG8gZXNjYXBlLCBlYWNoCisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5ieXRlPC9lbT48L3NwYW4+IChub3RlLCBub3QgY2hhcmFjdGVyKSB3aGljaCBpcyBub3QgaW4gdGhlCisgICAgICAgICAgICBzZXQgb2Ygb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGVzIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBU0NJSQorICAgICAgICAgICAgcGVyY2VudCAoPGNvZGUgY2xhc3M9ImxpdGVyYWwiPiU8L2NvZGU+KSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBieXRlIGluIGhleC4KKyAgICAgICAgICAgIFRoZSBoZXggdmFsdWUgbXVzdCBhbHdheXMgYmUgdHdvIGRpZ2l0cywgZXZlbiBpZiB0aGUgZmlyc3QgZGlnaXQgaXMKKyAgICAgICAgICAgIHplcm8uIFRoZSBvcHRpb25hbGx5LWVzY2FwZWQgYnl0ZXMgbWF5IGJlIGVzY2FwZWQgaWYgZGVzaXJlZC4KKyAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgIFRvIHVuZXNjYXBlLCBhcHBlbmQgZWFjaCBieXRlIGluIHRoZSB2YWx1ZTsgaWYgYSBieXRlIGlzIGFuIEFTQ0lJCisgICAgICAgICAgICBwZXJjZW50ICg8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+JTwvY29kZT4pIGNoYXJhY3RlciB0aGVuIGFwcGVuZCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICBoZXggdmFsdWUgaW5zdGVhZC4gSXQgaXMgYW4gZXJyb3IgaWYgYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+JTwvY29kZT4gYnl0ZQorICAgICAgICAgICAgZG9lcyBub3QgaGF2ZSB0d28gaGV4IGRpZ2l0cyBmb2xsb3dpbmcuIEl0IGlzIGFuIGVycm9yIGlmIGEKKyAgICAgICAgICAgIG5vbi1vcHRpb25hbGx5LWVzY2FwZWQgYnl0ZSBpcyBzZWVuIHVuZXNjYXBlZC4KKyAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgVGhlIHNldCBvZiBvcHRpb25hbGx5LWVzY2FwZWQgYnl0ZXMgaXMgaW50ZW5kZWQgdG8gcHJlc2VydmUgYWRkcmVzcyAKKyAgICAgIHJlYWRhYmlsaXR5IGFuZCBjb252ZW5pZW5jZS4KKyAgICA8L3A+PHA+CisgICAgICBBIHNlcnZlciBtYXkgc3BlY2lmeSBhIGtleS12YWx1ZSBwYWlyIHdpdGggdGhlIGtleSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Z3VpZDwvY29kZT4KKyAgICAgIGFuZCB0aGUgdmFsdWUgYSBoZXgtZW5jb2RlZCAxNi1ieXRlIHNlcXVlbmNlLiA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI3V1aWRzIiB0aXRsZT0iVVVJRHMiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7VVVJRHMmIzgyMjE7PC9hPgorICAgICAgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5ndWlkPC9jb2RlPiBmaWVsZC4gIElmIHByZXNlbnQsCisgICAgICB0aGlzIFVVSUQgbWF5IGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggb25lIHNlcnZlciBhZGRyZXNzIGZyb20gYW5vdGhlci4gQQorICAgICAgc2VydmVyIHNob3VsZCB1c2UgYSBkaWZmZXJlbnQgVVVJRCBmb3IgZWFjaCBhZGRyZXNzIGl0IGxpc3RlbnMgb24uIEZvcgorICAgICAgZXhhbXBsZSwgaWYgYSBtZXNzYWdlIGJ1cyBkYWVtb24gb2ZmZXJzIGJvdGggVU5JWCBkb21haW4gc29ja2V0IGFuZCBUQ1AKKyAgICAgIGNvbm5lY3Rpb25zLCBidXQgdHJlYXRzIGNsaWVudHMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBjb25uZWN0LAorICAgICAgdGhvc2UgdHdvIGNvbm5lY3Rpb25zIGFyZSBlcXVpdmFsZW50IHBvc3QtY29ubmVjdGlvbiBidXQgc2hvdWxkIGhhdmUKKyAgICAgIGRpc3RpbmN0IFVVSURzIHRvIGRpc3Rpbmd1aXNoIHRoZSBraW5kcyBvZiBjb25uZWN0aW9uLgorICAgIDwvcD48cD4KKyAgICAgIFRoZSBpbnRlbnQgb2YgdGhlIGFkZHJlc3MgVVVJRCBmZWF0dXJlIGlzIHRvIGFsbG93IGEgY2xpZW50IHRvIGF2b2lkCisgICAgICBvcGVuaW5nIG11bHRpcGxlIGlkZW50aWNhbCBjb25uZWN0aW9ucyB0byB0aGUgc2FtZSBzZXJ2ZXIsIGJ5IGFsbG93aW5nIHRoZQorICAgICAgY2xpZW50IHRvIGNoZWNrIHdoZXRoZXIgYW4gYWRkcmVzcyBjb3JyZXNwb25kcyB0byBhbiBhbHJlYWR5LWV4aXN0aW5nCisgICAgICBjb25uZWN0aW9uLiAgQ29tcGFyaW5nIHR3byBhZGRyZXNzZXMgaXMgaW5zdWZmaWNpZW50LCBiZWNhdXNlIGFkZHJlc3NlcworICAgICAgY2FuIGJlIHJlY3ljbGVkIGJ5IGRpc3RpbmN0IHNlcnZlcnMsIGFuZCBlcXVpdmFsZW50IGFkZHJlc3NlcyBtYXkgbG9vaworICAgICAgZGlmZmVyZW50IGlmIHNpbXBseSBjb21wYXJlZCBhcyBzdHJpbmdzIChmb3IgZXhhbXBsZSwgdGhlIGhvc3QgaW4gYSBUQ1AKKyAgICAgIGFkZHJlc3MgY2FuIGJlIGdpdmVuIGFzIGFuIElQIGFkZHJlc3Mgb3IgYXMgYSBob3N0bmFtZSkuCisgICAgPC9wPjxwPgorICAgICAgTm90ZSB0aGF0IHRoZSBhZGRyZXNzIGtleSBpcyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Z3VpZDwvY29kZT4gZXZlbiB0aG91Z2ggdGhlIAorICAgICAgcmVzdCBvZiB0aGUgQVBJIGFuZCBkb2N1bWVudGF0aW9uIHNheXMgIlVVSUQsIiBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgorICAgIDwvcD48cD4KKyAgICAgIFtGSVhNRSBjbGFyaWZ5IGlmIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBlYWNoIGlzIGEgcmVxdWlyZW1lbnQgCisgICAgICBvciBqdXN0IGEgc3VnZ2VzdGlvbl0KKyAgICAgIFdoZW4gY29ubmVjdGluZyB0byBhIHNlcnZlciwgbXVsdGlwbGUgc2VydmVyIGFkZHJlc3NlcyBjYW4gYmUKKyAgICAgIHNlcGFyYXRlZCBieSBhIHNlbWktY29sb24uIFRoZSBsaWJyYXJ5IHdpbGwgdGhlbiB0cnkgdG8gY29ubmVjdAorICAgICAgdG8gdGhlIGZpcnN0IGFkZHJlc3MgYW5kIGlmIHRoYXQgZmFpbHMsIGl0J2xsIHRyeSB0byBjb25uZWN0IHRvCisgICAgICB0aGUgbmV4dCBvbmUgc3BlY2lmaWVkLCBhbmQgc28gZm9ydGguIEZvciBleGFtcGxlCisgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPnVuaXg6cGF0aD0vdG1wL2RidXMtdGVzdDt1bml4OnBhdGg9L3RtcC9kYnVzLXRlc3QyPC9wcmU+PHA+CisgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iVHJhbnNwb3J0cyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJ0cmFuc3BvcnRzIj48L2E+VHJhbnNwb3J0czwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBbRklYTUUgd2UgbmVlZCB0byBzcGVjaWZ5IGluIGRldGFpbCBlYWNoIHRyYW5zcG9ydCBhbmQgaXRzIHBvc3NpYmxlIGFyZ3VtZW50c10KKyAgICAKKyAgICAgIEN1cnJlbnQgdHJhbnNwb3J0cyBpbmNsdWRlOiB1bml4IGRvbWFpbiBzb2NrZXRzIChpbmNsdWRpbmcgCisgICAgICBhYnN0cmFjdCBuYW1lc3BhY2Ugb24gbGludXgpLCBsYXVuY2hkLCBUQ1AvSVAsIGFuZCBhIGRlYnVnL3Rlc3RpbmcgdHJhbnNwb3J0CisgICAgICB1c2luZyBpbi1wcm9jZXNzIHBpcGVzLiBGdXR1cmUgcG9zc2libGUgdHJhbnNwb3J0cyBpbmNsdWRlIG9uZSB0aGF0CisgICAgICB0dW5uZWxzIG92ZXIgWDExIHByb3RvY29sLgorICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IlVuaXggRG9tYWluIFNvY2tldHMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9InRyYW5zcG9ydHMtdW5peC1kb21haW4tc29ja2V0cyI+PC9hPlVuaXggRG9tYWluIFNvY2tldHM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBVbml4IGRvbWFpbiBzb2NrZXRzIGNhbiBiZSBlaXRoZXIgcGF0aHMgaW4gdGhlIGZpbGUgc3lzdGVtIG9yIG9uIExpbnV4IAorCWtlcm5lbHMsIHRoZXkgY2FuIGJlIGFic3RyYWN0IHdoaWNoIGFyZSBzaW1pbGFyIHRvIHBhdGhzIGJ1dAorCWRvIG5vdCBzaG93IHVwIGluIHRoZSBmaWxlIHN5c3RlbS4gIAorICAgICAgPC9wPjxwPgorICAgICAgICBXaGVuIGEgc29ja2V0IGlzIG9wZW5lZCBieSB0aGUgRC1CdXMgbGlicmFyeSBpdCB0cnVuY2F0ZXMgdGhlIHBhdGggCisJbmFtZSByaWdodCBiZWZvcmUgdGhlIGZpcnN0IHRyYWlsaW5nIE51bCBieXRlLiAgVGhpcyBpcyB0cnVlIGZvciBib3RoCisJbm9ybWFsIHBhdGhzIGFuZCBhYnN0cmFjdCBwYXRocy4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgZGVwYXJ0dXJlIGZyb20KKwlwcmV2aW91cyB2ZXJzaW9ucyBvZiBELUJ1cyB0aGF0IHdvdWxkIGNyZWF0ZSBzb2NrZXRzIHdpdGggYSBmaXhlZCAKKwlsZW5ndGggcGF0aCBuYW1lLiAgTmFtZXMgd2hpY2ggd2VyZSBzaG9ydGVyIHRoYW4gdGhlIGZpeGVkIGxlbmd0aAorCXdvdWxkIGJlIHBhZGRlZCBieSBOdWwgYnl0ZXMuCisgICAgICA8L3A+PHA+CisgICAgICAgIFVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBhdmFpbGFibGUgb24gd2luZG93cy4gCisgICAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJTZXJ2ZXIgQWRkcmVzcyBGb3JtYXQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9InRyYW5zcG9ydHMtdW5peC1kb21haW4tc29ja2V0cy1hZGRyZXNzZXMiPjwvYT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPiAKKyAgICAgICAgICBVbml4IGRvbWFpbiBzb2NrZXQgYWRkcmVzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSAidW5peDoiIHByZWZpeCAKKyAgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZXM8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPnBhdGg8L3RkPjx0ZD4ocGF0aCk8L3RkPjx0ZD5wYXRoIG9mIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQuIElmIHNldCwgdGhlICJ0bXBkaXIiIGFuZCAiYWJzdHJhY3QiIGtleSBtdXN0IG5vdCBiZSBzZXQuPC90ZD48L3RyPjx0cj48dGQ+dG1wZGlyPC90ZD48dGQ+KHBhdGgpPC90ZD48dGQ+dGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB3aGljaCBhIHNvY2tldCBmaWxlIHdpdGggYSByYW5kb20gZmlsZSBuYW1lIHN0YXJ0aW5nIHdpdGggJ2RidXMtJyB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBrZXkgY2FuIG9ubHkgYmUgdXNlZCBpbiBzZXJ2ZXIgYWRkcmVzc2VzLCBub3QgaW4gY2xpZW50IGFkZHJlc3Nlcy4gSWYgc2V0LCB0aGUgInBhdGgiIGFuZCAiYWJzdHJhY3QiIGtleSBtdXN0IG5vdCBiZSBzZXQuPC90ZD48L3RyPjx0cj48dGQ+YWJzdHJhY3Q8L3RkPjx0ZD4oc3RyaW5nKTwvdGQ+PHRkPnVuaXF1ZSBzdHJpbmcgKHBhdGgpIGluIHRoZSBhYnN0cmFjdCBuYW1lc3BhY2UuIElmIHNldCwgdGhlICJwYXRoIiBvciAidGVtcGRpciIga2V5IG11c3Qgbm90IGJlIHNldC48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0ibGF1bmNoZCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0idHJhbnNwb3J0cy1sYXVuY2hkIj48L2E+bGF1bmNoZDwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIGxhdW5jaGQgaXMgYSBvcGVuLXNvdXJjZSBzZXJ2ZXIgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCByZXBsYWNlcyBpbml0LCBpbmV0ZAorICAgICAgICBhbmQgY3JvbiBvbiBBcHBsZSBNYWMgT1MgWCB2ZXJzaW9ucyAxMC40IGFuZCBhYm92ZS4gSXQgcHJvdmlkZXMgYSBjb21tb24gc2Vzc2lvbgorICAgICAgICBidXMgYWRkcmVzcyBmb3IgZWFjaCB1c2VyIGFuZCBkZXByZWNhdGVzIHRoZSBYMTEtZW5hYmxlZCBELUJ1cyBsYXVuY2hlciBvbiBPU1guCisgICAgICA8L3A+PHA+CisgICAgICAgIGxhdW5jaGQgYWxsb2NhdGVzIGEgc29ja2V0IGFuZCBwcm92aWRlcyBpdCB3aXRoIHRoZSB1bml4IHBhdGggdGhyb3VnaCB0aGUKKyAgICAgICAgREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCB2YXJpYWJsZSBpbiBsYXVuY2hkJ3MgZW52aXJvbm1lbnQuIEV2ZXJ5IHByb2Nlc3MKKyAgICAgICAgc3Bhd25lZCBieSBsYXVuY2hkIChvciBkYnVzLWRhZW1vbiwgaWYgaXQgd2FzIHN0YXJ0ZWQgYnkgbGF1bmNoZCkgY2FuIGFjY2VzcworICAgICAgICBpdCB0aHJvdWdoIGl0cyBlbnZpcm9ubWVudC4KKyAgICAgICAgT3RoZXIgcHJvY2Vzc2VzIGNhbiBxdWVyeSBmb3IgdGhlIGxhdW5jaGQgc29ja2V0IGJ5IGV4ZWN1dGluZzoKKyAgICAgICAgJCBsYXVuY2hjdGwgZ2V0ZW52IERCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQKKyAgICAgICAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSBzbyBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgICAgICBtYW51YWxseS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgbGF1bmNoZCBpcyBub3QgYXZhaWxhYmxlIG9uIE1pY3Jvc29mdCBXaW5kb3dzLgorICAgICAgPC9wPjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iU2VydmVyIEFkZHJlc3MgRm9ybWF0Ij48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJ0cmFuc3BvcnRzLWxhdW5jaGQtYWRkcmVzc2VzIj48L2E+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBsYXVuY2hkIGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgImxhdW5jaGQ6IiBwcmVmaXgKKyAgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZXM8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPmVudjwvdGQ+PHRkPihlbnZpcm9ubWVudCB2YXJpYWJsZSk8L3RkPjx0ZD5wYXRoIG9mIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgZm9yIHRoZSBsYXVuY2hkIGNyZWF0ZWQgZGJ1cy1kYWVtb24uPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IlRDUCBTb2NrZXRzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJ0cmFuc3BvcnRzLXRjcC1zb2NrZXRzIj48L2E+VENQIFNvY2tldHM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBUaGUgdGNwIHRyYW5zcG9ydCBwcm92aWRlcyBUQ1AvSVAgYmFzZWQgY29ubmVjdGlvbnMgYmV0d2VlbiBjbGllbnRzCisgICAgICAgIGxvY2F0ZWQgb24gdGhlIHNhbWUgb3IgZGlmZmVyZW50IGhvc3RzLiAKKyAgICAgIDwvcD48cD4KKyAgICAgICAgVXNpbmcgdGNwIHRyYW5zcG9ydCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHNlY3VyZSBhdXRoZW50aWZpY2F0aW9uIG1lY2hhbmlzbXVzIAorICAgICAgICBvdmVyIGEgbmV0d29yayBpcyB1bnNlY3VyZS4gCisgICAgICA8L3A+PHA+ICAKKyAgICAgICAgV2luZG93cyBub3RlczogQmVjYXVzZSBvZiB0aGUgdGNwIHN0YWNrIG9uIHdpbmRvd3MgZG9lcyBub3QgcHJvdmlkZSBzZW5kaW5nIAorICAgICAgICBjcmVkZW50aWFscyBvdmVyIGEgdGNwIGNvbm5lY3Rpb24sIHRoZSBFWFRFUk5BTCBhdXRoZW50aWZpY2F0aW9uIAorICAgICAgICBtZWNoYW5pc211cyBkb2VzIG5vdCB3b3JrLiAKKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IlNlcnZlciBBZGRyZXNzIEZvcm1hdCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0idHJhbnNwb3J0cy10Y3Atc29ja2V0cy1hZGRyZXNzZXMiPjwvYT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPiAKKyAgICAgICAgIFRDUC9JUCBzb2NrZXQgYWRkcmVzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSAidGNwOiIgcHJlZml4IAorICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5OYW1lPC90aD48dGg+VmFsdWVzPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD5ob3N0PC90ZD48dGQ+KHN0cmluZyk8L3RkPjx0ZD5kbnMgbmFtZSBvciBpcCBhZGRyZXNzPC90ZD48L3RyPjx0cj48dGQ+cG9ydDwvdGQ+PHRkPihudW1iZXIpPC90ZD48dGQ+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICBjaG9vc2UgYSBmcmVlIHBvcnQgcHJvdmlkZWQgZnJvbSB0aGUgdW5kZXJsYXlpbmcgb3BlcmF0aW5nIHN5c3RlbS4gCisgICAgICAgICAgICBsaWJkYnVzIGlzIGFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgdXNlZCBwb3J0IGZyb20gdGhlIHNlcnZlci4gIAorICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD5mYW1pbHk8L3RkPjx0ZD4oc3RyaW5nKTwvdGQ+PHRkPklmIHNldCwgcHJvdmlkZSB0aGUgdHlwZSBvZiBzb2NrZXQgZmFtaWx5IGVpdGhlciAiaXB2NCIgb3IgImlwdjYiLiBJZiB1bnNldCwgdGhlIGZhbWlseSBpcyB1bnNwZWNpZmllZC48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iTm9uY2Utc2VjdXJlZCBUQ1AgU29ja2V0cyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0idHJhbnNwb3J0cy1ub25jZS10Y3Atc29ja2V0cyI+PC9hPk5vbmNlLXNlY3VyZWQgVENQIFNvY2tldHM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBUaGUgbm9uY2UtdGNwIHRyYW5zcG9ydCBwcm92aWRlcyBhIHNlY3VyZWQgVENQIHRyYW5zcG9ydCwgdXNpbmcgYQorICAgICAgICBzaW1wbGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHRvIGVuc3VyZSB0aGF0IG9ubHkgY2xpZW50cyB3aXRoIHJlYWQKKyAgICAgICAgYWNjZXNzIHRvIGEgY2VydGFpbiBsb2NhdGlvbiBpbiB0aGUgZmlsZXN5c3RlbSBjYW4gY29ubmVjdCB0byB0aGUgc2VydmVyLgorICAgICAgICBUaGUgc2VydmVyIHdyaXRlcyBhIHNlY3JldCwgdGhlIG5vbmNlLCB0byBhIGZpbGUgYW5kIGFuIGluY29taW5nIGNsaWVudAorICAgICAgICBjb25uZWN0aW9uIGlzIG9ubHkgYWNjZXB0ZWQgaWYgdGhlIGNsaWVudCBzZW5kcyB0aGUgbm9uY2UgcmlnaHQgYWZ0ZXIKKyAgICAgICAgdGhlIGNvbm5lY3QuIFRoZSBub25jZSBtZWNoYW5pc20gcmVxdWlyZXMgbm8gc2V0dXAgYW5kIGlzIG9ydGhvZ29uYWwgdG8KKyAgICAgICAgdGhlIGhpZ2hlci1sZXZlbCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgQXV0aGVudGljYXRpb24gc2VjdGlvbi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgT24gc3RhcnQsIHRoZSBzZXJ2ZXIgZ2VuZXJhdGVzIGEgcmFuZG9tIDE2IGJ5dGUgbm9uY2UgYW5kIHdyaXRlcyBpdAorICAgICAgICB0byBhIGZpbGUgaW4gdGhlIHVzZXIncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LiBUaGUgbm9uY2UgZmlsZSBsb2NhdGlvbgorICAgICAgICBpcyBwdWJsaXNoZWQgYXMgcGFydCBvZiB0aGUgc2VydmVyJ3MgRC1CdXMgYWRkcmVzcyB1c2luZyB0aGUKKyAgICAgICAgIm5vbmNlZmlsZSIga2V5LXZhbHVlIHBhaXIuCisKKyAgICAgICAgQWZ0ZXIgYW4gYWNjZXB0LCB0aGUgc2VydmVyIHJlYWRzIDE2IGJ5dGVzIGZyb20gdGhlIHNvY2tldC4gSWYgdGhlCisgICAgICAgIHJlYWQgYnl0ZXMgZG8gbm90IG1hdGNoIHRoZSBub25jZSBzdG9yZWQgaW4gdGhlIG5vbmNlIGZpbGUsIHRoZQorICAgICAgICBzZXJ2ZXIgTVVTVCBpbW1lZGlhdGVseSBkcm9wIHRoZSBjb25uZWN0aW9uLgorICAgICAgICBJZiB0aGUgbm9uY2UgbWF0Y2ggdGhlIHJlY2VpdmVkIGJ5dGUgc2VxdWVuY2UsIHRoZSBjbGllbnQgaXMgYWNjZXB0ZWQKKyAgICAgICAgYW5kIHRoZSB0cmFuc3BvcnQgYmVoYXZlcyBsaWtlIGFuIHVuc2VjdXJlZCB0Y3AgdHJhbnNwb3J0LgorICAgICAgPC9wPjxwPgorICAgICAgICBBZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdCB0byB0aGUgc2VydmVyIHNvY2tldCwgdGhlIGNsaWVudCBNVVNUIHJlYWQKKyAgICAgICAgdGhlIG5vbmNlIGZyb20gdGhlIGZpbGUgcHVibGlzaGVkIGJ5IHRoZSBzZXJ2ZXIgdmlhIHRoZSBub25jZWZpbGU9CisgICAgICAgIGtleS12YWx1ZSBwYWlyIGFuZCBzZW5kIGl0IG92ZXIgdGhlIHNvY2tldC4gQWZ0ZXIgdGhhdCwgdGhlCisgICAgICAgIHRyYW5zcG9ydCBiZWhhdmVzIGxpa2UgYW4gdW5zZWN1cmVkIHRjcCB0cmFuc3BvcnQuCisgICAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJTZXJ2ZXIgQWRkcmVzcyBGb3JtYXQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9InRyYW5zcG9ydHMtbm9uY2UtdGNwLXNvY2tldHMtYWRkcmVzc2VzIj48L2E+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4gCisgICAgICAgICBOb25jZSBUQ1AvSVAgc29ja2V0IGFkZHJlc3NlcyB1c2VzIHRoZSAibm9uY2UtdGNwOiIgcHJlZml4IAorICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5OYW1lPC90aD48dGg+VmFsdWVzPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD5ob3N0PC90ZD48dGQ+KHN0cmluZyk8L3RkPjx0ZD5kbnMgbmFtZSBvciBpcCBhZGRyZXNzPC90ZD48L3RyPjx0cj48dGQ+cG9ydDwvdGQ+PHRkPihudW1iZXIpPC90ZD48dGQ+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICBjaG9vc2UgYSBmcmVlIHBvcnQgcHJvdmlkZWQgZnJvbSB0aGUgdW5kZXJsYXlpbmcgb3BlcmF0aW5nIHN5c3RlbS4gCisgICAgICAgICAgICBsaWJkYnVzIGlzIGFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgdXNlZCBwb3J0IGZyb20gdGhlIHNlcnZlci4gIAorICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD5mYW1pbHk8L3RkPjx0ZD4oc3RyaW5nKTwvdGQ+PHRkPklmIHNldCwgcHJvdmlkZSB0aGUgdHlwZSBvZiBzb2NrZXQgZmFtaWx5IGVpdGhlciAiaXB2NCIgb3IgImlwdjYiLiBJZiB1bnNldCwgdGhlIGZhbWlseSBpcyB1bnNwZWNpZmllZC48L3RkPjwvdHI+PHRyPjx0ZD5ub25jZWZpbGU8L3RkPjx0ZD4ocGF0aCk8L3RkPjx0ZD5maWxlIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIHNlY3JldDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJNZXRhIFRyYW5zcG9ydHMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0ibWV0YS10cmFuc3BvcnRzIj48L2E+TWV0YSBUcmFuc3BvcnRzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIE1ldGEgdHJhbnNwb3J0cyBhcmUgYSBraW5kIG9mIHRyYW5zcG9ydCB3aXRoIHNwZWNpYWwgZW5oYW5jZW1lbnRzIG9yCisgICAgICBiZWhhdmlvci4gQ3VycmVudGx5IGF2YWlsYWJsZSBtZXRhIHRyYW5zcG9ydHMgaW5jbHVkZTogYXV0b2xhdW5jaAorICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IkF1dG9sYXVuY2giPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1ldGEtdHJhbnNwb3J0cy1hdXRvbGF1bmNoIj48L2E+QXV0b2xhdW5jaDwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+VGhlIGF1dG9sYXVuY2ggdHJhbnNwb3J0IHByb3ZpZGVzIGEgd2F5IGZvciBkYnVzIGNsaWVudHMgdG8gYXV0b2RldGVjdAorICAgICAgIGEgcnVubmluZyBkYnVzIHNlc3Npb24gYnVzIGFuZCB0byBhdXRvbGF1bmNoIGEgc2Vzc2lvbiBidXMgaWYgbm90IHByZXNlbnQuCisgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IlNlcnZlciBBZGRyZXNzIEZvcm1hdCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWV0YS10cmFuc3BvcnRzLWF1dG9sYXVuY2gtYWRkcmVzc2VzIj48L2E+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgIEF1dG9sYXVuY2ggYWRkcmVzc2VzIHVzZXMgdGhlICJhdXRvbGF1bmNoOiIgcHJlZml4IGFuZCBzdXBwb3J0IHRoZQorICAgICAgICAgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+TmFtZTwvdGg+PHRoPlZhbHVlczwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+c2NvcGU8L3RkPjx0ZD4oc3RyaW5nKTwvdGQ+PHRkPnNjb3BlIG9mIGF1dG9sYXVuY2ggKFdpbmRvd3Mgb25seSkKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIippbnN0YWxsLXBhdGgiIC0gbGltaXQgc2Vzc2lvbiBidXMgdG8gZGJ1cyBpbnN0YWxsYXRpb24gcGF0aC4KKyAgICAgICAgICAgICAgIFRoZSBkYnVzIGluc3RhbGxhdGlvbiBwYXRoIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbG9jYXRpb24gb2YKKyAgICAgICAgICAgICAgIHRoZSBzaGFyZWQgZGJ1cyBsaWJyYXJ5LiBJZiB0aGUgbGlicmFyeSBpcyBsb2NhdGVkIGluIGEgJ2JpbicKKyAgICAgICAgICAgICAgIHN1YmRpcmVjdG9yeSB0aGUgaW5zdGFsbGF0aW9uIHJvb3QgaXMgdGhlIGRpcmVjdG9yeSBhYm92ZSwKKyAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWJyYXJ5IGxpdmVzIGlzIHRha2VuIGFzCisgICAgICAgICAgICAgICBpbnN0YWxsYXRpb24gcm9vdC4KKyAgICAgICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICAgICAgICAgJmx0O2luc3RhbGwtcm9vdCZndDsvYmluL1tsaWJdZGJ1cy0xLmRsbAorICAgICAgICAgICAgICAgICAgICZsdDtpbnN0YWxsLXJvb3QmZ3Q7L1tsaWJdZGJ1cy0xLmRsbAorICAgICAgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICAgIip1c2VyIiAtIGxpbWl0IHNlc3Npb24gYnVzIHRvIHRoZSByZWNlbnQgdXNlci4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICBvdGhlciB2YWx1ZXMgLSBzcGVjaWZ5IGRlZGljYXRlZCBzZXNzaW9uIGJ1cyBsaWtlICJyZWxlYXNlIiwKKyAgICAgICAgICAgICAgICJkZWJ1ZyIgb3Igb3RoZXIKKyAgICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj4KKyAgICAgICAgICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IldpbmRvd3MgaW1wbGVtZW50YXRpb24iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1ldGEtdHJhbnNwb3J0cy1hdXRvbGF1bmNoLXdpbmRvd3MtaW1wbGVtZW50YXRpb24iPjwvYT5XaW5kb3dzIGltcGxlbWVudGF0aW9uPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgT24gc3RhcnQsIHRoZSBzZXJ2ZXIgb3BlbnMgYSBwbGF0Zm9ybSBzcGVjaWZpYyB0cmFuc3BvcnQsIGNyZWF0ZXMgYSBtdXRleAorICAgICAgICBhbmQgYSBzaGFyZWQgbWVtb3J5IHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsYXRlZCBzZXNzaW9uIGJ1cyBhZGRyZXNzLgorICAgICAgICBUaGlzIG11dGV4IHdpbGwgYmUgaW5zcGVjdGVkIGJ5IHRoZSBkYnVzIGNsaWVudCBsaWJyYXJ5IHRvIGRldGVjdCBhCisgICAgICAgIHJ1bm5pbmcgZGJ1cyBzZXNzaW9uIGJ1cy4gVGhlIGFjY2VzcyB0byB0aGUgbXV0ZXggYW5kIHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHNlY3Rpb24gYXJlIHByb3RlY3RlZCBieSBnbG9iYWwgbG9ja3MuCisgICAgICA8L3A+PHA+CisgICAgICAgSW4gdGhlIHJlY2VudCBpbXBsZW1lbnRhdGlvbiB0aGUgYXV0b2xhdW5jaCB0cmFuc3BvcnQgdXNlcyBhIHRjcCB0cmFuc3BvcnQKKyAgICAgICBvbiBsb2NhbGhvc3Qgd2l0aCBhIHBvcnQgY2hvb3NlbiBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGlzIGRldGFpbCBtYXkKKyAgICAgICBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgRGlzY2xhaW1lcjogVGhlIHJlY2VudCBpbXBsZW1lbnRhdGlvbiBpcyBpbiBhbiBlYXJseSBzdGF0ZSBhbmQgbWF5IG5vdAorICAgICAgICB3b3JrIGluIGFsbCBjaXJ1bXN0YW5jZXMgYW5kL29yIG1heSBoYXZlIHNlY3VyaXR5IGlzc3Vlcy4gQmVjYXVzZSBvZiB0aGlzCisgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZG9jdW1lbnRhdGVkIHlldC4KKyAgICAgIDwvcD48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MSIgdGl0bGU9Ik5hbWluZyBDb252ZW50aW9ucyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJuYW1pbmctY29udmVudGlvbnMiPjwvYT5OYW1pbmcgQ29udmVudGlvbnM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgRC1CdXMgbmFtZXNwYWNlcyBhcmUgYWxsIGxvd2VyY2FzZSBhbmQgY29ycmVzcG9uZCB0byByZXZlcnNlZCBkb21haW4KKyAgICAgIG5hbWVzLCBhcyB3aXRoIEphdmEuIGUuZy4gIm9yZy5mcmVlZGVza3RvcCIKKyAgICA8L3A+PHA+CisgICAgICBJbnRlcmZhY2UsIHNpZ25hbCwgbWV0aG9kLCBhbmQgcHJvcGVydHkgbmFtZXMgYXJlICJXaW5kb3dzU3R5bGVDYXBzIiwgbm90ZQorICAgICAgdGhhdCB0aGUgZmlyc3QgbGV0dGVyIGlzIGNhcGl0YWxpemVkLCB1bmxpa2UgSmF2YS4KKyAgICA8L3A+PHA+CisgICAgICBPYmplY3QgcGF0aHMgYXJlIG5vcm1hbGx5IGFsbCBsb3dlcmNhc2Ugd2l0aCB1bmRlcnNjb3JlcyB1c2VkIHJhdGhlciB0aGFuCisgICAgICBoeXBoZW5zLgorICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MSIgdGl0bGU9IlVVSURzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9InV1aWRzIj48L2E+VVVJRHM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgQSB3b3JraW5nIEQtQnVzIGltcGxlbWVudGF0aW9uIHVzZXMgdW5pdmVyc2FsbHktdW5pcXVlIElEcyBpbiB0d28gcGxhY2VzLgorICAgICAgRmlyc3QsIGVhY2ggc2VydmVyIGFkZHJlc3MgaGFzIGEgVVVJRCBpZGVudGlmeWluZyB0aGUgYWRkcmVzcywgCisgICAgICBhcyBkZXNjcmliZWQgaW4gPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNhZGRyZXNzZXMiIHRpdGxlPSJTZXJ2ZXIgQWRkcmVzc2VzIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwO1NlcnZlciBBZGRyZXNzZXMmIzgyMjE7PC9hPi4gU2Vjb25kLCBlYWNoIG9wZXJhdGluZworICAgICAgc3lzdGVtIGtlcm5lbCBpbnN0YW5jZSBydW5uaW5nIGEgRC1CdXMgY2xpZW50IG9yIHNlcnZlciBoYXMgYSBVVUlECisgICAgICBpZGVudGlmeWluZyB0aGF0IGtlcm5lbCwgcmV0cmlldmVkIGJ5IGludm9raW5nIHRoZSBtZXRob2QKKyAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuR2V0TWFjaGluZUlkKCkgKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI3N0YW5kYXJkLWludGVyZmFjZXMtcGVlciIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXI8L2NvZGU+JiM4MjIxOzwvYT4pLgorICAgIDwvcD48cD4KKyAgICAgIFRoZSB0ZXJtICJVVUlEIiBpbiB0aGlzIGRvY3VtZW50IGlzIGludGVuZGVkIGxpdGVyYWxseSwgaS5lLiBhbgorICAgICAgaWRlbnRpZmllciB0aGF0IGlzIHVuaXZlcnNhbGx5IHVuaXF1ZS4gSXQgaXMgbm90IGludGVuZGVkIHRvIHJlZmVyIHRvCisgICAgICBSRkM0MTIyLCBhbmQgaW4gZmFjdCB0aGUgRC1CdXMgVVVJRCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoYXQgUkZDLgorICAgIDwvcD48cD4KKyAgICAgIFRoZSBVVUlEIG11c3QgY29udGFpbiAxMjggYml0cyBvZiBkYXRhIGFuZCBiZSBoZXgtZW5jb2RlZC4gIFRoZQorICAgICAgaGV4LWVuY29kZWQgc3RyaW5nIG1heSBub3QgY29udGFpbiBoeXBoZW5zIG9yIG90aGVyIG5vbi1oZXgtZGlnaXQKKyAgICAgIGNoYXJhY3RlcnMsIGFuZCBpdCBtdXN0IGJlIGV4YWN0bHkgMzIgY2hhcmFjdGVycyBsb25nLiAgVG8gZ2VuZXJhdGUgYQorICAgICAgVVVJRCwgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGNvbmNhdGVuYXRlcyA5NiBiaXRzIG9mIHJhbmRvbQorICAgICAgZGF0YSBmb2xsb3dlZCBieSB0aGUgMzItYml0IHRpbWUgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCAoaW4gYmlnCisgICAgICBlbmRpYW4gYnl0ZSBvcmRlcikuCisgICAgPC9wPjxwPgorICAgICAgSXQgd291bGQgYWxzbyBiZSBhY2NlcHRhYmxlIGFuZCBwcm9iYWJseSBiZXR0ZXIgdG8gc2ltcGx5IGdlbmVyYXRlIDEyOAorICAgICAgYml0cyBvZiByYW5kb20gZGF0YSwgYXMgbG9uZyBhcyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgb2YgaGlnaAorICAgICAgcXVhbGl0eS4gVGhlIHRpbWVzdGFtcCBjb3VsZCBjb25jZWl2YWJseSBoZWxwIGlmIHRoZSByYW5kb20gYml0cyBhcmUgbm90CisgICAgICB2ZXJ5IHJhbmRvbS4gV2l0aCBhIHF1YWxpdHkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsIGNvbGxpc2lvbnMgYXJlCisgICAgICBleHRyZW1lbHkgdW5saWtlbHkgZXZlbiB3aXRoIG9ubHkgOTYgYml0cywgc28gaXQncyBzb21ld2hhdCBhY2FkZW1pYy4KKyAgICA8L3A+PHA+CisgICAgICBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkLCBob3dldmVyLCBzdGljayB0byByYW5kb20gZGF0YSBmb3IgdGhlIGZpcnN0IDk2IGJpdHMKKyAgICAgIG9mIHRoZSBVVUlELgorICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MSIgdGl0bGU9IlN0YW5kYXJkIEludGVyZmFjZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0ic3RhbmRhcmQtaW50ZXJmYWNlcyI+PC9hPlN0YW5kYXJkIEludGVyZmFjZXM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgU2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjbWVzc2FnZS1wcm90b2NvbC10eXBlcy1ub3RhdGlvbiIgdGl0bGU9Ik5vdGF0aW9uIGluIHRoaXMgZG9jdW1lbnQiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7Tm90YXRpb24gaW4gdGhpcyBkb2N1bWVudCYjODIyMTs8L2E+IGZvciBkZXRhaWxzIG9uIAorICAgICAgIHRoZSBub3RhdGlvbiB1c2VkIGluIHRoaXMgc2VjdGlvbi4gVGhlcmUgYXJlIHNvbWUgc3RhbmRhcmQgaW50ZXJmYWNlcworICAgICAgdGhhdCBtYXkgYmUgdXNlZnVsIGFjcm9zcyB2YXJpb3VzIEQtQnVzIGFwcGxpY2F0aW9ucy4KKyAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXBlZXIiPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlcjwvY29kZT48L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBUaGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXI8L2NvZGU+IGludGVyZmFjZSAKKyAgICAgICAgaGFzIHR3byBtZXRob2RzOgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZyAoKQorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuR2V0TWFjaGluZUlkIChvdXQgU1RSSU5HIG1hY2hpbmVfdXVpZCkKKyAgICAgICAgPC9wcmU+PHA+CisgICAgICA8L3A+PHA+CisgICAgICAgIE9uIHJlY2VpcHQgb2YgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4gbWVzc2FnZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nPC9jb2RlPiwgYW4gYXBwbGljYXRpb24gc2hvdWxkIGRvCisgICAgICAgIG5vdGhpbmcgb3RoZXIgdGhhbiByZXBseSB3aXRoIGEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1FVEhPRF9SRVRVUk48L2NvZGU+IGFzCisgICAgICAgIHVzdWFsLiAgSXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIG9iamVjdCBwYXRoIGEgcGluZyBpcyBzZW50IHRvLiAgVGhlCisgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkuCisgICAgICA8L3A+PHA+CisgICAgICAgIE9uIHJlY2VpcHQgb2YgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NRVRIT0RfQ0FMTDwvY29kZT4gbWVzc2FnZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQ8L2NvZGU+LCBhbiBhcHBsaWNhdGlvbiBzaG91bGQgCisgICAgICAgIHJlcGx5IHdpdGggYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TUVUSE9EX1JFVFVSTjwvY29kZT4gY29udGFpbmluZyBhIGhleC1lbmNvZGVkIAorICAgICAgICBVVUlEIHJlcHJlc2VudGluZyB0aGUgaWRlbnRpdHkgb2YgdGhlIG1hY2hpbmUgdGhlIHByb2Nlc3MgaXMgcnVubmluZyBvbi4KKyAgICAgICAgVGhpcyBVVUlEIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBwcm9jZXNzZXMgb24gYSBzaW5nbGUgc3lzdGVtIGF0IGxlYXN0CisgICAgICAgIHVudGlsIHRoYXQgc3lzdGVtIG5leHQgcmVib290cy4gSXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyByZWJvb3RzIAorICAgICAgICBpZiBwb3NzaWJsZSwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYW5kIGlzIG5vdCAKKyAgICAgICAgZ3VhcmFudGVlZC4KKyAgICAgICAgSXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIG9iamVjdCBwYXRoIGEgR2V0TWFjaGluZUlkIGlzIHNlbnQgdG8uICBUaGUKKyAgICAgICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhpcyBtZXRob2QgYXV0b21hdGljYWxseS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhlIFVVSUQgaXMgaW50ZW5kZWQgdG8gYmUgcGVyLWluc3RhbmNlLW9mLXRoZS1vcGVyYXRpbmctc3lzdGVtLCBzbyBtYXkgcmVwcmVzZW50CisgICAgICAgIGEgdmlydHVhbCBtYWNoaW5lIHJ1bm5pbmcgb24gYSBoeXBlcnZpc29yLCByYXRoZXIgdGhhbiBhIHBoeXNpY2FsIG1hY2hpbmUuCisgICAgICAgIEJhc2ljYWxseSBpZiB0d28gcHJvY2Vzc2VzIHNlZSB0aGUgc2FtZSBVVUlELCB0aGV5IHNob3VsZCBhbHNvIHNlZSB0aGUgc2FtZQorICAgICAgICBzaGFyZWQgbWVtb3J5LCBVTklYIGRvbWFpbiBzb2NrZXRzLCBwcm9jZXNzIElEcywgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSAKKyAgICAgICAgYSBydW5uaW5nIE9TIGtlcm5lbCBpbiBjb21tb24gYmV0d2VlbiB0aGUgcHJvY2Vzc2VzLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgVVVJRCBpcyBvZnRlbiB1c2VkIHdoZXJlIG90aGVyIHByb2dyYW1zIG1pZ2h0IHVzZSBhIGhvc3RuYW1lLiBIb3N0bmFtZXMgCisgICAgICAgIGNhbiBjaGFuZ2Ugd2l0aG91dCByZWJvb3RpbmcsIGhvd2V2ZXIsIG9yIGp1c3QgYmUgImxvY2FsaG9zdCIgLSBzbyB0aGUgVVVJRAorICAgICAgICBpcyBtb3JlIHJvYnVzdC4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiN1dWlkcyIgdGl0bGU9IlVVSURzIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwO1VVSURzJiM4MjIxOzwvYT4gZXhwbGFpbnMgdGhlIGZvcm1hdCBvZiB0aGUgVVVJRC4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJzdGFuZGFyZC1pbnRlcmZhY2VzLWludHJvc3BlY3RhYmxlIj48L2E+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlPC9jb2RlPjwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoaXMgaW50ZXJmYWNlIGhhcyBvbmUgbWV0aG9kOgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlLkludHJvc3BlY3QgKG91dCBTVFJJTkcgeG1sX2RhdGEpCisgICAgICAgIDwvcHJlPjxwPgorICAgICAgPC9wPjxwPgorICAgICAgICBPYmplY3RzIGluc3RhbmNlcyBtYXkgaW1wbGVtZW50CisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JbnRyb3NwZWN0PC9jb2RlPiB3aGljaCByZXR1cm5zIGFuIFhNTCBkZXNjcmlwdGlvbiBvZgorICAgICAgICB0aGUgb2JqZWN0LCBpbmNsdWRpbmcgaXRzIGludGVyZmFjZXMgKHdpdGggc2lnbmFscyBhbmQgbWV0aG9kcyksIG9iamVjdHMKKyAgICAgICAgYmVsb3cgaXQgaW4gdGhlIG9iamVjdCBwYXRoIHRyZWUsIGFuZCBpdHMgcHJvcGVydGllcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNpbnRyb3NwZWN0aW9uLWZvcm1hdCIgdGl0bGU9IkludHJvc3BlY3Rpb24gRGF0YSBGb3JtYXQiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7SW50cm9zcGVjdGlvbiBEYXRhIEZvcm1hdCYjODIyMTs8L2E+IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoaXMgWE1MIHN0cmluZy4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9InN0YW5kYXJkLWludGVyZmFjZXMtcHJvcGVydGllcyI+PC9hPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzPC9jb2RlPjwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIE1hbnkgbmF0aXZlIEFQSXMgd2lsbCBoYXZlIGEgY29uY2VwdCBvZiBvYmplY3QgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPnByb3BlcnRpZXM8L2VtPiAKKyAgICAgICAgb3IgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmF0dHJpYnV0ZXM8L2VtPi4gVGhlc2UgY2FuIGJlIGV4cG9zZWQgdmlhIHRoZSAKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5HZXQgKGluIFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFNUUklORyBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IFZBUklBTlQgdmFsdWUpOworICAgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlNldCAoaW4gU1RSSU5HIGludGVyZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gU1RSSU5HIHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBWQVJJQU5UIHZhbHVlKTsKKyAgICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5HZXRBbGwgKGluIFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBESUNUJmx0O1NUUklORyxWQVJJQU5UJmd0OyBwcm9wcyk7CisgICAgICAgIDwvcHJlPjxwPgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgYXZhaWxhYmxlIHByb3BlcnRpZXMgYW5kIHdoZXRoZXIgdGhleSBhcmUgd3JpdGFibGUgY2FuIGJlIGRldGVybWluZWQKKyAgICAgICAgYnkgY2FsbGluZyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUuSW50cm9zcGVjdDwvY29kZT4sCisgICAgICAgIHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI3N0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGUiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDs8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2NvZGU+JiM4MjIxOzwvYT4uCisgICAgICA8L3A+PHA+CisgICAgICAgIEFuIGVtcHR5IHN0cmluZyBtYXkgYmUgcHJvdmlkZWQgZm9yIHRoZSBpbnRlcmZhY2UgbmFtZTsgaW4gdGhpcyBjYXNlLCAKKyAgICAgICAgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb24gYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSwgCisgICAgICAgIHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgKHBpY2tpbmcgb25lIGJ5IGFjY29yZGluZyB0byBhbiBhcmJpdHJhcnkgCisgICAgICAgIGRldGVybWluaXN0aWMgcnVsZSwgb3IgcmV0dXJuaW5nIGFuIGVycm9yLCBhcmUgdGhlIHJlYXNvbmFibGUgCisgICAgICAgIHBvc3NpYmlsaXRpZXMpLgorICAgICAgPC9wPjxwPgorICAgICAgICBJZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIGNoYW5nZSBvbiBhbiBvYmplY3QsIHRoZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5Qcm9wZXJ0aWVzQ2hhbmdlZDwvY29kZT4KKyAgICAgICAgc2lnbmFsIG1heSBiZSBlbWl0dGVkICh0aGlzIHNpZ25hbCB3YXMgYWRkZWQgaW4gMC4xNCk6CisgICAgICA8L3A+PHA+CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuUHJvcGVydGllc0NoYW5nZWQgKFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsgY2hhbmdlZF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWSZsdDtTVFJJTkcmZ3Q7IGludmFsaWRhdGVkX3Byb3BlcnRpZXMpOworICAgICAgICA8L3ByZT48cD4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgd2hlcmUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmNoYW5nZWRfcHJvcGVydGllczwvY29kZT4gaXMgYSBkaWN0aW9uYXJ5CisgICAgICAgIGNvbnRhaW5pbmcgdGhlIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIHRoZSBuZXcgdmFsdWVzIGFuZAorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+aW52YWxpZGF0ZWRfcHJvcGVydGllczwvY29kZT4gaXMgYW4gYXJyYXkgb2YKKyAgICAgICAgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgYnV0IHRoZSB2YWx1ZSBpcyBub3QgY29udmV5ZWQuCisgICAgICA8L3A+PHA+CisgICAgICAgIFdoZXRoZXIgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5Qcm9wZXJ0aWVzQ2hhbmdlZDwvY29kZT4gc2lnbmFsIGlzCisgICAgICAgIHN1cHBvcnRlZCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBjYWxsaW5nCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZS5JbnRyb3NwZWN0PC9jb2RlPi4gTm90ZQorICAgICAgICB0aGF0IHRoZSBzaWduYWwgbWF5IGJlIHN1cHBvcnRlZCBmb3IgYW4gb2JqZWN0IGJ1dCBpdCBtYXkKKyAgICAgICAgZGlmZmVyIGhvdyB3aGV0aGVyIGFuZCBob3cgaXQgaXMgdXNlZCBvbiBhIHBlci1wcm9wZXJ0eSBiYXNpcworICAgICAgICAoZm9yIGUuZy4gcGVyZm9ybWFuY2Ugb3Igc2VjdXJpdHkgcmVhc29ucykuIEVhY2ggcHJvcGVydHkgKG9yCisgICAgICAgIHRoZSBwYXJlbnQgaW50ZXJmYWNlKSBtdXN0IGJlIGFubm90YXRlZCB3aXRoIHRoZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydHkuRW1pdHNDaGFuZ2VkU2lnbmFsPC9jb2RlPgorICAgICAgICBhbm5vdGF0aW9uIHRvIGNvbnZleSB0aGlzICh1c3VhbGx5IHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj50cnVlPC9jb2RlPiBpcyBzdWZmaWNpZW50IG1lYW5pbmcgdGhhdCB0aGUKKyAgICAgICAgYW5ub3RhdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIHVzZWQpLiBTZWUgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNpbnRyb3NwZWN0aW9uLWZvcm1hdCIgdGl0bGU9IkludHJvc3BlY3Rpb24gRGF0YSBGb3JtYXQiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7SW50cm9zcGVjdGlvbiBEYXRhIEZvcm1hdCYjODIyMTs8L2E+IGZvciBkZXRhaWxzIG9uIHRoaXMKKyAgICAgICAgYW5ub3RhdGlvbi4KKyAgICAgIDwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MSIgdGl0bGU9IkludHJvc3BlY3Rpb24gRGF0YSBGb3JtYXQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iaW50cm9zcGVjdGlvbi1mb3JtYXQiPjwvYT5JbnRyb3NwZWN0aW9uIERhdGEgRm9ybWF0PC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIEFzIGRlc2NyaWJlZCBpbiA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI3N0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGUiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDs8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2NvZGU+JiM4MjIxOzwvYT4sIAorICAgICAgb2JqZWN0cyBtYXkgYmUgaW50cm9zcGVjdGVkIGF0IHJ1bnRpbWUsIHJldHVybmluZyBhbiBYTUwgc3RyaW5nIAorICAgICAgdGhhdCBkZXNjcmliZXMgdGhlIG9iamVjdC4gVGhlIHNhbWUgWE1MIGZvcm1hdCBtYXkgYmUgdXNlZCBpbiAKKyAgICAgIG90aGVyIGNvbnRleHRzIGFzIHdlbGwsIGZvciBleGFtcGxlIGFzIGFuICJJREwiIGZvciBnZW5lcmF0aW5nIAorICAgICAgc3RhdGljIGxhbmd1YWdlIGJpbmRpbmdzLgorICAgIDwvcD48cD4KKyAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpbnRyb3NwZWN0aW9uIGRhdGE6CisgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAmbHQ7IURPQ1RZUEUgbm9kZSBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgT2JqZWN0IEludHJvc3BlY3Rpb24gMS4wLy9FTiIKKyAgICAgICAgICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvaW50cm9zcGVjdC5kdGQiJmd0OworICAgICAgICAmbHQ7bm9kZSBuYW1lPSIvb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZV9vYmplY3QiJmd0OworICAgICAgICAgICZsdDtpbnRlcmZhY2UgbmFtZT0ib3JnLmZyZWVkZXNrdG9wLlNhbXBsZUludGVyZmFjZSImZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9IkZyb2JhdGUiJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImZvbyIgdHlwZT0iaSIgZGlyZWN0aW9uPSJpbiIvJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJhciIgdHlwZT0icyIgZGlyZWN0aW9uPSJvdXQiLyZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXoiIHR5cGU9ImF7dXN9IiBkaXJlY3Rpb249Im91dCIvJmd0OworICAgICAgICAgICAgICAmbHQ7YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXByZWNhdGVkIiB2YWx1ZT0idHJ1ZSIvJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9IkJhemlmeSImZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmFyIiB0eXBlPSIoaWl1KSIgZGlyZWN0aW9uPSJpbiIvJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJhciIgdHlwZT0idiIgZGlyZWN0aW9uPSJvdXQiLyZndDsKKyAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJNb2dyaWZ5IiZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXIiIHR5cGU9IihpaWF2KSIgZGlyZWN0aW9uPSJpbiIvJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7c2lnbmFsIG5hbWU9IkNoYW5nZWQiJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9Im5ld192YWx1ZSIgdHlwZT0iYiIvJmd0OworICAgICAgICAgICAgJmx0Oy9zaWduYWwmZ3Q7CisgICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iQmFyIiB0eXBlPSJ5IiBhY2Nlc3M9InJlYWR3cml0ZSIvJmd0OworICAgICAgICAgICZsdDsvaW50ZXJmYWNlJmd0OworICAgICAgICAgICZsdDtub2RlIG5hbWU9ImNoaWxkX29mX3NhbXBsZV9vYmplY3QiLyZndDsKKyAgICAgICAgICAmbHQ7bm9kZSBuYW1lPSJhbm90aGVyX2NoaWxkX29mX3NhbXBsZV9vYmplY3QiLyZndDsKKyAgICAgICAmbHQ7L25vZGUmZ3Q7CisgICAgICA8L3ByZT48cD4KKyAgICA8L3A+PHA+CisgICAgICBBIG1vcmUgZm9ybWFsIERURCBhbmQgc3BlYyBuZWVkcyB3cml0aW5nLCBidXQgaGVyZSBhcmUgc29tZSBxdWljayBub3Rlcy4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgIE9ubHkgdGhlIHJvb3QgJmx0O25vZGUmZ3Q7IGVsZW1lbnQgY2FuIG9taXQgdGhlIG5vZGUgbmFtZSwgYXMgaXQncworICAgICAgICAgICAga25vd24gdG8gYmUgdGhlIG9iamVjdCB0aGF0IHdhcyBpbnRyb3NwZWN0ZWQuICBJZiB0aGUgcm9vdAorICAgICAgICAgICAgJmx0O25vZGUmZ3Q7IGRvZXMgaGF2ZSBhIG5hbWUgYXR0cmlidXRlLCBpdCBtdXN0IGJlIGFuIGFic29sdXRlCisgICAgICAgICAgICBvYmplY3QgcGF0aC4gSWYgY2hpbGQgJmx0O25vZGUmZ3Q7IGhhdmUgb2JqZWN0IHBhdGhzLCB0aGV5IG11c3QgYmUKKyAgICAgICAgICAgIHJlbGF0aXZlLgorICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgSWYgYSBjaGlsZCAmbHQ7bm9kZSZndDsgaGFzIGFueSBzdWItZWxlbWVudHMsIHRoZW4gdGhleSAKKyAgICAgICAgICAgIG11c3QgcmVwcmVzZW50IGEgY29tcGxldGUgaW50cm9zcGVjdGlvbiBvZiB0aGUgY2hpbGQuCisgICAgICAgICAgICBJZiBhIGNoaWxkICZsdDtub2RlJmd0OyBpcyBlbXB0eSwgdGhlbiBpdCBtYXkgb3IgbWF5IAorICAgICAgICAgICAgbm90IGhhdmUgc3ViLWVsZW1lbnRzOyB0aGUgY2hpbGQgbXVzdCBiZSBpbnRyb3NwZWN0ZWQKKyAgICAgICAgICAgIGluIG9yZGVyIHRvIGZpbmQgb3V0LiBUaGUgaW50ZW50IGlzIHRoYXQgaWYgYW4gb2JqZWN0IAorICAgICAgICAgICAga25vd3MgdGhhdCBpdHMgY2hpbGRyZW4gYXJlICJmYXN0IiB0byBpbnRyb3NwZWN0CisgICAgICAgICAgICBpdCBjYW4gZ28gYWhlYWQgYW5kIHJldHVybiB0aGVpciBpbmZvcm1hdGlvbiwgYnV0IAorICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGNhbiBvbWl0IGl0LgorICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgVGhlIGRpcmVjdGlvbiBlbGVtZW50IG9uICZsdDthcmcmZ3Q7IG1heSBiZSBvbWl0dGVkLCAKKyAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgaXQgZGVmYXVsdHMgdG8gImluIiBmb3IgbWV0aG9kIGNhbGxzIAorICAgICAgICAgICAgYW5kICJvdXQiIGZvciBzaWduYWxzLiBTaWduYWxzIG9ubHkgYWxsb3cgIm91dCIgCisgICAgICAgICAgICBzbyB3aGlsZSBkaXJlY3Rpb24gbWF5IGJlIHNwZWNpZmllZCwgaXQncyBwb2ludGxlc3MuCisgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICBUaGUgcG9zc2libGUgZGlyZWN0aW9ucyBhcmUgImluIiBhbmQgIm91dCIsIAorICAgICAgICAgICAgdW5saWtlIENPUkJBIHRoZXJlIGlzIG5vICJpbm91dCIKKyAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgIFRoZSBwb3NzaWJsZSBwcm9wZXJ0eSBhY2Nlc3MgZmxhZ3MgYXJlIAorICAgICAgICAgICAgInJlYWR3cml0ZSIsICJyZWFkIiwgYW5kICJ3cml0ZSIKKyAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgIE11bHRpcGxlIGludGVyZmFjZXMgY2FuIG9mIGNvdXJzZSBiZSBsaXN0ZWQgZm9yIAorICAgICAgICAgICAgb25lICZsdDtub2RlJmd0Oy4KKyAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgIFRoZSAibmFtZSIgYXR0cmlidXRlIG9uIGFyZ3VtZW50cyBpcyBvcHRpb25hbC4KKyAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgIDwvcD48cD4KKyAgICAgICAgTWV0aG9kLCBpbnRlcmZhY2UsIHByb3BlcnR5LCBhbmQgc2lnbmFsIGVsZW1lbnRzIG1heSBoYXZlCisgICAgICAgICJhbm5vdGF0aW9ucyIsIHdoaWNoIGFyZSBnZW5lcmljIGtleS92YWx1ZSBwYWlycyBvZiBtZXRhZGF0YS4KKwlUaGV5IGFyZSBzaW1pbGFyIGNvbmNlcHR1YWxseSB0byBKYXZhJ3MgYW5ub3RhdGlvbnMgYW5kIEMjIGF0dHJpYnV0ZXMuCisgICAgICAgIFdlbGwta25vd24gYW5ub3RhdGlvbnM6CisgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5OYW1lPC90aD48dGg+VmFsdWVzIChzZXBhcmF0ZWQgYnkgLCk8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlcHJlY2F0ZWQ8L3RkPjx0ZD50cnVlLGZhbHNlPC90ZD48dGQ+V2hldGhlciBvciBub3QgdGhlIGVudGl0eSBpcyBkZXByZWNhdGVkOyBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+PC90cj48dHI+PHRkPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbDwvdGQ+PHRkPihzdHJpbmcpPC90ZD48dGQ+VGhlIEMgc3ltYm9sOyBtYXkgYmUgdXNlZCBmb3IgbWV0aG9kcyBhbmQgaW50ZXJmYWNlczwvdGQ+PC90cj48dHI+PHRkPm9yZy5mcmVlZGVza3RvcC5EQnVzLk1ldGhvZC5Ob1JlcGx5PC90ZD48dGQ+dHJ1ZSxmYWxzZTwvdGQ+PHRkPklmIHNldCwgZG9uJ3QgZXhwZWN0IGEgcmVwbHkgdG8gdGhlIG1ldGhvZCBjYWxsOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPjwvdHI+PHRyPjx0ZD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWw8L3RkPjx0ZD50cnVlLGludmFsaWRhdGVzLGZhbHNlPC90ZD48dGQ+CisgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5mYWxzZTwvY29kZT4sIHRoZQorICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5Qcm9wZXJ0aWVzQ2hhbmdlZDwvY29kZT4KKyAgICAgICAgICAgICAgICAgc2lnbmFsLCBzZWUgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNzdGFuZGFyZC1pbnRlcmZhY2VzLXByb3BlcnRpZXMiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwOzxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzPC9jb2RlPiYjODIyMTs8L2E+IGlzIG5vdAorICAgICAgICAgICAgICAgICBndWFyYW50ZWVkIHRvIGJlIGVtaXR0ZWQgaWYgdGhlIHByb3BlcnR5IGNoYW5nZXMuCisgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5pbnZhbGlkYXRlczwvY29kZT4gdGhlIHNpZ25hbAorICAgICAgICAgICAgICAgICBpcyBlbWl0dGVkIGJ1dCB0aGUgdmFsdWUgaXMgbm90IGluY2x1ZGVkIGluIHRoZQorICAgICAgICAgICAgICAgICBzaWduYWwuCisgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj50cnVlPC9jb2RlPiB0aGUgc2lnbmFsIGlzCisgICAgICAgICAgICAgICAgIGVtaXR0ZWQgd2l0aCB0aGUgdmFsdWUgaW5jbHVkZWQuCisgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGZvciB0aGUgYW5ub3RhdGlvbiBkZWZhdWx0cyB0bworICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+dHJ1ZTwvY29kZT4gaWYgdGhlIGVuY2xvc2luZyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgZWxlbWVudCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBhbm5vdGF0aW9uLiBPdGhlcndpc2UgaXQKKyAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgZW5jbG9zaW5nCisgICAgICAgICAgICAgICAgIGludGVyZmFjZSBlbGVtZW50LgorICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJNZXNzYWdlIEJ1cyBTcGVjaWZpY2F0aW9uIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9Im1lc3NhZ2UtYnVzIj48L2E+TWVzc2FnZSBCdXMgU3BlY2lmaWNhdGlvbjwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJNZXNzYWdlIEJ1cyBPdmVydmlldyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1idXMtb3ZlcnZpZXciPjwvYT5NZXNzYWdlIEJ1cyBPdmVydmlldzwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBhY2NlcHRzIGNvbm5lY3Rpb25zIGZyb20gb25lIG9yIG1vcmUgYXBwbGljYXRpb25zLiAKKyAgICAgICAgT25jZSBjb25uZWN0ZWQsIGFwcGxpY2F0aW9ucyBjYW4gZXhjaGFuZ2UgbWVzc2FnZXMgd2l0aCBvdGhlciAKKyAgICAgICAgYXBwbGljYXRpb25zIHRoYXQgYXJlIGFsc28gY29ubmVjdGVkIHRvIHRoZSBidXMuCisgICAgICA8L3A+PHA+CisgICAgICAgIEluIG9yZGVyIHRvIHJvdXRlIG1lc3NhZ2VzIGFtb25nIGNvbm5lY3Rpb25zLCB0aGUgbWVzc2FnZSBidXMga2VlcHMgYQorICAgICAgICBtYXBwaW5nIGZyb20gbmFtZXMgdG8gY29ubmVjdGlvbnMuIEVhY2ggY29ubmVjdGlvbiBoYXMgb25lCisgICAgICAgIHVuaXF1ZS1mb3ItdGhlLWxpZmV0aW1lLW9mLXRoZS1idXMgbmFtZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkLgorICAgICAgICBBcHBsaWNhdGlvbnMgbWF5IHJlcXVlc3QgYWRkaXRpb25hbCBuYW1lcyBmb3IgYSBjb25uZWN0aW9uLiBBZGRpdGlvbmFsCisgICAgICAgIG5hbWVzIGFyZSB1c3VhbGx5ICJ3ZWxsLWtub3duIG5hbWVzIiBzdWNoIGFzCisgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvciIuIFdoZW4gYSBuYW1lIGlzIGJvdW5kIHRvIGEgY29ubmVjdGlvbiwKKyAgICAgICAgdGhhdCBjb25uZWN0aW9uIGlzIHNhaWQgdG8gPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm93bjwvZW0+IHRoZSBuYW1lLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgYnVzIGl0c2VsZiBvd25zIGEgc3BlY2lhbCBuYW1lLCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2NvZGU+LiAKKyAgICAgICAgVGhpcyBuYW1lIHJvdXRlcyBtZXNzYWdlcyB0byB0aGUgYnVzLCBhbGxvd2luZyBhcHBsaWNhdGlvbnMgdG8gbWFrZSAKKyAgICAgICAgYWRtaW5pc3RyYXRpdmUgcmVxdWVzdHMuIEZvciBleGFtcGxlLCBhcHBsaWNhdGlvbnMgY2FuIGFzayB0aGUgYnVzIAorICAgICAgICB0byBhc3NpZ24gYSBuYW1lIHRvIGEgY29ubmVjdGlvbi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgRWFjaCBuYW1lIG1heSBoYXZlIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5xdWV1ZWQgb3duZXJzPC9lbT4uICBXaGVuIGFuCisgICAgICAgIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGEgbmFtZSBmb3IgYSBjb25uZWN0aW9uIGFuZCB0aGUgbmFtZSBpcyBhbHJlYWR5IGluCisgICAgICAgIHVzZSwgdGhlIGJ1cyB3aWxsIG9wdGlvbmFsbHkgYWRkIHRoZSBjb25uZWN0aW9uIHRvIGEgcXVldWUgd2FpdGluZyBmb3IgCisgICAgICAgIHRoZSBuYW1lLiBJZiB0aGUgY3VycmVudCBvd25lciBvZiB0aGUgbmFtZSBkaXNjb25uZWN0cyBvciByZWxlYXNlcworICAgICAgICB0aGUgbmFtZSwgdGhlIG5leHQgY29ubmVjdGlvbiBpbiB0aGUgcXVldWUgd2lsbCBiZWNvbWUgdGhlIG5ldyBvd25lci4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhpcyBmZWF0dXJlIGNhdXNlcyB0aGUgcmlnaHQgdGhpbmcgdG8gaGFwcGVuIGlmIHlvdSBzdGFydCB0d28gdGV4dAorICAgICAgICBlZGl0b3JzIGZvciBleGFtcGxlOyB0aGUgZmlyc3Qgb25lIG1heSByZXF1ZXN0ICJvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvciIsIAorICAgICAgICBhbmQgdGhlIHNlY29uZCB3aWxsIGJlIHF1ZXVlZCBhcyBhIHBvc3NpYmxlIG93bmVyIG9mIHRoYXQgbmFtZS4gV2hlbiAKKyAgICAgICAgdGhlIGZpcnN0IGV4aXRzLCB0aGUgc2Vjb25kIHdpbGwgdGFrZSBvdmVyLgorICAgICAgPC9wPjxwPgorICAgICAgICBNZXNzYWdlcyBtYXkgaGF2ZSBhIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5ERVNUSU5BVElPTjwvY29kZT4gZmllbGQgKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI21lc3NhZ2UtcHJvdG9jb2wtaGVhZGVyLWZpZWxkcyIgdGl0bGU9IkhlYWRlciBGaWVsZHMiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7SGVhZGVyIEZpZWxkcyYjODIyMTs8L2E+KS4gIElmIHRoZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REVTVElOQVRJT048L2NvZGU+IGZpZWxkIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIG1lc3NhZ2UKKyAgICAgICAgcmVjaXBpZW50IGJ5IG5hbWUuIE1ldGhvZCBjYWxscyBhbmQgcmVwbGllcyBub3JtYWxseSBzcGVjaWZ5IHRoaXMgZmllbGQuCisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBtdXN0IHNlbmQgbWVzc2FnZXMgKG9mIGFueSB0eXBlKSB3aXRoIHRoZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REVTVElOQVRJT048L2NvZGU+IGZpZWxkIHNldCB0byB0aGUgc3BlY2lmaWVkIHJlY2lwaWVudCwKKyAgICAgICAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSByZWNpcGllbnQgaGFzIHNldCB1cCBhIG1hdGNoIHJ1bGUgbWF0Y2hpbmcKKyAgICAgICAgdGhlIG1lc3NhZ2UuCisgICAgICA8L3A+PHA+CisgICAgICAgIFNpZ25hbHMgbm9ybWFsbHkgZG8gbm90IHNwZWNpZnkgYSBkZXN0aW5hdGlvbjsgdGhleSBhcmUgc2VudCB0byBhbGwKKyAgICAgICAgYXBwbGljYXRpb25zIHdpdGggPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm1lc3NhZ2UgbWF0Y2hpbmcgcnVsZXM8L2VtPiB0aGF0CisgICAgICAgIG1hdGNoIHRoZSBtZXNzYWdlLgorICAgICAgPC9wPjxwPgorICAgICAgICBXaGVuIHRoZSBtZXNzYWdlIGJ1cyByZWNlaXZlcyBhIG1ldGhvZCBjYWxsLCBpZiB0aGUKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRFU1RJTkFUSU9OPC9jb2RlPiBmaWVsZCBpcyBhYnNlbnQsIHRoZSBjYWxsIGlzIHRha2VuIHRvIGJlCisgICAgICAgIGEgc3RhbmRhcmQgb25lLXRvLW9uZSBtZXNzYWdlIGFuZCBpbnRlcnByZXRlZCBieSB0aGUgbWVzc2FnZSBidXMKKyAgICAgICAgaXRzZWxmLiBGb3IgZXhhbXBsZSwgc2VuZGluZyBhbgorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nPC9jb2RlPiBtZXNzYWdlIHdpdGggbm8KKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRFU1RJTkFUSU9OPC9jb2RlPiB3aWxsIGNhdXNlIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYgdG8KKyAgICAgICAgcmVwbHkgdG8gdGhlIHBpbmcgaW1tZWRpYXRlbHk7IHRoZSBtZXNzYWdlIGJ1cyB3aWxsIG5vdCBtYWtlIHRoaXMKKyAgICAgICAgbWVzc2FnZSB2aXNpYmxlIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgQ29udGludWluZyB0aGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZzwvY29kZT4gZXhhbXBsZSwgaWYKKyAgICAgICAgdGhlIHBpbmcgbWVzc2FnZSB3ZXJlIHNlbnQgd2l0aCBhIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5ERVNUSU5BVElPTjwvY29kZT4gbmFtZSBvZgorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Y29tLnlveW9keW5lLlNjcmVlbnNhdmVyPC9jb2RlPiwgdGhlbiB0aGUgcGluZyB3b3VsZCBiZQorICAgICAgICBmb3J3YXJkZWQsIGFuZCB0aGUgWW95b2R5bmUgQ29ycG9yYXRpb24gc2NyZWVuc2F2ZXIgYXBwbGljYXRpb24gd291bGQgYmUKKyAgICAgICAgZXhwZWN0ZWQgdG8gcmVwbHkgdG8gdGhlIHBpbmcuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJNZXNzYWdlIEJ1cyBOYW1lcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1idXMtbmFtZXMiPjwvYT5NZXNzYWdlIEJ1cyBOYW1lczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEVhY2ggY29ubmVjdGlvbiBoYXMgYXQgbGVhc3Qgb25lIG5hbWUsIGFzc2lnbmVkIGF0IGNvbm5lY3Rpb24gdGltZSBhbmQKKyAgICAgICAgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gdGhlCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbzwvY29kZT4gbWV0aG9kIGNhbGwuICBUaGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHktYXNzaWduZWQgbmFtZSBpcyBjYWxsZWQgdGhlIGNvbm5lY3Rpb24ncyA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+dW5pcXVlCisgICAgICAgIG5hbWU8L2VtPi4gIFVuaXF1ZSBuYW1lcyBhcmUgbmV2ZXIgcmV1c2VkIGZvciB0d28gZGlmZmVyZW50CisgICAgICAgIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIGJ1cy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgT3duZXJzaGlwIG9mIGEgdW5pcXVlIG5hbWUgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIGludGVyYWN0aW9uIHdpdGggCisgICAgICAgIHRoZSBtZXNzYWdlIGJ1cy4gSXQgbG9naWNhbGx5IGZvbGxvd3MgdGhhdCB0aGUgdW5pcXVlIG5hbWUgaXMgYWx3YXlzIAorICAgICAgICB0aGUgZmlyc3QgbmFtZSB0aGF0IGFuIGFwcGxpY2F0aW9uIGNvbWVzIHRvIG93biwgYW5kIHRoZSBsYXN0IAorICAgICAgICBvbmUgdGhhdCBpdCBsb3NlcyBvd25lcnNoaXAgb2YuCisgICAgICA8L3A+PHA+CisgICAgICAgIFVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzIG11c3QgYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyICc6JyAoQVNDSUkgY29sb24KKyAgICAgICAgY2hhcmFjdGVyKTsgYnVzIG5hbWVzIHRoYXQgYXJlIG5vdCB1bmlxdWUgbmFtZXMgbXVzdCBub3QgYmVnaW4KKyAgICAgICAgd2l0aCB0aGlzIGNoYXJhY3Rlci4gKFRoZSBidXMgbXVzdCByZWplY3QgYW55IGF0dGVtcHQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgdG8gbWFudWFsbHkgcmVxdWVzdCBhIG5hbWUgYmVnaW5uaW5nIHdpdGggJzonLikgVGhpcyByZXN0cmljdGlvbgorICAgICAgICBjYXRlZ29yaWNhbGx5IHByZXZlbnRzICJzcG9vZmluZyI7IG1lc3NhZ2VzIHNlbnQgdG8gYSB1bmlxdWUgbmFtZQorICAgICAgICB3aWxsIGFsd2F5cyBnbyB0byB0aGUgZXhwZWN0ZWQgY29ubmVjdGlvbi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgV2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCBhbGwgdGhlIG5hbWVzIHRoYXQgaXQgb3ducyBhcmUgZGVsZXRlZCAob3IKKyAgICAgICAgdHJhbnNmZXJyZWQgdG8gdGhlIG5leHQgY29ubmVjdGlvbiBpbiB0aGUgcXVldWUgaWYgYW55KS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgQSBjb25uZWN0aW9uIGNhbiByZXF1ZXN0IGFkZGl0aW9uYWwgbmFtZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGl0IHVzaW5nCisgICAgICAgIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVxdWVzdE5hbWU8L2NvZGU+IG1lc3NhZ2UuIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjbWVzc2FnZS1wcm90b2NvbC1uYW1lcy1idXMiIHRpdGxlPSJCdXMgbmFtZXMiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7QnVzIG5hbWVzJiM4MjIxOzwvYT4gZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgYSB2YWxpZAorICAgICAgICBuYW1lLiBUaGVzZSBuYW1lcyBjYW4gYmUgcmVsZWFzZWQgYWdhaW4gdXNpbmcgdGhlCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZTwvY29kZT4gbWVzc2FnZS4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLlJlcXVlc3ROYW1lIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtbWVzc2FnZXMtcmVxdWVzdC1uYW1lIj48L2E+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLlJlcXVlc3ROYW1lPC9jb2RlPjwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgIFVJTlQzMiBSZXF1ZXN0TmFtZSAoaW4gU1RSSU5HIG5hbWUsIGluIFVJTlQzMiBmbGFncykKKyAgICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+U1RSSU5HPC90ZD48dGQ+TmFtZSB0byByZXF1ZXN0PC90ZD48L3RyPjx0cj48dGQ+MTwvdGQ+PHRkPlVJTlQzMjwvdGQ+PHRkPkZsYWdzPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPlVJTlQzMjwvdGQ+PHRkPlJldHVybiB2YWx1ZTwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGlzIG1ldGhvZCBjYWxsIHNob3VsZCBiZSBzZW50IHRvCisgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9jb2RlPiBhbmQgYXNrcyB0aGUgbWVzc2FnZSBidXMgdG8KKyAgICAgICAgICBhc3NpZ24gdGhlIGdpdmVuIG5hbWUgdG8gdGhlIG1ldGhvZCBjYWxsZXIuIEVhY2ggbmFtZSBtYWludGFpbnMgYQorICAgICAgICAgIHF1ZXVlIG9mIHBvc3NpYmxlIG93bmVycywgd2hlcmUgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIHRoZSBwcmltYXJ5CisgICAgICAgICAgb3IgY3VycmVudCBvd25lciBvZiB0aGUgbmFtZS4gRWFjaCBwb3RlbnRpYWwgb3duZXIgaW4gdGhlIHF1ZXVlCisgICAgICAgICAgbWFpbnRhaW5zIHRoZSBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBhbmQKKyAgICAgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgc2V0dGluZ3MgZnJvbSBpdHMgbGF0ZXN0IFJlcXVlc3ROYW1lCisgICAgICAgICAgY2FsbC4gIFdoZW4gUmVxdWVzdE5hbWUgaXMgaW52b2tlZCB0aGUgZm9sbG93aW5nIG9jY3VyczoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgSWYgdGhlIG1ldGhvZCBjYWxsZXIgaXMgY3VycmVudGx5IHRoZSBwcmltYXJ5IG93bmVyIG9mIHRoZSBuYW1lLAorICAgICAgICAgICAgICAgIHRoZSBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBhbmQgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSB1cGRhdGVkIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBuZXcgUmVxdWVzdE5hbWUgY2FsbCwgCisgICAgICAgICAgICAgICAgYW5kIG5vdGhpbmcgZnVydGhlciBoYXBwZW5zLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBwcmltYXJ5IG93bmVyIChoZWFkIG9mIHRoZSBxdWV1ZSkgaGFzCisgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgc2V0LCBhbmQgdGhlIFJlcXVlc3ROYW1lCisgICAgICAgICAgICAgICAgaW52b2NhdGlvbiBoYXMgdGhlIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgZmxhZywgdGhlbgorICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIgb2YgUmVxdWVzdE5hbWUgcmVwbGFjZXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciBhdAorICAgICAgICAgICAgICAgIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciBtb3ZlcyB0byB0aGUKKyAgICAgICAgICAgICAgICBzZWNvbmQgcG9zaXRpb24gaW4gdGhlIHF1ZXVlLiBJZiB0aGUgY2FsbGVyIG9mIFJlcXVlc3ROYW1lIHdhcyAKKyAgICAgICAgICAgICAgICBpbiB0aGUgcXVldWUgcHJldmlvdXNseSBpdHMgZmxhZ3MgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gCisgICAgICAgICAgICAgICAgdGhlIG5ldyBSZXF1ZXN0TmFtZSBpbiBhZGRpdGlvbiB0byBtb3ZpbmcgaXQgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBJZiByZXBsYWNlbWVudCBpcyBub3QgcG9zc2libGUsIGFuZCB0aGUgbWV0aG9kIGNhbGxlciBpcworICAgICAgICAgICAgICAgIGN1cnJlbnRseSBpbiB0aGUgcXVldWUgYnV0IG5vdCB0aGUgcHJpbWFyeSBvd25lciwgaXRzIGZsYWdzIGFyZQorICAgICAgICAgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIG5ldyBSZXF1ZXN0TmFtZSBjYWxsLgorICAgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgICBJZiByZXBsYWNlbWVudCBpcyBub3QgcG9zc2libGUsIGFuZCB0aGUgbWV0aG9kIGNhbGxlciBpcworICAgICAgICAgICAgICAgIGN1cnJlbnRseSBub3QgaW4gdGhlIHF1ZXVlLCB0aGUgbWV0aG9kIGNhbGxlciBpcyBhcHBlbmRlZCB0byB0aGUKKyAgICAgICAgICAgICAgICBxdWV1ZS4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgSWYgYW55IGNvbm5lY3Rpb24gaW4gdGhlIHF1ZXVlIGhhcyBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAgICAgICAgICAgICAgICBzZXQgYW5kIGlzIG5vdCB0aGUgcHJpbWFyeSBvd25lciwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgIHF1ZXVlLiBUaGlzIGNhbiBhcHBseSB0byB0aGUgcHJldmlvdXMgcHJpbWFyeSBvd25lciAoaWYgaXQKKyAgICAgICAgICAgICAgICB3YXMgcmVwbGFjZWQpIG9yIHRoZSBtZXRob2QgY2FsbGVyIChpZiBpdCB1cGRhdGVkIHRoZQorICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSBmbGFnIHdoaWxlIHN0aWxsIHN0dWNrIGluIHRoZQorICAgICAgICAgICAgICAgIHF1ZXVlLCBvciBpZiBpdCB3YXMganVzdCBhZGRlZCB0byB0aGUgcXVldWUgd2l0aCB0aGF0IGZsYWcgc2V0KS4KKyAgICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIE5vdGUgdGhhdCBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIHJlc3VsdHMgaW4gImp1bXBpbmcgdGhlCisgICAgICAgICAgcXVldWUsIiBldmVuIGlmIGFub3RoZXIgYXBwbGljYXRpb24gYWxyZWFkeSBpbiB0aGUgcXVldWUgaGFkIHNwZWNpZmllZAorICAgICAgICAgIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuICBUaGlzIGNvbWVzIHVwIGlmIGEgcHJpbWFyeSBvd25lcgorICAgICAgICAgIHRoYXQgZG9lcyBub3QgYWxsb3cgcmVwbGFjZW1lbnQgZ29lcyBhd2F5LCBhbmQgdGhlIG5leHQgcHJpbWFyeSBvd25lcgorICAgICAgICAgIGRvZXMgYWxsb3cgcmVwbGFjZW1lbnQuIEluIHRoaXMgY2FzZSwgcXVldWVkIGl0ZW1zIHRoYXQgc3BlY2lmaWVkCisgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5kbyBub3Q8L2VtPjwvc3Bhbj4KKyAgICAgICAgICBhdXRvbWF0aWNhbGx5IHJlcGxhY2UgdGhlIG5ldyBwcmltYXJ5IG93bmVyLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGlzIG5vdCBzYXZlZCwgaXQgaXMgb25seSB1c2VkIGF0IHRoZQorICAgICAgICAgIHRpbWUgUmVxdWVzdE5hbWUgaXMgY2FsbGVkLiBUaGlzIGlzIGRlbGliZXJhdGUgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcAorICAgICAgICAgIGFueXRpbWUgdHdvIGFwcGxpY2F0aW9ucyBhcmUgYm90aCBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCAKKyAgICAgICAgICBhbmQgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFRoZSBmbGFncyBhcmd1bWVudCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbG9naWNhbGx5IE9SZWQKKyAgICAgICAgICB0b2dldGhlcjoKKworICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Db252ZW50aW9uYWwgTmFtZTwvdGg+PHRoPlZhbHVlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD5EQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVDwvdGQ+PHRkPjB4MTwvdGQ+PHRkPgorCisgICAgICAgICAgICAgICAgICAgIElmIGFuIGFwcGxpY2F0aW9uIEEgc3BlY2lmaWVzIHRoaXMgZmxhZyBhbmQgc3VjY2VlZHMgaW4KKyAgICAgICAgICAgICAgICAgICAgYmVjb21pbmcgdGhlIG93bmVyIG9mIHRoZSBuYW1lLCBhbmQgYW5vdGhlciBhcHBsaWNhdGlvbiBCCisgICAgICAgICAgICAgICAgICAgIGxhdGVyIGNhbGxzIFJlcXVlc3ROYW1lIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgZmxhZywgdGhlbiBhcHBsaWNhdGlvbiBBCisgICAgICAgICAgICAgICAgICAgIHdpbGwgbG9zZSBvd25lcnNoaXAgYW5kIHJlY2VpdmUgYQorICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUxvc3Q8L2NvZGU+IHNpZ25hbCwgYW5kCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIEIgd2lsbCBiZWNvbWUgdGhlIG5ldyBvd25lci4gSWYgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQKKyAgICAgICAgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZCBieSBhcHBsaWNhdGlvbiBBLCBvciBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HCisgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQgYnkgYXBwbGljYXRpb24gQiwgdGhlbiBhcHBsaWNhdGlvbiBCIHdpbGwgbm90IHJlcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gQSBhcyB0aGUgb3duZXIuCisKKyAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPkRCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkc8L3RkPjx0ZD4weDI8L3RkPjx0ZD4KKworICAgICAgICAgICAgICAgICAgICBUcnkgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBvd25lciBpZiB0aGVyZSBpcyBvbmUuIElmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgZmxhZyBpcyBub3Qgc2V0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIG9ubHkgYmVjb21lIHRoZSBvd25lciBvZgorICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG93bmVyLiBJZiB0aGlzIGZsYWcgaXMgc2V0LAorICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG93bmVyIGlmCisgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IG93bmVyIHNwZWNpZmllZCBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVC4KKworICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+REJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFPC90ZD48dGQ+MHg0PC90ZD48dGQ+CisKKyAgICAgICAgICAgICAgICAgICAgV2l0aG91dCB0aGlzIGZsYWcsIGlmIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGEgbmFtZSB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgb3duZWQsIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVlIHRvCisgICAgICAgICAgICAgICAgICAgIG93biB0aGUgbmFtZSB3aGVuIHRoZSBjdXJyZW50IG93bmVyIGdpdmVzIGl0IHVwLiBJZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIGZsYWcgaXMgZ2l2ZW4sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCB0aGUgcmVxdWVzdCBmb3IgdGhlIG5hbWUgd2lsbCBzaW1wbHkgZmFpbC4gIFRoaXMgZmxhZworICAgICAgICAgICAgICAgICAgICBhbHNvIGFmZmVjdHMgYmVoYXZpb3Igd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyByZXBsYWNlZCBhcworICAgICAgICAgICAgICAgICAgICBuYW1lIG93bmVyOyBieSBkZWZhdWx0IHRoZSBhcHBsaWNhdGlvbiBtb3ZlcyBiYWNrIGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgcXVldWUsIHVubGVzcyB0aGlzIGZsYWcgd2FzIHByb3ZpZGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGJlY2FtZSB0aGUgbmFtZSBvd25lci4KKworICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKworICAgICAgICAgIFRoZSByZXR1cm4gY29kZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkNvbnZlbnRpb25hbCBOYW1lPC90aD48dGg+VmFsdWU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPkRCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVI8L3RkPjx0ZD4xPC90ZD48dGQ+VGhlIGNhbGxlciBpcyBub3cgdGhlIHByaW1hcnkgb3duZXIgb2YKKwkJICB0aGUgbmFtZSwgcmVwbGFjaW5nIGFueSBwcmV2aW91cyBvd25lci4gRWl0aGVyIHRoZSBuYW1lIGhhZCBubworCQkgIG93bmVyIGJlZm9yZSwgb3IgdGhlIGNhbGxlciBzcGVjaWZpZWQKKwkJICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGFuZCB0aGUgY3VycmVudCBvd25lciBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5ULjwvdGQ+PC90cj48dHI+PHRkPkRCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0lOX1FVRVVFPC90ZD48dGQ+MjwvdGQ+PHRkPlRoZSBuYW1lIGFscmVhZHkgaGFkIGFuIG93bmVyLAorICAgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgd2FzIG5vdCBzcGVjaWZpZWQsIGFuZCBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgb3duZXIgZGlkIG5vdCBzcGVjaWZ5CisgICAgICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG9yIHRoZSByZXF1ZXN0aW5nCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRpZCBub3Qgc3BlY2lmeSBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLgorICAgICAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9FWElTVFM8L3RkPjx0ZD4zPC90ZD48dGQ+VGhlIG5hbWUgYWxyZWFkeSBoYXMgYW4gb3duZXIsCisJCSAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIHdhcyBzcGVjaWZpZWQsIGFuZCBlaXRoZXIKKwkJICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCB3YXMgbm90IHNwZWNpZmllZCBieSB0aGUKKwkJICBjdXJyZW50IG93bmVyLCBvciBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIHdhcyBub3QKKwkJICBzcGVjaWZpZWQgYnkgdGhlIHJlcXVlc3RpbmcgYXBwbGljYXRpb24uPC90ZD48L3RyPjx0cj48dGQ+REJVU19SRVFVRVNUX05BTUVfUkVQTFlfQUxSRUFEWV9PV05FUjwvdGQ+PHRkPjQ8L3RkPjx0ZD5UaGUgYXBwbGljYXRpb24gdHJ5aW5nIHRvIHJlcXVlc3Qgb3duZXJzaGlwIG9mIGEgbmFtZSBpcyBhbHJlYWR5IHRoZSBvd25lciBvZiBpdC48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZSI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLXJlbGVhc2UtbmFtZSI+PC9hPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZTwvY29kZT48L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBVSU5UMzIgUmVsZWFzZU5hbWUgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJlPjxwPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5OYW1lIHRvIHJlbGVhc2U8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+VUlOVDMyPC90ZD48dGQ+UmV0dXJuIHZhbHVlPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFRoaXMgbWV0aG9kIGNhbGwgc2hvdWxkIGJlIHNlbnQgdG8KKyAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2NvZGU+IGFuZCBhc2tzIHRoZSBtZXNzYWdlIGJ1cyB0bworICAgICAgICAgIHJlbGVhc2UgdGhlIG1ldGhvZCBjYWxsZXIncyBjbGFpbSB0byB0aGUgZ2l2ZW4gbmFtZS4gSWYgdGhlIGNhbGxlciBpcworICAgICAgICAgIHRoZSBwcmltYXJ5IG93bmVyLCBhIG5ldyBwcmltYXJ5IG93bmVyIHdpbGwgYmUgc2VsZWN0ZWQgZnJvbSB0aGUKKyAgICAgICAgICBxdWV1ZSBpZiBhbnkgb3RoZXIgb3duZXJzIGFyZSB3YWl0aW5nLiBJZiB0aGUgY2FsbGVyIGlzIHdhaXRpbmcgaW4KKyAgICAgICAgICB0aGUgcXVldWUgZm9yIHRoZSBuYW1lLCB0aGUgY2FsbGVyIHdpbGwgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBhbmQKKyAgICAgICAgICB3aWxsIG5vdCBiZSBtYWRlIGFuIG93bmVyIG9mIHRoZSBuYW1lIGlmIGl0IGxhdGVyIGJlY29tZXMgYXZhaWxhYmxlLgorICAgICAgICAgIElmIHRoZXJlIGFyZSBubyBvdGhlciBvd25lcnMgaW4gdGhlIHF1ZXVlIGZvciB0aGUgbmFtZSwgaXQgd2lsbCBiZQorICAgICAgICAgIHJlbW92ZWQgZnJvbSB0aGUgYnVzIGVudGlyZWx5LgorCisgICAgICAgICAgVGhlIHJldHVybiBjb2RlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+Q29udmVudGlvbmFsIE5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+REJVU19SRUxFQVNFX05BTUVfUkVQTFlfUkVMRUFTRUQ8L3RkPjx0ZD4xPC90ZD48dGQ+VGhlIGNhbGxlciBoYXMgcmVsZWFzZWQgaGlzIGNsYWltIG9uCisgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gbmFtZS4gRWl0aGVyIHRoZSBjYWxsZXIgd2FzIHRoZSBwcmltYXJ5IG93bmVyIG9mCisgICAgICAgICAgICAgICAgICB0aGUgbmFtZSwgYW5kIHRoZSBuYW1lIGlzIG5vdyB1bnVzZWQgb3IgdGFrZW4gYnkgc29tZWJvZHkKKyAgICAgICAgICAgICAgICAgIHdhaXRpbmcgaW4gdGhlIHF1ZXVlIGZvciB0aGUgbmFtZSwgb3IgdGhlIGNhbGxlciB3YXMgd2FpdGluZworICAgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIGZvciB0aGUgbmFtZSBhbmQgaGFzIG5vdyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgIHF1ZXVlLjwvdGQ+PC90cj48dHI+PHRkPkRCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVDwvdGQ+PHRkPjI8L3RkPjx0ZD5UaGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIGJ1cy48L3RkPjwvdHI+PHRyPjx0ZD5EQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVI8L3RkPjx0ZD4zPC90ZD48dGQ+VGhlIGNhbGxlciB3YXMgbm90IHRoZSBwcmltYXJ5IG93bmVyIG9mIHRoaXMgbmFtZSwKKyAgICAgICAgICAgICAgICAgIGFuZCB3YXMgYWxzbyBub3Qgd2FpdGluZyBpbiB0aGUgcXVldWUgdG8gb3duIHRoaXMgbmFtZS48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0UXVldWVkT3duZXJzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtbWVzc2FnZXMtbGlzdC1xdWV1ZWQtb3duZXJzIj48L2E+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3RRdWV1ZWRPd25lcnM8L2NvZGU+PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgQVJSQVkgb2YgU1RSSU5HIExpc3RRdWV1ZWRPd25lcnMgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJlPjxwPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5UaGUgd2VsbC1rbm93biBidXMgbmFtZSB0byBxdWVyeSwgc3VjaCBhcworICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Y29tLmV4YW1wbGUuY2FwcHVjY2lubzwvY29kZT48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+QVJSQVkgb2YgU1RSSU5HPC90ZD48dGQ+VGhlIHVuaXF1ZSBidXMgbmFtZXMgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHF1ZXVlZAorICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG5hbWU8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgVGhpcyBtZXRob2QgY2FsbCBzaG91bGQgYmUgc2VudCB0bworICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1czwvY29kZT4gYW5kIGxpc3RzIHRoZSBjb25uZWN0aW9ucworICAgICAgICAgIGN1cnJlbnRseSBxdWV1ZWQgZm9yIGEgYnVzIG5hbWUgKHNlZQorICAgICAgICAgIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjdGVybS1xdWV1ZWQtb3duZXIiIHRpdGxlPSJRdWV1ZWQgTmFtZSBPd25lciI+UXVldWVkIE5hbWUgT3duZXI8L2E+KS4KKyAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iTWVzc2FnZSBCdXMgTWVzc2FnZSBSb3V0aW5nIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZXNzYWdlLWJ1cy1yb3V0aW5nIj48L2E+TWVzc2FnZSBCdXMgTWVzc2FnZSBSb3V0aW5nPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgRklYTUUgCisgICAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJNYXRjaCBSdWxlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlcyI+PC9hPk1hdGNoIFJ1bGVzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKwkgIEFuIGltcG9ydGFudCBwYXJ0IG9mIHRoZSBtZXNzYWdlIGJ1cyByb3V0aW5nIHByb3RvY29sIGlzIG1hdGNoICAKKwkgIHJ1bGVzLiBNYXRjaCBydWxlcyBkZXNjcmliZSB3aGF0IG1lc3NhZ2VzIGNhbiBiZSBzZW50IHRvIGEgY2xpZW50CisgICAgICAgICAgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLiAgV2hlbiBhIG1lc3NhZ2UgaXMgcm91dGVkCisgICAgICAgICAgdGhyb3VnaCB0aGUgYnVzIGl0IGlzIGNvbXBhcmVkIHRvIGNsaWVudHMnIG1hdGNoIHJ1bGVzLiAgSWYgYW55CisgICAgICAgICAgb2YgdGhlIHJ1bGVzIG1hdGNoLCB0aGUgbWVzc2FnZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBjbGllbnQuCisgICAgICAgICAgSWYgbm9uZSBvZiB0aGUgcnVsZXMgbWF0Y2ggdGhlIG1lc3NhZ2UgbmV2ZXIgbGVhdmVzIHRoZSBidXMuICBUaGlzCisgICAgICAgICAgaXMgYW4gZWZmZWN0aXZlIHdheSB0byBjb250cm9sIHRyYWZmaWMgb3ZlciB0aGUgYnVzIGFuZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICBvbmx5IHJlbGV2YW50IG1lc3NhZ2UgbmVlZCB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGNsaWVudC4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIE1hdGNoIHJ1bGVzIGFyZSBhZGRlZCB1c2luZyB0aGUgQWRkTWF0Y2ggYnVzIG1ldGhvZCAKKyAgICAgICAgICAoc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjYnVzLW1lc3NhZ2VzLWFkZC1tYXRjaCIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkFkZE1hdGNoIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwOzxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5BZGRNYXRjaDwvY29kZT4mIzgyMjE7PC9hPikuICBSdWxlcyBhcmUKKyAgICAgICAgICBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIGtleS92YWx1ZSBwYWlycy4gCisgICAgICAgICAgRXhjbHVkaW5nIGEga2V5IGZyb20gdGhlIHJ1bGUgaW5kaWNhdGVzIGEgd2lsZGNhcmQgbWF0Y2guICAKKyAgICAgICAgICBGb3IgaW5zdGFuY2UgZXhjbHVkaW5nIHRoZSB0aGUgbWVtYmVyIGZyb20gYSBtYXRjaCBydWxlIGJ1dCAKKyAgICAgICAgICBhZGRpbmcgYSBzZW5kZXIgd291bGQgbGV0IGFsbCBtZXNzYWdlcyBmcm9tIHRoYXQgc2VuZGVyIHRocm91Z2guCisgICAgICAgICAgQW4gZXhhbXBsZSBvZiBhIGNvbXBsZXRlIHJ1bGUgd291bGQgYmUgCisgICAgICAgICAgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLHBhdGg9Jy9iYXIvZm9vJyxkZXN0aW5hdGlvbj0nOjQ1MjM0NS4zNCcsYXJnMj0nYmFyJyIKKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIAorICAgICAgICAgIGEgbWF0Y2ggcnVsZToKKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIEQtQnVzIHR5cGVzLgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5LZXk8L3RoPjx0aD5Qb3NzaWJsZSBWYWx1ZXM8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj50eXBlPC9jb2RlPjwvdGQ+PHRkPidzaWduYWwnLCAnbWV0aG9kX2NhbGwnLCAnbWV0aG9kX3JldHVybicsICdlcnJvcic8L3RkPjx0ZD5NYXRjaCBvbiB0aGUgbWVzc2FnZSB0eXBlLiAgQW4gZXhhbXBsZSBvZiBhIHR5cGUgbWF0Y2ggaXMgdHlwZT0nc2lnbmFsJzwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5zZW5kZXI8L2NvZGU+PC90ZD48dGQ+QSBidXMgb3IgdW5pcXVlIG5hbWUgKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI3Rlcm0tYnVzLW5hbWUiIHRpdGxlPSJCdXMgTmFtZSI+QnVzIE5hbWU8L2E+CisgICAgICAgICAgICAgICAgICBhbmQgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiN0ZXJtLXVuaXF1ZS1uYW1lIiB0aXRsZT0iVW5pcXVlIENvbm5lY3Rpb24gTmFtZSI+VW5pcXVlIENvbm5lY3Rpb24gTmFtZTwvYT4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgPC90ZD48dGQ+TWF0Y2ggbWVzc2FnZXMgc2VudCBieSBhIHBhcnRpY3VsYXIgc2VuZGVyLiAgQW4gZXhhbXBsZSBvZiBhIHNlbmRlciBtYXRjaAorICAgICAgICAgICAgICAgICAgaXMgc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuSGFsJzwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5pbnRlcmZhY2U8L2NvZGU+PC90ZD48dGQ+QW4gaW50ZXJmYWNlIG5hbWUgKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI21lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIiB0aXRsZT0iSW50ZXJmYWNlIG5hbWVzIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwO0ludGVyZmFjZSBuYW1lcyYjODIyMTs8L2E+KTwvdGQ+PHRkPk1hdGNoIG1lc3NhZ2VzIHNlbnQgb3ZlciBvciB0byBhIHBhcnRpY3VsYXIgaW50ZXJmYWNlLiAgQW4gZXhhbXBsZSBvZiBhbgorICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIG1hdGNoIGlzIGludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLkhhbC5NYW5hZ2VyJy4KKyAgICAgICAgICAgICAgICAgIElmIGEgbWVzc2FnZSBvbWl0cyB0aGUgaW50ZXJmYWNlIGhlYWRlciwgaXQgbXVzdCBub3QgbWF0Y2ggYW55IHJ1bGUgCisgICAgICAgICAgICAgICAgICB0aGF0IHNwZWNpZmllcyB0aGlzIGtleS48L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+bWVtYmVyPC9jb2RlPjwvdGQ+PHRkPkFueSB2YWxpZCBtZXRob2Qgb3Igc2lnbmFsIG5hbWU8L3RkPjx0ZD5NYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGhhdmUgdGhlIGdpdmUgbWV0aG9kIG9yIHNpZ25hbCBuYW1lLiBBbiBleGFtcGxlIG9mCisgICAgICAgICAgICAgICAgICBhIG1lbWJlciBtYXRjaCBpcyBtZW1iZXI9J05hbWVPd25lckNoYW5nZWQnPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPnBhdGg8L2NvZGU+PC90ZD48dGQ+QW4gb2JqZWN0IHBhdGggKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI21lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCIgdGl0bGU9IlZhbGlkIE9iamVjdCBQYXRocyI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtWYWxpZCBPYmplY3QgUGF0aHMmIzgyMjE7PC9hPik8L3RkPjx0ZD5NYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGFyZSBzZW50IGZyb20gb3IgdG8gdGhlIGdpdmVuIG9iamVjdC4gQW4gZXhhbXBsZSBvZiBhCisgICAgICAgICAgICAgICAgICBwYXRoIG1hdGNoIGlzIHBhdGg9Jy9vcmcvZnJlZWRlc2t0b3AvSGFsL01hbmFnZXInPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRlc3RpbmF0aW9uPC9jb2RlPjwvdGQ+PHRkPkEgdW5pcXVlIG5hbWUgKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI3Rlcm0tdW5pcXVlLW5hbWUiIHRpdGxlPSJVbmlxdWUgQ29ubmVjdGlvbiBOYW1lIj5VbmlxdWUgQ29ubmVjdGlvbiBOYW1lPC9hPik8L3RkPjx0ZD5NYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGFyZSBiZWluZyBzZW50IHRvIHRoZSBnaXZlbiB1bmlxdWUgbmFtZS4gQW4KKyAgICAgICAgICAgICAgICAgIGV4YW1wbGUgb2YgYSBkZXN0aW5hdGlvbiBtYXRjaCBpcyBkZXN0aW5hdGlvbj0nOjEuMCc8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+YXJnWzAsIDEsIDIsIDMsIC4uLl08L2NvZGU+PC90ZD48dGQ+QW55IHN0cmluZzwvdGQ+PHRkPkFyZyBtYXRjaGVzIGFyZSBzcGVjaWFsIGFuZCBhcmUgdXNlZCBmb3IgZnVydGhlciByZXN0cmljdGluZyB0aGUgCisgICAgICAgICAgICAgICAgICBtYXRjaCBiYXNlZCBvbiB0aGUgYXJndW1lbnRzIGluIHRoZSBib2R5IG9mIGEgbWVzc2FnZS4gIEFzIG9mIHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgb25seSBzdHJpbmcgYXJndW1lbnRzIGNhbiBiZSBtYXRjaGVkLiAgQW4gZXhhbXBsZSBvZiBhbiBhcmd1bWVudCBtYXRjaCAKKyAgICAgICAgICAgICAgICAgIHdvdWxkIGJlIGFyZzM9J0ZvbycuIE9ubHkgYXJndW1lbnQgaW5kZXhlcyBmcm9tIDAgdG8gNjMgc2hvdWxkIGJlIAorICAgICAgICAgICAgICAgICAgYWNjZXB0ZWQuPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPmFyZ1swLCAxLCAyLCAzLCAuLi5dcGF0aDwvY29kZT48L3RkPjx0ZD5Bbnkgc3RyaW5nPC90ZD48dGQ+QXJndW1lbnQgcGF0aCBtYXRjaGVzIHByb3ZpZGUgYSBzcGVjaWFsaXNlZCBmb3JtIG9mIHdpbGRjYXJkCisgICAgICAgICAgICAgICAgICBtYXRjaGluZyBmb3IgcGF0aC1saWtlIG5hbWVzcGFjZXMuIEFzIHdpdGggbm9ybWFsIGFyZ3VtZW50IG1hdGNoZXMsCisgICAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RyaW5nIGdpdmVuIGluIHRoZSBtYXRjaAorICAgICAgICAgICAgICAgICAgcnVsZSB0aGVuIHRoZSBydWxlIGlzIHNhdGlzZmllZC4gQWRkaXRpb25hbGx5LCB0aGVyZSBpcyBhbHNvIGEKKyAgICAgICAgICAgICAgICAgIG1hdGNoIHdoZW4gZWl0aGVyIHRoZSBzdHJpbmcgZ2l2ZW4gaW4gdGhlIG1hdGNoIHJ1bGUgb3IgdGhlCisgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBtZXNzYWdlIGFyZ3VtZW50IGVuZHMgd2l0aCAnLycgYW5kIGlzIGEgcHJlZml4IG9mIHRoZQorICAgICAgICAgICAgICAgICAgb3RoZXIuIEFuIGV4YW1wbGUgYXJndW1lbnQgcGF0aCBtYXRjaCBpcyBhcmcwcGF0aD0nL2FhL2JiLycuIFRoaXMKKyAgICAgICAgICAgICAgICAgIHdvdWxkIG1hdGNoIG1lc3NhZ2VzIHdpdGggZmlyc3QgYXJndW1lbnRzIG9mICcvJywgJy9hYS8nLAorICAgICAgICAgICAgICAgICAgJy9hYS9iYi8nLCAnL2FhL2JiL2NjLycgYW5kICcvYWEvYmIvY2MnLiBJdCB3b3VsZCBub3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzIHdpdGggZmlyc3QgYXJndW1lbnRzIG9mICcvYWEvYicsICcvYWEnIG9yIGV2ZW4gJy9hYS9iYicuPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iTWVzc2FnZSBCdXMgU3RhcnRpbmcgU2VydmljZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzIj48L2E+TWVzc2FnZSBCdXMgU3RhcnRpbmcgU2VydmljZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBUaGUgbWVzc2FnZSBidXMgY2FuIHN0YXJ0IGFwcGxpY2F0aW9ucyBvbiBiZWhhbGYgb2Ygb3RoZXIgYXBwbGljYXRpb25zLgorICAgICAgICBJbiBDT1JCQSB0ZXJtcywgdGhpcyB3b3VsZCBiZSBjYWxsZWQgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmFjdGl2YXRpb248L2VtPi4KKyAgICAgICAgQW4gYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgc3RhcnRlZCBpbiB0aGlzIHdheSBpcyBjYWxsZWQgYQorICAgICAgICA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+c2VydmljZTwvZW0+LgorICAgICAgPC9wPjxwPgorICAgICAgICBXaXRoIEQtQnVzLCBzdGFydGluZyBhIHNlcnZpY2UgaXMgbm9ybWFsbHkgZG9uZSBieSBuYW1lLiBUaGF0IGlzLAorICAgICAgICBhcHBsaWNhdGlvbnMgYXNrIHRoZSBtZXNzYWdlIGJ1cyB0byBzdGFydCBzb21lIHByb2dyYW0gdGhhdCB3aWxsIG93biBhCisgICAgICAgIHdlbGwta25vd24gbmFtZSwgc3VjaCBhcyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3I8L2NvZGU+LgorICAgICAgICBUaGlzIGltcGxpZXMgYSBjb250cmFjdCBkb2N1bWVudGVkIGFsb25nIHdpdGggdGhlIG5hbWUgCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvcjwvY29kZT4gZm9yIHdoaWNoIG9iamVjdHMgCisgICAgICAgIHRoZSBvd25lciBvZiB0aGF0IG5hbWUgd2lsbCBwcm92aWRlLCBhbmQgd2hhdCBpbnRlcmZhY2VzIHRob3NlIAorICAgICAgICBvYmplY3RzIHdpbGwgaGF2ZS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVG8gZmluZCBhbiBleGVjdXRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIG5hbWUsIHRoZSBidXMgZGFlbW9uCisgICAgICAgIGxvb2tzIGZvciA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+c2VydmljZSBkZXNjcmlwdGlvbiBmaWxlczwvZW0+LiAgU2VydmljZQorICAgICAgICBkZXNjcmlwdGlvbiBmaWxlcyBkZWZpbmUgYSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gZXhlY3V0YWJsZXMuIERpZmZlcmVudAorICAgICAgICBraW5kcyBvZiBtZXNzYWdlIGJ1cyB3aWxsIGxvb2sgZm9yIHRoZXNlIGZpbGVzIGluIGRpZmZlcmVudCBwbGFjZXMsIHNlZQorICAgICAgICA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI21lc3NhZ2UtYnVzLXR5cGVzIiB0aXRsZT0iV2VsbC1rbm93biBNZXNzYWdlIEJ1cyBJbnN0YW5jZXMiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7V2VsbC1rbm93biBNZXNzYWdlIEJ1cyBJbnN0YW5jZXMmIzgyMjE7PC9hPi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgU2VydmljZSBkZXNjcmlwdGlvbiBmaWxlcyBoYXZlIHRoZSAiLnNlcnZpY2UiIGZpbGUKKyAgICAgICAgZXh0ZW5zaW9uLiBUaGUgbWVzc2FnZSBidXMgd2lsbCBvbmx5IGxvYWQgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlcworICAgICAgICBlbmRpbmcgd2l0aCAuc2VydmljZTsgYWxsIG90aGVyIGZpbGVzIHdpbGwgYmUgaWdub3JlZC4gIFRoZSBmaWxlIGZvcm1hdAorICAgICAgICBpcyBzaW1pbGFyIHRvIHRoYXQgb2YgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9kZXNrdG9wLWVudHJ5LXNwZWMvZGVza3RvcC1lbnRyeS1zcGVjLWxhdGVzdC5odG1sIiB0YXJnZXQ9Il90b3AiPmRlc2t0b3AKKyAgICAgICAgZW50cmllczwvYT4uIEFsbCBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzIG11c3QgYmUgaW4gVVRGLTgKKyAgICAgICAgZW5jb2RpbmcuIFRvIGVuc3VyZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gbmFtZSBjb2xsaXNpb25zLCBzZXJ2aWNlIGZpbGVzCisgICAgICAgIG11c3QgYmUgbmFtZXNwYWNlZCB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgbWVzc2FnZXMgYW5kIHNlcnZpY2UKKyAgICAgICAgbmFtZXMuCisgICAgICA8L3A+PHA+CisgICAgICAgIFtGSVhNRSB0aGUgZmlsZSBmb3JtYXQgc2hvdWxkIGJlIG11Y2ggYmV0dGVyIHNwZWNpZmllZCB0aGFuICJzaW1pbGFyIHRvCisgICAgICAgIC5kZXNrdG9wIGVudHJpZXMiIGVzcC4gc2luY2UgZGVza3RvcCBlbnRyaWVzIGFyZSBhbHJlYWR5CisgICAgICAgIGJhZGx5LXNwZWNpZmllZC4gOy0pXQorICAgICAgICBUaGVzZSBzZWN0aW9ucyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGFwcGx5IHRvIHNlcnZpY2UgZmlsZXMgYXMgd2VsbDoKKworICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+R2VuZXJhbCBzeW50YXg8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD5Db21tZW50IGZvcm1hdDwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgbmFtZT0iaWRwNTU2NTYwMCI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJloDkuoEV4YW1wbGUgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlPC9iPjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUtY29udGVudHMiPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgICMgU2FtcGxlIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZQorICAgICAgICAgICAgW0QtQlVTIFNlcnZpY2VdCisgICAgICAgICAgICBOYW1lcz1vcmcuZnJlZWRlc2t0b3AuQ29uZmlndXJhdGlvbkRhdGFiYXNlO29yZy5nbm9tZS5HQ29uZjsKKyAgICAgICAgICAgIEV4ZWM9L3Vzci9saWJleGVjL2djb25mZC0yCisgICAgICAgICAgPC9wcmU+PC9kaXY+PC9kaXY+PHA+PGJyIGNsYXNzPSJmaWd1cmUtYnJlYWsiPgorICAgICAgPC9wPjxwPgorICAgICAgICBXaGVuIGFuIGFwcGxpY2F0aW9uIGFza3MgdG8gc3RhcnQgYSBzZXJ2aWNlIGJ5IG5hbWUsIHRoZSBidXMgZGFlbW9uIHRyaWVzIHRvCisgICAgICAgIGZpbmQgYSBzZXJ2aWNlIHRoYXQgd2lsbCBvd24gdGhhdCBuYW1lLiBJdCB0aGVuIHRyaWVzIHRvIHNwYXduIHRoZQorICAgICAgICBleGVjdXRhYmxlIGFzc29jaWF0ZWQgd2l0aCBpdC4gSWYgdGhpcyBmYWlscywgaXQgd2lsbCByZXBvcnQgYW4KKyAgICAgICAgZXJyb3IuIFtGSVhNRSB3aGF0IGhhcHBlbnMgaWYgdHdvIC5zZXJ2aWNlIGZpbGVzIG9mZmVyIHRoZSBzYW1lIHNlcnZpY2U7CisgICAgICAgIHdoYXQga2luZCBvZiBlcnJvciBpcyByZXBvcnRlZCwgc2hvdWxkIHdlIGhhdmUgYSB3YXkgZm9yIHRoZSBjbGllbnQgdG8KKyAgICAgICAgY2hvb3NlIG9uZT9dCisgICAgICA8L3A+PHA+CisgICAgICAgIFRoZSBleGVjdXRhYmxlIGxhdW5jaGVkIHdpbGwgaGF2ZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfU1RBUlRFUl9BRERSRVNTPC9jb2RlPiBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgIG1lc3NhZ2UgYnVzIHNvIGl0IGNhbiBjb25uZWN0IGFuZCByZXF1ZXN0IHRoZSBhcHByb3ByaWF0ZSBuYW1lcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhlIGV4ZWN1dGFibGUgYmVpbmcgbGF1bmNoZWQgbWF5IHdhbnQgdG8ga25vdyB3aGV0aGVyIHRoZSBtZXNzYWdlIGJ1cworICAgICAgICBzdGFydGluZyBpdCBpcyBvbmUgb2YgdGhlIHdlbGwta25vd24gbWVzc2FnZSBidXNlcyAoc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjbWVzc2FnZS1idXMtdHlwZXMiIHRpdGxlPSJXZWxsLWtub3duIE1lc3NhZ2UgQnVzIEluc3RhbmNlcyI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtXZWxsLWtub3duIE1lc3NhZ2UgQnVzIEluc3RhbmNlcyYjODIyMTs8L2E+KS4gVG8gZmFjaWxpdGF0ZSB0aGlzLCB0aGUgYnVzIG11c3QgYWxzbyBzZXQKKyAgICAgICAgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1NUQVJURVJfQlVTX1RZUEU8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIG9uZQorICAgICAgICBvZiB0aGUgd2VsbC1rbm93biBidXNlcy4gVGhlIGN1cnJlbnRseS1kZWZpbmVkIHZhbHVlcyBmb3IgdGhpcyB2YXJpYWJsZQorICAgICAgICBhcmUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPnN5c3RlbTwvY29kZT4gZm9yIHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzLAorICAgICAgICBhbmQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPnNlc3Npb248L2NvZGU+IGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24gbWVzc2FnZQorICAgICAgICBidXMuIFRoZSBuZXcgZXhlY3V0YWJsZSBtdXN0IHN0aWxsIGNvbm5lY3QgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4KKyAgICAgICAgaW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfU1RBUlRFUl9BRERSRVNTPC9jb2RlPiwgYnV0IG1heSBhc3N1bWUgdGhhdCB0aGUKKyAgICAgICAgcmVzdWx0aW5nIGNvbm5lY3Rpb24gaXMgdG8gdGhlIHdlbGwta25vd24gYnVzLgorICAgICAgPC9wPjxwPgorICAgICAgICBbRklYTUUgdGhlcmUgc2hvdWxkIGJlIGEgdGltZW91dCBzb21ld2hlcmUsIGVpdGhlciBzcGVjaWZpZWQKKyAgICAgICAgaW4gdGhlIC5zZXJ2aWNlIGZpbGUsIGJ5IHRoZSBjbGllbnQsIG9yIGp1c3QgYSBnbG9iYWwgdmFsdWUKKyAgICAgICAgYW5kIGlmIHRoZSBjbGllbnQgYmVpbmcgYWN0aXZhdGVkIGZhaWxzIHRvIGNvbm5lY3Qgd2l0aGluIHRoYXQKKyAgICAgICAgdGltZW91dCwgYW4gZXJyb3Igc2hvdWxkIGJlIHNlbnQgYmFjay5dCisgICAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJNZXNzYWdlIEJ1cyBTZXJ2aWNlIFNjb3BlIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZXNzYWdlLWJ1cy1zdGFydGluZy1zZXJ2aWNlcy1zY29wZSI+PC9hPk1lc3NhZ2UgQnVzIFNlcnZpY2UgU2NvcGU8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIFRoZSAic2NvcGUiIG9mIGEgc2VydmljZSBpcyBpdHMgInBlci0iLCBzdWNoIGFzIHBlci1zZXNzaW9uLAorICAgICAgICAgIHBlci1tYWNoaW5lLCBwZXItaG9tZS1kaXJlY3RvcnksIG9yIHBlci1kaXNwbGF5LiBUaGUgcmVmZXJlbmNlCisgICAgICAgICAgaW1wbGVtZW50YXRpb24gZG9lc24ndCB5ZXQgc3VwcG9ydCBzdGFydGluZyBzZXJ2aWNlcyBpbiBhIGRpZmZlcmVudAorICAgICAgICAgIHNjb3BlIGZyb20gdGhlIG1lc3NhZ2UgYnVzIGl0c2VsZi4gU28gZS5nLiBpZiB5b3Ugc3RhcnQgYSBzZXJ2aWNlCisgICAgICAgICAgb24gdGhlIHNlc3Npb24gYnVzIGl0cyBzY29wZSBpcyBwZXItc2Vzc2lvbi4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFdlIGNvdWxkIGFkZCBhbiBvcHRpb25hbCBzY29wZSB0byBhIGJ1cyBuYW1lLiBGb3IgZXhhbXBsZSwgZm9yCisgICAgICAgICAgcGVyLShkaXNwbGF5LHNlc3Npb24gcGFpciksIHdlIGNvdWxkIGhhdmUgYSB1bmlxdWUgSUQgZm9yIGVhY2ggZGlzcGxheQorICAgICAgICAgIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGxvZ2luIGFuZCBzZXQgb24gc2NyZWVuIDAgYnkgZXhlY3V0aW5nIGEKKyAgICAgICAgICBzcGVjaWFsICJzZXQgZGlzcGxheSBJRCIgYmluYXJ5LiBUaGUgSUQgd291bGQgYmUgc3RvcmVkIGluIGEKKyAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+X0RCVVNfRElTUExBWV9JRDwvY29kZT4gcHJvcGVydHkgYW5kIHdvdWxkIGJlIGEgc3RyaW5nIG9mCisgICAgICAgICAgcmFuZG9tIGJ5dGVzLiBUaGlzIElEIHdvdWxkIHRoZW4gYmUgdXNlZCB0byBzY29wZSBuYW1lcy4KKyAgICAgICAgICBTdGFydGluZy9sb2NhdGluZyBhIHNlcnZpY2UgY291bGQgYmUgZG9uZSBieSBJRC1uYW1lIHBhaXIgcmF0aGVyIHRoYW4KKyAgICAgICAgICBvbmx5IGJ5IG5hbWUuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBDb250cmFzdCB0aGlzIHdpdGggYSBwZXItZGlzcGxheSBzY29wZS4gVG8gYWNoaWV2ZSB0aGF0LCB3ZSB3b3VsZCAKKyAgICAgICAgICB3YW50IGEgc2luZ2xlIGJ1cyBzcGFubmluZyBhbGwgc2Vzc2lvbnMgdXNpbmcgYSBnaXZlbiBkaXNwbGF5LgorICAgICAgICAgIFNvIHdlIG1pZ2h0IHNldCBhIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5fREJVU19ESVNQTEFZX0JVU19BRERSRVNTPC9jb2RlPiAKKyAgICAgICAgICBwcm9wZXJ0eSBvbiBzY3JlZW4gMCBvZiB0aGUgZGlzcGxheSwgcG9pbnRpbmcgdG8gdGhpcyBidXMuCisgICAgICAgIDwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IldlbGwta25vd24gTWVzc2FnZSBCdXMgSW5zdGFuY2VzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZXNzYWdlLWJ1cy10eXBlcyI+PC9hPldlbGwta25vd24gTWVzc2FnZSBCdXMgSW5zdGFuY2VzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVHdvIHN0YW5kYXJkIG1lc3NhZ2UgYnVzIGluc3RhbmNlcyBhcmUgZGVmaW5lZCBoZXJlLCBhbG9uZyB3aXRoIGhvdyAKKyAgICAgICAgdG8gbG9jYXRlIHRoZW0gYW5kIHdoZXJlIHRoZWlyIHNlcnZpY2UgZmlsZXMgbGl2ZS4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IkxvZ2luIHNlc3Npb24gbWVzc2FnZSBidXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtYnVzLXR5cGVzLWxvZ2luIj48L2E+TG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1czwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgRWFjaCB0aW1lIGEgdXNlciBsb2dzIGluLCBhIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5sb2dpbiBzZXNzaW9uIG1lc3NhZ2UKKyAgICAgICAgICAgIGJ1czwvZW0+IG1heSBiZSBzdGFydGVkLiBBbGwgYXBwbGljYXRpb25zIGluIHRoZSB1c2VyJ3MgbG9naW4KKyAgICAgICAgICBzZXNzaW9uIG1heSBpbnRlcmFjdCB3aXRoIG9uZSBhbm90aGVyIHVzaW5nIHRoaXMgbWVzc2FnZSBidXMuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgbG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1cyBpcyBnaXZlbiAKKyAgICAgICAgICBpbiB0aGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvY29kZT4gZW52aXJvbm1lbnQgCisgICAgICAgICAgdmFyaWFibGUuIElmIHRoYXQgdmFyaWFibGUgaXMgbm90IHNldCwgYXBwbGljYXRpb25zIG1heSAKKyAgICAgICAgICBhbHNvIHRyeSB0byByZWFkIHRoZSBhZGRyZXNzIGZyb20gdGhlIFggV2luZG93IFN5c3RlbSByb290IAorICAgICAgICAgIHdpbmRvdyBwcm9wZXJ0eSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+X0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvY29kZT4uCisgICAgICAgICAgVGhlIHJvb3Qgd2luZG93IHByb3BlcnR5IG11c3QgaGF2ZSB0eXBlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJJTkc8L2NvZGU+LgorICAgICAgICAgIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzaG91bGQgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgdGhlIAorICAgICAgICAgIHJvb3Qgd2luZG93IHByb3BlcnR5LgorICAgICAgICA8L3A+PHA+VGhlIGFkZHJlc3Mgb2YgdGhlIGxvZ2luIHNlc3Npb24gbWVzc2FnZSBidXMgaXMgZ2l2ZW4gaW4gdGhlCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLiBJZgorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaXMgbm90IHNldCwgb3IgaWYgaXQncyBzZXQgdG8gdGhlIHN0cmluZworICAgICAgICAiYXV0b2xhdW5jaDoiLCB0aGUgc3lzdGVtIHNob3VsZCB1c2UgcGxhdGZvcm0tc3BlY2lmaWMgbWV0aG9kcyBvZgorICAgICAgICBsb2NhdGluZyBhIHJ1bm5pbmcgRC1CdXMgc2Vzc2lvbiBzZXJ2ZXIsIG9yIHN0YXJ0aW5nIG9uZSBpZiBhIHJ1bm5pbmcKKyAgICAgICAgaW5zdGFuY2UgY2Fubm90IGJlIGZvdW5kLiBOb3RlIHRoYXQgdGhpcyBtZWNoYW5pc20gaXMgbm90IHJlY29tbWVuZGVkCisgICAgICAgIGZvciBhdHRlbXB0aW5nIHRvIGRldGVybWluZSBpZiBhIGRhZW1vbiBpcyBydW5uaW5nLiBJdCBpcyBpbmhlcmVudGx5CisgICAgICAgIHJhY3kgdG8gYXR0ZW1wdCB0byBtYWtlIHRoaXMgZGV0ZXJtaW5hdGlvbiwgc2luY2UgdGhlIGJ1cyBkYWVtb24gbWF5CisgICAgICAgIGJlIHN0YXJ0ZWQganVzdCBiZWZvcmUgb3IganVzdCBhZnRlciB0aGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlLgorICAgICAgICBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYXBwbGljYXRpb25zIGRvIG5vdCB0cnkgdG8gbWFrZSB0aGlzCisgICAgICAgIGRldGVybWluYXRpb24gZm9yIHRoZWlyIGZ1bmN0aW9uYWxpdHkgcHVycG9zZXMsIGFuZCBpbnN0ZWFkIHRoZXkKKyAgICAgICAgc2hvdWxkIGF0dGVtcHQgdG8gc3RhcnQgdGhlIHNlcnZlci48L3A+PGRpdiBjbGFzcz0ic2VjdDQiIHRpdGxlPSJYIFdpbmRvd2luZyBTeXN0ZW0iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNSBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtYnVzLXR5cGVzLWxvZ2luLXgtd2luZG93cyI+PC9hPlggV2luZG93aW5nIFN5c3RlbTwvaDU+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgICBGb3IgdGhlIFggV2luZG93aW5nIFN5c3RlbSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgbG9jYXRlIHRoZQorICAgICAgICAgICAgd2luZG93IG93bmVyIG9mIHRoZSBzZWxlY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhlIGF0b20gZm9ybWVkIGJ5CisgICAgICAgICAgICBjb25jYXRlbmF0aW5nOgorICAgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPnRoZSBsaXRlcmFsIHN0cmluZyAiX0RCVVNfU0VTU0lPTl9CVVNfU0VMRUNUSU9OXyI8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD50aGUgY3VycmVudCB1c2VyJ3MgdXNlcm5hbWU8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD50aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgJ18nICh1bmRlcnNjb3JlKTwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPnRoZSBtYWNoaW5lJ3MgSUQ8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgICAgIDwvcD48cD4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBmb3IgdGhlIHdpbmRvdyB0aGF0IG93bnMKKyAgICAgICAgICAgIHRoaXMgWCBzZWxlY3Rpb246CisgICAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0Ym9keT48dHI+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPkF0b208L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPm1lYW5pbmc8L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPl9EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPnRoZSBhY3R1YWwgYWRkcmVzcyBvZiB0aGUgc2VydmVyIHNvY2tldDwvcD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjx0cj48dGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHA+X0RCVVNfU0VTU0lPTl9CVVNfUElEPC9wPgorICAgICAgICAgICAgICAgICAgICA8L3RkPjx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICA8cD50aGUgUElEIG9mIHRoZSBzZXJ2ZXIgcHJvY2VzczwvcD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgICA8L3A+PHA+CisgICAgICAgICAgICBBdCBsZWFzdCB0aGUgX0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBwcm9wZXJ0eSBNVVNUIGJlCisgICAgICAgICAgICBwcmVzZW50IGluIHRoaXMgd2luZG93LgorICAgICAgICAgIDwvcD48cD4KKyAgICAgICAgICAgIElmIHRoZSBYIHNlbGVjdGlvbiBjYW5ub3QgYmUgbG9jYXRlZCBvciBpZiByZWFkaW5nIHRoZQorICAgICAgICAgICAgcHJvcGVydGllcyBmcm9tIHRoZSB3aW5kb3cgZmFpbHMsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIGNvbmNsdWRlCisgICAgICAgICAgICB0aGF0IHRoZXJlIGlzIG5vIEQtQnVzIHNlcnZlciBydW5uaW5nIGFuZCBwcm9jZWVkIHRvIHN0YXJ0IGEgbmV3CisgICAgICAgICAgICBzZXJ2ZXIuIChTZWUgYmVsb3cgb24gY29uY3VycmVuY3kgaXNzdWVzKQorICAgICAgICAgIDwvcD48cD4KKyAgICAgICAgICAgIEZhaWx1cmUgdG8gY29ubmVjdCB0byB0aGUgRC1CdXMgc2VydmVyIGFkZHJlc3MgdGh1cyBvYnRhaW5lZAorICAgICAgICAgICAgTVVTVCBiZSB0cmVhdGVkIGFzIGEgZmF0YWwgY29ubmVjdGlvbiBlcnJvciBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgICAgICAgICB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgQXMgYW4gYWx0ZXJuYXRpdmUsIGFuIGltcGxlbWVudGF0aW9uIE1BWSBmaW5kIHRoZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgaW4gdGhlIGZvbGxvd2luZyBmaWxlIGxvY2F0ZWQgaW4gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LAorICAgICAgICAgICAgaW4gc3ViZGlyZWN0b3J5IC5kYnVzL3Nlc3Npb24tYnVzLzoKKyAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD50aGUgbWFjaGluZSdzIElEPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+dGhlIGxpdGVyYWwgY2hhcmFjdGVyICctJyAoZGFzaCk8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD50aGUgWCBkaXNwbGF5IHdpdGhvdXQgdGhlIHNjcmVlbiBudW1iZXIsIHdpdGggdGhlCisgICAgICAgICAgICAgICAgZm9sbG93aW5nIHByZWZpeGVzIHJlbW92ZWQsIGlmIHByZXNlbnQ6ICI6IiwgImxvY2FsaG9zdDoiCisgICAgICAgICAgICAgICAgLiJsb2NhbGhvc3QubG9jYWxkb21haW46Ii4gVGhhdCBpcywgYSBkaXNwbGF5IG9mCisgICAgICAgICAgICAgICAgImxvY2FsaG9zdDoxMC4wIiBwcm9kdWNlcyBqdXN0IHRoZSBudW1iZXIgIjEwIjwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBOQU1FPXZhbHVlIGFzc2lnbm1lbnQgcGFpcnMgYW5kCisgICAgICAgICAgICBsaW5lcyBzdGFydGluZyB3aXRoICMgYXJlIGNvbW1lbnRzIChubyBjb21tZW50cyBhcmUgYWxsb3dlZAorICAgICAgICAgICAgb3RoZXJ3aXNlKS4gVGhlIGZvbGxvd2luZyB2YXJpYWJsZSBuYW1lcyBhcmUgZGVmaW5lZDoKKyAgICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRib2R5Pjx0cj48dGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHA+VmFyaWFibGU8L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPm1lYW5pbmc8L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvcD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHA+dGhlIGFjdHVhbCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgc29ja2V0PC9wPgorICAgICAgICAgICAgICAgICAgICA8L3RkPjwvdHI+PHRyPjx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICA8cD5EQlVTX1NFU1NJT05fQlVTX1BJRDwvcD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD48dGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHA+dGhlIFBJRCBvZiB0aGUgc2VydmVyIHByb2Nlc3M8L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48dHI+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ8L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PHRkPgorICAgICAgICAgICAgICAgICAgICAgIDxwPnRoZSB3aW5kb3cgSUQ8L3A+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgQXQgbGVhc3QgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyB2YXJpYWJsZSBNVVNUIGJlIHByZXNlbnQKKyAgICAgICAgICAgIGluIHRoaXMgZmlsZS4KKyAgICAgICAgICA8L3A+PHA+CisgICAgICAgICAgICBGYWlsdXJlIHRvIG9wZW4gdGhpcyBmaWxlIE1VU1QgYmUgaW50ZXJwcmV0ZWQgYXMgYWJzZW5jZSBvZiBhCisgICAgICAgICAgICBydW5uaW5nIHNlcnZlci4gVGhlcmVmb3JlLCB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCBwcm9jZWVkIHRvCisgICAgICAgICAgICBhdHRlbXB0aW5nIHRvIGxhdW5jaCBhIG5ldyBidXMgc2VydmVyIGlmIHRoZSBmaWxlIGNhbm5vdCBiZQorICAgICAgICAgICAgb3BlbmVkLgorICAgICAgICAgIDwvcD48cD4KKyAgICAgICAgICAgIEhvd2V2ZXIsIHN1Y2Nlc3MgaW4gb3BlbmluZyB0aGlzIGZpbGUgTVVTVCBOT1QgbGVhZCB0byB0aGUKKyAgICAgICAgICAgIGNvbmNsdXNpb24gdGhhdCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuIFRodXMsIGEgZmFpbHVyZSB0byBjb25uZWN0IHRvCisgICAgICAgICAgICB0aGUgYnVzIGFkZHJlc3Mgb2J0YWluZWQgYnkgdGhlIGFsdGVybmF0aXZlIG1ldGhvZCBNVVNUIE5PVCBiZQorICAgICAgICAgICAgY29uc2lkZXJlZCBhIGZhdGFsIGVycm9yLiBJZiB0aGUgY29ubmVjdGlvbiBjYW5ub3QgYmUgZXN0YWJsaXNoZWQsCisgICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCBwcm9jZWVkIHRvIGNoZWNrIHRoZSBYIHNlbGVjdGlvbiBzZXR0aW5ncyBvcgorICAgICAgICAgICAgdG8gc3RhcnQgdGhlIHNlcnZlciBvbiBpdHMgb3duLgorICAgICAgICAgIDwvcD48cD4KKyAgICAgICAgICAgIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBjb25jbHVkZXMgdGhhdCB0aGUgRC1CdXMgc2VydmVyIGlzIG5vdAorICAgICAgICAgICAgcnVubmluZyBpdCBNVVNUIGF0dGVtcHQgdG8gc3RhcnQgYSBuZXcgc2VydmVyIGFuZCBpdCBNVVNUIGFsc28KKyAgICAgICAgICAgIGVuc3VyZSB0aGF0IHRoZSBkYWVtb24gc3RhcnRlZCBhcyBhbiBlZmZlY3Qgb2YgdGhlICJhdXRvbGF1bmNoIgorICAgICAgICAgICAgbWVjaGFuaXNtIHByb3ZpZGVzIHRoZSBsb29rdXAgbWVjaGFuaXNtcyBkZXNjcmliZWQgYWJvdmUsIHNvCisgICAgICAgICAgICBzdWJzZXF1ZW50IGNhbGxzIGNhbiBsb2NhdGUgdGhlIG5ld2x5IHN0YXJ0ZWQgc2VydmVyLiBUaGUKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIE1VU1QgYWxzbyBlbnN1cmUgdGhhdCBpZiB0d28gb3IgbW9yZSBjb25jdXJyZW50CisgICAgICAgICAgICBpbml0aWF0aW9ucyBoYXBwZW4sIG9ubHkgb25lIHNlcnZlciByZW1haW5zIHJ1bm5pbmcgYW5kIGFsbCBvdGhlcgorICAgICAgICAgICAgaW5pdGlhdGlvbnMgYXJlIGFibGUgdG8gb2J0YWluIHRoZSBhZGRyZXNzIG9mIHRoaXMgc2VydmVyIGFuZAorICAgICAgICAgICAgY29ubmVjdCB0byBpdC4gSW4gb3RoZXIgd29yZHMsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIGVuc3VyZSB0aGF0CisgICAgICAgICAgICB0aGUgWCBzZWxlY3Rpb24gaXMgbm90IHByZXNlbnQgd2hlbiBpdCBhdHRlbXB0cyB0byBzZXQgaXQsIHdpdGhvdXQKKyAgICAgICAgICAgIGFsbG93aW5nIGFub3RoZXIgcHJvY2VzcyB0byBzZXQgdGhlIHNlbGVjdGlvbiBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgdmVyaWZpY2F0aW9uIGFuZCB0aGUgc2V0dGluZyAoZS5nLiwgYnkgdXNpbmcgWEdyYWJTZXJ2ZXIgLworICAgICAgICAgICAgWHVuZ3JhYlNlcnZlcikuCisgICAgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Q0Ij48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDUgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJpZHA1NjE4MzY4Ij48L2E+PC9oNT48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICAgIFtGSVhNRSBzcGVjaWZ5IGxvY2F0aW9uIG9mIC5zZXJ2aWNlIGZpbGVzLCBwcm9iYWJseSB1c2luZworICAgICAgICAgICAgREVTS1RPUF9ESVJTIGV0Yy4gZnJvbSBiYXNlZGlyIHNwZWNpZmljYXRpb24sIHRob3VnaCBsb2dpbiBzZXNzaW9uCisgICAgICAgICAgICBidXMgaXMgbm90IHJlYWxseSBkZXNrdG9wLXNwZWNpZmljXQorICAgICAgICAgIDwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IlN5c3RlbSBtZXNzYWdlIGJ1cyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1idXMtdHlwZXMtc3lzdGVtIj48L2E+U3lzdGVtIG1lc3NhZ2UgYnVzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBIGNvbXB1dGVyIG1heSBoYXZlIGEgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPnN5c3RlbSBtZXNzYWdlIGJ1czwvZW0+LAorICAgICAgICAgIGFjY2Vzc2libGUgdG8gYWxsIGFwcGxpY2F0aW9ucyBvbiB0aGUgc3lzdGVtLiBUaGlzIG1lc3NhZ2UgYnVzIG1heSBiZQorICAgICAgICAgIHVzZWQgdG8gYnJvYWRjYXN0IHN5c3RlbSBldmVudHMsIHN1Y2ggYXMgYWRkaW5nIG5ldyBoYXJkd2FyZSBkZXZpY2VzLCAKKyAgICAgICAgICBjaGFuZ2VzIGluIHRoZSBwcmludGVyIHF1ZXVlLCBhbmQgc28gZm9ydGguCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVzIGlzIGdpdmVuIAorICAgICAgICAgIGluIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REJVU19TWVNURU1fQlVTX0FERFJFU1M8L2NvZGU+IGVudmlyb25tZW50IAorICAgICAgICAgIHZhcmlhYmxlLiBJZiB0aGF0IHZhcmlhYmxlIGlzIG5vdCBzZXQsIGFwcGxpY2F0aW9ucyBzaG91bGQgdHJ5IAorICAgICAgICAgIHRvIGNvbm5lY3QgdG8gdGhlIHdlbGwta25vd24gYWRkcmVzcworICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj51bml4OnBhdGg9L3Zhci9ydW4vZGJ1cy9zeXN0ZW1fYnVzX3NvY2tldDwvY29kZT4uCisgICAgICAgICAgPHN1cD5bPGEgbmFtZT0iaWRwNTYyMzM5MiIgaHJlZj0iI2Z0bi5pZHA1NjIzMzkyIiBjbGFzcz0iZm9vdG5vdGUiPjI8L2E+XTwvc3VwPgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgW0ZJWE1FIHNwZWNpZnkgbG9jYXRpb24gb2Ygc3lzdGVtIGJ1cyAuc2VydmljZSBmaWxlc10KKyAgICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iTWVzc2FnZSBCdXMgTWVzc2FnZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im1lc3NhZ2UtYnVzLW1lc3NhZ2VzIj48L2E+TWVzc2FnZSBCdXMgTWVzc2FnZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBUaGUgc3BlY2lhbCBtZXNzYWdlIGJ1cyBuYW1lIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1czwvY29kZT4KKyAgICAgICAgcmVzcG9uZHMgdG8gYSBudW1iZXIgb2YgYWRkaXRpb25hbCBtZXNzYWdlcy4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtbWVzc2FnZXMtaGVsbG8iPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG88L2NvZGU+PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgU1RSSU5HIEhlbGxvICgpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5VbmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgY29ubmVjdGlvbjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBCZWZvcmUgYW4gYXBwbGljYXRpb24gaXMgYWJsZSB0byBzZW5kIG1lc3NhZ2VzIHRvIG90aGVyIGFwcGxpY2F0aW9ucworICAgICAgICAgIGl0IG11c3Qgc2VuZCB0aGUgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvPC9jb2RlPiBtZXNzYWdlCisgICAgICAgICAgdG8gdGhlIG1lc3NhZ2UgYnVzIHRvIG9idGFpbiBhIHVuaXF1ZSBuYW1lLiBJZiBhbiBhcHBsaWNhdGlvbiB3aXRob3V0CisgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0cmllcyB0byBzZW5kIGEgbWVzc2FnZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLCBvciBhCisgICAgICAgICAgbWVzc2FnZSB0byB0aGUgbWVzc2FnZSBidXMgaXRzZWxmIHRoYXQgaXNuJ3QgdGhlCisgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvPC9jb2RlPiBtZXNzYWdlLCBpdCB3aWxsIGJlCisgICAgICAgICAgZGlzY29ubmVjdGVkIGZyb20gdGhlIGJ1cy4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICAgIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgImRpc2Nvbm5lY3QiIHJlcXVlc3Q7IGlmIGEgY2xpZW50IHdpc2hlcyB0bworICAgICAgICAgIGRpc2Nvbm5lY3QgZnJvbSB0aGUgYnVzLCBpdCBzaW1wbHkgY2xvc2VzIHRoZSBzb2NrZXQgKG9yIG90aGVyIAorICAgICAgICAgIGNvbW11bmljYXRpb24gY2hhbm5lbCkuCisgICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLWxpc3QtbmFtZXMiPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzPC9jb2RlPjwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgIEFSUkFZIG9mIFNUUklORyBMaXN0TmFtZXMgKCkKKyAgICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPkFSUkFZIG9mIFNUUklORzwvdGQ+PHRkPkFycmF5IG9mIHN0cmluZ3Mgd2hlcmUgZWFjaCBzdHJpbmcgaXMgYSBidXMgbmFtZTwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY3VycmVudGx5LW93bmVkIG5hbWVzIG9uIHRoZSBidXMuCisgICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3RBY3RpdmF0YWJsZU5hbWVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtbWVzc2FnZXMtbGlzdC1hY3RpdmF0YWJsZS1uYW1lcyI+PC9hPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0QWN0aXZhdGFibGVOYW1lczwvY29kZT48L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBBUlJBWSBvZiBTVFJJTkcgTGlzdEFjdGl2YXRhYmxlTmFtZXMgKCkKKyAgICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPkFSUkFZIG9mIFNUUklORzwvdGQ+PHRkPkFycmF5IG9mIHN0cmluZ3Mgd2hlcmUgZWFjaCBzdHJpbmcgaXMgYSBidXMgbmFtZTwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbmFtZXMgdGhhdCBjYW4gYmUgYWN0aXZhdGVkIG9uIHRoZSBidXMuCisgICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVIYXNPd25lciI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLW5hbWUtZXhpc3RzIj48L2E+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVIYXNPd25lcjwvY29kZT48L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBCT09MRUFOIE5hbWVIYXNPd25lciAoaW4gU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPlNUUklORzwvdGQ+PHRkPk5hbWUgdG8gY2hlY2s8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+Qk9PTEVBTjwvdGQ+PHRkPlJldHVybiB2YWx1ZSwgdHJ1ZSBpZiB0aGUgbmFtZSBleGlzdHM8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBleGlzdHMgKGN1cnJlbnRseSBoYXMgYW4gb3duZXIpLgorICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lT3duZXJDaGFuZ2VkIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtbWVzc2FnZXMtbmFtZS1vd25lci1jaGFuZ2VkIj48L2E+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVPd25lckNoYW5nZWQ8L2NvZGU+PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBUaGlzIGlzIGEgc2lnbmFsOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBOYW1lT3duZXJDaGFuZ2VkIChTVFJJTkcgbmFtZSwgU1RSSU5HIG9sZF9vd25lciwgU1RSSU5HIG5ld19vd25lcikKKyAgICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+U1RSSU5HPC90ZD48dGQ+TmFtZSB3aXRoIGEgbmV3IG93bmVyPC90ZD48L3RyPjx0cj48dGQ+MTwvdGQ+PHRkPlNUUklORzwvdGQ+PHRkPk9sZCBvd25lciBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZTwvdGQ+PC90cj48dHI+PHRkPjI8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5OZXcgb3duZXIgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmU8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgVGhpcyBzaWduYWwgaW5kaWNhdGVzIHRoYXQgdGhlIG93bmVyIG9mIGEgbmFtZSBoYXMgY2hhbmdlZC4KKyAgICAgICAgICBJdCdzIGFsc28gdGhlIHNpZ25hbCB0byB1c2UgdG8gZGV0ZWN0IHRoZSBhcHBlYXJhbmNlIG9mIAorICAgICAgICAgIG5ldyBuYW1lcyBvbiB0aGUgYnVzLgorICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lTG9zdCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLW5hbWUtbG9zdCI+PC9hPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lTG9zdDwvY29kZT48L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIFRoaXMgaXMgYSBzaWduYWw6CisgICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgIE5hbWVMb3N0IChTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+U1RSSU5HPC90ZD48dGQ+TmFtZSB3aGljaCB3YXMgbG9zdDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGlzIHNpZ25hbCBpcyBzZW50IHRvIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hlbiBpdCBsb3NlcworICAgICAgICAgIG93bmVyc2hpcCBvZiBhIG5hbWUuCisgICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVBY3F1aXJlZCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLW5hbWUtYWNxdWlyZWQiPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUFjcXVpcmVkPC9jb2RlPjwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgVGhpcyBpcyBhIHNpZ25hbDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgTmFtZUFjcXVpcmVkIChTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+U1RSSU5HPC90ZD48dGQ+TmFtZSB3aGljaCB3YXMgYWNxdWlyZWQ8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgVGhpcyBzaWduYWwgaXMgc2VudCB0byBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoZW4gaXQgZ2FpbnMKKyAgICAgICAgICBvd25lcnNoaXAgb2YgYSBuYW1lLgorICAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWUiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImJ1cy1tZXNzYWdlcy1zdGFydC1zZXJ2aWNlLWJ5LW5hbWUiPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuU3RhcnRTZXJ2aWNlQnlOYW1lPC9jb2RlPjwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgIFVJTlQzMiBTdGFydFNlcnZpY2VCeU5hbWUgKGluIFNUUklORyBuYW1lLCBpbiBVSU5UMzIgZmxhZ3MpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPlNUUklORzwvdGQ+PHRkPk5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gc3RhcnQ8L3RkPjwvdHI+PHRyPjx0ZD4xPC90ZD48dGQ+VUlOVDMyPC90ZD48dGQ+RmxhZ3MgKGN1cnJlbnRseSBub3QgdXNlZCk8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5VSU5UMzI8L3RkPjx0ZD5SZXR1cm4gdmFsdWU8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICAgIFRyaWVzIHRvIGxhdW5jaCB0aGUgZXhlY3V0YWJsZSBhc3NvY2lhdGVkIHdpdGggYSBuYW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjbWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXMiIHRpdGxlPSJNZXNzYWdlIEJ1cyBTdGFydGluZyBTZXJ2aWNlcyI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtNZXNzYWdlIEJ1cyBTdGFydGluZyBTZXJ2aWNlcyYjODIyMTs8L2E+LgorCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPklkZW50aWZpZXI8L3RoPjx0aD5WYWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+REJVU19TVEFSVF9SRVBMWV9TVUNDRVNTPC90ZD48dGQ+MTwvdGQ+PHRkPlRoZSBzZXJ2aWNlIHdhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZC48L3RkPjwvdHI+PHRyPjx0ZD5EQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORzwvdGQ+PHRkPjI8L3RkPjx0ZD5BIGNvbm5lY3Rpb24gYWxyZWFkeSBvd25zIHRoZSBnaXZlbiBuYW1lLjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50Ij48L2E+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudDwvY29kZT48L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQgKGluIEFSUkFZIG9mIERJQ1QmbHQ7U1RSSU5HLFNUUklORyZndDsgZW52aXJvbm1lbnQpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPkFSUkFZIG9mIERJQ1QmbHQ7U1RSSU5HLFNUUklORyZndDs8L3RkPjx0ZD5FbnZpcm9ubWVudCB0byBhZGQgb3IgdXBkYXRlPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgICAgIE5vcm1hbGx5LCBzZXNzaW9uIGJ1cyBhY3RpdmF0ZWQgc2VydmljZXMgaW5oZXJpdCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGJ1cyBkYWVtb24uICBUaGlzIG1ldGhvZCBhZGRzIHRvIG9yIG1vZGlmaWVzIHRoYXQgZW52aXJvbm1lbnQgd2hlbiBhY3RpdmF0aW5nIHNlcnZpY2VzLgorICAgICAgICA8L3A+PHA+CisgICAgICAgICAgU29tZSBidXMgaW5zdGFuY2VzLCBzdWNoIGFzIHRoZSBzdGFuZGFyZCBzeXN0ZW0gYnVzLCBtYXkgZGlzYWJsZSBhY2Nlc3MgdG8gdGhpcyBtZXRob2QgZm9yIHNvbWUgb3IgYWxsIGNhbGxlcnMuCisgICAgICAgIDwvcD48cD4KKyAgICAgICAgICBOb3RlLCBib3RoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIG11c3QgYmUgdmFsaWQgVVRGLTguICBUaGVyZSdzIG5vIHdheSB0byB1cGRhdGUgdGhlIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgd2l0aCBkYXRhIHRoYXQgaXMgaW52YWxpZCBVVEYtOC4KKyAgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0TmFtZU93bmVyIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtbWVzc2FnZXMtZ2V0LW5hbWUtb3duZXIiPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0TmFtZU93bmVyPC9jb2RlPjwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAgIFNUUklORyBHZXROYW1lT3duZXIgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJlPjxwPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5OYW1lIHRvIGdldCB0aGUgb3duZXIgb2Y8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5SZXR1cm4gdmFsdWUsIGEgdW5pcXVlIGNvbm5lY3Rpb24gbmFtZTwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIFJldHVybnMgdGhlIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWUgb2YgdGhlIHByaW1hcnkgb3duZXIgb2YgdGhlIG5hbWUKKyAgICAgICAgZ2l2ZW4uIElmIHRoZSByZXF1ZXN0ZWQgbmFtZSBkb2Vzbid0IGhhdmUgYW4gb3duZXIsIHJldHVybnMgYQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTmFtZUhhc05vT3duZXI8L2NvZGU+IGVycm9yLgorICAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkdldENvbm5lY3Rpb25Vbml4VXNlciI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLXVuaXgtdXNlciI+PC9hPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uVW5peFVzZXI8L2NvZGU+PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgVUlOVDMyIEdldENvbm5lY3Rpb25Vbml4VXNlciAoaW4gU1RSSU5HIGJ1c19uYW1lKQorICAgICAgICAgIDwvcHJlPjxwPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5VbmlxdWUgb3Igd2VsbC1rbm93biBidXMgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0bworICAgICAgICAgICAgICAgICAgICBxdWVyeSwgc3VjaCBhcyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+OjEyLjM0PC9jb2RlPiBvcgorICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Y29tLmV4YW1wbGUudGVhPC9jb2RlPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPlVJTlQzMjwvdGQ+PHRkPlVuaXggdXNlciBJRDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIFJldHVybnMgdGhlIFVuaXggdXNlciBJRCBvZiB0aGUgcHJvY2VzcyBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlci4gSWYKKyAgICAgICAgdW5hYmxlIHRvIGRldGVybWluZSBpdCAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIHRoZSBwcm9jZXNzIGlzIG5vdCBvbiB0aGUKKyAgICAgICAgc2FtZSBtYWNoaW5lIGFzIHRoZSBidXMgZGFlbW9uKSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImJ1cy1tZXNzYWdlcy1nZXQtY29ubmVjdGlvbi11bml4LXByb2Nlc3MtaWQiPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQ8L2NvZGU+PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgVUlOVDMyIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPlNUUklORzwvdGQ+PHRkPlVuaXF1ZSBvciB3ZWxsLWtub3duIGJ1cyBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRvCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBzdWNoIGFzIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj46MTIuMzQ8L2NvZGU+IG9yCisgICAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5jb20uZXhhbXBsZS50ZWE8L2NvZGU+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGJvcmRlcj0iMSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+QXJndW1lbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD4wPC90ZD48dGQ+VUlOVDMyPC90ZD48dGQ+VW5peCBwcm9jZXNzIGlkPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgUmV0dXJucyB0aGUgVW5peCBwcm9jZXNzIElEIG9mIHRoZSBwcm9jZXNzIGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLiBJZgorICAgICAgICB1bmFibGUgdG8gZGV0ZXJtaW5lIGl0IChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgdGhlIHByb2Nlc3MgaXMgbm90IG9uIHRoZQorICAgICAgICBzYW1lIG1hY2hpbmUgYXMgdGhlIGJ1cyBkYWVtb24pLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5BZGRNYXRjaCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYnVzLW1lc3NhZ2VzLWFkZC1tYXRjaCI+PC9hPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5BZGRNYXRjaDwvY29kZT48L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgICBBZGRNYXRjaCAoaW4gU1RSSU5HIHJ1bGUpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPlNUUklORzwvdGQ+PHRkPk1hdGNoIHJ1bGUgdG8gYWRkIHRvIHRoZSBjb25uZWN0aW9uPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgQWRkcyBhIG1hdGNoIHJ1bGUgdG8gbWF0Y2ggbWVzc2FnZXMgZ29pbmcgdGhyb3VnaCB0aGUgbWVzc2FnZSBidXMgKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI21lc3NhZ2UtYnVzLXJvdXRpbmctbWF0Y2gtcnVsZXMiIHRpdGxlPSJNYXRjaCBSdWxlcyI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtNYXRjaCBSdWxlcyYjODIyMTs8L2E+KS4gCisJSWYgdGhlIGJ1cyBkb2VzIG5vdCBoYXZlIGVub3VnaCByZXNvdXJjZXMgdGhlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5PT008L2NvZGU+CisJZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVtb3ZlTWF0Y2giPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImJ1cy1tZXNzYWdlcy1yZW1vdmUtbWF0Y2giPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVtb3ZlTWF0Y2g8L2NvZGU+PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgUmVtb3ZlTWF0Y2ggKGluIFNUUklORyBydWxlKQorICAgICAgICAgIDwvcHJlPjxwPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5Bcmd1bWVudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjA8L3RkPjx0ZD5TVFJJTkc8L3RkPjx0ZD5NYXRjaCBydWxlIHRvIHJlbW92ZSBmcm9tIHRoZSBjb25uZWN0aW9uPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKyAgICAgICAgUmVtb3ZlcyB0aGUgZmlyc3QgcnVsZSB0aGF0IG1hdGNoZXMgKHNlZSA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI21lc3NhZ2UtYnVzLXJvdXRpbmctbWF0Y2gtcnVsZXMiIHRpdGxlPSJNYXRjaCBSdWxlcyI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtNYXRjaCBSdWxlcyYjODIyMTs8L2E+KS4gCisJSWYgdGhlIHJ1bGUgaXMgbm90IGZvdW5kIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTWF0Y2hSdWxlTm90Rm91bmQ8L2NvZGU+CisJZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImJ1cy1tZXNzYWdlcy1nZXQtaWQiPjwvYT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQ8L2NvZGU+PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICAgR2V0SWQgKG91dCBTVFJJTkcgaWQpCisgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkFyZ3VtZW50PC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+MDwvdGQ+PHRkPlNUUklORzwvdGQ+PHRkPlVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgYnVzIGRhZW1vbjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisgICAgICAgIEdldHMgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgYnVzLiBUaGUgdW5pcXVlIElEIGhlcmUgaXMgc2hhcmVkIGFtb25nIGFsbCBhZGRyZXNzZXMgdGhlIAorICAgICAgICBidXMgZGFlbW9uIGlzIGxpc3RlbmluZyBvbiAoVENQLCBVTklYIGRvbWFpbiBzb2NrZXQsIGV0Yy4pIGFuZCBpdHMgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiAKKyAgICAgICAgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiN1dWlkcyIgdGl0bGU9IlVVSURzIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwO1VVSURzJiM4MjIxOzwvYT4uIEVhY2ggYWRkcmVzcyB0aGUgYnVzIGlzIGxpc3RlbmluZyBvbiBhbHNvIGhhcyBpdHMgb3duIHVuaXF1ZSAKKyAgICAgICAgSUQsIGFzIGRlc2NyaWJlZCBpbiA8YSBjbGFzcz0ieHJlZiIgaHJlZj0iI2FkZHJlc3NlcyIgdGl0bGU9IlNlcnZlciBBZGRyZXNzZXMiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7U2VydmVyIEFkZHJlc3NlcyYjODIyMTs8L2E+LiBUaGUgcGVyLWJ1cyBhbmQgcGVyLWFkZHJlc3MgSURzIGFyZSBub3QgcmVsYXRlZC4KKyAgICAgICAgVGhlcmUgaXMgYWxzbyBhIHBlci1tYWNoaW5lIElELCBkZXNjcmliZWQgaW4gPGEgY2xhc3M9InhyZWYiIGhyZWY9IiNzdGFuZGFyZC1pbnRlcmZhY2VzLXBlZXIiIHRpdGxlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIj50aGUgc2VjdGlvbiBjYWxsZWQgJiM4MjIwOzxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyPC9jb2RlPiYjODIyMTs8L2E+IGFuZCByZXR1cm5lZAorICAgICAgICBieSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCgpLgorICAgICAgICBGb3IgYSBkZXNrdG9wIHNlc3Npb24gYnVzLCB0aGUgYnVzIElEIGNhbiBiZSB1c2VkIGFzIGEgd2F5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgdXNlcidzIHNlc3Npb24uCisgICAgICAgIDwvcD48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJnbG9zc2FyeSIgdGl0bGU9Ikdsb3NzYXJ5Ij48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJpZHA1Nzg4OTkyIj48L2E+R2xvc3Nhcnk8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgVGhpcyBnbG9zc2FyeSBkZWZpbmVzIHNvbWUgb2YgdGhlIHRlcm1zIHVzZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uLgorICAgIDwvcD48ZGw+PGR0PjxhIG5hbWU9InRlcm0tYnVzLW5hbWUiPjwvYT5CdXMgTmFtZTwvZHQ+PGRkPjxwPgorICAgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBtYWludGFpbnMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBuYW1lcyBhbmQKKyAgICAgICAgICBjb25uZWN0aW9ucy4gKE5vcm1hbGx5LCB0aGVyZSdzIG9uZSBjb25uZWN0aW9uIHBlciBhcHBsaWNhdGlvbi4pICBBCisgICAgICAgICAgYnVzIG5hbWUgaXMgc2ltcGx5IGFuIGlkZW50aWZpZXIgdXNlZCB0byBsb2NhdGUgY29ubmVjdGlvbnMuIEZvcgorICAgICAgICAgIGV4YW1wbGUsIHRoZSBoeXBvdGhldGljYWwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmNvbS55b3lvZHluZS5TY3JlZW5zYXZlcjwvY29kZT4KKyAgICAgICAgICBuYW1lIG1pZ2h0IGJlIHVzZWQgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBzY3JlZW5zYXZlciBmcm9tIFlveW9keW5lCisgICAgICAgICAgQ29ycG9yYXRpb24uICBBbiBhcHBsaWNhdGlvbiBpcyBzYWlkIHRvIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5vd248L2VtPiBhCisgICAgICAgICAgbmFtZSBpZiB0aGUgbWVzc2FnZSBidXMgaGFzIGFzc29jaWF0ZWQgdGhlIGFwcGxpY2F0aW9uJ3MgY29ubmVjdGlvbgorICAgICAgICAgIHdpdGggdGhlIG5hbWUuICBOYW1lcyBtYXkgYWxzbyBoYXZlIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5xdWV1ZWQKKyAgICAgICAgICBvd25lcnM8L2VtPiAoc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjdGVybS1xdWV1ZWQtb3duZXIiIHRpdGxlPSJRdWV1ZWQgTmFtZSBPd25lciI+UXVldWVkIE5hbWUgT3duZXI8L2E+KS4KKyAgICAgICAgICAgIFRoZSBidXMgYXNzaWducyBhIHVuaXF1ZSBuYW1lIHRvIGVhY2ggY29ubmVjdGlvbiwgCisgICAgICAgICAgICBzZWUgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiN0ZXJtLXVuaXF1ZS1uYW1lIiB0aXRsZT0iVW5pcXVlIENvbm5lY3Rpb24gTmFtZSI+VW5pcXVlIENvbm5lY3Rpb24gTmFtZTwvYT4uIE90aGVyIG5hbWVzIAorICAgICAgICAgICAgICBjYW4gYmUgdGhvdWdodCBvZiBhcyAid2VsbC1rbm93biBuYW1lcyIgYW5kIGFyZSAKKyAgICAgICAgICAgICAgdXNlZCB0byBmaW5kIGFwcGxpY2F0aW9ucyB0aGF0IG9mZmVyIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgIDwvcD48L2RkPjxkdD48YSBuYW1lPSJ0ZXJtLW1lc3NhZ2UiPjwvYT5NZXNzYWdlPC9kdD48ZGQ+PHA+CisgICAgICAgICAgQSBtZXNzYWdlIGlzIHRoZSBhdG9taWMgdW5pdCBvZiBjb21tdW5pY2F0aW9uIHZpYSB0aGUgRC1CdXMKKyAgICAgICAgICBwcm90b2NvbC4gSXQgY29uc2lzdHMgb2YgYSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+aGVhZGVyPC9lbT4gYW5kIGEKKyAgICAgICAgICA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+Ym9keTwvZW0+OyB0aGUgYm9keSBpcyBtYWRlIHVwIG9mCisgICAgICAgICAgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmFyZ3VtZW50czwvZW0+LgorICAgICAgICA8L3A+PC9kZD48ZHQ+PGEgbmFtZT0idGVybS1tZXNzYWdlLWJ1cyI+PC9hPk1lc3NhZ2UgQnVzPC9kdD48ZGQ+PHA+CisgICAgICAgICAgVGhlIG1lc3NhZ2UgYnVzIGlzIGEgc3BlY2lhbCBhcHBsaWNhdGlvbiB0aGF0IGZvcndhcmRzIAorICAgICAgICAgIG9yIHJvdXRlcyBtZXNzYWdlcyBiZXR3ZWVuIGEgZ3JvdXAgb2YgYXBwbGljYXRpb25zCisgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBtZXNzYWdlIGJ1cy4gSXQgYWxzbyBtYW5hZ2VzIAorICAgICAgICAgIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5uYW1lczwvZW0+IHVzZWQgZm9yIHJvdXRpbmcKKyAgICAgICAgICBtZXNzYWdlcy4KKyAgICAgICAgPC9wPjwvZGQ+PGR0PjxhIG5hbWU9InRlcm0tbmFtZSI+PC9hPk5hbWU8L2R0PjxkZD48cD4KKyAgICAgICAgICBTZWUgPGEgY2xhc3M9InhyZWYiIGhyZWY9IiN0ZXJtLWJ1cy1uYW1lIiB0aXRsZT0iQnVzIE5hbWUiPkJ1cyBOYW1lPC9hPi4gIk5hbWUiIG1heSAKKyAgICAgICAgICAgIGFsc28gYmUgdXNlZCB0byByZWZlciB0byBzb21lIG9mIHRoZSBvdGhlciBuYW1lcworICAgICAgICAgICAgaW4gRC1CdXMsIHN1Y2ggYXMgaW50ZXJmYWNlIG5hbWVzLgorICAgICAgICA8L3A+PC9kZD48ZHQ+PGEgbmFtZT0ibmFtZXNwYWNlIj48L2E+TmFtZXNwYWNlPC9kdD48ZGQ+PHA+CisgICAgICAgICAgVXNlZCB0byBwcmV2ZW50IGNvbGxpc2lvbnMgd2hlbiBkZWZpbmluZyBuZXcgaW50ZXJmYWNlcyBvciBidXMKKwkgIG5hbWVzLiBUaGUgY29udmVudGlvbiB1c2VkIGlzIHRoZSBzYW1lIG9uZSBKYXZhIHVzZXMgZm9yIGRlZmluaW5nCisJICBjbGFzc2VzOiBhIHJldmVyc2VkIGRvbWFpbiBuYW1lLgorICAgICAgICA8L3A+PC9kZD48ZHQ+PGEgbmFtZT0idGVybS1vYmplY3QiPjwvYT5PYmplY3Q8L2R0PjxkZD48cD4KKyAgICAgICAgICBFYWNoIGFwcGxpY2F0aW9uIGNvbnRhaW5zIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5vYmplY3RzPC9lbT4sIHdoaWNoIGhhdmUKKyAgICAgICAgICA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+aW50ZXJmYWNlczwvZW0+IGFuZAorICAgICAgICAgIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5tZXRob2RzPC9lbT4uIE9iamVjdHMgYXJlIHJlZmVycmVkIHRvIGJ5IGEgbmFtZSwKKyAgICAgICAgICBjYWxsZWQgYSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+cGF0aDwvZW0+LgorICAgICAgICA8L3A+PC9kZD48ZHQ+PGEgbmFtZT0ib25lLXRvLW9uZSI+PC9hPk9uZS10by1PbmU8L2R0PjxkZD48cD4KKyAgICAgICAgICBBbiBhcHBsaWNhdGlvbiB0YWxraW5nIGRpcmVjdGx5IHRvIGFub3RoZXIgYXBwbGljYXRpb24sIHdpdGhvdXQgZ29pbmcKKyAgICAgICAgICB0aHJvdWdoIGEgbWVzc2FnZSBidXMuIE9uZS10by1vbmUgY29ubmVjdGlvbnMgbWF5IGJlICJwZWVyIHRvIHBlZXIiIG9yCisgICAgICAgICAgImNsaWVudCB0byBzZXJ2ZXIuIiBUaGUgRC1CdXMgcHJvdG9jb2wgaGFzIG5vIGNvbmNlcHQgb2YgY2xpZW50CisgICAgICAgICAgdnMuIHNlcnZlciBhZnRlciBhIGNvbm5lY3Rpb24gaGFzIGF1dGhlbnRpY2F0ZWQ7IHRoZSBmbG93IG9mIG1lc3NhZ2VzCisgICAgICAgICAgaXMgc3ltbWV0cmljYWwgKGZ1bGwgZHVwbGV4KS4KKyAgICAgICAgPC9wPjwvZGQ+PGR0PjxhIG5hbWU9InRlcm0tcGF0aCI+PC9hPlBhdGg8L2R0PjxkZD48cD4KKyAgICAgICAgICBPYmplY3QgcmVmZXJlbmNlcyAob2JqZWN0IG5hbWVzKSBpbiBELUJ1cyBhcmUgb3JnYW5pemVkIGludG8gYQorICAgICAgICAgIGZpbGVzeXN0ZW0tc3R5bGUgaGllcmFyY2h5LCBzbyBlYWNoIG9iamVjdCBpcyBuYW1lZCBieSBhIHBhdGguIEFzIGluCisgICAgICAgICAgTERBUCwgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4gImZpbGVzIiBhbmQgImRpcmVjdG9yaWVzIjsgYSBwYXRoCisgICAgICAgICAgY2FuIHJlZmVyIHRvIGFuIG9iamVjdCwgd2hpbGUgc3RpbGwgaGF2aW5nIGNoaWxkIG9iamVjdHMgYmVsb3cgaXQuCisgICAgICAgIDwvcD48L2RkPjxkdD48YSBuYW1lPSJ0ZXJtLXF1ZXVlZC1vd25lciI+PC9hPlF1ZXVlZCBOYW1lIE93bmVyPC9kdD48ZGQ+PHA+CisgICAgICAgICAgRWFjaCBidXMgbmFtZSBoYXMgYSBwcmltYXJ5IG93bmVyOyBtZXNzYWdlcyBzZW50IHRvIHRoZSBuYW1lIGdvIHRvIHRoZQorICAgICAgICAgIHByaW1hcnkgb3duZXIuIEhvd2V2ZXIsIGNlcnRhaW4gbmFtZXMgYWxzbyBtYWludGFpbiBhIHF1ZXVlIG9mCisgICAgICAgICAgc2Vjb25kYXJ5IG93bmVycyAid2FpdGluZyBpbiB0aGUgd2luZ3MuIiBJZiB0aGUgcHJpbWFyeSBvd25lciByZWxlYXNlcworICAgICAgICAgIHRoZSBuYW1lLCB0aGVuIHRoZSBmaXJzdCBzZWNvbmRhcnkgb3duZXIgaW4gdGhlIHF1ZXVlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICBiZWNvbWVzIHRoZSBuZXcgb3duZXIgb2YgdGhlIG5hbWUuCisgICAgICAgIDwvcD48L2RkPjxkdD48YSBuYW1lPSJ0ZXJtLXNlcnZpY2UiPjwvYT5TZXJ2aWNlPC9kdD48ZGQ+PHA+CisgICAgICAgICAgQSBzZXJ2aWNlIGlzIGFuIGV4ZWN1dGFibGUgdGhhdCBjYW4gYmUgbGF1bmNoZWQgYnkgdGhlIGJ1cyBkYWVtb24uCisgICAgICAgICAgU2VydmljZXMgbm9ybWFsbHkgZ3VhcmFudGVlIHNvbWUgcGFydGljdWxhciBmZWF0dXJlcywgZm9yIGV4YW1wbGUgdGhleQorICAgICAgICAgIG1heSBndWFyYW50ZWUgdGhhdCB0aGV5IHdpbGwgcmVxdWVzdCBhIHNwZWNpZmljIG5hbWUgc3VjaCBhcworICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuU2NyZWVuc2F2ZXIiLCBoYXZlIGEgc2luZ2xldG9uIG9iamVjdAorICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL0FwcGxpY2F0aW9uIiwgYW5kIHRoYXQgb2JqZWN0IHdpbGwgaW1wbGVtZW50IHRoZQorICAgICAgICAgIGludGVyZmFjZSAib3JnLmZyZWVkZXNrdG9wLlNjcmVlbnNhdmVyQ29udHJvbCIuCisgICAgICAgIDwvcD48L2RkPjxkdD48YSBuYW1lPSJ0ZXJtLXNlcnZpY2UtZGVzY3JpcHRpb24tZmlsZXMiPjwvYT5TZXJ2aWNlIERlc2NyaXB0aW9uIEZpbGVzPC9kdD48ZGQ+PHA+CisgICAgICAgICAgIi5zZXJ2aWNlIGZpbGVzIiB0ZWxsIHRoZSBidXMgYWJvdXQgc2VydmljZSBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gYmUKKyAgICAgICAgICBsYXVuY2hlZCAoc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjdGVybS1zZXJ2aWNlIiB0aXRsZT0iU2VydmljZSI+U2VydmljZTwvYT4pLiBNb3N0IGltcG9ydGFudGx5IHRoZXkKKyAgICAgICAgICBwcm92aWRlIGEgbWFwcGluZyBmcm9tIGJ1cyBuYW1lcyB0byBzZXJ2aWNlcyB0aGF0IHdpbGwgcmVxdWVzdCB0aG9zZQorICAgICAgICAgICAgbmFtZXMgd2hlbiB0aGV5IHN0YXJ0IHVwLgorICAgICAgICA8L3A+PC9kZD48ZHQ+PGEgbmFtZT0idGVybS11bmlxdWUtbmFtZSI+PC9hPlVuaXF1ZSBDb25uZWN0aW9uIE5hbWU8L2R0PjxkZD48cD4KKyAgICAgICAgICBUaGUgc3BlY2lhbCBuYW1lIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8gZWFjaCBjb25uZWN0aW9uIGJ5IHRoZQorICAgICAgICAgIG1lc3NhZ2UgYnVzLiBUaGlzIG5hbWUgd2lsbCBuZXZlciBjaGFuZ2Ugb3duZXIsIGFuZCB3aWxsIGJlIHVuaXF1ZQorICAgICAgICAgIChuZXZlciByZXVzZWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgbWVzc2FnZSBidXMpLgorICAgICAgICAgIEl0IHdpbGwgYmVnaW4gd2l0aCBhICc6JyBjaGFyYWN0ZXIuCisgICAgICAgIDwvcD48L2RkPjwvZGw+PC9kaXY+PGRpdiBjbGFzcz0iZm9vdG5vdGVzIj48YnI+PGhyIHdpZHRoPSIxMDAiIGFsaWduPSJsZWZ0Ij48ZGl2IGNsYXNzPSJmb290bm90ZSI+PHA+PHN1cD5bPGEgbmFtZT0iZnRuLmlkcDUyNjA1NzYiIGhyZWY9IiNpZHA1MjYwNTc2IiBjbGFzcz0icGFyYSI+MTwvYT5dIDwvc3VwPkxvY2tmaWxlcyBhcmUgdXNlZCBpbnN0ZWFkIG9mIHJlYWwgZmlsZQorICAgICAgICAgICAgICAgIGxvY2tpbmcgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmZjbnRsKCk8L2NvZGU+IGJlY2F1c2UgcmVhbCBsb2NraW5nCisgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIGFyZSBzdGlsbCBmbGFreSBvbiBuZXR3b3JrCisgICAgICAgICAgICAgICAgZmlsZXN5c3RlbXMuPC9wPjwvZGl2PjxkaXYgY2xhc3M9ImZvb3Rub3RlIj48cD48c3VwPls8YSBuYW1lPSJmdG4uaWRwNTYyMzM5MiIgaHJlZj0iI2lkcDU2MjMzOTIiIGNsYXNzPSJwYXJhIj4yPC9hPl0gPC9zdXA+CisgICAgICAgICAgICAgIFRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgaG9ub3JzIHRoZSAKKyAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPiQobG9jYWxzdGF0ZWRpcik8L2NvZGU+IGNvbmZpZ3VyZSBvcHRpb24gCisgICAgICAgICAgICAgIGZvciB0aGlzIGFkZHJlc3MsIG9uIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZS4KKyAgICAgICAgICAgIDwvcD48L2Rpdj48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWwgYi9kYnVzLTEuNC4xMC9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzZiNjRiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWwKQEAgLTAsMCArMSw0OTYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIiA/PgorPCFET0NUWVBFIGFydGljbGUgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiCitbCitdPgorPGFydGljbGUgaWQ9ImluZGV4Ij4KKyAgPGFydGljbGVpbmZvPgorICAgIDx0aXRsZT5ELUJ1cyBTcGVjaWZpY2F0aW9uPC90aXRsZT4KKyAgICA8cmVsZWFzZWluZm8+VmVyc2lvbiAwLjE1PC9yZWxlYXNlaW5mbz4KKyAgICA8ZGF0ZT4zIE5vdmVtYmVyIDIwMTA8L2RhdGU+CisgICAgPGF1dGhvcmdyb3VwPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkhhdm9jPC9maXJzdG5hbWU+CisJPHN1cm5hbWU+UGVubmluZ3Rvbjwvc3VybmFtZT4KKwk8YWZmaWxpYXRpb24+CisJICA8b3JnbmFtZT5SZWQgSGF0LCBJbmMuPC9vcmduYW1lPgorCSAgPGFkZHJlc3M+CisJICAgIDxlbWFpbD5ocEBwb2JveC5jb208L2VtYWlsPgorCSAgPC9hZGRyZXNzPgorCTwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5BbmRlcnM8L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5DYXJsc3Nvbjwvc3VybmFtZT4KKwk8YWZmaWxpYXRpb24+CisJICA8b3JnbmFtZT5Db2RlRmFjdG9yeSBBQjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisJPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkFsZXhhbmRlcjwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPkxhcnNzb248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPmFsZXhsQHJlZGhhdC5jb208L2VtYWlsPgorICAgICAgICAgIDwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+U3ZlbjwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPkhlcnpiZXJnPC9zdXJuYW1lPgorCTxhZmZpbGlhdGlvbj4KKwkgIDxvcmduYW1lPkltZW5kaW8gQUI8L29yZ25hbWU+CisJICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5zdmVuQGltZW5kaW8uY29tPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisJPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvYXV0aG9yZ3JvdXA+CisgICA8cmV2aGlzdG9yeT4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+Y3VycmVudDwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjx1bGluayB1cmw9J2h0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9kYnVzL2RidXMvbG9nL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sJz5jb21taXQgbG9nPC91bGluaz48L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xNTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjMgTm92ZW1iZXIgMjAxMDwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjE0PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MTIgTWF5IDIwMTA8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xMzwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIzIERlemVtYmVyIDIwMDk8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xMjwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjcgTm92ZW1iZXIsIDIwMDY8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4xMTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjYgRmVicnVhcnkgMjAwNTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjEwPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjggSmFudWFyeSAyMDA1PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuOTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjcgSmFudWFyIDIwMDU8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC44PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MDYgU2VwdGVtYmVyIDIwMDM8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5GaXJzdCByZWxlYXNlZCBkb2N1bWVudC48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgIDwvcmV2aGlzdG9yeT4KKyAgPC9hcnRpY2xlaW5mbz4KKworICA8c2VjdDEgaWQ9ImludHJvZHVjdGlvbiI+CisgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBELUJ1cyBpcyBhIHN5c3RlbSBmb3IgbG93LWxhdGVuY3ksIGxvdy1vdmVyaGVhZCwgZWFzeSB0byB1c2UKKyAgICAgIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIChJUEMpLiBJbiBtb3JlIGRldGFpbDoKKyAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEQtQnVzIGlzIDxlbXBoYXNpcz5sb3ctbGF0ZW5jeTwvZW1waGFzaXM+IGJlY2F1c2UgaXQgaXMgZGVzaWduZWQgCisgICAgICAgICAgICB0byBhdm9pZCByb3VuZCB0cmlwcyBhbmQgYWxsb3cgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiwgbXVjaCBsaWtlIAorICAgICAgICAgICAgdGhlIFggcHJvdG9jb2wuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBELUJ1cyBpcyA8ZW1waGFzaXM+bG93LW92ZXJoZWFkPC9lbXBoYXNpcz4gYmVjYXVzZSBpdCB1c2VzIGEKKyAgICAgICAgICAgIGJpbmFyeSBwcm90b2NvbCwgYW5kIGRvZXMgbm90IGhhdmUgdG8gY29udmVydCB0byBhbmQgZnJvbSBhIHRleHQKKyAgICAgICAgICAgIGZvcm1hdCBzdWNoIGFzIFhNTC4gQmVjYXVzZSBELUJ1cyBpcyBpbnRlbmRlZCBmb3IgcG90ZW50aWFsbHkKKyAgICAgICAgICAgIGhpZ2gtcmVzb2x1dGlvbiBzYW1lLW1hY2hpbmUgSVBDLCBub3QgcHJpbWFyaWx5IGZvciBJbnRlcm5ldCBJUEMsCisgICAgICAgICAgICB0aGlzIGlzIGFuIGludGVyZXN0aW5nIG9wdGltaXphdGlvbi4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEQtQnVzIGlzIDxlbXBoYXNpcz5lYXN5IHRvIHVzZTwvZW1waGFzaXM+IGJlY2F1c2UgaXQgd29ya3MgaW4gdGVybXMKKyAgICAgICAgICAgIG9mIDxmaXJzdHRlcm0+bWVzc2FnZXM8L2ZpcnN0dGVybT4gcmF0aGVyIHRoYW4gYnl0ZSBzdHJlYW1zLCBhbmQKKyAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBhIGxvdCBvZiB0aGUgaGFyZCBJUEMgaXNzdWVzLiBBbHNvLCB0aGUgRC1CdXMKKyAgICAgICAgICAgIGxpYnJhcnkgaXMgZGVzaWduZWQgdG8gYmUgd3JhcHBlZCBpbiBhIHdheSB0aGF0IGxldHMgZGV2ZWxvcGVycyB1c2UKKyAgICAgICAgICAgIHRoZWlyIGZyYW1ld29yaydzIGV4aXN0aW5nIG9iamVjdC90eXBlIHN5c3RlbSwgcmF0aGVyIHRoYW4gbGVhcm5pbmcKKyAgICAgICAgICAgIGEgbmV3IG9uZSBzcGVjaWZpY2FsbHkgZm9yIElQQy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBiYXNlIEQtQnVzIHByb3RvY29sIGlzIGEgb25lLXRvLW9uZSAocGVlci10by1wZWVyIG9yIGNsaWVudC1zZXJ2ZXIpCisgICAgICBwcm90b2NvbCwgc3BlY2lmaWVkIGluIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wiLz4uIFRoYXQgaXMsIGl0IGlzCisgICAgICBhIHN5c3RlbSBmb3Igb25lIGFwcGxpY2F0aW9uIHRvIHRhbGsgdG8gYSBzaW5nbGUgb3RoZXIKKyAgICAgIGFwcGxpY2F0aW9uLiBIb3dldmVyLCB0aGUgcHJpbWFyeSBpbnRlbmRlZCBhcHBsaWNhdGlvbiBvZiB0aGUgcHJvdG9jb2wgaXMgdGhlCisgICAgICBELUJ1cyA8Zmlyc3R0ZXJtPm1lc3NhZ2UgYnVzPC9maXJzdHRlcm0+LCBzcGVjaWZpZWQgaW4gPHhyZWYKKyAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzIi8+LiBUaGUgbWVzc2FnZSBidXMgaXMgYSBzcGVjaWFsIGFwcGxpY2F0aW9uIHRoYXQKKyAgICAgIGFjY2VwdHMgY29ubmVjdGlvbnMgZnJvbSBtdWx0aXBsZSBvdGhlciBhcHBsaWNhdGlvbnMsIGFuZCBmb3J3YXJkcworICAgICAgbWVzc2FnZXMgYW1vbmcgdGhlbS4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFVzZXMgb2YgRC1CdXMgaW5jbHVkZSBub3RpZmljYXRpb24gb2Ygc3lzdGVtIGNoYW5nZXMgKG5vdGlmaWNhdGlvbiBvZiB3aGVuCisgICAgICBhIGNhbWVyYSBpcyBwbHVnZ2VkIGluIHRvIGEgY29tcHV0ZXIsIG9yIGEgbmV3IHZlcnNpb24gb2Ygc29tZSBzb2Z0d2FyZQorICAgICAgaGFzIGJlZW4gaW5zdGFsbGVkKSwgb3IgZGVza3RvcCBpbnRlcm9wZXJhYmlsaXR5LCBmb3IgZXhhbXBsZSBhIGZpbGUKKyAgICAgIG1vbml0b3Jpbmcgc2VydmljZSBvciBhIGNvbmZpZ3VyYXRpb24gc2VydmljZS4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIEQtQnVzIGlzIGRlc2lnbmVkIGZvciB0d28gc3BlY2lmaWMgdXNlIGNhc2VzOgorICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSAic3lzdGVtIGJ1cyIgZm9yIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgc3lzdGVtIHRvIHVzZXIgc2Vzc2lvbnMsCisgICAgICAgICAgICBhbmQgdG8gYWxsb3cgdGhlIHN5c3RlbSB0byByZXF1ZXN0IGlucHV0IGZyb20gdXNlciBzZXNzaW9ucy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgInNlc3Npb24gYnVzIiB1c2VkIHRvIGltcGxlbWVudCBkZXNrdG9wIGVudmlyb25tZW50cyBzdWNoIGFzIAorICAgICAgICAgICAgR05PTUUgYW5kIEtERS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIEQtQnVzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIGdlbmVyaWMgSVBDIHN5c3RlbSBmb3IgYW55IHBvc3NpYmxlIAorICAgICAgYXBwbGljYXRpb24sIGFuZCBpbnRlbnRpb25hbGx5IG9taXRzIG1hbnkgZmVhdHVyZXMgZm91bmQgaW4gb3RoZXIgCisgICAgICBJUEMgc3lzdGVtcyBmb3IgdGhpcyByZWFzb24uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBBdCB0aGUgc2FtZSB0aW1lLCB0aGUgYnVzIGRhZW1vbnMgb2ZmZXIgYSBudW1iZXIgb2YgZmVhdHVyZXMgbm90IGZvdW5kIGluCisgICAgICBvdGhlciBJUEMgc3lzdGVtcywgc3VjaCBhcyBzaW5nbGUtb3duZXIgImJ1cyBuYW1lcyIgKHNpbWlsYXIgdG8gWAorICAgICAgc2VsZWN0aW9ucyksIG9uLWRlbWFuZCBzdGFydHVwIG9mIHNlcnZpY2VzLCBhbmQgc2VjdXJpdHkgcG9saWNpZXMuCisgICAgICBJbiBtYW55IHdheXMsIHRoZXNlIGZlYXR1cmVzIGFyZSB0aGUgcHJpbWFyeSBtb3RpdmF0aW9uIGZvciBkZXZlbG9waW5nIAorICAgICAgRC1CdXM7IG90aGVyIHN5c3RlbXMgd291bGQgaGF2ZSBzdWZmaWNlZCBpZiBJUEMgd2VyZSB0aGUgb25seSBnb2FsLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgRC1CdXMgbWF5IHR1cm4gb3V0IHRvIGJlIHVzZWZ1bCBpbiB1bmFudGljaXBhdGVkIGFwcGxpY2F0aW9ucywgYnV0IGZ1dHVyZQorICAgICAgdmVyc2lvbnMgb2YgdGhpcyBzcGVjIGFuZCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHByb2JhYmx5IHdpbGwgbm90CisgICAgICBpbmNvcnBvcmF0ZSBmZWF0dXJlcyB0aGF0IGludGVyZmVyZSB3aXRoIHRoZSBjb3JlIHVzZSBjYXNlcy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBrZXkgd29yZHMgIk1VU1QiLCAiTVVTVCBOT1QiLCAiUkVRVUlSRUQiLCAiU0hBTEwiLCAiU0hBTEwgTk9UIiwKKyAgICAgICJTSE9VTEQiLCAiU0hPVUxEIE5PVCIsICJSRUNPTU1FTkRFRCIsICJNQVkiLCBhbmQgIk9QVElPTkFMIiBpbiB0aGlzCisgICAgICBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFJGQyAyMTE5LiBIb3dldmVyLCB0aGUKKyAgICAgIGRvY3VtZW50IGNvdWxkIHVzZSBhIHNlcmlvdXMgYXVkaXQgdG8gYmUgc3VyZSBpdCBtYWtlcyBzZW5zZSB0byBkbworICAgICAgc28uIEFsc28sIHRoZXkgYXJlIG5vdCBjYXBpdGFsaXplZC4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9InN0YWJpbGl0eSI+CisgICAgICA8dGl0bGU+UHJvdG9jb2wgYW5kIFNwZWNpZmljYXRpb24gU3RhYmlsaXR5PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgRC1CdXMgcHJvdG9jb2wgaXMgZnJvemVuIChvbmx5IGNvbXBhdGlibGUgZXh0ZW5zaW9ucyBhcmUgYWxsb3dlZCkgYXMKKyAgICAgICAgb2YgTm92ZW1iZXIgOCwgMjAwNi4gIEhvd2V2ZXIsIHRoaXMgc3BlY2lmaWNhdGlvbiBjb3VsZCBzdGlsbCB1c2UgYSBmYWlyCisgICAgICAgIGJpdCBvZiB3b3JrIHRvIG1ha2UgaW50ZXJvcGVyYWJsZSByZWltcGxlbWVudGF0aW9uIHBvc3NpYmxlIHdpdGhvdXQKKyAgICAgICAgcmVmZXJlbmNlIHRvIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uIFRodXMsIHRoaXMKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBpcyBub3QgbWFya2VkIDEuMC4gVG8gbWFyayBpdCAxLjAsIHdlJ2QgbGlrZSB0byBzZWUKKyAgICAgICAgc29tZW9uZSBpbnZlc3Qgc2lnbmlmaWNhbnQgZWZmb3J0IGluIGNsYXJpZnlpbmcgdGhlIHNwZWNpZmljYXRpb24KKyAgICAgICAgbGFuZ3VhZ2UsIGFuZCBncm93aW5nIHRoZSBzcGVjaWZpY2F0aW9uIHRvIGNvdmVyIG1vcmUgYXNwZWN0cyBvZiB0aGUKKyAgICAgICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uJ3MgYmVoYXZpb3IuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVW50aWwgdGhpcyB3b3JrIGlzIGNvbXBsZXRlLCBhbnkgYXR0ZW1wdCB0byByZWltcGxlbWVudCBELUJ1cyB3aWxsIAorICAgICAgICBwcm9iYWJseSByZXF1aXJlIGxvb2tpbmcgYXQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhbmQvb3IgYXNraW5nCisgICAgICAgIHF1ZXN0aW9ucyBvbiB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IGFib3V0IGludGVuZGVkIGJlaGF2aW9yLiAKKyAgICAgICAgUXVlc3Rpb25zIG9uIHRoZSBsaXN0IGFyZSB2ZXJ5IHdlbGNvbWUuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgTm9uZXRoZWxlc3MsIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGJlIGEgdXNlZnVsIHN0YXJ0aW5nIHBvaW50IGFuZCBpcyAKKyAgICAgICAgdG8gb3VyIGtub3dsZWRnZSBhY2N1cmF0ZSwgdGhvdWdoIGluY29tcGxldGUuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICAKKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wiPgorICAgIDx0aXRsZT5NZXNzYWdlIFByb3RvY29sPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgQSA8Zmlyc3R0ZXJtPm1lc3NhZ2U8L2ZpcnN0dGVybT4gY29uc2lzdHMgb2YgYQorICAgICAgPGZpcnN0dGVybT5oZWFkZXI8L2ZpcnN0dGVybT4gYW5kIGEgPGZpcnN0dGVybT5ib2R5PC9maXJzdHRlcm0+LiBJZiB5b3UKKyAgICAgIHRoaW5rIG9mIGEgbWVzc2FnZSBhcyBhIHBhY2thZ2UsIHRoZSBoZWFkZXIgaXMgdGhlIGFkZHJlc3MsIGFuZCB0aGUgYm9keQorICAgICAgY29udGFpbnMgdGhlIHBhY2thZ2UgY29udGVudHMuIFRoZSBtZXNzYWdlIGRlbGl2ZXJ5IHN5c3RlbSB1c2VzIHRoZSBoZWFkZXIKKyAgICAgIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gc2VuZCB0aGUgbWVzc2FnZSBhbmQgaG93IHRvIGludGVycHJldAorICAgICAgaXQ7IHRoZSByZWNpcGllbnQgaW50ZXJwcmV0cyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KKyAgICA8L3BhcmE+CisgICAgCisgICAgPHBhcmE+CisgICAgICBUaGUgYm9keSBvZiB0aGUgbWVzc2FnZSBpcyBtYWRlIHVwIG9mIHplcm8gb3IgbW9yZQorICAgICAgPGZpcnN0dGVybT5hcmd1bWVudHM8L2ZpcnN0dGVybT4sIHdoaWNoIGFyZSB0eXBlZCB2YWx1ZXMsIHN1Y2ggYXMgYW4KKyAgICAgIGludGVnZXIgb3IgYSBieXRlIGFycmF5LgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgQm90aCBoZWFkZXIgYW5kIGJvZHkgdXNlIHRoZSBzYW1lIHR5cGUgc3lzdGVtIGFuZCBmb3JtYXQgZm9yIAorICAgICAgc2VyaWFsaXppbmcgZGF0YS4gRWFjaCB0eXBlIG9mIHZhbHVlIGhhcyBhIHdpcmUgZm9ybWF0LiAKKyAgICAgIENvbnZlcnRpbmcgYSB2YWx1ZSBmcm9tIHNvbWUgb3RoZXIgcmVwcmVzZW50YXRpb24gaW50byB0aGUgd2lyZQorICAgICAgZm9ybWF0IGlzIGNhbGxlZCA8Zmlyc3R0ZXJtPm1hcnNoYWxpbmc8L2ZpcnN0dGVybT4gYW5kIGNvbnZlcnRpbmcKKyAgICAgIGl0IGJhY2sgZnJvbSB0aGUgd2lyZSBmb3JtYXQgaXMgPGZpcnN0dGVybT51bm1hcnNoYWxpbmc8L2ZpcnN0dGVybT4uCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLXNpZ25hdHVyZXMiPgorICAgICAgPHRpdGxlPlR5cGUgU2lnbmF0dXJlczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgRC1CdXMgcHJvdG9jb2wgZG9lcyBub3QgaW5jbHVkZSB0eXBlIHRhZ3MgaW4gdGhlIG1hcnNoYWxlZCBkYXRhOyBhCisgICAgICAgIGJsb2NrIG9mIG1hcnNoYWxlZCB2YWx1ZXMgbXVzdCBoYXZlIGEga25vd24gPGZpcnN0dGVybT50eXBlCisgICAgICAgIHNpZ25hdHVyZTwvZmlyc3R0ZXJtPi4gIFRoZSB0eXBlIHNpZ25hdHVyZSBpcyBtYWRlIHVwIG9mIDxmaXJzdHRlcm0+dHlwZQorICAgICAgICBjb2RlczwvZmlyc3R0ZXJtPi4gQSB0eXBlIGNvZGUgaXMgYW4gQVNDSUkgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUKKyAgICAgICAgdHlwZSBvZiBhIHZhbHVlLiBCZWNhdXNlIEFTQ0lJIGNoYXJhY3RlcnMgYXJlIHVzZWQsIHRoZSB0eXBlIHNpZ25hdHVyZQorICAgICAgICB3aWxsIGFsd2F5cyBmb3JtIGEgdmFsaWQgQVNDSUkgc3RyaW5nLiBBIHNpbXBsZSBzdHJpbmcgY29tcGFyZSAKKyAgICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB0eXBlIHNpZ25hdHVyZXMgYXJlIGVxdWl2YWxlbnQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBcyBhIHNpbXBsZSBleGFtcGxlLCB0aGUgdHlwZSBjb2RlIGZvciAzMi1iaXQgaW50ZWdlciAoPGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+KSBpcworICAgICAgICB0aGUgQVNDSUkgY2hhcmFjdGVyICdpJy4gU28gdGhlIHNpZ25hdHVyZSBmb3IgYSBibG9jayBvZiB2YWx1ZXMgCisgICAgICAgIGNvbnRhaW5pbmcgYSBzaW5nbGUgPGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+IHdvdWxkIGJlOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgImkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIEEgYmxvY2sgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdHdvIDxsaXRlcmFsPklOVDMyPC9saXRlcmFsPiB3b3VsZCBoYXZlIHRoaXMgc2lnbmF0dXJlOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgImlpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPiAgICAgICAgCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBbGwgPGZpcnN0dGVybT5iYXNpYzwvZmlyc3R0ZXJtPiB0eXBlcyB3b3JrIGxpa2UgCisgICAgICAgIDxsaXRlcmFsPklOVDMyPC9saXRlcmFsPiBpbiB0aGlzIGV4YW1wbGUuIFRvIG1hcnNoYWwgYW5kIHVubWFyc2hhbCAKKyAgICAgICAgYmFzaWMgdHlwZXMsIHlvdSBzaW1wbHkgcmVhZCBvbmUgdmFsdWUgZnJvbSB0aGUgZGF0YQorICAgICAgICBibG9jayBjb3JyZXNwb25kaW5nIHRvIGVhY2ggdHlwZSBjb2RlIGluIHRoZSBzaWduYXR1cmUuCisgICAgICAgIEluIGFkZGl0aW9uIHRvIGJhc2ljIHR5cGVzLCB0aGVyZSBhcmUgZm91ciA8Zmlyc3R0ZXJtPmNvbnRhaW5lcjwvZmlyc3R0ZXJtPiAKKyAgICAgICAgdHlwZXM6IDxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD4sIDxsaXRlcmFsPkFSUkFZPC9saXRlcmFsPiwgPGxpdGVyYWw+VkFSSUFOVDwvbGl0ZXJhbD4sIAorICAgICAgICBhbmQgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8bGl0ZXJhbD5TVFJVQ1Q8L2xpdGVyYWw+IGhhcyBhIHR5cGUgY29kZSwgQVNDSUkgY2hhcmFjdGVyICdyJywgYnV0IHRoaXMgdHlwZSAKKyAgICAgICAgY29kZSBkb2VzIG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcy4gSW5zdGVhZCwgQVNDSUkgY2hhcmFjdGVycworICAgICAgICAnKCcgYW5kICcpJyBhcmUgdXNlZCB0byBtYXJrIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgc3RydWN0LgorICAgICAgICBTbyBmb3IgZXhhbXBsZSwgYSBzdHJ1Y3QgY29udGFpbmluZyB0d28gaW50ZWdlcnMgd291bGQgaGF2ZSB0aGlzIAorICAgICAgICBzaWduYXR1cmU6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiKGlpKSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgU3RydWN0cyBjYW4gYmUgbmVzdGVkLCBzbyBmb3IgZXhhbXBsZSBhIHN0cnVjdCBjb250YWluaW5nIAorICAgICAgICBhbiBpbnRlZ2VyIGFuZCBhbm90aGVyIHN0cnVjdDoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICIoaShpaSkpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBUaGUgdmFsdWUgYmxvY2sgc3RvcmluZyB0aGF0IHN0cnVjdCB3b3VsZCBjb250YWluIHRocmVlIGludGVnZXJzOyB0aGUKKyAgICAgICAgdHlwZSBzaWduYXR1cmUgYWxsb3dzIHlvdSB0byBkaXN0aW5ndWlzaCAiKGkoaWkpKSIgZnJvbSAiKChpaSlpKSIgb3IKKyAgICAgICAgIihpaWkpIiBvciAiaWlpIi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSA8bGl0ZXJhbD5TVFJVQ1Q8L2xpdGVyYWw+IHR5cGUgY29kZSAncicgaXMgbm90IGN1cnJlbnRseSB1c2VkIGluIHRoZSBELUJ1cyBwcm90b2NvbCwKKyAgICAgICAgYnV0IGlzIHVzZWZ1bCBpbiBjb2RlIHRoYXQgaW1wbGVtZW50cyB0aGUgcHJvdG9jb2wuIFRoaXMgdHlwZSBjb2RlIAorICAgICAgICBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgc3VjaCBjb2RlIHRvIGludGVyb3BlcmF0ZSBpbiBub24tcHJvdG9jb2wgY29udGV4dHMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBFbXB0eSBzdHJ1Y3R1cmVzIGFyZSBub3QgYWxsb3dlZDsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUKKyAgICAgICAgdHlwZSBjb2RlIGJldHdlZW4gdGhlIHBhcmVudGhlc2VzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgPGxpdGVyYWw+QVJSQVk8L2xpdGVyYWw+IGhhcyBBU0NJSSBjaGFyYWN0ZXIgJ2EnIGFzIHR5cGUgY29kZS4gVGhlIGFycmF5IHR5cGUgY29kZSBtdXN0IGJlCisgICAgICAgIGZvbGxvd2VkIGJ5IGEgPGZpcnN0dGVybT5zaW5nbGUgY29tcGxldGUgdHlwZTwvZmlyc3R0ZXJtPi4gVGhlIHNpbmdsZQorICAgICAgICBjb21wbGV0ZSB0eXBlIGZvbGxvd2luZyB0aGUgYXJyYXkgaXMgdGhlIHR5cGUgb2YgZWFjaCBhcnJheSBlbGVtZW50LiBTbworICAgICAgICB0aGUgc2ltcGxlIGV4YW1wbGUgaXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiYWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIHdoaWNoIGlzIGFuIGFycmF5IG9mIDMyLWJpdCBpbnRlZ2Vycy4gQnV0IGFuIGFycmF5IGNhbiBiZSBvZiBhbnkgdHlwZSwgCisgICAgICAgIHN1Y2ggYXMgdGhpcyBhcnJheS1vZi1zdHJ1Y3Qtd2l0aC10d28taW50MzItZmllbGRzOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgImEoaWkpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBPciB0aGlzIGFycmF5IG9mIGFycmF5IG9mIGludGVnZXI6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiYWFpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHBocmFzZSA8Zmlyc3R0ZXJtPnNpbmdsZSBjb21wbGV0ZSB0eXBlPC9maXJzdHRlcm0+IGRlc2VydmVzIHNvbWUgCisgICAgICAgIGRlZmluaXRpb24uIEEgc2luZ2xlIGNvbXBsZXRlIHR5cGUgaXMgYSBiYXNpYyB0eXBlIGNvZGUsIGEgdmFyaWFudCB0eXBlIGNvZGUsIAorICAgICAgICBhbiBhcnJheSB3aXRoIGl0cyBlbGVtZW50IHR5cGUsIG9yIGEgc3RydWN0IHdpdGggaXRzIGZpZWxkcy4gCisgICAgICAgIFNvIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlcyBhcmUgbm90IHNpbmdsZSBjb21wbGV0ZSB0eXBlczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJhYSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICIoaWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiaWkpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBBbmQgdGhlIGZvbGxvd2luZyBzaWduYXR1cmVzIGNvbnRhaW4gbXVsdGlwbGUgY29tcGxldGUgdHlwZXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiaWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiYWlhaSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICIoaWkpKGlpKSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgTm90ZSBob3dldmVyIHRoYXQgYSBzaW5nbGUgY29tcGxldGUgdHlwZSBtYXkgPGVtcGhhc2lzPmNvbnRhaW48L2VtcGhhc2lzPgorICAgICAgICBtdWx0aXBsZSBvdGhlciBzaW5nbGUgY29tcGxldGUgdHlwZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPiBoYXMgQVNDSUkgY2hhcmFjdGVyICd2JyBhcyBpdHMgdHlwZSBjb2RlLiBBIG1hcnNoYWxlZCB2YWx1ZSBvZgorICAgICAgICB0eXBlIDxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+IHdpbGwgaGF2ZSB0aGUgc2lnbmF0dXJlIG9mIGEgc2luZ2xlIGNvbXBsZXRlIHR5cGUgYXMgcGFydAorICAgICAgICBvZiB0aGUgPGVtcGhhc2lzPnZhbHVlPC9lbXBoYXNpcz4uICBUaGlzIHNpZ25hdHVyZSB3aWxsIGJlIGZvbGxvd2VkIGJ5IGEKKyAgICAgICAgbWFyc2hhbGVkIHZhbHVlIG9mIHRoYXQgdHlwZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gd29ya3MgZXhhY3RseSBsaWtlIGEgc3RydWN0LCBidXQgcmF0aGVyCisgICAgICAgIHRoYW4gcGFyZW50aGVzZXMgaXQgdXNlcyBjdXJseSBicmFjZXMsIGFuZCBpdCBoYXMgbW9yZSByZXN0cmljdGlvbnMuCisgICAgICAgIFRoZSByZXN0cmljdGlvbnMgYXJlOiBpdCBvY2N1cnMgb25seSBhcyBhbiBhcnJheSBlbGVtZW50IHR5cGU7IGl0IGhhcworICAgICAgICBleGFjdGx5IHR3byBzaW5nbGUgY29tcGxldGUgdHlwZXMgaW5zaWRlIHRoZSBjdXJseSBicmFjZXM7IHRoZSBmaXJzdAorICAgICAgICBzaW5nbGUgY29tcGxldGUgdHlwZSAodGhlICJrZXkiKSBtdXN0IGJlIGEgYmFzaWMgdHlwZSByYXRoZXIgdGhhbiBhCisgICAgICAgIGNvbnRhaW5lciB0eXBlLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgYWNjZXB0IGRpY3QgZW50cmllcyBvdXRzaWRlIG9mCisgICAgICAgIGFycmF5cywgbXVzdCBub3QgYWNjZXB0IGRpY3QgZW50cmllcyB3aXRoIHplcm8sIG9uZSwgb3IgbW9yZSB0aGFuIHR3bworICAgICAgICBmaWVsZHMsIGFuZCBtdXN0IG5vdCBhY2NlcHQgZGljdCBlbnRyaWVzIHdpdGggbm9uLWJhc2ljLXR5cGVkIGtleXMuIEEKKyAgICAgICAgZGljdCBlbnRyeSBpcyBhbHdheXMgYSBrZXktdmFsdWUgcGFpci4KKyAgICAgIDwvcGFyYT4KKyAgICAgIAorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gaXMgYWx3YXlzIHRoZSBrZXkuCisgICAgICAgIEEgbWVzc2FnZSBpcyBjb25zaWRlcmVkIGNvcnJ1cHQgaWYgdGhlIHNhbWUga2V5IG9jY3VycyB0d2ljZSBpbiB0aGUgc2FtZQorICAgICAgICBhcnJheSBvZiA8bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPi4gSG93ZXZlciwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gcmVqZWN0IGRpY3RzIHdpdGggZHVwbGljYXRlIGtleXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBJbiBtb3N0IGxhbmd1YWdlcywgYW4gYXJyYXkgb2YgZGljdCBlbnRyeSB3b3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIAorICAgICAgICBtYXAsIGhhc2ggdGFibGUsIG9yIGRpY3Qgb2JqZWN0LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBELUJ1cyB0eXBlcy4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db2RlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVkFMSUQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MCAoQVNDSUkgTlVMKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk5vdCBhIHZhbGlkIHR5cGUgY29kZSwgdXNlZCB0byB0ZXJtaW5hdGUgc2lnbmF0dXJlczwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisJCTxlbnRyeT48bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisJCTxlbnRyeT4xMjEgKEFTQ0lJICd5Jyk8L2VudHJ5PgorCQk8ZW50cnk+OC1iaXQgdW5zaWduZWQgaW50ZWdlcjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisJCTxlbnRyeT48bGl0ZXJhbD5CT09MRUFOPC9saXRlcmFsPjwvZW50cnk+CisJCTxlbnRyeT45OCAoQVNDSUkgJ2InKTwvZW50cnk+CisJCTxlbnRyeT5Cb29sZWFuIHZhbHVlLCAwIGlzIDxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPiBhbmQgMSBpcyA8bGl0ZXJhbD5UUlVFPC9saXRlcmFsPi4gRXZlcnl0aGluZyBlbHNlIGlzIGludmFsaWQuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTAgKEFTQ0lJICduJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xNi1iaXQgc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMTY8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTEzIChBU0NJSSAncScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTYtYml0IHVuc2lnbmVkIGludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwNSAoQVNDSUkgJ2knKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjMyLWJpdCBzaWduZWQgaW50ZWdlcjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTcgKEFTQ0lJICd1Jyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zMi1iaXQgdW5zaWduZWQgaW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTIwIChBU0NJSSAneCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IHNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDY0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNiAoQVNDSUkgJ3QnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RE9VQkxFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwMCAoQVNDSUkgJ2QnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PklFRUUgNzU0IGRvdWJsZTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTUgKEFTQ0lJICdzJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VVEYtOCBzdHJpbmcgKDxlbXBoYXNpcz5tdXN0PC9lbXBoYXNpcz4gYmUgdmFsaWQgVVRGLTgpLiBNdXN0IGJlIG51bCB0ZXJtaW5hdGVkIGFuZCBjb250YWluIG5vIG90aGVyIG51bCBieXRlcy48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5PQkpFQ1RfUEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTEgKEFTQ0lJICdvJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIG9mIGFuIG9iamVjdCBpbnN0YW5jZTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMDMgKEFTQ0lJICdnJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BIHR5cGUgc2lnbmF0dXJlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+QVJSQVk8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+OTcgKEFTQ0lJICdhJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BcnJheTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTQgKEFTQ0lJICdyJyksIDQwIChBU0NJSSAnKCcpLCA0MSAoQVNDSUkgJyknKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlN0cnVjdDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTE4IChBU0NJSSAndicpIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlZhcmlhbnQgdHlwZSAodGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIHBhcnQgb2YgdGhlIHZhbHVlIGl0c2VsZik8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwMSAoQVNDSUkgJ2UnKSwgMTIzIChBU0NJSSAneycpLCAxMjUgKEFTQ0lJICd9JykgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RW50cnkgaW4gYSBkaWN0IG9yIG1hcCAoYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzKTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVOSVhfRkQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTA0IChBU0NJSSAnaCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VW5peCBmaWxlIGRlc2NyaXB0b3I8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZyI+CisgICAgICA8dGl0bGU+TWFyc2hhbGluZyAoV2lyZSBGb3JtYXQpPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEdpdmVuIGEgdHlwZSBzaWduYXR1cmUsIGEgYmxvY2sgb2YgYnl0ZXMgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIHR5cGVkCisgICAgICAgIHZhbHVlcy4gVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBibG9jayBvZiBieXRlcy4gIEJ5dGUKKyAgICAgICAgb3JkZXIgYW5kIGFsaWdubWVudCBpc3N1ZXMgYXJlIGhhbmRsZWQgdW5pZm9ybWx5IGZvciBhbGwgRC1CdXMgdHlwZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBIGJsb2NrIG9mIGJ5dGVzIGhhcyBhbiBhc3NvY2lhdGVkIGJ5dGUgb3JkZXIuIFRoZSBieXRlIG9yZGVyIAorICAgICAgICBoYXMgdG8gYmUgZGlzY292ZXJlZCBpbiBzb21lIHdheTsgZm9yIEQtQnVzIG1lc3NhZ2VzLCB0aGUgCisgICAgICAgIGJ5dGUgb3JkZXIgaXMgcGFydCBvZiB0aGUgbWVzc2FnZSBoZWFkZXIgYXMgZGVzY3JpYmVkIGluIAorICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzIi8+LiBGb3Igbm93LCBhc3N1bWUgCisgICAgICAgIHRoYXQgdGhlIGJ5dGUgb3JkZXIgaXMga25vd24gdG8gYmUgZWl0aGVyIGxpdHRsZSBlbmRpYW4gb3IgYmlnIAorICAgICAgICAgIGVuZGlhbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggdmFsdWUgaW4gYSBibG9jayBvZiBieXRlcyBpcyBhbGlnbmVkICJuYXR1cmFsbHksIiBmb3IgZXhhbXBsZQorICAgICAgICA0LWJ5dGUgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIGEgNC1ieXRlIGJvdW5kYXJ5LCBhbmQgOC1ieXRlIHZhbHVlcyB0byBhbgorICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIFRvIHByb3Blcmx5IGFsaWduIGEgdmFsdWUsIDxmaXJzdHRlcm0+YWxpZ25tZW50CisgICAgICAgIHBhZGRpbmc8L2ZpcnN0dGVybT4gbWF5IGJlIG5lY2Vzc2FyeS4gVGhlIGFsaWdubWVudCBwYWRkaW5nIG11c3QgYWx3YXlzCisgICAgICAgIGJlIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHBhZGRpbmcgdG8gcHJvcGVybHkgYWxpZ24gdGhlIGZvbGxvd2luZyB2YWx1ZTsKKyAgICAgICAgYW5kIGl0IG11c3QgYWx3YXlzIGJlIG1hZGUgdXAgb2YgbnVsIGJ5dGVzLiBUaGUgYWxpZ25tZW50IHBhZGRpbmcgbXVzdAorICAgICAgICBub3QgYmUgbGVmdCB1bmluaXRpYWxpemVkIChpdCBjYW4ndCBjb250YWluIGdhcmJhZ2UpLCBhbmQgbW9yZSBwYWRkaW5nCisgICAgICAgIHRoYW4gcmVxdWlyZWQgbXVzdCBub3QgYmUgdXNlZC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEdpdmVuIGFsbCB0aGlzLCB0aGUgdHlwZXMgYXJlIG1hcnNoYWxlZCBvbiB0aGUgd2lyZSBhcyBmb2xsb3dzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgTmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkVuY29kaW5nPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QWxpZ25tZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlZBTElEPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk5vdCBhcHBsaWNhYmxlOyBjYW5ub3QgYmUgbWFyc2hhbGVkLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk4vQTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QSBzaW5nbGUgOC1iaXQgYnl0ZS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+Qk9PTEVBTjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BcyBmb3IgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPiwgYnV0IG9ubHkgMCBhbmQgMSBhcmUgdmFsaWQgdmFsdWVzLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xNi1iaXQgc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMTY8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTYtYml0IHVuc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zMi1iaXQgc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzItYml0IHVuc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42NC1iaXQgc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pjg8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IHVuc2lnbmVkIGludGVnZXIgaW4gdGhlIG1lc3NhZ2UncyBieXRlIG9yZGVyLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pjg8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ET1VCTEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IElFRUUgNzU0IGRvdWJsZSBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+ODwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4gaW5kaWNhdGluZyB0aGUgc3RyaW5nJ3MgCisgICAgICAgICAgICAgICAgICBsZW5ndGggaW4gYnl0ZXMgZXhjbHVkaW5nIGl0cyB0ZXJtaW5hdGluZyBudWwsIGZvbGxvd2VkIGJ5IAorICAgICAgICAgICAgICAgICAgbm9uLW51bCBzdHJpbmcgZGF0YSBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLCBmb2xsb3dlZCBieSBhIHRlcm1pbmF0aW5nIG51bCAKKyAgICAgICAgICAgICAgICAgIGJ5dGUuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICA0IChmb3IgdGhlIGxlbmd0aCkKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5PQkpFQ1RfUEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5FeGFjdGx5IHRoZSBzYW1lIGFzIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4gZXhjZXB0IHRoZSAKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCBwYXRoIChzZWUgYmVsb3cpLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgNCAoZm9yIHRoZSBsZW5ndGgpCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBzYW1lIGFzIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4gZXhjZXB0IHRoZSBsZW5ndGggaXMgYSBzaW5nbGUgCisgICAgICAgICAgICAgICAgICBieXRlICh0aHVzIHNpZ25hdHVyZXMgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDI1NSkKKyAgICAgICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudCBtdXN0IGJlIGEgdmFsaWQgc2lnbmF0dXJlIChzZWUgYmVsb3cpLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkFSUkFZPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgQSA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+IGdpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBkYXRhIGluIGJ5dGVzLCBmb2xsb3dlZCBieSAKKyAgICAgICAgICAgICAgICAgIGFsaWdubWVudCBwYWRkaW5nIHRvIHRoZSBhbGlnbm1lbnQgYm91bmRhcnkgb2YgdGhlIGFycmF5IGVsZW1lbnQgdHlwZSwgCisgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBlYWNoIGFycmF5IGVsZW1lbnQuIFRoZSBhcnJheSBsZW5ndGggaXMgZnJvbSB0aGUgCisgICAgICAgICAgICAgICAgICBlbmQgb2YgdGhlIGFsaWdubWVudCBwYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgIGkuZS4gaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcGFkZGluZyBhZnRlciB0aGUgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgb3IgYW55IHBhZGRpbmcgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudC4KKyAgICAgICAgICAgICAgICAgIEFycmF5cyBoYXZlIGEgbWF4aW11bSBsZW5ndGggZGVmaW5lZCB0byBiZSAyIHRvIHRoZSAyNnRoIHBvd2VyIG9yCisgICAgICAgICAgICAgICAgICA2NzEwODg2NC4gSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IGFycmF5cyBleGNlZWRpbmcgdGhpcworICAgICAgICAgICAgICAgICAgbGVuZ3RoLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgNCAoZm9yIHRoZSBsZW5ndGgpCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgQSBzdHJ1Y3QgbXVzdCBzdGFydCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgcmVnYXJkbGVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgIHR5cGUgb2YgdGhlIHN0cnVjdCBmaWVsZHMuIFRoZSBzdHJ1Y3QgdmFsdWUgY29uc2lzdHMgb2YgZWFjaAorICAgICAgICAgICAgICAgICAgZmllbGQgbWFyc2hhbGVkIGluIHNlcXVlbmNlIHN0YXJ0aW5nIGZyb20gdGhhdCA4LWJ5dGUKKyAgICAgICAgICAgICAgICAgIGFsaWdubWVudCBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDgKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICBBIHZhcmlhbnQgdHlwZSBoYXMgYSBtYXJzaGFsZWQKKyAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD4gZm9sbG93ZWQgYnkgYSBtYXJzaGFsZWQKKyAgICAgICAgICAgICAgICAgIHZhbHVlIHdpdGggdGhlIHR5cGUgZ2l2ZW4gaW4gdGhlIHNpZ25hdHVyZS4gIFVubGlrZQorICAgICAgICAgICAgICAgICAgYSBtZXNzYWdlIHNpZ25hdHVyZSwgdGhlIHZhcmlhbnQgc2lnbmF0dXJlIGNhbgorICAgICAgICAgICAgICAgICAgY29udGFpbiBvbmx5IGEgc2luZ2xlIGNvbXBsZXRlIHR5cGUuICBTbyAiaSIsICJhaSIKKyAgICAgICAgICAgICAgICAgIG9yICIoaWkpIiBpcyBPSywgYnV0ICJpaSIgaXMgbm90LiAgVXNlIG9mIHZhcmlhbnRzIG1heSBub3QKKyAgICAgICAgICAgICAgICAgIGNhdXNlIGEgdG90YWwgbWVzc2FnZSBkZXB0aCB0byBiZSBsYXJnZXIgdGhhbiA2NCwgaW5jbHVkaW5nCisJCSAgb3RoZXIgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMgc3RydWN0dXJlcy4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDEgKGFsaWdubWVudCBvZiB0aGUgc2lnbmF0dXJlKQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIElkZW50aWNhbCB0byBTVFJVQ1QuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICA4CisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VU5JWF9GRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zMi1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUKKyAgICAgICAgICAgICAgICBvcmRlci4gVGhlIGFjdHVhbCBmaWxlIGRlc2NyaXB0b3JzIG5lZWQgdG8gYmUKKyAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBvdXQtb2YtYmFuZCB2aWEgc29tZSBwbGF0Zm9ybSBzcGVjaWZpYworICAgICAgICAgICAgICAgIG1lY2hhbmlzbS4gT24gdGhlIHdpcmUsIHZhbHVlcyBvZiB0aGlzIHR5cGUgc3RvcmUgdGhlIGluZGV4IHRvIHRoZQorICAgICAgICAgICAgICAgIGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgYXJyYXkgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGF0CisgICAgICAgICAgICAgICAgYWNjb21wYW55IHRoZSBtZXNzYWdlLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjQ8L2VudHJ5PgorCSAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorICAgICAgCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCI+CisgICAgICAgIDx0aXRsZT5WYWxpZCBPYmplY3QgUGF0aHM8L3RpdGxlPgorICAgICAgICAKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW4gb2JqZWN0IHBhdGggaXMgYSBuYW1lIHVzZWQgdG8gcmVmZXIgdG8gYW4gb2JqZWN0IGluc3RhbmNlLgorICAgICAgICAgIENvbmNlcHR1YWxseSwgZWFjaCBwYXJ0aWNpcGFudCBpbiBhIEQtQnVzIG1lc3NhZ2UgZXhjaGFuZ2UgbWF5IGhhdmUKKyAgICAgICAgICBhbnkgbnVtYmVyIG9mIG9iamVjdCBpbnN0YW5jZXMgKHRoaW5rIG9mIEMrKyBvciBKYXZhIG9iamVjdHMpIGFuZCBlYWNoCisgICAgICAgICAgc3VjaCBpbnN0YW5jZSB3aWxsIGhhdmUgYSBwYXRoLiBMaWtlIGEgZmlsZXN5c3RlbSwgdGhlIG9iamVjdAorICAgICAgICAgIGluc3RhbmNlcyBpbiBhbiBhcHBsaWNhdGlvbiBmb3JtIGEgaGllcmFyY2hpY2FsIHRyZWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcnVsZXMgZGVmaW5lIGEgdmFsaWQgb2JqZWN0IHBhdGguIEltcGxlbWVudGF0aW9ucyBtdXN0IAorICAgICAgICAgIG5vdCBzZW5kIG9yIGFjY2VwdCBtZXNzYWdlcyB3aXRoIGludmFsaWQgb2JqZWN0IHBhdGhzLgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBwYXRoIG1heSBiZSBvZiBhbnkgbGVuZ3RoLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgcGF0aCBtdXN0IGJlZ2luIHdpdGggYW4gQVNDSUkgJy8nIChpbnRlZ2VyIDQ3KSBjaGFyYWN0ZXIsIAorICAgICAgICAgICAgICAgIGFuZCBtdXN0IGNvbnNpc3Qgb2YgZWxlbWVudHMgc2VwYXJhdGVkIGJ5IHNsYXNoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEVhY2ggZWxlbWVudCBtdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycyAKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXyIKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTm8gZWxlbWVudCBtYXkgYmUgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTXVsdGlwbGUgJy8nIGNoYXJhY3RlcnMgY2Fubm90IG9jY3VyIGluIHNlcXVlbmNlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBIHRyYWlsaW5nICcvJyBjaGFyYWN0ZXIgaXMgbm90IGFsbG93ZWQgdW5sZXNzIHRoZSAKKyAgICAgICAgICAgICAgICBwYXRoIGlzIHRoZSByb290IHBhdGggKGEgc2luZ2xlICcvJyBjaGFyYWN0ZXIpLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIAorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW1hcnNoYWxpbmctc2lnbmF0dXJlIj4KKyAgICAgICAgPHRpdGxlPlZhbGlkIFNpZ25hdHVyZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCBzZW5kIG9yIGFjY2VwdCBpbnZhbGlkIHNpZ25hdHVyZXMuCisgICAgICAgICAgVmFsaWQgc2lnbmF0dXJlcyB3aWxsIGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBydWxlczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgc2lnbmF0dXJlIGVuZHMgd2l0aCBhIG51bCBieXRlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgc2lnbmF0dXJlIGlzIGEgbGlzdCBvZiBzaW5nbGUgY29tcGxldGUgdHlwZXMuIAorICAgICAgICAgICAgICAgIEFycmF5cyBtdXN0IGhhdmUgZWxlbWVudCB0eXBlcywgYW5kIHN0cnVjdHMgbXVzdCAKKyAgICAgICAgICAgICAgICBoYXZlIGJvdGggb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzZXMuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9ubHkgdHlwZSBjb2RlcyBhbmQgb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzZXMgYXJlIAorICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIHNpZ25hdHVyZS4gVGhlIDxsaXRlcmFsPlNUUlVDVDwvbGl0ZXJhbD4gdHlwZSBjb2RlCisgICAgICAgICAgICAgICAgaXMgbm90IGFsbG93ZWQgaW4gc2lnbmF0dXJlcywgYmVjYXVzZSBwYXJlbnRoZXNlcworICAgICAgICAgICAgICAgIGFyZSB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIGRlcHRoIG9mIGNvbnRhaW5lciB0eXBlIG5lc3RpbmcgaXMgMzIgYXJyYXkgdHlwZQorICAgICAgICAgICAgICAgIGNvZGVzIGFuZCAzMiBvcGVuIHBhcmVudGhlc2VzLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgbWF4aW11bQorICAgICAgICAgICAgICAgIHRvdGFsIGRlcHRoIG9mIHJlY3Vyc2lvbiBpcyA2NCwgZm9yIGFuICJhcnJheSBvZiBhcnJheSBvZiBhcnJheQorICAgICAgICAgICAgICAgIG9mIC4uLiBzdHJ1Y3Qgb2Ygc3RydWN0IG9mIHN0cnVjdCBvZiAuLi4iICB3aGVyZSB0aGVyZSBhcmUgMzIKKyAgICAgICAgICAgICAgICBhcnJheSBhbmQgMzIgc3RydWN0LgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBzaWduYXR1cmUgaXMgMjU1LgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBTaWduYXR1cmVzIG11c3QgYmUgbnVsLXRlcm1pbmF0ZWQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICAKKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEZvcm1hdDwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBoZWFkZXIgYW5kIGEgYm9keS4gVGhlIGhlYWRlciBpcyBhIGJsb2NrIG9mCisgICAgICAgIHZhbHVlcyB3aXRoIGEgZml4ZWQgc2lnbmF0dXJlIGFuZCBtZWFuaW5nLiAgVGhlIGJvZHkgaXMgYSBzZXBhcmF0ZSBibG9jaworICAgICAgICBvZiB2YWx1ZXMsIHdpdGggYSBzaWduYXR1cmUgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDgsIGFsbG93aW5nIHRoZSBib2R5IHRvCisgICAgICAgIGJlZ2luIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSB3aGVuIHN0b3JpbmcgdGhlIGVudGlyZSBtZXNzYWdlIGluIGEgc2luZ2xlCisgICAgICAgIGJ1ZmZlci4gSWYgdGhlIGhlYWRlciBkb2VzIG5vdCBuYXR1cmFsbHkgZW5kIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAgICAgICAgdXAgdG8gNyBieXRlcyBvZiBudWwtaW5pdGlhbGl6ZWQgYWxpZ25tZW50IHBhZGRpbmcgbXVzdCBiZSBhZGRlZC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtZXNzYWdlIGJvZHkgbmVlZCBub3QgZW5kIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIG1lc3NhZ2UsIGluY2x1ZGluZyBoZWFkZXIsIGhlYWRlciBhbGlnbm1lbnQgcGFkZGluZywgCisgICAgICAgIGFuZCBib2R5IGlzIDIgdG8gdGhlIDI3dGggcG93ZXIgb3IgMTM0MjE3NzI4LiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgCisgICAgICAgIHNlbmQgb3IgYWNjZXB0IG1lc3NhZ2VzIGV4Y2VlZGluZyB0aGlzIHNpemUuCisgICAgICA8L3BhcmE+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc2lnbmF0dXJlIG9mIHRoZSBoZWFkZXIgaXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAieXl5eXV1YSh5dikiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFdyaXR0ZW4gb3V0IG1vcmUgcmVhZGFibHksIHRoaXMgaXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBCWVRFLCBCWVRFLCBCWVRFLCBCWVRFLCBVSU5UMzIsIFVJTlQzMiwgQVJSQVkgb2YgU1RSVUNUIG9mIChCWVRFLFZBUklBTlQpCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVzZSB2YWx1ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjIiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xc3QgPGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5FbmRpYW5uZXNzIGZsYWc7IEFTQ0lJICdsJyBmb3IgbGl0dGxlLWVuZGlhbiAKKyAgICAgICAgICAgICAgICAgIG9yIEFTQ0lJICdCJyBmb3IgYmlnLWVuZGlhbi4gQm90aCBoZWFkZXIgYW5kIGJvZHkgYXJlIAorICAgICAgICAgICAgICAgIGluIHRoaXMgZW5kaWFubmVzcy48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Mm5kIDxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGZpcnN0dGVybT5NZXNzYWdlIHR5cGU8L2ZpcnN0dGVybT4uIFVua25vd24gdHlwZXMgbXVzdCBiZSBpZ25vcmVkLiAKKyAgICAgICAgICAgICAgICAgIEN1cnJlbnRseS1kZWZpbmVkIHR5cGVzIGFyZSBkZXNjcmliZWQgYmVsb3cuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjNyZCA8bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkJpdHdpc2UgT1Igb2YgZmxhZ3MuIFVua25vd24gZmxhZ3MKKyAgICAgICAgICAgICAgICAgIG11c3QgYmUgaWdub3JlZC4gQ3VycmVudGx5LWRlZmluZWQgZmxhZ3MgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NHRoIDxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+TWFqb3IgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgc2VuZGluZyBhcHBsaWNhdGlvbi4gIElmCisgICAgICAgICAgICAgICAgdGhlIG1ham9yIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlY2VpdmluZyBhcHBsaWNhdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgICAgIG1hdGNoLCB0aGUgYXBwbGljYXRpb25zIHdpbGwgbm90IGJlIGFibGUgdG8gY29tbXVuaWNhdGUgYW5kIHRoZQorICAgICAgICAgICAgICAgIEQtQnVzIGNvbm5lY3Rpb24gbXVzdCBiZSBkaXNjb25uZWN0ZWQuIFRoZSBtYWpvciBwcm90b2NvbAorICAgICAgICAgICAgICAgIHZlcnNpb24gZm9yIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBpcyAxLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xc3QgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pkxlbmd0aCBpbiBieXRlcyBvZiB0aGUgbWVzc2FnZSBib2R5LCBzdGFydGluZyAKKyAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGVuZCBvZiB0aGUgaGVhZGVyLiBUaGUgaGVhZGVyIGVuZHMgYWZ0ZXIgCisgICAgICAgICAgICAgICAgICBpdHMgYWxpZ25tZW50IHBhZGRpbmcgdG8gYW4gOC1ib3VuZGFyeS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Mm5kIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgc2VyaWFsIG9mIHRoaXMgbWVzc2FnZSwgdXNlZCBhcyBhIGNvb2tpZSAKKyAgICAgICAgICAgICAgICAgIGJ5IHRoZSBzZW5kZXIgdG8gaWRlbnRpZnkgdGhlIHJlcGx5IGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgIHRvIHRoaXMgcmVxdWVzdC4gVGhpcyBtdXN0IG5vdCBiZSB6ZXJvLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PiAgICAgIAorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD4gb2YgPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiBvZiAoPGxpdGVyYWw+QllURTwvbGl0ZXJhbD4sPGxpdGVyYWw+VkFSSUFOVDwvbGl0ZXJhbD4pPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QW4gYXJyYXkgb2YgemVybyBvciBtb3JlIDxmaXJzdHRlcm0+aGVhZGVyCisgICAgICAgICAgICAgICAgICBmaWVsZHM8L2ZpcnN0dGVybT4gd2hlcmUgdGhlIGJ5dGUgaXMgdGhlIGZpZWxkIGNvZGUsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgIHZhcmlhbnQgaXMgdGhlIGZpZWxkIHZhbHVlLiBUaGUgbWVzc2FnZSB0eXBlIGRldGVybWluZXMgCisgICAgICAgICAgICAgICAgICB3aGljaCBmaWVsZHMgYXJlIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIDxmaXJzdHRlcm0+TWVzc2FnZSB0eXBlczwvZmlyc3R0ZXJtPiB0aGF0IGNhbiBhcHBlYXIgaW4gdGhlIHNlY29uZCBieXRlCisgICAgICAgIG9mIHRoZSBoZWFkZXIgYXJlOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlY2ltYWwgdmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5WQUxJRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VGhpcyBpcyBhbiBpbnZhbGlkIHR5cGUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5NZXRob2QgY2FsbC48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4yPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+TWV0aG9kIHJlcGx5IHdpdGggcmV0dXJuZWQgZGF0YS48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkVycm9yIHJlcGx5LiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgZXhpc3RzIGFuZCBpcyBhCisgICAgICAgICAgICAgICAgc3RyaW5nLCBpdCBpcyBhbiBlcnJvciBtZXNzYWdlLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlNpZ25hbCBlbWlzc2lvbi48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBGbGFncyB0aGF0IGNhbiBhcHBlYXIgaW4gdGhlIHRoaXJkIGJ5dGUgb2YgdGhlIGhlYWRlcjoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIG5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5IZXggdmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+Tk9fUkVQTFlfRVhQRUNURUQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MHgxPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VGhpcyBtZXNzYWdlIGRvZXMgbm90IGV4cGVjdCBtZXRob2QgcmV0dXJuIHJlcGxpZXMgb3IKKyAgICAgICAgICAgICAgICBlcnJvciByZXBsaWVzOyB0aGUgcmVwbHkgY2FuIGJlIG9taXR0ZWQgYXMgYW4KKyAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24uIEhvd2V2ZXIsIGl0IGlzIGNvbXBsaWFudCB3aXRoIHRoaXMgc3BlY2lmaWNhdGlvbgorICAgICAgICAgICAgICAgIHRvIHJldHVybiB0aGUgcmVwbHkgZGVzcGl0ZSB0aGlzIGZsYWcgYW5kIHRoZSBvbmx5IGhhcm0gCisgICAgICAgICAgICAgICAgICBmcm9tIGRvaW5nIHNvIGlzIGV4dHJhIG5ldHdvcmsgdHJhZmZpYy4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+Tk9fQVVUT19TVEFSVDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgYnVzIG11c3Qgbm90IGxhdW5jaCBhbiBvd25lcgorICAgICAgICAgICAgICAgICAgZm9yIHRoZSBkZXN0aW5hdGlvbiBuYW1lIGluIHJlc3BvbnNlIHRvIHRoaXMgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLWhlYWRlci1maWVsZHMiPgorICAgICAgICA8dGl0bGU+SGVhZGVyIEZpZWxkczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGFycmF5IGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBjb250YWlucyA8Zmlyc3R0ZXJtPmhlYWRlcgorICAgICAgICAgIGZpZWxkczwvZmlyc3R0ZXJtPiwgd2hlcmUgZWFjaCBmaWVsZCBpcyBhIDEtYnl0ZSBmaWVsZCBjb2RlIGZvbGxvd2VkCisgICAgICAgICAgYnkgYSBmaWVsZCB2YWx1ZS4gQSBoZWFkZXIgbXVzdCBjb250YWluIHRoZSByZXF1aXJlZCBoZWFkZXIgZmllbGRzIGZvcgorICAgICAgICAgIGl0cyBtZXNzYWdlIHR5cGUsIGFuZCB6ZXJvIG9yIG1vcmUgb2YgYW55IG9wdGlvbmFsIGhlYWRlcgorICAgICAgICAgIGZpZWxkcy4gRnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBtYXkgYWRkIG5ldworICAgICAgICAgIGZpZWxkcy4gSW1wbGVtZW50YXRpb25zIG11c3QgaWdub3JlIGZpZWxkcyB0aGV5IGRvIG5vdAorICAgICAgICAgIHVuZGVyc3RhbmQuIEltcGxlbWVudGF0aW9ucyBtdXN0IG5vdCBpbnZlbnQgdGhlaXIgb3duIGhlYWRlciBmaWVsZHM7CisgICAgICAgICAgb25seSBjaGFuZ2VzIHRvIHRoaXMgc3BlY2lmaWNhdGlvbiBtYXkgaW50cm9kdWNlIG5ldyBoZWFkZXIgZmllbGRzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQWdhaW4sIGlmIGFuIGltcGxlbWVudGF0aW9uIHNlZXMgYSBoZWFkZXIgZmllbGQgY29kZSB0aGF0IGl0IGRvZXMgbm90CisgICAgICAgICAgZXhwZWN0LCBpdCBtdXN0IGlnbm9yZSB0aGF0IGZpZWxkLCBhcyBpdCB3aWxsIGJlIHBhcnQgb2YgYSBuZXcKKyAgICAgICAgICAoYnV0IGNvbXBhdGlibGUpIHZlcnNpb24gb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiBUaGlzIGFsc28gYXBwbGllcyAKKyAgICAgICAgICB0byBrbm93biBoZWFkZXIgZmllbGRzIGFwcGVhcmluZyBpbiB1bmV4cGVjdGVkIG1lc3NhZ2VzLCBmb3IgCisgICAgICAgICAgZXhhbXBsZTogaWYgYSBzaWduYWwgaGFzIGEgcmVwbHkgc2VyaWFsIGl0IG11c3QgYmUgaWdub3JlZAorICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IGhhcyBubyBtZWFuaW5nIGFzIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlYy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvd2V2ZXIsIGltcGxlbWVudGF0aW9ucyBtdXN0IG5vdCBzZW5kIG9yIGFjY2VwdCBrbm93biBoZWFkZXIgZmllbGRzCisgICAgICAgICAgd2l0aCB0aGUgd3JvbmcgdHlwZSBzdG9yZWQgaW4gdGhlIGZpZWxkIHZhbHVlLiBTbyBmb3IgZXhhbXBsZSBhCisgICAgICAgICAgbWVzc2FnZSB3aXRoIGFuIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gZmllbGQgb2YgdHlwZQorICAgICAgICAgIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4gd291bGQgYmUgY29uc2lkZXJlZCBjb3JydXB0LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSGVyZSBhcmUgdGhlIGN1cnJlbnRseS1kZWZpbmVkIGhlYWRlciBmaWVsZHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjUiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgTmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVjaW1hbCBDb2RlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5SZXF1aXJlZCBJbjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlZBTElEPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Ti9BPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5ub3QgYWxsb3dlZDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Tm90IGEgdmFsaWQgZmllbGQgbmFtZSAoZXJyb3IgaWYgaXQgYXBwZWFycyBpbiBhIG1lc3NhZ2UpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlBBVEg8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4xPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5PQkpFQ1RfUEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiwgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG9iamVjdCB0byBzZW5kIGEgY2FsbCB0bywKKyAgICAgICAgICAgICAgICAgICAgb3IgdGhlIG9iamVjdCBhIHNpZ25hbCBpcyBlbWl0dGVkIGZyb20uCisgICAgICAgICAgICAgICAgICAgIFRoZSBzcGVjaWFsIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+L29yZy9mcmVlZGVza3RvcC9EQnVzL0xvY2FsPC9saXRlcmFsPiBpcyByZXNlcnZlZDsKKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3Qgc2VuZCBtZXNzYWdlcyB3aXRoIHRoaXMgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1cyBkYWVtb24gd2lsbAorICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0IGFueSBhcHBsaWNhdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGRvIHNvLgorICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIHRvIGludm9rZSBhIG1ldGhvZCBjYWxsIG9uLCBvciAKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBhIHNpZ25hbCBpcyBlbWl0dGVkIGZyb20uIE9wdGlvbmFsIGZvciAKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGxzLCByZXF1aXJlZCBmb3Igc2lnbmFscy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsPC9saXRlcmFsPiBpcyByZXNlcnZlZDsKKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3Qgc2VuZCBtZXNzYWdlcyB3aXRoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLCBhbmQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVzCisgICAgICAgICAgICAgICAgICAgIGRhZW1vbiB3aWxsIGRpc2Nvbm5lY3QgYW55IGFwcGxpY2F0aW9uIHRoYXQgYXR0ZW1wdHMgdG8KKyAgICAgICAgICAgICAgICAgICAgZG8gc28uCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+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+VGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhpcyBtZXNzYWdlIGlzIGludGVuZGVkIGZvci4KKyAgICAgICAgICAgICAgICAgICAgT25seSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UgYnVzLCBzZWUgCisgICAgICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzIi8+LjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TRU5ERVI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT43PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5vcHRpb25hbDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG5hbWUgb2YgdGhlIHNlbmRpbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYnVzIGZpbGxzIGluIHRoaXMgZmllbGQgc28gaXQgaXMgcmVsaWFibGU7IHRoZSBmaWVsZCBpcworICAgICAgICAgICAgICAgICAgICBvbmx5IG1lYW5pbmdmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgbWVzc2FnZSBidXMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pjg8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pm9wdGlvbmFsPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgc2lnbmF0dXJlIG9mIHRoZSBtZXNzYWdlIGJvZHkuCisgICAgICAgICAgICAgICAgICBJZiBvbWl0dGVkLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSAKKyAgICAgICAgICAgICAgICAgIGVtcHR5IHNpZ25hdHVyZSAiIiAoaS5lLiB0aGUgYm9keSBtdXN0IGJlIDAtbGVuZ3RoKS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VU5JWF9GRFM8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT45PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5vcHRpb25hbDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG51bWJlciBvZiBVbml4IGZpbGUgZGVzY3JpcHRvcnMgdGhhdAorICAgICAgICAgICAgICAgICAgYWNjb21wYW55IHRoZSBtZXNzYWdlLiAgSWYgb21pdHRlZCwgaXQgaXMgYXNzdW1lZAorICAgICAgICAgICAgICAgICAgdGhhdCBubyBVbml4IGZpbGUgZGVzY3JpcHRvcnMgYWNjb21wYW55IHRoZQorICAgICAgICAgICAgICAgICAgbWVzc2FnZS4gVGhlIGFjdHVhbCBmaWxlIGRlc2NyaXB0b3JzIG5lZWQgdG8gYmUKKyAgICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkIHZpYSBwbGF0Zm9ybSBzcGVjaWZpYyBtZWNoYW5pc20KKyAgICAgICAgICAgICAgICAgIG91dC1vZi1iYW5kLiBUaGV5IG11c3QgYmUgc2VudCBhdCB0aGUgc2FtZSB0aW1lIGFzCisgICAgICAgICAgICAgICAgICBwYXJ0IG9mIHRoZSBtZXNzYWdlIGl0c2VsZi4gVGhleSBtYXkgbm90IGJlIHNlbnQKKyAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSBpdHNlbGYgaXMKKyAgICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkIG9yIGFmdGVyIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgIGl0c2VsZi48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMiPgorICAgICAgPHRpdGxlPlZhbGlkIE5hbWVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgdmFyaW91cyBuYW1lcyBpbiBELUJ1cyBtZXNzYWdlcyBoYXZlIHNvbWUgcmVzdHJpY3Rpb25zLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGlzIGEgPGZpcnN0dGVybT5tYXhpbXVtIG5hbWUgbGVuZ3RoPC9maXJzdHRlcm0+IAorICAgICAgICBvZiAyNTUgd2hpY2ggYXBwbGllcyB0byBidXMgbmFtZXMsIGludGVyZmFjZXMsIGFuZCBtZW1iZXJzLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1pbnRlcmZhY2UiPgorICAgICAgICA8dGl0bGU+SW50ZXJmYWNlIG5hbWVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSW50ZXJmYWNlcyBoYXZlIG5hbWVzIHdpdGggdHlwZSA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+LCBtZWFuaW5nIHRoYXQgCisgICAgICAgICAgdGhleSBtdXN0IGJlIHZhbGlkIFVURi04LiBIb3dldmVyLCB0aGVyZSBhcmUgYWxzbyBzb21lIAorICAgICAgICAgIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIHRoYXQgYXBwbHkgdG8gaW50ZXJmYWNlIG5hbWVzIAorICAgICAgICAgIHNwZWNpZmljYWxseToKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkludGVyZmFjZSBuYW1lcyBhcmUgY29tcG9zZWQgb2YgMSBvciBtb3JlIGVsZW1lbnRzIHNlcGFyYXRlZCBieQorICAgICAgICAgICAgICAgIGEgcGVyaW9kICgnLicpIGNoYXJhY3Rlci4gQWxsIGVsZW1lbnRzIG11c3QgY29udGFpbiBhdCBsZWFzdCAKKyAgICAgICAgICAgICAgICBvbmUgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+RWFjaCBlbGVtZW50IG11c3Qgb25seSBjb250YWluIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIAorICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fIiBhbmQgbXVzdCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKwkgICAgPGxpc3RpdGVtPjxwYXJhPkludGVyZmFjZSBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lICcuJyAocGVyaW9kKQorICAgICAgICAgICAgICBjaGFyYWN0ZXIgKGFuZCB0aHVzIGF0IGxlYXN0IHR3byBlbGVtZW50cykuCisgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorCisJICAgIDxsaXN0aXRlbT48cGFyYT5JbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgYmVnaW4gd2l0aCBhICcuJyAocGVyaW9kKSBjaGFyYWN0ZXIuPC9wYXJhPjwvbGlzdGl0ZW0+CisJICAgIDxsaXN0aXRlbT48cGFyYT5JbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyI+CisgICAgICAgIDx0aXRsZT5CdXMgbmFtZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb25uZWN0aW9ucyBoYXZlIG9uZSBvciBtb3JlIGJ1cyBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKyAgICAgICAgICBBIGNvbm5lY3Rpb24gaGFzIGV4YWN0bHkgb25lIGJ1cyBuYW1lIHRoYXQgaXMgYSB1bmlxdWUgY29ubmVjdGlvbgorICAgICAgICAgIG5hbWUuIFRoZSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lIHJlbWFpbnMgd2l0aCB0aGUgY29ubmVjdGlvbiBmb3IKKyAgICAgICAgICBpdHMgZW50aXJlIGxpZmV0aW1lLgorICAgICAgICAgIEEgYnVzIG5hbWUgaXMgb2YgdHlwZSA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+LAorICAgICAgICAgIG1lYW5pbmcgdGhhdCBpdCBtdXN0IGJlIHZhbGlkIFVURi04LiBIb3dldmVyLCB0aGVyZSBhcmUgYWxzbworICAgICAgICAgIHNvbWUgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgdGhhdCBhcHBseSB0byBidXMgbmFtZXMgCisgICAgICAgICAgc3BlY2lmaWNhbGx5OgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIGNvbG9uICgnOicpCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGFyZSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkJ1cyBuYW1lcyBhcmUgY29tcG9zZWQgb2YgMSBvciBtb3JlIGVsZW1lbnRzIHNlcGFyYXRlZCBieQorICAgICAgICAgICAgICAgIGEgcGVyaW9kICgnLicpIGNoYXJhY3Rlci4gQWxsIGVsZW1lbnRzIG11c3QgY29udGFpbiBhdCBsZWFzdCAKKyAgICAgICAgICAgICAgICBvbmUgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+RWFjaCBlbGVtZW50IG11c3Qgb25seSBjb250YWluIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIAorICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fLSIuIE9ubHkgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIHVuaXF1ZQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gbmFtZSBtYXkgYmVnaW4gd2l0aCBhIGRpZ2l0LCBlbGVtZW50cyBpbgorICAgICAgICAgICAgICAgIG90aGVyIGJ1cyBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworCSAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgJy4nIChwZXJpb2QpCisgICAgICAgICAgICAgIGNoYXJhY3RlciAoYW5kIHRodXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzKS4KKyAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisKKwkgICAgPGxpc3RpdGVtPjxwYXJhPkJ1cyBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgJy4nIChwZXJpb2QpIGNoYXJhY3Rlci48L3BhcmE+PC9saXN0aXRlbT4KKwkgICAgPGxpc3RpdGVtPjxwYXJhPkJ1cyBuYW1lcyBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZSBsZW5ndGguPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTm90ZSB0aGF0IHRoZSBoeXBoZW4gKCctJykgY2hhcmFjdGVyIGlzIGFsbG93ZWQgaW4gYnVzIG5hbWVzIGJ1dAorICAgICAgICAgIG5vdCBpbiBpbnRlcmZhY2UgbmFtZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtbWVtYmVyIj4KKyAgICAgICAgPHRpdGxlPk1lbWJlciBuYW1lczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE1lbWJlciAoaS5lLiBtZXRob2Qgb3Igc2lnbmFsKSBuYW1lczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCSAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXyIgYW5kIG1heSBub3QgYmVnaW4gd2l0aCBhCisgICAgICAgICAgICAgICAgZGlnaXQuPC9wYXJhPjwvbGlzdGl0ZW0+CisJICAgIDxsaXN0aXRlbT48cGFyYT5NdXN0IG5vdCBjb250YWluIHRoZSAnLicgKHBlcmlvZCkgY2hhcmFjdGVyLjwvcGFyYT48L2xpc3RpdGVtPgorCSAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorCSAgICA8bGlzdGl0ZW0+PHBhcmE+TXVzdCBiZSBhdCBsZWFzdCAxIGJ5dGUgaW4gbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWVycm9yIj4KKyAgICAgICAgPHRpdGxlPkVycm9yIG5hbWVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXJyb3IgbmFtZXMgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgaW50ZXJmYWNlIG5hbWVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgVHlwZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggb2YgdGhlIG1lc3NhZ2UgdHlwZXMgKDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiwgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4sIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiwgYW5kCisgICAgICAgIDxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD4pIGhhcyBpdHMgb3duIGV4cGVjdGVkIHVzYWdlIGNvbnZlbnRpb25zIGFuZCBoZWFkZXIgZmllbGRzLgorICAgICAgICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZXNlIGNvbnZlbnRpb25zLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLW1ldGhvZCI+CisgICAgICAgIDx0aXRsZT5NZXRob2QgQ2FsbHM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTb21lIG1lc3NhZ2VzIGludm9rZSBhbiBvcGVyYXRpb24gb24gYSByZW1vdGUgb2JqZWN0LiAgVGhlc2UgYXJlCisgICAgICAgICAgY2FsbGVkIG1ldGhvZCBjYWxsIG1lc3NhZ2VzIGFuZCBoYXZlIHRoZSB0eXBlIHRhZyA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4uIFN1Y2gKKyAgICAgICAgICBtZXNzYWdlcyBtYXAgbmF0dXJhbGx5IHRvIG1ldGhvZHMgb24gb2JqZWN0cyBpbiBhIHR5cGljYWwgcHJvZ3JhbS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIDxsaXRlcmFsPk1FTUJFUjwvbGl0ZXJhbD4gaGVhZGVyIGZpZWxkCisgICAgICAgICAgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLiBPcHRpb25hbGx5LCB0aGUgbWVzc2FnZSBoYXMgYW4KKyAgICAgICAgICA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+IGZpZWxkIGdpdmluZyB0aGUgaW50ZXJmYWNlIHRoZSBtZXRob2QgaXMgYSBwYXJ0IG9mLiBJbiB0aGUKKyAgICAgICAgICBhYnNlbmNlIG9mIGFuIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gZmllbGQsIGlmIHR3byBpbnRlcmZhY2VzIG9uIHRoZSBzYW1lIG9iamVjdCBoYXZlCisgICAgICAgICAgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBpdCBpcyB1bmRlZmluZWQgd2hpY2ggb2YgdGhlIHR3byBtZXRob2RzCisgICAgICAgICAgd2lsbCBiZSBpbnZva2VkLiBJbXBsZW1lbnRhdGlvbnMgbWF5IGFsc28gY2hvb3NlIHRvIHJldHVybiBhbiBlcnJvciBpbgorICAgICAgICAgIHRoaXMgYW1iaWd1b3VzIGNhc2UuIEhvd2V2ZXIsIGlmIGEgbWV0aG9kIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgaW1wbGVtZW50YXRpb25zIG11c3Qgbm90IHJlcXVpcmUgYW4gaW50ZXJmYWNlIGZpZWxkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE1ldGhvZCBjYWxsIG1lc3NhZ2VzIGFsc28gaW5jbHVkZSBhIDxsaXRlcmFsPlBBVEg8L2xpdGVyYWw+IGZpZWxkCisgICAgICAgICAgaW5kaWNhdGluZyB0aGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLiBJZiB0aGUgY2FsbCBpcyBwYXNzaW5nCisgICAgICAgICAgdGhyb3VnaCBhIG1lc3NhZ2UgYnVzLCB0aGUgbWVzc2FnZSB3aWxsIGFsc28gaGF2ZSBhCisgICAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbgorICAgICAgICAgIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgV2hlbiBhbiBhcHBsaWNhdGlvbiBoYW5kbGVzIGEgbWV0aG9kIGNhbGwgbWVzc2FnZSwgaXQgaXMgcmVxdWlyZWQgdG8KKyAgICAgICAgICByZXR1cm4gYSByZXBseS4gVGhlIHJlcGx5IGlzIGlkZW50aWZpZWQgYnkgYSA8bGl0ZXJhbD5SRVBMWV9TRVJJQUw8L2xpdGVyYWw+IGhlYWRlciBmaWVsZAorICAgICAgICAgIGluZGljYXRpbmcgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiBiZWluZyByZXBsaWVkIHRvLiBUaGUKKyAgICAgICAgICByZXBseSBjYW4gaGF2ZSBvbmUgb2YgdHdvIHR5cGVzOyBlaXRoZXIgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHRoZSByZXBseSBoYXMgdHlwZSA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiwgdGhlIGFyZ3VtZW50cyB0byB0aGUgcmVwbHkgbWVzc2FnZSAKKyAgICAgICAgICBhcmUgdGhlIHJldHVybiB2YWx1ZShzKSBvciAib3V0IHBhcmFtZXRlcnMiIG9mIHRoZSBtZXRob2QgY2FsbC4gCisgICAgICAgICAgSWYgdGhlIHJlcGx5IGhhcyB0eXBlIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiwgdGhlbiBhbiAiZXhjZXB0aW9uIiBoYXMgYmVlbiB0aHJvd24sIAorICAgICAgICAgIGFuZCB0aGUgY2FsbCBmYWlsczsgbm8gcmV0dXJuIHZhbHVlIHdpbGwgYmUgcHJvdmlkZWQuIEl0IG1ha2VzIAorICAgICAgICAgIG5vIHNlbnNlIHRvIHNlbmQgbXVsdGlwbGUgcmVwbGllcyB0byB0aGUgc2FtZSBtZXRob2QgY2FsbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFdmVuIGlmIGEgbWV0aG9kIGNhbGwgaGFzIG5vIHJldHVybiB2YWx1ZXMsIGEgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4gCisgICAgICAgICAgcmVwbHkgaXMgcmVxdWlyZWQsIHNvIHRoZSBjYWxsZXIgd2lsbCBrbm93IHRoZSBtZXRob2QgCisgICAgICAgICAgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiByZXBseSBtZXNzYWdlIG11c3QgaGF2ZSB0aGUgPGxpdGVyYWw+UkVQTFlfU0VSSUFMPC9saXRlcmFsPiAKKyAgICAgICAgICBoZWFkZXIgZmllbGQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgYSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4gbWVzc2FnZSBoYXMgdGhlIGZsYWcgPGxpdGVyYWw+Tk9fUkVQTFlfRVhQRUNURUQ8L2xpdGVyYWw+LCAKKyAgICAgICAgICB0aGVuIGFzIGFuIG9wdGltaXphdGlvbiB0aGUgYXBwbGljYXRpb24gcmVjZWl2aW5nIHRoZSBtZXRob2QgCisgICAgICAgICAgY2FsbCBtYXkgY2hvb3NlIHRvIG9taXQgdGhlIHJlcGx5IG1lc3NhZ2UgKHJlZ2FyZGxlc3Mgb2YgCisgICAgICAgICAgd2hldGhlciB0aGUgcmVwbHkgd291bGQgaGF2ZSBiZWVuIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPikuIAorICAgICAgICAgIEhvd2V2ZXIsIGl0IGlzIGFsc28gYWNjZXB0YWJsZSB0byBpZ25vcmUgdGhlIDxsaXRlcmFsPk5PX1JFUExZX0VYUEVDVEVEPC9saXRlcmFsPgorICAgICAgICAgIGZsYWcgYW5kIHJlcGx5IGFueXdheS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBVbmxlc3MgYSBtZXNzYWdlIGhhcyB0aGUgZmxhZyA8bGl0ZXJhbD5OT19BVVRPX1NUQVJUPC9saXRlcmFsPiwgaWYgdGhlCisgICAgICAgICAgZGVzdGluYXRpb24gbmFtZSBkb2VzIG5vdCBleGlzdCB0aGVuIGEgcHJvZ3JhbSB0byBvd24gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgICAgbmFtZSB3aWxsIGJlIHN0YXJ0ZWQgYmVmb3JlIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZC4gIFRoZSBtZXNzYWdlCisgICAgICAgICAgd2lsbCBiZSBoZWxkIHVudGlsIHRoZSBuZXcgcHJvZ3JhbSBpcyBzdWNjZXNzZnVsbHkgc3RhcnRlZCBvciBoYXMKKyAgICAgICAgICBmYWlsZWQgdG8gc3RhcnQ7IGluIGNhc2Ugb2YgZmFpbHVyZSwgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4gVGhpcworICAgICAgICAgIGZsYWcgaXMgb25seSByZWxldmFudCBpbiB0aGUgY29udGV4dCBvZiBhIG1lc3NhZ2UgYnVzLCBpdCBpcyBpZ25vcmVkCisgICAgICAgICAgZHVyaW5nIG9uZS10by1vbmUgY29tbXVuaWNhdGlvbiB3aXRoIG5vIGludGVybWVkaWF0ZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Q0IGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLW1ldGhvZC1hcGlzIj4KKyAgICAgICAgICA8dGl0bGU+TWFwcGluZyBtZXRob2QgY2FsbHMgdG8gbmF0aXZlIEFQSXM8L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQVBJcyBmb3IgRC1CdXMgbWF5IG1hcCBtZXRob2QgY2FsbHMgdG8gYSBtZXRob2QgY2FsbCBpbiBhIHNwZWNpZmljCisgICAgICAgICAgICBwcm9ncmFtbWluZyBsYW5ndWFnZSwgc3VjaCBhcyBDKyssIG9yIG1heSBtYXAgYSBtZXRob2QgY2FsbCB3cml0dGVuCisgICAgICAgICAgICBpbiBhbiBJREwgdG8gYSBELUJ1cyBtZXNzYWdlLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEluIEFQSXMgb2YgdGhpcyBuYXR1cmUsIGFyZ3VtZW50cyB0byBhIG1ldGhvZCBhcmUgb2Z0ZW4gdGVybWVkICJpbiIKKyAgICAgICAgICAgICh3aGljaCBpbXBsaWVzIHNlbnQgaW4gdGhlIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiksIG9yICJvdXQiICh3aGljaCBpbXBsaWVzCisgICAgICAgICAgICByZXR1cm5lZCBpbiB0aGUgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4pLiBTb21lIEFQSXMgc3VjaCBhcyBDT1JCQSBhbHNvIGhhdmUKKyAgICAgICAgICAgICJpbm91dCIgYXJndW1lbnRzLCB3aGljaCBhcmUgYm90aCBzZW50IGFuZCByZWNlaXZlZCwgaS5lLiB0aGUgY2FsbGVyCisgICAgICAgICAgICBwYXNzZXMgaW4gYSB2YWx1ZSB3aGljaCBpcyBtb2RpZmllZC4gTWFwcGVkIHRvIEQtQnVzLCBhbiAiaW5vdXQiCisgICAgICAgICAgICBhcmd1bWVudCBpcyBlcXVpdmFsZW50IHRvIGFuICJpbiIgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IGFuICJvdXQiCisgICAgICAgICAgICBhcmd1bWVudC4gWW91IGNhbid0IHBhc3MgdGhpbmdzICJieSByZWZlcmVuY2UiIG92ZXIgdGhlIHdpcmUsIHNvCisgICAgICAgICAgICAiaW5vdXQiIGlzIHB1cmVseSBhbiBpbGx1c2lvbiBvZiB0aGUgaW4tcHJvY2VzcyBBUEkuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgR2l2ZW4gYSBtZXRob2Qgd2l0aCB6ZXJvIG9yIG9uZSByZXR1cm4gdmFsdWVzLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUKKyAgICAgICAgICAgIGFyZ3VtZW50cywgd2hlcmUgZWFjaCBhcmd1bWVudCBtYXkgYmUgImluIiwgIm91dCIsIG9yICJpbm91dCIsIHRoZQorICAgICAgICAgICAgY2FsbGVyIGNvbnN0cnVjdHMgYSBtZXNzYWdlIGJ5IGFwcGVuZGluZyBlYWNoICJpbiIgb3IgImlub3V0IiBhcmd1bWVudCwKKyAgICAgICAgICAgIGluIG9yZGVyLiAib3V0IiBhcmd1bWVudHMgYXJlIG5vdCByZXByZXNlbnRlZCBpbiB0aGUgY2FsbGVyJ3MgbWVzc2FnZS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgcmVjaXBpZW50IGNvbnN0cnVjdHMgYSByZXBseSBieSBhcHBlbmRpbmcgZmlyc3QgdGhlIHJldHVybiB2YWx1ZSAKKyAgICAgICAgICAgIGlmIGFueSwgdGhlbiBlYWNoICJvdXQiIG9yICJpbm91dCIgYXJndW1lbnQsIGluIG9yZGVyLiAKKyAgICAgICAgICAgICJpbiIgYXJndW1lbnRzIGFyZSBub3QgcmVwcmVzZW50ZWQgaW4gdGhlIHJlcGx5IG1lc3NhZ2UuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRXJyb3IgcmVwbGllcyBhcmUgbm9ybWFsbHkgbWFwcGVkIHRvIGV4Y2VwdGlvbnMgaW4gbGFuZ3VhZ2VzIHRoYXQgaGF2ZQorICAgICAgICAgICAgZXhjZXB0aW9ucy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBjb252ZXJ0aW5nIGZyb20gbmF0aXZlIEFQSXMgdG8gRC1CdXMsIGl0IGlzIHBlcmhhcHMgbmljZSB0byAKKyAgICAgICAgICAgIG1hcCBELUJ1cyBuYW1pbmcgY29udmVudGlvbnMgKCJGb29CYXIiKSB0byBuYXRpdmUgY29udmVudGlvbnMgCisgICAgICAgICAgICBzdWNoIGFzICJmb29CYXIiIG9yICJmb29fYmFyIiBhdXRvbWF0aWNhbGx5LiBUaGlzIGlzIE9LIAorICAgICAgICAgICAgYXMgbG9uZyBhcyB5b3UgY2FuIHNheSB0aGF0IHRoZSBuYXRpdmUgQVBJIGlzIG9uZSB0aGF0IAorICAgICAgICAgICAgd2FzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBELUJ1cy4gSXQgbWFrZXMgdGhlIG1vc3Qgc2Vuc2UKKyAgICAgICAgICAgIHdoZW4gd3JpdGluZyBvYmplY3QgaW1wbGVtZW50YXRpb25zIHRoYXQgd2lsbCBiZSBleHBvcnRlZCAKKyAgICAgICAgICAgIG92ZXIgdGhlIGJ1cy4gT2JqZWN0IHByb3hpZXMgdXNlZCB0byBpbnZva2UgcmVtb3RlIEQtQnVzIAorICAgICAgICAgICAgb2JqZWN0cyBwcm9iYWJseSBuZWVkIHRoZSBhYmlsaXR5IHRvIGNhbGwgYW55IEQtQnVzIG1ldGhvZCwKKyAgICAgICAgICAgIGFuZCB0aHVzIGEgbWFnaWMgbmFtZSBtYXBwaW5nIGxpa2UgdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhbnl0aGluZyBvZiBuYXRpdmUgQVBJIGJpbmRpbmdzOworICAgICAgICAgICAgdGhlIHByZWNlZGluZyBpcyBvbmx5IGEgc3VnZ2VzdGVkIGNvbnZlbnRpb24gZm9yIGNvbnNpc3RlbmN5IAorICAgICAgICAgICAgYW1vbmcgYmluZGluZ3MuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Q0PgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLXNpZ25hbCI+CisgICAgICAgIDx0aXRsZT5TaWduYWwgRW1pc3Npb248L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBVbmxpa2UgbWV0aG9kIGNhbGxzLCBzaWduYWwgZW1pc3Npb25zIGhhdmUgbm8gcmVwbGllcy4gCisgICAgICAgICAgQSBzaWduYWwgZW1pc3Npb24gaXMgc2ltcGx5IGEgc2luZ2xlIG1lc3NhZ2Ugb2YgdHlwZSA8bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+LgorICAgICAgICAgIEl0IG11c3QgaGF2ZSB0aHJlZSBoZWFkZXIgZmllbGRzOiA8bGl0ZXJhbD5QQVRIPC9saXRlcmFsPiBnaXZpbmcgdGhlIG9iamVjdCAKKyAgICAgICAgICB0aGUgc2lnbmFsIHdhcyBlbWl0dGVkIGZyb20sIHBsdXMgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+TUVNQkVSPC9saXRlcmFsPiBnaXZpbmcKKyAgICAgICAgICB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNpZ25hbC4gVGhlIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gaGVhZGVyIGlzIHJlcXVpcmVkCisgICAgICAgICAgZm9yIHNpZ25hbHMsIHRob3VnaCBpdCBpcyBvcHRpb25hbCBmb3IgbWV0aG9kIGNhbGxzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtZXJyb3JzIj4KKyAgICAgICAgPHRpdGxlPkVycm9yczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE1lc3NhZ2VzIG9mIHR5cGUgPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+IGFyZSBtb3N0IGNvbW1vbmx5IHJlcGxpZXMgCisgICAgICAgICAgdG8gYSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4sIGJ1dCBtYXkgYmUgcmV0dXJuZWQgaW4gcmVwbHkgCisgICAgICAgICAgdG8gYW55IGtpbmQgb2YgbWVzc2FnZS4gVGhlIG1lc3NhZ2UgYnVzIGZvciBleGFtcGxlCisgICAgICAgICAgd2lsbCByZXR1cm4gYW4gPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+IGluIHJlcGx5IHRvIGEgc2lnbmFsIGVtaXNzaW9uIGlmIAorICAgICAgICAgIHRoZSBidXMgZG9lcyBub3QgaGF2ZSBlbm91Z2ggbWVtb3J5IHRvIHNlbmQgdGhlIHNpZ25hbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBbiA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4gbWF5IGhhdmUgYW55IGFyZ3VtZW50cywgYnV0IGlmIHRoZSBmaXJzdCAKKyAgICAgICAgICBhcmd1bWVudCBpcyBhIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4sIGl0IG11c3QgYmUgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBtYXkgYmUgbG9nZ2VkIG9yIHNob3duIHRvIHRoZSB1c2VyCisgICAgICAgICAgaW4gc29tZSB3YXkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcy1ub3RhdGlvbiI+CisgICAgICAgIDx0aXRsZT5Ob3RhdGlvbiBpbiB0aGlzIGRvY3VtZW50PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBkb2N1bWVudCB1c2VzIGEgc2ltcGxlIHBzZXVkby1JREwgdG8gZGVzY3JpYmUgcGFydGljdWxhciBtZXRob2QgCisgICAgICAgICAgY2FsbHMgYW5kIHNpZ25hbHMuIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIG1ldGhvZCBjYWxsOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlN0YXJ0U2VydmljZUJ5TmFtZSAoaW4gU1RSSU5HIG5hbWUsIGluIFVJTlQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IFVJTlQzMiByZXN1bHRjb2RlKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgVGhpcyBtZWFucyA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+ID0gb3JnLmZyZWVkZXNrdG9wLkRCdXMsIDxsaXRlcmFsPk1FTUJFUjwvbGl0ZXJhbD4gPSBTdGFydFNlcnZpY2VCeU5hbWUsIAorICAgICAgICAgIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiBhcmd1bWVudHMgYXJlIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IGFyZ3VtZW50CisgICAgICAgICAgaXMgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPi4gUmVtZW1iZXIgdGhhdCB0aGUgPGxpdGVyYWw+TUVNQkVSPC9saXRlcmFsPiBmaWVsZCBjYW4ndCBjb250YWluIGFueSAnLicgKHBlcmlvZCkKKyAgICAgICAgICBjaGFyYWN0ZXJzIHNvIGl0J3Mga25vd24gdGhhdCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBuYW1lIGluCisgICAgICAgICAgdGhlICJJREwiIGlzIHRoZSBtZW1iZXIgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJbiBDKysgdGhhdCBtaWdodCBlbmQgdXAgbG9va2luZyBsaWtlIHRoaXM6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgdW5zaWduZWQgaW50IG9yZzo6ZnJlZWRlc2t0b3A6OkRCdXM6OlN0YXJ0U2VydmljZUJ5TmFtZSAoY29uc3QgY2hhciAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgb3IgZXF1YWxseSB2YWxpZCwgdGhlIHJldHVybiB2YWx1ZSBjb3VsZCBiZSBkb25lIGFzIGFuIGFyZ3VtZW50OgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIHZvaWQgb3JnOjpmcmVlZGVza3RvcDo6REJ1czo6U3RhcnRTZXJ2aWNlQnlOYW1lIChjb25zdCBjaGFyICAgKm5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpyZXN1bHRjb2RlKTsKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIEl0J3MgcmVhbGx5IHVwIHRvIHRoZSBBUEkgZGVzaWduZXIgaG93IHRoZXkgd2FudCB0byBtYWtlIAorICAgICAgICAgIHRoaXMgbG9vay4gWW91IGNvdWxkIGRlc2lnbiBhbiBBUEkgd2hlcmUgdGhlIG5hbWVzcGFjZSB3YXNuJ3QgdXNlZCAKKyAgICAgICAgICBpbiBDKyssIHVzaW5nIFNUTCBvciBRdCwgdXNpbmcgdmFyYXJncywgb3Igd2hhdGV2ZXIgeW91IHdhbnRlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTaWduYWxzIGFyZSB3cml0dGVuIGFzIGZvbGxvd3M6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUxvc3QgKFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgU2lnbmFscyBkb24ndCBzcGVjaWZ5ICJpbiIgdnMuICJvdXQiIGJlY2F1c2Ugb25seSAKKyAgICAgICAgICBhIHNpbmdsZSBkaXJlY3Rpb24gaXMgcG9zc2libGUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXQgaXNuJ3QgZXNwZWNpYWxseSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGxhbWUgcHNldWRvLUlETCBpbiBhY3R1YWwKKyAgICAgICAgICBBUEkgaW1wbGVtZW50YXRpb25zOyB5b3UgbWlnaHQgdXNlIHRoZSBuYXRpdmUgbm90YXRpb24gZm9yIHRoZQorICAgICAgICAgIGxhbmd1YWdlIHlvdSdyZSB1c2luZywgb3IgeW91IG1pZ2h0IHVzZSBDT00gb3IgQ09SQkEgSURMLCBmb3IgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLWhhbmRsaW5nLWludmFsaWQiPgorICAgICAgPHRpdGxlPkludmFsaWQgUHJvdG9jb2wgYW5kIFNwZWMgRXh0ZW5zaW9uczwvdGl0bGU+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICBGb3Igc2VjdXJpdHkgcmVhc29ucywgdGhlIEQtQnVzIHByb3RvY29sIHNob3VsZCBiZSBzdHJpY3RseSBwYXJzZWQgYW5kCisgICAgICAgIHZhbGlkYXRlZCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGRlZmluZWQgZXh0ZW5zaW9uIHBvaW50cy4gQW55IGludmFsaWQKKyAgICAgICAgcHJvdG9jb2wgb3Igc3BlYyB2aW9sYXRpb25zIHNob3VsZCByZXN1bHQgaW4gaW1tZWRpYXRlbHkgZHJvcHBpbmcgdGhlCisgICAgICAgIGNvbm5lY3Rpb24gd2l0aG91dCBub3RpY2UgdG8gdGhlIG90aGVyIGVuZC4gRXhjZXB0aW9ucyBzaG91bGQgYmUKKyAgICAgICAgY2FyZWZ1bGx5IGNvbnNpZGVyZWQsIGUuZy4gYW4gZXhjZXB0aW9uIG1heSBiZSB3YXJyYW50ZWQgZm9yIGEKKyAgICAgICAgd2VsbC11bmRlcnN0b29kIGlkaW9zeW5jcmFzeSBvZiBhIHdpZGVseS1kZXBsb3llZCBpbXBsZW1lbnRhdGlvbi4gIEluCisgICAgICAgIGNhc2VzIHdoZXJlIHRoZSBvdGhlciBlbmQgb2YgYSBjb25uZWN0aW9uIGlzIDEwMCUgdHJ1c3RlZCBhbmQga25vd24gdG8KKyAgICAgICAgYmUgZnJpZW5kbHksIHNraXBwaW5nIHZhbGlkYXRpb24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgY291bGQgYWxzbyBtYWtlCisgICAgICAgIHNlbnNlIGluIGNlcnRhaW4gY2FzZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBHZW5lcmFsbHkgc3BlYWtpbmcgdmlvbGF0aW9ucyBvZiB0aGUgIm11c3QiIHJlcXVpcmVtZW50cyBpbiB0aGlzIHNwZWMgCisgICAgICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIHBvc3NpYmxlIGF0dGVtcHRzIHRvIGV4cGxvaXQgc2VjdXJpdHksIGFuZCB2aW9sYXRpb25zIAorICAgICAgICBvZiB0aGUgInNob3VsZCIgc3VnZ2VzdGlvbnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbGVnaXRpbWF0ZSAodGhvdWdoIHBlcmhhcHMKKyAgICAgICAgdGhleSBzaG91bGQgZ2VuZXJhdGUgYW4gZXJyb3IgaW4gc29tZSBjYXNlcykuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludHMgYXJlIGJ1aWx0IGluIHRvIEQtQnVzIG9uIHB1cnBvc2UgYW5kIG11c3QKKyAgICAgICAgbm90IGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBwcm90b2NvbC4gVGhlIGV4dGVuc2lvbiBwb2ludHMgYXJlIGludGVuZGVkCisgICAgICAgIGZvciB1c2UgYnkgZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgc3BlYywgdGhleSBhcmUgbm90IGludGVuZGVkIGZvciB0aGlyZAorICAgICAgICBwYXJ0aWVzLiAgQXQgdGhlIG1vbWVudCwgdGhlIG9ubHkgd2F5IGEgdGhpcmQgcGFydHkgY291bGQgZXh0ZW5kIEQtQnVzCisgICAgICAgIHdpdGhvdXQgYnJlYWtpbmcgaW50ZXJvcGVyYWJpbGl0eSB3b3VsZCBiZSB0byBpbnRyb2R1Y2UgYSB3YXkgdG8gbmVnb3RpYXRlIG5ldworICAgICAgICBmZWF0dXJlIHN1cHBvcnQgYXMgcGFydCBvZiB0aGUgYXV0aCBwcm90b2NvbCwgdXNpbmcgRVhURU5TSU9OXy1wcmVmaXhlZAorICAgICAgICBjb21tYW5kcy4gVGhlcmUgaXMgbm90IHlldCBhIHN0YW5kYXJkIHdheSB0byBuZWdvdGlhdGUgZmVhdHVyZXMuCisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEluIHRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCAoc2VlIDx4cmVmIGxpbmtlbmQ9ImF1dGgtcHJvdG9jb2wiLz4pIHVua25vd24gCisgICAgICAgICAgICAgICAgY29tbWFuZHMgcmVzdWx0IGluIGFuIEVSUk9SIHJhdGhlciB0aGFuIGEgZGlzY29ubmVjdC4gVGhpcyBlbmFibGVzIAorICAgICAgICAgICAgICAgIGZ1dHVyZSBleHRlbnNpb25zIHRvIHRoZSBwcm90b2NvbC4gQ29tbWFuZHMgc3RhcnRpbmcgd2l0aCBFWFRFTlNJT05fIGFyZSAKKyAgICAgICAgICAgICAgICByZXNlcnZlZCBmb3IgdGhpcmQgcGFydGllcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgc3VwcG9ydHMgcGx1Z2dhYmxlIGF1dGggbWVjaGFuaXNtcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgYWRkcmVzcyBmb3JtYXQgKHNlZSA8eHJlZiBsaW5rZW5kPSJhZGRyZXNzZXMiLz4pIHN1cHBvcnRzIG5ldworICAgICAgICAgICAgICBraW5kcyBvZiB0cmFuc3BvcnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTWVzc2FnZXMgd2l0aCBhbiB1bmtub3duIHR5cGUgKHNvbWV0aGluZyBvdGhlciB0aGFuCisgICAgICAgICAgICAgIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiwgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiwgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPikgYXJlIGlnbm9yZWQuIAorICAgICAgICAgICAgICBVbmtub3duLXR5cGUgbWVzc2FnZXMgbXVzdCBzdGlsbCBiZSB3ZWxsLWZvcm1lZCBpbiB0aGUgc2FtZSB3YXkgCisgICAgICAgICAgICAgIGFzIHRoZSBrbm93biBtZXNzYWdlcywgaG93ZXZlci4gVGhleSBzdGlsbCBoYXZlIHRoZSBub3JtYWwgCisgICAgICAgICAgICAgIGhlYWRlciBhbmQgYm9keS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBIZWFkZXIgZmllbGRzIHdpdGggYW4gdW5rbm93biBvciB1bmV4cGVjdGVkIGZpZWxkIGNvZGUgbXVzdCBiZSBpZ25vcmVkLCAKKyAgICAgICAgICAgICAgdGhvdWdoIGFnYWluIHRoZXkgbXVzdCBzdGlsbCBiZSB3ZWxsLWZvcm1lZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBOZXcgc3RhbmRhcmQgaW50ZXJmYWNlcyAod2l0aCBuZXcgbWV0aG9kcyBhbmQgc2lnbmFscykgY2FuIG9mIGNvdXJzZSBiZSBhZGRlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9ImF1dGgtcHJvdG9jb2wiPgorICAgIDx0aXRsZT5BdXRoZW50aWNhdGlvbiBQcm90b2NvbDwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBCZWZvcmUgdGhlIGZsb3cgb2YgbWVzc2FnZXMgYmVnaW5zLCB0d28gYXBwbGljYXRpb25zIG11c3QKKyAgICAgIGF1dGhlbnRpY2F0ZS4gQSBzaW1wbGUgcGxhaW4tdGV4dCBwcm90b2NvbCBpcyB1c2VkIGZvcgorICAgICAgYXV0aGVudGljYXRpb247IHRoaXMgcHJvdG9jb2wgaXMgYSBTQVNMIHByb2ZpbGUsIGFuZCBtYXBzIGZhaXJseQorICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgU0FTTCBzcGVjaWZpY2F0aW9uLiBUaGUgbWVzc2FnZSBlbmNvZGluZyBpcworICAgICAgTk9UIHVzZWQgaGVyZSwgb25seSBwbGFpbiB0ZXh0IG1lc3NhZ2VzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEluIGV4YW1wbGVzLCAiQzoiIGFuZCAiUzoiIGluZGljYXRlIGxpbmVzIHNlbnQgYnkgdGhlIGNsaWVudCBhbmQKKyAgICAgIHNlcnZlciByZXNwZWN0aXZlbHkuCisgICAgPC9wYXJhPgorICAgIDxzZWN0MiBpZD0iYXV0aC1wcm90b2NvbC1vdmVydmlldyI+CisgICAgICA8dGl0bGU+UHJvdG9jb2wgT3ZlcnZpZXc8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBwcm90b2NvbCBpcyBhIGxpbmUtYmFzZWQgcHJvdG9jb2wsIHdoZXJlIGVhY2ggbGluZSBlbmRzIHdpdGgKKyAgICAgICAgXHJcbi4gRWFjaCBsaW5lIGJlZ2lucyB3aXRoIGFuIGFsbC1jYXBzIEFTQ0lJIGNvbW1hbmQgbmFtZSBjb250YWluaW5nCisgICAgICAgIG9ubHkgdGhlIGNoYXJhY3RlciByYW5nZSBbQS1aX10sIGEgc3BhY2UsIHRoZW4gYW55IGFyZ3VtZW50cyBmb3IgdGhlCisgICAgICAgIGNvbW1hbmQsIHRoZW4gdGhlIFxyXG4gZW5kaW5nIHRoZSBsaW5lLiBUaGUgcHJvdG9jb2wgaXMKKyAgICAgICAgY2FzZS1zZW5zaXRpdmUuIEFsbCBieXRlcyBtdXN0IGJlIGluIHRoZSBBU0NJSSBjaGFyYWN0ZXIgc2V0LgorCisgICAgICAgIENvbW1hbmRzIGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmVyIGFyZSBhcyBmb2xsb3dzOgorCisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisJICA8bGlzdGl0ZW0+PHBhcmE+QVVUSCBbbWVjaGFuaXNtXSBbaW5pdGlhbC1yZXNwb25zZV08L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5DQU5DRUw8L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5CRUdJTjwvcGFyYT48L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPjxwYXJhPkRBVEEgJmx0O2RhdGEgaW4gaGV4IGVuY29kaW5nJmd0OzwvcGFyYT48L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPjxwYXJhPkVSUk9SIFtodW1hbi1yZWFkYWJsZSBlcnJvciBleHBsYW5hdGlvbl08L3BhcmE+PC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT48cGFyYT5ORUdPVElBVEVfVU5JWF9GRDwvcGFyYT48L2xpc3RpdGVtPgorCTwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgIEZyb20gc2VydmVyIHRvIGNsaWVudCBhcmUgYXMgZm9sbG93czoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCSAgPGxpc3RpdGVtPjxwYXJhPlJFSkVDVEVEICZsdDtzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWNoYW5pc20gbmFtZXMmZ3Q7PC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+T0sgJmx0O0dVSUQgaW4gaGV4Jmd0OzwvcGFyYT48L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPjxwYXJhPkRBVEEgJmx0O2RhdGEgaW4gaGV4IGVuY29kaW5nJmd0OzwvcGFyYT48L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPjxwYXJhPkVSUk9SPC9wYXJhPjwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+PHBhcmE+QUdSRUVfVU5JWF9GRDwvcGFyYT48L2xpc3RpdGVtPgorCTwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVub2ZmaWNpYWwgZXh0ZW5zaW9ucyB0byB0aGUgY29tbWFuZCBzZXQgbXVzdCBiZWdpbiB3aXRoIHRoZSBsZXR0ZXJzIAorICAgICAgICAiRVhURU5TSU9OXyIsIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGZ1dHVyZSBvZmZpY2lhbCBjb21tYW5kcy4KKyAgICAgICAgRm9yIGV4YW1wbGUsICJFWFRFTlNJT05fQ09NX01ZRE9NQUlOX0RPX1NUVUZGIi4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1udWwtYnl0ZSI+CisgICAgICA8dGl0bGU+U3BlY2lhbCBjcmVkZW50aWFscy1wYXNzaW5nIG51bCBieXRlPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJbW1lZGlhdGVseSBhZnRlciBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXIsIHRoZSBjbGllbnQgbXVzdCBzZW5kIGEKKyAgICAgICAgc2luZ2xlIG51bCBieXRlLiBUaGlzIGJ5dGUgbWF5IGJlIGFjY29tcGFuaWVkIGJ5IGNyZWRlbnRpYWxzCisgICAgICAgIGluZm9ybWF0aW9uIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCB1c2Ugc2VuZG1zZygpIHdpdGgKKyAgICAgICAgU0NNX0NSRURTIG9yIFNDTV9DUkVERU5USUFMUyB0byBwYXNzIGNyZWRlbnRpYWxzIG92ZXIgVU5JWCBkb21haW4KKyAgICAgICAgc29ja2V0cy4gSG93ZXZlciwgdGhlIG51bCBieXRlIG11c3QgYmUgc2VudCBldmVuIG9uIG90aGVyIGtpbmRzIG9mCisgICAgICAgIHNvY2tldCwgYW5kIGV2ZW4gb24gb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBkbyBub3QgcmVxdWlyZSBhIGJ5dGUgdG8gYmUKKyAgICAgICAgc2VudCBpbiBvcmRlciB0byB0cmFuc21pdCBjcmVkZW50aWFscy4gVGhlIHRleHQgcHJvdG9jb2wgZGVzY3JpYmVkIGluCisgICAgICAgIHRoaXMgZG9jdW1lbnQgYmVnaW5zIGFmdGVyIHRoZSBzaW5nbGUgbnVsIGJ5dGUuIElmIHRoZSBmaXJzdCBieXRlCisgICAgICAgIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudCBpcyBub3QgYSBudWwgYnl0ZSwgdGhlIHNlcnZlciBtYXkgZGlzY29ubmVjdCAKKyAgICAgICAgdGhhdCBjbGllbnQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgQSBudWwgYnl0ZSBpbiBhbnkgY29udGV4dCBvdGhlciB0aGFuIHRoZSBpbml0aWFsIGJ5dGUgaXMgYW4gZXJyb3I7IAorICAgICAgICB0aGUgcHJvdG9jb2wgaXMgQVNDSUktb25seS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgY3JlZGVudGlhbHMgc2VudCBhbG9uZyB3aXRoIHRoZSBudWwgYnl0ZSBtYXkgYmUgdXNlZCB3aXRoIHRoZSAKKyAgICAgICAgU0FTTCBtZWNoYW5pc20gRVhURVJOQUwuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1hdXRoIj4KKyAgICAgIDx0aXRsZT5BVVRIIGNvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGFuIEFVVEggY29tbWFuZCBoYXMgbm8gYXJndW1lbnRzLCBpdCBpcyBhIHJlcXVlc3QgdG8gbGlzdAorICAgICAgICBhdmFpbGFibGUgbWVjaGFuaXNtcy4gVGhlIHNlcnZlciBtdXN0IHJlc3BvbmQgd2l0aCBhIFJFSkVDVEVECisgICAgICAgIGNvbW1hbmQgbGlzdGluZyB0aGUgbWVjaGFuaXNtcyBpdCB1bmRlcnN0YW5kcywgb3Igd2l0aCBhbiBlcnJvci4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBhbiBBVVRIIGNvbW1hbmQgc3BlY2lmaWVzIGEgbWVjaGFuaXNtLCBhbmQgdGhlIHNlcnZlciBzdXBwb3J0cworICAgICAgICBzYWlkIG1lY2hhbmlzbSwgdGhlIHNlcnZlciBzaG91bGQgYmVnaW4gZXhjaGFuZ2luZyBTQVNMCisgICAgICAgIGNoYWxsZW5nZS1yZXNwb25zZSBkYXRhIHdpdGggdGhlIGNsaWVudCB1c2luZyBEQVRBIGNvbW1hbmRzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbWVjaGFuaXNtIGdpdmVuIGluIHRoZSBBVVRICisgICAgICAgIGNvbW1hbmQsIGl0IG11c3Qgc2VuZCBlaXRoZXIgYSBSRUpFQ1RFRCBjb21tYW5kIGxpc3RpbmcgdGhlIG1lY2hhbmlzbXMKKyAgICAgICAgaXQgZG9lcyBzdXBwb3J0LCBvciBhbiBlcnJvci4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiB0aGUgW2luaXRpYWwtcmVzcG9uc2VdIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBpdCBpcyBpbnRlbmRlZCBmb3IgdXNlCisgICAgICAgIHdpdGggbWVjaGFuaXNtcyB0aGF0IGhhdmUgbm8gaW5pdGlhbCBjaGFsbGVuZ2UgKG9yIGFuIGVtcHR5IGluaXRpYWwKKyAgICAgICAgY2hhbGxlbmdlKSwgYXMgaWYgaXQgd2VyZSB0aGUgYXJndW1lbnQgdG8gYW4gaW5pdGlhbCBEQVRBIGNvbW1hbmQuIElmCisgICAgICAgIHRoZSBzZWxlY3RlZCBtZWNoYW5pc20gaGFzIGFuIGluaXRpYWwgY2hhbGxlbmdlIGFuZCBbaW5pdGlhbC1yZXNwb25zZV0KKyAgICAgICAgd2FzIHByb3ZpZGVkLCB0aGUgc2VydmVyIHNob3VsZCByZWplY3QgYXV0aGVudGljYXRpb24gYnkgc2VuZGluZworICAgICAgICBSRUpFQ1RFRC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBhdXRoZW50aWNhdGlvbiBzdWNjZWVkcyBhZnRlciBleGNoYW5naW5nIERBVEEgY29tbWFuZHMsIAorICAgICAgICBhbiBPSyBjb21tYW5kIG11c3QgYmUgc2VudCB0byB0aGUgY2xpZW50LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmaXJzdCBvY3RldCByZWNlaXZlZCBieSB0aGUgc2VydmVyIGFmdGVyIHRoZSBcclxuIG9mIHRoZSBCRUdJTgorICAgICAgICBjb21tYW5kIGZyb20gdGhlIGNsaWVudCBtdXN0IGJlIHRoZSBmaXJzdCBvY3RldCBvZiB0aGUKKyAgICAgICAgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIEJFR0lOIGlzIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIsIHRoZSBmaXJzdCBvY3RldCByZWNlaXZlZAorICAgICAgICBieSB0aGUgY2xpZW50IGFmdGVyIHRoZSBcclxuIG9mIHRoZSBPSyBjb21tYW5kIG11c3QgYmUgdGhlCisgICAgICAgIGZpcnN0IG9jdGV0IG9mIHRoZSBhdXRoZW50aWNhdGVkL2VuY3J5cHRlZCBzdHJlYW0gb2YgRC1CdXMKKyAgICAgICAgbWVzc2FnZXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1jYW5jZWwiPgorICAgICAgPHRpdGxlPkNBTkNFTCBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBdCBhbnkgdGltZSB1cCB0byBzZW5kaW5nIHRoZSBCRUdJTiBjb21tYW5kLCB0aGUgY2xpZW50IG1heSBzZW5kIGEKKyAgICAgICAgQ0FOQ0VMIGNvbW1hbmQuIE9uIHJlY2VpdmluZyB0aGUgQ0FOQ0VMIGNvbW1hbmQsIHRoZSBzZXJ2ZXIgbXVzdAorICAgICAgICBzZW5kIGEgUkVKRUNURUQgY29tbWFuZCBhbmQgYWJvcnQgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgZXhjaGFuZ2UuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1kYXRhIj4KKyAgICAgIDx0aXRsZT5EQVRBIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBEQVRBIGNvbW1hbmQgbWF5IGNvbWUgZnJvbSBlaXRoZXIgY2xpZW50IG9yIHNlcnZlciwgYW5kIHNpbXBseSAKKyAgICAgICAgY29udGFpbnMgYSBoZXgtZW5jb2RlZCBibG9jayBvZiBkYXRhIHRvIGJlIGludGVycHJldGVkIAorICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIFNBU0wgbWVjaGFuaXNtIGluIHVzZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBTb21lIFNBU0wgbWVjaGFuaXNtcyBzdXBwb3J0IHNlbmRpbmcgYW4gImVtcHR5IHN0cmluZyI7IAorICAgICAgICBGSVhNRSB3ZSBuZWVkIHNvbWUgd2F5IHRvIGRvIHRoaXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1iZWdpbiI+CisgICAgICA8dGl0bGU+QkVHSU4gQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIEJFR0lOIGNvbW1hbmQgYWNrbm93bGVkZ2VzIHRoYXQgdGhlIGNsaWVudCBoYXMgcmVjZWl2ZWQgYW4gCisgICAgICAgIE9LIGNvbW1hbmQgZnJvbSB0aGUgc2VydmVyLCBhbmQgdGhhdCB0aGUgc3RyZWFtIG9mIG1lc3NhZ2VzCisgICAgICAgIGlzIGFib3V0IHRvIGJlZ2luLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciBhZnRlciB0aGUgXHJcbiBvZiB0aGUgQkVHSU4KKyAgICAgICAgY29tbWFuZCBmcm9tIHRoZSBjbGllbnQgbXVzdCBiZSB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlCisgICAgICAgIGF1dGhlbnRpY2F0ZWQvZW5jcnlwdGVkIHN0cmVhbSBvZiBELUJ1cyBtZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLXJlamVjdGVkIj4KKyAgICAgIDx0aXRsZT5SRUpFQ1RFRCBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgUkVKRUNURUQgY29tbWFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBhdXRoZW50aWNhdGlvbgorICAgICAgICBleGNoYW5nZSBoYXMgZmFpbGVkLCBhbmQgZnVydGhlciBleGNoYW5nZSBvZiBEQVRBIGlzIGluYXBwcm9wcmlhdGUuCisgICAgICAgIFRoZSBjbGllbnQgd291bGQgbm9ybWFsbHkgdHJ5IGFub3RoZXIgbWVjaGFuaXNtLCBvciB0cnkgcHJvdmlkaW5nCisgICAgICAgIGRpZmZlcmVudCByZXNwb25zZXMgdG8gY2hhbGxlbmdlcy4KKyAgICAgIDwvcGFyYT48cGFyYT4KKyAgICAgICAgT3B0aW9uYWxseSwgdGhlIFJFSkVDVEVEIGNvbW1hbmQgaGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKKyAgICAgICAgYXZhaWxhYmxlIGF1dGggbWVjaGFuaXNtcyBhcyBhcmd1bWVudHMuIElmIGEgc2VydmVyIGV2ZXIgcHJvdmlkZXMKKyAgICAgICAgYSBsaXN0IG9mIHN1cHBvcnRlZCBtZWNoYW5pc21zLCBpdCBtdXN0IHByb3ZpZGUgdGhlIHNhbWUgbGlzdCAKKyAgICAgICAgZWFjaCB0aW1lIGl0IHNlbmRzIGEgUkVKRUNURUQgbWVzc2FnZS4gQ2xpZW50cyBhcmUgZnJlZSB0byAKKyAgICAgICAgaWdub3JlIGFsbCBsaXN0cyByZWNlaXZlZCBhZnRlciB0aGUgZmlyc3QuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1vayI+CisgICAgICA8dGl0bGU+T0sgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIE9LIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbgorICAgICAgICBhdXRoZW50aWNhdGVkLiBUaGUgY2xpZW50IG1heSBub3cgcHJvY2VlZCB3aXRoIG5lZ290aWF0aW5nCisgICAgICAgIFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcuIFRvIGRvIHRoYXQgaXQgc2hhbGwgc2VuZAorICAgICAgICBORUdPVElBVEVfVU5JWF9GRCB0byB0aGUgc2VydmVyLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE90aGVyd2lzZSwgdGhlIGNsaWVudCBtdXN0IHJlc3BvbmQgdG8gdGhlIE9LIGNvbW1hbmQgYnkKKyAgICAgICAgc2VuZGluZyBhIEJFR0lOIGNvbW1hbmQsIGZvbGxvd2VkIGJ5IGl0cyBzdHJlYW0gb2YgbWVzc2FnZXMsCisgICAgICAgIG9yIGJ5IGRpc2Nvbm5lY3RpbmcuICBUaGUgc2VydmVyIG11c3Qgbm90IGFjY2VwdCBhZGRpdGlvbmFsCisgICAgICAgIGNvbW1hbmRzIHVzaW5nIHRoaXMgcHJvdG9jb2wgYWZ0ZXIgdGhlIEJFR0lOIGNvbW1hbmQgaGFzIGJlZW4KKyAgICAgICAgcmVjZWl2ZWQuIEZ1cnRoZXIgY29tbXVuaWNhdGlvbiB3aWxsIGJlIGEgc3RyZWFtIG9mIEQtQnVzCisgICAgICAgIG1lc3NhZ2VzIChvcHRpb25hbGx5IGVuY3J5cHRlZCwgYXMgbmVnb3RpYXRlZCkgcmF0aGVyIHRoYW4KKyAgICAgICAgdGhpcyBwcm90b2NvbC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBhIGNsaWVudCBzZW5kcyBCRUdJTiB0aGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQgYnkgdGhlIGNsaWVudAorICAgICAgICBhZnRlciB0aGUgXHJcbiBvZiB0aGUgT0sgY29tbWFuZCBtdXN0IGJlIHRoZSBmaXJzdCBvY3RldCBvZgorICAgICAgICB0aGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBPSyBjb21tYW5kIGhhcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBHVUlEIG9mIHRoZSBzZXJ2ZXIuCisgICAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJhZGRyZXNzZXMiLz4gZm9yIG1vcmUgb24gc2VydmVyIEdVSURzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtZXJyb3IiPgorICAgICAgPHRpdGxlPkVSUk9SIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBFUlJPUiBjb21tYW5kIGluZGljYXRlcyB0aGF0IGVpdGhlciBzZXJ2ZXIgb3IgY2xpZW50IGRpZCBub3QKKyAgICAgICAga25vdyBhIGNvbW1hbmQsIGRvZXMgbm90IGFjY2VwdCB0aGUgZ2l2ZW4gY29tbWFuZCBpbiB0aGUgY3VycmVudAorICAgICAgICBjb250ZXh0LCBvciBkaWQgbm90IHVuZGVyc3RhbmQgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tbWFuZC4gVGhpcworICAgICAgICBhbGxvd3MgdGhlIHByb3RvY29sIHRvIGJlIGV4dGVuZGVkOyBhIGNsaWVudCBvciBzZXJ2ZXIgY2FuIHNlbmQgYQorICAgICAgICBjb21tYW5kIHByZXNlbnQgb3IgcGVybWl0dGVkIG9ubHkgaW4gbmV3IHByb3RvY29sIHZlcnNpb25zLCBhbmQgaWYKKyAgICAgICAgYW4gRVJST1IgaXMgcmVjZWl2ZWQgaW5zdGVhZCBvZiBhbiBhcHByb3ByaWF0ZSByZXNwb25zZSwgZmFsbCBiYWNrCisgICAgICAgIHRvIHVzaW5nIHNvbWUgb3RoZXIgdGVjaG5pcXVlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGFuIEVSUk9SIGlzIHNlbnQsIHRoZSBzZXJ2ZXIgb3IgY2xpZW50IHRoYXQgc2VudCB0aGUKKyAgICAgICAgZXJyb3IgbXVzdCBjb250aW51ZSBhcyBpZiB0aGUgY29tbWFuZCBjYXVzaW5nIHRoZSBFUlJPUiBoYWQgbmV2ZXIgYmVlbgorICAgICAgICByZWNlaXZlZC4gSG93ZXZlciwgdGhlIHRoZSBzZXJ2ZXIgb3IgY2xpZW50IHJlY2VpdmluZyB0aGUgZXJyb3IgCisgICAgICAgIHNob3VsZCB0cnkgc29tZXRoaW5nIG90aGVyIHRoYW4gd2hhdGV2ZXIgY2F1c2VkIHRoZSBlcnJvcjsgCisgICAgICAgIGlmIG9ubHkgY2FuY2VsaW5nL3JlamVjdGluZyB0aGUgYXV0aGVudGljYXRpb24uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgdGhlIEQtQnVzIHByb3RvY29sIGNoYW5nZXMgaW5jb21wYXRpYmx5IGF0IHNvbWUgZnV0dXJlIHRpbWUsCisgICAgICAgIGFwcGxpY2F0aW9ucyBpbXBsZW1lbnRpbmcgdGhlIG5ldyBwcm90b2NvbCB3b3VsZCBwcm9iYWJseSBiZSBhYmxlIHRvCisgICAgICAgIGNoZWNrIGZvciBzdXBwb3J0IG9mIHRoZSBuZXcgcHJvdG9jb2wgYnkgc2VuZGluZyBhIG5ldyBjb21tYW5kIGFuZAorICAgICAgICByZWNlaXZpbmcgYW4gRVJST1IgZnJvbSBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIGl0LiBUaHVzIHRoZQorICAgICAgICBFUlJPUiBmZWF0dXJlIG9mIHRoZSBhdXRoIHByb3RvY29sIGlzIGFuIGVzY2FwZSBoYXRjaCB0aGF0IGxldHMgdXMKKyAgICAgICAgbmVnb3RpYXRlIGV4dGVuc2lvbnMgb3IgY2hhbmdlcyB0byB0aGUgRC1CdXMgcHJvdG9jb2wgaW4gdGhlIGZ1dHVyZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLW5lZ290aWF0ZS11bml4LWZkIj4KKyAgICAgIDx0aXRsZT5ORUdPVElBVEVfVU5JWF9GRCBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgTkVHT1RJQVRFX1VOSVhfRkQgY29tbWFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50CisgICAgICAgIHN1cHBvcnRzIFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcuIFRoaXMgY29tbWFuZCBtYXkgb25seQorICAgICAgICBiZSBzZW50IGFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGF1dGhlbnRpY2F0ZWQsIGkuZS4gYWZ0ZXIgT0sKKyAgICAgICAgd2FzIHJlY2VpdmVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgY29tbWFuZCBtYXkgb25seSBiZSBzZW50IG9uCisgICAgICAgIHRyYW5zcG9ydHMgdGhhdCBzdXBwb3J0IFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gcmVjZWl2aW5nIE5FR09USUFURV9VTklYX0ZEIHRoZSBzZXJ2ZXIgbXVzdCByZXNwb25kIHdpdGgKKyAgICAgICAgZWl0aGVyIEFHUkVFX1VOSVhfRkQgb3IgRVJST1IuIEl0IHNoYWxsIHJlc3BvbmQgdGhlIGZvcm1lciBpZgorICAgICAgICB0aGUgdHJhbnNwb3J0IGNob3NlbiBzdXBwb3J0cyBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIGFuZAorICAgICAgICB0aGUgc2VydmVyIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gSXQgc2hhbGwgcmVzcG9uZCB0aGUgbGF0dGVyCisgICAgICAgIGlmIHRoZSB0cmFuc3BvcnQgZG9lcyBub3Qgc3VwcG9ydCBVbml4IGZpbGUgZGVzY3JpcHRvcgorICAgICAgICBwYXNzaW5nLCB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLCBvciB0aGUKKyAgICAgICAgc2VydmVyIGRlY2lkZXMgbm90IHRvIGVuYWJsZSBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBkdWUgdG8KKyAgICAgICAgc2VjdXJpdHkgb3Igb3RoZXIgcmVhc29ucy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWFncmVlLXVuaXgtZmQiPgorICAgICAgPHRpdGxlPkFHUkVFX1VOSVhfRkQgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIEFHUkVFX1VOSVhfRkQgY29tbWFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmVyIHN1cHBvcnRzCisgICAgICAgIFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcuIFRoaXMgY29tbWFuZCBtYXkgb25seSBiZSBzZW50CisgICAgICAgIGFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGF1dGhlbnRpY2F0ZWQsIGFuZCB0aGUgY2xpZW50IHNlbnQKKyAgICAgICAgTkVHT1RJQVRFX1VOSVhfRkQgdG8gZW5hYmxlIFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcuIFRoaXMKKyAgICAgICAgY29tbWFuZCBtYXkgb25seSBiZSBzZW50IG9uIHRyYW5zcG9ydHMgdGhhdCBzdXBwb3J0IFVuaXggZmlsZQorICAgICAgICBkZXNjcmlwdG9yIHBhc3NpbmcuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gcmVjZWl2aW5nIEFHUkVFX1VOSVhfRkQgdGhlIGNsaWVudCBtdXN0IHJlc3BvbmQgd2l0aCBCRUdJTiwKKyAgICAgICAgZm9sbG93ZWQgYnkgaXRzIHN0cmVhbSBvZiBtZXNzYWdlcywgb3IgYnkgZGlzY29ubmVjdGluZy4gIFRoZQorICAgICAgICBzZXJ2ZXIgbXVzdCBub3QgYWNjZXB0IGFkZGl0aW9uYWwgY29tbWFuZHMgdXNpbmcgdGhpcyBwcm90b2NvbAorICAgICAgICBhZnRlciB0aGUgQkVHSU4gY29tbWFuZCBoYXMgYmVlbiByZWNlaXZlZC4gRnVydGhlcgorICAgICAgICBjb21tdW5pY2F0aW9uIHdpbGwgYmUgYSBzdHJlYW0gb2YgRC1CdXMgbWVzc2FnZXMgKG9wdGlvbmFsbHkKKyAgICAgICAgZW5jcnlwdGVkLCBhcyBuZWdvdGlhdGVkKSByYXRoZXIgdGhhbiB0aGlzIHByb3RvY29sLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtZnV0dXJlIj4KKyAgICAgIDx0aXRsZT5GdXR1cmUgRXh0ZW5zaW9uczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgRnV0dXJlIGV4dGVuc2lvbnMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGFuZCBuZWdvdGlhdGlvbgorICAgICAgICBwcm90b2NvbCBhcmUgcG9zc2libGUuIEZvciB0aGF0IG5ldyBjb21tYW5kcyBtYXkgYmUKKyAgICAgICAgaW50cm9kdWNlZC4gSWYgYSBjbGllbnQgb3Igc2VydmVyIHJlY2VpdmVzIGFuIHVua25vd24gY29tbWFuZAorICAgICAgICBpdCBzaGFsbCByZXNwb25kIHdpdGggRVJST1IgYW5kIG5vdCBjb25zaWRlciB0aGlzIGZhdGFsLiBOZXcKKyAgICAgICAgY29tbWFuZHMgbWF5IGJlIGludHJvZHVjZWQgYm90aCBiZWZvcmUsIGFuZCBhZnRlcgorICAgICAgICBhdXRoZW50aWNhdGlvbiwgaS5lLiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIE9LIGNvbW1hbmQuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtZXhhbXBsZXMiPgorICAgICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uIGV4YW1wbGVzPC90aXRsZT4KKyAgICAgIAorICAgICAgPHBhcmE+CisgICAgICAgIDxmaWd1cmU+CisJICA8dGl0bGU+RXhhbXBsZSBvZiBzdWNjZXNzZnVsIG1hZ2ljIGNvb2tpZSBhdXRoZW50aWNhdGlvbjwvdGl0bGU+CisJICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAoTUFHSUNfQ09PS0lFIGlzIGEgbWFkZSB1cCBtZWNoYW5pc20pCisKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDMxMzgzNjM5MzUzMzMxMzczOTM2MzUzODM2MzQKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCTwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgb2YgZmluZGluZyBvdXQgbWVjaGFuaXNtcyB0aGVuIHBpY2tpbmcgb25lPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEgKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisJICA8dGl0bGU+RXhhbXBsZSBvZiBjbGllbnQgc2VuZHMgdW5rbm93biBjb21tYW5kIHRoZW4gZmFsbHMgYmFjayB0byByZWd1bGFyIGF1dGg8L3RpdGxlPgorCSAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogRk9PQkFSCisgICAgICAgICAgICBTOiBFUlJPUgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisJICA8dGl0bGU+RXhhbXBsZSBvZiBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IGluaXRpYWwgYXV0aCBtZWNoYW5pc208L3RpdGxlPgorCSAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IERBVEEgOGFjODc2ZThmNjhlZTk4MDliZmE4NzZlNmY5ODc2ZzhmYThlNzZlOThmCisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKwk8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKwkgIDx0aXRsZT5FeGFtcGxlIG9mIHdyb25nIHBhc3N3b3JkIG9yIHRoZSBsaWtlIGZvbGxvd2VkIGJ5IHN1Y2Nlc3NmdWwgcmV0cnk8L3RpdGxlPgorCSAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IERBVEEgOGFjODc2ZThmNjhlZTk4MDliZmE4NzZlNmY5ODc2ZzhmYThlNzZlOThmCisgICAgICAgICAgICBTOiBSRUpFQ1RFRAorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IERBVEEgOGFjODc2ZThmNjhlZTk4MDliZmE4NzZlNmY5ODc2ZzhmYThlNzZlOThmCisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKwk8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKwkgIDx0aXRsZT5FeGFtcGxlIG9mIHNrZXkgY2FuY2VsbGVkIGFuZCByZXN0YXJ0ZWQ8L3RpdGxlPgorCSAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IENBTkNFTAorICAgICAgICAgICAgUzogUkVKRUNURUQKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisJICA8dGl0bGU+RXhhbXBsZSBvZiBzdWNjZXNzZnVsIG1hZ2ljIGNvb2tpZSBhdXRoZW50aWNhdGlvbiB3aXRoIHN1Y2Nlc3NmdWwgbmVnb3RpYXRpb24gb2YgVW5peCBGRCBwYXNzaW5nPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIChNQUdJQ19DT09LSUUgaXMgYSBtYWRlIHVwIG1lY2hhbmlzbSkKKworICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzEzODM2MzkzNTMzMzEzNzM5MzYzNTM4MzYzNAorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBORUdPVElBVEVfVU5JWF9GRAorICAgICAgICAgICAgUzogQUdSRUVfVU5JWF9GRAorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCTwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgb2Ygc3VjY2Vzc2Z1bCBtYWdpYyBjb29raWUgYXV0aGVudGljYXRpb24gd2l0aCB1bnN1Y2Nlc3NmdWwgbmVnb3RpYXRpb24gb2YgVW5peCBGRCBwYXNzaW5nPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIChNQUdJQ19DT09LSUUgaXMgYSBtYWRlIHVwIG1lY2hhbmlzbSkKKworICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzEzODM2MzkzNTMzMzEzNzM5MzYzNTM4MzYzNAorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBORUdPVElBVEVfVU5JWF9GRAorICAgICAgICAgICAgUzogRVJST1IKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKwk8L2ZpZ3VyZT4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1zdGF0ZXMiPgorICAgICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uIHN0YXRlIGRpYWdyYW1zPC90aXRsZT4KKyAgICAgIAorICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgc2VjdGlvbiBkb2N1bWVudHMgdGhlIGF1dGggcHJvdG9jb2wgaW4gdGVybXMgb2YgCisgICAgICAgIGEgc3RhdGUgbWFjaGluZSBmb3IgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4gVGhpcyBpcyAKKyAgICAgICAgcHJvYmFibHkgdGhlIG1vc3Qgcm9idXN0IHdheSB0byBpbXBsZW1lbnQgdGhlIHByb3RvY29sLgorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdDMgaWQ9ImF1dGgtc3RhdGVzLWNsaWVudCI+CisgICAgICAgIDx0aXRsZT5DbGllbnQgc3RhdGVzPC90aXRsZT4KKyAgICAgICAgCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRvIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZQorICAgICAgICAgIHByb3RvY29sIHN0YXRlIG1hY2hpbmUgYW5kIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHRoZQorICAgICAgICAgIGZvbGxvd2luZyBub3RhdGlvbiBpcyB1c2VkOiBNRUNIKENIQUxMKSBtZWFucyB0aGF0IHRoZQorICAgICAgICAgIHNlcnZlciBjaGFsbGVuZ2UgQ0hBTEwgd2FzIGZlZCB0byB0aGUgbWVjaGFuaXNtIE1FQ0gsIHdoaWNoCisgICAgICAgICAgcmV0dXJucyBvbmUgb2YKKworICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENPTlRJTlVFKFJFU1ApIG1lYW5zIGNvbnRpbnVlIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICAgICAgICAgICAgICAgIGFuZCBzZW5kIFJFU1AgYXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBzZXJ2ZXI7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT0soUkVTUCkgbWVhbnMgdGhhdCBhZnRlciBzZW5kaW5nIFJFU1AgdG8gdGhlIHNlcnZlcgorICAgICAgICAgICAgICAgIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgYXV0aCBjb252ZXJzYXRpb24gaXMgZmluaXNoZWQKKyAgICAgICAgICAgICAgICBhbmQgdGhlIHNlcnZlciBzaG91bGQgcmV0dXJuICJPSyI7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRVJST1IgbWVhbnMgdGhhdCBDSEFMTCB3YXMgaW52YWxpZCBhbmQgY291bGQgbm90IGJlCisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIAorICAgICAgICAgIEJvdGggUkVTUCBhbmQgQ0hBTEwgbWF5IGJlIGVtcHR5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIAorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgQ2xpZW50IHN0YXJ0cyBieSBnZXR0aW5nIGFuIGluaXRpYWwgcmVzcG9uc2UgZnJvbSB0aGUKKyAgICAgICAgICBkZWZhdWx0IG1lY2hhbmlzbSBhbmQgc2VuZHMgQVVUSCBNRUNIIFJFU1AsIG9yIEFVVEggTUVDSCBpZgorICAgICAgICAgIHRoZSBtZWNoYW5pc20gZGlkIG5vdCBwcm92aWRlIGFuIGluaXRpYWwgcmVzcG9uc2UuICBJZiB0aGUKKyAgICAgICAgICBtZWNoYW5pc20gcmV0dXJucyBDT05USU5VRSwgdGhlIGNsaWVudCBzdGFydHMgaW4gc3RhdGUKKyAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPiwgaWYgdGhlIG1lY2hhbmlzbQorICAgICAgICAgIHJldHVybnMgT0sgdGhlIGNsaWVudCBzdGFydHMgaW4gc3RhdGUKKyAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBjbGllbnQgc2hvdWxkIGtlZXAgdHJhY2sgb2YgYXZhaWxhYmxlIG1lY2hhbmlzbXMgYW5kCisgICAgICAgICAgd2hpY2ggaXQgbWVjaGFuaXNtcyBpdCBoYXMgYWxyZWFkeSBhdHRlbXB0ZWQuIFRoaXMgbGlzdCBpcworICAgICAgICAgIHVzZWQgdG8gZGVjaWRlIHdoaWNoIEFVVEggY29tbWFuZCB0byBzZW5kLiBXaGVuIHRoZSBsaXN0IGlzCisgICAgICAgICAgZXhoYXVzdGVkLCB0aGUgY2xpZW50IHNob3VsZCBnaXZlIHVwIGFuZCBjbG9zZSB0aGUKKyAgICAgICAgICBjb25uZWN0aW9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgREFUQSBDSEFMTAorICAgICAgICAgICAgICAgICAgPHNpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChDSEFMTCkgcmV0dXJucyBDT05USU5VRShSRVNQKSAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgICAgIERBVEEgUkVTUCwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChDSEFMTCkgcmV0dXJucyBPSyhSRVNQKSAmcmFycjsgc2VuZCBEQVRBCisgICAgICAgICAgICAgICAgICAgICAgUkVTUCwgZ290byA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKENIQUxMKSByZXR1cm5zIEVSUk9SICZyYXJyOyBzZW5kIEVSUk9SCisgICAgICAgICAgICAgICAgICAgICAgW21zZ10sIGdvdG8gPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICA8L3NpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgUkVKRUNURUQgW21lY2hzXSAmcmFycjsKKyAgICAgICAgICAgICAgICAgIHNlbmQgQVVUSCBbbmV4dCBtZWNoXSwgZ290bworICAgICAgICAgICAgICAgICAgV2FpdGluZ0ZvckRhdGEgb3IgPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEVSUk9SICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICBDQU5DRUwsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yUmVqZWN0PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgT0sgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgIEJFR0lOLCB0ZXJtaW5hdGUgYXV0aAorICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLCBhdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIGFueXRoaW5nIGVsc2UgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBPSyAmcmFycjsgc2VuZCBCRUdJTiwgdGVybWluYXRlIGF1dGgKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbiwgPGVtcGhhc2lzPmF1dGhlbnRpY2F0ZWQ8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBSRUpFQ1QgW21lY2hzXSAmcmFycjsgc2VuZCBBVVRIIFtuZXh0IG1lY2hdLAorICAgICAgICAgICAgICAgICAgZ290byA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPiBvcgorICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgREFUQSAmcmFycjsgc2VuZCBDQU5DRUwsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yUmVqZWN0PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZCBDQU5DRUwsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yUmVqZWN0PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JSZWplY3Q8L2VtcGhhc2lzPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIFJFSkVDVCBbbWVjaHNdICZyYXJyOyBzZW5kIEFVVEggW25leHQgbWVjaF0sCisgICAgICAgICAgICAgICAgICBnb3RvIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+IG9yCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyB0ZXJtaW5hdGUgYXV0aAorICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLCBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Zvcm1hbHBhcmE+CisKKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYXV0aC1zdGF0ZXMtc2VydmVyIj4KKyAgICAgICAgPHRpdGxlPlNlcnZlciBzdGF0ZXM8L3RpdGxlPgorIAorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBGb3IgdGhlIHNlcnZlciBNRUNIKFJFU1ApIG1lYW5zIHRoYXQgdGhlIGNsaWVudCByZXNwb25zZQorICAgICAgICAgIFJFU1Agd2FzIGZlZCB0byB0aGUgdGhlIG1lY2hhbmlzbSBNRUNILCB3aGljaCByZXR1cm5zIG9uZSBvZgorCisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQ09OVElOVUUoQ0hBTEwpIG1lYW5zIGNvbnRpbnVlIHRoZSBhdXRoIGNvbnZlcnNhdGlvbiBhbmQKKyAgICAgICAgICAgICAgICBzZW5kIENIQUxMIGFzIHRoZSBjaGFsbGVuZ2UgdG8gdGhlIGNsaWVudDsKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPSyBtZWFucyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZDsKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBSRUpFQ1QgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGZhaWxlZCB0byBhdXRoZW50aWNhdGUgb3IKKyAgICAgICAgICAgICAgICB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gUkVTUC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgIFRoZSBzZXJ2ZXIgc3RhcnRzIG91dCBpbiBzdGF0ZQorICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+LiAgSWYgdGhlIGNsaWVudCBpcworICAgICAgICAgIHJlamVjdGVkIHRvbyBtYW55IHRpbWVzIHRoZSBzZXJ2ZXIgbXVzdCBkaXNjb25uZWN0IHRoZQorICAgICAgICAgIGNsaWVudC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQVVUSCAmcmFycjsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEFVVEggTUVDSCBSRVNQCisKKyAgICAgICAgICAgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0ggbm90IHZhbGlkIG1lY2hhbmlzbSAmcmFycjsgc2VuZCBSRUpFQ1RFRAorICAgICAgICAgICAgICAgICAgICAgIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKworICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goUkVTUCkgcmV0dXJucyBDT05USU5VRShDSEFMTCkgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBIENIQUxMLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgT0sgJnJhcnI7IHNlbmQgT0ssIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckJlZ2luPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgUkVKRUNUICZyYXJyOyBzZW5kIFJFSkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEJFR0lOICZyYXJyOyB0ZXJtaW5hdGUKKyAgICAgICAgICAgICAgICAgIGF1dGggY29udmVyc2F0aW9uLCBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICBFUlJPUiwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgIAorICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBEQVRBIFJFU1AKKyAgICAgICAgICAgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goUkVTUCkgcmV0dXJucyBDT05USU5VRShDSEFMTCkgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBIENIQUxMLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgT0sgJnJhcnI7IHNlbmQgT0ssIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckJlZ2luPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgUkVKRUNUICZyYXJyOyBzZW5kIFJFSkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEJFR0lOICZyYXJyOyB0ZXJtaW5hdGUgYXV0aCBjb252ZXJzYXRpb24sCisgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQ0FOQ0VMICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0ZvckJlZ2luPC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBCRUdJTiAmcmFycjsgdGVybWluYXRlIGF1dGggY29udmVyc2F0aW9uLAorICAgICAgICAgICAgICAgICAgY2xpZW50IGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBDQU5DRUwgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIGFueXRoaW5nIGVsc2UgJnJhcnI7IHNlbmQgRVJST1IsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQmVnaW48L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICA8L3NlY3QzPgorICAgICAgCisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtbWVjaGFuaXNtcyI+CisgICAgICA8dGl0bGU+QXV0aGVudGljYXRpb24gbWVjaGFuaXNtczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzb21lIG5ldyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zLgorICAgICAgICBELUJ1cyBhbHNvIGFsbG93cyBhbnkgc3RhbmRhcmQgU0FTTCBtZWNoYW5pc20gb2YgY291cnNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJhdXRoLW1lY2hhbmlzbXMtc2hhIj4KKyAgICAgICAgPHRpdGxlPkRCVVNfQ09PS0lFX1NIQTE8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20gaXMgZGVzaWduZWQgdG8gZXN0YWJsaXNoIHRoYXQgYSBjbGllbnQKKyAgICAgICAgICBoYXMgdGhlIGFiaWxpdHkgdG8gcmVhZCBhIHByaXZhdGUgZmlsZSBvd25lZCBieSB0aGUgdXNlciBiZWluZworICAgICAgICAgIGF1dGhlbnRpY2F0ZWQuIElmIHRoZSBjbGllbnQgY2FuIHByb3ZlIHRoYXQgaXQgaGFzIGFjY2VzcyB0byBhIHNlY3JldAorICAgICAgICAgIGNvb2tpZSBzdG9yZWQgaW4gdGhpcyBmaWxlLCB0aGVuIHRoZSBjbGllbnQgaXMgYXV0aGVudGljYXRlZC4gCisgICAgICAgICAgVGh1cyB0aGUgc2VjdXJpdHkgb2YgREJVU19DT09LSUVfU0hBMSBkZXBlbmRzIG9uIGEgc2VjdXJlIGhvbWUgCisgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRocm91Z2hvdXQgdGhpcyBkZXNjcmlwdGlvbiwgImhleCBlbmNvZGluZyIgbXVzdCBvdXRwdXQgdGhlIGRpZ2l0cworICAgICAgICAgIGZyb20gYSB0byBmIGluIGxvd2VyLWNhc2U7IHRoZSBkaWdpdHMgQSB0byBGIG11c3Qgbm90IGJlIHVzZWQKKyAgICAgICAgICBpbiB0aGUgREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXV0aGVudGljYXRpb24gcHJvY2VlZHMgYXMgZm9sbG93czoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY2xpZW50IHNlbmRzIHRoZSB1c2VybmFtZSBpdCB3b3VsZCBsaWtlIHRvIGF1dGhlbnRpY2F0ZSAKKyAgICAgICAgICAgICAgICBhcywgaGV4LWVuY29kZWQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBzZXJ2ZXIgc2VuZHMgdGhlIG5hbWUgb2YgaXRzICJjb29raWUgY29udGV4dCIgKHNlZSBiZWxvdyk7IGEKKyAgICAgICAgICAgICAgICBzcGFjZSBjaGFyYWN0ZXI7IHRoZSBpbnRlZ2VyIElEIG9mIHRoZSBzZWNyZXQgY29va2llIHRoZSBjbGllbnQKKyAgICAgICAgICAgICAgICBtdXN0IGRlbW9uc3RyYXRlIGtub3dsZWRnZSBvZjsgYSBzcGFjZSBjaGFyYWN0ZXI7IHRoZW4gYQorICAgICAgICAgICAgICAgIHJhbmRvbWx5LWdlbmVyYXRlZCBjaGFsbGVuZ2Ugc3RyaW5nLCBhbGwgb2YgdGhpcyBoZXgtZW5jb2RlZCBpbnRvCisgICAgICAgICAgICAgICAgb25lLCBzaW5nbGUgc3RyaW5nLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY2xpZW50IGxvY2F0ZXMgdGhlIGNvb2tpZSBhbmQgZ2VuZXJhdGVzIGl0cyBvd24KKyAgICAgICAgICAgICAgICByYW5kb21seS1nZW5lcmF0ZWQgY2hhbGxlbmdlIHN0cmluZy4gVGhlIGNsaWVudCB0aGVuIGNvbmNhdGVuYXRlcworICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBkZWNvZGVkIGNoYWxsZW5nZSwgYSAiOiIgY2hhcmFjdGVyLCBpdHMgb3duIGNoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICBhbm90aGVyICI6IiBjaGFyYWN0ZXIsIGFuZCB0aGUgY29va2llLiBJdCBjb21wdXRlcyB0aGUgU0hBLTEgaGFzaAorICAgICAgICAgICAgICAgIG9mIHRoaXMgY29tcG9zaXRlIHN0cmluZyBhcyBhIGhleCBkaWdlc3QuIEl0IGNvbmNhdGVuYXRlcyB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQncyBjaGFsbGVuZ2Ugc3RyaW5nLCBhIHNwYWNlIGNoYXJhY3RlciwgYW5kIHRoZSBTSEEtMSBoZXgKKyAgICAgICAgICAgICAgICBkaWdlc3QsIGhleC1lbmNvZGVzIHRoZSByZXN1bHQgYW5kIHNlbmRzIGl0IGJhY2sgdG8gdGhlIHNlcnZlci4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHNlcnZlciBnZW5lcmF0ZXMgdGhlIHNhbWUgY29uY2F0ZW5hdGVkIHN0cmluZyB1c2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgIGNsaWVudCBhbmQgY29tcHV0ZXMgaXRzIFNIQS0xIGhhc2guIEl0IGNvbXBhcmVzIHRoZSBoYXNoIHdpdGgKKyAgICAgICAgICAgICAgICB0aGUgaGFzaCByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQ7IGlmIHRoZSB0d28gaGFzaGVzIG1hdGNoLCB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQgaXMgYXV0aGVudGljYXRlZC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFYWNoIHNlcnZlciBoYXMgYSAiY29va2llIGNvbnRleHQsIiB3aGljaCBpcyBhIG5hbWUgdGhhdCBpZGVudGlmaWVzIGEKKyAgICAgICAgICBzZXQgb2YgY29va2llcyB0aGF0IGFwcGx5IHRvIHRoYXQgc2VydmVyLiBBIHNhbXBsZSBjb250ZXh0IG1pZ2h0IGJlCisgICAgICAgICAgIm9yZ19mcmVlZGVza3RvcF9zZXNzaW9uX2J1cyIuIENvbnRleHQgbmFtZXMgbXVzdCBiZSB2YWxpZCBBU0NJSSwKKyAgICAgICAgICBub256ZXJvIGxlbmd0aCwgYW5kIG1heSBub3QgY29udGFpbiB0aGUgY2hhcmFjdGVycyBzbGFzaCAoIi8iKSwKKyAgICAgICAgICBiYWNrc2xhc2ggKCJcIiksIHNwYWNlICgiICIpLCBuZXdsaW5lICgiXG4iKSwgY2FycmlhZ2UgcmV0dXJuICgiXHIiKSwKKyAgICAgICAgICB0YWIgKCJcdCIpLCBvciBwZXJpb2QgKCIuIikuIFRoZXJlIGlzIGEgZGVmYXVsdCBjb250ZXh0LAorICAgICAgICAgICJvcmdfZnJlZWRlc2t0b3BfZ2VuZXJhbCIgdGhhdCdzIHVzZWQgYnkgc2VydmVycyB0aGF0IGRvIG5vdCBzcGVjaWZ5CisgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvb2tpZXMgYXJlIHN0b3JlZCBpbiBhIHVzZXIncyBob21lIGRpcmVjdG9yeSwgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgIDxmaWxlbmFtZT5+Ly5kYnVzLWtleXJpbmdzLzwvZmlsZW5hbWU+LiBUaGlzIGRpcmVjdG9yeSBtdXN0IAorICAgICAgICAgIG5vdCBiZSByZWFkYWJsZSBvciB3cml0YWJsZSBieSBvdGhlciB1c2Vycy4gSWYgaXQgaXMsIAorICAgICAgICAgIGNsaWVudHMgYW5kIHNlcnZlcnMgbXVzdCBpZ25vcmUgaXQuIFRoZSBkaXJlY3RvcnkgCisgICAgICAgICAgY29udGFpbnMgY29va2llIGZpbGVzIG5hbWVkIGFmdGVyIHRoZSBjb29raWUgY29udGV4dC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIGNvb2tpZSBmaWxlIGNvbnRhaW5zIG9uZSBjb29raWUgcGVyIGxpbmUuIEVhY2ggbGluZSAKKyAgICAgICAgICBoYXMgdGhyZWUgc3BhY2Utc2VwYXJhdGVkIGZpZWxkczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY29va2llIElEIG51bWJlciwgd2hpY2ggbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFuZAorICAgICAgICAgICAgICAgIG1heSBub3QgYmUgdXNlZCB0d2ljZSBpbiB0aGUgc2FtZSBmaWxlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY29va2llJ3MgY3JlYXRpb24gdGltZSwgaW4gVU5JWCBzZWNvbmRzLXNpbmNlLXRoZS1lcG9jaAorICAgICAgICAgICAgICAgIGZvcm1hdC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNvb2tpZSBpdHNlbGYsIGEgaGV4LWVuY29kZWQgcmFuZG9tIGJsb2NrIG9mIGJ5dGVzLiBUaGUgY29va2llCisgICAgICAgICAgICAgICAgbWF5IGJlIG9mIGFueSBsZW5ndGgsIHRob3VnaCBvYnZpb3VzbHkgc2VjdXJpdHkgaW5jcmVhc2VzIAorICAgICAgICAgICAgICAgIGFzIHRoZSBsZW5ndGggaW5jcmVhc2VzLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9ubHkgc2VydmVyIHByb2Nlc3NlcyBtb2RpZnkgdGhlIGNvb2tpZSBmaWxlLgorICAgICAgICAgIFRoZXkgbXVzdCBkbyBzbyB3aXRoIHRoaXMgcHJvY2VkdXJlOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENyZWF0ZSBhIGxvY2tmaWxlIG5hbWUgYnkgYXBwZW5kaW5nICIubG9jayIgdG8gdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgY29va2llIGZpbGUuICBUaGUgc2VydmVyIHNob3VsZCBhdHRlbXB0IHRvIGNyZWF0ZSB0aGlzIGZpbGUKKyAgICAgICAgICAgICAgICB1c2luZyA8bGl0ZXJhbD5PX0NSRUFUIHwgT19FWENMPC9saXRlcmFsPi4gIElmIGZpbGUgY3JlYXRpb24KKyAgICAgICAgICAgICAgICBmYWlscywgdGhlIGxvY2sgZmFpbHMuIFNlcnZlcnMgc2hvdWxkIHJldHJ5IGZvciBhIHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICBwZXJpb2Qgb2YgdGltZSwgdGhlbiB0aGV5IG1heSBjaG9vc2UgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGxvY2sKKyAgICAgICAgICAgICAgICB0byBrZWVwIHVzZXJzIGZyb20gaGF2aW5nIHRvIG1hbnVhbGx5IGRlbGV0ZSBhIHN0YWxlCisgICAgICAgICAgICAgICAgbG9jay4gPGZvb3Rub3RlPjxwYXJhPkxvY2tmaWxlcyBhcmUgdXNlZCBpbnN0ZWFkIG9mIHJlYWwgZmlsZQorICAgICAgICAgICAgICAgIGxvY2tpbmcgPGxpdGVyYWw+ZmNudGwoKTwvbGl0ZXJhbD4gYmVjYXVzZSByZWFsIGxvY2tpbmcKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgYXJlIHN0aWxsIGZsYWt5IG9uIG5ldHdvcmsKKyAgICAgICAgICAgICAgICBmaWxlc3lzdGVtcy48L3BhcmE+PC9mb290bm90ZT4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT25jZSB0aGUgbG9ja2ZpbGUgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIHNlcnZlciBsb2FkcyB0aGUgY29va2llCisgICAgICAgICAgICAgICAgZmlsZS4gSXQgc2hvdWxkIHRoZW4gZGVsZXRlIGFueSBjb29raWVzIHRoYXQgYXJlIG9sZCAodGhlCisgICAgICAgICAgICAgICAgdGltZW91dCBjYW4gYmUgZmFpcmx5IHNob3J0KSwgb3IgbW9yZSB0aGFuIGEgcmVhc29uYWJsZQorICAgICAgICAgICAgICAgIHRpbWUgaW4gdGhlIGZ1dHVyZSAoc28gdGhhdCBjb29raWVzIG5ldmVyIGFjY2lkZW50YWxseSAKKyAgICAgICAgICAgICAgICBiZWNvbWUgcGVybWFuZW50LCBpZiB0aGUgY2xvY2sgd2FzIHNldCBmYXIgaW50byB0aGUgZnV0dXJlIAorICAgICAgICAgICAgICAgIGF0IHNvbWUgcG9pbnQpLiBJZiBubyByZWNlbnQga2V5cyByZW1haW4sIHRoZSAKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgbWF5IGdlbmVyYXRlIGEgbmV3IGtleS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHBydW5lZCBhbmQgcG9zc2libHkgYWRkZWQtdG8gY29va2llIGZpbGUgCisgICAgICAgICAgICAgICAgbXVzdCBiZSByZXNhdmVkIGF0b21pY2FsbHkgKHVzaW5nIGEgdGVtcG9yYXJ5IAorICAgICAgICAgICAgICAgIGZpbGUgd2hpY2ggaXMgcmVuYW1lKCknZCkuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBsb2NrIG11c3QgYmUgZHJvcHBlZCBieSBkZWxldGluZyB0aGUgbG9ja2ZpbGUuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ2xpZW50cyBuZWVkIG5vdCBsb2NrIHRoZSBmaWxlIGluIG9yZGVyIHRvIGxvYWQgaXQsIAorICAgICAgICAgIGJlY2F1c2Ugc2VydmVycyBhcmUgcmVxdWlyZWQgdG8gc2F2ZSB0aGUgZmlsZSBhdG9taWNhbGx5LiAgICAgICAgICAKKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImFkZHJlc3NlcyI+CisgICAgPHRpdGxlPlNlcnZlciBBZGRyZXNzZXM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgU2VydmVyIGFkZHJlc3NlcyBjb25zaXN0IG9mIGEgdHJhbnNwb3J0IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYW5kCisgICAgICB0aGVuIGFuIG9wdGlvbmFsLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlIGZvcm0ga2V5PXZhbHVlLgorICAgICAgRWFjaCB2YWx1ZSBpcyBlc2NhcGVkLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEZvciBleGFtcGxlOiAKKyAgICAgIDxwcm9ncmFtbGlzdGluZz51bml4OnBhdGg9L3RtcC9kYnVzLXRlc3Q8L3Byb2dyYW1saXN0aW5nPgorICAgICAgV2hpY2ggaXMgdGhlIGFkZHJlc3MgdG8gYSB1bml4IHNvY2tldCB3aXRoIHRoZSBwYXRoIC90bXAvZGJ1cy10ZXN0LgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFZhbHVlIGVzY2FwaW5nIGlzIHNpbWlsYXIgdG8gVVJJIGVzY2FwaW5nIGJ1dCBzaW1wbGVyLgorICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHNldCBvZiBvcHRpb25hbGx5LWVzY2FwZWQgYnl0ZXMgaXM6CisgICAgICAgICAgICA8bGl0ZXJhbD5bMC05QS1aYS16Xy0vLlxdPC9saXRlcmFsPi4gVG8gZXNjYXBlLCBlYWNoCisgICAgICAgICAgICA8ZW1waGFzaXM+Ynl0ZTwvZW1waGFzaXM+IChub3RlLCBub3QgY2hhcmFjdGVyKSB3aGljaCBpcyBub3QgaW4gdGhlCisgICAgICAgICAgICBzZXQgb2Ygb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGVzIG11c3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBBU0NJSQorICAgICAgICAgICAgcGVyY2VudCAoPGxpdGVyYWw+JTwvbGl0ZXJhbD4pIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGJ5dGUgaW4gaGV4LgorICAgICAgICAgICAgVGhlIGhleCB2YWx1ZSBtdXN0IGFsd2F5cyBiZSB0d28gZGlnaXRzLCBldmVuIGlmIHRoZSBmaXJzdCBkaWdpdCBpcworICAgICAgICAgICAgemVyby4gVGhlIG9wdGlvbmFsbHktZXNjYXBlZCBieXRlcyBtYXkgYmUgZXNjYXBlZCBpZiBkZXNpcmVkLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gdW5lc2NhcGUsIGFwcGVuZCBlYWNoIGJ5dGUgaW4gdGhlIHZhbHVlOyBpZiBhIGJ5dGUgaXMgYW4gQVNDSUkKKyAgICAgICAgICAgIHBlcmNlbnQgKDxsaXRlcmFsPiU8L2xpdGVyYWw+KSBjaGFyYWN0ZXIgdGhlbiBhcHBlbmQgdGhlIGZvbGxvd2luZworICAgICAgICAgICAgaGV4IHZhbHVlIGluc3RlYWQuIEl0IGlzIGFuIGVycm9yIGlmIGEgPGxpdGVyYWw+JTwvbGl0ZXJhbD4gYnl0ZQorICAgICAgICAgICAgZG9lcyBub3QgaGF2ZSB0d28gaGV4IGRpZ2l0cyBmb2xsb3dpbmcuIEl0IGlzIGFuIGVycm9yIGlmIGEKKyAgICAgICAgICAgIG5vbi1vcHRpb25hbGx5LWVzY2FwZWQgYnl0ZSBpcyBzZWVuIHVuZXNjYXBlZC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIFRoZSBzZXQgb2Ygb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGVzIGlzIGludGVuZGVkIHRvIHByZXNlcnZlIGFkZHJlc3MgCisgICAgICByZWFkYWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBBIHNlcnZlciBtYXkgc3BlY2lmeSBhIGtleS12YWx1ZSBwYWlyIHdpdGggdGhlIGtleSA8bGl0ZXJhbD5ndWlkPC9saXRlcmFsPgorICAgICAgYW5kIHRoZSB2YWx1ZSBhIGhleC1lbmNvZGVkIDE2LWJ5dGUgc2VxdWVuY2UuIDx4cmVmIGxpbmtlbmQ9InV1aWRzIi8+CisgICAgICBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgPGxpdGVyYWw+Z3VpZDwvbGl0ZXJhbD4gZmllbGQuICBJZiBwcmVzZW50LAorICAgICAgdGhpcyBVVUlEIG1heSBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIG9uZSBzZXJ2ZXIgYWRkcmVzcyBmcm9tIGFub3RoZXIuIEEKKyAgICAgIHNlcnZlciBzaG91bGQgdXNlIGEgZGlmZmVyZW50IFVVSUQgZm9yIGVhY2ggYWRkcmVzcyBpdCBsaXN0ZW5zIG9uLiBGb3IKKyAgICAgIGV4YW1wbGUsIGlmIGEgbWVzc2FnZSBidXMgZGFlbW9uIG9mZmVycyBib3RoIFVOSVggZG9tYWluIHNvY2tldCBhbmQgVENQCisgICAgICBjb25uZWN0aW9ucywgYnV0IHRyZWF0cyBjbGllbnRzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgY29ubmVjdCwKKyAgICAgIHRob3NlIHR3byBjb25uZWN0aW9ucyBhcmUgZXF1aXZhbGVudCBwb3N0LWNvbm5lY3Rpb24gYnV0IHNob3VsZCBoYXZlCisgICAgICBkaXN0aW5jdCBVVUlEcyB0byBkaXN0aW5ndWlzaCB0aGUga2luZHMgb2YgY29ubmVjdGlvbi4KKyAgICA8L3BhcmE+CisgICAgCisgICAgPHBhcmE+CisgICAgICBUaGUgaW50ZW50IG9mIHRoZSBhZGRyZXNzIFVVSUQgZmVhdHVyZSBpcyB0byBhbGxvdyBhIGNsaWVudCB0byBhdm9pZAorICAgICAgb3BlbmluZyBtdWx0aXBsZSBpZGVudGljYWwgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgc2VydmVyLCBieSBhbGxvd2luZyB0aGUKKyAgICAgIGNsaWVudCB0byBjaGVjayB3aGV0aGVyIGFuIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gYW4gYWxyZWFkeS1leGlzdGluZworICAgICAgY29ubmVjdGlvbi4gIENvbXBhcmluZyB0d28gYWRkcmVzc2VzIGlzIGluc3VmZmljaWVudCwgYmVjYXVzZSBhZGRyZXNzZXMKKyAgICAgIGNhbiBiZSByZWN5Y2xlZCBieSBkaXN0aW5jdCBzZXJ2ZXJzLCBhbmQgZXF1aXZhbGVudCBhZGRyZXNzZXMgbWF5IGxvb2sKKyAgICAgIGRpZmZlcmVudCBpZiBzaW1wbHkgY29tcGFyZWQgYXMgc3RyaW5ncyAoZm9yIGV4YW1wbGUsIHRoZSBob3N0IGluIGEgVENQCisgICAgICBhZGRyZXNzIGNhbiBiZSBnaXZlbiBhcyBhbiBJUCBhZGRyZXNzIG9yIGFzIGEgaG9zdG5hbWUpLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgTm90ZSB0aGF0IHRoZSBhZGRyZXNzIGtleSBpcyA8bGl0ZXJhbD5ndWlkPC9saXRlcmFsPiBldmVuIHRob3VnaCB0aGUgCisgICAgICByZXN0IG9mIHRoZSBBUEkgYW5kIGRvY3VtZW50YXRpb24gc2F5cyAiVVVJRCwiIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBbRklYTUUgY2xhcmlmeSBpZiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gZWFjaCBpcyBhIHJlcXVpcmVtZW50IAorICAgICAgb3IganVzdCBhIHN1Z2dlc3Rpb25dCisgICAgICBXaGVuIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIsIG11bHRpcGxlIHNlcnZlciBhZGRyZXNzZXMgY2FuIGJlCisgICAgICBzZXBhcmF0ZWQgYnkgYSBzZW1pLWNvbG9uLiBUaGUgbGlicmFyeSB3aWxsIHRoZW4gdHJ5IHRvIGNvbm5lY3QKKyAgICAgIHRvIHRoZSBmaXJzdCBhZGRyZXNzIGFuZCBpZiB0aGF0IGZhaWxzLCBpdCdsbCB0cnkgdG8gY29ubmVjdCB0bworICAgICAgdGhlIG5leHQgb25lIHNwZWNpZmllZCwgYW5kIHNvIGZvcnRoLiBGb3IgZXhhbXBsZQorICAgICAgPHByb2dyYW1saXN0aW5nPnVuaXg6cGF0aD0vdG1wL2RidXMtdGVzdDt1bml4OnBhdGg9L3RtcC9kYnVzLXRlc3QyPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisKKyAgPC9zZWN0MT4KKyAgCisgIDxzZWN0MSBpZD0idHJhbnNwb3J0cyI+CisgICAgPHRpdGxlPlRyYW5zcG9ydHM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgW0ZJWE1FIHdlIG5lZWQgdG8gc3BlY2lmeSBpbiBkZXRhaWwgZWFjaCB0cmFuc3BvcnQgYW5kIGl0cyBwb3NzaWJsZSBhcmd1bWVudHNdCisgICAgCisgICAgICBDdXJyZW50IHRyYW5zcG9ydHMgaW5jbHVkZTogdW5peCBkb21haW4gc29ja2V0cyAoaW5jbHVkaW5nIAorICAgICAgYWJzdHJhY3QgbmFtZXNwYWNlIG9uIGxpbnV4KSwgbGF1bmNoZCwgVENQL0lQLCBhbmQgYSBkZWJ1Zy90ZXN0aW5nIHRyYW5zcG9ydAorICAgICAgdXNpbmcgaW4tcHJvY2VzcyBwaXBlcy4gRnV0dXJlIHBvc3NpYmxlIHRyYW5zcG9ydHMgaW5jbHVkZSBvbmUgdGhhdAorICAgICAgdHVubmVscyBvdmVyIFgxMSBwcm90b2NvbC4KKyAgICA8L3BhcmE+CisgIAorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy11bml4LWRvbWFpbi1zb2NrZXRzIj4KKyAgICAgIDx0aXRsZT5Vbml4IERvbWFpbiBTb2NrZXRzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVbml4IGRvbWFpbiBzb2NrZXRzIGNhbiBiZSBlaXRoZXIgcGF0aHMgaW4gdGhlIGZpbGUgc3lzdGVtIG9yIG9uIExpbnV4IAorCWtlcm5lbHMsIHRoZXkgY2FuIGJlIGFic3RyYWN0IHdoaWNoIGFyZSBzaW1pbGFyIHRvIHBhdGhzIGJ1dAorCWRvIG5vdCBzaG93IHVwIGluIHRoZSBmaWxlIHN5c3RlbS4gIAorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgV2hlbiBhIHNvY2tldCBpcyBvcGVuZWQgYnkgdGhlIEQtQnVzIGxpYnJhcnkgaXQgdHJ1bmNhdGVzIHRoZSBwYXRoIAorCW5hbWUgcmlnaHQgYmVmb3JlIHRoZSBmaXJzdCB0cmFpbGluZyBOdWwgYnl0ZS4gIFRoaXMgaXMgdHJ1ZSBmb3IgYm90aAorCW5vcm1hbCBwYXRocyBhbmQgYWJzdHJhY3QgcGF0aHMuICBOb3RlIHRoYXQgdGhpcyBpcyBhIGRlcGFydHVyZSBmcm9tCisJcHJldmlvdXMgdmVyc2lvbnMgb2YgRC1CdXMgdGhhdCB3b3VsZCBjcmVhdGUgc29ja2V0cyB3aXRoIGEgZml4ZWQgCisJbGVuZ3RoIHBhdGggbmFtZS4gIE5hbWVzIHdoaWNoIHdlcmUgc2hvcnRlciB0aGFuIHRoZSBmaXhlZCBsZW5ndGgKKwl3b3VsZCBiZSBwYWRkZWQgYnkgTnVsIGJ5dGVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBhdmFpbGFibGUgb24gd2luZG93cy4gCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9InRyYW5zcG9ydHMtdW5peC1kb21haW4tc29ja2V0cy1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+IAorICAgICAgICAgIFVuaXggZG9tYWluIHNvY2tldCBhZGRyZXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlICJ1bml4OiIgcHJlZml4IAorICAgICAgICAgIGFuZCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcga2V5L3ZhbHVlIHBhaXJzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+TmFtZTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+VmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PnBhdGg8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihwYXRoKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+cGF0aCBvZiB0aGUgdW5peCBkb21haW4gc29ja2V0LiBJZiBzZXQsIHRoZSAidG1wZGlyIiBhbmQgImFic3RyYWN0IiBrZXkgbXVzdCBub3QgYmUgc2V0LjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT50bXBkaXI8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihwYXRoKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+dGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB3aGljaCBhIHNvY2tldCBmaWxlIHdpdGggYSByYW5kb20gZmlsZSBuYW1lIHN0YXJ0aW5nIHdpdGggJ2RidXMtJyB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBrZXkgY2FuIG9ubHkgYmUgdXNlZCBpbiBzZXJ2ZXIgYWRkcmVzc2VzLCBub3QgaW4gY2xpZW50IGFkZHJlc3Nlcy4gSWYgc2V0LCB0aGUgInBhdGgiIGFuZCAiYWJzdHJhY3QiIGtleSBtdXN0IG5vdCBiZSBzZXQuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PmFic3RyYWN0PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+dW5pcXVlIHN0cmluZyAocGF0aCkgaW4gdGhlIGFic3RyYWN0IG5hbWVzcGFjZS4gSWYgc2V0LCB0aGUgInBhdGgiIG9yICJ0ZW1wZGlyIiBrZXkgbXVzdCBub3QgYmUgc2V0LjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGdyb3VwPgorICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InRyYW5zcG9ydHMtbGF1bmNoZCI+CisgICAgICA8dGl0bGU+bGF1bmNoZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgbGF1bmNoZCBpcyBhIG9wZW4tc291cmNlIHNlcnZlciBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHJlcGxhY2VzIGluaXQsIGluZXRkCisgICAgICAgIGFuZCBjcm9uIG9uIEFwcGxlIE1hYyBPUyBYIHZlcnNpb25zIDEwLjQgYW5kIGFib3ZlLiBJdCBwcm92aWRlcyBhIGNvbW1vbiBzZXNzaW9uCisgICAgICAgIGJ1cyBhZGRyZXNzIGZvciBlYWNoIHVzZXIgYW5kIGRlcHJlY2F0ZXMgdGhlIFgxMS1lbmFibGVkIEQtQnVzIGxhdW5jaGVyIG9uIE9TWC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIGxhdW5jaGQgYWxsb2NhdGVzIGEgc29ja2V0IGFuZCBwcm92aWRlcyBpdCB3aXRoIHRoZSB1bml4IHBhdGggdGhyb3VnaCB0aGUKKyAgICAgICAgREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCB2YXJpYWJsZSBpbiBsYXVuY2hkJ3MgZW52aXJvbm1lbnQuIEV2ZXJ5IHByb2Nlc3MKKyAgICAgICAgc3Bhd25lZCBieSBsYXVuY2hkIChvciBkYnVzLWRhZW1vbiwgaWYgaXQgd2FzIHN0YXJ0ZWQgYnkgbGF1bmNoZCkgY2FuIGFjY2VzcworICAgICAgICBpdCB0aHJvdWdoIGl0cyBlbnZpcm9ubWVudC4KKyAgICAgICAgT3RoZXIgcHJvY2Vzc2VzIGNhbiBxdWVyeSBmb3IgdGhlIGxhdW5jaGQgc29ja2V0IGJ5IGV4ZWN1dGluZzoKKyAgICAgICAgJCBsYXVuY2hjdGwgZ2V0ZW52IERCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQKKyAgICAgICAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSBzbyBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgICAgICBtYW51YWxseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBsYXVuY2hkIGlzIG5vdCBhdmFpbGFibGUgb24gTWljcm9zb2Z0IFdpbmRvd3MuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9InRyYW5zcG9ydHMtbGF1bmNoZC1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgbGF1bmNoZCBhZGRyZXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlICJsYXVuY2hkOiIgcHJlZml4CisgICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+ZW52PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oZW52aXJvbm1lbnQgdmFyaWFibGUpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5wYXRoIG9mIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgZm9yIHRoZSBsYXVuY2hkIGNyZWF0ZWQgZGJ1cy1kYWVtb24uPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy10Y3Atc29ja2V0cyI+CisgICAgICA8dGl0bGU+VENQIFNvY2tldHM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSB0Y3AgdHJhbnNwb3J0IHByb3ZpZGVzIFRDUC9JUCBiYXNlZCBjb25uZWN0aW9ucyBiZXR3ZWVuIGNsaWVudHMKKyAgICAgICAgbG9jYXRlZCBvbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgaG9zdHMuIAorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVzaW5nIHRjcCB0cmFuc3BvcnQgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBzZWN1cmUgYXV0aGVudGlmaWNhdGlvbiBtZWNoYW5pc211cyAKKyAgICAgICAgb3ZlciBhIG5ldHdvcmsgaXMgdW5zZWN1cmUuIAorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+ICAKKyAgICAgICAgV2luZG93cyBub3RlczogQmVjYXVzZSBvZiB0aGUgdGNwIHN0YWNrIG9uIHdpbmRvd3MgZG9lcyBub3QgcHJvdmlkZSBzZW5kaW5nIAorICAgICAgICBjcmVkZW50aWFscyBvdmVyIGEgdGNwIGNvbm5lY3Rpb24sIHRoZSBFWFRFUk5BTCBhdXRoZW50aWZpY2F0aW9uIAorICAgICAgICBtZWNoYW5pc211cyBkb2VzIG5vdCB3b3JrLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy10Y3Atc29ja2V0cy1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+IAorICAgICAgICAgVENQL0lQIHNvY2tldCBhZGRyZXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlICJ0Y3A6IiBwcmVmaXggCisgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5ob3N0PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+ZG5zIG5hbWUgb3IgaXAgYWRkcmVzczwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnBvcnQ8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KG51bWJlcik8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICBjaG9vc2UgYSBmcmVlIHBvcnQgcHJvdmlkZWQgZnJvbSB0aGUgdW5kZXJsYXlpbmcgb3BlcmF0aW5nIHN5c3RlbS4gCisgICAgICAgICAgICBsaWJkYnVzIGlzIGFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgdXNlZCBwb3J0IGZyb20gdGhlIHNlcnZlci4gIAorICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5mYW1pbHk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+SWYgc2V0LCBwcm92aWRlIHRoZSB0eXBlIG9mIHNvY2tldCBmYW1pbHkgZWl0aGVyICJpcHY0IiBvciAiaXB2NiIuIElmIHVuc2V0LCB0aGUgZmFtaWx5IGlzIHVuc3BlY2lmaWVkLjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3Rncm91cD4KKyAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJ0cmFuc3BvcnRzLW5vbmNlLXRjcC1zb2NrZXRzIj4KKyAgICAgIDx0aXRsZT5Ob25jZS1zZWN1cmVkIFRDUCBTb2NrZXRzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbm9uY2UtdGNwIHRyYW5zcG9ydCBwcm92aWRlcyBhIHNlY3VyZWQgVENQIHRyYW5zcG9ydCwgdXNpbmcgYQorICAgICAgICBzaW1wbGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHRvIGVuc3VyZSB0aGF0IG9ubHkgY2xpZW50cyB3aXRoIHJlYWQKKyAgICAgICAgYWNjZXNzIHRvIGEgY2VydGFpbiBsb2NhdGlvbiBpbiB0aGUgZmlsZXN5c3RlbSBjYW4gY29ubmVjdCB0byB0aGUgc2VydmVyLgorICAgICAgICBUaGUgc2VydmVyIHdyaXRlcyBhIHNlY3JldCwgdGhlIG5vbmNlLCB0byBhIGZpbGUgYW5kIGFuIGluY29taW5nIGNsaWVudAorICAgICAgICBjb25uZWN0aW9uIGlzIG9ubHkgYWNjZXB0ZWQgaWYgdGhlIGNsaWVudCBzZW5kcyB0aGUgbm9uY2UgcmlnaHQgYWZ0ZXIKKyAgICAgICAgdGhlIGNvbm5lY3QuIFRoZSBub25jZSBtZWNoYW5pc20gcmVxdWlyZXMgbm8gc2V0dXAgYW5kIGlzIG9ydGhvZ29uYWwgdG8KKyAgICAgICAgdGhlIGhpZ2hlci1sZXZlbCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgQXV0aGVudGljYXRpb24gc2VjdGlvbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIE9uIHN0YXJ0LCB0aGUgc2VydmVyIGdlbmVyYXRlcyBhIHJhbmRvbSAxNiBieXRlIG5vbmNlIGFuZCB3cml0ZXMgaXQKKyAgICAgICAgdG8gYSBmaWxlIGluIHRoZSB1c2VyJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeS4gVGhlIG5vbmNlIGZpbGUgbG9jYXRpb24KKyAgICAgICAgaXMgcHVibGlzaGVkIGFzIHBhcnQgb2YgdGhlIHNlcnZlcidzIEQtQnVzIGFkZHJlc3MgdXNpbmcgdGhlCisgICAgICAgICJub25jZWZpbGUiIGtleS12YWx1ZSBwYWlyLgorCisgICAgICAgIEFmdGVyIGFuIGFjY2VwdCwgdGhlIHNlcnZlciByZWFkcyAxNiBieXRlcyBmcm9tIHRoZSBzb2NrZXQuIElmIHRoZQorICAgICAgICByZWFkIGJ5dGVzIGRvIG5vdCBtYXRjaCB0aGUgbm9uY2Ugc3RvcmVkIGluIHRoZSBub25jZSBmaWxlLCB0aGUKKyAgICAgICAgc2VydmVyIE1VU1QgaW1tZWRpYXRlbHkgZHJvcCB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgSWYgdGhlIG5vbmNlIG1hdGNoIHRoZSByZWNlaXZlZCBieXRlIHNlcXVlbmNlLCB0aGUgY2xpZW50IGlzIGFjY2VwdGVkCisgICAgICAgIGFuZCB0aGUgdHJhbnNwb3J0IGJlaGF2ZXMgbGlrZSBhbiB1bnNlY3VyZWQgdGNwIHRyYW5zcG9ydC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdCB0byB0aGUgc2VydmVyIHNvY2tldCwgdGhlIGNsaWVudCBNVVNUIHJlYWQKKyAgICAgICAgdGhlIG5vbmNlIGZyb20gdGhlIGZpbGUgcHVibGlzaGVkIGJ5IHRoZSBzZXJ2ZXIgdmlhIHRoZSBub25jZWZpbGU9CisgICAgICAgIGtleS12YWx1ZSBwYWlyIGFuZCBzZW5kIGl0IG92ZXIgdGhlIHNvY2tldC4gQWZ0ZXIgdGhhdCwgdGhlCisgICAgICAgIHRyYW5zcG9ydCBiZWhhdmVzIGxpa2UgYW4gdW5zZWN1cmVkIHRjcCB0cmFuc3BvcnQuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9InRyYW5zcG9ydHMtbm9uY2UtdGNwLXNvY2tldHMtYWRkcmVzc2VzIj4KKyAgICAgICAgPHRpdGxlPlNlcnZlciBBZGRyZXNzIEZvcm1hdDwvdGl0bGU+CisgICAgICAgIDxwYXJhPiAKKyAgICAgICAgIE5vbmNlIFRDUC9JUCBzb2NrZXQgYWRkcmVzc2VzIHVzZXMgdGhlICJub25jZS10Y3A6IiBwcmVmaXggCisgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5ob3N0PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+ZG5zIG5hbWUgb3IgaXAgYWRkcmVzczwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnBvcnQ8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KG51bWJlcik8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICBjaG9vc2UgYSBmcmVlIHBvcnQgcHJvdmlkZWQgZnJvbSB0aGUgdW5kZXJsYXlpbmcgb3BlcmF0aW5nIHN5c3RlbS4gCisgICAgICAgICAgICBsaWJkYnVzIGlzIGFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgdXNlZCBwb3J0IGZyb20gdGhlIHNlcnZlci4gIAorICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5mYW1pbHk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+SWYgc2V0LCBwcm92aWRlIHRoZSB0eXBlIG9mIHNvY2tldCBmYW1pbHkgZWl0aGVyICJpcHY0IiBvciAiaXB2NiIuIElmIHVuc2V0LCB0aGUgZmFtaWx5IGlzIHVuc3BlY2lmaWVkLjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5Pm5vbmNlZmlsZTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT4ocGF0aCk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+ZmlsZSBsb2NhdGlvbiBjb250YWluaW5nIHRoZSBzZWNyZXQ8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90Z3JvdXA+CisgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgPC9zZWN0MT4KKyAgIDxzZWN0MSBpZD0ibWV0YS10cmFuc3BvcnRzIj4KKyAgICA8dGl0bGU+TWV0YSBUcmFuc3BvcnRzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIE1ldGEgdHJhbnNwb3J0cyBhcmUgYSBraW5kIG9mIHRyYW5zcG9ydCB3aXRoIHNwZWNpYWwgZW5oYW5jZW1lbnRzIG9yCisgICAgICBiZWhhdmlvci4gQ3VycmVudGx5IGF2YWlsYWJsZSBtZXRhIHRyYW5zcG9ydHMgaW5jbHVkZTogYXV0b2xhdW5jaAorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0ibWV0YS10cmFuc3BvcnRzLWF1dG9sYXVuY2giPgorICAgICA8dGl0bGU+QXV0b2xhdW5jaDwvdGl0bGU+CisgICAgIDxwYXJhPlRoZSBhdXRvbGF1bmNoIHRyYW5zcG9ydCBwcm92aWRlcyBhIHdheSBmb3IgZGJ1cyBjbGllbnRzIHRvIGF1dG9kZXRlY3QKKyAgICAgICBhIHJ1bm5pbmcgZGJ1cyBzZXNzaW9uIGJ1cyBhbmQgdG8gYXV0b2xhdW5jaCBhIHNlc3Npb24gYnVzIGlmIG5vdCBwcmVzZW50LgorICAgICA8L3BhcmE+CisgICAgIDxzZWN0MyBpZD0ibWV0YS10cmFuc3BvcnRzLWF1dG9sYXVuY2gtYWRkcmVzc2VzIj4KKyAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgIEF1dG9sYXVuY2ggYWRkcmVzc2VzIHVzZXMgdGhlICJhdXRvbGF1bmNoOiIgcHJlZml4IGFuZCBzdXBwb3J0IHRoZQorICAgICAgICAgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICA8L3BhcmE+CisgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnNjb3BlPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PnNjb3BlIG9mIGF1dG9sYXVuY2ggKFdpbmRvd3Mgb25seSkKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICIqaW5zdGFsbC1wYXRoIiAtIGxpbWl0IHNlc3Npb24gYnVzIHRvIGRidXMgaW5zdGFsbGF0aW9uIHBhdGguCisgICAgICAgICAgICAgICBUaGUgZGJ1cyBpbnN0YWxsYXRpb24gcGF0aCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGxvY2F0aW9uIG9mCisgICAgICAgICAgICAgICB0aGUgc2hhcmVkIGRidXMgbGlicmFyeS4gSWYgdGhlIGxpYnJhcnkgaXMgbG9jYXRlZCBpbiBhICdiaW4nCisgICAgICAgICAgICAgICBzdWJkaXJlY3RvcnkgdGhlIGluc3RhbGxhdGlvbiByb290IGlzIHRoZSBkaXJlY3RvcnkgYWJvdmUsCisgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGlicmFyeSBsaXZlcyBpcyB0YWtlbiBhcworICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uIHJvb3QuCisgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgJmx0O2luc3RhbGwtcm9vdCZndDsvYmluL1tsaWJdZGJ1cy0xLmRsbAorICAgICAgICAgICAgICAgICAgICZsdDtpbnN0YWxsLXJvb3QmZ3Q7L1tsaWJdZGJ1cy0xLmRsbAorICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICIqdXNlciIgLSBsaW1pdCBzZXNzaW9uIGJ1cyB0byB0aGUgcmVjZW50IHVzZXIuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICBvdGhlciB2YWx1ZXMgLSBzcGVjaWZ5IGRlZGljYXRlZCBzZXNzaW9uIGJ1cyBsaWtlICJyZWxlYXNlIiwKKyAgICAgICAgICAgICAgICJkZWJ1ZyIgb3Igb3RoZXIKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgIDwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgICAgIDwvdGdyb3VwPgorICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICA8L3NlY3QzPgorCisgICAgIDxzZWN0MyBpZD0ibWV0YS10cmFuc3BvcnRzLWF1dG9sYXVuY2gtd2luZG93cy1pbXBsZW1lbnRhdGlvbiI+CisgICAgICA8dGl0bGU+V2luZG93cyBpbXBsZW1lbnRhdGlvbjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gc3RhcnQsIHRoZSBzZXJ2ZXIgb3BlbnMgYSBwbGF0Zm9ybSBzcGVjaWZpYyB0cmFuc3BvcnQsIGNyZWF0ZXMgYSBtdXRleAorICAgICAgICBhbmQgYSBzaGFyZWQgbWVtb3J5IHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsYXRlZCBzZXNzaW9uIGJ1cyBhZGRyZXNzLgorICAgICAgICBUaGlzIG11dGV4IHdpbGwgYmUgaW5zcGVjdGVkIGJ5IHRoZSBkYnVzIGNsaWVudCBsaWJyYXJ5IHRvIGRldGVjdCBhCisgICAgICAgIHJ1bm5pbmcgZGJ1cyBzZXNzaW9uIGJ1cy4gVGhlIGFjY2VzcyB0byB0aGUgbXV0ZXggYW5kIHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHNlY3Rpb24gYXJlIHByb3RlY3RlZCBieSBnbG9iYWwgbG9ja3MuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICBJbiB0aGUgcmVjZW50IGltcGxlbWVudGF0aW9uIHRoZSBhdXRvbGF1bmNoIHRyYW5zcG9ydCB1c2VzIGEgdGNwIHRyYW5zcG9ydAorICAgICAgIG9uIGxvY2FsaG9zdCB3aXRoIGEgcG9ydCBjaG9vc2VuIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMgZGV0YWlsIG1heQorICAgICAgIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIERpc2NsYWltZXI6IFRoZSByZWNlbnQgaW1wbGVtZW50YXRpb24gaXMgaW4gYW4gZWFybHkgc3RhdGUgYW5kIG1heSBub3QKKyAgICAgICAgd29yayBpbiBhbGwgY2lydW1zdGFuY2VzIGFuZC9vciBtYXkgaGF2ZSBzZWN1cml0eSBpc3N1ZXMuIEJlY2F1c2Ugb2YgdGhpcworICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gaXMgbm90IGRvY3VtZW50YXRlZCB5ZXQuCisgICAgICA8L3BhcmE+CisgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgIDwvc2VjdDE+CisgICA8c2VjdDEgaWQ9Im5hbWluZy1jb252ZW50aW9ucyI+CisgICAgPHRpdGxlPk5hbWluZyBDb252ZW50aW9uczwvdGl0bGU+CisgICAgCisgICAgPHBhcmE+CisgICAgICBELUJ1cyBuYW1lc3BhY2VzIGFyZSBhbGwgbG93ZXJjYXNlIGFuZCBjb3JyZXNwb25kIHRvIHJldmVyc2VkIGRvbWFpbgorICAgICAgbmFtZXMsIGFzIHdpdGggSmF2YS4gZS5nLiAib3JnLmZyZWVkZXNrdG9wIgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEludGVyZmFjZSwgc2lnbmFsLCBtZXRob2QsIGFuZCBwcm9wZXJ0eSBuYW1lcyBhcmUgIldpbmRvd3NTdHlsZUNhcHMiLCBub3RlCisgICAgICB0aGF0IHRoZSBmaXJzdCBsZXR0ZXIgaXMgY2FwaXRhbGl6ZWQsIHVubGlrZSBKYXZhLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIE9iamVjdCBwYXRocyBhcmUgbm9ybWFsbHkgYWxsIGxvd2VyY2FzZSB3aXRoIHVuZGVyc2NvcmVzIHVzZWQgcmF0aGVyIHRoYW4KKyAgICAgIGh5cGhlbnMuCisgICAgPC9wYXJhPgorICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0idXVpZHMiPgorICAgIDx0aXRsZT5VVUlEczwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBBIHdvcmtpbmcgRC1CdXMgaW1wbGVtZW50YXRpb24gdXNlcyB1bml2ZXJzYWxseS11bmlxdWUgSURzIGluIHR3byBwbGFjZXMuCisgICAgICBGaXJzdCwgZWFjaCBzZXJ2ZXIgYWRkcmVzcyBoYXMgYSBVVUlEIGlkZW50aWZ5aW5nIHRoZSBhZGRyZXNzLCAKKyAgICAgIGFzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJhZGRyZXNzZXMiLz4uIFNlY29uZCwgZWFjaCBvcGVyYXRpbmcKKyAgICAgIHN5c3RlbSBrZXJuZWwgaW5zdGFuY2UgcnVubmluZyBhIEQtQnVzIGNsaWVudCBvciBzZXJ2ZXIgaGFzIGEgVVVJRAorICAgICAgaWRlbnRpZnlpbmcgdGhhdCBrZXJuZWwsIHJldHJpZXZlZCBieSBpbnZva2luZyB0aGUgbWV0aG9kCisgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCgpIChzZWUgPHhyZWYKKyAgICAgIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtcGVlciIvPikuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgVGhlIHRlcm0gIlVVSUQiIGluIHRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgbGl0ZXJhbGx5LCBpLmUuIGFuCisgICAgICBpZGVudGlmaWVyIHRoYXQgaXMgdW5pdmVyc2FsbHkgdW5pcXVlLiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gcmVmZXIgdG8KKyAgICAgIFJGQzQxMjIsIGFuZCBpbiBmYWN0IHRoZSBELUJ1cyBVVUlEIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhhdCBSRkMuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgVGhlIFVVSUQgbXVzdCBjb250YWluIDEyOCBiaXRzIG9mIGRhdGEgYW5kIGJlIGhleC1lbmNvZGVkLiAgVGhlCisgICAgICBoZXgtZW5jb2RlZCBzdHJpbmcgbWF5IG5vdCBjb250YWluIGh5cGhlbnMgb3Igb3RoZXIgbm9uLWhleC1kaWdpdAorICAgICAgY2hhcmFjdGVycywgYW5kIGl0IG11c3QgYmUgZXhhY3RseSAzMiBjaGFyYWN0ZXJzIGxvbmcuICBUbyBnZW5lcmF0ZSBhCisgICAgICBVVUlELCB0aGUgY3VycmVudCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gY29uY2F0ZW5hdGVzIDk2IGJpdHMgb2YgcmFuZG9tCisgICAgICBkYXRhIGZvbGxvd2VkIGJ5IHRoZSAzMi1iaXQgdGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIChpbiBiaWcKKyAgICAgIGVuZGlhbiBieXRlIG9yZGVyKS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBJdCB3b3VsZCBhbHNvIGJlIGFjY2VwdGFibGUgYW5kIHByb2JhYmx5IGJldHRlciB0byBzaW1wbHkgZ2VuZXJhdGUgMTI4CisgICAgICBiaXRzIG9mIHJhbmRvbSBkYXRhLCBhcyBsb25nIGFzIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBvZiBoaWdoCisgICAgICBxdWFsaXR5LiBUaGUgdGltZXN0YW1wIGNvdWxkIGNvbmNlaXZhYmx5IGhlbHAgaWYgdGhlIHJhbmRvbSBiaXRzIGFyZSBub3QKKyAgICAgIHZlcnkgcmFuZG9tLiBXaXRoIGEgcXVhbGl0eSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgY29sbGlzaW9ucyBhcmUKKyAgICAgIGV4dHJlbWVseSB1bmxpa2VseSBldmVuIHdpdGggb25seSA5NiBiaXRzLCBzbyBpdCdzIHNvbWV3aGF0IGFjYWRlbWljLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEltcGxlbWVudGF0aW9ucyBzaG91bGQsIGhvd2V2ZXIsIHN0aWNrIHRvIHJhbmRvbSBkYXRhIGZvciB0aGUgZmlyc3QgOTYgYml0cworICAgICAgb2YgdGhlIFVVSUQuCisgICAgPC9wYXJhPgorICA8L3NlY3QxPgorICAgIAorICA8c2VjdDEgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMiPgorICAgIDx0aXRsZT5TdGFuZGFyZCBJbnRlcmZhY2VzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLW5vdGF0aW9uIi8+IGZvciBkZXRhaWxzIG9uIAorICAgICAgIHRoZSBub3RhdGlvbiB1c2VkIGluIHRoaXMgc2VjdGlvbi4gVGhlcmUgYXJlIHNvbWUgc3RhbmRhcmQgaW50ZXJmYWNlcworICAgICAgdGhhdCBtYXkgYmUgdXNlZnVsIGFjcm9zcyB2YXJpb3VzIEQtQnVzIGFwcGxpY2F0aW9ucy4KKyAgICA8L3BhcmE+CisgICAgPHNlY3QyIGlkPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXBlZXIiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXI8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlcjwvbGl0ZXJhbD4gaW50ZXJmYWNlIAorICAgICAgICBoYXMgdHdvIG1ldGhvZHM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLlBpbmcgKCkKKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCAob3V0IFNUUklORyBtYWNoaW5lX3V1aWQpCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gcmVjZWlwdCBvZiB0aGUgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IG1lc3NhZ2UKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nPC9saXRlcmFsPiwgYW4gYXBwbGljYXRpb24gc2hvdWxkIGRvCisgICAgICAgIG5vdGhpbmcgb3RoZXIgdGhhbiByZXBseSB3aXRoIGEgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4gYXMKKyAgICAgICAgdXN1YWwuICBJdCBkb2VzIG5vdCBtYXR0ZXIgd2hpY2ggb2JqZWN0IHBhdGggYSBwaW5nIGlzIHNlbnQgdG8uICBUaGUKKyAgICAgICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhpcyBtZXRob2QgYXV0b21hdGljYWxseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPbiByZWNlaXB0IG9mIHRoZSA8bGl0ZXJhbD5NRVRIT0RfQ0FMTDwvbGl0ZXJhbD4gbWVzc2FnZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZDwvbGl0ZXJhbD4sIGFuIGFwcGxpY2F0aW9uIHNob3VsZCAKKyAgICAgICAgcmVwbHkgd2l0aCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IGNvbnRhaW5pbmcgYSBoZXgtZW5jb2RlZCAKKyAgICAgICAgVVVJRCByZXByZXNlbnRpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSBtYWNoaW5lIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcgb24uCisgICAgICAgIFRoaXMgVVVJRCBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgcHJvY2Vzc2VzIG9uIGEgc2luZ2xlIHN5c3RlbSBhdCBsZWFzdAorICAgICAgICB1bnRpbCB0aGF0IHN5c3RlbSBuZXh0IHJlYm9vdHMuIEl0IHNob3VsZCBiZSB0aGUgc2FtZSBhY3Jvc3MgcmVib290cyAKKyAgICAgICAgaWYgcG9zc2libGUsIGJ1dCB0aGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGFuZCBpcyBub3QgCisgICAgICAgIGd1YXJhbnRlZWQuCisgICAgICAgIEl0IGRvZXMgbm90IG1hdHRlciB3aGljaCBvYmplY3QgcGF0aCBhIEdldE1hY2hpbmVJZCBpcyBzZW50IHRvLiAgVGhlCisgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIFVVSUQgaXMgaW50ZW5kZWQgdG8gYmUgcGVyLWluc3RhbmNlLW9mLXRoZS1vcGVyYXRpbmctc3lzdGVtLCBzbyBtYXkgcmVwcmVzZW50CisgICAgICAgIGEgdmlydHVhbCBtYWNoaW5lIHJ1bm5pbmcgb24gYSBoeXBlcnZpc29yLCByYXRoZXIgdGhhbiBhIHBoeXNpY2FsIG1hY2hpbmUuCisgICAgICAgIEJhc2ljYWxseSBpZiB0d28gcHJvY2Vzc2VzIHNlZSB0aGUgc2FtZSBVVUlELCB0aGV5IHNob3VsZCBhbHNvIHNlZSB0aGUgc2FtZQorICAgICAgICBzaGFyZWQgbWVtb3J5LCBVTklYIGRvbWFpbiBzb2NrZXRzLCBwcm9jZXNzIElEcywgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSAKKyAgICAgICAgYSBydW5uaW5nIE9TIGtlcm5lbCBpbiBjb21tb24gYmV0d2VlbiB0aGUgcHJvY2Vzc2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBVVUlEIGlzIG9mdGVuIHVzZWQgd2hlcmUgb3RoZXIgcHJvZ3JhbXMgbWlnaHQgdXNlIGEgaG9zdG5hbWUuIEhvc3RuYW1lcyAKKyAgICAgICAgY2FuIGNoYW5nZSB3aXRob3V0IHJlYm9vdGluZywgaG93ZXZlciwgb3IganVzdCBiZSAibG9jYWxob3N0IiAtIHNvIHRoZSBVVUlECisgICAgICAgIGlzIG1vcmUgcm9idXN0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIDx4cmVmIGxpbmtlbmQ9InV1aWRzIi8+IGV4cGxhaW5zIHRoZSBmb3JtYXQgb2YgdGhlIFVVSUQuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1pbnRyb3NwZWN0YWJsZSI+CisgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIGludGVyZmFjZSBoYXMgb25lIG1ldGhvZDoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlLkludHJvc3BlY3QgKG91dCBTVFJJTkcgeG1sX2RhdGEpCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT2JqZWN0cyBpbnN0YW5jZXMgbWF5IGltcGxlbWVudAorICAgICAgICA8bGl0ZXJhbD5JbnRyb3NwZWN0PC9saXRlcmFsPiB3aGljaCByZXR1cm5zIGFuIFhNTCBkZXNjcmlwdGlvbiBvZgorICAgICAgICB0aGUgb2JqZWN0LCBpbmNsdWRpbmcgaXRzIGludGVyZmFjZXMgKHdpdGggc2lnbmFscyBhbmQgbWV0aG9kcyksIG9iamVjdHMKKyAgICAgICAgYmVsb3cgaXQgaW4gdGhlIG9iamVjdCBwYXRoIHRyZWUsIGFuZCBpdHMgcHJvcGVydGllcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8eHJlZiBsaW5rZW5kPSJpbnRyb3NwZWN0aW9uLWZvcm1hdCIvPiBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGlzIFhNTCBzdHJpbmcuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMtcHJvcGVydGllcyI+CisgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllczwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIE1hbnkgbmF0aXZlIEFQSXMgd2lsbCBoYXZlIGEgY29uY2VwdCBvZiBvYmplY3QgPGZpcnN0dGVybT5wcm9wZXJ0aWVzPC9maXJzdHRlcm0+IAorICAgICAgICBvciA8Zmlyc3R0ZXJtPmF0dHJpYnV0ZXM8L2ZpcnN0dGVybT4uIFRoZXNlIGNhbiBiZSBleHBvc2VkIHZpYSB0aGUgCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM8L2xpdGVyYWw+IGludGVyZmFjZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuR2V0IChpbiBTVFJJTkcgaW50ZXJmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBTVFJJTkcgcHJvcGVydHlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBWQVJJQU5UIHZhbHVlKTsKKyAgICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5TZXQgKGluIFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFNUUklORyBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gVkFSSUFOVCB2YWx1ZSk7CisgICAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuR2V0QWxsIChpbiBTVFJJTkcgaW50ZXJmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsgcHJvcHMpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBhdmFpbGFibGUgcHJvcGVydGllcyBhbmQgd2hldGhlciB0aGV5IGFyZSB3cml0YWJsZSBjYW4gYmUgZGV0ZXJtaW5lZAorICAgICAgICBieSBjYWxsaW5nIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlLkludHJvc3BlY3Q8L2xpdGVyYWw+LAorICAgICAgICBzZWUgPHhyZWYgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1pbnRyb3NwZWN0YWJsZSIvPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBbiBlbXB0eSBzdHJpbmcgbWF5IGJlIHByb3ZpZGVkIGZvciB0aGUgaW50ZXJmYWNlIG5hbWU7IGluIHRoaXMgY2FzZSwgCisgICAgICAgIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9uIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIG5hbWUsIAorICAgICAgICB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIChwaWNraW5nIG9uZSBieSBhY2NvcmRpbmcgdG8gYW4gYXJiaXRyYXJ5IAorICAgICAgICBkZXRlcm1pbmlzdGljIHJ1bGUsIG9yIHJldHVybmluZyBhbiBlcnJvciwgYXJlIHRoZSByZWFzb25hYmxlIAorICAgICAgICBwb3NzaWJpbGl0aWVzKS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIGNoYW5nZSBvbiBhbiBvYmplY3QsIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlByb3BlcnRpZXNDaGFuZ2VkPC9saXRlcmFsPgorICAgICAgICBzaWduYWwgbWF5IGJlIGVtaXR0ZWQgKHRoaXMgc2lnbmFsIHdhcyBhZGRlZCBpbiAwLjE0KToKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuUHJvcGVydGllc0NoYW5nZWQgKFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsgY2hhbmdlZF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWSZsdDtTVFJJTkcmZ3Q7IGludmFsaWRhdGVkX3Byb3BlcnRpZXMpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIHdoZXJlIDxsaXRlcmFsPmNoYW5nZWRfcHJvcGVydGllczwvbGl0ZXJhbD4gaXMgYSBkaWN0aW9uYXJ5CisgICAgICAgIGNvbnRhaW5pbmcgdGhlIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIHRoZSBuZXcgdmFsdWVzIGFuZAorICAgICAgICA8bGl0ZXJhbD5pbnZhbGlkYXRlZF9wcm9wZXJ0aWVzPC9saXRlcmFsPiBpcyBhbiBhcnJheSBvZgorICAgICAgICBwcm9wZXJ0aWVzIHRoYXQgY2hhbmdlZCBidXQgdGhlIHZhbHVlIGlzIG5vdCBjb252ZXllZC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBXaGV0aGVyIHRoZSA8bGl0ZXJhbD5Qcm9wZXJ0aWVzQ2hhbmdlZDwvbGl0ZXJhbD4gc2lnbmFsIGlzCisgICAgICAgIHN1cHBvcnRlZCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBjYWxsaW5nCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlLkludHJvc3BlY3Q8L2xpdGVyYWw+LiBOb3RlCisgICAgICAgIHRoYXQgdGhlIHNpZ25hbCBtYXkgYmUgc3VwcG9ydGVkIGZvciBhbiBvYmplY3QgYnV0IGl0IG1heQorICAgICAgICBkaWZmZXIgaG93IHdoZXRoZXIgYW5kIGhvdyBpdCBpcyB1c2VkIG9uIGEgcGVyLXByb3BlcnR5IGJhc2lzCisgICAgICAgIChmb3IgZS5nLiBwZXJmb3JtYW5jZSBvciBzZWN1cml0eSByZWFzb25zKS4gRWFjaCBwcm9wZXJ0eSAob3IKKyAgICAgICAgdGhlIHBhcmVudCBpbnRlcmZhY2UpIG11c3QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnR5LkVtaXRzQ2hhbmdlZFNpZ25hbDwvbGl0ZXJhbD4KKyAgICAgICAgYW5ub3RhdGlvbiB0byBjb252ZXkgdGhpcyAodXN1YWxseSB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiBpcyBzdWZmaWNpZW50IG1lYW5pbmcgdGhhdCB0aGUKKyAgICAgICAgYW5ub3RhdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIHVzZWQpLiBTZWUgPHhyZWYKKyAgICAgICAgbGlua2VuZD0iaW50cm9zcGVjdGlvbi1mb3JtYXQiLz4gZm9yIGRldGFpbHMgb24gdGhpcworICAgICAgICBhbm5vdGF0aW9uLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJpbnRyb3NwZWN0aW9uLWZvcm1hdCI+CisgICAgPHRpdGxlPkludHJvc3BlY3Rpb24gRGF0YSBGb3JtYXQ8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgQXMgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGUiLz4sIAorICAgICAgb2JqZWN0cyBtYXkgYmUgaW50cm9zcGVjdGVkIGF0IHJ1bnRpbWUsIHJldHVybmluZyBhbiBYTUwgc3RyaW5nIAorICAgICAgdGhhdCBkZXNjcmliZXMgdGhlIG9iamVjdC4gVGhlIHNhbWUgWE1MIGZvcm1hdCBtYXkgYmUgdXNlZCBpbiAKKyAgICAgIG90aGVyIGNvbnRleHRzIGFzIHdlbGwsIGZvciBleGFtcGxlIGFzIGFuICJJREwiIGZvciBnZW5lcmF0aW5nIAorICAgICAgc3RhdGljIGxhbmd1YWdlIGJpbmRpbmdzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpbnRyb3NwZWN0aW9uIGRhdGE6CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICZsdDshRE9DVFlQRSBub2RlIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBPYmplY3QgSW50cm9zcGVjdGlvbiAxLjAvL0VOIgorICAgICAgICAgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9pbnRyb3NwZWN0LmR0ZCImZ3Q7CisgICAgICAgICZsdDtub2RlIG5hbWU9Ii9vcmcvZnJlZWRlc2t0b3Avc2FtcGxlX29iamVjdCImZ3Q7CisgICAgICAgICAgJmx0O2ludGVyZmFjZSBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuU2FtcGxlSW50ZXJmYWNlIiZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iRnJvYmF0ZSImZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iZm9vIiB0eXBlPSJpIiBkaXJlY3Rpb249ImluIi8mZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmFyIiB0eXBlPSJzIiBkaXJlY3Rpb249Im91dCIvJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJheiIgdHlwZT0iYXt1c30iIGRpcmVjdGlvbj0ib3V0Ii8mZ3Q7CisgICAgICAgICAgICAgICZsdDthbm5vdGF0aW9uIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkRlcHJlY2F0ZWQiIHZhbHVlPSJ0cnVlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iQmF6aWZ5IiZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXIiIHR5cGU9IihpaXUpIiBkaXJlY3Rpb249ImluIi8mZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmFyIiB0eXBlPSJ2IiBkaXJlY3Rpb249Im91dCIvJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9Ik1vZ3JpZnkiJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJhciIgdHlwZT0iKGlpYXYpIiBkaXJlY3Rpb249ImluIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDtzaWduYWwgbmFtZT0iQ2hhbmdlZCImZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0ibmV3X3ZhbHVlIiB0eXBlPSJiIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3NpZ25hbCZndDsKKyAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJCYXIiIHR5cGU9InkiIGFjY2Vzcz0icmVhZHdyaXRlIi8mZ3Q7CisgICAgICAgICAgJmx0Oy9pbnRlcmZhY2UmZ3Q7CisgICAgICAgICAgJmx0O25vZGUgbmFtZT0iY2hpbGRfb2Zfc2FtcGxlX29iamVjdCIvJmd0OworICAgICAgICAgICZsdDtub2RlIG5hbWU9ImFub3RoZXJfY2hpbGRfb2Zfc2FtcGxlX29iamVjdCIvJmd0OworICAgICAgICZsdDsvbm9kZSZndDsKKyAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgQSBtb3JlIGZvcm1hbCBEVEQgYW5kIHNwZWMgbmVlZHMgd3JpdGluZywgYnV0IGhlcmUgYXJlIHNvbWUgcXVpY2sgbm90ZXMuCisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbmx5IHRoZSByb290ICZsdDtub2RlJmd0OyBlbGVtZW50IGNhbiBvbWl0IHRoZSBub2RlIG5hbWUsIGFzIGl0J3MKKyAgICAgICAgICAgIGtub3duIHRvIGJlIHRoZSBvYmplY3QgdGhhdCB3YXMgaW50cm9zcGVjdGVkLiAgSWYgdGhlIHJvb3QKKyAgICAgICAgICAgICZsdDtub2RlJmd0OyBkb2VzIGhhdmUgYSBuYW1lIGF0dHJpYnV0ZSwgaXQgbXVzdCBiZSBhbiBhYnNvbHV0ZQorICAgICAgICAgICAgb2JqZWN0IHBhdGguIElmIGNoaWxkICZsdDtub2RlJmd0OyBoYXZlIG9iamVjdCBwYXRocywgdGhleSBtdXN0IGJlCisgICAgICAgICAgICByZWxhdGl2ZS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIGEgY2hpbGQgJmx0O25vZGUmZ3Q7IGhhcyBhbnkgc3ViLWVsZW1lbnRzLCB0aGVuIHRoZXkgCisgICAgICAgICAgICBtdXN0IHJlcHJlc2VudCBhIGNvbXBsZXRlIGludHJvc3BlY3Rpb24gb2YgdGhlIGNoaWxkLgorICAgICAgICAgICAgSWYgYSBjaGlsZCAmbHQ7bm9kZSZndDsgaXMgZW1wdHksIHRoZW4gaXQgbWF5IG9yIG1heSAKKyAgICAgICAgICAgIG5vdCBoYXZlIHN1Yi1lbGVtZW50czsgdGhlIGNoaWxkIG11c3QgYmUgaW50cm9zcGVjdGVkCisgICAgICAgICAgICBpbiBvcmRlciB0byBmaW5kIG91dC4gVGhlIGludGVudCBpcyB0aGF0IGlmIGFuIG9iamVjdCAKKyAgICAgICAgICAgIGtub3dzIHRoYXQgaXRzIGNoaWxkcmVuIGFyZSAiZmFzdCIgdG8gaW50cm9zcGVjdAorICAgICAgICAgICAgaXQgY2FuIGdvIGFoZWFkIGFuZCByZXR1cm4gdGhlaXIgaW5mb3JtYXRpb24sIGJ1dCAKKyAgICAgICAgICAgIG90aGVyd2lzZSBpdCBjYW4gb21pdCBpdC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBkaXJlY3Rpb24gZWxlbWVudCBvbiAmbHQ7YXJnJmd0OyBtYXkgYmUgb21pdHRlZCwgCisgICAgICAgICAgICBpbiB3aGljaCBjYXNlIGl0IGRlZmF1bHRzIHRvICJpbiIgZm9yIG1ldGhvZCBjYWxscyAKKyAgICAgICAgICAgIGFuZCAib3V0IiBmb3Igc2lnbmFscy4gU2lnbmFscyBvbmx5IGFsbG93ICJvdXQiIAorICAgICAgICAgICAgc28gd2hpbGUgZGlyZWN0aW9uIG1heSBiZSBzcGVjaWZpZWQsIGl0J3MgcG9pbnRsZXNzLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHBvc3NpYmxlIGRpcmVjdGlvbnMgYXJlICJpbiIgYW5kICJvdXQiLCAKKyAgICAgICAgICAgIHVubGlrZSBDT1JCQSB0aGVyZSBpcyBubyAiaW5vdXQiCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgcG9zc2libGUgcHJvcGVydHkgYWNjZXNzIGZsYWdzIGFyZSAKKyAgICAgICAgICAgICJyZWFkd3JpdGUiLCAicmVhZCIsIGFuZCAid3JpdGUiCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBNdWx0aXBsZSBpbnRlcmZhY2VzIGNhbiBvZiBjb3Vyc2UgYmUgbGlzdGVkIGZvciAKKyAgICAgICAgICAgIG9uZSAmbHQ7bm9kZSZndDsuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgIm5hbWUiIGF0dHJpYnV0ZSBvbiBhcmd1bWVudHMgaXMgb3B0aW9uYWwuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgICBNZXRob2QsIGludGVyZmFjZSwgcHJvcGVydHksIGFuZCBzaWduYWwgZWxlbWVudHMgbWF5IGhhdmUKKyAgICAgICAgImFubm90YXRpb25zIiwgd2hpY2ggYXJlIGdlbmVyaWMga2V5L3ZhbHVlIHBhaXJzIG9mIG1ldGFkYXRhLgorCVRoZXkgYXJlIHNpbWlsYXIgY29uY2VwdHVhbGx5IHRvIEphdmEncyBhbm5vdGF0aW9ucyBhbmQgQyMgYXR0cmlidXRlcy4KKyAgICAgICAgV2VsbC1rbm93biBhbm5vdGF0aW9uczoKKyAgICAgPC9wYXJhPgorICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorCSA8dGhlYWQ+CisJICAgPHJvdz4KKwkgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKwkgICAgIDxlbnRyeT5WYWx1ZXMgKHNlcGFyYXRlZCBieSAsKTwvZW50cnk+CisJICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorCSAgIDwvcm93PgorCSA8L3RoZWFkPgorCSA8dGJvZHk+CisJICAgPHJvdz4KKwkgICAgIDxlbnRyeT5vcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXByZWNhdGVkPC9lbnRyeT4KKwkgICAgIDxlbnRyeT50cnVlLGZhbHNlPC9lbnRyeT4KKwkgICAgIDxlbnRyeT5XaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIGRlcHJlY2F0ZWQ7IGRlZmF1bHRzIHRvIGZhbHNlPC9lbnRyeT4KKwkgICA8L3Jvdz4KKwkgICA8cm93PgorCSAgICAgPGVudHJ5Pm9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbDwvZW50cnk+CisJICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorCSAgICAgPGVudHJ5PlRoZSBDIHN5bWJvbDsgbWF5IGJlIHVzZWQgZm9yIG1ldGhvZHMgYW5kIGludGVyZmFjZXM8L2VudHJ5PgorCSAgIDwvcm93PgorCSAgIDxyb3c+CisJICAgICA8ZW50cnk+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTWV0aG9kLk5vUmVwbHk8L2VudHJ5PgorCSAgICAgPGVudHJ5PnRydWUsZmFsc2U8L2VudHJ5PgorCSAgICAgPGVudHJ5PklmIHNldCwgZG9uJ3QgZXhwZWN0IGEgcmVwbHkgdG8gdGhlIG1ldGhvZCBjYWxsOyBkZWZhdWx0cyB0byBmYWxzZS48L2VudHJ5PgorCSAgIDwvcm93PgorCSAgIDxyb3c+CisJICAgICA8ZW50cnk+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydHkuRW1pdHNDaGFuZ2VkU2lnbmFsPC9lbnRyeT4KKwkgICAgIDxlbnRyeT50cnVlLGludmFsaWRhdGVzLGZhbHNlPC9lbnRyeT4KKwkgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LCB0aGUKKyAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5Qcm9wZXJ0aWVzQ2hhbmdlZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgc2lnbmFsLCBzZWUgPHhyZWYKKyAgICAgICAgICAgICAgICAgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzIi8+IGlzIG5vdAorICAgICAgICAgICAgICAgICBndWFyYW50ZWVkIHRvIGJlIGVtaXR0ZWQgaWYgdGhlIHByb3BlcnR5IGNoYW5nZXMuCisgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIDxsaXRlcmFsPmludmFsaWRhdGVzPC9saXRlcmFsPiB0aGUgc2lnbmFsCisgICAgICAgICAgICAgICAgIGlzIGVtaXR0ZWQgYnV0IHRoZSB2YWx1ZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgIHNpZ25hbC4KKyAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gdGhlIHNpZ25hbCBpcworICAgICAgICAgICAgICAgICBlbWl0dGVkIHdpdGggdGhlIHZhbHVlIGluY2x1ZGVkLgorICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBmb3IgdGhlIGFubm90YXRpb24gZGVmYXVsdHMgdG8KKyAgICAgICAgICAgICAgICAgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gaWYgdGhlIGVuY2xvc2luZyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgZWxlbWVudCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBhbm5vdGF0aW9uLiBPdGhlcndpc2UgaXQKKyAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgZW5jbG9zaW5nCisgICAgICAgICAgICAgICAgIGludGVyZmFjZSBlbGVtZW50LgorICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvZW50cnk+CisJICAgPC9yb3c+CisJIDwvdGJvZHk+CisgICAgICAgPC90Z3JvdXA+CisgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgPC9zZWN0MT4KKyAgPHNlY3QxIGlkPSJtZXNzYWdlLWJ1cyI+CisgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIFNwZWNpZmljYXRpb248L3RpdGxlPgorICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1idXMtb3ZlcnZpZXciPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIE92ZXJ2aWV3PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWVzc2FnZSBidXMgYWNjZXB0cyBjb25uZWN0aW9ucyBmcm9tIG9uZSBvciBtb3JlIGFwcGxpY2F0aW9ucy4gCisgICAgICAgIE9uY2UgY29ubmVjdGVkLCBhcHBsaWNhdGlvbnMgY2FuIGV4Y2hhbmdlIG1lc3NhZ2VzIHdpdGggb3RoZXIgCisgICAgICAgIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBhbHNvIGNvbm5lY3RlZCB0byB0aGUgYnVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEluIG9yZGVyIHRvIHJvdXRlIG1lc3NhZ2VzIGFtb25nIGNvbm5lY3Rpb25zLCB0aGUgbWVzc2FnZSBidXMga2VlcHMgYQorICAgICAgICBtYXBwaW5nIGZyb20gbmFtZXMgdG8gY29ubmVjdGlvbnMuIEVhY2ggY29ubmVjdGlvbiBoYXMgb25lCisgICAgICAgIHVuaXF1ZS1mb3ItdGhlLWxpZmV0aW1lLW9mLXRoZS1idXMgbmFtZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkLgorICAgICAgICBBcHBsaWNhdGlvbnMgbWF5IHJlcXVlc3QgYWRkaXRpb25hbCBuYW1lcyBmb3IgYSBjb25uZWN0aW9uLiBBZGRpdGlvbmFsCisgICAgICAgIG5hbWVzIGFyZSB1c3VhbGx5ICJ3ZWxsLWtub3duIG5hbWVzIiBzdWNoIGFzCisgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvciIuIFdoZW4gYSBuYW1lIGlzIGJvdW5kIHRvIGEgY29ubmVjdGlvbiwKKyAgICAgICAgdGhhdCBjb25uZWN0aW9uIGlzIHNhaWQgdG8gPGZpcnN0dGVybT5vd248L2ZpcnN0dGVybT4gdGhlIG5hbWUuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGJ1cyBpdHNlbGYgb3ducyBhIHNwZWNpYWwgbmFtZSwgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+LiAKKyAgICAgICAgVGhpcyBuYW1lIHJvdXRlcyBtZXNzYWdlcyB0byB0aGUgYnVzLCBhbGxvd2luZyBhcHBsaWNhdGlvbnMgdG8gbWFrZSAKKyAgICAgICAgYWRtaW5pc3RyYXRpdmUgcmVxdWVzdHMuIEZvciBleGFtcGxlLCBhcHBsaWNhdGlvbnMgY2FuIGFzayB0aGUgYnVzIAorICAgICAgICB0byBhc3NpZ24gYSBuYW1lIHRvIGEgY29ubmVjdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIG5hbWUgbWF5IGhhdmUgPGZpcnN0dGVybT5xdWV1ZWQgb3duZXJzPC9maXJzdHRlcm0+LiAgV2hlbiBhbgorICAgICAgICBhcHBsaWNhdGlvbiByZXF1ZXN0cyBhIG5hbWUgZm9yIGEgY29ubmVjdGlvbiBhbmQgdGhlIG5hbWUgaXMgYWxyZWFkeSBpbgorICAgICAgICB1c2UsIHRoZSBidXMgd2lsbCBvcHRpb25hbGx5IGFkZCB0aGUgY29ubmVjdGlvbiB0byBhIHF1ZXVlIHdhaXRpbmcgZm9yIAorICAgICAgICB0aGUgbmFtZS4gSWYgdGhlIGN1cnJlbnQgb3duZXIgb2YgdGhlIG5hbWUgZGlzY29ubmVjdHMgb3IgcmVsZWFzZXMKKyAgICAgICAgdGhlIG5hbWUsIHRoZSBuZXh0IGNvbm5lY3Rpb24gaW4gdGhlIHF1ZXVlIHdpbGwgYmVjb21lIHRoZSBuZXcgb3duZXIuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIGZlYXR1cmUgY2F1c2VzIHRoZSByaWdodCB0aGluZyB0byBoYXBwZW4gaWYgeW91IHN0YXJ0IHR3byB0ZXh0CisgICAgICAgIGVkaXRvcnMgZm9yIGV4YW1wbGU7IHRoZSBmaXJzdCBvbmUgbWF5IHJlcXVlc3QgIm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yIiwgCisgICAgICAgIGFuZCB0aGUgc2Vjb25kIHdpbGwgYmUgcXVldWVkIGFzIGEgcG9zc2libGUgb3duZXIgb2YgdGhhdCBuYW1lLiBXaGVuIAorICAgICAgICB0aGUgZmlyc3QgZXhpdHMsIHRoZSBzZWNvbmQgd2lsbCB0YWtlIG92ZXIuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBNZXNzYWdlcyBtYXkgaGF2ZSBhIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCAoc2VlIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtaGVhZGVyLWZpZWxkcyIvPikuICBJZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIG1lc3NhZ2UKKyAgICAgICAgcmVjaXBpZW50IGJ5IG5hbWUuIE1ldGhvZCBjYWxscyBhbmQgcmVwbGllcyBub3JtYWxseSBzcGVjaWZ5IHRoaXMgZmllbGQuCisgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBtdXN0IHNlbmQgbWVzc2FnZXMgKG9mIGFueSB0eXBlKSB3aXRoIHRoZQorICAgICAgICA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gZmllbGQgc2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVjaXBpZW50LAorICAgICAgICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHJlY2lwaWVudCBoYXMgc2V0IHVwIGEgbWF0Y2ggcnVsZSBtYXRjaGluZworICAgICAgICB0aGUgbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFNpZ25hbHMgbm9ybWFsbHkgZG8gbm90IHNwZWNpZnkgYSBkZXN0aW5hdGlvbjsgdGhleSBhcmUgc2VudCB0byBhbGwKKyAgICAgICAgYXBwbGljYXRpb25zIHdpdGggPGZpcnN0dGVybT5tZXNzYWdlIG1hdGNoaW5nIHJ1bGVzPC9maXJzdHRlcm0+IHRoYXQKKyAgICAgICAgbWF0Y2ggdGhlIG1lc3NhZ2UuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIHRoZSBtZXNzYWdlIGJ1cyByZWNlaXZlcyBhIG1ldGhvZCBjYWxsLCBpZiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIGlzIGFic2VudCwgdGhlIGNhbGwgaXMgdGFrZW4gdG8gYmUKKyAgICAgICAgYSBzdGFuZGFyZCBvbmUtdG8tb25lIG1lc3NhZ2UgYW5kIGludGVycHJldGVkIGJ5IHRoZSBtZXNzYWdlIGJ1cworICAgICAgICBpdHNlbGYuIEZvciBleGFtcGxlLCBzZW5kaW5nIGFuCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZzwvbGl0ZXJhbD4gbWVzc2FnZSB3aXRoIG5vCisgICAgICAgIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiB3aWxsIGNhdXNlIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYgdG8KKyAgICAgICAgcmVwbHkgdG8gdGhlIHBpbmcgaW1tZWRpYXRlbHk7IHRoZSBtZXNzYWdlIGJ1cyB3aWxsIG5vdCBtYWtlIHRoaXMKKyAgICAgICAgbWVzc2FnZSB2aXNpYmxlIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIENvbnRpbnVpbmcgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZzwvbGl0ZXJhbD4gZXhhbXBsZSwgaWYKKyAgICAgICAgdGhlIHBpbmcgbWVzc2FnZSB3ZXJlIHNlbnQgd2l0aCBhIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBuYW1lIG9mCisgICAgICAgIDxsaXRlcmFsPmNvbS55b3lvZHluZS5TY3JlZW5zYXZlcjwvbGl0ZXJhbD4sIHRoZW4gdGhlIHBpbmcgd291bGQgYmUKKyAgICAgICAgZm9yd2FyZGVkLCBhbmQgdGhlIFlveW9keW5lIENvcnBvcmF0aW9uIHNjcmVlbnNhdmVyIGFwcGxpY2F0aW9uIHdvdWxkIGJlCisgICAgICAgIGV4cGVjdGVkIHRvIHJlcGx5IHRvIHRoZSBwaW5nLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLW5hbWVzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBOYW1lczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCBjb25uZWN0aW9uIGhhcyBhdCBsZWFzdCBvbmUgbmFtZSwgYXNzaWduZWQgYXQgY29ubmVjdGlvbiB0aW1lIGFuZAorICAgICAgICByZXR1cm5lZCBpbiByZXNwb25zZSB0byB0aGUKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG88L2xpdGVyYWw+IG1ldGhvZCBjYWxsLiAgVGhpcworICAgICAgICBhdXRvbWF0aWNhbGx5LWFzc2lnbmVkIG5hbWUgaXMgY2FsbGVkIHRoZSBjb25uZWN0aW9uJ3MgPGZpcnN0dGVybT51bmlxdWUKKyAgICAgICAgbmFtZTwvZmlyc3R0ZXJtPi4gIFVuaXF1ZSBuYW1lcyBhcmUgbmV2ZXIgcmV1c2VkIGZvciB0d28gZGlmZmVyZW50CisgICAgICAgIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIGJ1cy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPd25lcnNoaXAgb2YgYSB1bmlxdWUgbmFtZSBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgaW50ZXJhY3Rpb24gd2l0aCAKKyAgICAgICAgdGhlIG1lc3NhZ2UgYnVzLiBJdCBsb2dpY2FsbHkgZm9sbG93cyB0aGF0IHRoZSB1bmlxdWUgbmFtZSBpcyBhbHdheXMgCisgICAgICAgIHRoZSBmaXJzdCBuYW1lIHRoYXQgYW4gYXBwbGljYXRpb24gY29tZXMgdG8gb3duLCBhbmQgdGhlIGxhc3QgCisgICAgICAgIG9uZSB0aGF0IGl0IGxvc2VzIG93bmVyc2hpcCBvZi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVbmlxdWUgY29ubmVjdGlvbiBuYW1lcyBtdXN0IGJlZ2luIHdpdGggdGhlIGNoYXJhY3RlciAnOicgKEFTQ0lJIGNvbG9uCisgICAgICAgIGNoYXJhY3Rlcik7IGJ1cyBuYW1lcyB0aGF0IGFyZSBub3QgdW5pcXVlIG5hbWVzIG11c3Qgbm90IGJlZ2luCisgICAgICAgIHdpdGggdGhpcyBjaGFyYWN0ZXIuIChUaGUgYnVzIG11c3QgcmVqZWN0IGFueSBhdHRlbXB0IGJ5IGFuIGFwcGxpY2F0aW9uCisgICAgICAgIHRvIG1hbnVhbGx5IHJlcXVlc3QgYSBuYW1lIGJlZ2lubmluZyB3aXRoICc6Jy4pIFRoaXMgcmVzdHJpY3Rpb24KKyAgICAgICAgY2F0ZWdvcmljYWxseSBwcmV2ZW50cyAic3Bvb2ZpbmciOyBtZXNzYWdlcyBzZW50IHRvIGEgdW5pcXVlIG5hbWUKKyAgICAgICAgd2lsbCBhbHdheXMgZ28gdG8gdGhlIGV4cGVjdGVkIGNvbm5lY3Rpb24uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgV2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCBhbGwgdGhlIG5hbWVzIHRoYXQgaXQgb3ducyBhcmUgZGVsZXRlZCAob3IKKyAgICAgICAgdHJhbnNmZXJyZWQgdG8gdGhlIG5leHQgY29ubmVjdGlvbiBpbiB0aGUgcXVldWUgaWYgYW55KS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBIGNvbm5lY3Rpb24gY2FuIHJlcXVlc3QgYWRkaXRpb25hbCBuYW1lcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggaXQgdXNpbmcKKyAgICAgICAgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlJlcXVlc3ROYW1lPC9saXRlcmFsPiBtZXNzYWdlLiA8eHJlZgorICAgICAgICBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyIvPiBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiBhIHZhbGlkCisgICAgICAgIG5hbWUuIFRoZXNlIG5hbWVzIGNhbiBiZSByZWxlYXNlZCBhZ2FpbiB1c2luZyB0aGUKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVsZWFzZU5hbWU8L2xpdGVyYWw+IG1lc3NhZ2UuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXJlcXVlc3QtbmFtZSI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZXF1ZXN0TmFtZTwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVSU5UMzIgUmVxdWVzdE5hbWUgKGluIFNUUklORyBuYW1lLCBpbiBVSU5UMzIgZmxhZ3MpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB0byByZXF1ZXN0PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PjE8L2VudHJ5PgorCQkgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorCQkgIDxlbnRyeT5GbGFnczwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlJldHVybiB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBtZXRob2QgY2FsbCBzaG91bGQgYmUgc2VudCB0bworICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9saXRlcmFsPiBhbmQgYXNrcyB0aGUgbWVzc2FnZSBidXMgdG8KKyAgICAgICAgICBhc3NpZ24gdGhlIGdpdmVuIG5hbWUgdG8gdGhlIG1ldGhvZCBjYWxsZXIuIEVhY2ggbmFtZSBtYWludGFpbnMgYQorICAgICAgICAgIHF1ZXVlIG9mIHBvc3NpYmxlIG93bmVycywgd2hlcmUgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIHRoZSBwcmltYXJ5CisgICAgICAgICAgb3IgY3VycmVudCBvd25lciBvZiB0aGUgbmFtZS4gRWFjaCBwb3RlbnRpYWwgb3duZXIgaW4gdGhlIHF1ZXVlCisgICAgICAgICAgbWFpbnRhaW5zIHRoZSBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBhbmQKKyAgICAgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgc2V0dGluZ3MgZnJvbSBpdHMgbGF0ZXN0IFJlcXVlc3ROYW1lCisgICAgICAgICAgY2FsbC4gIFdoZW4gUmVxdWVzdE5hbWUgaXMgaW52b2tlZCB0aGUgZm9sbG93aW5nIG9jY3VyczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB0aGUgbWV0aG9kIGNhbGxlciBpcyBjdXJyZW50bHkgdGhlIHByaW1hcnkgb3duZXIgb2YgdGhlIG5hbWUsCisgICAgICAgICAgICAgICAgdGhlIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIGFuZCBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAgICAgICAgICAgICAgICB2YWx1ZXMgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIG5ldyBSZXF1ZXN0TmFtZSBjYWxsLCAKKyAgICAgICAgICAgICAgICBhbmQgbm90aGluZyBmdXJ0aGVyIGhhcHBlbnMuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSWYgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciAoaGVhZCBvZiB0aGUgcXVldWUpIGhhcworICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHNldCwgYW5kIHRoZSBSZXF1ZXN0TmFtZQorICAgICAgICAgICAgICAgIGludm9jYXRpb24gaGFzIHRoZSBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGZsYWcsIHRoZW4KKyAgICAgICAgICAgICAgICB0aGUgY2FsbGVyIG9mIFJlcXVlc3ROYW1lIHJlcGxhY2VzIHRoZSBjdXJyZW50IHByaW1hcnkgb3duZXIgYXQKKyAgICAgICAgICAgICAgICB0aGUgaGVhZCBvZiB0aGUgcXVldWUgYW5kIHRoZSBjdXJyZW50IHByaW1hcnkgb3duZXIgbW92ZXMgdG8gdGhlCisgICAgICAgICAgICAgICAgc2Vjb25kIHBvc2l0aW9uIGluIHRoZSBxdWV1ZS4gSWYgdGhlIGNhbGxlciBvZiBSZXF1ZXN0TmFtZSB3YXMgCisgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIHByZXZpb3VzbHkgaXRzIGZsYWdzIGFyZSB1cGRhdGVkIHdpdGggdGhlIHZhbHVlcyBmcm9tIAorICAgICAgICAgICAgICAgIHRoZSBuZXcgUmVxdWVzdE5hbWUgaW4gYWRkaXRpb24gdG8gbW92aW5nIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiByZXBsYWNlbWVudCBpcyBub3QgcG9zc2libGUsIGFuZCB0aGUgbWV0aG9kIGNhbGxlciBpcworICAgICAgICAgICAgICAgIGN1cnJlbnRseSBpbiB0aGUgcXVldWUgYnV0IG5vdCB0aGUgcHJpbWFyeSBvd25lciwgaXRzIGZsYWdzIGFyZQorICAgICAgICAgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIG5ldyBSZXF1ZXN0TmFtZSBjYWxsLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIHJlcGxhY2VtZW50IGlzIG5vdCBwb3NzaWJsZSwgYW5kIHRoZSBtZXRob2QgY2FsbGVyIGlzCisgICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBpbiB0aGUgcXVldWUsIHRoZSBtZXRob2QgY2FsbGVyIGlzIGFwcGVuZGVkIHRvIHRoZQorICAgICAgICAgICAgICAgIHF1ZXVlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIGFueSBjb25uZWN0aW9uIGluIHRoZSBxdWV1ZSBoYXMgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgICAgICAgICAgICAgICAgc2V0IGFuZCBpcyBub3QgdGhlIHByaW1hcnkgb3duZXIsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICBxdWV1ZS4gVGhpcyBjYW4gYXBwbHkgdG8gdGhlIHByZXZpb3VzIHByaW1hcnkgb3duZXIgKGlmIGl0CisgICAgICAgICAgICAgICAgd2FzIHJlcGxhY2VkKSBvciB0aGUgbWV0aG9kIGNhbGxlciAoaWYgaXQgdXBkYXRlZCB0aGUKKyAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgZmxhZyB3aGlsZSBzdGlsbCBzdHVjayBpbiB0aGUKKyAgICAgICAgICAgICAgICBxdWV1ZSwgb3IgaWYgaXQgd2FzIGp1c3QgYWRkZWQgdG8gdGhlIHF1ZXVlIHdpdGggdGhhdCBmbGFnIHNldCkuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTm90ZSB0aGF0IERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgcmVzdWx0cyBpbiAianVtcGluZyB0aGUKKyAgICAgICAgICBxdWV1ZSwiIGV2ZW4gaWYgYW5vdGhlciBhcHBsaWNhdGlvbiBhbHJlYWR5IGluIHRoZSBxdWV1ZSBoYWQgc3BlY2lmaWVkCisgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4gIFRoaXMgY29tZXMgdXAgaWYgYSBwcmltYXJ5IG93bmVyCisgICAgICAgICAgdGhhdCBkb2VzIG5vdCBhbGxvdyByZXBsYWNlbWVudCBnb2VzIGF3YXksIGFuZCB0aGUgbmV4dCBwcmltYXJ5IG93bmVyCisgICAgICAgICAgZG9lcyBhbGxvdyByZXBsYWNlbWVudC4gSW4gdGhpcyBjYXNlLCBxdWV1ZWQgaXRlbXMgdGhhdCBzcGVjaWZpZWQKKyAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIDxlbXBoYXNpcz5kbyBub3Q8L2VtcGhhc2lzPgorICAgICAgICAgIGF1dG9tYXRpY2FsbHkgcmVwbGFjZSB0aGUgbmV3IHByaW1hcnkgb3duZXIuIEluIG90aGVyIHdvcmRzLAorICAgICAgICAgIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgaXMgbm90IHNhdmVkLCBpdCBpcyBvbmx5IHVzZWQgYXQgdGhlCisgICAgICAgICAgdGltZSBSZXF1ZXN0TmFtZSBpcyBjYWxsZWQuIFRoaXMgaXMgZGVsaWJlcmF0ZSB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wCisgICAgICAgICAgYW55dGltZSB0d28gYXBwbGljYXRpb25zIGFyZSBib3RoIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIAorICAgICAgICAgIGFuZCBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBmbGFncyBhcmd1bWVudCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbG9naWNhbGx5IE9SZWQKKyAgICAgICAgICB0b2dldGhlcjoKKworICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PkRCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UPC9lbnRyeT4KKwkJICA8ZW50cnk+MHgxPC9lbnRyeT4KKwkJICA8ZW50cnk+CisKKyAgICAgICAgICAgICAgICAgICAgSWYgYW4gYXBwbGljYXRpb24gQSBzcGVjaWZpZXMgdGhpcyBmbGFnIGFuZCBzdWNjZWVkcyBpbgorICAgICAgICAgICAgICAgICAgICBiZWNvbWluZyB0aGUgb3duZXIgb2YgdGhlIG5hbWUsIGFuZCBhbm90aGVyIGFwcGxpY2F0aW9uIEIKKyAgICAgICAgICAgICAgICAgICAgbGF0ZXIgY2FsbHMgUmVxdWVzdE5hbWUgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBmbGFnLCB0aGVuIGFwcGxpY2F0aW9uIEEKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBsb3NlIG93bmVyc2hpcCBhbmQgcmVjZWl2ZSBhCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVMb3N0PC9saXRlcmFsPiBzaWduYWwsIGFuZAorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBCIHdpbGwgYmVjb21lIHRoZSBuZXcgb3duZXIuIElmIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UCisgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQgYnkgYXBwbGljYXRpb24gQSwgb3IgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORworICAgICAgICAgICAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkIGJ5IGFwcGxpY2F0aW9uIEIsIHRoZW4gYXBwbGljYXRpb24gQiB3aWxsIG5vdCByZXBsYWNlCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIEEgYXMgdGhlIG93bmVyLgorCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisJICAgICAgICA8cm93PgorCQkgIDxlbnRyeT5EQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HPC9lbnRyeT4KKwkJICA8ZW50cnk+MHgyPC9lbnRyeT4KKwkJICA8ZW50cnk+CisKKyAgICAgICAgICAgICAgICAgICAgVHJ5IHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgb3duZXIgaWYgdGhlcmUgaXMgb25lLiBJZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIGZsYWcgaXMgbm90IHNldCB0aGUgYXBwbGljYXRpb24gd2lsbCBvbmx5IGJlY29tZSB0aGUgb3duZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBvd25lci4gSWYgdGhpcyBmbGFnIGlzIHNldCwKKyAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBvd25lciBpZgorICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBvd25lciBzcGVjaWZpZWQgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQuCisKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKwkgICAgICAgIDxyb3c+CisJCSAgPGVudHJ5PkRCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRTwvZW50cnk+CisJCSAgPGVudHJ5PjB4NDwvZW50cnk+CisJCSAgPGVudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIFdpdGhvdXQgdGhpcyBmbGFnLCBpZiBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0cyBhIG5hbWUgdGhhdCBpcworICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IG93bmVkLCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwbGFjZWQgaW4gYSBxdWV1ZSB0bworICAgICAgICAgICAgICAgICAgICBvd24gdGhlIG5hbWUgd2hlbiB0aGUgY3VycmVudCBvd25lciBnaXZlcyBpdCB1cC4gSWYgdGhpcworICAgICAgICAgICAgICAgICAgICBmbGFnIGlzIGdpdmVuLCB0aGUgYXBwbGljYXRpb24gd2lsbCBub3QgYmUgcGxhY2VkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdGhlIHJlcXVlc3QgZm9yIHRoZSBuYW1lIHdpbGwgc2ltcGx5IGZhaWwuICBUaGlzIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgYWxzbyBhZmZlY3RzIGJlaGF2aW9yIHdoZW4gYW4gYXBwbGljYXRpb24gaXMgcmVwbGFjZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgbmFtZSBvd25lcjsgYnkgZGVmYXVsdCB0aGUgYXBwbGljYXRpb24gbW92ZXMgYmFjayBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHF1ZXVlLCB1bmxlc3MgdGhpcyBmbGFnIHdhcyBwcm92aWRlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICBiZWNhbWUgdGhlIG5hbWUgb3duZXIuCisKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKwkgICAgICA8L3Rib2R5PgorCSAgICA8L3Rncm91cD4KKwkgIDwvaW5mb3JtYWx0YWJsZT4KKworICAgICAgICAgIFRoZSByZXR1cm4gY29kZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgTmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorCSAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSPC9lbnRyeT4KKwkJICA8ZW50cnk+MTwvZW50cnk+IDxlbnRyeT5UaGUgY2FsbGVyIGlzIG5vdyB0aGUgcHJpbWFyeSBvd25lciBvZgorCQkgIHRoZSBuYW1lLCByZXBsYWNpbmcgYW55IHByZXZpb3VzIG93bmVyLiBFaXRoZXIgdGhlIG5hbWUgaGFkIG5vCisJCSAgb3duZXIgYmVmb3JlLCBvciB0aGUgY2FsbGVyIHNwZWNpZmllZAorCQkgIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgYW5kIHRoZSBjdXJyZW50IG93bmVyIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQuPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+REJVU19SRVFVRVNUX05BTUVfUkVQTFlfSU5fUVVFVUU8L2VudHJ5PgorCQkgIDxlbnRyeT4yPC9lbnRyeT4KKworCQkgIDxlbnRyeT5UaGUgbmFtZSBhbHJlYWR5IGhhZCBhbiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIHdhcyBub3Qgc3BlY2lmaWVkLCBhbmQgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IG93bmVyIGRpZCBub3Qgc3BlY2lmeQorICAgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBvciB0aGUgcmVxdWVzdGluZworICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkaWQgbm90IHNwZWNpZnkgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+REJVU19SRVFVRVNUX05BTUVfUkVQTFlfRVhJU1RTPC9lbnRyeT4gPGVudHJ5PjM8L2VudHJ5PgorCQkgIDxlbnRyeT5UaGUgbmFtZSBhbHJlYWR5IGhhcyBhbiBvd25lciwKKwkJICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgd2FzIHNwZWNpZmllZCwgYW5kIGVpdGhlcgorCQkgIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIHdhcyBub3Qgc3BlY2lmaWVkIGJ5IHRoZQorCQkgIGN1cnJlbnQgb3duZXIsIG9yIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgd2FzIG5vdAorCQkgIHNwZWNpZmllZCBieSB0aGUgcmVxdWVzdGluZyBhcHBsaWNhdGlvbi48L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisJICAgICAgICA8cm93PgorCQkgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9BTFJFQURZX09XTkVSPC9lbnRyeT4KKwkJICA8ZW50cnk+NDwvZW50cnk+CisJCSAgPGVudHJ5PlRoZSBhcHBsaWNhdGlvbiB0cnlpbmcgdG8gcmVxdWVzdCBvd25lcnNoaXAgb2YgYSBuYW1lIGlzIGFscmVhZHkgdGhlIG93bmVyIG9mIGl0LjwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKwkgICAgICA8L3Rib2R5PgorCSAgICA8L3Rncm91cD4KKwkgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgIDwvc2VjdDM+CisKKyAgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1yZWxlYXNlLW5hbWUiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVsZWFzZU5hbWU8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgVUlOVDMyIFJlbGVhc2VOYW1lIChpbiBTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIHJlbGVhc2U8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIG1ldGhvZCBjYWxsIHNob3VsZCBiZSBzZW50IHRvCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+IGFuZCBhc2tzIHRoZSBtZXNzYWdlIGJ1cyB0bworICAgICAgICAgIHJlbGVhc2UgdGhlIG1ldGhvZCBjYWxsZXIncyBjbGFpbSB0byB0aGUgZ2l2ZW4gbmFtZS4gSWYgdGhlIGNhbGxlciBpcworICAgICAgICAgIHRoZSBwcmltYXJ5IG93bmVyLCBhIG5ldyBwcmltYXJ5IG93bmVyIHdpbGwgYmUgc2VsZWN0ZWQgZnJvbSB0aGUKKyAgICAgICAgICBxdWV1ZSBpZiBhbnkgb3RoZXIgb3duZXJzIGFyZSB3YWl0aW5nLiBJZiB0aGUgY2FsbGVyIGlzIHdhaXRpbmcgaW4KKyAgICAgICAgICB0aGUgcXVldWUgZm9yIHRoZSBuYW1lLCB0aGUgY2FsbGVyIHdpbGwgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBhbmQKKyAgICAgICAgICB3aWxsIG5vdCBiZSBtYWRlIGFuIG93bmVyIG9mIHRoZSBuYW1lIGlmIGl0IGxhdGVyIGJlY29tZXMgYXZhaWxhYmxlLgorICAgICAgICAgIElmIHRoZXJlIGFyZSBubyBvdGhlciBvd25lcnMgaW4gdGhlIHF1ZXVlIGZvciB0aGUgbmFtZSwgaXQgd2lsbCBiZQorICAgICAgICAgIHJlbW92ZWQgZnJvbSB0aGUgYnVzIGVudGlyZWx5LgorCisgICAgICAgICAgVGhlIHJldHVybiBjb2RlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisJICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4xPC9lbnRyeT4gPGVudHJ5PlRoZSBjYWxsZXIgaGFzIHJlbGVhc2VkIGhpcyBjbGFpbSBvbgorICAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIG5hbWUuIEVpdGhlciB0aGUgY2FsbGVyIHdhcyB0aGUgcHJpbWFyeSBvd25lciBvZgorICAgICAgICAgICAgICAgICAgdGhlIG5hbWUsIGFuZCB0aGUgbmFtZSBpcyBub3cgdW51c2VkIG9yIHRha2VuIGJ5IHNvbWVib2R5CisgICAgICAgICAgICAgICAgICB3YWl0aW5nIGluIHRoZSBxdWV1ZSBmb3IgdGhlIG5hbWUsIG9yIHRoZSBjYWxsZXIgd2FzIHdhaXRpbmcKKyAgICAgICAgICAgICAgICAgIGluIHRoZSBxdWV1ZSBmb3IgdGhlIG5hbWUgYW5kIGhhcyBub3cgYmVlbiByZW1vdmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICBxdWV1ZS48L2VudHJ5PgorCSAgICAgICAgPC9yb3c+CisJICAgICAgICA8cm93PgorCQkgIDxlbnRyeT5EQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT05fRVhJU1RFTlQ8L2VudHJ5PgorCQkgIDxlbnRyeT4yPC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBidXMuPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+REJVU19SRUxFQVNFX05BTUVfUkVQTFlfTk9UX09XTkVSPC9lbnRyeT4KKwkJICA8ZW50cnk+MzwvZW50cnk+CisJCSAgPGVudHJ5PlRoZSBjYWxsZXIgd2FzIG5vdCB0aGUgcHJpbWFyeSBvd25lciBvZiB0aGlzIG5hbWUsCisgICAgICAgICAgICAgICAgICBhbmQgd2FzIGFsc28gbm90IHdhaXRpbmcgaW4gdGhlIHF1ZXVlIHRvIG93biB0aGlzIG5hbWUuPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgIDwvdGJvZHk+CisJICAgIDwvdGdyb3VwPgorCSAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9zZWN0Mz4KKworICAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWxpc3QtcXVldWVkLW93bmVycyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0UXVldWVkT3duZXJzPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEFSUkFZIG9mIFNUUklORyBMaXN0UXVldWVkT3duZXJzIChpbiBTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgd2VsbC1rbm93biBidXMgbmFtZSB0byBxdWVyeSwgc3VjaCBhcworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5jYXBwdWNjaW5vPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QVJSQVkgb2YgU1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgdW5pcXVlIGJ1cyBuYW1lcyBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcXVldWVkCisgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBtZXRob2QgY2FsbCBzaG91bGQgYmUgc2VudCB0bworICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9saXRlcmFsPiBhbmQgbGlzdHMgdGhlIGNvbm5lY3Rpb25zCisgICAgICAgICAgY3VycmVudGx5IHF1ZXVlZCBmb3IgYSBidXMgbmFtZSAoc2VlCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0idGVybS1xdWV1ZWQtb3duZXIiLz4pLgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy1yb3V0aW5nIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBNZXNzYWdlIFJvdXRpbmc8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEZJWE1FIAorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy1yb3V0aW5nLW1hdGNoLXJ1bGVzIj4KKyAgICAgICAgPHRpdGxlPk1hdGNoIFJ1bGVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisJICBBbiBpbXBvcnRhbnQgcGFydCBvZiB0aGUgbWVzc2FnZSBidXMgcm91dGluZyBwcm90b2NvbCBpcyBtYXRjaCAgCisJICBydWxlcy4gTWF0Y2ggcnVsZXMgZGVzY3JpYmUgd2hhdCBtZXNzYWdlcyBjYW4gYmUgc2VudCB0byBhIGNsaWVudAorICAgICAgICAgIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS4gIFdoZW4gYSBtZXNzYWdlIGlzIHJvdXRlZAorICAgICAgICAgIHRocm91Z2ggdGhlIGJ1cyBpdCBpcyBjb21wYXJlZCB0byBjbGllbnRzJyBtYXRjaCBydWxlcy4gIElmIGFueQorICAgICAgICAgIG9mIHRoZSBydWxlcyBtYXRjaCwgdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCB0byB0aGUgY2xpZW50LgorICAgICAgICAgIElmIG5vbmUgb2YgdGhlIHJ1bGVzIG1hdGNoIHRoZSBtZXNzYWdlIG5ldmVyIGxlYXZlcyB0aGUgYnVzLiAgVGhpcworICAgICAgICAgIGlzIGFuIGVmZmVjdGl2ZSB3YXkgdG8gY29udHJvbCB0cmFmZmljIG92ZXIgdGhlIGJ1cyBhbmQgdG8gbWFrZSBzdXJlCisgICAgICAgICAgb25seSByZWxldmFudCBtZXNzYWdlIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBjbGllbnQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWF0Y2ggcnVsZXMgYXJlIGFkZGVkIHVzaW5nIHRoZSBBZGRNYXRjaCBidXMgbWV0aG9kIAorICAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWFkZC1tYXRjaCIvPikuICBSdWxlcyBhcmUKKyAgICAgICAgICBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIGtleS92YWx1ZSBwYWlycy4gCisgICAgICAgICAgRXhjbHVkaW5nIGEga2V5IGZyb20gdGhlIHJ1bGUgaW5kaWNhdGVzIGEgd2lsZGNhcmQgbWF0Y2guICAKKyAgICAgICAgICBGb3IgaW5zdGFuY2UgZXhjbHVkaW5nIHRoZSB0aGUgbWVtYmVyIGZyb20gYSBtYXRjaCBydWxlIGJ1dCAKKyAgICAgICAgICBhZGRpbmcgYSBzZW5kZXIgd291bGQgbGV0IGFsbCBtZXNzYWdlcyBmcm9tIHRoYXQgc2VuZGVyIHRocm91Z2guCisgICAgICAgICAgQW4gZXhhbXBsZSBvZiBhIGNvbXBsZXRlIHJ1bGUgd291bGQgYmUgCisgICAgICAgICAgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLHBhdGg9Jy9iYXIvZm9vJyxkZXN0aW5hdGlvbj0nOjQ1MjM0NS4zNCcsYXJnMj0nYmFyJyIKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUga2V5cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSAKKyAgICAgICAgICBhIG1hdGNoIHJ1bGU6CisgICAgICAgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBELUJ1cyB0eXBlcy4KKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PktleTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UG9zc2libGUgVmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnR5cGU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4nc2lnbmFsJywgJ21ldGhvZF9jYWxsJywgJ21ldGhvZF9yZXR1cm4nLCAnZXJyb3InPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaCBvbiB0aGUgbWVzc2FnZSB0eXBlLiAgQW4gZXhhbXBsZSBvZiBhIHR5cGUgbWF0Y2ggaXMgdHlwZT0nc2lnbmFsJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5zZW5kZXI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BIGJ1cyBvciB1bmlxdWUgbmFtZSAoc2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tYnVzLW5hbWUiLz4KKyAgICAgICAgICAgICAgICAgIGFuZCA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXVuaXF1ZS1uYW1lIi8+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggbWVzc2FnZXMgc2VudCBieSBhIHBhcnRpY3VsYXIgc2VuZGVyLiAgQW4gZXhhbXBsZSBvZiBhIHNlbmRlciBtYXRjaAorICAgICAgICAgICAgICAgICAgaXMgc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuSGFsJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5pbnRlcmZhY2U8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBpbnRlcmZhY2UgbmFtZSAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIi8+KTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggbWVzc2FnZXMgc2VudCBvdmVyIG9yIHRvIGEgcGFydGljdWxhciBpbnRlcmZhY2UuICBBbiBleGFtcGxlIG9mIGFuCisgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgbWF0Y2ggaXMgaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuSGFsLk1hbmFnZXInLgorICAgICAgICAgICAgICAgICAgSWYgYSBtZXNzYWdlIG9taXRzIHRoZSBpbnRlcmZhY2UgaGVhZGVyLCBpdCBtdXN0IG5vdCBtYXRjaCBhbnkgcnVsZSAKKyAgICAgICAgICAgICAgICAgIHRoYXQgc3BlY2lmaWVzIHRoaXMga2V5LjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5tZW1iZXI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbnkgdmFsaWQgbWV0aG9kIG9yIHNpZ25hbCBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGhhdmUgdGhlIGdpdmUgbWV0aG9kIG9yIHNpZ25hbCBuYW1lLiBBbiBleGFtcGxlIG9mCisgICAgICAgICAgICAgICAgICBhIG1lbWJlciBtYXRjaCBpcyBtZW1iZXI9J05hbWVPd25lckNoYW5nZWQnPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnBhdGg8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBvYmplY3QgcGF0aCAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCIvPik8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoZXMgbWVzc2FnZXMgd2hpY2ggYXJlIHNlbnQgZnJvbSBvciB0byB0aGUgZ2l2ZW4gb2JqZWN0LiBBbiBleGFtcGxlIG9mIGEKKyAgICAgICAgICAgICAgICAgIHBhdGggbWF0Y2ggaXMgcGF0aD0nL29yZy9mcmVlZGVza3RvcC9IYWwvTWFuYWdlcic8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+ZGVzdGluYXRpb248L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BIHVuaXF1ZSBuYW1lIChzZWUgPHhyZWYgbGlua2VuZD0idGVybS11bmlxdWUtbmFtZSIvPik8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoZXMgbWVzc2FnZXMgd2hpY2ggYXJlIGJlaW5nIHNlbnQgdG8gdGhlIGdpdmVuIHVuaXF1ZSBuYW1lLiBBbgorICAgICAgICAgICAgICAgICAgZXhhbXBsZSBvZiBhIGRlc3RpbmF0aW9uIG1hdGNoIGlzIGRlc3RpbmF0aW9uPSc6MS4wJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5hcmdbMCwgMSwgMiwgMywgLi4uXTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFueSBzdHJpbmc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZyBtYXRjaGVzIGFyZSBzcGVjaWFsIGFuZCBhcmUgdXNlZCBmb3IgZnVydGhlciByZXN0cmljdGluZyB0aGUgCisgICAgICAgICAgICAgICAgICBtYXRjaCBiYXNlZCBvbiB0aGUgYXJndW1lbnRzIGluIHRoZSBib2R5IG9mIGEgbWVzc2FnZS4gIEFzIG9mIHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgb25seSBzdHJpbmcgYXJndW1lbnRzIGNhbiBiZSBtYXRjaGVkLiAgQW4gZXhhbXBsZSBvZiBhbiBhcmd1bWVudCBtYXRjaCAKKyAgICAgICAgICAgICAgICAgIHdvdWxkIGJlIGFyZzM9J0ZvbycuIE9ubHkgYXJndW1lbnQgaW5kZXhlcyBmcm9tIDAgdG8gNjMgc2hvdWxkIGJlIAorICAgICAgICAgICAgICAgICAgYWNjZXB0ZWQuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmFyZ1swLCAxLCAyLCAzLCAuLi5dcGF0aDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFueSBzdHJpbmc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50IHBhdGggbWF0Y2hlcyBwcm92aWRlIGEgc3BlY2lhbGlzZWQgZm9ybSBvZiB3aWxkY2FyZAorICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcgZm9yIHBhdGgtbGlrZSBuYW1lc3BhY2VzLiBBcyB3aXRoIG5vcm1hbCBhcmd1bWVudCBtYXRjaGVzLAorICAgICAgICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHN0cmluZyBnaXZlbiBpbiB0aGUgbWF0Y2gKKyAgICAgICAgICAgICAgICAgIHJ1bGUgdGhlbiB0aGUgcnVsZSBpcyBzYXRpc2ZpZWQuIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYWxzbyBhCisgICAgICAgICAgICAgICAgICBtYXRjaCB3aGVuIGVpdGhlciB0aGUgc3RyaW5nIGdpdmVuIGluIHRoZSBtYXRjaCBydWxlIG9yIHRoZQorICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgbWVzc2FnZSBhcmd1bWVudCBlbmRzIHdpdGggJy8nIGFuZCBpcyBhIHByZWZpeCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgIG90aGVyLiBBbiBleGFtcGxlIGFyZ3VtZW50IHBhdGggbWF0Y2ggaXMgYXJnMHBhdGg9Jy9hYS9iYi8nLiBUaGlzCisgICAgICAgICAgICAgICAgICB3b3VsZCBtYXRjaCBtZXNzYWdlcyB3aXRoIGZpcnN0IGFyZ3VtZW50cyBvZiAnLycsICcvYWEvJywKKyAgICAgICAgICAgICAgICAgICcvYWEvYmIvJywgJy9hYS9iYi9jYy8nIGFuZCAnL2FhL2JiL2NjJy4gSXQgd291bGQgbm90IG1hdGNoCisgICAgICAgICAgICAgICAgICBtZXNzYWdlcyB3aXRoIGZpcnN0IGFyZ3VtZW50cyBvZiAnL2FhL2InLCAnL2FhJyBvciBldmVuICcvYWEvYmInLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBTdGFydGluZyBTZXJ2aWNlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgYnVzIGNhbiBzdGFydCBhcHBsaWNhdGlvbnMgb24gYmVoYWxmIG9mIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgSW4gQ09SQkEgdGVybXMsIHRoaXMgd291bGQgYmUgY2FsbGVkIDxmaXJzdHRlcm0+YWN0aXZhdGlvbjwvZmlyc3R0ZXJtPi4KKyAgICAgICAgQW4gYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgc3RhcnRlZCBpbiB0aGlzIHdheSBpcyBjYWxsZWQgYQorICAgICAgICA8Zmlyc3R0ZXJtPnNlcnZpY2U8L2ZpcnN0dGVybT4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgV2l0aCBELUJ1cywgc3RhcnRpbmcgYSBzZXJ2aWNlIGlzIG5vcm1hbGx5IGRvbmUgYnkgbmFtZS4gVGhhdCBpcywKKyAgICAgICAgYXBwbGljYXRpb25zIGFzayB0aGUgbWVzc2FnZSBidXMgdG8gc3RhcnQgc29tZSBwcm9ncmFtIHRoYXQgd2lsbCBvd24gYQorICAgICAgICB3ZWxsLWtub3duIG5hbWUsIHN1Y2ggYXMgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLlRleHRFZGl0b3I8L2xpdGVyYWw+LgorICAgICAgICBUaGlzIGltcGxpZXMgYSBjb250cmFjdCBkb2N1bWVudGVkIGFsb25nIHdpdGggdGhlIG5hbWUgCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yPC9saXRlcmFsPiBmb3Igd2hpY2ggb2JqZWN0cyAKKyAgICAgICAgdGhlIG93bmVyIG9mIHRoYXQgbmFtZSB3aWxsIHByb3ZpZGUsIGFuZCB3aGF0IGludGVyZmFjZXMgdGhvc2UgCisgICAgICAgIG9iamVjdHMgd2lsbCBoYXZlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRvIGZpbmQgYW4gZXhlY3V0YWJsZSBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBuYW1lLCB0aGUgYnVzIGRhZW1vbgorICAgICAgICBsb29rcyBmb3IgPGZpcnN0dGVybT5zZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzPC9maXJzdHRlcm0+LiAgU2VydmljZQorICAgICAgICBkZXNjcmlwdGlvbiBmaWxlcyBkZWZpbmUgYSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gZXhlY3V0YWJsZXMuIERpZmZlcmVudAorICAgICAgICBraW5kcyBvZiBtZXNzYWdlIGJ1cyB3aWxsIGxvb2sgZm9yIHRoZXNlIGZpbGVzIGluIGRpZmZlcmVudCBwbGFjZXMsIHNlZQorICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cy10eXBlcyIvPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBTZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzIGhhdmUgdGhlICIuc2VydmljZSIgZmlsZQorICAgICAgICBleHRlbnNpb24uIFRoZSBtZXNzYWdlIGJ1cyB3aWxsIG9ubHkgbG9hZCBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzCisgICAgICAgIGVuZGluZyB3aXRoIC5zZXJ2aWNlOyBhbGwgb3RoZXIgZmlsZXMgd2lsbCBiZSBpZ25vcmVkLiAgVGhlIGZpbGUgZm9ybWF0CisgICAgICAgIGlzIHNpbWlsYXIgdG8gdGhhdCBvZiA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9kZXNrdG9wLWVudHJ5LXNwZWMvZGVza3RvcC1lbnRyeS1zcGVjLWxhdGVzdC5odG1sIj5kZXNrdG9wCisgICAgICAgIGVudHJpZXM8L3VsaW5rPi4gQWxsIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZXMgbXVzdCBiZSBpbiBVVEYtOAorICAgICAgICBlbmNvZGluZy4gVG8gZW5zdXJlIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBuYW1lIGNvbGxpc2lvbnMsIHNlcnZpY2UgZmlsZXMKKyAgICAgICAgbXVzdCBiZSBuYW1lc3BhY2VkIHVzaW5nIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyBtZXNzYWdlcyBhbmQgc2VydmljZQorICAgICAgICBuYW1lcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFtGSVhNRSB0aGUgZmlsZSBmb3JtYXQgc2hvdWxkIGJlIG11Y2ggYmV0dGVyIHNwZWNpZmllZCB0aGFuICJzaW1pbGFyIHRvCisgICAgICAgIC5kZXNrdG9wIGVudHJpZXMiIGVzcC4gc2luY2UgZGVza3RvcCBlbnRyaWVzIGFyZSBhbHJlYWR5CisgICAgICAgIGJhZGx5LXNwZWNpZmllZC4gOy0pXQorICAgICAgICBUaGVzZSBzZWN0aW9ucyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGFwcGx5IHRvIHNlcnZpY2UgZmlsZXMgYXMgd2VsbDoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5HZW5lcmFsIHN5bnRheDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5Db21tZW50IGZvcm1hdDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICA8ZmlndXJlPgorCSAgPHRpdGxlPkV4YW1wbGUgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlPC90aXRsZT4KKwkgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICMgU2FtcGxlIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZQorICAgICAgICAgICAgW0QtQlVTIFNlcnZpY2VdCisgICAgICAgICAgICBOYW1lcz1vcmcuZnJlZWRlc2t0b3AuQ29uZmlndXJhdGlvbkRhdGFiYXNlO29yZy5nbm9tZS5HQ29uZjsKKyAgICAgICAgICAgIEV4ZWM9L3Vzci9saWJleGVjL2djb25mZC0yCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKwk8L2ZpZ3VyZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIGFuIGFwcGxpY2F0aW9uIGFza3MgdG8gc3RhcnQgYSBzZXJ2aWNlIGJ5IG5hbWUsIHRoZSBidXMgZGFlbW9uIHRyaWVzIHRvCisgICAgICAgIGZpbmQgYSBzZXJ2aWNlIHRoYXQgd2lsbCBvd24gdGhhdCBuYW1lLiBJdCB0aGVuIHRyaWVzIHRvIHNwYXduIHRoZQorICAgICAgICBleGVjdXRhYmxlIGFzc29jaWF0ZWQgd2l0aCBpdC4gSWYgdGhpcyBmYWlscywgaXQgd2lsbCByZXBvcnQgYW4KKyAgICAgICAgZXJyb3IuIFtGSVhNRSB3aGF0IGhhcHBlbnMgaWYgdHdvIC5zZXJ2aWNlIGZpbGVzIG9mZmVyIHRoZSBzYW1lIHNlcnZpY2U7CisgICAgICAgIHdoYXQga2luZCBvZiBlcnJvciBpcyByZXBvcnRlZCwgc2hvdWxkIHdlIGhhdmUgYSB3YXkgZm9yIHRoZSBjbGllbnQgdG8KKyAgICAgICAgY2hvb3NlIG9uZT9dCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGV4ZWN1dGFibGUgbGF1bmNoZWQgd2lsbCBoYXZlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICA8bGl0ZXJhbD5EQlVTX1NUQVJURVJfQUREUkVTUzwvbGl0ZXJhbD4gc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgICAgICBtZXNzYWdlIGJ1cyBzbyBpdCBjYW4gY29ubmVjdCBhbmQgcmVxdWVzdCB0aGUgYXBwcm9wcmlhdGUgbmFtZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGV4ZWN1dGFibGUgYmVpbmcgbGF1bmNoZWQgbWF5IHdhbnQgdG8ga25vdyB3aGV0aGVyIHRoZSBtZXNzYWdlIGJ1cworICAgICAgICBzdGFydGluZyBpdCBpcyBvbmUgb2YgdGhlIHdlbGwta25vd24gbWVzc2FnZSBidXNlcyAoc2VlIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXR5cGVzIi8+KS4gVG8gZmFjaWxpdGF0ZSB0aGlzLCB0aGUgYnVzIG11c3QgYWxzbyBzZXQKKyAgICAgICAgdGhlIDxsaXRlcmFsPkRCVVNfU1RBUlRFUl9CVVNfVFlQRTwvbGl0ZXJhbD4gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgb25lCisgICAgICAgIG9mIHRoZSB3ZWxsLWtub3duIGJ1c2VzLiBUaGUgY3VycmVudGx5LWRlZmluZWQgdmFsdWVzIGZvciB0aGlzIHZhcmlhYmxlCisgICAgICAgIGFyZSA8bGl0ZXJhbD5zeXN0ZW08L2xpdGVyYWw+IGZvciB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cywKKyAgICAgICAgYW5kIDxsaXRlcmFsPnNlc3Npb248L2xpdGVyYWw+IGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24gbWVzc2FnZQorICAgICAgICBidXMuIFRoZSBuZXcgZXhlY3V0YWJsZSBtdXN0IHN0aWxsIGNvbm5lY3QgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4KKyAgICAgICAgaW4gPGxpdGVyYWw+REJVU19TVEFSVEVSX0FERFJFU1M8L2xpdGVyYWw+LCBidXQgbWF5IGFzc3VtZSB0aGF0IHRoZQorICAgICAgICByZXN1bHRpbmcgY29ubmVjdGlvbiBpcyB0byB0aGUgd2VsbC1rbm93biBidXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgW0ZJWE1FIHRoZXJlIHNob3VsZCBiZSBhIHRpbWVvdXQgc29tZXdoZXJlLCBlaXRoZXIgc3BlY2lmaWVkCisgICAgICAgIGluIHRoZSAuc2VydmljZSBmaWxlLCBieSB0aGUgY2xpZW50LCBvciBqdXN0IGEgZ2xvYmFsIHZhbHVlCisgICAgICAgIGFuZCBpZiB0aGUgY2xpZW50IGJlaW5nIGFjdGl2YXRlZCBmYWlscyB0byBjb25uZWN0IHdpdGhpbiB0aGF0CisgICAgICAgIHRpbWVvdXQsIGFuIGVycm9yIHNob3VsZCBiZSBzZW50IGJhY2suXQorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzLXNjb3BlIj4KKyAgICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIFNlcnZpY2UgU2NvcGU8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgInNjb3BlIiBvZiBhIHNlcnZpY2UgaXMgaXRzICJwZXItIiwgc3VjaCBhcyBwZXItc2Vzc2lvbiwKKyAgICAgICAgICBwZXItbWFjaGluZSwgcGVyLWhvbWUtZGlyZWN0b3J5LCBvciBwZXItZGlzcGxheS4gVGhlIHJlZmVyZW5jZQorICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgeWV0IHN1cHBvcnQgc3RhcnRpbmcgc2VydmljZXMgaW4gYSBkaWZmZXJlbnQKKyAgICAgICAgICBzY29wZSBmcm9tIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYuIFNvIGUuZy4gaWYgeW91IHN0YXJ0IGEgc2VydmljZQorICAgICAgICAgIG9uIHRoZSBzZXNzaW9uIGJ1cyBpdHMgc2NvcGUgaXMgcGVyLXNlc3Npb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgV2UgY291bGQgYWRkIGFuIG9wdGlvbmFsIHNjb3BlIHRvIGEgYnVzIG5hbWUuIEZvciBleGFtcGxlLCBmb3IKKyAgICAgICAgICBwZXItKGRpc3BsYXksc2Vzc2lvbiBwYWlyKSwgd2UgY291bGQgaGF2ZSBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBkaXNwbGF5CisgICAgICAgICAgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgbG9naW4gYW5kIHNldCBvbiBzY3JlZW4gMCBieSBleGVjdXRpbmcgYQorICAgICAgICAgIHNwZWNpYWwgInNldCBkaXNwbGF5IElEIiBiaW5hcnkuIFRoZSBJRCB3b3VsZCBiZSBzdG9yZWQgaW4gYQorICAgICAgICAgIDxsaXRlcmFsPl9EQlVTX0RJU1BMQVlfSUQ8L2xpdGVyYWw+IHByb3BlcnR5IGFuZCB3b3VsZCBiZSBhIHN0cmluZyBvZgorICAgICAgICAgIHJhbmRvbSBieXRlcy4gVGhpcyBJRCB3b3VsZCB0aGVuIGJlIHVzZWQgdG8gc2NvcGUgbmFtZXMuCisgICAgICAgICAgU3RhcnRpbmcvbG9jYXRpbmcgYSBzZXJ2aWNlIGNvdWxkIGJlIGRvbmUgYnkgSUQtbmFtZSBwYWlyIHJhdGhlciB0aGFuCisgICAgICAgICAgb25seSBieSBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvbnRyYXN0IHRoaXMgd2l0aCBhIHBlci1kaXNwbGF5IHNjb3BlLiBUbyBhY2hpZXZlIHRoYXQsIHdlIHdvdWxkIAorICAgICAgICAgIHdhbnQgYSBzaW5nbGUgYnVzIHNwYW5uaW5nIGFsbCBzZXNzaW9ucyB1c2luZyBhIGdpdmVuIGRpc3BsYXkuCisgICAgICAgICAgU28gd2UgbWlnaHQgc2V0IGEgPGxpdGVyYWw+X0RCVVNfRElTUExBWV9CVVNfQUREUkVTUzwvbGl0ZXJhbD4gCisgICAgICAgICAgcHJvcGVydHkgb24gc2NyZWVuIDAgb2YgdGhlIGRpc3BsYXksIHBvaW50aW5nIHRvIHRoaXMgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXR5cGVzIj4KKyAgICAgIDx0aXRsZT5XZWxsLWtub3duIE1lc3NhZ2UgQnVzIEluc3RhbmNlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVHdvIHN0YW5kYXJkIG1lc3NhZ2UgYnVzIGluc3RhbmNlcyBhcmUgZGVmaW5lZCBoZXJlLCBhbG9uZyB3aXRoIGhvdyAKKyAgICAgICAgdG8gbG9jYXRlIHRoZW0gYW5kIHdoZXJlIHRoZWlyIHNlcnZpY2UgZmlsZXMgbGl2ZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtdHlwZXMtbG9naW4iPgorICAgICAgICA8dGl0bGU+TG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1czwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggdGltZSBhIHVzZXIgbG9ncyBpbiwgYSA8Zmlyc3R0ZXJtPmxvZ2luIHNlc3Npb24gbWVzc2FnZQorICAgICAgICAgICAgYnVzPC9maXJzdHRlcm0+IG1heSBiZSBzdGFydGVkLiBBbGwgYXBwbGljYXRpb25zIGluIHRoZSB1c2VyJ3MgbG9naW4KKyAgICAgICAgICBzZXNzaW9uIG1heSBpbnRlcmFjdCB3aXRoIG9uZSBhbm90aGVyIHVzaW5nIHRoaXMgbWVzc2FnZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGxvZ2luIHNlc3Npb24gbWVzc2FnZSBidXMgaXMgZ2l2ZW4gCisgICAgICAgICAgaW4gdGhlIDxsaXRlcmFsPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvbGl0ZXJhbD4gZW52aXJvbm1lbnQgCisgICAgICAgICAgdmFyaWFibGUuIElmIHRoYXQgdmFyaWFibGUgaXMgbm90IHNldCwgYXBwbGljYXRpb25zIG1heSAKKyAgICAgICAgICBhbHNvIHRyeSB0byByZWFkIHRoZSBhZGRyZXNzIGZyb20gdGhlIFggV2luZG93IFN5c3RlbSByb290IAorICAgICAgICAgIHdpbmRvdyBwcm9wZXJ0eSA8bGl0ZXJhbD5fREJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9saXRlcmFsPi4KKyAgICAgICAgICBUaGUgcm9vdCB3aW5kb3cgcHJvcGVydHkgbXVzdCBoYXZlIHR5cGUgPGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPi4KKyAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2hvdWxkIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoZSAKKyAgICAgICAgICByb290IHdpbmRvdyBwcm9wZXJ0eS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT5UaGUgYWRkcmVzcyBvZiB0aGUgbG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1cyBpcyBnaXZlbiBpbiB0aGUKKyAgICAgICAgPGxpdGVyYWw+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+CisgICAgICAgICAgPHRpdGxlPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBbRklYTUUgc3BlY2lmeSBsb2NhdGlvbiBvZiAuc2VydmljZSBmaWxlcywgcHJvYmFibHkgdXNpbmcKKyAgICAgICAgICAgIERFU0tUT1BfRElSUyBldGMuIGZyb20gYmFzZWRpciBzcGVjaWZpY2F0aW9uLCB0aG91Z2ggbG9naW4gc2Vzc2lvbgorICAgICAgICAgICAgYnVzIGlzIG5vdCByZWFsbHkgZGVza3RvcC1zcGVjaWZpY10KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdDQ+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy10eXBlcy1zeXN0ZW0iPgorICAgICAgICA8dGl0bGU+U3lzdGVtIG1lc3NhZ2UgYnVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBjb21wdXRlciBtYXkgaGF2ZSBhIDxmaXJzdHRlcm0+c3lzdGVtIG1lc3NhZ2UgYnVzPC9maXJzdHRlcm0+LAorICAgICAgICAgIGFjY2Vzc2libGUgdG8gYWxsIGFwcGxpY2F0aW9ucyBvbiB0aGUgc3lzdGVtLiBUaGlzIG1lc3NhZ2UgYnVzIG1heSBiZQorICAgICAgICAgIHVzZWQgdG8gYnJvYWRjYXN0IHN5c3RlbSBldmVudHMsIHN1Y2ggYXMgYWRkaW5nIG5ldyBoYXJkd2FyZSBkZXZpY2VzLCAKKyAgICAgICAgICBjaGFuZ2VzIGluIHRoZSBwcmludGVyIHF1ZXVlLCBhbmQgc28gZm9ydGguCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cyBpcyBnaXZlbiAKKyAgICAgICAgICBpbiB0aGUgPGxpdGVyYWw+REJVU19TWVNURU1fQlVTX0FERFJFU1M8L2xpdGVyYWw+IGVudmlyb25tZW50IAorICAgICAgICAgIHZhcmlhYmxlLiBJZiB0aGF0IHZhcmlhYmxlIGlzIG5vdCBzZXQsIGFwcGxpY2F0aW9ucyBzaG91bGQgdHJ5IAorICAgICAgICAgIHRvIGNvbm5lY3QgdG8gdGhlIHdlbGwta25vd24gYWRkcmVzcworICAgICAgICAgIDxsaXRlcmFsPnVuaXg6cGF0aD0vdmFyL3J1bi9kYnVzL3N5c3RlbV9idXNfc29ja2V0PC9saXRlcmFsPi4KKyAgICAgICAgICA8Zm9vdG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIEQtQnVzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBob25vcnMgdGhlIAorICAgICAgICAgICAgICA8bGl0ZXJhbD4kKGxvY2Fsc3RhdGVkaXIpPC9saXRlcmFsPiBjb25maWd1cmUgb3B0aW9uIAorICAgICAgICAgICAgICBmb3IgdGhpcyBhZGRyZXNzLCBvbiBib3RoIGNsaWVudCBhbmQgc2VydmVyIHNpZGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9mb290bm90ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBbRklYTUUgc3BlY2lmeSBsb2NhdGlvbiBvZiBzeXN0ZW0gYnVzIC5zZXJ2aWNlIGZpbGVzXQorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLW1lc3NhZ2VzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBNZXNzYWdlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHNwZWNpYWwgbWVzc2FnZSBidXMgbmFtZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4KKyAgICAgICAgcmVzcG9uZHMgdG8gYSBudW1iZXIgb2YgYWRkaXRpb25hbCBtZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtaGVsbG8iPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG88L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgU1RSSU5HIEhlbGxvICgpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBjb25uZWN0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBCZWZvcmUgYW4gYXBwbGljYXRpb24gaXMgYWJsZSB0byBzZW5kIG1lc3NhZ2VzIHRvIG90aGVyIGFwcGxpY2F0aW9ucworICAgICAgICAgIGl0IG11c3Qgc2VuZCB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG88L2xpdGVyYWw+IG1lc3NhZ2UKKyAgICAgICAgICB0byB0aGUgbWVzc2FnZSBidXMgdG8gb2J0YWluIGEgdW5pcXVlIG5hbWUuIElmIGFuIGFwcGxpY2F0aW9uIHdpdGhvdXQKKyAgICAgICAgICBhIHVuaXF1ZSBuYW1lIHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGFub3RoZXIgYXBwbGljYXRpb24sIG9yIGEKKyAgICAgICAgICBtZXNzYWdlIHRvIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYgdGhhdCBpc24ndCB0aGUKKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbzwvbGl0ZXJhbD4gbWVzc2FnZSwgaXQgd2lsbCBiZQorICAgICAgICAgIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyAiZGlzY29ubmVjdCIgcmVxdWVzdDsgaWYgYSBjbGllbnQgd2lzaGVzIHRvCisgICAgICAgICAgZGlzY29ubmVjdCBmcm9tIHRoZSBidXMsIGl0IHNpbXBseSBjbG9zZXMgdGhlIHNvY2tldCAob3Igb3RoZXIgCisgICAgICAgICAgY29tbXVuaWNhdGlvbiBjaGFubmVsKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWxpc3QtbmFtZXMiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEFSUkFZIG9mIFNUUklORyBMaXN0TmFtZXMgKCkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFSUkFZIG9mIFNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJyYXkgb2Ygc3RyaW5ncyB3aGVyZSBlYWNoIHN0cmluZyBpcyBhIGJ1cyBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY3VycmVudGx5LW93bmVkIG5hbWVzIG9uIHRoZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1saXN0LWFjdGl2YXRhYmxlLW5hbWVzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3RBY3RpdmF0YWJsZU5hbWVzPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEFSUkFZIG9mIFNUUklORyBMaXN0QWN0aXZhdGFibGVOYW1lcyAoKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QVJSQVkgb2YgU1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BcnJheSBvZiBzdHJpbmdzIHdoZXJlIGVhY2ggc3RyaW5nIGlzIGEgYnVzIG5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIGFsbCBuYW1lcyB0aGF0IGNhbiBiZSBhY3RpdmF0ZWQgb24gdGhlIGJ1cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLW5hbWUtZXhpc3RzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVIYXNPd25lcjwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBCT09MRUFOIE5hbWVIYXNPd25lciAoaW4gU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB0byBjaGVjazwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+Qk9PTEVBTjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlLCB0cnVlIGlmIHRoZSBuYW1lIGV4aXN0czwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBleGlzdHMgKGN1cnJlbnRseSBoYXMgYW4gb3duZXIpLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1uYW1lLW93bmVyLWNoYW5nZWQiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZU93bmVyQ2hhbmdlZDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIGlzIGEgc2lnbmFsOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIE5hbWVPd25lckNoYW5nZWQgKFNUUklORyBuYW1lLCBTVFJJTkcgb2xkX293bmVyLCBTVFJJTkcgbmV3X293bmVyKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgd2l0aCBhIG5ldyBvd25lcjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisJICAgICAgICA8cm93PgorCQkgIDxlbnRyeT4xPC9lbnRyeT4KKwkJICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKwkJICA8ZW50cnk+T2xkIG93bmVyIG9yIGVtcHR5IHN0cmluZyBpZiBub25lPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+MjwvZW50cnk+CisJCSAgPGVudHJ5PlNUUklORzwvZW50cnk+CisJCSAgPGVudHJ5Pk5ldyBvd25lciBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZTwvZW50cnk+CisJICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIHNpZ25hbCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3duZXIgb2YgYSBuYW1lIGhhcyBjaGFuZ2VkLgorICAgICAgICAgIEl0J3MgYWxzbyB0aGUgc2lnbmFsIHRvIHVzZSB0byBkZXRlY3QgdGhlIGFwcGVhcmFuY2Ugb2YgCisgICAgICAgICAgbmV3IG5hbWVzIG9uIHRoZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1uYW1lLWxvc3QiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUxvc3Q8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBhIHNpZ25hbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBOYW1lTG9zdCAoU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB3aGljaCB3YXMgbG9zdDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBzaWduYWwgaXMgc2VudCB0byBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoZW4gaXQgbG9zZXMKKyAgICAgICAgICBvd25lcnNoaXAgb2YgYSBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1uYW1lLWFjcXVpcmVkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVBY3F1aXJlZDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIGlzIGEgc2lnbmFsOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIE5hbWVBY3F1aXJlZCAoU1RSSU5HIG5hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TmFtZSB3aGljaCB3YXMgYWNxdWlyZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgc2lnbmFsIGlzIHNlbnQgdG8gYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGVuIGl0IGdhaW5zCisgICAgICAgICAgb3duZXJzaGlwIG9mIGEgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtc3RhcnQtc2VydmljZS1ieS1uYW1lIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlN0YXJ0U2VydmljZUJ5TmFtZTwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBVSU5UMzIgU3RhcnRTZXJ2aWNlQnlOYW1lIChpbiBTVFJJTkcgbmFtZSwgaW4gVUlOVDMyIGZsYWdzKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gc3RhcnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorCSAgICAgICAgPHJvdz4KKwkJICA8ZW50cnk+MTwvZW50cnk+CisJCSAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisJCSAgPGVudHJ5PkZsYWdzIChjdXJyZW50bHkgbm90IHVzZWQpPC9lbnRyeT4KKwkgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgVHJpZXMgdG8gbGF1bmNoIHRoZSBleGVjdXRhYmxlIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXMiLz4uCisKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5JZGVudGlmaWVyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisJICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUzwvZW50cnk+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+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1hZGQtbWF0Y2giPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuQWRkTWF0Y2g8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQWRkTWF0Y2ggKGluIFNUUklORyBydWxlKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoIHJ1bGUgdG8gYWRkIHRvIHRoZSBjb25uZWN0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgQWRkcyBhIG1hdGNoIHJ1bGUgdG8gbWF0Y2ggbWVzc2FnZXMgZ29pbmcgdGhyb3VnaCB0aGUgbWVzc2FnZSBidXMgKHNlZSA8eHJlZiBsaW5rZW5kPSdtZXNzYWdlLWJ1cy1yb3V0aW5nLW1hdGNoLXJ1bGVzJy8+KS4gCisJSWYgdGhlIGJ1cyBkb2VzIG5vdCBoYXZlIGVub3VnaCByZXNvdXJjZXMgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk9PTTwvbGl0ZXJhbD4KKwllcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtcmVtb3ZlLW1hdGNoIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlJlbW92ZU1hdGNoPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFJlbW92ZU1hdGNoIChpbiBTVFJJTkcgcnVsZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaCBydWxlIHRvIHJlbW92ZSBmcm9tIHRoZSBjb25uZWN0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmVtb3ZlcyB0aGUgZmlyc3QgcnVsZSB0aGF0IG1hdGNoZXMgKHNlZSA8eHJlZiBsaW5rZW5kPSdtZXNzYWdlLWJ1cy1yb3V0aW5nLW1hdGNoLXJ1bGVzJy8+KS4gCisJSWYgdGhlIHJ1bGUgaXMgbm90IGZvdW5kIHRoZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVOb3RGb3VuZDwvbGl0ZXJhbD4KKwllcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1nZXQtaWQiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQ8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgR2V0SWQgKG91dCBTVFJJTkcgaWQpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgYnVzIGRhZW1vbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBHZXRzIHRoZSB1bmlxdWUgSUQgb2YgdGhlIGJ1cy4gVGhlIHVuaXF1ZSBJRCBoZXJlIGlzIHNoYXJlZCBhbW9uZyBhbGwgYWRkcmVzc2VzIHRoZSAKKyAgICAgICAgYnVzIGRhZW1vbiBpcyBsaXN0ZW5pbmcgb24gKFRDUCwgVU5JWCBkb21haW4gc29ja2V0LCBldGMuKSBhbmQgaXRzIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gCisgICAgICAgIDx4cmVmIGxpbmtlbmQ9InV1aWRzIi8+LiBFYWNoIGFkZHJlc3MgdGhlIGJ1cyBpcyBsaXN0ZW5pbmcgb24gYWxzbyBoYXMgaXRzIG93biB1bmlxdWUgCisgICAgICAgIElELCBhcyBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0iYWRkcmVzc2VzIi8+LiBUaGUgcGVyLWJ1cyBhbmQgcGVyLWFkZHJlc3MgSURzIGFyZSBub3QgcmVsYXRlZC4KKyAgICAgICAgVGhlcmUgaXMgYWxzbyBhIHBlci1tYWNoaW5lIElELCBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wZWVyIi8+IGFuZCByZXR1cm5lZAorICAgICAgICBieSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCgpLgorICAgICAgICBGb3IgYSBkZXNrdG9wIHNlc3Npb24gYnVzLCB0aGUgYnVzIElEIGNhbiBiZSB1c2VkIGFzIGEgd2F5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgdXNlcidzIHNlc3Npb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICA8L3NlY3QyPgorCisgIDwvc2VjdDE+Cis8IS0tCisgIDxhcHBlbmRpeCBpZD0iaW1wbGVtZW50YXRpb24tbm90ZXMiPgorICAgIDx0aXRsZT5JbXBsZW1lbnRhdGlvbiBub3RlczwvdGl0bGU+CisgICAgPHNlY3QxIGlkPSJpbXBsZW1lbnRhdGlvbi1ub3Rlcy1zdWJzZWN0aW9uIj4KKyAgICAgIDx0aXRsZT48L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0MT4KKyAgPC9hcHBlbmRpeD4KKy0tPgorCisgIDxnbG9zc2FyeT48dGl0bGU+R2xvc3Nhcnk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhpcyBnbG9zc2FyeSBkZWZpbmVzIHNvbWUgb2YgdGhlIHRlcm1zIHVzZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uLgorICAgIDwvcGFyYT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLWJ1cy1uYW1lIj48Z2xvc3N0ZXJtPkJ1cyBOYW1lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBtYWludGFpbnMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBuYW1lcyBhbmQKKyAgICAgICAgICBjb25uZWN0aW9ucy4gKE5vcm1hbGx5LCB0aGVyZSdzIG9uZSBjb25uZWN0aW9uIHBlciBhcHBsaWNhdGlvbi4pICBBCisgICAgICAgICAgYnVzIG5hbWUgaXMgc2ltcGx5IGFuIGlkZW50aWZpZXIgdXNlZCB0byBsb2NhdGUgY29ubmVjdGlvbnMuIEZvcgorICAgICAgICAgIGV4YW1wbGUsIHRoZSBoeXBvdGhldGljYWwgPGxpdGVyYWw+Y29tLnlveW9keW5lLlNjcmVlbnNhdmVyPC9saXRlcmFsPgorICAgICAgICAgIG5hbWUgbWlnaHQgYmUgdXNlZCB0byBzZW5kIGEgbWVzc2FnZSB0byBhIHNjcmVlbnNhdmVyIGZyb20gWW95b2R5bmUKKyAgICAgICAgICBDb3Jwb3JhdGlvbi4gIEFuIGFwcGxpY2F0aW9uIGlzIHNhaWQgdG8gPGZpcnN0dGVybT5vd248L2ZpcnN0dGVybT4gYQorICAgICAgICAgIG5hbWUgaWYgdGhlIG1lc3NhZ2UgYnVzIGhhcyBhc3NvY2lhdGVkIHRoZSBhcHBsaWNhdGlvbidzIGNvbm5lY3Rpb24KKyAgICAgICAgICB3aXRoIHRoZSBuYW1lLiAgTmFtZXMgbWF5IGFsc28gaGF2ZSA8Zmlyc3R0ZXJtPnF1ZXVlZAorICAgICAgICAgIG93bmVyczwvZmlyc3R0ZXJtPiAoc2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tcXVldWVkLW93bmVyIi8+KS4KKyAgICAgICAgICAgIFRoZSBidXMgYXNzaWducyBhIHVuaXF1ZSBuYW1lIHRvIGVhY2ggY29ubmVjdGlvbiwgCisgICAgICAgICAgICBzZWUgPHhyZWYgbGlua2VuZD0idGVybS11bmlxdWUtbmFtZSIvPi4gT3RoZXIgbmFtZXMgCisgICAgICAgICAgICAgIGNhbiBiZSB0aG91Z2h0IG9mIGFzICJ3ZWxsLWtub3duIG5hbWVzIiBhbmQgYXJlIAorICAgICAgICAgICAgICB1c2VkIHRvIGZpbmQgYXBwbGljYXRpb25zIHRoYXQgb2ZmZXIgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisgICAgICAKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1tZXNzYWdlIj48Z2xvc3N0ZXJtPk1lc3NhZ2U8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBtZXNzYWdlIGlzIHRoZSBhdG9taWMgdW5pdCBvZiBjb21tdW5pY2F0aW9uIHZpYSB0aGUgRC1CdXMKKyAgICAgICAgICBwcm90b2NvbC4gSXQgY29uc2lzdHMgb2YgYSA8Zmlyc3R0ZXJtPmhlYWRlcjwvZmlyc3R0ZXJtPiBhbmQgYQorICAgICAgICAgIDxmaXJzdHRlcm0+Ym9keTwvZmlyc3R0ZXJtPjsgdGhlIGJvZHkgaXMgbWFkZSB1cCBvZgorICAgICAgICAgIDxmaXJzdHRlcm0+YXJndW1lbnRzPC9maXJzdHRlcm0+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLW1lc3NhZ2UtYnVzIj48Z2xvc3N0ZXJtPk1lc3NhZ2UgQnVzPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNwZWNpYWwgYXBwbGljYXRpb24gdGhhdCBmb3J3YXJkcyAKKyAgICAgICAgICBvciByb3V0ZXMgbWVzc2FnZXMgYmV0d2VlbiBhIGdyb3VwIG9mIGFwcGxpY2F0aW9ucworICAgICAgICAgIGNvbm5lY3RlZCB0byB0aGUgbWVzc2FnZSBidXMuIEl0IGFsc28gbWFuYWdlcyAKKyAgICAgICAgICA8Zmlyc3R0ZXJtPm5hbWVzPC9maXJzdHRlcm0+IHVzZWQgZm9yIHJvdXRpbmcKKyAgICAgICAgICBtZXNzYWdlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1uYW1lIj48Z2xvc3N0ZXJtPk5hbWU8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tYnVzLW5hbWUiLz4uICJOYW1lIiBtYXkgCisgICAgICAgICAgICBhbHNvIGJlIHVzZWQgdG8gcmVmZXIgdG8gc29tZSBvZiB0aGUgb3RoZXIgbmFtZXMKKyAgICAgICAgICAgIGluIEQtQnVzLCBzdWNoIGFzIGludGVyZmFjZSBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ibmFtZXNwYWNlIj48Z2xvc3N0ZXJtPk5hbWVzcGFjZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorCTxwYXJhPgorICAgICAgICAgIFVzZWQgdG8gcHJldmVudCBjb2xsaXNpb25zIHdoZW4gZGVmaW5pbmcgbmV3IGludGVyZmFjZXMgb3IgYnVzCisJICBuYW1lcy4gVGhlIGNvbnZlbnRpb24gdXNlZCBpcyB0aGUgc2FtZSBvbmUgSmF2YSB1c2VzIGZvciBkZWZpbmluZworCSAgY2xhc3NlczogYSByZXZlcnNlZCBkb21haW4gbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1vYmplY3QiPjxnbG9zc3Rlcm0+T2JqZWN0PC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggYXBwbGljYXRpb24gY29udGFpbnMgPGZpcnN0dGVybT5vYmplY3RzPC9maXJzdHRlcm0+LCB3aGljaCBoYXZlCisgICAgICAgICAgPGZpcnN0dGVybT5pbnRlcmZhY2VzPC9maXJzdHRlcm0+IGFuZAorICAgICAgICAgIDxmaXJzdHRlcm0+bWV0aG9kczwvZmlyc3R0ZXJtPi4gT2JqZWN0cyBhcmUgcmVmZXJyZWQgdG8gYnkgYSBuYW1lLAorICAgICAgICAgIGNhbGxlZCBhIDxmaXJzdHRlcm0+cGF0aDwvZmlyc3R0ZXJtPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ib25lLXRvLW9uZSI+PGdsb3NzdGVybT5PbmUtdG8tT25lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisJPHBhcmE+CisgICAgICAgICAgQW4gYXBwbGljYXRpb24gdGFsa2luZyBkaXJlY3RseSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLCB3aXRob3V0IGdvaW5nCisgICAgICAgICAgdGhyb3VnaCBhIG1lc3NhZ2UgYnVzLiBPbmUtdG8tb25lIGNvbm5lY3Rpb25zIG1heSBiZSAicGVlciB0byBwZWVyIiBvcgorICAgICAgICAgICJjbGllbnQgdG8gc2VydmVyLiIgVGhlIEQtQnVzIHByb3RvY29sIGhhcyBubyBjb25jZXB0IG9mIGNsaWVudAorICAgICAgICAgIHZzLiBzZXJ2ZXIgYWZ0ZXIgYSBjb25uZWN0aW9uIGhhcyBhdXRoZW50aWNhdGVkOyB0aGUgZmxvdyBvZiBtZXNzYWdlcworICAgICAgICAgIGlzIHN5bW1ldHJpY2FsIChmdWxsIGR1cGxleCkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tcGF0aCI+PGdsb3NzdGVybT5QYXRoPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9iamVjdCByZWZlcmVuY2VzIChvYmplY3QgbmFtZXMpIGluIEQtQnVzIGFyZSBvcmdhbml6ZWQgaW50byBhCisgICAgICAgICAgZmlsZXN5c3RlbS1zdHlsZSBoaWVyYXJjaHksIHNvIGVhY2ggb2JqZWN0IGlzIG5hbWVkIGJ5IGEgcGF0aC4gQXMgaW4KKyAgICAgICAgICBMREFQLCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiAiZmlsZXMiIGFuZCAiZGlyZWN0b3JpZXMiOyBhIHBhdGgKKyAgICAgICAgICBjYW4gcmVmZXIgdG8gYW4gb2JqZWN0LCB3aGlsZSBzdGlsbCBoYXZpbmcgY2hpbGQgb2JqZWN0cyBiZWxvdyBpdC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1xdWV1ZWQtb3duZXIiPjxnbG9zc3Rlcm0+UXVldWVkIE5hbWUgT3duZXI8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRWFjaCBidXMgbmFtZSBoYXMgYSBwcmltYXJ5IG93bmVyOyBtZXNzYWdlcyBzZW50IHRvIHRoZSBuYW1lIGdvIHRvIHRoZQorICAgICAgICAgIHByaW1hcnkgb3duZXIuIEhvd2V2ZXIsIGNlcnRhaW4gbmFtZXMgYWxzbyBtYWludGFpbiBhIHF1ZXVlIG9mCisgICAgICAgICAgc2Vjb25kYXJ5IG93bmVycyAid2FpdGluZyBpbiB0aGUgd2luZ3MuIiBJZiB0aGUgcHJpbWFyeSBvd25lciByZWxlYXNlcworICAgICAgICAgIHRoZSBuYW1lLCB0aGVuIHRoZSBmaXJzdCBzZWNvbmRhcnkgb3duZXIgaW4gdGhlIHF1ZXVlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICBiZWNvbWVzIHRoZSBuZXcgb3duZXIgb2YgdGhlIG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tc2VydmljZSI+PGdsb3NzdGVybT5TZXJ2aWNlPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEEgc2VydmljZSBpcyBhbiBleGVjdXRhYmxlIHRoYXQgY2FuIGJlIGxhdW5jaGVkIGJ5IHRoZSBidXMgZGFlbW9uLgorICAgICAgICAgIFNlcnZpY2VzIG5vcm1hbGx5IGd1YXJhbnRlZSBzb21lIHBhcnRpY3VsYXIgZmVhdHVyZXMsIGZvciBleGFtcGxlIHRoZXkKKyAgICAgICAgICBtYXkgZ3VhcmFudGVlIHRoYXQgdGhleSB3aWxsIHJlcXVlc3QgYSBzcGVjaWZpYyBuYW1lIHN1Y2ggYXMKKyAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlNjcmVlbnNhdmVyIiwgaGF2ZSBhIHNpbmdsZXRvbiBvYmplY3QKKyAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9BcHBsaWNhdGlvbiIsIGFuZCB0aGF0IG9iamVjdCB3aWxsIGltcGxlbWVudCB0aGUKKyAgICAgICAgICBpbnRlcmZhY2UgIm9yZy5mcmVlZGVza3RvcC5TY3JlZW5zYXZlckNvbnRyb2wiLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXNlcnZpY2UtZGVzY3JpcHRpb24tZmlsZXMiPjxnbG9zc3Rlcm0+U2VydmljZSBEZXNjcmlwdGlvbiBGaWxlczwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAiLnNlcnZpY2UgZmlsZXMiIHRlbGwgdGhlIGJ1cyBhYm91dCBzZXJ2aWNlIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBiZQorICAgICAgICAgIGxhdW5jaGVkIChzZWUgPHhyZWYgbGlua2VuZD0idGVybS1zZXJ2aWNlIi8+KS4gTW9zdCBpbXBvcnRhbnRseSB0aGV5CisgICAgICAgICAgcHJvdmlkZSBhIG1hcHBpbmcgZnJvbSBidXMgbmFtZXMgdG8gc2VydmljZXMgdGhhdCB3aWxsIHJlcXVlc3QgdGhvc2UKKyAgICAgICAgICAgIG5hbWVzIHdoZW4gdGhleSBzdGFydCB1cC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS11bmlxdWUtbmFtZSI+PGdsb3NzdGVybT5VbmlxdWUgQ29ubmVjdGlvbiBOYW1lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBzcGVjaWFsIG5hbWUgYXV0b21hdGljYWxseSBhc3NpZ25lZCB0byBlYWNoIGNvbm5lY3Rpb24gYnkgdGhlCisgICAgICAgICAgbWVzc2FnZSBidXMuIFRoaXMgbmFtZSB3aWxsIG5ldmVyIGNoYW5nZSBvd25lciwgYW5kIHdpbGwgYmUgdW5pcXVlCisgICAgICAgICAgKG5ldmVyIHJldXNlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBtZXNzYWdlIGJ1cykuCisgICAgICAgICAgSXQgd2lsbCBiZWdpbiB3aXRoIGEgJzonIGNoYXJhY3Rlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgPC9nbG9zc2FyeT4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9kYnVzLXRlc3QtcGxhbi5odG1sIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtdGVzdC1wbGFuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYzg2NwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9kYnVzLXRlc3QtcGxhbi5odG1sCkBAIC0wLDAgKzEsMTQxIEBACis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48dGl0bGU+RC1CdXMgVGVzdCBQbGFuPC90aXRsZT48bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc1LjIiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0iYXJ0aWNsZSIgdGl0bGU9IkQtQnVzIFRlc3QgUGxhbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iaW5kZXgiPjwvYT5ELUJ1cyBUZXN0IFBsYW48L2gyPjwvZGl2PjxkaXY+PGRpdiBjbGFzcz0iYXV0aG9yZ3JvdXAiPjxkaXYgY2xhc3M9ImF1dGhvciI+PGgzIGNsYXNzPSJhdXRob3IiPjxzcGFuIGNsYXNzPSJmaXJzdG5hbWUiPkFuZGVyczwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPkNhcmxzc29uPC9zcGFuPjwvaDM+PGRpdiBjbGFzcz0iYWZmaWxpYXRpb24iPjxzcGFuIGNsYXNzPSJvcmduYW1lIj5Db2RlRmFjdG9yeSBBQjxicj48L3NwYW4+PGRpdiBjbGFzcz0iYWRkcmVzcyI+PHA+PGNvZGUgY2xhc3M9ImVtYWlsIj4mbHQ7PGEgY2xhc3M9ImVtYWlsIiBocmVmPSJtYWlsdG86YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2UiPmFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPC9hPiZndDs8L2NvZGU+PC9wPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pjxocj48L2Rpdj48ZGl2IGNsYXNzPSJ0b2MiPjxwPjxiPlRhYmxlIG9mIENvbnRlbnRzPC9iPjwvcD48ZGw+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvc3Bhbj48L2R0PjxkZD48ZGw+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2ltcG9ydGFuY2Utb2YtdGVzdGluZyI+VGhlIGltcG9ydGFuY2Ugb2YgdGVzdGluZzwvYT48L3NwYW4+PC9kdD48L2RsPjwvZGQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI2NsaWVudC1saWJyYXJ5Ij5UZXN0aW5nIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeTwvYT48L3NwYW4+PC9kdD48ZGQ+PGRsPjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNkYXRhLXN0cnVjdHVyZXMiPkRhdGEgU3RydWN0dXJlczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjbWVzc2FnZS1sb2FkZXIiPk1lc3NhZ2UgbG9hZGVyPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNhdXRoZW50aWNhdGlvbiI+QXV0aGVudGljYXRpb248L2E+PC9zcGFuPjwvZHQ+PC9kbD48L2RkPjxkdD48c3BhbiBjbGFzcz0ic2VjdDEiPjxhIGhyZWY9IiNkYWVtb24iPlRlc3RpbmcgdGhlIEQtQnVzIGJ1cyBkYWVtb248L2E+PC9zcGFuPjwvZHQ+PGRkPjxkbD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjZGVidWctdHJhbnNwb3J0Ij5UaGUgZGVidWcgdHJhbnNwb3J0PC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNidXMtdGVzdCI+VGhlIGJ1cy10ZXN0IHByb2dyYW08L2E+PC9zcGFuPjwvZHQ+PC9kbD48L2RkPjxkdD48c3BhbiBjbGFzcz0ic2VjdDEiPjxhIGhyZWY9IiNvdGhlci10ZXN0cyI+T3RoZXIgdGVzdHM8L2E+PC9zcGFuPjwvZHQ+PGRkPjxkbD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjb29tLXJvYnVzdG5lc3MiPk91dC1PZi1NZW1vcnkgcm9idXN0bmVzczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjbGVha3MtYW5kLW90aGVyLXN0dWZmIj5NZW1vcnkgbGVha3MgYW5kIGNvZGUgcm9idXN0bmVzczwvYT48L3NwYW4+PC9kdD48L2RsPjwvZGQ+PC9kbD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MSIgdGl0bGU9IkludHJvZHVjdGlvbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJpbnRyb2R1Y3Rpb24iPjwvYT5JbnRyb2R1Y3Rpb248L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgVGhpcyBkb2N1bWVudCB0cmllcyB0byBleHBsYWluIHRoZSBkZXRhaWxzIG9mIHRoZSB0ZXN0IHBsYW4gZm9yIEQtQnVzCisgICAgPC9wPjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iVGhlIGltcG9ydGFuY2Ugb2YgdGVzdGluZyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iaW1wb3J0YW5jZS1vZi10ZXN0aW5nIj48L2E+VGhlIGltcG9ydGFuY2Ugb2YgdGVzdGluZzwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEFzIHdpdGggYW55IGJpZyBsaWJyYXJ5IG9yIHByb2dyYW0sIHRlc3RpbmcgaXMgaW1wb3J0YW50LiBJdAorICAgICAgICBjYW4gaGVscCBmaW5kIGJ1Z3MgYW5kIHJlZ3Jlc3Npb25zIGFuZCBtYWtlIHRoZSBjb2RlIGJldHRlcgorICAgICAgICBvdmVyYWxsLiAKKyAgICAgIDwvcD48cD4KKyAgICAgICAgRC1CdXMgaXMgYSBsYXJnZSBhbmQgY29tcGxleCBwaWVjZSBvZiBzb2Z0d2FyZSAoYWJvdXQgMjUsMDAwCisgICAgICAgIGxpbmVzIG9mIGNvZGUgZm9yIHRoZSBjbGllbnQgbGlicmFyeSwgYW5kIDIsNTAwIGxpbmVzIG9mIGNvZGUKKyAgICAgICAgZm9yIHRoZSBidXMgZGFlbW9uKSBhbmQgaXQncyB0aGVyZWZvcmUgaW1wb3J0YW50IHRvIHRyeSB0byBtYWtlIHN1cmUKKyAgICAgICAgdGhhdCBhbGwgcGFydHMgb2YgdGhlIHNvZnR3YXJlIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgRC1CdXMgY2FuIGJlIGJ1aWx0IHdpdGggc3VwcG9ydCBmb3IgdGVzdGluZyBieSBwYXNzaW5nCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj4tLWVuYWJsZS10ZXN0czwvY29kZT4uIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LiBJdAorICAgICAgICBpcyByZWNvbW1lbmRlZCB0aGF0IHByb2R1Y3Rpb24gc3lzdGVtcyBidWlsZCB3aXRob3V0IHRlc3RpbmcKKyAgICAgICAgc2luY2UgdGhhdCByZWR1Y2VzIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSBzaXplLgorICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iVGVzdGluZyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iY2xpZW50LWxpYnJhcnkiPjwvYT5UZXN0aW5nIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeTwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBUaGUgdGVzdHMgZm9yIHRoZSBjbGllbnQgbGlicmFyeSBjb25zaXN0IG9mIHRoZSBkYnVzLXRlc3QKKyAgICAgIHByb2dyYW0gd2hpY2ggaXMgYSB1bml0IHRlc3QgZm9yIGFsbCBhc3BlY3RzIG9mIHRoZSBjbGllbnQKKyAgICAgIGxpYnJhcnkuIFdoZW5ldmVyIGEgYnVnIGluIHRoZSBjbGllbnQgbGlicmFyeSBpcyBmb3VuZCBhbmQKKyAgICAgIGZpeGVkLCBhIHRlc3QgaXMgYWRkZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1ZyB3b24ndCBvY2N1ciBhZ2Fpbi4KKyAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJEYXRhIFN0cnVjdHVyZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImRhdGEtc3RydWN0dXJlcyI+PC9hPkRhdGEgU3RydWN0dXJlczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBUaGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgY29uc2lzdHMgb2Ygc29tZSBkYXRhIHN0cnVjdHVyZXMgdGhhdAorICAgICAgYXJlIHVzZWQgaW50ZXJuYWxseTsgYSBsaW5rZWQgbGlzdCBjbGFzcywgYSBoYXNodGFibGUgY2xhc3MgYW5kCisgICAgICBhIHN0cmluZyBjbGFzcy4gQWxsIGFzcGVjdHMgb2YgdGhvc2UgYXJlIHRlc3RlZCBieSBkYnVzLXRlc3QuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJNZXNzYWdlIGxvYWRlciI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZS1sb2FkZXIiPjwvYT5NZXNzYWdlIGxvYWRlcjwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIFRoZSBtZXNzYWdlIGxvYWRlciBpcyB0aGUgcGFydCBvZiBELUJ1cyB0aGF0IHRha2VzIG1lc3NhZ2VzIGluCisgICAgICAgIHJhdyBjaGFyYWN0ZXIgZm9ybSBhbmQgcGFyc2VzIHRoZW0sIHR1cm5pbmcgdGhlbSBpbnRvIERCdXNNZXNzYWdlcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhpcyBpcyBvbmUgb2YgdGhlIHBhcnRzIG9mIEQtQnVzIHRoYXQKKyAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+bXVzdDwvZW0+PC9zcGFuPiBiZSBhYnNvbHV0ZWx5IGJ1Zy1mcmVlIGFuZAorICAgICAgICByb2J1c3QuIFRoZSBtZXNzYWdlIGxvYWRlciBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgaW52YWxpZAorICAgICAgICBhbmQgaW5jb21wbGV0ZSBtZXNzYWdlcyB3aXRob3V0IGNyYXNoaW5nLiBOb3QgZG9pbmcgc28gaXMgYQorICAgICAgICBzZXJpb3VzIGlzc3VlIGFuZCBjYW4gZWFzaWx5IHJlc3VsdCBpbiBELUJ1cyBiZWluZyBleHBsb2l0YWJsZQorICAgICAgICB0byBEb1MgYXR0YWNrcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVG8gc29sdmUgdGhlc2UgcHJvYmxlbXMsIHRoZXJlIGlzIGEgdGVzdGluZyBmZWF0dXJlIGNhbGxlZCB0aGUKKyAgICAgICAgTWVzc2FnZSBCdWlsZGVyLiBUaGUgbWVzc2FnZSBidWlsZGVyIGNhbiB0YWtlIGEgc2VyaWFsaXplZAorICAgICAgICBtZXNzYWdlIGluIHN0cmluZy1mb3JtIGFuZCBjb252ZXJ0IGl0IGludG8gYSByYXcgY2hhcmFjdGVyCisgICAgICAgIHN0cmluZyB3aGljaCBjYW4gdGhlbiBiZSBsb2FkZWQgYnkgdGhlIG1lc3NhZ2UgbG9hZGVyLiAKKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIG5hbWU9ImlkcDU5MDI0Ij48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5GaWd1cmWgMS6gRXhhbXBsZSBvZiBhIG1lc3NhZ2UgaW4gc3RyaW5nIGZvcm08L2I+PC9wPjxkaXYgY2xhc3M9ImZpZ3VyZS1jb250ZW50cyI+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgICMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG8gbWVzc2FnZQorCisgICAgICAgICAgVkFMSURfSEVBREVSCisgICAgICAgICAgRklFTERfTkFNRSBuYW1lCisgICAgICAgICAgVFlQRSBTVFJJTkcKKyAgICAgICAgICBTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvJworICAgICAgICAgIEZJRUxEX05BTUUgc3J2YworICAgICAgICAgIFRZUEUgU1RSSU5HCisgICAgICAgICAgU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKKyAgICAgICAgICBBTElHTiA4CisgICAgICAgICAgRU5EX0xFTkdUSCBIZWFkZXIKKyAgICAgICAgICBTVEFSVF9MRU5HVEggQm9keQorICAgICAgICAgIEVORF9MRU5HVEggQm9keQorICAgICAgICA8L3ByZT48L2Rpdj48L2Rpdj48YnIgY2xhc3M9ImZpZ3VyZS1icmVhayI+PHA+CisgICAgICAgIFRoZSBmaWxlIGZvcm1hdCBvZiBtZXNzYWdlcyBpbiBzdHJpbmcgZm9ybSBpcyBkb2N1bWVudGVkIGluCisgICAgICAgIHRoZSBELUJ1cyBSZWZlcmVuY2UgTWFudWFsLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgbWVzc2FnZSB0ZXN0IHBhcnQgb2YgZGJ1cy10ZXN0IGlzIHVzaW5nIHRoZSBtZXNzYWdlCisgICAgICAgIGJ1aWxkZXIgdG8gYnVpbGQgZGlmZmVyZW50IGtpbmRzIG9mIG1lc3NhZ2VzLCBib3RoIHZhbGlkLAorICAgICAgICBpbnZhbGlkLCBhbmQgaW52YWxpZCBvbmVzLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9hZGVyIHdvbid0CisgICAgICAgIGNyYXNoIG9yIGxlYWsgbWVtb3J5IG9mIGFueSBvZiB0aG9zZSwgYW5kIHRoYXQgdGhlIGxvYWRlcgorICAgICAgICBrbm93cyBpZiBhIG1lc3NhZ2UgaXMgdmFsaWQgb3Igbm90LgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGVyZSBpcyBhbHNvIGEgdGVzdCBwcm9ncmFtIGNhbGxlZAorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+YnJlYWstbG9hZGVyPC9jb2RlPiB0aGF0IGxvYWRzIGEgbWVzc2FnZSBpbgorICAgICAgICBzdHJpbmctZm9ybSBpbnRvIHJhdyBjaGFyYWN0ZXIgZm9ybSB1c2luZyB0aGUgbWVzc2FnZQorICAgICAgICBidWlsZGVyLiBJdCB0aGVuIHJhbmRvbWx5IGNoYW5nZXMgdGhlIG1lc3NhZ2UsIGl0IGNhbiBmb3IKKyAgICAgICAgZXhhbXBsZSByZXBsYWNlIHNpbmdsZSBieXRlcyBvZiBkYXRhIG9yIG1vZGlmeSB0aGUgbGVuZ3RoIG9mCisgICAgICAgIHRoZSBtZXNzYWdlLiBUaGlzIGlzIHRvIHNpbXVsYXRlIG5ldHdvcmsgZXJyb3JzLiBUaGUKKyAgICAgICAgYnJlYWstbG9hZGVyIHByb2dyYW0gc2F2ZXMgYWxsIHRoZSBtZXNzYWdlcyBsZWFkaW5nIHRvIGVycm9ycworICAgICAgICBzbyBpdCBjYW4gZWFzaWx5IGJlIHJ1biBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iQXV0aGVudGljYXRpb24iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImF1dGhlbnRpY2F0aW9uIj48L2E+QXV0aGVudGljYXRpb248L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBGb3IgdGVzdGluZyBhdXRoZW50aWNhdGlvbiwgdGhlcmUgaXMgYSB0ZXN0aW5nIGZlYXR1cmUgdGhhdAorICAgICAgICBjYW4gcmVhZCBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZXMgZnJvbSBhIGZpbGUgYW5kIHBsYXkgdGhlbQorICAgICAgICBiYWNrIHRvIGEgZHVtbXkgc2VydmVyIGFuZCBjbGllbnQgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgYXV0aGVudGljYXRpb24gaXMgd29ya2luZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uCisgICAgICA8L3A+PGRpdiBjbGFzcz0iZmlndXJlIj48YSBuYW1lPSJpZHA2NTcxMiI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RmlndXJloDIuoEV4YW1wbGUgb2YgYW4gYXV0aGVudGljYXRpb24gc2NyaXB0PC9iPjwvcD48ZGl2IGNsYXNzPSJmaWd1cmUtY29udGVudHMiPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICAjIyB0aGlzIHRlc3RzIGEgc3VjY2Vzc2Z1bCBhdXRoIG9mIHR5cGUgRVhURVJOQUwKKyAgICAgICAgICAKKyAgICAgICAgICBTRVJWRVIKKyAgICAgICAgICBTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJOQU1FX0hFWCcKKyAgICAgICAgICBFWFBFQ1RfQ09NTUFORCBPSworICAgICAgICAgIEVYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorICAgICAgICAgIFNFTkQgJ0JFR0lOJworICAgICAgICAgIEVYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECisgICAgICAgIDwvcHJlPjwvZGl2PjwvZGl2PjxiciBjbGFzcz0iZmlndXJlLWJyZWFrIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MSIgdGl0bGU9IlRlc3RpbmcgdGhlIEQtQnVzIGJ1cyBkYWVtb24iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iZGFlbW9uIj48L2E+VGVzdGluZyB0aGUgRC1CdXMgYnVzIGRhZW1vbjwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBTaW5jZSB0aGUgRC1CdXMgYnVzIGRhZW1vbiBpcyB1c2luZyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgaXQKKyAgICAgIHdpbGwgYmVuZWZpdCBmcm9tIGFsbCB0ZXN0cyBkb25lIG9uIHRoZSBjbGllbnQgbGlicmFyeSwgYnV0CisgICAgICB0aGVyZSBpcyBzdGlsbCB0aGUgaXNzdWUgb2YgdGVzdGluZyBjbGllbnQtc2VydmVyIGNvbW11bmljYXRpb24uCisgICAgICBUaGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgc2luY2UgaXQgaXQgbWF5IHJlcXVpcmUgYW5vdGhlciBwcm9jZXNzCisgICAgICBydW5uaW5nLgorICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IlRoZSBkZWJ1ZyB0cmFuc3BvcnQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImRlYnVnLXRyYW5zcG9ydCI+PC9hPlRoZSBkZWJ1ZyB0cmFuc3BvcnQ8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBJbiBELUJ1cywgYSA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT50cmFuc3BvcnQ8L2VtPjwvc3Bhbj4gaXMgYSBjbGFzcyB0aGF0CisgICAgICAgIGhhbmRsZXMgc2VuZGluZyBhbmQgcmVjZWl2aW5nIHJhdyBkYXRhIG92ZXIgYSBjZXJ0YWluCisgICAgICAgIG1lZGl1bS4gVGhlIHRyYW5zcG9ydCB0aGF0IGlzIHVzZWQgbW9zdCBpbiBELUJ1cyBpcyB0aGUgVU5JWAorICAgICAgICB0cmFuc3BvcnQgd2l0aCBzZW5kcyBhbmQgcmVjZXZpZXMgZGF0YSBvdmVyIGEgVU5JWCBzb2NrZXQuIEEKKyAgICAgICAgdHJhbnNwb3J0IHRoYXQgdHVubmVscyBkYXRhIHRocm91Z2ggWDExIGNsaWVudCBtZXNzYWdlcyBpcworICAgICAgICBhbHNvIHVuZGVyIGRldmVsb3BtZW50LgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgRC1CdXMgZGVidWcgdHJhbnNwb3J0IGlzIGEgc3BlY2lhbGl6ZWQgdHJhbnNwb3J0IHRoYXQKKyAgICAgICAgd29ya3MgaW4tcHJvY2Vzcy4gVGhpcyBtZWFucyB0aGF0IGEgY2xpZW50IGFuZCBzZXJ2ZXIgdGhhdAorICAgICAgICBleGlzdHMgaW4gdGhlIHNhbWUgcHJvY2VzcyBjYW4gdGFsayB0byBlYWNob3RoZXIgd2l0aG91dCB1c2luZworICAgICAgICBhIHNvY2tldC4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IlRoZSBidXMtdGVzdCBwcm9ncmFtIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtdGVzdCI+PC9hPlRoZSBidXMtdGVzdCBwcm9ncmFtPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlIGJ1cy10ZXN0IHByb2dyYW0gaXMgYSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byB0ZXN0IHZhcmlvdXMKKyAgICAgICAgcGFydHMgb2YgdGhlIEQtQnVzIGJ1cyBkYWVtb247IHJvYnVzdG5lc3MgYW5kIHRoYXQgaXQgY29uZm9ybXMKKyAgICAgICAgdG8gdGhlIHNwZWNpZmljYXRpb25zLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgdGVzdCBwcm9ncmFtIGhhcyB0aGUgbmVjZXNzYXJ5IGNvZGUgZnJvbSB0aGUgYnVzIGRhZW1vbgorICAgICAgICBsaW5rZWQgaW4sIGFuZCBpdCB1c2VzIHRoZSBkZWJ1ZyB0cmFuc3BvcnQgZm9yCisgICAgICAgIGNvbW11bmljYXRpb24uIFRoaXMgbWVhbnMgdGhhdCB0aGUgYnVzIGRhZW1vbiBjb2RlIGNhbiBiZQorICAgICAgICB0ZXN0ZWQgd2l0aG91dCB0aGUgcmVhbCBidXMgYWN0dWFsbHkgcnVubmluZywgd2hpY2ggbWFrZXMKKyAgICAgICAgdGVzdGluZyBlYXNpZXIuCisgICAgICA8L3A+PHA+CisgICAgICAgIFRoZSBidXMtdGVzdCBwcm9ncmFtIHNob3VsZCB0ZXN0IGFsbCBtYWpvciBmZWF0dXJlcyBvZiB0aGUKKyAgICAgICAgYnVzLCBzdWNoIGFzIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBub3RpZmljYXRpb24gd2hlbiB0aGluZ3MKKyAgICAgICAgb2NjdXJzIGFuZCBtZXNzYWdlIG1hdGNoaW5nLgorICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iT3RoZXIgdGVzdHMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0ib3RoZXItdGVzdHMiPjwvYT5PdGhlciB0ZXN0czwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJPdXQtT2YtTWVtb3J5IHJvYnVzdG5lc3MiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im9vbS1yb2J1c3RuZXNzIj48L2E+T3V0LU9mLU1lbW9yeSByb2J1c3RuZXNzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgU2luY2UgRC1CdXMgc2hvdWxkIGJlIGFibGUgdG8gYmUgdXNlZCBpbiBlbWJlZGRlZCBkZXZpY2VzLCBhbmQKKyAgICAgICAgYWxzbyBhcyBhIHN5c3RlbSBzZXJ2aWNlLCBpdCBzaG91bGQgYmUgYWJsZSB0byBjb3BlIHdpdGgKKyAgICAgICAgbG93LW1lbW9yeSBzaXR1YXRpb25zIHdpdGhvdXQgZXhpdGluZyBvciBjcmFzaGluZy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBjb2RlCisgICAgICAgIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgZGJ1c19tYWxsb2MgcmV0dXJuaW5nIE5VTEwuIAorICAgICAgPC9wPjxwPgorICAgICAgICBUbyB0ZXN0IHRoaXMsIHR3byBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgICAgZXhpc3QuIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX01BTExPQ19GQUlMX05USDwvY29kZT4gd2lsbCBtYWtlIGV2ZXJ5CisgICAgICAgIG50aCBjYWxsIHRvIGRidXNfbWFsbG9jIHJldHVybiBOVUxMLCBhbmQKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOPC9jb2RlPiB3aWxsIG1ha2UgYW55CisgICAgICAgIGRidXNfbWFsbG9jIGNhbGwgd2l0aCBhIHJlcXVlc3QgZm9yIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkCisgICAgICAgIG51bWJlciBvZiBieXRlcyBmYWlsLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iTWVtb3J5IGxlYWtzIGFuZCBjb2RlIHJvYnVzdG5lc3MiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImxlYWtzLWFuZC1vdGhlci1zdHVmZiI+PC9hPk1lbW9yeSBsZWFrcyBhbmQgY29kZSByb2J1c3RuZXNzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgTmF0dXJhbGx5IHRoZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IHRlc3RzIGNhbid0IGJlIHdyaXR0ZW4KKyAgICAgICAgZm9yLCBmb3IgZXhhbXBsZSB0aGluZ3MgbGlrZSBtZW1vcnkgbGVha3MgYW5kIG91dC1vZi1ib3VuZHMKKyAgICAgICAgbWVtb3J5IHJlYWRpbmcgb3Igd3JpdGluZy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgTHVja2lseSB0aGVyZSBleGlzdHMgZ29vZCB0b29scyBmb3IgY2F0Y2hpbmcgc3VjaCBlcnJvcnMuIE9uZQorICAgICAgICBmcmVlIGdvb2QgdG9vbCBpcyA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly9kZXZlbC1ob21lLmtkZS5vcmcvfnNld2FyZGovIiB0YXJnZXQ9Il90b3AiPlZhbGdyaW5kPC9hPiwgd2hpY2ggcnVucyB0aGUgcHJvZ3JhbSBpbiBhCisgICAgICAgIHZpcnR1YWwgQ1BVIHdoaWNoIG1ha2VzIGNhdGNoaW5nIGVycm9ycyBlYXN5LiBBbGwgdGVzdCBwcm9ncmFtcyBjYW4gYmUgcnVuIHVuZGVyIFZhbGdyaW5kLCAKKyAgICAgIDwvcD48L2Rpdj48L2Rpdj48L2Rpdj48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RidXMtdGVzdC1wbGFuLnhtbCBiL2RidXMtMS40LjEwL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhYWZiOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwKQEAgLTAsMCArMSwyMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIgorWworXT4KKworPGFydGljbGUgaWQ9ImluZGV4Ij4KKyAgPGFydGljbGVpbmZvPgorICAgIDx0aXRsZT5ELUJ1cyBUZXN0IFBsYW48L3RpdGxlPgorICAgIDxkYXRlPjE0IEZlYnJ1YXJ5IDIwMDM8L2RhdGU+CisgICAgPGF1dGhvcmdyb3VwPgorICAgICAgPGF1dGhvcj4KKwk8Zmlyc3RuYW1lPkFuZGVyczwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPkNhcmxzc29uPC9zdXJuYW1lPgorCTxhZmZpbGlhdGlvbj4KKwkgIDxvcmduYW1lPkNvZGVGYWN0b3J5IEFCPC9vcmduYW1lPgorCSAgPGFkZHJlc3M+PGVtYWlsPmFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPC9lbWFpbD48L2FkZHJlc3M+CisJPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvYXV0aG9yZ3JvdXA+CisgIDwvYXJ0aWNsZWluZm8+CisgIDxzZWN0MSBpZD0iaW50cm9kdWN0aW9uIj4KKyAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFRoaXMgZG9jdW1lbnQgdHJpZXMgdG8gZXhwbGFpbiB0aGUgZGV0YWlscyBvZiB0aGUgdGVzdCBwbGFuIGZvciBELUJ1cworICAgIDwvcGFyYT4KKyAgICA8c2VjdDIgaWQ9ImltcG9ydGFuY2Utb2YtdGVzdGluZyI+CisgICAgICA8dGl0bGU+VGhlIGltcG9ydGFuY2Ugb2YgdGVzdGluZzwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgQXMgd2l0aCBhbnkgYmlnIGxpYnJhcnkgb3IgcHJvZ3JhbSwgdGVzdGluZyBpcyBpbXBvcnRhbnQuIEl0CisgICAgICAgIGNhbiBoZWxwIGZpbmQgYnVncyBhbmQgcmVncmVzc2lvbnMgYW5kIG1ha2UgdGhlIGNvZGUgYmV0dGVyCisgICAgICAgIG92ZXJhbGwuIAorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEQtQnVzIGlzIGEgbGFyZ2UgYW5kIGNvbXBsZXggcGllY2Ugb2Ygc29mdHdhcmUgKGFib3V0IDI1LDAwMAorICAgICAgICBsaW5lcyBvZiBjb2RlIGZvciB0aGUgY2xpZW50IGxpYnJhcnksIGFuZCAyLDUwMCBsaW5lcyBvZiBjb2RlCisgICAgICAgIGZvciB0aGUgYnVzIGRhZW1vbikgYW5kIGl0J3MgdGhlcmVmb3JlIGltcG9ydGFudCB0byB0cnkgdG8gbWFrZSBzdXJlCisgICAgICAgIHRoYXQgYWxsIHBhcnRzIG9mIHRoZSBzb2Z0d2FyZSBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRC1CdXMgY2FuIGJlIGJ1aWx0IHdpdGggc3VwcG9ydCBmb3IgdGVzdGluZyBieSBwYXNzaW5nCisgICAgICAgIDxsaXRlcmFsPi0tZW5hYmxlLXRlc3RzPC9saXRlcmFsPi4gdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIEl0CisgICAgICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgcHJvZHVjdGlvbiBzeXN0ZW1zIGJ1aWxkIHdpdGhvdXQgdGVzdGluZworICAgICAgICBzaW5jZSB0aGF0IHJlZHVjZXMgdGhlIEQtQnVzIGNsaWVudCBsaWJyYXJ5IHNpemUuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKyAgPHNlY3QxIGlkPSJjbGllbnQtbGlicmFyeSI+CisgICAgPHRpdGxlPlRlc3RpbmcgdGhlIEQtQnVzIGNsaWVudCBsaWJyYXJ5PC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFRoZSB0ZXN0cyBmb3IgdGhlIGNsaWVudCBsaWJyYXJ5IGNvbnNpc3Qgb2YgdGhlIGRidXMtdGVzdAorICAgICAgcHJvZ3JhbSB3aGljaCBpcyBhIHVuaXQgdGVzdCBmb3IgYWxsIGFzcGVjdHMgb2YgdGhlIGNsaWVudAorICAgICAgbGlicmFyeS4gV2hlbmV2ZXIgYSBidWcgaW4gdGhlIGNsaWVudCBsaWJyYXJ5IGlzIGZvdW5kIGFuZAorICAgICAgZml4ZWQsIGEgdGVzdCBpcyBhZGRlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVnIHdvbid0IG9jY3VyIGFnYWluLgorICAgIDwvcGFyYT4KKyAgICA8c2VjdDIgaWQ9ImRhdGEtc3RydWN0dXJlcyI+CisgICAgICA8dGl0bGU+RGF0YSBTdHJ1Y3R1cmVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgVGhlIEQtQnVzIGNsaWVudCBsaWJyYXJ5IGNvbnNpc3RzIG9mIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQKKyAgICAgIGFyZSB1c2VkIGludGVybmFsbHk7IGEgbGlua2VkIGxpc3QgY2xhc3MsIGEgaGFzaHRhYmxlIGNsYXNzIGFuZAorICAgICAgYSBzdHJpbmcgY2xhc3MuIEFsbCBhc3BlY3RzIG9mIHRob3NlIGFyZSB0ZXN0ZWQgYnkgZGJ1cy10ZXN0LgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWxvYWRlciI+CisgICAgICA8dGl0bGU+TWVzc2FnZSBsb2FkZXI8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtZXNzYWdlIGxvYWRlciBpcyB0aGUgcGFydCBvZiBELUJ1cyB0aGF0IHRha2VzIG1lc3NhZ2VzIGluCisgICAgICAgIHJhdyBjaGFyYWN0ZXIgZm9ybSBhbmQgcGFyc2VzIHRoZW0sIHR1cm5pbmcgdGhlbSBpbnRvIERCdXNNZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcGFydHMgb2YgRC1CdXMgdGhhdAorICAgICAgICA8ZW1waGFzaXM+bXVzdDwvZW1waGFzaXM+IGJlIGFic29sdXRlbHkgYnVnLWZyZWUgYW5kCisgICAgICAgIHJvYnVzdC4gVGhlIG1lc3NhZ2UgbG9hZGVyIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBpbnZhbGlkCisgICAgICAgIGFuZCBpbmNvbXBsZXRlIG1lc3NhZ2VzIHdpdGhvdXQgY3Jhc2hpbmcuIE5vdCBkb2luZyBzbyBpcyBhCisgICAgICAgIHNlcmlvdXMgaXNzdWUgYW5kIGNhbiBlYXNpbHkgcmVzdWx0IGluIEQtQnVzIGJlaW5nIGV4cGxvaXRhYmxlCisgICAgICAgIHRvIERvUyBhdHRhY2tzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRvIHNvbHZlIHRoZXNlIHByb2JsZW1zLCB0aGVyZSBpcyBhIHRlc3RpbmcgZmVhdHVyZSBjYWxsZWQgdGhlCisgICAgICAgIE1lc3NhZ2UgQnVpbGRlci4gVGhlIG1lc3NhZ2UgYnVpbGRlciBjYW4gdGFrZSBhIHNlcmlhbGl6ZWQKKyAgICAgICAgbWVzc2FnZSBpbiBzdHJpbmctZm9ybSBhbmQgY29udmVydCBpdCBpbnRvIGEgcmF3IGNoYXJhY3RlcgorICAgICAgICBzdHJpbmcgd2hpY2ggY2FuIHRoZW4gYmUgbG9hZGVkIGJ5IHRoZSBtZXNzYWdlIGxvYWRlci4gCisgICAgICA8L3BhcmE+CisgICAgICA8ZmlndXJlPgorCTx0aXRsZT5FeGFtcGxlIG9mIGEgbWVzc2FnZSBpbiBzdHJpbmcgZm9ybTwvdGl0bGU+CisJPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG8gbWVzc2FnZQorCisgICAgICAgICAgVkFMSURfSEVBREVSCisgICAgICAgICAgRklFTERfTkFNRSBuYW1lCisgICAgICAgICAgVFlQRSBTVFJJTkcKKyAgICAgICAgICBTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvJworICAgICAgICAgIEZJRUxEX05BTUUgc3J2YworICAgICAgICAgIFRZUEUgU1RSSU5HCisgICAgICAgICAgU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKKyAgICAgICAgICBBTElHTiA4CisgICAgICAgICAgRU5EX0xFTkdUSCBIZWFkZXIKKyAgICAgICAgICBTVEFSVF9MRU5HVEggQm9keQorICAgICAgICAgIEVORF9MRU5HVEggQm9keQorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9maWd1cmU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZpbGUgZm9ybWF0IG9mIG1lc3NhZ2VzIGluIHN0cmluZyBmb3JtIGlzIGRvY3VtZW50ZWQgaW4KKyAgICAgICAgdGhlIEQtQnVzIFJlZmVyZW5jZSBNYW51YWwuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgdGVzdCBwYXJ0IG9mIGRidXMtdGVzdCBpcyB1c2luZyB0aGUgbWVzc2FnZQorICAgICAgICBidWlsZGVyIHRvIGJ1aWxkIGRpZmZlcmVudCBraW5kcyBvZiBtZXNzYWdlcywgYm90aCB2YWxpZCwKKyAgICAgICAgaW52YWxpZCwgYW5kIGludmFsaWQgb25lcywgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvYWRlciB3b24ndAorICAgICAgICBjcmFzaCBvciBsZWFrIG1lbW9yeSBvZiBhbnkgb2YgdGhvc2UsIGFuZCB0aGF0IHRoZSBsb2FkZXIKKyAgICAgICAga25vd3MgaWYgYSBtZXNzYWdlIGlzIHZhbGlkIG9yIG5vdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVyZSBpcyBhbHNvIGEgdGVzdCBwcm9ncmFtIGNhbGxlZAorICAgICAgICA8bGl0ZXJhbD5icmVhay1sb2FkZXI8L2xpdGVyYWw+IHRoYXQgbG9hZHMgYSBtZXNzYWdlIGluCisgICAgICAgIHN0cmluZy1mb3JtIGludG8gcmF3IGNoYXJhY3RlciBmb3JtIHVzaW5nIHRoZSBtZXNzYWdlCisgICAgICAgIGJ1aWxkZXIuIEl0IHRoZW4gcmFuZG9tbHkgY2hhbmdlcyB0aGUgbWVzc2FnZSwgaXQgY2FuIGZvcgorICAgICAgICBleGFtcGxlIHJlcGxhY2Ugc2luZ2xlIGJ5dGVzIG9mIGRhdGEgb3IgbW9kaWZ5IHRoZSBsZW5ndGggb2YKKyAgICAgICAgdGhlIG1lc3NhZ2UuIFRoaXMgaXMgdG8gc2ltdWxhdGUgbmV0d29yayBlcnJvcnMuIFRoZQorICAgICAgICBicmVhay1sb2FkZXIgcHJvZ3JhbSBzYXZlcyBhbGwgdGhlIG1lc3NhZ2VzIGxlYWRpbmcgdG8gZXJyb3JzCisgICAgICAgIHNvIGl0IGNhbiBlYXNpbHkgYmUgcnVuIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGhlbnRpY2F0aW9uIj4KKyAgICAgIDx0aXRsZT5BdXRoZW50aWNhdGlvbjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgRm9yIHRlc3RpbmcgYXV0aGVudGljYXRpb24sIHRoZXJlIGlzIGEgdGVzdGluZyBmZWF0dXJlIHRoYXQKKyAgICAgICAgY2FuIHJlYWQgYXV0aGVudGljYXRpb24gc2VxdWVuY2VzIGZyb20gYSBmaWxlIGFuZCBwbGF5IHRoZW0KKyAgICAgICAgYmFjayB0byBhIGR1bW15IHNlcnZlciBhbmQgY2xpZW50IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIHdvcmtpbmcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAgPC9wYXJhPgorICAgICAgPGZpZ3VyZT4KKwk8dGl0bGU+RXhhbXBsZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBzY3JpcHQ8L3RpdGxlPgorCTxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAjIyB0aGlzIHRlc3RzIGEgc3VjY2Vzc2Z1bCBhdXRoIG9mIHR5cGUgRVhURVJOQUwKKyAgICAgICAgICAKKyAgICAgICAgICBTRVJWRVIKKyAgICAgICAgICBTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJOQU1FX0hFWCcKKyAgICAgICAgICBFWFBFQ1RfQ09NTUFORCBPSworICAgICAgICAgIEVYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorICAgICAgICAgIFNFTkQgJ0JFR0lOJworICAgICAgICAgIEVYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L2ZpZ3VyZT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImRhZW1vbiI+CisgICAgPHRpdGxlPlRlc3RpbmcgdGhlIEQtQnVzIGJ1cyBkYWVtb248L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgU2luY2UgdGhlIEQtQnVzIGJ1cyBkYWVtb24gaXMgdXNpbmcgdGhlIEQtQnVzIGNsaWVudCBsaWJyYXJ5IGl0CisgICAgICB3aWxsIGJlbmVmaXQgZnJvbSBhbGwgdGVzdHMgZG9uZSBvbiB0aGUgY2xpZW50IGxpYnJhcnksIGJ1dAorICAgICAgdGhlcmUgaXMgc3RpbGwgdGhlIGlzc3VlIG9mIHRlc3RpbmcgY2xpZW50LXNlcnZlciBjb21tdW5pY2F0aW9uLgorICAgICAgVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIHNpbmNlIGl0IGl0IG1heSByZXF1aXJlIGFub3RoZXIgcHJvY2VzcworICAgICAgcnVubmluZy4KKyAgICA8L3BhcmE+CisgICAgPHNlY3QyIGlkPSJkZWJ1Zy10cmFuc3BvcnQiPgorICAgICAgPHRpdGxlPlRoZSBkZWJ1ZyB0cmFuc3BvcnQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEluIEQtQnVzLCBhIDxlbXBoYXNpcz50cmFuc3BvcnQ8L2VtcGhhc2lzPiBpcyBhIGNsYXNzIHRoYXQKKyAgICAgICAgaGFuZGxlcyBzZW5kaW5nIGFuZCByZWNlaXZpbmcgcmF3IGRhdGEgb3ZlciBhIGNlcnRhaW4KKyAgICAgICAgbWVkaXVtLiBUaGUgdHJhbnNwb3J0IHRoYXQgaXMgdXNlZCBtb3N0IGluIEQtQnVzIGlzIHRoZSBVTklYCisgICAgICAgIHRyYW5zcG9ydCB3aXRoIHNlbmRzIGFuZCByZWNldmllcyBkYXRhIG92ZXIgYSBVTklYIHNvY2tldC4gQQorICAgICAgICB0cmFuc3BvcnQgdGhhdCB0dW5uZWxzIGRhdGEgdGhyb3VnaCBYMTEgY2xpZW50IG1lc3NhZ2VzIGlzCisgICAgICAgIGFsc28gdW5kZXIgZGV2ZWxvcG1lbnQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIEQtQnVzIGRlYnVnIHRyYW5zcG9ydCBpcyBhIHNwZWNpYWxpemVkIHRyYW5zcG9ydCB0aGF0CisgICAgICAgIHdvcmtzIGluLXByb2Nlc3MuIFRoaXMgbWVhbnMgdGhhdCBhIGNsaWVudCBhbmQgc2VydmVyIHRoYXQKKyAgICAgICAgZXhpc3RzIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FuIHRhbGsgdG8gZWFjaG90aGVyIHdpdGhvdXQgdXNpbmcKKyAgICAgICAgYSBzb2NrZXQuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImJ1cy10ZXN0Ij4KKyAgICAgIDx0aXRsZT5UaGUgYnVzLXRlc3QgcHJvZ3JhbTwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGJ1cy10ZXN0IHByb2dyYW0gaXMgYSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byB0ZXN0IHZhcmlvdXMKKyAgICAgICAgcGFydHMgb2YgdGhlIEQtQnVzIGJ1cyBkYWVtb247IHJvYnVzdG5lc3MgYW5kIHRoYXQgaXQgY29uZm9ybXMKKyAgICAgICAgdG8gdGhlIHNwZWNpZmljYXRpb25zLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSB0ZXN0IHByb2dyYW0gaGFzIHRoZSBuZWNlc3NhcnkgY29kZSBmcm9tIHRoZSBidXMgZGFlbW9uCisgICAgICAgIGxpbmtlZCBpbiwgYW5kIGl0IHVzZXMgdGhlIGRlYnVnIHRyYW5zcG9ydCBmb3IKKyAgICAgICAgY29tbXVuaWNhdGlvbi4gVGhpcyBtZWFucyB0aGF0IHRoZSBidXMgZGFlbW9uIGNvZGUgY2FuIGJlCisgICAgICAgIHRlc3RlZCB3aXRob3V0IHRoZSByZWFsIGJ1cyBhY3R1YWxseSBydW5uaW5nLCB3aGljaCBtYWtlcworICAgICAgICB0ZXN0aW5nIGVhc2llci4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgYnVzLXRlc3QgcHJvZ3JhbSBzaG91bGQgdGVzdCBhbGwgbWFqb3IgZmVhdHVyZXMgb2YgdGhlCisgICAgICAgIGJ1cywgc3VjaCBhcyBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiwgbm90aWZpY2F0aW9uIHdoZW4gdGhpbmdzCisgICAgICAgIG9jY3VycyBhbmQgbWVzc2FnZSBtYXRjaGluZy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9Im90aGVyLXRlc3RzIj4KKyAgICA8dGl0bGU+T3RoZXIgdGVzdHM8L3RpdGxlPgorCisgICAgPHNlY3QyIGlkPSJvb20tcm9idXN0bmVzcyI+CisgICAgICA8dGl0bGU+T3V0LU9mLU1lbW9yeSByb2J1c3RuZXNzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBTaW5jZSBELUJ1cyBzaG91bGQgYmUgYWJsZSB0byBiZSB1c2VkIGluIGVtYmVkZGVkIGRldmljZXMsIGFuZAorICAgICAgICBhbHNvIGFzIGEgc3lzdGVtIHNlcnZpY2UsIGl0IHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgd2l0aAorICAgICAgICBsb3ctbWVtb3J5IHNpdHVhdGlvbnMgd2l0aG91dCBleGl0aW5nIG9yIGNyYXNoaW5nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEluIHByYWN0aWNlLCB0aGlzIG1lYW5zIHRoYXQgYm90aCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZQorICAgICAgICBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIGRidXNfbWFsbG9jIHJldHVybmluZyBOVUxMLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUbyB0ZXN0IHRoaXMsIHR3byBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgICAgZXhpc3QuIDxsaXRlcmFsPkRCVVNfTUFMTE9DX0ZBSUxfTlRIPC9saXRlcmFsPiB3aWxsIG1ha2UgZXZlcnkKKyAgICAgICAgbnRoIGNhbGwgdG8gZGJ1c19tYWxsb2MgcmV0dXJuIE5VTEwsIGFuZAorICAgICAgICA8bGl0ZXJhbD5EQlVTX01BTExPQ19GQUlMX0dSRUFURVJfVEhBTjwvbGl0ZXJhbD4gd2lsbCBtYWtlIGFueQorICAgICAgICBkYnVzX21hbGxvYyBjYWxsIHdpdGggYSByZXF1ZXN0IGZvciBtb3JlIHRoYW4gdGhlIHNwZWNpZmllZAorICAgICAgICBudW1iZXIgb2YgYnl0ZXMgZmFpbC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJsZWFrcy1hbmQtb3RoZXItc3R1ZmYiPgorICAgICAgPHRpdGxlPk1lbW9yeSBsZWFrcyBhbmQgY29kZSByb2J1c3RuZXNzPC90aXRsZT4gCisgICAgICA8cGFyYT4KKyAgICAgICAgTmF0dXJhbGx5IHRoZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IHRlc3RzIGNhbid0IGJlIHdyaXR0ZW4KKyAgICAgICAgZm9yLCBmb3IgZXhhbXBsZSB0aGluZ3MgbGlrZSBtZW1vcnkgbGVha3MgYW5kIG91dC1vZi1ib3VuZHMKKyAgICAgICAgbWVtb3J5IHJlYWRpbmcgb3Igd3JpdGluZy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBMdWNraWx5IHRoZXJlIGV4aXN0cyBnb29kIHRvb2xzIGZvciBjYXRjaGluZyBzdWNoIGVycm9ycy4gT25lCisgICAgICAgIGZyZWUgZ29vZCB0b29sIGlzIDx1bGluayB1cmw9Imh0dHA6Ly9kZXZlbC1ob21lLmtkZS5vcmcvfnNld2FyZGovIj5WYWxncmluZDwvdWxpbms+LCB3aGljaCBydW5zIHRoZSBwcm9ncmFtIGluIGEKKyAgICAgICAgdmlydHVhbCBDUFUgd2hpY2ggbWFrZXMgY2F0Y2hpbmcgZXJyb3JzIGVhc3kuIEFsbCB0ZXN0IHByb2dyYW1zIGNhbiBiZSBydW4gdW5kZXIgVmFsZ3JpbmQsIAorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+Cis8L2FydGljbGU+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kb2MvZGJ1cy10dXRvcmlhbC5odG1sIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtdHV0b3JpYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTdhZmFmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtdHV0b3JpYWwuaHRtbApAQCAtMCwwICsxLDk5MSBAQAorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PHRpdGxlPkQtQnVzIFR1dG9yaWFsPC90aXRsZT48bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc1LjIiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0iYXJ0aWNsZSIgdGl0bGU9IkQtQnVzIFR1dG9yaWFsIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJpbmRleCI+PC9hPkQtQnVzIFR1dG9yaWFsPC9oMj48L2Rpdj48ZGl2PjxkaXYgY2xhc3M9ImF1dGhvcmdyb3VwIj48ZGl2IGNsYXNzPSJhdXRob3IiPjxoMyBjbGFzcz0iYXV0aG9yIj48c3BhbiBjbGFzcz0iZmlyc3RuYW1lIj5IYXZvYzwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPlBlbm5pbmd0b248L3NwYW4+PC9oMz48ZGl2IGNsYXNzPSJhZmZpbGlhdGlvbiI+PHNwYW4gY2xhc3M9Im9yZ25hbWUiPlJlZCBIYXQsIEluYy48YnI+PC9zcGFuPjxkaXYgY2xhc3M9ImFkZHJlc3MiPjxwPjxjb2RlIGNsYXNzPSJlbWFpbCI+Jmx0OzxhIGNsYXNzPSJlbWFpbCIgaHJlZj0ibWFpbHRvOmhwQHBvYm94LmNvbSI+aHBAcG9ib3guY29tPC9hPiZndDs8L2NvZGU+PC9wPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImF1dGhvciI+PGgzIGNsYXNzPSJhdXRob3IiPjxzcGFuIGNsYXNzPSJmaXJzdG5hbWUiPkRhdmlkPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3VybmFtZSI+V2hlZWxlcjwvc3Bhbj48L2gzPjwvZGl2PjxkaXYgY2xhc3M9ImF1dGhvciI+PGgzIGNsYXNzPSJhdXRob3IiPjxzcGFuIGNsYXNzPSJmaXJzdG5hbWUiPkpvaG48L3NwYW4+IDxzcGFuIGNsYXNzPSJzdXJuYW1lIj5QYWxtaWVyaTwvc3Bhbj48L2gzPjxkaXYgY2xhc3M9ImFmZmlsaWF0aW9uIj48c3BhbiBjbGFzcz0ib3JnbmFtZSI+UmVkIEhhdCwgSW5jLjxicj48L3NwYW4+PGRpdiBjbGFzcz0iYWRkcmVzcyI+PHA+PGNvZGUgY2xhc3M9ImVtYWlsIj4mbHQ7PGEgY2xhc3M9ImVtYWlsIiBocmVmPSJtYWlsdG86am9obnBAcmVkaGF0LmNvbSI+am9obnBAcmVkaGF0LmNvbTwvYT4mZ3Q7PC9jb2RlPjwvcD48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJhdXRob3IiPjxoMyBjbGFzcz0iYXV0aG9yIj48c3BhbiBjbGFzcz0iZmlyc3RuYW1lIj5Db2xpbjwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPldhbHRlcnM8L3NwYW4+PC9oMz48ZGl2IGNsYXNzPSJhZmZpbGlhdGlvbiI+PHNwYW4gY2xhc3M9Im9yZ25hbWUiPlJlZCBIYXQsIEluYy48YnI+PC9zcGFuPjxkaXYgY2xhc3M9ImFkZHJlc3MiPjxwPjxjb2RlIGNsYXNzPSJlbWFpbCI+Jmx0OzxhIGNsYXNzPSJlbWFpbCIgaHJlZj0ibWFpbHRvOndhbHRlcnNAcmVkaGF0LmNvbSI+d2FsdGVyc0ByZWRoYXQuY29tPC9hPiZndDs8L2NvZGU+PC9wPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXY+PHAgY2xhc3M9InJlbGVhc2VpbmZvIj5WZXJzaW9uIDAuNS4wPC9wPjwvZGl2PjwvZGl2Pjxocj48L2Rpdj48ZGl2IGNsYXNzPSJ0b2MiPjxwPjxiPlRhYmxlIG9mIENvbnRlbnRzPC9iPjwvcD48ZGw+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI21ldGEiPlR1dG9yaWFsIFdvcmsgSW4gUHJvZ3Jlc3M8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI3doYXRpcyI+V2hhdCBpcyBELUJ1cz88L2E+PC9zcGFuPjwvZHQ+PGRkPjxkbD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjdXNlcyI+RC1CdXMgYXBwbGljYXRpb25zPC9hPjwvc3Bhbj48L2R0PjwvZGw+PC9kZD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QxIj48YSBocmVmPSIjY29uY2VwdHMiPkNvbmNlcHRzPC9hPjwvc3Bhbj48L2R0PjxkZD48ZGw+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI29iamVjdHMiPk5hdGl2ZSBPYmplY3RzIGFuZCBPYmplY3QgUGF0aHM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI21lbWJlcnMiPk1ldGhvZHMgYW5kIFNpZ25hbHM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2ludGVyZmFjZXMiPkludGVyZmFjZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI3Byb3hpZXMiPlByb3hpZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2J1cy1uYW1lcyI+QnVzIE5hbWVzPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNhZGRyZXNzZXMiPkFkZHJlc3NlczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjYmlncGljdHVyZSI+QmlnIENvbmNlcHR1YWwgUGljdHVyZTwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjbWVzc2FnZXMiPk1lc3NhZ2VzIC0gQmVoaW5kIHRoZSBTY2VuZXM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2NhbGxwcm9jZWR1cmUiPkNhbGxpbmcgYSBNZXRob2QgLSBCZWhpbmQgdGhlIFNjZW5lczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjc2lnbmFscHJvY2VkdXJlIj5FbWl0dGluZyBhIFNpZ25hbCAtIEJlaGluZCB0aGUgU2NlbmVzPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNpbnRyb3NwZWN0aW9uIj5JbnRyb3NwZWN0aW9uPC9hPjwvc3Bhbj48L2R0PjwvZGw+PC9kZD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QxIj48YSBocmVmPSIjZ2xpYi1jbGllbnQiPkdMaWIgQVBJOiBVc2luZyBSZW1vdGUgT2JqZWN0czwvYT48L3NwYW4+PC9kdD48ZGQ+PGRsPjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNnbGliLXR5cGVtYXBwaW5ncyI+RC1CdXMgLSBHTGliIHR5cGUgbWFwcGluZ3M8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI3NhbXBsZS1wcm9ncmFtLTEiPkEgc2FtcGxlIHByb2dyYW08L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2dsaWItcHJvZ3JhbS1zZXR1cCI+UHJvZ3JhbSBpbml0YWxpemF0aW9uPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNnbGliLW1ldGhvZC1pbnZvY2F0aW9uIj5VbmRlcnN0YW5kaW5nIG1ldGhvZCBpbnZvY2F0aW9uPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNnbGliLXNpZ25hbC1jb25uZWN0aW9uIj5Db25uZWN0aW5nIHRvIG9iamVjdCBzaWduYWxzPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDIiPjxhIGhyZWY9IiNnbGliLWVycm9yLWhhbmRsaW5nIj5FcnJvciBoYW5kbGluZyBhbmQgcmVtb3RlIGV4Y2VwdGlvbnM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MiI+PGEgaHJlZj0iI2dsaWItbW9yZS1leGFtcGxlcyI+TW9yZSBleGFtcGxlcyBvZiBtZXRob2QgaW52b2NhdGlvbjwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjZ2xpYi1nZW5lcmF0ZWQtYmluZGluZ3MiPkdlbmVyYXRlZCBCaW5kaW5nczwvYT48L3NwYW4+PC9kdD48L2RsPjwvZGQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI2dsaWItc2VydmVyIj5HTGliIEFQSTogSW1wbGVtZW50aW5nIE9iamVjdHM8L2E+PC9zcGFuPjwvZHQ+PGRkPjxkbD48ZHQ+PHNwYW4gY2xhc3M9InNlY3QyIj48YSBocmVmPSIjZ2xpYi1hbm5vdGF0aW9ucyI+U2VydmVyLXNpZGUgQW5ub3RhdGlvbnM8L2E+PC9zcGFuPjwvZHQ+PC9kbD48L2RkPjxkdD48c3BhbiBjbGFzcz0ic2VjdDEiPjxhIGhyZWY9IiNweXRob24tY2xpZW50Ij5QeXRob24gQVBJPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdDEiPjxhIGhyZWY9IiNxdC1jbGllbnQiPlF0IEFQSTogVXNpbmcgUmVtb3RlIE9iamVjdHM8L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0MSI+PGEgaHJlZj0iI3F0LXNlcnZlciI+UXQgQVBJOiBJbXBsZW1lbnRpbmcgT2JqZWN0czwvYT48L3NwYW4+PC9kdD48L2RsPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iVHV0b3JpYWwgV29yayBJbiBQcm9ncmVzcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJtZXRhIj48L2E+VHV0b3JpYWwgV29yayBJbiBQcm9ncmVzczwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBUaGlzIHR1dG9yaWFsIGlzIG5vdCBjb21wbGV0ZTsgaXQgcHJvYmFibHkgY29udGFpbnMgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24sIGJ1dCAKKyAgICAgIGFsc28gaGFzIHBsZW50eSBvZiBnYXBzLiBSaWdodCBub3csIHlvdSdsbCBhbHNvIG5lZWQgdG8gcmVmZXIgdG8gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24sCisgICAgICBEb3h5Z2VuIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uLCBhbmQgbG9vayBhdCBzb21lIGV4YW1wbGVzIG9mIGhvdyBvdGhlciBhcHBzIHVzZSBELUJ1cy4KKyAgICA8L3A+PHA+CisgICAgICBFbmhhbmNpbmcgdGhlIHR1dG9yaWFsIGlzIGRlZmluaXRlbHkgZW5jb3VyYWdlZCAtIHNlbmQgeW91ciBwYXRjaGVzIG9yIHN1Z2dlc3Rpb25zIHRvIHRoZQorICAgICAgbWFpbGluZyBsaXN0LiBJZiB5b3UgY3JlYXRlIGEgRC1CdXMgYmluZGluZywgcGxlYXNlIGFkZCBhIHNlY3Rpb24gdG8gdGhlIHR1dG9yaWFsIGZvciB5b3VyIAorICAgICAgYmluZGluZywgaWYgb25seSBhIHNob3J0IHNlY3Rpb24gd2l0aCBhIGNvdXBsZSBvZiBleGFtcGxlcy4KKyAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJXaGF0IGlzIEQtQnVzPyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJ3aGF0aXMiPjwvYT5XaGF0IGlzIEQtQnVzPzwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBELUJ1cyBpcyBhIHN5c3RlbSBmb3IgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uPC9lbT4KKyAgICAgIChJUEMpLiBBcmNoaXRlY3R1cmFsbHksIGl0IGhhcyBzZXZlcmFsIGxheWVyczoKKworICAgICAgPC9wPjxkaXYgY2xhc3M9Iml0ZW1pemVkbGlzdCI+PHVsIGNsYXNzPSJpdGVtaXplZGxpc3QiIHR5cGU9ImRpc2MiPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgQSBsaWJyYXJ5LCA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+bGliZGJ1czwvZW0+LCB0aGF0IGFsbG93cyB0d28KKyAgICAgICAgICAgIGFwcGxpY2F0aW9ucyB0byBjb25uZWN0IHRvIGVhY2ggb3RoZXIgYW5kIGV4Y2hhbmdlIG1lc3NhZ2VzLgorICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgQSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+bWVzc2FnZSBidXMgZGFlbW9uPC9lbT4gZXhlY3V0YWJsZSwgYnVpbHQgb24KKyAgICAgICAgICAgIGxpYmRidXMsIHRoYXQgbXVsdGlwbGUgYXBwbGljYXRpb25zIGNhbiBjb25uZWN0IHRvLiBUaGUgZGFlbW9uIGNhbgorICAgICAgICAgICAgcm91dGUgbWVzc2FnZXMgZnJvbSBvbmUgYXBwbGljYXRpb24gdG8gemVybyBvciBtb3JlIG90aGVyCisgICAgICAgICAgICBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+V3JhcHBlciBsaWJyYXJpZXM8L2VtPiBvciA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+YmluZGluZ3M8L2VtPiAKKyAgICAgICAgICAgIGJhc2VkIG9uIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gZnJhbWV3b3Jrcy4gIEZvciBleGFtcGxlLCBsaWJkYnVzLWdsaWIgYW5kCisgICAgICAgICAgICBsaWJkYnVzLXF0LiBUaGVyZSBhcmUgYWxzbyBiaW5kaW5ncyB0byBsYW5ndWFnZXMgc3VjaCBhcworICAgICAgICAgICAgUHl0aG9uLiBUaGVzZSB3cmFwcGVyIGxpYnJhcmllcyBhcmUgdGhlIEFQSSBtb3N0IHBlb3BsZSBzaG91bGQgdXNlLAorICAgICAgICAgICAgYXMgdGhleSBzaW1wbGlmeSB0aGUgZGV0YWlscyBvZiBELUJ1cyBwcm9ncmFtbWluZy4gbGliZGJ1cyBpcyAKKyAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIGEgbG93LWxldmVsIGJhY2tlbmQgZm9yIHRoZSBoaWdoZXIgbGV2ZWwgYmluZGluZ3MuCisgICAgICAgICAgICBNdWNoIG9mIHRoZSBsaWJkYnVzIEFQSSBpcyBvbmx5IHVzZWZ1bCBmb3IgYmluZGluZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgIDwvcD48cD4KKyAgICAgIGxpYmRidXMgb25seSBzdXBwb3J0cyBvbmUtdG8tb25lIGNvbm5lY3Rpb25zLCBqdXN0IGxpa2UgYSByYXcgbmV0d29yaworICAgICAgc29ja2V0LiBIb3dldmVyLCByYXRoZXIgdGhhbiBzZW5kaW5nIGJ5dGUgc3RyZWFtcyBvdmVyIHRoZSBjb25uZWN0aW9uLCB5b3UKKyAgICAgIHNlbmQgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm1lc3NhZ2VzPC9lbT4uIE1lc3NhZ2VzIGhhdmUgYSBoZWFkZXIgaWRlbnRpZnlpbmcKKyAgICAgIHRoZSBraW5kIG9mIG1lc3NhZ2UsIGFuZCBhIGJvZHkgY29udGFpbmluZyBhIGRhdGEgcGF5bG9hZC4gbGliZGJ1cyBhbHNvCisgICAgICBhYnN0cmFjdHMgdGhlIGV4YWN0IHRyYW5zcG9ydCB1c2VkIChzb2NrZXRzIHZzLiB3aGF0ZXZlciBlbHNlKSwgYW5kCisgICAgICBoYW5kbGVzIGRldGFpbHMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbi4KKyAgICA8L3A+PHA+CisgICAgICBUaGUgbWVzc2FnZSBidXMgZGFlbW9uIGZvcm1zIHRoZSBodWIgb2YgYSB3aGVlbC4gRWFjaCBzcG9rZSBvZiB0aGUgd2hlZWwKKyAgICAgIGlzIGEgb25lLXRvLW9uZSBjb25uZWN0aW9uIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGxpYmRidXMuICBBbgorICAgICAgYXBwbGljYXRpb24gc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBidXMgZGFlbW9uIG92ZXIgaXRzIHNwb2tlLCBhbmQgdGhlIGJ1cworICAgICAgZGFlbW9uIGZvcndhcmRzIHRoZSBtZXNzYWdlIHRvIG90aGVyIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgYXMKKyAgICAgIGFwcHJvcHJpYXRlLiBUaGluayBvZiB0aGUgZGFlbW9uIGFzIGEgcm91dGVyLgorICAgIDwvcD48cD4KKyAgICAgIFRoZSBidXMgZGFlbW9uIGhhcyBtdWx0aXBsZSBpbnN0YW5jZXMgb24gYSB0eXBpY2FsIGNvbXB1dGVyLiAgVGhlCisgICAgICBmaXJzdCBpbnN0YW5jZSBpcyBhIG1hY2hpbmUtZ2xvYmFsIHNpbmdsZXRvbiwgdGhhdCBpcywgYSBzeXN0ZW0gZGFlbW9uCisgICAgICBzaW1pbGFyIHRvIHNlbmRtYWlsIG9yIEFwYWNoZS4gVGhpcyBpbnN0YW5jZSBoYXMgaGVhdnkgc2VjdXJpdHkKKyAgICAgIHJlc3RyaWN0aW9ucyBvbiB3aGF0IG1lc3NhZ2VzIGl0IHdpbGwgYWNjZXB0LCBhbmQgaXMgdXNlZCBmb3Igc3lzdGVtd2lkZQorICAgICAgY29tbXVuaWNhdGlvbi4gVGhlIG90aGVyIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbmUgcGVyIHVzZXIgbG9naW4gc2Vzc2lvbi4KKyAgICAgIFRoZXNlIGluc3RhbmNlcyBhbGxvdyBhcHBsaWNhdGlvbnMgaW4gdGhlIHVzZXIncyBzZXNzaW9uIHRvIGNvbW11bmljYXRlIAorICAgICAgd2l0aCBvbmUgYW5vdGhlci4KKyAgICA8L3A+PHA+CisgICAgICBUaGUgc3lzdGVtd2lkZSBhbmQgcGVyLXVzZXIgZGFlbW9ucyBhcmUgc2VwYXJhdGUuICBOb3JtYWwgd2l0aGluLXNlc3Npb24KKyAgICAgIElQQyBkb2VzIG5vdCBpbnZvbHZlIHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzIHByb2Nlc3MgYW5kIHZpY2UgdmVyc2EuCisgICAgPC9wPjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iRC1CdXMgYXBwbGljYXRpb25zIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJ1c2VzIj48L2E+RC1CdXMgYXBwbGljYXRpb25zPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlcmUgYXJlIG1hbnksIG1hbnkgdGVjaG5vbG9naWVzIGluIHRoZSB3b3JsZCB0aGF0IGhhdmUgIkludGVyLXByb2Nlc3MKKyAgICAgICAgY29tbXVuaWNhdGlvbiIgb3IgIm5ldHdvcmtpbmciIGluIHRoZWlyIHN0YXRlZCBwdXJwb3NlOiA8YSBjbGFzcz0idWxpbmsiIGhyZWY9Imh0dHA6Ly93d3cub21nLm9yZyIgdGFyZ2V0PSJfdG9wIj5DT1JCQTwvYT4sIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL2RjZS8iIHRhcmdldD0iX3RvcCI+RENFPC9hPiwgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vY29tLyIgdGFyZ2V0PSJfdG9wIj5EQ09NPC9hPiwgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmtkZS5vcmcvZG9jdW1lbnRhdGlvbi9saWJyYXJ5L2tkZXF0L2Rjb3AuaHRtbCIgdGFyZ2V0PSJfdG9wIj5EQ09QPC9hPiwgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vd3d3LnhtbHJwYy5jb20iIHRhcmdldD0iX3RvcCI+WE1MLVJQQzwvYT4sIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvU09BUC8iIHRhcmdldD0iX3RvcCI+U09BUDwvYT4sIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy5tYnVzLm9yZy8iIHRhcmdldD0iX3RvcCI+TUJVUzwvYT4sIDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iaHR0cDovL3d3dy56ZXJvYy5jb20vaWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+SW50ZXJuZXQgQ29tbXVuaWNhdGlvbnMgRW5naW5lIChJQ0UpPC9hPiwKKyAgICAgICAgYW5kIHByb2JhYmx5IGh1bmRyZWRzIG1vcmUuCisgICAgICAgIEVhY2ggb2YgdGhlc2UgaXMgdGFpbG9yZWQgZm9yIHBhcnRpY3VsYXIga2luZHMgb2YgYXBwbGljYXRpb24uCisgICAgICAgIEQtQnVzIGlzIGRlc2lnbmVkIGZvciB0d28gc3BlY2lmaWMgY2FzZXM6CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgQ29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRlc2t0b3AgYXBwbGljYXRpb25zIGluIHRoZSBzYW1lIGRlc2t0b3AKKyAgICAgICAgICAgICAgc2Vzc2lvbjsgdG8gYWxsb3cgaW50ZWdyYXRpb24gb2YgdGhlIGRlc2t0b3Agc2Vzc2lvbiBhcyBhIHdob2xlLAorICAgICAgICAgICAgICBhbmQgYWRkcmVzcyBpc3N1ZXMgb2YgcHJvY2VzcyBsaWZlY3ljbGUgKHdoZW4gZG8gZGVza3RvcCBjb21wb25lbnRzIAorICAgICAgICAgICAgICBzdGFydCBhbmQgc3RvcCBydW5uaW5nKS4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRlc2t0b3Agc2Vzc2lvbiBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIAorICAgICAgICAgICAgICB3aGVyZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3b3VsZCB0eXBpY2FsbHkgaW5jbHVkZSB0aGUga2VybmVsIAorICAgICAgICAgICAgICBhbmQgYW55IHN5c3RlbSBkYWVtb25zIG9yIHByb2Nlc3Nlcy4KKyAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICA8L3A+PHA+CisgICAgICAgIEZvciB0aGUgd2l0aGluLWRlc2t0b3Atc2Vzc2lvbiB1c2UgY2FzZSwgdGhlIEdOT01FIGFuZCBLREUgZGVza3RvcHMgCisgICAgICAgIGhhdmUgc2lnbmlmaWNhbnQgcHJldmlvdXMgZXhwZXJpZW5jZSB3aXRoIGRpZmZlcmVudCBJUEMgc29sdXRpb25zCisgICAgICAgIHN1Y2ggYXMgQ09SQkEgYW5kIERDT1AuIEQtQnVzIGlzIGJ1aWx0IG9uIHRoYXQgZXhwZXJpZW5jZSBhbmQgCisgICAgICAgIGNhcmVmdWxseSB0YWlsb3JlZCB0byBtZWV0IHRoZSBuZWVkcyBvZiB0aGVzZSBkZXNrdG9wIHByb2plY3RzIAorICAgICAgICBpbiBwYXJ0aWN1bGFyLiBELUJ1cyBtYXkgb3IgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBmb3Igb3RoZXIgCisgICAgICAgIGFwcGxpY2F0aW9uczsgdGhlIEZBUSBoYXMgc29tZSBjb21wYXJpc29ucyB0byBvdGhlciBJUEMgc3lzdGVtcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgVGhlIHByb2JsZW0gc29sdmVkIGJ5IHRoZSBzeXN0ZW13aWRlIG9yIGNvbW11bmljYXRpb24td2l0aC10aGUtT1MgY2FzZSAKKyAgICAgICAgaXMgZXhwbGFpbmVkIHdlbGwgYnkgdGhlIGZvbGxvd2luZyB0ZXh0IGZyb20gdGhlIExpbnV4IEhvdHBsdWcgcHJvamVjdDoKKyAgICAgICAgPC9wPjxkaXYgY2xhc3M9ImJsb2NrcXVvdGUiPjxibG9ja3F1b3RlIGNsYXNzPSJibG9ja3F1b3RlIj48cD4KKyAgICAgICAgICAgQSBnYXAgaW4gY3VycmVudCBMaW51eCBzdXBwb3J0IGlzIHRoYXQgcG9saWNpZXMgd2l0aCBhbnkgc29ydCBvZgorICAgICAgICAgICBkeW5hbWljICJpbnRlcmFjdCB3aXRoIHVzZXIiIGNvbXBvbmVudCBhcmVuJ3QgY3VycmVudGx5CisgICAgICAgICAgIHN1cHBvcnRlZC4gRm9yIGV4YW1wbGUsIHRoYXQncyBvZnRlbiBuZWVkZWQgdGhlIGZpcnN0IHRpbWUgYSBuZXR3b3JrCisgICAgICAgICAgIGFkYXB0ZXIgb3IgcHJpbnRlciBpcyBjb25uZWN0ZWQsIGFuZCB0byBkZXRlcm1pbmUgYXBwcm9wcmlhdGUgcGxhY2VzCisgICAgICAgICAgIHRvIG1vdW50IGRpc2sgZHJpdmVzLiBJdCB3b3VsZCBzZWVtIHRoYXQgc3VjaCBhY3Rpb25zIGNvdWxkIGJlCisgICAgICAgICAgIHN1cHBvcnRlZCBmb3IgYW55IGNhc2Ugd2hlcmUgYSByZXNwb25zaWJsZSBodW1hbiBjYW4gYmUgaWRlbnRpZmllZDoKKyAgICAgICAgICAgc2luZ2xlIHVzZXIgd29ya3N0YXRpb25zLCBvciBhbnkgc3lzdGVtIHdoaWNoIGlzIHJlbW90ZWx5CisgICAgICAgICAgIGFkbWluaXN0ZXJlZC4KKyAgICAgICAgICA8L3A+PHA+CisgICAgICAgICAgICBUaGlzIGlzIGEgY2xhc3NpYyAicmVtb3RlIHN5c2FkbWluIiBwcm9ibGVtLCB3aGVyZSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIGhvdHBsdWdnaW5nIG5lZWRzIHRvIGRlbGl2ZXIgYW4gZXZlbnQgZnJvbSBvbmUgc2VjdXJpdHkgZG9tYWluCisgICAgICAgICAgICAob3BlcmF0aW5nIHN5c3RlbSBrZXJuZWwsIGluIHRoaXMgY2FzZSkgdG8gYW5vdGhlciAoZGVza3RvcCBmb3IKKyAgICAgICAgICAgIGxvZ2dlZC1pbiB1c2VyLCBvciByZW1vdGUgc3lzYWRtaW4pLiBBbnkgZWZmZWN0aXZlIHJlc3BvbnNlIG11c3QgZ28KKyAgICAgICAgICAgIHRoZSBvdGhlciB3YXk6IHRoZSByZW1vdGUgZG9tYWluIHRha2luZyBzb21lIGFjdGlvbiB0aGF0IGxldHMgdGhlCisgICAgICAgICAgICBrZXJuZWwgZXhwb3NlIHRoZSBkZXNpcmVkIGRldmljZSBjYXBhYmlsaXRpZXMuIChUaGUgYWN0aW9uIGNhbiBvZnRlbgorICAgICAgICAgICAgYmUgdGFrZW4gYXN5bmNocm9ub3VzbHksIGZvciBleGFtcGxlIGxldHRpbmcgbmV3IGhhcmR3YXJlIGJlIGlkbGUKKyAgICAgICAgICAgIHVudGlsIGEgbWVldGluZyBmaW5pc2hlcy4pIEF0IHRoaXMgd3JpdGluZywgTGludXggZG9lc24ndCBoYXZlCisgICAgICAgICAgICB3aWRlbHkgYWRvcHRlZCBzb2x1dGlvbnMgdG8gc3VjaCBwcm9ibGVtcy4gSG93ZXZlciwgdGhlIG5ldyBELUJ1cworICAgICAgICAgICAgd29yayBtYXkgYmVnaW4gdG8gc29sdmUgdGhhdCBwcm9ibGVtLgorICAgICAgICAgIDwvcD48L2Jsb2NrcXVvdGU+PC9kaXY+PHA+CisgICAgICA8L3A+PHA+CisgICAgICAgIEQtQnVzIG1heSBoYXBwZW4gdG8gYmUgdXNlZnVsIGZvciBwdXJwb3NlcyBvdGhlciB0aGFuIHRoZSBvbmUgaXQgd2FzCisgICAgICAgIGRlc2lnbmVkIGZvci4gSXRzIGdlbmVyYWwgcHJvcGVydGllcyB0aGF0IGRpc3Rpbmd1aXNoIGl0IGZyb20gCisgICAgICAgIG90aGVyIGZvcm1zIG9mIElQQyBhcmU6CisgICAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgQmluYXJ5IHByb3RvY29sIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXN5bmNocm9ub3VzbHkgCisgICAgICAgICAgICAgIChzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgWCBXaW5kb3cgU3lzdGVtIHByb3RvY29sKS4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBTdGF0ZWZ1bCwgcmVsaWFibGUgY29ubmVjdGlvbnMgaGVsZCBvcGVuIG92ZXIgdGltZS4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgaXMgYSBkYWVtb24sIG5vdCBhICJzd2FybSIgb3IgCisgICAgICAgICAgICAgIGRpc3RyaWJ1dGVkIGFyY2hpdGVjdHVyZS4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBNYW55IGltcGxlbWVudGF0aW9uIGFuZCBkZXBsb3ltZW50IGlzc3VlcyBhcmUgc3BlY2lmaWVkIHJhdGhlcgorICAgICAgICAgICAgICB0aGFuIGxlZnQgYW1iaWd1b3VzL2NvbmZpZ3VyYWJsZS9wbHVnZ2FibGUuCisgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgU2VtYW50aWNzIGFyZSBzaW1pbGFyIHRvIHRoZSBleGlzdGluZyBEQ09QIHN5c3RlbSwgYWxsb3dpbmcgCisgICAgICAgICAgICAgIEtERSB0byBhZG9wdCBpdCBtb3JlIGVhc2lseS4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBTZWN1cml0eSBmZWF0dXJlcyB0byBzdXBwb3J0IHRoZSBzeXN0ZW13aWRlIG1vZGUgb2YgdGhlIAorICAgICAgICAgICAgICBtZXNzYWdlIGJ1cy4KKyAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICA8L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJDb25jZXB0cyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJjb25jZXB0cyI+PC9hPkNvbmNlcHRzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIFNvbWUgYmFzaWMgY29uY2VwdHMgYXBwbHkgbm8gbWF0dGVyIHdoYXQgYXBwbGljYXRpb24gZnJhbWV3b3JrIHlvdSdyZQorICAgICAgdXNpbmcgdG8gd3JpdGUgYSBELUJ1cyBhcHBsaWNhdGlvbi4gVGhlIGV4YWN0IGNvZGUgeW91IHdyaXRlIHdpbGwgYmUKKyAgICAgIGRpZmZlcmVudCBmb3IgR0xpYiB2cy4gUXQgdnMuIFB5dGhvbiBhcHBsaWNhdGlvbnMsIGhvd2V2ZXIuCisgICAgPC9wPjxwPgorICAgICAgSGVyZSBpcyBhIGRpYWdyYW0gKDxhIGNsYXNzPSJ1bGluayIgaHJlZj0iZGlhZ3JhbS5wbmciIHRhcmdldD0iX3RvcCI+cG5nPC9hPiA8YSBjbGFzcz0idWxpbmsiIGhyZWY9ImRpYWdyYW0uc3ZnIiB0YXJnZXQ9Il90b3AiPnN2ZzwvYT4pIHRoYXQgbWF5IGhlbHAgeW91IHZpc3VhbGl6ZSB0aGUgY29uY2VwdHMKKyAgICAgIHRoYXQgZm9sbG93LgorICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9Ik5hdGl2ZSBPYmplY3RzIGFuZCBPYmplY3QgUGF0aHMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9Im9iamVjdHMiPjwvYT5OYXRpdmUgT2JqZWN0cyBhbmQgT2JqZWN0IFBhdGhzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgWW91ciBwcm9ncmFtbWluZyBmcmFtZXdvcmsgcHJvYmFibHkgZGVmaW5lcyB3aGF0IGFuICJvYmplY3QiIGlzIGxpa2U7CisgICAgICAgIHVzdWFsbHkgd2l0aCBhIGJhc2UgY2xhc3MuIEZvciBleGFtcGxlOiBqYXZhLmxhbmcuT2JqZWN0LCBHT2JqZWN0LCBRT2JqZWN0LAorICAgICAgICBweXRob24ncyBiYXNlIE9iamVjdCwgb3Igd2hhdGV2ZXIuIExldCdzIGNhbGwgdGhpcyBhIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5uYXRpdmUgb2JqZWN0PC9lbT4uCisgICAgICA8L3A+PHA+CisgICAgICAgIFRoZSBsb3ctbGV2ZWwgRC1CdXMgcHJvdG9jb2wsIGFuZCBjb3JyZXNwb25kaW5nIGxpYmRidXMgQVBJLCBkb2VzIG5vdCBjYXJlIGFib3V0IG5hdGl2ZSBvYmplY3RzLiAKKyAgICAgICAgSG93ZXZlciwgaXQgcHJvdmlkZXMgYSBjb25jZXB0IGNhbGxlZCBhbiAKKyAgICAgICAgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm9iamVjdCBwYXRoPC9lbT4uIFRoZSBpZGVhIG9mIGFuIG9iamVjdCBwYXRoIGlzIHRoYXQgCisgICAgICAgIGhpZ2hlci1sZXZlbCBiaW5kaW5ncyBjYW4gbmFtZSBuYXRpdmUgb2JqZWN0IGluc3RhbmNlcywgYW5kIGFsbG93IHJlbW90ZSBhcHBsaWNhdGlvbnMgCisgICAgICAgIHRvIHJlZmVyIHRvIHRoZW0uCisgICAgICA8L3A+PHA+CisgICAgICAgIFRoZSBvYmplY3QgcGF0aAorICAgICAgICBsb29rcyBsaWtlIGEgZmlsZXN5c3RlbSBwYXRoLCBmb3IgZXhhbXBsZSBhbiBvYmplY3QgY291bGQgYmUgCisgICAgICAgIG5hbWVkIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj4vb3JnL2tkZS9rc3ByZWFkL3NoZWV0cy8zL2NlbGxzLzQvNTwvY29kZT4uIAorICAgICAgICBIdW1hbi1yZWFkYWJsZSBwYXRocyBhcmUgbmljZSwgYnV0IHlvdSBhcmUgZnJlZSB0byBjcmVhdGUgYW4gCisgICAgICAgIG9iamVjdCBuYW1lZCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+L2NvbS9teWNvbXBhbnkvYzV5bzgxN3kwYzF5MWM1YjwvY29kZT4gCisgICAgICAgIGlmIGl0IG1ha2VzIHNlbnNlIGZvciB5b3VyIGFwcGxpY2F0aW9uLgorICAgICAgPC9wPjxwPgorICAgICAgICBOYW1lc3BhY2luZyBvYmplY3QgcGF0aHMgaXMgc21hcnQsIGJ5IHN0YXJ0aW5nIHRoZW0gd2l0aCB0aGUgY29tcG9uZW50cworICAgICAgICBvZiBhIGRvbWFpbiBuYW1lIHlvdSBvd24gKGUuZy4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPi9vcmcva2RlPC9jb2RlPikuIFRoaXMgCisgICAgICAgIGtlZXBzIGRpZmZlcmVudCBjb2RlIG1vZHVsZXMgaW4gdGhlIHNhbWUgcHJvY2VzcyBmcm9tIHN0ZXBwaW5nIAorICAgICAgICBvbiBvbmUgYW5vdGhlcidzIHRvZXMuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJNZXRob2RzIGFuZCBTaWduYWxzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJtZW1iZXJzIj48L2E+TWV0aG9kcyBhbmQgU2lnbmFsczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEVhY2ggb2JqZWN0IGhhcyA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+bWVtYmVyczwvZW0+OyB0aGUgdHdvIGtpbmRzIG9mIG1lbWJlcgorICAgICAgICBhcmUgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPm1ldGhvZHM8L2VtPiBhbmQKKyAgICAgICAgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPnNpZ25hbHM8L2VtPi4gTWV0aG9kcyBhcmUgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZQorICAgICAgICBpbnZva2VkIG9uIGFuIG9iamVjdCwgd2l0aCBvcHRpb25hbCBpbnB1dCAoYWthIGFyZ3VtZW50cyBvciAiaW4KKyAgICAgICAgcGFyYW1ldGVycyIpIGFuZCBvdXRwdXQgKGFrYSByZXR1cm4gdmFsdWVzIG9yICJvdXQgcGFyYW1ldGVycyIpLgorICAgICAgICBTaWduYWxzIGFyZSBicm9hZGNhc3RzIGZyb20gdGhlIG9iamVjdCB0byBhbnkgaW50ZXJlc3RlZCBvYnNlcnZlcnMgCisgICAgICAgIG9mIHRoZSBvYmplY3Q7IHNpZ25hbHMgbWF5IGNvbnRhaW4gYSBkYXRhIHBheWxvYWQuCisgICAgICA8L3A+PHA+CisgICAgICAgIEJvdGggbWV0aG9kcyBhbmQgc2lnbmFscyBhcmUgcmVmZXJyZWQgdG8gYnkgbmFtZSwgc3VjaCBhcyAKKyAgICAgICAgIkZyb2JhdGUiIG9yICJPbkNsaWNrZWQiLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iSW50ZXJmYWNlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iaW50ZXJmYWNlcyI+PC9hPkludGVyZmFjZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBFYWNoIG9iamVjdCBzdXBwb3J0cyBvbmUgb3IgbW9yZSA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+aW50ZXJmYWNlczwvZW0+LgorICAgICAgICBUaGluayBvZiBhbiBpbnRlcmZhY2UgYXMgYSBuYW1lZCBncm91cCBvZiBtZXRob2RzIGFuZCBzaWduYWxzLCAKKyAgICAgICAganVzdCBhcyBpdCBpcyBpbiBHTGliIG9yIFF0IG9yIEphdmEuIEludGVyZmFjZXMgZGVmaW5lIHRoZSAKKyAgICAgICAgPHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+dHlwZTwvZW0+PC9zcGFuPiBvZiBhbiBvYmplY3QgaW5zdGFuY2UuCisgICAgICA8L3A+PHA+CisgICAgICAgIERCdXMgaWRlbnRpZmllcyBpbnRlcmZhY2VzIHdpdGggYSBzaW1wbGUgbmFtZXNwYWNlZCBzdHJpbmcsCisgICAgICAgIHNvbWV0aGluZyBsaWtlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGU8L2NvZGU+LgorICAgICAgICBNb3N0IGJpbmRpbmdzIHdpbGwgbWFwIHRoZXNlIGludGVyZmFjZSBuYW1lcyBkaXJlY3RseSB0byAKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHByb2dyYW1taW5nIGxhbmd1YWdlIGNvbnN0cnVjdCwgZm9yIGV4YW1wbGUgCisgICAgICAgIHRvIEphdmEgaW50ZXJmYWNlcyBvciBDKysgcHVyZSB2aXJ0dWFsIGNsYXNzZXMuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJQcm94aWVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJwcm94aWVzIj48L2E+UHJveGllczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEEgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPnByb3h5IG9iamVjdDwvZW0+IGlzIGEgY29udmVuaWVudCBuYXRpdmUgb2JqZWN0IGNyZWF0ZWQgdG8gCisgICAgICAgIHJlcHJlc2VudCBhIHJlbW90ZSBvYmplY3QgaW4gYW5vdGhlciBwcm9jZXNzLiBUaGUgbG93LWxldmVsIERCdXMgQVBJIGludm9sdmVzIG1hbnVhbGx5IGNyZWF0aW5nIAorICAgICAgICBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIHNlbmRpbmcgaXQsIHRoZW4gbWFudWFsbHkgcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIAorICAgICAgICB0aGUgbWV0aG9kIHJlcGx5IG1lc3NhZ2UuIEhpZ2hlci1sZXZlbCBiaW5kaW5ncyBwcm92aWRlIHByb3hpZXMgYXMgYW4gYWx0ZXJuYXRpdmUuCisgICAgICAgIFByb3hpZXMgbG9vayBsaWtlIGEgbm9ybWFsIG5hdGl2ZSBvYmplY3Q7IGJ1dCB3aGVuIHlvdSBpbnZva2UgYSBtZXRob2Qgb24gdGhlIHByb3h5IAorICAgICAgICBvYmplY3QsIHRoZSBiaW5kaW5nIGNvbnZlcnRzIGl0IGludG8gYSBEQnVzIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIHdhaXRzIGZvciB0aGUgcmVwbHkgCisgICAgICAgIG1lc3NhZ2UsIHVucGFja3MgdGhlIHJldHVybiB2YWx1ZSwgYW5kIHJldHVybnMgaXQgZnJvbSB0aGUgbmF0aXZlIG1ldGhvZC4uCisgICAgICA8L3A+PHA+CisgICAgICAgIEluIHBzZXVkb2NvZGUsIHByb2dyYW1taW5nIHdpdGhvdXQgcHJveGllcyBtaWdodCBsb29rIGxpa2UgdGhpczoKKyAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgiL3JlbW90ZS9vYmplY3QvcGF0aCIsICJNZXRob2ROYW1lIiwgYXJnMSwgYXJnMik7CisgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0QnVzQ29ubmVjdGlvbigpOworICAgICAgICAgIGNvbm5lY3Rpb24uc2VuZChtZXNzYWdlKTsKKyAgICAgICAgICBNZXNzYWdlIHJlcGx5ID0gY29ubmVjdGlvbi53YWl0Rm9yUmVwbHkobWVzc2FnZSk7CisgICAgICAgICAgaWYgKHJlcGx5LmlzRXJyb3IoKSkgeworICAgICAgICAgICAgIAorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gcmVwbHkuZ2V0UmV0dXJuVmFsdWUoKTsKKyAgICAgICAgICB9CisgICAgICAgIDwvcHJlPjxwPgorICAgICAgPC9wPjxwPgorICAgICAgICBQcm9ncmFtbWluZyB3aXRoIHByb3hpZXMgbWlnaHQgbG9vayBsaWtlIHRoaXM6CisgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgICAgICAgICAgUHJveHkgcHJveHkgPSBuZXcgUHJveHkoZ2V0QnVzQ29ubmVjdGlvbigpLCAiL3JlbW90ZS9vYmplY3QvcGF0aCIpOworICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IHByb3h5Lk1ldGhvZE5hbWUoYXJnMSwgYXJnMik7CisgICAgICAgIDwvcHJlPjxwPgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iQnVzIE5hbWVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJidXMtbmFtZXMiPjwvYT5CdXMgTmFtZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBXaGVuIGVhY2ggYXBwbGljYXRpb24gY29ubmVjdHMgdG8gdGhlIGJ1cyBkYWVtb24sIHRoZSBkYWVtb24gaW1tZWRpYXRlbHkKKyAgICAgICAgYXNzaWducyBpdCBhIG5hbWUsIGNhbGxlZCB0aGUgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPnVuaXF1ZSBjb25uZWN0aW9uIG5hbWU8L2VtPi4KKyAgICAgICAgQSB1bmlxdWUgbmFtZSBiZWdpbnMgd2l0aCBhICc6JyAoY29sb24pIGNoYXJhY3Rlci4gVGhlc2UgbmFtZXMgYXJlIG5ldmVyIAorICAgICAgICByZXVzZWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgYnVzIGRhZW1vbiAtIHRoYXQgaXMsIHlvdSBrbm93IAorICAgICAgICBhIGdpdmVuIG5hbWUgd2lsbCBhbHdheXMgcmVmZXIgdG8gdGhlIHNhbWUgYXBwbGljYXRpb24uCisgICAgICAgIEFuIGV4YW1wbGUgb2YgYSB1bmlxdWUgbmFtZSBtaWdodCBiZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+OjM0LTkwNzwvY29kZT4uIFRoZSBudW1iZXJzIGFmdGVyIHRoZSBjb2xvbiBoYXZlIAorICAgICAgICBubyBtZWFuaW5nIG90aGVyIHRoYW4gdGhlaXIgdW5pcXVlbmVzcy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgV2hlbiBhIG5hbWUgaXMgbWFwcGVkIAorICAgICAgICB0byBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24ncyBjb25uZWN0aW9uLCB0aGF0IGFwcGxpY2F0aW9uIGlzIHNhaWQgdG8gCisgICAgICAgIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5vd248L2VtPiB0aGF0IG5hbWUuCisgICAgICA8L3A+PHA+CisgICAgICAgIEFwcGxpY2F0aW9ucyBtYXkgYXNrIHRvIG93biBhZGRpdGlvbmFsIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj53ZWxsLWtub3duCisgICAgICAgIG5hbWVzPC9lbT4uIEZvciBleGFtcGxlLCB5b3UgY291bGQgd3JpdGUgYSBzcGVjaWZpY2F0aW9uIHRvCisgICAgICAgIGRlZmluZSBhIG5hbWUgY2FsbGVkIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5jb20ubXljb21wYW55LlRleHRFZGl0b3I8L2NvZGU+LgorICAgICAgICBZb3VyIGRlZmluaXRpb24gY291bGQgc3BlY2lmeSB0aGF0IHRvIG93biB0aGlzIG5hbWUsIGFuIGFwcGxpY2F0aW9uCisgICAgICAgIHNob3VsZCBoYXZlIGFuIG9iamVjdCBhdCB0aGUgcGF0aAorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+L2NvbS9teWNvbXBhbnkvVGV4dEZpbGVNYW5hZ2VyPC9jb2RlPiBzdXBwb3J0aW5nIHRoZQorICAgICAgICBpbnRlcmZhY2UgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5GaWxlSGFuZGxlcjwvY29kZT4uCisgICAgICA8L3A+PHA+CisgICAgICAgIEFwcGxpY2F0aW9ucyBjb3VsZCB0aGVuIHNlbmQgbWVzc2FnZXMgdG8gdGhpcyBidXMgbmFtZSwgCisgICAgICAgIG9iamVjdCwgYW5kIGludGVyZmFjZSB0byBleGVjdXRlIG1ldGhvZCBjYWxscy4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgWW91IGNvdWxkIHRoaW5rIG9mIHRoZSB1bmlxdWUgbmFtZXMgYXMgSVAgYWRkcmVzc2VzLCBhbmQgdGhlCisgICAgICAgIHdlbGwta25vd24gbmFtZXMgYXMgZG9tYWluIG5hbWVzLiBTbworICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Y29tLm15Y29tcGFueS5UZXh0RWRpdG9yPC9jb2RlPiBtaWdodCBtYXAgdG8gc29tZXRoaW5nIGxpa2UKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPjozNC05MDc8L2NvZGU+IGp1c3QgYXMgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm15Y29tcGFueS5jb208L2NvZGU+IG1hcHMKKyAgICAgICAgdG8gc29tZXRoaW5nIGxpa2UgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPjE5Mi4xNjguMC41PC9jb2RlPi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgTmFtZXMgaGF2ZSBhIHNlY29uZCBpbXBvcnRhbnQgdXNlLCBvdGhlciB0aGFuIHJvdXRpbmcgbWVzc2FnZXMuICBUaGV5CisgICAgICAgIGFyZSB1c2VkIHRvIHRyYWNrIGxpZmVjeWNsZS4gV2hlbiBhbiBhcHBsaWNhdGlvbiBleGl0cyAob3IgY3Jhc2hlcyksIGl0cworICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cyB3aWxsIGJlIGNsb3NlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbQorICAgICAgICBrZXJuZWwuIFRoZSBtZXNzYWdlIGJ1cyB0aGVuIHNlbmRzIG91dCBub3RpZmljYXRpb24gbWVzc2FnZXMgdGVsbGluZworICAgICAgICByZW1haW5pbmcgYXBwbGljYXRpb25zIHRoYXQgdGhlIGFwcGxpY2F0aW9uJ3MgbmFtZXMgaGF2ZSBsb3N0IHRoZWlyCisgICAgICAgIG93bmVyLiBCeSB0cmFja2luZyB0aGVzZSBub3RpZmljYXRpb25zLCB5b3VyIGFwcGxpY2F0aW9uIGNhbiByZWxpYWJseQorICAgICAgICBtb25pdG9yIHRoZSBsaWZldGltZSBvZiBvdGhlciBhcHBsaWNhdGlvbnMuCisgICAgICA8L3A+PHA+CisgICAgICAgIEJ1cyBuYW1lcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvb3JkaW5hdGUgc2luZ2xlLWluc3RhbmNlIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgSWYgeW91IHdhbnQgdG8gYmUgc3VyZSBvbmx5IG9uZQorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Y29tLm15Y29tcGFueS5UZXh0RWRpdG9yPC9jb2RlPiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGZvcgorICAgICAgICBleGFtcGxlLCBoYXZlIHRoZSB0ZXh0IGVkaXRvciBhcHBsaWNhdGlvbiBleGl0IGlmIHRoZSBidXMgbmFtZSBhbHJlYWR5CisgICAgICAgIGhhcyBhbiBvd25lci4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IkFkZHJlc3NlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYWRkcmVzc2VzIj48L2E+QWRkcmVzc2VzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgQXBwbGljYXRpb25zIHVzaW5nIEQtQnVzIGFyZSBlaXRoZXIgc2VydmVycyBvciBjbGllbnRzLiAgQSBzZXJ2ZXIKKyAgICAgICAgbGlzdGVucyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnM7IGEgY2xpZW50IGNvbm5lY3RzIHRvIGEgc2VydmVyLiBPbmNlCisgICAgICAgIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBpdCBpcyBhIHN5bW1ldHJpYyBmbG93IG9mIG1lc3NhZ2VzOyB0aGUKKyAgICAgICAgY2xpZW50LXNlcnZlciBkaXN0aW5jdGlvbiBvbmx5IG1hdHRlcnMgd2hlbiBzZXR0aW5nIHVwIHRoZSAKKyAgICAgICAgY29ubmVjdGlvbi4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgSWYgeW91J3JlIHVzaW5nIHRoZSBidXMgZGFlbW9uLCBhcyB5b3UgcHJvYmFibHkgYXJlLCB5b3VyIGFwcGxpY2F0aW9uIAorICAgICAgICB3aWxsIGJlIGEgY2xpZW50IG9mIHRoZSBidXMgZGFlbW9uLiBUaGF0IGlzLCB0aGUgYnVzIGRhZW1vbiBsaXN0ZW5zIAorICAgICAgICBmb3IgY29ubmVjdGlvbnMgYW5kIHlvdXIgYXBwbGljYXRpb24gaW5pdGlhdGVzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVzIAorICAgICAgICBkYWVtb24uCisgICAgICA8L3A+PHA+CisgICAgICAgIEEgRC1CdXMgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmFkZHJlc3M8L2VtPiBzcGVjaWZpZXMgd2hlcmUgYSBzZXJ2ZXIgd2lsbAorICAgICAgICBsaXN0ZW4sIGFuZCB3aGVyZSBhIGNsaWVudCB3aWxsIGNvbm5lY3QuICBGb3IgZXhhbXBsZSwgdGhlIGFkZHJlc3MKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPnVuaXg6cGF0aD0vdG1wL2FiY2RlZjwvY29kZT4gc3BlY2lmaWVzIHRoYXQgdGhlIHNlcnZlciB3aWxsCisgICAgICAgIGxpc3RlbiBvbiBhIFVOSVggZG9tYWluIHNvY2tldCBhdCB0aGUgcGF0aAorICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+L3RtcC9hYmNkZWY8L2NvZGU+IGFuZCB0aGUgY2xpZW50IHdpbGwgY29ubmVjdCB0byB0aGF0CisgICAgICAgIHNvY2tldC4gQW4gYWRkcmVzcyBjYW4gYWxzbyBzcGVjaWZ5IFRDUC9JUCBzb2NrZXRzLCBvciBhbnkgb3RoZXIKKyAgICAgICAgdHJhbnNwb3J0IGRlZmluZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMgb2YgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgICAgICA8L3A+PHA+CisgICAgICAgIFdoZW4gdXNpbmcgRC1CdXMgd2l0aCBhIG1lc3NhZ2UgYnVzIGRhZW1vbiwKKyAgICAgICAgbGliZGJ1cyBhdXRvbWF0aWNhbGx5IGRpc2NvdmVycyB0aGUgYWRkcmVzcyBvZiB0aGUgcGVyLXNlc3Npb24gYnVzIAorICAgICAgICBkYWVtb24gYnkgcmVhZGluZyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gSXQgZGlzY292ZXJzIHRoZSAKKyAgICAgICAgc3lzdGVtd2lkZSBidXMgZGFlbW9uIGJ5IGNoZWNraW5nIGEgd2VsbC1rbm93biBVTklYIGRvbWFpbiBzb2NrZXQgcGF0aAorICAgICAgICAodGhvdWdoIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBhZGRyZXNzIHdpdGggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUpLgorICAgICAgPC9wPjxwPgorICAgICAgICBJZiB5b3UncmUgdXNpbmcgRC1CdXMgd2l0aG91dCBhIGJ1cyBkYWVtb24sIGl0J3MgdXAgdG8geW91IHRvIAorICAgICAgICBkZWZpbmUgd2hpY2ggYXBwbGljYXRpb24gd2lsbCBiZSB0aGUgc2VydmVyIGFuZCB3aGljaCB3aWxsIGJlIAorICAgICAgICB0aGUgY2xpZW50LCBhbmQgc3BlY2lmeSBhIG1lY2hhbmlzbSBmb3IgdGhlbSB0byBhZ3JlZSBvbiAKKyAgICAgICAgdGhlIHNlcnZlcidzIGFkZHJlc3MuIFRoaXMgaXMgYW4gdW51c3VhbCBjYXNlLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iQmlnIENvbmNlcHR1YWwgUGljdHVyZSI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYmlncGljdHVyZSI+PC9hPkJpZyBDb25jZXB0dWFsIFBpY3R1cmU8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBQdWxsaW5nIGFsbCB0aGVzZSBjb25jZXB0cyB0b2dldGhlciwgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgCisgICAgICAgIG1ldGhvZCBjYWxsIG9uIGEgcGFydGljdWxhciBvYmplY3QgaW5zdGFuY2UsIGEgbnVtYmVyIG9mIAorICAgICAgICBuZXN0ZWQgY29tcG9uZW50cyBoYXZlIHRvIGJlIG5hbWVkOgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAgICAgICAgIEFkZHJlc3MgLSZndDsgW0J1cyBOYW1lXSAtJmd0OyBQYXRoIC0mZ3Q7IEludGVyZmFjZSAtJmd0OyBNZXRob2QKKyAgICAgICAgPC9wcmU+PHA+CisgICAgICAgIFRoZSBidXMgbmFtZSBpcyBpbiBicmFja2V0cyB0byBpbmRpY2F0ZSB0aGF0IGl0J3Mgb3B0aW9uYWwgLS0geW91IG9ubHkKKyAgICAgICAgcHJvdmlkZSBhIG5hbWUgdG8gcm91dGUgdGhlIG1ldGhvZCBjYWxsIHRvIHRoZSByaWdodCBhcHBsaWNhdGlvbgorICAgICAgICB3aGVuIHVzaW5nIHRoZSBidXMgZGFlbW9uLiBJZiB5b3UgaGF2ZSBhIGRpcmVjdCBjb25uZWN0aW9uIHRvIGFub3RoZXIKKyAgICAgICAgYXBwbGljYXRpb24sIGJ1cyBuYW1lcyBhcmVuJ3QgdXNlZDsgdGhlcmUncyBubyBidXMgZGFlbW9uLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGFsc28gb3B0aW9uYWwsIHByaW1hcmlseSBmb3IgaGlzdG9yaWNhbCAKKyAgICAgICAgcmVhc29uczsgRENPUCBkb2VzIG5vdCByZXF1aXJlIHNwZWNpZnlpbmcgdGhlIGludGVyZmFjZSwgCisgICAgICAgIGluc3RlYWQgc2ltcGx5IGZvcmJpZGRpbmcgZHVwbGljYXRlIG1ldGhvZCBuYW1lcyAKKyAgICAgICAgb24gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLiBELUJ1cyB3aWxsIHRodXMgbGV0IHlvdSAKKyAgICAgICAgb21pdCB0aGUgaW50ZXJmYWNlLCBidXQgaWYgeW91ciBtZXRob2QgbmFtZSBpcyBhbWJpZ3VvdXMgCisgICAgICAgIGl0IGlzIHVuZGVmaW5lZCB3aGljaCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iTWVzc2FnZXMgLSBCZWhpbmQgdGhlIFNjZW5lcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ibWVzc2FnZXMiPjwvYT5NZXNzYWdlcyAtIEJlaGluZCB0aGUgU2NlbmVzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgRC1CdXMgd29ya3MgYnkgc2VuZGluZyBtZXNzYWdlcyBiZXR3ZWVuIHByb2Nlc3Nlcy4gSWYgeW91J3JlIHVzaW5nIAorICAgICAgICBhIHN1ZmZpY2llbnRseSBoaWdoLWxldmVsIGJpbmRpbmcsIHlvdSBtYXkgbmV2ZXIgd29yayB3aXRoIG1lc3NhZ2VzIGRpcmVjdGx5LgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGVyZSBhcmUgNCBtZXNzYWdlIHR5cGVzOgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIE1ldGhvZCBjYWxsIG1lc3NhZ2VzIGFzayB0byBpbnZva2UgYSBtZXRob2QgCisgICAgICAgICAgICAgIG9uIGFuIG9iamVjdC4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBNZXRob2QgcmV0dXJuIG1lc3NhZ2VzIHJldHVybiB0aGUgcmVzdWx0cyAKKyAgICAgICAgICAgICAgb2YgaW52b2tpbmcgYSBtZXRob2QuCisgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgRXJyb3IgbWVzc2FnZXMgcmV0dXJuIGFuIGV4Y2VwdGlvbiBjYXVzZWQgYnkgCisgICAgICAgICAgICAgIGludm9raW5nIGEgbWV0aG9kLgorICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFNpZ25hbCBtZXNzYWdlcyBhcmUgbm90aWZpY2F0aW9ucyB0aGF0IGEgZ2l2ZW4gc2lnbmFsIAorICAgICAgICAgICAgICBoYXMgYmVlbiBlbWl0dGVkICh0aGF0IGFuIGV2ZW50IGhhcyBvY2N1cnJlZCkuIAorICAgICAgICAgICAgICBZb3UgY291bGQgYWxzbyB0aGluayBvZiB0aGVzZSBhcyAiZXZlbnQiIG1lc3NhZ2VzLgorICAgICAgICAgICAgPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgQSBtZXRob2QgY2FsbCBtYXBzIHZlcnkgc2ltcGx5IHRvIG1lc3NhZ2VzOiB5b3Ugc2VuZCBhIG1ldGhvZCBjYWxsCisgICAgICAgIG1lc3NhZ2UsIGFuZCByZWNlaXZlIGVpdGhlciBhIG1ldGhvZCByZXR1cm4gbWVzc2FnZSBvciBhbiBlcnJvciBtZXNzYWdlCisgICAgICAgIGluIHJlcGx5LgorICAgICAgPC9wPjxwPgorICAgICAgICBFYWNoIG1lc3NhZ2UgaGFzIGEgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmhlYWRlcjwvZW0+LCBpbmNsdWRpbmcgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmZpZWxkczwvZW0+LCAKKyAgICAgICAgYW5kIGEgPGVtIGNsYXNzPSJmaXJzdHRlcm0iPmJvZHk8L2VtPiwgaW5jbHVkaW5nIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj5hcmd1bWVudHM8L2VtPi4gWW91IGNhbiB0aGluayAKKyAgICAgICAgb2YgdGhlIGhlYWRlciBhcyB0aGUgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG1lc3NhZ2UsIGFuZCB0aGUgYm9keSBhcyB0aGUgcGF5bG9hZC4KKyAgICAgICAgSGVhZGVyIGZpZWxkcyBtaWdodCBpbmNsdWRlIHRoZSBzZW5kZXIgYnVzIG5hbWUsIGRlc3RpbmF0aW9uIGJ1cyBuYW1lLCBtZXRob2Qgb3Igc2lnbmFsIG5hbWUsIAorICAgICAgICBhbmQgc28gZm9ydGguIE9uZSBvZiB0aGUgaGVhZGVyIGZpZWxkcyBpcyBhIDxlbSBjbGFzcz0iZmlyc3R0ZXJtIj50eXBlIHNpZ25hdHVyZTwvZW0+IGRlc2NyaWJpbmcgdGhlIAorICAgICAgICB2YWx1ZXMgZm91bmQgaW4gdGhlIGJvZHkuIEZvciBleGFtcGxlLCB0aGUgbGV0dGVyICJpIiBtZWFucyAiMzItYml0IGludGVnZXIiIHNvIHRoZSBzaWduYXR1cmUgCisgICAgICAgICJpaSIgbWVhbnMgdGhlIHBheWxvYWQgaGFzIHR3byAzMi1iaXQgaW50ZWdlcnMuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJDYWxsaW5nIGEgTWV0aG9kIC0gQmVoaW5kIHRoZSBTY2VuZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImNhbGxwcm9jZWR1cmUiPjwvYT5DYWxsaW5nIGEgTWV0aG9kIC0gQmVoaW5kIHRoZSBTY2VuZXM8L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgICBBIG1ldGhvZCBjYWxsIGluIERCdXMgY29uc2lzdHMgb2YgdHdvIG1lc3NhZ2VzOyBhIG1ldGhvZCBjYWxsIG1lc3NhZ2Ugc2VudCBmcm9tIHByb2Nlc3MgQSB0byBwcm9jZXNzIEIsIAorICAgICAgICBhbmQgYSBtYXRjaGluZyBtZXRob2QgcmVwbHkgbWVzc2FnZSBzZW50IGZyb20gcHJvY2VzcyBCIHRvIHByb2Nlc3MgQS4gQm90aCB0aGUgY2FsbCBhbmQgdGhlIHJlcGx5IG1lc3NhZ2VzCisgICAgICAgIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGUgYnVzIGRhZW1vbi4gVGhlIGNhbGxlciBpbmNsdWRlcyBhIGRpZmZlcmVudCBzZXJpYWwgbnVtYmVyIGluIGVhY2ggY2FsbCBtZXNzYWdlLCBhbmQgdGhlCisgICAgICAgIHJlcGx5IG1lc3NhZ2UgaW5jbHVkZXMgdGhpcyBudW1iZXIgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBtYXRjaCByZXBsaWVzIHRvIGNhbGxzLgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgY2FsbCBtZXNzYWdlIHdpbGwgY29udGFpbiBhbnkgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QuCisgICAgICAgIFRoZSByZXBseSBtZXNzYWdlIG1heSBpbmRpY2F0ZSBhbiBlcnJvciwgb3IgbWF5IGNvbnRhaW4gZGF0YSByZXR1cm5lZCBieSB0aGUgbWV0aG9kLgorICAgICAgPC9wPjxwPgorICAgICAgICBBIG1ldGhvZCBpbnZvY2F0aW9uIGluIERCdXMgaGFwcGVucyBhcyBmb2xsb3dzOgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFRoZSBsYW5ndWFnZSBiaW5kaW5nIG1heSBwcm92aWRlIGEgcHJveHksIHN1Y2ggdGhhdCBpbnZva2luZyBhIG1ldGhvZCBvbiAKKyAgICAgICAgICAgICAgYW4gaW4tcHJvY2VzcyBvYmplY3QgaW52b2tlcyBhIG1ldGhvZCBvbiBhIHJlbW90ZSBvYmplY3QgaW4gYW5vdGhlciBwcm9jZXNzLiBJZiBzbywgdGhlIAorICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYWxscyBhIG1ldGhvZCBvbiB0aGUgcHJveHksIGFuZCB0aGUgcHJveHkKKyAgICAgICAgICAgICAgY29uc3RydWN0cyBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgcmVtb3RlIHByb2Nlc3MuCisgICAgICAgICAgICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKyAgICAgICAgICAgICAgRm9yIG1vcmUgbG93LWxldmVsIEFQSXMsIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3RydWN0IGEgbWV0aG9kIGNhbGwgbWVzc2FnZSBpdHNlbGYsIHdpdGhvdXQKKyAgICAgICAgICAgICAgdXNpbmcgYSBwcm94eS4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBJbiBlaXRoZXIgY2FzZSwgdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UgY29udGFpbnM6IGEgYnVzIG5hbWUgYmVsb25naW5nIHRvIHRoZSByZW1vdGUgcHJvY2VzczsgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZDsgCisgICAgICAgICAgICAgIHRoZSBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZDsgYW4gb2JqZWN0IHBhdGggaW5zaWRlIHRoZSByZW1vdGUgcHJvY2VzczsgYW5kIG9wdGlvbmFsbHkgdGhlIG5hbWUgb2YgdGhlIAorICAgICAgICAgICAgICBpbnRlcmZhY2UgdGhhdCBzcGVjaWZpZXMgdGhlIG1ldGhvZC4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBUaGUgbWV0aG9kIGNhbGwgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSBidXMgZGFlbW9uLgorICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFRoZSBidXMgZGFlbW9uIGxvb2tzIGF0IHRoZSBkZXN0aW5hdGlvbiBidXMgbmFtZS4gSWYgYSBwcm9jZXNzIG93bnMgdGhhdCBuYW1lLCAKKyAgICAgICAgICAgICAgdGhlIGJ1cyBkYWVtb24gZm9yd2FyZHMgdGhlIG1ldGhvZCBjYWxsIHRvIHRoYXQgcHJvY2Vzcy4gT3RoZXJ3aXNlLCB0aGUgYnVzIGRhZW1vbgorICAgICAgICAgICAgICBjcmVhdGVzIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHNlbmRzIGl0IGJhY2sgYXMgdGhlIHJlcGx5IHRvIHRoZSBtZXRob2QgY2FsbCBtZXNzYWdlLgorICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFRoZSByZWNlaXZpbmcgcHJvY2VzcyB1bnBhY2tzIHRoZSBtZXRob2QgY2FsbCBtZXNzYWdlLiBJbiBhIHNpbXBsZSBsb3ctbGV2ZWwgQVBJIHNpdHVhdGlvbiwgaXQgCisgICAgICAgICAgICAgIG1heSBpbW1lZGlhdGVseSBydW4gdGhlIG1ldGhvZCBhbmQgc2VuZCBhIG1ldGhvZCByZXBseSBtZXNzYWdlIHRvIHRoZSBidXMgZGFlbW9uLgorICAgICAgICAgICAgICBXaGVuIHVzaW5nIGEgaGlnaC1sZXZlbCBiaW5kaW5nIEFQSSwgdGhlIGJpbmRpbmcgbWlnaHQgZXhhbWluZSB0aGUgb2JqZWN0IHBhdGgsIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgYW5kIG1ldGhvZCBuYW1lLCBhbmQgY29udmVydCB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZSBpbnRvIGFuIGludm9jYXRpb24gb2YgYSBtZXRob2Qgb24gCisgICAgICAgICAgICAgIGEgbmF0aXZlIG9iamVjdCAoR09iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgUU9iamVjdCwgZXRjLiksIHRoZW4gY29udmVydCB0aGUgcmV0dXJuIAorICAgICAgICAgICAgICB2YWx1ZSBmcm9tIHRoZSBuYXRpdmUgbWV0aG9kIGludG8gYSBtZXRob2QgcmVwbHkgbWVzc2FnZS4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBUaGUgYnVzIGRhZW1vbiByZWNlaXZlcyB0aGUgbWV0aG9kIHJlcGx5IG1lc3NhZ2UgYW5kIHNlbmRzIGl0IHRvIHRoZSBwcm9jZXNzIHRoYXQgCisgICAgICAgICAgICAgIG1hZGUgdGhlIG1ldGhvZCBjYWxsLgorICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFRoZSBwcm9jZXNzIHRoYXQgbWFkZSB0aGUgbWV0aG9kIGNhbGwgbG9va3MgYXQgdGhlIG1ldGhvZCByZXBseSBhbmQgbWFrZXMgdXNlIG9mIGFueSAKKyAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcyBpbmNsdWRlZCBpbiB0aGUgcmVwbHkuIFRoZSByZXBseSBtYXkgYWxzbyBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkLgorICAgICAgICAgICAgICBXaGVuIHVzaW5nIGEgYmluZGluZywgdGhlIG1ldGhvZCByZXBseSBtZXNzYWdlIG1heSBiZSBjb252ZXJ0ZWQgaW50byB0aGUgcmV0dXJuIHZhbHVlIG9mIAorICAgICAgICAgICAgICBvZiBhIHByb3h5IG1ldGhvZCwgb3IgaW50byBhbiBleGNlcHRpb24uCisgICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgPC9wPjxwPgorICAgICAgICBUaGUgYnVzIGRhZW1vbiBuZXZlciByZW9yZGVycyBtZXNzYWdlcy4gVGhhdCBpcywgaWYgeW91IHNlbmQgdHdvIG1ldGhvZCBjYWxsIG1lc3NhZ2VzIHRvIHRoZSBzYW1lIHJlY2lwaWVudCwgCisgICAgICAgIHRoZXkgd2lsbCBiZSByZWNlaXZlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNlbnQuIFRoZSByZWNpcGllbnQgaXMgbm90IHJlcXVpcmVkIHRvIHJlcGx5IHRvIHRoZSBjYWxscworICAgICAgICBpbiBvcmRlciwgaG93ZXZlcjsgZm9yIGV4YW1wbGUsIGl0IG1heSBwcm9jZXNzIGVhY2ggbWV0aG9kIGNhbGwgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsIGFuZCByZXR1cm4gcmVwbHkgbWVzc2FnZXMKKyAgICAgICAgaW4gYW4gdW5kZWZpbmVkIG9yZGVyIGRlcGVuZGluZyBvbiB3aGVuIHRoZSB0aHJlYWRzIGNvbXBsZXRlLiBNZXRob2QgY2FsbHMgaGF2ZSBhIHVuaXF1ZSBzZXJpYWwgCisgICAgICAgIG51bWJlciB1c2VkIGJ5IHRoZSBtZXRob2QgY2FsbGVyIHRvIG1hdGNoIHJlcGx5IG1lc3NhZ2VzIHRvIGNhbGwgbWVzc2FnZXMuCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJFbWl0dGluZyBhIFNpZ25hbCAtIEJlaGluZCB0aGUgU2NlbmVzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJzaWduYWxwcm9jZWR1cmUiPjwvYT5FbWl0dGluZyBhIFNpZ25hbCAtIEJlaGluZCB0aGUgU2NlbmVzPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgQSBzaWduYWwgaW4gREJ1cyBjb25zaXN0cyBvZiBhIHNpbmdsZSBtZXNzYWdlLCBzZW50IGJ5IG9uZSBwcm9jZXNzIHRvIGFueSBudW1iZXIgb2Ygb3RoZXIgcHJvY2Vzc2VzLiAKKyAgICAgICAgVGhhdCBpcywgYSBzaWduYWwgaXMgYSB1bmlkaXJlY3Rpb25hbCBicm9hZGNhc3QuIFRoZSBzaWduYWwgbWF5IGNvbnRhaW4gYXJndW1lbnRzIChhIGRhdGEgcGF5bG9hZCksIGJ1dCAKKyAgICAgICAgYmVjYXVzZSBpdCBpcyBhIGJyb2FkY2FzdCwgaXQgbmV2ZXIgaGFzIGEgInJldHVybiB2YWx1ZS4iIENvbnRyYXN0IHRoaXMgd2l0aCBhIG1ldGhvZCBjYWxsIAorICAgICAgICAoc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjY2FsbHByb2NlZHVyZSIgdGl0bGU9IkNhbGxpbmcgYSBNZXRob2QgLSBCZWhpbmQgdGhlIFNjZW5lcyI+dGhlIHNlY3Rpb24gY2FsbGVkICYjODIyMDtDYWxsaW5nIGEgTWV0aG9kIC0gQmVoaW5kIHRoZSBTY2VuZXMmIzgyMjE7PC9hPikgd2hlcmUgdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaGFzIGEgbWF0Y2hpbmcgbWV0aG9kIHJlcGx5IG1lc3NhZ2UuCisgICAgICA8L3A+PHA+CisgICAgICAgIFRoZSBlbWl0dGVyIChha2Egc2VuZGVyKSBvZiBhIHNpZ25hbCBoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgcmVjaXBpZW50cy4gUmVjaXBpZW50cyByZWdpc3RlcgorICAgICAgICB3aXRoIHRoZSBidXMgZGFlbW9uIHRvIHJlY2VpdmUgc2lnbmFscyBiYXNlZCBvbiAibWF0Y2ggcnVsZXMiIC0gdGhlc2UgcnVsZXMgd291bGQgdHlwaWNhbGx5IGluY2x1ZGUgdGhlIHNlbmRlciBhbmQgCisgICAgICAgIHRoZSBzaWduYWwgbmFtZS4gVGhlIGJ1cyBkYWVtb24gc2VuZHMgZWFjaCBzaWduYWwgb25seSB0byByZWNpcGllbnRzIHdobyBoYXZlIGV4cHJlc3NlZCBpbnRlcmVzdCBpbiB0aGF0IAorICAgICAgICBzaWduYWwuCisgICAgICA8L3A+PHA+CisgICAgICAgIEEgc2lnbmFsIGluIERCdXMgaGFwcGVucyBhcyBmb2xsb3dzOgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIEEgc2lnbmFsIG1lc3NhZ2UgaXMgY3JlYXRlZCBhbmQgc2VudCB0byB0aGUgYnVzIGRhZW1vbi4gV2hlbiB1c2luZyB0aGUgbG93LWxldmVsIEFQSSB0aGlzIG1heSBiZSAKKyAgICAgICAgICAgICAgZG9uZSBtYW51YWxseSwgd2l0aCBjZXJ0YWluIGJpbmRpbmdzIGl0IG1heSBiZSBkb25lIGZvciB5b3UgYnkgdGhlIGJpbmRpbmcgd2hlbiBhIG5hdGl2ZSBvYmplY3QKKyAgICAgICAgICAgICAgZW1pdHMgYSBuYXRpdmUgc2lnbmFsIG9yIGV2ZW50LgorICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgIFRoZSBzaWduYWwgbWVzc2FnZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgc3BlY2lmaWVzIHRoZSBzaWduYWw7CisgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBzaWduYWw7IHRoZSBidXMgbmFtZSBvZiB0aGUgcHJvY2VzcyBzZW5kaW5nIHRoZSBzaWduYWw7IGFuZCAKKyAgICAgICAgICAgICAgYW55IGFyZ3VtZW50cyAKKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBBbnkgcHJvY2VzcyBvbiB0aGUgbWVzc2FnZSBidXMgY2FuIHJlZ2lzdGVyICJtYXRjaCBydWxlcyIgaW5kaWNhdGluZyB3aGljaCBzaWduYWxzIGl0IAorICAgICAgICAgICAgICBpcyBpbnRlcmVzdGVkIGluLiBUaGUgYnVzIGhhcyBhIGxpc3Qgb2YgcmVnaXN0ZXJlZCBtYXRjaCBydWxlcy4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBUaGUgYnVzIGRhZW1vbiBleGFtaW5lcyB0aGUgc2lnbmFsIGFuZCBkZXRlcm1pbmVzIHdoaWNoIHByb2Nlc3NlcyBhcmUgaW50ZXJlc3RlZCBpbiBpdC4KKyAgICAgICAgICAgICAgSXQgc2VuZHMgdGhlIHNpZ25hbCBtZXNzYWdlIHRvIHRoZXNlIHByb2Nlc3Nlcy4KKyAgICAgICAgICAgIDwvcD48L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPjxwPgorICAgICAgICAgICAgICBFYWNoIHByb2Nlc3MgcmVjZWl2aW5nIHRoZSBzaWduYWwgZGVjaWRlcyB3aGF0IHRvIGRvIHdpdGggaXQ7IGlmIHVzaW5nIGEgYmluZGluZywgCisgICAgICAgICAgICAgIHRoZSBiaW5kaW5nIG1heSBjaG9vc2UgdG8gZW1pdCBhIG5hdGl2ZSBzaWduYWwgb24gYSBwcm94eSBvYmplY3QuIElmIHVzaW5nIHRoZSAKKyAgICAgICAgICAgICAgbG93LWxldmVsIEFQSSwgdGhlIHByb2Nlc3MgbWF5IGp1c3QgbG9vayBhdCB0aGUgc2lnbmFsIHNlbmRlciBhbmQgbmFtZSBhbmQgZGVjaWRlCisgICAgICAgICAgICAgIHdoYXQgdG8gZG8gYmFzZWQgb24gdGhhdC4KKyAgICAgICAgICAgIDwvcD48L2xpPjwvdWw+PC9kaXY+PHA+CisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJJbnRyb3NwZWN0aW9uIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJpbnRyb3NwZWN0aW9uIj48L2E+SW50cm9zcGVjdGlvbjwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEQtQnVzIG9iamVjdHMgbWF5IHN1cHBvcnQgdGhlIGludGVyZmFjZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2NvZGU+LgorICAgICAgICBUaGlzIGludGVyZmFjZSBoYXMgb25lIG1ldGhvZCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+SW50cm9zcGVjdDwvY29kZT4gd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zCisgICAgICAgIGFuIFhNTCBzdHJpbmcuIFRoZSBYTUwgc3RyaW5nIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlcywgbWV0aG9kcywgYW5kIHNpZ25hbHMgb2YgdGhlIG9iamVjdC4KKyAgICAgICAgU2VlIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcyBpbnRyb3NwZWN0aW9uIGZvcm1hdC4KKyAgICAgIDwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MSIgdGl0bGU9IkdMaWIgQVBJOiBVc2luZyBSZW1vdGUgT2JqZWN0cyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJnbGliLWNsaWVudCI+PC9hPkdMaWIgQVBJOiBVc2luZyBSZW1vdGUgT2JqZWN0czwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBUaGUgR0xpYiBiaW5kaW5nIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlciBmaWxlCisgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Jmx0O2RidXMvZGJ1cy1nbGliLmgmZ3Q7PC9jb2RlPi4KKyAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJELUJ1cyAtIEdMaWIgdHlwZSBtYXBwaW5ncyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iZ2xpYi10eXBlbWFwcGluZ3MiPjwvYT5ELUJ1cyAtIEdMaWIgdHlwZSBtYXBwaW5nczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisJVGhlIGhlYXJ0IG9mIHRoZSBHTGliIGJpbmRpbmdzIGZvciBELUJ1cyBpcyB0aGUgbWFwcGluZyBpdAorCXByb3ZpZGVzIGJldHdlZW4gRC1CdXMgInR5cGUgc2lnbmF0dXJlcyIgYW5kIEdMaWIgdHlwZXMKKwkoPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdUeXBlPC9jb2RlPikuIFRoZSBELUJ1cyB0eXBlIHN5c3RlbSBpcyBjb21wb3NlZCBvZgorCWEgbnVtYmVyIG9mICJiYXNpYyIgdHlwZXMsIGFsb25nIHdpdGggc2V2ZXJhbCAiY29udGFpbmVyIiB0eXBlcy4KKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IkJhc2ljIHR5cGUgbWFwcGluZ3MiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImdsaWItYmFzaWMtdHlwZW1hcHBpbmdzIj48L2E+QmFzaWMgdHlwZSBtYXBwaW5nczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisJICBCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIGJhc2ljIHR5cGVzLCBhbG9uZyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQKKwkgIG1hcHBpbmcgdG8gYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R1R5cGU8L2NvZGU+LgorCSAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48Y29sPjwvY29sZ3JvdXA+PHRoZWFkPjx0cj48dGg+RC1CdXMgYmFzaWMgdHlwZTwvdGg+PHRoPkdUeXBlPC90aD48dGg+RnJlZSBmdW5jdGlvbjwvdGg+PHRoPk5vdGVzPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkJZVEU8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9VQ0hBUjwvY29kZT48L3RkPjx0ZD6gPC90ZD48dGQ+oDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5CT09MRUFOPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HX1RZUEVfQk9PTEVBTjwvY29kZT48L3RkPjx0ZD6gPC90ZD48dGQ+oDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlQxNjwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX0lOVDwvY29kZT48L3RkPjx0ZD6gPC90ZD48dGQ+V2lsbCBiZSBjaGFuZ2VkIHRvIGEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9JTlQxNjwvY29kZT4gb25jZSBHTGliIGhhcyBpdDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UMTY8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9VSU5UPC9jb2RlPjwvdGQ+PHRkPqA8L3RkPjx0ZD5XaWxsIGJlIGNoYW5nZWQgdG8gYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX1VJTlQxNjwvY29kZT4gb25jZSBHTGliIGhhcyBpdDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlQzMjwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX0lOVDwvY29kZT48L3RkPjx0ZD6gPC90ZD48dGQ+V2lsbCBiZSBjaGFuZ2VkIHRvIGEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9JTlQzMjwvY29kZT4gb25jZSBHTGliIGhhcyBpdDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UMzI8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9VSU5UPC9jb2RlPjwvdGQ+PHRkPqA8L3RkPjx0ZD5XaWxsIGJlIGNoYW5nZWQgdG8gYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX1VJTlQzMjwvY29kZT4gb25jZSBHTGliIGhhcyBpdDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5JTlQ2NDwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX0dJTlQ2NDwvY29kZT48L3RkPjx0ZD6gPC90ZD48dGQ+oDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5VSU5UNjQ8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9HVUlOVDY0PC9jb2RlPjwvdGQ+PHRkPqA8L3RkPjx0ZD6gPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRPVUJMRTwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX0RPVUJMRTwvY29kZT48L3RkPjx0ZD6gPC90ZD48dGQ+oDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5TVFJJTkc8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9TVFJJTkc8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPmdfZnJlZTwvY29kZT48L3RkPjx0ZD6gPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPk9CSkVDVF9QQVRIPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1RZUEVfR19QUk9YWTwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Z19vYmplY3RfdW5yZWY8L2NvZGU+PC90ZD48dGQ+VGhlIHJldHVybmVkIHByb3h5IGRvZXMgbm90IGhhdmUgYW4gaW50ZXJmYWNlIHNldDsgdXNlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5kYnVzX2dfcHJveHlfc2V0X2ludGVyZmFjZTwvY29kZT4gdG8gaW52b2tlIG1ldGhvZHM8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorCSAgQXMgeW91IGNhbiBzZWUsIHRoZSBiYXNpYyBtYXBwaW5nIGlzIGZhaXJseSBzdHJhaWdodGZvcndhcmQuCisJPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iQ29udGFpbmVyIHR5cGUgbWFwcGluZ3MiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImdsaWItY29udGFpbmVyLXR5cGVtYXBwaW5ncyI+PC9hPkNvbnRhaW5lciB0eXBlIG1hcHBpbmdzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKwkgIFRoZSBELUJ1cyB0eXBlIHN5c3RlbSBhbHNvIGhhcyBhIG51bWJlciBvZiAiY29udGFpbmVyIgorCSAgdHlwZXMsIHN1Y2ggYXMgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfVFlQRV9BUlJBWTwvY29kZT4gYW5kCisJICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REJVU19UWVBFX1NUUlVDVDwvY29kZT4uICBUaGUgRC1CdXMgdHlwZSBzeXN0ZW0KKwkgIGlzIGZ1bGx5IHJlY3Vyc2l2ZSwgc28gb25lIGNhbiBmb3IgZXhhbXBsZSBoYXZlIGFuIGFycmF5IG9mCisJICBhcnJheSBvZiBzdHJpbmdzIChpLmUuIHR5cGUgc2lnbmF0dXJlCisJICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+YWFzPC9jb2RlPikuCisJPC9wPjxwPgorCSAgSG93ZXZlciwgbm90IGFsbCBvZiB0aGVzZSB0eXBlcyBhcmUgaW4gY29tbW9uIHVzZTsgZm9yCisJICBleGFtcGxlLCBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcgdGhlIGF1dGhvciBrbm93cyBvZiBubworCSAgb25lIHVzaW5nIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1RZUEVfU1RSVUNUPC9jb2RlPiwgb3IgYQorCSAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfVFlQRV9BUlJBWTwvY29kZT4gY29udGFpbmluZyBhbnkgbm9uLWJhc2ljCisJICB0eXBlLiAgVGhlIGFwcHJvYWNoIHRoZSBHTGliIGJpbmRpbmdzIHRha2UgaXMgcHJhZ21hdGljOyB0cnkKKwkgIHRvIG1hcCB0aGUgbW9zdCBjb21tb24gdHlwZXMgaW4gdGhlIG1vc3Qgb2J2aW91cyB3YXksIGFuZAorCSAgbGV0IHVzaW5nIGxlc3MgY29tbW9uIGFuZCBtb3JlIGNvbXBsZXggdHlwZXMgYmUgbGVzcworCSAgIm5hdHVyYWwiLgorCTwvcD48cD4KKwkgIEZpcnN0LCBELUJ1cyB0eXBlIHNpZ25hdHVyZXMgd2hpY2ggaGF2ZSBhbiAib2J2aW91cyIKKwkgIGNvcnJlc3BvbmRpbmcgYnVpbHQtaW4gR0xpYiB0eXBlIGFyZSBtYXBwZWQgdXNpbmcgdGhhdCB0eXBlOgorCSAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkQtQnVzIHR5cGUgc2lnbmF0dXJlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjx0aD5HVHlwZTwvdGg+PHRoPkMgdHlwZWRlZjwvdGg+PHRoPkZyZWUgZnVuY3Rpb248L3RoPjx0aD5Ob3RlczwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5hczwvY29kZT48L3RkPjx0ZD5BcnJheSBvZiBzdHJpbmdzPC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdfVFlQRV9TVFJWPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5jaGFyICoqPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5nX3N0cmZyZWV2PC9jb2RlPjwvdGQ+PHRkPqA8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+djwvY29kZT48L3RkPjx0ZD5HZW5lcmljIHZhbHVlIGNvbnRhaW5lcjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HX1RZUEVfVkFMVUU8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdWYWx1ZSAqPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5nX3ZhbHVlX3Vuc2V0PC9jb2RlPjwvdGQ+PHRkPlRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciB2YWx1ZXMgZXhwZWN0IHRoYXQgbWV0aG9kIGNhbGxlcnMgaGF2ZSBhbGxvY2F0ZWQgcmV0dXJuIHZhbHVlczsgc2VlIGJlbG93LjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisJPC9wPjxwPgorCSAgVGhlIG5leHQgbW9zdCBjb21tb24gcmVjdXJzaXZlIHR5cGUgc2lnbmF0dXJlcyBhcmUgYXJyYXlzIG9mCisJICBiYXNpYyB2YWx1ZXMuICBUaGUgbW9zdCBvYnZpb3VzIG1hcHBpbmcgZm9yIGFycmF5cyBvZiBiYXNpYworCSAgdHlwZXMgaXMgYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0FycmF5PC9jb2RlPi4gIE5vdywgR0xpYiBkb2VzIG5vdAorCSAgcHJvdmlkZSBhIGJ1aWx0aW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdUeXBlPC9jb2RlPiBmb3IKKwkgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HQXJyYXk8L2NvZGU+LiAgSG93ZXZlciwgd2UgYWN0dWFsbHkgbmVlZCBtb3JlIHRoYW4KKwkgIHRoYXQgLSB3ZSBuZWVkIGEgInBhcmFtZXRlcml6ZWQiIHR5cGUgd2hpY2ggaW5jbHVkZXMgdGhlCisJICBjb250YWluZWQgdHlwZS4gIFdoeSB3ZSBuZWVkIHRoaXMgd2Ugd2lsbCBzZWUgYmVsb3cuCisJPC9wPjxwPgorCSAgVGhlIGFwcHJvYWNoIHRha2VuIGlzIHRvIGNyZWF0ZSB0aGVzZSB0eXBlcyBpbiB0aGUgRC1CdXMgR0xpYgorCSAgYmluZGluZ3M7IGhvd2V2ZXIsIHRoZXJlIGlzIG5vdGhpbmcgRC1CdXMgc3BlY2lmaWMgYWJvdXQgdGhlbS4KKwkgIEluIHRoZSBmdXR1cmUsIHdlIGhvcGUgdG8gaW5jbHVkZSBzdWNoICJmdW5kYW1lbnRhbCIgdHlwZXMgaW4gR0xpYgorCSAgaXRzZWxmLgorCSAgPC9wPjxkaXYgY2xhc3M9ImluZm9ybWFsdGFibGUiPjx0YWJsZSBib3JkZXI9IjEiPjxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0aGVhZD48dHI+PHRoPkQtQnVzIHR5cGUgc2lnbmF0dXJlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjx0aD5HVHlwZTwvdGg+PHRoPkMgdHlwZWRlZjwvdGg+PHRoPkZyZWUgZnVuY3Rpb248L3RoPjx0aD5Ob3RlczwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5heTwvY29kZT48L3RkPjx0ZD5BcnJheSBvZiBieXRlczwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1RZUEVfR19CWVRFX0FSUkFZPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HQXJyYXkgKjwvY29kZT48L3RkPjx0ZD5nX2FycmF5X2ZyZWU8L3RkPjx0ZD6gPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPmF1PC9jb2RlPjwvdGQ+PHRkPkFycmF5IG9mIHVpbnQ8L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REJVU19UWVBFX0dfVUlOVF9BUlJBWTwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0FycmF5ICo8L2NvZGU+PC90ZD48dGQ+Z19hcnJheV9mcmVlPC90ZD48dGQ+oDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5haTwvY29kZT48L3RkPjx0ZD5BcnJheSBvZiBpbnQ8L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REJVU19UWVBFX0dfSU5UX0FSUkFZPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HQXJyYXkgKjwvY29kZT48L3RkPjx0ZD5nX2FycmF5X2ZyZWU8L3RkPjx0ZD6gPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPmF4PC9jb2RlPjwvdGQ+PHRkPkFycmF5IG9mIGludDY0PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfVFlQRV9HX0lOVDY0X0FSUkFZPC9jb2RlPjwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HQXJyYXkgKjwvY29kZT48L3RkPjx0ZD5nX2FycmF5X2ZyZWU8L3RkPjx0ZD6gPC90ZD48L3RyPjx0cj48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPmF0PC9jb2RlPjwvdGQ+PHRkPkFycmF5IG9mIHVpbnQ2NDwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1RZUEVfR19VSU5UNjRfQVJSQVk8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdBcnJheSAqPC9jb2RlPjwvdGQ+PHRkPmdfYXJyYXlfZnJlZTwvdGQ+PHRkPqA8L3RkPjwvdHI+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+YWQ8L2NvZGU+PC90ZD48dGQ+QXJyYXkgb2YgZG91YmxlPC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfVFlQRV9HX0RPVUJMRV9BUlJBWTwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0FycmF5ICo8L2NvZGU+PC90ZD48dGQ+Z19hcnJheV9mcmVlPC90ZD48dGQ+oDwvdGQ+PC90cj48dHI+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5hYjwvY29kZT48L3RkPjx0ZD5BcnJheSBvZiBib29sZWFuPC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfVFlQRV9HX0JPT0xFQU5fQVJSQVk8L2NvZGU+PC90ZD48dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdBcnJheSAqPC9jb2RlPjwvdGQ+PHRkPmdfYXJyYXlfZnJlZTwvdGQ+PHRkPqA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PjxwPgorCTwvcD48cD4KKwkgIEQtQnVzIGFsc28gaW5jbHVkZXMgYSBzcGVjaWFsIHR5cGUgREJVU19UWVBFX0RJQ1RfRU5UUlkgd2hpY2gKKwkgIGlzIG9ubHkgdmFsaWQgaW4gYXJyYXlzLiAgSXQncyBpbnRlbmRlZCB0byBiZSBtYXBwZWQgdG8gYSAiZGljdGlvbmFyeSIKKwkgIHR5cGUgYnkgYmluZGluZ3MuICBUaGUgb2J2aW91cyBHTGliIG1hcHBpbmcgaGVyZSBpcyBHSGFzaFRhYmxlLiAgQWdhaW4sCisJICBob3dldmVyLCB0aGVyZSBpcyBubyBidWlsdGluIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HVHlwZTwvY29kZT4gZm9yIGEgR0hhc2hUYWJsZS4KKwkgIE1vcmVvdmVyLCBqdXN0IGxpa2UgZm9yIGFycmF5cywgd2UgbmVlZCBhIHBhcmFtZXRlcml6ZWQgdHlwZSBzbyB0aGF0CisJICB0aGUgYmluZGluZ3MgY2FuIGNvbW11bmlhdGUgd2hpY2ggdHlwZXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgaGFzaCB0YWJsZS4KKwk8L3A+PHA+CisJICBBdCBwcmVzZW50LCBvbmx5IHN0cmluZ3MgYXJlIHN1cHBvcnRlZC4gIFdvcmsgaXMgaW4gcHJvZ3Jlc3MgdG8KKwkgIGluY2x1ZGUgbW9yZSB0eXBlcy4KKwkgIDwvcD48ZGl2IGNsYXNzPSJpbmZvcm1hbHRhYmxlIj48dGFibGUgYm9yZGVyPSIxIj48Y29sZ3JvdXA+PGNvbD48Y29sPjxjb2w+PGNvbD48Y29sPjxjb2w+PC9jb2xncm91cD48dGhlYWQ+PHRyPjx0aD5ELUJ1cyB0eXBlIHNpZ25hdHVyZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48dGg+R1R5cGU8L3RoPjx0aD5DIHR5cGVkZWY8L3RoPjx0aD5GcmVlIGZ1bmN0aW9uPC90aD48dGg+Tm90ZXM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+YXtzc308L2NvZGU+PC90ZD48dGQ+RGljdGlvbmFyeSBtYXBwaW5nIHN0cmluZ3MgdG8gc3RyaW5nczwvdGQ+PHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1RZUEVfR19TVFJJTkdfU1RSSU5HX0hBU0hUQUJMRTwvY29kZT48L3RkPjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0hhc2hUYWJsZSAqPC9jb2RlPjwvdGQ+PHRkPmdfaGFzaF90YWJsZV9kZXN0cm95PC90ZD48dGQ+oDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+PHA+CisJPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iQXJiaXRyYXJpbHkgcmVjdXJzaXZlIHR5cGUgbWFwcGluZ3MiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImdsaWItZ2VuZXJpYy10eXBlbWFwcGluZ3MiPjwvYT5BcmJpdHJhcmlseSByZWN1cnNpdmUgdHlwZSBtYXBwaW5nczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisJICBGaW5hbGx5LCBpdCBpcyBwb3NzaWJsZSB1c2VycyB3aWxsIHdhbnQgdG8gd3JpdGUgb3IgaW52b2tlIEQtQnVzCisJICBtZXRob2RzIHdoaWNoIGhhdmUgYXJiaXRyYXJpbHkgY29tcGxleCB0eXBlIHNpZ25hdHVyZXMgbm90CisJICBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlc2UgYmluZGluZ3MuICBGb3IgdGhpcyBjYXNlLCB3ZSBoYXZlIGEKKwkgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQnVzR1ZhbHVlPC9jb2RlPiB3aGljaCBhY3RzIGFzIGEga2luZCBvZiBzcGVjaWFsCisJICB2YXJpYW50IHZhbHVlIHdoaWNoIG1heSBiZSBpdGVyYXRlZCBvdmVyIG1hbnVhbGx5LiAgVGhlCisJICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R1R5cGU8L2NvZGU+IGFzc29jaWF0ZWQgaXMKKwkgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX1RZUEVfR19WQUxVRTwvY29kZT4uCisJPC9wPjxwPgorCSAgVE9ETyBpbnNlcnQgdXNhZ2Ugb2YgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfVFlQRV9HX1ZBTFVFPC9jb2RlPiBoZXJlLgorCTwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9IkEgc2FtcGxlIHByb2dyYW0iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9InNhbXBsZS1wcm9ncmFtLTEiPjwvYT5BIHNhbXBsZSBwcm9ncmFtPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD5IZXJlIGlzIGEgRC1CdXMgcHJvZ3JhbSB1c2luZyB0aGUgR0xpYiBiaW5kaW5ncy4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+ICAgICAgCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgREJ1c0dDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBHRXJyb3IgKmVycm9yOworICBEQnVzR1Byb3h5ICpwcm94eTsKKyAgY2hhciAqKm5hbWVfbGlzdDsKKyAgY2hhciAqKm5hbWVfbGlzdF9wdHI7CisgIAorICBnX3R5cGVfaW5pdCAoKTsKKworICBlcnJvciA9IE5VTEw7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2dfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1wO2Vycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBnX3ByaW50ZXJyICgiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyb3ItJmd0O21lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGEgcHJveHkgb2JqZWN0IGZvciB0aGUgImJ1cyBkcml2ZXIiIChuYW1lICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIpICovCisgIAorICBwcm94eSA9IGRidXNfZ19wcm94eV9uZXdfZm9yX25hbWUgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUyk7CisKKyAgLyogQ2FsbCBMaXN0TmFtZXMgbWV0aG9kLCB3YWl0IGZvciByZXBseSAqLworICBlcnJvciA9IE5VTEw7CisgIGlmICghZGJ1c19nX3Byb3h5X2NhbGwgKHByb3h5LCAiTGlzdE5hbWVzIiwgJmFtcDtlcnJvciwgR19UWVBFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJWLCAmYW1wO25hbWVfbGlzdCwgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEp1c3QgZG8gZGVtb25zdHJhdGUgcmVtb3RlIGV4Y2VwdGlvbnMgdmVyc3VzIHJlZ3VsYXIgR0Vycm9yICovCisgICAgICBpZiAoZXJyb3ItJmd0O2RvbWFpbiA9PSBEQlVTX0dFUlJPUiAmYW1wOyZhbXA7IGVycm9yLSZndDtjb2RlID09IERCVVNfR0VSUk9SX1JFTU9URV9FWENFUFRJT04pCisgICAgICAgIGdfcHJpbnRlcnIgKCJDYXVnaHQgcmVtb3RlIG1ldGhvZCBleGNlcHRpb24gJXM6ICVzIiwKKwkgICAgICAgICAgICBkYnVzX2dfZXJyb3JfZ2V0X25hbWUgKGVycm9yKSwKKwkgICAgICAgICAgICBlcnJvci0mZ3Q7bWVzc2FnZSk7CisgICAgICBlbHNlCisgICAgICAgIGdfcHJpbnRlcnIgKCJFcnJvcjogJXNcbiIsIGVycm9yLSZndDttZXNzYWdlKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFByaW50IHRoZSByZXN1bHRzICovCisgCisgIGdfcHJpbnQgKCJOYW1lcyBvbiB0aGUgbWVzc2FnZSBidXM6XG4iKTsKKyAgCisgIGZvciAobmFtZV9saXN0X3B0ciA9IG5hbWVfbGlzdDsgKm5hbWVfbGlzdF9wdHI7IG5hbWVfbGlzdF9wdHIrKykKKyAgICB7CisgICAgICBnX3ByaW50ICgiICAlc1xuIiwgKm5hbWVfbGlzdF9wdHIpOworICAgIH0KKyAgZ19zdHJmcmVldiAobmFtZV9saXN0KTsKKworICBnX29iamVjdF91bnJlZiAocHJveHkpOworCisgIHJldHVybiAwOworfQorPC9wcmU+PHA+CisgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iUHJvZ3JhbSBpbml0YWxpemF0aW9uIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJnbGliLXByb2dyYW0tc2V0dXAiPjwvYT5Qcm9ncmFtIGluaXRhbGl6YXRpb248L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorCUEgY29ubmVjdGlvbiB0byB0aGUgYnVzIGlzIGFjcXVpcmVkIHVzaW5nCisJPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19idXNfZ2V0PC9jb2RlPi4gIE5leHQsIGEgcHJveHkKKwlpcyBjcmVhdGVkIGZvciB0aGUgb2JqZWN0ICIvb3JnL2ZyZWVkZXNrdG9wL0RCdXMiIHdpdGgKKwlpbnRlcmZhY2UgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9jb2RlPgorCW9uIHRoZSBzZXJ2aWNlIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1czwvY29kZT4uCisJVGhpcyBpcyBhIHByb3h5IGZvciB0aGUgbWVzc2FnZSBidXMgaXRzZWxmLgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iVW5kZXJzdGFuZGluZyBtZXRob2QgaW52b2NhdGlvbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iZ2xpYi1tZXRob2QtaW52b2NhdGlvbiI+PC9hPlVuZGVyc3RhbmRpbmcgbWV0aG9kIGludm9jYXRpb248L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorCVlvdSBoYXZlIGEgbnVtYmVyIG9mIGNob2ljZXMgZm9yIG1ldGhvZCBpbnZvY2F0aW9uLiAgRmlyc3QsIGFzCisJdXNlZCBhYm92ZSwgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19wcm94eV9jYWxsPC9jb2RlPiBzZW5kcyBhCisJbWV0aG9kIGNhbGwgdG8gdGhlIHJlbW90ZSBvYmplY3QsIGFuZCBibG9ja3MgdW50aWwgYSByZXBseSBpcworCXJlY2lldmVkLiAgVGhlIG91dGdvaW5nIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSB2YXJhcmdzCisJYXJyYXksIHRlcm1pbmF0ZWQgd2l0aCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX0lOVkFMSUQ8L2NvZGU+LgorCU5leHQsIHBvaW50ZXJzIHRvIHJldHVybiB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgZm9sbG93ZWQgYWdhaW4KKwlieSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R19UWVBFX0lOVkFMSUQ8L2NvZGU+LgorICAgICAgPC9wPjxwPgorCVRvIGludm9rZSBhIG1ldGhvZCBhc3luY2hyb25vdXNseSwgdXNlCisJPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19wcm94eV9iZWdpbl9jYWxsPC9jb2RlPi4gIFRoaXMgcmV0dXJucyBhCisJPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCdXNHUGVuZGluZ0NhbGw8L2NvZGU+IG9iamVjdDsgeW91IG1heSB0aGVuIHNldCBhCisJbm90aWZpY2F0aW9uIGZ1bmN0aW9uIHVzaW5nCisJPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeTwvY29kZT4uCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJDb25uZWN0aW5nIHRvIG9iamVjdCBzaWduYWxzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJnbGliLXNpZ25hbC1jb25uZWN0aW9uIj48L2E+Q29ubmVjdGluZyB0byBvYmplY3Qgc2lnbmFsczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisJWW91IG1heSBjb25uZWN0IHRvIHNpZ25hbHMgdXNpbmcKKwk8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+ZGJ1c19nX3Byb3h5X2FkZF9zaWduYWw8L2NvZGU+IGFuZAorCTxjb2RlIGNsYXNzPSJsaXRlcmFsIj5kYnVzX2dfcHJveHlfY29ubmVjdF9zaWduYWw8L2NvZGU+LiAgWW91IG11c3QKKwlpbnZva2UgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19wcm94eV9hZGRfc2lnbmFsPC9jb2RlPiB0byBzcGVjaWZ5CisJdGhlIHNpZ25hdHVyZSBvZiB5b3VyIHNpZ25hbCBoYW5kbGVyczsgeW91IG1heSB0aGVuIGludm9rZQorCTxjb2RlIGNsYXNzPSJsaXRlcmFsIj5kYnVzX2dfcHJveHlfY29ubmVjdF9zaWduYWw8L2NvZGU+IG11bHRpcGxlIHRpbWVzLgorICAgICAgPC9wPjxwPgorCU5vdGUgdGhhdCBpdCB3aWxsIG9mdGVuIGJlIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gYnVpbHRpbgorCW1hcnNoYWxsZXIgZm9yIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiBhIHJlbW90ZSBzaWduYWwuICBJbiB0aGF0CisJY2FzZSwgeW91IG11c3QgZ2VuZXJhdGUgYSBtYXJzaGFsbGVyIHlvdXJzZWxmIGJ5IHVzaW5nCisJPHNwYW4gY2xhc3M9ImFwcGxpY2F0aW9uIj5nbGliLWdlbm1hcnNoYWw8L3NwYW4+LCBhbmQgdGhlbiByZWdpc3RlcgorCWl0IHVzaW5nIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5kYnVzX2dfb2JqZWN0X3JlZ2lzdGVyX21hcnNoYWxsZXI8L2NvZGU+LgorICAgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iRXJyb3IgaGFuZGxpbmcgYW5kIHJlbW90ZSBleGNlcHRpb25zIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJnbGliLWVycm9yLWhhbmRsaW5nIj48L2E+RXJyb3IgaGFuZGxpbmcgYW5kIHJlbW90ZSBleGNlcHRpb25zPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKwlBbGwgb2YgdGhlIEdMaWIgYmluZGluZyBtZXRob2RzIHN1Y2ggYXMKKwk8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+ZGJ1c19nX3Byb3h5X2VuZF9jYWxsPC9jb2RlPiByZXR1cm4gYQorCTxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HRXJyb3I8L2NvZGU+LiAgVGhpcyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0Vycm9yPC9jb2RlPiBjYW4KKwlyZXByZXNlbnQgdHdvIGRpZmZlcmVudCB0aGluZ3M6CisgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisJICAgIEFuIGludGVybmFsIEQtQnVzIGVycm9yLCBzdWNoIGFzIGFuIG91dC1vZi1tZW1vcnkKKwkgICAgY29uZGl0aW9uLCBhbiBJL08gZXJyb3IsIG9yIGEgbmV0d29yayB0aW1lb3V0LiAgRXJyb3JzCisJICAgIGdlbmVyYXRlZCBieSB0aGUgRC1CdXMgbGlicmFyeSBpdHNlbGYgaGF2ZSB0aGUgZG9tYWluCisJICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX0dFUlJPUjwvY29kZT4sIGFuZCBhIGNvcnJlc3BvbmRpbmcgY29kZQorCSAgICBzdWNoIGFzIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5EQlVTX0dFUlJPUl9OT19NRU1PUlk8L2NvZGU+LiAgSXQgd2lsbAorCSAgICBub3QgYmUgdHlwaWNhbCBmb3IgYXBwbGljYXRpb25zIHRvIGhhbmRsZSB0aGVzZSBlcnJvcnMKKwkgICAgc3BlY2lmaWNhbGx5LgorCSAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisJICAgIEEgcmVtb3RlIEQtQnVzIGV4Y2VwdGlvbiwgdGhyb3duIGJ5IHRoZSBwZWVyLCBidXMsIG9yCisJICAgIHNlcnZpY2UuICBELUJ1cyByZW1vdGUgZXhjZXB0aW9ucyBoYXZlIGJvdGggYSB0ZXh0dWFsCisJICAgICJuYW1lIiBhbmQgYSAibWVzc2FnZSIuICBUaGUgR0xpYiBiaW5kaW5ncyBzdG9yZSB0aGlzCisJICAgIGluZm9ybWF0aW9uIGluIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0Vycm9yPC9jb2RlPiwgYnV0IHNvbWUKKwkgICAgc3BlY2lhbCBydWxlcyBhcHBseS4KKwkgIDwvcD48cD4KKwkgICAgVGhlIHNldCBlcnJvciB3aWxsIGhhdmUgdGhlIGRvbWFpbgorCSAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REJVU19HRVJST1I8L2NvZGU+IGFzIGFib3ZlLCBhbmQgd2lsbCBhbHNvCisJICAgIGhhdmUgdGhlIGNvZGUKKwkgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCVVNfR0VSUk9SX1JFTU9URV9FWENFUFRJT048L2NvZGU+LiAgSW4gb3JkZXIKKwkgICAgdG8gYWNjZXNzIHRoZSByZW1vdGUgZXhjZXB0aW9uIG5hbWUsIHlvdSBtdXN0IHVzZSBhCisJICAgIHNwZWNpYWwgYWNjZXNzb3IsIHN1Y2ggYXMKKwkgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19lcnJvcl9oYXNfbmFtZTwvY29kZT4gb3IKKwkgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19lcnJvcl9nZXRfbmFtZTwvY29kZT4uICBUaGUgcmVtb3RlCisJICAgIGV4Y2VwdGlvbiBkZXRhaWxlZCBtZXNzYWdlIGlzIGFjY2Vzc2libGUgdmlhIHRoZSByZWd1bGFyCisJICAgIEdFcnJvciA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+bWVzc2FnZTwvY29kZT4gbWVtYmVyLgorCSAgPC9wPjwvbGk+PC91bD48L2Rpdj48cD4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MiIgdGl0bGU9Ik1vcmUgZXhhbXBsZXMgb2YgbWV0aG9kIGludm9jYXRpb24iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImdsaWItbW9yZS1leGFtcGxlcyI+PC9hPk1vcmUgZXhhbXBsZXMgb2YgbWV0aG9kIGludm9jYXRpb248L2gzPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iU2VuZGluZyBhbiBpbnRlZ2VyIGFuZCBzdHJpbmcsIHJlY2VpdmluZyBhbiBhcnJheSBvZiBieXRlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iZ2xpYi1zZW5kaW5nLXN0dWZmIj48L2E+U2VuZGluZyBhbiBpbnRlZ2VyIGFuZCBzdHJpbmcsIHJlY2VpdmluZyBhbiBhcnJheSBvZiBieXRlczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICBHQXJyYXkgKmFycjsKKyAgCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJGb29iYXIiLCAmYW1wO2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfSU5ULCA0MiwgR19UWVBFX1NUUklORywgImhlbGxvIiwKKwkJCSAgR19UWVBFX0lOVkFMSUQsCisJCQkgIERCVVNfVFlQRV9HX1VDSEFSX0FSUkFZLCAmYW1wO2FyciwgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSBlcnJvciAqLworICAgIH0KKyAgIGdfYXNzZXJ0IChhcnIgIT0gTlVMTCk7CisgICBwcmludGYgKCJnb3QgYmFjayAldSB2YWx1ZXMiLCBhcnItJmd0O2xlbik7Cis8L3ByZT48cD4KKwk8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJTZW5kaW5nIGEgR0hhc2hUYWJsZSI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iZ2xpYi1zZW5kaW5nLWhhc2giPjwvYT5TZW5kaW5nIGEgR0hhc2hUYWJsZTwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICBHSGFzaFRhYmxlICpoYXNoID0gZ19oYXNoX3RhYmxlX25ldyAoZ19zdHJfaGFzaCwgZ19zdHJfZXF1YWwpOworICBndWludDMyIHJldDsKKyAgCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGhhc2gsICJmb28iLCAiYmFyIik7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGhhc2gsICJiYXoiLCAid2hlZSIpOworCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJIYXNoU2l6ZSIsICZhbXA7ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9HX1NUUklOR19TVFJJTkdfSEFTSCwgaGFzaCwgR19UWVBFX0lOVkFMSUQsCisJCQkgIEdfVFlQRV9VSU5ULCAmYW1wO3JldCwgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSBlcnJvciAqLworICAgIH0KKyAgZ19hc3NlcnQgKHJldCA9PSAyKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKGhhc2gpOworPC9wcmU+PHA+CisJPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iUmVjZWl2aW5nIGEgYm9vbGVhbiBhbmQgYSBzdHJpbmciPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImdsaWItcmVjZWl2aW5nLWJvb2wtaW50Ij48L2E+UmVjZWl2aW5nIGEgYm9vbGVhbiBhbmQgYSBzdHJpbmc8L2g0PjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyAgZ2Jvb2xlYW4gYm9vbHJldDsKKyAgY2hhciAqc3RycmV0OworICAKKyAgZXJyb3IgPSBOVUxMOworICBpZiAoIWRidXNfZ19wcm94eV9jYWxsIChwcm94eSwgIkdldFN0dWZmIiwgJmFtcDtlcnJvciwKKwkJCSAgR19UWVBFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9CT09MRUFOLCAmYW1wO2Jvb2xyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICZhbXA7c3RycmV0LAorCQkJICBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICBwcmludGYgKCIlcyAlcyIsIGJvb2xyZXQgPyAiVFJVRSIgOiAiRkFMU0UiLCBzdHJyZXQpOworICBnX2ZyZWUgKHN0cnJldCk7Cis8L3ByZT48cD4KKwk8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJTZW5kaW5nIHR3byBhcnJheXMgb2Ygc3RyaW5ncyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iZ2xpYi1zZW5kaW5nLXN0ci1hcnJheXMiPjwvYT5TZW5kaW5nIHR3byBhcnJheXMgb2Ygc3RyaW5nczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICAvKiBOVUxMIHRlcm1pbmF0ZSAqLworICBjaGFyICpzdHJzX3N0YXRpY1tdID0geyJmb28iLCAiYmFyIiwgImJheiIsIE5VTEx9OworICAvKiBUYWtlIHBvaW50ZXIgdG8gYXJyYXk7IGNhbm5vdCBwYXNzIGFycmF5IGRpcmVjdGx5ICovCisgIGNoYXIgKipzdHJzX3N0YXRpY19wID0gc3Ryc19zdGF0aWM7CisgIGNoYXIgKipzdHJzX2R5bmFtaWM7CisKKyAgc3Ryc19keW5hbWljID0gZ19uZXcgKGNoYXIgKiwgNCk7CisgIHN0cnNfZHluYW1pY1swXSA9IGdfc3RyZHVwICgiaGVsbG8iKTsKKyAgc3Ryc19keW5hbWljWzFdID0gZ19zdHJkdXAgKCJ3b3JsZCIpOworICBzdHJzX2R5bmFtaWNbMl0gPSBnX3N0cmR1cCAoIiEiKTsKKyAgLyogTlVMTCB0ZXJtaW5hdGUgKi8KKyAgc3Ryc19keW5hbWljWzNdID0gTlVMTDsKKyAgCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJUd29TdHJBcnJheXMiLCAmYW1wO2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfU1RSViwgc3Ryc19zdGF0aWNfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX1NUUlYsIHN0cnNfZHluYW1pYywKKwkJCSAgR19UWVBFX0lOVkFMSUQsCisJCQkgIEdfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgZXJyb3IgKi8KKyAgICB9CisgICBnX3N0cmZyZWV2IChzdHJzX2R5bmFtaWMpOworPC9wcmU+PHA+CisJPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QzIiB0aXRsZT0iU2VuZGluZyBhIGJvb2xlYW4sIHJlY2VpdmluZyBhbiBhcnJheSBvZiBzdHJpbmdzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJnbGliLWdldHRpbmctc3RyLWFycmF5Ij48L2E+U2VuZGluZyBhIGJvb2xlYW4sIHJlY2VpdmluZyBhbiBhcnJheSBvZiBzdHJpbmdzPC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgIGNoYXIgKipzdHJzOworICBjaGFyICoqc3Ryc19wOworICBnYm9vbGVhbiBibGFoOworCisgIGVycm9yID0gTlVMTDsKKyAgYmxhaCA9IFRSVUU7CisgIGlmICghZGJ1c19nX3Byb3h5X2NhbGwgKHByb3h5LCAiR2V0U3RycyIsICZhbXA7ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9CT09MRUFOLCBibGFoLAorCQkJICBHX1RZUEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX1NUUlYsICZhbXA7c3RycywKKwkJCSAgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSBlcnJvciAqLworICAgIH0KKyAgIGZvciAoc3Ryc19wID0gc3RyczsgKnN0cnNfcDsgc3Ryc19wKyspCisgICAgIHByaW50ZiAoImdvdCBzdHJpbmc6IFwiJXNcIiIsICpzdHJzX3ApOworICAgZ19zdHJmcmVldiAoc3Rycyk7Cis8L3ByZT48cD4KKwk8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDMiIHRpdGxlPSJTZW5kaW5nIGEgdmFyaWFudCI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGg0IGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iZ2xpYi1zZW5kaW5nLXZhcmlhbnQiPjwvYT5TZW5kaW5nIGEgdmFyaWFudDwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorICBHVmFsdWUgdmFsID0gezAsIH07CisKKyAgZ192YWx1ZV9pbml0ICgmYW1wO3ZhbCwgR19UWVBFX1NUUklORyk7CisgIGdfdmFsdWVfc2V0X3N0cmluZyAoJmFtcDt2YWwsICJoZWxsbyB3b3JsZCIpOworICAKKyAgZXJyb3IgPSBOVUxMOworICBpZiAoIWRidXNfZ19wcm94eV9jYWxsIChwcm94eSwgIlNlbmRWYXJpYW50IiwgJmFtcDtlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX1ZBTFVFLCAmYW1wO3ZhbCwgR19UWVBFX0lOVkFMSUQsCisJCQkgIEdfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgZXJyb3IgKi8KKyAgICB9CisgIGdfYXNzZXJ0IChyZXQgPT0gMik7CisgIGdfdmFsdWVfdW5zZXQgKCZhbXA7dmFsKTsKKzwvcHJlPjxwPgorCTwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0MyIgdGl0bGU9IlJlY2VpdmluZyBhIHZhcmlhbnQiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoNCBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImdsaWItcmVjZWl2aW5nLXZhcmlhbnQiPjwvYT5SZWNlaXZpbmcgYSB2YXJpYW50PC9oND48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisgIEdWYWx1ZSB2YWwgPSB7MCwgfTsKKworICBlcnJvciA9IE5VTEw7CisgIGlmICghZGJ1c19nX3Byb3h5X2NhbGwgKHByb3h5LCAiR2V0VmFyaWFudCIsICZhbXA7ZXJyb3IsIEdfVFlQRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfVkFMVUUsICZhbXA7dmFsLCBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICBpZiAoR19WQUxVRV9UWVBFICgmYW1wO3ZhbCkgPT0gR19UWVBFX1NUUklORykKKyAgICBwcmludGYgKCIlc1xuIiwgZ192YWx1ZV9nZXRfc3RyaW5nICgmYW1wO3ZhbCkpOworICBlbHNlIGlmIChHX1ZBTFVFX1RZUEUgKCZhbXA7dmFsKSA9PSBHX1RZUEVfSU5UKQorICAgIHByaW50ZiAoIiVkXG4iLCBnX3ZhbHVlX2dldF9pbnQgKCZhbXA7dmFsKSk7CisgIGVsc2UKKyAgICAuLi4KKyAgZ192YWx1ZV91bnNldCAoJmFtcDt2YWwpOworPC9wcmU+PHA+CisJPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QyIiB0aXRsZT0iR2VuZXJhdGVkIEJpbmRpbmdzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj48YSBuYW1lPSJnbGliLWdlbmVyYXRlZC1iaW5kaW5ncyI+PC9hPkdlbmVyYXRlZCBCaW5kaW5nczwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICAgIEJ5IHVzaW5nIHRoZSBJbnRyb3NwZWN0aW9uIFhNTCBmaWxlcywgY29udmVuaWVudCBjbGllbnQtc2lkZSBiaW5kaW5ncworICAgICAgICBjYW4gYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHRvIGVhc2UgdGhlIHVzZSBvZiBhIHJlbW90ZSBEQnVzIG9iamVjdC4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgSGVyZSBpcyBhIHNhbXBsZSBYTUwgZmlsZSB3aGljaCBkZXNjcmliZXMgYW4gb2JqZWN0IHRoYXQgZXhwb3NlcworICAgICAgICBvbmUgbWV0aG9kLCBuYW1lZCA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+TWFueUFyZ3M8L2NvZGU+LgorICAgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8mZ3Q7CismbHQ7bm9kZSBuYW1lPSIvY29tL2V4YW1wbGUvTXlPYmplY3QiJmd0OworICAmbHQ7aW50ZXJmYWNlIG5hbWU9ImNvbS5leGFtcGxlLk15T2JqZWN0IiZndDsKKyAgICAmbHQ7bWV0aG9kIG5hbWU9Ik1hbnlBcmdzIiZndDsKKyAgICAgICZsdDthcmcgdHlwZT0idSIgbmFtZT0ieCIgZGlyZWN0aW9uPSJpbiIgLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0icyIgbmFtZT0ic3RyIiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJkIiBuYW1lPSJ0cm91YmxlIiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJkIiBuYW1lPSJkX3JldCIgZGlyZWN0aW9uPSJvdXQiIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9InMiIG5hbWU9InN0cl9yZXQiIGRpcmVjdGlvbj0ib3V0IiAvJmd0OworICAgICZsdDsvbWV0aG9kJmd0OworICAmbHQ7L2ludGVyZmFjZSZndDsKKyZsdDsvbm9kZSZndDsKKzwvcHJlPjxwPgorICAgICAgPC9wPjxwPgorICAgICAgICBSdW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXMtYmluZGluZy10b29sIC0tbW9kZT1nbGliLWNsaWVudAorICAgICAgICAgIDxlbSBjbGFzcz0icmVwbGFjZWFibGUiPjxjb2RlPkZJTEVOQU1FPC9jb2RlPjwvZW0+ICZndDsKKyAgICAgICAgICA8ZW0gY2xhc3M9InJlcGxhY2VhYmxlIj48Y29kZT5IRUFERVJfTkFNRTwvY29kZT48L2VtPjwvY29kZT4gdG8gZ2VuZXJhdGUgdGhlIGhlYWRlcgorICAgICAgICBmaWxlLiAgRm9yIGV4YW1wbGU6IDxzcGFuIGNsYXNzPSJjb21tYW5kIj48c3Ryb25nPmRidXMtYmluZGluZy10b29sIC0tbW9kZT1nbGliLWNsaWVudAorICAgICAgICAgIG15LW9iamVjdC54bWwgJmd0OyBteS1vYmplY3QtYmluZGluZ3MuaDwvc3Ryb25nPjwvc3Bhbj4uICBUaGlzIHdpbGwgZ2VuZXJhdGUKKyAgICAgICAgaW5saW5lIGZ1bmN0aW9ucyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlczoKKyAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKy8qIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsICovCitnYm9vbGVhbgorY29tX2V4YW1wbGVfTXlPYmplY3RfbWFueV9hcmdzIChEQnVzR1Byb3h5ICpwcm94eSwgY29uc3QgZ3VpbnQgSU5feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIElOX3N0ciwgY29uc3QgZ2RvdWJsZSBJTl90cm91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlKiBPVVRfZF9yZXQsIGNoYXIgKiogT1VUX3N0cl9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworLyogVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsICovCitEQnVzR1Byb3h5Q2FsbCoKK2NvbV9leGFtcGxlX015T2JqZWN0X21hbnlfYXJnc19hc3luYyAoREJ1c0dQcm94eSAqcHJveHksIGNvbnN0IGd1aW50IElOX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBJTl9zdHIsIGNvbnN0IGdkb3VibGUgSU5fdHJvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tX2V4YW1wbGVfTXlPYmplY3RfbWFueV9hcmdzX3JlcGx5IGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyZGF0YSk7CisKKy8qIFRoaXMgaXMgdGhlIHR5cGVkZWYgZm9yIHRoZSBub24tYmxvY2tpbmcgY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZAorKCpjb21fZXhhbXBsZV9NeU9iamVjdF9tYW55X2FyZ3NfcmVwbHkpCisoREJ1c0dQcm94eSAqcHJveHksIGdkb3VibGUgT1VUX2RfcmV0LCBjaGFyICogT1VUX3N0cl9yZXQsCisgR0Vycm9yICplcnJvciwgZ3BvaW50ZXIgdXNlcmRhdGEpOworPC9wcmU+PHA+CisgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpbiBhbGwgZnVuY3Rpb25zIGlzIGEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCdXNHUHJveHkKKyAgICAgICAgKjwvY29kZT4sIHdoaWNoIHlvdSBzaG91bGQgY3JlYXRlIHdpdGggdGhlIHVzdWFsCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5kYnVzX2dfcHJveHlfbmV3Xyo8L2NvZGU+IGZ1bmN0aW9ucy4gIEZvbGxvd2luZyB0aGF0IGFyZSB0aGUKKyAgICAgICAgImluIiBhcmd1bWVudHMsIGFuZCB0aGVuIGVpdGhlciB0aGUgIm91dCIgYXJndW1lbnRzIGFuZCBhCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HRXJyb3IgKjwvY29kZT4gZm9yIHRoZSBzeW5jaHJvbm91cyAoYmxvY2tpbmcpIGZ1bmN0aW9uLCBvcgorICAgICAgICBjYWxsYmFjayBhbmQgdXNlciBkYXRhIGFyZ3VtZW50cyBmb3IgdGhlIGFzeW5jaHJvbm91cyAobm9uLWJsb2NraW5nKQorICAgICAgICBmdW5jdGlvbi4gIFRoZSBjYWxsYmFjayBpbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHBhc3NlcyB0aGUKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkRCdXNHUHJveHkgKjwvY29kZT4sIHRoZSByZXR1cm5lZCAib3V0IiBhcmd1bWVudHMsIGFuCisgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5HRXJyb3IgKjwvY29kZT4gd2hpY2ggaXMgc2V0IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvdGhlcndpc2UKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk5VTEw8L2NvZGU+LCBhbmQgdGhlIHVzZXIgZGF0YS4KKyAgICAgIDwvcD48cD4KKyAgICAgICAgQXMgd2l0aCB0aGUgc2VydmVyLXNpZGUgYmluZGluZ3Mgc3VwcG9ydCAoc2VlIDxhIGNsYXNzPSJ4cmVmIiBocmVmPSIjZ2xpYi1zZXJ2ZXIiIHRpdGxlPSJHTGliIEFQSTogSW1wbGVtZW50aW5nIE9iamVjdHMiPnRoZSBzZWN0aW9uIGNhbGxlZCAmIzgyMjA7R0xpYiBBUEk6IEltcGxlbWVudGluZyBPYmplY3RzJiM4MjIxOzwvYT4pLCB0aGUgZXhhY3QgYmVoYXZpb3VyIG9mIHRoZSBjbGllbnQtc2lkZQorICAgICAgICBiaW5kaW5ncyBjYW4gYmUgbWFuaXB1bGF0ZWQgdXNpbmcgImFubm90YXRpb25zIi4gIEN1cnJlbnRseSB0aGUgb25seQorICAgICAgICBhbm5vdGF0aW9uIHVzZWQgYnkgdGhlIGNsaWVudCBiaW5kaW5ncyBpcworICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5Ob1JlcGx5PC9jb2RlPiwgd2hpY2ggc2V0cyB0aGUKKyAgICAgICAgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGNsaWVudCBpc24ndCBleHBlY3RpbmcgYSByZXBseSB0byB0aGUgbWV0aG9kCisgICAgICAgIGNhbGwsIHNvIGEgcmVwbHkgc2hvdWxkbid0IGJlIHNlbnQuICBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gc3BlZWQgdXAKKyAgICAgICAgcmFwaWQgbWV0aG9kIGNhbGxzIHdoZXJlIHRoZXJlIGFyZSBubyAib3V0IiBhcmd1bWVudHMsIGFuZCBub3Qga25vd2luZworICAgICAgICBpZiB0aGUgbWV0aG9kIHN1Y2NlZWRlZCBpcyBhbiBhY2NlcHRhYmxlIGNvbXByb21pc2UgdG8gaGFsZiB0aGUgdHJhZmZpYworICAgICAgICBvbiB0aGUgYnVzLgorICAgICAgPC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iR0xpYiBBUEk6IEltcGxlbWVudGluZyBPYmplY3RzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9ImdsaWItc2VydmVyIj48L2E+R0xpYiBBUEk6IEltcGxlbWVudGluZyBPYmplY3RzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIEF0IHRoZSBtb21lbnQsIHRvIGV4cG9zZSBhIEdPYmplY3QgdmlhIEQtQnVzLCB5b3UgbXVzdAorICAgICAgd3JpdGUgWE1MIGJ5IGhhbmQgd2hpY2ggZGVzY3JpYmVzIHRoZSBtZXRob2RzIGV4cG9ydGVkCisgICAgICBieSB0aGUgb2JqZWN0LiAgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYW51YWwgc3RlcCB3aWxsCisgICAgICBiZSBvYnZpYXRlZCBieSB0aGUgdXBjb21pbmcgR0xpYiBpbnRyb3NwZWN0aW9uIHN1cHBvcnQuCisgICAgPC9wPjxwPgorICAgICAgSGVyZSBpcyBhIHNhbXBsZSBYTUwgZmlsZSB3aGljaCBkZXNjcmliZXMgYW4gb2JqZWN0IHRoYXQgZXhwb3NlcworICAgICAgb25lIG1ldGhvZCwgbmFtZWQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPk1hbnlBcmdzPC9jb2RlPi4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPyZndDsKKworJmx0O25vZGUgbmFtZT0iL2NvbS9leGFtcGxlL015T2JqZWN0IiZndDsKKworICAmbHQ7aW50ZXJmYWNlIG5hbWU9ImNvbS5leGFtcGxlLk15T2JqZWN0IiZndDsKKyAgICAmbHQ7YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNTeW1ib2wiIHZhbHVlPSJteV9vYmplY3QiLyZndDsKKyAgICAmbHQ7bWV0aG9kIG5hbWU9Ik1hbnlBcmdzIiZndDsKKyAgICAgICZsdDshLS0gVGhpcyBpcyBvcHRpb25hbCwgYW5kIGluIHRoaXMgY2FzZSBpcyByZWR1bnVuZGFudCAtLSZndDsKKyAgICAgICZsdDthbm5vdGF0aW9uIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbCIgdmFsdWU9Im15X29iamVjdF9tYW55X2FyZ3MiLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0idSIgbmFtZT0ieCIgZGlyZWN0aW9uPSJpbiIgLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0icyIgbmFtZT0ic3RyIiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJkIiBuYW1lPSJ0cm91YmxlIiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJkIiBuYW1lPSJkX3JldCIgZGlyZWN0aW9uPSJvdXQiIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9InMiIG5hbWU9InN0cl9yZXQiIGRpcmVjdGlvbj0ib3V0IiAvJmd0OworICAgICZsdDsvbWV0aG9kJmd0OworICAmbHQ7L2ludGVyZmFjZSZndDsKKyZsdDsvbm9kZSZndDsKKzwvcHJlPjxwPgorICAgIDwvcD48cD4KKyAgICAgIFRoaXMgWE1MIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgRC1CdXMgaW50cm9zcGVjdGlvbiBYTUwKKyAgICAgIGZvcm1hdC4gRXhjZXB0IHdlIG11c3QgaW5jbHVkZSBhbiAiYW5ub3RhdGlvbiIgd2hpY2ggZ2l2ZSB0aGUgQworICAgICAgc3ltYm9scyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgaW1wbGVtZW50YXRpb24gcHJlZml4CisgICAgICAoPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm15X29iamVjdDwvY29kZT4pLiAgSW4gYWRkaXRpb24sIGlmIHBhcnRpY3VsYXIKKyAgICAgIG1ldGhvZHMgc3ltYm9sIG5hbWVzIGRldmlhdGUgZnJvbSBDIGNvbnZlbnRpb24KKyAgICAgIChpLmUuIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5NYW55QXJnczwvY29kZT4gLSZndDsKKyAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5tYW55X2FyZ3M8L2NvZGU+KSwgeW91IG1heSBzcGVjaWZ5IGFuIGFubm90YXRpb24KKyAgICAgIGdpdmluZyB0aGUgQyBzeW1ib2wuCisgICAgPC9wPjxwPgorICAgICAgT25jZSB5b3UgaGF2ZSB3cml0dGVuIHRoaXMgWE1MLCBydW4gPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXMtYmluZGluZy10b29sIC0tbW9kZT1nbGliLXNlcnZlciA8ZW0gY2xhc3M9InJlcGxhY2VhYmxlIj48Y29kZT5GSUxFTkFNRTwvY29kZT48L2VtPiAmZ3Q7IDxlbSBjbGFzcz0icmVwbGFjZWFibGUiPjxjb2RlPkhFQURFUl9OQU1FPC9jb2RlPjwvZW0+LjwvY29kZT4gdG8KKyAgICAgIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUuICBGb3IgZXhhbXBsZTogPHNwYW4gY2xhc3M9ImNvbW1hbmQiPjxzdHJvbmc+ZGJ1cy1iaW5kaW5nLXRvb2wgLS1tb2RlPWdsaWItc2VydmVyIG15LW9iamVjdC54bWwgJmd0OyBteS1vYmplY3QtZ2x1ZS5oPC9zdHJvbmc+PC9zcGFuPi4KKyAgICA8L3A+PHA+CisgICAgICBOZXh0LCBpbmNsdWRlIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGluIHlvdXIgcHJvZ3JhbSwgYW5kIGludm9rZQorICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPmRidXNfZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9pbmZvPC9jb2RlPiBpbiB0aGUgY2xhc3MKKyAgICAgIGluaXRpYWxpemVyLCBwYXNzaW5nIHRoZSBvYmplY3QgY2xhc3MgYW5kICJvYmplY3QgaW5mbyIgaW5jbHVkZWQgaW4gdGhlCisgICAgICBoZWFkZXIuICBGb3IgZXhhbXBsZToKKyAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CisJZGJ1c19nX29iamVjdF90eXBlX2luc3RhbGxfaW5mbyAoQ09NX0ZPT19UWVBFX01ZX09CSkVDVCwgJmFtcDtjb21fZm9vX215X29iamVjdF9pbmZvKTsKKyAgICAgIDwvcHJlPjxwPgorICAgICAgVGhpcyBzaG91bGQgYmUgZG9uZSBleGFjdGx5IG9uY2UgcGVyIG9iamVjdCBjbGFzcy4KKyAgICA8L3A+PHA+CisgICAgICBUbyBhY3R1YWxseSBpbXBsZW1lbnQgdGhlIG1ldGhvZCwganVzdCBkZWZpbmUgYSBDIGZ1bmN0aW9uIG5hbWVkIGUuZy4KKyAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5teV9vYmplY3RfbWFueV9hcmdzPC9jb2RlPiBpbiB0aGUgc2FtZSBmaWxlIGFzIHRoZSBpbmZvCisgICAgICBoZWFkZXIgaXMgaW5jbHVkZWQuICBBdCB0aGUgbW9tZW50LCBpdCBpcyByZXF1aXJlZCB0aGF0IHRoaXMgZnVuY3Rpb24KKyAgICAgIGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBydWxlczoKKyAgICAgIDwvcD48ZGl2IGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCBjbGFzcz0iaXRlbWl6ZWRsaXN0IiB0eXBlPSJkaXNjIj48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKwkgICAgVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUgb2YgdHlwZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Z2Jvb2xlYW48L2NvZGU+OworCSAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+VFJVRTwvY29kZT4gb24gc3VjY2VzcywgYW5kIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5GQUxTRTwvY29kZT4KKwkgICAgb3RoZXJ3aXNlLgorCSAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisJICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QuCisJICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKwkgICAgRm9sbG93aW5nIHRoZSBvYmplY3QgaW5zdGFuY2UgcG9pbnRlciBhcmUgdGhlIG1ldGhvZAorCSAgICBpbnB1dCB2YWx1ZXMuCisJICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKwkgICAgRm9sbG93aW5nIHRoZSBpbnB1dCB2YWx1ZXMgYXJlIHBvaW50ZXJzIHRvIHJldHVybiB2YWx1ZXMuCisJICA8L3A+PC9saT48bGkgY2xhc3M9Imxpc3RpdGVtIj48cD4KKwkgICAgVGhlIGZpbmFsIHBhcmFtZXRlciBtdXN0IGJlIGEgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkdFcnJvciAqKjwvY29kZT4uCisJICAgIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5GQUxTRTwvY29kZT4gZm9yIGFuCisJICAgIGVycm9yLCB0aGUgZXJyb3IgcGFyYW1ldGVyIG11c3QgYmUgaW5pdGFsaXplZCB3aXRoCisJICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5nX3NldF9lcnJvcjwvY29kZT4uCisJICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgIDwvcD48cD4KKyAgICAgIEZpbmFsbHksIHlvdSBjYW4gZXhwb3J0IGFuIG9iamVjdCB1c2luZyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+ZGJ1c19nX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZ19vYmplY3Q8L2NvZGU+LiAgRm9yIGV4YW1wbGU6CisgICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgorCSAgZGJ1c19nX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZ19vYmplY3QgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvY29tL2Zvby9NeU9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7CisgICAgICA8L3ByZT48cD4KKyAgICA8L3A+PGRpdiBjbGFzcz0ic2VjdDIiIHRpdGxlPSJTZXJ2ZXItc2lkZSBBbm5vdGF0aW9ucyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iZ2xpYi1hbm5vdGF0aW9ucyI+PC9hPlNlcnZlci1zaWRlIEFubm90YXRpb25zPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgICAgVGhlcmUgYXJlIHNldmVyYWwgYW5ub3RhdGlvbnMgdGhhdCBhcmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlCisgICAgICAgIHNlcnZlci1zaWRlIGJpbmRpbmdzLiAgVGhlIG1vc3QgY29tbW9uIGFubm90YXRpb24gaXMKKyAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbDwvY29kZT4gYnV0IHRoZXJlIGFyZSBvdGhlcgorICAgICAgICBhbm5vdGF0aW9ucyB3aGljaCBhcmUgb2Z0ZW4gdXNlZnVsLgorICAgICAgICA8L3A+PGRpdiBjbGFzcz0idmFyaWFibGVsaXN0Ij48ZGw+PGR0PjxzcGFuIGNsYXNzPSJ0ZXJtIj48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DU3ltYm9sPC9jb2RlPjwvc3Bhbj48L2R0PjxkZD48cD4KKyAgICAgICAgICAgICAgICBUaGlzIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBDIHN5bWJvbCBuYW1lcyBmb3IKKyAgICAgICAgICAgICAgICB0aGUgdmFyaW91cyB0eXBlcyAoaW50ZXJmYWNlLCBtZXRob2QsIGV0YyksIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICBuYW1lIERCdXMgZ2VuZXJhdGVzLgorICAgICAgICAgICAgICA8L3A+PC9kZD48ZHQ+PHNwYW4gY2xhc3M9InRlcm0iPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkFzeW5jPC9jb2RlPjwvc3Bhbj48L2R0PjxkZD48cD4KKyAgICAgICAgICAgICAgICBUaGlzIGFubm90YXRpb24gbWFya3MgdGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBhcyBhbgorICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBmdW5jdGlvbiwgd2hpY2ggZG9lc24ndCByZXR1cm4gYSByZXNwb25zZSBzdHJhaWdodAorICAgICAgICAgICAgICAgIGF3YXkgYnV0IHdpbGwgc2VuZCB0aGUgcmVzcG9uc2UgYXQgc29tZSBsYXRlciBwb2ludCB0byBjb21wbGV0ZQorICAgICAgICAgICAgICAgIHRoZSBjYWxsLiAgVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBub24tYmxvY2tpbmcgc2VydmljZXMgd2hlcmUKKyAgICAgICAgICAgICAgICBtZXRob2QgY2FsbHMgY2FuIHRha2UgdGltZS4KKyAgICAgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgICAgIFdoZW4gYSBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIGlzCisgICAgICAgICAgICAgICAgZGlmZmVyZW50LiBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBmdW5jdGlvbiBjb25mb3JtIHRvIHRoZQorICAgICAgICAgICAgICAgIGZvbGxvd2luZyBydWxlczoKKyAgICAgICAgICAgICAgICA8L3A+PGRpdiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgY2xhc3M9Iml0ZW1pemVkbGlzdCIgdHlwZT0iZGlzYyI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUgb2YgdHlwZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+Z2Jvb2xlYW48L2NvZGU+OworICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5UUlVFPC9jb2RlPiBvbiBzdWNjZXNzLCBhbmQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPkZBTFNFPC9jb2RlPgorICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZS4gVE9ETzogdGhlIHJldHVybiB2YWx1ZSBpcyBjdXJyZW50bHkgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICAgICAgRm9sbG93aW5nIHRoZSBvYmplY3QgaW5zdGFuY2UgcG9pbnRlciBhcmUgdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0IHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wPjwvbGk+PGxpIGNsYXNzPSJsaXN0aXRlbSI+PHA+CisgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpbmFsIHBhcmFtZXRlciBtdXN0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+REJ1c0dNZXRob2RJbnZvY2F0aW9uICo8L2NvZGU+LiAgVGhpcyBpcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiBzZW5kaW5nIHRoZSByZXNwb25zZSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudCwgYnkKKyAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5kYnVzX2dfbWV0aG9kX3JldHVybjwvY29kZT4gb3IKKyAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+ZGJ1c19nX21ldGhvZF9yZXR1cm5fZXJyb3I8L2NvZGU+LgorICAgICAgICAgICAgICAgICAgICA8L3A+PC9saT48L3VsPjwvZGl2PjxwPgorICAgICAgICAgICAgICA8L3A+PC9kZD48ZHQ+PHNwYW4gY2xhc3M9InRlcm0iPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNvbnN0PC9jb2RlPjwvc3Bhbj48L2R0PjxkZD48cD5UaGlzIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvICJvdXQiCisgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj4mbHQ7YXJnJmd0OzwvY29kZT4gbm9kZXMsIGFuZCBzcGVjaWZpZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzbid0IGJlaW5nIGNvcGllZCB3aGVuIHJldHVybmVkLiAgRm9yIGV4YW1wbGUsIHRoaXMKKyAgICAgICAgICAgICAgdHVybnMgYSAncycgYXJndW1lbnQgZnJvbSBhIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5jaGFyICoqPC9jb2RlPiB0byBhCisgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj5jb25zdCBjaGFyICoqPC9jb2RlPiwgYW5kIHJlc3VsdHMgaW4gdGhlIGFyZ3VtZW50IG5vdAorICAgICAgICAgICAgICBiZWluZyBmcmVlZCBieSBEQnVzIGFmdGVyIHRoZSBtZXNzYWdlIGlzIHNlbnQuCisgICAgICAgICAgICAgIDwvcD48L2RkPjxkdD48c3BhbiBjbGFzcz0idGVybSI+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuUmV0dXJuVmFsPC9jb2RlPjwvc3Bhbj48L2R0PjxkZD48cD4KKyAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvICJvdXQiCisgICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPiZsdDthcmcmZ3Q7PC9jb2RlPiBub2RlcywgYW5kIGFsdGVycyB0aGUgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaWduYXR1cmUuICBJdCBjdXJyZW50bHkgY2FuIGJlIHNldCB0byB0d28gdmFsdWVzOgorICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj4iIjwvY29kZT4gb3IgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPiJlcnJvciI8L2NvZGU+LiAgVGhlCisgICAgICAgICAgICAgICAgYXJndW1lbnQgbWFya2VkIHdpdGggdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJldHVybmVkIHZpYSBhCisgICAgICAgICAgICAgICAgcG9pbnRlciBhcmd1bWVudCwgYnV0IGJ5IHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4gIElmIHRoZQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSdzIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0Vycm9yCisgICAgICAgICAgICAgICAgKjwvY29kZT4gYXJndW1lbnQgaXMgYWxzbyBvbWl0dGVkIHNvIHRoZXJlIGlzIG5vIHN0YW5kYXJkIHdheQorICAgICAgICAgICAgICAgIHRvIHJldHVybiBhbiBlcnJvciB2YWx1ZS4gIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIGludGVyZmFjaW5nCisgICAgICAgICAgICAgICAgd2l0aCBleGlzdGluZyBjb2RlLCBhcyBpdCBpcyBwb3NzaWJsZSB0byBtYXRjaCBleGlzdGluZyBBUElzLgorICAgICAgICAgICAgICAgIElmIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+ImVycm9yIjwvY29kZT4sIHRoZW4gdGhlCisgICAgICAgICAgICAgICAgZmluYWwgYXJndW1lbnQgaXMgYSA8Y29kZSBjbGFzcz0ibGl0ZXJhbCI+R0Vycm9yICo8L2NvZGU+IGFzIHVzdWFsLgorICAgICAgICAgICAgICA8L3A+PHA+CisgICAgICAgICAgICAgICAgU29tZSBleGFtcGxlcyB0byBkZW1vbnN0cmF0ZSB0aGUgdXNhZ2UuIFRoaXMgaW50cm9zcGVjdGlvbiBYTUw6CisgICAgICAgICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyZsdDttZXRob2QgbmFtZT0iSW5jcmVtZW50IiZndDsKKyAgJmx0O2FyZyB0eXBlPSJ1IiBuYW1lPSJ4IiAvJmd0OworICAmbHQ7YXJnIHR5cGU9InUiIGRpcmVjdGlvbj0ib3V0IiAvJmd0OworJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgICAgICAgRXhwZWN0cyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CitnYm9vbGVhbgorbXlfb2JqZWN0X2luY3JlbWVudCAoTXlPYmplY3QgKm9iaiwgZ2ludDMyIHgsIGdpbnQzMiAqcmV0LCBHRXJyb3IgKiplcnJvcik7CisgICAgICAgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgICAgIDwvcD48cD4KKyAgICAgICAgICAgICAgICBUaGlzIGludHJvc3BlY3Rpb24gWE1MOgorICAgICAgICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CismbHQ7bWV0aG9kIG5hbWU9IkluY3JlbWVudFJldHZhbCImZ3Q7CisgICZsdDthcmcgdHlwZT0idSIgbmFtZT0ieCIgLyZndDsKKyAgJmx0O2FyZyB0eXBlPSJ1IiBkaXJlY3Rpb249Im91dCIgJmd0OworICAgICZsdDthbm5vdGF0aW9uIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuUmV0dXJuVmFsIiB2YWx1ZT0iIi8mZ3Q7CisgICZsdDsvYXJnJmd0OworJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgICAgICAgRXhwZWN0cyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CitnaW50MzIKK215X29iamVjdF9pbmNyZW1lbnRfcmV0dmFsIChNeU9iamVjdCAqb2JqLCBnaW50MzIgeCkKKyAgICAgICAgICAgICAgICA8L3ByZT48cD4KKyAgICAgICAgICAgICAgPC9wPjxwPgorICAgICAgICAgICAgICAgIFRoaXMgaW50cm9zcGVjdGlvbiBYTUw6CisgICAgICAgICAgICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KKyZsdDttZXRob2QgbmFtZT0iSW5jcmVtZW50UmV0dmFsRXJyb3IiJmd0OworICAmbHQ7YXJnIHR5cGU9InUiIG5hbWU9IngiIC8mZ3Q7CisgICZsdDthcmcgdHlwZT0idSIgZGlyZWN0aW9uPSJvdXQiICZndDsKKyAgICAmbHQ7YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLlJldHVyblZhbCIgdmFsdWU9ImVycm9yIi8mZ3Q7CisgICZsdDsvYXJnJmd0OworJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgICAgICAgRXhwZWN0cyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CitnaW50MzIKK215X29iamVjdF9pbmNyZW1lbnRfcmV0dmFsX2Vycm9yIChNeU9iamVjdCAqb2JqLCBnaW50MzIgeCwgR0Vycm9yICoqZXJyb3IpCisgICAgICAgICAgICAgICAgPC9wcmU+PHA+CisgICAgICAgICAgICAgIDwvcD48L2RkPjwvZGw+PC9kaXY+PHA+CisgICAgICA8L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJQeXRob24gQVBJIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9InB5dGhvbi1jbGllbnQiPjwvYT5QeXRob24gQVBJPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIFRoZSBQeXRob24gQVBJLCBkYnVzLXB5dGhvbiwgaXMgbm93IGRvY3VtZW50ZWQgc2VwYXJhdGVseSBpbgorICAgICAgPGEgY2xhc3M9InVsaW5rIiBocmVmPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtcHl0aG9uL2RvYy90dXRvcmlhbC5odG1sIiB0YXJnZXQ9Il90b3AiPnRoZSBkYnVzLXB5dGhvbiB0dXRvcmlhbDwvYT4gKGFsc28gYXZhaWxhYmxlIGluIGRvYy90dXRvcmlhbC50eHQsCisgICAgICBhbmQgZG9jL3R1dG9yaWFsLmh0bWwgaWYgYnVpbHQgd2l0aCBweXRob24tZG9jdXRpbHMsIGluIHRoZSBkYnVzLXB5dGhvbgorICAgICAgc291cmNlIGRpc3RyaWJ1dGlvbikuCisgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiB0aXRsZT0iUXQgQVBJOiBVc2luZyBSZW1vdGUgT2JqZWN0cyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJxdC1jbGllbnQiPjwvYT5RdCBBUEk6IFVzaW5nIFJlbW90ZSBPYmplY3RzPC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIAorICAgICAgVGhlIFF0IGJpbmRpbmdzIGFyZSBub3QgeWV0IGRvY3VtZW50ZWQuCisKKyAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdDEiIHRpdGxlPSJRdCBBUEk6IEltcGxlbWVudGluZyBPYmplY3RzIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9InF0LXNlcnZlciI+PC9hPlF0IEFQSTogSW1wbGVtZW50aW5nIE9iamVjdHM8L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgVGhlIFF0IGJpbmRpbmdzIGFyZSBub3QgeWV0IGRvY3VtZW50ZWQuCisgICAgPC9wPjwvZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kb2MvZGJ1cy10dXRvcmlhbC54bWwgYi9kYnVzLTEuNC4xMC9kb2MvZGJ1cy10dXRvcmlhbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzODVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9kYnVzLXR1dG9yaWFsLnhtbApAQCAtMCwwICsxLDE2NjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIgorWworXT4KKworPGFydGljbGUgaWQ9ImluZGV4Ij4KKyAgPGFydGljbGVpbmZvPgorICAgIDx0aXRsZT5ELUJ1cyBUdXRvcmlhbDwvdGl0bGU+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+LgorICAgICAgICBUaGlzIGludGVyZmFjZSBoYXMgb25lIG1ldGhvZCA8bGl0ZXJhbD5JbnRyb3NwZWN0PC9saXRlcmFsPiB3aGljaCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMKKyAgICAgICAgYW4gWE1MIHN0cmluZy4gVGhlIFhNTCBzdHJpbmcgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2VzLCBtZXRob2RzLCBhbmQgc2lnbmFscyBvZiB0aGUgb2JqZWN0LgorICAgICAgICBTZWUgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIGludHJvc3BlY3Rpb24gZm9ybWF0LgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0iZ2xpYi1jbGllbnQiPgorICAgIDx0aXRsZT5HTGliIEFQSTogVXNpbmcgUmVtb3RlIE9iamVjdHM8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgR0xpYiBiaW5kaW5nIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlciBmaWxlCisgICAgICA8bGl0ZXJhbD4mbHQ7ZGJ1cy9kYnVzLWdsaWIuaCZndDs8L2xpdGVyYWw+LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0iZ2xpYi10eXBlbWFwcGluZ3MiPgorICAgICAgPHRpdGxlPkQtQnVzIC0gR0xpYiB0eXBlIG1hcHBpbmdzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorCVRoZSBoZWFydCBvZiB0aGUgR0xpYiBiaW5kaW5ncyBmb3IgRC1CdXMgaXMgdGhlIG1hcHBpbmcgaXQKKwlwcm92aWRlcyBiZXR3ZWVuIEQtQnVzICJ0eXBlIHNpZ25hdHVyZXMiIGFuZCBHTGliIHR5cGVzCisJKDxsaXRlcmFsPkdUeXBlPC9saXRlcmFsPikuIFRoZSBELUJ1cyB0eXBlIHN5c3RlbSBpcyBjb21wb3NlZCBvZgorCWEgbnVtYmVyIG9mICJiYXNpYyIgdHlwZXMsIGFsb25nIHdpdGggc2V2ZXJhbCAiY29udGFpbmVyIiB0eXBlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0iZ2xpYi1iYXNpYy10eXBlbWFwcGluZ3MiPgorCTx0aXRsZT5CYXNpYyB0eXBlIG1hcHBpbmdzPC90aXRsZT4KKwk8cGFyYT4KKwkgIEJlbG93IGlzIGEgbGlzdCBvZiB0aGUgYmFzaWMgdHlwZXMsIGFsb25nIHdpdGggdGhlaXIgYXNzb2NpYXRlZAorCSAgbWFwcGluZyB0byBhIDxsaXRlcmFsPkdUeXBlPC9saXRlcmFsPi4KKwkgIDxpbmZvcm1hbHRhYmxlPgorCSAgICA8dGdyb3VwIGNvbHM9IjQiPgorCSAgICAgIDx0aGVhZD4KKwkJPHJvdz4KKwkJICA8ZW50cnk+RC1CdXMgYmFzaWMgdHlwZTwvZW50cnk+CisJCSAgPGVudHJ5PkdUeXBlPC9lbnRyeT4KKwkJICA8ZW50cnk+RnJlZSBmdW5jdGlvbjwvZW50cnk+CisJCSAgPGVudHJ5Pk5vdGVzPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90aGVhZD4KKwkgICAgICA8dGJvZHk+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX1VDSEFSPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+Qk9PTEVBTjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HX1RZUEVfQk9PTEVBTjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDwvcm93Pjxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPklOVDE2PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9JTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8ZW50cnk+V2lsbCBiZSBjaGFuZ2VkIHRvIGEgPGxpdGVyYWw+R19UWVBFX0lOVDE2PC9saXRlcmFsPiBvbmNlIEdMaWIgaGFzIGl0PC9lbnRyeT4KKwkJICA8L3Jvdz48cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMTY8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX1VJTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8ZW50cnk+V2lsbCBiZSBjaGFuZ2VkIHRvIGEgPGxpdGVyYWw+R19UWVBFX1VJTlQxNjwvbGl0ZXJhbD4gb25jZSBHTGliIGhhcyBpdDwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX0lOVDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDxlbnRyeT5XaWxsIGJlIGNoYW5nZWQgdG8gYSA8bGl0ZXJhbD5HX1RZUEVfSU5UMzI8L2xpdGVyYWw+IG9uY2UgR0xpYiBoYXMgaXQ8L2VudHJ5PgorCQkgIDwvcm93Pjxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HX1RZUEVfVUlOVDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQkgIDxlbnRyeT5XaWxsIGJlIGNoYW5nZWQgdG8gYSA8bGl0ZXJhbD5HX1RZUEVfVUlOVDMyPC9saXRlcmFsPiBvbmNlIEdMaWIgaGFzIGl0PC9lbnRyeT4KKwkJICA8L3Jvdz48cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5JTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HX1RZUEVfR0lOVDY0PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+VUlOVDY0PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9HVUlOVDY0PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+RE9VQkxFPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9ET1VCTEU8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8L3Jvdz48cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX1NUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5nX2ZyZWU8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJICA8L3Jvdz48cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5PQkpFQ1RfUEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5EQlVTX1RZUEVfR19QUk9YWTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5nX29iamVjdF91bnJlZjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5UaGUgcmV0dXJuZWQgcHJveHkgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcmZhY2Ugc2V0OyB1c2UgPGxpdGVyYWw+ZGJ1c19nX3Byb3h5X3NldF9pbnRlcmZhY2U8L2xpdGVyYWw+IHRvIGludm9rZSBtZXRob2RzPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC90Z3JvdXA+CisJICA8L2luZm9ybWFsdGFibGU+CisJICBBcyB5b3UgY2FuIHNlZSwgdGhlIGJhc2ljIG1hcHBpbmcgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZC4KKwk8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJnbGliLWNvbnRhaW5lci10eXBlbWFwcGluZ3MiPgorCTx0aXRsZT5Db250YWluZXIgdHlwZSBtYXBwaW5nczwvdGl0bGU+CisJPHBhcmE+CisJICBUaGUgRC1CdXMgdHlwZSBzeXN0ZW0gYWxzbyBoYXMgYSBudW1iZXIgb2YgImNvbnRhaW5lciIKKwkgIHR5cGVzLCBzdWNoIGFzIDxsaXRlcmFsPkRCVVNfVFlQRV9BUlJBWTwvbGl0ZXJhbD4gYW5kCisJICA8bGl0ZXJhbD5EQlVTX1RZUEVfU1RSVUNUPC9saXRlcmFsPi4gIFRoZSBELUJ1cyB0eXBlIHN5c3RlbQorCSAgaXMgZnVsbHkgcmVjdXJzaXZlLCBzbyBvbmUgY2FuIGZvciBleGFtcGxlIGhhdmUgYW4gYXJyYXkgb2YKKwkgIGFycmF5IG9mIHN0cmluZ3MgKGkuZS4gdHlwZSBzaWduYXR1cmUKKwkgIDxsaXRlcmFsPmFhczwvbGl0ZXJhbD4pLgorCTwvcGFyYT4KKwk8cGFyYT4KKwkgIEhvd2V2ZXIsIG5vdCBhbGwgb2YgdGhlc2UgdHlwZXMgYXJlIGluIGNvbW1vbiB1c2U7IGZvcgorCSAgZXhhbXBsZSwgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nIHRoZSBhdXRob3Iga25vd3Mgb2Ygbm8KKwkgIG9uZSB1c2luZyA8bGl0ZXJhbD5EQlVTX1RZUEVfU1RSVUNUPC9saXRlcmFsPiwgb3IgYQorCSAgPGxpdGVyYWw+REJVU19UWVBFX0FSUkFZPC9saXRlcmFsPiBjb250YWluaW5nIGFueSBub24tYmFzaWMKKwkgIHR5cGUuICBUaGUgYXBwcm9hY2ggdGhlIEdMaWIgYmluZGluZ3MgdGFrZSBpcyBwcmFnbWF0aWM7IHRyeQorCSAgdG8gbWFwIHRoZSBtb3N0IGNvbW1vbiB0eXBlcyBpbiB0aGUgbW9zdCBvYnZpb3VzIHdheSwgYW5kCisJICBsZXQgdXNpbmcgbGVzcyBjb21tb24gYW5kIG1vcmUgY29tcGxleCB0eXBlcyBiZSBsZXNzCisJICAibmF0dXJhbCIuCisJPC9wYXJhPgorCTxwYXJhPgorCSAgRmlyc3QsIEQtQnVzIHR5cGUgc2lnbmF0dXJlcyB3aGljaCBoYXZlIGFuICJvYnZpb3VzIgorCSAgY29ycmVzcG9uZGluZyBidWlsdC1pbiBHTGliIHR5cGUgYXJlIG1hcHBlZCB1c2luZyB0aGF0IHR5cGU6CisJICA8aW5mb3JtYWx0YWJsZT4KKwkgICAgPHRncm91cCBjb2xzPSI2Ij4KKwkgICAgICA8dGhlYWQ+CisJCTxyb3c+CisJCSAgPGVudHJ5PkQtQnVzIHR5cGUgc2lnbmF0dXJlPC9lbnRyeT4KKwkJICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorCQkgIDxlbnRyeT5HVHlwZTwvZW50cnk+CisJCSAgPGVudHJ5PkMgdHlwZWRlZjwvZW50cnk+CisJCSAgPGVudHJ5PkZyZWUgZnVuY3Rpb248L2VudHJ5PgorCQkgIDxlbnRyeT5Ob3RlczwvZW50cnk+CisJCTwvcm93PgorCSAgICAgIDwvdGhlYWQ+CisJICAgICAgPHRib2R5PgorCQk8cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5hczwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5BcnJheSBvZiBzdHJpbmdzPC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R19UWVBFX1NUUlY8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+Y2hhciAqKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5nX3N0cmZyZWV2PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCSAgPC9yb3c+PHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+djwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5HZW5lcmljIHZhbHVlIGNvbnRhaW5lcjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdfVFlQRV9WQUxVRTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HVmFsdWUgKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5nX3ZhbHVlX3Vuc2V0PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PlRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciB2YWx1ZXMgZXhwZWN0IHRoYXQgbWV0aG9kIGNhbGxlcnMgaGF2ZSBhbGxvY2F0ZWQgcmV0dXJuIHZhbHVlczsgc2VlIGJlbG93LjwvZW50cnk+CisJCTwvcm93PgorCSAgICAgIDwvdGJvZHk+CisJICAgIDwvdGdyb3VwPgorCSAgPC9pbmZvcm1hbHRhYmxlPgorCTwvcGFyYT4KKwk8cGFyYT4KKwkgIFRoZSBuZXh0IG1vc3QgY29tbW9uIHJlY3Vyc2l2ZSB0eXBlIHNpZ25hdHVyZXMgYXJlIGFycmF5cyBvZgorCSAgYmFzaWMgdmFsdWVzLiAgVGhlIG1vc3Qgb2J2aW91cyBtYXBwaW5nIGZvciBhcnJheXMgb2YgYmFzaWMKKwkgIHR5cGVzIGlzIGEgPGxpdGVyYWw+R0FycmF5PC9saXRlcmFsPi4gIE5vdywgR0xpYiBkb2VzIG5vdAorCSAgcHJvdmlkZSBhIGJ1aWx0aW4gPGxpdGVyYWw+R1R5cGU8L2xpdGVyYWw+IGZvcgorCSAgPGxpdGVyYWw+R0FycmF5PC9saXRlcmFsPi4gIEhvd2V2ZXIsIHdlIGFjdHVhbGx5IG5lZWQgbW9yZSB0aGFuCisJICB0aGF0IC0gd2UgbmVlZCBhICJwYXJhbWV0ZXJpemVkIiB0eXBlIHdoaWNoIGluY2x1ZGVzIHRoZQorCSAgY29udGFpbmVkIHR5cGUuICBXaHkgd2UgbmVlZCB0aGlzIHdlIHdpbGwgc2VlIGJlbG93LgorCTwvcGFyYT4KKwk8cGFyYT4KKwkgIFRoZSBhcHByb2FjaCB0YWtlbiBpcyB0byBjcmVhdGUgdGhlc2UgdHlwZXMgaW4gdGhlIEQtQnVzIEdMaWIKKwkgIGJpbmRpbmdzOyBob3dldmVyLCB0aGVyZSBpcyBub3RoaW5nIEQtQnVzIHNwZWNpZmljIGFib3V0IHRoZW0uCisJICBJbiB0aGUgZnV0dXJlLCB3ZSBob3BlIHRvIGluY2x1ZGUgc3VjaCAiZnVuZGFtZW50YWwiIHR5cGVzIGluIEdMaWIKKwkgIGl0c2VsZi4KKwkgIDxpbmZvcm1hbHRhYmxlPgorCSAgICA8dGdyb3VwIGNvbHM9IjYiPgorCSAgICAgIDx0aGVhZD4KKwkJPHJvdz4KKwkJICA8ZW50cnk+RC1CdXMgdHlwZSBzaWduYXR1cmU8L2VudHJ5PgorCQkgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisJCSAgPGVudHJ5PkdUeXBlPC9lbnRyeT4KKwkJICA8ZW50cnk+QyB0eXBlZGVmPC9lbnRyeT4KKwkJICA8ZW50cnk+RnJlZSBmdW5jdGlvbjwvZW50cnk+CisJCSAgPGVudHJ5Pk5vdGVzPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90aGVhZD4KKwkgICAgICA8dGJvZHk+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmF5PC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PkFycmF5IG9mIGJ5dGVzPC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+REJVU19UWVBFX0dfQllURV9BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HQXJyYXkgKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5nX2FycmF5X2ZyZWU8L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+YXU8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+QXJyYXkgb2YgdWludDwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkRCVVNfVFlQRV9HX1VJTlRfQVJSQVk8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R0FycmF5ICo8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+Z19hcnJheV9mcmVlPC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJPC9yb3c+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmFpPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PkFycmF5IG9mIGludDwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkRCVVNfVFlQRV9HX0lOVF9BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HQXJyYXkgKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5nX2FycmF5X2ZyZWU8L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+YXg8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+QXJyYXkgb2YgaW50NjQ8L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5EQlVTX1RZUEVfR19JTlQ2NF9BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5HQXJyYXkgKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5nX2FycmF5X2ZyZWU8L2VudHJ5PgorCQkgIDxlbnRyeT48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+YXQ8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+QXJyYXkgb2YgdWludDY0PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+REJVU19UWVBFX0dfVUlOVDY0X0FSUkFZPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdBcnJheSAqPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PmdfYXJyYXlfZnJlZTwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCTwvcm93PgorCQk8cm93PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5hZDwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5BcnJheSBvZiBkb3VibGU8L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5EQlVTX1RZUEVfR19ET1VCTEVfQVJSQVk8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+PGxpdGVyYWw+R0FycmF5ICo8L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+Z19hcnJheV9mcmVlPC9lbnRyeT4KKwkJICA8ZW50cnk+PC9lbnRyeT4KKwkJPC9yb3c+CisJCTxyb3c+CisJCSAgPGVudHJ5PjxsaXRlcmFsPmFiPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PkFycmF5IG9mIGJvb2xlYW48L2VudHJ5PgorCQkgIDxlbnRyeT48bGl0ZXJhbD5EQlVTX1RZUEVfR19CT09MRUFOX0FSUkFZPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdBcnJheSAqPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PmdfYXJyYXlfZnJlZTwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCTwvcm93PgorCSAgICAgIDwvdGJvZHk+CisJICAgIDwvdGdyb3VwPgorCSAgPC9pbmZvcm1hbHRhYmxlPgorCTwvcGFyYT4KKwk8cGFyYT4KKwkgIEQtQnVzIGFsc28gaW5jbHVkZXMgYSBzcGVjaWFsIHR5cGUgREJVU19UWVBFX0RJQ1RfRU5UUlkgd2hpY2gKKwkgIGlzIG9ubHkgdmFsaWQgaW4gYXJyYXlzLiAgSXQncyBpbnRlbmRlZCB0byBiZSBtYXBwZWQgdG8gYSAiZGljdGlvbmFyeSIKKwkgIHR5cGUgYnkgYmluZGluZ3MuICBUaGUgb2J2aW91cyBHTGliIG1hcHBpbmcgaGVyZSBpcyBHSGFzaFRhYmxlLiAgQWdhaW4sCisJICBob3dldmVyLCB0aGVyZSBpcyBubyBidWlsdGluIDxsaXRlcmFsPkdUeXBlPC9saXRlcmFsPiBmb3IgYSBHSGFzaFRhYmxlLgorCSAgTW9yZW92ZXIsIGp1c3QgbGlrZSBmb3IgYXJyYXlzLCB3ZSBuZWVkIGEgcGFyYW1ldGVyaXplZCB0eXBlIHNvIHRoYXQKKwkgIHRoZSBiaW5kaW5ncyBjYW4gY29tbXVuaWF0ZSB3aGljaCB0eXBlcyBhcmUgY29udGFpbmVkIGluIHRoZSBoYXNoIHRhYmxlLgorCTwvcGFyYT4KKwk8cGFyYT4KKwkgIEF0IHByZXNlbnQsIG9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiAgV29yayBpcyBpbiBwcm9ncmVzcyB0bworCSAgaW5jbHVkZSBtb3JlIHR5cGVzLgorCSAgPGluZm9ybWFsdGFibGU+CisJICAgIDx0Z3JvdXAgY29scz0iNiI+CisJICAgICAgPHRoZWFkPgorCQk8cm93PgorCQkgIDxlbnRyeT5ELUJ1cyB0eXBlIHNpZ25hdHVyZTwvZW50cnk+CisJCSAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKwkJICA8ZW50cnk+R1R5cGU8L2VudHJ5PgorCQkgIDxlbnRyeT5DIHR5cGVkZWY8L2VudHJ5PgorCQkgIDxlbnRyeT5GcmVlIGZ1bmN0aW9uPC9lbnRyeT4KKwkJICA8ZW50cnk+Tm90ZXM8L2VudHJ5PgorCQk8L3Jvdz4KKwkgICAgICA8L3RoZWFkPgorCSAgICAgIDx0Ym9keT4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGxpdGVyYWw+YXtzc308L2xpdGVyYWw+PC9lbnRyeT4KKwkJICA8ZW50cnk+RGljdGlvbmFyeSBtYXBwaW5nIHN0cmluZ3MgdG8gc3RyaW5nczwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkRCVVNfVFlQRV9HX1NUUklOR19TVFJJTkdfSEFTSFRBQkxFPC9saXRlcmFsPjwvZW50cnk+CisJCSAgPGVudHJ5PjxsaXRlcmFsPkdIYXNoVGFibGUgKjwvbGl0ZXJhbD48L2VudHJ5PgorCQkgIDxlbnRyeT5nX2hhc2hfdGFibGVfZGVzdHJveTwvZW50cnk+CisJCSAgPGVudHJ5PjwvZW50cnk+CisJCTwvcm93PgorCSAgICAgIDwvdGJvZHk+CisJICAgIDwvdGdyb3VwPgorCSAgPC9pbmZvcm1hbHRhYmxlPgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItZ2VuZXJpYy10eXBlbWFwcGluZ3MiPgorCTx0aXRsZT5BcmJpdHJhcmlseSByZWN1cnNpdmUgdHlwZSBtYXBwaW5nczwvdGl0bGU+CisJPHBhcmE+CisJICBGaW5hbGx5LCBpdCBpcyBwb3NzaWJsZSB1c2VycyB3aWxsIHdhbnQgdG8gd3JpdGUgb3IgaW52b2tlIEQtQnVzCisJICBtZXRob2RzIHdoaWNoIGhhdmUgYXJiaXRyYXJpbHkgY29tcGxleCB0eXBlIHNpZ25hdHVyZXMgbm90CisJICBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlc2UgYmluZGluZ3MuICBGb3IgdGhpcyBjYXNlLCB3ZSBoYXZlIGEKKwkgIDxsaXRlcmFsPkRCdXNHVmFsdWU8L2xpdGVyYWw+IHdoaWNoIGFjdHMgYXMgYSBraW5kIG9mIHNwZWNpYWwKKwkgIHZhcmlhbnQgdmFsdWUgd2hpY2ggbWF5IGJlIGl0ZXJhdGVkIG92ZXIgbWFudWFsbHkuICBUaGUKKwkgIDxsaXRlcmFsPkdUeXBlPC9saXRlcmFsPiBhc3NvY2lhdGVkIGlzCisJICA8bGl0ZXJhbD5EQlVTX1RZUEVfR19WQUxVRTwvbGl0ZXJhbD4uCisJPC9wYXJhPgorCTxwYXJhPgorCSAgVE9ETyBpbnNlcnQgdXNhZ2Ugb2YgPGxpdGVyYWw+REJVU19UWVBFX0dfVkFMVUU8L2xpdGVyYWw+IGhlcmUuCisJPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0ic2FtcGxlLXByb2dyYW0tMSI+CisgICAgICA8dGl0bGU+QSBzYW1wbGUgcHJvZ3JhbTwvdGl0bGU+CisgICAgICA8cGFyYT5IZXJlIGlzIGEgRC1CdXMgcHJvZ3JhbSB1c2luZyB0aGUgR0xpYiBiaW5kaW5ncy4KKzxwcm9ncmFtbGlzdGluZz4gICAgICAKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBEQnVzR0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIEdFcnJvciAqZXJyb3I7CisgIERCdXNHUHJveHkgKnByb3h5OworICBjaGFyICoqbmFtZV9saXN0OworICBjaGFyICoqbmFtZV9saXN0X3B0cjsKKyAgCisgIGdfdHlwZV9pbml0ICgpOworCisgIGVycm9yID0gTlVMTDsKKyAgY29ubmVjdGlvbiA9IGRidXNfZ19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbXA7ZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdfcHJpbnRlcnIgKCJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICAgICBlcnJvci0mZ3Q7bWVzc2FnZSk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBDcmVhdGUgYSBwcm94eSBvYmplY3QgZm9yIHRoZSAiYnVzIGRyaXZlciIgKG5hbWUgIm9yZy5mcmVlZGVza3RvcC5EQnVzIikgKi8KKyAgCisgIHByb3h5ID0gZGJ1c19nX3Byb3h5X25ld19mb3JfbmFtZSAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTKTsKKworICAvKiBDYWxsIExpc3ROYW1lcyBtZXRob2QsIHdhaXQgZm9yIHJlcGx5ICovCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJMaXN0TmFtZXMiLCAmYW1wO2Vycm9yLCBHX1RZUEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX1NUUlYsICZhbXA7bmFtZV9saXN0LCBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSnVzdCBkbyBkZW1vbnN0cmF0ZSByZW1vdGUgZXhjZXB0aW9ucyB2ZXJzdXMgcmVndWxhciBHRXJyb3IgKi8KKyAgICAgIGlmIChlcnJvci0+ZG9tYWluID09IERCVVNfR0VSUk9SICZhbXA7JmFtcDsgZXJyb3ItPmNvZGUgPT0gREJVU19HRVJST1JfUkVNT1RFX0VYQ0VQVElPTikKKyAgICAgICAgZ19wcmludGVyciAoIkNhdWdodCByZW1vdGUgbWV0aG9kIGV4Y2VwdGlvbiAlczogJXMiLAorCSAgICAgICAgICAgIGRidXNfZ19lcnJvcl9nZXRfbmFtZSAoZXJyb3IpLAorCSAgICAgICAgICAgIGVycm9yLSZndDttZXNzYWdlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ19wcmludGVyciAoIkVycm9yOiAlc1xuIiwgZXJyb3ItJmd0O21lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogUHJpbnQgdGhlIHJlc3VsdHMgKi8KKyAKKyAgZ19wcmludCAoIk5hbWVzIG9uIHRoZSBtZXNzYWdlIGJ1czpcbiIpOworICAKKyAgZm9yIChuYW1lX2xpc3RfcHRyID0gbmFtZV9saXN0OyAqbmFtZV9saXN0X3B0cjsgbmFtZV9saXN0X3B0cisrKQorICAgIHsKKyAgICAgIGdfcHJpbnQgKCIgICVzXG4iLCAqbmFtZV9saXN0X3B0cik7CisgICAgfQorICBnX3N0cmZyZWV2IChuYW1lX2xpc3QpOworCisgIGdfb2JqZWN0X3VucmVmIChwcm94eSk7CisKKyAgcmV0dXJuIDA7Cit9Cis8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iZ2xpYi1wcm9ncmFtLXNldHVwIj4KKyAgICAgIDx0aXRsZT5Qcm9ncmFtIGluaXRhbGl6YXRpb248L3RpdGxlPgorICAgICAgPHBhcmE+CisJQSBjb25uZWN0aW9uIHRvIHRoZSBidXMgaXMgYWNxdWlyZWQgdXNpbmcKKwk8bGl0ZXJhbD5kYnVzX2dfYnVzX2dldDwvbGl0ZXJhbD4uICBOZXh0LCBhIHByb3h5CisJaXMgY3JlYXRlZCBmb3IgdGhlIG9iamVjdCAiL29yZy9mcmVlZGVza3RvcC9EQnVzIiB3aXRoCisJaW50ZXJmYWNlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9saXRlcmFsPgorCW9uIHRoZSBzZXJ2aWNlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9saXRlcmFsPi4KKwlUaGlzIGlzIGEgcHJveHkgZm9yIHRoZSBtZXNzYWdlIGJ1cyBpdHNlbGYuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImdsaWItbWV0aG9kLWludm9jYXRpb24iPgorICAgICAgPHRpdGxlPlVuZGVyc3RhbmRpbmcgbWV0aG9kIGludm9jYXRpb248L3RpdGxlPgorICAgICAgPHBhcmE+CisJWW91IGhhdmUgYSBudW1iZXIgb2YgY2hvaWNlcyBmb3IgbWV0aG9kIGludm9jYXRpb24uICBGaXJzdCwgYXMKKwl1c2VkIGFib3ZlLCA8bGl0ZXJhbD5kYnVzX2dfcHJveHlfY2FsbDwvbGl0ZXJhbD4gc2VuZHMgYQorCW1ldGhvZCBjYWxsIHRvIHRoZSByZW1vdGUgb2JqZWN0LCBhbmQgYmxvY2tzIHVudGlsIGEgcmVwbHkgaXMKKwlyZWNpZXZlZC4gIFRoZSBvdXRnb2luZyBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgdmFyYXJncworCWFycmF5LCB0ZXJtaW5hdGVkIHdpdGggPGxpdGVyYWw+R19UWVBFX0lOVkFMSUQ8L2xpdGVyYWw+LgorCU5leHQsIHBvaW50ZXJzIHRvIHJldHVybiB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgZm9sbG93ZWQgYWdhaW4KKwlieSA8bGl0ZXJhbD5HX1RZUEVfSU5WQUxJRDwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKwlUbyBpbnZva2UgYSBtZXRob2QgYXN5bmNocm9ub3VzbHksIHVzZQorCTxsaXRlcmFsPmRidXNfZ19wcm94eV9iZWdpbl9jYWxsPC9saXRlcmFsPi4gIFRoaXMgcmV0dXJucyBhCisJPGxpdGVyYWw+REJ1c0dQZW5kaW5nQ2FsbDwvbGl0ZXJhbD4gb2JqZWN0OyB5b3UgbWF5IHRoZW4gc2V0IGEKKwlub3RpZmljYXRpb24gZnVuY3Rpb24gdXNpbmcKKwk8bGl0ZXJhbD5kYnVzX2dfcGVuZGluZ19jYWxsX3NldF9ub3RpZnk8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJnbGliLXNpZ25hbC1jb25uZWN0aW9uIj4KKyAgICAgIDx0aXRsZT5Db25uZWN0aW5nIHRvIG9iamVjdCBzaWduYWxzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorCVlvdSBtYXkgY29ubmVjdCB0byBzaWduYWxzIHVzaW5nCisJPGxpdGVyYWw+ZGJ1c19nX3Byb3h5X2FkZF9zaWduYWw8L2xpdGVyYWw+IGFuZAorCTxsaXRlcmFsPmRidXNfZ19wcm94eV9jb25uZWN0X3NpZ25hbDwvbGl0ZXJhbD4uICBZb3UgbXVzdAorCWludm9rZSA8bGl0ZXJhbD5kYnVzX2dfcHJveHlfYWRkX3NpZ25hbDwvbGl0ZXJhbD4gdG8gc3BlY2lmeQorCXRoZSBzaWduYXR1cmUgb2YgeW91ciBzaWduYWwgaGFuZGxlcnM7IHlvdSBtYXkgdGhlbiBpbnZva2UKKwk8bGl0ZXJhbD5kYnVzX2dfcHJveHlfY29ubmVjdF9zaWduYWw8L2xpdGVyYWw+IG11bHRpcGxlIHRpbWVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisJTm90ZSB0aGF0IGl0IHdpbGwgb2Z0ZW4gYmUgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBidWlsdGluCisJbWFyc2hhbGxlciBmb3IgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIGEgcmVtb3RlIHNpZ25hbC4gIEluIHRoYXQKKwljYXNlLCB5b3UgbXVzdCBnZW5lcmF0ZSBhIG1hcnNoYWxsZXIgeW91cnNlbGYgYnkgdXNpbmcKKwk8YXBwbGljYXRpb24+Z2xpYi1nZW5tYXJzaGFsPC9hcHBsaWNhdGlvbj4sIGFuZCB0aGVuIHJlZ2lzdGVyCisJaXQgdXNpbmcgPGxpdGVyYWw+ZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyPC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iZ2xpYi1lcnJvci1oYW5kbGluZyI+CisgICAgICA8dGl0bGU+RXJyb3IgaGFuZGxpbmcgYW5kIHJlbW90ZSBleGNlcHRpb25zPC90aXRsZT4KKyAgICAgIDxwYXJhPgorCUFsbCBvZiB0aGUgR0xpYiBiaW5kaW5nIG1ldGhvZHMgc3VjaCBhcworCTxsaXRlcmFsPmRidXNfZ19wcm94eV9lbmRfY2FsbDwvbGl0ZXJhbD4gcmV0dXJuIGEKKwk8bGl0ZXJhbD5HRXJyb3I8L2xpdGVyYWw+LiAgVGhpcyA8bGl0ZXJhbD5HRXJyb3I8L2xpdGVyYWw+IGNhbgorCXJlcHJlc2VudCB0d28gZGlmZmVyZW50IHRoaW5nczoKKyAgICAgIDxpdGVtaXplZGxpc3Q+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+CisJICAgIEFuIGludGVybmFsIEQtQnVzIGVycm9yLCBzdWNoIGFzIGFuIG91dC1vZi1tZW1vcnkKKwkgICAgY29uZGl0aW9uLCBhbiBJL08gZXJyb3IsIG9yIGEgbmV0d29yayB0aW1lb3V0LiAgRXJyb3JzCisJICAgIGdlbmVyYXRlZCBieSB0aGUgRC1CdXMgbGlicmFyeSBpdHNlbGYgaGF2ZSB0aGUgZG9tYWluCisJICAgIDxsaXRlcmFsPkRCVVNfR0VSUk9SPC9saXRlcmFsPiwgYW5kIGEgY29ycmVzcG9uZGluZyBjb2RlCisJICAgIHN1Y2ggYXMgPGxpdGVyYWw+REJVU19HRVJST1JfTk9fTUVNT1JZPC9saXRlcmFsPi4gIEl0IHdpbGwKKwkgICAgbm90IGJlIHR5cGljYWwgZm9yIGFwcGxpY2F0aW9ucyB0byBoYW5kbGUgdGhlc2UgZXJyb3JzCisJICAgIHNwZWNpZmljYWxseS4KKwkgIDwvcGFyYT4KKwk8L2xpc3RpdGVtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPgorCSAgICBBIHJlbW90ZSBELUJ1cyBleGNlcHRpb24sIHRocm93biBieSB0aGUgcGVlciwgYnVzLCBvcgorCSAgICBzZXJ2aWNlLiAgRC1CdXMgcmVtb3RlIGV4Y2VwdGlvbnMgaGF2ZSBib3RoIGEgdGV4dHVhbAorCSAgICAibmFtZSIgYW5kIGEgIm1lc3NhZ2UiLiAgVGhlIEdMaWIgYmluZGluZ3Mgc3RvcmUgdGhpcworCSAgICBpbmZvcm1hdGlvbiBpbiB0aGUgPGxpdGVyYWw+R0Vycm9yPC9saXRlcmFsPiwgYnV0IHNvbWUKKwkgICAgc3BlY2lhbCBydWxlcyBhcHBseS4KKwkgIDwvcGFyYT4KKwkgIDxwYXJhPgorCSAgICBUaGUgc2V0IGVycm9yIHdpbGwgaGF2ZSB0aGUgZG9tYWluCisJICAgIDxsaXRlcmFsPkRCVVNfR0VSUk9SPC9saXRlcmFsPiBhcyBhYm92ZSwgYW5kIHdpbGwgYWxzbworCSAgICBoYXZlIHRoZSBjb2RlCisJICAgIDxsaXRlcmFsPkRCVVNfR0VSUk9SX1JFTU9URV9FWENFUFRJT048L2xpdGVyYWw+LiAgSW4gb3JkZXIKKwkgICAgdG8gYWNjZXNzIHRoZSByZW1vdGUgZXhjZXB0aW9uIG5hbWUsIHlvdSBtdXN0IHVzZSBhCisJICAgIHNwZWNpYWwgYWNjZXNzb3IsIHN1Y2ggYXMKKwkgICAgPGxpdGVyYWw+ZGJ1c19nX2Vycm9yX2hhc19uYW1lPC9saXRlcmFsPiBvcgorCSAgICA8bGl0ZXJhbD5kYnVzX2dfZXJyb3JfZ2V0X25hbWU8L2xpdGVyYWw+LiAgVGhlIHJlbW90ZQorCSAgICBleGNlcHRpb24gZGV0YWlsZWQgbWVzc2FnZSBpcyBhY2Nlc3NpYmxlIHZpYSB0aGUgcmVndWxhcgorCSAgICBHRXJyb3IgPGxpdGVyYWw+bWVzc2FnZTwvbGl0ZXJhbD4gbWVtYmVyLgorCSAgPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iZ2xpYi1tb3JlLWV4YW1wbGVzIj4KKyAgICAgIDx0aXRsZT5Nb3JlIGV4YW1wbGVzIG9mIG1ldGhvZCBpbnZvY2F0aW9uPC90aXRsZT4KKyAgICAgIDxzZWN0MyBpZD0iZ2xpYi1zZW5kaW5nLXN0dWZmIj4KKwk8dGl0bGU+U2VuZGluZyBhbiBpbnRlZ2VyIGFuZCBzdHJpbmcsIHJlY2VpdmluZyBhbiBhcnJheSBvZiBieXRlczwvdGl0bGU+CisJPHBhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgIEdBcnJheSAqYXJyOworICAKKyAgZXJyb3IgPSBOVUxMOworICBpZiAoIWRidXNfZ19wcm94eV9jYWxsIChwcm94eSwgIkZvb2JhciIsICZhbXA7ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9JTlQsIDQyLCBHX1RZUEVfU1RSSU5HLCAiaGVsbG8iLAorCQkJICBHX1RZUEVfSU5WQUxJRCwKKwkJCSAgREJVU19UWVBFX0dfVUNIQVJfQVJSQVksICZhbXA7YXJyLCBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICAgZ19hc3NlcnQgKGFyciAhPSBOVUxMKTsKKyAgIHByaW50ZiAoImdvdCBiYWNrICV1IHZhbHVlcyIsIGFyci0+bGVuKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iZ2xpYi1zZW5kaW5nLWhhc2giPgorCTx0aXRsZT5TZW5kaW5nIGEgR0hhc2hUYWJsZTwvdGl0bGU+CisJPHBhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgIEdIYXNoVGFibGUgKmhhc2ggPSBnX2hhc2hfdGFibGVfbmV3IChnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7CisgIGd1aW50MzIgcmV0OworICAKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoaGFzaCwgImZvbyIsICJiYXIiKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoaGFzaCwgImJheiIsICJ3aGVlIik7CisKKyAgZXJyb3IgPSBOVUxMOworICBpZiAoIWRidXNfZ19wcm94eV9jYWxsIChwcm94eSwgIkhhc2hTaXplIiwgJmFtcDtlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0dfU1RSSU5HX1NUUklOR19IQVNILCBoYXNoLCBHX1RZUEVfSU5WQUxJRCwKKwkJCSAgR19UWVBFX1VJTlQsICZhbXA7cmV0LCBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICBnX2Fzc2VydCAocmV0ID09IDIpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAoaGFzaCk7Cis8L3Byb2dyYW1saXN0aW5nPgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItcmVjZWl2aW5nLWJvb2wtaW50Ij4KKwk8dGl0bGU+UmVjZWl2aW5nIGEgYm9vbGVhbiBhbmQgYSBzdHJpbmc8L3RpdGxlPgorCTxwYXJhPgorPHByb2dyYW1saXN0aW5nPgorICBnYm9vbGVhbiBib29scmV0OworICBjaGFyICpzdHJyZXQ7CisgIAorICBlcnJvciA9IE5VTEw7CisgIGlmICghZGJ1c19nX3Byb3h5X2NhbGwgKHByb3h5LCAiR2V0U3R1ZmYiLCAmYW1wO2Vycm9yLAorCQkJICBHX1RZUEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX0JPT0xFQU4sICZhbXA7Ym9vbHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX1NUUklORywgJmFtcDtzdHJyZXQsCisJCQkgIEdfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgZXJyb3IgKi8KKyAgICB9CisgIHByaW50ZiAoIiVzICVzIiwgYm9vbHJldCA/ICJUUlVFIiA6ICJGQUxTRSIsIHN0cnJldCk7CisgIGdfZnJlZSAoc3RycmV0KTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0iZ2xpYi1zZW5kaW5nLXN0ci1hcnJheXMiPgorCTx0aXRsZT5TZW5kaW5nIHR3byBhcnJheXMgb2Ygc3RyaW5nczwvdGl0bGU+CisJPHBhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgIC8qIE5VTEwgdGVybWluYXRlICovCisgIGNoYXIgKnN0cnNfc3RhdGljW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6IiwgTlVMTH07CisgIC8qIFRha2UgcG9pbnRlciB0byBhcnJheTsgY2Fubm90IHBhc3MgYXJyYXkgZGlyZWN0bHkgKi8KKyAgY2hhciAqKnN0cnNfc3RhdGljX3AgPSBzdHJzX3N0YXRpYzsKKyAgY2hhciAqKnN0cnNfZHluYW1pYzsKKworICBzdHJzX2R5bmFtaWMgPSBnX25ldyAoY2hhciAqLCA0KTsKKyAgc3Ryc19keW5hbWljWzBdID0gZ19zdHJkdXAgKCJoZWxsbyIpOworICBzdHJzX2R5bmFtaWNbMV0gPSBnX3N0cmR1cCAoIndvcmxkIik7CisgIHN0cnNfZHluYW1pY1syXSA9IGdfc3RyZHVwICgiISIpOworICAvKiBOVUxMIHRlcm1pbmF0ZSAqLworICBzdHJzX2R5bmFtaWNbM10gPSBOVUxMOworICAKKyAgZXJyb3IgPSBOVUxMOworICBpZiAoIWRidXNfZ19wcm94eV9jYWxsIChwcm94eSwgIlR3b1N0ckFycmF5cyIsICZhbXA7ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJWLCBzdHJzX3N0YXRpY19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfU1RSViwgc3Ryc19keW5hbWljLAorCQkJICBHX1RZUEVfSU5WQUxJRCwKKwkJCSAgR19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSBlcnJvciAqLworICAgIH0KKyAgIGdfc3RyZnJlZXYgKHN0cnNfZHluYW1pYyk7Cis8L3Byb2dyYW1saXN0aW5nPgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItZ2V0dGluZy1zdHItYXJyYXkiPgorCTx0aXRsZT5TZW5kaW5nIGEgYm9vbGVhbiwgcmVjZWl2aW5nIGFuIGFycmF5IG9mIHN0cmluZ3M8L3RpdGxlPgorCTxwYXJhPgorPHByb2dyYW1saXN0aW5nPgorICBjaGFyICoqc3RyczsKKyAgY2hhciAqKnN0cnNfcDsKKyAgZ2Jvb2xlYW4gYmxhaDsKKworICBlcnJvciA9IE5VTEw7CisgIGJsYWggPSBUUlVFOworICBpZiAoIWRidXNfZ19wcm94eV9jYWxsIChwcm94eSwgIkdldFN0cnMiLCAmYW1wO2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfQk9PTEVBTiwgYmxhaCwKKwkJCSAgR19UWVBFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJWLCAmYW1wO3N0cnMsCisJCQkgIEdfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgZXJyb3IgKi8KKyAgICB9CisgICBmb3IgKHN0cnNfcCA9IHN0cnM7ICpzdHJzX3A7IHN0cnNfcCsrKQorICAgICBwcmludGYgKCJnb3Qgc3RyaW5nOiBcIiVzXCIiLCAqc3Ryc19wKTsKKyAgIGdfc3RyZnJlZXYgKHN0cnMpOworPC9wcm9ncmFtbGlzdGluZz4KKwk8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJnbGliLXNlbmRpbmctdmFyaWFudCI+CisJPHRpdGxlPlNlbmRpbmcgYSB2YXJpYW50PC90aXRsZT4KKwk8cGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyAgR1ZhbHVlIHZhbCA9IHswLCB9OworCisgIGdfdmFsdWVfaW5pdCAoJmFtcDt2YWwsIEdfVFlQRV9TVFJJTkcpOworICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZhbXA7dmFsLCAiaGVsbG8gd29ybGQiKTsKKyAgCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJTZW5kVmFyaWFudCIsICZhbXA7ZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9WQUxVRSwgJmFtcDt2YWwsIEdfVFlQRV9JTlZBTElELAorCQkJICBHX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgLyogSGFuZGxlIGVycm9yICovCisgICAgfQorICBnX2Fzc2VydCAocmV0ID09IDIpOworICBnX3ZhbHVlX3Vuc2V0ICgmYW1wO3ZhbCk7Cis8L3Byb2dyYW1saXN0aW5nPgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImdsaWItcmVjZWl2aW5nLXZhcmlhbnQiPgorCTx0aXRsZT5SZWNlaXZpbmcgYSB2YXJpYW50PC90aXRsZT4KKwk8cGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyAgR1ZhbHVlIHZhbCA9IHswLCB9OworCisgIGVycm9yID0gTlVMTDsKKyAgaWYgKCFkYnVzX2dfcHJveHlfY2FsbCAocHJveHksICJHZXRWYXJpYW50IiwgJmFtcDtlcnJvciwgR19UWVBFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdfVFlQRV9WQUxVRSwgJmFtcDt2YWwsIEdfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgZXJyb3IgKi8KKyAgICB9CisgIGlmIChHX1ZBTFVFX1RZUEUgKCZhbXA7dmFsKSA9PSBHX1RZUEVfU1RSSU5HKQorICAgIHByaW50ZiAoIiVzXG4iLCBnX3ZhbHVlX2dldF9zdHJpbmcgKCZhbXA7dmFsKSk7CisgIGVsc2UgaWYgKEdfVkFMVUVfVFlQRSAoJmFtcDt2YWwpID09IEdfVFlQRV9JTlQpCisgICAgcHJpbnRmICgiJWRcbiIsIGdfdmFsdWVfZ2V0X2ludCAoJmFtcDt2YWwpKTsKKyAgZWxzZQorICAgIC4uLgorICBnX3ZhbHVlX3Vuc2V0ICgmYW1wO3ZhbCk7Cis8L3Byb2dyYW1saXN0aW5nPgorCTwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0iZ2xpYi1nZW5lcmF0ZWQtYmluZGluZ3MiPgorICAgICAgPHRpdGxlPkdlbmVyYXRlZCBCaW5kaW5nczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgQnkgdXNpbmcgdGhlIEludHJvc3BlY3Rpb24gWE1MIGZpbGVzLCBjb252ZW5pZW50IGNsaWVudC1zaWRlIGJpbmRpbmdzCisgICAgICAgIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdG8gZWFzZSB0aGUgdXNlIG9mIGEgcmVtb3RlIERCdXMgb2JqZWN0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEhlcmUgaXMgYSBzYW1wbGUgWE1MIGZpbGUgd2hpY2ggZGVzY3JpYmVzIGFuIG9iamVjdCB0aGF0IGV4cG9zZXMKKyAgICAgICAgb25lIG1ldGhvZCwgbmFtZWQgPGxpdGVyYWw+TWFueUFyZ3M8L2xpdGVyYWw+LgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPyZndDsKKyZsdDtub2RlIG5hbWU9Ii9jb20vZXhhbXBsZS9NeU9iamVjdCImZ3Q7CisgICZsdDtpbnRlcmZhY2UgbmFtZT0iY29tLmV4YW1wbGUuTXlPYmplY3QiJmd0OworICAgICZsdDttZXRob2QgbmFtZT0iTWFueUFyZ3MiJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJ1IiBuYW1lPSJ4IiBkaXJlY3Rpb249ImluIiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJzIiBuYW1lPSJzdHIiIGRpcmVjdGlvbj0iaW4iIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9ImQiIG5hbWU9InRyb3VibGUiIGRpcmVjdGlvbj0iaW4iIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9ImQiIG5hbWU9ImRfcmV0IiBkaXJlY3Rpb249Im91dCIgLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0icyIgbmFtZT0ic3RyX3JldCIgZGlyZWN0aW9uPSJvdXQiIC8mZ3Q7CisgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICZsdDsvaW50ZXJmYWNlJmd0OworJmx0Oy9ub2RlJmd0OworPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBSdW4gPGxpdGVyYWw+ZGJ1cy1iaW5kaW5nLXRvb2wgLS1tb2RlPWdsaWItY2xpZW50CisgICAgICAgICAgPHJlcGxhY2VhYmxlPkZJTEVOQU1FPC9yZXBsYWNlYWJsZT4gJmd0OworICAgICAgICAgIDxyZXBsYWNlYWJsZT5IRUFERVJfTkFNRTwvcmVwbGFjZWFibGU+PC9saXRlcmFsPiB0byBnZW5lcmF0ZSB0aGUgaGVhZGVyCisgICAgICAgIGZpbGUuICBGb3IgZXhhbXBsZTogPGNvbW1hbmQ+ZGJ1cy1iaW5kaW5nLXRvb2wgLS1tb2RlPWdsaWItY2xpZW50CisgICAgICAgICAgbXktb2JqZWN0LnhtbCAmZ3Q7IG15LW9iamVjdC1iaW5kaW5ncy5oPC9jb21tYW5kPi4gIFRoaXMgd2lsbCBnZW5lcmF0ZQorICAgICAgICBpbmxpbmUgZnVuY3Rpb25zIHdpdGggdGhlIGZvbGxvd2luZyBwcm90b3R5cGVzOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisvKiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbCAqLworZ2Jvb2xlYW4KK2NvbV9leGFtcGxlX015T2JqZWN0X21hbnlfYXJncyAoREJ1c0dQcm94eSAqcHJveHksIGNvbnN0IGd1aW50IElOX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBJTl9zdHIsIGNvbnN0IGdkb3VibGUgSU5fdHJvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSogT1VUX2RfcmV0LCBjaGFyICoqIE9VVF9zdHJfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKy8qIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbCAqLworREJ1c0dQcm94eUNhbGwqCitjb21fZXhhbXBsZV9NeU9iamVjdF9tYW55X2FyZ3NfYXN5bmMgKERCdXNHUHJveHkgKnByb3h5LCBjb25zdCBndWludCBJTl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogSU5fc3RyLCBjb25zdCBnZG91YmxlIElOX3Ryb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbV9leGFtcGxlX015T2JqZWN0X21hbnlfYXJnc19yZXBseSBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcmRhdGEpOworCisvKiBUaGlzIGlzIHRoZSB0eXBlZGVmIGZvciB0aGUgbm9uLWJsb2NraW5nIGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQKKygqY29tX2V4YW1wbGVfTXlPYmplY3RfbWFueV9hcmdzX3JlcGx5KQorKERCdXNHUHJveHkgKnByb3h5LCBnZG91YmxlIE9VVF9kX3JldCwgY2hhciAqIE9VVF9zdHJfcmV0LAorIEdFcnJvciAqZXJyb3IsIGdwb2ludGVyIHVzZXJkYXRhKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpbiBhbGwgZnVuY3Rpb25zIGlzIGEgPGxpdGVyYWw+REJ1c0dQcm94eQorICAgICAgICAqPC9saXRlcmFsPiwgd2hpY2ggeW91IHNob3VsZCBjcmVhdGUgd2l0aCB0aGUgdXN1YWwKKyAgICAgICAgPGxpdGVyYWw+ZGJ1c19nX3Byb3h5X25ld18qPC9saXRlcmFsPiBmdW5jdGlvbnMuICBGb2xsb3dpbmcgdGhhdCBhcmUgdGhlCisgICAgICAgICJpbiIgYXJndW1lbnRzLCBhbmQgdGhlbiBlaXRoZXIgdGhlICJvdXQiIGFyZ3VtZW50cyBhbmQgYQorICAgICAgICA8bGl0ZXJhbD5HRXJyb3IgKjwvbGl0ZXJhbD4gZm9yIHRoZSBzeW5jaHJvbm91cyAoYmxvY2tpbmcpIGZ1bmN0aW9uLCBvcgorICAgICAgICBjYWxsYmFjayBhbmQgdXNlciBkYXRhIGFyZ3VtZW50cyBmb3IgdGhlIGFzeW5jaHJvbm91cyAobm9uLWJsb2NraW5nKQorICAgICAgICBmdW5jdGlvbi4gIFRoZSBjYWxsYmFjayBpbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHBhc3NlcyB0aGUKKyAgICAgICAgPGxpdGVyYWw+REJ1c0dQcm94eSAqPC9saXRlcmFsPiwgdGhlIHJldHVybmVkICJvdXQiIGFyZ3VtZW50cywgYW4KKyAgICAgICAgPGxpdGVyYWw+R0Vycm9yICo8L2xpdGVyYWw+IHdoaWNoIGlzIHNldCBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3RoZXJ3aXNlCisgICAgICAgIDxsaXRlcmFsPk5VTEw8L2xpdGVyYWw+LCBhbmQgdGhlIHVzZXIgZGF0YS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBcyB3aXRoIHRoZSBzZXJ2ZXItc2lkZSBiaW5kaW5ncyBzdXBwb3J0IChzZWUgPHhyZWYKKyAgICAgICAgbGlua2VuZD0iZ2xpYi1zZXJ2ZXIiLz4pLCB0aGUgZXhhY3QgYmVoYXZpb3VyIG9mIHRoZSBjbGllbnQtc2lkZQorICAgICAgICBiaW5kaW5ncyBjYW4gYmUgbWFuaXB1bGF0ZWQgdXNpbmcgImFubm90YXRpb25zIi4gIEN1cnJlbnRseSB0aGUgb25seQorICAgICAgICBhbm5vdGF0aW9uIHVzZWQgYnkgdGhlIGNsaWVudCBiaW5kaW5ncyBpcworICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLk5vUmVwbHk8L2xpdGVyYWw+LCB3aGljaCBzZXRzIHRoZQorICAgICAgICBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgY2xpZW50IGlzbid0IGV4cGVjdGluZyBhIHJlcGx5IHRvIHRoZSBtZXRob2QKKyAgICAgICAgY2FsbCwgc28gYSByZXBseSBzaG91bGRuJ3QgYmUgc2VudC4gIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byBzcGVlZCB1cAorICAgICAgICByYXBpZCBtZXRob2QgY2FsbHMgd2hlcmUgdGhlcmUgYXJlIG5vICJvdXQiIGFyZ3VtZW50cywgYW5kIG5vdCBrbm93aW5nCisgICAgICAgIGlmIHRoZSBtZXRob2Qgc3VjY2VlZGVkIGlzIGFuIGFjY2VwdGFibGUgY29tcHJvbWlzZSB0byBoYWxmIHRoZSB0cmFmZmljCisgICAgICAgIG9uIHRoZSBidXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9ImdsaWItc2VydmVyIj4KKyAgICA8dGl0bGU+R0xpYiBBUEk6IEltcGxlbWVudGluZyBPYmplY3RzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIEF0IHRoZSBtb21lbnQsIHRvIGV4cG9zZSBhIEdPYmplY3QgdmlhIEQtQnVzLCB5b3UgbXVzdAorICAgICAgd3JpdGUgWE1MIGJ5IGhhbmQgd2hpY2ggZGVzY3JpYmVzIHRoZSBtZXRob2RzIGV4cG9ydGVkCisgICAgICBieSB0aGUgb2JqZWN0LiAgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYW51YWwgc3RlcCB3aWxsCisgICAgICBiZSBvYnZpYXRlZCBieSB0aGUgdXBjb21pbmcgR0xpYiBpbnRyb3NwZWN0aW9uIHN1cHBvcnQuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgSGVyZSBpcyBhIHNhbXBsZSBYTUwgZmlsZSB3aGljaCBkZXNjcmliZXMgYW4gb2JqZWN0IHRoYXQgZXhwb3NlcworICAgICAgb25lIG1ldGhvZCwgbmFtZWQgPGxpdGVyYWw+TWFueUFyZ3M8L2xpdGVyYWw+LgorPHByb2dyYW1saXN0aW5nPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8mZ3Q7CisKKyZsdDtub2RlIG5hbWU9Ii9jb20vZXhhbXBsZS9NeU9iamVjdCImZ3Q7CisKKyAgJmx0O2ludGVyZmFjZSBuYW1lPSJjb20uZXhhbXBsZS5NeU9iamVjdCImZ3Q7CisgICAgJmx0O2Fubm90YXRpb24gbmFtZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5DU3ltYm9sIiB2YWx1ZT0ibXlfb2JqZWN0Ii8mZ3Q7CisgICAgJmx0O21ldGhvZCBuYW1lPSJNYW55QXJncyImZ3Q7CisgICAgICAmbHQ7IS0tIFRoaXMgaXMgb3B0aW9uYWwsIGFuZCBpbiB0aGlzIGNhc2UgaXMgcmVkdW51bmRhbnQgLS0mZ3Q7CisgICAgICAmbHQ7YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNTeW1ib2wiIHZhbHVlPSJteV9vYmplY3RfbWFueV9hcmdzIi8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9InUiIG5hbWU9IngiIGRpcmVjdGlvbj0iaW4iIC8mZ3Q7CisgICAgICAmbHQ7YXJnIHR5cGU9InMiIG5hbWU9InN0ciIgZGlyZWN0aW9uPSJpbiIgLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0iZCIgbmFtZT0idHJvdWJsZSIgZGlyZWN0aW9uPSJpbiIgLyZndDsKKyAgICAgICZsdDthcmcgdHlwZT0iZCIgbmFtZT0iZF9yZXQiIGRpcmVjdGlvbj0ib3V0IiAvJmd0OworICAgICAgJmx0O2FyZyB0eXBlPSJzIiBuYW1lPSJzdHJfcmV0IiBkaXJlY3Rpb249Im91dCIgLyZndDsKKyAgICAmbHQ7L21ldGhvZCZndDsKKyAgJmx0Oy9pbnRlcmZhY2UmZ3Q7CismbHQ7L25vZGUmZ3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFRoaXMgWE1MIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgRC1CdXMgaW50cm9zcGVjdGlvbiBYTUwKKyAgICAgIGZvcm1hdC4gRXhjZXB0IHdlIG11c3QgaW5jbHVkZSBhbiAiYW5ub3RhdGlvbiIgd2hpY2ggZ2l2ZSB0aGUgQworICAgICAgc3ltYm9scyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgaW1wbGVtZW50YXRpb24gcHJlZml4CisgICAgICAoPGxpdGVyYWw+bXlfb2JqZWN0PC9saXRlcmFsPikuICBJbiBhZGRpdGlvbiwgaWYgcGFydGljdWxhcgorICAgICAgbWV0aG9kcyBzeW1ib2wgbmFtZXMgZGV2aWF0ZSBmcm9tIEMgY29udmVudGlvbgorICAgICAgKGkuZS4gPGxpdGVyYWw+TWFueUFyZ3M8L2xpdGVyYWw+IC0mZ3Q7CisgICAgICA8bGl0ZXJhbD5tYW55X2FyZ3M8L2xpdGVyYWw+KSwgeW91IG1heSBzcGVjaWZ5IGFuIGFubm90YXRpb24KKyAgICAgIGdpdmluZyB0aGUgQyBzeW1ib2wuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgT25jZSB5b3UgaGF2ZSB3cml0dGVuIHRoaXMgWE1MLCBydW4gPGxpdGVyYWw+ZGJ1cy1iaW5kaW5nLXRvb2wgLS1tb2RlPWdsaWItc2VydmVyIDxyZXBsYWNlYWJsZT5GSUxFTkFNRTwvcmVwbGFjZWFibGU+ICZndDsgPHJlcGxhY2VhYmxlPkhFQURFUl9OQU1FPC9yZXBsYWNlYWJsZT4uPC9saXRlcmFsPiB0bworICAgICAgZ2VuZXJhdGUgYSBoZWFkZXIgZmlsZS4gIEZvciBleGFtcGxlOiA8Y29tbWFuZD5kYnVzLWJpbmRpbmctdG9vbCAtLW1vZGU9Z2xpYi1zZXJ2ZXIgbXktb2JqZWN0LnhtbCAmZ3Q7IG15LW9iamVjdC1nbHVlLmg8L2NvbW1hbmQ+LgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIE5leHQsIGluY2x1ZGUgdGhlIGdlbmVyYXRlZCBoZWFkZXIgaW4geW91ciBwcm9ncmFtLCBhbmQgaW52b2tlCisgICAgICA8bGl0ZXJhbD5kYnVzX2dfb2JqZWN0X2NsYXNzX2luc3RhbGxfaW5mbzwvbGl0ZXJhbD4gaW4gdGhlIGNsYXNzCisgICAgICBpbml0aWFsaXplciwgcGFzc2luZyB0aGUgb2JqZWN0IGNsYXNzIGFuZCAib2JqZWN0IGluZm8iIGluY2x1ZGVkIGluIHRoZQorICAgICAgaGVhZGVyLiAgRm9yIGV4YW1wbGU6CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisJZGJ1c19nX29iamVjdF90eXBlX2luc3RhbGxfaW5mbyAoQ09NX0ZPT19UWVBFX01ZX09CSkVDVCwgJmFtcDtjb21fZm9vX215X29iamVjdF9pbmZvKTsKKyAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICBUaGlzIHNob3VsZCBiZSBkb25lIGV4YWN0bHkgb25jZSBwZXIgb2JqZWN0IGNsYXNzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFRvIGFjdHVhbGx5IGltcGxlbWVudCB0aGUgbWV0aG9kLCBqdXN0IGRlZmluZSBhIEMgZnVuY3Rpb24gbmFtZWQgZS5nLgorICAgICAgPGxpdGVyYWw+bXlfb2JqZWN0X21hbnlfYXJnczwvbGl0ZXJhbD4gaW4gdGhlIHNhbWUgZmlsZSBhcyB0aGUgaW5mbworICAgICAgaGVhZGVyIGlzIGluY2x1ZGVkLiAgQXQgdGhlIG1vbWVudCwgaXQgaXMgcmVxdWlyZWQgdGhhdCB0aGlzIGZ1bmN0aW9uCisgICAgICBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgICAgICA8aXRlbWl6ZWRsaXN0PgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPgorCSAgICBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlIDxsaXRlcmFsPmdib29sZWFuPC9saXRlcmFsPjsKKwkgICAgPGxpdGVyYWw+VFJVRTwvbGl0ZXJhbD4gb24gc3VjY2VzcywgYW5kIDxsaXRlcmFsPkZBTFNFPC9saXRlcmFsPgorCSAgICBvdGhlcndpc2UuCisJICA8L3BhcmE+CisJPC9saXN0aXRlbT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT4KKwkgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIG9iamVjdC4KKwkgIDwvcGFyYT4KKwk8L2xpc3RpdGVtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPgorCSAgICBGb2xsb3dpbmcgdGhlIG9iamVjdCBpbnN0YW5jZSBwb2ludGVyIGFyZSB0aGUgbWV0aG9kCisJICAgIGlucHV0IHZhbHVlcy4KKwkgIDwvcGFyYT4KKwk8L2xpc3RpdGVtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPgorCSAgICBGb2xsb3dpbmcgdGhlIGlucHV0IHZhbHVlcyBhcmUgcG9pbnRlcnMgdG8gcmV0dXJuIHZhbHVlcy4KKwkgIDwvcGFyYT4KKwk8L2xpc3RpdGVtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPgorCSAgICBUaGUgZmluYWwgcGFyYW1ldGVyIG11c3QgYmUgYSA8bGl0ZXJhbD5HRXJyb3IgKio8L2xpdGVyYWw+LgorCSAgICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyA8bGl0ZXJhbD5GQUxTRTwvbGl0ZXJhbD4gZm9yIGFuCisJICAgIGVycm9yLCB0aGUgZXJyb3IgcGFyYW1ldGVyIG11c3QgYmUgaW5pdGFsaXplZCB3aXRoCisJICAgIDxsaXRlcmFsPmdfc2V0X2Vycm9yPC9saXRlcmFsPi4KKwkgIDwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgRmluYWxseSwgeW91IGNhbiBleHBvcnQgYW4gb2JqZWN0IHVzaW5nIDxsaXRlcmFsPmRidXNfZ19jb25uZWN0aW9uX3JlZ2lzdGVyX2dfb2JqZWN0PC9saXRlcmFsPi4gIEZvciBleGFtcGxlOgorICAgICAgPHByb2dyYW1saXN0aW5nPgorCSAgZGJ1c19nX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZ19vYmplY3QgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvY29tL2Zvby9NeU9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7CisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0iZ2xpYi1hbm5vdGF0aW9ucyI+CisgICAgICA8dGl0bGU+U2VydmVyLXNpZGUgQW5ub3RhdGlvbnM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGFyZSBzZXZlcmFsIGFubm90YXRpb25zIHRoYXQgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZQorICAgICAgICBzZXJ2ZXItc2lkZSBiaW5kaW5ncy4gIFRoZSBtb3N0IGNvbW1vbiBhbm5vdGF0aW9uIGlzCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbDwvbGl0ZXJhbD4gYnV0IHRoZXJlIGFyZSBvdGhlcgorICAgICAgICBhbm5vdGF0aW9ucyB3aGljaCBhcmUgb2Z0ZW4gdXNlZnVsLgorICAgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICA8dGVybT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNTeW1ib2w8L2xpdGVyYWw+PC90ZXJtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBDIHN5bWJvbCBuYW1lcyBmb3IKKyAgICAgICAgICAgICAgICB0aGUgdmFyaW91cyB0eXBlcyAoaW50ZXJmYWNlLCBtZXRob2QsIGV0YyksIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICBuYW1lIERCdXMgZ2VuZXJhdGVzLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICA8dGVybT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkFzeW5jPC9saXRlcmFsPjwvdGVybT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBhbm5vdGF0aW9uIG1hcmtzIHRoZSBtZXRob2QgaW1wbGVtZW50YXRpb24gYXMgYW4KKyAgICAgICAgICAgICAgICBhc3luY2hyb25vdXMgZnVuY3Rpb24sIHdoaWNoIGRvZXNuJ3QgcmV0dXJuIGEgcmVzcG9uc2Ugc3RyYWlnaHQKKyAgICAgICAgICAgICAgICBhd2F5IGJ1dCB3aWxsIHNlbmQgdGhlIHJlc3BvbnNlIGF0IHNvbWUgbGF0ZXIgcG9pbnQgdG8gY29tcGxldGUKKyAgICAgICAgICAgICAgICB0aGUgY2FsbC4gIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgbm9uLWJsb2NraW5nIHNlcnZpY2VzIHdoZXJlCisgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGxzIGNhbiB0YWtlIHRpbWUuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiBhIG1ldGhvZCBpcyBhc3luY2hyb25vdXMsIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgaXMKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnQuIEl0IGlzIHJlcXVpcmVkIHRoYXQgdGhlIGZ1bmN0aW9uIGNvbmZvcm0gdG8gdGhlCisgICAgICAgICAgICAgICAgZm9sbG93aW5nIHJ1bGVzOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBhIHZhbHVlIG9mIHR5cGUgPGxpdGVyYWw+Z2Jvb2xlYW48L2xpdGVyYWw+OworICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlRSVUU8L2xpdGVyYWw+IG9uIHN1Y2Nlc3MsIGFuZCA8bGl0ZXJhbD5GQUxTRTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UuIFRPRE86IHRoZSByZXR1cm4gdmFsdWUgaXMgY3VycmVudGx5IGlnbm9yZWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIEZvbGxvd2luZyB0aGUgb2JqZWN0IGluc3RhbmNlIHBvaW50ZXIgYXJlIHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dCB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaW5hbCBwYXJhbWV0ZXIgbXVzdCBiZSBhCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+REJ1c0dNZXRob2RJbnZvY2F0aW9uICo8L2xpdGVyYWw+LiAgVGhpcyBpcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiBzZW5kaW5nIHRoZSByZXNwb25zZSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudCwgYnkKKyAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIDxsaXRlcmFsPmRidXNfZ19tZXRob2RfcmV0dXJuPC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmRidXNfZ19tZXRob2RfcmV0dXJuX2Vycm9yPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgPHRlcm0+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5Db25zdDwvbGl0ZXJhbD48L3Rlcm0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPlRoaXMgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gIm91dCIKKyAgICAgICAgICAgICAgPGxpdGVyYWw+Jmx0O2FyZyZndDs8L2xpdGVyYWw+IG5vZGVzLCBhbmQgc3BlY2lmaWVzIHRoYXQgdGhlCisgICAgICAgICAgICAgIHBhcmFtZXRlciBpc24ndCBiZWluZyBjb3BpZWQgd2hlbiByZXR1cm5lZC4gIEZvciBleGFtcGxlLCB0aGlzCisgICAgICAgICAgICAgIHR1cm5zIGEgJ3MnIGFyZ3VtZW50IGZyb20gYSA8bGl0ZXJhbD5jaGFyICoqPC9saXRlcmFsPiB0byBhCisgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbnN0IGNoYXIgKio8L2xpdGVyYWw+LCBhbmQgcmVzdWx0cyBpbiB0aGUgYXJndW1lbnQgbm90CisgICAgICAgICAgICAgIGJlaW5nIGZyZWVkIGJ5IERCdXMgYWZ0ZXIgdGhlIG1lc3NhZ2UgaXMgc2VudC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgPHRlcm0+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR0xpYi5SZXR1cm5WYWw8L2xpdGVyYWw+PC90ZXJtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvICJvdXQiCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Jmx0O2FyZyZndDs8L2xpdGVyYWw+IG5vZGVzLCBhbmQgYWx0ZXJzIHRoZSBleHBlY3RlZAorICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNpZ25hdHVyZS4gIEl0IGN1cnJlbnRseSBjYW4gYmUgc2V0IHRvIHR3byB2YWx1ZXM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWw+IiI8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPiJlcnJvciI8L2xpdGVyYWw+LiAgVGhlCisgICAgICAgICAgICAgICAgYXJndW1lbnQgbWFya2VkIHdpdGggdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJldHVybmVkIHZpYSBhCisgICAgICAgICAgICAgICAgcG9pbnRlciBhcmd1bWVudCwgYnV0IGJ5IHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4gIElmIHRoZQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSdzIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZSA8bGl0ZXJhbD5HRXJyb3IKKyAgICAgICAgICAgICAgICAqPC9saXRlcmFsPiBhcmd1bWVudCBpcyBhbHNvIG9taXR0ZWQgc28gdGhlcmUgaXMgbm8gc3RhbmRhcmQgd2F5CisgICAgICAgICAgICAgICAgdG8gcmV0dXJuIGFuIGVycm9yIHZhbHVlLiAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgaW50ZXJmYWNpbmcKKyAgICAgICAgICAgICAgICB3aXRoIGV4aXN0aW5nIGNvZGUsIGFzIGl0IGlzIHBvc3NpYmxlIHRvIG1hdGNoIGV4aXN0aW5nIEFQSXMuCisgICAgICAgICAgICAgICAgSWYgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGlzIDxsaXRlcmFsPiJlcnJvciI8L2xpdGVyYWw+LCB0aGVuIHRoZQorICAgICAgICAgICAgICAgIGZpbmFsIGFyZ3VtZW50IGlzIGEgPGxpdGVyYWw+R0Vycm9yICo8L2xpdGVyYWw+IGFzIHVzdWFsLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNvbWUgZXhhbXBsZXMgdG8gZGVtb25zdHJhdGUgdGhlIHVzYWdlLiBUaGlzIGludHJvc3BlY3Rpb24gWE1MOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyZsdDttZXRob2QgbmFtZT0iSW5jcmVtZW50IiZndDsKKyAgJmx0O2FyZyB0eXBlPSJ1IiBuYW1lPSJ4IiAvJmd0OworICAmbHQ7YXJnIHR5cGU9InUiIGRpcmVjdGlvbj0ib3V0IiAvJmd0OworJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICBFeHBlY3RzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZGVjbGFyYXRpb246CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorZ2Jvb2xlYW4KK215X29iamVjdF9pbmNyZW1lbnQgKE15T2JqZWN0ICpvYmosIGdpbnQzMiB4LCBnaW50MzIgKnJldCwgR0Vycm9yICoqZXJyb3IpOworICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBpbnRyb3NwZWN0aW9uIFhNTDoKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CismbHQ7bWV0aG9kIG5hbWU9IkluY3JlbWVudFJldHZhbCImZ3Q7CisgICZsdDthcmcgdHlwZT0idSIgbmFtZT0ieCIgLyZndDsKKyAgJmx0O2FyZyB0eXBlPSJ1IiBkaXJlY3Rpb249Im91dCIgJmd0OworICAgICZsdDthbm5vdGF0aW9uIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuUmV0dXJuVmFsIiB2YWx1ZT0iIi8mZ3Q7CisgICZsdDsvYXJnJmd0OworJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICBFeHBlY3RzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZGVjbGFyYXRpb246CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorZ2ludDMyCitteV9vYmplY3RfaW5jcmVtZW50X3JldHZhbCAoTXlPYmplY3QgKm9iaiwgZ2ludDMyIHgpCisgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIGludHJvc3BlY3Rpb24gWE1MOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyZsdDttZXRob2QgbmFtZT0iSW5jcmVtZW50UmV0dmFsRXJyb3IiJmd0OworICAmbHQ7YXJnIHR5cGU9InUiIG5hbWU9IngiIC8mZ3Q7CisgICZsdDthcmcgdHlwZT0idSIgZGlyZWN0aW9uPSJvdXQiICZndDsKKyAgICAmbHQ7YW5ub3RhdGlvbiBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLlJldHVyblZhbCIgdmFsdWU9ImVycm9yIi8mZ3Q7CisgICZsdDsvYXJnJmd0OworJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICBFeHBlY3RzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZGVjbGFyYXRpb246CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorZ2ludDMyCitteV9vYmplY3RfaW5jcmVtZW50X3JldHZhbF9lcnJvciAoTXlPYmplY3QgKm9iaiwgZ2ludDMyIHgsIEdFcnJvciAqKmVycm9yKQorICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJweXRob24tY2xpZW50Ij4KKyAgICA8dGl0bGU+UHl0aG9uIEFQSTwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBUaGUgUHl0aG9uIEFQSSwgZGJ1cy1weXRob24sIGlzIG5vdyBkb2N1bWVudGVkIHNlcGFyYXRlbHkgaW4KKyAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1weXRob24vZG9jL3R1dG9yaWFsLmh0bWwiPnRoZSBkYnVzLXB5dGhvbiB0dXRvcmlhbDwvdWxpbms+IChhbHNvIGF2YWlsYWJsZSBpbiBkb2MvdHV0b3JpYWwudHh0LAorICAgICAgYW5kIGRvYy90dXRvcmlhbC5odG1sIGlmIGJ1aWx0IHdpdGggcHl0aG9uLWRvY3V0aWxzLCBpbiB0aGUgZGJ1cy1weXRob24KKyAgICAgIHNvdXJjZSBkaXN0cmlidXRpb24pLgorICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9InF0LWNsaWVudCI+CisgICAgPHRpdGxlPlF0IEFQSTogVXNpbmcgUmVtb3RlIE9iamVjdHM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgCisgICAgICBUaGUgUXQgYmluZGluZ3MgYXJlIG5vdCB5ZXQgZG9jdW1lbnRlZC4KKworICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9InF0LXNlcnZlciI+CisgICAgPHRpdGxlPlF0IEFQSTogSW1wbGVtZW50aW5nIE9iamVjdHM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIFF0IGJpbmRpbmdzIGFyZSBub3QgeWV0IGRvY3VtZW50ZWQuCisgICAgPC9wYXJhPgorICA8L3NlY3QxPgorPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RidXMtdXVpZGdlbi4xIGIvZGJ1cy0xLjQuMTAvZG9jL2RidXMtdXVpZGdlbi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MGZkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvZGJ1cy11dWlkZ2VuLjEKQEAgLTAsMCArMSw4OSBAQAorLlwiIAorLlwiIGRidXMtdXVpZGdlbiBtYW51YWwgcGFnZS4KKy5cIiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgorLlwiCisuVEggZGJ1cy11dWlkZ2VuIDEKKy5TSCBOQU1FCitkYnVzLXV1aWRnZW4gXC0gVXRpbGl0eSB0byBnZW5lcmF0ZSBVVUlEcworLlNIIFNZTk9QU0lTCisuUFAKKy5CIGRidXMtdXVpZGdlbiBbXC1cLXZlcnNpb25dIFtcLVwtZW5zdXJlWz1GSUxFTkFNRV1dIFtcLVwtZ2V0Wz1GSUxFTkFNRV1dCisKKy5TSCBERVNDUklQVElPTgorCitUaGUgXGZJZGJ1cy11dWlkZ2VuXGZQIGNvbW1hbmQgZ2VuZXJhdGVzIG9yIHJlYWRzIGEgdW5pdmVyc2FsbHkgdW5pcXVlIElELgorCisuUFAKK05vdGUgdGhhdCB0aGUgRC1CdXMgVVVJRCBoYXMgbm8gcmVsYXRpb25zaGlwIHRvIFJGQyA0MTIyIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZQorVVVJRHMgY29tcGF0aWJsZSB3aXRoIHRoYXQgc3BlYy4gTWFueSBzeXN0ZW1zIGhhdmUgYSBzZXBhcmF0ZSBjb21tYW5kCitmb3IgdGhhdCAob2Z0ZW4gY2FsbGVkICJ1dWlkZ2VuIikuCisKKy5QUAorU2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvIGZvciBtb3JlIGluZm9ybWF0aW9uCithYm91dCBELUJ1cy4KKworLlBQCitUaGUgcHJpbWFyeSB1c2FnZSBvZiBcZklkYnVzLXV1aWRnZW5cZlAgaXMgdG8gcnVuIGluIHRoZSBwb3N0LWluc3RhbGwKK3NjcmlwdCBvZiBhIEQtQnVzIHBhY2thZ2UgbGlrZSB0aGlzOgorLm5mCisgIGRidXMtdXVpZGdlbiAtLWVuc3VyZQorLmZpCisKKy5QUAorVGhpcyB3aWxsIGVuc3VyZSB0aGF0IC92YXIvbGliL2RidXMvbWFjaGluZS1pZCBleGlzdHMgYW5kIGhhcyB0aGUgdXVpZCBpbiBpdC4KK0l0IHdvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyB1dWlkLCBzaW5jZSB0aGlzIGlkIHNob3VsZCByZW1haW4gZml4ZWQKK2ZvciBhIHNpbmdsZSBtYWNoaW5lIHVudGlsIHRoZSBuZXh0IHJlYm9vdCBhdCBsZWFzdC4KKworLlBQCitUaGUgaW1wb3J0YW50IHByb3BlcnRpZXMgb2YgdGhlIG1hY2hpbmUgVVVJRCBhcmUgdGhhdCAxKSBpdCByZW1haW5zCit1bmNoYW5nZWQgdW50aWwgdGhlIG5leHQgcmVib290IGFuZCAyKSBpdCBpcyBkaWZmZXJlbnQgZm9yIGFueSB0d28gCitydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgT1Mga2VybmVsLiBUaGF0IGlzLCBpZiB0d28gcHJvY2Vzc2VzIHNlZSB0aGUgCitzYW1lIFVVSUQsIHRoZXkgc2hvdWxkIGFsc28gc2VlIHRoZSBzYW1lIHNoYXJlZCBtZW1vcnksIFVOSVggZG9tYWluCitzb2NrZXRzLCBsb2NhbCBYIGRpc3BsYXlzLCBsb2NhbGhvc3QubG9jYWxkb21haW4gcmVzb2x1dGlvbiwgcHJvY2VzcworSURzLCBhbmQgc28gZm9ydGguCisKKy5QUAorSWYgeW91IHJ1biBcZklkYnVzLXV1aWRnZW5cZlAgd2l0aCBubyBvcHRpb25zIGl0IGp1c3QgcHJpbnRzIGEgbmV3IHV1aWQgbWFkZQordXAgb3V0IG9mIHRoaW4gYWlyLgorCisuUFAKK0lmIHlvdSBydW4gaXQgd2l0aCAtLWdldCwgaXQgcHJpbnRzIHRoZSBtYWNoaW5lIFVVSUQgYnkgZGVmYXVsdCwgb3IKK3RoZSBVVUlEIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBpZiB5b3Ugc3BlY2lmeSBhIGZpbGUuCisKKy5QUAorSWYgeW91IHRyeSB0byBjaGFuZ2UgYW4gZXhpc3RpbmcgbWFjaGluZS1pZCBvbiBhIHJ1bm5pbmcgc3lzdGVtLCBpdCB3aWxsCitwcm9iYWJseSByZXN1bHQgaW4gYmFkIHRoaW5ncyBoYXBwZW5pbmcuIERvbid0IHRyeSB0byBjaGFuZ2UgdGhpcyBmaWxlLiBBbHNvLAorZG9uJ3QgbWFrZSBpdCB0aGUgc2FtZSBvbiB0d28gZGlmZmVyZW50IHN5c3RlbXM7IGl0IG5lZWRzIHRvIGJlIGRpZmZlcmVudAorYW55dGltZSB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBrZXJuZWxzIHJ1bm5pbmcuCisKKy5QUAorVGhlIFVVSUQgc2hvdWxkIGJlIGRpZmZlcmVudCBvbiB0d28gZGlmZmVyZW50IHZpcnR1YWwgbWFjaGluZXMsCitiZWNhdXNlIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtlcm5lbHMuCisKKy5TSCBPUFRJT05TCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKKy5UUAorLkkgIi0tZ2V0Wz1GSUxFTkFNRV0iCitJZiBhIGZpbGVuYW1lIGlzIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gbG9jYWxzdGF0ZWRpci9saWIvZGJ1cy9tYWNoaW5lLWlkCisobG9jYWxzdGF0ZWRpciBpcyB1c3VhbGx5IC92YXIpLiBJZiB0aGlzIGZpbGUgZXhpc3RzIGFuZCBpcyB2YWxpZCwgdGhlCit1dWlkIGluIHRoZSBmaWxlIGlzIHByaW50ZWQgb24gc3Rkb3V0LiBPdGhlcndpc2UsIHRoZSBjb21tYW5kIGV4aXRzIAord2l0aCBhIG5vbnplcm8gc3RhdHVzLgorCisuVFAKKy5JICItLWVuc3VyZVs9RklMRU5BTUVdIgorSWYgYSBmaWxlbmFtZSBpcyBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIGxvY2Fsc3RhdGVkaXIvbGliL2RidXMvbWFjaGluZS1pZAorKGxvY2Fsc3RhdGVkaXIgaXMgdXN1YWxseSAvdmFyKS4gSWYgdGhpcyBmaWxlIGV4aXN0cyB0aGVuIGl0IHdpbGwgYmUKK3ZhbGlkYXRlZCwgYW5kIGEgZmFpbHVyZSBjb2RlIHJldHVybmVkIGlmIGl0IGNvbnRhaW5zIHRoZSB3cm9uZyB0aGluZy4KK0lmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIG5ldyB1dWlkIGluIGl0LgorT24gc3VjY2VzcywgcHJpbnRzIG5vIG91dHB1dC4KKworLlRQCisuSSAiLS12ZXJzaW9uIgorUHJpbnQgdGhlIHZlcnNpb24gb2YgZGJ1cy11dWlkZ2VuCisKKy5TSCBBVVRIT1IKK1NlZSBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTCisKKy5TSCBCVUdTCitQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kb2MvZGNvcC1ob3d0by50eHQgYi9kYnVzLTEuNC4xMC9kb2MvZGNvcC1ob3d0by50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkM2JjZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9kY29wLWhvd3RvLnR4dApAQCAtMCwwICsxLDU1OSBAQAorCQlEQ09QOiBEZXNrdG9wIENPbW11bmljYXRpb25zIFByb3RvY29sCisKKwkJICAgIFByZXN0b24gQnJvd24gPHBicm93bkBrZGUub3JnPgorCQkJICAgT2N0b2JlciAxNCwgMTk5OQorCisJIFJldmlzZWQgYW5kIGV4dGVuZGVkIGJ5IE1hdHRoaWFzIEV0dHJpY2ggPGV0dHJpY2hAa2RlLm9yZz4KKwkJCSAgIE1hciAyOSwgMjAwMAorCisgICAgICAgIEV4dGVuZGVkIHdpdGggRENPUCBTaWduYWxzIGJ5IFdhbGRvIEJhc3RpYW4gPGJhc3RpYW5Aa2RlLm9yZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYiAxOSwgMjAwMQorCisKK01vdGl2YXRpb24gYW5kIEJhY2tncm91bmQ6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbW90aXZhdGlvbiBiZWhpbmQgYnVpbGRpbmcgYSBwcm90b2NvbCBsaWtlIERDT1AgaXMgc2ltcGxlLiAgRm9yCit0aGUgcGFzdCB5ZWFyLCB3ZSBoYXZlIGJlZW4gYXR0ZW1wdGluZyB0byBlbmFibGUgaW50ZXJwcm9jZXNzCitjb21tdW5pY2F0aW9uIGJldHdlZW4gS0RFIGFwcGxpY2F0aW9ucy4gS0RFIGFscmVhZHkgaGFzIGFuIGV4dHJlbWVseQorc2ltcGxlIElQQyBtZWNoYW5pc20gY2FsbGVkIEtXTWNvbSwgd2hpY2ggaXMgKHdhcyEpIHVzZWQgZm9yIGNvbW11bmljYXRpbmcKK2JldHdlZW4gdGhlIHBhbmVsIGFuZCB0aGUgd2luZG93IG1hbmFnZXIgZm9yIGluc3RhbmNlLiAgSXQgaXMgYWJvdXQgYXMKK3NpbXBsZSBhcyBpdCBnZXRzLCBwYXNzaW5nIG1lc3NhZ2VzIHZpYSBYIEF0b21zLiAgRm9yIHRoaXMgcmVhc29uIGl0CitpcyBsaW1pdGVkIGluIHRoZSBzaXplIGFuZCBjb21wbGV4aXR5IG9mIHRoZSBkYXRhIHRoYXQgY2FuIGJlIHBhc3NlZAorKFggYXRvbXMgbXVzdCBiZSBzbWFsbCB0byByZW1haW4gZWZmaWNpZW50KSBhbmQgaXQgYWxzbyBtYWtlcyBpdCBzbwordGhhdCBYIGlzIHJlcXVpcmVkLiAgQ09SQkEgd2FzIHRob3VnaHQgdG8gYmUgYSBtb3JlIGVmZmVjdGl2ZSBJUEMvUlBDCitzb2x1dGlvbi4gIEhvd2V2ZXIsIGFmdGVyIGEgeWVhciBvZiBhdHRlbXB0aW5nIHRvIG1ha2UgaGVhdnkgdXNlIG9mCitDT1JCQSBpbiBLREUsIHdlIGhhdmUgcmVhbGl6ZWQgdGhhdCBpdCBpcyBhIGJpdCBzbG93IGFuZCBtZW1vcnkKK2ludGVuc2l2ZSBmb3Igc2ltcGxlIHVzZS4gIEl0IGFsc28gaGFzIG5vIGF1dGhlbnRpY2F0aW9uIGF2YWlsYWJsZS4KKworV2hhdCB3ZSByZWFsbHkgbmVlZGVkIHdhcyBhbiBleHRyZW1lbHkgc2ltcGxlIHByb3RvY29sIHdpdGggYmFzaWMKK2F1dGhvcml6YXRpb24sIGFsb25nIHRoZSBsaW5lcyBvZiBNSVQtTUFHSUMtQ09PS0lFLCBhcyB1c2VkIGJ5IFguICBJdAord291bGQgbm90IGJlIGFibGUgdG8gZG8gTkVBUkxZIHdoYXQgQ09SQkEgd2FzIGFibGUgdG8gZG8sIGJ1dCBmb3IgdGhlCitzaW1wbGUgdGFza3MgcmVxdWlyZWQgaXQgd291bGQgYmUgc3VmZmljaWVudC4gU29tZSBleGFtcGxlcyBvZiBzdWNoCit0YXNrcyBtaWdodCBiZSBhbiBhcHBsaWNhdGlvbiBzZW5kaW5nIGEgbWVzc2FnZSB0byB0aGUgcGFuZWwgc2F5aW5nLAorIkkgaGF2ZSBzdGFydGVkLCBzdG9wIGRpc3BsYXlpbmcgdGhlICdhcHBsaWNhdGlvbiBzdGFydGluZycgd2FpdAorc3RhdGUsIiBvciBoYXZpbmcgYSBuZXcgYXBwbGljYXRpb24gdGhhdCBzdGFydHMgcXVlcnkgdG8gc2VlIGlmIGFueQorb3RoZXIgYXBwbGljYXRpb25zIG9mIHRoZSBzYW1lIG5hbWUgYXJlIHJ1bm5pbmcuICBJZiB0aGV5IGFyZSwgc2ltcGx5CitjYWxsIGEgZnVuY3Rpb24gb24gdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiB0byBjcmVhdGUgYSBuZXcgd2luZG93LAorcmF0aGVyIHRoYW4gc3RhcnRpbmcgYSBuZXcgcHJvY2Vzcy4KKworSW1wbGVtZW50YXRpb246CistLS0tLS0tLS0tLS0tLS0KKworRENPUCBpcyBhIHNpbXBsZSBJUEMvUlBDIG1lY2hhbmlzbSBidWlsdCB0byBvcGVyYXRlIG92ZXIgc29ja2V0cy4KK0VpdGhlciB1bml4IGRvbWFpbiBzb2NrZXRzIG9yIHRjcC9pcCBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQuIERDT1AgaXMKK2J1aWx0IG9uIHRvcCBvZiB0aGUgSW50ZXIgQ2xpZW50IEV4Y2hhbmdlIChJQ0UpIHByb3RvY29sLCB3aGljaCBjb21lcworc3RhbmRhcmQgYXMgYSBwYXJ0IG9mIFgxMVI2IGFuZCBsYXRlci4gSXQgYWxzbyBkZXBlbmRzIG9uIFF0LCBidXQKK2JleW9uZCB0aGF0IGl0IGRvZXMgbm90IHJlcXVpcmUgYW55IG90aGVyIGxpYnJhcmllcy4gQmVjYXVzZSBvZiB0aGlzLAoraXQgaXMgZXh0cmVtZWx5IGxpZ2h0d2VpZ2h0LCBlbmFibGluZyBpdCB0byBiZSBsaW5rZWQgaW50byBhbGwgS0RFCithcHBsaWNhdGlvbnMgd2l0aCBsb3cgb3ZlcmhlYWQuCisKK01vZGVsOgorLS0tLS0tCisKK1RoZSBtb2RlbCBpcyBzaW1wbGUuICBFYWNoIGFwcGxpY2F0aW9uIHVzaW5nIERDT1AgaXMgYSBjbGllbnQuICBUaGV5Citjb21tdW5pY2F0ZSB0byBlYWNoIG90aGVyIHRocm91Z2ggYSBEQ09QIHNlcnZlciwgd2hpY2ggZnVuY3Rpb25zIGxpa2UKK2EgdHJhZmZpYyBkaXJlY3RvciwgZGlzcGF0Y2hpbmcgbWVzc2FnZXMvY2FsbHMgdG8gdGhlIHByb3BlcgorZGVzdGluYXRpb25zLiAgQWxsIGNsaWVudHMgYXJlIHBlZXJzIG9mIGVhY2ggb3RoZXIuCisKK1R3byB0eXBlcyBvZiBhY3Rpb25zIGFyZSBwb3NzaWJsZSB3aXRoIERDT1A6ICJzZW5kIGFuZCBmb3JnZXQiCittZXNzYWdlcywgd2hpY2ggZG8gbm90IGJsb2NrLCBhbmQgImNhbGxzLCIgd2hpY2ggYmxvY2sgd2FpdGluZyBmb3IKK3NvbWUgZGF0YSB0byBiZSByZXR1cm5lZC4KKworQW55IGRhdGEgdGhhdCB3aWxsIGJlIHNlbnQgaXMgc2VyaWFsaXplZCAobWFyc2hhbGxlZCwgZm9yIHlvdSBDT1JCQQordHlwZXMpIHVzaW5nIHRoZSBidWlsdC1pbiBRRGF0YVN0cmVhbSBvcGVyYXRvcnMgYXZhaWxhYmxlIGluIGFsbCBvZgordGhlIFF0IGNsYXNzZXMuICBUaGlzIGlzIGZhc3QgYW5kIGVhc3kuICBJbiBmYWN0IGl0J3Mgc28gbGl0dGxlIHdvcmsKK3RoYXQgeW91IGNhbiBlYXNpbHkgd3JpdGUgdGhlIG1hcnNoYWxsaW5nIGNvZGUgYnkgaGFuZC4gSW4gYWRkaXRpb24sCit0aGVyZSdzIGEgc2ltcGxlIElETC1saWtlIGNvbXBpbGVyIGF2YWlsYWJsZSAoZGNvcGlkbCBhbmQgZGNvcGlkbDJjcHApCit0aGF0IGdlbmVyYXRlcyBzdHVicyBhbmQgc2tlbGV0b25zIGZvciB5b3UuIFVzaW5nIHRoZSBkY29waWRsIGNvbXBpbGVyCitoYXMgdGhlIGFkZGl0aW9uYWwgYmVuZWZpdCBvZiB0eXBlIHNhZmV0eS4KKworVGhpcyBIT1dUTyBkZXNjcmliZXMgdGhlIG1hbnVhbCBtZXRob2QgZmlyc3QgYW5kIGNvdmVycyB0aGUgZGNvcGlkbAorY29tcGlsZXIgbGF0ZXIuCisKK0VzdGFibGlzaGluZyB0aGUgQ29ubmVjdGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworS0FwcGxpY2F0aW9uIGhhcyBnYWluZWQgYSBtZXRob2QgY2FsbGVkICJLQXBwbGljYXRpb246OmRjb3BDbGllbnQoKSIKK3doaWNoIHJldHVybnMgYSBwb2ludGVyIHRvIGEgRENPUENsaWVudCBpbnN0YW5jZS4gIFRoZSBmaXJzdCB0aW1lIHRoaXMKK21ldGhvZCBpcyBjYWxsZWQsIHRoZSBjbGllbnQgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkLiAgRENPUENsaWVudHMgaGF2ZQordW5pcXVlIGlkZW50aWZpZXJzIGF0dGFjaGVkIHRvIHRoZW0gd2hpY2ggYXJlIGJhc2VkIG9uIHdoYXQKK0tBcHBsaWNhdGlvbjo6bmFtZSgpIHJldHVybnMuICBJbiBmYWN0LCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlCitpbnN0YW5jZSBvZiB0aGUgcHJvZ3JhbSBydW5uaW5nLCB0aGUgYXBwSWQgd2lsbCBiZSBlcXVhbCB0bworS0FwcGxpY2F0aW9uOjpuYW1lKCkuCisKK1RvIGFjdHVhbGx5IGVuYWJsZSBEQ09QIGNvbW11bmljYXRpb24gdG8gYmVnaW4sIHlvdSBtdXN0IHVzZQorRENPUENsaWVudDo6YXR0YWNoKCkuICBUaGlzIHdpbGwgYXR0ZW1wdCB0byBhdHRhY2ggdG8gdGhlIERDT1Agc2VydmVyLgorSWYgbm8gc2VydmVyIGlzIGZvdW5kIG9yIHRoZXJlIGlzIGFueSBvdGhlciB0eXBlIG9mIGVycm9yLCBhdHRhY2goKQord2lsbCByZXR1cm4gZmFsc2UuIEtBcHBsaWNhdGlvbiB3aWxsIGNhdGNoIGEgZGNvcCBzaWduYWwgYW5kIGRpc3BsYXkgYW4KK2FwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UgYm94IGluIHRoYXQgY2FzZS4KKworQWZ0ZXIgY29ubmVjdGluZyB3aXRoIHRoZSBzZXJ2ZXIgdmlhIERDT1BDbGllbnQ6OmF0dGFjaCgpLCB5b3UgbmVlZCB0bworcmVnaXN0ZXIgdGhpcyBhcHBJZCB3aXRoIHRoZSBzZXJ2ZXIgc28gaXQga25vd3MgYWJvdXQgeW91LiAgT3RoZXJ3aXNlLAoreW91IGFyZSBjb21tdW5pY2F0aW5nIGFub255bW91c2x5LiAgVXNlIHRoZQorRENPUENsaWVudDo6cmVnaXN0ZXJBcyhjb25zdCBRQ1N0cmluZyAmbmFtZSkgdG8gZG8gc28uICBJbiB0aGUgc2ltcGxlCitjYXNlOgorCisvKgorICogcmV0dXJucyB0aGUgYXBwSWQgdGhhdCBpcyBhY3R1YWxseSByZWdpc3RlcmVkLCB3aGljaCBfbWF5XyBiZQorICogZGlmZmVyZW50IGZyb20gd2hhdCB5b3UgcGFzc2VkCisgKi8KK2FwcElkID0gY2xpZW50LT5yZWdpc3RlckFzKGtBcHAtPm5hbWUoKSk7CisKK0lmIHlvdSBuZXZlciByZXRyaWV2ZSB0aGUgRENPUENsaWVudCBwb2ludGVyIGZyb20gS0FwcGxpY2F0aW9uLCB0aGUKK29iamVjdCB3aWxsIG5vdCBiZSBjcmVhdGVkIGFuZCB0aHVzIHRoZXJlIHdpbGwgYmUgbm8gbWVtb3J5IG92ZXJoZWFkLgorCitZb3UgbWF5IGFsc28gZGV0YWNoIGZyb20gdGhlIHNlcnZlciBieSBjYWxsaW5nIERDT1BDbGllbnQ6OmRldGFjaCgpLgorSWYgeW91IHdpc2ggdG8gYXR0YWNoIGFnYWluIHlvdSB3aWxsIG5lZWQgdG8gcmUtcmVnaXN0ZXIgYXMgd2VsbC4gIElmCit5b3Ugb25seSB3aXNoIHRvIGNoYW5nZSB0aGUgSUQgdW5kZXIgd2hpY2ggeW91IGFyZSByZWdpc3RlcmVkLCBzaW1wbHkKK2NhbGwgRENPUENsaWVudDo6cmVnaXN0ZXJBcygpIHdpdGggdGhlIG5ldyBuYW1lLgorCitLVW5pcXVlQXBwbGljYXRpb24gYXV0b21hdGljYWxseSByZWdpc3RlcnMgaXRzZWxmIHRvIERDT1AuIElmIHlvdQorYXJlIHVzaW5nIEtVbmlxdWVBcHBsaWNhdGlvbiB5b3Ugc2hvdWxkIG5vdCBhdHRhY2ggb3IgcmVnaXN0ZXIKK3lvdXJzZWxmLCB0aGlzIGlzIGFscmVhZHkgZG9uZS4gVGhlIGFwcElkIGlzIGJ5IGRlZmluaXRpb24KK2VxdWFsIHRvIGthcHAtPm5hbWUoKS4gWW91IGNhbiByZXRyaWV2ZSB0aGUgcmVnaXN0ZXJlZCBEQ09QIGNsaWVudAorYnkgY2FsbGluZyBrYXBwLT5kY29wQ2xpZW50KCkuCisKK1NlbmRpbmcgRGF0YSB0byBhIFJlbW90ZSBBcHBsaWNhdGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYWN0dWFsbHkgY29tbXVuaWNhdGUsIHlvdSBoYXZlIG9uZSBvZiB0d28gY2hvaWNlcy4gIFlvdSBtYXkgZWl0aGVyCitjYWxsIHRoZSAic2VuZCIgb3IgdGhlICJjYWxsIiBtZXRob2QuICBCb3RoIG1ldGhvZHMgcmVxdWlyZSB0aHJlZQoraWRlbnRpZmljYXRpb24gcGFyYW1ldGVyczogYW4gYXBwbGljYXRpb24gaWRlbnRpZmllciwgYSByZW1vdGUgb2JqZWN0LAorYSByZW1vdGUgZnVuY3Rpb24uIFNlbmRpbmcgaXMgYXN5bmNocm9ub3VzIChpLmUuIGl0IHJldHVybnMgaW1tZWRpYXRlbHkpCithbmQgbWF5IG9yIG1heSBub3QgcmVzdWx0IGluIHlvdXIgb3duIGFwcGxpY2F0aW9uIGJlaW5nIHNlbnQgYSBtZXNzYWdlIGF0Citzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuIFRoZW4gInNlbmQiIHJlcXVpcmVzIG9uZSBhbmQgImNhbGwiIHJlcXVpcmVzCit0d28gZGF0YSBwYXJhbWV0ZXJzLgorCitUaGUgcmVtb3RlIG9iamVjdCBtdXN0IGJlIHNwZWNpZmllZCBhcyBhbiBvYmplY3QgaGllcmFyY2h5LiAgVGhhdCBpcywKK2lmIHRoZSB0b3BsZXZlbCBvYmplY3QgaXMgY2FsbGVkICJmb29PYmplY3QiIGFuZCBoYXMgdGhlIGNoaWxkCisiYmFyT2JqZWN0IiwgeW91IHdvdWxkIHJlZmVyZW5jZSB0aGlzIG9iamVjdCBhcyAiZm9vT2JqZWN0L2Jhck9iamVjdCIuCitGdW5jdGlvbnMgbXVzdCBiZSBkZXNjcmliZWQgYnkgYSBmdWxsIGZ1bmN0aW9uIHNpZ25hdHVyZS4gIElmIHRoZQorcmVtb3RlIGZ1bmN0aW9uIGlzIGNhbGxlZCAiZG9JdCIsIGFuZCBpdCB0YWtlcyBhbiBpbnQsIGl0IHdvdWxkIGJlCitkZXNjcmliZWQgYXMgImRvSXQoaW50KSIuICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBub3QKK3NwZWNpZmllZCBoZXJlLCBhcyBpdCBpcyBub3QgcGFydCBvZiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIChvciBhdAorbGVhc3QgdGhlIEMrKyB1bmRlcnN0YW5kaW5nIG9mIGEgZnVuY3Rpb24gc2lnbmF0dXJlKS4gIFlvdSB3aWxsIGdldAordGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gYmFjayBhcyBhbiBleHRyYSBwYXJhbWV0ZXIgdG8KK0RDT1BDbGllbnQ6OmNhbGwoKS4gIFNlZSB0aGUgc2VjdGlvbiBvbiBjYWxsKCkgZm9yIG1vcmUgZGV0YWlscy4KKworSW4gb3JkZXIgdG8gYWN0dWFsbHkgZ2V0IHRoZSBkYXRhIHRvIHRoZSByZW1vdGUgY2xpZW50LCBpdCBtdXN0IGJlCisic2VyaWFsaXplZCIgdmlhIGEgUURhdGFTdHJlYW0gb3BlcmF0aW5nIG9uIGEgUUJ5dGVBcnJheS4gVGhpcyBpcyBob3cKK3RoZSBkYXRhIHBhcmFtZXRlciBpcyAiYnVpbHQiLiBBIGZldyBleGFtcGxlcyB3aWxsIG1ha2UgY2xlYXIgaG93IHRoaXMKK3dvcmtzLgorCitTYXkgeW91IHdhbnQgdG8gY2FsbCAiZG9JdCIgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgbm90IGJsb2NrIChvciB3YWl0Citmb3IgYSByZXNwb25zZSkuICBZb3Ugd2lsbCBub3QgcmVjZWl2ZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSByZW1vdGVseQorY2FsbGVkIGZ1bmN0aW9uLCBidXQgeW91IHdpbGwgbm90IGhhbmcgd2hpbGUgdGhlIFJQQyBpcyBwcm9jZXNzZWQgZWl0aGVyLgorVGhlIHJldHVybiB2YWx1ZSBvZiBzZW5kKCkgaW5kaWNhdGVzIHdoZXRoZXIgRENPUCBjb21tdW5pY2F0aW9uIHN1Y2NlZWRlZAorb3Igbm90LgorCitRQnl0ZUFycmF5IGRhdGE7CitRRGF0YVN0cmVhbSBhcmcoZGF0YSwgSU9fV3JpdGVPbmx5KTsKK2FyZyA8PCA1OworaWYgKCFjbGllbnQtPnNlbmQoInNvbWVBcHBJZCIsICJmb29PYmplY3QvYmFyT2JqZWN0IiwgImRvSXQoaW50KSIsCisJICAgICAgICAgIGRhdGEpKQorICBxRGVidWcoInRoZXJlIHdhcyBzb21lIGVycm9yIHVzaW5nIERDT1AuIik7CisKK09LLCBub3cgbGV0J3Mgc2F5IHdlIHdhbnRlZCB0byBnZXQgdGhlIGRhdGEgYmFjayBmcm9tIHRoZSByZW1vdGVseQorY2FsbGVkIGZ1bmN0aW9uLiAgWW91IGhhdmUgdG8gZXhlY3V0ZSBhIGNhbGwoKSBpbnN0ZWFkIG9mIGEgc2VuZCgpLgorVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgdGhlbiBiZSBhdmFpbGFibGUgaW4gdGhlIGRhdGEgcGFyYW1ldGVyICJyZXBseSIuCitUaGUgYWN0dWFsIHJldHVybiB2YWx1ZSBvZiBjYWxsKCkgaXMgc3RpbGwgd2hldGhlciBvciBub3QgRENPUAorY29tbXVuaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKworUUJ5dGVBcnJheSBkYXRhLCByZXBseURhdGE7CitRQ1N0cmluZyByZXBseVR5cGU7CitRRGF0YVN0cmVhbSBhcmcoZGF0YSwgSU9fV3JpdGVPbmx5KTsKK2FyZyA8PCA1OworaWYgKCFjbGllbnQtPmNhbGwoInNvbWVBcHBJZCIsICJmb29PYmplY3QvYmFyT2JqZWN0IiwgImRvSXQoaW50KSIsCisgICAgICAgICAgICAgICAgICBkYXRhLCByZXBseVR5cGUsIHJlcGx5RGF0YSkpCisgIHFEZWJ1ZygidGhlcmUgd2FzIHNvbWUgZXJyb3IgdXNpbmcgRENPUC4iKTsKK2Vsc2UgeworICBRRGF0YVN0cmVhbSByZXBseShyZXBseURhdGEsIElPX1JlYWRPbmx5KTsKKyAgaWYgKHJlcGx5VHlwZSA9PSAiUVN0cmluZyIpIHsKKyAgICBRU3RyaW5nIHJlc3VsdDsKKyAgICByZXBseSA+PiByZXN1bHQ7CisgICAgcHJpbnQoInRoZSByZXN1bHQgaXM6ICVzIixyZXN1bHQubGF0aW4xKCkpOworICB9IGVsc2UKKyAgICBxRGVidWcoImRvSXQgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB0eXBlIG9mIHJlcGx5ISIpOworfQorCitOLkIuOiBZb3UgY2Fubm90IGNhbGwoKSBhIG1ldGhvZCBiZWxvbmdpbmcgdG8gYW4gYXBwbGljYXRpb24gd2hpY2ggaGFzCityZWdpc3RlcmVkIHdpdGggYW4gdW5pcXVlIG51bWVyaWMgaWQgYXBwZW5kZWQgdG8gaXRzIHRleHR1YWwgbmFtZSAoc2VlCitkY29wY2xpZW50LmggZm9yIG1vcmUgaW5mbykuIEluIHRoaXMgY2FzZSwgRENPUCB3b3VsZCBub3Qga25vdyB3aGljaAorYXBwbGljYXRpb24gaXQgc2hvdWxkIGNvbm5lY3Qgd2l0aCB0byBjYWxsIHRoZSBtZXRob2QuIFRoaXMgaXMgbm90IGFuIGlzc3VlCit3aXRoIHNlbmQoKSwgYXMgeW91IGNhbiBicm9hZGNhc3QgdG8gYWxsIGFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgcmVnaXN0ZXJlZAord2l0aCBhcHBuYW1lLTxudW1lcmljX2lkPiBieSB1c2luZyBhIHdpbGRjYXJkIChlLmcuICdrb25zb2xlLSonKSwgd2hpY2gKK3dpbGwgc2VuZCB5b3VyIHNpZ25hbCB0byBhbGwgYXBwbGljYXRpb25zIGNhbGxlZCAna29uc29sZScuCisKK1JlY2VpdmluZyBEYXRhIHZpYSBEQ09QOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0N1cnJlbnRseSB0aGUgb25seSByZWFsIHdheSB0byByZWNlaXZlIGRhdGEgZnJvbSBEQ09QIGlzIHRvIG11bHRpcGx5Citpbmhlcml0IGZyb20gdGhlIG5vcm1hbCBjbGFzcyB0aGF0IHlvdSBhcmUgaW5oZXJpdGluZyAodXN1YWxseSBzb21lCitzb3J0IG9mIFFXaWRnZXQgc3ViY2xhc3Mgb3IgUU9iamVjdCkgYXMgd2VsbCBhcyB0aGUgRENPUE9iamVjdCBjbGFzcy4KK0RDT1BPYmplY3QgcHJvdmlkZXMgb25lIHZlcnkgaW1wb3J0YW50IG1ldGhvZDogRENPUE9iamVjdDo6cHJvY2VzcygpLgorVGhpcyBpcyBhIHB1cmUgdmlydHVhbCBtZXRob2QgdGhhdCB5b3UgbXVzdCBpbXBsZW1lbnQgaW4gb3JkZXIgdG8KK3Byb2Nlc3MgRENPUCBtZXNzYWdlcyB0aGF0IHlvdSByZWNlaXZlLiAgSXQgdGFrZXMgYSBmdW5jdGlvbgorc2lnbmF0dXJlLCBRQnl0ZUFycmF5IG9mIHBhcmFtZXRlcnMsIGFuZCBhIHJlZmVyZW5jZSB0byBhIFFCeXRlQXJyYXkKK2ZvciB0aGUgcmVwbHkgZGF0YSB0aGF0IHlvdSBtdXN0IGZpbGwgaW4uCisKK1RoaW5rIG9mIERDT1BPYmplY3Q6OnByb2Nlc3MoKSBhcyBhIHNvcnQgb2YgZGlzcGF0Y2ggYWdlbnQuICBJbiB0aGUKK2Z1dHVyZSwgdGhlcmUgd2lsbCBwcm9iYWJseSBiZSBhIHByZWNvbXBpbGVyIGZvciB5b3VyIHNvdXJjZXMgdG8gd3JpdGUKK3RoaXMgbWV0aG9kIGZvciB5b3UuICBIb3dldmVyLCB1bnRpbCB0aGF0IHBvaW50IHlvdSBuZWVkIHRvIGV4YW1pbmUKK3RoZSBpbmNvbWluZyBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIHRha2UgYWN0aW9uIGFjY29yZGluZ2x5LiAgSGVyZSBpcworYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbi4KKworYm9vbCBCYXJPYmplY3Q6OnByb2Nlc3MoY29uc3QgUUNTdHJpbmcgJmZ1biwgY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwKKwkJICAgICAgICBRQ1N0cmluZyAmcmVwbHlUeXBlLCBRQnl0ZUFycmF5ICZyZXBseURhdGEpCit7CisgIGlmIChmdW4gPT0gImRvSXQoaW50KSIpIHsKKyAgICBRRGF0YVN0cmVhbSBhcmcoZGF0YSwgSU9fUmVhZE9ubHkpOworICAgIGludCBpOyAvLyBwYXJhbWV0ZXIKKyAgICBhcmcgPj4gaTsKKyAgICBRU3RyaW5nIHJlc3VsdCA9IHNlbGYtPmRvSXQgKGkpOworICAgIFFEYXRhU3RyZWFtIHJlcGx5KHJlcGx5RGF0YSwgSU9fV3JpdGVPbmx5KTsKKyAgICByZXBseSA8PCByZXN1bHQ7CisgICAgcmVwbHlUeXBlID0gIlFTdHJpbmciOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHFEZWJ1ZygidW5rbm93biBmdW5jdGlvbiBjYWxsIHRvIEJhck9iamVjdDo6cHJvY2VzcygpIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK1JlY2VpdmluZyBDYWxscyBhbmQgcHJvY2Vzc2luZyB0aGVtOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdXIgYXBwbGljYXRpb25zIGlzIGFibGUgdG8gcHJvY2VzcyBpbmNvbWluZyBmdW5jdGlvbiBjYWxscworcmlnaHQgYXdheSB0aGUgYWJvdmUgY29kZSBpcyBhbGwgeW91IG5lZWQuIFdoZW4geW91ciBhcHBsaWNhdGlvbgorbmVlZHMgdG8gZG8gbW9yZSBjb21wbGV4IHRhc2tzIHlvdSBtaWdodCB3YW50IHRvIGRvIHRoZSBwcm9jZXNzaW5nCitvdXQgb2YgJ3Byb2Nlc3MnIGZ1bmN0aW9uIGNhbGwgYW5kIHNlbmQgdGhlIHJlc3VsdCBiYWNrIGxhdGVyIHdoZW4KK2l0IGJlY29tZXMgYXZhaWxhYmxlLgorCitGb3IgdGhpcyB5b3UgY2FuIGFzayB5b3VyIERDT1BDbGllbnQgZm9yIGEgdHJhbnNhY3Rpb25JZC4gWW91IGNhbgordGhlbiByZXR1cm4gZnJvbSB0aGUgJ3Byb2Nlc3MnIGZ1bmN0aW9uIGFuZCB3aGVuIHRoZSByZXN1bHQgaXMKK2F2YWlsYWJsZSBmaW5pc2ggdGhlIHRyYW5zYWN0aW9uLiBJbiB0aGUgbWVhbiB0aW1lIHlvdXIgYXBwbGljYXRpb24KK2NhbiByZWNlaXZlIGluY29taW5nIERDT1AgZnVuY3Rpb24gY2FsbHMgZnJvbSBvdGhlciBjbGllbnRzLgorCitTdWNoIGNvZGUgY291bGQgbGlrZSB0aGlzOgorCitib29sIEJhck9iamVjdDo6cHJvY2Vzcyhjb25zdCBRQ1N0cmluZyAmZnVuLCBjb25zdCBRQnl0ZUFycmF5ICZkYXRhLAorCQkgICAgICAgIFFDU3RyaW5nICYsIFFCeXRlQXJyYXkgJikKK3sKKyAgaWYgKGZ1biA9PSAiZG9JdChpbnQpIikgeworICAgIFFEYXRhU3RyZWFtIGFyZyhkYXRhLCBJT19SZWFkT25seSk7CisgICAgaW50IGk7IC8vIHBhcmFtZXRlcgorICAgIGFyZyA+PiBpOworICAgIFFTdHJpbmcgcmVzdWx0ID0gc2VsZi0+ZG9JdChpKTsKKworICAgIERDT1BDbGllbnRUcmFuc2FjdGlvbiAqbXlUcmFuc2FjdGlvbjsKKyAgICBteVRyYW5zYWN0aW9uID0ga2FwcC0+ZGNvcENsaWVudCgpLT5iZWdpblRyYW5zYWN0aW9uKCk7CisKKyAgICAvLyBzdGFydCBwcm9jZXNzaW5nLi4uCisgICAgLy8gQ2FsbHMgc2xvdFByb2Nlc3NpbmdEb25lIHdoZW4gZmluaXNoZWQuCisgICAgc3RhcnRQcm9jZXNzaW5nKCBteVRyYW5zYWN0aW9uLCBpKTsKKworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHFEZWJ1ZygidW5rbm93biBmdW5jdGlvbiBjYWxsIHRvIEJhck9iamVjdDo6cHJvY2VzcygpIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3Nsb3RQcm9jZXNzaW5nRG9uZShEQ09QQ2xpZW50VHJhbnNhY3Rpb24gKm15VHJhbnNhY3Rpb24sIGNvbnN0IFFTdHJpbmcgJnJlc3VsdCkKK3sKKyAgICBRQ1N0cmluZyByZXBseVR5cGUgPSAiUVN0cmluZyI7CisgICAgUUJ5dGVBcnJheSByZXBseURhdGE7CisgICAgUURhdGFTdHJlYW0gcmVwbHkocmVwbHlEYXRhLCBJT19Xcml0ZU9ubHkpOworICAgIHJlcGx5IDw8IHJlc3VsdDsKKyAgICBrYXBwLT5kY29wQ2xpZW50KCktPmVuZFRyYW5zYWN0aW9uKCBteVRyYW5zYWN0aW9uLCByZXBseVR5cGUsIHJlcGx5RGF0YSApOworfQorCitEQ09QIFNpZ25hbHMKKy0tLS0tLS0tLS0tLQorCitTb21ldGltZXMgYSBjb21wb25lbnQgd2FudHMgdG8gc2VuZCBub3RpZmljYXRpb25zIHZpYSBEQ09QIHRvIG90aGVyCitjb21wb25lbnRzIGJ1dCBkb2VzIG5vdCBrbm93IHdoaWNoIGNvbXBvbmVudHMgd2lsbCBiZSBpbnRlcmVzdGVkIGluIHRoZXNlCitub3RpZmljYXRpb25zLiBPbmUgY291bGQgdXNlIGEgYnJvYWRjYXN0IGluIHN1Y2ggYSBjYXNlIGJ1dCB0aGlzIGlzIGEgdmVyeQorY3J1ZGUgbWV0aG9kLiBGb3IgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0aG9kIERDT1Agc2lnbmFscyBoYXZlIGJlZW4gaW52ZW50ZWQuCisKK0RDT1Agc2lnbmFscyBhcmUgdmVyeSBzaW1pbGFpciB0byBRdCBzaWduYWxzLCB0aGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlcyAKK3Rob3VnaC4gQSBEQ09QIHNpZ25hbCBjYW4gYmUgY29ubmVjdGVkIHRvIGEgRENPUCBmdW5jdGlvbi4gV2hlbmV2ZXIgdGhlIERDT1AKK3NpZ25hbCBnZXRzIGVtaXR0ZWQsIHRoZSBEQ09QIGZ1bmN0aW9ucyB0byB3aGljaCB0aGUgc2lnbmFsIGlzIGNvbm5lY3RlZCBhcmUKK2JlaW5nIGNhbGxlZC4gRENPUCBzaWduYWxzIGFyZSwganVzdCBsaWtlIFF0IHNpZ25hbHMsIG9uZSB3YXkuIFRoZXkgZG8gbm90Citwcm92aWRlIGEgcmV0dXJuIHZhbHVlLiAKKworQSBEQ09QIHNpZ25hbCBvcmlnaW5hdGVzIGZyb20gYSBEQ09QIE9iamVjdC9EQ09QIENsaWVudCBjb21iaW5hdGlvbiAoc2VuZGVyKS4gCitJdCBjYW4gYmUgY29ubmVjdGVkIHRvIGEgZnVuY3Rpb24gb2YgYW5vdGhlciBEQ09QIE9iamVjdC9EQ09QIENsaWVudCAKK2NvbWJpbmF0aW9uIChyZWNlaXZlcikuCisKK1RoZXJlIGFyZSB0d28gbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb25uZWN0aW9ucyBvZiBRdCBzaWduYWxzIGFuZCAKK2Nvbm5lY3Rpb25zIG9mIERDT1Agc2lnbmFscy4gSW4gRENPUCwgdW5saWtlIFF0LCBhIHNpZ25hbCBjb25uZWN0aW9ucyBjYW4KK2hhdmUgYW4gYW5vbnltb3VzIHNlbmRlciBhbmQsIHVubGlrZSBRdCwgYSBEQ09QIHNpZ25hbCBjb25uZWN0aW9uIGNhbiBiZQorbm9uLXZvbGF0aWxlLgorCitXaXRoIERDT1Agb25lIGNhbiBjb25uZWN0IGEgc2lnbmFsIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgc2VuZGluZyBEQ09QIE9iamVjdCAKK29yIERDT1AgQ2xpZW50LiBJbiB0aGF0IGNhc2Ugc2lnbmFscyBmcm9tIGFueSBEQ09QIE9iamVjdCBhbmQvb3IgRENPUCBDbGllbnQKK3dpbGwgYmUgZGVsaXZlcmVkLiBUaGlzIGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBjZXJ0YWluIGV2ZW50cyB3aXRob3V0Cit0eWluZyBvbmVzZWxmIHRvIGEgY2VydGFpbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRlcyB0aGUgZXZlbnRzLgorCitBbm90aGVyIERDT1AgZmVhdHVyZSBhcmUgc28gY2FsbGVkIG5vbi12b2xhdGlsZSBjb25uZWN0aW9ucy4gV2l0aCBRdCBzaWduYWwKK2Nvbm5lY3Rpb25zLCB0aGUgY29ubmVjdGlvbiBnZXRzIGRlbGV0ZWQgd2hlbiBlaXRoZXIgc2VuZGVyIG9yIHJlY2VpdmVyIG9mCit0aGUgc2lnbmFsIGdldHMgZGVsZXRlZC4gQSB2b2xhdGlsZSBEQ09QIHNpZ25hbCBjb25uZWN0aW9uIHdpbGwgYmVoYXZlIHRoZQorc2FtZS4gSG93ZXZlciwgYSBub24tdm9sYXRpbGUgRENPUCBzaWduYWwgY29ubmVjdGlvbiB3aWxsIG5vdCBnZXQgZGVsZXRlZCAKK3doZW4gdGhlIHNlbmRpbmcgb2JqZWN0IGdldHMgZGVsZXRlZC4gT25jZSBhIG5ldyBvYmplY3QgZ2V0cyBjcmVhdGVkIHdpdGggCit0aGUgc2FtZSBuYW1lIGFzIHRoZSBvcmlnaW5hbCBzZW5kaW5nIG9iamVjdCwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSByZXN0b3JlZC4KK1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHdoZW4gdGhlIHJlY2VpdmluZyBvYmplY3QgZ2V0cyBkZWxldGVkLAoraW4gdGhhdCBjYXNlIHRoZSBzaWduYWwgY29ubmVjdGlvbiB3aWxsIGFsd2F5cyBiZSBkZWxldGVkLgorCitBIHJlY2VpdmVyIGNhbiBjcmVhdGUgYSBub24tdm9sYXRpbGUgY29ubmVjdGlvbiB3aGlsZSB0aGUgc2VuZGVyIGRvZXNuJ3QgKHlldCkKK2V4aXN0LiBBbiBhbm9ueW1vdXMgRENPUCBjb25uZWN0aW9uIHNob3VsZCBhbHdheXMgYmUgbm9uLXZvbGF0aWxlLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IEtMYXVuY2hlciBlbWl0cyBhIHNpZ25hbCB3aGVuZXZlciBpdCBub3RpY2VzCit0aGF0IGFuIGFwcGxpY2F0aW9uIHRoYXQgd2FzIHN0YXJ0ZWQgdmlhIEtMYXVuY2hlciB0ZXJtaW5hdGVzLgorCisgICBRQnl0ZUFycmF5IHBhcmFtczsKKyAgIFFEYXRhU3RyZWFtIHN0cmVhbShwYXJhbXMsIElPX1dyaXRlT25seSk7CisgICBzdHJlYW0gPDwgcGlkOworICAga2FwcC0+ZGNvcENsaWVudCgpLT5lbWl0RENPUFNpZ25hbCgiY2xpZW50RGllZChwaWRfdCkiLCBwYXJhbXMpOworCitUaGUgdGFzayBtYW5hZ2VyIG9mIHRoZSBLREUgcGFuZWwgY29ubmVjdHMgdG8gdGhpcyBzaWduYWwuIEl0IHVzZXMgYW4gCithbm9ueW1vdXMgY29ubmVjdGlvbiAoaXQgZG9lc24ndCByZXF1aXJlIHRoYXQgdGhlIHNpZ25hbCBpcyBiZWluZyBlbWl0dGVkCitieSBLTGF1bmNoZXIpIHRoYXQgaXMgbm9uLXZvbGF0aWxlOgorCisgICBjb25uZWN0RENPUFNpZ25hbCgwLCAwLCAiY2xpZW50RGllZChwaWRfdCkiLCAiY2xpZW50RGllZChwaWRfdCkiLCBmYWxzZSk7CisKK0l0IGNvbm5lY3RzIHRoZSBjbGllbnREaWVkKHBpZF90KSBzaWduYWwgdG8gaXRzIG93biBjbGllbnREaWVkKHBpZF90KSBEQ09QCitmdW5jdGlvbi4gSW4gdGhpcyBjYXNlIHRoZSBzaWduYWwgYW5kIHRoZSBmdW5jdGlvbiB0byBjYWxsIGhhdmUgdGhlIHNhbWUgbmFtZS4KK1RoaXMgaXNuJ3QgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIGFyZ3VtZW50cyBvZiBib3RoIHNpZ25hbCBhbmQgcmVjZWl2aW5nIGZ1bmN0aW9uCittYXRjaC4gVGhlIHJlY2VpdmluZyBmdW5jdGlvbiBtYXkgaWdub3JlIG9uZSBvciBtb3JlIG9mIHRoZSB0cmFpbGluZyBhcmd1bWVudHMKK29mIHRoZSBzaWduYWwuIEUuZy4gaXQgaXMgYWxsb3dlZCB0byBjb25uZWN0IHRoZSBjbGllbnREaWVkKHBpZF90KSBzaWduYWwgdG8KK2EgY2xpZW50RGllZCh2b2lkKSBEQ09QIGZ1bmN0aW9uLgorCitVc2luZyB0aGUgZGNvcGlkbCBjb21waWxlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Rjb3BpZGwgbWFrZXMgc2V0dGluZyB1cCBhIERDT1Agc2VydmVyIGVhc3kuIEluc3RlYWQgb2YgaGF2aW5nIHRvIGltcGxlbWVudAordGhlIHByb2Nlc3MoKSBtZXRob2QgYW5kIHVubWFyc2hhbGxpbmcgKHJldHJpZXZpbmcgZnJvbSBRQnl0ZUFycmF5KSBwYXJhbWV0ZXJzCittYW51YWxseSwgeW91IGNhbiBsZXQgZGNvcGlkbCBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBjb2RlIG9uIHlvdXIgYmVoYWxmLgorCitUaGlzIGFsc28gYWxsb3dzIHlvdSB0byBkZXNjcmliZSB0aGUgaW50ZXJmYWNlIGZvciB5b3VyIGNsYXNzIGluIGEKK3NpbmdsZSwgc2VwYXJhdGUgaGVhZGVyIGZpbGUuCisKK1dyaXRpbmcgYW4gSURMIGZpbGUgaXMgdmVyeSBzaW1pbGFyIHRvIHdyaXRpbmcgYSBub3JtYWwgQysrIGhlYWRlci4gQW4KK2V4Y2VwdGlvbiBpcyB0aGUga2V5d29yZCAnQVNZTkMnLiBJdCBpbmRpY2F0ZXMgdGhhdCBhIGNhbGwgdG8gdGhpcworZnVuY3Rpb24gc2hhbGwgYmUgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LiBGb3IgdGhlIEMrKyBjb21waWxlciwgaXQKK2V4cGFuZHMgdG8gJ3ZvaWQnLgorCitFeGFtcGxlOgorCisjaWZuZGVmIE1ZX0lOVEVSRkFDRV9ICisjZGVmaW5lIE1ZX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDxkY29wb2JqZWN0Lmg+CisKK2NsYXNzIE15SW50ZXJmYWNlIDogdmlydHVhbCBwdWJsaWMgRENPUE9iamVjdAoreworICBLX0RDT1AKKworICBrX2Rjb3A6CisKKyAgICB2aXJ0dWFsIEFTWU5DIG15QXN5bmNocm9ub3VzTWV0aG9kKFFTdHJpbmcgc29tZVBhcmFtZXRlcikgPSAwOworICAgIHZpcnR1YWwgUVJlY3QgbXlTeW5jaHJvbm91c01ldGhvZCgpID0gMDsKK307CisKKyNlbmRpZgorCitBcyB5b3UgY2FuIHNlZSwgeW91J3JlIGVzc2VudGlhbGx5IGRlY2xhcmluZyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzLCB3aGljaAordmlydHVhbGx5IGluaGVyaXRzIGZyb20gRENPUE9iamVjdC4KKworSWYgeW91J3JlIHVzaW5nIHRoZSBzdGFuZGFyZCBLREUgYnVpbGQgc2NyaXB0cywgdGhlbiB5b3UgY2FuIHNpbXBseQorYWRkIHRoaXMgZmlsZSAod2hpY2ggeW91IHdvdWxkIGNhbGwgTXlJbnRlcmZhY2UuaCkgdG8geW91ciBzb3VyY2VzCitkaXJlY3RvcnkuIFRoZW4geW91IGVkaXQgeW91ciBNYWtlZmlsZS5hbSwgYWRkaW5nICdNeUludGVyZmFjZS5za2VsJwordG8geW91ciBTT1VSQ0VTIGxpc3QgYW5kIE15SW50ZXJmYWNlLmggdG8gaW5jbHVkZV9IRUFERVJTLgorCitUaGUgYnVpbGQgc2NyaXB0cyB3aWxsIHVzZSBkY29waWRsIHRvIHBhcnNlIE15SW50ZXJmYWNlLmgsIGNvbnZlcnRpbmcKK2l0IHRvIGFuIFhNTCBkZXNjcmlwdGlvbiBpbiBNeUludGVyZmFjZS5raWRsLiBOZXh0LCBhIGZpbGUgY2FsbGVkCitNeUludGVyZmFjZV9za2VsLmNwcCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY3JlYXRlZCwgY29tcGlsZWQgYW5kCitsaW5rZWQgd2l0aCB5b3VyIGJpbmFyeS4KKworVGhlIG5leHQgdGhpbmcgeW91IGhhdmUgdG8gZG8gaXMgdG8gY2hvb3NlIHdoaWNoIG9mIHlvdXIgY2xhc3NlcyB3aWxsCitpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBkZXNjcmliZWQgaW4gTXlJbnRlcmZhY2UuaC4gQWx0ZXIgdGhlIGluaGVyaXRhbmNlCitvZiB0aGlzIGNsYXNzIHN1Y2ggdGhhdCBpdCB2aXJ0dWFsbHkgaW5oZXJpdHMgZnJvbSBNeUludGVyZmFjZS4gVGhlbgorYWRkIGRlY2xhcmF0aW9ucyB0byB5b3VyIGNsYXNzIGludGVyZmFjZSBzaW1pbGFyIHRvIHRob3NlIG9uIE15SW50ZXJmYWNlLmgsCitidXQgdmlydHVhbCwgbm90IHB1cmUgdmlydHVhbC4KKworRXhhbXBsZToKKworY2xhc3MgTXlDbGFzczogcHVibGljIFFPYmplY3QsIHZpcnR1YWwgcHVibGljIE15SW50ZXJmYWNlCit7CisgIFFfT0JKRUNUCisgIAorICBwdWJsaWM6CisgICAgTXlDbGFzcygpOyAKKyAgICB+TXlDbGFzcygpOworCisgICAgQVNZTkMgbXlBc3luY2hyb25vdXNNZXRob2QoUVN0cmluZyBzb21lUGFyYW1ldGVyKTsKKyAgICBRUmVjdCBteVN5bmNocm9ub3VzTWV0aG9kKCk7Cit9OworCitOb3RlOiAoUXQgaXNzdWUpIFJlbWVtYmVyIHRoYXQgaWYgeW91IGFyZSBpbmhlcml0aW5nIGZyb20gUU9iamVjdCwgeW91IG11c3QKK3BsYWNlIGl0IGZpcnN0IGluIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBjbGFzc2VzLgorCitJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgeW91ciBjbGFzcycgY3RvciwgeW91IG11c3QgZXhwbGljaXRseSBpbml0aWFsaXplCit0aG9zZSBjbGFzc2VzIGZyb20gd2hpY2ggeW91IGFyZSBpbmhlcml0aW5nIGZyb20uIFRoaXMgaXMsIG9mIGNvdXJzZSwgZ29vZAorcHJhY3Rpc2UsIGJ1dCBpdCBpcyBlc3NlbnRpYWwgaGVyZSBhcyB5b3UgbmVlZCB0byB0ZWxsIERDT1BPYmplY3QgdGhlIG5hbWUgb2YKK3RoZSBpbnRlcmZhY2Ugd2hpY2ggeW91ciBhcmUgaW1wbGVtZW50aW5nLgorCitFeGFtcGxlOgorCitNeUNsYXNzOjpNeUNsYXNzKCkKKyAgOiBRT2JqZWN0KCksCisgICAgRENPUE9iamVjdCgiTXlJbnRlcmZhY2UiKQoreworICAvLyB3aGF0ZXZlci4uLgorfQorCitOb3cgeW91IGNhbiBzaW1wbHkgaW1wbGVtZW50IHRoZSBtZXRob2RzIHlvdSBoYXZlIGRlY2xhcmVkIGluIHlvdXIgaW50ZXJmYWNlLAorZXhhY3RseSB0aGUgc2FtZSBhcyB5b3Ugd291bGQgbm9ybWFsbHkuCisKK0V4YW1wbGU6CisKK3ZvaWQgTXlDbGFzczo6bXlBc3luY2hyb25vdXNNZXRob2QoUVN0cmluZyBzb21lUGFyYW1ldGVyKQoreworICBxRGVidWcoIm15QXN5bmNNZXRob2QgY2FsbGVkIHdpdGggcGFyYW0gYCIgKyBzb21lUGFyYW1ldGVyICsgIiciKTsKK30KKworCitJdCBpcyBub3QgbmVjZXNzYXJ5ICh0aG91Z2ggdmVyeSBjbGVhbikgdG8gZGVmaW5lIGFuIGludGVyZmFjZSBhcyBhbgorYWJzdHJhY3QgY2xhc3Mgb2YgaXRzIG93biwgbGlrZSB3ZSBkaWQgaW4gdGhlIGV4YW1wbGUgYWJvdmUuIFdlIGNvdWxkCitqdXN0IGFzIHdlbGwgaGF2ZSBkZWZpbmVkIGEga19kY29wIHNlY3Rpb24gZGlyZWN0bHkgd2l0aGluIE15Q2xhc3M6CisKK2NsYXNzIE15Q2xhc3M6IHB1YmxpYyBRT2JqZWN0LCB2aXJ0dWFsIHB1YmxpYyBEQ09QT2JqZWN0Cit7CisgIFFfT0JKRUNUCisgIEtfRENPUAorCisgIHB1YmxpYzoKKyAgICBNeUNsYXNzKCk7IAorICAgIH5NeUNsYXNzKCk7CisKKyAga19kY29wOgorICAgIEFTWU5DIG15QXN5bmNocm9ub3VzTWV0aG9kKFFTdHJpbmcgc29tZVBhcmFtZXRlcik7CisgICAgUVJlY3QgbXlTeW5jaHJvbm91c01ldGhvZCgpOworfTsKKworSW4gYWRkaXRpb24gdG8gc2tlbGV0b25zLCBkY29waWRsMmNwcCBhbHNvIGdlbmVyYXRlIHN0dWJzLiBUaG9zZSBtYWtlCitpdCBlYXN5IHRvIGNhbGwgYSBEQ09QIGludGVyZmFjZSB3aXRob3V0IGRvaW5nIHRoZSBtYXJzaGFsbGluZworbWFudWFsbHkuIFRvIHVzZSBhIHN0dWIsIGFkZCBNeUludGVyZmFjZS5zdHViIHRvIHRoZSBTT1VSQ0VTIGxpc3Qgb2YKK3lvdXIgTWFrZWZpbGUuYW0uIFRoZSBzdHViIGNsYXNzIHdpbGwgdGhlbiBiZSBjYWxsZWQgTXlJbnRlcmZhY2Vfc3R1Yi4KKworQ29uY2x1c2lvbjoKKy0tLS0tLS0tLS0tCisKK0hvcGVmdWxseSB0aGlzIGRvY3VtZW50IHdpbGwgZ2V0IHlvdSB3ZWxsIG9uIHlvdXIgd2F5IGludG8gdGhlIHdvcmxkCitvZiBpbnRlci1wcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBLREUhICBQbGVhc2UgZGlyZWN0IGFsbCBjb21tZW50cworYW5kL29yIHN1Z2dlc3Rpb25zIHRvIFByZXN0b24gQnJvd24gPHBicm93bkBrZGUub3JnPiBhbmQgTWF0dGhpYXMKK0V0dHJpY2ggPGV0dHJpY2hAa2RlLm9yZz4uCisKKworSW50ZXItdXNlciBjb21tdW5pY2F0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZXRpbWVzIGl0IG1pZ2h0IGJlIGludGVyZXN0aW5nIHRvIHVzZSBEQ09QIGJldHdlZW4gcHJvY2Vzc2VzCitiZWxvbmdpbmcgdG8gZGlmZmVyZW50IHVzZXJzLCBlLmcuIGEgZnJvbnRlbmQgcHJvY2VzcyBydW5uaW5nCit3aXRoIHRoZSB1c2VyJ3MgaWQsIGFuZCBhIGJhY2tlbmQgcHJvY2VzcyBydW5uaW5nIGFzIHJvb3QuCisKK1RvIGRvIHRoaXMsIHR3byBzdGVwcyBoYXZlIHRvIGJlIHRha2VuOgorCithKSBib3RoIHByb2Nlc3NlcyBuZWVkIHRvIHRhbGsgdG8gdGhlIHNhbWUgRENPUCBzZXJ2ZXIKK2IpIHRoZSBhdXRoZW50aWNhdGlvbiBtdXN0IGJlIGVuc3VyZWQKKworRm9yIHRoZSBmaXJzdCBzdGVwLCB5b3Ugc2ltcGx5IHBhc3MgdGhlIHNlcnZlciBhZGRyZXNzIChhcworZm91bmQgaW4gLkRDT1BzZXJ2ZXIpIHRvIHRoZSBzZWNvbmQgcHJvY2Vzcy4gRm9yIHRoZSBhdXRoZW50aWNhdGlvbiwKK3lvdSBjYW4gdXNlIHRoZSBJQ0VBVVRIT1JJVFkgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGVsbCB0aGUKK3NlY29uZCBwcm9jZXNzIHdoZXJlIHRvIGZpbmQgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLgorKE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgdGhhdCB0aGUgc2Vjb25kIHByb2Nlc3MgaXMgYWJsZSB0bworcmVhZCB0aGUgYXV0aGVudGljYXRpb24gZmlsZSwgc28gaXQgd2lsbCBwcm9iYWJseSBvbmx5IHdvcmsKK2lmIHRoZSBzZWNvbmQgcHJvY2VzcyBydW5zIGFzIHJvb3QuIElmIGl0IHNob3VsZCBydW4gYXMgYW5vdGhlcgordXNlciwgYSBzaW1pbGFyIGFwcHJvYWNoIHRvIHdoYXQga2Rlc3UgZG9lcyB3aXRoIHhhdXRoIG11c3QKK2JlIHRha2VuLiBJbiBmYWN0LCBpdCB3b3VsZCBiZSBhIHZlcnkgZ29vZCBpZGVhIHRvIGFkZCBEQ09QCitzdXBwb3J0IHRvIGtkZXN1ISkKKworRm9yIGV4YW1wbGUKKworSUNFQVVUSE9SSVRZPX51c2VyLy5JQ0VhdXRob3JpdHkga2Rlc3Ugcm9vdCAtYyBrY21yb290IC1kY29wc2VydmVyIGBjYXQgfnVzZXIvLkRDT1BzZXJ2ZXJgCisKK3dpbGwsIGFmdGVyIGtkZXN1IGdvdCB0aGUgcm9vdCBwYXNzd29yZCwgZXhlY3V0ZSBrY21yb290IGFzIHJvb3QsIHRhbGtpbmcKK3RvIHRoZSB1c2VyJ3MgZGNvcCBzZXJ2ZXIuCisKKworTk9URTogRENPUCBjb21tdW5pY2F0aW9uIGlzIG5vdCBlbmNyeXB0ZWQsIHNvIHBsZWFzZSBkbyBub3QKK3Bhc3MgaW1wb3J0YW50IGluZm9ybWF0aW9uIGFyb3VuZCB0aGlzIHdheS4KKworCitQZXJmb3JtYW5jZSBUZXN0czoKKy0tLS0tLS0tLS0tLS0tLS0tLQorQSBmZXcgYmFjay1vZi10aGUtbmFwa2luIHRlc3RzIGZvbGtzOgorCitDb2RlOgorCisjaW5jbHVkZSA8a2FwcGxpY2F0aW9uLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgS0FwcGxpY2F0aW9uICphcHA7CisKKyAgYXBwID0gbmV3IEtBcHBsaWNhdGlvbihhcmdjLCBhcmd2LCAidGVzdGl0Iik7CisgIHJldHVybiBhcHAtPmV4ZWMoKTsKK30KKworQ29tcGlsZWQgd2l0aDoKKworZysrIC1PMiAtbyB0ZXN0aXQgdGVzdGl0LmNwcCAtSSRRVERJUi9pbmNsdWRlIC1MJFFURElSL2xpYiAtbGtkZWNvcmUKKworb24gTGludXggeWllbGRzIHRoZSBmb2xsb3dpbmcgbWVtb3J5IHVzZSBzdGF0aXN0aWNzOgorCitWbVNpemU6ICAgICA4MDc2IGtCCitWbUxjazogICAgICAgICAwIGtCCitWbVJTUzogICAgICA0NTMyIGtCCitWbURhdGE6ICAgICAgMjA4IGtCCitWbVN0azogICAgICAgIDIwIGtCCitWbUV4ZTogICAgICAgICA0IGtCCitWbUxpYjogICAgICA2NTg4IGtCCisKK0lmIEkgY3JlYXRlIHRoZSBLQXBwbGljYXRpb24ncyBEQ09QQ2xpZW50LCBhbmQgY2FsbCBhdHRhY2goKSBhbmQKK3JlZ2lzdGVyQXMoKSwgaXQgY2hhbmdlcyB0byB0aGlzOgorCitWbVNpemU6ICAgICA4MDgwIGtCCitWbUxjazogICAgICAgICAwIGtCCitWbVJTUzogICAgICA0NjI0IGtCCitWbURhdGE6ICAgICAgMjA4IGtCCitWbVN0azogICAgICAgIDIwIGtCCitWbUV4ZTogICAgICAgICA0IGtCCitWbUxpYjogICAgICA2NTg4IGtCCisKK0Jhc2ljYWxseSBpdCBhcHBlYXJzIHRoYXQgdXNpbmcgRENPUCBjYXVzZXMgMTAwayBtb3JlIG1lbW9yeSB0byBiZQorcmVzaWRlbnQsIGJ1dCBubyBtb3JlIGRhdGEgb3Igc3RhY2suICBTbyB0aGlzIHdpbGwgYmUgc2hhcmVkIGJldHdlZW4gYWxsCitwcm9jZXNzZXMsIHJpZ2h0PyAgMTAwayB0byBlbmFibGUgRENPUCBpbiBhbGwgYXBwcyBkb2Vzbid0IHNlZW0gYmFkIGF0CithbGwuIDopCisKK09LIG5vdyBmb3Igc29tZSB0aW1pbmdzLiAgSnVzdCBjcmVhdGluZyBhIEtBcHBsaWNhdGlvbiBhbmQgdGhlbiBleGl0aW5nCisoaS5lLiByZW1vdmluZyB0aGUgY2FsbCB0byBLQXBwbGljYXRpb246OmV4ZWMpIHRha2VzIHRoaXMgbXVjaCB0aW1lOgorCiswLjI4dXNlciAwLjAyc3lzdGVtIDA6MDAuMzJlbGFwc2VkIDkyJUNQVSAoMGF2Z3RleHQrMGF2Z2RhdGEgMG1heHJlc2lkZW50KWsKKzBpbnB1dHMrMG91dHB1dHMgKDEwODRtYWpvcis2Mm1pbm9yKXBhZ2VmYXVsdHMgMHN3YXBzCisKK0kuZS4gYWJvdXQgMS8zIG9mIGEgc2Vjb25kIG9uIG15IFBJSS0yMzMuICBOb3csIGlmIHdlIGNyZWF0ZSBvdXIgRENPUAorb2JqZWN0IGFuZCBhdHRhY2ggdG8gdGhlIHNlcnZlciwgaXQgdGFrZXMgdGhpcyBsb25nOgorCiswLjI3dXNlciAwLjAzc3lzdGVtIDA6MDAuMzRlbGFwc2VkIDg3JUNQVSAoMGF2Z3RleHQrMGF2Z2RhdGEgMG1heHJlc2lkZW50KWsKKzBpbnB1dHMrMG91dHB1dHMgKDExMDdtYWpvcis2NW1pbm9yKXBhZ2VmYXVsdHMgMHN3YXBzCisKK0kuZS4gYWJvdXQgMS8zIG9mIGEgc2Vjb25kLiAgQmFzaWNhbGx5IERDT1BDbGllbnQgY3JlYXRpb24gYW5kIGF0dGFjaGluZworZ2V0cyBsb3N0IGluIHRoZSBzdGF0aXN0aWNhbCB2YXJpYXRpb24gKCJub2lzZSIpLiAgSSB3YXMgZ2V0dGluZyB0aW1lcworYmV0d2VlbiAuMzIgYW5kIC40OCBvdmVyIHNldmVyYWwgcnVucyBmb3IgYm90aCBvZiB0aGUgZXhhbXBsZSBwcm9ncmFtcywgc28KK29idmlvdXNseSBzeXN0ZW0gbG9hZCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gdGhlIGV4dHJhIHR3byBjYWxscyB0bworRENPUENsaWVudDo6YXR0YWNoIGFuZCBEQ09QQ2xpZW50OjpyZWdpc3RlckFzLCBhcyB3ZWxsIGFzIHRoZSBhY3R1YWwKK0RDT1BDbGllbnQgY29uc3RydWN0b3IgdGltZS4KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RpYWdyYW0ucG5nIGIvZGJ1cy0xLjQuMTAvZG9jL2RpYWdyYW0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjg0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvZGlhZ3JhbS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL2RpYWdyYW0uc3ZnIGIvZGJ1cy0xLjQuMTAvZG9jL2RpYWdyYW0uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5M2M1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvZGlhZ3JhbS5zdmcKQEAgLTAsMCArMSw1OTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIgorImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIj4KKzwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgorPHN2ZworICAgaWQ9InN2ZzEiCisgICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgorICAgaW5rc2NhcGU6dmVyc2lvbj0iMC4zOSIKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKKyAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgorICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCisgICB4bWxuczpjYz0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvIgorICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgorICAgd2lkdGg9Ijg0MS44ODk3NXB0IgorICAgaGVpZ2h0PSI1OTUuMjc1NTlwdCIKKyAgIHNvZGlwb2RpOmRvY2Jhc2U9Ii9ob21lL2hwL2RidXMtY3ZzL2RidXMvZG9jIgorICAgc29kaXBvZGk6ZG9jbmFtZT0iZGlhZ3JhbS5zdmciPgorICA8ZGVmcworICAgICBpZD0iZGVmczMiPgorICAgIDxtYXJrZXIKKyAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiCisgICAgICAgaWQ9IkFycm93MU0iCisgICAgICAgcmVmWD0iMC4wIgorICAgICAgIHJlZlk9IjAuMCIKKyAgICAgICBvcmllbnQ9ImF1dG8iCisgICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iQXJyb3cxTSI+CisgICAgICA8cGF0aAorICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjQpIgorICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjBwdDttYXJrZXItc3RhcnQ6bm9uZTsiCisgICAgICAgICBkPSJNIDAuMCwwLjAgTCA1LjAsLTUuMCBMIC0xMi41LDAuMCBMIDUuMCw1LjAgTCAwLjAsMC4wIHogIgorICAgICAgICAgaWQ9InBhdGgzNTE5IgorICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KKyAgICA8L21hcmtlcj4KKyAgICA8bWFya2VyCisgICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGU7IgorICAgICAgIGlkPSJBcnJvdzJMIgorICAgICAgIHJlZlg9IjAuMCIKKyAgICAgICByZWZZPSIwLjAiCisgICAgICAgb3JpZW50PSJhdXRvIgorICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IkFycm93MkwiPgorICAgICAgPHBhdGgKKyAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMS4xKSB0cmFuc2xhdGUoLTUsMCkiCisgICAgICAgICBkPSJNIDguNzE4NTg3OCw0LjAzMzczNTIgTCAtMi4yMDcyODk1LDAuMDE2MDEzMjU2IEwgOC43MTg1ODg0LC00LjAwMTcwNzggQyA2Ljk3MzA5MDAsLTEuNjI5NjQ2OSA2Ljk4MzE0NzYsMS42MTU3NDQxIDguNzE4NTg3OCw0LjAzMzczNTIgeiAiCisgICAgICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjAuNjI1MDAwMDA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kOyIKKyAgICAgICAgIGlkPSJwYXRoMzUxNSIKKyAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIgLz4KKyAgICA8L21hcmtlcj4KKyAgPC9kZWZzPgorICA8c29kaXBvZGk6bmFtZWR2aWV3CisgICAgIGlkPSJiYXNlIgorICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCisgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgorICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCisgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCisgICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCisgICAgIGlua3NjYXBlOnpvb209IjAuOTAyMTAzMTgiCisgICAgIGlua3NjYXBlOmN4PSI0MjAuOTQ0ODciCisgICAgIGlua3NjYXBlOmN5PSIyOTcuNjM3NzkiCisgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAyNCIKKyAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzAxIgorICAgICBzaG93Z3JpZD0iZmFsc2UiCisgICAgIGlua3NjYXBlOmdyaWQtYmJveD0iZmFsc2UiCisgICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgorICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI0IgorICAgICBncmlkc3BhY2luZ3k9IjIuNTAwMDAwMG1tIgorICAgICBncmlkc3BhY2luZ3g9IjIuNTAwMDAwMG1tIgorICAgICBzaG93Z3VpZGVzPSJ0cnVlIgorICAgICBpbmtzY2FwZTpndWlkZS1iYm94PSJ0cnVlIj4KKyAgICA8c29kaXBvZGk6Z3VpZGUKKyAgICAgICBvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICBwb3NpdGlvbj0iMjY4Ljg1Nzk3IgorICAgICAgIGlkPSJndWlkZTM1NjYiIC8+CisgICAgPHNvZGlwb2RpOmd1aWRlCisgICAgICAgb3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgcG9zaXRpb249IjI5NC4zMTIyMyIKKyAgICAgICBpZD0iZ3VpZGU0MjM1IiAvPgorICAgIDxzb2RpcG9kaTpndWlkZQorICAgICAgIG9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgIHBvc2l0aW9uPSIzMDAuNDA5MDkiCisgICAgICAgaWQ9Imd1aWRlNDg4MiIgLz4KKyAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CisgIDxtZXRhZGF0YQorICAgICBpZD0ibWV0YWRhdGE0Ij4KKyAgICA8cmRmOlJERgorICAgICAgIGlkPSJSREY1Ij4KKyAgICAgIDxjYzpXb3JrCisgICAgICAgICByZGY6YWJvdXQ9IiIKKyAgICAgICAgIGlkPSJXb3JrNiI+CisgICAgICAgIDxkYzpmb3JtYXQKKyAgICAgICAgICAgaWQ9ImZvcm1hdDciPmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KKyAgICAgICAgPGRjOnR5cGUKKyAgICAgICAgICAgaWQ9InR5cGU5IgorICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgorICAgICAgPC9jYzpXb3JrPgorICAgIDwvcmRmOlJERj4KKyAgPC9tZXRhZGF0YT4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6My43NTAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDkwOCIKKyAgICAgd2lkdGg9IjMyNS4yMzIwMyIKKyAgICAgaGVpZ2h0PSIzNTQuMzMwNzIiCisgICAgIHg9IjE3LjcxNjUzNiIKKyAgICAgeT0iMzcyLjA0NzI0IiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE4LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNzAuNzc4MjUyIgorICAgICB5PSI3MTIuNzM5MjAiCisgICAgIGlkPSJ0ZXh0MTUzMiIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjE1MzMiPkFwcGxpY2F0aW9uIFByb2Nlc3MgMTwvdHNwYW4+PC90ZXh0PgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjUwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi41MDAwMDAwIDIuNTAwMDAwMCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0MTUzNSIKKyAgICAgd2lkdGg9IjE0OC40NjI1OSIKKyAgICAgaGVpZ2h0PSI0Ni42NTY4NDkiCisgICAgIHg9IjEwNi4yOTkyMSIKKyAgICAgeT0iMzc4LjU0MDAxIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMTgwLjYxMzg5IgorICAgICB5PSI0MDAuNDAwNDgiCisgICAgIGlkPSJ0ZXh0MjE1OCIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjIxNTkiPkRCdXNDb25uZWN0aW9uPC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjIxNjEiCisgICAgICAgeD0iMTgwLjYxMzg5IgorICAgICAgIHk9IjQxNC40MDA0OCI+SW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi45OTUwOTI5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuOTk1MDkyOCAyLjk5NTA5MjggO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDIxNzAiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iNjYuOTY2MjQwIgorICAgICB4PSIyOC43MDI3NjgiCisgICAgIHk9IjU0OS4yMTI1OSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjEwMy4wMTc0NSIKKyAgICAgeT0iNTc3LjU2NTg2IgorICAgICBpZD0idGV4dDIxNzEiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIxMDMuMDE3NDUiCisgICAgICAgeT0iNTc3LjU2NTg2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMjE3NiI+Qy9DKysvUHl0aG9uL2V0Yy48L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjEwMy4wMTc0NSIKKyAgICAgICB5PSI1OTEuNTY1ODYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4yMTc4Ij5PYmplY3QgSW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1MzUiCisgICAgIGQ9Ik0gOTguOTM4OTUyLDQwOC42MTQ3OSBDIDk4Ljc0NDc1Myw0MDkuMjAzMDMgOTcuOTE3ODg2LDQwOS42NzI5NSA5Ny40NDA5NDUsNDEwLjExNDM1IEMgOTUuNTM0OTQ3LDQxMS45NDc2MyA5NC4yNjY5MzQsNDE0LjExNTU1IDkzLjE3MjYxNCw0MTYuMzM4NTggQyA5MS45MDIwNTYsNDE5LjAyNzI1IDkwLjk2OTI4MSw0MjEuNzk5NDQgOTAuMTA3MjUyLDQyNC41OTIyOSBDIDg5LjU4OTEwNSw0MjYuMjczNzQgODguOTgzNTM0LDQyNy45MDYzNCA4OC4yNjY5MDcsNDI5LjUzNzAwIEMgODcuOTE5NjY3LDQzMC4zMzQzOCA4Ny42MjI1OTMsNDMxLjE3NTk4IDg3LjEyMDQ2NCw0MzEuOTE5NzAgQyA4Ni44MzIyMjIsNDMyLjMwNjY1IDg2LjQ2OTQyMiw0MzIuNjUxNDUgODYuMTY3OTg1LDQzMy4wMzE4NCBDIDg2LjAxNTkzMSw0MzMuMjIyNTQgODUuODY4OTk3LDQzMy40MTU2MyA4NS43MjIxMzEsNDMzLjYwODk4IEwgODIuOTE0MzM2LDQzMy4xMTc0MyBDIDgzLjA2MzQwMiw0MzIuOTE4NzkgODMuMjEzNDI4LDQzMi43MjA2OSA4My4zNjgxMjEsNDMyLjUyNDk4IEMgODMuNjU0NjgxLDQzMi4xNTMwOCA4My45ODA3MzcsNDMxLjgwODM0IDg0LjI4NTM4OSw0MzEuNDQ3MzEgQyA4NC44MTE5NTcsNDMwLjc3MTc1IDg1LjEyMjUyMyw0MjkuOTc5MTQgODUuNDgyNDAwLDQyOS4yMzg3MiBDIDg2LjI1MzA1Niw0MjcuNjQ5MjkgODYuOTAzMDg0LDQyNi4wMzg2MSA4Ny40NzQ1NzgsNDI0LjM5MzIxIEMgODguNDM5NTQ4LDQyMS41ODU1MiA4OS40NDI4NDMsNDE4Ljc4NzkyIDkwLjcwMzkzOCw0MTYuMDU4OTggQyA5MS44MTA5NjYsNDEzLjc3NTI1IDkyLjk5OTE5MSw0MTEuNDU5NjEgOTQuODQ5NDY0LDQwOS41MDc0OCBDIDk1LjA5NDcwNCw0MDkuMjQ4NzYgOTYuMDkxNzg5LDQwNy45MDE0OSA5NS44NjU3MzcsNDA4LjYxNDc5IEwgOTguOTM4OTUyLDQwOC42MTQ3OSB6ICIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczsiCisgICAgIHg9IjM0LjEwOTQ5NyIKKyAgICAgeT0iNDQ2LjEzMzgyIgorICAgICBpZD0idGV4dDM1MzYiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjM1MzciPkxvY2F0ZSBPYmplY3Q8L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzUzOSIKKyAgICAgICB4PSIzNC4xMDk0OTciCisgICAgICAgeT0iNDU4LjEzMzgyIj52aWEgT2JqZWN0IFBhdGg8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1NDEiCisgICAgIGQ9Ik0gNjAuNTA5ODY3LDQ2Mi43ODc2NyBDIDYwLjcwNDA2Niw0NjMuMzc1OTEgNjEuNTMwOTMzLDQ2My44NDU4MyA2Mi4wMDc4NzQsNDY0LjI4NzIzIEMgNjMuOTEzODcyLDQ2Ni4xMjA1MSA2NS4xODE4ODUsNDY4LjI4ODQzIDY2LjI3NjIwNSw0NzAuNTExNDYgQyA2Ny41NDY3NjMsNDczLjIwMDEzIDY4LjQ3OTUzOCw0NzUuOTcyMzIgNjkuMzQxNTY3LDQ3OC43NjUxNyBDIDY5Ljg1OTcxNCw0ODAuNDQ2NjIgNzAuNDY1Mjg1LDQ4Mi4wNzkyMiA3MS4xODE5MTIsNDgzLjcwOTg4IEMgNzEuNTI5MTUyLDQ4NC41MDcyNiA3MS44MjYyMjYsNDg1LjM0ODg2IDcyLjMyODM1NSw0ODYuMDkyNTggQyA3Mi42MTY1OTcsNDg2LjQ3OTUzIDcyLjk3OTM5Nyw0ODYuODI0MzMgNzMuMjgwODM0LDQ4Ny4yMDQ3MiBDIDczLjQzMjg4OCw0ODcuMzk1NDIgNzMuNTc5ODIyLDQ4Ny41ODg1MSA3My43MjY2ODgsNDg3Ljc4MTg2IEwgNzYuNTM0NDgzLDQ4Ny4yOTAzMSBDIDc2LjM4NTQxNyw0ODcuMDkxNjcgNzYuMjM1MzkxLDQ4Ni44OTM1NyA3Ni4wODA2OTgsNDg2LjY5Nzg2IEMgNzUuNzk0MTM4LDQ4Ni4zMjU5NiA3NS40NjgwODIsNDg1Ljk4MTIyIDc1LjE2MzQzMCw0ODUuNjIwMTkgQyA3NC42MzY4NjIsNDg0Ljk0NDYzIDc0LjMyNjI5Niw0ODQuMTUyMDIgNzMuOTY2NDE5LDQ4My40MTE2MCBDIDczLjE5NTc2Myw0ODEuODIyMTcgNzIuNTQ1NzM1LDQ4MC4yMTE0OSA3MS45NzQyNDEsNDc4LjU2NjA5IEMgNzEuMDA5MjcxLDQ3NS43NTg0MCA3MC4wMDU5NzYsNDcyLjk2MDgwIDY4Ljc0NDg4MSw0NzAuMjMxODYgQyA2Ny42Mzc4NTMsNDY3Ljk0ODEzIDY2LjQ0OTYyOCw0NjUuNjMyNDkgNjQuNTk5MzU1LDQ2My42ODAzNiBDIDY0LjM1NDExNSw0NjMuNDIxNjQgNjMuMzU3MDMwLDQ2Mi4wNzQzNyA2My41ODMwODIsNDYyLjc4NzY3IEwgNjAuNTA5ODY3LDQ2Mi43ODc2NyB6ICIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNDkuMTAwMzE1IgorICAgICB5PSI1MDEuNjA5NTkiCisgICAgIGlkPSJ0ZXh0MzU0MiIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjQ5LjEwMDMxNSIKKyAgICAgICB5PSI1MDEuNjA5NTkiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTQ3Ij5CaW5kaW5ncyBNYXJzaGFsPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0OS4xMDAzMTUiCisgICAgICAgeT0iNTEzLjYwOTU5IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU0OSI+dG8gTWV0aG9kIENhbGw8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1NTEiCisgICAgIGQ9Ik0gOTUuMjk1MjM5LDUxOS40MzIxMSBDIDk1LjEwMTAzOSw1MjAuMDIwMzUgOTQuMjc0MTY5LDUyMC40OTAyNyA5My43OTcyMjksNTIwLjkzMTY3IEMgOTEuODkxMjM5LDUyMi43NjQ5NSA5MC42MjMyMTksNTI0LjkzMjg3IDg5LjUyODg5OSw1MjcuMTU1OTAgQyA4OC4yNTgzMzksNTI5Ljg0NDU3IDg3LjMyNTU2OSw1MzIuNjE2NzYgODYuNDYzNTM5LDUzNS40MDk2MSBDIDg1Ljk0NTM4OSw1MzcuMDkxMDYgODUuMzM5ODE5LDUzOC43MjM2NiA4NC42MjMxOTksNTQwLjM1NDMyIEMgODQuMjc1OTU5LDU0MS4xNTE3MCA4My45Nzg4NzksNTQxLjk5MzMwIDgzLjQ3Njc0OSw1NDIuNzM3MDIgQyA4My4xODg1MDksNTQzLjEyMzk3IDgyLjgyNTcwOSw1NDMuNDY4NzcgODIuNTI0MjY5LDU0My44NDkxNiBDIDgyLjM3MjIxOSw1NDQuMDM5ODYgODIuMjI1Mjg5LDU0NC4yMzI5NSA4Mi4wNzg0MTksNTQ0LjQyNjMwIEwgNzkuMjcwNjE5LDU0My45MzQ3NSBDIDc5LjQxOTY4OSw1NDMuNzM2MTEgNzkuNTY5NzE5LDU0My41MzgwMSA3OS43MjQ0MDksNTQzLjM0MjMwIEMgODAuMDEwOTY5LDU0Mi45NzA0MCA4MC4zMzcwMjksNTQyLjYyNTY2IDgwLjY0MTY3OSw1NDIuMjY0NjMgQyA4MS4xNjgyNDksNTQxLjU4OTA3IDgxLjQ3ODgwOSw1NDAuNzk2NDYgODEuODM4Njg5LDU0MC4wNTYwNCBDIDgyLjYwOTMzOSw1MzguNDY2NjEgODMuMjU5MzY5LDUzNi44NTU5MyA4My44MzA4NjksNTM1LjIxMDUzIEMgODQuNzk1ODM5LDUzMi40MDI4NCA4NS43OTkxMjksNTI5LjYwNTI0IDg3LjA2MDIyOSw1MjYuODc2MzAgQyA4OC4xNjcyNDksNTI0LjU5MjU3IDg5LjM1NTQ3OSw1MjIuMjc2OTMgOTEuMjA1NzQ5LDUyMC4zMjQ4MCBDIDkxLjQ1MDk4OSw1MjAuMDY2MDggOTIuNDQ4MDc5LDUxOC43MTg4MSA5Mi4yMjIwMjksNTE5LjQzMjExIEwgOTUuMjk1MjM5LDUxOS40MzIxMSB6ICIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1NTIiCisgICAgIGQ9Ik0gMjYxLjgzNTMzLDQwOC42MTQ3OSBDIDI2Mi4wMjk1Myw0MDkuMjAzMDMgMjYyLjg1NjQwLDQwOS42NzI5NSAyNjMuMzMzMzQsNDEwLjExNDM1IEMgMjY1LjIzOTM0LDQxMS45NDc2MyAyNjYuNTA3MzUsNDE0LjExNTU1IDI2Ny42MDE2Nyw0MTYuMzM4NTggQyAyNjguODcyMjMsNDE5LjAyNzI1IDI2OS44MDUwMSw0MjEuNzk5NDQgMjcwLjY2NzAzLDQyNC41OTIyOSBDIDI3MS4xODUxOCw0MjYuMjczNzQgMjcxLjc5MDc1LDQyNy45MDYzNCAyNzIuNTA3MzgsNDI5LjUzNzAwIEMgMjcyLjg1NDYyLDQzMC4zMzQzOCAyNzMuMTUxNjksNDMxLjE3NTk4IDI3My42NTM4Miw0MzEuOTE5NzAgQyAyNzMuOTQyMDYsNDMyLjMwNjY1IDI3NC4zMDQ4Niw0MzIuNjUxNDUgMjc0LjYwNjMwLDQzMy4wMzE4NCBDIDI3NC43NTgzNiw0MzMuMjIyNTQgMjc0LjkwNTI5LDQzMy40MTU2MyAyNzUuMDUyMTYsNDMzLjYwODk4IEwgMjc3Ljg1OTk1LDQzMy4xMTc0MyBDIDI3Ny43MTA4OCw0MzIuOTE4NzkgMjc3LjU2MDg2LDQzMi43MjA2OSAyNzcuNDA2MTcsNDMyLjUyNDk4IEMgMjc3LjExOTYxLDQzMi4xNTMwOCAyNzYuNzkzNTUsNDMxLjgwODM0IDI3Ni40ODg5MCw0MzEuNDQ3MzEgQyAyNzUuOTYyMzMsNDMwLjc3MTc1IDI3NS42NTE3Niw0MjkuOTc5MTQgMjc1LjI5MTg5LDQyOS4yMzg3MiBDIDI3NC41MjEyMyw0MjcuNjQ5MjkgMjczLjg3MTIwLDQyNi4wMzg2MSAyNzMuMjk5NzEsNDI0LjM5MzIxIEMgMjcyLjMzNDc0LDQyMS41ODU1MiAyNzEuMzMxNDQsNDE4Ljc4NzkyIDI3MC4wNzAzNSw0MTYuMDU4OTggQyAyNjguOTYzMzIsNDEzLjc3NTI1IDI2Ny43NzUxMCw0MTEuNDU5NjEgMjY1LjkyNDgyLDQwOS41MDc0OCBDIDI2NS42Nzk1OCw0MDkuMjQ4NzYgMjY0LjY4MjUwLDQwNy45MDE0OSAyNjQuOTA4NTUsNDA4LjYxNDc5IEwgMjYxLjgzNTMzLDQwOC42MTQ3OSB6ICIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMjIzLjk4NzQ5IgorICAgICB5PSI0NDYuMTMzODIiCisgICAgIGlkPSJ0ZXh0MzU1MyIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjIyMy45ODc0OSIKKyAgICAgICB5PSI0NDYuMTMzODIiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTYyIj5NYXJzaGFsIE1ldGhvZDwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iMjIzLjk4NzQ5IgorICAgICAgIHk9IjQ1OC4xMzM4MiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1NjQiPkNhbGwgdG8gTWVzc2FnZTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJwYXRoMzU2NyIKKyAgICAgZD0iTSAyNzguOTY0ODUsNDYzLjI5NDUzIEMgMjc4Ljc3MDY1LDQ2My44ODI3NyAyNzcuOTQzNzgsNDY0LjM1MjY5IDI3Ny40NjY4NCw0NjQuNzk0MDkgQyAyNzUuNTYwODUsNDY2LjYyNzM3IDI3NC4yOTI4Myw0NjguNzk1MjkgMjczLjE5ODUxLDQ3MS4wMTgzMiBDIDI3MS45Mjc5NSw0NzMuNzA2OTkgMjcwLjk5NTE4LDQ3Ni40NzkxOCAyNzAuMTMzMTUsNDc5LjI3MjAzIEMgMjY5LjYxNTAwLDQ4MC45NTM0OCAyNjkuMDA5NDMsNDgyLjU4NjA4IDI2OC4yOTI4MSw0ODQuMjE2NzQgQyAyNjcuOTQ1NTcsNDg1LjAxNDEyIDI2Ny42NDg0OSw0ODUuODU1NzIgMjY3LjE0NjM2LDQ4Ni41OTk0NCBDIDI2Ni44NTgxMiw0ODYuOTg2MzkgMjY2LjQ5NTMyLDQ4Ny4zMzExOSAyNjYuMTkzODgsNDg3LjcxMTU4IEMgMjY2LjA0MTgzLDQ4Ny45MDIyOCAyNjUuODk0OTAsNDg4LjA5NTM3IDI2NS43NDgwMyw0ODguMjg4NzIgTCAyNjIuOTQwMjMsNDg3Ljc5NzE3IEMgMjYzLjA4OTMwLDQ4Ny41OTg1MyAyNjMuMjM5MzMsNDg3LjQwMDQzIDI2My4zOTQwMiw0ODcuMjA0NzIgQyAyNjMuNjgwNTgsNDg2LjgzMjgyIDI2NC4wMDY2NCw0ODYuNDg4MDggMjY0LjMxMTI5LDQ4Ni4xMjcwNSBDIDI2NC44Mzc4Niw0ODUuNDUxNDkgMjY1LjE0ODQyLDQ4NC42NTg4OCAyNjUuNTA4MzAsNDgzLjkxODQ2IEMgMjY2LjI3ODk1LDQ4Mi4zMjkwMyAyNjYuOTI4OTgsNDgwLjcxODM1IDI2Ny41MDA0OCw0NzkuMDcyOTUgQyAyNjguNDY1NDUsNDc2LjI2NTI2IDI2OS40Njg3NCw0NzMuNDY3NjYgMjcwLjcyOTg0LDQ3MC43Mzg3MiBDIDI3MS44MzY4Niw0NjguNDU0OTkgMjczLjAyNTA5LDQ2Ni4xMzkzNSAyNzQuODc1MzYsNDY0LjE4NzIyIEMgMjc1LjEyMDYwLDQ2My45Mjg1MCAyNzYuMTE3NjksNDYyLjU4MTIzIDI3NS44OTE2NCw0NjMuMjk0NTMgTCAyNzguOTY0ODUsNDYzLjI5NDUzIHogIiAvPgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjczNzcwODY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi43Mzc3MDg0IDIuNzM3NzA4NCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0MzU2OCIKKyAgICAgd2lkdGg9IjEyNC4wMTc0NiIKKyAgICAgaGVpZ2h0PSI2Ni45Nzk4MTMiCisgICAgIHg9IjE4OS43OTI2NSIKKyAgICAgeT0iNDk1LjA4OTAyIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMjQ4Ljk0MDQ5IgorICAgICB5PSI1MjMuNDQyMjAiCisgICAgIGlkPSJ0ZXh0MzU2OSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjI0OC45NDA0OSIKKyAgICAgICB5PSI1MjMuNDQyMjAiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTc0Ij5CaW5kaW5ncyBQcm94eTwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iMjQ4Ljk0MDQ5IgorICAgICAgIHk9IjUzNy40NDIyMCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1NzYiPk9iamVjdCBJbnN0YW5jZTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJwYXRoMzU3OCIKKyAgICAgZD0iTSAyNTkuMDM1NDcsNTY2LjkyOTEzIEMgMjU5LjIyOTY3LDU2Ny41MTczNyAyNjAuMDU2NTMsNTY3Ljk4NzI5IDI2MC41MzM0OCw1NjguNDI4NjkgQyAyNjIuNDM5NDcsNTcwLjI2MTk3IDI2My43MDc0OSw1NzIuNDI5ODkgMjY0LjgwMTgxLDU3NC42NTI5MiBDIDI2Ni4wNzIzNiw1NzcuMzQxNTkgMjY3LjAwNTE0LDU4MC4xMTM3OCAyNjcuODY3MTcsNTgyLjkwNjYzIEMgMjY4LjM4NTMyLDU4NC41ODgwOCAyNjguOTkwODksNTg2LjIyMDY4IDI2OS43MDc1MSw1ODcuODUxMzQgQyAyNzAuMDU0NzUsNTg4LjY0ODcyIDI3MC4zNTE4Myw1ODkuNDkwMzIgMjcwLjg1Mzk2LDU5MC4yMzQwNCBDIDI3MS4xNDIyMCw1OTAuNjIwOTkgMjcxLjUwNTAwLDU5MC45NjU3OSAyNzEuODA2NDQsNTkxLjM0NjE4IEMgMjcxLjk1ODQ5LDU5MS41MzY4OCAyNzIuMTA1NDIsNTkxLjcyOTk3IDI3Mi4yNTIyOSw1OTEuOTIzMzIgTCAyNzUuMDYwMDgsNTkxLjQzMTc3IEMgMjc0LjkxMTAyLDU5MS4yMzMxMyAyNzQuNzYwOTksNTkxLjAzNTAzIDI3NC42MDYzMCw1OTAuODM5MzIgQyAyNzQuMzE5NzQsNTkwLjQ2NzQyIDI3My45OTM2OCw1OTAuMTIyNjggMjczLjY4OTAzLDU4OS43NjE2NSBDIDI3My4xNjI0Niw1ODkuMDg2MDkgMjcyLjg1MTkwLDU4OC4yOTM0OCAyNzIuNDkyMDIsNTg3LjU1MzA2IEMgMjcxLjcyMTM2LDU4NS45NjM2MyAyNzEuMDcxMzQsNTg0LjM1Mjk1IDI3MC40OTk4NCw1ODIuNzA3NTUgQyAyNjkuNTM0ODcsNTc5Ljg5OTg2IDI2OC41MzE1OCw1NzcuMTAyMjYgMjY3LjI3MDQ4LDU3NC4zNzMzMiBDIDI2Ni4xNjM0NSw1NzIuMDg5NTkgMjY0Ljk3NTIzLDU2OS43NzM5NSAyNjMuMTI0OTYsNTY3LjgyMTgyIEMgMjYyLjg3OTcyLDU2Ny41NjMxMCAyNjEuODgyNjMsNTY2LjIxNTgzIDI2Mi4xMDg2OCw1NjYuOTI5MTMgTCAyNTkuMDM1NDcsNTY2LjkyOTEzIHogIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIyMTcuNDA3NDEiCisgICAgIHk9IjYwNy45MDg4MSIKKyAgICAgaWQ9InRleHQzNTc5IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMjE3LjQwNzQxIgorICAgICAgIHk9IjYwNy45MDg4MSIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1ODQiPkFwcGxpY2F0aW9uIENvZGU8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC45NjE3MjAyOHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDI2LjU3NDgwMyw0MDguNjAwMDkgQyAyNi41NzQ4MDMsNTM5LjY4OTEyIDI2LjU3NDgwMyw1MzkuNjg5MTEgMjYuNTc0ODAzLDUzMS40OTYwNiIKKyAgICAgaWQ9InBhdGgzNTg2IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMjUuOTc3MTQ2IgorICAgICB5PSIzODYuNDUyMTIiCisgICAgIGlkPSJ0ZXh0NDIyMCIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjQyMjEiPkluY29taW5nPC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQyMjMiCisgICAgICAgeD0iMjUuOTc3MTQ2IgorICAgICAgIHk9IjM5OC40NTIxMiI+Q2FsbDwvdHNwYW4+PC90ZXh0PgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6ZW5kO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjMzNS42MTQxMSIKKyAgICAgeT0iMzg2LjQ1MjEyIgorICAgICBpZD0idGV4dDQyMjYiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIzMzUuNjE0MTEiCisgICAgICAgeT0iMzg2LjQ1MjEyIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDIzMSI+T3V0Z29pbmc8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjMzNS42MTQxMSIKKyAgICAgICB5PSIzOTguNDUyMTIiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40MjMzIj5DYWxsPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTYxNzIwMjhwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLXN0YXJ0OnVybCgjQXJyb3cxTSk7bWFya2VyLWVuZDpub25lOyIKKyAgICAgZD0iTSAzMjcuNzU1OTEsNDE2LjMzODU4IEMgMzI3Ljc1NTkxLDU0Ny40Mjc2MSAzMjcuNzU1OTEsNTQ3LjQyNzYwIDMyNy43NTU5MSw1MzkuMjM0NTUiCisgICAgIGlkPSJwYXRoNDIzNiIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6NS43OTE0MzEwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDQ4NzAiCisgICAgIHdpZHRoPSI4ODUuODY1OTEiCisgICAgIGhlaWdodD0iMzEwLjI3MjUyIgorICAgICB4PSI4OC41ODI2ODAiCisgICAgIHk9IjguODU4MjYyMSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxOC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI1MTUuNDI3MzciCisgICAgIHk9IjMwNS40NDQ4OSIKKyAgICAgaWQ9InRleHQ0ODcxIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iNTE1LjQyNzM3IgorICAgICAgIHk9IjMwNS40NDQ4OSIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ4NzQiPkJ1cyBEYWVtb24gUHJvY2VzczwvdHNwYW4+PC90ZXh0PgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjc1MDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NDg3NiIKKyAgICAgd2lkdGg9IjMyNS4yMzIwMyIKKyAgICAgaGVpZ2h0PSIzNTQuMzMwNzIiCisgICAgIHg9IjcwOC42NjE0NCIKKyAgICAgeT0iMzczLjA4MzU5IiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE4LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNzYxLjcyMzE0IgorICAgICB5PSI3MTMuNzc1NTEiCisgICAgIGlkPSJ0ZXh0NDg3NyIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9Ijc2MS43MjMxNCIKKyAgICAgICB5PSI3MTMuNzc1NTEiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40ODgwIj5BcHBsaWNhdGlvbiBQcm9jZXNzIDI8L3RzcGFuPjwvdGV4dD4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iODIzLjQ5NjY0IgorICAgICB5PSI1MDUuMTgwMTgiCisgICAgIGlkPSJ0ZXh0NDg4MyIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjgyMy40OTY2NCIKKyAgICAgICB5PSI1MDUuMTgwMTgiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40ODg4Ij5TYW1lIFN0dWZmIGFzIGluPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI4MjMuNDk2NjQiCisgICAgICAgeT0iNTE3LjE4MDE4IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDg5MCI+UHJvY2VzcyAxPC90c3Bhbj48L3RleHQ+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjQ3Ljg5MTA3MSIKKyAgICAgeT0iNjM4LjA1NDIwIgorICAgICBpZD0idGV4dDQ4OTIiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI0Ny44OTEwNzEiCisgICAgICAgeT0iNjM4LjA1NDIwIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDkwMSI+KE9iamVjdCBJbnN0YW5jZSBIYXM8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQ3Ljg5MTA3MSIKKyAgICAgICB5PSI2NTAuMDU0MjAiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40OTAzIj4xIG9yIE1vcmUgSW50ZXJmYWNlcyk8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4yNTAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLXN0YXJ0OnVybCgjQXJyb3cxTSk7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTsiCisgICAgIGQ9Ik0gMTYyLjU3MjYwLDM1OC4wMjA0MSBDIDE2NS4yNTIxMywzNTQuNjA1MTYgMTg2LjAxODU4LDMyOC4xMzY4OCAxODQuMDA4OTMsMzMwLjY5ODMyIgorICAgICBpZD0icGF0aDQ5MDUiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7IgorICAgICB4PSIxOTAuNTcxNzAiCisgICAgIHk9IjM0Mi42MjAxOCIKKyAgICAgaWQ9InRleHQ1NTM5Ij48dHNwYW4KKyAgICAgICBpZD0idHNwYW41NTQwIj5Tb2NrZXQ8L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNTU0NCIKKyAgICAgICB4PSIxOTAuNTcxNzAiCisgICAgICAgeT0iMzU0LjYyMDE4Ij4oQmlkaXJlY3Rpb25hbCBNZXNzYWdlIFN0cmVhbSk8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4yNTAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLXN0YXJ0OnVybCgjQXJyb3cxTSk7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA4MjcuNTM4NzYsMzYzLjE4ODk3IEMgODI0Ljg1OTE2LDM1OS43NzM3MiA4MDQuMDkyNzYsMzMzLjMwNTQ0IDgwNi4xMDIzNiwzMzUuODY2ODgiCisgICAgIGlkPSJwYXRoNTU0NiIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczsiCisgICAgIHg9Ijg0MC43OTE1MCIKKyAgICAgeT0iMzQ1LjczMTM1IgorICAgICBpZD0idGV4dDU1NDciPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjU1NDgiPlNvY2tldDwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW41NTUwIgorICAgICAgIHg9Ijg0MC43OTE1MCIKKyAgICAgICB5PSIzNTcuNzMxMzUiPihCaWRpcmVjdGlvbmFsIE1lc3NhZ2UgU3RyZWFtKTwvdHNwYW4+PC90ZXh0PgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjUwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi41MDAwMDAwIDIuNTAwMDAwMCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NTU1MiIKKyAgICAgd2lkdGg9IjE0OC40NjI1OSIKKyAgICAgaGVpZ2h0PSI0Ni42NTY4NDkiCisgICAgIHg9IjEyNC4wMTU3NSIKKyAgICAgeT0iMjYzLjM4MjUxIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMTk4LjMzMDQzIgorICAgICB5PSIyODUuMjQyOTgiCisgICAgIGlkPSJ0ZXh0NTU1MyIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjU1NTQiPkRCdXNDb25uZWN0aW9uPC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjU1NTYiCisgICAgICAgeD0iMTk4LjMzMDQzIgorICAgICAgIHk9IjI5OS4yNDI5OCI+SW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi41MDAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNTAwMDAwMCAyLjUwMDAwMDAgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDU1NTgiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iNDYuNjU2ODQ5IgorICAgICB4PSI3MTkuNjQ3NjQiCisgICAgIHk9IjI2My4zODI1MSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9Ijc5My45NjIzNCIKKyAgICAgeT0iMjg1LjI0Mjk4IgorICAgICBpZD0idGV4dDU1NTkiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW41NTYwIj5EQnVzQ29ubmVjdGlvbjwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW41NTYyIgorICAgICAgIHg9Ijc5My45NjIzNCIKKyAgICAgICB5PSIyOTkuMjQyOTgiPkluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNTAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjUwMDAwMDAgMi41MDAwMDAwIDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q1NTY0IgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjQ2LjY1Njg0OSIKKyAgICAgeD0iNzYzLjc3MjIyIgorICAgICB5PSIzNzguNTQwMDEiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI4MzguMDg2OTEiCisgICAgIHk9IjQwMC40MDA0OCIKKyAgICAgaWQ9InRleHQ1NTY1IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNTU2NiI+REJ1c0Nvbm5lY3Rpb248L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNTU2OCIKKyAgICAgICB4PSI4MzguMDg2OTEiCisgICAgICAgeT0iNDE0LjQwMDQ4Ij5JbnN0YW5jZTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSAxODYuMDIzNjIsMjQ4LjAzMTQ5IEMgMTA2LjI5OTIxLDI2LjU3NDc5NyAzNzIuMDQ3MjQsMjYuNTc0Nzk3IDM3Mi4wNDcyNCwyNi41NzQ3OTciCisgICAgIGlkPSJwYXRoNTU3MSIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4xODU0OTYxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuMTg1NDk2MCAyLjE4NTQ5NjAgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDYyMDUiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iMzUuNjU2MjI3IgorICAgICB4PSIzOTEuODkxNzUiCisgICAgIHk9IjE3LjQ5MzM3NCIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjQ2Ni4yMDY0MiIKKyAgICAgeT0iMzkuNTc3MDAzIgorICAgICBpZD0idGV4dDYyMDYiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI0NjYuMjA2NDIiCisgICAgICAgeT0iMzkuNTc3MDAzIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNjIxMSI+TWVzc2FnZSBEaXNwYXRjaGVyPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDgwNi4xMDIzNiwyNDguMDMxNDkgQyA4MTQuOTYwNjMsMTcuNzE2NTMwIDU0OS4yMTI2MCwyNi41NzQ3OTcgNTU4LjA3MDg3LDI2LjU3NDc5NyIKKyAgICAgaWQ9InBhdGg2MjEzIgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIzODAuMjQzNDEiCisgICAgIHk9IjcxLjEyNTA1MyIKKyAgICAgaWQ9InRleHQ2MjE0IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMzgwLjI0MzQxIgorICAgICAgIHk9IjcxLjEyNTA1MyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjY4NjAiPmlmIChtZXNzYWdlIGlzIHNpZ25hbCk8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjM4MC4yNDM0MSIKKyAgICAgICB5PSI4My4xMjUwNTMiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW42ODYyIj4gIGJyb2FkY2FzdDwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iMzgwLjI0MzQxIgorICAgICAgIHk9Ijk1LjEyNTA1MyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjY4NjQiPmVsc2U8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjM4MC4yNDM0MSIKKyAgICAgICB5PSIxMDcuMTI1MDUiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW42ODY2Ij4gIGZpbmQgZGVzdGluYXRpb24gbmFtZWQgYnkgbWVzc2FnZTwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSAzODAuOTA1NTEsNzkuNzI0NDA0IEMgMTc3LjE2NTM2LDUzLjE0OTYwMSAyMDMuNzQwMTYsMjU2Ljg4OTc2IDIwMy43NDAxNiwyNDguMDMxNDkiCisgICAgIGlkPSJwYXRoNjg2OCIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gNDUxLjc3MTY1LDc5LjcyNDQwNCBDIDc4OC4zODU4Myw0NC4yOTEzMzMgNzc5LjUyNzU2LDI1Ni44ODk3NiA3NzkuNTI3NTYsMjQ4LjAzMTQ5IgorICAgICBpZD0icGF0aDY4NjkiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM2YTZhNmE7c3Ryb2tlLXdpZHRoOjIuNTAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6MS4yNTAwMDAwLDEuMjUwMDAwMDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDc1MDMiCisgICAgIHdpZHRoPSIzMTguODk3NjQiCisgICAgIGhlaWdodD0iMTY4LjMwNzA4IgorICAgICB4PSIzNDUuNDcyNDQiCisgICAgIHk9IjExNS4xNTc0OCIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjUwNy4xMDAxNiIKKyAgICAgeT0iMTMyLjcwNDA5IgorICAgICBpZD0idGV4dDgxMzciCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW44MTM4Ij5EZXN0aW5hdGlvbiBUYWJsZTwvdHNwYW4+PC90ZXh0PgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI0MjIuNzExMjQiCisgICAgIHk9IjE1OC4zOTM2NiIKKyAgICAgaWQ9InRleHQ4MTQwIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTIwJSI+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjE1OC4zOTM2NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MTgiPkNvbm5lY3Rpb24gMTwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjE3Mi43OTM2NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MjAiPkNvbm5lY3Rpb24gMjwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjE4Ny4xOTM2NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MjIiPiZxdW90O1RoZSBTZXNzaW9uIE1hbmFnZXImcXVvdDs8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIyMDEuNTkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODI0Ij4mcXVvdDtUaGUgV2luZG93IE1hbmFnZXImcXVvdDs8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIyMTUuOTkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODI2Ij4mcXVvdDtUaGUgU2NyZWVuc2F2ZXImcXVvdDs8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIyMzAuMzkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODI4Ij4mcXVvdDtUaGUgVGV4dCBFZGl0b3ImcXVvdDs8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIyNDQuNzkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODMwIj4mcXVvdDtUaGUgSGFyZHdhcmUgRGlyZWN0b3J5JnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjU5LjE5MzY3IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgzMiI+JnF1b3Q7VGhlIEFkZHJlc3MgQm9vayZxdW90OzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjI3My41OTM2NyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MzQiPiZxdW90O1RoZSBEaWN0aW9uYXJ5JnF1b3Q7PC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDQxNi4zMzg1OCwxNTAuNTkwNTUgQyAyMzkuMTczMjMsOTcuNDQwOTM1IDIyMS40NTY2OSwyNTYuODg5NzYgMjIxLjQ1NjY5LDI0OC4wMzE0OSIKKyAgICAgaWQ9InBhdGg4MTc5IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA1MDQuOTIxMjYsMTY4LjMwNzA4IEMgNzI2LjM3Nzk1LDEwNi4yOTkyMSA3NzAuNjY5MjksMjY1Ljc0ODAyIDc2MS44MTEwMiwyMzkuMTczMjIiCisgICAgIGlkPSJwYXRoODE4MCIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgZD0iIgorICAgICBpZD0icGF0aDgxODEiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iIiAvPgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA1ODQuNjQ1NjcsMjM5LjE3MzIyIEMgNzE3LjUxOTY5LDE5NC44ODE4OCA3NjEuODExMDIsMjU2Ljg4OTc2IDc1Mi45NTI3NiwyNDguMDMxNDkiCisgICAgIGlkPSJwYXRoODE4MiIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gNDE2LjMzODU4LDE3Ny4xNjUzNSBDIDMwMS4xODExMSwxMjQuMDE1NzQgMjMwLjMxNDk2LDI2NS43NDgwMyAyMzkuMTczMjMsMjQ4LjAzMTQ5IgorICAgICBpZD0icGF0aDgxODQiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9kb3h5Z2VuX3RvX2RldmhlbHAueHNsIGIvZGJ1cy0xLjQuMTAvZG9jL2RveHlnZW5fdG9fZGV2aGVscC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwOThmOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9kb3h5Z2VuX3RvX2RldmhlbHAueHNsCkBAIC0wLDAgKzEsNDAgQEAKKzx4c2w6c3R5bGVzaGVldAorICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICAgIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiCisgICAgdmVyc2lvbj0iMS4wIj4KKworPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIHZlcnNpb249IjEuMCIgaW5kZW50PSJ5ZXMiLz4KKworPHhzbDpwYXJhbSBuYW1lPSJwcmVmaXgiPjwveHNsOnBhcmFtPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgPGJvb2sgdGl0bGU9IkQtQnVzOiBBIHN5c3RlbSBmb3IgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24iCisgICAgICAgIG5hbWU9ImRidXMiCisgICAgICAgIGxpbms9ImRidXMtdHV0b3JpYWwuaHRtbCI+CisgIDxjaGFwdGVycz4KKyAgICAgPHN1YiBuYW1lPSJUdXRvcmlhbCIgbGluaz0ieyRwcmVmaXh9ZGJ1cy10dXRvcmlhbC5odG1sIi8+CisgICAgIDxzdWIgbmFtZT0iRkFRIiBsaW5rPSJ7JHByZWZpeH1kYnVzLWZhcS5odG1sIi8+CisgICAgIDxzdWIgbmFtZT0iU3BlY2lmaWNhdGlvbiIgbGluaz0ieyRwcmVmaXh9ZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwiLz4KKyAgICAgPHN1YiBuYW1lPSJBUEkgUmVmZXJlbmNlIiBsaW5rPSJ7JHByZWZpeH1hcGkvaW5kZXguaHRtbCIvPgorICA8L2NoYXB0ZXJzPgorCisgIDxmdW5jdGlvbnM+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJkb3h5Z2VuaW5kZXgvY29tcG91bmRbQGtpbmQ9J2dyb3VwJ10vbWVtYmVyW0BraW5kPSdmdW5jdGlvbiddIi8+CisgIDwvZnVuY3Rpb25zPgorICA8L2Jvb2s+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVtYmVyIj4KKyAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSIvPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9InJlZmlkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlZmlkIi8+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0iYmVmb3JlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkcmVmaWQsJ18xJykiLz48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJhZnRlciI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcmVmaWQsJ18xJykiLz48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJsaW5rIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJlZm9yZSIvPi5odG1sIzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWZ0ZXIiLz48L3hzbDpwYXJhbT4KKyAgPHhzbDppZiB0ZXN0PSJzdGFydHMtd2l0aCgkbmFtZSwnZGJ1cycpIG9yIHN0YXJ0cy13aXRoKCRuYW1lLCAnREJ1cycpIj4KKyAgICA8eHNsOmlmIHRlc3Q9InN0YXJ0cy13aXRoKCRyZWZpZCwnZ3JvdXBfXycpIGFuZCBjb250YWlucygkcmVmaWQsICdfMScpIj4KKyAgICAgICA8ZnVuY3Rpb24gbmFtZT0ieyRuYW1lfSIgbGluaz0ieyRwcmVmaXh9YXBpL3skbGlua30iLz4KKyAgICA8L3hzbDppZj4KKyAgPC94c2w6aWY+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9maWxlLWJvaWxlcnBsYXRlLmMgYi9kYnVzLTEuNC4xMC9kb2MvZmlsZS1ib2lsZXJwbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzY1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9kb2MvZmlsZS1ib2lsZXJwbGF0ZS5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogRklMRU5BTUUgIEJSSUVGIEZJTEUgREVTQ1JJUFRJT04KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFlFQVIgIENPUFlSSUdIVCBIT0xERVIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX0ZPT19ICisjZGVmaW5lIERCVVNfRk9PX0gKKworI2VuZGlmIC8qIERCVVNfRk9PX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL2RvYy9pbnRyb3NwZWN0LmR0ZCBiL2RidXMtMS40LjEwL2RvYy9pbnRyb3NwZWN0LmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI2M2QzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvZG9jL2ludHJvc3BlY3QuZHRkCkBAIC0wLDAgKzEsMzcgQEAKKzwhLS0gRFREIGZvciBELUJ1cyBJbnRyb3NwZWN0aW9uIGRhdGEgLS0+Cis8IS0tIChDKSAyMDA1LTAyLTAyIERhdmlkIEEuIFdoZWVsZXI7IHJlbGVhc2VkIHVuZGVyIHRoZSBELUJ1cyBsaWNlbnNlcywKKyAgICAgICAgIEdOVSBHUEwgdmVyc2lvbiAyIChvciBncmVhdGVyKSBhbmQgQUZMIDEuMSAob3IgZ3JlYXRlcikgLS0+CisKKzwhLS0gc2VlIEQtQnVzIHNwZWNpZmljYXRpb24gZm9yIGRvY3VtZW50YXRpb24gLS0+CisKKzwhRUxFTUVOVCBub2RlIChub2RlfGludGVyZmFjZSkqPgorPCFBVFRMSVNUIG5vZGUgbmFtZSBDREFUQSAjSU1QTElFRD4KKworPCFFTEVNRU5UIGludGVyZmFjZSAobWV0aG9kfHNpZ25hbHxwcm9wZXJ0eXxhbm5vdGF0aW9uKSo+Cis8IUFUVExJU1QgaW50ZXJmYWNlIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgbWV0aG9kIChhcmd8YW5ub3RhdGlvbikqPgorPCFBVFRMSVNUIG1ldGhvZCBuYW1lIENEQVRBICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIHNpZ25hbCAoYXJnfGFubm90YXRpb24pKj4KKzwhQVRUTElTVCBzaWduYWwgbmFtZSBDREFUQSAjUkVRVUlSRUQ+CisKKzwhRUxFTUVOVCBhcmcgRU1QVFk+Cis8IUFUVExJU1QgYXJnIG5hbWUgQ0RBVEEgI0lNUExJRUQ+Cis8IUFUVExJU1QgYXJnIHR5cGUgQ0RBVEEgI1JFUVVJUkVEPgorPCEtLSBNZXRob2QgYXJndW1lbnRzIFNIT1VMRCBpbmNsdWRlICJkaXJlY3Rpb24iLAorICAgICB3aGlsZSBzaWduYWwgYW5kIGVycm9yIGFyZ3VtZW50cyBTSE9VTEQgbm90IChzaW5jZSB0aGVyZSdzIG5vIHBvaW50KS4KKyAgICAgVGhlIERURCBmb3JtYXQgY2FuJ3QgZXhwcmVzcyB0aGF0IHN1YnRsZXR5LiAtLT4KKzwhQVRUTElTVCBhcmcgZGlyZWN0aW9uIChpbnxvdXQpICJpbiI+CisKKzwhLS0gQUtBICJhdHRyaWJ1dGUiIC0tPgorPCFFTEVNRU5UIHByb3BlcnR5IChhbm5vdGF0aW9uKSo+Cis8IUFUVExJU1QgcHJvcGVydHkgbmFtZSBDREFUQSAjUkVRVUlSRUQ+Cis8IUFUVExJU1QgcHJvcGVydHkgdHlwZSBDREFUQSAjUkVRVUlSRUQ+IAorPCFBVFRMSVNUIHByb3BlcnR5IGFjY2VzcyAocmVhZHx3cml0ZXxyZWFkd3JpdGUpICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIGFubm90YXRpb24gRU1QVFk+ICA8IS0tIEdlbmVyaWMgbWV0YWRhdGEgLS0+Cis8IUFUVExJU1QgYW5ub3RhdGlvbiBuYW1lIENEQVRBICNSRVFVSVJFRD4KKzwhQVRUTElTVCBhbm5vdGF0aW9uIHZhbHVlIENEQVRBICNSRVFVSVJFRD4KKworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9kb2MvaW50cm9zcGVjdC54c2wgYi9kYnVzLTEuNC4xMC9kb2MvaW50cm9zcGVjdC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzNDQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9pbnRyb3NwZWN0LnhzbApAQCAtMCwwICsxLDEwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMTUiPz4KKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisKKzwhLS0gCisgQ29weXJpZ2h0IChDKSAyMDA1IExlbm5hcnQgUG9ldHRlcmluZy4KKworIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorLS0+CisKKzwhLS0gJElkJCAtLT4KKworPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTE1IiBkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iIGRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIiBpbmRlbnQ9InllcyIvPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICA8dGl0bGU+REJVUyBJbnRyb3NwZWN0aW9uIGRhdGE8L3RpdGxlPgorICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgYm9keSB7IGNvbG9yOiBibGFjazsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgfSAKKyAgICAgICAgaDEgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZiB9CisgICAgICAgIHVsIHsgbGlzdC1zdHlsZS10eXBlOiBub25lOyBtYXJnaW4tYm90dG9tOiAxMHB4IH0KKyAgICAgICAgbGkgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZiB9CisgICAgICAgIC5rZXl3b3JkIHsgZm9udC1zdHlsZTogaXRhbGljIH0KKyAgICAgICAgLnR5cGUgeyBmb250LXdlaWdodDogYm9sZCB9CisgICAgICAgIC5zeW1ib2wgeyBmb250LWZhbWlseTogbW9ub3NwYWNlIH0KKyAgICAgICAgLmludGVyZmFjZSB7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweCB9CisgICAgICA8L3N0eWxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJub2RlL2ludGVyZmFjZSI+CisgICAgICAgIDxkaXYgY2xhc3M9ImludGVyZmFjZSI+CisgICAgICAgICAgPGgxPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPmludGVyZmFjZTwvc3Bhbj48eHNsOnRleHQ+IDwveHNsOnRleHQ+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ltYm9sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3NwYW4+CisgICAgICAgICAgPC9oMT4gICAKKyAgICAgICAgICAKKyAgICAgICAgICA8dWw+CisKKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYW5ub3RhdGlvbiIvPiAKKworICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZHxzaWduYWx8cHJvcGVydHkiPgorICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lKCkiLz48L3NwYW4+CisgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzeW1ib2wiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImFubm90YXRpb24iLz4gCisgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iYXJnIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGRpcmVjdGlvbiAhPSAmcXVvdDsmcXVvdDsiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGlyZWN0aW9uIi8+IAorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibmFtZSguLikgPSAmcXVvdDtzaWduYWwmcXVvdDsiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorCisgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3NwYW4+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzeW1ib2wiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvc3Bhbj48eHNsOnRleHQ+IDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICA8L3VsPgorCisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKworICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvZGl2PgorICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC9ib2R5PgorICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJhbm5vdGF0aW9uIj4gCisgIDxsaT4KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+YW5ub3RhdGlvbjwvc3Bhbj4KKyAgICA8Y29kZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2NvZGU+PHhzbDp0ZXh0PiA9IDwveHNsOnRleHQ+CisgICAgPGNvZGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPjwvY29kZT4KKyAgPC9saT4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvZG9jL3N5c3RlbS1hY3RpdmF0aW9uLnR4dCBiL2RidXMtMS40LjEwL2RvYy9zeXN0ZW0tYWN0aXZhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxOTVmNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2RvYy9zeXN0ZW0tYWN0aXZhdGlvbi50eHQKQEAgLTAsMCArMSw4MCBAQAorRC1CVVMgU3lzdGVtIEFjdGl2YXRpb24KKworSW50cm9kdWN0aW9uOgorCitUaGUgZGJ1cy1kYWVtb24gcnVucyBhcyB0aGUgZGJ1cyB1c2VyLCBhbmQgaXMgdGhlcmVmb3JlIHVucHJpdmlsZWdlZC4KK0VhcmxpZXIgYXR0ZW1wdHMgWzFdIGJ5IERhdmlkIFpldXRoZW4gYXQgbGF1bmNoaW5nIHN5c3RlbSBzY3JpcHRzIHVzaW5nIGEKK2N1c3RvbSBEQlVTIHByb3RvY29sIHdlcmUgcmV2aWV3ZWQsIGJ1dCBkZWVtZWQgdG9vIGRpZmZpY3VsdCB0byBhdWRpdCwgYW5kCithbHNvIGR1ZSB0byBhIG11bHRpLXRocmVhZGVkIGRlc2lnbiwgdG9vIGRpZmZpY3VsdCB0byB0ZXN0LgorSW4gdGhlIG5leHQgZmV3IHBhcmFncmFwaHMgSSB3aWxsIG91dGxpbmUgYSBzaW1wbGVyIHNldHVpZCBhcHByb2FjaCBmb3IKK2xhdW5jaGluZyBkYWVtb25zIGFzIGEgY29uZmlndXJlZCB1c2VyLgorCitTY29wZToKKworTGF1bmNoaW5nIHByb2dyYW1zIHVzaW5nIGRidXMgaGFzIGJlZW4gYSB0b3BpYyBvZiBpbnRlcmVzdCBmb3IgbWFueSBtb250aHMuCitUaGlzIHdvdWxkIGFsbG93IHNpbXBsZSBzeXN0ZW1zIHRvIG9ubHkgc3RhcnQgc2VydmljZXMgdGhhdCBhcmUgbmVlZGVkLAorYW5kIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBvbmx5IHdoZW4gZmlyc3QgcmVxdWVzdGVkLgorVGhpcyByZW1vdmVzIHRoZSBuZWVkIGZvciBhbiBpbml0IHN5c3RlbSwgYW5kIG1lYW5zIHRoYXQgd2UgY2FuIHRyaXZpYWxseQorc3RhcnR1cCBzZXJ2aWNlcyBpbiBwYXJhbGxlbC4KK1RoaXMgaGFzIGltbWVkaWF0ZSBwcmVzc2luZyBuZWVkIGZvciBPTFBDLCB3aXRoIGEgbG9uZ2VyIHRlcm0gZXZhbHVhdGlvbiBmb3IKK3BlcmhhcHMgRmVkb3JhIGFuZCBSSEVMLgorCitEZXRhaWxzOgorCitTZXR1aWQgYXBwbGljYXRpb25zIGhhdmUgdG8gdXNlZCBvbmx5IHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnkuCitJbiB0aGlzIGltcGxlbWVudGF0aW9uIEkgaGF2ZSBhbiBzaW5nbGUgZXhlY3V0YWJsZSwKK2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIsIHdpdGggdGhlIG93bmVyc2hpcCByb290OmRidXMuCitUaGlzIGhhcyB0aGUgcGVybWlzc2lvbnMgNDc1MCwgaS5lLiB1K3J3eCBnK3J4ICtzZXR1aWQuCitJdCBpcyBsb2NhdGVkIGluIC91c3IvbGliZXhlYy8gYW5kIHRodXMgaXMgbm90IGRlc2lnbmVkIHRvIGJlIGludm9rZWQgYnkgYQordXNlciBkaXJlY3RseS4KKworVGhlIGhlbHBlciBtdXN0IG5vdCBiZSBwYXNzZWQgaW5wdXQgdGhhdCBjYW4gYmUgY2hhbmdlZCBtYWxpY2lvdXNseSwgYW5kCit0aGVyZWZvcmUgcGFzc2luZyBhIHJhbmRvbSBwYXRoIHdpdGggdXNlciBpZCBpcyB0b3RhbGx5IG91dCBvZiB0aGUgcXVlc3Rpb24uCitJbiB0aGlzIGltcGxlbWVudGF0aW9uIGEgc2ltaWxhciBpZGVhIGFzIGRpc2N1c3NlZCB3aXRoIERhdmlkcycgcGF0Y2ggd2FzCit0YWtlbiwgdGhhdCB0byBwYXNzIGEgc2luZ2xlIG5hbWUgYXJndW1lbnQgdG8gdGhlIGhlbHBlci4KK1RoZSBzZXJ2aWNlIGZpbGVuYW1lIG9mICJvcmcubWUudGVzdC5zZXJ2aWNlIiBpcyB0aGVuIHNlYXJjaGVkIGZvciBpbgorL3Vzci9zaGFyZS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIG9yIG90aGVyIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4KKworSWYgYXBwbGljYXRpb25zIHdhbnQgdG8gYmUgYWN0aXZhdGVkIG9uIHRoZSBzeXN0ZW0gX2FuZF8gc2Vzc2lvbiBidXNzZXMsIHRoZW4KK3NlcnZpY2UgZmlsZXMgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBib3RoIGRpcmVjdG9yaWVzLgorCitBIHR5cGljYWwgc2VydmljZSBmaWxlIHdvdWxkIGxvb2sgbGlrZToKKworW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5tZS50ZXN0CitFeGVjPS91c3Ivc2Jpbi9kYnVzLXRlc3Qtc2VydmVyLnB5CitVc2VyPWZ0cAorCitUaGlzIGdpdmVzIHRoZSB1c2VyIHRvIHN3aXRjaCB0bywgYW5kIGFsc28gdGhlIHBhdGggb2YgdGhlIGV4ZWN1dGFibGUuCitUaGUgc2VydmljZSBuYW1lIG11c3QgbWF0Y2ggdGhhdCBzcGVjaWZpZWQgaW4gdGhlIC9ldGMvZGJ1cy0xL3N5c3RlbS5kIGNvbmYgZmlsZS4KKworUHJlY2F1dGlvbnMgdGFrZW46CisKKyogT25seSB0aGUgYnVzIG5hbWUgaXMgcGFzc2VkIHRvIHRoZSBoZWxwZXIsIGFuZCB0aGlzIGlzIHZhbGlkYXRlZAorKiBXZSBhcmUgc3VwZXIgcGFyYW5vaWQgYWJvdXQgdGhlIHVzZXIgdGhhdCBjYWxsZWQgdXMsIGFuZCB3aGF0IHBlcm1pc3Npb25zIHdlIGhhdmUuCisqIFdlIGNsZWFyIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXhjZXB0IGZvciBEQlVTX1ZFUkJPU0Ugd2hpY2ggaXMgdXNlZCBmb3IgZGVidWdnaW5nCisqIEFueXRoaW5nIG91dCBvZiB0aGUgb3JkaW5hcnkgY2F1c2VzIHRoZSBoZWxwZXIgdG8gYWJvcnQuCisKK0xhdW5jaGluZyBzZXJ2aWNlczoKKworVHJpdmlhbCBtZXRob2RzIG9uIHNlcnZpY2VzIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYW5kIHRoZSBsYXVuY2ggaGVscGVyIHdpbGwKK3N0YXJ0IHRoZSBzZXJ2aWNlIGFuZCBleGVjdXRlIHRoZSBtZXRob2Qgb24gdGhlIHNlcnZpY2UuIFRoZSBsYXVjaGluZyBvZiB0aGUKK3NlcnZpY2UgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyLCBlLmcuOgorCitkYnVzLXNlbmQgLS1zeXN0ZW0gLS1wcmludC1yZXBseQkJCVwKKwktLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkhhbAkJCVwKKwkvb3JnL2ZyZWVkZXNrdG9wL0hhbC9NYW5hZ2VyCQkJXAorCW9yZy5mcmVlZGVza3RvcC5IYWwuTWFuYWdlci5EZXZpY2VFeGlzdHMJXAorCXN0cmluZzovb3JnL2ZyZWVkZXNrdG9wL0hhbC9kZXZpY2VzL2NvbXB1dGVyCisKK0lmIHlvdSB3aXNoIHRvIGFjdGl2YXRlIHRoZSBzZXJ2aWNlIHdpdGhvdXQgY2FsbGluZyBhIHdlbGwga25vd24gbWV0aG9kLAordGhlIHN0YW5kYXJkIGRidXMgbWV0aG9kIFN0YXJ0U2VydmljZUJ5TmFtZSBjYW4gYmUgdXNlZDoKKworZGJ1cy1zZW5kIC0tc3lzdGVtIC0tcHJpbnQtcmVwbHkJCQlcCisJLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzCQkJXAorCS9vcmcvZnJlZWRlc2t0b3AvREJ1cwkJCQlcCisJb3JnLmZyZWVkZXNrdG9wLkRCdXMuU3RhcnRTZXJ2aWNlQnlOYW1lCQlcCisJc3RyaW5nOm9yZy5mcmVlZGVza3RvcC5IYWwgdWludDMyOjAKKworWzFdIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA2LU9jdG9iZXIvMDA2MDk2Lmh0bWwKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvaW5zdGFsbC1zaCBiL2RidXMtMS40LjEwL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjc4MWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL2luc3RhbGwtc2gKQEAgLTAsMCArMSw1MjAgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQworCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guCisKK25sPScKKycKK0lGUz0iICIiCSRubCIKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9JHtET0lUUFJPRy19CitpZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KKyAgZG9pdF9leGVjPWV4ZWMKK2Vsc2UKKyAgZG9pdF9leGVjPSRkb2l0CitmaQorCisjIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOworIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KKworY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQorY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQorY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQorY21wcHJvZz0ke0NNUFBST0ctY21wfQorY3Bwcm9nPSR7Q1BQUk9HLWNwfQorbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQorbXZwcm9nPSR7TVZQUk9HLW12fQorcm1wcm9nPSR7Uk1QUk9HLXJtfQorc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQorCitwb3NpeF9nbG9iPSc/JworaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKKyAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7CisgICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHBvc2l4X2dsb2I9CisgICAgZWxzZQorICAgICAgcG9zaXhfZ2xvYj06CisgICAgZmkKKyAgfQorJworCitwb3NpeF9ta2Rpcj0KKworIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCittb2RlPTA3NTUKKworY2hncnBjbWQ9CitjaG1vZGNtZD0kY2htb2Rwcm9nCitjaG93bmNtZD0KK212Y21kPSRtdnByb2cKK3JtY21kPSIkcm1wcm9nIC1mIgorc3RyaXBjbWQ9CisKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3RfYXJnPQorCitjb3B5X29uX2NoYW5nZT1mYWxzZQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKyAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKyAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworICAtYyAgICAgICAgICAgIChpZ25vcmVkKQorICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCisgIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKyAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKyAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCisgIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCisgIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKyAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCisgIFJNUFJPRyBTVFJJUFBST0cKKyIKKword2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSA7OworCisgICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJc2hpZnQ7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBtb2RlPSQyCisJY2FzZSAkbW9kZSBpbgorCSAgKicgJyogfCAqJwknKiB8IConCisnKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQorCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCisJICAgIGV4aXQgMTs7CisJZXNhYworCXNoaWZ0OzsKKworICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwlzaGlmdDs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7CisKKyAgICAtdCkgZHN0X2FyZz0kMgorCXNoaWZ0OzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWU7OworCisgICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworCisgICAgLS0pCXNoaWZ0CisJYnJlYWs7OworCisgICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgorCWV4aXQgMTs7CisKKyAgICAqKSAgYnJlYWs7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0X2FyZyI7IHRoZW4KKyAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisgICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCisgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KKyAgZm9yIGFyZworICBkbworICAgIGlmIHRlc3QgLW4gIiRkc3RfYXJnIjsgdGhlbgorICAgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdF9hcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgZmkKKyAgICBzaGlmdCAjIGFyZworICAgIGRzdF9hcmc9JGFyZworICBkb25lCitmaQorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgorICAgIGV4aXQgMQorICBmaQorICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KKyAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KKyAgZXhpdCAwCitmaQorCitpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKKworICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgorICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCisgIGNhc2UgJG1vZGUgaW4KKyAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKyAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OworICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKKworICAgICpbMC03XSkKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSclIDIwMCcKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSx1K3J3CisgICAgICBmaQorICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKKyAgZXNhYworZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICBjYXNlICRzcmMgaW4KKyAgICAtKikgc3JjPS4vJHNyYzs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIGRzdGRpcj0kZHN0CisgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICBkc3RkaXJfc3RhdHVzPSQ/CisgIGVsc2UKKworICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBkc3Q9JGRzdF9hcmcKKyAgICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgICAgY2FzZSAkZHN0IGluCisgICAgICAtKikgZHN0PS4vJGRzdDs7CisgICAgZXNhYworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGRzdGRpcj0kZHN0CisgICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAorICAgICAgZHN0ZGlyX3N0YXR1cz0wCisgICAgZWxzZQorICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KKyAgICAgIGRzdGRpcj1gCisJKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAorCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKwllY2hvIFgiJGRzdCIgfAorCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXClbXi9dLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXCkkL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cKS4qL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIHMvLiovLi87IHEnCisgICAgICBgCisKKyAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgICBkc3RkaXJfc3RhdHVzPSQ/CisgICAgZmkKKyAgZmkKKworICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCisKKyAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCisgICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KKyAgICAgICcnKQorCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KKwkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgorCXVtYXNrPWB1bWFza2AKKwljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KKwkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKKwkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKKworCSAgKlswLTddKQorCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCisJICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKKwkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKKwkgICAgYDs7CisJICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7CisJZXNhYworCisJIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KKwkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCisJaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisJICBta2Rpcl9tb2RlPS1tJG1vZGUKKwllbHNlCisJICBta2Rpcl9tb2RlPQorCWZpCisKKwlwb3NpeF9ta2Rpcj1mYWxzZQorCWNhc2UgJHVtYXNrIGluCisJICAqWzEyMzU2N11bMC03XVswLTddKQorCSAgICAjIFBPU0lYIG1rZGlyIC1wIHNldHMgdSt3eCBiaXRzIHJlZ2FyZGxlc3Mgb2YgdW1hc2ssIHdoaWNoCisJICAgICMgaXMgaW5jb21wYXRpYmxlIHdpdGggRnJlZUJTRCAnaW5zdGFsbCcgd2hlbiAodW1hc2sgJiAzMDApICE9IDAuCisJICAgIDs7CisJICAqKQorCSAgICB0bXBkaXI9JHtUTVBESVItL3RtcH0vaW5zJFJBTkRPTS0kJAorCSAgICB0cmFwICdyZXQ9JD87IHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIiAyPi9kZXYvbnVsbDsgZXhpdCAkcmV0JyAwCisKKwkgICAgaWYgKHVtYXNrICRta2Rpcl91bWFzayAmJgorCQlleGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiR0bXBkaXIvZCIpID4vZGV2L251bGwgMj4mMQorCSAgICB0aGVuCisJICAgICAgaWYgdGVzdCAteiAiJGRpcl9hcmciIHx8IHsKKwkJICAgIyBDaGVjayBmb3IgUE9TSVggaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAtbS4KKwkJICAgIyBIUC1VWCAxMS4yMyBhbmQgSVJJWCA2LjUgbWtkaXIgLW0gLXAgc2V0cyBncm91cC0gb3IKKwkJICAgIyBvdGhlci13cml0ZWFibGUgYml0IG9mIHBhcmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBzaG91bGRuJ3QuCisJCSAgICMgRnJlZUJTRCA2LjEgbWtkaXIgLW0gLXAgc2V0cyBtb2RlIG9mIGV4aXN0aW5nIGRpcmVjdG9yeS4KKwkJICAgbHNfbGRfdG1wZGlyPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICBjYXNlICRsc19sZF90bXBkaXIgaW4KKwkJICAgICBkPz8/Py0/ci0qKSBkaWZmZXJlbnRfbW9kZT03MDA7OworCQkgICAgIGQ/Pz8/LT8tLSopIGRpZmZlcmVudF9tb2RlPTc1NTs7CisJCSAgICAgKikgZmFsc2U7OworCQkgICBlc2FjICYmCisJCSAgICRta2RpcnByb2cgLW0kZGlmZmVyZW50X21vZGUgLXAgLS0gIiR0bXBkaXIiICYmIHsKKwkJICAgICBsc19sZF90bXBkaXJfMT1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgICB0ZXN0ICIkbHNfbGRfdG1wZGlyIiA9ICIkbHNfbGRfdG1wZGlyXzEiCisJCSAgIH0KKwkJIH0KKwkgICAgICB0aGVuIHBvc2l4X21rZGlyPToKKwkgICAgICBmaQorCSAgICAgIHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBSZW1vdmUgYW55IGRpcnMgbGVmdCBiZWhpbmQgYnkgYW5jaWVudCBta2RpciBpbXBsZW1lbnRhdGlvbnMuCisJICAgICAgcm1kaXIgLi8kbWtkaXJfbW9kZSAuLy1wIC4vLS0gMj4vZGV2L251bGwKKwkgICAgZmkKKwkgICAgdHJhcCAnJyAwOzsKKwllc2FjOzsKKyAgICBlc2FjCisKKyAgICBpZgorICAgICAgJHBvc2l4X21rZGlyICYmICgKKwl1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiCisgICAgICApCisgICAgdGhlbiA6CisgICAgZWxzZQorCisgICAgICAjIFRoZSB1bWFzayBpcyByaWRpY3Vsb3VzLCBvciBta2RpciBkb2VzIG5vdCBjb25mb3JtIHRvIFBPU0lYLAorICAgICAgIyBvciBpdCBmYWlsZWQgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uICBDcmVhdGUgdGhlCisgICAgICAjIGRpcmVjdG9yeSB0aGUgc2xvdyB3YXksIHN0ZXAgYnkgc3RlcCwgY2hlY2tpbmcgZm9yIHJhY2VzIGFzIHdlIGdvLgorCisgICAgICBjYXNlICRkc3RkaXIgaW4KKwkvKikgcHJlZml4PScvJzs7CisJLSopIHByZWZpeD0nLi8nOzsKKwkqKSAgcHJlZml4PScnOzsKKyAgICAgIGVzYWMKKworICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIKKworICAgICAgb0lGUz0kSUZTCisgICAgICBJRlM9LworICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mCisgICAgICBzZXQgZm5vcmQgJGRzdGRpcgorICAgICAgc2hpZnQKKyAgICAgICRwb3NpeF9nbG9iIHNldCArZgorICAgICAgSUZTPSRvSUZTCisKKyAgICAgIHByZWZpeGVzPQorCisgICAgICBmb3IgZAorICAgICAgZG8KKwl0ZXN0IC16ICIkZCIgJiYgY29udGludWUKKworCXByZWZpeD0kcHJlZml4JGQKKwlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgorCSAgcHJlZml4ZXM9CisJZWxzZQorCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCisJICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKKwkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCisJICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCisJICBlbHNlCisJICAgIGNhc2UgJHByZWZpeCBpbgorCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKwkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OworCSAgICBlc2FjCisJICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKKwkgIGZpCisJZmkKKwlwcmVmaXg9JHByZWZpeC8KKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgorCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8CisJICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKKwlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAorICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQorICBlbHNlCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKworICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCisgICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KKyAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKKyAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgorICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCisKKyAgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCAtZiAmJgorICAgICAgIHNldCBYICRvbGQgJiYgb2xkPTokMjokNDokNTokNiAmJgorICAgICAgIHNldCBYICRuZXcgJiYgbmV3PTokMjokNDokNTokNiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCArZiAmJgorCisgICAgICAgdGVzdCAiJG9sZCIgPSAiJG5ldyIgJiYKKyAgICAgICAkY21wcHJvZyAiJGRzdCIgIiRkc3R0bXAiID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIHJtIC1mICIkZHN0dG1wIgorICAgIGVsc2UKKyAgICAgICMgUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorICAgICAgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdCIgMj4vZGV2L251bGwgfHwKKworICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQorICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICMgc3VwcG9ydCAtZi4KKyAgICAgIHsKKwkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwl7CisJICB0ZXN0ICEgLWYgIiRkc3QiIHx8CisJICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8CisJICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKKwkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KKwkgIH0gfHwKKwkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgorCSAgICAoZXhpdCAxKTsgZXhpdCAxCisJICB9CisJfSAmJgorCisJIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCisgICAgICB9CisgICAgZmkgfHwgZXhpdCAxCisKKyAgICB0cmFwICcnIDAKKyAgZmkKK2RvbmUKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvbHRtYWluLnNoIGIvZGJ1cy0xLjQuMTAvbHRtYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmNjUwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9sdG1haW4uc2gKQEAgLTAsMCArMSw5NjQyIEBACisKKyMgbGlidG9vbCAoR05VIGxpYnRvb2wpIDIuNAorIyBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwKKyMgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KKyMgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKKyMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KKyMKKyMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjCisjICAgICAgIC0tY29uZmlnICAgICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisjICAgICAgIC0tZGVidWcgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKKyMgICAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyMgICAgICAgLS1mZWF0dXJlcyAgICAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisjICAgICAgIC0tbW9kZT1NT0RFICAgICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFCisjICAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKyMgICAgICAgLS1xdWlldCwgLS1zaWxlbnQgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworIyAgICAgICAtLW5vLXF1aWV0LCAtLW5vLXNpbGVudAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIChkZWZhdWx0KQorIyAgICAgICAtLXRhZz1UQUcgICAgICAgICAgICB1c2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZnJvbSB0YWcgVEFHCisjICAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgIHByaW50IG1vcmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGFuIGRlZmF1bHQKKyMgICAgICAgLS1uby12ZXJib3NlICAgICAgICAgZG9uJ3QgcHJpbnQgdGhlIGV4dHJhIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyMgICAgICAgLS12ZXJzaW9uICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgorIyAgIC1oLCAtLWhlbHAsIC0taGVscC1hbGwgICBwcmludCBzaG9ydCwgbG9uZywgb3IgZGV0YWlsZWQgaGVscCBtZXNzYWdlCisjCisjIE1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyMKKyMgICAgICAgICBjbGVhbiAgICAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQorIyAgICAgICAgIGNvbXBpbGUgICAgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0CisjICAgICAgICAgZXhlY3V0ZSAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCisjICAgICAgICAgZmluaXNoICAgICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyMgICAgICAgICBpbnN0YWxsICAgICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKKyMgICAgICAgICBsaW5rICAgICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCisjICAgICAgICAgdW5pbnN0YWxsICAgICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisjCisjIE1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFdoZW4gcGFzc2VkIGFzIGZpcnN0IG9wdGlvbiwKKyMgYC0tbW9kZT1NT0RFJyBtYXkgYmUgYWJicmV2aWF0ZWQgYXMgYE1PREUnIG9yIGEgdW5pcXVlIGFiYnJldmlhdGlvbiBvZiB0aGF0LgorIyBUcnkgYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KKyMKKyMgV2hlbiByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBkZXNjcmliZSBhIHRlc3QgY2FzZSB0byByZXByb2R1Y2UgaXQgYW5kCisjIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyMKKyMgICAgICAgICBob3N0LXRyaXBsZXQ6CSRob3N0CisjICAgICAgICAgc2hlbGw6CQkkU0hFTEwKKyMgICAgICAgICBjb21waWxlcjoJCSRMVENDCisjICAgICAgICAgY29tcGlsZXIgZmxhZ3M6CQkkTFRDRkxBR1MKKyMgICAgICAgICBsaW5rZXI6CQkkTEQgKGdudT8gJHdpdGhfZ251X2xkKQorIyAgICAgICAgICRwcm9nbmFtZToJKEdOVSBsaWJ0b29sKSAyLjQgRGViaWFuLTIuNC0yCisjICAgICAgICAgYXV0b21ha2U6CSRhdXRvbWFrZV92ZXJzaW9uCisjICAgICAgICAgYXV0b2NvbmY6CSRhdXRvY29uZl92ZXJzaW9uCisjCisjIFJlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4KKyMgR05VIGxpYnRvb2wgaG9tZSBwYWdlOiA8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYnRvb2wvPi4KKyMgR2VuZXJhbCBoZWxwIHVzaW5nIEdOVSBzb2Z0d2FyZTogPGh0dHA6Ly93d3cuZ251Lm9yZy9nZXRoZWxwLz4uCisKK1BST0dSQU09bGlidG9vbAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPSIyLjQgRGViaWFuLTIuNC0yIgorVElNRVNUQU1QPSIiCitwYWNrYWdlX3JldmlzaW9uPTEuMzI5MworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKK2ZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKKyQxCitfTFRFQ0hPX0VPRicKK30KKworIyBOTFMgbnVpc2FuY2VzOiBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KK2x0X3VzZXJfbG9jYWxlPQorbHRfc2FmZV9sb2NhbGU9Citmb3IgbHRfdmFyIGluIExBTkcgTEFOR1VBR0UgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKK2RvCisgIGV2YWwgImlmIHRlc3QgXCJcJHskbHRfdmFyK3NldH1cIiA9IHNldDsgdGhlbgorICAgICAgICAgIHNhdmVfJGx0X3Zhcj1cJCRsdF92YXIKKyAgICAgICAgICAkbHRfdmFyPUMKKwkgIGV4cG9ydCAkbHRfdmFyCisJICBsdF91c2VyX2xvY2FsZT1cIiRsdF92YXI9XFxcJHNhdmVfXCRsdF92YXI7IFwkbHRfdXNlcl9sb2NhbGVcIgorCSAgbHRfc2FmZV9sb2NhbGU9XCIkbHRfdmFyPUM7IFwkbHRfc2FmZV9sb2NhbGVcIgorCWZpIgorZG9uZQorTENfQUxMPUMKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRSBMQ19BTEwKKworJGx0X3Vuc2V0IENEUEFUSAorCisKKyMgV29yayBhcm91bmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSBvbiBJUklYIDYuNS4gT24gSVJJWCA2LjQrLCBzaAorIyBpcyBrc2ggYnV0IHdoZW4gdGhlIHNoZWxsIGlzIGludm9rZWQgYXMgInNoIiBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YKKyMgdGhlIF9YUEcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIDEgKG9uZSksIHRoZSBzcGVjaWFsCisjIHBvc2l0aW9uYWwgcGFyYW1ldGVyICQwLCB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsLCBpcyB0aGUgbmFtZSBvZiB0aGUKKyMgZnVuY3Rpb24uCitwcm9ncGF0aD0iJDAiCisKKworCis6ICR7Q1A9ImNwIC1mIn0KK3Rlc3QgIiR7RUNITytzZXR9IiA9IHNldCB8fCBFQ0hPPSR7YXNfZWNoby0ncHJpbnRmICVzXG4nfQorOiAke0VHUkVQPSIvYmluL2dyZXAgLUUifQorOiAke0ZHUkVQPSIvYmluL2dyZXAgLUYifQorOiAke0dSRVA9Ii9iaW4vZ3JlcCJ9Cis6ICR7TE5fUz0ibG4gLXMifQorOiAke01BS0U9Im1ha2UifQorOiAke01LRElSPSJta2RpciJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorOiAke1NFRD0iL2Jpbi9zZWQifQorOiAke1NIRUxMPSIke0NPTkZJR19TSEVMTC0vYmluL3NofSJ9Cis6ICR7WHNlZD0iJFNFRCAtZSAxcy9eWC8vIn0KKworIyBHbG9iYWwgdmFyaWFibGVzOgorRVhJVF9TVUNDRVNTPTAKK0VYSVRfRkFJTFVSRT0xCitFWElUX01JU01BVENIPTYzICAjICQ/ID0gNjMgaXMgdXNlZCB0byBpbmRpY2F0ZSB2ZXJzaW9uIG1pc21hdGNoIHRvIG1pc3NpbmcuCitFWElUX1NLSVA9NzcJICAjICQ/ID0gNzcgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIHNraXBwZWQgdGVzdCB0byBhdXRvbWFrZS4KKworZXhpdF9zdGF0dXM9JEVYSVRfU1VDQ0VTUworCisjIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAorbHRfbmw9JworJworSUZTPSIgCSRsdF9ubCIKKworZGlybmFtZT0icywvW14vXSokLCwiCitiYXNlbmFtZT0icyxeLiovLCwiCisKKyMgZnVuY19kaXJuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LAorIyBvdGhlcndpc2Ugc2V0IHJlc3VsdCB0byBOT05ESVJfUkVQTEFDRU1FTlQuCitmdW5jX2Rpcm5hbWUgKCkKK3sKKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICIkZGlybmFtZSJgCisgICAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCisgICAgZWxzZQorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgorICAgIGZpCit9ICMgZnVuY19kaXJuYW1lIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19iYXNlbmFtZSBmaWxlCitmdW5jX2Jhc2VuYW1lICgpCit7CisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgIiRiYXNlbmFtZSJgCit9ICMgZnVuY19iYXNlbmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIHBlcmZvcm0gZnVuY19iYXNlbmFtZSBhbmQgZnVuY19kaXJuYW1lIGluIGEgc2luZ2xlIGZ1bmN0aW9uCisjIGNhbGw6CisjICAgZGlybmFtZTogIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LAorIyAgICAgICAgICAgICBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsIG90aGVyd2lzZSBzZXQgcmVzdWx0CisjICAgICAgICAgICAgIHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorIyAgIGJhc2VuYW1lOiBDb21wdXRlIGZpbGVuYW1lIG9mIEZJTEUuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVuZWQgaW4gIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyMgSW1wbGVtZW50YXRpb24gbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIGZ1bmNfZGlybmFtZQorIyBhbmQgZnVuY19iYXNlbmFtZS4gRm9yIGVmZmljaWVuY3ksIHdlIGRvIG5vdCBkZWxlZ2F0ZSB0bworIyB0aG9zZSBmdW5jdGlvbnMgYnV0IGluc3RlYWQgZHVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IGhlcmUuCitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpCit7CisgICAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEIC1lICIkZGlybmFtZSJgCisgICAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCisgICAgZWxzZQorICAgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgorICAgIGZpCisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgLWUgIiRiYXNlbmFtZSJgCit9ICMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQorIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KKyMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCisjIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKKyMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KKyMgZnVuY19zdHJpcF9zdWZmaXggcHJlZml4IG5hbWUKK2Z1bmNfc3RyaXBuYW1lICgpCit7CisgICAgY2FzZSAkezJ9IGluCisgICAgICAuKikgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlXFxcXCR7Mn1cJCUlImA7OworICAgICAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJSR7Mn1cJCUlImA7OworICAgIGVzYWMKK30gIyBmdW5jX3N0cmlwbmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIFRoZXNlIFNFRCBzY3JpcHRzIHByZXN1cHBvc2UgYW4gYWJzb2x1dGUgcGF0aCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCitwYXRoY2FyPSdzLF4vXChbXi9dKlwpLiokLFwxLCcKK3BhdGhjZHI9J3MsXi9bXi9dKiwsJworcmVtb3ZlZG90cGFydHM9Jzpkb3RzbAorCQlzQC9cLi9AL0BnCisJCXQgZG90c2wKKwkJcywvXC4kLC8sJworY29sbGFwc2VzbGFzaGVzPSdzQC9cezEsXH1AL0BnJworZmluYWxzbGFzaD0ncywvKiQsLywnCisKKyMgZnVuY19ub3JtYWxfYWJzcGF0aCBQQVRICisjIFJlbW92ZSBkb3VibGVkLXVwIGFuZCB0cmFpbGluZyBzbGFzaGVzLCAiLiIgcGF0aCBjb21wb25lbnRzLAorIyBhbmQgY2FuY2VsIG91dCBhbnkgIi4uIiBwYXRoIGNvbXBvbmVudHMgaW4gUEFUSCBhZnRlciBtYWtpbmcKKyMgaXQgYW4gYWJzb2x1dGUgcGF0aC4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdCIKK2Z1bmNfbm9ybWFsX2Fic3BhdGggKCkKK3sKKyAgIyBTdGFydCBmcm9tIHJvb3QgZGlyIGFuZCByZWFzc2VtYmxlIHRoZSBwYXRoLgorICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD0kMQorICBmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZT0KKyAgY2FzZSAkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCBpbgorICAgICIiKQorICAgICAgIyBFbXB0eSBwYXRoLCB0aGF0IGp1c3QgbWVhbnMgJGN3ZC4KKyAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiYHB3ZGAiCisgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgICByZXR1cm4KKyAgICA7OworICAgICMgVGhlIG5leHQgdGhyZWUgZW50cmllcyBhcmUgdXNlZCB0byBzcG90IGEgcnVuIG9mIHByZWNpc2VseQorICAgICMgdHdvIGxlYWRpbmcgc2xhc2hlcyB3aXRob3V0IHVzaW5nIG5lZ2F0ZWQgY2hhcmFjdGVyIGNsYXNzZXM7CisgICAgIyB3ZSB0YWtlIGFkdmFudGFnZSBvZiBjYXNlJ3MgZmlyc3QtbWF0Y2ggYmVoYXZpb3VyLgorICAgIC8vLyopCisgICAgICAjIFVudXN1YWwgZm9ybSBvZiBhYnNvbHV0ZSBwYXRoLCBkbyBub3RoaW5nLgorICAgIDs7CisgICAgLy8qKQorICAgICAgIyBOb3QgbmVjZXNzYXJpbHkgYW4gb3JkaW5hcnkgcGF0aDsgUE9TSVggcmVzZXJ2ZXMgbGVhZGluZyAnLy8nCisgICAgICAjIGFuZCBmb3IgZXhhbXBsZSBDeWd3aW4gdXNlcyBpdCB0byBhY2Nlc3MgcmVtb3RlIGZpbGUgc2hhcmVzCisgICAgICAjIG92ZXIgQ0lGUy9TTUIsIHNvIHdlIGNvbnNlcnZlIGEgbGVhZGluZyBkb3VibGUgc2xhc2ggaWYgZm91bmQuCisgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX2FsdG5hbWVzcGFjZT0vCisgICAgOzsKKyAgICAvKikKKyAgICAgICMgQWJzb2x1dGUgcGF0aCwgZG8gbm90aGluZy4KKyAgICA7OworICAgICopCisgICAgICAjIFJlbGF0aXZlIHBhdGgsIHByZXBlbmQgJGN3ZC4KKyAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YHB3ZGAvJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgKKyAgICA7OworICBlc2FjCisgICMgQ2FuY2VsIG91dCBhbGwgdGhlIHNpbXBsZSBzdHVmZiB0byBzYXZlIGl0ZXJhdGlvbnMuICBXZSBhbHNvIHdhbnQKKyAgIyB0aGUgcGF0aCB0byBlbmQgd2l0aCBhIHNsYXNoIGZvciBlYXNlIG9mIHBhcnNpbmcsIHNvIG1ha2Ugc3VyZQorICAjIHRoZXJlIGlzIG9uZSAoYW5kIG9ubHkgb25lKSBoZXJlLgorICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCisgICAgICAgIC1lICIkcmVtb3ZlZG90cGFydHMiIC1lICIkY29sbGFwc2VzbGFzaGVzIiAtZSAiJGZpbmFsc2xhc2giYAorICB3aGlsZSA6OyBkbworICAgICMgUHJvY2Vzc2VkIGl0IGFsbCB5ZXQ/CisgICAgaWYgdGVzdCAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiID0gLyA7IHRoZW4KKyAgICAgICMgSWYgd2UgYXNjZW5kZWQgdG8gdGhlIHJvb3QgdXNpbmcgIi4uIiB0aGUgcmVzdWx0IG1heSBiZSBlbXB0eSBub3cuCisgICAgICBpZiB0ZXN0IC16ICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiIDsgdGhlbgorICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0vCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAorICAgICAgICAtZSAiJHBhdGhjYXIiYAorICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKKyAgICAgICAgLWUgIiRwYXRoY2RyImAKKyAgICAjIEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGl0CisgICAgY2FzZSAkZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50IGluCisgICAgICAiIikKKyAgICAgICAgIyBUcmFpbGluZyBlbXB0eSBwYXRoIGNvbXBvbmVudCwgaWdub3JlIGl0LgorICAgICAgOzsKKyAgICAgIC4uKQorICAgICAgICAjIFBhcmVudCBkaXI7IHN0cmlwIGxhc3QgYXNzZW1ibGVkIGNvbXBvbmVudCBmcm9tIHJlc3VsdC4KKyAgICAgICAgZnVuY19kaXJuYW1lICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiCisgICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX2Rpcm5hbWVfcmVzdWx0CisgICAgICA7OworICAgICAgKikKKyAgICAgICAgIyBBY3R1YWwgcGF0aCBjb21wb25lbnQsIGFwcGVuZCBpdC4KKyAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0LyRmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgICMgUmVzdG9yZSBsZWFkaW5nIGRvdWJsZS1zbGFzaCBpZiBvbmUgd2FzIGZvdW5kIG9uIGVudHJ5LgorICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2UkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKK30KKworIyBmdW5jX3JlbGF0aXZlX3BhdGggU1JDRElSIERTVERJUgorIyBnZW5lcmF0ZXMgYSByZWxhdGl2ZSBwYXRoIGZyb20gU1JDRElSIHRvIERTVERJUiwgd2l0aCBhIHRyYWlsaW5nCisjIHNsYXNoIGlmIG5vbi1lbXB0eSwgc3VpdGFibGUgZm9yIGltbWVkaWF0ZWx5IGFwcGVuZGluZyBhIGZpbGVuYW1lCisjIHdpdGhvdXQgbmVlZGluZyB0byBhcHBlbmQgYSBzZXBhcmF0b3IuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCIKK2Z1bmNfcmVsYXRpdmVfcGF0aCAoKQoreworICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PQorICBmdW5jX25vcm1hbF9hYnNwYXRoICIkMSIKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXI9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0CisgIGZ1bmNfbm9ybWFsX2Fic3BhdGggIiQyIgorICBmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpcj0kZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQKKworICAjIEFzY2VuZCB0aGUgdHJlZSBzdGFydGluZyBmcm9tIGxpYmRpcgorICB3aGlsZSA6OyBkbworICAgICMgY2hlY2sgaWYgd2UgaGF2ZSBmb3VuZCBhIHByZWZpeCBvZiBiaW5kaXIKKyAgICBjYXNlICRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpciBpbgorICAgICAgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyKQorICAgICAgICAjIGZvdW5kIGFuIGV4YWN0IG1hdGNoCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPQorICAgICAgICBicmVhaworICAgICAgICA7OworICAgICAgJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyKikKKyAgICAgICAgIyBmb3VuZCBhIG1hdGNoaW5nIHByZWZpeAorICAgICAgICBmdW5jX3N0cmlwbmFtZSAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyIiAnJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyIgorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0IjsgdGhlbgorICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9LgorICAgICAgICBmaQorICAgICAgICBicmVhaworICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgZnVuY19kaXJuYW1lICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcgorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcj0ke2Z1bmNfZGlybmFtZV9yZXN1bHR9CisgICAgICAgIGlmIHRlc3QgIngkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIiID0geCA7IHRoZW4KKyAgICAgICAgICAjIEhhdmUgdG8gZGVzY2VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCEKKyAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4uLyRmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0CisgICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9JGZ1bmNfcmVsYXRpdmVfcGF0aF90YmluZGlyCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uLi8kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdAorICAgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgTm93IGNhbGN1bGF0ZSBwYXRoOyB0YWtlIGNhcmUgdG8gYXZvaWQgZG91YmxpbmctdXAgc2xhc2hlcy4KKyAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCIKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgIGZ1bmNfc3RyaXBuYW1lICcvJyAnLycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZCIKKyAgaWYgdGVzdCAieCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiICE9IHggOyB0aGVuCisgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0ke2Z1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHR9LyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fQorICBmaQorCisgICMgTm9ybWFsaXNhdGlvbi4gSWYgYmluZGlyIGlzIGxpYmRpciwgcmV0dXJuIGVtcHR5IHN0cmluZywKKyAgIyBlbHNlIHJlbGF0aXZlIHBhdGggZW5kaW5nIHdpdGggYSBzbGFzaDsgZWl0aGVyIHdheSwgdGFyZ2V0CisgICMgZmlsZSBuYW1lIGNhbiBiZSBkaXJlY3RseSBhcHBlbmRlZC4KKyAgaWYgdGVzdCAhIC16ICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCI7IHRoZW4KKyAgICBmdW5jX3N0cmlwbmFtZSAnLi8nICcnICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdC8iCisgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgIGZpCit9CisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJHByb2dwYXRoIgorcHJvZ25hbWU9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisKKyMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCBmb3IgcmVleGVjdXRpb246CitjYXNlICRwcm9ncGF0aCBpbgorICBbXFwvXSp8W0EtWmEtel06XFwqKSA7OworICAqW1xcL10qKQorICAgICBwcm9nZGlyPSRmdW5jX2Rpcm5hbWVfcmVzdWx0CisgICAgIHByb2dkaXI9YGNkICIkcHJvZ2RpciIgJiYgcHdkYAorICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgorICAgICA7OworICAqKQorICAgICBzYXZlX0lGUz0iJElGUyIKKyAgICAgSUZTPToKKyAgICAgZm9yIHByb2dkaXIgaW4gJFBBVEg7IGRvCisgICAgICAgSUZTPSIkc2F2ZV9JRlMiCisgICAgICAgdGVzdCAteCAiJHByb2dkaXIvJHByb2duYW1lIiAmJiBicmVhaworICAgICBkb25lCisgICAgIElGUz0iJHNhdmVfSUZTIgorICAgICB0ZXN0IC1uICIkcHJvZ2RpciIgfHwgcHJvZ2Rpcj1gcHdkYAorICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgorICAgICA7OworZXNhYworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtgIiRcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woWyJgXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCB0dXJucyBhIHN0cmluZyBpbnRvIGEgcmVnZXggbWF0Y2hpbmcgZm9yIHRoZQorIyBzdHJpbmcgbGl0ZXJhbGx5Lgorc2VkX21ha2VfbGl0ZXJhbF9yZWdleD0ncyxbXS5bXiRcXCpcL10sXFwmLGcnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGNvbnZlcnRzIGEgdzMyIGZpbGUgbmFtZSBvciBwYXRoCisjIHdoaWNoIGNvbnRhaW5zIGZvcndhcmQgc2xhc2hlcywgaW50byBvbmUgdGhhdCBjb250YWlucworIyAoZXNjYXBlZCkgYmFja3NsYXNoZXMuICBBIHZlcnkgbmFpdmUgaW1wbGVtZW50YXRpb24uCitsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5PSdzfFxcXFwqfFxcfGc7c3wvfFxcfGc7c3xcXHxcXFxcfGcnCisKKyMgUmUtYFwnIHBhcmFtZXRlciBleHBhbnNpb25zIGluIG91dHB1dCBvZiBkb3VibGVfcXVvdGVfc3Vic3QgdGhhdCB3ZXJlCisjIGBcJy1lZCBpbiBpbnB1dCB0byB0aGUgc2FtZS4gIElmIGFuIG9kZCBudW1iZXIgb2YgYFwnIHByZWNlZGVkIGEgJyQnCisjIGluIGlucHV0IHRvIGRvdWJsZV9xdW90ZV9zdWJzdCwgdGhhdCAnJCcgd2FzIHByb3RlY3RlZCBmcm9tIGV4cGFuc2lvbi4KKyMgU2luY2UgZWFjaCBpbnB1dCBgXCcgaXMgbm93IHR3byBgXCdzLCBsb29rIGZvciBhbnkgbnVtYmVyIG9mIHJ1bnMgb2YKKyMgZm91ciBgXCdzIGZvbGxvd2VkIGJ5IHR3byBgXCdzIGFuZCB0aGVuIGEgJyQnLiAgYFwnIHRoYXQgJyQnLgorYnM9J1xcJworYnMyPSdcXFxcJworYnM0PSdcXFxcXFxcXCcKK2RvbGxhcj0nXCQnCitzZWRfZG91YmxlX2JhY2tzbGFzaD0iXAorICBzLyRiczQvJlxcCisvZworICBzL14kYnMyJGRvbGxhci8kYnMmLworICBzL1xcKFteJGJzXVxcKSRiczIkZG9sbGFyL1xcMSRiczIkYnMkZG9sbGFyL2cKKyAgcy9cbi8vZyIKKworIyBTdGFuZGFyZCBvcHRpb25zOgorb3B0X2RyeV9ydW49ZmFsc2UKK29wdF9oZWxwPWZhbHNlCitvcHRfcXVpZXQ9ZmFsc2UKK29wdF92ZXJib3NlPWZhbHNlCitvcHRfd2FybmluZz06CisKKyMgZnVuY19lY2hvIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IG1vZGUKKyMgbmFtZSBpZiBpdCBoYXMgYmVlbiBzZXQgeWV0LgorZnVuY19lY2hvICgpCit7CisgICAgJEVDSE8gIiRwcm9nbmFtZTogJHtvcHRfbW9kZSskb3B0X21vZGU6IH0kKiIKK30KKworIyBmdW5jX3ZlcmJvc2UgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgaW4gdmVyYm9zZSBtb2RlIG9ubHkuCitmdW5jX3ZlcmJvc2UgKCkKK3sKKyAgICAkb3B0X3ZlcmJvc2UgJiYgZnVuY19lY2hvICR7MSsiJEAifQorCisgICAgIyBBIGJ1ZyBpbiBiYXNoIGhhbHRzIHRoZSBzY3JpcHQgaWYgdGhlIGxhc3QgbGluZSBvZiBhIGZ1bmN0aW9uCisgICAgIyBmYWlscyB3aGVuIHNldCAtZSBpcyBpbiBmb3JjZSwgc28gd2UgbmVlZCBhbm90aGVyIGNvbW1hbmQgdG8KKyAgICAjIHdvcmsgYXJvdW5kIHRoYXQ6CisgICAgOgorfQorCisjIGZ1bmNfZWNob19hbGwgYXJnLi4uCisjIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCitmdW5jX2VjaG9fYWxsICgpCit7CisgICAgJEVDSE8gIiQqIgorfQorCisjIGZ1bmNfZXJyb3IgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCitmdW5jX2Vycm9yICgpCit7CisgICAgJEVDSE8gIiRwcm9nbmFtZTogJHtvcHRfbW9kZSskb3B0X21vZGU6IH0iJHsxKyIkQCJ9IDE+JjIKK30KKworIyBmdW5jX3dhcm5pbmcgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIHdhcm5pbmcgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KK2Z1bmNfd2FybmluZyAoKQoreworICAgICRvcHRfd2FybmluZyAmJiAkRUNITyAiJHByb2duYW1lOiAke29wdF9tb2RlKyRvcHRfbW9kZTogfXdhcm5pbmc6ICIkezErIiRAIn0gMT4mMgorCisgICAgIyBiYXNoIGJ1ZyBhZ2FpbjoKKyAgICA6Cit9CisKKyMgZnVuY19mYXRhbF9lcnJvciBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2Vycm9yICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKK30KKworIyBmdW5jX2ZhdGFsX2hlbHAgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGZvbGxvd2VkIGJ5CisjIGEgaGVscCBoaW50LCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfaGVscCAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZnVuY19mYXRhbF9lcnJvciAiJGhlbHAiCit9CitoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iICAjIyBkZWZhdWx0CisKKworIyBmdW5jX2dyZXAgZXhwcmVzc2lvbiBmaWxlbmFtZQorIyBDaGVjayB3aGV0aGVyIEVYUFJFU1NJT04gbWF0Y2hlcyBhbnkgbGluZSBvZiBGSUxFTkFNRSwgd2l0aG91dCBvdXRwdXQuCitmdW5jX2dyZXAgKCkKK3sKKyAgICAkR1JFUCAiJDEiICIkMiIgPi9kZXYvbnVsbCAyPiYxCit9CisKKworIyBmdW5jX21rZGlyX3AgZGlyZWN0b3J5LXBhdGgKKyMgTWFrZSBzdXJlIHRoZSBlbnRpcmUgcGF0aCB0byBESVJFQ1RPUlktUEFUSCBpcyBhdmFpbGFibGUuCitmdW5jX21rZGlyX3AgKCkKK3sKKyAgICBteV9kaXJlY3RvcnlfcGF0aD0iJDEiCisgICAgbXlfZGlyX2xpc3Q9CisKKyAgICBpZiB0ZXN0IC1uICIkbXlfZGlyZWN0b3J5X3BhdGgiICYmIHRlc3QgIiRvcHRfZHJ5X3J1biIgIT0gIjoiOyB0aGVuCisKKyAgICAgICMgUHJvdGVjdCBkaXJlY3RvcnkgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScKKyAgICAgIGNhc2UgJG15X2RpcmVjdG9yeV9wYXRoIGluCisgICAgICAgIC0qKSBteV9kaXJlY3RvcnlfcGF0aD0iLi8kbXlfZGlyZWN0b3J5X3BhdGgiIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgV2hpbGUgc29tZSBwb3J0aW9uIG9mIERJUiBkb2VzIG5vdCB5ZXQgZXhpc3QuLi4KKyAgICAgIHdoaWxlIHRlc3QgISAtZCAiJG15X2RpcmVjdG9yeV9wYXRoIjsgZG8KKyAgICAgICAgIyAuLi5tYWtlIGEgbGlzdCBpbiB0b3Btb3N0IGZpcnN0IG9yZGVyLiAgVXNlIGEgY29sb24gZGVsaW1pdGVkCisJIyBsaXN0IGluY2FzZSBzb21lIHBvcnRpb24gb2YgcGF0aCBjb250YWlucyB3aGl0ZXNwYWNlLgorICAgICAgICBteV9kaXJfbGlzdD0iJG15X2RpcmVjdG9yeV9wYXRoOiRteV9kaXJfbGlzdCIKKworICAgICAgICAjIElmIHRoZSBsYXN0IHBvcnRpb24gYWRkZWQgaGFzIG5vIHNsYXNoIGluIGl0LCB0aGUgbGlzdCBpcyBkb25lCisgICAgICAgIGNhc2UgJG15X2RpcmVjdG9yeV9wYXRoIGluICovKikgOzsgKikgYnJlYWsgOzsgZXNhYworCisgICAgICAgICMgLi4ub3RoZXJ3aXNlIHRocm93IGF3YXkgdGhlIGNoaWxkIGRpcmVjdG9yeSBhbmQgbG9vcAorICAgICAgICBteV9kaXJlY3RvcnlfcGF0aD1gJEVDSE8gIiRteV9kaXJlY3RvcnlfcGF0aCIgfCAkU0VEIC1lICIkZGlybmFtZSJgCisgICAgICBkb25lCisgICAgICBteV9kaXJfbGlzdD1gJEVDSE8gIiRteV9kaXJfbGlzdCIgfCAkU0VEICdzLDoqJCwsJ2AKKworICAgICAgc2F2ZV9ta2Rpcl9wX0lGUz0iJElGUyI7IElGUz0nOicKKyAgICAgIGZvciBteV9kaXIgaW4gJG15X2Rpcl9saXN0OyBkbworCUlGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCisgICAgICAgICMgbWtkaXIgY2FuIGZhaWwgd2l0aCBhIGBGaWxlIGV4aXN0JyBlcnJvciBpZiB0d28gcHJvY2Vzc2VzCisgICAgICAgICMgdHJ5IHRvIGNyZWF0ZSBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIGNvbmN1cnJlbnRseS4gIERvbid0CisgICAgICAgICMgc3RvcCBpbiB0aGF0IGNhc2UhCisgICAgICAgICRNS0RJUiAiJG15X2RpciIgMj4vZGV2L251bGwgfHwgOgorICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9ta2Rpcl9wX0lGUyIKKworICAgICAgIyBCYWlsIG91dCBpZiB3ZSAob3Igc29tZSBvdGhlciBwcm9jZXNzKSBmYWlsZWQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgorICAgICAgdGVzdCAtZCAiJG15X2RpcmVjdG9yeV9wYXRoIiB8fCBcCisgICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgIkZhaWxlZCB0byBjcmVhdGUgXGAkMSciCisgICAgZmkKK30KKworCisjIGZ1bmNfbWt0ZW1wZGlyIFtzdHJpbmddCisjIE1ha2UgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd29uJ3QgY2xhc2ggd2l0aCBvdGhlciBydW5uaW5nCisjIGxpYnRvb2wgcHJvY2Vzc2VzLCBhbmQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucyBpZiBwb3NzaWJsZS4gIElmCisjIGdpdmVuLCBTVFJJTkcgaXMgdGhlIGJhc2VuYW1lIGZvciB0aGF0IGRpcmVjdG9yeS4KK2Z1bmNfbWt0ZW1wZGlyICgpCit7CisgICAgbXlfdGVtcGxhdGU9IiR7VE1QRElSLS90bXB9LyR7MS0kcHJvZ25hbWV9IgorCisgICAgaWYgdGVzdCAiJG9wdF9kcnlfcnVuIiA9ICI6IjsgdGhlbgorICAgICAgIyBSZXR1cm4gYSBkaXJlY3RvcnkgbmFtZSwgYnV0IGRvbid0IGNyZWF0ZSBpdCBpbiBkcnktcnVuIG1vZGUKKyAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJCQiCisgICAgZWxzZQorCisgICAgICAjIElmIG1rdGVtcCB3b3JrcywgdXNlIHRoYXQgZmlyc3QgYW5kIGZvcmVtb3N0CisgICAgICBteV90bXBkaXI9YG1rdGVtcCAtZCAiJHtteV90ZW1wbGF0ZX0tWFhYWFhYWFgiIDI+L2Rldi9udWxsYAorCisgICAgICBpZiB0ZXN0ICEgLWQgIiRteV90bXBkaXIiOyB0aGVuCisgICAgICAgICMgRmFpbGluZyB0aGF0LCBhdCBsZWFzdCB0cnkgYW5kIHVzZSAkUkFORE9NIHRvIGF2b2lkIGEgcmFjZQorICAgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSR7UkFORE9NLTB9JCQiCisKKyAgICAgICAgc2F2ZV9ta3RlbXBkaXJfdW1hc2s9YHVtYXNrYAorICAgICAgICB1bWFzayAwMDc3CisgICAgICAgICRNS0RJUiAiJG15X3RtcGRpciIKKyAgICAgICAgdW1hc2sgJHNhdmVfbWt0ZW1wZGlyX3VtYXNrCisgICAgICBmaQorCisgICAgICAjIElmIHdlJ3JlIG5vdCBpbiBkcnktcnVuIG1vZGUsIGJvbWIgb3V0IG9uIGZhaWx1cmUKKyAgICAgIHRlc3QgLWQgIiRteV90bXBkaXIiIHx8IFwKKyAgICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJG15X3RtcGRpciciCisgICAgZmkKKworICAgICRFQ0hPICIkbXlfdG1wZGlyIgorfQorCisKKyMgZnVuY19xdW90ZV9mb3JfZXZhbCBhcmcKKyMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyLgorIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHdvIHZhbHVlczogRlVOQ19RVU9URV9GT1JfRVZBTF9SRVNVTFQKKyMgaXMgZG91YmxlLXF1b3RlZCwgc3VpdGFibGUgZm9yIGEgc3Vic2VxdWVudCBldmFsLCB3aGVyZWFzCisjIEZVTkNfUVVPVEVfRk9SX0VWQUxfVU5RVU9URURfUkVTVUxUIGhhcyBtZXJlbHkgYWxsIGNoYXJhY3RlcnMKKyMgd2hpY2ggYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlIHF1b3RlcyBiYWNrc2xhc2hpZmllZC4KK2Z1bmNfcXVvdGVfZm9yX2V2YWwgKCkKK3sKKyAgICBjYXNlICQxIGluCisgICAgICAqW1xcXGBcIlwkXSopCisJZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9YCRFQ0hPICIkMSIgfCAkU0VEICIkc2VkX3F1b3RlX3N1YnN0ImAgOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PSIkMSIgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdCBpbgorICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5CisgICAgICAjIHdvcmQgc3BsaXR0aW5nLCBjb21tYW5kIHN1YnN0aXR1dGlvbiBhbmQgYW5kIHZhcmlhYmxlCisgICAgICAjIGV4cGFuc2lvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iXCIkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHRcIiIKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0PSIkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQiCisgICAgZXNhYworfQorCisKKyMgZnVuY19xdW90ZV9mb3JfZXhwYW5kIGFyZworIyBBZXN0aGV0aWNhbGx5IHF1b3RlIEFSRyB0byBiZSBldmFsZWQgbGF0ZXI7IHNhbWUgYXMgYWJvdmUsCisjIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2Z1bmNfcXVvdGVfZm9yX2V4cGFuZCAoKQoreworICAgIGNhc2UgJDEgaW4KKyAgICAgICpbXFxcYFwiXSopCisJbXlfYXJnPWAkRUNITyAiJDEiIHwgJFNFRCBcCisJICAgIC1lICIkZG91YmxlX3F1b3RlX3N1YnN0IiAtZSAiJHNlZF9kb3VibGVfYmFja3NsYXNoImAgOzsKKyAgICAgICopCisgICAgICAgIG15X2FyZz0iJDEiIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkbXlfYXJnIGluCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gZGVsYXkKKyAgICAgICMgd29yZCBzcGxpdHRpbmcgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGZvciBhIHN1YnNlcXVlbnQgZXZhbC4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisgICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisgICAgICAgIG15X2FyZz0iXCIkbXlfYXJnXCIiCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdD0iJG15X2FyZyIKK30KKworCisjIGZ1bmNfc2hvd19ldmFsIGNtZCBbZmFpbF9leHBdCisjIFVubGVzcyBvcHRfc2lsZW50IGlzIHRydWUsIHRoZW4gb3V0cHV0IENNRC4gIFRoZW4sIGlmIG9wdF9kcnlydW4gaXMKKyMgbm90IHRydWUsIGV2YWx1YXRlIENNRC4gIElmIHRoZSBldmFsdWF0aW9uIG9mIENNRCBmYWlscywgYW5kIEZBSUxfRVhQCisjIGlzIGdpdmVuLCB0aGVuIGV2YWx1YXRlIGl0LgorZnVuY19zaG93X2V2YWwgKCkKK3sKKyAgICBteV9jbWQ9IiQxIgorICAgIG15X2ZhaWxfZXhwPSIkezItOn0iCisKKyAgICAke29wdF9zaWxlbnQtZmFsc2V9IHx8IHsKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJG15X2NtZCIKKyAgICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKyAgICB9CisKKyAgICBpZiAke29wdF9kcnlfcnVuLWZhbHNlfTsgdGhlbiA6OyBlbHNlCisgICAgICBldmFsICIkbXlfY21kIgorICAgICAgbXlfc3RhdHVzPSQ/CisgICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCisJZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKKyAgICAgIGZpCisgICAgZmkKK30KKworCisjIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSBjbWQgW2ZhaWxfZXhwXQorIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCisjIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAorIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4gIFVzZSB0aGUgc2F2ZWQgbG9jYWxlIGZvciBldmFsdWF0aW9uLgorZnVuY19zaG93X2V2YWxfbG9jYWxlICgpCit7CisgICAgbXlfY21kPSIkMSIKKyAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgorCisgICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7CisgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCisgICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisgICAgfQorCisgICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQorICAgICAgZXZhbCAiJGx0X3VzZXJfbG9jYWxlCisJICAgICRteV9jbWQiCisgICAgICBteV9zdGF0dXM9JD8KKyAgICAgIGV2YWwgIiRsdF9zYWZlX2xvY2FsZSIKKyAgICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1lcSAwOyB0aGVuIDo7IGVsc2UKKwlldmFsICIoZXhpdCAkbXlfc3RhdHVzKTsgJG15X2ZhaWxfZXhwIgorICAgICAgZmkKKyAgICBmaQorfQorCisjIGZ1bmNfdHJfc2gKKyMgVHVybiAkMSBpbnRvIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBhIHNoZWxsIHZhcmlhYmxlIG5hbWUuCisjIFJlc3VsdCBpcyBzdG9yZWQgaW4gJGZ1bmNfdHJfc2hfcmVzdWx0LiAgQWxsIGNoYXJhY3RlcnMKKyMgbm90IGluIHRoZSBzZXQgYS16QS1aMC05XyBhcmUgcmVwbGFjZWQgd2l0aCAnXycuIEZ1cnRoZXIsCisjIGlmICQxIGJlZ2lucyB3aXRoIGEgZGlnaXQsIGEgJ18nIGlzIHByZXBlbmRlZCBhcyB3ZWxsLgorZnVuY190cl9zaCAoKQoreworICBjYXNlICQxIGluCisgIFswLTldKiB8ICpbIWEtekEtWjAtOV9dKikKKyAgICBmdW5jX3RyX3NoX3Jlc3VsdD1gJEVDSE8gIiQxIiB8ICRTRUQgJ3MvXlwoWzAtOV1cKS9fXDEvOyBzL1teYS16QS1aMC05X10vXy9nJ2AKKyAgICA7OworICAqICkKKyAgICBmdW5jX3RyX3NoX3Jlc3VsdD0kMQorICAgIDs7CisgIGVzYWMKK30KKworCisjIGZ1bmNfdmVyc2lvbgorIyBFY2hvIHZlcnNpb24gbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCitmdW5jX3ZlcnNpb24gKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICAkU0VEIC1uICcvKEMpLyFiIGdvCisJOm1vcmUKKwkvXC4vIXsKKwkgIE4KKwkgIHMvXG4jIC8gLworCSAgYiBtb3JlCisJfQorCTpnbworCS9eIyAnJFBST0dSQU0nIChHTlUgLywvIyB3YXJyYW50eTsgLyB7CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKyAgICAgICAgcy9cKChDKVwpWyAwLTksLV0qXCggWzEtOV1bMC05XSpcKS9cMVwyLworICAgICAgICBwCisgICAgIH0nIDwgIiRwcm9ncGF0aCIKKyAgICAgZXhpdCAkPworfQorCisjIGZ1bmNfdXNhZ2UKKyMgRWNobyBzaG9ydCBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorZnVuY191c2FnZSAoKQoreworICAgICRvcHRfZGVidWcKKworICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC9eIyAgKi4qLS1oZWxwLyB7CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKwlzL1wkcHJvZ25hbWUvJyRwcm9nbmFtZScvCisJcAorICAgIH0nIDwgIiRwcm9ncGF0aCIKKyAgICBlY2hvCisgICAgJEVDSE8gInJ1biBcYCRwcm9nbmFtZSAtLWhlbHAgfCBtb3JlJyBmb3IgZnVsbCB1c2FnZSIKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19oZWxwIFtOT0VYSVRdCisjIEVjaG8gbG9uZyBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LAorIyB1bmxlc3MgJ25vZXhpdCcgaXMgcGFzc2VkIGFzIGFyZ3VtZW50LgorZnVuY19oZWxwICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgJFNFRCAtbiAnL14jIFVzYWdlOi8sLyMgUmVwb3J0IGJ1Z3MgdG8vIHsKKwk6cHJpbnQKKyAgICAgICAgcy9eIyAvLworCXMvXiMgKiQvLworCXMqXCRwcm9nbmFtZSonJHByb2duYW1lJyoKKwlzKlwkaG9zdConIiRob3N0IicqCisJcypcJFNIRUxMKiciJFNIRUxMIicqCisJcypcJExUQ0MqJyIkTFRDQyInKgorCXMqXCRMVENGTEFHUyonIiRMVENGTEFHUyInKgorCXMqXCRMRConIiRMRCInKgorCXMvXCR3aXRoX2dudV9sZC8nIiR3aXRoX2dudV9sZCInLworCXMvXCRhdXRvbWFrZV92ZXJzaW9uLyciYChhdXRvbWFrZSAtLXZlcnNpb24pIDI+L2Rldi9udWxsIHwkU0VEIDFxYCInLworCXMvXCRhdXRvY29uZl92ZXJzaW9uLyciYChhdXRvY29uZiAtLXZlcnNpb24pIDI+L2Rldi9udWxsIHwkU0VEIDFxYCInLworCXAKKwlkCisgICAgIH0KKyAgICAgL14jIC4qIGhvbWUgcGFnZTovYiBwcmludAorICAgICAvXiMgR2VuZXJhbCBoZWxwIHVzaW5nL2IgcHJpbnQKKyAgICAgJyA8ICIkcHJvZ3BhdGgiCisgICAgcmV0PSQ/CisgICAgaWYgdGVzdCAteiAiJDEiOyB0aGVuCisgICAgICBleGl0ICRyZXQKKyAgICBmaQorfQorCisjIGZ1bmNfbWlzc2luZ19hcmcgYXJnbmFtZQorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yIGFuZCBzZXQgZ2xvYmFsCisjIGV4aXRfY21kLgorZnVuY19taXNzaW5nX2FyZyAoKQoreworICAgICRvcHRfZGVidWcKKworICAgIGZ1bmNfZXJyb3IgIm1pc3NpbmcgYXJndW1lbnQgZm9yICQxLiIKKyAgICBleGl0X2NtZD1leGl0Cit9CisKKworIyBmdW5jX3NwbGl0X3Nob3J0X29wdCBzaG9ydG9wdAorIyBTZXQgZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZSBhbmQgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIHNoZWxsCisjIHZhcmlhYmxlcyBhZnRlciBzcGxpdHRpbmcgU0hPUlRPUFQgYWZ0ZXIgdGhlIDJuZCBjaGFyYWN0ZXIuCitmdW5jX3NwbGl0X3Nob3J0X29wdCAoKQoreworICAgIG15X3NlZF9zaG9ydF9vcHQ9JzFzL15cKC4uXCkuKiQvXDEvO3EnCisgICAgbXlfc2VkX3Nob3J0X3Jlc3Q9JzFzL14uLlwoLipcKSQvXDEvO3EnCisKKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9zaG9ydF9vcHQiYAorICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfc2hvcnRfcmVzdCJgCit9ICMgZnVuY19zcGxpdF9zaG9ydF9vcHQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX3NwbGl0X2xvbmdfb3B0IGxvbmdvcHQKKyMgU2V0IGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZSBhbmQgZnVuY19zcGxpdF9sb25nX29wdF9hcmcgc2hlbGwKKyMgdmFyaWFibGVzIGFmdGVyIHNwbGl0dGluZyBMT05HT1BUIGF0IHRoZSBgPScgc2lnbi4KK2Z1bmNfc3BsaXRfbG9uZ19vcHQgKCkKK3sKKyAgICBteV9zZWRfbG9uZ19vcHQ9JzFzL15cKC0tW149XSpcKT0uKi9cMS87cScKKyAgICBteV9zZWRfbG9uZ19hcmc9JzFzL14tLVtePV0qPS8vJworCisgICAgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9sb25nX29wdCJgCisgICAgZnVuY19zcGxpdF9sb25nX29wdF9hcmc9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX2xvbmdfYXJnImAKK30gIyBmdW5jX3NwbGl0X2xvbmdfb3B0IG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCitleGl0X2NtZD06CisKKworCisKKworbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWFnaWNfZXhlPSIlJSVNQUdJQyBFWEUgdmFyaWFibGUlJSUiCisKKyMgR2xvYmFsIHZhcmlhYmxlcy4KK25vbm9wdD0KK3ByZXNlcnZlX2FyZ3M9CitsbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCitvMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCitleHRyYWN0ZWRfYXJjaGl2ZXM9CitleHRyYWN0ZWRfc2VyaWFsPTAKKworIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0CisjIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKKyMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KK2V4ZWNfY21kPQorCisjIGZ1bmNfYXBwZW5kIHZhciB2YWx1ZQorIyBBcHBlbmQgVkFMVUUgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIuCitmdW5jX2FwcGVuZCAoKQoreworICAgIGV2YWwgIiR7MX09XCQkezF9XCR7Mn0iCit9ICMgZnVuY19hcHBlbmQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKyMgZnVuY19hcHBlbmRfcXVvdGVkIHZhciB2YWx1ZQorIyBRdW90ZSBWQUxVRSBhbmQgYXBwZW5kIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLCBzZXBhcmF0ZWQKKyMgYnkgYSBzcGFjZS4KK2Z1bmNfYXBwZW5kX3F1b3RlZCAoKQoreworICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR7Mn0iCisgICAgZXZhbCAiJHsxfT1cJCR7MX1cXCBcJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorfSAjIGZ1bmNfYXBwZW5kX3F1b3RlZCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfYXJpdGggYXJpdGhtZXRpYy10ZXJtLi4uCitmdW5jX2FyaXRoICgpCit7CisgICAgZnVuY19hcml0aF9yZXN1bHQ9YGV4cHIgIiR7QH0iYAorfSAjIGZ1bmNfYXJpdGggbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2xlbiBzdHJpbmcKKyMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KK2Z1bmNfbGVuICgpCit7CisgICAgZnVuY19sZW5fcmVzdWx0PWBleHByICIkezF9IiA6ICIuKiIgMj4vZGV2L251bGwgfHwgZWNobyAkbWF4X2NtZF9sZW5gCit9ICMgZnVuY19sZW4gbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2xvMm8gb2JqZWN0CitmdW5jX2xvMm8gKCkKK3sKKyAgICBmdW5jX2xvMm9fcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICIkbG8ybyJgCit9ICMgZnVuY19sbzJvIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY194Zm9ybSBsaWJvYmotb3Itc291cmNlCitmdW5jX3hmb3JtICgpCit7CisgICAgZnVuY194Zm9ybV9yZXN1bHQ9YCRFQ0hPICIkezF9IiB8ICRTRUQgJ3MvXC5bXi5dKiQvLmxvLydgCit9ICMgZnVuY194Zm9ybSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKKyMgYSBjb25maWd1cmF0aW9uIGZhaWx1cmUgaGludCwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGZ1bmNfZXJyb3IgIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgICAgZnVuY19mYXRhbF9lcnJvciAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4iCit9CisKKworIyBmdW5jX2NvbmZpZworIyBEaXNwbGF5IHRoZSBjb25maWd1cmF0aW9uIGZvciBhbGwgdGhlIHRhZ3MgaW4gdGhpcyBzY3JpcHQuCitmdW5jX2NvbmZpZyAoKQoreworICAgIHJlX2JlZ2luY2Y9J14jICMjIyBCRUdJTiBMSUJUT09MJworICAgIHJlX2VuZGNmPSdeIyAjIyMgRU5EIExJQlRPT0wnCisKKyAgICAjIERlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAkU0VEICIxLC8kcmVfYmVnaW5jZiBDT05GSUcvZDsvJHJlX2VuZGNmIENPTkZJRy8sXCRkIiA8ICIkcHJvZ3BhdGgiCisKKyAgICAjIE5vdyBwcmludCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0YWdzLgorICAgIGZvciB0YWduYW1lIGluICR0YWdsaXN0OyBkbworICAgICAgJFNFRCAtbiAiLyRyZV9iZWdpbmNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvLC8kcmVfZW5kY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC9wIiA8ICIkcHJvZ3BhdGgiCisgICAgZG9uZQorCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfZmVhdHVyZXMKKyMgRGlzcGxheSB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorZnVuY19mZWF0dXJlcyAoKQoreworICAgIGVjaG8gImhvc3Q6ICRob3N0IgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBlY2hvICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBlbHNlCisgICAgICBlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBlbHNlCisgICAgICBlY2hvICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZmkKKworICAgIGV4aXQgJD8KK30KKworIyBmdW5jX2VuYWJsZV90YWcgdGFnbmFtZQorIyBWZXJpZnkgdGhhdCBUQUdOQU1FIGlzIHZhbGlkLCBhbmQgZWl0aGVyIGZsYWcgYW4gZXJyb3IgYW5kIGV4aXQsIG9yCisjIGVuYWJsZSB0aGUgVEFHTkFNRSB0YWcuICBXZSBhbHNvIGFkZCBUQUdOQU1FIHRvIHRoZSBnbG9iYWwgJHRhZ2xpc3QKKyMgdmFyaWFibGUgaGVyZS4KK2Z1bmNfZW5hYmxlX3RhZyAoKQoreworICAjIEdsb2JhbCB2YXJpYWJsZToKKyAgdGFnbmFtZT0iJDEiCisKKyAgcmVfYmVnaW5jZj0iXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVcJCIKKyAgcmVfZW5kY2Y9Il4jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgorICBzZWRfZXh0cmFjdGNmPSIvJHJlX2JlZ2luY2YvLC8kcmVfZW5kY2YvcCIKKworICAjIFZhbGlkYXRlIHRhZ25hbWUuCisgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAqWyEtX0EtWmEtejAtOSwvXSopCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJpbnZhbGlkIHRhZyBuYW1lOiAkdGFnbmFtZSIKKyAgICAgIDs7CisgIGVzYWMKKworICAjIERvbid0IHRlc3QgZm9yIHRoZSAiZGVmYXVsdCIgQyB0YWcsIGFzIHdlIGtub3cgaXQncworICAjIHRoZXJlIGJ1dCBub3Qgc3BlY2lhbGx5IG1hcmtlZC4KKyAgY2FzZSAkdGFnbmFtZSBpbgorICAgIENDKSA7OworICAgICopCisgICAgICBpZiAkR1JFUCAiJHJlX2JlZ2luY2YiICIkcHJvZ3BhdGgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCXRhZ2xpc3Q9IiR0YWdsaXN0ICR0YWduYW1lIgorCisJIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4gIEJlIGNhcmVmdWwgdG8gcXVvdGUgdGhlIHBhdGgKKwkjIGFuZCB0aGUgc2VkIHNjcmlwdCwgdG8gYXZvaWQgc3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UsIGJ1dAorCSMgYWxzbyBkb24ndCB1c2Ugbm9uLXBvcnRhYmxlIHF1b3RlcyB3aXRoaW4gYmFja3F1b3RlcyB3aXRoaW4KKwkjIHF1b3RlcyB3ZSBoYXZlIHRvIGRvIGl0IGluIDIgc3RlcHM6CisJZXh0cmFjdGVkY2Y9YCRTRUQgLW4gLWUgIiRzZWRfZXh0cmFjdGNmIiA8ICIkcHJvZ3BhdGgiYAorCWV2YWwgIiRleHRyYWN0ZWRjZiIKKyAgICAgIGVsc2UKKwlmdW5jX2Vycm9yICJpZ25vcmluZyB1bmtub3duIHRhZyAkdGFnbmFtZSIKKyAgICAgIGZpCisgICAgICA7OworICBlc2FjCit9CisKKyMgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCisjIEVuc3VyZSB0aGF0IHdlIGFyZSB1c2luZyBtNCBtYWNyb3MsIGFuZCBsaWJ0b29sIHNjcmlwdCBmcm9tIHRoZSBzYW1lCisjIHJlbGVhc2Ugb2YgbGlidG9vbC4KK2Z1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaCAoKQoreworICBpZiB0ZXN0ICIkcGFja2FnZV9yZXZpc2lvbiIgIT0gIiRtYWNyb19yZXZpc2lvbiI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkVkVSU0lPTiIgIT0gIiRtYWNyb192ZXJzaW9uIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJG1hY3JvX3ZlcnNpb24iOyB0aGVuCisgICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCiskcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gYW4gb2xkZXIgcmVsZWFzZS4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gJFBBQ0tBR0UgJFZFUlNJT04KKyRwcm9nbmFtZTogYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKKyRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIGJ1dCB0aGUKKyRwcm9nbmFtZTogZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSAkUEFDS0FHRSAkbWFjcm9fdmVyc2lvbi4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gJFBBQ0tBR0UgJFZFUlNJT04KKyRwcm9nbmFtZTogYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKKyRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIHJldmlzaW9uICRwYWNrYWdlX3JldmlzaW9uLAorJHByb2duYW1lOiBidXQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gcmV2aXNpb24gJG1hY3JvX3JldmlzaW9uLgorJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbgorJHByb2duYW1lOiBvZiAkUEFDS0FHRSAkVkVSU0lPTiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgorX0xUX0VPRgorICAgIGZpCisKKyAgICBleGl0ICRFWElUX01JU01BVENICisgIGZpCit9CisKKworIyBTaG9ydGhhbmQgZm9yIC0tbW9kZT1mb28sIG9ubHkgdmFsaWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50CitjYXNlICQxIGluCitjbGVhbnxjbGVhfGNsZXxjbCkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY2xlYW4gJHsxKyIkQCJ9OyBzaGlmdAorICA7OworY29tcGlsZXxjb21waWx8Y29tcGl8Y29tcHxjb218Y298YykKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY29tcGlsZSAkezErIiRAIn07IHNoaWZ0CisgIDs7CitleGVjdXRlfGV4ZWN1dHxleGVjdXxleGVjfGV4ZXxleHxlKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBleGVjdXRlICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2ZpbmlzaHxmaW5pc3xmaW5pfGZpbnxmaXxmKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAorICA7OworaW5zdGFsbHxpbnN0YWx8aW5zdGF8aW5zdHxpbnN8aW58aSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0CisgIDs7CitsaW5rfGxpbnxsaXxsKQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBsaW5rICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK3VuaW5zdGFsbHx1bmluc3RhbHx1bmluc3RhfHVuaW5zdHx1bmluc3x1bmlufHVuaXx1bnx1KQorICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSB1bmluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworZXNhYworCisKKworIyBPcHRpb24gZGVmYXVsdHM6CitvcHRfZGVidWc9Ogorb3B0X2RyeV9ydW49ZmFsc2UKK29wdF9jb25maWc9ZmFsc2UKK29wdF9wcmVzZXJ2ZV9kdXBfZGVwcz1mYWxzZQorb3B0X2ZlYXR1cmVzPWZhbHNlCitvcHRfZmluaXNoPWZhbHNlCitvcHRfaGVscD1mYWxzZQorb3B0X2hlbHBfYWxsPWZhbHNlCitvcHRfc2lsZW50PToKK29wdF92ZXJib3NlPToKK29wdF9zaWxlbnQ9ZmFsc2UKK29wdF92ZXJib3NlPWZhbHNlCisKKworIyBQYXJzZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuICBUaGlzIGNvbWVzIGFzIHNvb24gYXMgcG9zc2libGUgaW4gdGhlCisjIHNjcmlwdCB0byBtYWtlIHRoaW5ncyBsaWtlIGAtLXZlcnNpb24nIGhhcHBlbiBhcyBxdWlja2x5IGFzIHdlIGNhbi4KK3sKKyAgIyB0aGlzIGp1c3QgZWFzZXMgZXhpdCBoYW5kbGluZworICB3aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbworICAgIG9wdD0iJDEiCisgICAgc2hpZnQKKyAgICBjYXNlICRvcHQgaW4KKyAgICAgIC0tZGVidWd8LXgpCW9wdF9kZWJ1Zz0nc2V0IC14JworCQkJZnVuY19lY2hvICJlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgorCQkJJG9wdF9kZWJ1ZworCQkJOzsKKyAgICAgIC0tZHJ5LXJ1bnwtLWRyeXJ1bnwtbikKKwkJCW9wdF9kcnlfcnVuPToKKwkJCTs7CisgICAgICAtLWNvbmZpZykKKwkJCW9wdF9jb25maWc9OgorZnVuY19jb25maWcKKwkJCTs7CisgICAgICAtLWRsb3BlbnwtZGxvcGVuKQorCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF9kbG9wZW49IiR7b3B0X2Rsb3Blbiskb3B0X2Rsb3BlbgorfSRvcHRhcmciCisJCQlzaGlmdAorCQkJOzsKKyAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMpCisJCQlvcHRfcHJlc2VydmVfZHVwX2RlcHM9OgorCQkJOzsKKyAgICAgIC0tZmVhdHVyZXMpCisJCQlvcHRfZmVhdHVyZXM9OgorZnVuY19mZWF0dXJlcworCQkJOzsKKyAgICAgIC0tZmluaXNoKQorCQkJb3B0X2ZpbmlzaD06CitzZXQgZHVtbXkgLS1tb2RlIGZpbmlzaCAkezErIiRAIn07IHNoaWZ0CisJCQk7OworICAgICAgLS1oZWxwKQorCQkJb3B0X2hlbHA9OgorCQkJOzsKKyAgICAgIC0taGVscC1hbGwpCisJCQlvcHRfaGVscF9hbGw9Ogorb3B0X2hlbHA9JzogaGVscC1hbGwnCisJCQk7OworICAgICAgLS1tb2RlKQorCQkJdGVzdCAkIyA9IDAgJiYgZnVuY19taXNzaW5nX2FyZyAkb3B0ICYmIGJyZWFrCisJCQlvcHRhcmc9IiQxIgorCQkJb3B0X21vZGU9IiRvcHRhcmciCitjYXNlICRvcHRhcmcgaW4KKyAgIyBWYWxpZCBtb2RlIGFyZ3VtZW50czoKKyAgY2xlYW58Y29tcGlsZXxleGVjdXRlfGZpbmlzaHxpbnN0YWxsfGxpbmt8cmVsaW5rfHVuaW5zdGFsbCkgOzsKKworICAjIENhdGNoIGFueXRoaW5nIGVsc2UgYXMgYW4gZXJyb3IKKyAgKikgZnVuY19lcnJvciAiaW52YWxpZCBhcmd1bWVudCBmb3IgJG9wdCIKKyAgICAgZXhpdF9jbWQ9ZXhpdAorICAgICBicmVhaworICAgICA7OworZXNhYworCQkJc2hpZnQKKwkJCTs7CisgICAgICAtLW5vLXNpbGVudHwtLW5vLXF1aWV0KQorCQkJb3B0X3NpbGVudD1mYWxzZQorZnVuY19hcHBlbmQgcHJlc2VydmVfYXJncyAiICRvcHQiCisJCQk7OworICAgICAgLS1uby12ZXJib3NlKQorCQkJb3B0X3ZlcmJvc2U9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tc2lsZW50fC0tcXVpZXQpCisJCQlvcHRfc2lsZW50PToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorICAgICAgICBvcHRfdmVyYm9zZT1mYWxzZQorCQkJOzsKKyAgICAgIC0tdmVyYm9zZXwtdikKKwkJCW9wdF92ZXJib3NlPToKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0Igorb3B0X3NpbGVudD1mYWxzZQorCQkJOzsKKyAgICAgIC0tdGFnKQorCQkJdGVzdCAkIyA9IDAgJiYgZnVuY19taXNzaW5nX2FyZyAkb3B0ICYmIGJyZWFrCisJCQlvcHRhcmc9IiQxIgorCQkJb3B0X3RhZz0iJG9wdGFyZyIKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0ICRvcHRhcmciCitmdW5jX2VuYWJsZV90YWcgIiRvcHRhcmciCisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLVw/fC1oKQkJZnVuY191c2FnZQkJCQk7OworICAgICAgLS1oZWxwKQkJZnVuY19oZWxwCQkJCTs7CisgICAgICAtLXZlcnNpb24pCWZ1bmNfdmVyc2lvbgkJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG9wdGFyZ3MgdG8gbG9uZyBvcHRpb25zOgorICAgICAgLS0qPSopCisJCQlmdW5jX3NwbGl0X2xvbmdfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9sb25nX29wdF9uYW1lIiAiJGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG5vbi1hcmd1bWVudCBzaG9ydCBvcHRpb25zOgorICAgICAgLVw/KnwtaCp8LW4qfC12KikKKwkJCWZ1bmNfc3BsaXRfc2hvcnRfb3B0ICIkb3B0IgorCQkJc2V0IGR1bW15ICIkZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZSIgIi0kZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIiAkezErIiRAIn0KKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAtLSkJCWJyZWFrCQkJCQk7OworICAgICAgLSopCQlmdW5jX2ZhdGFsX2hlbHAgInVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0JyIgOzsKKyAgICAgICopCQlzZXQgZHVtbXkgIiRvcHQiICR7MSsiJEAifTsJc2hpZnQ7IGJyZWFrICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICMgVmFsaWRhdGUgb3B0aW9uczoKKworICAjIHNhdmUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudAorICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKyAgICBub25vcHQ9IiRvcHQiCisgICAgc2hpZnQKKyAgZmkKKworICAjIHByZXNlcnZlIC0tZGVidWcKKyAgdGVzdCAiJG9wdF9kZWJ1ZyIgPSA6IHx8IGZ1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAtLWRlYnVnIgorCisgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiogfCAqY2VnY2MqKQorICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9OgorICAgICAgOzsKKyAgICAqKQorICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kb3B0X3ByZXNlcnZlX2R1cF9kZXBzCisgICAgICA7OworICBlc2FjCisKKyAgJG9wdF9oZWxwIHx8IHsKKyAgICAjIFNhbml0eSBjaGVja3MgZmlyc3Q6CisgICAgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAibm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIKKyAgICBmaQorCisgICAgIyBEYXJ3aW4gc3Vja3MKKyAgICBldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCisgICAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgICBpZiB0ZXN0IC1uICIkb3B0X2Rsb3BlbiIgJiYgdGVzdCAiJG9wdF9tb2RlIiAhPSBleGVjdXRlOyB0aGVuCisgICAgICBmdW5jX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciCisgICAgICAkRUNITyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgICAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgICBoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT0kb3B0X21vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKyAgfQorCisKKyAgIyBCYWlsIGlmIHRoZSBvcHRpb25zIHdlcmUgc2NyZXdlZAorICAkZXhpdF9jbWQgJEVYSVRfRkFJTFVSRQorfQorCisKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgICAgTWFpbi4gICAgIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKKyMgZnVuY19sYWxpYl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgYC5sYScgbGlicmFyeSBvciBgLmxvJyBvYmplY3QgZmlsZS4KKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2xhbGliX3AgKCkKK3sKKyAgICB0ZXN0IC1mICIkMSIgJiYKKyAgICAgICRTRUQgLWUgNHEgIiQxIiAyPi9kZXYvbnVsbCBcCisgICAgICAgIHwgJEdSRVAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIiA+IC9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sYWxpYl91bnNhZmVfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2FtZSBjaGVjayBhcyBmdW5jX2xhbGliX3Agd2l0aG91dAorIyByZXNvcnRpbmcgdG8gZXh0ZXJuYWwgcHJvZ3JhbXMuICBUbyB0aGlzIGVuZCwgaXQgcmVkaXJlY3RzIHN0ZGluIGFuZAorIyBjbG9zZXMgaXQgYWZ0ZXJ3YXJkcywgd2l0aG91dCBzYXZpbmcgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvci4KKyMgQXMgYSBzYWZldHkgbWVhc3VyZSwgdXNlIGl0IG9ubHkgd2hlcmUgYSBuZWdhdGl2ZSByZXN1bHQgd291bGQgYmUKKyMgZmF0YWwgYW55d2F5LiAgV29ya3MgaWYgYGZpbGUnIGRvZXMgbm90IGV4aXN0LgorZnVuY19sYWxpYl91bnNhZmVfcCAoKQoreworICAgIGxhbGliX3A9bm8KKyAgICBpZiB0ZXN0IC1mICIkMSIgJiYgdGVzdCAtciAiJDEiICYmIGV4ZWMgNTwmMCA8IiQxIjsgdGhlbgorCWZvciBsYWxpYl9wX2wgaW4gMSAyIDMgNAorCWRvCisJICAgIHJlYWQgbGFsaWJfcF9saW5lCisJICAgIGNhc2UgIiRsYWxpYl9wX2xpbmUiIGluCisJCVwjXCBHZW5lcmF0ZWRcIGJ5XCAqJFBBQ0tBR0UqICkgbGFsaWJfcD15ZXM7IGJyZWFrOzsKKwkgICAgZXNhYworCWRvbmUKKwlleGVjIDA8JjUgNTwmLQorICAgIGZpCisgICAgdGVzdCAiJGxhbGliX3AiID0geWVzCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdAorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICgpCit7CisgICAgZnVuY19sYWxpYl9wICIkMSIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0KKyAgICBjYXNlICQxIGluCisgICAgKi5leGUpIDs7CisgICAgKikgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9LmV4ZSA7OworICAgIGVzYWMKKyAgICAkR1JFUCAiJG1hZ2ljX2V4ZSIgIiQxJGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4IiA+L2Rldi9udWxsIDI+JjEKK30KKworIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lIGZpbGUKKyMgQXNzdW1lcyBmaWxlIGlzIGFuIGx0d3JhcHBlcl9leGVjdXRhYmxlCisjIHVzZXMgJGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBmb3IgYQorIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKK3sKKyAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkMSIgIiIgIi4iCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0LyRvYmpkaXIvJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9X2x0c2h3cmFwcGVyIgorfQorCisjIGZ1bmNfbHR3cmFwcGVyX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvciB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiQxIiB8fCBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIgorfQorCisKKyMgZnVuY19leGVjdXRlX2NtZHMgY29tbWFuZHMgZmFpbF9jbWQKKyMgRXhlY3V0ZSB0aWxkZS1kZWxpbWl0ZWQgQ09NTUFORFMuCisjIElmIEZBSUxfQ01EIGlzIGdpdmVuLCBldmFsIHRoYXQgdXBvbiBmYWlsdXJlLgorIyBGQUlMX0NNRCBtYXkgcmVhZC1hY2Nlc3MgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB2YXJpYWJsZSBDTUQhCitmdW5jX2V4ZWN1dGVfY21kcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBzYXZlX2lmcz0kSUZTOyBJRlM9J34nCisgICAgZm9yIGNtZCBpbiAkMTsgZG8KKyAgICAgIElGUz0kc2F2ZV9pZnMKKyAgICAgIGV2YWwgY21kPVwiJGNtZFwiCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGNtZCIgIiR7Mi06fSIKKyAgICBkb25lCisgICAgSUZTPSRzYXZlX2lmcworfQorCisKKyMgZnVuY19zb3VyY2UgZmlsZQorIyBTb3VyY2UgRklMRSwgYWRkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgaWYgbmVjZXNzYXJ5LgorIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisjIEZJTEUgZXZlbiBpZiBib3RoIEZJTEUgYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKyMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorZnVuY19zb3VyY2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkMSBpbgorICAgICovKiB8ICpcXCopCS4gIiQxIiA7OworICAgICopCQkuICIuLyQxIiA7OworICAgIGVzYWMKK30KKworCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290IFBBVEgKKyMgUmVwbGFjZSBhIGxlYWRpbmcgPSBpbiBQQVRIIHdpdGggYSBzeXNyb290LiAgU3RvcmUgdGhlIHJlc3VsdCBpbnRvCisjIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorZnVuY19yZXNvbHZlX3N5c3Jvb3QgKCkKK3sKKyAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSQxCisgIGNhc2UgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCBpbgorICA9KikKKyAgICBmdW5jX3N0cmlwbmFtZSAnPScgJycgIiRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0PSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX3JlcGxhY2Vfc3lzcm9vdCBQQVRICisjIElmIFBBVEggYmVnaW5zIHdpdGggdGhlIHN5c3Jvb3QsIHJlcGxhY2UgaXQgd2l0aCA9IGFuZAorIyBzdG9yZSB0aGUgcmVzdWx0IGludG8gZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0LgorZnVuY19yZXBsYWNlX3N5c3Jvb3QgKCkKK3sKKyAgY2FzZSAiJGx0X3N5c3Jvb3Q6JDEiIGluCisgID8qOiIkbHRfc3lzcm9vdCIqKQorICAgIGZ1bmNfc3RyaXBuYW1lICIkbHRfc3lzcm9vdCIgJycgIiQxIgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0iPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisgICAgOzsKKyAgKikKKyAgICAjIEluY2x1ZGluZyBubyBzeXNyb290LgorICAgIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdD0kMQorICAgIDs7CisgIGVzYWMKK30KKworIyBmdW5jX2luZmVyX3RhZyBhcmcKKyMgSW5mZXIgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGlmIGFueSBhcmUgYXZhaWxhYmxlIGFuZAorIyBpZiBvbmUgd2Fzbid0IGNob3NlbiB2aWEgdGhlICItLXRhZyIgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyMgT25seSBhdHRlbXB0IHRoaXMgaWYgdGhlIGNvbXBpbGVyIGluIHRoZSBiYXNlIGNvbXBpbGUKKyMgY29tbWFuZCBkb2Vzbid0IG1hdGNoIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgorIyBhcmcgaXMgdXN1YWxseSBvZiB0aGUgZm9ybSAnZ2NjIC4uLicKK2Z1bmNfaW5mZXJfdGFnICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGlmIHRlc3QgLW4gIiRhdmFpbGFibGVfdGFncyIgJiYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBDQ19xdW90ZWQ9CisgICAgICBmb3IgYXJnIGluICRDQzsgZG8KKwlmdW5jX2FwcGVuZF9xdW90ZWQgQ0NfcXVvdGVkICIkYXJnIgorICAgICAgZG9uZQorICAgICAgQ0NfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDYAorICAgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCisgICAgICBjYXNlICRAIGluCisgICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAorICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCisgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiICRDQ19leHBhbmRlZCAiKiB8ICIkQ0NfZXhwYW5kZWQgIiogfCBcCisgICAgICAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiAkQ0NfcXVvdGVkX2V4cGFuZGVkICIqIHwgIiRDQ19xdW90ZWRfZXhwYW5kZWQgIiopIDs7CisgICAgICAjIEJsYW5rcyBhdCB0aGUgc3RhcnQgb2YgJGJhc2VfY29tcGlsZSB3aWxsIGNhdXNlIHRoaXMgdG8gZmFpbAorICAgICAgIyBpZiB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbSBhcyB3ZWxsLgorICAgICAgKikKKwlmb3IgeiBpbiAkYXZhaWxhYmxlX3RhZ3M7IGRvCisJICBpZiAkR1JFUCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHokIiA8ICIkcHJvZ3BhdGgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgICMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uCisJICAgIGV2YWwgImAke1NFRH0gLW4gLWUgJy9eIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAnJHonJC9wJyA8ICRwcm9ncGF0aGAiCisJICAgIENDX3F1b3RlZD0KKwkgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorCSAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBDQ19xdW90ZWQgIiRhcmciCisJICAgIGRvbmUKKwkgICAgQ0NfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDYAorCSAgICBDQ19xdW90ZWRfZXhwYW5kZWQ9YGZ1bmNfZWNob19hbGwgJENDX3F1b3RlZGAKKwkgICAgY2FzZSAiJEAgIiBpbgorCSAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiICRDQ19leHBhbmRlZCAiKiB8ICIkQ0NfZXhwYW5kZWQgIiogfCBcCisJICAgICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiICRDQ19xdW90ZWRfZXhwYW5kZWQgIiogfCAiJENDX3F1b3RlZF9leHBhbmRlZCAiKikKKwkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcworCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCisJICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KKwkgICAgICB0YWduYW1lPSR6CisJICAgICAgYnJlYWsKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCWRvbmUKKwkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgorCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKKwkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KKwlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKwkgIGZ1bmNfZWNobyAidW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCSAgZnVuY19mYXRhbF9lcnJvciAic3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIgorIwllbHNlCisjCSAgZnVuY192ZXJib3NlICJ1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZmkKK30KKworCisKKyMgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCBvdXRwdXRfbmFtZSBwaWNfbmFtZSBub25waWNfbmFtZQorIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKKyMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCitmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICgpCit7CisgICAgd3JpdGVfbGlib2JqPSR7MX0KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfbG9iaj1cJyR7Mn1cJworICAgIGVsc2UKKyAgICAgIHdyaXRlX2xvYmo9bm9uZQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICB3cml0ZV9vbGRvYmo9XCckezN9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9vbGRvYmo9bm9uZQorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgY2F0ID4ke3dyaXRlX2xpYm9ian1UIDw8RU9GCisjICR3cml0ZV9saWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgorcGljX29iamVjdD0kd3JpdGVfbG9iagorCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Citub25fcGljX29iamVjdD0kd3JpdGVfb2xkb2JqCisKK0VPRgorICAgICAgJE1WICIke3dyaXRlX2xpYm9ian1UIiAiJHt3cml0ZV9saWJvYmp9IgorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGSUxFIE5BTUUgQU5EIFBBVEggQ09OVkVSU0lPTiBIRUxQRVIgRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiBBUkcKKyMgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZmlsZSBuYW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsCisjIGFuZCAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEKKyMgY29ycmVjdGx5IGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0KKyMgaW4gJGJ1aWxkJ3MgJFBBVEguCisjCisjIEFSRyBpcyB0aGUgJGJ1aWxkIGZpbGUgbmFtZSB0byBiZSBjb252ZXJ0ZWQgdG8gdzMyIGZvcm1hdC4KKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiAkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQsIGFuZCB3aWxsCisjIGJlIGVtcHR5IG9uIGVycm9yIChvciB3aGVuIEFSRyBpcyBlbXB0eSkKK2Z1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgVW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lcyBub3QgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXJyb3IgY29kZSwgc28gd2UKKyAgICAjIGFyZSBmb3JjZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHN0ZG91dC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICMgY29tbWFuZCBpcyBub3QgZm91bmQsIHRoZSBzaGVsbCB3aWxsIHNldCBhbiBleGl0IGNvZGUgb2YgMTI3IGFuZCBwcmludAorICAgICMgKmFuIGVycm9yIG1lc3NhZ2UqIHRvIHN0ZG91dC4gU28gd2UgbXVzdCBjaGVjayBmb3IgYm90aCBlcnJvciBjb2RlIG9mCisgICAgIyB6ZXJvIEFORCBub24tZW1wdHkgc3Rkb3V0LCB3aGljaCBleHBsYWlucyB0aGUgb2RkIGNvbnN0cnVjdGlvbjoKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcD1gd2luZXBhdGggLXcgIiQxIiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICIkPyIgLWVxIDAgJiYgdGVzdCAtbiAiJHtmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcH0iOyB0aGVuCisgICAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdD1gJEVDSE8gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3RtcCIgfAorICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgZWxzZQorICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9CisgICAgZmkKKyAgZmkKK30KKyMgZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyIEFSRworIyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBwYXRoIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoZW4gJGJ1aWxkIGlzICpuaXgsIGFuZAorIyAkaG9zdCBpcyBtaW5ndywgY3lnd2luLCBvciBzb21lIG90aGVyIHczMiBlbnZpcm9ubWVudC4gUmVsaWVzIG9uIGEgY29ycmVjdGx5CisjIGNvbmZpZ3VyZWQgd2luZSBlbnZpcm9ubWVudCBhdmFpbGFibGUsIHdpdGggdGhlIHdpbmVwYXRoIHByb2dyYW0gaW4gJGJ1aWxkJ3MKKyMgJFBBVEguIEFzc3VtZXMgQVJHIGhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlcnMuCisjCisjIEFSRyBpcyBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8gd2luMzIuCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0LgorIyBVbmNvbnZlcnRpYmxlIGZpbGUgKGRpcmVjdG9yeSkgbmFtZXMgaW4gQVJHIGFyZSBza2lwcGVkOyBpZiBubyBkaXJlY3RvcnkgbmFtZXMKKyMgYXJlIGNvbnZlcnRpYmxlLCB0aGVuIHRoZSByZXN1bHQgbWF5IGJlIGVtcHR5LgorZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgICMgdW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lc24ndCBjb252ZXJ0IHBhdGhzLCBvbmx5IGZpbGUgbmFtZXMKKyAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQ9IiIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgb2xkSUZTPSRJRlMKKyAgICBJRlM9OgorICAgIGZvciBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX2YgaW4gJDE7IGRvCisgICAgICBJRlM9JG9sZElGUworICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfZiIKKyAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIgOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdCI7IHRoZW4KKyAgICAgICAgICBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0IgorICAgICAgICBlbHNlCisgICAgICAgICAgZnVuY19hcHBlbmQgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQgIjskZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9JG9sZElGUworICBmaQorfQorIyBlbmQ6IGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIKKworCisjIGZ1bmNfY3lncGF0aCBBUkdTLi4uCisjIFdyYXBwZXIgYXJvdW5kIGNhbGxpbmcgdGhlIGN5Z3BhdGggcHJvZ3JhbSB2aWEgTFRfQ1lHUEFUSC4gVGhpcyBpcyB1c2VkIHdoZW4KKyMgd2hlbiAoMSkgJGJ1aWxkIGlzICpuaXggYW5kIEN5Z3dpbiBpcyBob3N0ZWQgdmlhIGEgd2luZSBlbnZpcm9ubWVudDsgb3IgKDIpCisjICRidWlsZCBpcyBNU1lTIGFuZCAkaG9zdCBpcyBDeWd3aW4sIG9yICgzKSAkYnVpbGQgaXMgQ3lnd2luLiBJbiBjYXNlICgxKSBvcgorIyAoMiksIHJldHVybnMgdGhlIEN5Z3dpbiBmaWxlIG5hbWUgb3IgcGF0aCBpbiBmdW5jX2N5Z3BhdGhfcmVzdWx0IChpbnB1dAorIyBmaWxlIG5hbWUgb3IgcGF0aCBpcyBhc3N1bWVkIHRvIGJlIGluIHczMiBmb3JtYXQsIGFzIHByZXZpb3VzbHkgY29udmVydGVkCisjIGZyb20gJGJ1aWxkJ3MgKm5peCBvciBNU1lTIGZvcm1hdCkuIEluIGNhc2UgKDMpLCByZXR1cm5zIHRoZSB3MzIgZmlsZSBuYW1lCisjIG9yIHBhdGggaW4gZnVuY19jeWdwYXRoX3Jlc3VsdCAoaW5wdXQgZmlsZSBuYW1lIG9yIHBhdGggaXMgYXNzdW1lZCB0byBiZSBpbgorIyBDeWd3aW4gZm9ybWF0KS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCisjCisjIEFSR1MgYXJlIHBhc3NlZCB0byBjeWdwYXRoLCB3aXRoIHRoZSBsYXN0IG9uZSBiZWluZyB0aGUgZmlsZSBuYW1lIG9yIHBhdGggdG8KKyMgYmUgY29udmVydGVkLgorIworIyBTcGVjaWZ5IHRoZSBhYnNvbHV0ZSAqbml4IChvciB3MzIpIG5hbWUgdG8gY3lncGF0aCBpbiB0aGUgTFRfQ1lHUEFUSAorIyBlbnZpcm9ubWVudCB2YXJpYWJsZTsgZG8gbm90IHB1dCBpdCBpbiAkUEFUSC4KK2Z1bmNfY3lncGF0aCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLW4gIiRMVF9DWUdQQVRIIiAmJiB0ZXN0IC1mICIkTFRfQ1lHUEFUSCI7IHRoZW4KKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PWAkTFRfQ1lHUEFUSCAiJEAiIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgIiQ/IiAtbmUgMDsgdGhlbgorICAgICAgIyBvbiBmYWlsdXJlLCBlbnN1cmUgcmVzdWx0IGlzIGVtcHR5CisgICAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZpCisgIGVsc2UKKyAgICBmdW5jX2N5Z3BhdGhfcmVzdWx0PQorICAgIGZ1bmNfZXJyb3IgIkxUX0NZR1BBVEggaXMgZW1wdHkgb3Igc3BlY2lmaWVzIG5vbi1leGlzdGVudCBmaWxlOiBcYCRMVF9DWUdQQVRIJyIKKyAgZmkKK30KKyNlbmQ6IGZ1bmNfY3lncGF0aAorCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIG9yIHBhdGggQVJHIGZyb20gTVNZUyBmb3JtYXQgdG8gdzMyIGZvcm1hdC4gIFJldHVybgorIyByZXN1bHQgaW4gZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0LgorZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAjIGF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQKKyAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0PWAoIGNtZCAvL2MgZWNobyAiJDEiICkgMj4vZGV2L251bGwgfAorICAgICRTRUQgLWUgJ3MvWyBdKiQvLycgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKK30KKyNlbmQ6IGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayBBUkcxIEFSRzIKKyMgVmVyaWZ5IHRoYXQgQVJHMSAoYSBmaWxlIG5hbWUgaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gQVJHMi4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSAocmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBBUkcxKS4KK2Z1bmNfY29udmVydF9maWxlX2NoZWNrICgpCit7CisgICRvcHRfZGVidWcKKyAgaWYgdGVzdCAteiAiJDIiICYmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIGhvc3QgZmlsZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgZnVuY19lcnJvciAiICBcYCQxJyIKKyAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKKyAgICAjIEZhbGxiYWNrOgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjaworCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgRlJPTV9QQVRIU0VQIFRPX1BBVEhTRVAgRlJPTV9QQVRIIFRPX1BBVEgKKyMgVmVyaWZ5IHRoYXQgRlJPTV9QQVRIIChhIHBhdGggaW4gJGJ1aWxkIGZvcm1hdCkgd2FzIGNvbnZlcnRlZCB0byAkaG9zdAorIyBmb3JtYXQgaW4gVE9fUEFUSC4gT3RoZXJ3aXNlLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UsIGJ1dCBjb250aW51ZSwgcmVzZXR0aW5nCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCB0byBhIHNpbXBsaXN0aWMgZmFsbGJhY2sgdmFsdWUgKHNlZSBiZWxvdykuCitmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiQ0IiAmJiB0ZXN0IC1uICIkMyI7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBob3N0IHBhdGggY29ycmVzcG9uZGluZyB0byIKKyAgICBmdW5jX2Vycm9yICIgIFxgJDMnIgorICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICMgRmFsbGJhY2suICBUaGlzIGlzIGEgZGVsaWJlcmF0ZWx5IHNpbXBsaXN0aWMgImNvbnZlcnNpb24iIGFuZAorICAgICMgc2hvdWxkIG5vdCBiZSAiaW1wcm92ZWQiLiAgU2VlIGxpYnRvb2wuaW5mby4KKyAgICBpZiB0ZXN0ICJ4JDEiICE9ICJ4JDIiOyB0aGVuCisgICAgICBsdF9yZXBsYWNlX3BhdGhzZXBfY2hhcnM9InN8JDF8JDJ8ZyIKKyAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJDMiIHwKKyAgICAgICAgJFNFRCAtZSAiJGx0X3JlcGxhY2VfcGF0aHNlcF9jaGFycyJgCisgICAgZWxzZQorICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyIKKyAgICBmaQorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCBGUk9OVFBBVCBCQUNLUEFUIFJFUEwgT1JJRworIyBNb2RpZmllcyBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQgYnkgcHJlcGVuZGluZyBSRVBMIGlmIE9SSUcgbWF0Y2hlcyBGUk9OVFBBVAorIyBhbmQgYXBwZW5kaW5nIFJFUEwgaWYgT1JJRyBtYXRjaGVzIEJBQ0tQQVQuCitmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBjYXNlICQ0IGluCisgICQxICkgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMyRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgOzsKKyAgZXNhYworICBjYXNlICQ0IGluCisgICQyICkgZnVuY19hcHBlbmQgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0ICIkMyIKKyAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgRklMRSBOQU1FIENPTlZFUlNJT04gRlVOQ1RJT05TICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGludm9rZWQgdmlhIGAkdG9faG9zdF9maWxlX2NtZCBBUkcnCisjCisjIEluIGVhY2ggY2FzZSwgQVJHIGlzIHRoZSBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCB0byAkaG9zdCBmb3JtYXQuCisjIFJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorCisKKyMgZnVuY190b19ob3N0X2ZpbGUgQVJHCisjIENvbnZlcnRzIHRoZSBmaWxlIG5hbWUgQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY190b19ob3N0X2ZpbGUgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAkdG9faG9zdF9maWxlX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfZmlsZQorCisKKyMgZnVuY190b190b29sX2ZpbGUgQVJHIExBWlkKKyMgY29udmVydHMgdGhlIGZpbGUgbmFtZSBBUkcgZnJvbSAkYnVpbGQgZm9ybWF0IHRvIHRvb2xjaGFpbiBmb3JtYXQuIFJldHVybgorIyByZXN1bHQgaW4gZnVuY190b190b29sX2ZpbGVfcmVzdWx0LiAgSWYgdGhlIGNvbnZlcnNpb24gaW4gdXNlIGlzIGxpc3RlZAorIyBpbiAodGhlIGNvbW1hIHNlcGFyYXRlZCkgTEFaWSwgbm8gY29udmVyc2lvbiB0YWtlcyBwbGFjZS4KK2Z1bmNfdG9fdG9vbF9maWxlICgpCit7CisgICRvcHRfZGVidWcKKyAgY2FzZSAsJDIsIGluCisgICAgKiwiJHRvX3Rvb2xfZmlsZV9jbWQiLCopCisgICAgICBmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQ9JDEKKyAgICAgIDs7CisgICAgKikKKyAgICAgICR0b190b29sX2ZpbGVfY21kICIkMSIKKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdD0kZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0CisgICAgICA7OworICBlc2FjCit9CisjIGVuZCBmdW5jX3RvX3Rvb2xfZmlsZQorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tIChtaW5ndykgTVNZUyB0byAobWluZ3cpIHczMiBmb3JtYXQ7IGF1dG9tYXRpYworIyBjb252ZXJzaW9uIHRvIHczMiBpcyBub3QgYXZhaWxhYmxlIGluc2lkZSB0aGUgY3dyYXBwZXIuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMl9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gQ3lnd2luIHRvIHczMiBmb3JtYXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBiZWNhdXNlICRidWlsZCBpcyBjeWd3aW4sIHdlIGNhbGwgInRoZSIgY3lncGF0aCBpbiAkUEFUSDsgbm8gbmVlZCB0byB1c2UKKyAgICAjIExUX0NZR1BBVEggaW4gdGhpcyBjYXNlLgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD1gY3lncGF0aCAtbSAiJDEiYAorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byB3MzIgZm9ybWF0LiAgUmVxdWlyZXMgYSB3aW5lIGVudmlyb25tZW50CisjIGFuZCBhIHdvcmtpbmcgd2luZXBhdGguIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25peF90b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBBUkcgZnJvbSBNU1lTIHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBMVF9DWUdQQVRIIHNldC4KKyMgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJDEiCisgICAgZnVuY19jeWdwYXRoIC11ICIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gKm5peCB0byBDeWd3aW4gZm9ybWF0LiAgUmVxdWlyZXMgQ3lnd2luIGluc3RhbGxlZAorIyBpbiBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIGNvbnZlcnQgZnJvbSAqbml4IHRvIHczMiwgdGhlbiB1c2UgY3lncGF0aCB0byBjb252ZXJ0IGZyb20gdzMyIHRvIGN5Z3dpbi4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICIkMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgIiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX2N5Z3dpbgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAkYnVpbGQgdG8gJGhvc3QgUEFUSCBDT05WRVJTSU9OIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgaW52b2tlZCB2aWEgYCR0b19ob3N0X3BhdGhfY21kIEFSRycKKyMKKyMgSW4gZWFjaCBjYXNlLCBBUkcgaXMgdGhlIHBhdGggdG8gYmUgY29udmVydGVkIGZyb20gJGJ1aWxkIHRvICRob3N0IGZvcm1hdC4KKyMgVGhlIHJlc3VsdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorIworIyBQYXRoIHNlcGFyYXRvcnMgYXJlIGFsc28gY29udmVydGVkIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuICBJZgorIyBBUkcgYmVnaW5zIG9yIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlciwgaXQgaXMgcHJlc2VydmVkIChidXQKKyMgY29udmVydGVkIHRvICRob3N0IGZvcm1hdCkgb24gb3V0cHV0LgorIworIyBBbGwgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgbmFtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uOgorIyAgIGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9uICAgIDogZnVuY19jb252ZXJ0X2ZpbGVfWF90b19ZICgpCisjICAgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9uICAgICAgICAgOiBmdW5jX2NvbnZlcnRfcGF0aF9YX3RvX1kgKCkKKyMgd2hlcmUsIGZvciBhbnkgZ2l2ZW4gJGJ1aWxkLyRob3N0IGNvbWJpbmF0aW9uIHRoZSAnWF90b19ZJyB2YWx1ZSBpcyB0aGUKKyMgc2FtZS4gIElmIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBhZGRlZCBmb3IgbmV3ICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbnMsCisjIHRoZSB0d28gbmV3IGZ1bmN0aW9ucyBtdXN0IGZvbGxvdyB0aGlzIHBhdHRlcm4sIG9yIGZ1bmNfaW5pdF90b19ob3N0X3BhdGhfY21kCisjIHdpbGwgYnJlYWsuCisKKworIyBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorIyBFbnN1cmVzIHRoYXQgZnVuY3Rpb24gInBvaW50ZXIiIHZhcmlhYmxlICR0b19ob3N0X3BhdGhfY21kIGlzIHNldCB0byB0aGUKKyMgYXBwcm9wcmlhdGUgdmFsdWUsIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiAkdG9faG9zdF9maWxlX2NtZC4KK3RvX2hvc3RfcGF0aF9jbWQ9CitmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZCAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiR0b19ob3N0X3BhdGhfY21kIjsgdGhlbgorICAgIGZ1bmNfc3RyaXBuYW1lICdmdW5jX2NvbnZlcnRfZmlsZV8nICcnICIkdG9faG9zdF9maWxlX2NtZCIKKyAgICB0b19ob3N0X3BhdGhfY21kPSJmdW5jX2NvbnZlcnRfcGF0aF8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH0iCisgIGZpCit9CisKKworIyBmdW5jX3RvX2hvc3RfcGF0aCBBUkcKKyMgQ29udmVydHMgdGhlIHBhdGggQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byAkaG9zdCBmb3JtYXQuIFJldHVybiByZXN1bHQKKyMgaW4gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGggKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorICAkdG9faG9zdF9wYXRoX2NtZCAiJDEiCit9CisjIGVuZCBmdW5jX3RvX2hvc3RfcGF0aAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbm9vcCBBUkcKKyMgQ29weSBBUkcgdG8gZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbm9vcCAoKQoreworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbm9vcAorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAobWluZ3cpIE1TWVMgdG8gKG1pbmd3KSB3MzIgZm9ybWF0OyBhdXRvbWF0aWMKKyMgY29udmVyc2lvbiB0byB3MzIgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGN3cmFwcGVyLiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20gQVJHLiAgTVNZUworICAgICMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmU7IGN5Z3BhdGggdHVybnMgdGhlbSBpbnRvICcuOycgYW5kICc7Lic7CisgICAgIyBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzIKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSBDeWd3aW4gdG8gdzMyIGZvcm1hdC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gY3lncGF0aCAtbSAtcCAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiYAorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfY3lnd2luX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gdzMyIGZvcm1hdC4gIFJlcXVpcmVzIGEgd2luZSBlbnZpcm9ubWVudCBhbmQKKyMgYSB3b3JraW5nIHdpbmVwYXRoLiAgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiAiOyIgXAorICAgICAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgIjoqIiAiKjoiICI7IiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tIE1TWVMgdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIExUX0NZR1BBVEggc2V0LgorIyBSZXR1cm5zIHJlc3VsdCBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgU2VlIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyOgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogOiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgOiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX2N5Z3dpbgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBwYXRoIEFSRyBmcm9tICpuaXggdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIEN5Z3dpbiBpbnN0YWxsZWQgaW4gYQorIyBhIHdpbmUgZW52aXJvbm1lbnQsIHdvcmtpbmcgd2luZXBhdGgsIGFuZCBMVF9DWUdQQVRIIHNldC4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzIGZyb20KKyAgICAjIEFSRy4gbXN5cyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgaGVyZSwgY3lncGF0aCB0dXJucyB0aGVtCisgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAtcCAiJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0IgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY3lncGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgOiA6IFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiA6ICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4KKworCisjIGZ1bmNfbW9kZV9jb21waWxlIGFyZy4uLgorZnVuY19tb2RlX2NvbXBpbGUgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KKyAgICBiYXNlX2NvbXBpbGU9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIgICMgIGFsd2F5cyBrZWVwIGEgbm9uLWVtcHR5IHZhbHVlIGluICJzcmNmaWxlIgorICAgIHN1cHByZXNzX29wdD15ZXMKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisgICAgYXJnX21vZGU9bm9ybWFsCisgICAgbGlib2JqPQorICAgIGxhdGVyPQorICAgIHBpZV9mbGFnPQorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgICAgYXJnICApCisJIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQorCWxhc3Rhcmc9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJOzsKKworICAgICAgdGFyZ2V0ICkKKwlsaWJvYmo9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJY29udGludWUKKwk7OworCisgICAgICBub3JtYWwgKQorCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKwljYXNlICRhcmcgaW4KKwktbykKKwkgIHRlc3QgLW4gIiRsaWJvYmoiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAieW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIgorCSAgYXJnX21vZGU9dGFyZ2V0CisJICBjb250aW51ZQorCSAgOzsKKworCS1waWUgfCAtZnBpZSB8IC1mUElFKQorICAgICAgICAgIGZ1bmNfYXBwZW5kIHBpZV9mbGFnICIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLXNoYXJlZCB8IC1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKKwkgIGZ1bmNfYXBwZW5kIGxhdGVyICIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLW5vLXN1cHByZXNzKQorCSAgc3VwcHJlc3Nfb3B0PW5vCisJICBjb250aW51ZQorCSAgOzsKKworCS1YY29tcGlsZXIpCisJICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0CisJICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgorCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KKworCS1XYywqKQorCSAgZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCSAgYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBsYXN0YXJnPQorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJICBmb3IgYXJnIGluICRhcmdzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZnVuY19hcHBlbmRfcXVvdGVkIGxhc3RhcmcgIiRhcmciCisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGxhc3RhcmciCisJICBsYXN0YXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworCSAgIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCisJICBmdW5jX2FwcGVuZCBiYXNlX2NvbXBpbGUgIiAkbGFzdGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJKikKKwkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKwkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgorCSAgIworCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCisJICBzcmNmaWxlPSIkYXJnIgorCSAgOzsKKwllc2FjICAjICBjYXNlICRhcmcKKwk7OworICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQorCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorICAgICAgZnVuY19hcHBlbmRfcXVvdGVkIGJhc2VfY29tcGlsZSAiJGxhc3RhcmciCisgICAgZG9uZSAjIGZvciBhcmcKKworICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgYXJnKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgorICAgICAgOzsKKyAgICB0YXJnZXQpCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciCisgICAgICA7OworICAgICopCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiB7CisJZnVuY19iYXNlbmFtZSAiJHNyY2ZpbGUiCisJbGlib2JqPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB9CisgICAgICA7OworICAgIGVzYWMKKworICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCisgICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLltjQ0ZTaWZtc29dIHwgXAorICAgICouYWRhIHwgKi5hZGIgfCAqLmFkcyB8ICouYXNtIHwgXAorICAgICouYysrIHwgKi5jYyB8ICouaWkgfCAqLmNsYXNzIHwgKi5jcHAgfCAqLmN4eCB8IFwKKyAgICAqLltmRl1bMDldPyB8ICouZm9yIHwgKi5qYXZhIHwgKi5vYmogfCAqLnN4IHwgKi5jdSB8ICouY3VwKQorICAgICAgZnVuY194Zm9ybSAiJGxpYm9iaiIKKyAgICAgIGxpYm9iaj0kZnVuY194Zm9ybV9yZXN1bHQKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5sbykgZnVuY19sbzJvICIkbGlib2JqIjsgb2JqPSRmdW5jX2xvMm9fcmVzdWx0IDs7CisgICAgKikKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciCisgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKKworICAgIGZvciBhcmcgaW4gJGxhdGVyOyBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtc2hhcmVkKQorCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKKwlidWlsZF9vbGRfbGlicz1ubworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYykKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItcGljKQorCXBpY19tb2RlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1ub24tcGljKQorCXBpY19tb2RlPW5vCisJY29udGludWUKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRsaWJvYmoiCisgICAgdGVzdCAiWCRsaWJvYmoiICE9ICJYJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IiBcCisgICAgICAmJiAkRUNITyAiWCRsaWJvYmoiIHwgJEdSRVAgJ1tdfiNeKnt9Ozw+PyInIiciJwkgJigpfGAkW10nIFwKKyAgICAgICYmIGZ1bmNfd2FybmluZyAibGlib2JqIG5hbWUgXGAkbGlib2JqJyBtYXkgbm90IGNvbnRhaW4gc2hlbGwgc3BlY2lhbCBjaGFyYWN0ZXJzLiIKKyAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkb2JqIiAiLyIgIiIKKyAgICBvYmpuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisgICAgbG9iaj0ke3hkaXJ9JG9iamRpci8kb2JqbmFtZQorCisgICAgdGVzdCAteiAiJGJhc2VfY29tcGlsZSIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIKKworICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgcmVtb3ZlbGlzdD0iJG9iaiAkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCisgICAgZWxzZQorICAgICAgcmVtb3ZlbGlzdD0iJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGZpCisKKyAgICAjIE9uIEN5Z3dpbiB0aGVyZSdzIG5vICJyZWFsIiBQSUMgZmxhZyBzbyB3ZSBtdXN0IGJ1aWxkIGJvdGggb2JqZWN0IHR5cGVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgICA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICIkcGljX21vZGUiID0gbm8gJiYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorICAgICAgIyBub24tUElDIGNvZGUgaW4gc2hhcmVkIGxpYnJhcmllcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgZmkKKworICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCisgICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCisgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgorICAgICAgb3V0cHV0X29iaj1gJEVDSE8gIiRzcmNmaWxlIiB8ICRTRUQgJ3MlXi4qLyUlOyBzJVwuW14uXSokJSUnYC4ke29iamV4dH0KKyAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgorICAgIGVsc2UKKyAgICAgIG91dHB1dF9vYmo9CisgICAgICBuZWVkX2xvY2tzPW5vCisgICAgICBsb2NrZmlsZT0KKyAgICBmaQorCisgICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKKyAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCisgICAgICB1bnRpbCAkb3B0X2RyeV9ydW4gfHwgbG4gIiRwcm9ncGF0aCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCisJZnVuY19lY2hvICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKKwlzbGVlcCAyCisgICAgICBkb25lCisgICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCisgICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCisJJEVDSE8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgICBmdW5jX2FwcGVuZCByZW1vdmVsaXN0ICIgJG91dHB1dF9vYmoiCisgICAgICAkRUNITyAiJHNyY2ZpbGUiID4gIiRsb2NrZmlsZSIKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorICAgIGZ1bmNfYXBwZW5kIHJlbW92ZWxpc3QgIiAkbG9ja2ZpbGUiCisgICAgdHJhcCAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJyAxIDIgMTUKKworICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkc3JjZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICBzcmNmaWxlPSRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkc3JjZmlsZSIKKyAgICBxc3JjZmlsZT0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQKKworICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgorICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCisKKyAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0gbm87IHRoZW4KKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBlbHNlCisJIyBEb24ndCBidWlsZCBQSUMgY29kZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgorICAgICAgZmkKKworICAgICAgZnVuY19ta2Rpcl9wICIkeGRpciRvYmpkaXIiCisKKyAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgorCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgorCWZ1bmNfYXBwZW5kIGNvbW1hbmQgIiAtbyAkbG9iaiIKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiCVwKKyAgICAgICAgICAndGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJworCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCisJJEVDSE8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQorICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkbG9iaiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRsb2JqIicgXAorCSAgJ2Vycm9yPSQ/OyAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRlcnJvcicKKyAgICAgIGZpCisKKyAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KKyAgICAgIGlmIHRlc3QgIiRzdXBwcmVzc19vcHQiID0geWVzOyB0aGVuCisJc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJworICAgICAgZmkKKyAgICBmaQorCisgICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0geWVzOyB0aGVuCisJIyBEb24ndCBidWlsZCBQSUMgY29kZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlJHBpZV9mbGFnIgorICAgICAgZWxzZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgorCWZ1bmNfYXBwZW5kIGNvbW1hbmQgIiAtbyAkb2JqIgorICAgICAgZmkKKworICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICBmdW5jX2FwcGVuZCBjb21tYW5kICIkc3VwcHJlc3Nfb3V0cHV0IgorICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIgXAorICAgICAgICAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJworCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCisJJEVDSE8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAorICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkb2JqIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICckTVYgIiRvdXRwdXRfb2JqIiAiJG9iaiInIFwKKwkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCisgICAgICBmaQorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAiJGxpYm9iaiIgIiRvYmpkaXIvJG9iam5hbWUiICIkb2JqbmFtZSIKKworICAgICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAorICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisJcmVtb3ZlbGlzdD0kbG9ja2ZpbGUKKyAgICAgICAgJFJNICIkbG9ja2ZpbGUiCisgICAgICBmaQorICAgIH0KKworICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworfQorCiskb3B0X2hlbHAgfHwgeworICB0ZXN0ICIkb3B0X21vZGUiID0gY29tcGlsZSAmJiBmdW5jX21vZGVfY29tcGlsZSAkezErIiRAIn0KK30KKworZnVuY19tb2RlX2hlbHAgKCkKK3sKKyAgICAjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KKyAgICBjYXNlICRvcHRfbW9kZSBpbgorICAgICAgIiIpCisgICAgICAgICMgR2VuZXJpYyBoZWxwIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSB1c2FnZSBjb21tZW50cworICAgICAgICAjIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZpbGUuCisgICAgICAgIGZ1bmNfaGVscAorICAgICAgICA7OworCisgICAgICBjbGVhbikKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNsZWFuIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KKworUmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgb2JqZWN0IG9yIHByb2dyYW0sIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZAord2l0aCBpdCBhcmUgZGVsZXRlZC4gT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgorICAgICAgICA7OworCisgICAgICBjb21waWxlKQorICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKKworQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKKyAgLW5vLXN1cHByZXNzICAgICAgZG8gbm90IHN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBmb3IgbXVsdGlwbGUgcGFzc2VzCisgIC1wcmVmZXItcGljICAgICAgIHRyeSB0byBidWlsZCBQSUMgb2JqZWN0cyBvbmx5CisgIC1wcmVmZXItbm9uLXBpYyAgIHRyeSB0byBidWlsZCBub24tUElDIG9iamVjdHMgb25seQorICAtc2hhcmVkICAgICAgICAgICBkbyBub3QgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZworICAtc3RhdGljICAgICAgICAgICBvbmx5IGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKyAgLVdjLEZMQUcgICAgICAgICAgcGFzcyBGTEFHIGRpcmVjdGx5IHRvIHRoZSBjb21waWxlcgorCitDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQorZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KKworVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCitTT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKK2xpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKKyAgICAgICAgOzsKKworICAgICAgZXhlY3V0ZSkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KKworQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCisKK1RoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKK2ZsYWdzLgorCitJZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCitpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKK2RpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgorCitUaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKKyAgICAgICAgOzsKKworICAgICAgZmluaXNoKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCisKK0NvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCisKK0VhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCisKK1RoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQordGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCisgICAgICAgIDs7CisKKyAgICAgIGluc3RhbGwpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgorCitJbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KKworSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCitlaXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIElOU1RBTEwtQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWluc3QtcHJlZml4LWRpciBQUkVGSVgtRElSICBVc2UgUFJFRklYLURJUiBhcyBhIHN0YWdpbmcgYXJlYSBmb3IgaW5zdGFsbGF0aW9uCisKK1RoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5CitCU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKKyAgICAgICAgOzsKKworICAgICAgbGluaykKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCisKK0xpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KK2NyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCisKK0xJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQorYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAorICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKKyAgLWJpbmRpciBCSU5ESVIgICAgc3BlY2lmeSBwYXRoIHRvIGJpbmFyaWVzIGRpcmVjdG9yeSAoZm9yIHN5c3RlbXMgd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzIG11c3QgYmUgZm91bmQgaW4gdGhlIFBBVEggc2V0dGluZyBhdCBydW50aW1lKQorICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKKyAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKKyAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKKyAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCisgIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbWF0Y2hpbmcgUkVHRVgKKyAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcworICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQorICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKKyAgLW5vLWZhc3QtaW5zdGFsbCAgZGlzYWJsZSB0aGUgZmFzdC1pbnN0YWxsIG1vZGUKKyAgLW5vLWluc3RhbGwgICAgICAgbGluayBhIG5vdC1pbnN0YWxsYWJsZSBleGVjdXRhYmxlCisgIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scworICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKKyAgLW9iamVjdGxpc3QgRklMRSAgVXNlIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm91bmQgaW4gRklMRSB0byBzcGVjaWZ5IG9iamVjdHMKKyAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4IFJFR0VYCisgICAgICAgICAgICAgICAgICAgIGRvbid0IHJlbW92ZSBvdXRwdXQgZmlsZXMgbWF0Y2hpbmcgUkVHRVgKKyAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KKyAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgorICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcworICAtc2hhcmVkICAgICAgICAgICBvbmx5IGRvIGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcworICAtc2hyZXh0IFNVRkZJWCAgICBvdmVycmlkZSB0aGUgc3RhbmRhcmQgc2hhcmVkIGxpYnJhcnkgZmlsZSBleHRlbnNpb24KKyAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXN0YXRpYy1saWJ0b29sLWxpYnMKKyAgICAgICAgICAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQorICAtd2VhayBMSUJOQU1FICAgICBkZWNsYXJlIHRoYXQgdGhlIHRhcmdldCBwcm92aWRlcyB0aGUgTElCTkFNRSBpbnRlcmZhY2UKKyAgLVdjLEZMQUcKKyAgLVhjb21waWxlciBGTEFHICAgcGFzcyBsaW5rZXItc3BlY2lmaWMgRkxBRyBkaXJlY3RseSB0byB0aGUgY29tcGlsZXIKKyAgLVdsLEZMQUcKKyAgLVhsaW5rZXIgRkxBRyAgICAgcGFzcyBsaW5rZXItc3BlY2lmaWMgRkxBRyBkaXJlY3RseSB0byB0aGUgbGlua2VyCisgIC1YQ0NsaW5rZXIgRkxBRyAgIHBhc3MgbGluay1zcGVjaWZpYyBGTEFHIHRvIHRoZSBjb21waWxlciBkcml2ZXIgKENDKQorCitBbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgorCitFdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQordHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKK29iamVjdCBmaWxlcy4KKworSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsCitvbmx5IGxpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzCityZXF1aXJlZCwgZXhjZXB0IHdoZW4gY3JlYXRpbmcgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnIG9yIFxgLmxpYicsIHRoZW4gYSBzdGFuZGFyZCBsaWJyYXJ5IGlzIGNyZWF0ZWQKK3VzaW5nIFxgYXInIGFuZCBcYHJhbmxpYicsIG9yIG9uIFdpbmRvd3MgdXNpbmcgXGBsaWInLgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC4ke29iamV4dH0nLCB0aGVuIGEgcmVsb2FkYWJsZSBvYmplY3QgZmlsZQoraXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBjcmVhdGVkLiIKKyAgICAgICAgOzsKKworICAgICAgdW5pbnN0YWxsKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KKworUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgorT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgorICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkb3B0X21vZGUnIgorICAgICAgICA7OworICAgIGVzYWMKKworICAgIGVjaG8KKyAgICAkRUNITyAiVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgorfQorCisjIE5vdyB0aGF0IHdlJ3ZlIGNvbGxlY3RlZCBhIHBvc3NpYmxlIC0tbW9kZSBhcmcsIHNob3cgaGVscCBpZiBuZWNlc3NhcnkKK2lmICRvcHRfaGVscDsgdGhlbgorICBpZiB0ZXN0ICIkb3B0X2hlbHAiID0gOjsgdGhlbgorICAgIGZ1bmNfbW9kZV9oZWxwCisgIGVsc2UKKyAgICB7CisgICAgICBmdW5jX2hlbHAgbm9leGl0CisgICAgICBmb3Igb3B0X21vZGUgaW4gY29tcGlsZSBsaW5rIGV4ZWN1dGUgaW5zdGFsbCBmaW5pc2ggdW5pbnN0YWxsIGNsZWFuOyBkbworCWZ1bmNfbW9kZV9oZWxwCisgICAgICBkb25lCisgICAgfSB8IHNlZCAtbiAnMXA7IDIsJHMvXlVzYWdlOi8gIG9yOiAvcCcKKyAgICB7CisgICAgICBmdW5jX2hlbHAgbm9leGl0CisgICAgICBmb3Igb3B0X21vZGUgaW4gY29tcGlsZSBsaW5rIGV4ZWN1dGUgaW5zdGFsbCBmaW5pc2ggdW5pbnN0YWxsIGNsZWFuOyBkbworCWVjaG8KKwlmdW5jX21vZGVfaGVscAorICAgICAgZG9uZQorICAgIH0gfAorICAgIHNlZCAnMWQKKyAgICAgIC9eV2hlbiByZXBvcnRpbmcvLC9eUmVwb3J0L3sKKwlICisJZAorICAgICAgfQorICAgICAgJHgKKyAgICAgIC9pbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy9kCisgICAgICAvbW9yZSBkZXRhaWxlZCAuKk1PREUvZAorICAgICAgcy9eVXNhZ2U6LiotLW1vZGU9XChbXiBdKlwpIC4qL0Rlc2NyaXB0aW9uIG9mIFwxIG1vZGU6LycKKyAgZmkKKyAgZXhpdCAkPworZmkKKworCisjIGZ1bmNfbW9kZV9leGVjdXRlIGFyZy4uLgorZnVuY19tb2RlX2V4ZWN1dGUgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KKyAgICBjbWQ9IiRub25vcHQiCisgICAgdGVzdCAteiAiJGNtZCIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIKKworICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCisgICAgZm9yIGZpbGUgaW4gJG9wdF9kbG9wZW47IGRvCisgICAgICB0ZXN0IC1mICIkZmlsZSIgXAorCXx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgZmlsZSIKKworICAgICAgZGlyPQorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5sYSkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZpbGUiCisJZmlsZT0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRmaWxlIiBcCisJICB8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCisJZGxuYW1lPQorCWxpYnJhcnlfbmFtZXM9CisJZnVuY19zb3VyY2UgIiRmaWxlIgorCisJIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KKwkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiBcCisJICAgIGZ1bmNfd2FybmluZyAiXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCisJICBjb250aW51ZQorCWZpCisKKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCisJICBmdW5jX2FwcGVuZCBkaXIgIi8kb2JqZGlyIgorCWVsc2UKKwkgIGlmIHRlc3QgISAtZiAiJGRpci8kZGxuYW1lIjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgorCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJOzsKKworICAgICAgKikKKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBHZXQgdGhlIGFic29sdXRlIHBhdGhuYW1lLgorICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorICAgICAgdGVzdCAtbiAiJGFic2RpciIgJiYgZGlyPSIkYWJzZGlyIgorCisgICAgICAjIE5vdyBhZGQgdGhlIGRpcmVjdG9yeSB0byBzaGxpYnBhdGhfdmFyLgorICAgICAgaWYgZXZhbCAidGVzdCAteiBcIlwkJHNobGlicGF0aF92YXJcIiI7IHRoZW4KKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyXCIiCisgICAgICBlbHNlCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpcjpcJCRzaGxpYnBhdGhfdmFyXCIiCisgICAgICBmaQorICAgIGRvbmUKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgc2hsaWJwYXRoX3ZhcgorICAgICMgcmF0aGVyIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2V4ZWN1dGVfbWFnaWM9IiRtYWdpYyIKKworICAgICMgQ2hlY2sgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgYSB3cmFwcGVyIHNjcmlwdC4KKyAgICBhcmdzPQorICAgIGZvciBmaWxlCisgICAgZG8KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgIC0qIHwgKi5sYSB8ICoubG8gKSA7OworICAgICAgKikKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJaWYgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiRmaWxlIjsgdGhlbgorCSAgZnVuY19zb3VyY2UgIiRmaWxlIgorCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWVsaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgZnVuY19zb3VyY2UgIiRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKKwkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCisJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgorICAgICAgZnVuY19hcHBlbmRfcXVvdGVkIGFyZ3MgIiRmaWxlIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgIlgkb3B0X2RyeV9ydW4iID0gWGZhbHNlOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KKwlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorCisgICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICBmb3IgbHRfdmFyIGluIExBTkcgTEFOR1VBR0UgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKKyAgICAgIGRvCisJZXZhbCAiaWYgdGVzdCBcIlwke3NhdmVfJGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICAgICAgICAkbHRfdmFyPVwkc2F2ZV8kbHRfdmFyOyBleHBvcnQgJGx0X3ZhcgorCSAgICAgIGVsc2UKKwkJJGx0X3Vuc2V0ICRsdF92YXIKKwkgICAgICBmaSIKKyAgICAgIGRvbmUKKworICAgICAgIyBOb3cgcHJlcGFyZSB0byBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgorICAgICAgZXhlY19jbWQ9IlwkY21kJGFyZ3MiCisgICAgZWxzZQorICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCWV2YWwgIlwkRUNITyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCisJZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKyAgICAgICRFQ0hPICIkY21kJGFyZ3MiCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorfQorCit0ZXN0ICIkb3B0X21vZGUiID0gZXhlY3V0ZSAmJiBmdW5jX21vZGVfZXhlY3V0ZSAkezErIiRAIn0KKworCisjIGZ1bmNfbW9kZV9maW5pc2ggYXJnLi4uCitmdW5jX21vZGVfZmluaXNoICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGxpYnM9CisgICAgbGliZGlycz0KKyAgICBhZG1pbmNtZHM9CisKKyAgICBmb3Igb3B0IGluICIkbm9ub3B0IiAkezErIiRAIn0KKyAgICBkbworICAgICAgaWYgdGVzdCAtZCAiJG9wdCI7IHRoZW4KKwlmdW5jX2FwcGVuZCBsaWJkaXJzICIgJG9wdCIKKworICAgICAgZWxpZiB0ZXN0IC1mICIkb3B0IjsgdGhlbgorCWlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRvcHQiOyB0aGVuCisJICBmdW5jX2FwcGVuZCBsaWJzICIgJG9wdCIKKwllbHNlCisJICBmdW5jX3dhcm5pbmcgIlxgJG9wdCcgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCWZpCisKKyAgICAgIGVsc2UKKwlmdW5jX2ZhdGFsX2Vycm9yICJpbnZhbGlkIGFyZ3VtZW50IFxgJG9wdCciCisgICAgICBmaQorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLW4gIiRsaWJzIjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJGx0X3N5c3Jvb3QiOyB0aGVuCisgICAgICAgIHN5c3Jvb3RfcmVnZXg9YCRFQ0hPICIkbHRfc3lzcm9vdCIgfCAkU0VEICIkc2VkX21ha2VfbGl0ZXJhbF9yZWdleCJgCisgICAgICAgIHN5c3Jvb3RfY21kPSJzL1woWyAnXVwpJHN5c3Jvb3RfcmVnZXgvXDEvZzsiCisgICAgICBlbHNlCisgICAgICAgIHN5c3Jvb3RfY21kPQorICAgICAgZmkKKworICAgICAgIyBSZW1vdmUgc3lzcm9vdCByZWZlcmVuY2VzCisgICAgICBpZiAkb3B0X2RyeV9ydW47IHRoZW4KKyAgICAgICAgZm9yIGxpYiBpbiAkbGliczsgZG8KKyAgICAgICAgICBlY2hvICJyZW1vdmluZyByZWZlcmVuY2VzIHRvICRsdF9zeXNyb290IGFuZCBcYD0nIHByZWZpeGVzIGZyb20gJGxpYiIKKyAgICAgICAgZG9uZQorICAgICAgZWxzZQorICAgICAgICB0bXBkaXI9YGZ1bmNfbWt0ZW1wZGlyYAorICAgICAgICBmb3IgbGliIGluICRsaWJzOyBkbworCSAgc2VkIC1lICIke3N5c3Jvb3RfY21kfSBzL1woWyAnXS1bTFJdXCk9L1wxL2c7IHMvXChbICddXCk9L1wxL2ciICRsaWIgXAorCSAgICA+ICR0bXBkaXIvdG1wLWxhCisJICBtdiAtZiAkdG1wZGlyL3RtcC1sYSAkbGliCisJZG9uZQorICAgICAgICAke1JNfXIgIiR0bXBkaXIiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRmaW5pc2hfY21kcyIgJ2FkbWluY21kcz0iJGFkbWluY21kcworJyIkY21kIiciJworCWZpCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgorCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kcyIgfHwgZnVuY19hcHBlbmQgYWRtaW5jbWRzICIKKyAgICAgICAkY21kcyIKKwlmaQorICAgICAgZG9uZQorICAgIGZpCisKKyAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KKyAgICAkb3B0X3NpbGVudCAmJiBleGl0ICRFWElUX1NVQ0NFU1MKKworICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCisgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgorICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwkkRUNITyAiICAgJGxpYmRpciIKKyAgICAgIGRvbmUKKyAgICAgIGVjaG8KKyAgICAgIGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgorICAgICAgZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCisgICAgICBlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgorICAgICAgZWNobyAiZmxhZyBkdXJpbmcgbGlua2luZyBhbmQgZG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6IgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKwllY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkcnVucGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorCWVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJbGliZGlyPUxJQkRJUgorCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKworCSRFQ0hPICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KKwkkRUNITyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgcnVuIHRoZXNlIGNvbW1hbmRzOiRhZG1pbmNtZHMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKwllY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKKyAgICAgIGZpCisgICAgICBlY2hvCisKKyAgICAgIGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgorICAgICAgY2FzZSAkaG9zdCBpbgorCXNvbGFyaXMyLls2Nzg5XXxzb2xhcmlzMi4xWzAtOV0pCisJICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSwgY3JsZSgxKSBhbmQgbGQuc28oOCkgbWFudWFsIgorCSAgZWNobyAicGFnZXMuIgorCSAgOzsKKwkqKQorCSAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCisJICA7OworICAgICAgZXNhYworICAgICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICBmaQorICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworfQorCit0ZXN0ICIkb3B0X21vZGUiID0gZmluaXNoICYmIGZ1bmNfbW9kZV9maW5pc2ggJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV9pbnN0YWxsICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KKyAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAorICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgorICAgICAgIGNhc2UgJG5vbm9wdCBpbiAqc2h0b29sKikgOjs7ICopIGZhbHNlOzsgZXNhYzsgdGhlbgorICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJG5vbm9wdCIKKyAgICAgIGluc3RhbGxfcHJvZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0ICIKKyAgICAgIGFyZz0kMQorICAgICAgc2hpZnQKKyAgICBlbHNlCisgICAgICBpbnN0YWxsX3Byb2c9CisgICAgICBhcmc9JG5vbm9wdAorICAgIGZpCisKKyAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCisgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgZnVuY19hcHBlbmQgaW5zdGFsbF9wcm9nICIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgaW5zdGFsbF9zaGFyZWRfcHJvZz0kaW5zdGFsbF9wcm9nCisgICAgY2FzZSAiICRpbnN0YWxsX3Byb2cgIiBpbgorICAgICAgKltcXFwgL11jcFwgKikgaW5zdGFsbF9jcD06IDs7CisgICAgICAqKSBpbnN0YWxsX2NwPWZhbHNlIDs7CisgICAgZXNhYworCisgICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgorICAgIGRlc3Q9CisgICAgZmlsZXM9CisgICAgb3B0cz0KKyAgICBwcmV2PQorICAgIGluc3RhbGxfdHlwZT0KKyAgICBpc2Rpcj1ubworICAgIHN0cmlwbWU9CisgICAgbm9fbW9kZT06CisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBhcmcyPQorICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCisJZnVuY19hcHBlbmQgZmlsZXMgIiAkZGVzdCIKKwlkZXN0PSRhcmcKKwljb250aW51ZQorICAgICAgZmkKKworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZCkgaXNkaXI9eWVzIDs7CisgICAgICAtZikKKwlpZiAkaW5zdGFsbF9jcDsgdGhlbiA6OyBlbHNlCisJICBwcmV2PSRhcmcKKwlmaQorCTs7CisgICAgICAtZyB8IC1tIHwgLW8pCisJcHJldj0kYXJnCisJOzsKKyAgICAgIC1zKQorCXN0cmlwbWU9IiAtcyIKKwljb250aW51ZQorCTs7CisgICAgICAtKikKKwk7OworICAgICAgKikKKwkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCisJaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJICBpZiB0ZXN0ICJ4JHByZXYiID0geC1tICYmIHRlc3QgLW4gIiRpbnN0YWxsX292ZXJyaWRlX21vZGUiOyB0aGVuCisJICAgIGFyZzI9JGluc3RhbGxfb3ZlcnJpZGVfbW9kZQorCSAgICBub19tb2RlPWZhbHNlCisJICBmaQorCSAgcHJldj0KKwllbHNlCisJICBkZXN0PSRhcmcKKwkgIGNvbnRpbnVlCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKyAgICAgIGZ1bmNfYXBwZW5kIGluc3RhbGxfcHJvZyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICAgIGlmIHRlc3QgLW4gIiRhcmcyIjsgdGhlbgorCWZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmcyIgorICAgICAgZmkKKyAgICAgIGZ1bmNfYXBwZW5kIGluc3RhbGxfc2hhcmVkX3Byb2cgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJGluc3RhbGxfcHJvZyIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIKKworICAgIHRlc3QgLW4gIiRwcmV2IiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiCisKKyAgICBpZiB0ZXN0IC1uICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIiAmJiAkbm9fbW9kZTsgdGhlbgorICAgICAgaWYgJGluc3RhbGxfY3A7IHRoZW4gOjsgZWxzZQorCWZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRpbnN0YWxsX292ZXJyaWRlX21vZGUiCisJZnVuY19hcHBlbmQgaW5zdGFsbF9zaGFyZWRfcHJvZyAiIC1tICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICAgIGZpCisgICAgZmkKKworICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgorCWZ1bmNfZmF0YWxfaGVscCAibm8gZmlsZSBvciBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCisgICAgICBlbHNlCisJZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KKyAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLycgIiRkZXN0IgorICAgIGRlc3Q9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCisgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCisgICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcworICAgIGlmIHRlc3QgIiRpc2RpciIgPSB5ZXM7IHRoZW4KKyAgICAgIGRlc3RkaXI9IiRkZXN0IgorICAgICAgZGVzdG5hbWU9CisgICAgZWxzZQorICAgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJGRlc3QiICIiICIuIgorICAgICAgZGVzdGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisgICAgICBkZXN0bmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisgICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCisgICAgICBzZXQgZHVtbXkgJGZpbGVzOyBzaGlmdAorICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKKwlmdW5jX2ZhdGFsX2hlbHAgIlxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIKKyAgICBmaQorICAgIGNhc2UgJGRlc3RkaXIgaW4KKyAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisgICAgKikKKyAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKwljYXNlICRmaWxlIGluCisJKi5sbykgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIgorCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgc3RhdGljbGlicz0KKyAgICBmdXR1cmVfbGliZGlycz0KKyAgICBjdXJyZW50X2xpYmRpcnM9CisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCisgICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi4kbGliZXh0KQorCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCisJZnVuY19hcHBlbmQgc3RhdGljbGlicyAiICRmaWxlIgorCTs7CisKKyAgICAgICoubGEpCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmaWxlIgorCWZpbGU9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAorCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCXJlbGlua19jb21tYW5kPQorCWZ1bmNfc291cmNlICIkZmlsZSIKKworCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KKwlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgY3VycmVudF9saWJkaXJzICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwllbHNlCisJICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCisJICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGZ1dHVyZV9saWJkaXJzICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCisJZnVuY19kaXJuYW1lICIkZmlsZSIgIi8iICIiCisJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKwlmdW5jX2FwcGVuZCBkaXIgIiRvYmpkaXIiCisKKwlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAjIERldGVybWluZSB0aGUgcHJlZml4IHRoZSB1c2VyIGhhcyBhcHBsaWVkIHRvIG91ciBmdXR1cmUgZGlyLgorCSAgaW5zdF9wcmVmaXhfZGlyPWAkRUNITyAiJGRlc3RkaXIiIHwgJFNFRCAtZSAicyUkbGliZGlyXCQlJSJgCisKKwkgICMgRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gcGxhY2UgdXMgb3V0c2lkZSBvZiBvdXIgZXhwZWN0ZWQKKwkgICMgbG9jYXRpb24gYi9jIHRoaXMgcHJldmVudHMgZmluZGluZyBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCB0byB0aGUgc2FtZSBwcmVmaXguCisJICAjIEF0IHByZXNlbnQsIHRoaXMgY2hlY2sgZG9lc24ndCBhZmZlY3Qgd2luZG93cyAuZGxsJ3MgdGhhdAorCSAgIyBhcmUgaW5zdGFsbGVkIGludG8gJGxpYmRpci8uLi9iaW4gKGN1cnJlbnRseSwgdGhhdCB3b3JrcyBmaW5lKQorCSAgIyBidXQgaXQncyBzb21ldGhpbmcgdG8ga2VlcCBhbiBleWUgb24uCisJICB0ZXN0ICIkaW5zdF9wcmVmaXhfZGlyIiA9ICIkZGVzdGRpciIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogY2Fubm90IGluc3RhbGwgXGAkZmlsZScgdG8gYSBkaXJlY3Rvcnkgbm90IGVuZGluZyBpbiAkbGliZGlyIgorCisJICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCSAgICAjIFN0aWNrIHRoZSBpbnN0X3ByZWZpeF9kaXIgZGF0YSBpbnRvIHRoZSBsaW5rIGNvbW1hbmQuCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgInMlQGluc3RfcHJlZml4X2RpckAlLWluc3QtcHJlZml4LWRpciAkaW5zdF9wcmVmaXhfZGlyJSJgCisJICBlbHNlCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJHJlbGlua19jb21tYW5kIiB8ICRTRUQgInMlQGluc3RfcHJlZml4X2RpckAlJSJgCisJICBmaQorCisJICBmdW5jX3dhcm5pbmcgInJlbGlua2luZyBcYCRmaWxlJyIKKwkgIGZ1bmNfc2hvd19ldmFsICIkcmVsaW5rX2NvbW1hbmQiIFwKKwkgICAgJ2Z1bmNfZmF0YWxfZXJyb3IgImVycm9yOiByZWxpbmsgXGAkZmlsZSdcJycgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCInCisJZmkKKworCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisJc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzOyBzaGlmdAorCWlmIHRlc3QgLW4gIiQxIjsgdGhlbgorCSAgcmVhbG5hbWU9IiQxIgorCSAgc2hpZnQKKworCSAgc3JjbmFtZT0iJHJlYWxuYW1lIgorCSAgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIiAmJiBzcmNuYW1lPSIkcmVhbG5hbWUiVAorCisJICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfc2hhcmVkX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIFwKKwkgICAgICAnZXhpdCAkPycKKwkgIHRzdHJpcG1lPSIkc3RyaXBtZSIKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKwkgICAgY2FzZSAkcmVhbG5hbWUgaW4KKwkgICAgKi5kbGwuYSkKKwkgICAgICB0c3RyaXBtZT0iIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgLW4gIiR0c3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgorCSAgICBmdW5jX3Nob3dfZXZhbCAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIgJ2V4aXQgJD8nCisJICBmaQorCisJICBpZiB0ZXN0ICIkIyIgLWd0IDA7IHRoZW4KKwkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KKwkgICAgIyBUcnkgYGxuIC1zZicgZmlyc3QsIGJlY2F1c2UgdGhlIGBsbicgYmluYXJ5IG1pZ2h0IGRlcGVuZCBvbgorCSAgICAjIHRoZSBzeW1saW5rIHdlIHJlcGxhY2UhICBTb2xhcmlzIC9iaW4vbG4gZG9lcyBub3QgdW5kZXJzdGFuZCAtZiwKKwkgICAgIyBzbyB3ZSBhbHNvIG5lZWQgdG8gdHJ5IHJtICYmIGxuIC1zLgorCSAgICBmb3IgbGlua25hbWUKKwkgICAgZG8KKwkgICAgICB0ZXN0ICIkbGlua25hbWUiICE9ICIkcmVhbG5hbWUiIFwKKwkJJiYgZnVuY19zaG93X2V2YWwgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkUk0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgorCSAgICBkb25lCisJICBmaQorCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisJICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGluc3RhbGxfY21kcyIgJ2V4aXQgJD8nCisJZmkKKworCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgorCWZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCisJZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiAnZXhpdCAkPycKKworCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KKwl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGZ1bmNfYXBwZW5kIHN0YXRpY2xpYnMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwk7OworCisgICAgICAqLmxvKQorCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgorCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJICBkZXN0ZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwljYXNlICRkZXN0ZmlsZSBpbgorCSoubG8pCisJICBmdW5jX2xvMm8gIiRkZXN0ZmlsZSIKKwkgIHN0YXRpY2Rlc3Q9JGZ1bmNfbG8yb19yZXN1bHQKKwkgIDs7CisJKi4kb2JqZXh0KQorCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgorCSAgZGVzdGZpbGU9CisJICA7OworCSopCisJICBmdW5jX2ZhdGFsX2hlbHAgImNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIgorCSAgOzsKKwllc2FjCisKKwkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KKwl0ZXN0IC1uICIkZGVzdGZpbGUiICYmIFwKKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgJ2V4aXQgJD8nCisKKwkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KKwlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCSAgZnVuY19sbzJvICIkZmlsZSIKKwkgIHN0YXRpY29iaj0kZnVuY19sbzJvX3Jlc3VsdAorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiAnZXhpdCAkPycKKwlmaQorCWV4aXQgJEVYSVRfU1VDQ0VTUworCTs7CisKKyAgICAgICopCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJICBkZXN0ZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCBhbmQgdGhlcmUgaXMgYSAuZXhlIG9uIHRoZSBlbmQsIHN0cmlwIGl0CisJIyBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IGEgbGlidG9vbCBzY3JpcHQgd2UgYWN0dWFsbHkgd2FudCB0bworCSMgaW5zdGFsbAorCXN0cmlwcGVkX2V4dD0iIgorCWNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgICAgZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgc3RyaXBwZWRfZXh0PSIuZXhlIgorCSAgICBmaQorCSAgICA7OworCWVzYWMKKworCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwljYXNlICRob3N0IGluCisJKmN5Z3dpbiogfCAqbWluZ3cqKQorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHdyYXBwZXI9JGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgIGVsc2UKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICAgIHdyYXBwZXI9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICBmaQorCSAgICA7OworCSopCisJICAgIHdyYXBwZXI9JGZpbGUKKwkgICAgOzsKKwllc2FjCisJaWYgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiR3cmFwcGVyIjsgdGhlbgorCSAgbm90aW5zdF9kZXBsaWJzPQorCSAgcmVsaW5rX2NvbW1hbmQ9CisKKwkgIGZ1bmNfc291cmNlICIkd3JhcHBlciIKKworCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCisJICB0ZXN0IC16ICIkZ2VuZXJhdGVkX2J5X2xpYnRvb2xfdmVyc2lvbiIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkd3JhcHBlciciCisKKwkgIGZpbmFsaXplPXllcworCSAgZm9yIGxpYiBpbiAkbm90aW5zdF9kZXBsaWJzOyBkbworCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCisJICAgIGxpYmRpcj0KKwkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkgICAgICBmdW5jX3NvdXJjZSAiJGxpYiIKKwkgICAgZmkKKwkgICAgbGliZmlsZT0iJGxpYmRpci8iYCRFQ0hPICIkbGliIiB8ICRTRUQgJ3MlXi4qLyUlZydgICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfd2FybmluZyAiXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciCisJICAgICAgZmluYWxpemU9bm8KKwkgICAgZmkKKwkgIGRvbmUKKworCSAgcmVsaW5rX2NvbW1hbmQ9CisJICBmdW5jX3NvdXJjZSAiJHdyYXBwZXIiCisKKwkgIG91dHB1dG5hbWU9CisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzOyB0aGVuCisJICAgICAgICB0bXBkaXI9YGZ1bmNfbWt0ZW1wZGlyYAorCQlmdW5jX2Jhc2VuYW1lICIkZmlsZSRzdHJpcHBlZF9leHQiCisJCWZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgICAgIG91dHB1dG5hbWU9IiR0bXBkaXIvJGZpbGUiCisJICAgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJICAgICAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKKworCSAgICAgICAgJG9wdF9zaWxlbnQgfHwgeworCSAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRyZWxpbmtfY29tbWFuZCIKKwkJICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisJICAgICAgICB9CisJICAgICAgICBpZiBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKKwkgICAgICAgICAgZWxzZQorCQkgIGZ1bmNfZXJyb3IgImVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIKKwkJICAkb3B0X2RyeV9ydW4gfHwgJHtSTX1yICIkdG1wZGlyIgorCQkgIGNvbnRpbnVlCisJICAgICAgICBmaQorCSAgICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCisJICAgICAgZWxzZQorCSAgICAgICAgZnVuY193YXJuaW5nICJjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIgorCSAgICAgIGZpCisJICAgIH0KKwkgIGVsc2UKKwkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgorCSAgICBmaWxlPWAkRUNITyAiJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRTRUQgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCisJICBmaQorCWZpCisKKwkjIHJlbW92ZSAuZXhlIHNpbmNlIGN5Z3dpbiAvdXNyL2Jpbi9pbnN0YWxsIHdpbGwgYXBwZW5kIGFub3RoZXIKKwkjIG9uZSBhbnl3YXkKKwljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KKwkqL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCisJICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgorCSAgKi5leGU6Ki5leGUpCisJICAgICMgdGhpcyBpcyBvaworCSAgICA7OworCSAgKi5leGU6KikKKwkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQorCSAgICA7OworCSAgKjoqLmV4ZSkKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZGVzdGZpbGUiCisJICAgIGRlc3RmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiAnZXhpdCAkPycKKwkkb3B0X2RyeV9ydW4gfHwgaWYgdGVzdCAtbiAiJG91dHB1dG5hbWUiOyB0aGVuCisJICAke1JNfXIgIiR0bXBkaXIiCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbworICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisgICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgJ2V4aXQgJD8nCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICIkb2xkX3N0cmlwbGliICRvbGRsaWIiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgJ2V4aXQgJD8nCisgICAgZG9uZQorCisgICAgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIiAmJiBcCisgICAgICBmdW5jX3dhcm5pbmcgInJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgICRvcHRfZHJ5X3J1biAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjX2NtZD0nJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCisgICAgZWxzZQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGluc3RhbGwgJiYgZnVuY19tb2RlX2luc3RhbGwgJHsxKyIkQCJ9CisKKworIyBmdW5jX2dlbmVyYXRlX2Rsc3ltcyBvdXRwdXRuYW1lIG9yaWdpbmF0b3IgcGljX3AKKyMgRXh0cmFjdCBzeW1ib2xzIGZyb20gZGxwcmVmaWxlcyBhbmQgY3JlYXRlICR7b3V0cHV0bmFtZX1TLm8gd2l0aAorIyBhIGRscHJlb3BlbiBzeW1ib2wgdGFibGUuCitmdW5jX2dlbmVyYXRlX2Rsc3ltcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9vdXRwdXRuYW1lPSIkMSIKKyAgICBteV9vcmlnaW5hdG9yPSIkMiIKKyAgICBteV9waWNfcD0iJHszLW5vfSIKKyAgICBteV9wcmVmaXg9YCRFQ0hPICIkbXlfb3JpZ2luYXRvciIgfCBzZWQgJ3MlW15hLXpBLVowLTldJV8lZydgCisgICAgbXlfZGxzeW1zPQorCisgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwlteV9kbHN5bXM9IiR7bXlfb3V0cHV0bmFtZX1TLmMiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAibm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJG15X2Rsc3ltcyI7IHRoZW4KKyAgICAgIGNhc2UgJG15X2Rsc3ltcyBpbgorICAgICAgIiIpIDs7CisgICAgICAqLmMpCisJIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKwlubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfS5ubSIKKworCWZ1bmNfc2hvd19ldmFsICIkUk0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisKKwkjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgorCWZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKworCSRvcHRfZHJ5X3J1biB8fCAkRUNITyA+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorLyogJG15X2Rsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRteV9vdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIFwiQ1wiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDQpKSB8fCAoX19HTlVDX18gPiA0KSkKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCBcIi1Xc3RyaWN0LXByb3RvdHlwZXNcIgorI2VuZGlmCisKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwlpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAkb3B0X2RyeV9ydW4gfHwgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwkgIHByb2dmaWxlcz1gJEVDSE8gIiRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwkgIGZvciBwcm9nZmlsZSBpbiAkcHJvZ2ZpbGVzOyBkbworCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHByb2dmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCciCisJICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkTk0gJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgfQorCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICB9CisJICBmaQorCisJICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCSAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisgICAgICAgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZWxzZQorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgIiR7U0VEfSAtZSAncy9cKFtdLlsqXiRdXCkvXFxcXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJworCSAgICAgIGV2YWwgJyRHUkVQIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkgICAgICAgICAgZXZhbCAnY2F0ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZmkKKwlmaQorCisJZm9yIGRscHJlZmlsZSBpbiAkZGxwcmVmaWxlczsgZG8KKwkgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkZGxwcmVmaWxlJyIKKwkgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGUiCisJICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAjIGlmIGFuIGltcG9ydCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIG9idGFpbiBkbG5hbWUKKwkgICAgICBpZiBmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCAiJGRscHJlZmlsZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfdHJfc2ggIiRkbHByZWZpbGUiCisJICAgICAgICBldmFsICJjdXJyX2xhZmlsZT1cJGxpYmZpbGVfJGZ1bmNfdHJfc2hfcmVzdWx0IgorCSAgICAgICAgZGxwcmVmaWxlX2RsYmFzZW5hbWU9IiIKKwkgICAgICAgIGlmIHRlc3QgLW4gIiRjdXJyX2xhZmlsZSIgJiYgZnVuY19sYWxpYl9wICIkY3Vycl9sYWZpbGUiOyB0aGVuCisJICAgICAgICAgICMgVXNlIHN1YnNoZWxsLCB0byBhdm9pZCBjbG9iYmVyaW5nIGN1cnJlbnQgdmFyaWFibGUgdmFsdWVzCisJICAgICAgICAgIGRscHJlZmlsZV9kbG5hbWU9YHNvdXJjZSAiJGN1cnJfbGFmaWxlIiAmJiBlY2hvICIkZGxuYW1lImAKKwkgICAgICAgICAgaWYgdGVzdCAtbiAiJGRscHJlZmlsZV9kbG5hbWUiIDsgdGhlbgorCSAgICAgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGVfZGxuYW1lIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICAjIG5vIGxhZmlsZS4gdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCAtZGxwcmVvcGVuIDxpbXBvcnQgbGlicmFyeT4uCisJICAgICAgICAgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kICIkZGxwcmVmaWxlIgorCSAgICAgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorCSAgICAgICAgICBmaQorCSAgICAgICAgZmkKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbHByZWZpbGVfZGxiYXNlbmFtZSIgOyB0aGVuCisJICAgICAgICAgICAgZXZhbCAnJEVDSE8gIjogJGRscHJlZmlsZV9kbGJhc2VuYW1lIiA+PiAiJG5saXN0IicKKwkgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgIGZ1bmNfd2FybmluZyAiQ291bGQgbm90IGNvbXB1dGUgRExMIG5hbWUgZnJvbSAkbmFtZSIKKwkgICAgICAgICAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAgICAgICBmaQorCSAgICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgICAgZXZhbCAiJE5NIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8CisJICAgICAgICAgICAgJFNFRCAtZSAnL0kgX19pbXAvZCcgLWUgJ3MvSSBfX25tXy9EIC87cy9fbm1fXy8vJyA+PiAnJG5saXN0JyIKKwkgICAgICAgIH0KKwkgICAgICBlbHNlICMgbm90IGFuIGltcG9ydCBsaWIKKwkgICAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkZGxwcmVmaWxlIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorCSAgICAgICAgICBldmFsICIkTk0gXCIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICAgICAgfQorCSAgICAgIGZpCisJICAgIDs7CisJICAgICopCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgIGV2YWwgIiROTSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgICAgfQorCSAgICA7OworICAgICAgICAgIGVzYWMKKwlkb25lCisKKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgorCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKKwkgICAgJE1WICIkbmxpc3QiVCAiJG5saXN0IgorCSAgZmkKKworCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKwkgIGlmICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgfAorCSAgICAgIGlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzb3J0IC1rIDMKKwkgICAgICBlbHNlCisJCXNvcnQgKzIKKwkgICAgICBmaSB8CisJICAgICAgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiJworCSAgZWxzZQorCSAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgIGZpCisKKwkgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAqYWRkcmVzczsKK30gbHRfZGxzeW1saXN0OworZXh0ZXJuIExUX0RMU1lNX0NPTlNUIGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdOworTFRfRExTWU1fQ09OU1QgbHRfZGxzeW1saXN0CitsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW10gPQore1wKKyAgeyBcIiRteV9vcmlnaW5hdG9yXCIsICh2b2lkICopIDAgfSwiCisKKwkgIGNhc2UgJG5lZWRfbGliX3ByZWZpeCBpbgorCSAgbm8pCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgICA7OworCSAgKikKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZlwKKyIKKwl9ICMgISRvcHRfZHJ5X3J1bgorCisJcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQorCWNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgorCSoiIC1zdGF0aWMgIiopIDs7CisJKikKKwkgIGNhc2UgJGhvc3QgaW4KKwkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAorCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCisJICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCisJICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KKwkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCisJICAqLSotZnJlZWJzZDIqfCotKi1mcmVlYnNkMy4wKnwqLSotZnJlZWJzZGVsZjMuMCopCisJICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCIgOzsKKwkgICotKi1ocHV4KikKKwkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIiAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIlgkbXlfcGljX3AiICE9IFhubzsgdGhlbgorCSAgICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCXN5bXRhYl9jZmxhZ3M9CisJZm9yIGFyZyBpbiAkTFRDRkxBR1M7IGRvCisJICBjYXNlICRhcmcgaW4KKwkgIC1waWUgfCAtZnBpZSB8IC1mUElFKSA7OworCSAgKikgZnVuY19hcHBlbmQgc3ltdGFiX2NmbGFncyAiICRhcmciIDs7CisJICBlc2FjCisJZG9uZQorCisJIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KKwlmdW5jX3Nob3dfZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDJHN5bXRhYl9jZmxhZ3MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJG15X2Rsc3ltcyIpJyAnZXhpdCAkPycKKworCSMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIicKKworCSMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCisJc3ltZmlsZW9iaj0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfVMuJG9iamV4dCIKKwljYXNlICRob3N0IGluCisJKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYiOyB0aGVuCisJICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYgJHN5bWZpbGVvYmolImAKKwkgIGVsc2UKKwkgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpCisJICA7OworCSopCisJICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIDs7CisJZXNhYworCTs7CisgICAgICAqKQorCWZ1bmNfZmF0YWxfZXJyb3IgInVua25vd24gc3VmZml4IGZvciBcYCRteV9kbHN5bXMnIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KKyAgICAgICMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKyAgICAgICMgcmVhbGx5IHdhcyByZXF1aXJlZC4KKworICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKyAgICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlIEBTWU1GSUxFQCUlImAKKyAgICBmaQorfQorCisjIGZ1bmNfd2luMzJfbGliaWQgYXJnCisjIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKKyMKKyMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicworIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKKyMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgorIyBEZXNwaXRlIHRoZSBuYW1lLCBhbHNvIGRlYWwgd2l0aCA2NCBiaXQgYmluYXJpZXMuCitmdW5jX3dpbjMyX2xpYmlkICgpCit7CisgICRvcHRfZGVidWcKKyAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKKyAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKKyAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCisgICAgOzsKKyAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYworICAgICMgS2VlcCB0aGUgZWdyZXAgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ELgorICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwKKyAgICAgICAkRUdSRVAgJ2ZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgZnVuY190b190b29sX2ZpbGUgIiQxIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgd2luMzJfbm1yZXM9YGV2YWwgJE5NIC1mIHBvc2l4IC1BIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIHwKKwkkU0VEIC1uIC1lICcKKwkgICAgMSwxMDB7CisJCS8gSSAveworCQkgICAgcywuKixpbXBvcnQsCisJCSAgICBwCisJCSAgICBxCisJCX0KKwkgICAgfSdgCisgICAgICBjYXNlICR3aW4zMl9ubXJlcyBpbgorICAgICAgaW1wb3J0KikgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIGltcG9ydCI7OworICAgICAgKikgICAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBhcmNoaXZlIHN0YXRpYyI7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgKkRMTCopCisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICA7OworICAqZXhlY3V0YWJsZSopICMgYnV0IHNoZWxsIHNjcmlwdHMgYXJlICJleGVjdXRhYmxlIiB0b28uLi4KKyAgICBjYXNlICR3aW4zMl9maWxlcmVzIGluCisgICAgKk1TXCBXaW5kb3dzXCBQRVwgSW50ZWwqKQorICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IERMTCIKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgJEVDSE8gIiR3aW4zMl9saWJpZF90eXBlIgorfQorCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYiBBUkcKKyMKKyMgUGxhdGZvcm0tc3BlY2lmaWMgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUKKyMgbmFtZSBvZiB0aGUgRExMIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisjIGltcG9ydCBsaWJyYXJ5IEFSRy4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gJERMTFRPT0wgLS1pZGVudGlmeS1zdHJpY3QgLS1pZGVudGlmeSAiJDEiYAorfQorCisjIGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlIFNFQ1RJT05fTkFNRSBMSUJOQU1FcworIworIyBUaGUgaXMgdGhlIGNvcmUgb2YgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiBhCisjIHBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlCisjIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeSBMSUJOQU1FLgorIworIyBTRUNUSU9OX05BTUUgaXMgZWl0aGVyIC5pZGF0YSQ2IG9yIC5pZGF0YSQ3LCBkZXBlbmRpbmcKKyMgb24gdGhlIHBsYXRmb3JtIGFuZCBjb21waWxlciB0aGF0IGNyZWF0ZWQgdGhlIGltcGxpYi4KKyMKKyMgRWNob3MgdGhlIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlCisjIHNwZWNpZmllZCBpbXBvcnQgbGlicmFyeS4KK2Z1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlICgpCit7CisgICRvcHRfZGVidWcKKyAgbWF0Y2hfbGl0ZXJhbD1gJEVDSE8gIiQxIiB8ICRTRUQgIiRzZWRfbWFrZV9saXRlcmFsX3JlZ2V4ImAKKyAgJE9CSkRVTVAgLXMgLS1zZWN0aW9uICIkMSIgIiQyIiAyPi9kZXYvbnVsbCB8CisgICAgJFNFRCAnL15Db250ZW50cyBvZiBzZWN0aW9uICciJG1hdGNoX2xpdGVyYWwiJzoveworICAgICAgIyBQbGFjZSBtYXJrZXIgYXQgYmVnaW5uaW5nIG9mIGFyY2hpdmUgbWVtYmVyIGRsbG5hbWUgc2VjdGlvbgorICAgICAgcy8uKi89PT09TUFSSz09PT0vCisgICAgICBwCisgICAgICBkCisgICAgfQorICAgICMgVGhlc2UgbGluZXMgY2FuIHNvbWV0aW1lcyBiZSBsb25nZXIgdGhhbiA0MyBjaGFyYWN0ZXJzLCBidXQKKyAgICAjIGFyZSBhbHdheXMgdW5pbnRlcmVzdGluZworICAgIC86WwkgXSpmaWxlIGZvcm1hdCBwZVtpXVx7LDFcfS0vZAorICAgIC9eSW4gYXJjaGl2ZSBbXjpdKjovZAorICAgICMgRW5zdXJlIG1hcmtlciBpcyBwcmludGVkCisgICAgL149PT09TUFSSz09PT0vcAorICAgICMgUmVtb3ZlIGFsbCBsaW5lcyB3aXRoIGxlc3MgdGhhbiA0MyBjaGFyYWN0ZXJzCisgICAgL14uXHs0M1x9LyFkCisgICAgIyBGcm9tIHJlbWFpbmluZyBsaW5lcywgcmVtb3ZlIGZpcnN0IDQzIGNoYXJhY3RlcnMKKyAgICBzL14uXHs0M1x9Ly8nIHwKKyAgICAkU0VEIC1uICcKKyAgICAgICMgSm9pbiBtYXJrZXIgYW5kIGFsbCBsaW5lcyB1bnRpbCBuZXh0IG1hcmtlciBpbnRvIGEgc2luZ2xlIGxpbmUKKyAgICAgIC9ePT09PU1BUks9PT09LyBiIHBhcmEKKyAgICAgIEgKKyAgICAgICQgYiBwYXJhCisgICAgICBiCisgICAgICA6cGFyYQorICAgICAgeAorICAgICAgcy9cbi8vZworICAgICAgIyBSZW1vdmUgdGhlIG1hcmtlcgorICAgICAgcy9ePT09PU1BUks9PT09Ly8KKyAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIGRvdHMgYW5kIHdoaXRlc3BhY2UKKyAgICAgIHMvW1wuIFx0XSokLy8KKyAgICAgICMgUHJpbnQKKyAgICAgIC8uL3AnIHwKKyAgICAjIHdlIG5vdyBoYXZlIGEgbGlzdCwgb25lIGVudHJ5IHBlciBsaW5lLCBvZiB0aGUgc3RyaW5naWZpZWQKKyAgICAjIGNvbnRlbnRzIG9mIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIG9mIGFsbCBtZW1iZXJzIG9mIHRoZQorICAgICMgYXJjaGl2ZSB3aGljaCBwb3NzZXNzIHRoYXQgc2VjdGlvbi4gSGV1cmlzdGljOiBlbGltaW5hdGUKKyAgICAjIGFsbCB0aG9zZSB3aGljaCBoYXZlIGEgZmlyc3Qgb3Igc2Vjb25kIGNoYXJhY3RlciB0aGF0IGlzCisgICAgIyBhICcuJyAodGhhdCBpcywgb2JqZHVtcCdzIHJlcHJlc2VudGF0aW9uIG9mIGFuIHVucHJpbnRhYmxlCisgICAgIyBjaGFyYWN0ZXIuKSBUaGlzIHNob3VsZCB3b3JrIGZvciBhbGwgYXJjaGl2ZXMgd2l0aCBsZXNzIHRoYW4KKyAgICAjIDB4MzAyZiBleHBvcnRzIC0tIGJ1dCB3aWxsIGZhaWwgZm9yIERMTHMgd2hvc2UgbmFtZSBhY3R1YWxseQorICAgICMgYmVnaW5zIHdpdGggYSBsaXRlcmFsICcuJyBvciBhIHNpbmdsZSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkKKyAgICAjIGEgJy4nLgorICAgICMKKyAgICAjIE9mIHRob3NlIHRoYXQgcmVtYWluLCBwcmludCB0aGUgZmlyc3Qgb25lLgorICAgICRTRUQgLWUgJy9eXC4vZDsvXi5cLi9kO3EnCit9CisKKyMgZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYSBHTlUvYmludXRpbHMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19nbnVfaW1wbGliX3AgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX3Rvb2xfZmlsZSAiJDEiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgIGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3RtcD1gJE5NICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiB8IGV2YWwgIiRnbG9iYWxfc3ltYm9sX3BpcGUiIHwgJEVHUkVQICcgKF9oZWFkX1tBLVphLXowLTlfXStfW2FkXWwqfFtBLVphLXowLTlfXStfW2FkXWwqX2luYW1lKSQnYAorICB0ZXN0IC1uICIkZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfdG1wIgorfQorCisjIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfcCBBUkcKKyMgVGhpcyBwcmVkaWNhdGUgcmV0dXJucyB3aXRoIHplcm8gc3RhdHVzIChUUlVFKSBpZgorIyBBUkcgaXMgYW4gTVMtc3R5bGUgaW1wb3J0IGxpYnJhcnkuIFJldHVybnMKKyMgd2l0aCBub256ZXJvIHN0YXR1cyAoRkFMU0UpIG90aGVyd2lzZS4KK2Z1bmNfY3lnbWluZ19tc19pbXBsaWJfcCAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgZnVuY19jeWdtaW5nX21zX2ltcGxpYl90bXA9YCROTSAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgfCBldmFsICIkZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRHUkVQICdfTlVMTF9JTVBPUlRfREVTQ1JJUFRPUidgCisgIHRlc3QgLW4gIiRmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3RtcCIKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgQVJHCisjIFBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCisjIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorIyBpbXBvcnQgbGlicmFyeSBBUkcuCisjCisjIFRoaXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaXMgZm9yIHVzZSB3aGVuICRETExUT09MCisjIGRvZXMgbm90IHN1cHBvcnQgdGhlIC0taWRlbnRpZnktc3RyaWN0IG9wdGlvbi4KKyMgSW52b2tlZCBieSBldmFsJ2luZyB0aGUgbGlidG9vbCB2YXJpYWJsZQorIyAgICAkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKyMgUmVzdWx0IGlzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0CitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiBmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBiaW51dGlscyBpbXBvcnQgbGlicmFyeQorICAgIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0PWBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSAnLmlkYXRhJDcnICIkMSJgCisgIGVsaWYgZnVuY19jeWdtaW5nX21zX2ltcGxpYl9wICIkMSIgOyB0aGVuCisgICAgIyBtcy1nZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkKKyAgICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrX2NvcmUgJy5pZGF0YSQ2JyAiJDEiYAorICBlbHNlCisgICAgIyB1bmtub3duCisgICAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9IiIKKyAgZmkKK30KKworCisjIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKK2Z1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0CisgICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgorICAgIGlmIHRlc3QgIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iID0geWVzOyB0aGVuCisgICAgICBsb2NrZmlsZT0kZl9leF9hbl9hcl9vbGRsaWIubG9jaworICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGZpCisgICAgZnVuY19zaG93X2V2YWwgIihjZCBcJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4IFwiXCRmX2V4X2FuX2FyX29sZGxpYlwiKSIgXAorCQkgICAnc3RhdD0kPzsgcm0gLWYgIiRsb2NrZmlsZSI7IGV4aXQgJHN0YXQnCisgICAgaWYgdGVzdCAiJGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbiIgPSB5ZXM7IHRoZW4KKyAgICAgICRvcHRfZHJ5X3J1biB8fCBybSAtZiAiJGxvY2tmaWxlIgorICAgIGZpCisgICAgaWYgKCRBUiB0ICIkZl9leF9hbl9hcl9vbGRsaWIiIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgOgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9iamVjdCBuYW1lIGNvbmZsaWN0cyBpbiBhcmNoaXZlOiAkZl9leF9hbl9hcl9kaXIvJGZfZXhfYW5fYXJfb2xkbGliIgorICAgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgZ2VudG9wIG9sZGxpYiAuLi4KK2Z1bmNfZXh0cmFjdF9hcmNoaXZlcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9nZW50b3A9IiQxIjsgc2hpZnQKKyAgICBteV9vbGRsaWJzPSR7MSsiJEAifQorICAgIG15X29sZG9ianM9IiIKKyAgICBteV94bGliPSIiCisgICAgbXlfeGFicz0iIgorICAgIG15X3hkaXI9IiIKKworICAgIGZvciBteV94bGliIGluICRteV9vbGRsaWJzOyBkbworICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorICAgICAgY2FzZSAkbXlfeGxpYiBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgbXlfeGFicz0iJG15X3hsaWIiIDs7CisJKikgbXlfeGFicz1gcHdkYCIvJG15X3hsaWIiIDs7CisgICAgICBlc2FjCisgICAgICBmdW5jX2Jhc2VuYW1lICIkbXlfeGxpYiIKKyAgICAgIG15X3hsaWI9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIG15X3hsaWJfdT0kbXlfeGxpYgorICAgICAgd2hpbGUgOjsgZG8KKyAgICAgICAgY2FzZSAiICRleHRyYWN0ZWRfYXJjaGl2ZXMgIiBpbgorCSoiICRteV94bGliX3UgIiopCisJICBmdW5jX2FyaXRoICRleHRyYWN0ZWRfc2VyaWFsICsgMQorCSAgZXh0cmFjdGVkX3NlcmlhbD0kZnVuY19hcml0aF9yZXN1bHQKKwkgIG15X3hsaWJfdT1sdCRleHRyYWN0ZWRfc2VyaWFsLSRteV94bGliIDs7CisJKikgYnJlYWsgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBleHRyYWN0ZWRfYXJjaGl2ZXM9IiRleHRyYWN0ZWRfYXJjaGl2ZXMgJG15X3hsaWJfdSIKKyAgICAgIG15X3hkaXI9IiRteV9nZW50b3AvJG15X3hsaWJfdSIKKworICAgICAgZnVuY19ta2Rpcl9wICIkbXlfeGRpciIKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi1kYXJ3aW4qKQorCWZ1bmNfdmVyYm9zZSAiRXh0cmFjdGluZyAkbXlfeGFicyIKKwkjIERvIG5vdCBib3RoZXIgZG9pbmcgYW55dGhpbmcgaWYganVzdCBhIGRyeSBydW4KKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgZGFyd2luX29yaWdfZGlyPWBwd2RgCisJICBjZCAkbXlfeGRpciB8fCBleGl0ICQ/CisJICBkYXJ3aW5fYXJjaGl2ZT0kbXlfeGFicworCSAgZGFyd2luX2N1cmRpcj1gcHdkYAorCSAgZGFyd2luX2Jhc2VfYXJjaGl2ZT1gYmFzZW5hbWUgIiRkYXJ3aW5fYXJjaGl2ZSJgCisJICBkYXJ3aW5fYXJjaGVzPWAkTElQTyAtaW5mbyAiJGRhcndpbl9hcmNoaXZlIiAyPi9kZXYvbnVsbCB8ICRHUkVQIEFyY2hpdGVjdHVyZXMgMj4vZGV2L251bGwgfHwgdHJ1ZWAKKwkgIGlmIHRlc3QgLW4gIiRkYXJ3aW5fYXJjaGVzIjsgdGhlbgorCSAgICBkYXJ3aW5fYXJjaGVzPWAkRUNITyAiJGRhcndpbl9hcmNoZXMiIHwgJFNFRCAtZSAncy8uKmFyZTovLydgCisJICAgIGRhcndpbl9hcmNoPQorCSAgICBmdW5jX3ZlcmJvc2UgIiRkYXJ3aW5fYmFzZV9hcmNoaXZlIGhhcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICRkYXJ3aW5fYXJjaGVzIgorCSAgICBmb3IgZGFyd2luX2FyY2ggaW4gICRkYXJ3aW5fYXJjaGVzIDsgZG8KKwkgICAgICBmdW5jX21rZGlyX3AgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCisJICAgICAgJExJUE8gLXRoaW4gJGRhcndpbl9hcmNoIC1vdXRwdXQgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIgIiR7ZGFyd2luX2FyY2hpdmV9IgorCSAgICAgIGNkICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICJgcHdkYCIgIiR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCisJICAgICAgY2QgIiRkYXJ3aW5fY3VyZGlyIgorCSAgICAgICRSTSAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICBkb25lICMgJGRhcndpbl9hcmNoZXMKKyAgICAgICAgICAgICMjIE9rYXkgbm93IHdlJ3ZlIGEgYnVuY2ggb2YgdGhpbiBvYmplY3RzLCBnb3R0YSBmYXR0ZW4gdGhlbSB1cCA6KQorCSAgICBkYXJ3aW5fZmlsZWxpc3Q9YGZpbmQgdW5mYXQtJCQgLXR5cGUgZiAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkU0VEIC1lICIkYmFzZW5hbWUiIHwgc29ydCAtdWAKKwkgICAgZGFyd2luX2ZpbGU9CisJICAgIGRhcndpbl9maWxlcz0KKwkgICAgZm9yIGRhcndpbl9maWxlIGluICRkYXJ3aW5fZmlsZWxpc3Q7IGRvCisJICAgICAgZGFyd2luX2ZpbGVzPWBmaW5kIHVuZmF0LSQkIC1uYW1lICRkYXJ3aW5fZmlsZSAtcHJpbnQgfCBzb3J0IHwgJE5MMlNQYAorCSAgICAgICRMSVBPIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCisJICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0CisJICAgICRSTSAtcmYgdW5mYXQtJCQKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisJICBlbHNlCisJICAgIGNkICRkYXJ3aW5fb3JpZ19kaXIKKwkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJICBmaSAjICRkYXJ3aW5fYXJjaGVzCisJfSAjICEkb3B0X2RyeV9ydW4KKwk7OworICAgICAgKikKKyAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCBzb3J0IHwgJE5MMlNQYAorICAgIGRvbmUKKworICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgorfQorCisKKyMgZnVuY19lbWl0X3dyYXBwZXIgW2FyZz1ub10KKyMKKyMgRW1pdCBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb24gc3Rkb3V0LgorIyBEb24ndCBkaXJlY3RseSBvcGVuIGEgZmlsZSBiZWNhdXNlIHdlIG1heSB3YW50IHRvCisjIGluY29ycG9yYXRlIHRoZSBzY3JpcHQgY29udGVudHMgd2l0aGluIGEgY3lnd2luL21pbmd3CisjIHdyYXBwZXIgZXhlY3V0YWJsZS4gIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4KKyMgZnVuY19tb2RlX2xpbmsgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlcworIyBzZXQgdGhlcmVpbi4KKyMKKyMgQVJHIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZSBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUgorIyB2YXJpYWJsZSB3aWxsIHRha2UuICBJZiAneWVzJywgdGhlbiB0aGUgZW1pdHRlZCBzY3JpcHQKKyMgd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGlzIHN0b3JlZCBpcworIyB0aGUgJG9iamRpciBkaXJlY3RvcnkuICBUaGlzIGlzIGEgY3lnd2luL21pbmd3LXNwZWNpZmljCisjIGJlaGF2aW9yLgorZnVuY19lbWl0X3dyYXBwZXIgKCkKK3sKKwlmdW5jX2VtaXRfd3JhcHBlcl9hcmcxPSR7MS1ub30KKworCSRFQ0hPICJcCisjISAkU0hFTEwKKworIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisjIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKyMKKyMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisjIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorICBnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uPSckbWFjcm9fdmVyc2lvbicKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkRUNITyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBmaWxlPVwiXCQwXCIiCisKKyAgICBxRUNITz1gJEVDSE8gIiRFQ0hPIiB8ICRTRUQgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICRFQ0hPICJcCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorXCQxCitfTFRFQ0hPX0VPRicKK30KKyAgICBFQ0hPPVwiJHFFQ0hPXCIKKyAgZmkKKworIyBWZXJ5IGJhc2ljIG9wdGlvbiBwYXJzaW5nLiBUaGVzZSBvcHRpb25zIGFyZSAoYSkgc3BlY2lmaWMgdG8KKyMgdGhlIGxpYnRvb2wgd3JhcHBlciwgKGIpIGFyZSBpZGVudGljYWwgYmV0d2VlbiB0aGUgd3JhcHBlcgorIyAvc2NyaXB0LyBhbmQgdGhlIHdyYXBwZXIgL2V4ZWN1dGFibGUvIHdoaWNoIGlzIHVzZWQgb25seSBvbgorIyB3aW5kb3dzIHBsYXRmb3JtcywgYW5kIChjKSBhbGwgYmVnaW4gd2l0aCB0aGUgc3RyaW5nICItLWx0LSIKKyMgKGFwcGxpY2F0aW9uIHByb2dyYW1zIGFyZSB1bmxpa2VseSB0byBoYXZlIG9wdGlvbnMgd2hpY2ggbWF0Y2gKKyMgdGhpcyBwYXR0ZXJuKS4KKyMKKyMgVGhlcmUgYXJlIG9ubHkgdHdvIHN1cHBvcnRlZCBvcHRpb25zOiAtLWx0LWRlYnVnIGFuZAorIyAtLWx0LWR1bXAtc2NyaXB0LiBUaGVyZSBpcywgZGVsaWJlcmF0ZWx5LCBubyAtLWx0LWhlbHAuCisjCisjIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGlzIHBhcnNpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIHRoZQorIyBzY3JpcHQncyAkMCB2YWx1ZSwgZm9sbG93ZWQgYnkgIiRAIi4KK2x0X29wdGlvbl9kZWJ1Zz0KK2Z1bmNfcGFyc2VfbHRfb3B0aW9ucyAoKQoreworICBsdF9zY3JpcHRfYXJnMD1cJDAKKyAgc2hpZnQKKyAgZm9yIGx0X29wdAorICBkbworICAgIGNhc2UgXCJcJGx0X29wdFwiIGluCisgICAgLS1sdC1kZWJ1ZykgbHRfb3B0aW9uX2RlYnVnPTEgOzsKKyAgICAtLWx0LWR1bXAtc2NyaXB0KQorICAgICAgICBsdF9kdW1wX0Q9XGBcJEVDSE8gXCJYXCRsdF9zY3JpcHRfYXJnMFwiIHwgJFNFRCAtZSAncy9eWC8vJyAtZSAncyUvW14vXSokJSUnXGAKKyAgICAgICAgdGVzdCBcIlhcJGx0X2R1bXBfRFwiID0gXCJYXCRsdF9zY3JpcHRfYXJnMFwiICYmIGx0X2R1bXBfRD0uCisgICAgICAgIGx0X2R1bXBfRj1cYFwkRUNITyBcIlhcJGx0X3NjcmlwdF9hcmcwXCIgfCAkU0VEIC1lICdzL15YLy8nIC1lICdzJV4uKi8lJSdcYAorICAgICAgICBjYXQgXCJcJGx0X2R1bXBfRC9cJGx0X2R1bXBfRlwiCisgICAgICAgIGV4aXQgMAorICAgICAgOzsKKyAgICAtLWx0LSopCisgICAgICAgIFwkRUNITyBcIlVucmVjb2duaXplZCAtLWx0LSBvcHRpb246ICdcJGx0X29wdCdcIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIFByaW50IHRoZSBkZWJ1ZyBiYW5uZXIgaW1tZWRpYXRlbHk6CisgIGlmIHRlc3QgLW4gXCJcJGx0X29wdGlvbl9kZWJ1Z1wiOyB0aGVuCisgICAgZWNobyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IGxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cIiAxPiYyCisgIGZpCit9CisKKyMgVXNlZCB3aGVuIC0tbHQtZGVidWcuIFByaW50cyBpdHMgYXJndW1lbnRzIHRvIHN0ZG91dAorIyAocmVkaXJlY3Rpb24gaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIpCitmdW5jX2x0X2R1bXBfYXJncyAoKQoreworICBsdF9kdW1wX2FyZ3NfTj0xOworICBmb3IgbHRfYXJnCisgIGRvCisgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndltcJGx0X2R1bXBfYXJnc19OXTogXCRsdF9hcmdcIgorICAgIGx0X2R1bXBfYXJnc19OPVxgZXhwciBcJGx0X2R1bXBfYXJnc19OICsgMVxgCisgIGRvbmUKK30KKworIyBDb3JlIGZ1bmN0aW9uIGZvciBsYXVuY2hpbmcgdGhlIHRhcmdldCBhcHBsaWNhdGlvbgorZnVuY19leGVjX3Byb2dyYW1fY29yZSAoKQoreworIgorICBjYXNlICRob3N0IGluCisgICMgQmFja3NsYXNoZXMgc2VwYXJhdGUgZGlyZWN0b3JpZXMgb24gcGxhaW4gd2luZG93cworICAqLSotbWluZ3cgfCAqLSotb3MyKiB8ICotY2VnY2MqKQorICAgICRFQ0hPICJcCisgICAgICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgICAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2WzBdOiBcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgMT4mMgorICAgICAgICBmdW5jX2x0X2R1bXBfYXJncyBcJHsxK1wiXCRAXCJ9IDE+JjIKKyAgICAgIGZpCisgICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKyAgICA7OworCisgICopCisgICAgJEVDSE8gIlwKKyAgICAgIGlmIHRlc3QgLW4gXCJcJGx0X29wdGlvbl9kZWJ1Z1wiOyB0aGVuCisgICAgICAgIFwkRUNITyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IG5ld2FyZ3ZbMF06IFwkcHJvZ2Rpci9cJHByb2dyYW1cIiAxPiYyCisgICAgICAgIGZ1bmNfbHRfZHVtcF9hcmdzIFwkezErXCJcJEBcIn0gMT4mMgorICAgICAgZmkKKyAgICAgIGV4ZWMgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQorIgorICAgIDs7CisgIGVzYWMKKyAgJEVDSE8gIlwKKyAgICAgIFwkRUNITyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkKlwiIDE+JjIKKyAgICAgIGV4aXQgMQorfQorCisjIEEgZnVuY3Rpb24gdG8gZW5jYXBzdWxhdGUgbGF1bmNoaW5nIHRoZSB0YXJnZXQgYXBwbGljYXRpb24KKyMgU3RyaXBzIG9wdGlvbnMgaW4gdGhlIC0tbHQtKiBuYW1lc3BhY2UgZnJvbSBcJEAgYW5kCisjIGxhdW5jaGVzIHRhcmdldCBhcHBsaWNhdGlvbiB3aXRoIHRoZSByZW1haW5pbmcgYXJndW1lbnRzLgorZnVuY19leGVjX3Byb2dyYW0gKCkKK3sKKyAgZm9yIGx0X3dyX2FyZworICBkbworICAgIGNhc2UgXCRsdF93cl9hcmcgaW4KKyAgICAtLWx0LSopIDs7CisgICAgKikgc2V0IHggXCJcJEBcIiBcIlwkbHRfd3JfYXJnXCI7IHNoaWZ0OzsKKyAgICBlc2FjCisgICAgc2hpZnQKKyAgZG9uZQorICBmdW5jX2V4ZWNfcHJvZ3JhbV9jb3JlIFwkezErXCJcJEBcIn0KK30KKworICAjIFBhcnNlIG9wdGlvbnMKKyAgZnVuY19wYXJzZV9sdF9vcHRpb25zIFwiXCQwXCIgXCR7MStcIlwkQFwifQorCisgICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCisgIHRoaXNkaXI9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlL1teL10qJCUlJ1xgCisgIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KKworICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KKyAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgJFNFRCAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkRUNITyBcIlwkZmlsZVwiIHwgJFNFRCAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkRUNITyBcIlwkZmlsZVwiIHwgJFNFRCAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJFNFRCAtbiAncy8uKi0+IC8vcCdcYAorICBkb25lCisKKyAgIyBVc3VhbGx5ICdubycsIGV4Y2VwdCBvbiBjeWd3aW4vbWluZ3cgd2hlbiBlbWJlZGRlZCBpbnRvCisgICMgdGhlIGN3cmFwcGVyLgorICBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUj0kZnVuY19lbWl0X3dyYXBwZXJfYXJnMQorICBpZiB0ZXN0IFwiXCRXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUlwiID0gXCJ5ZXNcIjsgdGhlbgorICAgICMgc3BlY2lhbCBjYXNlIGZvciAnLicKKyAgICBpZiB0ZXN0IFwiXCR0aGlzZGlyXCIgPSBcIi5cIjsgdGhlbgorICAgICAgdGhpc2Rpcj1cYHB3ZFxgCisgICAgZmkKKyAgICAjIHJlbW92ZSAubGlicyBmcm9tIHRoaXNkaXIKKyAgICBjYXNlIFwiXCR0aGlzZGlyXCIgaW4KKyAgICAqW1xcXFwvXSRvYmpkaXIgKSB0aGlzZGlyPVxgXCRFQ0hPIFwiXCR0aGlzZGlyXCIgfCAkU0VEICdzJVtcXFxcL11bXlxcXFwvXSokJSUnXGAgOzsKKyAgICAkb2JqZGlyICkgICB0aGlzZGlyPS4gOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KKyAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAorICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgorIgorCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgICRFQ0hPICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRNS0RJUiBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgICRFQ0hPICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRFQ0hPIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgZmkKKworICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJFJNIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgICRFQ0hPICJcCisgIHByb2dyYW09JyRvdXRwdXRuYW1lJworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorIgorCWZpCisKKwkkRUNITyAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgorCSMKKwkjIEZpeCB0aGUgRExMIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4gIERvIHRoaXMgYmVmb3JlIHByZXBlbmRpbmcKKwkjIHRvIHNobGlicGF0aCwgYmVjYXVzZSBvbiBXaW5kb3dzLCBib3RoIGFyZSBQQVRIIGFuZCB1bmluc3RhbGxlZAorCSMgbGlicmFyaWVzIG11c3QgY29tZSBmaXJzdC4KKwlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKwkgICRFQ0hPICJcCisgICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKKyAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAorIgorCWZpCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkRUNITyBcIlwkJHNobGlicGF0aF92YXJcIiB8ICRTRUQgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSRFQ0hPICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKyAgICAgIGZ1bmNfZXhlY19wcm9ncmFtIFwkezErXCJcJEBcIn0KKyAgICBmaQorICBlbHNlCisgICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgorICAgIFwkRUNITyBcIlwkMDogZXJyb3I6IFxcXGBcJHByb2dkaXIvXCRwcm9ncmFtJyBkb2VzIG5vdCBleGlzdFwiIDE+JjIKKyAgICBcJEVDSE8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKKyAgICBcJEVDSE8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCit9CisKKworIyBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisjIGVtaXQgdGhlIHNvdXJjZSBjb2RlIGZvciBhIHdyYXBwZXIgZXhlY3V0YWJsZSBvbiBzdGRvdXQKKyMgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBmdW5jX21vZGVfbGluayBiZWNhdXNlCisjIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGUgc2V0IHRoZXJlaW4uCitmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjICgpCit7CisJY2F0IDw8RU9GCisKKy8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKworICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisgICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisKKyAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKyovCitFT0YKKwkgICAgY2F0IDw8IkVPRiIKKyNpZmRlZiBfTVNDX1ZFUgorIyBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPHByb2Nlc3MuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaWZkZWYgX19DWUdXSU5fXworIyAgaW5jbHVkZSA8aW8uaD4KKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKy8qIGRlY2xhcmF0aW9ucyBvZiBub24tQU5TSSBmdW5jdGlvbnMgKi8KKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBpZmRlZiBfX1NUUklDVF9BTlNJX18KK2ludCBfcHV0ZW52IChjb25zdCBjaGFyICopOworIyBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyBpZmRlZiBfX1NUUklDVF9BTlNJX18KK2NoYXIgKnJlYWxwYXRoIChjb25zdCBjaGFyICosIGNoYXIgKik7CitpbnQgcHV0ZW52IChjaGFyICopOworaW50IHNldGVudiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjIGVuZGlmCisvKiAjZWxpZiBkZWZpbmVkIChvdGhlciBwbGF0Zm9ybXMpIC4uLiAqLworI2VuZGlmCisKKy8qIHBvcnRhYmlsaXR5IGRlZmluZXMsIGV4Y2x1ZGluZyBwYXRoIGhhbmRsaW5nIG1hY3JvcyAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjIGRlZmluZSBzdGF0ICAgIF9zdGF0CisjIGRlZmluZSBjaG1vZCAgIF9jaG1vZAorIyBkZWZpbmUgZ2V0Y3dkICBfZ2V0Y3dkCisjIGRlZmluZSBwdXRlbnYgIF9wdXRlbnYKKyMgZGVmaW5lIFNfSVhVU1IgX1NfSUVYRUMKKyMgaWZuZGVmIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgX0lOVFBUUl9UX0RFRklORUQKKyMgIGRlZmluZSBpbnRwdHJfdCBpbnQKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjIGRlZmluZSBzdGF0ICAgIF9zdGF0CisjIGRlZmluZSBjaG1vZCAgIF9jaG1vZAorIyBkZWZpbmUgZ2V0Y3dkICBfZ2V0Y3dkCisjIGRlZmluZSBwdXRlbnYgIF9wdXRlbnYKKyNlbGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgZGVmaW5lIEhBVkVfU0VURU5WCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisvKiAjZWxpZiBkZWZpbmVkIChvdGhlciBwbGF0Zm9ybXMpIC4uLiAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBBVEhfTUFYKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBQQVRIX01BWAorI2VsaWYgZGVmaW5lZChNQVhQQVRITEVOKQorIyBkZWZpbmUgTFRfUEFUSE1BWCBNQVhQQVRITEVOCisjZWxzZQorIyBkZWZpbmUgTFRfUEFUSE1BWCAxMDI0CisjZW5kaWYKKworI2lmbmRlZiBTX0lYT1RICisjIGRlZmluZSBTX0lYT1RIIDAKKyNlbmRpZgorI2lmbmRlZiBTX0lYR1JQCisjIGRlZmluZSBTX0lYR1JQIDAKKyNlbmRpZgorCisvKiBwYXRoIGhhbmRsaW5nIHBvcnRhYmlsaXR5IG1hY3JvcyAqLworI2lmbmRlZiBESVJfU0VQQVJBVE9SCisjIGRlZmluZSBESVJfU0VQQVJBVE9SICcvJworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfX0RKR1BQX18pIHx8IFwKKyAgZGVmaW5lZCAoX19PUzJfXykKKyMgZGVmaW5lIEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNCisjIGRlZmluZSBGT1BFTl9XQiAid2IiCisjIGlmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBESVJfU0VQQVJBVE9SXzIgJ1xcJworIyBlbmRpZgorIyBpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyAgZGVmaW5lIFBBVEhfU0VQQVJBVE9SXzIgJzsnCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBESVJfU0VQQVJBVE9SXzIKKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpICgoY2gpID09IERJUl9TRVBBUkFUT1IpCisjZWxzZSAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKyMgZGVmaW5lIElTX0RJUl9TRVBBUkFUT1IoY2gpIFwKKwkoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKKyNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKworI2lmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1IpCisjZWxzZSAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1JfMikKKyNlbmRpZiAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgRk9QRU5fV0IKKyMgZGVmaW5lIEZPUEVOX1dCICJ3IgorI2VuZGlmCisjaWZuZGVmIF9PX0JJTkFSWQorIyBkZWZpbmUgX09fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCisjZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKKyAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKK30gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKExUX0RFQlVHV1JBUFBFUikKK3N0YXRpYyBpbnQgbHRfZGVidWcgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbHRfZGVidWcgPSAwOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9ICJsaWJ0b29sLXdyYXBwZXIiOyAvKiBpbiBjYXNlIHhzdHJkdXAgZmFpbHMgKi8KKwordm9pZCAqeG1hbGxvYyAoc2l6ZV90IG51bSk7CitjaGFyICp4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOworY29uc3QgY2hhciAqYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKTsKK2NoYXIgKmZpbmRfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqd3JhcHBlcik7CitjaGFyICpjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpOworaW50IG1ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7CitpbnQgY2hlY2tfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCk7CitjaGFyICpzdHJlbmR6YXAgKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKK3ZvaWQgbHRfZGVidWdwcmludGYgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkIGx0X2ZhdGFsIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKK3N0YXRpYyBjb25zdCBjaGFyICpub25udWxsIChjb25zdCBjaGFyICpzKTsKK3N0YXRpYyBjb25zdCBjaGFyICpub25lbXB0eSAoY29uc3QgY2hhciAqcyk7Cit2b2lkIGx0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworY2hhciAqbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKTsKK3ZvaWQgbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Cit2b2lkIGx0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworY2hhciAqKnByZXBhcmVfc3Bhd24gKGNoYXIgKiphcmd2KTsKK3ZvaWQgbHRfZHVtcF9zY3JpcHQgKEZJTEUgKmYpOworRU9GCisKKwkgICAgY2F0IDw8RU9GCit2b2xhdGlsZSBjb25zdCBjaGFyICogTUFHSUNfRVhFID0gIiRtYWdpY19leGUiOworY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBUk5BTUUgPSAiJHNobGlicGF0aF92YXIiOworRU9GCisKKwkgICAgaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aCAiJHRlbXBfcnBhdGgiCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IjsKK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8IkVPRiIKK2NvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiRkbGxzZWFyY2hwYXRoOiIKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQVJOQU1FID0gIlBBVEgiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICIiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiIjsKK0VPRgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICJsdC0kb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBUQVJHRVRfUFJPR1JBTV9OQU1FID0gIiRvdXRwdXRuYW1lIjsgLyogaG9wZWZ1bGx5LCBubyAuZXhlICovCitFT0YKKwkgICAgZmkKKworCisJICAgIGNhdCA8PCJFT0YiCisKKyNkZWZpbmUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVggICAgICAgICAiLS1sdC0iCisKK3N0YXRpYyBjb25zdCBjaGFyICpsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYOworc3RhdGljIGNvbnN0IGNoYXIgKmR1bXBzY3JpcHRfb3B0ICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImR1bXAtc2NyaXB0IjsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWJ1Z19vcHQgICAgICAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkZWJ1ZyI7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCAgbmV3YXJnYzsKKyAgY2hhciAqdG1wX3BhdGhzcGVjOworICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX25hbWU7CisgIGNoYXIgKnRhcmdldF9uYW1lOworICBjaGFyICpsdF9hcmd2X3plcm87CisgIGludHB0cl90IHJ2YWwgPSAxMjc7CisKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7CisgIG5ld2FyZ3ogPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKKworICAvKiB2ZXJ5IHNpbXBsZSBhcmcgcGFyc2luZzsgZG9uJ3Qgd2FudCB0byByZWx5IG9uIGdldG9wdAorICAgKiBhbHNvLCBjb3B5IGFsbCBub24gY3dyYXBwZXIgb3B0aW9ucyB0byBuZXdhcmd6LCBleGNlcHQKKyAgICogYXJnelswXSwgd2hpY2ggaXMgaGFuZGxlZCBkaWZmZXJlbnRseQorICAgKi8KKyAgbmV3YXJnYz0wOworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGR1bXBzY3JpcHRfb3B0KSA9PSAwKQorCXsKK0VPRgorCSAgICBjYXNlICIkaG9zdCIgaW4KKwkgICAgICAqbWluZ3cqIHwgKmN5Z3dpbiogKQorCQkjIG1ha2Ugc3Rkb3V0IHVzZSAidW5peCIgbGluZSBlbmRpbmdzCisJCWVjaG8gIiAgICAgICAgICBzZXRtb2RlKDEsX09fQklOQVJZKTsiCisJCTs7CisJICAgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCisJICBsdF9kdW1wX3NjcmlwdCAoc3Rkb3V0KTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGRlYnVnX29wdCkgPT0gMCkKKwl7CisgICAgICAgICAgbHRfZGVidWcgPSAxOworICAgICAgICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4KSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogaG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZSwgYnV0IGl0IGlzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2Uga25vdyBhYm91dCBhbmQKKyAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCwgYWJvdmUgKGlubHVkaW5nIGR1bXAtc2NyaXB0KSwgdGhlbgorICAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvci4gT3RoZXJ3aXNlLCB0YXJnZXRzIG1pZ2h0IGJlZ2luIHRvIGJlbGlldmUKKyAgICAgICAgICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIHVzZSBvcHRpb25zIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGZpcnN0IHRpbWUgYW55IHVzZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHdlJ2xsCisgICAgICAgICAgICAgbmVlZCB0byBtYWtlIExUV1JBUFBFUl9PUFRJT05fUFJFRklYIGEgY29uZmlndXJlLXRpbWUgb3B0aW9uCisgICAgICAgICAgICAgb3IgYSBjb25maWd1cmUuYWMtc2V0dGFibGUgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICJ1bnJlY29nbml6ZWQgJXMgb3B0aW9uOiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgbHR3cmFwcGVyX29wdGlvbl9wcmVmaXgsIGFyZ3ZbaV0pOworICAgICAgICB9CisgICAgICAvKiBvdGhlcndpc2UgLi4uICovCisgICAgICBuZXdhcmd6WysrbmV3YXJnY10gPSB4c3RyZHVwIChhcmd2W2ldKTsKKyAgICB9CisgIG5ld2FyZ3pbKytuZXdhcmdjXSA9IE5VTEw7CisKK0VPRgorCSAgICBjYXQgPDxFT0YKKyAgLyogVGhlIEdOVSBiYW5uZXIgbXVzdCBiZSB0aGUgZmlyc3Qgbm9uLWVycm9yIGRlYnVnIG1lc3NhZ2UgKi8KKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgImxpYnRvb2wgd3JhcHBlciAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT05cbiIpOworRU9GCisJICAgIGNhdCA8PCJFT0YiCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgYXJndlswXTogJXNcbiIsIGFyZ3ZbMF0pOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIHByb2dyYW1fbmFtZTogJXNcbiIsIHByb2dyYW1fbmFtZSk7CisKKyAgdG1wX3BhdGhzcGVjID0gZmluZF9leGVjdXRhYmxlIChhcmd2WzBdKTsKKyAgaWYgKHRtcF9wYXRoc3BlYyA9PSBOVUxMKQorICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJjb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYmVmb3JlIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICB0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9wYXRoID0gY2hhc2Vfc3ltbGlua3MgKHRtcF9wYXRoc3BlYyk7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAiKG1haW4pIGZvdW5kIGV4ZSAoYWZ0ZXIgc3ltbGluayBjaGFzZSkgYXQ6ICVzXG4iLAorCQkgIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7CisgIHN0cmVuZHphcCAoYWN0dWFsX2N3cmFwcGVyX3BhdGgsIGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKKworICAvKiB3cmFwcGVyIG5hbWUgdHJhbnNmb3JtcyAqLworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9uYW1lLCAiLmV4ZSIpOworICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiLCAxKTsKKyAgWEZSRUUgKGFjdHVhbF9jd3JhcHBlcl9uYW1lKTsKKyAgYWN0dWFsX2N3cmFwcGVyX25hbWUgPSB0bXBfcGF0aHNwZWM7CisgIHRtcF9wYXRoc3BlYyA9IDA7CisKKyAgLyogdGFyZ2V0X25hbWUgdHJhbnNmb3JtcyAtLSB1c2UgYWN0dWFsIHRhcmdldCBwcm9ncmFtIG5hbWU7IG1pZ2h0IGhhdmUgbHQtIHByZWZpeCAqLworICB0YXJnZXRfbmFtZSA9IHhzdHJkdXAgKGJhc2VfbmFtZSAoVEFSR0VUX1BST0dSQU1fTkFNRSkpOworICBzdHJlbmR6YXAgKHRhcmdldF9uYW1lLCAiLmV4ZSIpOworICB0bXBfcGF0aHNwZWMgPSBsdF9leHRlbmRfc3RyICh0YXJnZXRfbmFtZSwgIi5leGUiLCAxKTsKKyAgWEZSRUUgKHRhcmdldF9uYW1lKTsKKyAgdGFyZ2V0X25hbWUgPSB0bXBfcGF0aHNwZWM7CisgIHRtcF9wYXRoc3BlYyA9IDA7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKG1haW4pIGxpYnRvb2wgdGFyZ2V0IG5hbWU6ICVzXG4iLAorCQkgIHRhcmdldF9uYW1lKTsKK0VPRgorCisJICAgIGNhdCA8PEVPRgorICBuZXdhcmd6WzBdID0KKyAgICBYTUFMTE9DIChjaGFyLCAoc3RybGVuIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkgKworCQkgICAgc3RybGVuICgiJG9iamRpciIpICsgMSArIHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX25hbWUpICsgMSkpOworICBzdHJjcHkgKG5ld2FyZ3pbMF0sIGFjdHVhbF9jd3JhcHBlcl9wYXRoKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiJG9iamRpciIpOworICBzdHJjYXQgKG5ld2FyZ3pbMF0sICIvIik7CitFT0YKKworCSAgICBjYXQgPDwiRU9GIgorICAvKiBzdG9wIGhlcmUsIGFuZCBjb3B5IHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcyB0d2ljZSAqLworICB0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChuZXdhcmd6WzBdKTsKKworICAvKiBkbyBOT1Qgd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlLCBzbyB1c2UgYWN0dWFsX2N3cmFwcGVyX25hbWUgKi8KKyAgc3RyY2F0IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogRE8gd2FudCB0aGUgbHQtIHByZWZpeCBoZXJlIGlmIGl0IGV4aXN0cywgc28gdXNlIHRhcmdldF9uYW1lICovCisgIGx0X2FyZ3ZfemVybyA9IGx0X2V4dGVuZF9zdHIgKHRtcF9wYXRoc3BlYywgdGFyZ2V0X25hbWUsIDEpOworICBYRlJFRSAodG1wX3BhdGhzcGVjKTsKKyAgdG1wX3BhdGhzcGVjID0gTlVMTDsKK0VPRgorCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJICAgIGNhdCA8PCJFT0YiCisgIHsKKyAgICBjaGFyKiBwOworICAgIHdoaWxlICgocCA9IHN0cmNociAobmV3YXJnelswXSwgJ1xcJykpICE9IE5VTEwpCisgICAgICB7CisJKnAgPSAnLyc7CisgICAgICB9CisgICAgd2hpbGUgKChwID0gc3RyY2hyIChsdF9hcmd2X3plcm8sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICB9CitFT0YKKwkgICAgOzsKKwkgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgbHRfc2V0ZW52ICgiQklOX1NIIiwgInhwZzQiKTsgLyogZm9yIFRydTY0ICovCisgIGx0X3NldGVudiAoIkRVQUxDQVNFIiwgIjEiKTsgIC8qIGZvciBNU0sgc2ggKi8KKyAgLyogVXBkYXRlIHRoZSBETEwgc2VhcmNocGF0aC4gIEVYRV9QQVRIX1ZBTFVFICgkZGxsc2VhcmNocGF0aCkgbXVzdAorICAgICBiZSBwcmVwZW5kZWQgYmVmb3JlICh0aGF0IGlzLCBhcHBlYXIgYWZ0ZXIpIExJQl9QQVRIX1ZBTFVFICgkdGVtcF9ycGF0aCkKKyAgICAgYmVjYXVzZSBvbiBXaW5kb3dzLCBib3RoICpfVkFSTkFNRXMgYXJlIFBBVEggYnV0IHVuaW5zdGFsbGVkCisgICAgIGxpYnJhcmllcyBtdXN0IGNvbWUgZmlyc3QuICovCisgIGx0X3VwZGF0ZV9leGVfcGF0aCAoRVhFX1BBVEhfVkFSTkFNRSwgRVhFX1BBVEhfVkFMVUUpOworICBsdF91cGRhdGVfbGliX3BhdGggKExJQl9QQVRIX1ZBUk5BTUUsIExJQl9QQVRIX1ZBTFVFKTsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIGx0X2FyZ3ZfemVybzogJXNcbiIsCisJCSAgbm9ubnVsbCAobHRfYXJndl96ZXJvKSk7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdhcmdjOyBpKyspCisgICAgeworICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBuZXdhcmd6WyVkXTogJXNcbiIsCisJCSAgICAgIGksIG5vbm51bGwgKG5ld2FyZ3pbaV0pKTsKKyAgICB9CisKK0VPRgorCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJCWNhdCA8PCJFT0YiCisgIC8qIGV4ZWN2IGRvZXNuJ3QgYWN0dWFsbHkgd29yayBvbiBtaW5ndyBhcyBleHBlY3RlZCBvbiB1bml4ICovCisgIG5ld2FyZ3ogPSBwcmVwYXJlX3NwYXduIChuZXdhcmd6KTsKKyAgcnZhbCA9IF9zcGF3bnYgKF9QX1dBSVQsIGx0X2FyZ3ZfemVybywgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBuZXdhcmd6KTsKKyAgaWYgKHJ2YWwgPT0gLTEpCisgICAgeworICAgICAgLyogZmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgKi8KKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICIobWFpbikgZmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQgXCIlc1wiOiAlc1xuIiwKKwkJICAgICAgbHRfYXJndl96ZXJvLCBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKyAgcmV0dXJuIHJ2YWw7CitFT0YKKwkJOzsKKwkgICAgICAqKQorCQljYXQgPDwiRU9GIgorICBleGVjdiAobHRfYXJndl96ZXJvLCBuZXdhcmd6KTsKKyAgcmV0dXJuIHJ2YWw7IC8qID0xMjcsIGJ1dCBhdm9pZHMgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcgKi8KK0VPRgorCQk7OworCSAgICBlc2FjCisKKwkgICAgY2F0IDw8IkVPRiIKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3QgbnVtKQoreworICB2b2lkICpwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOworICBpZiAoIXApCisgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgIm1lbW9yeSBleGhhdXN0ZWQiKTsKKworICByZXR1cm4gcDsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIHJldHVybiBzdHJpbmcgPyBzdHJjcHkgKChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLAorCQkJICBzdHJpbmcpIDogTlVMTDsKK30KKworY29uc3QgY2hhciAqCitiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGNvbnN0IGNoYXIgKmJhc2U7CisKKyNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKKyAgLyogU2tpcCBvdmVyIHRoZSBkaXNrIG5hbWUgaW4gTVNET1MgcGF0aG5hbWVzLiAqLworICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIG5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJzonKQorICAgIG5hbWUgKz0gMjsKKyNlbmRpZgorCisgIGZvciAoYmFzZSA9IG5hbWU7ICpuYW1lOyBuYW1lKyspCisgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKCpuYW1lKSkKKyAgICAgIGJhc2UgPSBuYW1lICsgMTsKKyAgcmV0dXJuIGJhc2U7Cit9CisKK2ludAorY2hlY2tfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihjaGVja19leGVjdXRhYmxlKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBub25lbXB0eSAocGF0aCkpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICAgICYmIChzdC5zdF9tb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQoreworICBpbnQgcnZhbCA9IDA7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFrZV9leGVjdXRhYmxlKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICBub25lbXB0eSAocGF0aCkpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhdCAocGF0aCwgJnN0KSA+PSAwKQorICAgIHsKKyAgICAgIHJ2YWwgPSBjaG1vZCAocGF0aCwgc3Quc3RfbW9kZSB8IFNfSVhPVEggfCBTX0lYR1JQIHwgU19JWFVTUik7CisgICAgfQorICByZXR1cm4gcnZhbDsKK30KKworLyogU2VhcmNoZXMgZm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIHdyYXBwZXIuICBSZXR1cm5zCisgICBuZXdseSBhbGxvY2F0ZWQgZnVsbCBwYXRoIG5hbWUgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgICBEb2VzIG5vdCBjaGFzZSBzeW1saW5rcywgZXZlbiBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoZW0uCisqLworY2hhciAqCitmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpCit7CisgIGludCBoYXNfc2xhc2ggPSAwOworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpwX25leHQ7CisgIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLworICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07CisgIGludCB0bXBfbGVuOworICBjaGFyICpjb25jYXRfbmFtZTsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKGZpbmRfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHdyYXBwZXIpKTsKKworICBpZiAoKHdyYXBwZXIgPT0gTlVMTCkgfHwgKCp3cmFwcGVyID09ICdcMCcpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFic29sdXRlIHBhdGg/ICovCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCisgICAgeworICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICh3cmFwcGVyWzBdKSkKKwl7CisJICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworCSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwl9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgICAgfQorI2VuZGlmCisKKyAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKKyAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgeworCWhhc19zbGFzaCA9IDE7CisJYnJlYWs7CisgICAgICB9CisgIGlmICghaGFzX3NsYXNoKQorICAgIHsKKyAgICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOworICAgICAgaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHBfbmV4dCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnE7CisJICAgICAgc2l6ZV90IHBfbGVuOworCSAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisJCWlmIChJU19QQVRIX1NFUEFSQVRPUiAoKnEpKQorCQkgIGJyZWFrOworCSAgICAgIHBfbGVuID0gcSAtIHA7CisJICAgICAgcF9uZXh0ID0gKCpxID09ICdcMCcgPyBxIDogcSArIDEpOworCSAgICAgIGlmIChwX2xlbiA9PSAwKQorCQl7CisJCSAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisJCSAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiZ2V0Y3dkIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworCQkgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisJCSAgY29uY2F0X25hbWUgPQorCQkgICAgWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisJCSAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKKwkJICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKwkJICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgY29uY2F0X25hbWUgPQorCQkgICAgWE1BTExPQyAoY2hhciwgcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHAsIHBfbGVuKTsKKwkJICBjb25jYXRfbmFtZVtwX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHBfbGVuICsgMSwgd3JhcHBlcik7CisJCX0KKwkgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorCQlyZXR1cm4gY29uY2F0X25hbWU7CisJICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwkgICAgfQorCX0KKyAgICAgIC8qIG5vdCBmb3VuZCBpbiBQQVRIOyBhc3N1bWUgY3VyZGlyICovCisgICAgfQorICAvKiBSZWxhdGl2ZSBwYXRoIHwgbm90IGZvdW5kIGluIHBhdGg6IHByZXBlbmQgY3dkICovCisgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiZ2V0Y3dkIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisgIGNvbmNhdF9uYW1lID0gWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCisgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICBYRlJFRSAoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpCit7CisjaWZuZGVmIFNfSVNMTksKKyAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyNlbHNlCisgIGNoYXIgYnVmW0xUX1BBVEhNQVhdOworICBzdHJ1Y3Qgc3RhdCBzOworICBjaGFyICp0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChwYXRoc3BlYyk7CisgIGNoYXIgKnA7CisgIGludCBoYXNfc3ltbGlua3MgPSAwOworICB3aGlsZSAoc3RybGVuICh0bXBfcGF0aHNwZWMpICYmICFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICAgImNoZWNraW5nIHBhdGggY29tcG9uZW50IGZvciBzeW1saW5rczogJXNcbiIsCisJCSAgICAgIHRtcF9wYXRoc3BlYyk7CisgICAgICBpZiAobHN0YXQgKHRtcF9wYXRoc3BlYywgJnMpID09IDApCisJeworCSAgaWYgKFNfSVNMTksgKHMuc3RfbW9kZSkgIT0gMCkKKwkgICAgeworCSAgICAgIGhhc19zeW1saW5rcyA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgbGFzdCBESVJfU0VQQVJBVE9SICovCisJICBwID0gdG1wX3BhdGhzcGVjICsgc3RybGVuICh0bXBfcGF0aHNwZWMpIC0gMTsKKwkgIHdoaWxlICgocCA+IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQorCSAgICBwLS07CisJICBpZiAoKHAgPT0gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCisJICAgIHsKKwkgICAgICAvKiBubyBtb3JlIERJUl9TRVBBUkFUT1JTIGxlZnQgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKnAgPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgImVycm9yIGFjY2Vzc2luZyBmaWxlIFwiJXNcIjogJXMiLAorCQkgICAgdG1wX3BhdGhzcGVjLCBub25udWxsIChzdHJlcnJvciAoZXJybm8pKSk7CisJfQorICAgIH0KKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgaWYgKCFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyAgICB9CisKKyAgdG1wX3BhdGhzcGVjID0gcmVhbHBhdGggKHBhdGhzcGVjLCBidWYpOworICBpZiAodG1wX3BhdGhzcGVjID09IDApCisgICAgeworICAgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJImNvdWxkIG5vdCBmb2xsb3cgc3ltbGlua3MgZm9yICVzIiwgcGF0aHNwZWMpOworICAgIH0KKyAgcmV0dXJuIHhzdHJkdXAgKHRtcF9wYXRoc3BlYyk7CisjZW5kaWYKK30KKworY2hhciAqCitzdHJlbmR6YXAgKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KQoreworICBzaXplX3QgbGVuLCBwYXRsZW47CisKKyAgYXNzZXJ0IChzdHIgIT0gTlVMTCk7CisgIGFzc2VydCAocGF0ICE9IE5VTEwpOworCisgIGxlbiA9IHN0cmxlbiAoc3RyKTsKKyAgcGF0bGVuID0gc3RybGVuIChwYXQpOworCisgIGlmIChwYXRsZW4gPD0gbGVuKQorICAgIHsKKyAgICAgIHN0ciArPSBsZW4gLSBwYXRsZW47CisgICAgICBpZiAoc3RyY21wIChzdHIsIHBhdCkgPT0gMCkKKwkqc3RyID0gJ1wwJzsKKyAgICB9CisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQKK2x0X2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaWYgKGx0X2RlYnVnKQorICAgIHsKKyAgICAgICh2b2lkKSBmcHJpbnRmIChzdGRlcnIsICIlczolczolZDogIiwgcHJvZ3JhbV9uYW1lLCBmaWxlLCBsaW5lKTsKKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworICAgICAgKHZvaWQpIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2x0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqZmlsZSwKKwkgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1vZGUsCisJICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZhX2xpc3QgYXApCit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiVkOiAlczogIiwgcHJvZ3JhbV9uYW1lLCBmaWxlLCBsaW5lLCBtb2RlKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXApOworICBmcHJpbnRmIChzdGRlcnIsICIuXG4iKTsKKworICBpZiAoZXhpdF9zdGF0dXMgPj0gMCkKKyAgICBleGl0IChleGl0X3N0YXR1cyk7Cit9CisKK3ZvaWQKK2x0X2ZhdGFsIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsIGZpbGUsIGxpbmUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK25vbm51bGwgKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiBzID8gcyA6ICIobnVsbCkiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitub25lbXB0eSAoY29uc3QgY2hhciAqcykKK3sKKyAgcmV0dXJuIChzICYmICEqcykgPyAiKGVtcHR5KSIgOiBub25udWxsIChzKTsKK30KKwordm9pZAorbHRfc2V0ZW52IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3NldGVudikgc2V0dGluZyAnJXMnIHRvICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKKyAgeworI2lmZGVmIEhBVkVfU0VURU5WCisgICAgLyogYWx3YXlzIG1ha2UgYSBjb3B5LCBmb3IgY29uc2lzdGVuY3kgd2l0aCAhSEFWRV9TRVRFTlYgKi8KKyAgICBjaGFyICpzdHIgPSB4c3RyZHVwICh2YWx1ZSk7CisgICAgc2V0ZW52IChuYW1lLCBzdHIsIDEpOworI2Vsc2UKKyAgICBpbnQgbGVuID0gc3RybGVuIChuYW1lKSArIDEgKyBzdHJsZW4gKHZhbHVlKSArIDE7CisgICAgY2hhciAqc3RyID0gWE1BTExPQyAoY2hhciwgbGVuKTsKKyAgICBzcHJpbnRmIChzdHIsICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKKyAgICBpZiAocHV0ZW52IChzdHIpICE9IEVYSVRfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgWEZSRUUgKHN0cik7CisgICAgICB9CisjZW5kaWYKKyAgfQorfQorCitjaGFyICoKK2x0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCkKK3sKKyAgY2hhciAqbmV3X3ZhbHVlOworICBpZiAob3JpZ192YWx1ZSAmJiAqb3JpZ192YWx1ZSkKKyAgICB7CisgICAgICBpbnQgb3JpZ192YWx1ZV9sZW4gPSBzdHJsZW4gKG9yaWdfdmFsdWUpOworICAgICAgaW50IGFkZF9sZW4gPSBzdHJsZW4gKGFkZCk7CisgICAgICBuZXdfdmFsdWUgPSBYTUFMTE9DIChjaGFyLCBhZGRfbGVuICsgb3JpZ192YWx1ZV9sZW4gKyAxKTsKKyAgICAgIGlmICh0b19lbmQpCisgICAgICAgIHsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgb3JpZ192YWx1ZSk7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBvcmlnX3ZhbHVlX2xlbiwgYWRkKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUsIGFkZCk7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUgKyBhZGRfbGVuLCBvcmlnX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld192YWx1ZSA9IHhzdHJkdXAgKGFkZCk7CisgICAgfQorICByZXR1cm4gbmV3X3ZhbHVlOworfQorCit2b2lkCitsdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICIobHRfdXBkYXRlX2V4ZV9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICBub25udWxsIChuYW1lKSwgbm9ubnVsbCAodmFsdWUpKTsKKworICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCisgICAgeworICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICAgICAgLyogc29tZSBzeXN0ZW1zIGNhbid0IGNvcGUgd2l0aCBhICc6Jy10ZXJtaW5hdGVkIHBhdGggIycgKi8KKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSk7CisgICAgICB3aGlsZSAoKChsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSkpID4gMCkgJiYgSVNfUEFUSF9TRVBBUkFUT1IgKG5ld192YWx1ZVtsZW4tMV0pKQorICAgICAgICB7CisgICAgICAgICAgbmV3X3ZhbHVlW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKwordm9pZAorbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3VwZGF0ZV9saWJfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisKKyAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQorICAgIHsKKyAgICAgIGNoYXIgKm5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKworRU9GCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBtaW5ndyopCisJCWNhdCA8PCJFT0YiCisKKy8qIFByZXBhcmVzIGFuIGFyZ3VtZW50IHZlY3RvciBiZWZvcmUgY2FsbGluZyBzcGF3bigpLgorICAgTm90ZSB0aGF0IHNwYXduKCkgZG9lcyBub3QgYnkgaXRzZWxmIGNhbGwgdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIKKyAgICAgKGdldGVudiAoIkNPTVNQRUMiKSAhPSBOVUxMID8gZ2V0ZW52ICgiQ09NU1BFQyIpIDoKKyAgICAgICh7IE9TVkVSU0lPTklORk8gdjsgdi5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk8pOworICAgICAgICAgR2V0VmVyc2lvbkV4KCZ2KTsKKyAgICAgICAgIHYuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVDsKKyAgICAgIH0pID8gImNtZC5leGUiIDogImNvbW1hbmQuY29tIikuCisgICBJbnN0ZWFkIGl0IHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5ICcgJywgYW5kIGNhbGxzCisgICBDcmVhdGVQcm9jZXNzKCkuICBXZSBtdXN0IHF1b3RlIHRoZSBhcmd1bWVudHMgc2luY2UgV2luMzIgQ3JlYXRlUHJvY2VzcygpCisgICBpbnRlcnByZXRzIGNoYXJhY3RlcnMgbGlrZSAnICcsICdcdCcsICdcXCcsICciJyAoYnV0IG5vdCAnPCcgYW5kICc+JykgaW4gYQorICAgc3BlY2lhbCB3YXk6CisgICAtIFNwYWNlIGFuZCB0YWIgYXJlIGludGVycHJldGVkIGFzIGRlbGltaXRlcnMuIFRoZXkgYXJlIG5vdCB0cmVhdGVkIGFzCisgICAgIGRlbGltaXRlcnMgaWYgdGhleSBhcmUgc3Vycm91bmRlZCBieSBkb3VibGUgcXVvdGVzOiAiLi4uIi4KKyAgIC0gVW5lc2NhcGVkIGRvdWJsZSBxdW90ZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQuIFRoZWlyIG9ubHkgZWZmZWN0IGlzCisgICAgIHRoYXQgd2l0aGluIGRvdWJsZSBxdW90ZXMsIHNwYWNlIGFuZCB0YWIgYXJlIHRyZWF0ZWQgbGlrZSBub3JtYWwKKyAgICAgY2hhcmFjdGVycy4KKyAgIC0gQmFja3NsYXNoZXMgbm90IGZvbGxvd2VkIGJ5IGRvdWJsZSBxdW90ZXMgYXJlIG5vdCBzcGVjaWFsLgorICAgLSBCdXQgMipuKzEgYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGUgYmVjb21lCisgICAgIG4gYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGUgKG4gPj0gMCk6CisgICAgICAgXCIgLT4gIgorICAgICAgIFxcXCIgLT4gXCIKKyAgICAgICBcXFxcXCIgLT4gXFwiCisgKi8KKyNkZWZpbmUgU0hFTExfU1BFQ0lBTF9DSEFSUyAiXCJcXCBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3IgorI2RlZmluZSBTSEVMTF9TUEFDRV9DSEFSUyAiIFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzciCitjaGFyICoqCitwcmVwYXJlX3NwYXduIChjaGFyICoqYXJndikKK3sKKyAgc2l6ZV90IGFyZ2M7CisgIGNoYXIgKipuZXdfYXJndjsKKyAgc2l6ZV90IGk7CisKKyAgLyogQ291bnQgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCisgIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgYXJnYysrKQorICAgIDsKKworICAvKiBBbGxvY2F0ZSBuZXcgYXJndW1lbnQgdmVjdG9yLiAgKi8KKyAgbmV3X2FyZ3YgPSBYTUFMTE9DIChjaGFyICosIGFyZ2MgKyAxKTsKKworICAvKiBQdXQgcXVvdGVkIGFyZ3VtZW50cyBpbnRvIHRoZSBuZXcgYXJndW1lbnQgdmVjdG9yLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzdHJpbmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyaW5nWzBdID09ICdcMCcpCisJbmV3X2FyZ3ZbaV0gPSB4c3RyZHVwICgiXCJcIiIpOworICAgICAgZWxzZSBpZiAoc3RycGJyayAoc3RyaW5nLCBTSEVMTF9TUEVDSUFMX0NIQVJTKSAhPSBOVUxMKQorCXsKKwkgIGludCBxdW90ZV9hcm91bmQgPSAoc3RycGJyayAoc3RyaW5nLCBTSEVMTF9TUEFDRV9DSEFSUykgIT0gTlVMTCk7CisJICBzaXplX3QgbGVuZ3RoOworCSAgdW5zaWduZWQgaW50IGJhY2tzbGFzaGVzOworCSAgY29uc3QgY2hhciAqczsKKwkgIGNoYXIgKnF1b3RlZF9zdHJpbmc7CisJICBjaGFyICpwOworCisJICBsZW5ndGggPSAwOworCSAgYmFja3NsYXNoZXMgPSAwOworCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgbGVuZ3RoKys7CisJICBmb3IgKHMgPSBzdHJpbmc7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGNoYXIgYyA9ICpzOworCSAgICAgIGlmIChjID09ICciJykKKwkJbGVuZ3RoICs9IGJhY2tzbGFzaGVzICsgMTsKKwkgICAgICBsZW5ndGgrKzsKKwkgICAgICBpZiAoYyA9PSAnXFwnKQorCQliYWNrc2xhc2hlcysrOworCSAgICAgIGVsc2UKKwkJYmFja3NsYXNoZXMgPSAwOworCSAgICB9CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICBsZW5ndGggKz0gYmFja3NsYXNoZXMgKyAxOworCisJICBxdW90ZWRfc3RyaW5nID0gWE1BTExPQyAoY2hhciwgbGVuZ3RoICsgMSk7CisKKwkgIHAgPSBxdW90ZWRfc3RyaW5nOworCSAgYmFja3NsYXNoZXMgPSAwOworCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgKnArKyA9ICciJzsKKwkgIGZvciAocyA9IHN0cmluZzsgKnMgIT0gJ1wwJzsgcysrKQorCSAgICB7CisJICAgICAgY2hhciBjID0gKnM7CisJICAgICAgaWYgKGMgPT0gJyInKQorCQl7CisJCSAgdW5zaWduZWQgaW50IGo7CisJCSAgZm9yIChqID0gYmFja3NsYXNoZXMgKyAxOyBqID4gMDsgai0tKQorCQkgICAgKnArKyA9ICdcXCc7CisJCX0KKwkgICAgICAqcCsrID0gYzsKKwkgICAgICBpZiAoYyA9PSAnXFwnKQorCQliYWNrc2xhc2hlcysrOworCSAgICAgIGVsc2UKKwkJYmFja3NsYXNoZXMgPSAwOworCSAgICB9CisJICBpZiAocXVvdGVfYXJvdW5kKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IGo7CisJICAgICAgZm9yIChqID0gYmFja3NsYXNoZXM7IGogPiAwOyBqLS0pCisJCSpwKysgPSAnXFwnOworCSAgICAgICpwKysgPSAnIic7CisJICAgIH0KKwkgICpwID0gJ1wwJzsKKworCSAgbmV3X2FyZ3ZbaV0gPSBxdW90ZWRfc3RyaW5nOworCX0KKyAgICAgIGVsc2UKKwluZXdfYXJndltpXSA9IChjaGFyICopIHN0cmluZzsKKyAgICB9CisgIG5ld19hcmd2W2FyZ2NdID0gTlVMTDsKKworICByZXR1cm4gbmV3X2FyZ3Y7Cit9CitFT0YKKwkJOzsKKwkgICAgZXNhYworCisgICAgICAgICAgICBjYXQgPDwiRU9GIgordm9pZCBsdF9kdW1wX3NjcmlwdCAoRklMRSogZikKK3sKK0VPRgorCSAgICBmdW5jX2VtaXRfd3JhcHBlciB5ZXMgfAorICAgICAgICAgICAgICAkU0VEIC1lICdzL1woW1xcIl1cKS9cXFwxL2cnIFwKKwkgICAgICAgICAgIC1lICdzL14vICBmcHV0cyAoIi8nIC1lICdzLyQvXFxuIiwgZik7LycKKworICAgICAgICAgICAgY2F0IDw8IkVPRiIKK30KK0VPRgorfQorIyBlbmQ6IGZ1bmNfZW1pdF9jd3JhcHBlcmV4ZV9zcmMKKworIyBmdW5jX3dpbjMyX2ltcG9ydF9saWJfcCBBUkcKKyMgVHJ1ZSBpZiBBUkcgaXMgYW4gaW1wb3J0IGxpYiwgYXMgaW5kaWNhdGVkIGJ5ICRmaWxlX21hZ2ljX2NtZAorZnVuY193aW4zMl9pbXBvcnRfbGliX3AgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSBgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJDFcIiAyPi9kZXYvbnVsbCB8ICRTRUQgLWUgMTBxYCBpbgorICAgICppbXBvcnQqKSA6IDs7CisgICAgKikgZmFsc2UgOzsKKyAgICBlc2FjCit9CisKKyMgZnVuY19tb2RlX2xpbmsgYXJnLi4uCitmdW5jX21vZGVfbGluayAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBjYXNlICRob3N0IGluCisgICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKyAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKKyAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKKyAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKKyAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZvY2F0aW9uLgorICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KKworICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCisgICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAorICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKKyAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgorICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIGxpYnRvb2xfYXJncz0kbm9ub3B0CisgICAgYmFzZV9jb21waWxlPSIkbm9ub3B0ICRAIgorICAgIGNvbXBpbGVfY29tbWFuZD0kbm9ub3B0CisgICAgZmluYWxpemVfY29tbWFuZD0kbm9ub3B0CisKKyAgICBjb21waWxlX3JwYXRoPQorICAgIGZpbmFsaXplX3JwYXRoPQorICAgIGNvbXBpbGVfc2hsaWJwYXRoPQorICAgIGZpbmFsaXplX3NobGlicGF0aD0KKyAgICBjb252ZW5pZW5jZT0KKyAgICBvbGRfY29udmVuaWVuY2U9CisgICAgZGVwbGlicz0KKyAgICBvbGRfZGVwbGlicz0KKyAgICBjb21waWxlcl9mbGFncz0KKyAgICBsaW5rZXJfZmxhZ3M9CisgICAgZGxsc2VhcmNocGF0aD0KKyAgICBsaWJfc2VhcmNoX3BhdGg9YHB3ZGAKKyAgICBpbnN0X3ByZWZpeF9kaXI9CisgICAgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9CisKKyAgICBhdm9pZF92ZXJzaW9uPW5vCisgICAgYmluZGlyPQorICAgIGRsZmlsZXM9CisgICAgZGxwcmVmaWxlcz0KKyAgICBkbHNlbGY9bm8KKyAgICBleHBvcnRfZHluYW1pYz1ubworICAgIGV4cG9ydF9zeW1ib2xzPQorICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQorICAgIGdlbmVyYXRlZD0KKyAgICBsaWJvYmpzPQorICAgIGx0bGlicz0KKyAgICBtb2R1bGU9bm8KKyAgICBub19pbnN0YWxsPW5vCisgICAgb2Jqcz0KKyAgICBub25fcGljX29iamVjdHM9CisgICAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9CisgICAgcHJlZmVyX3N0YXRpY19saWJzPW5vCisgICAgcHJlbG9hZD1ubworICAgIHByZXY9CisgICAgcHJldmFyZz0KKyAgICByZWxlYXNlPQorICAgIHJwYXRoPQorICAgIHhycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdGhyZWFkX3NhZmU9bm8KKyAgICB2aW5mbz0KKyAgICB2aW5mb19udW1iZXI9bm8KKyAgICB3ZWFrX2xpYnM9CisgICAgc2luZ2xlX21vZHVsZT0iJHt3bH0tc2luZ2xlX21vZHVsZSIKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zaGFyZWQpCisJdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgorCWJ1aWxkX29sZF9saWJzPW5vCisJYnJlYWsKKwk7OworICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJY2FzZSAkYXJnIGluCisJLWFsbC1zdGF0aWMpCisJICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwkgIDs7CisJLXN0YXRpYykKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9YnVpbHQKKwkgIDs7CisJLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCSAgOzsKKwllc2FjCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KKyAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCisKKyAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KKyAgICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBxYXJnPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdAorICAgICAgZnVuY19hcHBlbmQgbGlidG9vbF9hcmdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCisgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCWNhc2UgJHByZXYgaW4KKwlvdXRwdXQpCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcHJldiBpbgorCWJpbmRpcikKKwkgIGJpbmRpcj0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlkbGZpbGVzfGRscHJlZmlsZXMpCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgorCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgorCSAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiBAU1lNRklMRUAiCisJICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiBAU1lNRklMRUAiCisJICAgIHByZWxvYWQ9eWVzCisJICBmaQorCSAgY2FzZSAkYXJnIGluCisJICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgorCSAgZm9yY2UpCisJICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIHNlbGYpCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxzZQorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgICAgIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkYXJnIgorCSAgICBlbHNlCisJICAgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRhcmciCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWV4cHN5bXMpCisJICBleHBvcnRfc3ltYm9scz0iJGFyZyIKKwkgIHRlc3QgLWYgIiRhcmciIFwKKwkgICAgfHwgZnVuY19mYXRhbF9lcnJvciAic3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlleHBzeW1zX3JlZ2V4KQorCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZnJhbWV3b3JrKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgICAqLSotZGFyd2luKikKKwkgICAgICBjYXNlICIkZGVwbGlicyAiIGluCisJCSoiICRxYXJnLmx0ZnJhbWV3b3JrICIqKSA7OworCQkqKSBmdW5jX2FwcGVuZCBkZXBsaWJzICIgJHFhcmcubHRmcmFtZXdvcmsiICMgdGhpcyBpcyBmaXhlZCBsYXRlcgorCQkgICA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgZXNhYworCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWluc3RfcHJlZml4KQorCSAgaW5zdF9wcmVmaXhfZGlyPSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCW9iamVjdGxpc3QpCisJICBpZiB0ZXN0IC1mICIkYXJnIjsgdGhlbgorCSAgICBzYXZlX2FyZz0kYXJnCisJICAgIG1vcmVhcmdzPQorCSAgICBmb3IgZmlsIGluIGBjYXQgIiRzYXZlX2FyZyJgCisJICAgIGRvCisjCSAgICAgIGZ1bmNfYXBwZW5kIG1vcmVhcmdzICIgJGZpbCIKKwkgICAgICBhcmc9JGZpbAorCSAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgorCisJICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgorCSAgICAgIGlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRhcmciOyB0aGVuCisJCXBpY19vYmplY3Q9CisJCW5vbl9waWNfb2JqZWN0PQorCisJCSMgUmVhZCB0aGUgLmxvIGZpbGUKKwkJZnVuY19zb3VyY2UgIiRhcmciCisKKwkJaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8CisJCSAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKKwkJICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgorCQkgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIgorCQlmaQorCisJCSMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJCWZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJCXhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJCWlmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkJICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCQkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCQkgICAgICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJHBpY19vYmplY3QiCisJCSAgICAgIHByZXY9CisJCSAgICAgIGNvbnRpbnVlCisJCSAgICBlbHNlCisJCSAgICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCSAgICAgIHByZXY9ZGxwcmVmaWxlcworCQkgICAgZmkKKwkJICBmaQorCisJCSAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJCSAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJCSAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJHBpY19vYmplY3QiCisJCSAgICBwcmV2PQorCQkgIGZpCisKKwkJICAjIEEgUElDIG9iamVjdC4KKwkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJCSAgYXJnPSIkcGljX29iamVjdCIKKwkJZmkKKworCQkjIE5vbi1QSUMgb2JqZWN0LgorCQlpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKKworCQkgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KKwkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCQkgIGZpCisJCWVsc2UKKwkJICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJCSAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZWxzZQorCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KKwkJaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJICBmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgorCQkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJCSAgZnVuY19sbzJvICIkYXJnIgorCQkgIHBpY19vYmplY3Q9JHhkaXIkb2JqZGlyLyRmdW5jX2xvMm9fcmVzdWx0CisJCSAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCQkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgICAgICBlbHNlCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkJZmkKKwkgICAgICBmaQorCSAgICBkb25lCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImxpbmsgaW5wdXQgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgZmkKKwkgIGFyZz0kc2F2ZV9hcmcKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlwcmVjaW91c19yZWdleCkKKwkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlycGF0aCB8IHhycGF0aCkKKwkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAgY2FzZSAkYXJnIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCisJICAgIGNhc2UgIiRycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHJwYXRoICIgJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZWxzZQorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlzaHJleHQpCisJICBzaHJleHRfY21kcz0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwl3ZWFrKQorCSAgZnVuY19hcHBlbmQgd2Vha19saWJzICIgJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwl4Y2NsaW5rZXIpCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4Y29tcGlsZXIpCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGxpbmtlcikKKwkgIGZ1bmNfYXBwZW5kIGxpbmtlcl9mbGFncyAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkd2wkcWFyZyIKKwkgIHByZXY9CisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkd2wkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkd2wkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCSopCisJICBldmFsICIkcHJldj1cIlwkYXJnXCIiCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXNhYworICAgICAgZmkgIyB0ZXN0IC1uICIkcHJldiIKKworICAgICAgcHJldmFyZz0iJGFyZyIKKworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtYWxsLXN0YXRpYykKKwlpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICMgU2VlIGNvbW1lbnQgZm9yIC1zdGF0aWMgZmxhZyBiZWxvdywgZm9yIG1vcmUgZGV0YWlscy4KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRsaW5rX3N0YXRpY19mbGFnIgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAtYWxsb3ctdW5kZWZpbmVkKQorCSMgRklYTUU6IHJlbW92ZSB0aGlzIGZsYWcgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZS4KKwlmdW5jX2ZhdGFsX2Vycm9yICJcYC1hbGxvdy11bmRlZmluZWQnIG11c3Qgbm90IGJlIHVzZWQgYmVjYXVzZSBpdCBpcyB0aGUgZGVmYXVsdCIKKwk7OworCisgICAgICAtYXZvaWQtdmVyc2lvbikKKwlhdm9pZF92ZXJzaW9uPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWJpbmRpcikKKwlwcmV2PWJpbmRpcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRsb3BlbikKKwlwcmV2PWRsZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbHByZW9wZW4pCisJcHJldj1kbHByZWZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZXhwb3J0LWR5bmFtaWMpCisJZXhwb3J0X2R5bmFtaWM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICBmdW5jX2ZhdGFsX2Vycm9yICJtb3JlIHRoYW4gb25lIC1leHBvcnRlZC1zeW1ib2xzIGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIgorCWZpCisJaWYgdGVzdCAiWCRhcmciID0gIlgtZXhwb3J0LXN5bWJvbHMiOyB0aGVuCisJICBwcmV2PWV4cHN5bXMKKwllbHNlCisJICBwcmV2PWV4cHN5bXNfcmVnZXgKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWZyYW1ld29yaykKKwlwcmV2PWZyYW1ld29yaworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWluc3QtcHJlZml4LWRpcikKKwlwcmV2PWluc3RfcHJlZml4CisJY29udGludWUKKwk7OworCisgICAgICAjIFRoZSBuYXRpdmUgSVJJWCBsaW5rZXIgdW5kZXJzdGFuZHMgLUxBTkc6KiwgLUxJU1Q6KiBhbmQgLUxOTzoqCisgICAgICAjIHNvLCBpZiB3ZSBzZWUgdGhlc2UgZmxhZ3MgYmUgY2FyZWZ1bCBub3QgdG8gdHJlYXQgdGhlbSBsaWtlIC1MCisgICAgICAtTFtBLVpdW0EtWl0qOiopCisJY2FzZSAkd2l0aF9nY2MvJGhvc3QgaW4KKwluby8qLSotaXJpeCogfCAvKi0qLWlyaXgqKQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorCSAgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtTCopCisJZnVuY19zdHJpcG5hbWUgIi1MIiAnJyAiJGFyZyIKKwlpZiB0ZXN0IC16ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IjsgdGhlbgorCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInJlcXVpcmUgbm8gc3BhY2UgYmV0d2VlbiBcYC1MJyBhbmQgXGAkMSciCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm5lZWQgcGF0aCBmb3IgXGAtTCcgb3B0aW9uIgorCSAgZmkKKwlmaQorCWZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCWRpcj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJICB0ZXN0IC16ICIkYWJzZGlyIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKKwkgIGRpcj0iJGFic2RpciIKKwkgIDs7CisJZXNhYworCWNhc2UgIiRkZXBsaWJzICIgaW4KKwkqIiAtTCRkaXIgIiogfCAqIiAkYXJnICIqKQorCSAgIyBXaWxsIG9ubHkgaGFwcGVuIGZvciBhYnNvbHV0ZSBvciBzeXNyb290IGFyZ3VtZW50cworCSAgOzsKKwkqKQorCSAgIyBQcmVzZXJ2ZSBzeXNyb290LCBidXQgbmV2ZXIgaW5jbHVkZSByZWxhdGl2ZSBkaXJlY3RvcmllcworCSAgY2FzZSAkZGlyIGluCisJICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKiB8ID0qKSBmdW5jX2FwcGVuZCBkZXBsaWJzICIgJGFyZyIgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgZGVwbGlicyAiIC1MJGRpciIgOzsKKwkgIGVzYWMKKwkgIGZ1bmNfYXBwZW5kIGxpYl9zZWFyY2hfcGF0aCAiICRkaXIiCisJICA7OworCWVzYWMKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKwkgIHRlc3RiaW5kaXI9YCRFQ0hPICIkZGlyIiB8ICRTRUQgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JGRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbCopCisJaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyogfCAqLSotaGFpa3UqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLW9zMiopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAgICMgUmhhcHNvZHkgQyBhbmQgbWF0aCBsaWJyYXJpZXMgYXJlIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICAgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiBTeXN0ZW0ubHRmcmFtZXdvcmsiCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCisJICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwllbGlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjX3IiOyB0aGVuCisJIGNhc2UgJGhvc3QgaW4KKwkgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjX3IgZGlyZWN0bHksIHVzZSAtcHRocmVhZCBmbGFnLgorCSAgIGNvbnRpbnVlCisJICAgOzsKKwkgZXNhYworCWZpCisJZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciCisJY29udGludWUKKwk7OworCisgICAgICAtbW9kdWxlKQorCW1vZHVsZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgVHJ1NjQgVU5JWCB1c2VzIC1tb2RlbCBbYXJnXSB0byBkZXRlcm1pbmUgdGhlIGxheW91dCBvZiBDKysKKyAgICAgICMgY2xhc3NlcywgbmFtZSBtYW5nbGluZywgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICAgICMgRGFyd2luIHVzZXMgdGhlIC1hcmNoIGZsYWcgdG8gZGV0ZXJtaW5lIG91dHB1dCBhcmNoaXRlY3R1cmUuCisgICAgICAtbW9kZWx8LWFyY2h8LWlzeXNyb290fC0tc3lzcm9vdCkKKwlmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCisJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwlwcmV2PXhjb21waWxlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKKwlmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCisJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqICkgZnVuY19hcHBlbmQgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiAkYXJnIiA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdWx0aV9tb2R1bGUpCisJc2luZ2xlX21vZHVsZT0iJHt3bH0tbXVsdGlfbW9kdWxlIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKKwlmYXN0X2luc3RhbGw9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1pbnN0YWxsKQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1kYXJ3aW4qIHwgKi1jZWdjYyopCisJICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKKwkgICMgYW5kIERhcndpbiBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgorCSAgZnVuY193YXJuaW5nICJcYC1uby1pbnN0YWxsJyBpcyBpZ25vcmVkIGZvciAkaG9zdCIKKwkgIGZ1bmNfd2FybmluZyAiYXNzdW1pbmcgXGAtbm8tZmFzdC1pbnN0YWxsJyBpbnN0ZWFkIgorCSAgZmFzdF9pbnN0YWxsPW5vCisJICA7OworCSopIG5vX2luc3RhbGw9eWVzIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLXVuZGVmaW5lZCkKKwlhbGxvd191bmRlZmluZWQ9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vYmplY3RsaXN0KQorCXByZXY9b2JqZWN0bGlzdAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW8pIHByZXY9b3V0cHV0IDs7CisKKyAgICAgIC1wcmVjaW91cy1maWxlcy1yZWdleCkKKwlwcmV2PXByZWNpb3VzX3JlZ2V4CisJY29udGludWUKKwk7OworCisgICAgICAtcmVsZWFzZSkKKwlwcmV2PXJlbGVhc2UKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1ycGF0aCkKKwlwcmV2PXJwYXRoCisJY29udGludWUKKwk7OworCisgICAgICAtUikKKwlwcmV2PXhycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIqKQorCWZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRhcmciCisJZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJPSopCisJICBmdW5jX3N0cmlwbmFtZSAnPScgJycgIiRkaXIiCisJICBkaXI9JGx0X3N5c3Jvb3QkZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICA7OworCSopCisJICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGRpciIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtc2hhcmVkKQorCSMgVGhlIGVmZmVjdHMgb2YgLXNoYXJlZCBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJY29udGludWUKKwk7OworCisgICAgICAtc2hyZXh0KQorCXByZXY9c2hyZXh0CisJY29udGludWUKKwk7OworCisgICAgICAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KKwkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKKwkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCisJIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0CisJIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KKwljb250aW51ZQorCTs7CisKKyAgICAgIC10aHJlYWQtc2FmZSkKKwl0aHJlYWRfc2FmZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisJcHJldj12aW5mbworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXZlcnNpb24tbnVtYmVyKQorCXByZXY9dmluZm8KKwl2aW5mb19udW1iZXI9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtd2VhaykKKyAgICAgICAgcHJldj13ZWFrCisJY29udGludWUKKwk7OworCisgICAgICAtV2MsKikKKwlmdW5jX3N0cmlwbmFtZSAnLVdjLCcgJycgIiRhcmciCisJYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCisJICBmdW5jX2FwcGVuZCBhcmcgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJZnVuY19zdHJpcG5hbWUgJyAnICcnICIkYXJnIgorCWFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJOzsKKworICAgICAgLVdsLCopCisJZnVuY19zdHJpcG5hbWUgJy1XbCwnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgZnVuY19hcHBlbmQgYXJnICIgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKKwlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCTs7CisKKyAgICAgIC1YY29tcGlsZXIpCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YbGlua2VyKQorCXByZXY9eGxpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVhDQ2xpbmtlcikKKwlwcmV2PXhjY2xpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyAtbXNnXyogZm9yIG9zZiBjYworICAgICAgLW1zZ18qKQorCWZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJOzsKKworICAgICAgIyBGbGFncyB0byBiZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQsIHdpdGggcmF0aW9uYWxlOgorICAgICAgIyAtNjQsIC1taXBzWzAtOV0gICAgICBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXJbMC05XVswLTldKiAgICAgICAgc3BlY2lmeSBwcm9jZXNzb3IgZm9yIHRoZSBTR0kgY29tcGlsZXIKKyAgICAgICMgLXhhcmNoPSosIC14dGFyZ2V0PSogZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgU3VuIGNvbXBpbGVyCisgICAgICAjICtEQSosICtERCogICAgICAgICAgIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIEhQIGNvbXBpbGVyCisgICAgICAjIC1xKiAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGFyZ3MgZm9yIHRoZSBJQk0gY29tcGlsZXIKKyAgICAgICMgLW0qLCAtdFs0NV0qLCAtdHhzY2FsZSogYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzIGZvciBHQ0MKKyAgICAgICMgLUYvcGF0aCAgICAgICAgICAgICAgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCisgICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qICBwcm9maWxpbmcgZmxhZ3MgZm9yIEdDQworICAgICAgIyBAZmlsZSAgICAgICAgICAgICAgICBHQ0MgcmVzcG9uc2UgZmlsZXMKKyAgICAgICMgLXRwPSogICAgICAgICAgICAgICAgUG9ydGxhbmQgcGdjYyB0YXJnZXQgcHJvY2Vzc29yIHNlbGVjdGlvbgorICAgICAgIyAtLXN5c3Jvb3Q9KiAgICAgICAgICBmb3Igc3lzcm9vdCBzdXBwb3J0CisgICAgICAjIC1PKiwgLWZsdG8qLCAtZndob3ByKiwgLWZ1c2UtbGlua2VyLXBsdWdpbiBHQ0MgbGluay10aW1lIG9wdGltaXphdGlvbgorICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCisgICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCp8LXRwPSp8LS1zeXNyb290PSp8IFwKKyAgICAgIC1PKnwtZmx0byp8LWZ3aG9wcip8LWZ1c2UtbGlua2VyLXBsdWdpbikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKyAgICAgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKyAgICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJGFyZyIKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICouJG9iamV4dCkKKwkjIEEgc3RhbmRhcmQgb2JqZWN0LgorCWZ1bmNfYXBwZW5kIG9ianMgIiAkYXJnIgorCTs7CisKKyAgICAgICoubG8pCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgIiRhcmciCisKKwkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCWZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkcGljX29iamVjdCIKKwkJcHJldj0KKwkJY29udGludWUKKwkgICAgICBlbHNlCisJCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCXByZXY9ZGxwcmVmaWxlcworCSAgICAgIGZpCisJICAgIGZpCisKKwkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgICAgICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJHBpY19vYmplY3QiCisJICAgICAgcHJldj0KKwkgICAgZmkKKworCSAgICAjIEEgUElDIG9iamVjdC4KKwkgICAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCSAgICBhcmc9IiRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBOb24tUElDIG9iamVjdC4KKwkgIGlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkgICAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0CisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgICAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJICAgICAgYXJnPSIkbm9uX3BpY19vYmplY3QiCisJICAgIGZpCisJICBlbHNlCisJICAgICMgSWYgdGhlIFBJQyBvYmplY3QgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZC4KKwkgICAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCSAgICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGZpCisJZWxzZQorCSAgIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJICBpZiAkb3B0X2RyeV9ydW47IHRoZW4KKwkgICAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgICAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgICAgeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkgICAgZnVuY19sbzJvICIkYXJnIgorCSAgICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAorCSAgICBub25fcGljX29iamVjdD0keGRpciRmdW5jX2xvMm9fcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICouJGxpYmV4dCkKKwkjIEFuIGFyY2hpdmUuCisJZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciCisJZnVuY19hcHBlbmQgb2xkX2RlcGxpYnMgIiAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGFyZyIKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGZ1bmNfYXBwZW5kIGRsZmlsZXMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgcHJldj0KKwllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJICBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIHByZXY9CisJZWxzZQorCSAgZnVuY19hcHBlbmQgZGVwbGlicyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKyAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkU0VEIFwncy86LyAvZ1wnXGAKKyAgICBlbHNlCisgICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KKyAgICBmaQorICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgorICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKKworICAgIGZ1bmNfZGlybmFtZSAiJG91dHB1dCIgIi8iICIiCisgICAgb3V0cHV0X29iamRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkb2JqZGlyIgorICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkb3V0cHV0X29iamRpci8iCisgICAgdG9vbF9vdXRwdXRfb2JqZGlyPSRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQKKyAgICAjIENyZWF0ZSB0aGUgb2JqZWN0IGRpcmVjdG9yeS4KKyAgICBmdW5jX21rZGlyX3AgIiRvdXRwdXRfb2JqZGlyIgorCisgICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0CisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgIiIpCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiCisgICAgICA7OworICAgICouJGxpYmV4dCkgbGlua21vZGU9b2xkbGliIDs7CisgICAgKi5sbyB8ICouJG9iamV4dCkgbGlua21vZGU9b2JqIDs7CisgICAgKi5sYSkgbGlua21vZGU9bGliIDs7CisgICAgKikgbGlua21vZGU9cHJvZyA7OyAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KKyAgICBlc2FjCisKKyAgICBzcGVjaWFsZGVwbGlicz0KKworICAgIGxpYnM9CisgICAgIyBGaW5kIGFsbCBpbnRlcmRlcGVuZGVudCBkZXBsaWJzIGJ5IHNlYXJjaGluZyBmb3IgbGlicmFyaWVzCisgICAgIyB0aGF0IGFyZSBsaW5rZWQgbW9yZSB0aGFuIG9uY2UgKGUuZy4gLWxhIC1sYiAtbGEpCisgICAgZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKyAgICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJY2FzZSAiJGxpYnMgIiBpbgorCSoiICRkZXBsaWIgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgbGlicyAiICRkZXBsaWIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCisKKyAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCisgICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCisgICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwczsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIGZ1bmNfYXBwZW5kIHByZV9wb3N0X2RlcHMgIiAkcHJlX3Bvc3RfZGVwIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgIGZpCisKKyAgICBkZXBsaWJzPQorICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKyAgICBuZXdsaWJfc2VhcmNoX3BhdGg9CisgICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgbGliKQorCXBhc3Nlcz0iY29udiBkbHByZW9wZW4gbGluayIKKwlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICoubGEpIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2hlbHAgImxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICBwcm9nKQorCWNvbXBpbGVfZGVwbGlicz0KKwlmaW5hbGl6ZV9kZXBsaWJzPQorCWFsbGRlcGxpYnM9bm8KKwluZXdkbGZpbGVzPQorCW5ld2RscHJlZmlsZXM9CisJcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgorCTs7CisgICAgKikgIHBhc3Nlcz0iY29udiIKKwk7OworICAgIGVzYWMKKworICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCisgICAgICAjIFRoZSBwcmVvcGVuIHBhc3MgaW4gbGliIG1vZGUgcmV2ZXJzZXMgJGRlcGxpYnM7IHB1dCBpdCBiYWNrIGhlcmUKKyAgICAgICMgc28gdGhhdCAtTCBjb21lcyBiZWZvcmUgbGlicyB0aGF0IG5lZWQgaXQgZm9yIGluc3RhbmNlLi4uCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIjsgdGhlbgorCSMjIEZJWE1FOiBGaW5kIHRoZSBwbGFjZSB3aGVyZSB0aGUgbGlzdCBpcyByZWJ1aWx0IGluIHRoZSB3cm9uZworCSMjICAgICAgICBvcmRlciwgYW5kIGZpeCBpdCB0aGVyZSBwcm9wZXJseQorICAgICAgICB0bXBfZGVwbGlicz0KKwlmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgdG1wX2RlcGxpYnM9IiRkZXBsaWIgJHRtcF9kZXBsaWJzIgorCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csc2NhbiI7IHRoZW4KKwlsaWJzPSIkZGVwbGlicyIKKwlkZXBsaWJzPQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJY2FzZSAkcGFzcyBpbgorCWRsb3BlbikgbGlicz0iJGRsZmlsZXMiIDs7CisJZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKKwlsaW5rKQorCSAgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlIgorCSAgdGVzdCAiWCRsaW5rX2FsbF9kZXBsaWJzIiAhPSBYbm8gJiYgbGlicz0iJGxpYnMgJGRlcGVuZGVuY3lfbGlicyIKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGRscHJlb3BlbiI7IHRoZW4KKwkjIENvbGxlY3QgYW5kIGZvcndhcmQgZGVwbGlicyBvZiBwcmVvcGVuZWQgbGlidG9vbCBsaWJzCisJZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICMgSWdub3JlIG5vbi1saWJ0b29sLWxpYnMKKwkgIGRlcGVuZGVuY3lfbGlicz0KKwkgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkbGliIgorCSAgY2FzZSAkbGliIGluCisJICAqLmxhKQlmdW5jX3NvdXJjZSAiJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIgOzsKKwkgIGVzYWMKKworCSAgIyBDb2xsZWN0IHByZW9wZW5lZCBsaWJ0b29sIGRlcGxpYnMsIGV4Y2VwdCBhbnkgdGhpcyBsaWJyYXJ5CisJICAjIGhhcyBkZWNsYXJlZCBhcyB3ZWFrIGxpYnMKKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJGRlcGxpYiIKKyAgICAgICAgICAgIGRlcGxpYl9iYXNlPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBjYXNlICIgJHdlYWtfbGlicyAiIGluCisJICAgICoiICRkZXBsaWJfYmFzZSAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlkb25lCisJbGlicz0iJGRscHJlZmlsZXMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisKKyAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCisJbGliPQorCWZvdW5kPW5vCisJY2FzZSAkZGVwbGliIGluCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkZGVwbGliIgorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgorCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkJICAgICogKSBmdW5jX2FwcGVuZCBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGZ1bmNfc3RyaXBuYW1lICctbCcgJycgIiRkZXBsaWIiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZWxzZQorCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZmkKKwkgIGZvciBzZWFyY2hkaXIgaW4gJHNlYXJjaGRpcnM7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmIGZ1bmNfbGFsaWJfcCAiJGxpYiI7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGZ1bmNfc291cmNlICIkbGliIgorCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCQkgICAgbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKKwkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkJICAgIGVsc2UKKwkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkJICAgIGZpCisJCSAgICBjb250aW51ZQorCQkgIGZpCisJCWZpCisJCTs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCSoubHRmcmFtZXdvcmspCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCisJCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJCSAgICAqIiAkZGVwbGliICIqKSA7OworCQkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgICAgOzsKKwkgICopCisJICAgIGZ1bmNfd2FybmluZyAiXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgY29udGludWUKKwkgIDs7ICMgLUwKKwktUiopCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRkZXBsaWIiCisJICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBkaXI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSAgICAjIE1ha2Ugc3VyZSB0aGUgeHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKQorCSAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiCisJICBsaWI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSAgOzsKKwkqLiRsaWJleHQpCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGNvbnRpbnVlCisJICBmaQorCSAgY2FzZSAkbGlua21vZGUgaW4KKwkgIGxpYikKKwkgICAgIyBMaW5raW5nIGNvbnZlbmllbmNlIG1vZHVsZXMgaW50byBzaGFyZWQgbGlicmFyaWVzIGlzIGFsbG93ZWQsCisJICAgICMgYnV0IGxpbmtpbmcgb3RoZXIgc3RhdGljIGxpYnJhcmllcyBpcyBub24tcG9ydGFibGUuCisJICAgIGNhc2UgIiAkZGxwcmVjb252ZW5pZW5jZWxpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAqKQorCSAgICAgIHZhbGlkX2FfbGliPW5vCisJICAgICAgY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkJbWF0Y2hfcGF0dGVybiopCisJCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJCSAgaWYgZXZhbCAiXCRFQ0hPIFwiJGRlcGxpYlwiIiAyPi9kZXYvbnVsbCB8ICRTRUQgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgIHZhbGlkX2FfbGliPXllcworCQkgIGZpCisJCTs7CisJCXBhc3NfYWxsKQorCQkgIHZhbGlkX2FfbGliPXllcworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgorCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogVHJ5aW5nIHRvIGxpbmsgd2l0aCBzdGF0aWMgbGliIGFyY2hpdmUgJGRlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJZWNobyAiKioqIGJlY2F1c2UgdGhlIGZpbGUgZXh0ZW5zaW9ucyAuJGxpYmV4dCBvZiB0aGlzIGFyZ3VtZW50IG1ha2VzIG1lIGJlbGlldmUiCisJCWVjaG8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2UgaGVyZS4iCisJICAgICAgZWxzZQorCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSIKKwkJJEVDSE8gIioqKiBzdGF0aWMgbGlicmFyeSAkZGVwbGliIGlzIG5vdCBwb3J0YWJsZSEiCisJCWRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICA7OyAjICouJGxpYmV4dAorCSoubG8gfCAqLiRvYmpleHQpCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCisJICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkZXBsaWIiCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkZGVwbGliIgorCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCSVERVBMSUJTJSkKKwkgIGFsbGRlcGxpYnM9eWVzCisJICBjb250aW51ZQorCSAgOzsKKwllc2FjICMgY2FzZSAkZGVwbGliCisKKwlpZiB0ZXN0ICIkZm91bmQiID0geWVzIHx8IHRlc3QgLWYgIiRsaWIiOyB0aGVuIDoKKwllbHNlCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCB0aGUgbGlicmFyeSBcYCRsaWInIG9yIHVuaGFuZGxlZCBhcmd1bWVudCBcYCRkZXBsaWInIgorCWZpCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRsaWIiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJZnVuY19kaXJuYW1lICIkbGliIiAiIiAiLiIKKwlsYWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwlkbG5hbWU9CisJZGxvcGVuPQorCWRscHJlb3Blbj0KKwlsaWJkaXI9CisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCisJIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZXMgaW5zdGFsbGVkLCBvciBzaG91bGRub3RsaW5rCisJaW5zdGFsbGVkPXllcworCXNob3VsZG5vdGxpbms9bm8KKwlhdm9pZHRlbXBycGF0aD0KKworCisJIyBSZWFkIHRoZSAubGEgZmlsZQorCWZ1bmNfc291cmNlICIkbGliIgorCisJIyBDb252ZXJ0ICItZnJhbWV3b3JrIGZvbyIgdG8gImZvby5sdGZyYW1ld29yayIKKwlpZiB0ZXN0IC1uICIkaW5oZXJpdGVkX2xpbmtlcl9mbGFncyI7IHRoZW4KKwkgIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPWAkRUNITyAiJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncy8tZnJhbWV3b3JrIFwoW14gJF0qXCkvXDEubHRmcmFtZXdvcmsvZydgCisJICBmb3IgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyBpbiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M7IGRvCisJICAgIGNhc2UgIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCSAgICAgICoiICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWciOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiICRkZXBlbmRlbmN5X2xpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAorCSAgIHsgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB9OyB0aGVuCisJICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGRsb3BlbiIKKwkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkZGxwcmVvcGVuIgorCWZpCisKKwlpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcworCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIKKwkgICAgZmkKKwkgICAgIyBJdCBpcyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeSwgc28gYWRkIGluIGl0cyBvYmplY3RzLgorCSAgICBmdW5jX2FwcGVuZCBjb252ZW5pZW5jZSAiICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgZnVuY19hcHBlbmQgb2xkX2NvbnZlbmllbmNlICIgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICB0bXBfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgaWYgJG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcyA7IHRoZW4KKwkJY2FzZSAiJHRtcF9saWJzICIgaW4KKwkJKiIgJGRlcGxpYiAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZGVwbGliIiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiCisJICAgIGRvbmUKKwkgIGVsaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgY29udmVuaWVuY2UgbGlicmFyeSIKKwkgIGZpCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBjb252CisKKworCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KKwlsaW5rbGliPQorCWlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYKKwkgICB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0geWVzIHx8CisJICAgICB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzLCRpbnN0YWxsZWQiID0gImJ1aWx0LG5vIjsgfTsgdGhlbgorCSAgbGlua2xpYj0kb2xkX2xpYnJhcnkKKwllbHNlCisJICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisJICAgIGxpbmtsaWI9IiRsIgorCSAgZG9uZQorCWZpCisJaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIKKwlmaQorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgLWRsb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCisJICBmaQorCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwKKwkgICAgIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nCisJICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLiAgV2UgYWxzbyBuZWVkIHRvIHByZWxvYWQgYW55CisJICAgICMgZGVwZW5kZW50IGxpYnJhcmllcyBzbyBsaWJsdGRsJ3MgZGVwbGliIHByZWxvYWRlciBkb2Vzbid0CisJICAgICMgYm9tYiBvdXQgaW4gdGhlIGxvYWQgZGVwbGlicyBwaGFzZS4KKwkgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRsaWIgJGRlcGVuZGVuY3lfbGlicyIKKwkgIGVsc2UKKwkgICAgZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICRsaWIiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gZGxvcGVuCisKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRsYWRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7CisJKikKKwkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxhZGlyJyIKKwkgICAgZnVuY193YXJuaW5nICJwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIgorCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKKwkgIGZpCisJICA7OworCWVzYWMKKwlmdW5jX2Jhc2VuYW1lICIkbGliIgorCWxhbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgorCSAgaWYgdGVzdCAhIC1mICIkbHRfc3lzcm9vdCRsaWJkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAibGlicmFyeSBcYCRsaWInIHdhcyBtb3ZlZC4iCisJICAgIGRpcj0iJGxhZGlyIgorCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCisJICAgIGxpYmRpcj0iJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbHRfc3lzcm9vdCRsaWJkaXIiCisJICAgIGFic2Rpcj0iJGx0X3N5c3Jvb3QkbGliZGlyIgorCSAgZmkKKwkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBmdW5jX2FwcGVuZCBub3RpbnN0X3BhdGggIiAkYWJzX2xhZGlyIgorCSAgZWxzZQorCSAgICBkaXI9IiRsYWRpci8kb2JqZGlyIgorCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIvJG9iamRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBmdW5jX2FwcGVuZCBub3RpbnN0X3BhdGggIiAkYWJzX2xhZGlyIgorCSAgZmkKKwlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKKwlmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmxhJyAiJGxhbmFtZSIKKwluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgorCWlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciIgJiYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBsaWJyYXJpZXMgbWF5IC1kbHByZW9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIgorCSAgZmkKKwkgIGNhc2UgIiRob3N0IiBpbgorCSAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHBsYXRmb3JtcyB3aXRoIFBFLURMTHMuCisJICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICMgTGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcnkgaWYgYm90aAorCSAgICAgICMgc3RhdGljIGFuZCBzaGFyZWQgYXJlIHByZXNlbnQuICBUaGVyZWZvcmUsIGVuc3VyZSB3ZSBleHRyYWN0CisJICAgICAgIyBzeW1ib2xzIGZyb20gdGhlIGltcG9ydCBsaWJyYXJ5IGlmIGEgc2hhcmVkIGxpYnJhcnkgaXMgcHJlc2VudAorCSAgICAgICMgKG90aGVyd2lzZSwgdGhlIGRsb3BlbiBtb2R1bGUgbmFtZSB3aWxsIGJlIGluY29ycmVjdCkuICBXZSBkbworCSAgICAgICMgdGhpcyBieSBwdXR0aW5nIHRoZSBpbXBvcnQgbGlicmFyeSBuYW1lIGludG8gJG5ld2RscHJlZmlsZXMuCisJICAgICAgIyBXZSByZWNvdmVyIHRoZSBkbG9wZW4gbW9kdWxlIG5hbWUgYnkgJ3NhdmluZycgdGhlIGxhIGZpbGUKKwkgICAgICAjIG5hbWUgaW4gYSBzcGVjaWFsIHB1cnBvc2UgdmFyaWFibGUsIGFuZCAobGF0ZXIpIGV4dHJhY3RpbmcgdGhlCisJICAgICAgIyBkbG5hbWUgZnJvbSB0aGUgbGEgZmlsZS4KKwkgICAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgICAgZnVuY190cl9zaCAiJGRpci8kbGlua2xpYiIKKwkgICAgICAgIGV2YWwgImxpYmZpbGVfJGZ1bmNfdHJfc2hfcmVzdWx0PVwkYWJzX2xhZGlyL1wkbGFuYW1lIgorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJGxpbmtsaWIiCisJICAgICAgZWxzZQorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgICAgIyBLZWVwIGEgbGlzdCBvZiBwcmVvcGVuZWQgY29udmVuaWVuY2UgbGlicmFyaWVzIHRvIGNoZWNrCisJICAgICAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KKwkgICAgICAgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkgICAgICAgICAgZnVuY19hcHBlbmQgZGxwcmVjb252ZW5pZW5jZWxpYnMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICBmaQorCSAgICA7OworCSAgICAqICkKKwkgICAgICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKKwkgICAgICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgICAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgICAjIEtlZXAgYSBsaXN0IG9mIHByZW9wZW5lZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMgdG8gY2hlY2sKKwkgICAgICAgICMgdGhhdCB0aGV5IGFyZSBiZWluZyB1c2VkIGNvcnJlY3RseSBpbiB0aGUgbGluayBwYXNzLgorCSAgICAgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCSAgICAgICAgICBmdW5jX2FwcGVuZCBkbHByZWNvbnZlbmllbmNlbGlicyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGRsbmFtZSwgc28gdGhhdCBsdF9kbG9wZW4gZmluZHMgaXQuCisJICAgICAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJGRsbmFtZSIKKwkgICAgICBlbHNlCisJICAgICAgICBmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJGRpci8kbGlua2xpYiIKKwkgICAgICBmaQorCSAgICA7OworCSAgZXNhYworCWZpICMgJHBhc3MgPSBkbHByZW9wZW4KKworCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAjIExpbmsgdGhlIGNvbnZlbmllbmNlIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIiAjIHVzZWQgZm9yIHByb2csc2NhbiBwYXNzCisJICBmaQorCSAgY29udGludWUKKwlmaQorCisKKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyAmJiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGxhZGlyIgorCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKKworCSAgbGlua2FsbGRlcGxpYnM9bm8KKwkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubyB8fCB0ZXN0IC16ICIkbGlicmFyeV9uYW1lcyIgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgbGlua2FsbGRlcGxpYnM9eWVzCisJICBmaQorCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKwkgICAgICAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgICAgICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCQkgOzsKKwkgICAgZXNhYworCSAgICAjIE5lZWQgdG8gbGluayBhZ2FpbnN0IGFsbCBkZXBlbmRlbmN5X2xpYnM/CisJICAgIGlmIHRlc3QgIiRsaW5rYWxsZGVwbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgIyBOZWVkIHRvIGhhcmRjb2RlIHNoYXJlZCBsaWJyYXJ5IHBhdGhzCisJICAgICAgIyBvci9hbmQgbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgaWYgJG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIKKwkgIGRvbmUgIyBmb3IgZGVwbGliCisJICBjb250aW51ZQorCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICAgIHsgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8CisJICAgICAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCx5ZXMiOyB9IHx8CisJICAgICAgIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKKwkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCisJICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoOiIgaW4KKwkgICAgICAqIiRhYnNkaXI6IiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgdGVtcF9ycGF0aCAiJGFic2RpcjoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgY29tcGlsZV9ycGF0aCAiICRhYnNkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpICMgJGxpbmttb2RlLCRwYXNzID0gcHJvZyxsaW5rLi4uCisKKwkgIGlmIHRlc3QgIiRhbGxkZXBsaWJzIiA9IHllcyAmJgorCSAgICAgeyB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiID0gcGFzc19hbGwgfHwKKwkgICAgICAgeyB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJgorCQkgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB9OyB9OyB0aGVuCisJICAgICMgV2Ugb25seSBuZWVkIHRvIHNlYXJjaCBmb3Igc3RhdGljIGxpYnJhcmllcworCSAgICBjb250aW51ZQorCSAgZmkKKwlmaQorCisJbGlua19zdGF0aWM9bm8gIyBXaGV0aGVyIHRoZSBkZXBsaWIgd2lsbCBiZSBsaW5rZWQgc3RhdGljYWxseQorCXVzZV9zdGF0aWNfbGlicz0kcHJlZmVyX3N0YXRpY19saWJzCisJaWYgdGVzdCAiJHVzZV9zdGF0aWNfbGlicyIgPSBidWlsdCAmJiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgorCSAgdXNlX3N0YXRpY19saWJzPW5vCisJZmkKKwlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICB7IHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKikKKwkgICAgICAjIE5vIHBvaW50IGluIHJlbGlua2luZyBETExzIGJlY2F1c2UgcGF0aHMgYXJlIG5vdCBlbmNvZGVkCisJICAgICAgZnVuY19hcHBlbmQgbm90aW5zdF9kZXBsaWJzICIgJGxpYiIKKwkgICAgICBuZWVkX3JlbGluaz1ubworCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgorCSAgICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfZGVwbGlicyAiICRsaWIiCisJICAgICAgbmVlZF9yZWxpbms9eWVzCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQorCisJICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24gc29tZQorCSAgIyBzeXN0ZW1zIChkYXJ3aW4pLiAgRG9uJ3QgYmxlYXQgYWJvdXQgZGxvcGVuZWQgbW9kdWxlcyB0aG91Z2ghCisJICBkbG9wZW5tb2R1bGU9IiIKKwkgIGZvciBkbHByZW1vZHVsZXRlc3QgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgIGlmIHRlc3QgIlgkZGxwcmVtb2R1bGV0ZXN0IiA9ICJYJGxpYiI7IHRoZW4KKwkgICAgICBkbG9wZW5tb2R1bGU9IiRkbHByZW1vZHVsZXRlc3QiCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgIGRvbmUKKwkgIGlmIHRlc3QgLXogIiRkbG9wZW5tb2R1bGUiICYmIHRlc3QgIiRzaG91bGRub3RsaW5rIiA9IHllcyAmJiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgIGVjaG8KKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIGV4ZWN1dGFibGUgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCisJICAgIGVsc2UKKwkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBmaQorCSAgICAkRUNITyAiKioqICRsaW5rbGliIGlzIG5vdCBwb3J0YWJsZSEiCisJICBmaQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJgorCSAgICAgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBjb21waWxlX3JwYXRoICIgJGFic2RpciIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgorCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQorCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwkgICAgc2hpZnQKKwkgICAgcmVhbG5hbWU9IiQxIgorCSAgICBzaGlmdAorCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/CisJICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgc29uYW1lPSIkZGxuYW1lIgorCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgICAgICAjIGJsZWggd2luZG93cworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAqY3lnd2luKiB8IG1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCQltYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJdmVyc3VmZml4PSItJG1ham9yIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJICAgIGVsc2UKKwkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKwkgICAgZmkKKworCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQorCSAgICBzb3Jvb3Q9IiRzb25hbWUiCisJICAgIGZ1bmNfYmFzZW5hbWUgIiRzb3Jvb3QiCisJICAgIHNvbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmRsbCcgIiRzb25hbWUiCisJICAgIG5ld2xpYj1saWJpbXAtJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdC5hCisKKwkgICAgIyBJZiB0aGUgbGlicmFyeSBoYXMgbm8gZXhwb3J0IGxpc3QsIHRoZW4gY3JlYXRlIG9uZSBub3cKKwkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYiOyB0aGVuIDoKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgJ2V4aXQgJD8nCisJICAgIGZpCisKKwkgICAgIyBDcmVhdGUgJG5ld2xpYgorCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCisJICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIGltcG9ydCBsaWJyYXJ5IGZvciBcYCRzb25hbWUnIgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiICdleGl0ICQ/JworCSAgICBmaQorCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQorCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKKwkgICAgbGlua2xpYj0kbmV3bGliCisJICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG9wdF9tb2RlIiAhPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICBsaWJfbGlua2VkPXllcworCSAgICBjYXNlICRoYXJkY29kZV9hY3Rpb24gaW4KKwkgICAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgorCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCisJCWNhc2UgJGhvc3QgaW4KKwkJICAqLSotc2NvMy4ydjUuMC5bMDI0XSopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotc3lzdjQqdXcyKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NU9wZW5VTklYKiB8ICotKi1zeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgXAorCQkgICAgKi0qLXVuaXh3YXJlNyopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotZGFyd2luKiApCisJCSAgICAjIGlmIHRoZSBsaWIgaXMgYSAobm9uLWRsb3BlbmVkKSBtb2R1bGUgdGhlbiB3ZSBjYW4gbm90CisJCSAgICAjIGxpbmsgYWdhaW5zdCBpdCwgc29tZW9uZSBpcyBpZ25vcmluZyB0aGUgZWFybGllciB3YXJuaW5ncworCQkgICAgaWYgL3Vzci9iaW4vZmlsZSAtTCAkYWRkIDI+IC9kZXYvbnVsbCB8CisJCQkgJEdSRVAgIjogW146XSogYnVuZGxlIiA+L2Rldi9udWxsIDsgdGhlbgorCQkgICAgICBpZiB0ZXN0ICJYJGRsb3Blbm1vZHVsZSIgIT0gIlgkbGliIjsgdGhlbgorCQkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgorCQkJaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IiA7IHRoZW4KKwkJCSAgZWNobworCQkJICBlY2hvICIqKiogQW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHN0YXRpYyBhcmNoaXZlIGF2YWlsYWJsZSIKKwkJCSAgZWNobyAiKioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCisJCQllbHNlCisJCQkgIGFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCisJCQlmaQorCQkgICAgICBlbGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkJCWFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCisJCSAgICAgIGZpCisJCSAgICBmaQorCQllc2FjCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgorCQljYXNlICRob3N0IGluCisJCSotKi1zdW5vcyopIGFkZF9zaGxpYnBhdGg9IiRkaXIiIDs7CisJCWVzYWMKKwkJYWRkX2Rpcj0iLUwkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICByZWxpbmspCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXMgJiYKKwkgICAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCQlhZGRfZGlyPSItTCRkaXIiCisJCSMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkJaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJICBjYXNlICRsaWJkaXIgaW4KKwkJICAgIFtcXC9dKikKKwkJICAgICAgZnVuY19hcHBlbmQgYWRkX2RpciAiIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCisJCSAgICAgIDs7CisJCSAgZXNhYworCQlmaQorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgKikgbGliX2xpbmtlZD1ubyA7OworCSAgICBlc2FjCisKKwkgICAgaWYgdGVzdCAiJGxpYl9saW5rZWQiICE9IHllczsgdGhlbgorCSAgICAgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAidW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KKwkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgY29tcGlsZV9zaGxpYnBhdGggIiRhZGRfc2hsaWJwYXRoOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZF9kaXIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGQgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHllcyAmJgorCQkgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IHllcyAmJgorCQkgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJCSoiOiRsaWJkaXI6IiopIDs7CisJCSopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3NobGlicGF0aCAiJGxpYmRpcjoiIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCisJICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzICYmCisJICAgICAgIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiID0gbm87IHRoZW4KKwkgICAgICBhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkgICAgICBjYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRsaWJkaXI6IiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfc2hsaWJwYXRoICIkbGliZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciIgJiYKKwkJIHRlc3QgLWYgIiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIiA7IHRoZW4KKwkJYWRkPSIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIKKwkgICAgICBlbHNlCisJCWFkZD0iJGxpYmRpci8kbGlua2xpYiIKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KKwkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCisJICAgICAgIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJCWNhc2UgJGxpYmRpciBpbgorCQkgIFtcXC9dKikKKwkJICAgIGZ1bmNfYXBwZW5kIGFkZF9kaXIgIiAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGRfZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGQgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgZmkKKwkgIGZpCisJZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAorCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCisJICAjIHNoYXJlZCBwbGF0Zm9ybXMuCisJICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGNvbXBpbGVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBmaQorCWVsaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgTm90IGEgc2hhcmVkIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgICAgIyBXZSdyZSB0cnlpbmcgbGluayBhIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgYSBzdGF0aWMgb25lCisJICAgICMgYnV0IHRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGl0LgorCisJICAgICMgSnVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGFkZCB0aGUgbGlicmFyeSB0byBkZXBlbmRlbmN5X2xpYnMgc28KKwkgICAgIyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc3RhdGljIGxpYnJhcnkuCisJICAgIGVjaG8KKwkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBUaGlzIHN5c3RlbSBjYW4gbm90IGxpbmsgdG8gc3RhdGljIGxpYiBhcmNoaXZlICRsaWIuIgorCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgorCSAgICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICAgIGVjaG8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKKwkgICAgICBlY2hvICIqKiogYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMgdGhlIGRsb3BlbmluZyBhcHBsaWNhdGlvbiIKKwkgICAgICBlY2hvICIqKiogaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZyB0byByZXNvbHZlIHN5bWJvbHMgYXQgcnVudGltZS4iCisJICAgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwkJZWNobworCQllY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKKwkJZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKKwkJZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCQllY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJCWJ1aWxkX29sZF9saWJzPXllcworCSAgICAgIGVsc2UKKwkJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICAgIGxpbmtfc3RhdGljPXllcworCSAgZmkKKwlmaSAjIGxpbmsgc2hhcmVkL3N0YXRpYyBsaWJyYXJ5PworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyIgJiYKKwkgICAgIHsgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8CisJICAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgfHwKKwkgICAgICAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IHllczsgfTsgdGhlbgorCSAgICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKwkgICAgdGVtcF9kZXBsaWJzPQorCSAgICBmb3IgbGliZGlyIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkbGliZGlyIGluCisJICAgICAgLVIqKSBmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkbGliZGlyIgorCSAgICAgICAgICAgdGVtcF94cnBhdGg9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQkgICBjYXNlICIgJHhycGF0aCAiIGluCisJCSAgICoiICR0ZW1wX3hycGF0aCAiKikgOzsKKwkJICAgKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJHRlbXBfeHJwYXRoIjs7CisJCSAgIGVzYWM7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIHRlbXBfZGVwbGlicyAiICRsaWJkaXIiOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgorCSAgZmkKKworCSAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGFic2RpciIKKwkgICMgTGluayBhZ2FpbnN0IHRoaXMgbGlicmFyeQorCSAgdGVzdCAiJGxpbmtfc3RhdGljIiA9IG5vICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGFic19sYWRpci8kbGFuYW1lICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAjIC4uLiBhbmQgaXRzIGRlcGVuZGVuY3lfbGlicworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBjYXNlICRkZXBsaWIgaW4KKyAgICAgICAgICAgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorICAgICAgICAgICAgICAgICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0Ijs7CisgICAgICAgICAgICAgICopIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZGVwbGliIiA7OworICAgICAgICAgICAgZXNhYworCSAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCAiKikKKyAgICAgICAgICAgICAgICBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICBkb25lCisKKwkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgorCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcworCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgcGF0aD0KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAtTCopIHBhdGg9IiRkZXBsaWIiIDs7CisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZGVwbGliIgorCSAgICAgICAgZGVwbGliPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKwkgICAgICAgIGZ1bmNfZGlybmFtZSAiJGRlcGxpYiIgIiIgIi4iCisJCWRpcj0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkJY2FzZSAkZGlyIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OworCQkqKQorCQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorCQkgICAgZnVuY193YXJuaW5nICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCisJCSAgICBhYnNkaXI9IiRkaXIiCisJCSAgZmkKKwkJICA7OworCQllc2FjCisJCWlmICRHUkVQICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLWRhcndpbiopCisJCSAgZGVwZGVwbD0KKwkJICBldmFsIGRlcGxpYnJhcnlfbmFtZXM9YCR7U0VEfSAtbiAtZSAncy9ebGlicmFyeV9uYW1lcz1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCSAgaWYgdGVzdCAtbiAiJGRlcGxpYnJhcnlfbmFtZXMiIDsgdGhlbgorCQkgICAgZm9yIHRtcCBpbiAkZGVwbGlicmFyeV9uYW1lcyA7IGRvCisJCSAgICAgIGRlcGRlcGw9JHRtcAorCQkgICAgZG9uZQorCQkgICAgaWYgdGVzdCAtZiAiJGFic2Rpci8kb2JqZGlyLyRkZXBkZXBsIiA7IHRoZW4KKwkJICAgICAgZGVwZGVwbD0iJGFic2Rpci8kb2JqZGlyLyRkZXBkZXBsIgorCQkgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWAke09UT09MfSAtTCAkZGVwZGVwbCB8IGF3ayAne2lmIChOUiA9PSAyKSB7cHJpbnQgJDE7ZXhpdH19J2AKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkZGFyd2luX2luc3RhbGxfbmFtZSI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGFyd2luX2luc3RhbGxfbmFtZT1gJHtPVE9PTDY0fSAtTCAkZGVwZGVwbCAgfCBhd2sgJ3tpZiAoTlIgPT0gMikge3ByaW50ICQxO2V4aXR9fSdgCisgICAgICAgICAgICAgICAgICAgICAgZmkKKwkJICAgICAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAke3dsfS1keWxpYl9maWxlICR7d2x9JHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgorCQkgICAgICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAtZHlsaWJfZmlsZSAke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIHBhdGg9CisJCSAgICBmaQorCQkgIGZpCisJCSAgOzsKKwkJKikKKwkJICBwYXRoPSItTCRhYnNkaXIvJG9iamRpciIKKwkJICA7OworCQllc2FjCisJCWVsc2UKKwkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQkgIHRlc3QgIiRhYnNkaXIiICE9ICIkbGliZGlyIiAmJiBcCisJCSAgICBmdW5jX3dhcm5pbmcgIlxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiCisKKwkJICBwYXRoPSItTCRhYnNkaXIiCisJCWZpCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJHBhdGggIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KKwlmaSAjIGxpbmttb2RlID0gbGliCisgICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicworICAgICAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSAicHJvZyI7IHRoZW4KKwkgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRjb21waWxlX2RlcGxpYnMiCisJICBmaW5hbGl6ZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGZpbmFsaXplX2RlcGxpYnMiCisJZWxzZQorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAiYCRFQ0hPICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJZmkKKyAgICAgIGZpCisgICAgICBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW47IHRoZW4KKwkjIExpbmsgdGhlIGRscHJlb3BlbmVkIGxpYnJhcmllcyBiZWZvcmUgb3RoZXIgbGlicmFyaWVzCisJZm9yIGRlcGxpYiBpbiAkc2F2ZV9kZXBsaWJzOyBkbworCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwlkb25lCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiICE9IGRsb3BlbjsgdGhlbgorCWlmIHRlc3QgIiRwYXNzIiAhPSBjb252OyB0aGVuCisJICAjIE1ha2Ugc3VyZSBsaWJfc2VhcmNoX3BhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICBsaWJfc2VhcmNoX3BhdGg9CisJICBmb3IgZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGg7IGRvCisJICAgIGNhc2UgIiRsaWJfc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBsaWJfc2VhcmNoX3BhdGggIiAkZGlyIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBuZXdsaWJfc2VhcmNoX3BhdGg9CisJZmkKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KKwkgIHZhcnM9ImRlcGxpYnMiCisJZWxzZQorCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCisJZmkKKwlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKKwkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgorCSAgbmV3X2xpYnM9CisJICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KKwkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KKwkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKKwkgICAgIyAgICAgICAgYnJva2VuOgorCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgorCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KKwkgICAgIyBwcmFjdGljZToKKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAtUiopIDs7CisJICAgICopCisJICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKKwkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKKwkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQorCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCisJICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcworCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQorCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKKwkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAorCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKKwkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKKwkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5CisJICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQorCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0CisJICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCisJICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAgICopCisJCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSA7OworCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikKKwkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgorCWRvbmUgIyBmb3IgdmFyCisgICAgICBmaQorICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKyAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQorICAgICAgdG1wX2xpYnM9CisgICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KKwljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgorCSoiICRpICIqKQorCSAgaT0iIgorCSAgOzsKKwllc2FjCisJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCSAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkaSIKKwlmaQorICAgICAgZG9uZQorICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicworICAgIGRvbmUgIyBmb3IgcGFzcworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisgICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorICAgIGZpCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIG9sZGxpYikKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorICAgICAgZmkKKworICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgorICAgICAgKlwgLWwqIHwgKlwgLUwqKQorCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgb2xkbGlicz0iJG91dHB1dCIKKyAgICAgIGZ1bmNfYXBwZW5kIG9ianMgIiRvbGRfZGVwbGlicyIKKyAgICAgIDs7CisKKyAgICBsaWIpCisgICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCisgICAgICBjYXNlICRvdXRwdXRuYW1lIGluCisgICAgICBsaWIqKQorCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkb3V0cHV0bmFtZSIKKwluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCTs7CisgICAgICAqKQorCXRlc3QgIiRtb2R1bGUiID0gbm8gJiYgXAorCSAgZnVuY19mYXRhbF9oZWxwICJsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIgorCisJaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KKwkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKKwkgIGZ1bmNfc3RyaXBuYW1lICcnICcubGEnICIkb3V0cHV0bmFtZSIKKwkgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCWVsc2UKKwkgIGZ1bmNfc3RyaXBuYW1lICcnICcubGEnICIkb3V0cHV0bmFtZSIKKwkgIGxpYm5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCisJaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyBvbiB0aGlzIGhvc3Q6JG9ianMiCisJZWxzZQorCSAgZWNobworCSAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgorCSAgJEVDSE8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCisJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJG9ianMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIHRlc3QgIiRkbHNlbGYiICE9IG5vICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbiBzZWxmJyBpcyBpZ25vcmVkIGZvciBsaWJ0b29sIGxpYnJhcmllcyIKKworICAgICAgc2V0IGR1bW15ICRycGF0aAorICAgICAgc2hpZnQKKyAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCisJZnVuY193YXJuaW5nICJpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIKKworICAgICAgaW5zdGFsbF9saWJkaXI9IiQxIgorCisgICAgICBvbGRsaWJzPQorICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCSAgIyBTb21lIGNvbXBpbGVycyBoYXZlIHByb2JsZW1zIHdpdGggYSBgLmFsJyBleHRlbnNpb24gc28KKwkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGV4dGVuc2lvbiBhbgorCSAgIyBhcmNoaXZlIG5vcm1hbGx5IHdvdWxkLgorCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQorCSAgYnVpbGRfb2xkX2xpYnM9eWVzCisJZmkKKworCXRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCSAgZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiCisKKwl0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAorCSAgZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiCisgICAgICBlbHNlCisKKwkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JworCXNldCBkdW1teSAkdmluZm8gMCAwIDAKKwlzaGlmdAorCUlGUz0iJHNhdmVfaWZzIgorCisJdGVzdCAtbiAiJDciICYmIFwKKwkgIGZ1bmNfZmF0YWxfaGVscCAidG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIgorCisJIyBjb252ZXJ0IGFic29sdXRlIHZlcnNpb24gbnVtYmVycyB0byBsaWJ0b29sIGFnZXMKKwkjIHRoaXMgcmV0YWlucyBjb21wYXRpYmlsaXR5IHdpdGggLmxhIGZpbGVzIGFuZCBhdHRlbXB0cworCSMgdG8gbWFrZSB0aGUgY29kZSBiZWxvdyBhIGJpdCBtb3JlIGNvbXByZWhlbnNpYmxlCisKKwljYXNlICR2aW5mb19udW1iZXIgaW4KKwl5ZXMpCisJICBudW1iZXJfbWFqb3I9IiQxIgorCSAgbnVtYmVyX21pbm9yPSIkMiIKKwkgIG51bWJlcl9yZXZpc2lvbj0iJDMiCisJICAjCisJICAjIFRoZXJlIGFyZSByZWFsbHkgb25seSB0d28ga2luZHMgLS0gdGhvc2UgdGhhdAorCSAgIyB1c2UgdGhlIGN1cnJlbnQgcmV2aXNpb24gYXMgdGhlIG1ham9yIHZlcnNpb24KKwkgICMgYW5kIHRob3NlIHRoYXQgc3VidHJhY3QgYWdlIGFuZCB1c2UgYWdlIGFzCisJICAjIGEgbWlub3IgdmVyc2lvbi4gIEJ1dCwgdGhlbiB0aGVyZSBpcyBpcml4CisJICAjIHdoaWNoIGhhcyBhbiBleHRyYSAxIGFkZGVkIGp1c3QgZm9yIGZ1bgorCSAgIworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3N8bm9uZSkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX3JldmlzaW9uIgorCSAgICA7OworCSAgZnJlZWJzZC1hb3V0fGZyZWVic2QtZWxmfHFueHxzdW5vcykKKwkgICAgY3VycmVudD0iJG51bWJlcl9tYWpvciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGFnZT0iMCIKKwkgICAgOzsKKwkgIGlyaXh8bm9uc3RvcHV4KQorCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCisJICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIGx0X2lyaXhfaW5jcmVtZW50PW5vCisJICAgIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQxIgorCSAgcmV2aXNpb249IiQyIgorCSAgYWdlPSIkMyIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCisJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKKwkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgZWxzZQorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKKwkgIGZpCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICA7OworCisJb3NmKQorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JGFnZQorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGxvb3AKKwkgICAgaWZhY2U9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXJpdGggJGxvb3AgLSAxCisJICAgIGxvb3A9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICBmdW5jX2FwcGVuZCB2ZXJzdHJpbmcgIjoke2N1cnJlbnR9LjAiCisJICA7OworCisJcW54KQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IgorCSAgOzsKKworCXN1bm9zKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwl3aW5kb3dzKQorCSAgIyBVc2UgJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seSB3YW50IG9uZQorCSAgIyBleHRlbnNpb24gb24gRE9TIDguMyBmaWxlc3lzdGVtcy4KKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iLSRtYWpvciIKKwkgIDs7CisKKwkqKQorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJ1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciCisJICA7OworCWVzYWMKKworCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCisJaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgIG1ham9yPQorCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICBkYXJ3aW4pCisJICAgICMgd2UgY2FuJ3QgY2hlY2sgZm9yICIwLjAiIGluIGFyY2hpdmVfY21kcyBkdWUgdG8gcXVvdGluZworCSAgICAjIHByb2JsZW1zLCBzbyB3ZSByZXNldCBpdCBjb21wbGV0ZWx5CisJICAgIHZlcnN0cmluZz0KKwkgICAgOzsKKwkgICopCisJICAgIHZlcnN0cmluZz0iMC4wIgorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgICB2ZXJzdWZmaXg9CisJICBlbHNlCisJICAgIHZlcnN1ZmZpeD0iLjAuMCIKKwkgIGZpCisJZmkKKworCSMgUmVtb3ZlIHZlcnNpb24gaW5mbyBmcm9tIG5hbWUgaWYgdmVyc2lvbmluZyBzaG91bGQgYmUgYXZvaWRlZAorCWlmIHRlc3QgIiRhdm9pZF92ZXJzaW9uIiA9IHllcyAmJiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICBtYWpvcj0KKwkgIHZlcnN1ZmZpeD0KKwkgIHZlcnN0cmluZz0iIgorCWZpCisKKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCisJaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgInVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiCisJICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgIGZpCisJZWxzZQorCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCisJZmkKKworICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRsaWJuYW1lIiAiJGxpYm5hbWUiICJ5ZXMiCisgICAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHN5bWZpbGVvYmoiCisgICAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluazsgdGhlbgorCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5CisJIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCisJcmVtb3ZlbGlzdD0KKwl0ZW1wcmVtb3ZlbGlzdD1gJEVDSE8gIiRvdXRwdXRfb2JqZGlyLyoiYAorCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KKwkgIGNhc2UgJHAgaW4KKwkgICAgKi4kb2JqZXh0IHwgKi5nY25vKQorCSAgICAgICA7OworCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQorCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KKwkJIGlmICRFQ0hPICIkcCIgfCAkRUdSRVAgLWUgIiRwcmVjaW91c19maWxlc19yZWdleCIgPi9kZXYvbnVsbCAyPiYxCisJCSB0aGVuCisJCSAgIGNvbnRpbnVlCisJCSBmaQorCSAgICAgICBmaQorCSAgICAgICBmdW5jX2FwcGVuZCByZW1vdmVsaXN0ICIgJHAiCisJICAgICAgIDs7CisJICAgICopIDs7CisJICBlc2FjCisJZG9uZQorCXRlc3QgLW4gIiRyZW1vdmVsaXN0IiAmJiBcCisJICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yIFwkcmVtb3ZlbGlzdCIKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KKwlmdW5jX2FwcGVuZCBvbGRsaWJzICIgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRFQ0hPICIkbGlib2JqcyIgfCAkU1AyTkwgfCAkU0VEICIvXC4ke2xpYmV4dH0kL2Q7ICRsbzJvIiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCisgICAgICAjZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKyAgICAgICMJbGliX3NlYXJjaF9wYXRoPWAkRUNITyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJFNFRCAicyUgJHBhdGggJSAlZyJgCisgICAgICAjCWRlcGxpYnM9YCRFQ0hPICIkZGVwbGlicyAiIHwgJFNFRCAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICMJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiJGRlcGVuZGVuY3lfbGlicyAiIHwgJFNFRCAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICNkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCXRlbXBfeHJwYXRoPQorCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KKwkgIGZ1bmNfcmVwbGFjZV9zeXNyb290ICIkbGliZGlyIgorCSAgZnVuY19hcHBlbmQgdGVtcF94cnBhdGggIiAtUiRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQiCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAorICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgorICAgICAgZGxmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbworCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKKyAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKKyAgICAgIGRscHJlZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KKwljYXNlICIkZGxwcmVmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKiB8ICotKi1oYWlrdSopCisJICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZnVuY19hcHBlbmQgZGVwbGlicyAiIFN5c3RlbS5sdGZyYW1ld29yayIKKwkgICAgOzsKKwkgICotKi1uZXRic2QqKQorCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgOzsKKwkgICopCisJICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCisJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX25lZWRfbGMiID0gInllcyI7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgLWxjIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCWZpCisKKwkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCisJbmFtZV9zYXZlPSRuYW1lCisJbGlibmFtZV9zYXZlPSRsaWJuYW1lCisJcmVsZWFzZV9zYXZlPSRyZWxlYXNlCisJdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAorCW1ham9yX3NhdmU9JG1ham9yCisJIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKKwkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KKwkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KKwlyZWxlYXNlPSIiCisJdmVyc3VmZml4PSIiCisJbWFqb3I9IiIKKwluZXdkZXBsaWJzPQorCWRyb3BwZWRkZXBzPW5vCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwlwYXNzX2FsbCkKKwkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgorCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjaworCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgorCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0CisJICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KKwkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKKwkgIDs7CisJdGVzdF9jb21waWxlKQorCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKKwkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0CisJICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjaworCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCisJICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0LmMKKwkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKwkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQorRU9GCisJICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0CisJICBpZiAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGliczsgdGhlbgorCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJICAgIGZvciBpIGluICRkZXBsaWJzOyBkbworCSAgICAgIGNhc2UgJGkgaW4KKwkgICAgICAtbCopCisJCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKKwkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJICAqIiAkaSAiKikKKwkJICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICAgIGk9IiIKKwkJICAgIDs7CisJCSAgZXNhYworCQlmaQorCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAorCQkgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgZGVwbGliX21hdGNoPSQxCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgIGVsc2UKKwkJICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgZWNobworCQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICBlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSBpdCBmb3IiCisJCSAgICBlY2hvICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCisJCSAgZmkKKwkJZmkKKwkJOzsKKwkgICAgICAqKQorCQlmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBlbHNlCisJICAgICMgRXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZQorCSAgICAjIHRoZSBzaXR1YXRpb246IENvbXBpbGUgYSBzZXBhcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCisJICAgIGZvciBpIGluICRkZXBsaWJzOyBkbworCSAgICAgIGNhc2UgJGkgaW4KKwkgICAgICAtbCopCisJCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKKwkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJCSRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QKKwkJaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGk7IHRoZW4KKwkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQkgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgICAqIiAkaSAiKikKKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKKwkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgICBkZXBsaWJfbWF0Y2g9JDEKKwkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgICAgZWxzZQorCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKKwkJICAgICAgZWNobworCQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJICAgICAgZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgdGhpcyBvbmUiCisJCSAgICAgIGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICAgIGZpCisJCSAgZmkKKwkJZWxzZQorCQkgIGRyb3BwZWRkZXBzPXllcworCQkgIGVjaG8KKwkJICAkRUNITyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgIGVjaG8gIioqKiBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKKwkJICBlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgorCQkgIGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCisJCWZpCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkKKwkgIDs7CisJZmlsZV9tYWdpYyopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBjYXNlICRhX2RlcGxpYiBpbgorCSAgICAtbCopCisJICAgICAgZnVuY19zdHJpcG5hbWUgLWwgJycgIiRhX2RlcGxpYiIKKwkgICAgICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkqIiAkYV9kZXBsaWIgIiopCisJCSAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQlpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY19nbG9iIjsgdGhlbgorCQkgIGxpYm5hbWVnbG9iPWBmdW5jX2VjaG9fYWxsICIkbGlibmFtZSIgfCAkU0VEIC1lICRmaWxlX21hZ2ljX2dsb2JgCisJCWVsc2UKKwkJICBsaWJuYW1lZ2xvYj0kbGlibmFtZQorCQlmaQorCQl0ZXN0ICIkd2FudF9ub2Nhc2VnbG9iIiA9IHllcyAmJiBub2Nhc2VnbG9iPWBzaG9wdCAtcCBub2Nhc2VnbG9iYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBpZiB0ZXN0ICIkd2FudF9ub2Nhc2VnbG9iIiA9IHllczsgdGhlbgorCQkgICAgc2hvcHQgLXMgbm9jYXNlZ2xvYgorCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lZ2xvYlsuLV0qIDI+L2Rldi9udWxsYAorCQkgICAgJG5vY2FzZWdsb2IKKwkJICBlbHNlCisJCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVnbG9iWy4tXSogMj4vZGV2L251bGxgCisJCSAgZmkKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCisJCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCB8CisJCQkgJEdSRVAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KKwkJCWNvbnRpbnVlCisJCSAgICAgIGZpCisJCSAgICAgICMgVGhlIHN0YXRlbWVudCBhYm92ZSB0cmllcyB0byBhdm9pZCBlbnRlcmluZyBhbgorCQkgICAgICAjIGVuZGxlc3MgbG9vcCBiZWxvdywgaW4gY2FzZSBvZiBjeWNsaWMgbGlua3MuCisJCSAgICAgICMgV2UgbWlnaHQgc3RpbGwgZW50ZXIgYW4gZW5kbGVzcyBsb29wLCBzaW5jZSBhIGxpbmsKKwkJICAgICAgIyBsb29wIGNhbiBiZSBjbG9zZWQgd2hpbGUgd2UgZm9sbG93IGxpbmtzLAorCQkgICAgICAjIGJ1dCBzbyB3aGF0PworCQkgICAgICBwb3RsaWI9IiRwb3RlbnRfbGliIgorCQkgICAgICB3aGlsZSB0ZXN0IC1oICIkcG90bGliIiAyPi9kZXYvbnVsbDsgZG8KKwkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgJHtTRUR9ICdzLy4qIC0+IC8vJ2AKKwkJCWNhc2UgJHBvdGxpYmxpbmsgaW4KKwkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OworCQkJKikgcG90bGliPWAkRUNITyAiJHBvdGxpYiIgfCAkU0VEICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKKwkJCWVzYWMKKwkJICAgICAgZG9uZQorCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgfAorCQkJICRTRUQgLWUgMTBxIHwKKwkJCSAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJCWFfZGVwbGliPSIiCisJCQlicmVhayAyCisJCSAgICAgIGZpCisJCSAgZG9uZQorCQlkb25lCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlkcm9wcGVkZGVwcz15ZXMKKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgZmlsZSBtYWdpYyB0ZXN0KSIKKwkJZWxzZQorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRFQ0hPICIqKiogdXNpbmcgYSBmaWxlIG1hZ2ljLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW1hdGNoX3BhdHRlcm4qKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgY2FzZSAkYV9kZXBsaWIgaW4KKwkgICAgLWwqKQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCisJICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgcG90bGliPSIkcG90ZW50X2xpYiIgIyBzZWUgc3ltbGluay1jaGVjayBhYm92ZSBpbiBmaWxlX21hZ2ljIHRlc3QKKwkJICAgIGlmIGV2YWwgIlwkRUNITyBcIiRwb3RlbnRfbGliXCIiIDI+L2Rldi9udWxsIHwgJFNFRCAxMHEgfCBcCisJCSAgICAgICAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkgICAgICBhX2RlcGxpYj0iIgorCQkgICAgICBicmVhayAyCisJCSAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgorCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCWVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIHJlZ2V4IHBhdHRlcm4gdGVzdCkiCisJCWVsc2UKKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkRUNITyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwlub25lIHwgdW5rbm93biB8ICopCisJICBuZXdkZXBsaWJzPSIiCisJICB0bXBfZGVwbGlicz1gJEVDSE8gIiAkZGVwbGlicyIgfCAkU0VEICdzLyAtbGMkLy87IHMvIC1bTFJdW14gXSovL2cnYAorCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbworCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKKwkgICAgICB0bXBfZGVwbGlicz1gJEVDSE8gIiAkdG1wX2RlcGxpYnMiIHwgJFNFRCAicywkaSwsImAKKwkgICAgZG9uZQorCSAgZmkKKwkgIGNhc2UgJHRtcF9kZXBsaWJzIGluCisJICAqWyFcCVwgXSopCisJICAgIGVjaG8KKwkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgorCSAgICBlbHNlCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCisJICAgIGRyb3BwZWRkZXBzPXllcworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQorCW1ham9yPSRtYWpvcl9zYXZlCisJcmVsZWFzZT0kcmVsZWFzZV9zYXZlCisJbGlibmFtZT0kbGlibmFtZV9zYXZlCisJbmFtZT0kbmFtZV9zYXZlCisKKwljYXNlICRob3N0IGluCisJKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgd2l0aCB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgbmV3ZGVwbGlicz1gJEVDSE8gIiAkbmV3ZGVwbGlicyIgfCAkU0VEICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJICA7OworCWVzYWMKKworCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgIGVjaG8KKwkgICAgZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCisJICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKKwkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKKwkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgICBlbHNlCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGZpCisJICBlbHNlCisJICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCisJICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKKworCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCisJICAgICAgZWNobyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCisJICAgICAgZWNobyAiKioqIGl0IHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIC1uby11bmRlZmluZWQsIgorCSAgICAgIGVjaG8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKwlmaQorCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorCWRlcGxpYnM9JG5ld2RlcGxpYnMKKyAgICAgIGZpCisgICAgICAjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisgICAgICBjYXNlICRob3N0IGluCisJKi0qLWRhcndpbiopCisJICBuZXdkZXBsaWJzPWAkRUNITyAiICRuZXdkZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIGRlcGxpYnM9YCRFQ0hPICIgJGRlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGRlcGxpYnM9IiRuZXdfbGlicyIKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKKwkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRsaWJkaXIiCisJCWxpYmRpcj0kZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0CisJCWlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJCWVsc2UKKwkJICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJCSAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkJICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCSAgICA7OworCQkgICopCisJCSAgICBmdW5jX2FwcGVuZCBoYXJkY29kZV9saWJkaXJzICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZnVuY19hcHBlbmQgZGVwX3JwYXRoICIgJGZsYWciCisJICAgICAgZmkKKwkgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBkb25lCisJICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJICAgICB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwkgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQiOyB0aGVuCisJICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZFwiCisJICAgIGVsc2UKKwkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZmkKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgICBycGF0aD0KKwkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICAgIGRvbmUKKwkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCisJICBmaQorCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKKwlmaQorCisJc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgorCXRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXNoaWZ0CisJcmVhbG5hbWU9IiQxIgorCXNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGZ1bmNfYXBwZW5kIGxpbmtuYW1lcyAiICRsaW5rIgorCWRvbmUKKworCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCisJdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKwlkZWxmaWxlcz0KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKKwkgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzIgorCWZpCisKKwlvcmlnX2V4cG9ydF9zeW1ib2xzPQorCWNhc2UgJGhvc3Rfb3MgaW4KKwljeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICMgZXhwb3J0aW5nIHVzaW5nIHVzZXIgc3VwcGxpZWQgc3ltZmlsZQorCSAgICBpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgIT0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAjIGFuZCBpdCdzIE5PVCBhbHJlYWR5IGEgLmRlZiBmaWxlLiBNdXN0IGZpZ3VyZSBvdXQKKwkgICAgICAjIHdoaWNoIG9mIHRoZSBnaXZlbiBzeW1ib2xzIGFyZSBkYXRhIHN5bWJvbHMgYW5kIHRhZworCSAgICAgICMgdGhlbSBhcyBzdWNoLiBTbywgdHJpZ2dlciB1c2Ugb2YgZXhwb3J0X3N5bWJvbHNfY21kcy4KKwkgICAgICAjIGV4cG9ydF9zeW1ib2xzIGdldHMgcmVhc3NpZ25lZCBpbnNpZGUgdGhlICJwcmVwYXJlCisJICAgICAgIyB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzIiBpZiBzdGF0ZW1lbnQsIHNvIHRoZQorCSAgICAgICMgaW5jbHVkZV9leHBzeW1zIGxvZ2ljIHN0aWxsIHdvcmtzLgorCSAgICAgIG9yaWdfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0KKwkgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJICAgIGZpCisJICBmaQorCSAgOzsKKwllc2FjCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZDEgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgIyBUYWtlIHRoZSBub3JtYWwgYnJhbmNoIGlmIHRoZSBubV9maWxlX2xpc3Rfc3BlYyBicmFuY2gKKwkgICAgICAjIGRvZXNuJ3Qgd29yayBvciBpZiB0b29sIGNvbnZlcnNpb24gaXMgbm90IG5lZWRlZC4KKwkgICAgICBjYXNlICRubV9maWxlX2xpc3Rfc3BlY34kdG9fdG9vbF9maWxlX2NtZCBpbgorCQkqfmZ1bmNfY29udmVydF9maWxlX25vb3AgfCAqfmZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIHwgfiopCisJCSAgdHJ5X25vcm1hbF9icmFuY2g9eWVzCisJCSAgZXZhbCBjbWQ9XCIkY21kMVwiCisJCSAgZnVuY19sZW4gIiAkY21kIgorCQkgIGxlbj0kZnVuY19sZW5fcmVzdWx0CisJCSAgOzsKKwkJKikKKwkJICB0cnlfbm9ybWFsX2JyYW5jaD1ubworCQkgIDs7CisJICAgICAgZXNhYworCSAgICAgIGlmIHRlc3QgIiR0cnlfbm9ybWFsX2JyYW5jaCIgPSB5ZXMgXAorCQkgJiYgeyB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgXAorCQkgICAgICB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgfQorCSAgICAgIHRoZW4KKwkJZnVuY19zaG93X2V2YWwgIiRjbWQiICdleGl0ICQ/JworCQlza2lwcGVkX2V4cG9ydD1mYWxzZQorCSAgICAgIGVsaWYgdGVzdCAtbiAiJG5tX2ZpbGVfbGlzdF9zcGVjIjsgdGhlbgorCQlmdW5jX2Jhc2VuYW1lICIkb3V0cHV0IgorCQlvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisJCXNhdmVfbGlib2Jqcz0kbGlib2JqcworCQlzYXZlX291dHB1dD0kb3V0cHV0CisJCW91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5ubQorCQlmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkJbGlib2Jqcz0kbm1fZmlsZV9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJCWZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkJZnVuY192ZXJib3NlICJjcmVhdGluZyAkTk0gaW5wdXQgZmlsZSBsaXN0OiAkb3V0cHV0IgorCQlmb3Igb2JqIGluICRzYXZlX2xpYm9ianM7IGRvCisJCSAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJCSAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJCWRvbmUgPiAiJG91dHB1dCIKKwkJZXZhbCBjbWQ9XCIkY21kMVwiCisJCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKKwkJb3V0cHV0PSRzYXZlX291dHB1dAorCQlsaWJvYmpzPSRzYXZlX2xpYm9ianMKKwkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKKwkgICAgICBlbHNlCisJCSMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgorCQlmdW5jX3ZlcmJvc2UgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgorCQlza2lwcGVkX2V4cG9ydD06CisJCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCisJCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgorCQlicmVhaworCSAgICAgIGZpCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IjsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICckRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiR0bXBfZXhwb3J0X3N5bWJvbHMiJworCWZpCisKKwlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICMgRklYTUU6ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciBwb3RlbnRpYWxseSBjb250YWlucyBsb3RzIG9mCisJICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQorCSAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgorCSAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCWZpCisKKwl0bXBfZGVwbGlicz0KKwlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICBjYXNlICIgJGNvbnZlbmllbmNlICIgaW4KKwkgICoiICR0ZXN0X2RlcGxpYiAiKikgOzsKKwkgICopCisJICAgIGZ1bmNfYXBwZW5kIHRtcF9kZXBsaWJzICIgJHRlc3RfZGVwbGliIgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisKKwlpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiICYmCisJICAgIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzICYmCisJICAgIHRlc3QgLXogIiRsaWJvYmpzIjsgdGhlbgorCSAgICAjIGV4dHJhY3QgdGhlIGFyY2hpdmVzLCBzbyB3ZSBoYXZlIG9iamVjdHMgdG8gbGlzdC4KKwkgICAgIyBUT0RPOiBjb3VsZCBvcHRpbWl6ZSB0aGlzIHRvIGp1c3QgZXh0cmFjdCBvbmUgYXJjaGl2ZS4KKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBlbHNlCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZsYWciCisJZmkKKworCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZworCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VSAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KKwlmaQorCisJIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICBmaQorCWVsc2UKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICBlbHNlCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfY21kc1wiCisJICAgIGNtZHM9JGFyY2hpdmVfY21kcworCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgorCSAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIgJiYKKwkgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdCAmJgorCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZQorCSAgIyBvciwgaWYgdXNpbmcgR05VIGxkIGFuZCBza2lwcGVkX2V4cG9ydCBpcyBub3QgOiwgdXNlIGEgbGlua2VyCisJICAjIHNjcmlwdC4KKworCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KKwkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQorCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQorCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKKwkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCisJICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55CisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCisJICAjIHRoZSBzcGVjLgorCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcworCSAgZmkKKwkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKKwkgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisJICBvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisKKwkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCisJICAjIGluaXRpYWxpemUgayB0byBvbmUuCisJICB0ZXN0X2NtZHM9CisJICBjb25jYXRfY21kcz0KKwkgIG9iamxpc3Q9CisJICBsYXN0X3JvYmo9CisJICBrPTEKKworCSAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgIG91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5sbmtzY3JpcHQKKwkgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBHTlUgbGQgc2NyaXB0OiAkb3V0cHV0IgorCSAgICBlY2hvICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgIGRvCisJICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICBlY2hvICcpJyA+PiAkb3V0cHV0CisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJICBlbGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiWCRmaWxlX2xpc3Rfc3BlYyIgIT0gWDsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rCisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgbGlua2VyIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkgICAgOiA+ICRvdXRwdXQKKwkgICAgc2V0IHggJHNhdmVfbGlib2JqcworCSAgICBzaGlmdAorCSAgICBmaXJzdG9iaj0KKwkgICAgaWYgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgICBmaXJzdG9iaj0iJDEgIgorCSAgICAgIHNoaWZ0CisJICAgIGZpCisJICAgIGZvciBvYmoKKwkgICAgZG8KKwkgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgPj4gJG91dHB1dAorCSAgICBkb25lCisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZmlyc3RvYmpcIiRmaWxlX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIgorCSAgZWxzZQorCSAgICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIjsgdGhlbgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCisJICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJICAgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgorCSAgICAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgICAgICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKKwkgICAgICBsZW49JGxlbjAKKworCSAgICAgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgorCSAgICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcworCSAgICAgIGRvCisJCWZ1bmNfbGVuICIgJG9iaiIKKwkJZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQlsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJCWlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8CisJCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgorCQkgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCQllbHNlCisJCSAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKKwkJICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgorCQkgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KKwkJICAgICMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCisJCSAgICByZWxvYWRfb2Jqcz0kb2JqbGlzdAorCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kc1wiCisJCSAgZWxzZQorCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCSAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kc35cJFJNICRsYXN0X3JvYmpcIgorCQkgIGZpCisJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJCSAgZnVuY19hcml0aCAkayArIDEKKwkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIG9iamxpc3Q9IiAkb2JqIgorCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKKwkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzXCIKKwkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgorCSAgICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfX5cJFJNICRsYXN0X3JvYmpcIgorCSAgICAgIGZpCisJICAgICAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkb3V0cHV0IgorCisJICAgIGVsc2UKKwkgICAgICBvdXRwdXQ9CisJICAgIGZpCisKKwkgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBsaWJvYmpzPSRvdXRwdXQKKwkgICAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgorCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCisJCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzflwkUk0gJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKKworCSAgICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCisJICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkb3B0X3NpbGVudCB8fCB7CisJCSAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKwkgICAgICB9CisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkJbHRfZXhpdD0kPworCisJCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCQlpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJCSAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKKwkJICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCisJCSAgICAkTVYgIiR7cmVhbG5hbWV9VSIgIiRyZWFsbmFtZSIgKQorCQlmaQorCisJCWV4aXQgJGx0X2V4aXQKKwkgICAgICB9CisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKworICAgICAgICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICAjIFRoZSBnaXZlbiBleHBvcnRzX3N5bWJvbHMgZmlsZSBoYXMgdG8gYmUgZmlsdGVyZWQsIHNvIGZpbHRlciBpdC4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICAgICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgICAgICMgJ3MnIGNvbW1hbmRzIHdoaWNoIG5vdCBhbGwgc2VkcyBjYW4gaGFuZGxlLiBHTlUgc2VkIHNob3VsZCBiZSBmaW5lCisJICAgICAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAgICAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICAgICAjIGlzbid0IGEgYmxlc3NlZCB0b29sLgorCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgICAgICBleHBvcnRfc3ltYm9scz0kb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCSAgICBmaQorCSAgZmkKKworCSAgbGlib2Jqcz0kb3V0cHV0CisJICAjIFJlc3RvcmUgdGhlIHZhbHVlIG9mIG91dHB1dC4KKwkgIG91dHB1dD0kc2F2ZV9vdXRwdXQKKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIiAmJiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZmkKKwkgICMgRXhwYW5kIHRoZSBsaWJyYXJ5IGxpbmtpbmcgY29tbWFuZHMgYWdhaW4gdG8gcmVzZXQgdGhlCisJICAjIHZhbHVlIG9mICRsaWJvYmpzIGZvciBwaWVjZXdpc2UgbGlua2luZy4KKworCSAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kbW9kdWxlX2NtZHMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICAgIGVsc2UKKwkgICAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRkZWxmaWxlcyI7IHRoZW4KKwkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgdG8gJGNtZHMuCisJICBldmFsIGNtZHM9XCJcJGNtZHN+XCRSTSAkZGVsZmlsZXNcIgorCWZpCisKKwkjIEFkZCBhbnkgb2JqZWN0cyBmcm9tIHByZWxvYWRlZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwlpZiB0ZXN0IC1uICIkZGxwcmVmaWxlcyI7IHRoZW4KKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcworCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCSAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwlmaQorCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCSAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisJICB9CisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgeworCSAgICBsdF9leGl0PSQ/CisKKwkgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAorCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKKwkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1UICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRNViAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPworCisJICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwkgICAgZmkKKwkgIGZpCisKKwkgIGV4aXQgJEVYSVRfU1VDQ0VTUworCWZpCisKKwkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgorCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbworCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgorCSAgICBmdW5jX3Nob3dfZXZhbCAnKGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkbGlua25hbWUiICYmICRMTl9TICIkcmVhbG5hbWUiICIkbGlua25hbWUiKScgJ2V4aXQgJD8nCisJICBmaQorCWRvbmUKKworCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCisJaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgorCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisJICBkbG5hbWU9IiRzb25hbWUiCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb2JqKQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KKyAgICAgICpcIC1sKiB8ICpcIC1MKikKKwlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAgICoubG8pCisJdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiICYmIFwKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIKKworCWxpYm9iaj0kb3V0cHV0CisJZnVuY19sbzJvICIkbGlib2JqIgorCW9iaj0kZnVuY19sbzJvX3Jlc3VsdAorCTs7CisgICAgICAqKQorCWxpYm9iaj0KKwlvYmo9IiRvdXRwdXQiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb2JqICRsaWJvYmoKKworICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCisgICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQorICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKKyAgICAgICMgdGhlIGV4dHJhY3Rpb24uCisgICAgICByZWxvYWRfY29udl9vYmpzPQorICAgICAgZ2VudG9wPQorICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKKyAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgYW5kIGhvcGUgd2UgY2FuIGdldCBieSB3aXRoCisgICAgICAjIHR1cm5pbmcgY29tbWEgaW50byBzcGFjZS4uCisgICAgICB3bD0KKworICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3M9XCIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgcmVsb2FkX2NvbnZfb2Jqcz0kcmVsb2FkX29ianNcIGAkRUNITyAiJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRTRUQgJ3N8LHwgfGcnYAorCWVsc2UKKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCWZpCisgICAgICBmaQorCisgICAgICAjIElmIHdlJ3JlIG5vdCBidWlsZGluZyBzaGFyZWQsIHdlIG5lZWQgdG8gdXNlIG5vbl9waWNfb2JqcworICAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIGxpYm9ianM9IiRub25fcGljX29iamVjdHMiCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIi9cLiR7bGliZXh0fSQvZDsgL1wubGliJC9kOyAkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRvcHRfZHJ5X3J1biB8fCBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICAgb3V0cHV0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuZXhlOzsKKyAgICAgIGVzYWMKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgorCisgICAgICB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgXAorICAgICAgICAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biBcCisJJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93biAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgTFRfSU5JVChbZGxvcGVuXSknIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIiAkY29tcGlsZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwk7OworICAgICAgZXNhYworCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotZGFyd2luKikKKwkjIERvbid0IGFsbG93IGxhenkgbGlua2luZywgaXQgYnJlYWtzIEMrKyBnbG9iYWwgY29uc3RydWN0b3JzCisJIyBCdXQgaXMgc3VwcG9zZWRseSBmaXhlZCBvbiAxMC40IG9yIGxhdGVyICh5YXkhKS4KKwlpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCisJICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9IGluCisJICAgIDEwLlswMTIzXSkKKwkgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR7d2x9LWJpbmRfYXRfbG9hZCIKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCSMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKKwljb21waWxlX2RlcGxpYnM9YCRFQ0hPICIgJGNvbXBpbGVfZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICIgJGZpbmFsaXplX2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwk7OworICAgICAgZXNhYworCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkY29tcGlsZV9kZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGNvbXBpbGVfZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBjb21waWxlX2RlcGxpYnM9IiRuZXdfbGlicyIKKworCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRmaW5hbGl6ZV9kZXBsaWJzIgorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKKyAgICAgIHJwYXRoPQorICAgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbworCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgaGFyZGNvZGVfbGliZGlycyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JGxpYmRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGZpCisgICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRvdXRwdXRuYW1lIiAiQFBST0dSQU1AIiAibm8iCisKKyAgICAgICMgdGVtcGxhdGUgcHJlbGlua2luZyBzdGVwCisgICAgICBpZiB0ZXN0IC1uICIkcHJlbGlua19jbWRzIjsgdGhlbgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcHJlbGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPXllcworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmNlZ2NjKiB8ICptaW5ndzMyY2UqKQorICAgICAgICAjIERpc2FibGUgd3JhcHBlcnMgZm9yIGNlZ2NjIGFuZCBtaW5ndzMyY2UgaG9zdHMsIHdlIGFyZSBjcm9zcyBjb21waWxpbmcgYW55d2F5LgorICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICA7OworICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGlmIHRlc3QgIiRuZWVkX3JlbGluayIgPSBubyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAiJHdyYXBwZXJzX3JlcXVpcmVkIiA9IG5vOyB0aGVuCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCWV4aXRfc3RhdHVzPTAKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JworCisJaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkgIHBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZycgLWUgJ3MlQFRPT0xfT1VUUFVUQCUnIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiJyVnJ2AKKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGxpbmtfY21kcyIgJ2V4aXQgJD8nCisJZmkKKworCSMgRGVsZXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IjsgdGhlbgorCSAgZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IicKKwlmaQorCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGNvbXBpbGVfdmFyPQorICAgICAgZmluYWxpemVfdmFyPQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgZG9uZQorCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbworCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICBkb25lCisJICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwkjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgorCSRvcHRfZHJ5X3J1biB8fCAkUk0gJG91dHB1dAorCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAorCWZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworCWlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICBwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RsaW5rX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisJIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKworCWZ1bmNfd2FybmluZyAidGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiCisJZnVuY193YXJuaW5nICJcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgorCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRTRUQgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworICAgICAgaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIgorCXBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisJZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbHNlCisJICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGZpCisJZG9uZQorCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCisJcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgorCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgorCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCisJICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisJICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKwkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKwkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQorCisJICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCisJICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQorCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCisJICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKKwkgICAgfQorCisJICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6CisJICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCisJICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCisJICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KKwkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgICBlbHNlCisJCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZmkKKwkgICAgfQorCSAgOzsKKwkgICogKQorCSAgICAkUk0gJG91dHB1dAorCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKKwkgICAgY2htb2QgK3ggJG91dHB1dAorCSAgOzsKKwllc2FjCisgICAgICB9CisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkc3ltZmlsZW9iaiIKKwkgIGZpCisJZmkKKwlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCisJZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwlmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKyAgICAgIGVsc2UKKworCSMgQWRkIGFueSBvYmplY3RzIGZyb20gcHJlbG9hZGVkIGNvbnZlbmllbmNlIGxpYnJhcmllcworCWlmIHRlc3QgLW4gIiRkbHByZWZpbGVzIjsgdGhlbgorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZmkKKworCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQorCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCisJIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKKwkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZworCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5CisJIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgorCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCisJICAgIGRvCisJICAgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBkb25lIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKwkgIDoKKwllbHNlCisJICBlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKwkgIGZ1bmNfbWtkaXJfcCAiJGdlbnRvcCIKKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgIGNvdW50ZXI9MQorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgorCSAgICBvYmpiYXNlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCisJICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7CisJICAgICpbXCAvXSIkb2JqYmFzZSAiKikKKwkgICAgICB3aGlsZSA6OyBkbworCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbworCQkjIG92ZXJsYXBzLgorCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQorCQlmdW5jX2FyaXRoICRjb3VudGVyICsgMQorCQljb3VudGVyPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQljYXNlICIgJG9sZG9ianMgIiBpbgorCQkqW1wgL10iJG5ld29iaiAiKikgOzsKKwkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OworCQllc2FjCisJICAgICAgZG9uZQorCSAgICAgIGZ1bmNfc2hvd19ldmFsICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKKwkgICAgICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkb2JqIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisKKwlmdW5jX2xlbiAiICRjbWRzIgorCWxlbj0kZnVuY19sZW5fcmVzdWx0CisJaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCisJICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCisJZWxpZiB0ZXN0IC1uICIkYXJjaGl2ZXJfbGlzdF9zcGVjIjsgdGhlbgorCSAgZnVuY192ZXJib3NlICJ1c2luZyBjb21tYW5kIGZpbGUgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgZm9yIG9iaiBpbiAkb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICRFQ0hPICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IgorCSAgZG9uZSA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmxpYmNtZAorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmxpYmNtZCIKKwkgIG9sZG9ianM9IiAkYXJjaGl2ZXJfbGlzdF9zcGVjJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIKKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbHNlCisJICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cworCSAgZnVuY192ZXJib3NlICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgorCSAgUkFOTElCPToKKwkgIG9iamxpc3Q9CisJICBjb25jYXRfY21kcz0KKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PworCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBsYXN0X29sZG9iaj0kb2JqCisJICBkb25lCisJICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgbGVuPSRsZW4wCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfbGVuICIgJG9iaiIKKwkgICAgZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCSAgICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCSAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCisJICAgICAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCisJCVJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgICAgICBmaQorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCisJICAgICAgb2JqbGlzdD0KKwkgICAgICBsZW49JGxlbjAKKwkgICAgZmkKKwkgIGRvbmUKKwkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgIG9sZG9ianM9JG9iamxpc3QKKwkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgorCSAgZWxzZQorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmaQorCWZpCisgICAgICBmaQorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRjbWRzIiAnZXhpdCAkPycKKyAgICBkb25lCisKKyAgICB0ZXN0IC1uICIkZ2VuZXJhdGVkIiAmJiBcCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yJGdlbmVyYXRlZCIKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKyAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwllbHNlCisJICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWZpCisgICAgICBkb25lCisgICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgorICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllcyA7IHRoZW4KKwlyZWxpbmtfY29tbWFuZD0KKyAgICAgIGZpCisKKyAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgorICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KKwkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KKwkgICAgICBicmVhaworCSAgICBmaQorCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKKwkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAqLmxhKQorCQlmdW5jX2Jhc2VuYW1lICIkZGVwbGliIgorCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgLUwqKQorCQlmdW5jX3N0cmlwbmFtZSAtTCAnJyAiJGRlcGxpYiIKKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiIC1MJGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdCIKKwkJOzsKKwkgICAgICAtUiopCisJCWZ1bmNfc3RyaXBuYW1lIC1SICcnICIkZGVwbGliIgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgLVIkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgbmV3ZGxmaWxlcz0KKworCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJICAgICAgICBmdW5jX2Jhc2VuYW1lICIkbGliIgorCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICR7bHRfc3lzcm9vdDorPX0kbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkgICAgICAqLmxhKQorCQkjIE9ubHkgcGFzcyBwcmVvcGVuZWQgZmlsZXMgdG8gdGhlIHBzZXVkby1hcmNoaXZlIChmb3IKKwkJIyBldmVudHVhbCBsaW5raW5nIHdpdGggdGhlIGFwcC4gdGhhdCBsaW5rcyBpdCkgaWYgd2UKKwkJIyBkaWRuJ3QgYWxyZWFkeSBsaW5rIHRoZSBwcmVvcGVuZWQgb2JqZWN0cyBkaXJlY3RseSBpbnRvCisJCSMgdGhlIGxpYnJhcnk6CisJCWZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CisJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRhYnMiCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBmaQorCSAgJFJNICRvdXRwdXQKKwkgICMgcGxhY2UgZGxuYW1lIGluIGNvcnJlY3QgcG9zaXRpb24gZm9yIGN5Z3dpbgorCSAgIyBJbiBmYWN0LCBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSB0aGlzIGNvZGUgZm9yIGFsbCB0YXJnZXQKKwkgICMgc3lzdGVtcyB0aGF0IGNhbid0IGhhcmQtY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gdGhlaXIgZXhlY3V0YWJsZXMKKwkgICMgYW5kIHRoYXQgaGF2ZSBubyBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlIGluZGVwZW5kZW50IG9mIFBBVEgsCisJICAjIGJ1dCBpdCB0dXJucyBvdXQgd2UgY2FuJ3QgZWFzaWx5IGRldGVybWluZSB0aGF0IGZyb20gaW5zcGVjdGluZworCSAgIyBsaWJ0b29sIHZhcmlhYmxlcywgc28gd2UgaGF2ZSB0byBoYXJkLWNvZGUgdGhlIE9TcyB0byB3aGljaCBpdAorCSAgIyBhcHBsaWVzIGhlcmU7IGF0IHRoZSBtb21lbnQsIHRoYXQgbWVhbnMgcGxhdGZvcm1zIHRoYXQgdXNlIHRoZSBQRQorCSAgIyBvYmplY3QgZm9ybWF0IHdpdGggRExMIGZpbGVzLiAgU2VlIHRoZSBsb25nIGNvbW1lbnQgYXQgdGhlIHRvcCBvZgorCSAgIyB0ZXN0cy9iaW5kaXIuYXQgZm9yIGZ1bGwgZGV0YWlscy4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCB8ICpjZWdjYyosKmxhaSx5ZXMsbm8sKi5kbGwpCisJICAgICAgIyBJZiBhIC1iaW5kaXIgYXJndW1lbnQgd2FzIHN1cHBsaWVkLCBwbGFjZSB0aGUgZGxsIHRoZXJlLgorCSAgICAgIGlmIHRlc3QgIngkYmluZGlyIiAhPSB4IDsKKwkgICAgICB0aGVuCisJCWZ1bmNfcmVsYXRpdmVfcGF0aCAiJGluc3RhbGxfbGliZGlyIiAiJGJpbmRpciIKKwkJdGRsbmFtZT0kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCRkbG5hbWUKKwkgICAgICBlbHNlCisJCSMgT3RoZXJ3aXNlIGZhbGwgYmFjayBvbiBoZXVyaXN0aWMuCisJCXRkbG5hbWU9Li4vYmluLyRkbG5hbWUKKwkgICAgICBmaQorCSAgICAgIDs7CisJICBlc2FjCisJICAkRUNITyA+ICRvdXRwdXQgIlwKKyMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckdGRsbmFtZScKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JworCisjIExpbmtlciBmbGFncyB0aGF0IGNhbiBub3QgZ28gaW4gZGVwZW5kZW5jeV9saWJzLgoraW5oZXJpdGVkX2xpbmtlcl9mbGFncz0nJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKKworIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQord2Vha19saWJyYXJ5X25hbWVzPSckd2Vha19saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD0kaW5zdGFsbGVkCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPSRtb2R1bGUKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JyRkbGZpbGVzJworZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0geWVzOyB0aGVuCisJICAgICRFQ0hPID4+ICRvdXRwdXQgIlwKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCisJICBmaQorCWRvbmUKKyAgICAgIH0KKworICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgorICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KKyAgICAgIGZ1bmNfc2hvd19ldmFsICcoIGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkb3V0cHV0bmFtZSIgJiYgJExOX1MgIi4uLyRvdXRwdXRuYW1lIiAiJG91dHB1dG5hbWUiICknICdleGl0ICQ/JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKK3sgdGVzdCAiJG9wdF9tb2RlIiA9IGxpbmsgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgfSAmJgorICAgIGZ1bmNfbW9kZV9saW5rICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX3VuaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV91bmluc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgUk09IiRub25vcHQiCisgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZikgZnVuY19hcHBlbmQgUk0gIiAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKKyAgICAgIC0qKSBmdW5jX2FwcGVuZCBSTSAiICRhcmciIDs7CisgICAgICAqKSBmdW5jX2FwcGVuZCBmaWxlcyAiICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJFJNIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIKKworICAgIHJtZGlycz0KKworICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgIGZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorICAgICAgZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICAgIGlmIHRlc3QgIlgkZGlyIiA9IFguOyB0aGVuCisJb2Rpcj0iJG9iamRpciIKKyAgICAgIGVsc2UKKwlvZGlyPSIkZGlyLyRvYmpkaXIiCisgICAgICBmaQorICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisgICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsICYmIG9kaXI9IiRkaXIiCisKKyAgICAgICMgUmVtZW1iZXIgb2RpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2RpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHJtZGlycyAiICRvZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiB7IHRlc3QgLUwgIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgeyB0ZXN0IC1oICIkZmlsZSI7IH0gPi9kZXYvbnVsbCAyPiYxIHx8CisJIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCToKKyAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisJZXhpdF9zdGF0dXM9MQorCWNvbnRpbnVlCisgICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAkbmFtZSBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG4iCisJICBkb25lCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kb2xkX2xpYnJhcnkiCisKKwkgIGNhc2UgIiRvcHRfbW9kZSIgaW4KKwkgIGNsZWFuKQorCSAgICBjYXNlICIgJGxpYnJhcnlfbmFtZXMgIiBpbgorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSB0ZXN0IC1uICIkZGxuYW1lIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJGRsbmFtZSIgOzsKKwkgICAgZXNhYworCSAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfWkiCisJICAgIDs7CisJICB1bmluc3RhbGwpCisJICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKKwkgICAgZmkKKwkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCisJICAgIDs7CisJICBlc2FjCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgorCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqKQorCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbiA7IHRoZW4KKwkgIG5vZXhlbmFtZT0kbmFtZQorCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRuYW1lIgorCSAgICBub2V4ZW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCisJICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQorCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmIGZ1bmNfbHR3cmFwcGVyX3AgIiRmaWxlIjsgdGhlbgorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAgIGVsc2UKKwkgICAgICByZWxpbmtfY29tbWFuZD0KKwkgICAgICBmdW5jX3NvdXJjZSAkZGlyLyRub2V4ZW5hbWUKKwkgICAgZmkKKworCSAgICAjIG5vdGUgJG5hbWUgc3RpbGwgY29udGFpbnMgLmV4ZSBpZiBpdCB3YXMgaW4gJGZpbGUgb3JpZ2luYWxseQorCSAgICAjIGFzIGRvZXMgdGhlIHZlcnNpb24gb2YgJGZpbGUgdGhhdCB3YXMgYWRkZWQgaW50byAkcm1maWxlcworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfVMuJHtvYmpleHR9IgorCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllcyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSR7bm9leGVuYW1lfS5jIgorCSAgICBmaQorCSAgZmkKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJFJNICRybWZpbGVzIiAnZXhpdF9zdGF0dXM9MScKKyAgICBkb25lCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICJybWRpciAkZGlyID4vZGV2L251bGwgMj4mMSIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKK30KKworeyB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbjsgfSAmJgorICAgIGZ1bmNfbW9kZV91bmluc3RhbGwgJHsxKyIkQCJ9CisKK3Rlc3QgLXogIiRvcHRfbW9kZSIgJiYgeworICBoZWxwPSIkZ2VuZXJpY19oZWxwIgorICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgorfQorCit0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKKyAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG9wdF9tb2RlJyIKKworaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgorICBldmFsIGV4ZWMgIiRleGVjX2NtZCIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCitleGl0ICRleGl0X3N0YXR1cworCisKKyMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCisjIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZworIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKKyMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCisjIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAorIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAorIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCisjIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCisjIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5CisjIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAorYnVpbGRfbGlidG9vbF9saWJzPW5vCitidWlsZF9vbGRfbGlicz15ZXMKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKK2J1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSBlY2hvIG5vOzsgKikgZWNobyB5ZXM7OyBlc2FjYAorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgorIyB2aTpzdz0yCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL200L2FzLWFjLWV4cGFuZC5tNCBiL2RidXMtMS40LjEwL200L2FzLWFjLWV4cGFuZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWViZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvYXMtYWMtZXhwYW5kLm00CkBAIC0wLDAgKzEsNDkgQEAKK2RubCBhcy1hYy1leHBhbmQubTQgMC4yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBhdXRvY29uZiAtKi0KK2RubCBhdXRvc3RhcnMgbTQgbWFjcm8gZm9yIGV4cGFuZGluZyBkaXJlY3RvcmllcyB1c2luZyBjb25maWd1cmUncyBwcmVmaXgKKworZG5sIChDKSAyMDAzLCAyMDA0LCAyMDA1IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCitkbmwgQVNfQUNfRVhQQU5EKFZBUiwgQ09ORklHVVJFX1ZBUikKKworZG5sIGV4YW1wbGU6CitkbmwgQVNfQUNfRVhQQU5EKFNZU0NPTkZESVIsICRzeXNjb25mZGlyKQorZG5sIHdpbGwgc2V0IFNZU0NPTkZESVIgdG8gL3Vzci9sb2NhbC9ldGMgaWYgcHJlZml4PS91c3IvbG9jYWwKKworQUNfREVGVU4oW0FTX0FDX0VYUEFORF0sCitbCisgIEVYUF9WQVI9WyQxXQorICBGUk9NX1ZBUj1bJDJdCisKKyAgZG5sIGZpcnN0IGV4cGFuZCBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGlmIG5lY2Vzc2FyeQorICBwcmVmaXhfc2F2ZT0kcHJlZml4CisgIGV4ZWNfcHJlZml4X3NhdmU9JGV4ZWNfcHJlZml4CisKKyAgZG5sIGlmIG5vIHByZWZpeCBnaXZlbiwgdGhlbiB1c2UgL3Vzci9sb2NhbCwgdGhlIGRlZmF1bHQgcHJlZml4CisgIGlmIHRlc3QgIngkcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KKyAgICBwcmVmaXg9IiRhY19kZWZhdWx0X3ByZWZpeCIKKyAgZmkKKyAgZG5sIGlmIG5vIGV4ZWNfcHJlZml4IGdpdmVuLCB0aGVuIHVzZSBwcmVmaXgKKyAgaWYgdGVzdCAieCRleGVjX3ByZWZpeCIgPSAieE5PTkUiOyB0aGVuCisgICAgZXhlY19wcmVmaXg9JHByZWZpeAorICBmaQorCisgIGZ1bGxfdmFyPSIkRlJPTV9WQVIiCisgIGRubCBsb29wIHVudGlsIGl0IGRvZXNuJ3QgY2hhbmdlIGFueW1vcmUKKyAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBuZXdfZnVsbF92YXI9ImBldmFsIGVjaG8gJGZ1bGxfdmFyYCIKKyAgICBpZiB0ZXN0ICJ4JG5ld19mdWxsX3ZhciIgPSAieCRmdWxsX3ZhciI7IHRoZW4gYnJlYWs7IGZpCisgICAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBkb25lCisKKyAgZG5sIGNsZWFuIHVwCisgIGZ1bGxfdmFyPSRuZXdfZnVsbF92YXIKKyAgQUNfU1VCU1QoWyQxXSwgIiRmdWxsX3ZhciIpCisKKyAgZG5sIHJlc3RvcmUgcHJlZml4IGFuZCBleGVjX3ByZWZpeAorICBwcmVmaXg9JHByZWZpeF9zYXZlCisgIGV4ZWNfcHJlZml4PSRleGVjX3ByZWZpeF9zYXZlCitdKQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvbTQvY29tcGlsZXIubTQgYi9kYnVzLTEuNC4xMC9tNC9jb21waWxlci5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZmNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvY29tcGlsZXIubTQKQEAgLTAsMCArMSw2NyBAQAorIyBjb21waWxlci5tNCAtIGF1dG9jb25mIG1hY3JvcyBmb3IgY29tcGlsZXIgc2V0dGluZ3MKKyMKKyMgQ29weXJpZ2h0IMKpIDIwMDUgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisjIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisjIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisjIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjIAorIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMgCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SCisjIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCisjIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorIyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworCisjIENPTVBJTEVSX1dBUk5JTkdTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFkZGl0aW9uYWwgY29tcGlsZXIgd2FybmluZ3MgYW5kIHRyZWF0CisjIHRoZW0gYXMgZXJyb3JzLgorQUNfREVGVU4oW0NPTVBJTEVSX1dBUk5JTkdTXSwKK1tBQ19BUkdfRU5BQkxFKGNvbXBpbGVyLXdhcm5pbmdzLAorCUFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jb21waWxlci13YXJuaW5nc10sCisJICAgICAgICAgICAgICAgW0VuYWJsZSBhZGRpdGlvbmFsIGNvbXBpbGVyIHdhcm5pbmdzXSksCitbaWYgdGVzdCAieCRlbmFibGVfY29tcGlsZXJfd2FybmluZ3MiID0gInh5ZXMiOyB0aGVuCisJaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgQ0ZMQUdTPSItV2FsbCAtV2Vycm9yICRDRkxBR1MiCisgICAgICAgIGZpCisJaWYgdGVzdCAieCRHWFgiID0gInh5ZXMiOyB0aGVuCisJCUNYWEZMQUdTPSItV2FsbCAtV2Vycm9yICRDWFhGTEFHUyIKKwlmaQorZmldKWRubAorXSkjIENPTVBJTEVSX1dBUk5JTkdTCisKKyMgQ09NUElMRVJfT1BUSU1JU0FUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIGNvbmZpZ3VyZSBvcHRpb24gdG8gZGlzYWJsZSBvcHRpbWlzYXRpb25zLgorQUNfREVGVU4oW0NPTVBJTEVSX09QVElNSVNBVElPTlNdLAorW0FDX0FSR19FTkFCTEUoY29tcGlsZXItb3B0aW1pc2F0aW9ucywKKwlBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWNvbXBpbGVyLW9wdGltaXNhdGlvbnNdLAorCQkgICAgICAgW0Rpc2FibGUgY29tcGlsZXIgb3B0aW1pc2F0aW9uc10pLAorW2lmIHRlc3QgIngkZW5hYmxlX2NvbXBpbGVyX29wdGltaXNhdGlvbnMiID0gInhubyI7IHRoZW4KKwlbQ0ZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAtZSAicy8gLU9bMS05XSpcYi8gLU8wL2ciYF0KK2ZpXSlkbmwKK10pIyBDT01QSUxFUl9PUFRJTUlTQVRJT05TCisKKyMgQ09NUElMRVJfQ09WRVJBR0UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgY292ZXJhZ2UgZGF0YS4KK0FDX0RFRlVOKFtDT01QSUxFUl9DT1ZFUkFHRV0sCitbQUNfQVJHX0VOQUJMRShjb21waWxlci1jb3ZlcmFnZSwKKwlBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY29tcGlsZXItY292ZXJhZ2VdLAorCQkgICAgICAgW0VuYWJsZSBnZW5lcmF0aW9uIG9mIGNvdmVyYWdlIGRhdGFdKSwKK1tpZiB0ZXN0ICJ4JGVuYWJsZV9jb21waWxlcl9jb3ZlcmFnZSIgPSAieHllcyI7IHRoZW4KKwlpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKwkJQ0ZMQUdTPSIkQ0ZMQUdTIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKwlmaQorZmldKWRubAorXSkjIENPTVBJTEVSX0NPVkVSQUdFCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9tNC9saWJ0b29sLm00IGIvZGJ1cy0xLjQuMTAvbTQvbGlidG9vbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmYzYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvbGlidG9vbC5tNApAQCAtMCwwICsxLDc4NTEgQEAKKyMgbGlidG9vbC5tNCAtIENvbmZpZ3VyZSBsaWJ0b29sIGZvciB0aGUgaG9zdCBzeXN0ZW0uIC0qLUF1dG9jb25mLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgICAgICAgICAgICAgICBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKK200X2RlZmluZShbX0xUX0NPUFlJTkddLCBbZG5sCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgICAgICAgICAgICAgICBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgorIworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgorIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorXSkKKworIyBzZXJpYWwgNTcgTFRfSU5JVAorCisKKyMgTFRfUFJFUkVRKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21wbGFpbiBhbmQgZXhpdCBpZiB0aGlzIGxpYnRvb2wgdmVyc2lvbiBpcyBsZXNzIHRoYXQgVkVSU0lPTi4KK200X2RlZnVuKFtMVF9QUkVSRVFdLAorW200X2lmKG00X3ZlcnNpb25fY29tcGFyZShtNF9kZWZuKFtMVF9QQUNLQUdFX1ZFUlNJT05dKSwgWyQxXSksIC0xLAorICAgICAgIFttNF9kZWZhdWx0KFskM10sCisJCSAgIFttNF9mYXRhbChbTGlidG9vbCB2ZXJzaW9uICQxIG9yIGhpZ2hlciBpcyByZXF1aXJlZF0sCisJCSAgICAgICAgICAgICA2MyldKV0sCisgICAgICAgWyQyXSldKQorCisKKyMgX0xUX0NIRUNLX0JVSUxERElSCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21wbGFpbiBpZiB0aGUgYWJzb2x1dGUgYnVpbGQgZGlyZWN0b3J5IG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzCittNF9kZWZ1bihbX0xUX0NIRUNLX0JVSUxERElSXSwKK1tjYXNlIGBwd2RgIGluCisgICpcICogfCAqXAkqKQorICAgIEFDX01TR19XQVJOKFtMaWJ0b29sIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHdoaXRlc3BhY2UgaW4gYHB3ZGBdKSA7OworZXNhYworXSkKKworCisjIExUX0lOSVQoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9JTklUXSwKK1tBQ19QUkVSRVEoWzIuNThdKWRubCBXZSB1c2UgQUNfSU5DTFVERVNfREVGQVVMVAorQUNfUkVRVUlSRShbQUNfQ09ORklHX0FVWF9ESVJfREVGQVVMVF0pZG5sCitBQ19CRUZPUkUoWyQwXSwgW0xUX0xBTkddKWRubAorQUNfQkVGT1JFKFskMF0sIFtMVF9PVVRQVVRdKWRubAorQUNfQkVGT1JFKFskMF0sIFtMVERMX0lOSVRdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX0JVSUxERElSXSlkbmwKKworZG5sIEF1dG9jb25mIGRvZXNuJ3QgY2F0Y2ggdW5leHBhbmRlZCBMVF8gbWFjcm9zIGJ5IGRlZmF1bHQ6CittNF9wYXR0ZXJuX2ZvcmJpZChbXl8/TFRfW0EtWl9dKyRdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXihfTFRfRU9GfExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1d8TFRfTVVMVElfTU9EVUxFKSRdKWRubAorZG5sIGFjbG9jYWwgZG9lc24ndCBwdWxsIGx0b3B0aW9ucy5tNCwgbHRzdWdhci5tNCwgb3IgbHR2ZXJzaW9uLm00CitkbmwgdW5sZXNzIHdlIHJlcXVpcmUgYW4gQUNfREVGVU5lZCBtYWNybzoKK0FDX1JFUVVJUkUoW0xUT1BUSU9OU19WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUU1VHQVJfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVFZFUlNJT05fVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVE9CU09MRVRFX1ZFUlNJT05dKWRubAorbTRfcmVxdWlyZShbX0xUX1BST0dfTFRNQUlOXSlkbmwKKworX0xUX1NIRUxMX0lOSVQoW1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9XSkKKworZG5sIFBhcnNlIE9QVElPTlMKK19MVF9TRVRfT1BUSU9OUyhbJDBdLCBbJDFdKQorCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRsdG1haW4iCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKK0FDX1NVQlNUKExJQlRPT0wpZG5sCisKK19MVF9TRVRVUAorCisjIE9ubHkgZXhwYW5kIG9uY2U6CittNF9kZWZpbmUoW0xUX0lOSVRdKQorXSkjIExUX0lOSVQKKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQUNfUFJPR19MSUJUT09MXSwgW0xUX0lOSVRdKQorQVVfQUxJQVMoW0FNX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfUFJPR19MSUJUT09MXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0sIFtdKQorCisKKyMgX0xUX0NDX0JBU0VOQU1FKENDKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGN1bGF0ZSBjY19iYXNlbmFtZS4gIFNraXAga25vd24gY29tcGlsZXIgd3JhcHBlcnMgYW5kIGNyb3NzLXByZWZpeC4KK200X2RlZnVuKFtfTFRfQ0NfQkFTRU5BTUVdLAorW2ZvciBjY190ZW1wIGluICQxIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltbXFwvXV1jb21waWxlIHwgY2NhY2hlIHwgKltbXFwvXV1jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbW1xcL11dZGlzdGNjIHwgcHVyaWZ5IHwgKltbXFwvXV1wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkRUNITyAiJGNjX3RlbXAiIHwgJFNFRCAicyUuKi8lJTsgcyVeJGhvc3RfYWxpYXMtJSUiYAorXSkKKworCisjIF9MVF9GSUxFVVRJTFNfREVGQVVMVFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJdCBpcyBva2F5IHRvIHVzZSB0aGVzZSBmaWxlIGNvbW1hbmRzIGFuZCBhc3N1bWUgdGhleSBoYXZlIGJlZW4gc2V0CisjIHNlbnNpYmx5IGFmdGVyIGBtNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSknLgorbTRfZGVmdW4oW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdLAorWzogJHtDUD0iY3AgLWYifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KK10pIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCisKKworIyBfTFRfU0VUVVAKKyMgLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1NFVFVQXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorQUNfUkVRVUlSRShbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdKWRubAorQUNfUkVRVUlSRShbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKWRubAorCitfTFRfREVDTChbXSwgW2hvc3RfYWxpYXNdLCBbMF0sIFtUaGUgaG9zdCBzeXN0ZW1dKWRubAorX0xUX0RFQ0woW10sIFtob3N0XSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtob3N0X29zXSwgWzBdKWRubAorZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX2FsaWFzXSwgWzBdLCBbVGhlIGJ1aWxkIHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkXSwgWzBdKWRubAorX0xUX0RFQ0woW10sIFtidWlsZF9vc10sIFswXSlkbmwKK2RubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAordGVzdCAteiAiJExOX1MiICYmIExOX1M9ImxuIC1zIgorX0xUX0RFQ0woW10sIFtMTl9TXSwgWzFdLCBbV2hldGhlciB3ZSBuZWVkIHNvZnQgb3IgaGFyZCBsaW5rc10pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0xUX0NNRF9NQVhfTEVOXSlkbmwKK19MVF9ERUNMKFtvYmpleHRdLCBbYWNfb2JqZXh0XSwgWzBdLCBbT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXhlZXh0XSwgWzBdLCBbRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpXSlkbmwKK2RubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9SRUxPQURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX01BR0lDX01FVEhPRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQl0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX09MRF9BUkNISVZFXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1dJVEhfU1lTUk9PVF0pZG5sCisKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorXSkKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworX0xUX0NIRUNLX09CSkRJUgorCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKKword2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Cit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgX0xUX1BBVEhfTUFHSUMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK0xUX1NVUFBPUlRFRF9UQUcoW0NDXSkKK19MVF9MQU5HX0NfQ09ORklHCitfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworX0xUX0NPTkZJR19DT01NQU5EUworXSkjIF9MVF9TRVRVUAorCisKKyMgX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGEgZmV3IHNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwIHVzIGRvIHJvYnVzdCBxdW90aW5nLgorbTRfZGVmdW4oW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSwKK1sjIEJhY2tzbGFzaGlmeSBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluCisjIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtbImAkXFxdXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbWyJgXFxdXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworXSkKKworIyBfTFRfUFJPR19MVE1BSU4KKyMgLS0tLS0tLS0tLS0tLS0tCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgY2FsbGVkIGJvdGggZnJvbSBgY29uZmlndXJlJywgYW5kIGBjb25maWcuc3RhdHVzJworIyBub3cgdGhhdCB3ZSB1c2UgQUNfQ09ORklHX0NPTU1BTkRTIHRvIGdlbmVyYXRlIGxpYnRvb2wuICBOb3RhYmx5LAorIyBgY29uZmlnLnN0YXR1cycgaGFzIG5vIHZhbHVlIGZvciBhY19hdXhfZGlyIHVubGVzcyB3ZSBhcmUgdXNpbmcgQXV0b21ha2UsCisjIHNvIHdlIHBhc3MgYSBjb3B5IGFsb25nIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBzZW5zaWJsZSB2YWx1ZSBhbnl3YXkuCittNF9kZWZ1bihbX0xUX1BST0dfTFRNQUlOXSwKK1ttNF9pZmRlZihbQUNfUkVRVUlSRV9BVVhfRklMRV0sIFtBQ19SRVFVSVJFX0FVWF9GSUxFKFtsdG1haW4uc2hdKV0pZG5sCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInXSkKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorXSkjIF9MVF9QUk9HX0xUTUFJTgorCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEFjY3VtdWxhdGUgY29kZSBmb3IgY3JlYXRpbmcgbGlidG9vbC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBTbyB0aGF0IHdlIGNhbiByZWNyZWF0ZSBhIGZ1bGwgbGlidG9vbCBzY3JpcHQgaW5jbHVkaW5nIGFkZGl0aW9uYWwKKyMgdGFncywgd2UgYWNjdW11bGF0ZSB0aGUgY2h1bmtzIG9mIGNvZGUgdG8gc2VuZCB0byBBQ19DT05GSUdfQ09NTUFORFMKKyMgaW4gbWFjcm9zIGFuZCB0aGVuIG1ha2UgYSBzaW5nbGUgY2FsbCBhdCB0aGUgZW5kIHVzaW5nIHRoZSBgbGlidG9vbCcKKyMgbGFiZWwuCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbSU5JVC1DT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgSU5JVC1DT01NQU5EUyB0byBiZSBwYXNzZWQgdG8gQUNfQ09ORklHX0NPTU1BTkRTIGxhdGVyLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX0xJQlRPT0xfSU5JVF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9JTklUXSkKKworCisjIF9MVF9DT05GSUdfTElCVE9PTChbQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MXSwKK1ttNF9pZnZhbChbJDFdLAorICAgICAgICAgIFttNF9hcHBlbmQoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10pCisKKworIyBfTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoW0NPTU1BTkRTXSwgW0lOSVRfQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT05GSUdfU0FWRV9DT01NQU5EU10sCitbX0xUX0NPTkZJR19MSUJUT09MKFskMV0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbJDJdKQorXSkKKworCisjIF9MVF9GT1JNQVRfQ09NTUVOVChbQ09NTUVOVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBsZWFkaW5nIGNvbW1lbnQgbWFya3MgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggbGluZSwgYW5kIGEgdHJhaWxpbmcKKyMgZnVsbC1zdG9wIHRvIHRoZSB3aG9sZSBjb21tZW50IGlmIG9uZSBpcyBub3QgcHJlc2VudCBhbHJlYWR5LgorbTRfZGVmaW5lKFtfTFRfRk9STUFUX0NPTU1FTlRdLAorW200X2lmdmFsKFskMV0sIFsKK200X2JwYXRzdWJzdChbbTRfYnBhdHN1YnN0KFskMV0sIFteICpdLCBbIyBdKV0sCisgICAgICAgICAgICAgIFtbJ2AkXF1dLCBbXFxcJl0pXW00X2JtYXRjaChbJDFdLCBbWyE/Ll0kXSwgW10sIFsuXSkKKyldKQorCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGSVhNRTogRWxpbWluYXRlIFZBUk5BTUUgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisKKyMgX0xUX0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSwgW0lTLVRBR0dFRD9dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENPTkZJR05BTUUgaXMgdGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIHZhbHVlIGluIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyMgVkFSTkFNRSBpcyB0aGUgKGJhc2UpIG5hbWUgdXNlZCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KKyMgVkFMVUUgbWF5IGJlIDAsIDEgb3IgMiBmb3IgYSBjb21wdXRlZCBxdW90ZSBlc2NhcGVkIHZhbHVlIGJhc2VkIG9uCisjIFZBUk5BTUUuICBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZSB1c2VkIGRpcmVjdGx5LgorbTRfZGVmaW5lKFtfTFRfREVDTF0sCitbbHRfaWZfYXBwZW5kX3VuaXEoW2x0X2RlY2xfdmFybmFtZXNdLCBbJDJdLCBbLCBdLAorICAgIFtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtsaWJ0b29sX25hbWVdLAorCVttNF9pZnZhbChbJDFdLCBbJDFdLCBbJDJdKV0pCisgICAgbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbdmFsdWVdLCBbJDNdKQorICAgIG00X2lmdmFsKFskNF0sCisJW2x0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW2Rlc2NyaXB0aW9uXSwgWyQ0XSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwKKwlbdGFnZ2VkP10sIFttNF9pZnZhbChbJDVdLCBbeWVzXSwgW25vXSldKV0pCitdKQorCisKKyMgX0xUX1RBR0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR0RFQ0xdLCBbX0xUX0RFQ0woWyQxXSwgWyQyXSwgWyQzXSwgWyQ0XSwgW3llc10pXSkKKworCisjIGx0X2RlY2xfdGFnX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF90YWdfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFt5ZXNdLCAkQCldKQorCisKKyMgX2x0X2RlY2xfZmlsdGVyKFNVQktFWSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfbHRfZGVjbF9maWx0ZXJdLAorW200X2Nhc2UoWyQjXSwKKyAgWzBdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCisgIFsxXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKKyAgWzJdLCBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sIFskMV0sIFskMl0sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFszXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbJDNdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgJEApXSlbXWRubAorXSkKKworCisjIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfcXVvdGVfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdmFsdWVdLCBbMV0sICRAKV0pCisKKworIyBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzJdLCAkQCldKQorCisKKyMgbHRfZGVjbF92YXJuYW1lc190YWdnZWQoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZF0sCitbbTRfYXNzZXJ0KFskIyA8PSAyXSlkbmwKK18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgIG00X2lmdmFsKFskMl0sIFtbJDJdXSwgW200X2RxdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyldKSwKKyAgICBtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfcXVvdGUoX0xUX1RBR1MpKSwgWyBdKSldKQorbTRfZGVmaW5lKFtfbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2lmdmFsKFskM10sIFtsdF9jb21iaW5lKFskMV0sIFskMl0sIFtfXSwgJDMpXSldKQorCisKKyMgbHRfZGVjbF9hbGxfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2FsbF92YXJuYW1lc10sCitbXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCisgICAgIG00X2lmKFskMl0sIFtdLAorCSAgIG00X3F1b3RlKGx0X2RlY2xfdmFybmFtZXMpLAorCW00X3F1b3RlKG00X3NoaWZ0KCRAKSkpKVtdZG5sCitdKQorbTRfZGVmaW5lKFtfbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW2x0X2pvaW4oJEAsIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFskMV0sCisJCQlsdF9kZWNsX3RhZ192YXJuYW1lcyhbWywgXV0sIG00X3NoaWZ0KCRAKSkpKWRubAorXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoW1ZBUk5BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUXVvdGUgYSB2YXJpYWJsZSB2YWx1ZSwgYW5kIGZvcndhcmQgaXQgdG8gYGNvbmZpZy5zdGF0dXMnIHNvIHRoYXQgaXRzCisjIGRlY2xhcmF0aW9uIHRoZXJlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpbiBgY29uZmlndXJlJy4gIFZBUk5BTUUKKyMgbXVzdCBoYXZlIGEgc2luZ2xlIHF1b3RlIGRlbGltaXRlZCB2YWx1ZSBmb3IgdGhpcyB0byB3b3JrLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFXSwKK1skMT0nYCRFQ0hPICIkXVskMSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2UgZGVsaW1pdCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgd2l0aCBzaW5nbGUgcXVvdGVzLCBzbyB3aGVuCisjIHdlIHdyaXRlIHRoZW0gdG8gY29uZmlnLnN0YXR1cywgd2UgaGF2ZSB0byBiZSBzdXJlIHRvIHF1b3RlIGFsbAorIyBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIHByb3Blcmx5LiAgSW4gY29uZmlndXJlLCB0aGlzIG1hY3JvIGV4cGFuZHMKKyMgZWFjaCB2YXJpYWJsZSBkZWNsYXJlZCB3aXRoIF9MVF9ERUNMIChhbmQgX0xUX1RBR0RFQ0wpIGludG86CisjCisjICAgIDx2YXI+PSdgJEVDSE8gIiQ8dmFyPiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCittNF9kZWZ1bihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF9hbGxfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdTCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0IGNvbW1lbnQgYW5kIGxpc3Qgb2YgdGFncyBzdXBwb3J0ZWQgYnkgdGhlIHNjcmlwdAorbTRfZGVmdW4oW19MVF9MSUJUT09MX1RBR1NdLAorW19MVF9GT1JNQVRfQ09NTUVOVChbVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0XSlkbmwKK2F2YWlsYWJsZV90YWdzPSJfTFRfVEFHUyJkbmwKK10pCisKKworIyBfTFRfTElCVE9PTF9ERUNMQVJFKFZBUk5BTUUsIFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRyYWN0IHRoZSBkaWN0aW9uYXJ5IHZhbHVlcyBmb3IgVkFSTkFNRSAob3B0aW9uYWxseSB3aXRoIFRBRykgYW5kCisjIGV4cGFuZCB0byBhIGNvbW1lbnRlZCBzaGVsbCB2YXJpYWJsZSBzZXR0aW5nOgorIworIyAgICAjIFNvbWUgY29tbWVudCBhYm91dCB3aGF0IFZBUiBpcyBmb3IuCisjICAgIHZpc2libGVfbmFtZT0kbHRfaW50ZXJuYWxfbmFtZQorbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9ERUNMQVJFXSwKK1tfTFRfRk9STUFUX0NPTU1FTlQobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwKKwkJCQkJICAgW2Rlc2NyaXB0aW9uXSkpKVtdZG5sCittNF9wdXNoZGVmKFtfbGlidG9vbF9uYW1lXSwKKyAgICBtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbbGlidG9vbF9uYW1lXSkpKVtdZG5sCittNF9jYXNlKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pKSwKKyAgICBbMF0sIFtfbGlidG9vbF9uYW1lPVskXSQxXSwKKyAgICBbMV0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbMl0sIFtfbGlidG9vbF9uYW1lPSRsdF9bXSQxXSwKKyAgICBbX2xpYnRvb2xfbmFtZT1sdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKV0pW11kbmwKK200X2lmdmFsKFskMl0sIFtfJDJdKVtdbTRfcG9wZGVmKFtfbGlidG9vbF9uYW1lXSlbXWRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0NPTkZJR19WQVJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgY29tbWVudGVkIGRlY2xhcmF0aW9ucyBvZiBub24tdGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcworIyBzdWl0YWJsZSBmb3IgaW5zZXJ0aW9uIGluIHRoZSBMSUJUT09MIENPTkZJRyBzZWN0aW9uIG9mIHRoZSBgbGlidG9vbCcKKyMgc2NyaXB0LiAgVGFnZ2VkIGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyAoZXZlbiBmb3IgdGhlIExJQlRPT0wgQ09ORklHCisjIHNlY3Rpb24pIGFyZSBwcm9kdWNlZCBieSBfTFRfTElCVE9PTF9UQUdfVkFSUy4KK200X2RlZnVuKFtfTFRfTElCVE9PTF9DT05GSUdfVkFSU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sCisgICAgbTRfcXVvdGUoX2x0X2RlY2xfZmlsdGVyKFt0YWdnZWQ/XSwgW25vXSwgW10sIGx0X2RlY2xfdmFybmFtZXMpKSwKKyAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyKV0pXSldKQorCisKKyMgX0xUX0xJQlRPT0xfVEFHX1ZBUlMoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9MSUJUT09MX1RBR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwgbTRfcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIsIFskMV0pXSldKV0pCisKKworIyBfTFRfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdWQVJdLCBbbTRfaWZ2YWwoWyQyXSwgWyQxXyQyXSwgWyQxXSldKQorCisKKyMgX0xUX0NPTkZJR19DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlbmQgYWNjdW11bGF0ZWQgb3V0cHV0IHRvICRDT05GSUdfU1RBVFVTLiAgVGhhbmtzIHRvIHRoZSBsaXN0cyBvZgorIyB2YXJpYWJsZXMgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlIGVzY2FwaW5nIHdlIHNhdmVkIGZyb20gY2FsbHMKKyMgdG8gX0xUX0RFQ0wsIHdlIGNhbiBwdXQgcXVvdGUgZXNjYXBlZCB2YXJpYWJsZXMgZGVjbGFyYXRpb25zCisjIGludG8gYGNvbmZpZy5zdGF0dXMnLCBhbmQgdGhlbiB0aGUgc2hlbGwgY29kZSB0byBxdW90ZSBlc2NhcGUgdGhlbSBpbgorIyBmb3IgbG9vcHMgaW4gYGNvbmZpZy5zdGF0dXMnLiAgRmluYWxseSwgYW55IGFkZGl0aW9uYWwgY29kZSBhY2N1bXVsYXRlZAorIyBmcm9tIGNhbGxzIHRvIF9MVF9DT05GSUdfTElCVE9PTF9JTklUIGlzIGV4cGFuZGVkLgorbTRfZGVmdW4oW19MVF9DT05GSUdfQ09NTUFORFNdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9PVVRQVVRdLAorCWRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaGFzIGJlZW4gcGxhY2VkIGluICRDT05GSUdfTFQsCisJZG5sIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQgYWxsIG92ZXIgYWdhaW4gaW50byBjb25maWcuc3RhdHVzLAorCWRubCB0aGVuIHdlIHdpbGwgaGF2ZSBjb25maWcuc3RhdHVzIHJ1biAkQ09ORklHX0xUIGxhdGVyLCBzbyBpdAorCWRubCBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSBpcyBzdG9yZWQgdGhlcmU6CisgICAgICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICAgICAgWyRTSEVMTCAkQ09ORklHX0xUIHx8IEFTX0VYSVQoMSldLCBbQ09ORklHX0xUPSckQ09ORklHX0xUJ10pXSwKKyAgICBkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGlzIGRlc3RpbmVkIGZvciBjb25maWcuc3RhdHVzLAorICAgIGRubCBleHBhbmQgdGhlIGFjY3VtdWxhdGVkIGNvbW1hbmRzIGFuZCBpbml0IGNvZGUgbm93OgorICAgIFtBQ19DT05GSUdfQ09NTUFORFMoW2xpYnRvb2xdLAorICAgICAgICBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTXSwgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSldKQorXSkjX0xUX0NPTkZJR19DT01NQU5EUworCisKKyMgSW5pdGlhbGl6ZS4KK200X2RlZmluZShbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdLAorWworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCitkb3VibGVfcXVvdGVfc3Vic3Q9JyRkb3VibGVfcXVvdGVfc3Vic3QnCitkZWxheV92YXJpYWJsZV9zdWJzdD0nJGRlbGF5X3ZhcmlhYmxlX3N1YnN0JworX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCitMVENDPSckTFRDQycKK0xUQ0ZMQUdTPSckTFRDRkxBR1MnCitjb21waWxlcj0nJGNvbXBpbGVyX0RFRkFVTFQnCisKKyMgQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBwcmludCBidWlsdGluIG9yIHByaW50Zi4KK2Z1bmNfZmFsbGJhY2tfZWNobyAoKQoreworICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorXCRbXTEKK19MVEVDSE9fRU9GJworfQorCisjIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCitdXSwgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyk7IGRvCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyBcXFxcIiJcXFxcXCRcJHZhciJcXFxcIlxgIGluCisgICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworX0xUX09VVFBVVF9MSUJUT09MX0lOSVQKK10pCisKKyMgX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoRklMRSwgW0NPTU1FTlRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgR2VuZXJhdGUgYSBjaGlsZCBzY3JpcHQgRklMRSB3aXRoIGFsbCBpbml0aWFsaXphdGlvbiBuZWNlc3NhcnkgdG8KKyMgcmV1c2UgdGhlIGVudmlyb25tZW50IGxlYXJuZWQgYnkgdGhlIHBhcmVudCBzY3JpcHQsIGFuZCBtYWtlIHRoZQorIyBmaWxlIGV4ZWN1dGFibGUuICBJZiBDT01NRU5UIGlzIHN1cHBsaWVkLCBpdCBpcyBpbnNlcnRlZCBhZnRlciB0aGUKKyMgYCMhJyBzZXF1ZW5jZSBidXQgYmVmb3JlIGluaXRpYWxpemF0aW9uIHRleHQgYmVnaW5zLiAgQWZ0ZXIgdGhpcworIyBtYWNybywgYWRkaXRpb25hbCB0ZXh0IGNhbiBiZSBhcHBlbmRlZCB0byBGSUxFIHRvIGZvcm0gdGhlIGJvZHkgb2YKKyMgdGhlIGNoaWxkIHNjcmlwdC4gIFRoZSBtYWNybyBlbmRzIHdpdGggbm9uLXplcm8gc3RhdHVzIGlmIHRoZQorIyBmaWxlIGNvdWxkIG5vdCBiZSBmdWxseSB3cml0dGVuIChzdWNoIGFzIGlmIHRoZSBkaXNrIGlzIGZ1bGwpLgorbTRfaWZkZWYoW0FTX0lOSVRfR0VORVJBVEVEXSwKK1ttNF9kZWZ1bihbX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVRdLFtBU19JTklUX0dFTkVSQVRFRCgkQCldKV0sCitbbTRfZGVmdW4oW19MVF9HRU5FUkFURURfRklMRV9JTklUXSwKK1ttNF9yZXF1aXJlKFtBU19QUkVQQVJFXSldZG5sCitbbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV1kbmwKK1tsdF93cml0ZV9mYWlsPTAKK2NhdCA+JDEgPDxfQVNFT0YgfHwgbHRfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyQyCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorZXhwb3J0IFNIRUxMCitfQVNFT0YKK2NhdCA+PiQxIDw8XF9BU0VPRiB8fCBsdF93cml0ZV9mYWlsPTEKK0FTX1NIRUxMX1NBTklUSVpFCitfQVNfUFJFUEFSRQorZXhlYyBBU19NRVNTQUdFX0ZEPiYxCitfQVNFT0YKK3Rlc3QgJGx0X3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICQxW11kbmwKK200X3BvcGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV0pXSkjIF9MVF9HRU5FUkFURURfRklMRV9JTklUCisKKyMgTFRfT1VUUFVUCisjIC0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIGFsbG93cyBlYXJseSBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdCAoYmVmb3JlCisjIEFDX09VVFBVVCBpcyBjYWxsZWQpLCBpbmNhc2UgaXQgaXMgdXNlZCBpbiBjb25maWd1cmUgZm9yIGNvbXBpbGF0aW9uCisjIHRlc3RzLgorQUNfREVGVU4oW0xUX09VVFBVVF0sCitbOiAke0NPTkZJR19MVD0uL2NvbmZpZy5sdH0KK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRDT05GSUdfTFRdKQorX0xUX0dFTkVSQVRFRF9GSUxFX0lOSVQoWyIkQ09ORklHX0xUIl0sCitbIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIGEgbGlidG9vbCBzdHViIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5dKQorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitsdF9jbF9zaWxlbnQ9ZmFsc2UKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBBU19CT1goW1J1bm5pbmcgJGFzX21lLl0pCit9ID4mQVNfTUVTU0FHRV9MT0dfRkQKKworbHRfY2xfaGVscD0iXAorXGAkYXNfbWUnIGNyZWF0ZXMgYSBsb2NhbCBsaWJ0b29sIHN0dWIgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLAorZm9yIHVzZSBpbiBmdXJ0aGVyIGNvbmZpZ3VyZSB0aW1lIHRlc3RzIGJlZm9yZSB0aGUgcmVhbCBsaWJ0b29sIGlzCitnZW5lcmF0ZWQuCisKK1VzYWdlOiAkWzBdIFtbT1BUSU9OU11dCisKKyAgLWgsIC0taGVscCAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0ICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKKworbHRfY2xfdmVyc2lvbj0iXAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWcubHRbXWRubAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKK2NvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLgorCitDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5sdCBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCit3aGlsZSB0ZXN0ICRbI10gIT0gMAorZG8KKyAgY2FzZSAkWzFdIGluCisgICAgLS12ZXJzaW9uIHwgLS12KiB8IC1WICkKKyAgICAgIGVjaG8gIiRsdF9jbF92ZXJzaW9uIjsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgIGVjaG8gIiRsdF9jbF9oZWxwIjsgZXhpdCAwIDs7CisgICAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgICBkZWJ1Zz06IDs7CisgICAgLS1xdWlldCB8IC0tcSogfCAtLXNpbGVudCB8IC0tcyogfCAtcSApCisgICAgICBsdF9jbF9zaWxlbnQ9OiA7OworCisgICAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisKKyAgICAqKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBhcmd1bWVudDogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgJGx0X2NsX3NpbGVudDsgdGhlbgorICBleGVjIEFTX01FU1NBR0VfRkQ+L2Rldi9udWxsCitmaQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PF9MVEVPRgorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVQKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkb2ZpbGVdKQorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTCitBU19FWElUKDApCitfTFRFT0YKK2NobW9kICt4ICIkQ09ORklHX0xUIgorCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGJ1dCBjb25maWcubHQgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLAorIyBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZywgd2hpY2ggZmFpbHMgb24gRE9TLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQKKyMgb3BlbiBieSBjb25maWd1cmUuICBIZXJlIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwgZWZmZWN0aXZlbHkgY2xvc2luZworIyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gYnkgY29uZmlnLmx0LgorbHRfY2xfc3VjY2Vzcz06Cit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICBsdF9jb25maWdfbHRfYXJncz0iJGx0X2NvbmZpZ19sdF9hcmdzIC0tcXVpZXQiCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPi9kZXYvbnVsbAorJFNIRUxMICIkQ09ORklHX0xUIiAkbHRfY29uZmlnX2x0X2FyZ3MgfHwgbHRfY2xfc3VjY2Vzcz1mYWxzZQorZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZworJGx0X2NsX3N1Y2Nlc3MgfHwgQVNfRVhJVCgxKQorXSkjIExUX09VVFBVVAorCisKKyMgX0xUX0NPTkZJRyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBJZiBUQUcgaXMgdGhlIGJ1aWx0LWluIHRhZywgY3JlYXRlIGFuIGluaXRpYWwgbGlidG9vbCBzY3JpcHQgd2l0aCBhCisjIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB1bnRhZ2dlZCBjb25maWcgdmFycy4gIE90aGVyd2lzZSBhZGQgY29kZQorIyB0byBjb25maWcuc3RhdHVzIGZvciBhcHBlbmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZWQgYnkgVEFHIGZyb20gdGhlCisjIG1hdGNoaW5nIHRhZ2dlZCBjb25maWcgdmFycy4KK200X2RlZnVuKFtfTFRfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT05GSUdfU0FWRV9DT01NQU5EUyhbCisgIG00X2RlZmluZShbX0xUX1RBR10sIG00X2lmKFskMV0sIFtdLCBbQ10sIFskMV0pKWRubAorICBtNF9pZihfTFRfVEFHLCBbQ10sIFsKKyAgICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisgICAgIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgICAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgICAgZmkKKworICAgIGNmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgICB0cmFwICIkUk0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQorICAgICRSTSAiJGNmZ2ZpbGUiCisKKyAgICBjYXQgPDxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMhICRTSEVMTAorCisjIGAkRUNITyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkYXNfbWUgKCRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworX0xUX0NPUFlJTkcKK19MVF9MSUJUT09MX1RBR1MKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKK19MVF9MSUJUT09MX0NPTkZJR19WQVJTCitfTFRfTElCVE9PTF9UQUdfVkFSUworIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHCisKK19MVF9FT0YKKworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCitfTFRfRU9GCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9QUk9HX0xUTUFJTgorCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSI7IGV4aXQgMSkKKworICBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisKKyAgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSwKK1tjYXQgPDxfTFRfRU9GID4+ICIkb2ZpbGUiCisKK2RubCBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlICQxIGhlcmUsIHNpbmNlIF9MVF9UQUcgaXMgbm90IGV4cGFuZGVkCitkbmwgaW4gYSBjb21tZW50IChpZSBhZnRlciBhICMpLgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0xJQlRPT0xfVEFHX1ZBUlMoX0xUX1RBRykKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfRU9GCitdKWRubCAvbTRfaWYKK10sCitbbTRfaWYoWyQxXSwgW10sIFsKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJ10sIFtdKQorXSlkbmwgL19MVF9DT05GSUdfU0FWRV9DT01NQU5EUworXSkjIF9MVF9DT05GSUcKKworCisjIExUX1NVUFBPUlRFRF9UQUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJhY2UgdGhpcyBtYWNybyB0byBkaXNjb3ZlciB3aGF0IHRhZ3MgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGlidG9vbAorIyAtLXRhZyBvcHRpb24sIHVzaW5nOgorIyAgICBhdXRvY29uZiAtLXRyYWNlICdMVF9TVVBQT1JURURfVEFHOiQxJworQUNfREVGVU4oW0xUX1NVUFBPUlRFRF9UQUddLCBbXSkKKworCisjIEMgc3VwcG9ydCBpcyBidWlsdC1pbiBmb3Igbm93CittNF9kZWZpbmUoW19MVF9MQU5HX0NfZW5hYmxlZF0sIFtdKQorbTRfZGVmaW5lKFtfTFRfVEFHU10sIFtdKQorCisKKyMgTFRfTEFORyhMQU5HKQorIyAtLS0tLS0tLS0tLS0tCisjIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLgorQUNfREVGVU4oW0xUX0xBTkddLAorW0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK200X2Nhc2UoWyQxXSwKKyAgW0NdLAkJCVtfTFRfTEFORyhDKV0sCisgIFtDKytdLAkJW19MVF9MQU5HKENYWCldLAorICBbSmF2YV0sCQlbX0xUX0xBTkcoR0NKKV0sCisgIFtGb3J0cmFuIDc3XSwJCVtfTFRfTEFORyhGNzcpXSwKKyAgW0ZvcnRyYW5dLAkJW19MVF9MQU5HKEZDKV0sCisgIFtXaW5kb3dzIFJlc291cmNlXSwJW19MVF9MQU5HKFJDKV0sCisgIFttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19DT05GSUddLAorICAgIFtfTFRfTEFORygkMSldLAorICAgIFttNF9mYXRhbChbJDA6IHVuc3VwcG9ydGVkIGxhbmd1YWdlOiAiJDEiXSldKV0pZG5sCitdKSMgTFRfTEFORworCisKKyMgX0xUX0xBTkcoTEFOR05BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HXSwKK1ttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10sCisgIFtMVF9TVVBQT1JURURfVEFHKFskMV0pZG5sCisgIG00X2FwcGVuZChbX0xUX1RBR1NdLCBbJDEgXSlkbmwKKyAgbTRfZGVmaW5lKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSlkbmwKKyAgX0xUX0xBTkdfJDFfQ09ORklHKCQxKV0pZG5sCitdKSMgX0xUX0xBTkcKKworCisjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkdfREVGQVVMVF9DT05GSUddLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgIFtMVF9MQU5HKENYWCldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbTFRfTEFORyhDWFgpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAorICBbTFRfTEFORyhGNzcpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0xUX0xBTkcoRjc3KV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRkNdLAorICBbTFRfTEFORyhGQyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0ZDXSwgZGVmbihbQUNfUFJPR19GQ10pW0xUX0xBTkcoRkMpXSldKQorCitkbmwgVGhlIGNhbGwgdG8gW0FdW01fUFJPR19HQ0pdIGlzIHF1b3RlZCBsaWtlIHRoYXQgdG8gc3RvcCBhY2xvY2FsCitkbmwgcHVsbGluZyB0aGluZ3MgaW4gbmVlZGxlc3NseS4KK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCisgIFtMVF9MQU5HKEdDSildLAorICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAorICAgIFtMVF9MQU5HKEdDSildLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19HQ0pdLAorICAgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgICBbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbTFRfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0xUX1BST0dfR0NKXSwgZGVmbihbTFRfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pXSldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX1JDXSwKKyAgW0xUX0xBTkcoUkMpXSwKKyAgW200X2RlZmluZShbTFRfUFJPR19SQ10sIGRlZm4oW0xUX1BST0dfUkNdKVtMVF9MQU5HKFJDKV0pXSkKK10pIyBfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworCisjIE9ic29sZXRlIG1hY3JvczoKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtMVF9MQU5HKEMrKyldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW0xUX0xBTkcoRm9ydHJhbiA3NyldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfRkNdLCBbTFRfTEFORyhGb3J0cmFuKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9HQ0pdLCBbTFRfTEFORyhKYXZhKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9SQ10sIFtMVF9MQU5HKFdpbmRvd3MgUmVzb3VyY2UpXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9DWFhdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwgW10pCisKKworIyBfTFRfVEFHX0NPTVBJTEVSCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfVEFHX0NPTVBJTEVSXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKworX0xUX0RFQ0woW0xUQ0NdLCBbQ0NdLCBbMV0sIFtBIEMgY29tcGlsZXJdKWRubAorX0xUX0RFQ0woW0xUQ0ZMQUdTXSwgW0NGTEFHU10sIFsxXSwgW0xUQ0MgY29tcGlsZXIgZmxhZ3NdKWRubAorX0xUX1RBR0RFQ0woW0NDXSwgW2NvbXBpbGVyXSwgWzFdLCBbQSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlcl0pZG5sCitfTFRfVEFHREVDTChbd2l0aF9nY2NdLCBbR0NDXSwgWzBdLCBbSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgY29tcGlsZXI/XSlkbmwKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworXSkjIF9MVF9UQUdfQ09NUElMRVIKKworCisjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGNvbXBpbGVyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgY29tcGlsZXIgdGVzdCBjb2RlLgorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorXSkjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorCisKKyMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBsaW5rZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBsaW5rIHRlc3QgY29kZS4KK200X2RlZnVuKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIC1yIGNvbmZ0ZXN0KgorXSkjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bl9vbmNlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10sWworICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luKikKKyAgICBBQ19DSEVDS19UT09MKFtEU1lNVVRJTF0sIFtkc3ltdXRpbF0sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtOTUVESVRdLCBbbm1lZGl0XSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW0xJUE9dLCBbbGlwb10sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtPVE9PTF0sIFtvdG9vbF0sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtPVE9PTDY0XSwgW290b29sNjRdLCBbOl0pCisgICAgX0xUX0RFQ0woW10sIFtEU1lNVVRJTF0sIFsxXSwKKyAgICAgIFtUb29sIHRvIG1hbmlwdWxhdGUgYXJjaGl2ZWQgRFdBUkYgZGVidWcgc3ltYm9sIGZpbGVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW05NRURJVF0sIFsxXSwKKyAgICAgIFtUb29sIHRvIGNoYW5nZSBnbG9iYWwgdG8gbG9jYWwgc3ltYm9scyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtMSVBPXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBmYXQgb2JqZWN0cyBhbmQgYXJjaGl2ZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbT1RPT0xdLCBbMV0sCisgICAgICBbbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciBNYWNoLU8gYmluYXJpZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbT1RPT0w2NF0sIFsxXSwKKyAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIDY0IGJpdCBNYWNoLU8gYmluYXJpZXMgb24gTWFjIE9TIFggMTAuNF0pCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnXSxbbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZF0sCisgICAgICBbbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubworICAgICAgaWYgdGVzdCAteiAiJHtMVF9NVUxUSV9NT0RVTEV9IjsgdGhlbgorCSMgQnkgZGVmYXVsdCB3ZSB3aWxsIGFkZCB0aGUgLXNpbmdsZV9tb2R1bGUgZmxhZy4gWW91IGNhbiBvdmVycmlkZQorCSMgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExUX01VTFRJX01PRFVMRQorCSMgbm9uLWVtcHR5IGF0IGNvbmZpZ3VyZSB0aW1lLCBvciBieSBhZGRpbmcgLW11bHRpX21vZHVsZSB0byB0aGUKKwkjIGxpbmsgZmxhZ3MuCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCWVjaG8gImludCBmb28odm9pZCl7cmV0dXJuIDE7fSIgPiBjb25mdGVzdC5jCisJZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKy1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIiA+JkFTX01FU1NBR0VfTE9HX0ZECisJJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKwkgIC1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIDI+Y29uZnRlc3QuZXJyCisgICAgICAgIF9sdF9yZXN1bHQ9JD8KKwlpZiB0ZXN0IC1mIGxpYmNvbmZ0ZXN0LmR5bGliICYmIHRlc3QgISAtcyBjb25mdGVzdC5lcnIgJiYgdGVzdCAkX2x0X3Jlc3VsdCA9IDA7IHRoZW4KKwkgIGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCisJZWxzZQorCSAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJcm0gLWYgY29uZnRlc3QuKgorICAgICAgZmldKQorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZ10sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0XSwKKyAgICAgIFtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KKyAgICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgZWNobyAiX21haW4iID4gY29uZnRlc3Quc3ltCisgICAgICBMREZMQUdTPSIkTERGTEFHUyAtV2wsLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCxjb25mdGVzdC5zeW0iCisgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisJW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD15ZXNdLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm9dKQorCUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgXSkKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnXSxbbHRfY3ZfbGRfZm9yY2VfbG9hZF0sCisgICAgICBbbHRfY3ZfbGRfZm9yY2VfbG9hZD1ubworICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgZm9yY2VkX2xvYWRlZCgpIHsgcmV0dXJuIDI7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Lm8gY29uZnRlc3QuYyAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBlY2hvICIkUkFOTElCIGxpYmNvbmZ0ZXN0LmEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgY2F0ID4gY29uZnRlc3QuYyA8PCBfTFRfRU9GCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7fQorX0xUX0VPRgorICAgICAgZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgLVdsLC1mb3JjZV9sb2FkLC4vbGliY29uZnRlc3QuYSAyPmNvbmZ0ZXN0LmVycgorICAgICAgX2x0X3Jlc3VsdD0kPworICAgICAgaWYgdGVzdCAtZiBjb25mdGVzdCAmJiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyICYmIHRlc3QgJF9sdF9yZXN1bHQgPSAwICYmICRHUkVQIGZvcmNlZF9sb2FkIGNvbmZ0ZXN0IDI+JjEgPi9kZXYvbnVsbDsgdGhlbgorCWx0X2N2X2xkX2ZvcmNlX2xvYWQ9eWVzCisgICAgICBlbHNlCisJY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBmaQorICAgICAgICBybSAtZiBjb25mdGVzdC5lcnIgbGliY29uZnRlc3QuYSBjb25mdGVzdCBjb25mdGVzdC5jCisgICAgICAgIHJtIC1yZiBjb25mdGVzdC5kU1lNCisgICAgXSkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbjEuKikKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4qKSAjIGRhcndpbiA1Lnggb24KKyAgICAgICMgaWYgcnVubmluZyBvbiAxMC41IG9yIGxhdGVyLCB0aGUgZGVwbG95bWVudCB0YXJnZXQgZGVmYXVsdHMKKyAgICAgICMgdG8gdGhlIE9TIHZlcnNpb24sIGlmIG9uIHg4NiwgYW5kIDEwLjQsIHRoZSBkZXBsb3ltZW50CisgICAgICAjIHRhcmdldCBkZWZhdWx0cyB0byAxMC40LiBEb24ndCB5b3UgbG92ZSBpdD8KKyAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQtMTAuMH0sJGhvc3QgaW4KKwkxMC4wLCo4NiotZGFyd2luOCp8MTAuMCwqLWRhcndpbltbOTFdXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisJMTAuW1swMTJdXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisJMTAuKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKyAgICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCisgICAgZWxzZQorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IiAmJiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAibm8iOyB0aGVuCisgICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JworICAgIGVsc2UKKyAgICAgIF9sdF9kc3ltdXRpbD0KKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCisKKworIyBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVja3MgZm9yIGxpbmtlciBhbmQgY29tcGlsZXIgZmVhdHVyZXMgb24gZGFyd2luCittNF9kZWZ1bihbX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVNdLAorWworICBtNF9yZXF1aXJlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIGlmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJ5ZXMiOyB0aGVuCisgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSdgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UgJHt3bH0tZm9yY2VfbG9hZCwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCcKKyAgZWxzZQorICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJworICBmaQorICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAtZSAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBtNF9pZihbJDFdLCBbQ1hYXSwKK1sgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgIT0gInllcyI7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kc3ltdXRpbH0iCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBmaQorXSxbXSkKKyAgZWxzZQorICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgIGZpCitdKQorCisjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaW5rcyBhIG1pbmltYWwgcHJvZ3JhbSBhbmQgY2hlY2tzIHRoZSBleGVjdXRhYmxlCisjIGZvciB0aGUgc3lzdGVtIGRlZmF1bHQgaGFyZGNvZGVkIGxpYnJhcnkgcGF0aC4gSW4gbW9zdCBjYXNlcywKKyMgdGhpcyBpcyAvdXNyL2xpYjovbGliLCBidXQgd2hlbiB0aGUgTVBJIGNvbXBpbGVycyBhcmUgdXNlZAorIyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gYW5kIE1QSSBsaWJzIGFyZSBpbmNsdWRlZCB0b28uCisjIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggYWNjb3JkaW5nCisjIHRvIHRoZSBhaXggbGQgbWFudWFsLgorIyBTdG9yZSB0aGUgcmVzdWx0cyBmcm9tIHRoZSBkaWZmZXJlbnQgY29tcGlsZXJzIGZvciBlYWNoIFRBR05BTUUuCisjIEFsbG93IHRvIG92ZXJyaWRlIHRoZW0gZm9yIGFsbCB0YWdzIHRocm91Z2ggbHRfY3ZfYWl4X2xpYnBhdGguCittNF9kZWZ1bihbX0xUX1NZU19NT0RVTEVfUEFUSF9BSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitpZiB0ZXN0ICIke2x0X2N2X2FpeF9saWJwYXRoK3NldH0iID0gc2V0OyB0aGVuCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aAorZWxzZQorICBBQ19DQUNIRV9WQUwoW19MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pXSwKKyAgW0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLFsKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPSdbCisgICAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJICAvXjAvIHsKKwkgICAgICBzL14wICAqXChbXiBdKlwpICokL1wxLworCSAgICAgIHAKKwkgIH0KKyAgICAgIH1dJworICBfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKT1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyAgIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgorICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSkiOyB0aGVuCisgICAgX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSk9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgIGZpXSxbXSkKKyAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pIjsgdGhlbgorICAgIF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pPSIvdXNyL2xpYjovbGliIgorICBmaQorICBdKQorICBhaXhfbGlicGF0aD0kX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSkKK2ZpCitdKSMgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKworCisjIF9MVF9TSEVMTF9JTklUKEFSRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfU0hFTExfSU5JVF0sCitbbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVF0sIFskMQorXSldKSMgX0xUX1NIRUxMX0lOSVQKKworCisKKyMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmluZCBob3cgd2UgY2FuIGZha2UgYW4gZWNobyBjb21tYW5kIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaC4KKyMgSW4gcGFydGljdWxhciwgd2l0aCBBdXRvY29uZiAyLjYwIG9yIGxhdGVyIHdlIGFkZCBzb21lIGNvZGUgdG8gdGhlIHN0YXJ0CisjIG9mIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdCB3aGljaCB3aWxsIGZpbmQgYSBzaGVsbCB3aXRoIGEgYnVpbHRpbgorIyBwcmludGYgKHdoaWNoIHdlIGNhbiB1c2UgYXMgYW4gZWNobyBjb21tYW5kKS4KK200X2RlZnVuKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCitbRUNITz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KKworQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gcHJpbnQgc3RyaW5nc10pCisjIFRlc3QgcHJpbnQgZmlyc3QsIGJlY2F1c2UgaXQgd2lsbCBiZSBhIGJ1aWx0aW4gaWYgcHJlc2VudC4KK2lmIHRlc3QgIlhgKCBwcmludCAtciAtLSAtbiApIDI+L2Rldi9udWxsYCIgPSBYLW4gJiYgXAorICAgdGVzdCAiWGBwcmludCAtciAtLSAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnQgLXIgLS0nCitlbGlmIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludGYgJXNcbicKK2Vsc2UKKyAgIyBVc2UgdGhpcyBmdW5jdGlvbiBhcyBhIGZhbGxiYWNrIHRoYXQgYWx3YXlzIHdvcmtzLgorICBmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKKyAgeworICAgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskW10xCitfTFRFQ0hPX0VPRicKKyAgfQorICBFQ0hPPSdmdW5jX2ZhbGxiYWNrX2VjaG8nCitmaQorCisjIGZ1bmNfZWNob19hbGwgYXJnLi4uCisjIEludm9rZSAkRUNITyB3aXRoIGFsbCBhcmdzLCBzcGFjZS1zZXBhcmF0ZWQuCitmdW5jX2VjaG9fYWxsICgpCit7CisgICAgJEVDSE8gIiQqIiAKK30KKworY2FzZSAiJEVDSE8iIGluCisgIHByaW50ZiopIEFDX01TR19SRVNVTFQoW3ByaW50Zl0pIDs7CisgIHByaW50KikgQUNfTVNHX1JFU1VMVChbcHJpbnQgLXJdKSA7OworICAqKSBBQ19NU0dfUkVTVUxUKFtjYXRdKSA7OworZXNhYworCittNF9pZmRlZihbX0FTX0RFVEVDVF9TVUdHRVNURURdLAorW19BU19ERVRFQ1RfU1VHR0VTVEVEKFsKKyAgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9JHtCQVNIX1ZFUlNJT04rc2V0fSIgfHwgKAorICAgIEVDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCisgICAgRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisgICAgRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KKyAgICBQQVRIPS9lbXB0eSBGUEFUSD0vZW1wdHk7IGV4cG9ydCBQQVRIIEZQQVRICisgICAgdGVzdCAiWGBwcmludGYgJXMgJEVDSE9gIiA9ICJYJEVDSE8iIFwKKyAgICAgIHx8IHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE9gIiA9ICJYJEVDSE8iICldKV0pCisKK19MVF9ERUNMKFtdLCBbU0hFTExdLCBbMV0sIFtTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzXSkKK19MVF9ERUNMKFtdLCBbRUNIT10sIFsxXSwgW0FuIGVjaG8gcHJvZ3JhbSB0aGF0IHByb3RlY3RzIGJhY2tzbGFzaGVzXSkKK10pIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCisKKyMgX0xUX1dJVEhfU1lTUk9PVAorIyAtLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX1dJVEhfU1lTUk9PVF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3lzcm9vdF0pCitBQ19BUkdfV0lUSChbc3lzcm9vdF0sCitbICAtLXdpdGgtc3lzcm9vdFs9RElSXSBTZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMgd2l0aGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHRoZSBjb21waWxlcidzIHN5c3Jvb3QgaWYgbm90IHNwZWNpZmllZCkuXSwKK1tdLCBbd2l0aF9zeXNyb290PW5vXSkKKworZG5sIGx0X3N5c3Jvb3Qgd2lsbCBhbHdheXMgYmUgcGFzc2VkIHVucXVvdGVkLiAgV2UgcXVvdGUgaXQgaGVyZQorZG5sIGluIGNhc2UgdGhlIHVzZXIgcGFzc2VkIGEgZGlyZWN0b3J5IG5hbWUuCitsdF9zeXNyb290PQorY2FzZSAke3dpdGhfc3lzcm9vdH0gaW4gIygKKyB5ZXMpCisgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICBsdF9zeXNyb290PWAkQ0MgLS1wcmludC1zeXNyb290IDI+L2Rldi9udWxsYAorICAgZmkKKyAgIDs7ICMoCisgLyopCisgICBsdF9zeXNyb290PWBlY2hvICIkd2l0aF9zeXNyb290IiB8IHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICA7OyAjKAorIG5vfCcnKQorICAgOzsgIygKKyAqKQorICAgQUNfTVNHX1JFU1VMVChbJHt3aXRoX3N5c3Jvb3R9XSkKKyAgIEFDX01TR19FUlJPUihbVGhlIHN5c3Jvb3QgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoLl0pCisgICA7OworZXNhYworCisgQUNfTVNHX1JFU1VMVChbJHtsdF9zeXNyb290Oi1ub31dKQorX0xUX0RFQ0woW10sIFtsdF9zeXNyb290XSwgWzBdLCBbVGhlIHJvb3Qgd2hlcmUgdG8gc2VhcmNoIGZvciBdZG5sCitbZGVwZW5kZW50IGxpYnJhcmllcywgYW5kIGluIHdoaWNoIG91ciBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZC5dKV0pCisKKyMgX0xUX0VOQUJMRV9MT0NLCisjIC0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9FTkFCTEVfTE9DS10sCitbQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKKyAgICBbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgICAqRUxGLTMyKikKKwlIUFVYX0lBNjRfTU9ERT0iMzIiCisJOzsKKyAgICAgICpFTEYtNjQqKQorCUhQVVhfSUE2NF9NT0RFPSI2NCIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lICckTElORU5PJyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC0zMiIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qa2ZyZWVic2QqLWdudXx4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAorczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICA7OworCSAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisJICAgIDs7CisJICBzMzkweC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisJICAgIDs7CisJICBzcGFyYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICo2NC1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjRfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKwkgICAgOzsKKwkgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisJICAgIDs7CisJICBzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAorICAgIFtBQ19MQU5HX1BVU0goQykKKyAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLFtbXV0pXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSkKKyAgICAgQUNfTEFOR19QT1BdKQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7Oworc3BhcmMqLSpzb2xhcmlzKikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCisgICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKK10pIyBfTFRfRU5BQkxFX0xPQ0sKKworCisjIF9MVF9QUk9HX0FSCisjIC0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BST0dfQVJdLAorW0FDX0NIRUNLX1RPT0xTKEFSLCBbYXJdLCBmYWxzZSkKKzogJHtBUj1hcn0KKzogJHtBUl9GTEFHUz1jcnV9CitfTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKK19MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0sIFtGbGFncyB0byBjcmVhdGUgYW4gYXJjaGl2ZV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYXJjaGl2ZXIgQEZJTEUgc3VwcG9ydF0sIFtsdF9jdl9hcl9hdF9maWxlXSwKKyAgW2x0X2N2X2FyX2F0X2ZpbGU9bm8KKyAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLAorICAgICBbZWNobyBjb25mdGVzdC4kYWNfb2JqZXh0ID4gY29uZnRlc3QubHN0CisgICAgICBsdF9hcl90cnk9JyRBUiAkQVJfRkxBR1MgbGliY29uZnRlc3QuYSBAY29uZnRlc3QubHN0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCisgICAgICBBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKyAgICAgIGlmIHRlc3QgIiRhY19zdGF0dXMiIC1lcSAwOyB0aGVuCisJIyBFbnN1cmUgdGhlIGFyY2hpdmVyIGZhaWxzIHVwb24gYm9ndXMgZmlsZSBuYW1lcy4KKwlybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGxpYmNvbmZ0ZXN0LmEKKwlBQ19UUllfRVZBTChbbHRfYXJfdHJ5XSkKKwlpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtbmUgMDsgdGhlbgorICAgICAgICAgIGx0X2N2X2FyX2F0X2ZpbGU9QAorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0LiogbGliY29uZnRlc3QuYQorICAgICBdKQorICBdKQorCitpZiB0ZXN0ICJ4JGx0X2N2X2FyX2F0X2ZpbGUiID0geG5vOyB0aGVuCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0KK2Vsc2UKKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9jdl9hcl9hdF9maWxlCitmaQorX0xUX0RFQ0woW10sIFthcmNoaXZlcl9saXN0X3NwZWNdLCBbMV0sCisgIFtIb3cgdG8gZmVlZCBhIGZpbGUgbGlzdGluZyB0byB0aGUgYXJjaGl2ZXJdKQorXSkjIF9MVF9QUk9HX0FSCisKKworIyBfTFRfQ01EX09MRF9BUkNISVZFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX09MRF9BUkNISVZFXSwKK1tfTFRfUFJPR19BUgorCitBQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgorX0xUX0RFQ0woW10sIFtTVFJJUF0sIFsxXSwgW0Egc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtXSkKKworQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06CitfTFRfREVDTChbXSwgW1JBTkxJQl0sIFsxXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJG9sZGxpYiIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKK2ZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249eWVzIDs7CisgICopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPW5vIDs7Citlc2FjCitfTFRfREVDTChbXSwgW29sZF9wb3N0aW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX0RFQ0woW10sIFtvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKK19MVF9ERUNMKFtdLCBbbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uXSwgWzBdLAorICAgIFtXaGV0aGVyIHRvIHVzZSBhIGxvY2sgZm9yIG9sZCBhcmNoaXZlIGV4dHJhY3Rpb25dKQorXSkjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKworCisjIF9MVF9DT01QSUxFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjCQlbT1VUUFVULUZJTEVdLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9DT01QSUxFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgbTRfaWYoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitlbHNlCisgICAgbTRfaWYoWyQ2XSwgLCA6LCBbJDZdKQorZmkKK10pIyBfTFRfQ09NUElMRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbX0xUX0NPTVBJTEVSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW10pCisKKworIyBfTFRfTElOS0VSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmtlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfTElOS0VSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJDMiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAkMj15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgbTRfaWYoWyQ0XSwgLCA6LCBbJDRdKQorZWxzZQorICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKK2ZpCitdKSMgX0xUX0xJTktFUl9PUFRJT04KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbX0xUX0xJTktFUl9PUFRJT05dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbXSkKKworCisjIExUX0NNRF9NQVhfTEVOCisjLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfQ01EX01BWF9MRU5dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworQUNfTVNHX0NIRUNLSU5HKFt0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50c10pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19tYXhfY21kX2xlbl0sIFtkbmwKKyAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG1pbnQqKQorICAgICMgT24gTWlOVCB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3NmKikKKyAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKKyAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAorICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCisgICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0CisgICAgIworICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCisgICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgorICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKKyAgICA7OworICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCisgICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qW1sJIF1dLy8nYAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YChnZXRjb25mIEFSR19NQVgpIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgZWxzZQorICAgICAgIyBNYWtlIHRlc3RzdHJpbmcgYSBsaXR0bGUgYmlnZ2VyIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyB3aXRoIGl0LgorICAgICAgIyBhIDFLIHN0cmluZyBzaG91bGQgYmUgYSByZWFzb25hYmxlIHN0YXJ0LgorICAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDsgZG8KKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQorICAgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0CisgICAgICAjIHdlIGNhbid0IHRlbGwuCisgICAgICB3aGlsZSB7IHRlc3QgIlgiYGZ1bmNfZmFsbGJhY2tfZWNobyAiJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgICBkbworICAgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCisgICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQorICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworXSkKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkbHRfY3Zfc3lzX21heF9jbWRfbGVuKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorX0xUX0RFQ0woW10sIFttYXhfY21kX2xlbl0sIFswXSwKKyAgICBbV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kP10pCitdKSMgTFRfQ01EX01BWF9MRU4KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFtMVF9DTURfTUFYX0xFTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW10pCisKKworIyBfTFRfSEVBREVSX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfSEVBREVSX0RMRkNOXSwKK1tBQ19DSEVDS19IRUFERVJTKFtkbGZjbi5oXSwgW10sIFtdLCBbQUNfSU5DTFVERVNfREVGQVVMVF0pZG5sCitdKSMgX0xUX0hFQURFUl9ETEZDTgorCisKKyMgX0xUX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAorIyAgICAgICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRkFMU0UsIEFDVElPTi1JRi1DUk9TUy1DT01QSUxJTkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfVFJZX0RMT1BFTl9TRUxGXSwKK1ttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgWyQ0XQorZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitbI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9XQorX0xUX0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgJDMKKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCitdKSMgX0xUX1RSWV9ETE9QRU5fU0VMRgorCisKKyMgTFRfU1lTX0RMT1BFTl9TRUxGCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgXSkKKyAgICA7OworCisgICopCisgICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKKyAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSwKKwlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKKwkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKKwkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKKwkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCQkgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCJdLAorCSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCisJCSAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0pCisJICAgICAgXSkKKwkgICAgXSkKKwkgIF0pCisJXSkKKyAgICAgIF0pCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKKyAgICBdKQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMsIFtkbmwKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubywgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcykKKyAgICAgIF0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW2Rsb3Blbl9zdXBwb3J0XSwgW2VuYWJsZV9kbG9wZW5dLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWRdKQorX0xUX0RFQ0woW2Rsb3Blbl9zZWxmXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZfc3RhdGljXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWNdLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQorXSkjIExUX1NZU19ETE9QRU5fU0VMRgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbTFRfU1lTX0RMT1BFTl9TRUxGXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlci4KKyMgVGhpcyBtYWNybyBkb2VzIG5vdCBoYXJkIGNvZGUgdGhlIGNvbXBpbGVyIGxpa2UgQUNfUFJPR19DQ19DX08uCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0NfT10sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRFQ0hPICIkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCitdKQorX0xUX1RBR0RFQ0woW2NvbXBpbGVyX2Nfb10sIFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFsxXSwKKwlbRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zP10pCitdKSMgX0xUX0NPTVBJTEVSX0NfTworCisKKyMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1NdLAorW200X3JlcXVpcmUoW19MVF9FTkFCTEVfTE9DS10pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT01QSUxFUl9DX08oWyQxXSkKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKK19MVF9ERUNMKFtdLCBbbmVlZF9sb2Nrc10sIFsxXSwgW011c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uP10pCitdKSMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MKKworCisjIF9MVF9DSEVDS19PQkpESVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DSEVDS19PQkpESVJdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCitbcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCitvYmpkaXI9JGx0X2N2X29iamRpcgorX0xUX0RFQ0woW10sIFtvYmpkaXJdLCBbMF0sCisgICAgICAgICBbVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW0xUX09CSkRJUl0pZG5sCitBQ19ERUZJTkVfVU5RVU9URUQoTFRfT0JKRElSLCAiJGx0X2N2X29iamRpci8iLAorICBbRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy5dKQorXSkjIF9MVF9DSEVDS19PQkpESVIKKworCisjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEhdLAorW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCitfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQoraWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fAorICAgdGVzdCAtbiAiJF9MVF9UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwKKyAgIHRlc3QgIlgkX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKSIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCitmaQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQorCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbmsgfHwKKyAgIHRlc3QgIiRfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKSIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2FjdGlvbl0sIFswXSwKKyAgICBbSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGVdKQorXSkjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSAorCisKKyMgX0xUX0NNRF9TVFJJUExJQgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9TVFJJUExJQl0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgOzsKKyAgZXNhYworZmkKK19MVF9ERUNMKFtdLCBbb2xkX3N0cmlwbGliXSwgWzFdLCBbQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3RyaXBsaWJdLCBbMV0pCitdKSMgX0xUX0NNRF9TVFJJUExJQgorCisKKyMgX0xUX1NZU19EWU5BTUlDX0xJTktFUihbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCittNF9pZihbJDFdLAorCVtdLCBbCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgZGFyd2luKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LywvTFIvIiA7OworICAgICopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8iIDs7CisgIGVzYWMKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VkX3N0cmlwX2VxPSJzLD1cKFtbQS1aYS16XV06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAorICAgIDs7CisgICopCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgOzsKKyAgZXNhYworICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtbbHRfZm9vXV0rKzsgfQorICBpZiAobHRfZnJlcVtbbHRfZm9vXV0gPT0gMSkgeyBwcmludCBsdF9mb287IH0KK30nYAorICAjIEFXSyBwcm9ncmFtIGFib3ZlIGVycm9uZW91c2x5IHByZXBlbmRzICcvJyB0byBDOi9kb3MvcGF0aHMKKyAgIyBmb3IgdGhlc2UgaG9zdHMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfFwKKyAgICAgICRTRUQgJ3MsL1woW1tBLVphLXpdXTpcKSxcMSxnJ2AgOzsKKyAgZXNhYworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpXSkKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXhbWzQtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgcG93ZXJwYykKKyAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCisgICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIDs7CisgIG02OGspCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gZnVuY19lY2hvX2FsbCAiJGxpYiIgfCAkU0VEICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgICAgOzsKKyAgZXNhYworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpW1s0NV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKK200X2lmKFskMV0sIFtdLFsKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xpYi93MzJhcGkiXSkKKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY2VnY2MqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisKKyAgKixjbCopCisgICAgIyBOYXRpdmUgTVNWQworICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LmRsbC5saWInCisKKyAgICBjYXNlICRidWlsZF9vcyBpbgorICAgIG1pbmd3KikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0KKyAgICAgIGx0X3NhdmVfaWZzPSRJRlMKKyAgICAgIElGUz0nOycKKyAgICAgIGZvciBsdF9wYXRoIGluICRMSUIKKyAgICAgIGRvCisgICAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICAgIyBMZXQgRE9TIHZhcmlhYmxlIGV4cGFuc2lvbiBwcmludCB0aGUgc2hvcnQgOC4zIHN0eWxlIGZpbGUgbmFtZS4KKyAgICAgICAgbHRfcGF0aD1gY2QgIiRsdF9wYXRoIiAyPi9kZXYvbnVsbCAmJiBjbWQgLy9DICJmb3IgJWkgaW4gKCIuIikgZG8gQGVjaG8gJX5zaSJgCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAkbHRfcGF0aCIKKyAgICAgIGRvbmUKKyAgICAgIElGUz0kbHRfc2F2ZV9pZnMKKyAgICAgICMgQ29udmVydCB0byBNU1lTIHN0eWxlLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBzZWQgLWUgJ3N8XFxcXHwvfGcnIC1lICdzfCBcXChbW2EtekEtWl1dXFwpOnwgL1xcMXxnJyAtZSAnc3xeIHx8J2AKKyAgICAgIDs7CisgICAgY3lnd2luKikKKyAgICAgICMgQ29udmVydCB0byB1bml4IGZvcm0sIHRoZW4gdG8gZG9zIGZvcm0sIHRoZW4gYmFjayB0byB1bml4IGZvcm0KKyAgICAgICMgYnV0IHRoaXMgdGltZSBkb3Mgc3R5bGUgKG5vIHNwYWNlcyEpIHNvIHRoYXQgdGhlIHVuaXggZm9ybSBsb29rcworICAgICAgIyBsaWtlIC9jeWdkcml2ZS9jL1BST0dSQX4xOi9jeWdkci4uLgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRMSUIiYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLWRvcyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgMj4vZGV2L251bGxgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgOzsKKyAgICAqKQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkTElCIgorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgWyRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgICMgRklYTUU6IGZpbmQgdGhlIHNob3J0IG5hbWUgb3IgdGhlIHBhdGggY29tcG9uZW50cywgYXMgc3BhY2VzIGFyZQorICAgICAgIyBjb21tb24uIChlLmcuICJQcm9ncmFtIEZpbGVzIiAtPiAiUFJPR1JBfjEiKQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGluay5leGUnCisgICAgOzsKKworICAqKQorICAgICMgQXNzdW1lIE1TVkMgd3JhcHBlcgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworICBlc2FjCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKK200X2lmKFskMV0sIFtdLFsKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIl0pCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkW1sxMjNdXSopIG9iamZvcm1hdD1hb3V0IDs7CisgICAgKikgb2JqZm9ybWF0PWVsZiA7OworICAgIGVzYWMKKyAgZmkKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzItOV1dKiB8IGZyZWVic2RlbGYzLltbMi05XV0qIHwgXAorICBmcmVlYnNkNC5bWzAtNV1dIHwgZnJlZWJzZGVsZjQuW1swLTVdXSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgKikgIyBmcm9tIDQuNiBvbiwgYW5kIERyYWdvbkZseQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hhaWt1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIHJ1bnRpbWVfbG9hZGVyIgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy9ib290L2hvbWUvY29uZmlnL2xpYiAvYm9vdC9jb21tb24vbGliIC9ib290L3N5c3RlbS9saWInCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICBocHBhKjY0KikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUsIC4uLgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgIyBvciBmYWlscyBvdXRyaWdodCwgc28gb3ZlcnJpZGUgYXRvbWljYWxseToKKyAgaW5zdGFsbF9vdmVycmlkZV9tb2RlPTU1NQorICA7OworCitpbnRlcml4W1szLTldXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgQUNfQ0FDSEVfVkFMKFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGhdLAorICAgIFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICBzYXZlX2xpYmRpcj0kbGliZGlyCisgICAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpXCI7IFwKKwkgTERGTEFHUz1cIlwkTERGTEFHUyAkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSlcIiIKKyAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisgICAgICBbQVNfSUYoWyAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGxdLAorCSBbbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllc10pXSkKKyAgICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgICBsaWJkaXI9JHNhdmVfbGliZGlyCisgICAgXSkKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFxbJF0yKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcWyRdMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsJIF0qaHdjYXBbCSBdL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7cy8iLy9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2RlbGYqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bWzg5XV0gfCBvcGVuYnNkMi5bWzg5XV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3Jkb3MqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKyAgICBzaWVtZW5zKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3RwZiopCisgICMgVFBGIGlzIGEgY3Jvc3MtdGFyZ2V0IG9ubHkuICBQcmVmZXJyZWQgY3Jvc3MtaG9zdCA9IEdOVS9MaW51eC4KKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZHluYW1pY19saW5rZXJdKQordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKwordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCitmaQorCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYytzZXR9IiA9IHNldDsgdGhlbgorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCitmaQoraWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYytzZXR9IiA9IHNldDsgdGhlbgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIgorZmkKKworX0xUX0RFQ0woW10sIFt2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGlua10sIFsxXSwKKyAgICBbVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisgICAgcmVzdG9yZWQgYXQgbGluayB0aW1lXSkKK19MVF9ERUNMKFtdLCBbbmVlZF9saWJfcHJlZml4XSwgWzBdLAorICAgIFtEbyB3ZSBuZWVkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXM/XSkKK19MVF9ERUNMKFtdLCBbbmVlZF92ZXJzaW9uXSwgWzBdLCBbRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz9dKQorX0xUX0RFQ0woW10sIFt2ZXJzaW9uX3R5cGVdLCBbMF0sIFtMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZV0pCitfTFRfREVDTChbXSwgW3J1bnBhdGhfdmFyXSwgWzBdLCAgW1NoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZV0pCitfTFRfREVDTChbXSwgW3NobGlicGF0aF92YXJdLCBbMF0sW1NoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGVdKQorX0xUX0RFQ0woW10sIFtzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGhdLCBbMF0sCisgICAgW0lzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD9dKQorX0xUX0RFQ0woW10sIFtsaWJuYW1lX3NwZWNdLCBbMV0sIFtGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeF0pCitfTFRfREVDTChbXSwgW2xpYnJhcnlfbmFtZXNfc3BlY10sIFsxXSwKKyAgICBbW0xpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisgICAgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRV1dKQorX0xUX0RFQ0woW10sIFtzb25hbWVfc3BlY10sIFsxXSwKKyAgICBbW1RoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lXV0pCitfTFRfREVDTChbXSwgW2luc3RhbGxfb3ZlcnJpZGVfbW9kZV0sIFsxXSwKKyAgICBbUGVybWlzc2lvbiBtb2RlIG92ZXJyaWRlIGZvciBpbnN0YWxsYXRpb24gb2Ygc2hhcmVkIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3Bvc3RpbnN0YWxsX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmQgdG8gdXNlIGFmdGVyIGluc3RhbGxhdGlvbiBvZiBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9ERUNMKFtdLCBbcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kIHRvIHVzZSBhZnRlciB1bmluc3RhbGxhdGlvbiBvZiBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9ERUNMKFtdLCBbZmluaXNoX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeV0pCitfTFRfREVDTChbXSwgW2ZpbmlzaF9ldmFsXSwgWzFdLAorICAgIFtbQXMgImZpbmlzaF9jbWRzIiwgZXhjZXB0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0CisgICAgbm90IHNob3duXV0pCitfTFRfREVDTChbXSwgW2hhcmRjb2RlX2ludG9fbGlic10sIFswXSwKKyAgICBbV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N5c19saWJfc2VhcmNoX3BhdGhfc3BlY10sIFsyXSwKKyAgICBbQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNdLCBbMl0sCisgICAgW1J1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzXSkKK10pIyBfTFRfU1lTX0RZTkFNSUNfTElOS0VSCisKKworIyBfTFRfUEFUSF9UT09MX1BSRUZJWChUT09MKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pemUgc2hhcmVkIGxpYnJhcnkKK0FDX0RFRlVOKFtfTFRfUEFUSF9UT09MX1BSRUZJWF0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDFdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTUFHSUNfQ01ELAorW2Nhc2UgJE1BR0lDX0NNRCBpbgorW1tcXC8qXSB8ICA/OltcXC9dKl0pCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyopCisgIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2RubCAkYWNfZHVtbXkgZm9yY2VzIHNwbGl0dGluZyBvbiBjb25zdGFudCB1c2VyLXN1cHBsaWVkIHBhdGhzLgorZG5sIFBPU0lYLjIgd29yZCBzcGxpdHRpbmcgaXMgZG9uZSBvbmx5IG9uIHRoZSBvdXRwdXQgb2Ygd29yZCBleHBhbnNpb25zLAorZG5sIG5vdCBldmVyeSB3b3JkLiAgVGhpcyBjbG9zZXMgYSBsb25nc3RhbmRpbmcgc2ggc2VjdXJpdHkgaG9sZS4KKyAgYWNfZHVtbXk9Im00X2lmKFskMl0sICwgJFBBVEgsIFskMl0pIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kMTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJDEiCisgICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkiZmlsZV9tYWdpYyAiKikKKwkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiZmlsZV9tYWdpYyBcKC4qXCkiYAorCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCisJICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8CisJICAgICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCisqKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCisqKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKKyoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAorKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCisqKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91CisqKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCisqKiogYnVnLWxpYnRvb2xAZ251Lm9yZworCitfTFRfRU9GCisJICBmaSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgorICA7OworZXNhY10pCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJE1BR0lDX0NNRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitfTFRfREVDTChbXSwgW01BR0lDX0NNRF0sIFswXSwKKwkgW1VzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgd2l0aCAiZmlsZSJdKWRubAorXSkjIF9MVF9QQVRIX1RPT0xfUFJFRklYCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtfTFRfUEFUSF9UT09MX1BSRUZJWF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX1BBVEhfVE9PTF9QUkVGSVhdLCBbXSkKKworCisjIF9MVF9QQVRIX01BR0lDCisjIC0tLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbml6ZSBhIHNoYXJlZCBsaWJyYXJ5CittNF9kZWZ1bihbX0xUX1BBVEhfTUFHSUNdLAorW19MVF9QQVRIX1RPT0xfUFJFRklYKCR7YWNfdG9vbF9wcmVmaXh9ZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIF9MVF9QQVRIX1RPT0xfUFJFRklYKGZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCisgIGVsc2UKKyAgICBNQUdJQ19DTUQ9OgorICBmaQorZmkKK10pIyBfTFRfUEFUSF9NQUdJQworCisKKyMgTFRfUEFUSF9MRAorIyAtLS0tLS0tLS0tCisjIGZpbmQgdGhlIHBhdGhuYW1lIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKK0FDX0RFRlVOKFtMVF9QQVRIX0xEXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKWRubAorCitBQ19BUkdfV0lUSChbZ251LWxkXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1nbnUtbGRdLAorCVthc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgQDw6QGRlZmF1bHQ9bm9AOj5AXSldLAorICAgIFt0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXNdLAorICAgIFt3aXRoX2dudV9sZD1ub10pZG5sCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5ICRDQ10pCisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1tcXC9dXSogfCA/OltbXFwvXV0qKQorICAgICAgcmVfZGlyZWx0PScvW1teL11dW1teL11dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gJEVDSE8gIiRhY19wcm9nInwgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSAkRUNITyAiJGFjX3Byb2ciIHwgJEdSRVAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gJEVDSE8gJGFjX3Byb2d8ICRTRUQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCitlbHNlCisgIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQorZmkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX0xELAorW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgdmFyaWFudHMgb2YgR05VIGxkIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBjYXNlIGAiJGx0X2N2X3BhdGhfTEQiIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKyAgICAgICpHTlUqIHwgKid3aXRoIEJGRCcqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwk7OworICAgICAgKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpXSkKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTEQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQordGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKK19MVF9QQVRIX0xEX0dOVQorQUNfU1VCU1QoW0xEXSkKKworX0xUX1RBR0RFQ0woW10sIFtMRF0sIFsxXSwgW1RoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXNdKQorXSkjIExUX1BBVEhfTEQKKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQU1fUFJPR19MRF0sIFtMVF9QQVRIX0xEXSkKK0FVX0FMSUFTKFtBQ19QUk9HX0xEXSwgW0xUX1BBVEhfTERdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX0xEXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1BST0dfTERdLCBbXSkKKworCisjIF9MVF9QQVRIX0xEX0dOVQorIy0gLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfUEFUSF9MRF9HTlVdLAorW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGx0X2N2X3Byb2dfZ251X2xkLAorWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkcyBvbmx5IGFjY2VwdCAtdi4KK2Nhc2UgYCRMRCAtdiAyPiYxIDwvZGV2L251bGxgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCisgIDs7CisqKQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworICA7OworZXNhY10pCit3aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKK10pIyBfTFRfUEFUSF9MRF9HTlUKKworCisjIF9MVF9DTURfUkVMT0FECisjIC0tLS0tLS0tLS0tLS0tCisjIGZpbmQgcmVsb2FkIGZsYWcgZm9yIGxpbmtlcgorIyAgIC0tIFBPUlRNRSBTb21lIGxpbmtlcnMgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCittNF9kZWZ1bihbX0xUX0NNRF9SRUxPQURdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzXSwKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWcsCisgIFtsdF9jdl9sZF9yZWxvYWRfZmxhZz0nLXInXSkKK3JlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZworY2FzZSAkcmVsb2FkX2ZsYWcgaW4KKyIiIHwgIiAiKikgOzsKKyopIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIiA7OworZXNhYworcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz1mYWxzZQorICAgIGZpCisgICAgOzsKKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGVsc2UKKyAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBmaQorICAgIDs7Citlc2FjCitfTFRfVEFHREVDTChbXSwgW3JlbG9hZF9mbGFnXSwgWzFdLCBbSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlc10pZG5sCitfTFRfVEFHREVDTChbXSwgW3JlbG9hZF9jbWRzXSwgWzJdKWRubAorXSkjIF9MVF9DTURfUkVMT0FECisKKworIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGNoZWNrIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9DSEVDS19NQUdJQ19NRVRIT0RdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKQorQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllc10sCitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKK1tsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXhbWzQtOV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICA7OworCitjeWd3aW4qKQorICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgOzsKKworbWluZ3cqIHwgcHczMiopCisgICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcsCisgICMgdW5sZXNzIHdlIGZpbmQgJ2ZpbGUnLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHdlIGFyZSBjcm9zcy1jb21waWxpbmcuCisgICMgZnVuY193aW4zMl9saWJpZCBhc3N1bWVzIEJTRCBubSwgc28gZGlzYWxsb3cgaXQgaWYgdXNpbmcgTVMgZHVtcGJpbi4KKyAgaWYgKCB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJCU0Qgbm0iICYmIGZpbGUgLyApID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIGVsc2UKKyAgICAjIEtlZXAgdGhpcyBwYXR0ZXJuIGluIHN5bmMgd2l0aCB0aGUgb25lIGluIGZ1bmNfd2luMzJfbGliaWQuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgKHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/fHBlLWFybS13aW5jZXxwZS14ODYtNjQpJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgZmkKKyAgOzsKKworY2VnY2MqKQorICAjIHVzZSB0aGUgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLiBTZWUgbWluZ3cqLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZS1hcm0tLipsaXR0bGUoLiphcmNoaXRlY3R1cmU6IGFybSk/JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbWzMtOV1dODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hhaWt1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKiB8IGhwdXgxMSopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18RUxGLVtbMC05XV1bWzAtOV1dKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgW2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRlsgLV1bMC05XVswLTldKSgtYml0KT8oIFtMTV1TQik/IHNoYXJlZCBvYmplY3QoIGZpbGUpP1ssIC1dKiBQQS1SSVNDIFswLTldXC5bMC05XSddCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxQQS1SSVNDW1swLTldXVwuW1swLTldXSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworaW50ZXJpeFtbMy05XV0qKQorICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298XC5hKSQnCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJExEIGluCisgICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKKyAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKKyAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICBlc2FjCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworKm50byogfCAqcW54KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8XC5zb3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBmaQorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3Jkb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgIG1vdG9yb2xhKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNW1swLTldXVtbMC05XV0qIFZlcnNpb24gW1swLTldXScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKKyAgICA7OworICBuY3IpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBzZXF1ZW50KQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgICA7OworICBzbmkpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiBkeW5hbWljIGxpYiIKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgICA7OworICBzaWVtZW5zKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgcGMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBlc2FjCisgIDs7CisKK3RwZiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7Citlc2FjCitdKQorCitmaWxlX21hZ2ljX2dsb2I9Cit3YW50X25vY2FzZWdsb2I9bm8KK2lmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgbWluZ3cqIHwgcHczMiopCisgICAgaWYgKCBzaG9wdCB8IGdyZXAgbm9jYXNlZ2xvYiApID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgd2FudF9ub2Nhc2VnbG9iPXllcworICAgIGVsc2UKKyAgICAgIGZpbGVfbWFnaWNfZ2xvYj1gZWNobyBhQWJCY0NkRGVFZkZnR2hIaUlqSmtLbExtTW5Ob09wUHFRclJzU3RUdVV2VndXeFh5WXpaIHwgJFNFRCAtZSAicy9cKC4uXCkvc1wvW1tcMV1dXC9bW1wxXV1cL2c7L2ciYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworZmkKKworZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorCitfTFRfREVDTChbXSwgW2RlcGxpYnNfY2hlY2tfbWV0aG9kXSwgWzFdLAorICAgIFtNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0c10pCitfTFRfREVDTChbXSwgW2ZpbGVfbWFnaWNfY21kXSwgWzFdLAorICAgIFtDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiXSkKK19MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19nbG9iXSwgWzFdLAorICAgIFtIb3cgdG8gZmluZCBwb3RlbnRpYWwgZmlsZXMgd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIl0pCitfTFRfREVDTChbXSwgW3dhbnRfbm9jYXNlZ2xvYl0sIFsxXSwKKyAgICBbRmluZCBwb3RlbnRpYWwgZmlsZXMgdXNpbmcgbm9jYXNlZ2xvYiB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiXSkKK10pIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECisKKworIyBMVF9QQVRIX05NCisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gYSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKK0FDX0RFRlVOKFtMVF9QQVRIX05NXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSldLCBsdF9jdl9wYXRoX05NLAorW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgorICBmaQorICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKKyAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKwkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKwkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKwljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCisJICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCSAgYnJlYWsKKwkgIDs7CisJKikKKwkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSAgKi9kZXYvbnVsbCopCisJICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJICAgIGJyZWFrCisJICAgIDs7CisJICAqKQorCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgZG9uZQorICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KK2ZpXSkKK2lmIHRlc3QgIiRsdF9jdl9wYXRoX05NIiAhPSAibm8iOyB0aGVuCisgIE5NPSIkbHRfY3ZfcGF0aF9OTSIKK2Vsc2UKKyAgIyBEaWRuJ3QgZmluZCBhbnkgQlNEIGNvbXBhdGlibGUgbmFtZSBsaXN0ZXIsIGxvb2sgZm9yIGR1bXBiaW4uCisgIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbiA6CisgICAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGVsc2UKKyAgICBBQ19DSEVDS19UT09MUyhEVU1QQklOLCBbZHVtcGJpbiAibGluayAtZHVtcCJdLCA6KQorICAgIGNhc2UgYCREVU1QQklOIC1zeW1ib2xzIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisgICAgKkNPRkYqKQorICAgICAgRFVNUEJJTj0iJERVTVBCSU4gLXN5bWJvbHMiCisgICAgICA7OworICAgICopCisgICAgICBEVU1QQklOPToKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBBQ19TVUJTVChbRFVNUEJJTl0pCisgIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KKyAgICBOTT0iJERVTVBCSU4iCisgIGZpCitmaQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQorQUNfU1VCU1QoW05NXSkKK19MVF9ERUNMKFtdLCBbTk1dLCBbMV0sIFtBIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3Rlcl0pZG5sCisKK0FDX0NBQ0hFX0NIRUNLKFt0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlXSwgW2x0X2N2X25tX2ludGVyZmFjZV0sCisgIFtsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkYWNfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAoZXZhbCAiJGFjX2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogb3V0cHV0XCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIGNhdCBjb25mdGVzdC5vdXQgPiZBU19NRVNTQUdFX0xPR19GRAorICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqXSkKK10pIyBMVF9QQVRIX05NCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTk1dLCBbTFRfUEFUSF9OTV0pCitBVV9BTElBUyhbQUNfUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19OTV0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX05NXSwgW10pCisKKyMgX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKKyMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgbGluayBsaWJyYXJ5LgorIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9DSEVDS19TSEFSRURMSUJfRlJPTV9MSU5LTElCXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX0RMTFRPT0xdKQorQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXNdLAorbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQsCitbbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9J3Vua25vd24nCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgIyB0d28gZGlmZmVyZW50IHNoZWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGx0bWFpbi5zaAorICAjIGRlY2lkZSB3aGljaCB0byB1c2UgYmFzZWQgb24gY2FwYWJpbGl0aWVzIG9mICRETExUT09MCisgIGNhc2UgYCRETExUT09MIC0taGVscCAyPiYxYCBpbgorICAqLS1pZGVudGlmeS1zdHJpY3QqKQorICAgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPWZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYgorICAgIDs7CisgICopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrCisgICAgOzsKKyAgZXNhYworICA7OworKikKKyAgIyBmYWxsYmFjazogYXNzdW1lIGxpbmtsaWIgSVMgc2hhcmVkbGliCisgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSIkRUNITyIKKyAgOzsKK2VzYWMKK10pCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKK3Rlc3QgLXogIiRzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgJiYgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JEVDSE8KKworX0xUX0RFQ0woW10sIFtzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZF0sIFsxXSwKKyAgICBbQ29tbWFuZCB0byBhc3NvY2lhdGUgc2hhcmVkIGFuZCBsaW5rIGxpYnJhcmllc10pCitdKSMgX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUIKKworCisjIF9MVF9QQVRIX01BTklGRVNUX1RPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsb2NhdGUgdGhlIG1hbmlmZXN0IHRvb2wKK200X2RlZnVuKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSwKK1tBQ19DSEVDS19UT09MKE1BTklGRVNUX1RPT0wsIG10LCA6KQordGVzdCAteiAiJE1BTklGRVNUX1RPT0wiICYmIE1BTklGRVNUX1RPT0w9bXQKK0FDX0NBQ0hFX0NIRUNLKFtpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2xdLCBbbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sXSwKKyAgW2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogJE1BTklGRVNUX1RPT0wgJy0/JyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAkTUFOSUZFU1RfVE9PTCAnLT8nIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0CisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICBpZiAkR1JFUCAnTWFuaWZlc3QgVG9vbCcgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPXllcworICBmaQorICBybSAtZiBjb25mdGVzdCpdKQoraWYgdGVzdCAieCRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiICE9IHh5ZXM7IHRoZW4KKyAgTUFOSUZFU1RfVE9PTD06CitmaQorX0xUX0RFQ0woW10sIFtNQU5JRkVTVF9UT09MXSwgWzFdLCBbTWFuaWZlc3QgdG9vbF0pZG5sCitdKSMgX0xUX1BBVEhfTUFOSUZFU1RfVE9PTAorCisKKyMgTFRfTElCX00KKyMgLS0tLS0tLS0KKyMgY2hlY2sgZm9yIG1hdGggbGlicmFyeQorQUNfREVGVU4oW0xUX0xJQl9NXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitMSUJNPQorY2FzZSAkaG9zdCBpbgorKi0qLWJlb3MqIHwgKi0qLWNlZ2NjKiB8ICotKi1jeWd3aW4qIHwgKi0qLWhhaWt1KiB8ICotKi1wdzMyKiB8ICotKi1kYXJ3aW4qKQorICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0sIG9yIGRvbid0IG5lZWQgaXQKKyAgOzsKKyotbmNyLXN5c3Y0LjMqKQorICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iJExJQk0gLWxtIikKKyAgOzsKKyopCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09Ii1sbSIpCisgIDs7Citlc2FjCitBQ19TVUJTVChbTElCTV0pCitdKSMgTFRfTElCX00KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19DSEVDS19MSUJNXSwgW0xUX0xJQl9NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfQ0hFQ0tfTElCTV0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX05PX1JUVEkoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX05PX1JUVEldLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIG52Y2MqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1YY29tcGlsZXIgLWZuby1idWlsdGluJyA7OworICAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicgOzsKKyAgZXNhYworCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucywKKyAgICBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQorZmkKK19MVF9UQUdERUNMKFtub19idWlsdGluX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbMV0sCisJW0NvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnNdKQorXSkjIF9MVF9DT01QSUxFUl9OT19SVFRJCisKKworIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3RdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwKK1sKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW1tCQ0RUXV0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHN5bWNvZGU9J1tbQUJDREdJU1RXXV0nCisgIDs7CitocHV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbW0FCQ0RFR1JTVF1dJworICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisgIDs7Citvc2YqKQorICBzeW1jb2RlPSdbW0JDREVHUVJTVF1dJworICA7Oworc29sYXJpcyopCisgIHN5bWNvZGU9J1tbQkRSVF1dJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NC4ydXcyKikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgc3ltY29kZT0nW1tBQkRUXV0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW1tERk5TVFVdXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScgOzsKK2VzYWMKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbi4KKyMgU29tZSBzeXN0ZW1zIChlc3AuIG9uIGlhNjQpIGxpbmsgZGF0YSBhbmQgY29kZSBzeW1ib2xzIGRpZmZlcmVudGx5LAorIyBzbyB1c2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpW1sgXV0qJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXClbWyBdXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwobGliW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YCRFQ0hPICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJzY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICAgICMgRmFrZSBpdCBmb3IgZHVtcGJpbiBhbmQgc2F5IFQgZm9yIGFueSBub24tc3RhdGljIGZ1bmN0aW9uCisgICAgIyBhbmQgRCBmb3IgYW55IGdsb2JhbCB2YXJpYWJsZS4KKyAgICAjIEFsc28gZmluZCBDKysgYW5kIF9fZmFzdGNhbGwgc3ltYm9scyBmcm9tIE1TVkMrKywKKyAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgWyciXAorIiAgICAge2xhc3Rfc2VjdGlvbj1zZWN0aW9uOyBzZWN0aW9uPVwkIDN9OyJcCisiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKKyIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCisiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCisiICAgICB7aWYoaGlkZVtzZWN0aW9uXSkgbmV4dH07IlwKKyIgICAgIHtmPTB9OyBcJCAwfi9cKFwpLipcfC97Zj0xfTsge3ByaW50ZiBmID8gXCJUIFwiIDogXCJEIFwifTsiXAorIiAgICAge3NwbGl0KFwkIDAsIGEsIC9cfHxcci8pOyBzcGxpdChhWzJdLCBzKX07IlwKKyIgICAgIHNbMV1+L15bQD9dL3twcmludCBzWzFdLCBzWzFdOyBuZXh0fTsiXAorIiAgICAgc1sxXX5wcmZ4IHtzcGxpdChzWzFdLHQsXCJAXCIpOyBwcmludCB0WzFdLCBzdWJzdHIodFsxXSxsZW5ndGgocHJmeCkpfSJcCisiICAgICAnIHByZng9XiRhY19zeW1wcmZ4XSIKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWwkgXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWwkgXV1bWwkgXV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisgIGZpCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICcvIF9fZ251X2x0by9kJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitfTFRfRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiBcPiAkbmxpc3QpICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgJEdSRVAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiAkR1JFUCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PF9MVF9FT0YgPiBjb25mdGVzdC4kYWNfZXh0CisvKiBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIGJldHdlZW4gbGlidG9vbC5tNCwgbHRtYWluLCBsdF9zeXN0ZW0uaCwgYW5kIHRlc3RzLiAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlIHJ1bnRpbWUKKyAgIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbiBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8KKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVAorI2VsaWYgZGVmaW5lZChfX29zZl9fKQorLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YS4gICovCisjIGRlZmluZSBMVEAmdEBfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVEAmdEBfRExTWU1fQ09OU1QgY29uc3QKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19MVF9FT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCisKKwkgIGNhdCA8PF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCitMVEAmdEBfRExTWU1fQ09OU1Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAgICAgICAqYWRkcmVzczsKK30KK2x0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHNbW11dID0KK3sKKyAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAorX0xUX0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorX0xUX0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfZ2xvYnN5bV9zYXZlX0xJQlM9JExJQlMKKwkgIGx0X2dsb2JzeW1fc2F2ZV9DRkxBR1M9JENGTEFHUworCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0kbHRfZ2xvYnN5bV9zYXZlX0xJQlMKKwkgIENGTEFHUz0kbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUworCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoZmFpbGVkKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG9rKQorZmkKKworIyBSZXNwb25zZSBmaWxlIHN1cHBvcnQuCitpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2VsaWYgJE5NIC0taGVscCAyPi9kZXYvbnVsbCB8IGdyZXAgJ1tbQF1dRklMRScgPi9kZXYvbnVsbDsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2ZpCisKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3BpcGVdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sIFsxXSwKKyAgICBbVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lc10pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXJdKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkXSkKK19MVF9ERUNMKFtdLCBbbm1fZmlsZV9saXN0X3NwZWNdLCBbMV0sCisgICAgW1NwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlcyBmb3IgJE5NXSkKK10pICMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUworCisKKyMgX0xUX0NPTVBJTEVSX1BJQyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9QSUNdLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisKK200X2lmKFskMV0sIFtDWFhdLCBbCisgICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisgICAgbWluZ3cqIHwgY3lnd2luKiB8IG9zMiogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisgICAgKmRqZ3BwKikKKyAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgICAgOzsKKyAgICBoYWlrdSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCisgICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisgICAgICA7OworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciA2NC1iaXQgUEEgSFAtVVgsIGJ1dCBub3QgZm9yIDMyLWJpdAorICAgICAgIyBQQSBIUC1VWC4gIE9uIElBNjQgSFAtVVgsIFBJQyBpcyB0aGUgZGVmYXVsdCBidXQgdGhlIHBpYyBmbGFnCisgICAgICAjIHNldHMgdGhlIGRlZmF1bHQgVExTIG1vZGVsIGFuZCBhZmZlY3RzIGlubGluaW5nLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqKQorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKnFueCogfCAqbnRvKikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXhbWzQtOV1dKikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCWVsc2UKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCisJICA7OworCWVzYWMKKwk7OworICAgICAgbWluZ3cqIHwgY3lnd2luKiB8IG9zMiogfCBwdzMyKiB8IGNlZ2NjKikKKwkjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisJIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKwltNF9pZihbJDFdLCBbR0NKXSwgW10sCisJICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKwk7OworICAgICAgZGd1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGVjKysqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICA7OworCSAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBocHBhKjY0KnxpYTY0KikKKwkgICAgICAjICtaIHRoZSBkZWZhdWx0CisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBpbnRlcml4KikKKwkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKKwkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/CisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICA7OworCSAgZWNwYyogKQorCSAgICAjIG9sZCBJbnRlbCBDKysgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBpY3BjKiApCisJICAgICMgSW50ZWwgQysrLCB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKwkgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBwZ0NDKiB8IHBnY3BwKikKKwkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgIHhsYyogfCB4bEMqIHwgYmd4bFtbY0NdXSogfCBtcGl4bFtbY0NdXSopCisJICAgICMgSUJNIFhMIDguMCwgOS4wIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqIHwgbmV0YnNkZWxmKi1nbnUpCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworCTs7CisgICAgZXNhYworICBmaQorXSwKK1sKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBoYWlrdSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCisgICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1YbGlua2VyICcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVhjb21waWxlciAtZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisgICAgICBlY2MqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBpY2MgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisgICAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KKyAgICAgIGljYyogfCBpZm9ydCopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIExhaGV5IEZvcnRyYW4gOC4xLgorICAgICAgbGY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctLXNoYXJlZCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy0tc3RhdGljJworCTs7CisgICAgICBuYWdmb3IqKQorCSMgTkFHIEZvcnRyYW4gY29tcGlsZXIKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLC1XbCwsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCTs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCTs7CisgICAgICAqKQorCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEYqIHwgKlN1bipGb3J0cmFuKikKKwkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9JycKKwkgIDs7CisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KiB8IHN1bmY3NyogfCBzdW5mOTAqIHwgc3VuZjk1KikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICA7OworICAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pIgorICAgIDs7Citlc2FjCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSldKQorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSRfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgd29ya3NdLAorICAgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSldLAorICAgIFskX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKKyAgICBbY2FzZSAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKKyAgICAgZXNhY10sCisgICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCitmaQorX0xUX1RBR0RFQ0woW3BpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgWzFdLAorCVtBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHNdKQorCitfTFRfVEFHREVDTChbd2xdLCBbbHRfcHJvZ19jb21waWxlcl93bF0sIFsxXSwKKwlbSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlcl0pCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpXCIKK19MVF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sCisgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsICQxKSwKKyAgJGx0X3RtcF9zdGF0aWNfZmxhZywKKyAgW10sCisgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9XSkKK19MVF9UQUdERUNMKFtsaW5rX3N0YXRpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgWzFdLAorCVtDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nXSkKK10pIyBfTFRfQ09NUElMRVJfUElDCisKKworIyBfTFRfTElOS0VSX1NITElCUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX1NITElCU10sCitbQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK200X3JlcXVpcmUoW19MVF9QQVRIX01BTklGRVNUX1RPT0xdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK200X2lmKFskMV0sIFtDWFhdLCBbCisgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQorICBjYXNlICRob3N0X29zIGluCisgIGFpeFtbNC05XV0qKQorICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKyAgICAjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwgZGVmaW5lZAorICAgICMgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisgICAgaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGZpCisgICAgOzsKKyAgcHczMiopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9IiRsdGRsbF9jbWRzIgorICAgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBjbCopIDs7CisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvO3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZSddCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBsaW51eCogfCBrKmJzZCotZ251IHwgZ251KikKKyAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT1ubworICAgIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgICA7OworICBlc2FjCitdLCBbCisgIHJ1bnBhdGhfdmFyPQorICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBfTFRfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgIyBFeGNsdWRlIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBzeW1ib2xzLgorZG5sIE5vdGUgYWxzbyBhZGp1c3QgZXhjbHVkZV9leHBzeW1zIGZvciBDKysgYWJvdmUuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBnbnUqKQorICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisKKyAgIyBPbiBzb21lIHRhcmdldHMsIEdOVSBsZCBpcyBjb21wYXRpYmxlIGVub3VnaCB3aXRoIHRoZSBuYXRpdmUgbGlua2VyCisgICMgdGhhdCB3ZSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBuYXRpdmUgaW50ZXJmYWNlIGZvciBib3RoLgorICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT1ubworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4KikKKwkjIFRoZSBBSVggcG9ydCBvZiBHTlUgbGQgaGFzIGFsd2F5cyBhc3BpcmVkIHRvIGNvbXBhdGliaWxpdHkKKwkjIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIuICBIb3dldmVyLCBhcyB0aGUgd2FybmluZyBpbiB0aGUgR05VIGxkCisJIyBibG9jayBzYXlzLCB2ZXJzaW9ucyBiZWZvcmUgMi4xOS41KiBjb3VsZG4ndCByZWFsbHkgY3JlYXRlIHdvcmtpbmcKKwkjIHNoYXJlZCBsaWJyYXJpZXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGludGVyZmFjZSB1c2VkLgorCWNhc2UgYCRMRCAtdiAyPiYxYCBpbgorCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIDIuMTkuNSopIDs7CisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi5bWzItOV1dKikgOzsKKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCBbWzMtOV1dKikgOzsKKwkgICopCisJICAgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwk7OworICAgIGVzYWMKKyAgZmkKKworICBpZiB0ZXN0ICIkbHRfdXNlX2dudV9sZF9pbnRlcmZhY2UiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICpHTlVcIGdvbGQqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeFtbMy05XV0qKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi4xOSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIGJpbnV0aWxzCisqKiogMi4yMCBvciBhYm92ZSwgb3IgbW9kaWZ5IHlvdXIgUEFUSCBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQuCisqKiogWW91IHdpbGwgdGhlbiBuZWVkIHRvIHJlc3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4KKworX0xUX0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWFsbC1zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvO3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZSddCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaGFpa3UqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICB0bXBfZGlldD1ubworICAgICAgaWYgdGVzdCAiJGhvc3Rfb3MiID0gbGludXgtZGlldGxpYmM7IHRoZW4KKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZGlldFwgKikgdG1wX2RpZXQ9eWVzOzsJIyBsaW51eC1kaWV0bGliYyB3aXRoIHN0YXRpYyBsaW5raW5nICghZGlldC1keW4pCisJZXNhYworICAgICAgZmkKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRFR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsIFwKKwkgJiYgdGVzdCAiJHRtcF9kaWV0IiA9IG5vCisgICAgICB0aGVuCisJdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnCisJY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCisgICAgICAgIHBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqIHwgcGdmb3J0cmFuKikKKwkJCQkJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKKwllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWxmOTUqKQkJCQkjIExhaGV5IEZvcnRyYW4gOC4xCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisJICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7CisJeGxbW2NDXV0qIHwgYmd4bFtbY0NdXSogfCBtcGl4bFtbY0NdXSopICMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKKwkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJworCSAgdG1wX2FkZGZsYWc9IDs7CisJbnZjYyopCSMgQ3VkYSBDb21waWxlciBEcml2ZXIgMi4yCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJZXNhYworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKyAgICAgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgICBmaQorCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwl4bGYqIHwgYmdmKiB8IGJneGxmKiB8IG1waXhsZiopCisJICAjIElCTSBYTCBGb3J0cmFuIDEwLjEgb24gUFBDIGNhbm5vdCBjcmVhdGUgc2hhcmVkIGxpYnMgaXRzZWxmCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAtLW5vLXdob2xlLWFyY2hpdmUnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPSctcnBhdGggJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFtbNC05XV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwkjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwKKwkjIGRlZmluZWQgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPW5vCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKwkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisJIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBlbHNlCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgIGZpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVtbNDVdXSopCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjbCopCisJIyBOYXRpdmUgTVNWQworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCV9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPSdAJworCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgc2VkIC1uIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgLWUgJzFcXFwhcCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGVsc2UKKwkgICAgc2VkIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgIGZpfgorCSAgJENDIC1vICR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAiQCR0b29sX291dHB1dF9vYmpkaXIkc29uYW1lLmV4cCIgLVdsLC1ETEwsLUlNUExJQjoiJHRvb2xfb3V0cHV0X29iamRpciRsaWJuYW1lLmRsbC5saWIifgorCSAgbGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJIyBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwlfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSxEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dW1sgXV0vcy8uKltbIF1dLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisJIyBEb24ndCB1c2UgcmFubGliCisJX0xUX1RBR1ZBUihvbGRfcG9zdGluc3RhbGxfY21kcywgJDEpPSdjaG1vZCA2NDQgJG9sZGxpYicKKwlfTFRfVEFHVkFSKHBvc3RsaW5rX2NtZHMsICQxKT0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgIGNhc2UgJGx0X291dHB1dGZpbGUgaW4KKwkgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICopCisJICAgICAgbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCSAgICAgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iJGx0X3Rvb2xfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgOzsKKwkgIGVzYWN+CisJICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAkUk0gIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsKKwkgIGZpJworCTs7CisgICAgICAqKQorCSMgQXNzdW1lIE1TVkMgd3JhcHBlcgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisJbGliZXh0PWxpYgorCSMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCXNocmV4dF9jbWRzPSIuZGxsIgorCSMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGZ1bmNfZWNob19hbGwgIiRkZXBsaWJzIiB8ICRTRUQgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorCV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworCSMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisJX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKwlfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJbTRfaWYoJDEsIFtdLCBbCisJICAjIE9sZGVyIHZlcnNpb25zIG9mIHRoZSAxMS4wMCBjb21waWxlciBkbyBub3QgdW5kZXJzdGFuZCAtYiB5ZXQKKwkgICMgKEhQOTI0NTMtMDEgQS4xMS4wMS4yMCBkb2Vzbid0LCBIUDkyNDUzLTAxIEIuMTEuWC4zNTE3NS0zNTE3Ni5HUCBkb2VzKQorCSAgX0xUX0xJTktFUl9PUFRJT04oW2lmICRDQyB1bmRlcnN0YW5kcyAtYl0sCisJICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9fYiwgJDEpLCBbLWJdLAorCSAgICBbX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnXSwKKwkgICAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnXSldLAorCSAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJ10pCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkjIFRyeSB0byB1c2UgdGhlIC1leHBvcnRlZF9zeW1ib2wgbGQgb3B0aW9uLCBpZiBpdCBkb2VzIG5vdAorCSMgd29yaywgYXNzdW1lIHRoYXQgLWV4cG9ydHNfZmlsZSBkb2VzIG5vdCB3b3JrIGVpdGhlciBhbmQKKwkjIGltcGxpY2l0bHkgZXhwb3J0IGFsbCBzeW1ib2xzLgorCSMgVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBsYW5ndWFnZXMsIHNvIG5vIHBlci10YWcgY2FjaGUgdmFyaWFibGUuCisJQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlICRob3N0X29zIGxpbmtlciBhY2NlcHRzIC1leHBvcnRlZF9zeW1ib2xdLAorCSAgW2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sXSwKKwkgIFtzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorCSAgIExERkxBR1M9IiRMREZMQUdTIC1zaGFyZWQgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sICR7d2x9Zm9vICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfS9kZXYvbnVsbCIKKwkgICBBQ19MSU5LX0lGRUxTRSgKKwkgICAgIFtBQ19MQU5HX1NPVVJDRSgKKwkgICAgICAgIFtBQ19MQU5HX0NBU0UoW0NdLCBbW2ludCBmb28gKHZvaWQpIHsgcmV0dXJuIDA7IH1dXSwKKwkJCSAgICAgIFtDKytdLCBbW2ludCBmb28gKHZvaWQpIHsgcmV0dXJuIDA7IH1dXSwKKwkJCSAgICAgIFtGb3J0cmFuIDc3XSwgW1sKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBlbmRdXSwKKwkJCSAgICAgIFtGb3J0cmFuXSwgW1sKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBlbmRdXSldKV0sCisJICAgICAgW2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPXllc10sCisJICAgICAgW2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPW5vXSkKKyAgICAgICAgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyJdKQorCWlmIHRlc3QgIiRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAke3dsfS1leHBvcnRzX2ZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLWV4cG9ydHNfZmlsZSAkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKiB8IG5ldGJzZGVsZiotZ251KQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCWlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJZWxzZQorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgIG9wZW5ic2RbWzAxXV0uKiB8IG9wZW5ic2QyLltbMC03XV0gfCBvcGVuYnNkMi5bWzAtN11dLiopCisJICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgIDs7CisJICAgKikKKwkgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICAgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgb3MyKikKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJEVDSE8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBwcmludGYgIiVzXFxuIiAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkkQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgJGNvbXBpbGVyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRSTSAkbGliLmV4cCcKKworCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16IGRlZnMnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCXdsYXJjPScke3dsfScKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworICAgICAgZWxzZQorCWNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSoiQ29tcGlsZXJzIDUuMCIqKQorCSAgd2xhcmM9JycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJKikKKwkgIHdsYXJjPScke3dsfScKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJsYXJnZWR5bnN5bScKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCitdKQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQordGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitfTFRfVEFHVkFSKHdpdGhfZ251X2xkLCAkMSk9JHdpdGhfZ251X2xkCisKK19MVF9ERUNMKFtdLCBbbGliZXh0XSwgWzBdLCBbT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpXSlkbmwKK19MVF9ERUNMKFtdLCBbc2hyZXh0X2NtZHNdLCBbMV0sIFtTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKV0pZG5sCitfTFRfREVDTChbXSwgW2V4dHJhY3RfZXhwc3ltc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSwKKwlbbHRfY3ZfXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSwKKwlbJFJNIGNvbmZ0ZXN0KgorCWVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisJaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IHRoZW4KKwkgIHNvbmFtZT1jb25mdGVzdAorCSAgbGliPWNvbmZ0ZXN0CisJICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgIGRlcGxpYnM9CisJICB3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKwkgIHBpY19mbGFnPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKwkgIGNvbXBpbGVyX2ZsYWdzPS12CisJICBsaW5rZXJfZmxhZ3M9LXYKKwkgIHZlcnN0cmluZz0KKwkgIG91dHB1dF9vYmpkaXI9LgorCSAgbGlibmFtZT1jb25mdGVzdAorCSAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisJICBpZiBBQ19UUllfRVZBTChfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorCSAgdGhlbgorCSAgICBsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCSAgZWxzZQorCSAgICBsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgIGZpCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKwlmaQorCSRSTSBjb25mdGVzdCoKKwldKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSRsdF9jdl9bXV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK19MVF9UQUdERUNMKFtidWlsZF9saWJ0b29sX25lZWRfbGNdLCBbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbMF0sCisgICAgW1doZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXNdKQorX0xUX1RBR0RFQ0woW2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lc10sCisgICAgW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbMF0sCisgICAgW1doZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWNdKQorX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbMV0sCisgICAgW0NvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnNdKQorX0xUX1RBR0RFQ0woW10sIFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzXSkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbmVlZHNfb2JqZWN0XSwgWzFdLAorICAgIFtXaGV0aGVyIHRoZSBjb21waWxlciBjb3BlcyB3aXRoIHBhc3Npbmcgbm8gb2JqZWN0cyBkaXJlY3RseV0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbMl0sCisgICAgW0NyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFsyXSwKKyAgICBbQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbYXJjaGl2ZV9jbWRzXSwgWzJdLCBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbYXJjaGl2ZV9leHBzeW1fY21kc10sIFsyXSkKK19MVF9UQUdERUNMKFtdLCBbbW9kdWxlX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgaWYgZGlmZmVyZW50IGZyb20gYnVpbGRpbmcKKyAgICBhIHNoYXJlZCBhcmNoaXZlLl0pCitfTFRfVEFHREVDTChbXSwgW21vZHVsZV9leHBzeW1fY21kc10sIFsyXSkKK19MVF9UQUdERUNMKFtdLCBbd2l0aF9nbnVfbGRdLCBbMV0sCisgICAgW1doZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdF0pCitfTFRfVEFHREVDTChbXSwgW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgWzFdLAorICAgIFtGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdF0pCitfTFRfVEFHREVDTChbXSwgW25vX3VuZGVmaW5lZF9mbGFnXSwgWzFdLAorICAgIFtGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtGbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyAgICBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3RdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgWzFdLAorICAgIFtbSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5CisgICAgZHVyaW5nIGxpbmtpbmcuICBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3RdXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFsxXSwKKyAgICBbV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKKyAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKKyAgICAiYWJzb2x1dGUiLCBpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyAke3NobGlicGF0aF92YXJ9IGlmIHRoZQorICAgIGxpYnJhcnkgaXMgcmVsb2NhdGVkXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbWludXNfTF0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYXV0b21hdGljXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKKyAgICBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAorICAgIGFnYWluc3QgaXRdKQorX0xUX1RBR0RFQ0woW10sIFtpbmhlcml0X3JwYXRoXSwgWzBdLAorICAgIFtTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcworICAgIHRvIHJ1bnRpbWUgcGF0aCBsaXN0XSkKK19MVF9UQUdERUNMKFtdLCBbbGlua19hbGxfZGVwbGlic10sIFswXSwKKyAgICBbV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFtdLCBbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWRdKQorX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfc3ltYm9sc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbZXhjbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaW5jbHVkZV9leHBzeW1zXSwgWzFdLAorICAgIFtTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVsaW5rX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBmaW5pc2hpbmcgbGlua2luZyBwcm9ncmFtc10pCitfTFRfVEFHREVDTChbXSwgW2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXNdKQorZG5sIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCitkbmwgX0xUX1RBR0RFQ0woW10sIFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbMV0sCitkbmwgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkIHNhZmUgb2JqZWN0c10pCitdKSMgX0xUX0xJTktFUl9TSExJQlMKKworCisjIF9MVF9MQU5HX0NfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitsdF9zYXZlX0NDPSIkQ0MiCitBQ19MQU5HX1BVU0goQykKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9JworCitfTFRfVEFHX0NPTVBJTEVSCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorICBMVF9TWVNfRExPUEVOX1NFTEYKKyAgX0xUX0NNRF9TVFJJUExJQgorCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbWzQtOV1dKikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKK0FDX0xBTkdfUE9QCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfQ19DT05GSUcKKworCisjIF9MVF9MQU5HX0NYWF9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDKysgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NYWF9DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1BBVEhfTUFOSUZFU1RfVE9PTF0pZG5sCitpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorICBBQ19QUk9HX0NYWENQUAorZWxzZQorICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKK2ZpCisKK0FDX0xBTkdfUFVTSChDKyspCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBDWFggY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW1tdXSkgeyByZXR1cm4oMCk7IH0nCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSRDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgIGx0X3NhdmVfTEQ9JExECisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgR0NDPSRHWFgKKyAgbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKKyAgbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAorICBmaQorICBpZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAorICBmaQorICB0ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAorICBDQz0ke0NYWC0iYysrIn0KKyAgQ0ZMQUdTPSRDWFhGTEFHUworICBjb21waWxlcj0kQ0MKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgICMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3aGVuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQorICAgICMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKyAgICBmaQorCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCisKKyAgICAgIExUX1BBVEhfTEQKKworICAgICAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCisgICAgICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDICRwaWNfZmxhZyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAkcGljX2ZsYWcgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisgICAgICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KKyAgICAgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKKyAgICAgICAgd2xhcmM9JyR7d2x9JworCisgICAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfAorCSAgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICBlbHNlCisgICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgICB3bGFyYz0KKworICAgICAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgorICAgICAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQorICAgICAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAorICAgICAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KKyAgICAgICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworICAgICAgZmkKKworICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKworICAgIGVsc2UKKyAgICAgIEdYWD1ubworICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgIHdsYXJjPQorICAgIGZpCisKKyAgICAjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKyAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisgICAgICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisgICAgICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgICAgICBlbHNlCisgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisgICAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisgICAgICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICAgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgICAgIGNhc2UgJGxkX2ZsYWcgaW4KKwkgICAgICAqLWJydGwqKQorCSAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgICAgIGJyZWFrCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICA7OworICAgICAgICAgIGVzYWMKKworICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisgICAgICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgICBmaQorCisgICAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9JyR7d2x9LWYsJworCisgICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisgICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisgICAgICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICAgIDoKKwkgIGVsc2UKKwkgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisJICAgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKwkgIGZpCisgICAgICAgICAgZXNhYworICAgICAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCSAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSAgIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKyAgICAgICAgICBlbHNlCisJICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgICBlbHNlCisJICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJleHBhbGwnCisgICAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8KKwkjIGV4cG9ydC4KKyAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisgICAgICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eQorICAgICAgICAgICMgZXhlY3V0YWJsZS4KKyAgICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQorICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgICAgICBlbHNlCisJICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisJICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICAgICMgV2Ugb25seSB1c2UgdGhpcyBjb2RlIGZvciBHTlUgbGRzIHRoYXQgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgZWxzZQorCSAgICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgICBmaQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZAorCSAgICAjIGxpYnJhcmllcy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgICBiZW9zKikKKwlpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwllbHNlCisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworCisgICAgICBjaG9ydXMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgICopCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorCWNhc2UgJEdYWCwkY2NfYmFzZW5hbWUgaW4KKwksY2wqIHwgbm8sY2wqKQorCSAgIyBOYXRpdmUgTVNWQworCSAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworCSAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworCSAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPSdAJworCSAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKwkgIGxpYmV4dD1saWIKKwkgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorCSAgc2hyZXh0X2NtZHM9Ii5kbGwiCisJICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgICAgICRTRUQgLW4gLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyAtZSAnMVxcXCFwJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgICBlbHNlCisJICAgICAgJFNFRCAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICAgIGZpfgorCSAgICAkQ0MgLW8gJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzICJAJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUuZXhwIiAtV2wsLURMTCwtSU1QTElCOiIkdG9vbF9vdXRwdXRfb2JqZGlyJGxpYm5hbWUuZGxsLmxpYiJ+CisJICAgIGxpbmtuYW1lcz0nCisJICAjIFRoZSBsaW5rZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBidWlsZCBhIHN0YXRpYyBsaWIgaWYgd2UgYnVpbGQgYSBETEwuCisJICAjIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworCSAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJICAjIERvbid0IHVzZSByYW5saWIKKwkgIF9MVF9UQUdWQVIob2xkX3Bvc3RpbnN0YWxsX2NtZHMsICQxKT0nY2htb2QgNjQ0ICRvbGRsaWInCisJICBfTFRfVEFHVkFSKHBvc3RsaW5rX2NtZHMsICQxKT0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgICBsdF90b29sX291dHB1dGZpbGU9IkBUT09MX09VVFBVVEAifgorCSAgICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICAgKikKKwkJbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCQlsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCQk7OworCSAgICBlc2FjfgorCSAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGx0X291dHB1dGZpbGUifgorCSAgICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAgICRNQU5JRkVTVF9UT09MIC1tYW5pZmVzdCAiJGx0X3Rvb2xfb3V0cHV0ZmlsZS5tYW5pZmVzdCIgLW91dHB1dHJlc291cmNlOiIkbHRfdG9vbF9vdXRwdXRmaWxlIiB8fCBleGl0IDE7CisJICAgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICAgIGZpJworCSAgOzsKKwkqKQorCSAgIyBnKysKKwkgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisJICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgIGVsc2UKKwkgICAgICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBmaX4KKwkgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSAgZWxzZQorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICBmaQorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAgIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTKCQxKQorCTs7CisKKyAgICAgIGRndXgqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGVjKysqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZFtbMTJdXSopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUKKwkjIHN3aXRjaCB0byBFTEYKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkLWVsZiopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCisgICAgICAgICMgY29udmVudGlvbnMKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgZ251KikKKyAgICAgICAgOzsKKworICAgICAgaGFpa3UqKQorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGhwdXg5KikKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJICAgICAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJICAgICAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgYUNDKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkRUdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDEwKnxocHV4MTEqKQorICAgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKyAgICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBmaQorICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBhQ0MqKQorCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICBpYTY0KikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgICAgICBocHBhKjY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgaWE2NCopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICAqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgZXNhYworCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaW50ZXJpeFtbMy05XV0qKQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8ICRHUkVQICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworCSAgaWNwYyogfCBlY3BjKiApCisJICAgICMgSW50ZWwgQysrCisJICAgIHdpdGhfZ251X2xkPXllcworCSAgICAjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scworCSAgICAjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAorCSAgICAjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkgICAgICAqIlZlcnNpb24gNy4iKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgICAgKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKKwkgICAgICAgIHRtcF9pZHluPQorCSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkJICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7CisJCWVzYWMKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgZXNhYworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgOzsKKyAgICAgICAgICBwZ0NDKiB8IHBnY3BwKikKKyAgICAgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIGNhc2UgYCRDQyAtVmAgaW4KKwkgICAgKnBnQ0NcIFtbMS01XV0uKiB8ICpwZ2NwcFwgW1sxLTVdXS4qKQorCSAgICAgIF9MVF9UQUdWQVIocHJlbGlua19jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvYmpzICRsaWJvYmpzICRjb21waWxlX2RlcGxpYnN+CisJCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCInCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvbGRvYmpzJG9sZF9kZXBsaWJzfgorCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYH4KKwkJJFJBTkxJQiAkb2xkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCBzb3J0IHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICAqKSAjIFZlcnNpb24gNiBhbmQgYWJvdmUgdXNlIHdlYWsgc3ltYm9scworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICAgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKwkgIHhsKiB8IG1waXhsKiB8IGJneGwqKQorCSAgICAjIElCTSBYTCA4LjAgb24gUFBDLCB3aXRoIEdOVSBsZAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCSRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCSAgICBmaQorCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scycKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCisJICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHNvbWV0aGluZyBiYXNlZCBvbgorCSAgICAgICMgJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEKKwkgICAgICAjIHdvdWxkIGJlIGJldHRlci4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZnVuY19lY2hvX2FsbCcKKworCSAgICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBseW54b3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbTg4ayopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbXZzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBjeHgqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCSAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbmV0YnNkKikKKyAgICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworCSAgd2xhcmM9CisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJZmkKKwkjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworCTs7CisKKyAgICAgICpudG8qIHwgKnFueCopCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisJOzsKKworICAgICAgb3BlbmJzZDIqKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG9wZW5ic2QqKQorCWlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisJICBmaQorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAiJGxpYiIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICAgICopIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgZXNhYworCSAgICA7OworICAgICAgICAgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgY3h4KikKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkJOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CisJICAgICAgICAgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJICAgICAgICAgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICAgICAgICAgJFJNICRsaWIuZXhwJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCQk7OworCSAgICBlc2FjCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCIgfCAkR1JFUCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBmdW5jX2VjaG9fYWxsICIkdGVtcGxpc3QiIHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICAgb3NmMyopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkJICA7OworCSAgICAgICAgKikKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgZXNhYworCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgcHNvcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIHN1bm9zNCopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgc29sYXJpcyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqIHwgc3VuQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgICAgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCSAgICAgICopCisJCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuCisJICAgICAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCQlfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdmdW5jX2VjaG9fYWxsJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKworCSAgICAjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgICAgIGlmICRDQyAtLXZlcnNpb24gfCAkR1JFUCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIC12ICJeQ29uZmlndXJlZCB3aXRoOiIgfCAkR1JFUCAiXC1MIicKKwkgICAgICBlbHNlCisJICAgICAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICAgICAjIHBsYXRmb3JtLgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGZpCisKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJworCSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkJc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKwkJKikKKwkJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwkJICA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICBDQyopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisJIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKwkjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisJIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisJIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorCSMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorCSMgYXMgLXogZGVmcy4KKwlfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKwlfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworCXJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkb2xkb2Jqc34KKwkgICAgICAnIiRfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKSIKKwkgICAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLVRwcmVsaW5rX29iamVjdHMgJHJlbG9hZF9vYmpzfgorCSAgICAgICciJF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKSIKKwkgICAgOzsKKwkgICopCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgOzsKKwllc2FjCisgICAgICA7OworCisgICAgICB0YW5kZW0qKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgdnh3b3JrcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQorICAgIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIENDPSRsdF9zYXZlX0NDCisgIENGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKKyAgTERDWFg9JExECisgIExEPSRsdF9zYXZlX0xECisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKyAgbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorICBsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKKyAgbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitmaSAjIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfQ1hYX0NPTkZJRworCisKKyMgX0xUX0ZVTkNfU1RSSVBOQU1FX0NORgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZ1bmNfc3RyaXBuYW1lX2NuZiBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCisjCisjIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSAobm9uLVhTSSkgdmVyc2lvbiBvZiBmdW5jX3N0cmlwbmFtZSwKKyMgZXhjZXB0IHRoaXMgb25lIGNhbiBiZSB1c2VkIGJ5IG00IGNvZGUgdGhhdCBtYXkgYmUgZXhlY3V0ZWQgYnkgY29uZmlndXJlLAorIyByYXRoZXIgdGhhbiB0aGUgbGlidG9vbCBzY3JpcHQuCittNF9kZWZ1bihbX0xUX0ZVTkNfU1RSSVBOQU1FX0NORl0sW2RubAorQUNfUkVRVUlSRShbX0xUX0RFQ0xfU0VEXSkKK0FDX1JFUVVJUkUoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSkKK2Z1bmNfc3RyaXBuYW1lX2NuZiAoKQoreworICBjYXNlICR7Mn0gaW4KKyAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJSR7Mn1cJCUlImA7OworICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWVfY25mCitdKSMgX0xUX0ZVTkNfU1RSSVBOQU1FX0NORgorCisjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlndXJlIG91dCAiaGlkZGVuIiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmcm9tIHZlcmJvc2UKKyMgY29tcGlsZXIgb3V0cHV0IHdoZW4gbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorbTRfZGVmdW4oW19MVF9TWVNfSElEREVOX0xJQkRFUFNdLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorQUNfUkVRVUlSRShbX0xUX0ZVTkNfU1RSSVBOQU1FX0NORl0pZG5sCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KK19MVF9UQUdWQVIocHJlZGVwcywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KKworZG5sIHdlIGNhbid0IHVzZSB0aGUgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIGhlcmUsCitkbmwgYmVjYXVzZSBpdCBjb250YWlucyBjb2RlIGludGVuZGVkIGZvciBhbiBleGVjdXRhYmxlLAorZG5sIG5vdCBhIGxpYnJhcnkuICBJdCdzIHBvc3NpYmxlIHdlIHNob3VsZCBsZXQgZWFjaAorZG5sIHRhZyBkZWZpbmUgYSBuZXcgbHRfPz8/P19saW5rX3Rlc3RfY29kZSB2YXJpYWJsZSwKK2RubCBidXQgaXQncyBvbmx5IHVzZWQgaGVyZS4uLgorbTRfaWYoWyQxXSwgW10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgoraW50IGE7Cit2b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQorX0xUX0VPRgorXSwgWyQxXSwgW0NYWF0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorY2xhc3MgRm9vCit7CitwdWJsaWM6CisgIEZvbyAodm9pZCkgeyBhID0gMDsgfQorcHJpdmF0ZToKKyAgaW50IGE7Cit9OworX0xUX0VPRgorXSwgWyQxXSwgW0Y3N10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIqNCBhCisgICAgICBhPTAKKyAgICAgIHJldHVybgorICAgICAgZW5kCitfTFRfRU9GCitdLCBbJDFdLCBbRkNdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtHQ0pdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3B1YmxpYyBjbGFzcyBmb28geworICBwcml2YXRlIGludCBhOworICBwdWJsaWMgdm9pZCBiYXIgKHZvaWQpIHsKKyAgICBhID0gMDsKKyAgfQorfTsKK19MVF9FT0YKK10pCisKK19sdF9saWJkZXBzX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2Nhc2UgIiRDQyAkQ0ZMQUdTICIgaW4gIygKKypcIC1mbHRvKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tbHRvIiA7OworKlwgLWZ3aG9wcipcICopIENGTEFHUz0iJENGTEFHUyAtZm5vLXdob3ByIiA7OworZXNhYworCitkbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Citkbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgoraWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCisKKyAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQorICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KKyAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubworCisgIGZvciBwIGluIGBldmFsICIkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiYDsgZG8KKyAgICBjYXNlICR7cHJldn0ke3B9IGluCisKKyAgICAtTCogfCAtUiogfCAtbCopCisgICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KKyAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCisgICAgICAgaWYgdGVzdCAkcCA9ICItTCIgfHwKKyAgICAgICAgICB0ZXN0ICRwID0gIi1SIjsgdGhlbgorCSBwcmV2PSRwCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgICMgRXhwYW5kIHRoZSBzeXNyb290IHRvIGVhc2UgZXh0cmFjdGluZyB0aGUgZGlyZWN0b3JpZXMgbGF0ZXIuCisgICAgICAgaWYgdGVzdCAteiAiJHByZXYiOyB0aGVuCisgICAgICAgICBjYXNlICRwIGluCisgICAgICAgICAtTCopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLUwnICcnICIkcCI7IHByZXY9LUw7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLVIqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1SJyAnJyAiJHAiOyBwcmV2PS1SOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIC1sKikgZnVuY19zdHJpcG5hbWVfY25mICctbCcgJycgIiRwIjsgcHJldj0tbDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICBlc2FjCisgICAgICAgZmkKKyAgICAgICBjYXNlICRwIGluCisgICAgICAgPSopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnPScgJycgIiRwIjsgcD0kbHRfc3lzcm9vdCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICBlc2FjCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgY2FzZSAke3ByZXZ9IGluCisJIC1MIHwgLVIpCisJICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCisJICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCisJICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCisJICAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkiOyB0aGVuCisJICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke3ByZXZ9JHtwfSIKKwkgICBlbHNlCisJICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9ICR7cHJldn0ke3B9IgorCSAgIGZpCisJICAgOzsKKwkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKKwkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCisJIGVzYWMKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke3ByZXZ9JHtwfSIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSl9ICR7cHJldn0ke3B9IgorCSBmaQorICAgICAgIGZpCisgICAgICAgcHJldj0KKyAgICAgICA7OworCisgICAgKi5sdG8uJG9iamV4dCkgOzsgIyBJZ25vcmUgR0NDIExUTyBvYmplY3RzCisgICAgKi4kb2JqZXh0KQorICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAorICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgorICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgorCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcworCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgorCisgICAgZXNhYworICBkb25lCisKKyAgIyBDbGVhbiB1cC4KKyAgcm0gLWYgYS5vdXQgYS5leGUKK2Vsc2UKKyAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nICQxIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRSTSAtZiBjb25mZXN0LiRvYmpleHQKK0NGTEFHUz0kX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1MKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK200X2lmKFskMV0sIFtDWFhdLAorW2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXhbWzMtOV1dKikKKyAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgorICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgorICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCQxKT0KKyAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0KKyAgOzsKKworbGludXgqKQorICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKyAgKlN1blwgQyopCisgICAgIyBTdW4gQysrIDUuOQorCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworCitzb2xhcmlzKikKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgQ0MqIHwgc3VuQ0MqKQorICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgorICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKKyAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgorICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworXSkKKworY2FzZSAiICRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkgIiBpbgorKiIgLWxjICIqKSBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8gOzsKK2VzYWMKKyBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPQoraWYgdGVzdCAtbiAiJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSI7IHRoZW4KKyBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPWBlY2hvICIgJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSIgfCAke1NFRH0gLWUgJ3MhIC1MISAhZycgLWUgJ3MhXiAhISdgCitmaQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9saWJfc2VhcmNoX2RpcnNdLCBbMV0sCisgICAgW1RoZSBkaXJlY3RvcmllcyBzZWFyY2hlZCBieSB0aGlzIGNvbXBpbGVyIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeV0pCitfTFRfVEFHREVDTChbXSwgW3ByZWRlcF9vYmplY3RzXSwgWzFdLAorICAgIFtEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8KKyAgICBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeV0pCitfTFRfVEFHREVDTChbXSwgW3Bvc3RkZXBfb2JqZWN0c10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcHNdLCBbMV0pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFsxXSwKKyAgICBbVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyAgICBhIHNoYXJlZCBsaWJyYXJ5XSkKK10pIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTCisKKworIyBfTFRfTEFOR19GNzdfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgRm9ydHJhbiA3NyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfRjc3X0NPTkZJR10sCitbQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCitpZiB0ZXN0IC16ICIkRjc3IiB8fCB0ZXN0ICJYJEY3NyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GNzc9eWVzCitmaQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KK2FjX2V4dD1mCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBGNzcgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBDQz0ke0Y3Ny0iZjc3In0KKyAgQ0ZMQUdTPSRGRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorICBHQ0M9JEc3NworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEc3NyIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9IiRsdF9zYXZlX0NDIgorICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKK2ZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfRjc3X0NPTkZJRworCisKKyMgX0xUX0xBTkdfRkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GQ19DT05GSUddLAorW0FDX0xBTkdfUFVTSChGb3J0cmFuKQorCitpZiB0ZXN0IC16ICIkRkMiIHx8IHRlc3QgIlgkRkMiID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRkM9eWVzCitmaQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZmMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PSR7YWNfZmNfc3JjZXh0LWZ9CisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmYyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEZDIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworICBDQz0ke0ZDLSJmOTUifQorICBDRkxBR1M9JEZDRkxBR1MKKyAgY29tcGlsZXI9JENDCisgIEdDQz0kYWNfY3ZfZmNfY29tcGlsZXJfZ251CisKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKwkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisJZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRhY19jdl9mY19jb21waWxlcl9nbnUiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9JGx0X3NhdmVfQ0MKKyAgQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0ZDX0NPTkZJRworCisKKyMgX0xUX0xBTkdfR0NKX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgR05VIEphdmEgQ29tcGlsZXIgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0dDSl9DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfR0NKXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fSIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfScKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSRDQworbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworbHRfc2F2ZV9HQ0M9JEdDQworR0NDPXllcworQ0M9JHtHQ0otImdjaiJ9CitDRkxBR1M9JEdDSkZMQUdTCitjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKworX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9OT19SVFRJKCQxKQorICBfTFRfQ09NUElMRVJfUElDKCQxKQorICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKKworQUNfTEFOR19SRVNUT1JFCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK0NDPSRsdF9zYXZlX0NDCitDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCitdKSMgX0xUX0xBTkdfR0NKX0NPTkZJRworCisKKyMgX0xUX0xBTkdfUkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX1JDX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19SQ10pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9JworCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK2x0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0KK0NDPSR7UkMtIndpbmRyZXMifQorQ0ZMQUdTPQorY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCitfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisKK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgOgorICBfTFRfQ09ORklHKCQxKQorZmkKKworR0NDPSRsdF9zYXZlX0dDQworQUNfTEFOR19SRVNUT1JFCitDQz0kbHRfc2F2ZV9DQworQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworXSkjIF9MVF9MQU5HX1JDX0NPTkZJRworCisKKyMgTFRfUFJPR19HQ0oKKyMgLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9QUk9HX0dDSl0sCitbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwgW0FDX1BST0dfR0NKXSwKKyAgW200X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwgW0FdW01fUFJPR19HQ0pdLAorICAgIFtBQ19DSEVDS19UT09MKEdDSiwgZ2NqLCkKKyAgICAgIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgorICAgICAgQUNfU1VCU1QoR0NKRkxBR1MpXSldKVtdZG5sCitdKQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfR0NKXSwgW0xUX1BST0dfR0NKXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLCBbXSkKKworCisjIExUX1BST0dfUkMKKyMgLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfUkNdLAorW0FDX0NIRUNLX1RPT0woUkMsIHdpbmRyZXMsKQorXSkKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1JDXSwgW0xUX1BST0dfUkNdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwgW10pCisKKworIyBfTFRfREVDTF9FR1JFUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3QgZ3JlcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9FR1JFUF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0ZHUkVQXSlkbmwKK3Rlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKK19MVF9ERUNMKFtdLCBbR1JFUF0sIFsxXSwgW0EgZ3JlcCBwcm9ncmFtIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzXSkKK19MVF9ERUNMKFtdLCBbRUdSRVBdLCBbMV0sIFtBbiBFUkUgbWF0Y2hlcl0pCitfTFRfREVDTChbXSwgW0ZHUkVQXSwgWzFdLCBbQSBsaXRlcmFsIHN0cmluZyBtYXRjaGVyXSkKK2RubCBOb24tYmxlZWRpbmctZWRnZSBhdXRvY29uZiBkb2Vzbid0IHN1YnN0IEdSRVAsIHNvIGRvIGl0IGhlcmUgdG9vCitBQ19TVUJTVChbR1JFUF0pCitdKQorCisKKyMgX0xUX0RFQ0xfT0JKRFVNUAorIyAtLS0tLS0tLS0tLS0tLQorIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3Qgb2JqZHVtcAorIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KK200X2RlZnVuKFtfTFRfREVDTF9PQkpEVU1QXSwKK1tBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzFdLCBbQW4gb2JqZWN0IHN5bWJvbCBkdW1wZXJdKQorQUNfU1VCU1QoW09CSkRVTVBdKQorXSkKKworIyBfTFRfREVDTF9ETExUT09MCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIERMTFRPT0wgdmFyaWFibGUgaXMgc2V0LgorbTRfZGVmdW4oW19MVF9ERUNMX0RMTFRPT0xdLAorW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCitfTFRfREVDTChbXSwgW0RMTFRPT0xdLCBbMV0sIFtETEwgY3JlYXRpb24gcHJvZ3JhbV0pCitBQ19TVUJTVChbRExMVE9PTF0pCitdKQorCisjIF9MVF9ERUNMX1NFRAorIyAtLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGEgZnVsbHktZnVuY3Rpb25hbCBzZWQgcHJvZ3JhbSwgdGhhdCB0cnVuY2F0ZXMKKyMgYXMgZmV3IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuICBQcmVmZXIgR05VIHNlZCBpZiBmb3VuZC4KK200X2RlZnVuKFtfTFRfREVDTF9TRURdLAorW0FDX1BST0dfU0VECit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCitfTFRfREVDTChbXSwgW1NFRF0sIFsxXSwgW0Egc2VkIHByb2dyYW0gdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorX0xUX0RFQ0woW10sIFtYc2VkXSwgWyJcJFNFRCAtZSAxcy9eWC8vIl0sCisgICAgW1NlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uXSkKK10pIyBfTFRfREVDTF9TRUQKKworbTRfaWZuZGVmKFtBQ19QUk9HX1NFRF0sIFsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworbTRfZGVmdW4oW0FDX1BST0dfU0VEXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9TRUQsCitbIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCisjIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCitdKQorU0VEPSRsdF9jdl9wYXRoX1NFRAorQUNfU1VCU1QoW1NFRF0pCitBQ19NU0dfUkVTVUxUKFskU0VEXSkKK10pI0FDX1BST0dfU0VECitdKSNtNF9pZm5kZWYKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1NFRF0sIFtBQ19QUk9HX1NFRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSwgW10pCisKKworIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgb3V0IHdoZXRoZXIgdGhlIHNoZWxsIGlzIEJvdXJuZSBvciBYU0kgY29tcGF0aWJsZSwKKyMgb3IgaGFzIHNvbWUgb3RoZXIgdXNlZnVsIGZlYXR1cmVzLgorbTRfZGVmdW4oW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzXSkKKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sJHtfbHRfZHVtbXkjPz99IiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsYi9jLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK0FDX01TR19SRVNVTFQoWyR4c2lfc2hlbGxdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW3hzaV9zaGVsbD0nJHhzaV9zaGVsbCddKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICIrPSJdKQorbHRfc2hlbGxfYXBwZW5kPW5vCisoIGZvbz1iYXI7IHNldCBmb28gYmF6OyBldmFsICIkWzFdKz1cJFsyXSIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworQUNfTVNHX1JFU1VMVChbJGx0X3NoZWxsX2FwcGVuZF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbbHRfc2hlbGxfYXBwZW5kPSckbHRfc2hlbGxfYXBwZW5kJ10pCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKK19MVF9ERUNMKFtdLCBbbHRfdW5zZXRdLCBbMF0sIFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiXSlkbmwKKworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJworICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIGx0X1NQMk5MPSd0ciBcMTAwIFxuJworICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKK19MVF9ERUNMKFtTUDJOTF0sIFtsdF9TUDJOTF0sIFsxXSwgW3R1cm4gc3BhY2VzIGludG8gbmV3bGluZXNdKWRubAorX0xUX0RFQ0woW05MMlNQXSwgW2x0X05MMlNQXSwgWzFdLCBbdHVybiBuZXdsaW5lcyBpbnRvIHNwYWNlc10pZG5sCitdKSMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCisKKworIyBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFIChGVU5DTkFNRSwgUkVQTEFDRU1FTlQtQk9EWSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluIGAkY2ZnZmlsZScsIGxvb2sgZm9yIGZ1bmN0aW9uIEZVTkNOQU1FIGRlbGltaXRlZCBieSBgXkZVTkNOQU1FICgpJCcgYW5kCisjICdefSBGVU5DTkFNRSAnLCBhbmQgcmVwbGFjZSBpdHMgYm9keSB3aXRoIFJFUExBQ0VNRU5ULUJPRFkuCittNF9kZWZ1bihbX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRV0sCitbZG5sIHsKK3NlZCAtZSAnL14kMSAoKSQvLC9efSAjICQxIC9jXAorJDEgKClcCit7XAorbTRfYnBhdHN1YnN0cyhbJDJdLCBbJF0sIFtcXF0sIFteXChbCSBdXCldLCBbXFxcMV0pCit9ICMgRXh0ZW5kZWQtc2hlbGwgJDEgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK10pCisKKworIyBfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVwbGFjZSBleGlzdGluZyBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2V2ZXJhbCBzaGVsbCBmdW5jdGlvbnMgd2l0aAorIyBlcXVpdmFsZW50IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aG9zZSBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLi4KK200X2RlZnVuKFtfTFRfUFJPR19SRVBMQUNFX1NIRUxMRk5TXSwKK1tpZiB0ZXN0IHgiJHhzaV9zaGVsbCIgPSB4eWVzOyB0aGVuCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfZGlybmFtZV0sIFtkbmwKKyAgICBjYXNlICR7MX0gaW4KKyAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19iYXNlbmFtZV0sIFtkbmwKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lXSwgW2RubAorICAgIGNhc2UgJHsxfSBpbgorICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgICBlc2FjCisgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zdHJpcG5hbWVdLCBbZG5sCisgICAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQorICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC4KKyAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfQorICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9CisgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfc3BsaXRfbG9uZ19vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9sb25nX29wdF9uYW1lPSR7MSUlPSp9CisgICAgZnVuY19zcGxpdF9sb25nX29wdF9hcmc9JHsxIyo9fV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zcGxpdF9zaG9ydF9vcHRdLCBbZG5sCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnPSR7MSM/P30KKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2xvMm9dLCBbZG5sCisgICAgY2FzZSAkezF9IGluCisgICAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OworICAgICAgKikgICAgZnVuY19sbzJvX3Jlc3VsdD0kezF9IDs7CisgICAgZXNhY10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY194Zm9ybV0sIFsgICAgZnVuY194Zm9ybV9yZXN1bHQ9JHsxJS4qfS5sb10pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcml0aF0sIFsgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICRbKl0gKSldKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfbGVuXSwgWyAgICBmdW5jX2xlbl9yZXN1bHQ9JHsjMX1dKQorZmkKKworaWYgdGVzdCB4IiRsdF9zaGVsbF9hcHBlbmQiID0geHllczsgdGhlbgorICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FwcGVuZF0sIFsgICAgZXZhbCAiJHsxfSs9XFwkezJ9Il0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19hcHBlbmRfcXVvdGVkXSwgW2RubAorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR7Mn0iCitkbmwgbTQgZXhwYW5zaW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHRoZW4gdGhlIHNoZWxsIGV2YWwgdHVybnMgdGhhdCBpbnRvIFwKKyAgICBldmFsICIkezF9Kz1cXFxcIFxcJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0Il0pCisKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIHdoZXJlIHBvc3NpYmxlIGJ5IGRpcmVjdCB1c2Ugb2YgJys9JworICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbW2EtekEtWl9dXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW1thLXpBLVpfXV1cezEsXH1cKSAiJVwxPSIkXDElZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2ZpCisKK2lmIHRlc3QgeCIkX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbCIgPSB4IjoiOyB0aGVuCisgIEFDX01TR19XQVJOKFtVbmFibGUgdG8gc3Vic3RpdHV0ZSBleHRlbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gJG9maWxlXSkKK2ZpCitdKQorCisjIF9MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERldGVybWluZSB3aGljaCBmaWxlIG5hbWUgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgYnkKKyMgZnVuY190b19ob3N0X2ZpbGUgKGFuZCwgaW1wbGljaXRseSwgYnkgZnVuY190b19ob3N0X3BhdGgpLiAgVGhlc2UgYXJlIG5lZWRlZAorIyBmb3IgY2VydGFpbiBjcm9zcy1jb21waWxlIGNvbmZpZ3VyYXRpb25zIGFuZCBuYXRpdmUgbWluZ3cuCittNF9kZWZ1bihbX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfdG9faG9zdF9maWxlX2NtZCwKK1tjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICAgICotKi1jeWd3aW4qICkKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9jeWd3aW5fdG9fdzMyCisgICAgICAgIDs7CisgICAgICAqICkgIyBvdGhlcndpc2UsIGFzc3VtZSAqbml4CisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbml4X3RvX3czMgorICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqLSotY3lnd2luKiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICogKSAjIHVuaGFuZGxlZCBob3N0cyAoYW5kICJub3JtYWwiIG5hdGl2ZSBidWlsZHMpCisgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCisgICAgOzsKK2VzYWMKK10pCit0b19ob3N0X2ZpbGVfY21kPSRsdF9jdl90b19ob3N0X2ZpbGVfY21kCitBQ19NU0dfUkVTVUxUKFskbHRfY3ZfdG9faG9zdF9maWxlX2NtZF0pCitfTFRfREVDTChbdG9faG9zdF9maWxlX2NtZF0sIFtsdF9jdl90b19ob3N0X2ZpbGVfY21kXSwKKyAgICAgICAgIFswXSwgW2NvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0XSlkbmwKKworQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byB0b29sY2hhaW4gZm9ybWF0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl90b190b29sX2ZpbGVfY21kLAorWyNhc3N1bWUgb3JkaW5hcnkgY3Jvc3MgdG9vbHMsIG9yIG5hdGl2ZSBidWlsZC4KK2x0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b190b29sX2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7Citlc2FjCitdKQordG9fdG9vbF9maWxlX2NtZD0kbHRfY3ZfdG9fdG9vbF9maWxlX2NtZAorQUNfTVNHX1JFU1VMVChbJGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWRdKQorX0xUX0RFQ0woW3RvX3Rvb2xfZmlsZV9jbWRdLCBbbHRfY3ZfdG9fdG9vbF9maWxlX2NtZF0sCisgICAgICAgICBbMF0sIFtjb252ZXJ0ICRidWlsZCBmaWxlcyB0byB0b29sY2hhaW4gZm9ybWF0XSlkbmwKK10pIyBfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvbTQvbHRvcHRpb25zLm00IGIvZGJ1cy0xLjQuMTAvbTQvbHRvcHRpb25zLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Y2ZkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9tNC9sdG9wdGlvbnMubTQKQEAgLTAsMCArMSwzNjkgQEAKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNyBsdG9wdGlvbnMubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworCisjIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAorW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisKKyMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQorIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQorIyBzYXZlZCBhcyBhIGZsYWcuCittNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCittNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCitdKQorCisKKyMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK200X2RlZmluZShbX0xUX0lGX09QVElPTl0sCitbbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKKworCisjIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCisjIGFyZSBzZXQuCittNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCitbbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisJICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKKwkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAorbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCitdKVtdZG5sCitdKQorCisKKyMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKKyMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKKyMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0CisjIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KK200X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAorWyMgU2V0IG9wdGlvbnMKK200X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAorICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCisKK200X2lmKFskMV0sW0xUX0lOSVRdLFsKKyAgZG5sCisgIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAorICBkbmwgc3BlY2lmaWVkOgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KKyAgXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCisgIF0pCisgIGRubAorICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgorICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgorICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAorICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAorICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCisgIF0pCitdKSMgX0xUX1NFVF9PUFRJT05TCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWNyb3MgdG8gaGFuZGxlIExUX0lOSVQgb3B0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAorW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCisKKworIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAorXSkjIExUX09QVElPTl9ERUZJTkUKKworCisjIGRsb3BlbgorIyAtLS0tLS0KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCitdKQorCitBVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCisKKworIyB3aW4zMi1kbGwKKyMgLS0tLS0tLS0tCisjIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKK1tlbmFibGVfd2luMzJfZGxsPXllcworCitjYXNlICRob3N0IGluCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotY2VnY2MqKQorICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCisgIDs7Citlc2FjCisKK3Rlc3QgLXogIiRBUyIgJiYgQVM9YXMKK19MVF9ERUNMKFtdLCBbQVNdLCAgICAgIFsxXSwgW0Fzc2VtYmxlciBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzFdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKWRubAorCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtPYmplY3QgZHVtcGVyIHByb2dyYW1dKWRubAorXSkjIHdpbjMyLWRsbAorCitBVV9ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgd2luMzItZGxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW10pCisKKworIyBfTFRfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZywgYW5kIHN1cHBvcnRzIHRoZSBgc2hhcmVkJyBhbmQKKyMgYGRpc2FibGUtc2hhcmVkJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3NoYXJlZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc2hhcmVkPV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQorCisgICAgX0xUX0RFQ0woW2J1aWxkX2xpYnRvb2xfbGlic10sIFtlbmFibGVfc2hhcmVkXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NIQVJFRAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3NoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc2hhcmVkXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX1NUQVRJQyhbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBzdGF0aWMnIGFuZAorIyBgZGlzYWJsZS1zdGF0aWMnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ10sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY0A8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3N0YXRpYz1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9vbGRfbGlic10sIFtlbmFibGVfc3RhdGljXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NUQVRJQworCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3N0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc3RhdGljXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NUQVRJQ10sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBmYXN0LWluc3RhbGwnCisjIGFuZCBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbZmFzdC1pbnN0YWxsXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkBdLAorICAgIFtvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX2Zhc3RfaW5zdGFsbD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKKworX0xUX0RFQ0woW2Zhc3RfaW5zdGFsbF0sIFtlbmFibGVfZmFzdF9pbnN0YWxsXSwgWzBdLAorCSBbV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uXSlkbmwKK10pIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQVVfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBmYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK0FVX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Cit0aGUgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKKworCisjIF9MVF9XSVRIX1BJQyhbTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS13aXRoLXBpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHBpYy1vbmx5JyBhbmQgYG5vLXBpYycKKyMgTFRfSU5JVCBvcHRpb25zLgorIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgorbTRfZGVmaW5lKFtfTFRfV0lUSF9QSUNdLAorW0FDX0FSR19XSVRIKFtwaWNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBpY10sCisJW3RyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIEA8OkBkZWZhdWx0PXVzZSBib3RoQDo+QF0pXSwKKyAgICBbcGljX21vZGU9IiR3aXRodmFsIl0sCisgICAgW3BpY19tb2RlPWRlZmF1bHRdKQorCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPW00X2RlZmF1bHQoWyQxXSwgW2RlZmF1bHRdKQorCitfTFRfREVDTChbXSwgW3BpY19tb2RlXSwgWzBdLCBbV2hhdCB0eXBlIG9mIG9iamVjdHMgdG8gYnVpbGRdKWRubAorXSkjIF9MVF9XSVRIX1BJQworCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3BpYy1vbmx5XSwgW19MVF9XSVRIX1BJQyhbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtuby1waWNdLCBbX0xUX1dJVEhfUElDKFtub10pXSkKKworIyBPbGQgbmFtZToKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3BpYy1vbmx5XSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGBwaWMtb25seScgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLCBbXSkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIExURExfSU5JVCBPcHRpb25zICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworCittNF9kZWZpbmUoW19MVERMX01PREVdLCBbXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtub25yZWN1cnNpdmVdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtub25yZWN1cnNpdmVdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbcmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbcmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3N1YnByb2plY3RdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtzdWJwcm9qZWN0XSldKQorCittNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtpbnN0YWxsYWJsZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2luc3RhbGxhYmxlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW2NvbnZlbmllbmNlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbY29udmVuaWVuY2VdKV0pCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9tNC9sdHN1Z2FyLm00IGIvZGJ1cy0xLjQuMTAvbTQvbHRzdWdhci5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDAwYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvbHRzdWdhci5tNApAQCAtMCwwICsxLDEyMyBAQAorIyBsdHN1Z2FyLm00IC0tIGxpYnRvb2wgbTQgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgLSotQXV0b2NvbmYtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBXcml0dGVuIGJ5IEdhcnkgVi4gVmF1Z2hhbiwgMjAwNAorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDYgbHRzdWdhci5tNAorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUU1VHQVJfVkVSU0lPTl0sIFttNF9pZihbMC4xXSldKQorCisKKyMgbHRfam9pbihTRVAsIEFSRzEsIFtBUkcyLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBBUkcxU0VQQVJHMi4uLlNFUEFSR24sIG9taXR0aW5nIFtdIGFyZ3VtZW50cyBhbmQgdGhlaXIKKyMgYXNzb2NpYXRlZCBzZXBhcmF0b3IuCisjIE5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBtNF9qb2luIGZyb20gQXV0b2NvbmYgMi42Miwgc2luY2UgYWxsIGVhcmxpZXIKKyMgdmVyc2lvbnMgaW4gbTRzdWdhciBoYWQgYnVncy4KK200X2RlZmluZShbbHRfam9pbl0sCitbbTRfaWYoWyQjXSwgWzFdLCBbXSwKKyAgICAgICBbJCNdLCBbMl0sIFtbJDJdXSwKKyAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQyXV9dKSQwKFskMV0sIG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpXSldKQorbTRfZGVmaW5lKFtfbHRfam9pbl0sCitbbTRfaWYoWyQjJDJdLCBbMl0sIFtdLAorICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDEkMl1dKSQwKFskMV0sIG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpXSldKQorCisKKyMgbHRfY2FyKExJU1QpCisjIGx0X2NkcihMSVNUKQorIyAtLS0tLS0tLS0tLS0KKyMgTWFuaXB1bGF0ZSBtNCBsaXN0cy4KKyMgVGhlc2UgbWFjcm9zIGFyZSBuZWNlc3NhcnkgYXMgbG9uZyBhcyB3aWxsIHN0aWxsIG5lZWQgdG8gc3VwcG9ydAorIyBBdXRvY29uZi0yLjU5IHdoaWNoIHF1b3RlcyBkaWZmZXJlbnRseS4KK200X2RlZmluZShbbHRfY2FyXSwgW1skMV1dKQorbTRfZGVmaW5lKFtsdF9jZHJdLAorW200X2lmKFskI10sIDAsIFttNF9mYXRhbChbJDA6IGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNdKV0sCisgICAgICAgWyQjXSwgMSwgW10sCisgICAgICAgW200X2RxdW90ZShtNF9zaGlmdCgkQCkpXSldKQorbTRfZGVmaW5lKFtsdF91bnF1b3RlXSwgJDEpCisKKworIyBsdF9hcHBlbmQoTUFDUk8tTkFNRSwgU1RSSU5HLCBbU0VQQVJBVE9SXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZGVmaW5lIE1BQ1JPLU5BTUUgdG8gaG9sZCBpdHMgZm9ybWVyIGNvbnRlbnQgcGx1cyBgU0VQQVJBVE9SJ2BTVFJJTkcnLgorIyBOb3RlIHRoYXQgbmVpdGhlciBTRVBBUkFUT1Igbm9yIFNUUklORyBhcmUgZXhwYW5kZWQ7IHRoZXkgYXJlIGFwcGVuZGVkCisjIHRvIE1BQ1JPLU5BTUUgYXMgaXMgKGxlYXZpbmcgdGhlIGV4cGFuc2lvbiBmb3Igd2hlbiBNQUNSTy1OQU1FIGlzIGludm9rZWQpLgorIyBObyBTRVBBUkFUT1IgaXMgb3V0cHV0IGlmIE1BQ1JPLU5BTUUgd2FzIHByZXZpb3VzbHkgdW5kZWZpbmVkIChkaWZmZXJlbnQKKyMgdGhhbiBkZWZpbmVkIGFuZCBlbXB0eSkuCisjCisjIFRoaXMgbWFjcm8gaXMgbmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIEF1dG9jb25mIDIuNjIsIHNpbmNlIGVhcmxpZXIKKyMgdmVyc2lvbnMgb2YgbTRzdWdhciBtaXN0YWtlbmx5IGV4cGFuZGVkIFNFUEFSQVRPUiBidXQgbm90IFNUUklORy4KK200X2RlZmluZShbbHRfYXBwZW5kXSwKK1ttNF9kZWZpbmUoWyQxXSwKKwkgICBtNF9pZmRlZihbJDFdLCBbbTRfZGVmbihbJDFdKVskM11dKVskMl0pXSkKKworCisKKyMgbHRfY29tYmluZShTRVAsIFBSRUZJWC1MSVNULCBJTkZJWCwgU1VGRklYMSwgW1NVRkZJWDIuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgYSBTRVAgZGVsaW1pdGVkIGxpc3Qgb2YgYWxsIHBhaXJlZCBjb21iaW5hdGlvbnMgb2YgZWxlbWVudHMgb2YKKyMgUFJFRklYLUxJU1Qgd2l0aCBTVUZGSVgxIHRocm91Z2ggU1VGRklYbi4gIEVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdAorIyBoYXMgdGhlIGZvcm0gUFJFRklYbUlORklYU1VGRklYbi4KKyMgTmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIG00X2NvbWJpbmUgYWRkZWQgaW4gQXV0b2NvbmYgMi42Mi4KK200X2RlZmluZShbbHRfY29tYmluZV0sCitbbTRfaWYobTRfZXZhbChbJCMgPiAzXSksIFsxXSwKKyAgICAgICBbbTRfcHVzaGRlZihbX0x0X3NlcF0sIFttNF9kZWZpbmUoW19MdF9zZXBdLCBtNF9kZWZuKFtsdF9jYXJdKSldKV1dZG5sCitbW200X2ZvcmVhY2goW19MdF9wcmVmaXhdLCBbJDJdLAorCSAgICAgW200X2ZvcmVhY2goW19MdF9zdWZmaXhdLAorCQldbTRfZHF1b3RlKG00X2RxdW90ZShtNF9zaGlmdChtNF9zaGlmdChtNF9zaGlmdCgkQCkpKSkpWywKKwlbX0x0X3NlcChbJDFdKVtdbTRfZGVmbihbX0x0X3ByZWZpeF0pWyQzXW00X2RlZm4oW19MdF9zdWZmaXhdKV0pXSldKV0pCisKKworIyBsdF9pZl9hcHBlbmRfdW5pcShNQUNSTy1OQU1FLCBWQVJOQU1FLCBbU0VQQVJBVE9SXSwgW1VOSVFdLCBbTk9ULVVOSVFdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJZmYgTUFDUk8tTkFNRSBkb2VzIG5vdCB5ZXQgY29udGFpbiBWQVJOQU1FLCB0aGVuIGFwcGVuZCBpdCAoZGVsaW1pdGVkCisjIGJ5IFNFUEFSQVRPUiBpZiBzdXBwbGllZCkgYW5kIGV4cGFuZCBVTklRLCBlbHNlIE5PVC1VTklRLgorbTRfZGVmaW5lKFtsdF9pZl9hcHBlbmRfdW5pcV0sCitbbTRfaWZkZWYoWyQxXSwKKwkgIFttNF9pZihtNF9pbmRleChbJDNdbTRfZGVmbihbJDFdKVskM10sIFskMyQyJDNdKSwgWy0xXSwKKwkJIFtsdF9hcHBlbmQoWyQxXSwgWyQyXSwgWyQzXSkkNF0sCisJCSBbJDVdKV0sCisJICBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdKV0pCisKKworIyBsdF9kaWN0X2FkZChESUNULCBLRVksIFZBTFVFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2FkZF0sCitbbTRfZGVmaW5lKFskMSgkMildLCBbJDNdKV0pCisKKworIyBsdF9kaWN0X2FkZF9zdWJrZXkoRElDVCwgS0VZLCBTVUJLRVksIFZBTFVFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2FkZF9zdWJrZXldLAorW200X2RlZmluZShbJDEoJDI6JDMpXSwgWyQ0XSldKQorCisKKyMgbHRfZGljdF9mZXRjaChESUNULCBLRVksIFtTVUJLRVldKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfZmV0Y2hdLAorW200X2lmdmFsKFskM10sCisJbTRfaWZkZWYoWyQxKCQyOiQzKV0sIFttNF9kZWZuKFskMSgkMjokMyldKV0pLAorICAgIG00X2lmZGVmKFskMSgkMildLCBbbTRfZGVmbihbJDEoJDIpXSldKSldKQorCisKKyMgbHRfaWZfZGljdF9mZXRjaChESUNULCBLRVksIFtTVUJLRVldLCBWQUxVRSwgSUYtVFJVRSwgW0lGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfaWZfZGljdF9mZXRjaF0sCitbbTRfaWYobHRfZGljdF9mZXRjaChbJDFdLCBbJDJdLCBbJDNdKSwgWyQ0XSwKKwlbJDVdLAorICAgIFskNl0pXSkKKworCisjIGx0X2RpY3RfZmlsdGVyKERJQ1QsIFtTVUJLRVldLCBWQUxVRSwgW1NFUEFSQVRPUl0sIEtFWSwgWy4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfZmlsdGVyXSwKK1ttNF9pZihbJDVdLCBbXSwgW10sCisgIFtsdF9qb2luKG00X3F1b3RlKG00X2RlZmF1bHQoWyQ0XSwgW1ssIF1dKSksCisgICAgICAgICAgIGx0X3VucXVvdGUobTRfc3BsaXQobTRfbm9ybWFsaXplKG00X2ZvcmVhY2goX0x0X2tleSwgbHRfY2FyKFttNF9zaGlmdG4oNCwgJEApXSksCisJCSAgICAgIFtsdF9pZl9kaWN0X2ZldGNoKFskMV0sIF9MdF9rZXksIFskMl0sIFskM10sIFtfTHRfa2V5IF0pXSkpKSkpXSlbXWRubAorXSkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL200L2x0dmVyc2lvbi5tNCBiL2RidXMtMS40LjEwL200L2x0dmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdiNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvbHR2ZXJzaW9uLm00CkBAIC0wLDAgKzEsMjMgQEAKKyMgbHR2ZXJzaW9uLm00IC0tIHZlcnNpb24gbnVtYmVycwkJCS0qLSBBdXRvY29uZiAtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBAY29uZmlndXJlX2lucHV0QAorCisjIHNlcmlhbCAzMjkzIGx0dmVyc2lvbi5tNAorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbAorCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfVkVSU0lPTl0sIFsyLjRdKQorbTRfZGVmaW5lKFtMVF9QQUNLQUdFX1JFVklTSU9OXSwgWzEuMzI5M10pCisKK0FDX0RFRlVOKFtMVFZFUlNJT05fVkVSU0lPTl0sCitbbWFjcm9fdmVyc2lvbj0nMi40JworbWFjcm9fcmV2aXNpb249JzEuMzI5MycKK19MVF9ERUNMKCwgbWFjcm9fdmVyc2lvbiwgMCwgW1doaWNoIHJlbGVhc2Ugb2YgbGlidG9vbC5tNCB3YXMgdXNlZD9dKQorX0xUX0RFQ0woLCBtYWNyb19yZXZpc2lvbiwgMCkKK10pCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9tNC9sdH5vYnNvbGV0ZS5tNCBiL2RidXMtMS40LjEwL200L2x0fm9ic29sZXRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzNkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC9tNC9sdH5vYnNvbGV0ZS5tNApAQCAtMCwwICsxLDk4IEBACisjIGx0fm9ic29sZXRlLm00IC0tIGFjbG9jYWwgc2F0aXNmeWluZyBvYnNvbGV0ZSBkZWZpbml0aW9ucy4gICAgLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0LgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUgbHR+b2Jzb2xldGUubTQKKworIyBUaGVzZSBleGlzdCBlbnRpcmVseSB0byBmb29sIGFjbG9jYWwgd2hlbiBib290c3RyYXBwaW5nIGxpYnRvb2wuCisjCisjIEluIHRoZSBwYXN0IGxpYnRvb2wubTQgaGFzIHByb3ZpZGVkIG1hY3JvcyB2aWEgQUNfREVGVU4gKG9yIEFVX0RFRlVOKQorIyB3aGljaCBoYXZlIGxhdGVyIGJlZW4gY2hhbmdlZCB0byBtNF9kZWZpbmUgYXMgdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUKKyMgZXhwb3J0ZWQgQVBJLCBvciBtb3ZlZCB0byBBdXRvY29uZiBvciBBdXRvbWFrZSB3aGVyZSB0aGV5IGJlbG9uZy4KKyMKKyMgVGhlIHRyb3VibGUgaXMsIGFjbG9jYWwgaXMgYSBiaXQgdGhpY2suICBJdCdsbCBzZWUgdGhlIG9sZCBBQ19ERUZVTgorIyBpbiAvdXNyL3NoYXJlL2FjbG9jYWwvbGlidG9vbC5tNCBhbmQgcmVtZW1iZXIgaXQsIHRoZW4gd2hlbiBpdCBzZWVzIHVzCisjIHVzaW5nIGEgbWFjcm8gd2l0aCB0aGUgc2FtZSBuYW1lIGluIG91ciBsb2NhbCBtNC9saWJ0b29sLm00IGl0J2xsCisjIHB1bGwgdGhlIG9sZCBsaWJ0b29sLm00IGluIChpdCBkb2Vzbid0IHNlZSBvdXIgc2hpbnkgbmV3IG00X2RlZmluZQorIyBhbmQgZG9lc24ndCBrbm93IGFib3V0IEF1dG9jb25mIG1hY3JvcyBhdCBhbGwuKQorIworIyBTbyB3ZSBwcm92aWRlIHRoaXMgZmlsZSwgd2hpY2ggaGFzIGEgc2lsbHkgZmlsZW5hbWUgc28gaXQncyBhbHdheXMKKyMgaW5jbHVkZWQgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBwcm92aWRlcyBhY2xvY2FsIHdpdGggdGhlCisjIEFDX0RFRlVOcyBpdCB3YW50cywgYnV0IHdoZW4gbTQgcHJvY2Vzc2VzIGl0LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nCisjIGJlY2F1c2UgdGhvc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QsIG9yIHdpbGwgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIuCisjIFdlIHVzZSBBQ19ERUZVTiBvdmVyIEFVX0RFRlVOIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWNsb2NhbC0xLjYuIAorIworIyBBbnl0aW1lIHdlIHdpdGhkcmF3IGFuIEFDX0RFRlVOIG9yIEFVX0RFRlVOLCByZW1lbWJlciB0byBhZGQgaXQgaGVyZS4KKyMgWWVzLCB0aGF0IG1lYW5zIGV2ZXJ5IG5hbWUgb25jZSB0YWtlbiB3aWxsIG5lZWQgdG8gcmVtYWluIGhlcmUgdW50aWwKKyMgd2UgZ2l2ZSB1cCBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgYmVmb3JlIDEuNywgYXQgd2hpY2ggcG9pbnQKKyMgd2UgbmVlZCB0byBrZWVwIG9ubHkgdGhvc2UgbmFtZXMgd2hpY2ggd2Ugc3RpbGwgcmVmZXIgdG8uCisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRPQlNPTEVURV9WRVJTSU9OXSwgW200X2lmKFsxXSldKQorCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbQUNfUFJPR19FR1JFUF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdLAlbQUNfREVGVU4oW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU0hFTExfSU5JVF0sCQlbQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19MVE1BSU5dLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19MVE1BSU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19UQUdWQVJdLAkJW0FDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX1BSRU9QRU5dLAkJW0FDX0RFRlVOKFtBQ19MVERMX1BSRU9QRU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19TWVNfQ09NUElMRVJdLAlbQUNfREVGVU4oW19MVF9BQ19TWVNfQ09NUElMRVJdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MT0NLXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xPQ0tdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX09MRF9BUkNISVZFXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCVtBQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xURExfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTFRETF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdKV0pCittNF9pZm5kZWYoW0FDX1BBVEhfTUFHSUNdLAkJW0FDX0RFRlVOKFtBQ19QQVRIX01BR0lDXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX0dOVV0sCQlbQUNfREVGVU4oW0FDX1BST0dfTERfR05VXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSldKQorbTRfaWZuZGVmKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0sCVtBQ19ERUZVTihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdKV0pCittNF9pZm5kZWYoW0xUX0FDX1BST0dfRUdSRVBdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX0VHUkVQXSldKQorbTRfaWZuZGVmKFtMVF9BQ19QUk9HX1NFRF0sCQlbQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSldKQorbTRfaWZuZGVmKFtfTFRfQ0NfQkFTRU5BTUVdLAkJW0FDX0RFRlVOKFtfTFRfQ0NfQkFTRU5BTUVdKV0pCittNF9pZm5kZWYoW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwJW0FDX0RFRlVOKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfQUNfUFJPR19MSUJUT09MXSwJCVtBQ19ERUZVTihbX0FDX1BST0dfTElCVE9PTF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TRVRVUF0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU0VUVVBdKV0pCittNF9pZm5kZWYoW19MVF9BQ19DSEVDS19ETEZDTl0sCQlbQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVEFHQ09ORklHXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAlbQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0NfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NYWF9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF9DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfRjc3X0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3X0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX1JDX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9DT05GSUddLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0ZJTEVfTFRETExfQ10sCVtBQ19ERUZVTihbX0xUX0FDX0ZJTEVfTFRETExfQ10pXSkKK200X2lmbmRlZihbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdLAlbQUNfREVGVU4oW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfUFJPR19DWFhDUFBdLAkJW0FDX0RFRlVOKFtfTFRfQUNfUFJPR19DWFhDUFBdKV0pCittNF9pZm5kZWYoW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSwJW0FDX0RFRlVOKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAlbQUNfREVGVU4oW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19GNzddLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19GNzddKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0ZDXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfRkNdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0NYWF0sCQlbQUNfREVGVU4oW19MVF9QUk9HX0NYWF0pXSkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL200L3BrZy5tNCBiL2RidXMtMS40LjEwL200L3BrZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGJlNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvcGtnLm00CkBAIC0wLDAgKzEsMTU1IEBACisjIHBrZy5tNCAtIE1hY3JvcyB0byBsb2NhdGUgYW5kIHV0aWxpc2UgcGtnLWNvbmZpZy4gICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjCisjIENvcHlyaWdodCDCqSAyMDA0IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQS0dfUFJPR19QS0dfQ09ORklHKFtNSU4tVkVSU0lPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfUFJPR19QS0dfQ09ORklHXSwKK1ttNF9wYXR0ZXJuX2ZvcmJpZChbXl8/UEtHX1tBLVpfXSskXSkKK200X3BhdHRlcm5fYWxsb3coW15QS0dfQ09ORklHKF9QQVRIKT8kXSkKK0FDX0FSR19WQVIoW1BLR19DT05GSUddLCBbcGF0aCB0byBwa2ctY29uZmlnIHV0aWxpdHldKWRubAoraWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgorCUFDX1BBVEhfVE9PTChbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKK2ZpCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKwlfcGtnX21pbl92ZXJzaW9uPW00X2RlZmF1bHQoWyQxXSwgWzAuOS4wXSkKKwlBQ19NU0dfQ0hFQ0tJTkcoW3BrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbl0pCisJaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCisJCUFDX01TR19SRVNVTFQoW3llc10pCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKFtub10pCisJCVBLR19DT05GSUc9IiIKKwlmaQorCitmaVtdZG5sCitdKSMgUEtHX1BST0dfUEtHX0NPTkZJRworCisjIFBLR19DSEVDS19FWElTVFMoTU9EVUxFUywgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMKKyMgQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNldCBvZiBtb2R1bGVzIGV4aXN0cy4gIFNpbWlsYXIKKyMgdG8gUEtHX0NIRUNLX01PRFVMRVMoKSwgYnV0IGRvZXMgbm90IHNldCB2YXJpYWJsZXMgb3IgcHJpbnQgZXJyb3JzLgorIworIworIyBTaW1pbGFyIHRvIFBLR19DSEVDS19NT0RVTEVTLCBtYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YKKyMgdGhpcyBvciBQS0dfQ0hFQ0tfTU9EVUxFUyBpcyBjYWxsZWQsIG9yIG1ha2Ugc3VyZSB0byBjYWxsCisjIFBLR19DSEVDS19FWElTVFMgbWFudWFsbHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfQ0hFQ0tfRVhJU1RTXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgQUNfUlVOX0xPRyhbJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgIiQxIl0pOyB0aGVuCisgIG00X2lmdmFsKFskMl0sIFskMl0sIFs6XSkKK200X2lmdmFsbihbJDNdLCBbZWxzZQorICAkM10pZG5sCitmaV0pCisKKworIyBfUEtHX0NPTkZJRyhbVkFSSUFCTEVdLCBbQ09NTUFORF0sIFtNT0RVTEVTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19QS0dfQ09ORklHXSwKK1tpZiB0ZXN0IC1uICIkJDEiOyB0aGVuCisgICAgcGtnX2N2X1tdJDE9IiQkMSIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIFBLR19DSEVDS19FWElTVFMoWyQzXSwKKyAgICAgICAgICAgICAgICAgICAgIFtwa2dfY3ZfW10kMT1gJFBLR19DT05GSUcgLS1bXSQyICIkMyIgMj4vZGV2L251bGxgXSwKKwkJICAgICBbcGtnX2ZhaWxlZD15ZXNdKQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpW11kbmwKK10pIyBfUEtHX0NPTkZJRworCisjIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRF0sCitbQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCitlbHNlCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubworZmlbXWRubAorXSkjIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorCisKKyMgUEtHX0NIRUNLX01PRFVMRVMoVkFSSUFCTEUtUFJFRklYLCBNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwKKyMgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIworIworIyBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGUgZmlyc3QgY2FsbCB0bworIyBQS0dfQ0hFQ0tfTU9EVUxFUyBtaWdodCBub3QgaGFwcGVuLCB5b3Ugc2hvdWxkIGJlIHN1cmUgdG8gaW5jbHVkZSBhbgorIyBleHBsaWNpdCBjYWxsIHRvIFBLR19QUk9HX1BLR19DT05GSUcgaW4geW91ciBjb25maWd1cmUuYWMKKyMKKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfQ0hFQ0tfTU9EVUxFU10sCitbQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pZG5sCitBQ19BUkdfVkFSKFskMV1bX0NGTEFHU10sIFtDIGNvbXBpbGVyIGZsYWdzIGZvciAkMSwgb3ZlcnJpZGluZyBwa2ctY29uZmlnXSlkbmwKK0FDX0FSR19WQVIoWyQxXVtfTElCU10sIFtsaW5rZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAorCitwa2dfZmFpbGVkPW5vCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCisKK19QS0dfQ09ORklHKFskMV1bX0NGTEFHU10sIFtjZmxhZ3NdLCBbJDJdKQorX1BLR19DT05GSUcoWyQxXVtfTElCU10sIFtsaWJzXSwgWyQyXSkKKworbTRfZGVmaW5lKFtfUEtHX1RFWFRdLCBbQWx0ZXJuYXRpdmVseSwgeW91IG1heSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyAkMVtdX0NGTEFHUworYW5kICQxW11fTElCUyB0byBhdm9pZCB0aGUgbmVlZCB0byBjYWxsIHBrZy1jb25maWcuCitTZWUgdGhlIHBrZy1jb25maWcgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy5dKQorCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAgICAgIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgIiQyIiAyPiYxYAorICAgICAgICBlbHNlCisJICAgICAgICAkMVtdX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzICIkMiIgMj4mMWAKKyAgICAgICAgZmkKKwkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9uZ3MKKwllY2hvICIkJDFbXV9QS0dfRVJST1JTIiA+JkFTX01FU1NBR0VfTE9HX0ZECisKKwlpZmVsc2UoWyQ0XSwgLCBbQUNfTVNHX0VSUk9SKGRubAorW1BhY2thZ2UgcmVxdWlyZW1lbnRzICgkMikgd2VyZSBub3QgbWV0OgorCiskJDFfUEtHX0VSUk9SUworCitDb25zaWRlciBhZGp1c3RpbmcgdGhlIFBLR19DT05GSUdfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB5b3UKK2luc3RhbGxlZCBzb2Z0d2FyZSBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXguCisKK19QS0dfVEVYVAorXSldLAorCQlbQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgICAgICQ0XSkKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKwlpZmVsc2UoWyQ0XSwgLCBbQUNfTVNHX0ZBSUxVUkUoZG5sCitbVGhlIHBrZy1jb25maWcgc2NyaXB0IGNvdWxkIG5vdCBiZSBmb3VuZCBvciBpcyB0b28gb2xkLiAgTWFrZSBzdXJlIGl0CitpcyBpbiB5b3VyIFBBVEggb3Igc2V0IHRoZSBQS0dfQ09ORklHIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBmdWxsCitwYXRoIHRvIHBrZy1jb25maWcuCisKK19QS0dfVEVYVAorCitUbyBnZXQgcGtnLWNvbmZpZywgc2VlIDxodHRwOi8vcGtnLWNvbmZpZy5mcmVlZGVza3RvcC5vcmcvPi5dKV0sCisJCVskNF0pCitlbHNlCisJJDFbXV9DRkxBR1M9JHBrZ19jdl9bXSQxW11fQ0ZMQUdTCisJJDFbXV9MSUJTPSRwa2dfY3ZfW10kMVtdX0xJQlMKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKwlpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorZmlbXWRubAorXSkjIFBLR19DSEVDS19NT0RVTEVTCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9tNC90cC1jb21waWxlci1mbGFnLm00IGIvZGJ1cy0xLjQuMTAvbTQvdHAtY29tcGlsZXItZmxhZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRlYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvdHAtY29tcGlsZXItZmxhZy5tNApAQCAtMCwwICsxLDQzIEBACitkbmwgQSB2ZXJzaW9uIG9mIEFTX0NPTVBJTEVSX0ZMQUcgdGhhdCBzdXBwb3J0cyBib3RoIEMgYW5kIEMrKy4KK2RubCBCYXNlZCBvbjoKKworZG5sIGFzLWNvbXBpbGVyLWZsYWcubTQgMC4xLjAKK2RubCBhdXRvc3RhcnMgbTQgbWFjcm8gZm9yIGRldGVjdGlvbiBvZiBjb21waWxlciBmbGFncworZG5sIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorZG5sICRJZDogYXMtY29tcGlsZXItZmxhZy5tNCx2IDEuMSAyMDA1LzA2LzE4IDE4OjAyOjQ2IGJ1cmdlcm1hbiBFeHAgJAorCitkbmwgVFBfQ09NUElMRVJfRkxBRyhDRkxBR1MsIEFDVElPTi1JRi1BQ0NFUFRFRCwgW0FDVElPTi1JRi1OT1QtQUNDRVBURURdKQorZG5sIFRyaWVzIHRvIGNvbXBpbGUgd2l0aCB0aGUgZ2l2ZW4gQ0ZMQUdTIGFuZCBDWFhGTEFHUy4KK2RubAorZG5sIFJ1bnMgQUNUSU9OLUlGLUFDQ0VQVEVEIGlmIHRoZSBjb21waWxlciBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorZG5sIEFDX0xBTkcgY2FuIGNvbXBpbGUgd2l0aCB0aGUgZmxhZ3MsIGFuZCBBQ1RJT04tSUYtTk9ULUFDQ0VQVEVEIG90aGVyd2lzZS4KKworQUNfREVGVU4oW1RQX0NPTVBJTEVSX0ZMQUddLAorWworICBBQ19NU0dfQ0hFQ0tJTkcoW3RvIHNlZSBpZiBjb21waWxlciB1bmRlcnN0YW5kcyAkMV0pCisKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIHNhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTICQxIgorICBDWFhGTEFHUz0iJENYWEZMQUdTICQxIgorCisgIEFDX1RSWV9DT01QSUxFKFsgXSwgW10sIFtmbGFnX29rPXllc10sIFtmbGFnX29rPW5vXSkKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgIENYWEZMQUdTPSIkc2F2ZV9DWFhGTEFHUyIKKworICBpZiB0ZXN0ICJYJGZsYWdfb2siID0gWHllcyA7IHRoZW4KKyAgICAkMgorICAgIHRydWUKKyAgZWxzZQorICAgICQzCisgICAgdHJ1ZQorICBmaQorICBBQ19NU0dfUkVTVUxUKFskZmxhZ19va10pCitdKQorCitkbmwgVFBfQUREX0NPTVBJTEVSX0ZMQUcoVkFSSUFCTEUsIENGTEFHUykKK2RubCBBcHBlbmQgQ0ZMQUdTIHRvIFZBUklBQkxFIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGVtLgorQUNfREVGVU4oW1RQX0FERF9DT01QSUxFUl9GTEFHXSwKK1sKKyAgVFBfQ09NUElMRVJfRkxBRyhbJDJdLCBbJDE9IlskXSQxICQyIl0pCitdKQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvbTQvdHAtY29tcGlsZXItd2FybmluZ3MubTQgYi9kYnVzLTEuNC4xMC9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTRhZjMxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbTQvdHAtY29tcGlsZXItd2FybmluZ3MubTQKQEAgLTAsMCArMSw0OSBAQAorZG5sIFRQX0NPTVBJTEVSX1dBUk5JTkdTKFZBUklBQkxFLCBXRVJST1JfQllfREVGQVVMVCwgREVTSVJBQkxFLCBVTkRFU0lSQUJMRSkKK2RubCAkMSAoVkFSSUFCTEUpOiB0aGUgdmFyaWFibGUgdG8gcHV0IGZsYWdzIGludG8KK2RubCAkMiAoV0VSUk9SX0JZX0RFRkFVTFQpOiBhIGNvbW1hbmQgcmV0dXJuaW5nIHRydWUgaWYgLVdlcnJvciBzaG91bGQgYmUgdGhlCitkbmwgICAgIGRlZmF1bHQKK2RubCAkMyAoREVTSVJBQkxFKTogd2FybmluZyBmbGFncyB3ZSB3YW50IChlLmcuIGFsbCBleHRyYSBzaGFkb3cpCitkbmwgJDQgKFVOREVTSVJBQkxFKTogd2FybmluZyBmbGFncyB3ZSBkb24ndCB3YW50IChlLmcuCitkbmwgICBtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyB1bnVzZWQtcGFyYW1ldGVyKQorQUNfREVGVU4oW1RQX0NPTVBJTEVSX1dBUk5JTkdTXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfQVJHX0VOQUJMRV0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0hFTFBfU1RSSU5HXSlkbmwKKyAgQUNfUkVRVUlSRShbVFBfQ09NUElMRVJfRkxBR10pZG5sCisKKyAgdHBfd2FybmluZ3M9IiIKKyAgZm9yIHRwX2ZsYWcgaW4gJDM7IGRvCisgICAgVFBfQ09NUElMRVJfRkxBRyhbLVckdHBfZmxhZ10sIFt0cF93YXJuaW5ncz0iJHRwX3dhcm5pbmdzIC1XJHRwX2ZsYWciXSkKKyAgZG9uZQorCisgIHRwX2Vycm9yX2ZsYWdzPSItV2Vycm9yIgorICBUUF9DT01QSUxFUl9GTEFHKFstV2Vycm9yXSwgW3RwX3dlcnJvcj15ZXNdLCBbdHBfd2Vycm9yPW5vXSkKKworICBmb3IgdHBfZmxhZyBpbiAkNDsgZG8KKyAgICBUUF9DT01QSUxFUl9GTEFHKFstV25vLSR0cF9mbGFnXSwKKyAgICAgIFt0cF93YXJuaW5ncz0iJHRwX3dhcm5pbmdzIC1Xbm8tJHRwX2ZsYWciXSkKK2RubCBZZXMsIHdlIGRvIG5lZWQgdG8gdXNlIGJvdGggLVduby1mb28gYW5kIC1Xbm8tZXJyb3I9Zm9vLiBTaW1vbiBzYXlzOgorZG5sICAgICBzb21lIHdhcm5pbmdzIHdlIGV4cGxpY2l0bHkgZG9uJ3Qgd2FudCwgbGlrZSB1bnVzZWQtcGFyYW1ldGVyLCBidXQKK2RubCAgICAgdGhleSdyZSBpbiAtV2FsbC4gd2hlbiBhIGRpc3RybyB1c2luZyBjZGJzIGNvbXBpbGVzIHVzLCB3ZSBoYXZlOgorZG5sICAgICAgIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyICAgICAgLVdhbGwKK2RubCAgICAgICAgIF4gZnJvbSB1cyAgICAgICAgICAgICAgICAgICAgICAgICBeIGZyb20gY2RicworZG5sICAgICB3aGljaCB0dXJucyAtV3VudXNlZC1wYXJhbWV0ZXIgYmFjayBvbiwgaW4gZWZmZWN0CisgICAgVFBfQ09NUElMRVJfRkxBRyhbLVduby1lcnJvcj0kdHBfZmxhZ10sCisgICAgICBbdHBfZXJyb3JfZmxhZ3M9IiR0cF9lcnJvcl9mbGFncyAtV25vLWVycm9yPSR0cF9mbGFnIl0sIFt0cF93ZXJyb3I9bm9dKQorICBkb25lCisKKyAgQUNfQVJHX0VOQUJMRShbV2Vycm9yXSwKKyAgICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLVdlcnJvcl0sCisgICAgICBbY29tcGlsZSB3aXRob3V0IC1XZXJyb3IgKG5vcm1hbGx5IGVuYWJsZWQgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzKV0pLAorICAgIHRwX3dlcnJvcj0kZW5hYmxldmFsLCA6KQorCisgIGlmIHRlc3QgIngkdHBfd2Vycm9yIiA9IHh5ZXMgJiYgJDI7IHRoZW4KK2RubCBXZSBwdXQgLVduby1lcnJvcj1mb28gYmVmb3JlIC1Xbm8tZm9vIGJlY2F1c2UgY2xhbmcgaW50ZXJwcmV0cyAtV2FsbAorZG5sIC1XZXJyb3IgLVduby1mb28gLVduby1lcnJvcj1mb28gYXMg4oCcbWFrZSBmb28gYSBub24tZmF0YWwgd2FybmluZ+KAnSwgYnV0IGRvZXMKK2RubCB3aGF0IHdlIHdhbnQgaWYgeW91IHJldmVyc2UgdGhlbS4KKyAgICAkMT0iJHRwX2Vycm9yX2ZsYWdzICR0cF93YXJuaW5ncyIKKyAgZWxzZQorICAgICQxPSIkdHBfd2FybmluZ3MiCisgIGZpCisKK10pCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC9taXNzaW5nIGIvZGJ1cy0xLjQuMTAvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODA1NWQyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvbWlzc2luZwpAQCAtMCwwICsxLDM3NiBAQAorIyEgL2Jpbi9zaAorIyBDb21tb24gc3R1YiBmb3IgYSBmZXcgbWlzc2luZyBHTlUgcHJvZ3JhbXMgd2hpbGUgaW5zdGFsbGluZy4KKworc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQworCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwKKyMgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgT3JpZ2luYWxseSBieSBGcmFuLGNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgIGV4aXQgMQorZmkKKworcnVuPToKK3NlZF9vdXRwdXQ9J3MvLiogLS1vdXRwdXRbID1dXChbXiBdKlwpLiovXDEvcCcKK3NlZF9taW51c289J3MvLiogLW8gXChbXiBdKlwpLiovXDEvcCcKKworIyBJbiB0aGUgY2FzZXMgd2hlcmUgdGhpcyBtYXR0ZXJzLCBgbWlzc2luZycgaXMgYmVpbmcgcnVuIGluIHRoZQorIyBzcmNkaXIgYWxyZWFkeS4KK2lmIHRlc3QgLWYgY29uZmlndXJlLmFjOyB0aGVuCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuYWMKK2Vsc2UKKyAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5pbgorZmkKKworbXNnPSJtaXNzaW5nIG9uIHlvdXIgc3lzdGVtIgorCitjYXNlICQxIGluCistLXJ1bikKKyAgIyBUcnkgdG8gcnVuIHJlcXVlc3RlZCBwcm9ncmFtLCBhbmQganVzdCBleGl0IGlmIGl0IHN1Y2NlZWRzLgorICBydW49CisgIHNoaWZ0CisgICIkQCIgJiYgZXhpdCAwCisgICMgRXhpdCBjb2RlIDYzIG1lYW5zIHZlcnNpb24gbWlzbWF0Y2guICBUaGlzIG9mdGVuIGhhcHBlbnMKKyAgIyB3aGVuIHRoZSB1c2VyIHRyeSB0byB1c2UgYW4gYW5jaWVudCB2ZXJzaW9uIG9mIGEgdG9vbCBvbgorICAjIGEgZmlsZSB0aGF0IHJlcXVpcmVzIGEgbWluaW11bSB2ZXJzaW9uLiAgSW4gdGhpcyBjYXNlIHdlCisgICMgd2Ugc2hvdWxkIHByb2NlZWQgaGFzIGlmIHRoZSBwcm9ncmFtIGhhZCBiZWVuIGFic2VudCwgb3IKKyAgIyBpZiAtLXJ1biBoYWRuJ3QgYmVlbiBwYXNzZWQuCisgIGlmIHRlc3QgJD8gPSA2MzsgdGhlbgorICAgIHJ1bj06CisgICAgbXNnPSJwcm9iYWJseSB0b28gb2xkIgorICBmaQorICA7OworCisgIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKyAgICBlY2hvICJcCiskMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KKworSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgorZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC0tcnVuICAgICAgICAgICB0cnkgdG8gcnVuIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgZW11bGF0ZSBpdCBpZiBpdCBmYWlscworCitTdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6CisgIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKKyAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCisgIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCisgIGF1dG9tNHRlICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUsIG9yIGNyZWF0ZSBhIHN0dWIgb25lCisgIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKKyAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQorICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBoZWxwMm1hbiAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgdGFyICAgICAgICAgIHRyeSB0YXIsIGdudXRhciwgZ3RhciwgdGhlbiB0YXIgd2l0aG91dCBub24tcG9ydGFibGUgZmxhZ3MKKyAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQorCitWZXJzaW9uIHN1ZmZpeGVzIHRvIFBST0dSQU0gYXMgd2VsbCBhcyB0aGUgcHJlZml4ZXMgXGBnbnUtJywgXGBnbnUnLCBhbmQKK1xgZycgYXJlIGlnbm9yZWQgd2hlbiBjaGVja2luZyB0aGUgbmFtZS4KKworU2VuZCBidWcgcmVwb3J0cyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCisgICAgZWNobyAibWlzc2luZyAkc2NyaXB0dmVyc2lvbiAoR05VIEF1dG9tYWtlKSIKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtKikKKyAgICBlY2hvIDE+JjIgIiQwOiBVbmtub3duIFxgJDEnIG9wdGlvbiIKKyAgICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgZXhpdCAxCisgICAgOzsKKworZXNhYworCisjIG5vcm1hbGl6ZSBwcm9ncmFtIG5hbWUgdG8gY2hlY2sgZm9yLgorcHJvZ3JhbT1gZWNobyAiJDEiIHwgc2VkICcKKyAgcy9eZ251LS8vOyB0CisgIHMvXmdudS8vOyB0CisgIHMvXmcvLzsgdCdgCisKKyMgTm93IGV4aXQgaWYgd2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4gIEFsc28gZXhpdCBub3cgaWYgd2UKKyMgZG9uJ3QgaGF2ZSBpdCBhbmQgLS12ZXJzaW9uIHdhcyBwYXNzZWQgKG1vc3QgbGlrZWx5IHRvIGRldGVjdAorIyB0aGUgcHJvZ3JhbSkuICBUaGlzIGlzIGFib3V0IG5vbi1HTlUgcHJvZ3JhbXMsIHNvIHVzZSAkMSBub3QKKyMgJHByb2dyYW0uCitjYXNlICQxIGluCisgIGxleCp8eWFjYyopCisgICAgIyBOb3QgR05VIHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgLS12ZXJzaW9uLgorICAgIDs7CisKKyAgdGFyKikKKyAgICBpZiB0ZXN0IC1uICIkcnVuIjsgdGhlbgorICAgICAgIGVjaG8gMT4mMiAiRVJST1I6IFxgdGFyJyByZXF1aXJlcyAtLXJ1biIKKyAgICAgICBleGl0IDEKKyAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgorICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICAjIENvdWxkIG5vdCBydW4gLS12ZXJzaW9uIG9yIC0taGVscC4gIFRoaXMgaXMgcHJvYmFibHkgc29tZW9uZQorICAgICAgICMgcnVubmluZyBgJFRPT0wgLS12ZXJzaW9uJyBvciBgJFRPT0wgLS1oZWxwJyB0byBjaGVjayB3aGV0aGVyCisgICAgICAgIyAkVE9PTCBleGlzdHMgYW5kIG5vdCBrbm93aW5nICRUT09MIHVzZXMgbWlzc2luZy4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7Citlc2FjCisKKyMgSWYgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGZhaWxzIHRvIHJ1biAocG9zc2libHkgYW4gb3V0ZGF0ZWQgdmVyc2lvbiksCisjIHRyeSB0byBlbXVsYXRlIGl0LgorY2FzZSAkcHJvZ3JhbSBpbgorICBhY2xvY2FsKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQorICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHRvdWNoIGFjbG9jYWwubTQKKyAgICA7OworCisgIGF1dG9jb25mKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQorICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKKyAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKKyAgICB0b3VjaF9maWxlcz0KKyAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAorCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKKyAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgICAgdG91Y2ggJHRvdWNoX2ZpbGVzCisgICAgOzsKKworICBhdXRvbWFrZSopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KKyAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgorICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8CisJICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKKwkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKKyAgICA7OworCisgIGF1dG9tNHRlKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCisgICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIjISAvYmluL3NoIgorCWVjaG8gIiMgQ3JlYXRlZCBieSBHTlUgQXV0b21ha2UgbWlzc2luZyBhcyBhIHJlcGxhY2VtZW50IG9mIgorCWVjaG8gIiMgICQgJEAiCisJZWNobyAiZXhpdCAwIgorCWNobW9kICt4ICRmaWxlCisJZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgIGJpc29uKnx5YWNjKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCisgICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKKwljYXNlICRMQVNUQVJHIGluCisJKi55KQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAorCSAgICBpZiB0ZXN0IC1mICIkU1JDRklMRSI7IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKKwkgICAgZmkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiB5LnRhYi5oOyB0aGVuCisJZWNobyA+eS50YWIuaAorICAgIGZpCisgICAgaWYgdGVzdCAhIC1mIHkudGFiLmM7IHRoZW4KKwllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKKyAgICBmaQorICAgIDs7CisKKyAgbGV4KnxmbGV4KikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIGxleC55eS5jCisgICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKKwljYXNlICRMQVNUQVJHIGluCisJKi5sKQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MvbCQvYy8nYAorCSAgICBpZiB0ZXN0IC1mICIkU1JDRklMRSI7IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiBsZXgueXkuYzsgdGhlbgorCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+bGV4Lnl5LmMKKyAgICBmaQorICAgIDs7CisKKyAgaGVscDJtYW4qKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisJIHlvdSBtb2RpZmllZCBhIGRlcGVuZGVuY3kgb2YgYSBtYW51YWwgcGFnZS4gIFlvdSBtYXkgbmVlZCB0aGUKKwkgXGBIZWxwMm1hbicgcGFja2FnZSBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlCisJIGVmZmVjdC4gIFlvdSBjYW4gZ2V0IFxgSGVscDJtYW4nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorCisgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCisgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAorICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCXRvdWNoICRmaWxlCisgICAgZWxzZQorCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQorCWVjaG8gIi5hYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UiCisJZXhpdCAkPworICAgIGZpCisgICAgOzsKKworICBtYWtlaW5mbyopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnRleGknIG9yIFxgLnRleGluZm8nIGZpbGUsIG9yIGFueSBvdGhlciBmaWxlCisgICAgICAgICBpbmRpcmVjdGx5IGFmZmVjdGluZyB0aGUgYXNwZWN0IG9mIHRoZSBtYW51YWwuICBUaGUgc3B1cmlvdXMKKyAgICAgICAgIGNhbGwgbWlnaHQgYWxzbyBiZSB0aGUgY29uc2VxdWVuY2Ugb2YgdXNpbmcgYSBidWdneSBcYG1ha2UnIChBSVgsCisgICAgICAgICBEVSwgSVJJWCkuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYFRleGluZm8nIHBhY2thZ2Ugb3IKKyAgICAgICAgIHRoZSBcYEdOVSBtYWtlJyBwYWNrYWdlLiAgR3JhYiBlaXRoZXIgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgIyBUaGUgZmlsZSB0byB0b3VjaCBpcyB0aGF0IHNwZWNpZmllZCB3aXRoIC1vIC4uLgorICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KKyAgICAgICMgLi4uIG9yIGl0IGlzIHRoZSBvbmUgc3BlY2lmaWVkIHdpdGggQHNldGZpbGVuYW1lIC4uLgorICAgICAgaW5maWxlPWBlY2hvICIkKiIgfCBzZWQgJ3MvLiogXChbXiBdKlwpICokL1wxLydgCisgICAgICBmaWxlPWBzZWQgLW4gJworCS9eQHNldGZpbGVuYW1lL3sKKwkgIHMvLiogXChbXiBdKlwpICokL1wxLworCSAgcAorCSAgcQorCX0nICRpbmZpbGVgCisgICAgICAjIC4uLiBvciBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIHNvdXJjZSBuYW1lIChkaXIvZi50ZXhpIGJlY29tZXMgZi5pbmZvKQorICAgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiRpbmZpbGUiIHwgc2VkICdzLC4qLywsO3MsLlteLl0qJCwsJ2AuaW5mbworICAgIGZpCisgICAgIyBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlIHVzZXIgcmVhbGx5IG5lZWRzIG1ha2VpbmZvOworICAgICMgbGV0J3MgZmFpbCB3aXRob3V0IHRvdWNoaW5nIGFueXRoaW5nLgorICAgIHRlc3QgLWYgJGZpbGUgfHwgZXhpdCAxCisgICAgdG91Y2ggJGZpbGUKKyAgICA7OworCisgIHRhciopCisgICAgc2hpZnQKKworICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgorICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgorICAgICMgbWVzc2FnZXMuCisgICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKKyAgICBmaQorICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgorICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKKyAgICBmaQorICAgIGZpcnN0YXJnPSIkMSIKKyAgICBpZiBzaGlmdDsgdGhlbgorCWNhc2UgJGZpcnN0YXJnIGluCisJKm8qKQorCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL28vL2AKKwkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCisJICAgIDs7CisJZXNhYworCWNhc2UgJGZpcnN0YXJnIGluCisJKmgqKQorCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKKwkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCisJICAgIDs7CisJZXNhYworICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IEkgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHJ1biBcYHRhcicgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAgICAgWW91IG1heSB3YW50IHRvIGluc3RhbGwgR05VIHRhciBvciBGcmVlIHBheHV0aWxzLCBvciBjaGVjayB0aGUKKyAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIgorICAgIGV4aXQgMQorICAgIDs7CisKKyAgKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCisgICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCisgICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQorICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L01ha2VmaWxlLmFtIGIvZGJ1cy0xLjQuMTAvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDA2ODFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1OCBAQAorIyMgdGhlICJuYW1lLXRlc3QiIHN1YmRpciBpbiBmYWN0IGNvbnRhaW5zIGEgYnVuY2ggb2YgdGVzdHMgbm93IHRoYXQgbmVlZCBhIHRlbXBvcmFyeSBidXMgCisjIyB0byBiZSBydW5uaW5nIHRvIGRvIHN0dWZmIHdpdGguIFRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHJlbmFtZWQuCisjIyBXZSB3YW50IHRvIGJ1aWxkIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmaXJzdCB0byBwaWNrIHVwIHRoZSB0ZXN0dXRpbHMgbGliCitTVUJESVJTPSAuIG5hbWUtdGVzdCAKK0RJU1RfU1VCRElSUz1uYW1lLXRlc3QKKworSU5DTFVERVM9LUkkKHRvcF9zcmNkaXIpICQoREJVU19URVNUX0NGTEFHUykgCisKK2xpYmRidXNfdGVzdHV0aWxzX2xhX1NPVVJDRVMgPSB0ZXN0LXV0aWxzLmggdGVzdC11dGlscy5jCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmRidXMtdGVzdHV0aWxzLmxhCisKK2lmIERCVVNfQlVJTERfVEVTVFMKKyMjIGJyZWFrLWxvYWRlciByZW1vdmVkIGZvciBub3cKKyMjIG1vc3Qgb2YgdGhlc2UgYmluYXJpZXMgYXJlIHVzZWQgaW4gdGVzdHMgYnV0IGFyZSBub3QgdGhlbXNlbHZlcyB0ZXN0cworVEVTVF9CSU5BUklFUz10ZXN0LXNlcnZpY2UgdGVzdC1uYW1lcyB0ZXN0LXNoZWxsLXNlcnZpY2Ugc2hlbGwtdGVzdCBzcGF3bi10ZXN0IHRlc3Qtc2VnZmF1bHQgdGVzdC1leGl0IHRlc3Qtc2xlZXAtZm9yZXZlcgorCisjIyB0aGVzZSBhcmUgdGhlIHRoaW5ncyB0byBydW4gaW4gbWFrZSBjaGVjayAoaS5lLiB0aGV5IGFyZSBhY3R1YWwgdGVzdHMpCisjIyAoYmluYXJpZXMgaW4gaGVyZSBtdXN0IGFsc28gYmUgaW4gVEVTVF9CSU5BUklFUykKK1RFU1RTPXNoZWxsLXRlc3QKK2Vsc2UKK1RFU1RfQklOQVJJRVM9CitURVNUUz0KK2VuZGlmCisKK25vaW5zdF9QUk9HUkFNUz0gJChURVNUX0JJTkFSSUVTKQorCit0ZXN0X3NlcnZpY2VfU09VUkNFUz0JCQkJXAorCXRlc3Qtc2VydmljZS5jCisKK3Rlc3RfbmFtZXNfU09VUkNFUz0JCQkJXAorCXRlc3QtbmFtZXMuYworCisjI2JyZWFrX2xvYWRlcl9TT1VSQ0VTPQkJCQlcCisjIwlicmVhay1sb2FkZXIuYworCit0ZXN0X3NoZWxsX3NlcnZpY2VfU09VUkNFUyA9CQkJXAorCXRlc3Qtc2hlbGwtc2VydmljZS5jCisKK3NoZWxsX3Rlc3RfU09VUkNFUz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2hlbGwtdGVzdC5jCisKK3NwYXduX3Rlc3RfU09VUkNFUz0JCQkJXAorCXNwYXduLXRlc3QuYworCit0ZXN0X2V4aXRfU09VUkNFUyA9CQkJCVwKKwl0ZXN0LWV4aXQuYworCit0ZXN0X3NlZ2ZhdWx0X1NPVVJDRVMgPQkJCQlcCisJdGVzdC1zZWdmYXVsdC5jCisKK3Rlc3Rfc2xlZXBfZm9yZXZlcl9TT1VSQ0VTID0JCQlcCisJdGVzdC1zbGVlcC1mb3JldmVyLmMKKworIyBXaGVuIGFueSBwcm9ncmFtcyBhcmUgbm90IGxpbmtlZCB0byBsaWJkYnVzLWludGVybmFsLCBmaXggdGhpcy4KK0FNX0NQUEZMQUdTPS1EREJVU19TVEFUSUNfQlVJTEQKK1RFU1RfTElCUz0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhICQoREJVU19URVNUX0xJQlMpCisKK3Rlc3Rfc2VydmljZV9MREFERD1saWJkYnVzLXRlc3R1dGlscy5sYSAkKFRFU1RfTElCUykKK3Rlc3Rfc2VydmljZV9MREZMQUdTPUBSX0RZTkFNSUNfTERGTEFHQAordGVzdF9uYW1lc19MREFERD1saWJkYnVzLXRlc3R1dGlscy5sYSAkKFRFU1RfTElCUykKK3Rlc3RfbmFtZXNfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKyMjIGJyZWFrX2xvYWRlcl9MREFERD0gJChURVNUX0xJQlMpCisjIyBicmVha19sb2FkZXJfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKK3Rlc3Rfc2hlbGxfc2VydmljZV9MREFERD1saWJkYnVzLXRlc3R1dGlscy5sYSAkKFRFU1RfTElCUykKK3Rlc3Rfc2hlbGxfc2VydmljZV9MREZMQUdTPUBSX0RZTkFNSUNfTERGTEFHQAorc2hlbGxfdGVzdF9MREFERD1saWJkYnVzLXRlc3R1dGlscy5sYSAkKFRFU1RfTElCUykKK3NoZWxsX3Rlc3RfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKK3NwYXduX3Rlc3RfTERBREQ9JChURVNUX0xJQlMpCitzcGF3bl90ZXN0X0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdACisKK0VYVFJBX0RJU1Q9CisKKyMjIGtlZXAgdGhlc2UgaW4gY3JlYXRpb24gb3JkZXIsIGkuZS4gdXBwZXJtb3N0IGRpcnMgZmlyc3QgCitURVNURElSUz0JCQkJCVwKKwlkYXRhCQkJCQlcCisJZGF0YS92YWxpZC1tZXNzYWdlcwkJCVwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMJCQlcCisJZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzCQlcCisJZGF0YS9hdXRoCQkJCVwKKwlkYXRhL3NoYS0xCQkJCVwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcwkJCVwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0JCVwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kCQlcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5kCVwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZAlcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzCQlcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbQkJXAorCWRhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbQlcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcwkJXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMtc3lzdGVtCVwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcwkJCVwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYwkJXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLmQJXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzCVwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9iYXNpYy5kCisKKworRklORF9URVNUUz1maW5kIC4gLXR5cGUgZiAtYSBcKCAtbmFtZSAiKi5tZXNzYWdlIiAtbyAtbmFtZSAiKi5tZXNzYWdlLXJhdyIgLW8gLW5hbWUgIiouYXV0aC1zY3JpcHQiIC1vIC1uYW1lICIqLnNoYTEiIC1vIC1uYW1lICIqLnR4dCIgLW8gLW5hbWUgIiouY29uZiIgLW8gLW5hbWUgIiouc2VydmljZSIgXCkKKworZGlzdC1ob29rOgorCWZvciBEIGluICQoVEVTVERJUlMpOyBkbwkJCQkJCVwKKwkJdGVzdCAtZCAkKGRpc3RkaXIpLyQkRCB8fCBta2RpciAkKGRpc3RkaXIpLyQkRCB8fCBleGl0IDEgOwlcCisJZG9uZSA7CQkJCQkJCQkJXAorCUZJTEVTPWAoY2QgJChzcmNkaXIpICYmICQoRklORF9URVNUUykgLW8gLW5hbWUgIiouaW4iIC1hIC1ub3QgLW5hbWUgTWFrZWZpbGUuaW4gfCBncmVwIC1FdiAiKC5zdm58Q1ZTKSIgKWAgOwkJCQkJXAorICAgICAgICBmb3IgRiBpbiAkJEZJTEVTOyBkbwkJCQkJCQlcCisJCUI9YGJhc2VuYW1lICQkRmA7IFwKKwkJaWYgdGVzdCAtZSAkJEYuaW47IHRoZW4gXAorCQkJZWNobyAiLS0gU2tpcHBpbmcgZmlsZSAkJEYgKC5pbiB2ZXJzaW9uIGV4aXN0cykiOyBcCisJCWVsaWYgdGVzdCAieCQkQiIgPSB4cnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLmNvbmY7IHRoZW4gXAorCQkJZWNobyAiLS0gU2tpcHBpbmcgZmlsZSAkJEYgKGdlbmVyYXRlZCkiOyBcCisJCWVsaWYgdGVzdCAtZSAiJCh0b3Bfc3JjZGlyKS9idXMvJCRCIjsgdGhlbiBcCisJCQllY2hvICItLSBTa2lwcGluZyBmaWxlICQkRiAoZnJvbSAvYnVzLykiOyBcCisJCWVsc2UgXAorCQkJZWNobyAnLS0gRGlzdGluZyBmaWxlICckJEYgOyBcCisJCQljcCAtZiAkKHNyY2RpcikvJCRGICQoZGlzdGRpcikvJCRGIHx8IGV4aXQgMTsgXAorCQlmaTsgXAorCWRvbmUKKworIyMgY29weSB0ZXN0cyB0byBidWlsZGRpciBzbyB0aGF0IGdlbmVyYXRlZCB0ZXN0cyBhbmQgc3RhdGljIHRlc3RzIAorIyMgYXJlIGFsbCBpbiBvbmUgcGxhY2UuCithbGwtbG9jYWw6CisJJChBTV9WX2F0KWZvciBEIGluICQoVEVTVERJUlMpOyBkbwkJCQkJCQkJXAorCQl0ZXN0IC1kICQodG9wX2J1aWxkZGlyKS90ZXN0LyQkRCB8fCBta2RpciAkKHRvcF9idWlsZGRpcikvdGVzdC8kJEQgfHwgZXhpdCAxIDsJXAorCWRvbmUgOwkJCQkJCQkJCQkJXAorCWlmICEgKHRlc3QgJChzcmNkaXIpID0gLiB8fCB0ZXN0ICQoc3JjZGlyKSAtZWYgLikgOyB0aGVuCQkJCQkJCQlcCisJCUZJTEVTPWAoY2QgJChzcmNkaXIpICYmICQoRklORF9URVNUUykgfCBncmVwIC1FdiAiKC5zdm58Q1ZTKSIgKWAgOwkJCQkJXAorCSAgICAgICAgZm9yIEYgaW4gJCRGSUxFUzsgZG8JCQkJCQkJCVwKKwkJCVNSQz0kKHNyY2RpcikvJCRGIDsJCQkJCQkJXAorCQkJREVTVD0kKHRvcF9idWlsZGRpcikvdGVzdC8kJEYgOwkJCQkJCVwKKwkgICAgICAgICAgICAgICAgZWNobyAnLS0gQ29weWluZyB0ZXN0IGZpbGUgJyQkRiA7CQkJCQlcCisJCQljcCAkJFNSQyAkJERFU1QgfHwgZXhpdCAxIDsJCQkJCQlcCisJCQljaG1vZCB1K3cgJCRERVNUIHx8IGV4aXQgMSA7CQkJCQkJXAorCQlkb25lIDsJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCVwKKwkJZWNobyAnLS0gTm8gbmVlZCB0byBjb3B5IHRlc3QgZGF0YSBhcyBzcmNkaXIgPSBidWlsZGRpcicgOwkJCVwKKwlmaSA7CQkJCQkJCQkJCQlcCisJZWNobyAnLS0gQ29weWluZycgJCh0b3BfYnVpbGRkaXIpL2J1cy8qLmNvbmYgJ3RvIHRlc3QgZGlyZWN0b3J5JyA7CQkJXAorCWNwICQodG9wX2J1aWxkZGlyKS9idXMvKi5jb25mICQodG9wX2J1aWxkZGlyKS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzIHx8IGV4aXQgMSA7ICBcCisJY2htb2QgdSt3ICQodG9wX2J1aWxkZGlyKS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLyouY29uZiB8fCBleGl0IDEKKworIyMgdGhpcyBkb2Vzbid0IGNsZWFuIGdlbmVyYXRlZCB0ZXN0IGRhdGEgZmlsZXMgd2hlbiBzcmNkaXI9YnVpbGRkaXIKK2NsZWFuLWxvY2FsOgorCWlmIHRlc3QgJChzcmNkaXIpICE9IC4gOyB0aGVuCQkJCQlcCisJCUZJTEVTPWAoY2QgJCh0b3BfYnVpbGRkaXIpL3Rlc3QgJiYgJChGSU5EX1RFU1RTKSB8IGdyZXAgLUV2ICIoLnN2bnxDVlMpIiApYCA7CVwKKwkgICAgICAgIGZvciBGIGluICQkRklMRVM7IGRvCQkJCQlcCisJCQlERVNUPSQodG9wX2J1aWxkZGlyKS90ZXN0LyQkRiA7CQkJXAorCSAgICAgICAgICAgICAgICBlY2hvICctLSBEZWxldGluZyB0ZXN0IGZpbGUgJyQkRiA7CQlcCisJCQlybSAkJERFU1QgfHwgZXhpdCAxIDsJCQkJXAorCQlkb25lIDsJCQkJCQkJXAorCQlSRVZFUlNFRElSUz0gOwkJCQkJCVwKKwkJZm9yIEQgaW4gJChURVNURElSUyk7IGRvCQkJCVwKKwkJCVJFVkVSU0VESVJTPSIkJEQgJCRSRVZFUlNFRElSUyIgOwkJXAorCQlkb25lIDsJCQkJCQkJXAorCQlmb3IgRCBpbiAkJFJFVkVSU0VESVJTOyBkbwkJCQlcCisJCQlybWRpciAkKHRvcF9idWlsZGRpcikvdGVzdC8kJEQgfHwgZXhpdCAxIDsJXAorCQlkb25lIDsJCQkJCQkJXAorCWZpCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L01ha2VmaWxlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzlmYmQxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDEwNTUgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUBURVNUUyA9IHNoZWxsLXRlc3QkKEVYRUVYVCkKK25vaW5zdF9QUk9HUkFNUyA9ICQoYW1fX0VYRUVYVF8xKQorc3ViZGlyID0gdGVzdAorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9hcy1hYy1leHBhbmQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvY29tcGlsZXIubTQgJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCAkKHRvcF9zcmNkaXIpL200L2x0c3VnYXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00ICQodG9wX3NyY2RpcikvbTQvbHR+b2Jzb2xldGUubTQgXAorCSQodG9wX3NyY2RpcikvbTQvcGtnLm00ICQodG9wX3NyY2RpcikvbTQvdHAtY29tcGlsZXItZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorTFRMSUJSQVJJRVMgPSAkKG5vaW5zdF9MVExJQlJBUklFUykKK2xpYmRidXNfdGVzdHV0aWxzX2xhX0xJQkFERCA9CithbV9saWJkYnVzX3Rlc3R1dGlsc19sYV9PQkpFQ1RTID0gdGVzdC11dGlscy5sbworbGliZGJ1c190ZXN0dXRpbHNfbGFfT0JKRUNUUyA9ICQoYW1fbGliZGJ1c190ZXN0dXRpbHNfbGFfT0JKRUNUUykKK0FNX1ZfbHQgPSAkKGFtX192X2x0XyQoVikpCithbV9fdl9sdF8gPSAkKGFtX192X2x0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfbHRfMCA9IC0tc2lsZW50CitAREJVU19CVUlMRF9URVNUU19UUlVFQGFtX19FWEVFWFRfMSA9IHRlc3Qtc2VydmljZSQoRVhFRVhUKSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAl0ZXN0LW5hbWVzJChFWEVFWFQpIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3Qtc2hlbGwtc2VydmljZSQoRVhFRVhUKSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAlzaGVsbC10ZXN0JChFWEVFWFQpIHNwYXduLXRlc3QkKEVYRUVYVCkgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJdGVzdC1zZWdmYXVsdCQoRVhFRVhUKSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAl0ZXN0LWV4aXQkKEVYRUVYVCkgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJdGVzdC1zbGVlcC1mb3JldmVyJChFWEVFWFQpCitQUk9HUkFNUyA9ICQobm9pbnN0X1BST0dSQU1TKQorYW1fc2hlbGxfdGVzdF9PQkpFQ1RTID0gc2hlbGwtdGVzdC4kKE9CSkVYVCkKK3NoZWxsX3Rlc3RfT0JKRUNUUyA9ICQoYW1fc2hlbGxfdGVzdF9PQkpFQ1RTKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK2FtX19ERVBFTkRFTkNJRVNfMiA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKQorc2hlbGxfdGVzdF9ERVBFTkRFTkNJRVMgPSBsaWJkYnVzLXRlc3R1dGlscy5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMikKK3NoZWxsX3Rlc3RfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQoc2hlbGxfdGVzdF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9zcGF3bl90ZXN0X09CSkVDVFMgPSBzcGF3bi10ZXN0LiQoT0JKRVhUKQorc3Bhd25fdGVzdF9PQkpFQ1RTID0gJChhbV9zcGF3bl90ZXN0X09CSkVDVFMpCitzcGF3bl90ZXN0X0RFUEVOREVOQ0lFUyA9ICQoYW1fX0RFUEVOREVOQ0lFU18yKQorc3Bhd25fdGVzdF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChzcGF3bl90ZXN0X0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK2FtX3Rlc3RfZXhpdF9PQkpFQ1RTID0gdGVzdC1leGl0LiQoT0JKRVhUKQordGVzdF9leGl0X09CSkVDVFMgPSAkKGFtX3Rlc3RfZXhpdF9PQkpFQ1RTKQordGVzdF9leGl0X0xEQUREID0gJChMREFERCkKK2FtX3Rlc3RfbmFtZXNfT0JKRUNUUyA9IHRlc3QtbmFtZXMuJChPQkpFWFQpCit0ZXN0X25hbWVzX09CSkVDVFMgPSAkKGFtX3Rlc3RfbmFtZXNfT0JKRUNUUykKK3Rlc3RfbmFtZXNfREVQRU5ERU5DSUVTID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgJChhbV9fREVQRU5ERU5DSUVTXzIpCit0ZXN0X25hbWVzX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKHRlc3RfbmFtZXNfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fdGVzdF9zZWdmYXVsdF9PQkpFQ1RTID0gdGVzdC1zZWdmYXVsdC4kKE9CSkVYVCkKK3Rlc3Rfc2VnZmF1bHRfT0JKRUNUUyA9ICQoYW1fdGVzdF9zZWdmYXVsdF9PQkpFQ1RTKQordGVzdF9zZWdmYXVsdF9MREFERCA9ICQoTERBREQpCithbV90ZXN0X3NlcnZpY2VfT0JKRUNUUyA9IHRlc3Qtc2VydmljZS4kKE9CSkVYVCkKK3Rlc3Rfc2VydmljZV9PQkpFQ1RTID0gJChhbV90ZXN0X3NlcnZpY2VfT0JKRUNUUykKK3Rlc3Rfc2VydmljZV9ERVBFTkRFTkNJRVMgPSBsaWJkYnVzLXRlc3R1dGlscy5sYSAkKGFtX19ERVBFTkRFTkNJRVNfMikKK3Rlc3Rfc2VydmljZV9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJCh0ZXN0X3NlcnZpY2VfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fdGVzdF9zaGVsbF9zZXJ2aWNlX09CSkVDVFMgPSB0ZXN0LXNoZWxsLXNlcnZpY2UuJChPQkpFWFQpCit0ZXN0X3NoZWxsX3NlcnZpY2VfT0JKRUNUUyA9ICQoYW1fdGVzdF9zaGVsbF9zZXJ2aWNlX09CSkVDVFMpCit0ZXN0X3NoZWxsX3NlcnZpY2VfREVQRU5ERU5DSUVTID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18yKQordGVzdF9zaGVsbF9zZXJ2aWNlX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKHRlc3Rfc2hlbGxfc2VydmljZV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorYW1fdGVzdF9zbGVlcF9mb3JldmVyX09CSkVDVFMgPSB0ZXN0LXNsZWVwLWZvcmV2ZXIuJChPQkpFWFQpCit0ZXN0X3NsZWVwX2ZvcmV2ZXJfT0JKRUNUUyA9ICQoYW1fdGVzdF9zbGVlcF9mb3JldmVyX09CSkVDVFMpCit0ZXN0X3NsZWVwX2ZvcmV2ZXJfTERBREQgPSAkKExEQUREKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAorCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0FNX1ZfQ0MgPSAkKGFtX192X0NDXyQoVikpCithbV9fdl9DQ18gPSAkKGFtX192X0NDXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7CitBTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQorYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X2F0XzAgPSBACitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0FNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF8kKFYpKQorYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOworQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQorYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOworU09VUkNFUyA9ICQobGliZGJ1c190ZXN0dXRpbHNfbGFfU09VUkNFUykgJChzaGVsbF90ZXN0X1NPVVJDRVMpIFwKKwkkKHNwYXduX3Rlc3RfU09VUkNFUykgJCh0ZXN0X2V4aXRfU09VUkNFUykgXAorCSQodGVzdF9uYW1lc19TT1VSQ0VTKSAkKHRlc3Rfc2VnZmF1bHRfU09VUkNFUykgXAorCSQodGVzdF9zZXJ2aWNlX1NPVVJDRVMpICQodGVzdF9zaGVsbF9zZXJ2aWNlX1NPVVJDRVMpIFwKKwkkKHRlc3Rfc2xlZXBfZm9yZXZlcl9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChsaWJkYnVzX3Rlc3R1dGlsc19sYV9TT1VSQ0VTKSAkKHNoZWxsX3Rlc3RfU09VUkNFUykgXAorCSQoc3Bhd25fdGVzdF9TT1VSQ0VTKSAkKHRlc3RfZXhpdF9TT1VSQ0VTKSBcCisJJCh0ZXN0X25hbWVzX1NPVVJDRVMpICQodGVzdF9zZWdmYXVsdF9TT1VSQ0VTKSBcCisJJCh0ZXN0X3NlcnZpY2VfU09VUkNFUykgJCh0ZXN0X3NoZWxsX3NlcnZpY2VfU09VUkNFUykgXAorCSQodGVzdF9zbGVlcF9mb3JldmVyX1NPVVJDRVMpCitSRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAorCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCisJcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKK1JFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTID0gbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZQlcCisgIGRpc3RjbGVhbi1yZWN1cnNpdmUgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKK0FNX1JFQ1VSU0lWRV9UQVJHRVRTID0gJChSRUNVUlNJVkVfVEFSR0VUUzotcmVjdXJzaXZlPSkgXAorCSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIHRhZ3MgVEFHUyBjdGFncyBDVEFHUyBcCisJZGlzdGRpcgorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworYW1fX3R0eV9jb2xvcnMgPSBcCityZWQ9OyBncm49OyBsZ249OyBibHU9OyBzdGQ9CitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorYW1fX3JlbGF0aXZpemUgPSBcCisgIGRpcjA9YHB3ZGA7IFwKKyAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCisgIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCisgIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCisgIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAorICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCisgICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAorICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKKyAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCisgICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAorICAgICAgZWxzZSBcCisgICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAorICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCisgICAgICAgIGZpOyBcCisgICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCisgICAgICBmaTsgXAorICAgIGZpOyBcCisgICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgIGRvbmU7IFwKKyAgcmVsZGlyPSIkJGRpcjIiCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTVRBUiA9IEBBTVRBUkAKK0FNX0RFRkFVTFRfVkVSQk9TSVRZID0gQEFNX0RFRkFVTFRfVkVSQk9TSVRZQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JVSUxEX0ZJTEVWRVJTSU9OID0gQEJVSUxEX0ZJTEVWRVJTSU9OQAorQlVJTERfVElNRVNUQU1QID0gQEJVSUxEX1RJTUVTVEFNUEAKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RCVVNfQklORElSID0gQERCVVNfQklORElSQAorREJVU19CVVNfQ0ZMQUdTID0gQERCVVNfQlVTX0NGTEFHU0AKK0RCVVNfQlVTX0xJQlMgPSBAREJVU19CVVNfTElCU0AKK0RCVVNfQ0xJRU5UX0NGTEFHUyA9IEBEQlVTX0NMSUVOVF9DRkxBR1NACitEQlVTX0NMSUVOVF9MSUJTID0gQERCVVNfQ0xJRU5UX0xJQlNACitEQlVTX0NPTlNPTEVfQVVUSF9ESVIgPSBAREJVU19DT05TT0xFX0FVVEhfRElSQAorREJVU19DT05TT0xFX09XTkVSX0ZJTEUgPSBAREJVU19DT05TT0xFX09XTkVSX0ZJTEVACitEQlVTX0RBRU1PTkRJUiA9IEBEQlVTX0RBRU1PTkRJUkAKK0RCVVNfREFUQURJUiA9IEBEQlVTX0RBVEFESVJACitEQlVTX0hBVkVfSU5UNjQgPSBAREJVU19IQVZFX0lOVDY0QAorREJVU19JTlQxNl9UWVBFID0gQERCVVNfSU5UMTZfVFlQRUAKK0RCVVNfSU5UMzJfVFlQRSA9IEBEQlVTX0lOVDMyX1RZUEVACitEQlVTX0lOVDY0X0NPTlNUQU5UID0gQERCVVNfSU5UNjRfQ09OU1RBTlRACitEQlVTX0lOVDY0X1RZUEUgPSBAREJVU19JTlQ2NF9UWVBFQAorREJVU19MQVVOQ0hFUl9DRkxBR1MgPSBAREJVU19MQVVOQ0hFUl9DRkxBR1NACitEQlVTX0xBVU5DSEVSX0xJQlMgPSBAREJVU19MQVVOQ0hFUl9MSUJTQAorREJVU19MSUJFWEVDRElSID0gQERCVVNfTElCRVhFQ0RJUkAKK0RCVVNfTUFKT1JfVkVSU0lPTiA9IEBEQlVTX01BSk9SX1ZFUlNJT05ACitEQlVTX01JQ1JPX1ZFUlNJT04gPSBAREJVU19NSUNST19WRVJTSU9OQAorREJVU19NSU5PUl9WRVJTSU9OID0gQERCVVNfTUlOT1JfVkVSU0lPTkAKK0RCVVNfUEFUSF9PUl9BQlNUUkFDVCA9IEBEQlVTX1BBVEhfT1JfQUJTVFJBQ1RACitEQlVTX1BSRUZJWCA9IEBEQlVTX1BSRUZJWEAKK0RCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTQAorREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgPSBAREJVU19TRVNTSU9OX1NPQ0tFVF9ESVJACitEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTID0gQERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitEQlVTX1NZU1RFTV9QSURfRklMRSA9IEBEQlVTX1NZU1RFTV9QSURfRklMRUAKK0RCVVNfU1lTVEVNX1NPQ0tFVCA9IEBEQlVTX1NZU1RFTV9TT0NLRVRACitEQlVTX1RFU1RfQ0ZMQUdTID0gQERCVVNfVEVTVF9DRkxBR1NACitEQlVTX1RFU1RfTElCUyA9IEBEQlVTX1RFU1RfTElCU0AKK0RCVVNfVUlOVDY0X0NPTlNUQU5UID0gQERCVVNfVUlOVDY0X0NPTlNUQU5UQAorREJVU19VU0VSID0gQERCVVNfVVNFUkAKK0RCVVNfVkVSU0lPTiA9IEBEQlVTX1ZFUlNJT05ACitEQlVTX1hfQ0ZMQUdTID0gQERCVVNfWF9DRkxBR1NACitEQlVTX1hfTElCUyA9IEBEQlVTX1hfTElCU0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitET1hZR0VOID0gQERPWFlHRU5ACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0VYUEFOREVEX0JJTkRJUiA9IEBFWFBBTkRFRF9CSU5ESVJACitFWFBBTkRFRF9EQVRBRElSID0gQEVYUEFOREVEX0RBVEFESVJACitFWFBBTkRFRF9MSUJESVIgPSBARVhQQU5ERURfTElCRElSQAorRVhQQU5ERURfTElCRVhFQ0RJUiA9IEBFWFBBTkRFRF9MSUJFWEVDRElSQAorRVhQQU5ERURfTE9DQUxTVEFURURJUiA9IEBFWFBBTkRFRF9MT0NBTFNUQVRFRElSQAorRVhQQU5ERURfUFJFRklYID0gQEVYUEFOREVEX1BSRUZJWEAKK0VYUEFOREVEX1NZU0NPTkZESVIgPSBARVhQQU5ERURfU1lTQ09ORkRJUkAKK0ZHUkVQID0gQEZHUkVQQAorR0VUVEVYVF9QQUNLQUdFID0gQEdFVFRFWFRfUEFDS0FHRUAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEFVTkNIQ1RMID0gQExBVU5DSENUTEAKK0xBVU5DSERfQUdFTlRfRElSID0gQExBVU5DSERfQUdFTlRfRElSQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSUJYTUxfQ0ZMQUdTID0gQExJQlhNTF9DRkxBR1NACitMSUJYTUxfTElCUyA9IEBMSUJYTUxfTElCU0AKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitMVF9BR0UgPSBATFRfQUdFQAorTFRfQ1VSUkVOVCA9IEBMVF9DVVJSRU5UQAorTFRfUkVWSVNJT04gPSBATFRfUkVWSVNJT05ACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUFOMkhUTUwgPSBATUFOMkhUTUxACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSQyA9IEBSQ0AKK1JfRFlOQU1JQ19MREZMQUcgPSBAUl9EWU5BTUlDX0xERkxBR0AKK1NFQ1RJT05fTERGTEFHUyA9IEBTRUNUSU9OX0xERkxBR1NACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVEVTVF9CVVNfQklOQVJZID0gQFRFU1RfQlVTX0JJTkFSWUAKK1RFU1RfRVhJVF9CSU5BUlkgPSBAVEVTVF9FWElUX0JJTkFSWUAKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUiA9IEBURVNUX0lOVkFMSURfU0VSVklDRV9ESVJACitURVNUX0lOVkFMSURfU0VSVklDRV9TWVNURU1fRElSID0gQFRFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVJACitURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZID0gQFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllACitURVNUX1BSSVZTRVJWRVJfQklOQVJZID0gQFRFU1RfUFJJVlNFUlZFUl9CSU5BUllACitURVNUX1NFR0ZBVUxUX0JJTkFSWSA9IEBURVNUX1NFR0ZBVUxUX0JJTkFSWUAKK1RFU1RfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0hFTExfU0VSVklDRV9CSU5BUlkgPSBAVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWUAKK1RFU1RfU0xFRVBfRk9SRVZFUl9CSU5BUlkgPSBAVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWUAKK1RFU1RfU09DS0VUX0RJUiA9IEBURVNUX1NPQ0tFVF9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfRElSID0gQFRFU1RfVkFMSURfU0VSVklDRV9ESVJACitURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUiA9IEBURVNUX1ZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJTkRSRVMgPSBAV0lORFJFU0AKK1hNS01GID0gQFhNS01GQAorWE1MVE8gPSBAWE1MVE9ACitYU0xUUFJPQyA9IEBYU0xUUFJPQ0AKK1hfQ0ZMQUdTID0gQFhfQ0ZMQUdTQAorWF9FWFRSQV9MSUJTID0gQFhfRVhUUkFfTElCU0AKK1hfTElCUyA9IEBYX0xJQlNACitYX1BSRV9MSUJTID0gQFhfUFJFX0xJQlNACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3N5c3RlbWRzeXN0ZW11bml0ZGlyID0gQHN5c3RlbWRzeXN0ZW11bml0ZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitTVUJESVJTID0gLiBuYW1lLXRlc3QgCitESVNUX1NVQkRJUlMgPSBuYW1lLXRlc3QKK0lOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpICQoREJVU19URVNUX0NGTEFHUykgCitsaWJkYnVzX3Rlc3R1dGlsc19sYV9TT1VSQ0VTID0gdGVzdC11dGlscy5oIHRlc3QtdXRpbHMuYworbm9pbnN0X0xUTElCUkFSSUVTID0gbGliZGJ1cy10ZXN0dXRpbHMubGEKK0BEQlVTX0JVSUxEX1RFU1RTX0ZBTFNFQFRFU1RfQklOQVJJRVMgPSAKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAVEVTVF9CSU5BUklFUyA9IHRlc3Qtc2VydmljZSB0ZXN0LW5hbWVzIHRlc3Qtc2hlbGwtc2VydmljZSBzaGVsbC10ZXN0IHNwYXduLXRlc3QgdGVzdC1zZWdmYXVsdCB0ZXN0LWV4aXQgdGVzdC1zbGVlcC1mb3JldmVyCit0ZXN0X3NlcnZpY2VfU09VUkNFUyA9IFwKKwl0ZXN0LXNlcnZpY2UuYworCit0ZXN0X25hbWVzX1NPVVJDRVMgPSBcCisJdGVzdC1uYW1lcy5jCisKK3Rlc3Rfc2hlbGxfc2VydmljZV9TT1VSQ0VTID0gXAorCXRlc3Qtc2hlbGwtc2VydmljZS5jCisKK3NoZWxsX3Rlc3RfU09VUkNFUyA9IFwKKyAgICAgICAgc2hlbGwtdGVzdC5jCisKK3NwYXduX3Rlc3RfU09VUkNFUyA9IFwKKwlzcGF3bi10ZXN0LmMKKwordGVzdF9leGl0X1NPVVJDRVMgPSBcCisJdGVzdC1leGl0LmMKKwordGVzdF9zZWdmYXVsdF9TT1VSQ0VTID0gXAorCXRlc3Qtc2VnZmF1bHQuYworCit0ZXN0X3NsZWVwX2ZvcmV2ZXJfU09VUkNFUyA9IFwKKwl0ZXN0LXNsZWVwLWZvcmV2ZXIuYworCisKKyMgV2hlbiBhbnkgcHJvZ3JhbXMgYXJlIG5vdCBsaW5rZWQgdG8gbGliZGJ1cy1pbnRlcm5hbCwgZml4IHRoaXMuCitBTV9DUFBGTEFHUyA9IC1EREJVU19TVEFUSUNfQlVJTEQKK1RFU1RfTElCUyA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChEQlVTX1RFU1RfTElCUykKK3Rlc3Rfc2VydmljZV9MREFERCA9IGxpYmRidXMtdGVzdHV0aWxzLmxhICQoVEVTVF9MSUJTKQordGVzdF9zZXJ2aWNlX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKK3Rlc3RfbmFtZXNfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYSAkKFRFU1RfTElCUykKK3Rlc3RfbmFtZXNfTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAordGVzdF9zaGVsbF9zZXJ2aWNlX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgJChURVNUX0xJQlMpCit0ZXN0X3NoZWxsX3NlcnZpY2VfTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorc2hlbGxfdGVzdF9MREFERCA9IGxpYmRidXMtdGVzdHV0aWxzLmxhICQoVEVTVF9MSUJTKQorc2hlbGxfdGVzdF9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACitzcGF3bl90ZXN0X0xEQUREID0gJChURVNUX0xJQlMpCitzcGF3bl90ZXN0X0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKK0VYVFJBX0RJU1QgPSAKK1RFU1RESVJTID0gXAorCWRhdGEJCQkJCVwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzCQkJXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcwkJCVwKKwlkYXRhL2luY29tcGxldGUtbWVzc2FnZXMJCVwKKwlkYXRhL2F1dGgJCQkJXAorCWRhdGEvc2hhLTEJCQkJXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzCQkJXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbQkJXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQJCVwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmQJXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5kCVwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMJCVwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtCQlcCisJZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtCVwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzCQlcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0JXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzCQkJXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljCQlcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMuZAlcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMJXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2Jhc2ljLmQKKworRklORF9URVNUUyA9IGZpbmQgLiAtdHlwZSBmIC1hIFwoIC1uYW1lICIqLm1lc3NhZ2UiIC1vIC1uYW1lICIqLm1lc3NhZ2UtcmF3IiAtbyAtbmFtZSAiKi5hdXRoLXNjcmlwdCIgLW8gLW5hbWUgIiouc2hhMSIgLW8gLW5hbWUgIioudHh0IiAtbyAtbmFtZSAiKi5jb25mIiAtbyAtbmFtZSAiKi5zZXJ2aWNlIiBcKQorYWxsOiBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHRlc3QvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdGVzdC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobm9pbnN0X0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorbGliZGJ1cy10ZXN0dXRpbHMubGE6ICQobGliZGJ1c190ZXN0dXRpbHNfbGFfT0JKRUNUUykgJChsaWJkYnVzX3Rlc3R1dGlsc19sYV9ERVBFTkRFTkNJRVMpIAorCSQoQU1fVl9DQ0xEKSQoTElOSykgICQobGliZGJ1c190ZXN0dXRpbHNfbGFfT0JKRUNUUykgJChsaWJkYnVzX3Rlc3R1dGlsc19sYV9MSUJBREQpICQoTElCUykKKworY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisJQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorc2hlbGwtdGVzdCQoRVhFRVhUKTogJChzaGVsbF90ZXN0X09CSkVDVFMpICQoc2hlbGxfdGVzdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBzaGVsbC10ZXN0JChFWEVFWFQpCisJJChBTV9WX0NDTEQpJChzaGVsbF90ZXN0X0xJTkspICQoc2hlbGxfdGVzdF9PQkpFQ1RTKSAkKHNoZWxsX3Rlc3RfTERBREQpICQoTElCUykKK3NwYXduLXRlc3QkKEVYRUVYVCk6ICQoc3Bhd25fdGVzdF9PQkpFQ1RTKSAkKHNwYXduX3Rlc3RfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgc3Bhd24tdGVzdCQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoc3Bhd25fdGVzdF9MSU5LKSAkKHNwYXduX3Rlc3RfT0JKRUNUUykgJChzcGF3bl90ZXN0X0xEQUREKSAkKExJQlMpCit0ZXN0LWV4aXQkKEVYRUVYVCk6ICQodGVzdF9leGl0X09CSkVDVFMpICQodGVzdF9leGl0X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHRlc3QtZXhpdCQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoTElOSykgJCh0ZXN0X2V4aXRfT0JKRUNUUykgJCh0ZXN0X2V4aXRfTERBREQpICQoTElCUykKK3Rlc3QtbmFtZXMkKEVYRUVYVCk6ICQodGVzdF9uYW1lc19PQkpFQ1RTKSAkKHRlc3RfbmFtZXNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdGVzdC1uYW1lcyQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQodGVzdF9uYW1lc19MSU5LKSAkKHRlc3RfbmFtZXNfT0JKRUNUUykgJCh0ZXN0X25hbWVzX0xEQUREKSAkKExJQlMpCit0ZXN0LXNlZ2ZhdWx0JChFWEVFWFQpOiAkKHRlc3Rfc2VnZmF1bHRfT0JKRUNUUykgJCh0ZXN0X3NlZ2ZhdWx0X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHRlc3Qtc2VnZmF1bHQkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKExJTkspICQodGVzdF9zZWdmYXVsdF9PQkpFQ1RTKSAkKHRlc3Rfc2VnZmF1bHRfTERBREQpICQoTElCUykKK3Rlc3Qtc2VydmljZSQoRVhFRVhUKTogJCh0ZXN0X3NlcnZpY2VfT0JKRUNUUykgJCh0ZXN0X3NlcnZpY2VfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdGVzdC1zZXJ2aWNlJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJCh0ZXN0X3NlcnZpY2VfTElOSykgJCh0ZXN0X3NlcnZpY2VfT0JKRUNUUykgJCh0ZXN0X3NlcnZpY2VfTERBREQpICQoTElCUykKK3Rlc3Qtc2hlbGwtc2VydmljZSQoRVhFRVhUKTogJCh0ZXN0X3NoZWxsX3NlcnZpY2VfT0JKRUNUUykgJCh0ZXN0X3NoZWxsX3NlcnZpY2VfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdGVzdC1zaGVsbC1zZXJ2aWNlJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJCh0ZXN0X3NoZWxsX3NlcnZpY2VfTElOSykgJCh0ZXN0X3NoZWxsX3NlcnZpY2VfT0JKRUNUUykgJCh0ZXN0X3NoZWxsX3NlcnZpY2VfTERBREQpICQoTElCUykKK3Rlc3Qtc2xlZXAtZm9yZXZlciQoRVhFRVhUKTogJCh0ZXN0X3NsZWVwX2ZvcmV2ZXJfT0JKRUNUUykgJCh0ZXN0X3NsZWVwX2ZvcmV2ZXJfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdGVzdC1zbGVlcC1mb3JldmVyJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJChMSU5LKSAkKHRlc3Rfc2xlZXBfZm9yZXZlcl9PQkpFQ1RTKSAkKHRlc3Rfc2xlZXBfZm9yZXZlcl9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2hlbGwtdGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3Bhd24tdGVzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdC1leGl0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0LW5hbWVzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0LXNlZ2ZhdWx0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0LXNlcnZpY2UuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Rlc3Qtc2hlbGwtc2VydmljZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdC1zbGVlcC1mb3JldmVyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0LXV0aWxzLlBsb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKKyQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworY2hlY2stVEVTVFM6ICQoVEVTVFMpCisJQGZhaWxlZD0wOyBhbGw9MDsgeGZhaWw9MDsgeHBhc3M9MDsgc2tpcD0wOyBcCisJc3JjZGlyPSQoc3JjZGlyKTsgZXhwb3J0IHNyY2RpcjsgXAorCWxpc3Q9JyAkKFRFU1RTKSAnOyBcCisJJChhbV9fdHR5X2NvbG9ycyk7IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKKwkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKKwkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKKwkJeHBhc3M9YGV4cHIgJCR4cGFzcyArIDFgOyBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPVhQQVNTOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJY29sPSQkZ3JuOyByZXM9UEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICBlc2FjOyBcCisJICAgIGVsaWYgdGVzdCAkJD8gLW5lIDc3OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhmYWlsPWBleHByICQkeGZhaWwgKyAxYDsgXAorCQljb2w9JCRsZ247IHJlcz1YRkFJTDsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPUZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbHNlIFwKKwkgICAgICBza2lwPWBleHByICQkc2tpcCArIDFgOyBcCisJICAgICAgY29sPSQkYmx1OyByZXM9U0tJUDsgXAorCSAgICBmaTsgXAorCSAgICBlY2hvICIkJHtjb2x9JCRyZXMkJHtzdGR9OiAkJHRzdCI7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIHRlc3QgIiQkYWxsIiAtZXEgMTsgdGhlbiBcCisJICAgIHRlc3RzPSJ0ZXN0IjsgXAorCSAgICBBbGw9IiI7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0cz0idGVzdHMiOyBcCisJICAgIEFsbD0iQWxsICI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAorCSAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMDsgdGhlbiBcCisJICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgcGFzc2VkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMTsgdGhlbiBmYWlsdXJlcz1mYWlsdXJlOyBlbHNlIGZhaWx1cmVzPWZhaWx1cmVzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIGJlaGF2ZWQgYXMgZXhwZWN0ZWQgKCQkeGZhaWwgZXhwZWN0ZWQgJCRmYWlsdXJlcykiOyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBmYWlsZWQiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAxOyB0aGVuIHBhc3Nlcz1wYXNzOyBlbHNlIHBhc3Nlcz1wYXNzZXM7IGZpOyBcCisJICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgJCRwYXNzZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwkgIGRhc2hlcz0iJCRiYW5uZXIiOyBcCisJICBza2lwcGVkPSIiOyBcCisJICBpZiB0ZXN0ICIkJHNraXAiIC1uZSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCRza2lwIiAtZXEgMTsgdGhlbiBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0IHdhcyBub3QgcnVuKSI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0cyB3ZXJlIG5vdCBydW4pIjsgXAorCSAgICBmaTsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHNraXBwZWQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKKwkgICAgICBkYXNoZXM9IiQkc2tpcHBlZCI7IFwKKwkgIGZpOyBcCisJICByZXBvcnQ9IiI7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtbmUgMCAmJiB0ZXN0IC1uICIkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IHRoZW4gXAorCSAgICByZXBvcnQ9IlBsZWFzZSByZXBvcnQgdG8gJChQQUNLQUdFX0JVR1JFUE9SVCkiOyBcCisJICAgIHRlc3QgYGVjaG8gIiQkcmVwb3J0IiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHJlcG9ydCI7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9YGVjaG8gIiQkZGFzaGVzIiB8IHNlZCBzLy4vPS9nYDsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgZWNobyAiJCRncm4kJGRhc2hlcyI7IFwKKwkgIGVsc2UgXAorCSAgICBlY2hvICIkJHJlZCQkZGFzaGVzIjsgXAorCSAgZmk7IFwKKwkgIGVjaG8gIiQkYmFubmVyIjsgXAorCSAgdGVzdCAteiAiJCRza2lwcGVkIiB8fCBlY2hvICIkJHNraXBwZWQiOyBcCisJICB0ZXN0IC16ICIkJHJlcG9ydCIgfHwgZWNobyAiJCRyZXBvcnQiOyBcCisJICBlY2hvICIkJGRhc2hlcyQkc3RkIjsgXAorCSAgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyBcCisJZWxzZSA6OyBmaQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJChkaXN0ZGlyKS8kJHN1YmRpciI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X2Rpc3RkaXI9JCRyZWxkaXI7IFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJCh0b3BfZGlzdGRpcikiOyBcCisJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCisJICAgIG5ld190b3BfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBlY2hvICIgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXFwiOyBcCisJICAgIGVjaG8gIiAgICAgYW1fX3JlbW92ZV9kaXN0ZGlyPTogYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogYW1fX3NraXBfbW9kZV9maXg9OiBkaXN0ZGlyKSI7IFwKKwkgICAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcCisJCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKKwkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAorCQlhbV9fc2tpcF9tb2RlX2ZpeD06IFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgXAorCSAgZGlzdC1ob29rCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stVEVTVFMKK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUgJChMVExJQlJBUklFUykgJChQUk9HUkFNUykgYWxsLWxvY2FsCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1sb2NhbCBcCisJY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY2xlYW4tbm9pbnN0UFJPR1JBTVMgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktcmVjdXJzaXZlCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1yZWN1cnNpdmUKKworaHRtbC1hbToKKworaW5mbzogaW5mby1yZWN1cnNpdmUKKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktcmVjdXJzaXZlCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtcmVjdXJzaXZlCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtcmVjdXJzaXZlCisKK3BkZi1hbToKKworcHM6IHBzLXJlY3Vyc2l2ZQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgY2hlY2stYW0gXAorCWN0YWdzLXJlY3Vyc2l2ZSBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgdGFncy1yZWN1cnNpdmUKKworLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCisJYWxsIGFsbC1hbSBhbGwtbG9jYWwgY2hlY2sgY2hlY2stVEVTVFMgY2hlY2stYW0gY2xlYW4gXAorCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1sb2NhbCBcCisJY2xlYW4tbm9pbnN0TFRMSUJSQVJJRVMgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgXAorCWN0YWdzLXJlY3Vyc2l2ZSBkaXN0LWhvb2sgZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworZGlzdC1ob29rOgorCWZvciBEIGluICQoVEVTVERJUlMpOyBkbwkJCQkJCVwKKwkJdGVzdCAtZCAkKGRpc3RkaXIpLyQkRCB8fCBta2RpciAkKGRpc3RkaXIpLyQkRCB8fCBleGl0IDEgOwlcCisJZG9uZSA7CQkJCQkJCQkJXAorCUZJTEVTPWAoY2QgJChzcmNkaXIpICYmICQoRklORF9URVNUUykgLW8gLW5hbWUgIiouaW4iIC1hIC1ub3QgLW5hbWUgTWFrZWZpbGUuaW4gfCBncmVwIC1FdiAiKC5zdm58Q1ZTKSIgKWAgOwkJCQkJXAorICAgICAgICBmb3IgRiBpbiAkJEZJTEVTOyBkbwkJCQkJCQlcCisJCUI9YGJhc2VuYW1lICQkRmA7IFwKKwkJaWYgdGVzdCAtZSAkJEYuaW47IHRoZW4gXAorCQkJZWNobyAiLS0gU2tpcHBpbmcgZmlsZSAkJEYgKC5pbiB2ZXJzaW9uIGV4aXN0cykiOyBcCisJCWVsaWYgdGVzdCAieCQkQiIgPSB4cnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLmNvbmY7IHRoZW4gXAorCQkJZWNobyAiLS0gU2tpcHBpbmcgZmlsZSAkJEYgKGdlbmVyYXRlZCkiOyBcCisJCWVsaWYgdGVzdCAtZSAiJCh0b3Bfc3JjZGlyKS9idXMvJCRCIjsgdGhlbiBcCisJCQllY2hvICItLSBTa2lwcGluZyBmaWxlICQkRiAoZnJvbSAvYnVzLykiOyBcCisJCWVsc2UgXAorCQkJZWNobyAnLS0gRGlzdGluZyBmaWxlICckJEYgOyBcCisJCQljcCAtZiAkKHNyY2RpcikvJCRGICQoZGlzdGRpcikvJCRGIHx8IGV4aXQgMTsgXAorCQlmaTsgXAorCWRvbmUKKworYWxsLWxvY2FsOgorCSQoQU1fVl9hdClmb3IgRCBpbiAkKFRFU1RESVJTKTsgZG8JCQkJCQkJCVwKKwkJdGVzdCAtZCAkKHRvcF9idWlsZGRpcikvdGVzdC8kJEQgfHwgbWtkaXIgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvJCREIHx8IGV4aXQgMSA7CVwKKwlkb25lIDsJCQkJCQkJCQkJCVwKKwlpZiAhICh0ZXN0ICQoc3JjZGlyKSA9IC4gfHwgdGVzdCAkKHNyY2RpcikgLWVmIC4pIDsgdGhlbgkJCQkJCQkJXAorCQlGSUxFUz1gKGNkICQoc3JjZGlyKSAmJiAkKEZJTkRfVEVTVFMpIHwgZ3JlcCAtRXYgIiguc3ZufENWUykiIClgIDsJCQkJCVwKKwkgICAgICAgIGZvciBGIGluICQkRklMRVM7IGRvCQkJCQkJCQlcCisJCQlTUkM9JChzcmNkaXIpLyQkRiA7CQkJCQkJCVwKKwkJCURFU1Q9JCh0b3BfYnVpbGRkaXIpL3Rlc3QvJCRGIDsJCQkJCQlcCisJICAgICAgICAgICAgICAgIGVjaG8gJy0tIENvcHlpbmcgdGVzdCBmaWxlICckJEYgOwkJCQkJXAorCQkJY3AgJCRTUkMgJCRERVNUIHx8IGV4aXQgMSA7CQkJCQkJXAorCQkJY2htb2QgdSt3ICQkREVTVCB8fCBleGl0IDEgOwkJCQkJCVwKKwkJZG9uZSA7CQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCQlcCisJCWVjaG8gJy0tIE5vIG5lZWQgdG8gY29weSB0ZXN0IGRhdGEgYXMgc3JjZGlyID0gYnVpbGRkaXInIDsJCQlcCisJZmkgOwkJCQkJCQkJCQkJXAorCWVjaG8gJy0tIENvcHlpbmcnICQodG9wX2J1aWxkZGlyKS9idXMvKi5jb25mICd0byB0ZXN0IGRpcmVjdG9yeScgOwkJCVwKKwljcCAkKHRvcF9idWlsZGRpcikvYnVzLyouY29uZiAkKHRvcF9idWlsZGRpcikvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcyB8fCBleGl0IDEgOyAgXAorCWNobW9kIHUrdyAkKHRvcF9idWlsZGRpcikvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy8qLmNvbmYgfHwgZXhpdCAxCisKK2NsZWFuLWxvY2FsOgorCWlmIHRlc3QgJChzcmNkaXIpICE9IC4gOyB0aGVuCQkJCQlcCisJCUZJTEVTPWAoY2QgJCh0b3BfYnVpbGRkaXIpL3Rlc3QgJiYgJChGSU5EX1RFU1RTKSB8IGdyZXAgLUV2ICIoLnN2bnxDVlMpIiApYCA7CVwKKwkgICAgICAgIGZvciBGIGluICQkRklMRVM7IGRvCQkJCQlcCisJCQlERVNUPSQodG9wX2J1aWxkZGlyKS90ZXN0LyQkRiA7CQkJXAorCSAgICAgICAgICAgICAgICBlY2hvICctLSBEZWxldGluZyB0ZXN0IGZpbGUgJyQkRiA7CQlcCisJCQlybSAkJERFU1QgfHwgZXhpdCAxIDsJCQkJXAorCQlkb25lIDsJCQkJCQkJXAorCQlSRVZFUlNFRElSUz0gOwkJCQkJCVwKKwkJZm9yIEQgaW4gJChURVNURElSUyk7IGRvCQkJCVwKKwkJCVJFVkVSU0VESVJTPSIkJEQgJCRSRVZFUlNFRElSUyIgOwkJXAorCQlkb25lIDsJCQkJCQkJXAorCQlmb3IgRCBpbiAkJFJFVkVSU0VESVJTOyBkbwkJCQlcCisJCQlybWRpciAkKHRvcF9idWlsZGRpcikvdGVzdC8kJEQgfHwgZXhpdCAxIDsJXAorCQlkb25lIDsJCQkJCQkJXAorCWZpCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1jbGllbnQtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdCBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1jbGllbnQtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE2MjBiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvYW5vbnltb3VzLWNsaWVudC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTYgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCBhIGNsaWVudCBjYW4gbG9naW4gYW5vbnltb3VzbHkKKworQ0xJRU5UCisKKyMjIFJlamVjdCB3aGF0ZXZlciBtZWNoYW5pc20gdGhlIGNsaWVudCBwaWNrcyBmaXJzdAorRVhQRUNUX0NPTU1BTkQgQVVUSAorU0VORCAnUkVKRUNURUQgREJVU19URVNUX05PTkVYSVNURU5UX01FQ0gxIEFOT05ZTU9VUyBEQlVTX1RFU1RfTk9ORVhJU1RFTlRfTUVDSDInCisKKyMjIEFuZCB0aGlzIHRpbWUgd2UgZ2V0IEFOT05ZTU9VUworCitFWFBFQ1RfQ09NTUFORCBBVVRICisjIyBvZiBjb3Vyc2UgcmVhbCBEQlVTX0NPT0tJRV9TSEExIHdvdWxkIG5vdCBzZW5kIHRoaXMgaGVyZS4uLgorU0VORCAnT0sgMTIzNGRlYWRiZWVmJworCitFWFBFQ1RfQ09NTUFORCBCRUdJTgorRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1zZXJ2ZXItc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdCBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1zZXJ2ZXItc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJhZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvYW5vbnltb3VzLXNlcnZlci1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTMgQEAKKyMjIHRoaXMgdGVzdHMgdGhlIHNlcnZlciBzaWRlIGluIGEgc3VjY2Vzc2Z1bCBhdXRoIG9mIHR5cGUgQU5PTllNT1VTIAorCitTRVJWRVIKKyMjIHZlcmlmeSB0aGF0IHByaW9yIHRvIGRvaW5nIGFueXRoaW5nLCB3ZSBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCitTRU5EICdBVVRIIEFOT05ZTU9VUyA0NDJkNDI3NTczMjAzMTJlMzEyZTMxJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQkVHSU4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRAorIyMgdmVyaWZ5IHRoYXQgd2UgYXJlIHN0aWxsIGFub255bW91cworRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzUxOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9jYW5jZWwuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxOSBAQAorIyMgdGhpcyB0ZXN0cyBjYW5jZWxpbmcgRVhURVJOQUwKKworU0VSVkVSCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdDQU5DRUwnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMjIG5vdyBzdGFydCBvdmVyIGFuZCBzZWUgaWYgaXQgd29ya3MKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIE9LCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK1NFTkQgJ0JFR0lOJworRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKKworCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2NsaWVudC1vdXQtb2YtbWVjaGFuaXNtcy5hdXRoLXNjcmlwdCBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2NsaWVudC1vdXQtb2YtbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZkM2FkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvY2xpZW50LW91dC1vZi1tZWNoYW5pc21zLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IHRlc3RzIHRoYXQgdGhlIGNsaWVudCBkaXNjb25uZWN0cyB3aGVuIGl0J3Mgb3V0IG9mCisjIyBrbm93biBtZWNoYW5pc21zCisKK0NMSUVOVAorRVhQRUNUX0NPTU1BTkQgQVVUSAorU0VORCAnUkVKRUNURUQgQk9OR09fTUQ1JworRVhQRUNUX1NUQVRFIE5FRURfRElTQ09OTkVDVApkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtZmFpbGVkLmF1dGgtc2NyaXB0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtZmFpbGVkLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGU5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1mYWlsZWQuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMSBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IGF1dGggb2YgdHlwZSBFWFRFUk5BTCB3aXRob3V0IGNyZWRlbnRpYWxzIHdpbGwgZmFpbAorCitTRVJWRVIKK05PX0NSRURFTlRJQUxTCisjIyB2ZXJpZnkgdGhhdCBwcmlvciB0byBkb2luZyBhbnl0aGluZywgd2UgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorIyMgdmVyaWZ5IHRoYXQgd2Ugc3RpbGwgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtcm9vdC5hdXRoLXNjcmlwdCBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNGI0MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMSBAQAorIyMgdGhpcyB0ZXN0cyB3ZSBjYW4gYXV0aCBFWFRFUk5BTCBhcyBvdXJzZWx2ZXMsIHdpdGggcm9vdCBjcmVkZW50aWFscworVU5JWF9PTkxZCitTRVJWRVIKK1JPT1RfQ1JFREVOVElBTFMKKyMjIDMwIGlzIEFTQ0lJICcwJyBpbiBoZXgKK1NFTkQgJ0FVVEggRVhURVJOQUwgMzAnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdCRUdJTicKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXNpbGx5LmF1dGgtc2NyaXB0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc2lsbHkuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxOGVlOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXNpbGx5LmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTIgQEAKKyMjIHRoaXMgdGVzdHMgd2UgY2FuJ3QgYXV0aCBpZiBzb2NrZXQgcmVwb3J0cyBzaWxseSBjcmVkZW50aWFscyBidXQgd2UgYXNrIGZvciBvdXIgb3duIHVpZAorCitTRVJWRVIKKyMjIHZlcmlmeSB0aGF0IHByaW9yIHRvIGRvaW5nIGFueXRoaW5nLCB3ZSBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCitTSUxMWV9DUkVERU5USUFMUworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorIyMgdmVyaWZ5IHRoYXQgd2Ugc3RpbGwgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI5MzhjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDEyIEBACisjIyB0aGlzIHRlc3RzIGEgc3VjY2Vzc2Z1bCBhdXRoIG9mIHR5cGUgRVhURVJOQUwKKworU0VSVkVSCisjIyB2ZXJpZnkgdGhhdCBwcmlvciB0byBkb2luZyBhbnl0aGluZywgd2UgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQkVHSU4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRAorIyMgdmVyaWZ5IHRoYXQgd2Ugbm93IGhhdmUgc29tZSBjcmVkZW50aWFscworRVhQRUNUX0hBVkVfU09NRV9DUkVERU5USUFMUwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0cmEtYnl0ZXMuYXV0aC1zY3JpcHQgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9leHRyYS1ieXRlcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFlMDFkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZXh0cmEtYnl0ZXMuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMCBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IHdlIGhhdmUgdGhlIGV4cGVjdGVkIGV4dHJhIGJ5dGVzIGF0IHRoZSBlbmQKKworU0VSVkVSCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdCRUdJTlxyXG5IZWxsbycKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVEX1dJVEhfVU5VU0VEX0JZVEVTCitFWFBFQ1RfVU5VU0VEICdIZWxsb1xyXG4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRApkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZmFpbC1hZnRlci1uLWF0dGVtcHRzLmF1dGgtc2NyaXB0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvZmFpbC1hZnRlci1uLWF0dGVtcHRzLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWQzODYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9mYWlsLWFmdGVyLW4tYXR0ZW1wdHMuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwzNCBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IGFmdGVyIHJldHJ5aW5nIHRvbyBvZnRlbiB3ZSBmYWlsCisKK1NFUlZFUgorTk9fQ1JFREVOVElBTFMKKworIyAxCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMgMgorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIDMKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKworIyA0CitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMgNQorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIDYKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgTkVFRF9ESVNDT05ORUNUCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9mYWxsYmFjay5hdXRoLXNjcmlwdCBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODgwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9mYWxsYmFjay5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDE3IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgYSBjbGllbnQgY2FuIGZhbGxiYWNrIHRvIGEgc2Vjb25kYXJ5IGF1dGggbWVjaCAKKworQ0xJRU5UCisKKyMjIFdpbGwgdHJ5IEVYVEVSTkFMIGJ5IGRlZmF1bHQgZmlyc3Qgd2l0aG91dCBmaXJzdCBjYWxsaW5nIEFVVEggYWxvbmUuCisKK0VYUEVDVF9DT01NQU5EIEFVVEgKK1NFTkQgJ1JFSkVDVEVEIEVYVEVSTkFMIERCVVNfQ09PS0lFX1NIQTEgREJVU19URVNUX05PTkVYSVNURU5UX01FQ0gnCisKKyMjIEFuZCB0aGlzIHRpbWUgd2UgZ2V0IERCVVNfQ09PS0lFX1NIQTEKKworRVhQRUNUX0NPTU1BTkQgQVVUSAorIyMgb2YgY291cnNlIHJlYWwgREJVU19DT09LSUVfU0hBMSB3b3VsZCBub3Qgc2VuZCB0aGlzIGhlcmUuLi4KK1NFTkQgJ09LIDEyMzRkZWFkYmVlZicKKworRVhQRUNUX0NPTU1BTkQgQkVHSU4KK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQtY2xpZW50LmF1dGgtc2NyaXB0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDggQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCByZWNlaXZpbmcgYSBub25leGlzdGVudCBjb21tYW5kIGlzIGhhbmRsZWQgcHJvcGVybHkKKyMjIGJ5IGEgY2xpZW50CisKK0NMSUVOVAorRVhQRUNUX0NPTU1BTkQgQVVUSAorU0VORCAnTk9ORVhJU1RFTlRfQ09NTUFORCBmb28gYmFyIGJheiBibGFoIGJsYWgnCitFWFBFQ1RfQ09NTUFORCBFUlJPUgorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQuYXV0aC1zY3JpcHQgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5Y2I4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtY29tbWFuZC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDcgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCByZWNlaXZpbmcgYSBub25leGlzdGVudCBjb21tYW5kIGlzIGhhbmRsZWQgcHJvcGVybHkKKyMjIGJ5IGEgc2VydmVyCisKK1NFUlZFUgorU0VORCAnTk9ORVhJU1RFTlRfQ09NTUFORCBmb28gYmFyIGJheiBibGFoIGJsYWgnCitFWFBFQ1RfQ09NTUFORCBFUlJPUgorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdCBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtaGV4LWVuY29kaW5nLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTVjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDYgQEAKKyMjIHRoaXMgdGVzdHMgYW4gaW52YWxpZCBoZXggZW5jb2RpbmcgZm9sbG93ZWQgYnkgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbgorCitTRVJWRVIKK1NFTkQgJ0FVVEggRVhURVJOQUwgd2lsbHknCitFWFBFQ1RfQ09NTUFORCBFUlJPUgorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvYXV0aC9tZWNoYW5pc21zLmF1dGgtc2NyaXB0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQ0NzkxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDggQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCB0aGUgc2VydmVyIHNlbmRzIGEgbGlzdCBvZiBtZWNoYW5pc21zCisjIyBpbiByZXNwb25zZSB0byBibGFuayBBVVRICisKK1NFUlZFUgorU0VORCBBVVRICitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMS5jb25mIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0xLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNDFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMS5jb25mCkBAIC0wLDAgKzEsMjUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5ub25leGlzdGVudC5jb25mPC9pbmNsdWRlPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjUwMDA8L2xpbWl0PiAgIAorICA8bGltaXQgbmFtZT0ibWF4X291dGdvaW5nX2J5dGVzIj41MDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiPjMwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiPjUwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0iYXV0aF90aW1lb3V0Ij42MDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMiPjUwPC9saW1pdD4gIAorICA8bGltaXQgbmFtZT0ibWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMiPjgwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9jb25uZWN0aW9uc19wZXJfdXNlciI+NjQ8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiPjY0PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9uYW1lc19wZXJfY29ubmVjdGlvbiI+MjU2PC9saW1pdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMi5jb25mIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0yLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMi5jb25mCkBAIC0wLDAgKzEsNSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKzxpbmNsdWRlPmJhc2ljLTEuY29uZjwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMuZC9iYXNpYy5jb25mIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kL2Jhc2ljLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwOWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMuZC9iYXNpYy5jb25mCkBAIC0wLDAgKzEsMTMgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5ub25leGlzdGVudC5jb25mPC9pbmNsdWRlPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2Jhc2ljLmQvYmFzaWMuY29uZiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZC9iYXNpYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDlkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2Jhc2ljLmQvYmFzaWMuY29uZgpAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0xLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTEuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNjZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0xLmNvbmYKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBUaGlzIGNvbmZpZyBmaWxlIGNvbnRhaW5zIFhNTCBlbnRpdGllcyAtLT4KKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby8mbHQ7YmFyJmd0OzwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuJiMxMDA7PC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyLyZhbXA7c2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWUmIzExNTsiPm5vbmV4aXN0ZW50LmNvbmYmIzExMDs8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iJiMxMDA7ZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0yLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZhYmVhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0yLmNvbmYKQEAgLTAsMCArMSw1IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorPGluY2x1ZGU+ZW50aXRpZXMtMS5jb25mPC9pbmNsdWRlPgorPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMvbWlzc2luZy1ib2R5Lm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW5jb21wbGV0ZS1tZXNzYWdlcy9taXNzaW5nLWJvZHkubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzhlOWVhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMvbWlzc2luZy1ib2R5Lm1lc3NhZ2UKQEAgLTAsMCArMSwxOSBAQAorIyMgbWVzc2FnZSB0aGF0J3MgbWlzc2luZyBhbiBleHBlY3RlZCBib2R5CisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKKyMjIGNyZWF0ZSB0aGUgYm9keSwgdGhlbiBjaG9wIGl0IG9mZgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgSU5UMzIKK0lOVDMyIDM3CitFTkRfTEVOR1RIIEJvZHkKKworQ0hPUCA4CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0xLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0xLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1MmRlZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTEuY29uZgpAQCAtMCwwICsxLDEwIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgc2VsaW51eF9yb290X3JlbGF0aXZlPSJqb21vbWEiPmJsYWg8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTIuY29uZiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNiOTVjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMi5jb25mCkBAIC0wLDAgKzEsMTAgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZl9zZWxpbnV4X2VuYWJsZWQ9Im1vbyI+YmxhaDwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTEuY29uZiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0xLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhODk1YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0xLmNvbmYKQEAgLTAsMCArMSw0IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIiAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKzxpbmNsdWRlPmNpcmN1bGFyLTEuY29uZjwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0yLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTdlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMi5jb25mCkBAIC0wLDAgKzEsNCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+Cis8aW5jbHVkZT5jaXJjdWxhci0zLmNvbmY8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMy5jb25mIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2UzNTRkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTMuY29uZgpAQCAtMCwwICsxLDQgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorPGluY2x1ZGU+Y2lyY3VsYXItMi5jb25mPC9pbmNsdWRlPgorPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL25vdC13ZWxsLWZvcm1lZC5jb25mIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL25vdC13ZWxsLWZvcm1lZC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTljYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvbm90LXdlbGwtZm9ybWVkLmNvbmYKQEAgLTAsMCArMSw1IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L2Zvbz4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL3RydW5jYXRlZC1maWxlLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvdHJ1bmNhdGVkLWZpbGUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL3RydW5jYXRlZC1maWxlLmNvbmYKQEAgLTAsMCArMSw5IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLW5pbC5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5N2ExMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLW5pbC5tZXNzYWdlCkBAIC0wLDAgKzEsMzEgQEAKKyMgTWVzc2FnZSB3aXRoIGFuIGFycmF5IG9mIE5JTCAobm90IGFsbG93ZWQpCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEggCitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgQVJSQVkKK1RZUEUgTklMCitVSU5UMzIgNQorCisjIyB3ZSB3YW50IGl0IHRvIGZhaWwgYmVjYXVzZSBvZiB0eXBlIG5pbCwgbm90IGJlY2F1c2UgdGhlIGxlbmd0aCBpcyBubyBnb29kCisjIyBzbyBwYWQgb3V0IHRoZSBtZXNzYWdlIHdpdGggNSBieXRlcworQllURSAxCitCWVRFIDIKK0JZVEUgMworQllURSA0CitCWVRFIDUKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMmQxZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LXdpdGgtbWl4ZWQtdHlwZXMubWVzc2FnZQpAQCAtMCwwICsxLDUyIEBACisjIE1lc3NhZ2Ugd2l0aCBhbiBhcnJheSBvZiBhcnJheSB3aGVyZSB0aGUgY2hpbGQgYXJyYXlzIGFyZSBvZgorIyBkaWZmZXJlbnQgdHlwZXMKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CisKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCisKK0xFTkdUSCBBcnJheQorU1RBUlRfTEVOR1RIIEFycmF5CisKKyMjIGFycmF5IG9mIHVpbnQzMgorTEVOR1RIIFN1YkFycmF5MQorU1RBUlRfTEVOR1RIIFN1YkFycmF5MQorVUlOVDMyIDEKK1VJTlQzMiAyCitVSU5UMzIgMworRU5EX0xFTkdUSCBTdWJBcnJheTEKKworIyMgYXJyYXkgb2YgdWludDMyCitMRU5HVEggU3ViQXJyYXkyCitTVEFSVF9MRU5HVEggU3ViQXJyYXkyCitVSU5UMzIgNAorVUlOVDMyIDUKK0VORF9MRU5HVEggU3ViQXJyYXkyCisKKyMjIGFycmF5IG9mIGJvb2xlYW4KK0xFTkdUSCBTdWJBcnJheTMKK1NUQVJUX0xFTkdUSCBTdWJBcnJheTMKK0JPT0xFQU4gZmFsc2UKK0JPT0xFQU4gdHJ1ZQorRU5EX0xFTkdUSCBTdWJBcnJheTMKKworRU5EX0xFTkdUSCBBcnJheQorCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLWFycmF5Lm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDAwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlCkBAIC0wLDAgKzEsMjcgQEAKKyMjIGEgbWVzc2FnZSB3aXRoIGFuIGludmFsaWQgYm9vbGVhbiBhcnJheQorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIEFSUkFZCitUWVBFIEJPT0xFQU4KK0FMSUdOIDQKK0lOVDMyIDMKK0JZVEUgMAorQllURSAxCitCWVRFIDMKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwMjZkYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UKQEAgLTAsMCArMSwyMiBAQAorIyMgYSBtZXNzYWdlIHdpdGggYW4gaW52YWxpZCBib29sZWFuIHZhbHVlCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgQk9PTEVBTgorQllURSAzCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc5YmFhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWVuZGlhbi5tZXNzYWdlCkBAIC0wLDAgKzEsMjUgQEAKKyMjIG1lc3NhZ2Ugd2l0aCBpbnZhbGlkIGVuZGlhbm5lc3MgdGFnCisKK0JZVEUgJ2knCitCWVRFIDEKK0JZVEUgMAorQllURSAwCisKK0xFTkdUSCBIZWFkZXIKK0xFTkdUSCBCb2R5CisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1oZWFkZXItZmllbGQtYWxpZ25tZW50Lm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzBkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlCkBAIC0wLDAgKzEsMzggQEAKKyMjIGxhc3QgZmllbGQgaW5jb3JyZWN0bHkgYWxpZ25lZCB0byA0IGJ5dGVzCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKKworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworCitBTElHTiA0CisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIEFSUkFZCitUWVBFIEJZVEUKK0FMSUdOIDQKK0xFTkdUSCBUaGlzQnl0ZUFycmF5CitTVEFSVF9MRU5HVEggVGhpc0J5dGVBcnJheQorQllURSAxCitCWVRFIDIKK0VORF9MRU5HVEggVGhpc0J5dGVBcnJheQorCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWhhcy1uby12YWx1ZS5tZXNzYWdlLXJhdyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2Jvb2xlYW4taGFzLW5vLXZhbHVlLm1lc3NhZ2UtcmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjE1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWhhcy1uby12YWx1ZS5tZXNzYWdlLXJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9sb2NhbC1uYW1lc3BhY2UubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2xvY2FsLW5hbWVzcGFjZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzIwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9sb2NhbC1uYW1lc3BhY2UubWVzc2FnZQpAQCAtMCwwICsxLDIxIEBACisjIyBhIG1lc3NhZ2UgdGhhdCBpcyBpbiB0aGUgb3JnLmZyZWVkZXNrdG9wLkxvY2FsLiBuYW1lc3BhY2UgYW5kIHRodXMKKyMjIGludmFsaWQKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCcKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0Rpc2Nvbm5lY3RlZCcKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbm8tZG90LWluLW5hbWUubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MzE3YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UKQEAgLTAsMCArMSwxOSBAQAorIyMgYSBtZXNzYWdlIHdpdGggZG90bGVzcyBpbnRlcmZhY2UKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdOb0RvdEluSGVyZScKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg0NmRhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbm90LW51bC1oZWFkZXItcGFkZGluZy5tZXNzYWdlCkBAIC0wLDAgKzEsMjUgQEAKKyMjIGhhcyBvbmUgbm9uLW51bCBieXRlIGluIGhlYWRlciBwYWRkaW5nCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EnCitBTElHTiA4CisjIyBraWxsIGEgcGFkZGluZyBieXRlIGFuZCByZXBsYWNlIGl0CitDSE9QIDEKK0JZVEUgJ3EnCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvb3ZlcmxvbmctbmFtZS5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvb3ZlcmxvbmctbmFtZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjkwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9vdmVybG9uZy1uYW1lLm1lc3NhZ2UKQEAgLTAsMCArMSwyMCBAQAorIyMgYSBtZXNzYWdlIHdpdGggdG9vLWxvbmcgbmFtZSBmaWVsZAorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZm9vLmJhci50aGlzLmlzLnJlYWxseS5sb25nIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2IDc3IDc4IDc5IDgwIDgxIDgyIDgzIDg0IDg1IDg2IDg3IDg4IDg5IDkwIDkxIDkyIDkzIDk0IDk1IDk2IDk3IDk4IDk5IDEwMCAxMDEgMTAyIDEwMyAxMDQgMTA1IDEwNiAxMDcgMTA4IDEwOSAxMTAgMTExIDExMiAxMTMgMTE0IDExNSAxMTYgMTE3IDExOCAxMTkgMTIwIDEyMSAxMjIgMTIzIDEyNCAxMjUgMTI2IDEyNyAxMjggMTI5IDEzMCAxMzEgMTMyIDEzMyAxMzQgMTM1IDEzNiAxMzcgMTM4IDEzOSAxNDAgMTQxIDE0MiAxNDMgMTQ0IDE0NSAxNDYgMTQ3IDE0OCAxNDkgMTUwIDE1MSAxNTIgMTUzIDE1NCAxNTUgMTU2IDE1NyAxNTggMTU5IDE2MCAxNjEgMTYyIDE2MyAxNjQgMTY1IDE2NiAxNjcgMTY4IDE2OSAxNzAgMTcxIDE3MiAxNzMgMTc0IDE3NSAxNzYgMTc3IDE3OCAxNzkgMTgwIDE4MSAxODIgMTgzIDE4NCAxODUgMTg2IDE4NyAxODggMTg5IDE5MCAxOTEgMTkyIDE5MyAxOTQgMTk1IDE5NiAxOTcgMTk4IDE5OSAyMDAnCisKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKKworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLWxpdHRsZS1oZWFkZXItcGFkZGluZy5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLWxpdHRsZS1oZWFkZXItcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODgxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbGl0dGxlLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UKQEAgLTAsMCArMSwyNCBAQAorIyMgaGFzIG9uZSBieXRlIG1pc3NpbmcgZnJvbSBoZWFkZXIgcGFkZGluZworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworQUxJR04gOAorIyMga2lsbCBhIHBhZGRpbmcgYnl0ZQorQ0hPUCAxCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmctYnktZmFyLm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy1ieS1mYXIubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJiZTNhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmctYnktZmFyLm1lc3NhZ2UKQEAgLTAsMCArMSwyNiBAQAorIyMgaGFzIG9uZSBieXRlIGV4dHJhIGhlYWRlciBwYWRkaW5nCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EnCitBTElHTiA4CitCWVRFIDAKK0FMSUdOIDgKK0JZVEUgMAorQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWMyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy5tZXNzYWdlCkBAIC0wLDAgKzEsMjMgQEAKKyMjIGhhcyBvbmUgYnl0ZSBleHRyYSBoZWFkZXIgcGFkZGluZworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworQUxJR04gOAorQllURSAwCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLXNob3J0LWRpY3QubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjM2NjNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UKQEAgLTAsMCArMSwyOCBAQAorIyBNZXNzYWdlIHdpdGggbG90cyBvZiBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKKworRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgRElDVAorTEVOR1RIIERpY3QKK1NUQVJUX0xFTkdUSCBEaWN0CitTVFJJTkcgJ3VpbnQzMicKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitTVFJJTkcgJ3VpbnQzMicKK0VORF9MRU5HVEggRGljdAorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZS5pbiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTIxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMuc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb0V4ZWMKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZS5pbiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YWNlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorRXhlYz1AVEVTVF9TRVJWSUNFX0JJTkFSWUAKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZS5pbiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vVXNlci5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjg5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIKK0V4ZWM9QFRFU1RfU0VSVklDRV9CSU5BUllACisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9zaGEtMS9SZWFkbWUudHh0IGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3NoYS0xL1JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjYTNmOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9zaGEtMS9SZWFkbWUudHh0CkBAIC0wLDAgKzEsODMgQEAKK1Rlc3Qgc3VpdGUgZnJvbSBodHRwOi8vY3NyYy5uaXN0Lmdvdi9jcnlwdHZhbC9zaHMuaHRtbAorCisJCQkJU2FtcGxlIFZlY3RvcnMgZm9yIFNIQS0xIFRlc3RpbmcKKworCVRoaXMgZmlsZSBkZXNjcmliZXMgdGVzdHMgYW5kIHZlY3RvcnMgdGhhdCBjYW4gYmUgdXNlZCBpbiB2ZXJpZnlpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIAorYW4gU0hBLTEgaW1wbGVtZW50YXRpb24uICBIb3dldmVyLCB1c2Ugb2YgdGhlc2UgdmVjdG9ycyBkb2VzIG5vdCB0YWtlIHRoZSBwbGFjZSBvZiB2YWxpZGF0aW9uIAorb2J0YWluZWQgdGhyb3VnaCB0aGUgQ3J5cHRvZ3JhcGhpYyBNb2R1bGUgVmFsaWRhdGlvbiBQcm9ncmFtLgorCisJVGhlcmUgYXJlIHRocmVlIGFyZWFzIG9mIHRoZSBTZWN1cmUgSGFzaCBTdGFuZGFyZCBmb3Igd2hpY2ggdGVzdCB2ZWN0b3JzIGFyZSBzdXBwbGllZDoKK3Nob3J0IG1lc3NhZ2VzIG9mIHZhcnlpbmcgbGVuZ3RoLCBzZWxlY3RlZCBsb25nIG1lc3NhZ2VzLCBhbmQgcHNldWRvcmFuZG9tbHkgZ2VuZXJhdGVkIG1lc3NhZ2VzLgorU2luY2UgaXQgaXMgcG9zc2libGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIGhhc2hpbmcgb2YgYnl0ZS1vcmllbnRlZAorbWVzc2FnZXMgKGFuZCBub3QgbWVzc2FnZXMgb2YgYSBub24tYnl0ZSBsZW5ndGgpLCB0aGUgU0hTIHRlc3RzIGVhY2ggY29tZSBpbiB0d28gZmxhdm9ycy4gIEZvcgorYm90aCBieXRlIG9yaWVudGVkIGFuZCBiaXQgb3JpZW50ZWQgbWVzc2FnZXMsIHRoZSBtZXNzYWdlIGxlbmd0aHMgYXJlIGdpdmVuIGluIGJpdHMuCisKK1R5cGUgSSBUZXN0OiBNZXNzYWdlcyBvZiBWYXJ5aW5nIExlbmd0aAorCisJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNIUyBtdXN0IGJlIGFibGUgdG8gY29ycmVjdGx5IGdlbmVyYXRlIG1lc3NhZ2UgZGlnZXN0cyBmb3IKK21lc3NhZ2VzIG9mIGFyYml0cmFyeSBsZW5ndGguICBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHRlc3RlZCBieSBzdXBwbHlpbmcgdGhlIGltcGxlbWVudGF0aW9uCit3aXRoIDEwMjUgcHNldWRvcmFuZG9tbHkgZ2VuZXJhdGVkIG1lc3NhZ2VzIHdpdGggbGVuZ3RocyBmcm9tIDAgdG8gMTAyNCBiaXRzIChmb3IgYW4gaW1wbGVtZW50YXRpb24KK3RoYXQgb25seSBoYXNoZXMgYnl0ZS1vcmllbnRlZCBkYXRhIGNvcnJlY3RseSwgMTI5IG1lc3NhZ2VzIG9mIGxlbmd0aCAwLCA4LCAxNiwgMjQsLi4uLDEwMjQgYml0cword2lsbCBiZSBzdXBwbGllZCkuCisKK1R5cGUgSUkgVGVzdDogU2VsZWN0ZWQgTG9uZyBNZXNzYWdlcworCisJQWRkaXRpb25hbCB0ZXN0aW5nIG9mIGFuIGltcGxlbWVudGF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGVzdGluZyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbgorY2FuIGNvcnJlY3RseSBnZW5lcmF0ZSBkaWdlc3RzIGZvciBsb25nZXIgbWVzc2FnZXMuICBBIGxpc3Qgb2YgMTAwIG1lc3NhZ2VzLCBlYWNoIG9mIGxlbmd0aCA+IDEwMjQsCitpcyBzdXBwbGllZC4gIFRoZXNlIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaGFzaGluZyBvZiBsb25nZXIgbWVzc2FnZSBsZW5ndGhzLiAgRm9yIGJpdCBvcmllbnRlZAordGVzdGluZyB0aGUgbWVzc2FnZXMgYXJlIGZyb20gMTAyNSB0byAxMDM0MjUgYml0cyBsb25nIChsZW5ndGg9MTAyNStpKjEwMjQsIHdoZXJlIDA8PWk8MTAwKS4gIEZvcgorYnl0ZSBvcmllbnRlZCB0ZXN0aW5nIHRoZSBtZXNzYWdlcyBhcmUgZnJvbSAxMDMyIHRvIDEwMzQzMiAobGVuZ3RoPTEwMzIraSoxMDI0LCB3aGVyZSAwPD1pPDEwMCkuCisKK1R5cGUgSUlJIFRlc3Q6IFBzZXVkb3JhbmRvbWx5IEdlbmVyYXRlZCBNZXNzYWdlcworCisJVGhpcyB0ZXN0IGRldGVybWluZXMgd2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gY2FuIGNvbXB1dGUgbWVzc2FnZSBkaWdlc3RzIGZvciBtZXNzYWdlcwordGhhdCBhcmUgZ2VuZXJhdGVkIHVzaW5nIGEgZ2l2ZW4gc2VlZC4gIEEgc2VxdWVuY2Ugb2YgMTAwIG1lc3NhZ2UgZGlnZXN0cyBpcyBnZW5lcmF0ZWQgdXNpbmcgdGhpcworc2VlZC4gIFRoZSBkaWdlc3RzIGFyZSBnZW5lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcHNldWRvY29kZToKKworcHJvY2VkdXJlIE1vbnRlQ2FybG8oc3RyaW5nIFNFRUQpCit7CisJaW50ZWdlciBpLCBqLCBhOworCXN0cmluZwlNOworCisJTSA6PSBTRUVEOworCWZvciBqID0gMCB0byA5OSBkbyB7CisJCWZvciBpID0gMSB0byA1MDAwMCBkbyB7CisJCQlmb3IgYSA9IDEgdG8gKGovNCo4ICsgMjQpIGRvIE0gOj0gTSB8fCCSMJI7CS8qkTAnIGlzIHRoZSBiaW5hcnkgemVybyBiaXQuICovCisJCQlNIDo9IE0gfHwgaTsgCS8qIEhlcmUsIHRoZSB2YWx1ZSBmb3IgkWmSIGlzIGV4cHJlc3NlZCBhcyBhIDMyLWJpdCB3b3JkCisJCQkJCSAgIGFuZCBjb25jYXRlbmF0ZWQgd2l0aCCRTZIuIFRoZSBmaXJzdCBiaXQKKwkJCQkJICAgY29uY2F0ZW5hdGVkIHdpdGggkU2SIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZgorCQkJCQkgICB0aGlzIDMyLWJpdCB3b3JkLiAqLworCQkJTSA6PSBTSEEoTSk7CisJCQl9CisJCXByaW50KE0pOworCQl9CisJfQorCitOT1RFOiBJbiB0aGUgYWJvdmUgcHJvY2VkdXJlLCB8fCBkZW5vdGVzIGNvbmNhdGVuYXRpb24uIEFsc28sIE0gfHwgaSBkZW5vdGVzIGFwcGVuZGluZyB0aGUgMzItYml0Cit3b3JkIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgkWmSLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gMiBvZiB0aGUgU0hTLiAgV2l0aGluIHRoZSBwcm9jZWR1cmUsIE0gaXMgYSBzdHJpbmcKK29mIHZhcmlhYmxlIGxlbmd0aC4gVGhlIGluaXRpYWwgbGVuZ3RoIG9mIDQxNiBiaXRzIGVuc3VyZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIE0gbmV2ZXIgZXhjZWVkcyA1MTIgYml0cworZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgYWJvdmUgcHJvY2VkdXJlLCBhbmQgaXQgZW5zdXJlcyB0aGF0IG1lc3NhZ2VzIHdpbGwgYmUgb2YgYSBieXRlIGxlbmd0aC4gIEVhY2gKK2VsZW1lbnQgcHJpbnRlZCBzaG91bGQgYmUgMTYwIGJpdHMgaW4gbGVuZ3RoLgorCisKK0ZpbGUgZm9ybWF0czoKKworVGhlcmUgYXJlIHR3byBmaWxlcyBpbmNsdWRlZCBmb3IgZWFjaCB0ZXN0IHR5cGUgKGJpdC1vcmllbnRlZCBhbmQgYnl0ZS1vcmllbnRlZCkuICBPbmUgZmlsZSBjb250YWlucwordGhlIG1lc3NhZ2VzIGFuZCB0aGUgb3RoZXIgZmlsZSBjb250YWlucyB0aGUgaGFzaGVzLgorCitUaGUgbWVzc2FnZSBmaWxlcyBwcm92aWRlZCB1c2UgImNvbXBhY3Qgc3RyaW5ncyIgdG8gc3RvcmUgdGhlIG1lc3NhZ2UgdmFsdWVzLiAgQ29tcGFjdCBzdHJpbmdzIGFyZSAKK3VzZWQgdG8gcmVwcmVzZW50ZWQgdGhlIG1lc3NhZ2VzIGluIGEgY29tcGFjdCBmb3JtLiAgQSBjb21wYWN0IHN0cmluZyBoYXMgdGhlIGZvcm0KKwl6IHx8IGIgfHwgbigxKSB8fCBuKDIpIHx8IC4uLiB8fCBuKHopCit3aGVyZSB6Pj0wIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG4sIGIgaXMgZWl0aGVyIDAgb3IgMSwgYW5kIGVhY2ggbihpKSBpcyBhIGRlY2ltYWwgaW50ZWdlcgorcmVwcmVzZW50aW5nIGEgcG9zaXRpdmUgbnVtYmVyLiAgVGhlIGxlbmd0aCBvZiB0aGUgY29tcGFjdCBzdHJpbmcgaXMgZ2l2ZW4gYnkgdGhlIHN1bW1hdGlvbiBvZiB0aGUgbihpKS4KKworVGhlIGNvbXBhY3Qgc3RyaW5nIGlzIGludGVycHJldGVkIGFzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYml0IHN0cmluZyBjb25zaXN0aW5nIG9mIGIgcmVwZWF0ZWQgbigxKSB0aW1lcywKK2ZvbGxvd2VkIGJ5IDEtYiByZXBlYXRlZCBuKDIpIHRpbWVzLCBmb2xsb3dlZCBieSBiIHJlcGVhdGVkIG4oMykgdGltZXMsIGFuZCBzbyBvbi4KKworRXhhbXBsZToKKwlNID0gNSAxIDcgMTMgNSAxIDIKKwl3aGVyZSB6ID0gNSBhbmQgYiA9IDEuICBUaGVuIHRoZSBjb21wYWN0IHN0cmluZyBNIHJlcHJlc2VudHMgdGhlIGJpdCBzdHJpbmcKKwkxMTExMTExMDAwMDAwMDAwMDAwMDExMTExMDExCisJd2hlcmUgMSBpcyByZXBlYXRlZCA3IHRpbWVzLCAwIGlzIHJlcGVhdGVkIDEzIHRpbWVzLCAxIGlzIHJlcGVhdGVkIDUgdGltZXMsCisJMCBpcyByZXBlYXRlZCAxIHRpbWUsIGFuZCAxIGlzIHJlcGVhdGVkIDIgdGltZXMuCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9zaGEtMS9iaXQtaGFzaGVzLnNoYTEgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvc2hhLTEvYml0LWhhc2hlcy5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGU5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvc2hhLTEvYml0LWhhc2hlcy5zaGExCkBAIC0wLDAgKzEsMTIzOSBAQAorIyAgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgIlNIQS0xIFRlc3QiCisjICBTSEEgdGVzdHMgYXJlIGNvbmZpZ3VyZWQgZm9yIEJJVCBvcmllbnRlZCBpbXBsZW1lbnRhdGlvbnMKK0g+U0hTIFR5cGUgMSBIYXNoZXM8SAorRD4KK0RBMzlBM0VFNUU2QjRCMEQzMjU1QkZFRjk1NjAxODkwQUZEODA3MDkgXgorNTlDNDUyNkFBMkNDNTlGOUE1RjU2QjU1NzlCQTcxMDhFN0NDQjYxQSBeCis2RTQyRkI4NDA2N0NGRjA1NkM0M0E0OUU0ODQ5OTdBRjIzMTkwODc5IF4KK0M2M0ZCQjlBODcxNzFBMTc2RTZFMDU0ODkwRTI5QThDNUYxMjVGNkMgXgorMzEwOUUzM0MxQzRCOUEwMTY5RDE1OTkxNjlEMEU1QTUyMEExRTcxQyBeCis5MTk1RTFFNzNDQzY4RDcxNzBGNDRCRDFEODNDQjYyNEJDODdGQTBCIF4KKzY0RjdDMzc0NTI3Mjc4QzA0MzZEQkM4REU1QUFCRUMyQkJGNjM0QkMgXgorMTU0QjYyMkVBNDI2RkIxNTFCMUZGMUJFMUNFODcxNzUyQjlFREVCNCBeCisxMkJERDAwRkQ0MDM4NzU2Q0JDRjhFQ0RBRDFCMENEODYyNjAzQ0Q4IF4KKzY3MDBGOTNFMTY5MUU4MzczNTI3OUUxNjdGNjdBRjYxRkVFOTgxM0IgXgorODRBRjIwQTA2Nzk5RjM2NjQzNUJBMjBGOTlCOUExMDk1NUI2RDI3NiBeCitDNjIyRkUwMDNGRDE2MjIwMzU3Rjg4RkM2QjlERTQ3ODlFNzdDMzIxIF4KK0M4REVBNUE5OERBREExRjk2NjJENUMxNTA2MTgxNDBBMTUwRUNBNDYgXgorRkJCNzEyN0U3N0EzOUQ4NTZFQzg0OUQ3NTVDODY4Q0E3QjlGMTFFOSBeCitCN0Q4QTdBMzlBQjMzRUQ4QzNBRkQ4Rjc2MjAxQkYwOTA0MTQ5NDM3IF4KKzE1NDUzNTQ2MEExMkI5RTEwMEUyNTFCQjNBNEQ0REJDRDgwQTMwOUEgXgorODJGQzYwMjBDN0E5QjYyRjMzNEY3MTU2QURBNjA4NTMyRENBNkEzQiBeCis5REQ5ODBCODA3M0IzMkQyMUU5QjIzMjRGOTgyMDI0Mzc1QzI5NTFGIF4KKzQxOUY5N0E5ODk5NDg2REM1M0M1OEM3NjFDRUI1NjQzMTRGRDQ3QkQgXgorQTIxMkU0M0VCRkIzMTM4OEY2NEMwQzBCMEIxQ0M3MDE5NzA0Qjc0NCBeCitEOEYxNjIzQzE4NkE1NjE1RjU4RTg0NkM5RDE2NEYzNUE4OTU2RTQ0IF4KK0FBMzI4NDhERTE0OTkzNjU3MzBBMzY1MEEzQTc3MDNGRDQwNDI1OUEgXgorNzlCREIwMUU1NUI2MUE4QzFBRkJGNjNEM0NFMkRDQ0FCOENGM0RGQiBeCisyM0JGMzE2NEE0NDhBNzI3QkE3MTQ1N0VCQTlGQ0ZBQkZCQUM0RjcwIF4KK0JBMjZFODQ2RUJFRjc0MzRCNjNGNTg2MkZEQTAwNUExQ0VCNTY1NkUgXgorOTg2MjI4NjlBNDc0RUE4NUZFNTc1Q0Q5NzkzNTQyNDgxNDFBMTRBNyBeCis1QzlFN0U2OTUxRDM4NjIwNTU0MkRBMDY4MEUwN0U2MEVDNjFENjRFIF4KKzhFRjA3QTAyQTcwMjNBQTBFNkVFNEJFMTUxODYyN0E1MjFEMUY5RDUgXgorQ0RFQTM4MkE1REZEQTFDNjMzRjhCQkM3N0YyOTFGNDBFODgwMUNFMyBeCiszQzBBNzA5RkVGODVEREJDQzFCMzYyQUExNjIwMTA0NjFGMzFBRUNEIF4KKzEwQUJENkI4RDk3RTY4OEFGNUNEQTc5NTVDRDNDQzA4NTBBNEE3NUYgXgorMEVDNTMxMzNGN0ZGOTU1Q0EzN0QyNTQ5MUI1OTJERkMwMjU2QkYyMyBeCisxQTQ2QTY3RkVFRDE2MDQ1MjNDMDYyQUFDQzI0NTUyMjNCMzY2RDA1IF4KK0ZBM0RENzQ5RThGM0Q5MDI5RDkyNjFGMjUxNTdCM0MwRTJERjY4MzQgXgorNDNEQ0FDMkNGMjBFN0NDQjFERUQ2RTM3OUNDMzAyRjMwMjY1NUYzQiBeCis4QkEyNUJERjMzMTY3MUNDQjRCNjA5NjFFNEFGMzU2MjI0MDI3ODYyIF4KK0FDM0EzRUEwRkI4NzI3MzM0QTQ0NzhFRDE2NTEyODU4MUJCQzVCRUEgXgorQ0E0NDA2QTIzMUVBMkNBMDZDRDFEOEYzQzc3RkVGOTExOEIxNTAxQSBeCis1QjgzNDY1QjhFRUQxNDg3MUZCNTFEOUU2Q0U0OTlGQjJFNEI0MjA5IF4KKzk0NDVGNTIxODYxOTQ2RDQwNjNFMENBM0Y0MUY1ODA4NTVBNzQ1NEUgXgorQzI0MTAxNDA4MTg5NjJGOTU1MDZCNDA3QUU4NTE0RjExRjg5MkFFQyBeCitGOEY4MjZGRTBEOTNGNDE1NDI2QURCNjk1NjI0MjExNkNCQUIyNDI2IF4KK0M4MDNGNzUzOUFBMDM2Q0JCMzFCNzM1MjM4MTIwRkI4NTE4MEQ4QzggXgorMTYyRUI1MTYzNjkyRDlCQzdCNDUyOUQyMTRCQkI5MzIxNTczNjFCNiBeCitENEIwRDg3NkExOTUyQURCNUQyN0ExQTZCRjcxQkNGMjI3MzFBNEM1IF4KK0NCNUNEMjZBQTM5RTQ1RjI0ODcwNjYwNEVEQjlBMkRCOEVEQzFCRjYgXgorRjFBQzk4N0YzMEZGMDM3NUY2MTE1QzBDQ0Q2RTIyRERGRDBGQUZFNyBeCis2OTJFMjA5RDNBNkEwMjI4RUI5ODIzRENCNzM4QjE2QkRGOTdBNEU5IF4KK0ZCOUUxRTcxRjc2NDVFRUVFQjNEREU2NjcxNkRDNDQ0NDRDRDY1N0MgXgorRDUxRjA3MUUzNjBEOTYxMjREQTQ5QUQzN0UzN0RFMTdCNTY0OTIwRCBeCiswNjY3QUZDREJCODJCNDIxMzQ0N0QwQjIyMDA2REM0QTEzMjBDRDIxIF4KKzhGQkZDNjVGRUIyNTY1RjJGQjhBOTk2NkI3NDcwMjM1MEM4N0NGNDAgXgorOEE4QkJDRDZBRjc2RTcxMDY3RUIwQUY1NEY5MEVFNUFDMkI1ODgyRiBeCis4RDgzMUVGMjM0NEUzMzZDQzI3MjgxMjI3MTg1QTM0MzU2Qjg1NkE2IF4KK0RFN0FBNzQyNEY5MkNCQzUwOTY2RkM0RTZBNTc3Rjk4OTA1OTk4RkMgXgorMTA2NEVFNkJFRjcwNEYzQTYxOENCOUM1OEYyOTlCMjJBNEQzNDI5MyBeCis5NUY4Q0Y3RTg2NEZFQkJGNzdFNDYwNjcwNjNEMDhENTE3NUZDNTA4IF4KKzc5MzgxRjIzMDk3MEYxMjBEMTlCMTE1QkY4NjRDNzk0ODc4RTc3OTcgXgorRDgyQTMwRjQ5NTM4NTYxRDVBN0QxMzI0RUNBRDMyMUREMDVFMTIwMiBeCis1OTI2Q0VFQUU0M0QyOUE3QkU0QzBFRENBNjI2QzQzQUJFMDA0MTZBIF4KKzU2MzQ1OEM5RjJDMTZDNUFGOTY5MTVGQ0Q5MzA2RjFEOUJBNTc5QzkgXgorQzkyQjBCRDYwNEU0NUQ3NDc5QUUxOUY2NDFCMkRCMDY3RTRDQTc3NCBeCitENjlEMDEzRUU1Qzg3MUQzQUUzRTM4ODA5MEJDMUFBRjk4NTJBODNDIF4KKzdDMzQxRUNERUU3Mjk4NjA1OTMzNDY1RUE5QURCRTdFMDQ0QzhBNzkgXgorODNFQzY4N0QyMkExM0VERENENDcwQzUyQzQ1Mjc2QTZFMTU1NDk4MiBeCis2RDI3OTI4RjAxNDI2OUNFQzRFODc0NUVCNzNGQTcxNEJFMkRDNjJFIF4KKzc1QzBCRjMxMkMwNTIzMURBRjdFOUNENENBMzNBQ0E3OEJDQUE1OUEgXgorMDE1RDc5OUM2MDJERDRFMzBEMkMwMTA0QTU3QjFFMjE0QTQyM0Q2NiBeCitEMkY0M0VDQUQyMEYwQjRDNTdERDA3RDNDRUNFNTYyQjZCNzJDN0ZCIF4KKzI3OTQ4Q0U1QTU2RDU3MjQ4RDRERjY4M0RDM0ZFMDIzRDJCOUI0M0EgXgorMkQ1QTk4NEJGMzJERTI4MjQyNzQ0NDA2NDY5RTE4QjdBNTE3OEE5NyBeCitGRkM1QzRFQ0YwQ0MwNTEzMjBFMDcxRDE0QzdEQ0E0QTREREEzMDVBIF4KK0NFRDhBNTQ4N0FEMTNBRjAwMDMxMjk2NTlERTI1NTYxODM4MzZDNTQgXgorNTk5QkI1MDk4NjNDQzVEMjc1NDE2RjZEQjZDNUQyQkQ4MjdEQzM0NyBeCiszOTgxREFDODk1RERCOTI5NEQ5MzNDMUNFNzg4MjhFM0E1NThCMTUyIF4KKzkxRUI3MTU5MDQxMjNEMzI2QjIzQUNENjg0REZCRDcyMDNDQUJFQ0IgXgorNUE5QUM4QzM3MDVBRjE0RERFNTBFNkNGMkZFNUIwQzE1QzRCRDI4MiBeCitFMjYyMERGQjQyQjVFQ0FGODVGNTkwQTcxREY2OTY5MDZBQzQxQzREIF4KK0NCQUFEREE3QjVEQjM4OUJGMTc3NUFFNTAwNDAwODFBMDVBMEVFNDggXgorQUFGODBEMDc5RjNGOTgwQkY5RDUzNjZDNUIxOTkxQTNFM0Q5RkRDRSBeCisyQTg2MUY2MTY2MDRDNTI2QUNCMTU3NzMyREM0MzFFODFCQzlBMUY2IF4KK0ZCREIyMkFBMEI4NzcxOEY0NjRDMEQxQUEzOTY5NUExQkRDRTA1M0YgXgorNDMzMUJBMzMxNTIyRDRGOUNENjEzNzg1OERCOUFBMTZBQzk1MzE2RSBeCiszM0Y2QkZFMjNBNEMwRTA0QjhCRjY0MkNEOTY0MzdFRjAwNTVBQUY3IF4KKzIwNDYxMzhGNzg5OUZEQjIwNjNDRDg0Qjg0RTgyMTUyNTE3MkMwM0IgXgorRTRGREM4MTJDNUY3QTM3RkM3QTgxMDA1RjFFNzhCRkY1OTY2Njg4NyBeCis2NDc3RjkzMUFDMjBCMkZDRTFDOTIxNzFGQTREQ0YyRDI2NkIzREM1IF4KK0VEMERENTE2RkE3RkUyREI3QUZDQzNEQkVFRDA4NzlBMEMxMEYxQzIgXgorRkNFREEwMzExQzA4NTM2OEE1NzUxQkNBRDhFQUVEMjA2M0MyRDQwQSBeCisyM0VCMDhCNTEwMEM4RkJBRjdCMzA0OTg4N0ExMUNDNTMxQjZDRDc4IF4KK0E2QzQyQjc1N0RGMDc4QTY5RkZGNjgxOUE4QUJDNDZFMUIwOUY0MzUgXgorMDYxNUVFNDg0MEIxRjFDRDYyODYzNkQxQjRGNDQ5NTYzOURFREVCQyBeCitFMjI4ODExMDAwN0FFNkRCQ0NGQzc0Qjc3MzVGNEQ5NEIwQUExMEExIF4KKzE1OUUwMURDMzQ4RUIwNjdFOTBBNjNCQzZGRUZCRjRDNDVBMDFGOUEgXgorQTE2Mjg2NDU5Q0M5ODlBRTY2MkM3MzFGM0Q3RDBDRDQ4N0RDQ0IzQiBeCis4RkRBRkUyREUzNzIxNUUxNDJFMjdBNjVBODgxRjgwRTA0MzBCRjQ5IF4KKzFCRjk3OEI1OEQ5OEZDMTU3MzFGNDExMUU3QzdBNDlGOUNGRDdDNjUgXgorQzFGNjFDRDRCNERCMTRBQTYwQzY0NDhDMDM5OEVFQzcyMTA3ODI2QyBeCis1Q0YwQTdGNkY0NkE3MzBDRDkxMDNBNTRGMUVDOEE3NTQ5RkE1Nzg4IF4KK0ZEQzEwNDIxNzk0MEJFNUE3QUQxQzAyRDEyOEIzMTc0N0M5NzJBNUMgXgorREZGNThCRUY0RkY0MThEMjZBMzVCNTUyMTVDRTQxOUQzNTc5QTE5NCBeCiszQTJFRkQ0NDRGNEFBN0EzREI5NzY1RTAyN0NFNUQ4MkI1MUY2NzM3IF4KK0VCNjE2QjZGOTdDNUJGRDAyQzFCOUU0QUZCQThBNTE1MURENDE2N0YgXgorNjJGMzFGOUEyOEQwNTg3QkQ4MjUzNjAxQTdFRkI2OThCMDMyMDVGQSBeCitFODc2NDVCMkNCN0RGNjZEQTI3NzFBQkUwQ0VEQTBGNjI1RkM4QUZBIF4KK0U4MDFDMzA3MUNBNkFFRTI3OEIyMjI3NDdCRkE4MTlDMTE4QTJEREQgXgorRUM3MDIyM0JEOTYzQzEyMkU0RkNFMjkyODkzNERERDJENzY2MUNCQyBeCis4MjI2MUQyNjM3N0E1QTVEQzY5RTBGMzlEMEJCRjU5QTFCMkIyMjQ4IF4KKzJFNERFNzgxRTQ0MDdBRTUzNkY3MERDNUE1REJFQjE3OERCQTJGQzMgXgorQUQzRDk1OEI4ODRDQUEyOEQ1ODU4REExMDM0NjNDMzAwODYyREVFNiBeCisyQTZBNTYzQzdGRTMzMTI5NjM3RkFCQjRENDBGNUYwRUU4QjVDNTAwIF4KKzdFQTYwMDNBOEJFRjRENUJGQTZCRkVGQkNCNkE1QjNCMUEzQjc5OTEgXgorNkREQzYyMERCMTQ4ODI1NzVENUJBMTIxOTI4NENGMUMzMDY4MDk0RiBeCis5MUFEN0U1ODhFQzgyOTczOUMzNjMyNjU2REUxOTE1QUMyM0M4Q0Y1IF4KKzMxMUE0OTFDMUI1RDhBMjZFQTJBNzdBMzZCNUQ1M0ZEQUJBMUZCMkEgXgorOUQ0Qjc1MkFBOEZEQUY5Mjg5N0IwM0M0RDY1QjY1RUFCQkRGMDYyQyBeCitDNTY5RkY2RjA1OTI2NjRGNjkwQjAwOEVFN0ExMkVEQTU3NDBGMEM3IF4KKzFBRTM1RTlDRDNEMEE4QTE2NUIyNzU4RTFEQzRGOUQxQ0QzMEZCRjkgXgorODE5QTgzMzE4NzAwRUE4NjFDQjY5RjZDRDhFRDRFQ0Q3OENDM0NCNyBeCis5ODA5OUI1NTBBODJDRTIyRUZBRTQ4QjU5MzVGNjM2RDU4MTRGREI0IF4KK0NGQURCOTk4MTY3REIyODlBN0MxN0JBOTRERjdFREEwMEIyOTA4NUUgXgorM0Y1QTkwQThGNzU3OTM2OTg3OTM4REZCOTVGMTAyMzlGOTFBQzI2NCBeCis3NDAyMjY1OTA4RUVBNURBMTgzNDkwRkVGMkVBMkU1NUM5RkMyODYyIF4KK0VBNkVGMEY3MDUwRURBNkI3OEYzNTU5N0U4NUI3QTg1QUUwMDk3RTQgXgorNzNGMjc4MDU0OEY3Qzc5RTE1OTQ1RDdFRTJBM0UwM0IzMERGMzVDQSBeCis4RUMzQzkzQzczMDdFMTRFOUM2NUYyNkREODQ3Q0VCMTk1REUyNzdBIF4KK0NGQkM1NzFBMzVCODJGQjBCN0NCNTk3NTNDNEU4REUzNkE3NTExOTUgXgorM0M0ODAyQTk1NkNGOTNBMTQ4QjkwMzRGQjhGMDQxRUNEOERENDUzMiBeCis1REEyNjlDMUQ1Q0NFRTNDN0E2NkUzMUJEOUY1RTBCODNCQTA2Q0UxIF4KKzcwNkQ5MEMwMDgwMERCOTc5MEFGNjY3ODhEMUIzREM4MUUzRkY3QTEgXgorNTlBQzg1NjQ0N0ZERDI3NDIxQzUyRUE2NkU0NjVDNjRDNTAzMzcyMiBeCitFQUNBOUU4MkQwNDNGMkI2RTEyRTY0Q0YwM0Q4MkVEOTJGRDZBNjREIF4KKzgxNjA3NTVCQTA5Qzc0Rjc5REU4Rjk0OTZCRjBDOTI0OERCN0Q0NUUgXgorOENFNDM5MEMxODVCREZDOEJDOUM0RDNCRUIxQUI3NTdDNDRGNjQzNCBeCisxQTFBREI2MjhFQjdCOUNBQTgyMUFFOURFNDE3RTA5QTQyQTk3MTEzIF4KKzk3QzRGOTJBNDZFRjNGOTE2OUE5NzdFMTY0M0MxMDc0NUVDREFBNEUgXgorNDA4RTUzQzAzRDEwRTJCMzIyMjJGMkI1NEQxMThBQzRENjVBOTM4NiBeCis3MTA2MjhFODExQzIwNzc4NEUzMjU1REE4NDMyQ0U2RTE0QjYxRkU3IF4KKzRGNkRCNjIyNzc4RjRCMUI2MjAzQkQyMzkzMTJEODY1ODlGMUIyNjEgXgorODg4QUQ4RkMxQ0E1Qjg5MzI5NEZEQjhGQzk0QUI3NzYyMDE4QzFGOCBeCitBRTM2QzJGNTQyMjNCQzA4MkREQTBENTI4QjcwQjJBRUExOTA3NzlDIF4KKzRCRDJCRjkxNDIyM0RDRDBDQkJDQzQ0NDMyM0ZCRjBFNDg3RjI3QjYgXgorNzUyNkQ1REY3QjJFQ0ZBQzdCRkY2MkREN0E0QjVGMzg0NjMzMDVGOCBeCiswRUQ3Qzg3QjY4RjUwODEzQUFENUU1MDE1OUNCRTBCQkY5QkYwNUQyIF4KKzRENUNENEU0MEE2NjY4ODkzRUVBMTVGMDI1RUNCODE4NzQ3NURGNEYgXgorRDM4NDQ2RTg0MkMwQTk0RjE3NUI3NzJCREM3MDdDRDJFRTc5RDA5OCBeCitEREE4NjhCQzI5MDNDNTVDRjI3M0Y0OEU5QjkyQzA5RDkwQ0QwMTc5IF4KKzA4NDEyNjhCOTVFQ0ZBQUI5RkUzNzg3QkE3MjYxMjI3QTFGMjMyOTQgXgorRDNEREYyMEI0QzBEQjY2ODQyMURFMUYyNDJCNjVBOEM4M0ZBODY3QiBeCisxMTJGM0NGN0RBQ0E3NTI3ODE5RDE2NzA0RUI0MTMwMkE0RUU1MkFBIF4KKzk2MDcyQTNFQTQ0NjNBMTU2QjNCRDlFQUVDMTZBREIwOTA1MTYwQzkgXgorNzE1RjE5NUYwOUUzRUFEM0Q3MEFFNTFERUYxQzk3MDk1MDBDMEE2QSBeCis4QTExMkNBODJDRkVCNUYzMDAxQjdBMDA1OTE0NjJGNDEyMEREQzAyIF4KKzUwRkM5MUU5MTUyNzBEMTIwMkY2RkM4NzkyQkUxNkVDQjczQ0U0MDUgXgorOTA3NzM2RUM0NUJFN0JFREExQjE1NEVBMjgyQzUxQjU3OTU5OTFGOCBeCiswNUQ0OTQ2Mjk5MTI3ODcyMEVCNDRCRUE2NTZBQjQ0NDJDODg0NUMzIF4KKzZGRDU2RDA4QTJENDYzMEY3MkFDOTdFM0M5NEE5NTc1RjMwNDY3MjkgXgorREQxODgzMzc2Q0Y3MTNDOEQ3QUVCRkVDNjBENTFGRjhFMkE4MDZFOCBeCitFMDQ1N0ZFMDBGOURFRUU5NThERDZBRDk0OEVERjlDRDk0MTJGNzNBIF4KK0JBNjUzOEU5MUIyNzY1MDRDODRFMjEzQjMyNUI0QTc3MDNFOTI0QjQgXgorQzIwQTlCODQ4NTAzNjUwREU5NDYzQjk5OTJFQjk3NzQyMkJCNTNERiBeCitCQTRBNTY1RTVDMEY5RkFDODlENTVBMkI3ODRGMjkxQzdCQUQ0MjU1IF4KKzY1MTBFMDlBQUQ4Mjg4QUI4MUNBNTRERDU2NTZERjU3RDBFQUJCRTYgXgorMzM5OTZDOUM1QUQwNDg4M0JDRUI5NzcxQTVDNEEyNzJGODg1NTBCMSBeCis3Qjk2RjNDMTI3MkFENzY1REJEQzM1QTU5MjQzRjZBOEY3NUZBMzUxIF4KKzVBQTc2QjE2RUE0REZCMjY3RDg4RkY3REJFNEYwNTUxODRBNTZFNTYgXgorMzNCOUNDRUIxQTZFREM4QzkxRjYwMzQyNDVCMkUzQUFDODk4QzY3OCBeCis3MDFBMzJGQzBCMTE2M0JDNTVEQjc2RkE0NkY2OUI1NzRCMzgwM0EwIF4KKzVENkY0NEE0QjUxNzVCQTg3M0JGQTMzNjlEQzhCRkIwQUQxQUMyNkMgXgorMDcyN0YxMkQ4RTU1NEVEQ0I0MzVBRTNCRDY0MjVCMTk3REY2RUUyRSBeCis2RTFGNDZEQzRGQUQ2NzE3NTlBQzk2OTk5ODY5NEJENzkzMjYyNDZFIF4KKzg1MjMzRjlDRkQwNzgwQkQ2MDI0MEEyMkUwMzdDMTRFQjgyODZDMzMgXgorQjY2Q0M3MzMyMzQxRkE5MjYxRDk2MzYyRjBCQkQ3QjY3NkY5NUUwMiBeCis3ODJBNzhGMkZDMzJFMEI2Mjc3MDJDNTQxMzQxRUQyOEIwMDlCQjZGIF4KKzZCNzkzNTI2NUM1Mjk4ODBEQTVCMTY2RURENjYwQkFFMTRBNzcwQTkgXgorNDlDMjk4QjFDMTBEMzgwQkFDRTI2RTkwN0MyMTNDOTAwNTJENzUyMyBeCis0OUNFNEQ0RkY5RkZGNjcyNERBMDMyRkYzM0Y4QzVBNzc5MkQyNEUyIF4KK0NEMkM0RjE5QzEyQjA4NkMwNzFCQjZCMjBFOEU4MjEwQUZERDJENTAgXgorMzk3MTBGNzdCRTU2NEM0MTdDODBDQjZFNEI4N0JFNzJGQTgwNUE0MCBeCitGNzRBNkE0NUY1QjI5NzlCNUU3NzMwMDdCOTA4MDRGMzIyRjEzQUQ4IF4KKzZGRDZBMzQzMzkwNDdDRjEzRjc3N0M0QjdEOUUyODdGNDk5RkIxOUMgXgorRkRCMDRGMDREM0IzNjRBNjk1M0MzNDFFMzQzRTMxMEYyMzgzQTY1NSBeCis5ODFFODcxNzUzOENFOTg5OThFOTUwRUFEMjg1OTZCNTI3NzM2ODQxIF4KK0UwOTk5ODdEQjBDQzYxQ0Y2MDdDOTg1MjMzNkNEQUY0NzhERUUzM0YgXgorRTlDNDJGMjVBM0UzNTQyRDE1MTBERDA5QkY1MTZBRDgwOUQ0MjcwMiBeCitGN0U1ODBGQjIxQzcyNUNCRUE1NjNCMTkzODk2ODYyQjlCRUY3RjI0IF4KK0Q3NzhBMzI4N0Y2OEY0N0IwQUE0MjE0MTAyOTJENDc4MDU5OTdBOTQgXgorNTM0REZFNzU5NzM1NzIzNjQ5RURDODlCQ0IwNjNDMENDRkVFQzM0RiBeCis5MzgxRkI1QkQyNjY3N0E3NzYwRkMwMjg4NTMyNzU1MDYyOTg2REYxIF4KKzI3RTk3RUU4Mjk4MjAzOTk1OTVEQTBBMDA0N0I3NEQzQzRFMERCRjEgXgorRDM4NDUwMDcxRDFCMDc5QTlGRDUxOEQyRjMxN0M4M0MzMzA5NEY0MyBeCiswMjIxQjhFNEQyRkE2NkQyRUJFMUIwNEU2Nzk2NjJDRTQxNDA1RTQ4IF4KK0I5QkM0RkRDNEE1Q0UwMEVGQjkxMUMzMDYyRDZGMzMzMDQ3MDFDMjggXgorNDYxQjQyMDY2MThCNzY2Qzg5RTZEOUFCMkY4REIwNzkwMzg2MDIzNCBeCisxMjJBOTMwNkIxMDJGMkM1MEI3MzY0RTFEMjRGRUNCMDY2MkUyOTU4IF4KKzYxRTkxRjVEMTY3MDY2RUM5MDQxMzRBQjFDNEY5RDExNkM5RDNFODAgXgorNkI3NTU4QkQ4RjREM0M1OTE0QTlBQjVENzQxOEY3REI3NzU4M0I1NSBeCitDRTQ4RUE5NDg0Mzg1NDU1NURDNDhEMjREMzI0MDVEQUI5REJBNjEyIF4KKzVBNzIyQUFDNTc2RjQwNzhDMDAxRDA2REE5MUMyODEzMUE0RjkyQzUgXgorOUI4RkUwRjFFNjU3M0NDNjgzMkJBNjlERUM5RjZFNjQ2MjI4QTM3NCBeCitGOTg0MjlDQTI3OTlFNUNBQUVEREZCMTY4Qjc4MkE1NDM4NEVGMEE4IF4KKzE0Mjg3Nzc1NEFCOTVGNTdBQTU0MUNCOTc4QkE0MDBFODEyQUVDQzkgXgorNkQ4NEQwNTNDQ0Q5RTY4Q0FDNTc4MDg5MjQwOUY2MUIzOURERkQ0OCBeCitCNThDQzlDRTBBRTNEQUFBMDJFM0MwNDAxMDBENEI1NjhEMjlFMEZBIF4KKzE3RkIxOEZBMzJBODIzN0QzMkNGODNBOTY2NEIxQjJFNDBEQzVCMTEgXgorQzdGNjVFNTRFNjA4Q0VGMUM3QTEyMEJFOEEyOUZBNkM5NEI2ODBEMiBeCis5QzQ2MzI5QkEzNDA3NzM5NEI0MzlDNTQ3NkI5MUQ5REYwMTlCQTc2IF4KKzM2MTJCMzgxQjgwQTFERjZEQTc1QUIyNjU2QkQ1QkE4REU2OTk2QjUgXgorRUREOUJDQTFDNDMxMjAwRDMyMzRDMDk5NzkxQzgxRDg2MDUwOTFBQiBeCitDMTk1MURERUNCOTc5NkMwRDM5RUQ5QUZDQ0JCNjUyMDBBRUFCMENCIF4KKzU1RTRGNzg0NkQ5QjkwRDhCMzFFQUE1QjkzNzFEMzk1NTkwQjY1MjggXgorNUQ0MEI0MzJBREJERjNBMDEzNTVGRkZEREJBNDc1ODZCM0RDN0M1MiBeCitBRjVDNjc1RDIyNDlGNENEMjBFNzBEQzlFMThCODhEM0FDRkJENkJGIF4KK0IwRUI2Nzk2QTIxODc2RkFBRjUwRkNEQkEyRUIxMjFDNEI3NDIxNjYgXgorM0M1NzdDNzBCNzY4MTBEREY5QUQ1Nzk5MTAzNDczMTJCODgxQzMwRiBeCiswQzE2ODk3RDIwQzVGMzUyRkE2MTEwQzcwRjlBOEMzM0NBMzVDQTIxIF4KK0RCRTBCNDM0MTUyNjA2MEM1QjM3NTc2RjZCOTcyQTFFQjg5NTQwNTkgXgorMTU2N0IxMEUzM0ZCQkUyMDAzM0Y1QTUyRUI4MTAzNDhFRDE1NEYxOSBeCitDMUU0NzI4OTQxMkQzQUNDMjA4NjIwQTFFQTY3NkNFMjgxNURENEZCIF4KK0FCQzIyN0VGRkRDRTM3NTgwNjFDNzc5NzE4NjAyNDdFODUwMzgyQUQgXgorQjI5RUFDRUM5MDNCQjhBRjdDQzFBNjM1MTYxNjM2NDBGRkU2MjgyMiBeCis1Qzg5NzZBMUE0RkNDNkI2RkFCNUVFNjMxRTNDREM1NjFFRDVGQjEwIF4KKzFBMUVBNTEwN0NDNDZCRTkwOURGODE2NUMzRUZFRTg2NzYxNjE5OTEgXgorMjY4RTg2QkEzQTgxRkFEREIyMEY3NERENDRDNUJDNzFBOThDM0QwOCBeCiswNTA1N0U1RTc5MzRBQzlBOTE0MUQzOUI4RDRGNUVBNkFBMTRGNzRGIF4KK0MwM0VBNzJDNEQ2ODk0NTcyNkRGNjM4MDM1NjRFNDM0NDI2MzAyQkEgXgorNTRBRjIwQkZCRkVBRDZCQjJERDY4RTY1RDM5RDQyN0RGN0UxN0ZEOSBeCitGREU5MzhEQjA4NDNBODQ0REMwRjY2MDE0OTdBMzlBQ0YxNjdENkREIF4KK0VEMDI5MkQwQkQ4NjlCNjZFODAwMTQ4MjRBM0Q3ODg2Q0Q2RDM1OTAgXgorNzQ5QjY5OTY0RjVDMEQ5RDAyQkY1Q0Y5MDNCMkU1NkQwOUNGMUI5QyBeCis2QjE0M0QzMDM2NkM0NUYxNTlCODNBOEQxQUU4QUFFQzg4RTQ0MTM2IF4KKzAxMTY5RDY1RTcxMDE0OTQ2RDBCRjY0QkY0MzkwNjg5NzhBQTVCM0EgXgorNEMzNkUwQThDMTlDMEFBNkM4MERGMDYxMUJBMzQwNEMxMDI1RTlDQyBeCitBNERBOUVFQzJGNjgyQUY1QjJFRTdDQzg1MjVFQjA3REY2NkU1OTQ1IF4KK0YxMzQ5QUQwMTI0RDExNjEzQ0ZBNDZENDk4NjcxNDg0RTVGMzc3OTAgXgorNkE4RTgyRDJEMjdEM0VERDZFOEIxMTlGNzQ2NzYxQjhGRTgzMTgyQSBeCis1MkU3QzdDNEFFMDI2NTk5NTMwNzlEQUUyMEY0NDIzNTNFRTJCQjI5IF4KKzQ5QzhEODIyNzI0Mjc0Qjg1REU2MkQ5REY1ODZGRTg4MEFGMzk2RTYgXgorNTc4NjZDMEJCOTc2QjRGOEFBQTdBQ0YzQzlBMEY3MDBFNzMyMTZEQSBeCis1NDFBNjc1REQzN0M1RDZGMkNGMjQyMTYzQTVDRjZCNzI4REY5OTk1IF4KKzU1QjI2RDkzNDRENEQ2NDRDQkI2OUM0Nzg5NDczNTQzMjYyRThCOTEgXgorM0E4RjNGMEE5NjI5NzAyMEVFQTU4M0U5QTI4MEQ1M0UwMjQ4REUyNiBeCitEMUZGN0EwQ0QwQjY5QTc2QjVCODBEMkJCNTczNkI4NDQwREE3RjdCIF4KKzUzRTcxNUZBMzlEMzczMkYzOEZCNDc0OEQ0NjQwOUQ5OThENjc5NzMgXgorMzc3NzgxQUJCNEFCNEU5NzRCOUMxNjcwODY3RTc0Rjg3QUI0OTUwQSBeCis4RTdEQTk2OTcxMjY1QUNDMEZGN0MzODExMjdDOTY2REY5RjlGMTNBIF4KKzI4MDM4NzEzQTMzQUNBQUM3MzBGQjREREMzQTcwNzg4NkU1OThERDUgXgorNUY2QkQ0NEQwN0ExQzgxMUQ1Qjc1NjYxQTYxQkI2OUE4MTQ0NEVFMiBeCitENDY1RTZDNzY3QkQwMkQ0NTdENjAxNzY1REQwRkU1NTIxQkEyQUM3IF4KKzQ4N0Q5RTAyOTEyMDA0RTk2MTk2OEYzODdDMjFBNjVBMEU2NTNBRTcgXgorMUY1NERGMDAwNTJCMzc0MDMwMUM0MzQyMENDMkNCODVCMjc3MDA5NSBeCis3QzVCQjY3ODA4Mzg2OEVCODE3RTYxNkJEMDk0MjFCOTEwMDIxNjQ5IF4KKzREMzE1MjZFNEUyRkUzQkQ2REQ0QjNGNTlEQzJFRTJBNTJBOUZCNDIgXgorNjY5RjlGQTlENzFGQjkyRDUxQURFMTVDNzA3NDJGQjMxQjAxMzkwMSBeCiszOEQxRTc0RkUyNkFBNDNENDVEQUJDMTYwREVGRjExM0I3NzQwMjExIF4KKzM3MjRFRjUwQ0RFQUVCODU2MTIzQkVCQjE5MEYzODgzNDQ2MTY2NEQgXgorRTI2MzQxMTJEMjk3N0ExNzlENEM5QUYzNUYyMjBEM0E2MjZBQTA0QyBeCitGMTRDRjgxMzNGRjY2QTNFMjBEMjVFNURDRkY3MDYwNUY2QjhBMEJDIF4KKzgwOUUwNEEzODM0MEQwMTBCNzhCNTI4N0M4RkREMjBDMzkxRkI2MUIgXgorRTUzNDlENEQ2RUMzMUUyQ0Y0MTAwMURGQzQ0MEFERkY2RDI1QjRGNyBeCisxMzlGMjVGREMzNDRFQzI0NTZGNkU0REQ5OTM4RjY1NjkzRjBDQjJEIF4KKzdDNjI4QjA5NTRENDM0MEIwODUxQzg5RjExMDY1ODlDNUM2NDY1QzYgXgorRTY1RTY1RDcwNTAyNThCNkI2QjVCMzU4NjY4NDBCNUFDRTBEQkYwRCBeCis3N0QzM0I4N0UwQzEzNTI5RDNBQUM0RDY2MDYyMTNFRkU4MUZGMzk4IF4KKzVCQTQ1NkJBNDlBQkU1MEJCQ0I3NzJGQUFDQjcxRDRGM0FFQ0JENDUgXgorODAxQTIxRjdBQjczNTg1QUUzNTMxMDU4REI5NTEyQkQ2OUJBNUNCMSBeCisxOTJBQzRENTIxMEVDODYzNjA0RkMxQkEzODhBRUE4NDU1RDQxNzVEIF4KK0ZEOUYxMDNFREZDNENDOUY5QzQyNDI2NkVFNTRBNzlDMUM5ODdGOUUgXgorMzYxQUM0NkQ5NkE2OURENkU0MTZENDU2M0Q3QzY5RDNCNDg3RUZDMSBeCiszQTc2MjkwNDVDMDE5M0ZFMDg5MjhGN0Q0MUI4MDE4Mjc1OTMxMTZCIF4KKzU0NUIyRjVGRDAxNUY4MUJERTFEQUZBRkNBMTg0RDI1NTkwNTYwQzkgXgorRkVGMkM1MERBMzM2MjEyMDY0NTBFMjFEOTI5NTFCMjUzODU5OTFBMyBeCis5MTNBNDE3QUMxRUNFMDg5NTJBNjBFMDAzNUY3MDk5M0YxNjFFRjA1IF4KKzRGRkM5NTQ4MUY2RjYyNUIxQjhFNjdCMTMzRjExNjE5Q0U1QzE0NjAgXgorNUQ2RDA3NjVCMTU2RkUwMjg3ODAzMzFCNkE1M0Y4NERGQjEzMEYwQSBeCisyQzVFQzg5RjEwMThEMzRBQjExRTBDQjZGREM4MTJGODI0NzBCMTY4IF4KKzM0RDYyQ0RGRjk1NTIzM0ZFN0E1MzA4OTI1QzI0Q0JDREMwNTc5QjggXgorMTE0ODk5NEQzMEY4MEM1Njg5RDdCQjE5Q0ZCRTMzNTQ2ODcyQjRGQyBeCiswNzRGQ0EyMkE4QTYzRjQ0NkM4RDE5NjYxMkY3QzgxMkMyMkNDRDhCIF4KKzIyOEZFMjlGRDEzOTI4RDhGRjBCODUwRTUwREI0MURCNDA2RUZDQkIgXgorRUZGN0JCRjhGMkY3REYzNkFENTFFRjNENzQ4QUFCOEQ4REFCN0I3RCBeCitDM0FFQTZBQTE3OTcxQzBBMTQzQUNFNTRBOENGNTE1RjlFRUIwQkQ2IF4KKzRDM0E5ODBFNDA2MDJENDYyMUMyQUYxQkVCMUNBRTI3REYxOUFEMzIgXgorRTVDRTJBNDFDNzIyMjlENTg0RTQwRkJBNjdDNjk3RUZBMDhGNDUxRCBeCis2NEE1MzY4MjY0OTU5QzczRkIwQTEyRjg1RDRGQTE2RjhFMjVGRjA4IF4KKzhGQjc3MEFFQzE2NUE5M0E2RDk5QTBEQzUyRjM4NDQ0RTAzMTMwNzMgXgorQkNGRjNDNUU1QzU2ODc2QTNERDhDNEM5MEQ0RTgxOUI2N0Q3MTM5NCBeCiswRUYyMDUyMzc1N0UyNTYxMUM0OUMxRjI1OUQ5NDM4MUIwOEZCOTBBIF4KKzVEOUYwNURBQjkxQzQ2QUREQ0U0QjE2M0M2RkNERkI1MjMwQkRGRkEgXgorMTFCM0JEQzVGM0JFMDkxNDhEQTA3Q0Q0MkVDOUMyOEM3MThENkE1QiBeCisxRUFENzZFRjE4ODQwQjMxNzYyOTZGQTU3NzkxRDgzMkI3RTQwMzVDIF4KK0FGOEVCQ0JCREY1QjhDRkMyMDNGQkQ4NjQ0QjE1NDQ0NTY5MEIwMkUgXgorMEExNTZEQUQzNUExMEFBN0U0MUM1Q0IzQjMwNDNBMDUxQjcxODBCNiBeCis5QjNFNUY3OTdCQTI0NkU1REU2NjBCOUEzNkU1MkMyMDRCQUNFODIyIF4KKzc4NzgwMzU5Q0QyNEEyQjcxNTdGRDZENTVDREZBNkY5REUxNDlGRjUgXgorRjJEQURBQjQyNzU2MzNGN0VDREZBOTcxRDgyNEEzMUIxQzhENjY0MyBeCitFQTY4QkE4RjE2RDgzNjhFNjY3M0E1QzVBRUU4NkJBNUMzNkYyRDk3IF4KKzc4OEFBOTQ1MTE5NkUyQkREMDMxRTc0N0IwOThENzNCRTExM0MwOTMgXgorMThGRTI1OUIzNTczRjUyRjIzREFEMzNGMDVEOUM5MTk0MkI1MTZERCBeCiswRTQ3ODdGNDZBRThENUQ3Q0M5NTg5Qjc2RDAwRDYwOTgzMDc5RDc1IF4KKzE0OEU0RkRGMDMxQ0FGQjcyNjA5OURDRDFFQjU5MUJDMkYyNEQxNzkgXgorMzk4MURGODY1OEFDMkZBNUMzMTUxQTQyNDI2MjMyNEQ0MTk0MERCQSBeCiszQzUwQTM4MDA2MzZFRjg3N0Q4OTA1OUY2NkNENjk3QTlERjQ0QkQxIF4KK0Q5QkFCMDQ3MUUyREI5N0ZENUYzQTQyODg0REZDNzA4NzY4RjYyRjkgXgorNTJERDEwNjMzMjZFMjU1MEI2RUY0MEQ1RUU0RTFBRDY3QzdCQjZCQSBeCisxM0NBMjc4MjcxMjdDNjk4ODEwQUVDQTE1OERDQUE3ODk0RjBDOTEyIF4KKzA4NkJEQjE3RUMxQjhDQUM2ODAzMEE1NkZCRDRDNzQxRDRGOTVEQkEgXgorRjdGMzg5QkM1RUQyMjVCRDYzOTlDQzQzRUYyMkFGRDc3RTg5NUQwNiBeCis2N0YxNzNBRDNBMjRDMjZFOTVFMkVBOEIzN0ZDMDI1OUIxREU5NTVDIF4KK0E3RjM0OEEzQjZGNjdDQ0Y3QzdDNjlFRDA2NUIzRkJGQTgzMkE4QTIgXgorRUNFQ0JCMjUzNTQ0NjhGQjYyQUM4N0Q1Q0VCNjg4RTRBNjcxREM0MiBeCis2MjMzMEJDNDAwMTA4REZBRkYyOThFRkI3NkJEQzI4Q0RDMTUzQUMxIF4KK0JCMEVDRjlDQjNDRTQ0OEI0RUE5QzU3Q0Y1RjFGOTk3RjgxMDgyQjQgXgorMTJDOTc0MTY3MkNFOERCQTE0Q0M2NkFGMzMzOEI2MUUyMzRGOUU2OCBeCitEQjRDQjU5NjFBMkZGNjk2NENFREVDQUVEM0RBMDNEMTQwMTEyRUE0IF4KKzQ1RTREMkJFM0Q5NzI5QkU5RjY5QURCMjQ1QTVBOUNDNzUwNjQ1MzQgXgorRTM1MjUzNTUwQzg0QkVGQzI2QzJFOTdGMEMyMzZDRkYxRDg1QzM2RiBeCis3RDZEOTUwQTE2ODEwNzcwMkNFM0I2QkNFRjkyOThGOUM4RkM4RjNDIF4KKzgxMkY0NTlBQjU4ODczNjREMUYyQTlBMDBDQkVFNUZDMzUyQzM5QTIgXgorN0VFMjdGMzNDNTlCNjhDMzQ2MDQ0MTZEMzg2MDZCRDNGNUNCNkIwNiBeCitENTdFMkE0RjE1REY1QzUwRjI0ODU5MDlFRTMxNDk3MzVDNkRGQjg0IF4KKzNEMTJEODhCNjFFRjA5NzI4MDhEOENBRDQxRDhBMTZBQTdFQ0NDODcgXgorQ0Y5QTdDRUE5QjEwNUFEQUI2QkJBM0NGQjZEMDkwQjc2NjAzRjdDRSBeCisxRDQzQ0ExNjRDQUQwQjYxNkJFNTc2M0Q3RjVFQTg4MzU1OTUzRjRCIF4KKzM2MDBGMDg1QTUzRkIwMTE1QzI2REE5MEQxMTgwRkQzNEVFQjYzMDEgXgorRTlGOUMwODhDMzBBMzdFNkNERjA2N0Y3MjRCRTZDNDc4NkYyN0M5RSBeCisyQkI4NkI0N0VBMzQ0MDBENDM0RjhGNEY5NDgzMENCREE5RDRFNTczIF4KKzMyNTVBN0Q5QTdBMEI1NkQwRDlDNjY1RUMxM0Y3QThDOEYwNURBN0IgXgorNDUzNTk3NTAwQTdENUJFQzhDRkI5NTA5MjZBMkJGQzBGOTJFMTQ5QiBeCitBMTVFQzQ1MjQ3Njg3MEFDNDU5Qjk0MkY2QTZCNzM4MjJBMDc4OTlDIF4KKzVCMTgyMUJGQUY5MTdCQUIzREIxMjg0QTFEMUZENDBFQTAxMUJDQkMgXgorOEREQzI1QzdDQTMzMEExOENGMzk4MjdCN0NCRUMwMEI4NzRBRjE5MyBeCisyODM4MzJGNDVCQjVFNjk2NDlGQzEwREQ2MDdCQUY4QkFENjE3ODNFIF4KK0YzOTQyNkY5QzA0NzQ1OTZCMDI1MUYwQ0JCNUY5MjM4NUQ4NjJEMjQgXgorNzE0RTMyREQ1QkI4RkNDNzVCMTAxM0U2RjFGNTZGOTZEOTdCMzZGMiBeCis5ODhBQzQ1OTJENTAxMTNCMTNGNkVEQjVDMTEzQTIyRTREMEY1MThFIF4KKzkzQkYxNDYzNzg4QjdGNEE0QTA2QUQ0QzE3NDgyREMyNjA3OTdBM0YgXgorNTUzMjUzNUFDQzhBQzU2Njg5NzdCMkEyRjMyMkIyM0FFQjQ0M0RCMiBeCis4NUNDN0FGMDkyOUYyMDZGQTQ0RkNBQUNEQzI0QzRFNzgzNDVCRDgwIF4KKzM5MjE5NkUzRjJGNDA3NEQxRDQ4NUE1MjExOTAxMkQ4QzA1NzQwQjYgXgorM0JBODhCOTFGMUVBMThFNzEyMjkyMzAxRkJCQzM3NUU5QjQ4QkZDNiBeCiszREFBRDFEQUIxNzk1RjJDMUM4QzVDRjUzMDVCNTQ5QUJGQjg1Mzk4IF4KKzZFQzkzQUZBM0FCNjE3NzA4Mjc2RTk5MDY2RkRDMzMxQzg0RjAyOEQgXgorQ0RBMjE5MzAzQjkxQUYzQzNGQkQwQjkyNjc1ODkxNDk4NEFEN0M4RCBeCis1OTlDRTI0NzQ1RUI1NDA4NTU0MDc3MzU0QkQxMEE2NUY2QkMzMDM3IF4KKzA3OThDMUI1M0Y5NDlENjQzRjdCRDY2QzE5NDcxNUU3Q0FGQzZFMTkgXgorQTE3MjMwRjE2NEU5OEFCODNBQzExNDE3MzBCMjMzODlGMEVCNDczRCBeCisyQzJCOTUxNzNGMUIwNjE2NUUxN0VBRTM2QTUzQzdBQjY0MTI2N0MzIF4KK0E3RjQwOEVGNDQ5REM5Mjk2MTYxN0Q0QzUxQjU1QUU0RTQ1MzZFOTcgXgorMjI2NkM1MTMzQjZENkIwOEEwOTg5N0FFRkEzNTVDNzY4RjcxOEM2QyBeCiszNDNGMTBFRTZFQjM0REYwMDVFNzQ5RDFDNEE5OEY2NDUzNzI3MkIxIF4KKzkwRUVCNzZCMTI2RTYzMjMwOEY4NjU1RkQ0OUM1MjAwMDAyN0FBNDggXgorQzdFQTNDN0Q0QUE4RENCRTk1ODBDNDQzNDA3NTAxNzkzNDI2ODQxOSBeCis0NTVENEU3Qzk4ODM1NkE1NjU4OEM0MDMxM0QyOEU0MjVBRTIxOUY5IF4KKzVDMEYzMDkwOTkyMTM4RDM0QjRFMzMwMjlDRjgzQTY0RUQ4QUIwM0QgXgorQ0IzQzUyODg4MzlENkZFNzlFQjJFNTBEM0FDMzRCQkM0QTk0MkU0NiBeCitFNjA1ODQyMjA1MDc5RDgzQkRENDg5RENGNkY4QTJEMUVFMDc0QzYwIF4KK0FCQ0JFQzU2RUEyMEI2QjM2OUM4NUE5MzFCMjIwMUZFQ0I4MjZGNEEgXgorNDgwQzFDQjk3QzM0MTlEQTYxMEQ5NzgzRTYwNDdFNkM5QTYxMDFBNCBeCis4NzQ4MTg0NjREQTE3NTNEM0FFRERCN0QzQjQ2RTJEMDQ2MTREN0U2IF4KK0M5NUI2NUUzQTM3RUQ0QTJGRTJCMjdBMkQ1MkJGMUJGRDMwN0VEMjAgXgorNUUxODhBNEY2MjVDMDU0ODJCRjE2MUM0NUY1MDk0ODQ0Q0U3MDQ2MSBeCis2QjJFQkNGRTc0RTBCRjMyNDgwRDRCQ0Y5QTU2OThBNTI3QUVCRUFEIF4KK0FCRDNFMjhBMkE1MjhCNzk2M0VBOEQ4ODk2NjUxQTE3MzM3MzA0RDkgXgorQjg3M0ZERTJDMzEyQzIyNzlFQzg5NTBFQzJDMkU5REY5OTBGMDA2RiBeCis0RjFBMTg3MTQ2ODlCREI3NjZBRjY4NjYyM0JFRjA4REFGREZFMUY1IF4KK0JBODg2NzkzQTg5RTdFQzYyNjkyQTg2OTAxNjRCRjA3MkVBRjdBQTQgXgorQTE1QzhEREFBMDQ0OERFN0IzNjE1NTJGQzUxQUYwRDcyQzA3MzdGQSBeCis2RkI1MTZDQkI0Q0NFOTY4MUM0NEVGQUJBQkM3QTI2Qzc5Qzc5Q0I1IF4KK0M2REE4OUQzRjdFQzREMkZDREIzNjQzMjA0MkE3OEVBQzlGMDREQzYgXgorMkE5NEE5MDIzRjdENTREQjI2QzhDMkE2QTRDOTUxMTI2NzEyQzJFNSBeCitCMEYxMTVCOEJGMEExNDY0QTM3ODQyMEExRjFGNTc0QUExODY5RkM4IF4KK0EzQzE3OTRGNThGRkRDMzYxQkNBRDQ3NzlCNURFRjQ4RTAyQUJEMUEgXgorMkRCQTVEODBDNEIxNzE2N0U3MTVBODAxMjg3NjA5NTU3NzAzMEQ1QyBeCiswNjJDM0NCN0EwNTk3NjYxMjVCMzY4QUQ2QzE5QkU4RkFBOTgxOTUwIF4KK0VDRUE5NkVCNjIzOTE5REY0RTIyRkIxMDY2MTZFRjFGQjJBQ0Y1QUYgXgorQzBDRDVFNTU1ODYxRkZCQ0IyRkY0MDQ1QTQ2Q0UzMEFFNkNBMTc1OCBeCitBMDE1MEQ5MzE5ODBFMUQ4MkEyMTkyODgzN0Y3RTlFMTk4RTVEMUI5IF4KK0JGODc3QjIwMjgxMjE4NENBNzRERTYxRkUzNERCOTVCQTJBQzVEMEIgXgorQzg2M0EwRDIyMzJFOTAxOTIwNzUyRjJBRjkyQzIwMUZDNzM2MDlCNSBeCitDNTRFNjc2MjA5RDgxQ0ZFRDJFN0VDRUE2RjdFMzVBNTQ1OUE1OEFFIF4KK0NCRjM3NkU4NTcxRjgxNzkyQUFDNDlCQTdFMUQ3RjQxNzEzQUNEQ0UgXgorOUNEMjQ4QzA3RUVGNjMwM0M3MTkwMUFDNDg0RjMwNzg4RDkyNjlGOSBeCitBRUE0MUM1QjIyNjBFMERDNTcwOTRDNUUxRjgwQTcwQjg1RTc5RTc3IF4KK0IxMDE2RjI2RTMyNjI0QzUzMjg1NjZCMjQzMzI5QTJGNzVBMzZEMDYgXgorM0VERTExOEY3RTI3NjRDQzQ5RkJDMzg3MzUwOEQzOEEyQzZBNDU5MiBeCiswM0RGMEM4ODJGRUVENzJGODFCMzAzNDE0MTc4OTc2QUJEMDg5RUVGIF4KKzJBOEUzNkI2QTU0NUQxQUJFN0IwMkQ2RERENzgyQUUwMzJGN0VENDEgXgorRDkwNTg4RTYwNkZCREYzQ0M2MDMwNzU2REY5MkZCMzcyOTQ0MUU2RiBeCitCQ0M0MTMxMzNCNkQ4NDYyMUI0ODJBN0QyMTYzRUE5NTVBQzczM0JGIF4KK0JFMUYzNkQzNERFQzU0MzA2RUYyMEQ4MzI2RkY2MDNBNzE2RjQzMzEgXgorQTJCQUU0MUVBMDFFOEFFOUQ1OUY1RThFNjYzRDIyQzlGNDE0QjBGNiBeCitEMjI5NUZFMjYyMDZERTlFRDE2OUZFQTQ4N0IxOThFN0NBMERFNzhCIF4KKzA2QjEzMTMwREQxMEM5NEEyNENCNTBERTZBNjEyODY3Rjg1RTE3RkEgXgorMkNGNEM0RjJGMjcwQUY2M0Q3MDM1OTAzMjMxQ0Y3RTcxODBFNjZFNSBeCiswQTlFRTMyOTNBMkM5QjJBQ0MyRjlCOTlCRjE3QUFDNjE4MzQ3ODU3IF4KK0MzMzhGMTRDMTU2RDg3NzdFQ0ZDMzZBREYxODUwQjY0RUU5RTYxNzkgXgorRTlCQzZEQTM1QUVCMUNDMzk5NzMzQ0QwQUQzQjIyRTRFMkM4M0U5MiBeCis3QTQyRjgyMDIxMDE1OEFEMzM5MzVDQjc3RDc4QzI4RjlGRTdBOTQwIF4KK0VDREVGQTc4MTdBNDM2RTQzQzNERkEzNTA2OUY4Nzk0ODE4MUE1OEEgXgorNzYxRUJGMzM2RjEyMjlCRjgwNzAyQzlDNzc5OERBQzM3QUNGMzA4NiBeCisxOTc1QjcxNjg4MEI0OUJBMDg2MzEzNjczNjk0MkU2ODhDOUVFQzdDIF4KK0E0MjMyQzMyMjdEQkI5MTU4MUI4NkZBQkIxQzVBQjBBMjk4MDFERkMgXgorNDk5NDdBRjFEOTQ4OEYxNDZCRTRDNzc3ODJDQjJGQ0Y2RUIxM0ZDOSBeCitBMzQwMkFFMTdEQjlFNkVDODk5QjBFMTU5NzMwNzNDRjk0MDRBMkRGIF4KK0RDQUZDMkRDNUJBQjM4NjI5REZBMERFMTQ1NEMzMDBFNUI5QTJENjYgXgorQTdGOTE1Rjc0NUUzMEU0Q0Y2QUZGQUJGMjE0QUI2RDk1MEM2NkZBRSBeCis3NjQ1MTUyNzdENEFGNzNBMTRGQUUyRDlDRkE0RjlCQUYzMDZDQ0I1IF4KK0IwMjFFQjA4QTQzNkIwMjY1OEVBQTdCQTNDODhENDlGMTIxOUMwMzUgXgorQjk3RkU5RTFDNTkxOEZFRkJFREQ5ODZCNzU3Q0NGNEVDNEFGQTc1RCBeCis2OTE3MzUzNTk2QkZBRjFBNUEwNjExOUVDREFCQjM3Q0IwMTdENzFFIF4KK0ZDQjRCQ0VCRUJCQUI2NjE0MkFEMkE1QjM1QUI1REJGNzhDNkE0NjMgXgorQkNBNDU0QjY5RjQ0ODY5NjBDNjMzRDJDNDQ1M0ZEMDFENjc1OEJDRSBeCis1Q0QyNUU2MkFEOTdBQTVEQjNBOUNFRTk5QzU4NDM5REZCRjYwNzNCIF4KK0U4NDA1RTU4M0QzMUIzQjhFOEIzNjUwODdGMkFCMzkxNzUzMzI0QTQgXgorMzlFMzJBRTQwNTQyMERFQjA3Mjc1MjI0ODE3QjU3MTg3MDc5ODg2RiBeCis2M0FDMjBBRkFFREFGQkZDMDE4NzU1RjRDRUIxM0EwNDJCREVGREZFIF4KKzI3MjQ1Qzc0QjYxRDE5RUEyOEZFRDgxRTU5QUE0OEVGQzIyOTQ2QzkgXgorNzI1NEM4RjVBMkRGMEU3NDc3NjBFMkVCMzUzQzRBQjI0RTI1MzYwMiBeCiszMkRENDlCNzk2QUJDQTc2MzU2QUE5QUIwN0Q2NjlDQjdCQzdGODk5IF4KK0I4M0YzRkJFNkRCMzgyMjMyNTMzNDRFNjlDMzk5QzQ3NEU0QzY0QTUgXgorQjNFMEVCNDg0QUU1QjEwQjAxN0Y1MDk3MzBGMzUwNDgxQTYwRjYzNCBeCitBOTlGQzI0N0MxNzdENjZDQkM2QzIxQzEwQzIxRTEwRkIyRjMzRUY5IF4KK0E3RDAzM0E5NDZBQTAzMTVDRDJFNEI3MDI1MTY0Qjc3RTU5NzlDQkUgXgorRjJERTVDRDkxMkQ1Q0ZFNzI3QjM1M0FERUNCNkI3RkQxMUU4MDE4OSBeCisxMTFCQTkwNTgyRTE3Q0I1RTFCQjcwQUI3MkM5OUZDRjY0Nzg3NkEwIF4KKzlBRjdGMUE3NDIyMzVDMEUzOTZGNkQxMzE5QkQxMTA0NTE4Rjg0NzUgXgorOTIzQjNFNTI0NkZCNTBGQjU0NDg3NDJCOEVBOENGNDkyMEU3MDcwMiBeCitDQkZDNDU2MzMzNEQxMDRFNERGMjQ0NDNBMjk1RjRFOUE3RDdENEFBIF4KKzQ4RjRCRURFNzZDNkRERTlCNzJBOUZFRDUwRDBCREJEMERGN0U3QUUgXgorMkEyMUU3ODI4QzA2NERCMEQ2ODQ1NjE2MjI4MDJDODZBNTA0REQzNyBeCisyRDU5OTU3MkQ2RTU3QTQzN0EyQTg0NTU0NkZCRUY5RjJGQTExQUQ4IF4KK0NCNENGRDkyRkZFRkZEREZEODdBNDc4NkQ2MEUyOEM3NjIyQzcxREYgXgorRkE2REI5RDFFQjkyNDYxNDU0RTdEQURDMzZDOUNFN0ExRjMwQzYzRSBeCis5OEMyNjRCN0NERjc3NEM3RDgyRjREQTVFMTE2MEFFNDM3MDY2NUNCIF4KK0Q1MDNEM0M1Q0FGN0EyRDEyNEE3RjlGMEU3RDhEMEY1RTI5QjZGMTkgXgorQUVGRjVBRjAwMjM4NjhFRjZFM0FENDlGMkMzMEQ2NUU5NjNCNjMwOCBeCis3M0IxNDY0QjlEMDU1MDlCRTcyRTgzQzgxOUY5RDYxOEIzMTIxMzM2IF4KKzc5MTc3NDY2NkQyNjI5RDQzMDRCQzgxMTM4QjREOEE3NTk5RTc3RDYgXgorMzYyQTJENDE5QkFGMjYzRjFFNzdDNTY4OUY2MTFBRTMwMUMwNDRGMiBeCitCNEQ0Nzk2RDFCQzE4NTFEREI3NUY1RDNCQTMwODlEMUQwRTBBMTVEIF4KK0I3QzRGRDQwNEE3M0MwQUU0M0ZBQkFFQjQ3MUZEQjZGOUIyNEEyN0MgXgorQjlEQzExODM0OUREQUIzN0REODJCNjVFMDkyMjc3QzFFMkYyMEM1RiBeCisxNDQ3ODI5MTNERjJGQThGNzZEMjEwQTdBMzIxRjM2MkZBNURBNzc5IF4KKzI5RDY0MzUxQTE3OEU1MkVEREE5QTRCMkY1Mjc5QjcwRjNGRUYzOUMgXgorMzEwOThBNzBGQjk1MTI4QkVDQzJDNzI5Q0U1QTJBNEJDQTEyMTg0NSBeCis5QzA1RDZCMTcxQzYwQzM3ODIyQ0RCRDdFOEMxQzU3Mjg2RTI3NDYxIF4KKzZGRjdDNDk2MEUzNTQ2M0E4RkRCNzc4NDRBMjlEREFEMUZGMDRGNTMgXgorMkUwOEI5MDg4NjQ2NzM3NjIwRjFCNDQ4RTgxRUE1RTQyQzQwQzU5NSBeCitBRjIzNDJEOEY0QkYxMkY5RTUyNEU0NEJDRDQyMDY2Rjg0NjIwNzI3IF4KKzU0M0ExQTk5QjQ5N0RCQjc3NzY0MDNGMzI1MkE5QjJFMTFBMDYxMEEgXgorQTJBNDZCRUYwOUQyMUE5QkEzMkFBRTRGQ0Y3QTg0NkQxMjhGMDM1OCBeCis4MTk2MEEyMEE3NTVGODRCMzYyM0QxRTJBMzk1RURCMTJERkRFNzNGIF4KK0IwMTZDOTBCMzUwQTVBOUFENEMxRjNBRkU0OUUzRUIyMUFBRThCN0EgXgorNDFEMDNBOEQ3OUU4QkFBRTExNkMyRjU1NzNEODY5RDk3RDdGNkUwQiBeCis4MzEyMzdGNUJEQUMzN0M1OEJBMzFGNjEzMTk4MkFGRTY4MEJBQzFGIF4KKzJFOEFDRjVGREUxODU0MkJEQzJEMEI5NUQzQUVEN0ZDNDhCNTk5M0IgXgorMTcxNzYzRDg4MEQ0NTg4NUVBNjFGNUVEMDRCQjUxQjc5QzZBMjcyNCBeCis0MDVBRDI4MkEyMTQxQzM4RDNENzMxRjlERjYzMDY2NzA2NEI5RUQwIF4KKzA3RjJFQ0I5NDREMDFEREY5QzY4QUE2ODc2MkJGMDdGMzg1RTdFNkQgXgorRUI1RkVCQjgxM0U0REQ3QkY4NTJGQjMyNDY2MDI1RjdENEU3OUREOSBeCis1MkRFMDkwREIwMjczODVGMTdDOUZENDFGNjEyNzI1MjVGRTEwOEIxIF4KKzEwM0UzNTJBMjYxMTM0RTExNTRFRDNDMzEyRDg5MDY0NkZFRDM4QUUgXgorNjVDNzM5NjlFMzVFOEYzMDdCNTE4QUJCREU4NTY1NENBRDEzRDBDNyBeCitGQjM4MEMwMDk5RUFERUQ5RUQ4REQ0OEQ3MEUxNUM3QTI2RTJGNDE3IF4KK0VGOUUxMjJFMEI4Rjk2OEVGMjYyRTFBOThCQkZFRDdCNDYxODQ2QjkgXgorNzcxQTE2MkJERTNDQzRDMDdCRTdBMUREMjU0NzAyODZGMTMzMDIwRSBeCis1Rjg5MjM1M0RDNUM2NUExRDhDOTUxMEFDRUM0M0REOTZGNDMyNzQyIF4KKzRFNjU4Qjg3NDNENTEwMjIxQjk2OEYyQzc4QzcyQTU4OEE1REY2RDYgXgorNUQ1Mjk1QUNFQzI0RjhBNTJFQ0M1QjE3NEU0ODg0NzMyQkQyMTZFMiBeCis3NzkxQkQwRTFDNDEzNkQ5N0M0NkNDRDY2RDM2RTk4NDQzQzQxODJBIF4KKzUxNTQxOUFFNTlCRTRFODI0RTU3NUU0OTdGMzYxQzMzODJDMjE3ODMgXgorNzY2OUQwRDA4M0IzQTBBN0I2MzFFRTQ4NzFBRDJBMkFGOEM1MTJGOSBeCis5MEExQTlCRDkzNTAxRDlBRkU1MDQwRERFRTM5NUY5NEU1NTk0RUU0IF4KK0I4RTQ4Rjc5NjE4Q0RFOTUxMjk2RjFEMjhCODc2NTNDM0NEQTZGREIgXgorRkU5NEQ1MzczRUYwMDlFRDJDMDZGNjMyQzczOTcxNzc5MUVCNkJCNiBeCitCNUMzODcxREEyNDY2RTQ2MzVERDNCQ0QwODVBMkI4RTIyMkNFOEY0IF4KKzQzMDMyRDAyMkQyNEI2NTM5NEY3QTcwN0M4NDQxQzJBN0YzQ0Q5ODAgXgorODdDMTM0NDgwMTdEQjNCNkM1NTMyNTBDNTlERjREM0Q1NzY3Njc4OCBeCitGMzhGQ0E0NTg5NTQzMDUxOTM1RDRGMTUyNTcxMEFCMzY2MTYxRjIyIF4KKzkyMUUzQzNERTc3M0Y5ODc0NTJDQUUyOEQzQzEwREY5ODA0NjMyREIgXgorMzIzMDhENUJDQTMzRTY5NDA3MUI4QzE3NDcwQzY0NjlFREMxRENDRSBeCitBQzUyNTgyOTdCQTIyRkU2MEI0NjRERUUyMjM0OUM3MEZERkFCMjE5IF4KKzU5OTMyMkJDMjE0RDcyNDgyMTZGMEM2RUNGMDBDQzM0Qzc5MkM1RkIgXgorOTlFQkE5MUZBRkMyNzI4OEIzRkYzMkRFNTVCRjE3QkM2RDc2QjE2QyBeCis4OTlERjdDMjE3NzlDQzBGNTRFRENENDQxMDUxQ0FDQkQyQjA2OTQxIF4KK0U1RTBCQTE4QkYzQzk5MDYyQkE0NDQ4NDc4NzZDNUNBMkRCOEY5QzQgXgorOTRCOEI5MDU2NkIyRTNCRERBOEZGOEQzN0JERDlGOTVDRjlCRTBCMiBeCis4NjQyMkJBRDY1QzVFMEIyMkYwMkI5RDE1MTBCOUQyNEY0MjI3QUM5IF4KKzQyNzY5NEI3NzJBMDg0MDAzODFENDcyODU0RkE1RkQ0RDRDQzFENjIgXgorMzczMkRBOEVCQTg0Q0I0NTkxREQ0QTg3QkFFOTU4NjM1Qzg1REQ3MSBeCitENDFDMjhDMDI4RTQyQUQxREY1MDU3Qzk3QkI5NTNCMDNBRThGNkFFIF4KKzRDNDQyODZGNTk3OUQ0NEFCNENBNUUzNzc2RjMwQ0EwNENFNTM5RUMgXgorRTY5NUQ5QjA0OUExNDk3QTg2NzY1MTk1QkE3ODg0RTg4NjkxNDJERSBeCisyQTVERTlDNTQ4OTM3NUI4RUZEQjA5Q0EyOUQzMkZEQURBQTA3NDAyIF4KKzAxMjM1NkVCNDZBNTg3NzYzRUNEMUVDOUYzMTE0QjhCOEI3OTg3QjcgXgorNkI4MDNERjA3RTVBNDdGQkJFNDEyMTQ5RDgyNThCNTI2RDJCRTk2QiBeCisxNEExMDkwQzNCMzgyNDgyQUFENUVGNDlCMzBEODQyMzE3NzkyNzQ1IF4KK0MyQTU3NkRFMzg1MDE3RkE4NDg1NTM4OEVFNkNCMUY1MUY0M0E2QzQgXgorNTc0NkI4Qzg4Q0U1NDAzMTNBMDQyOUU2NDg0MUVDRDBBRDU2OTI5OSBeCisyOThFRkI4N0U5QzA5Mjk5REVDMTcxNzE5MDI2ODJEOTE5ODk5QzlEIF4KKzU1QUVCNzkzMENENjIwMkNENTJFNjUxM0VENEMzNTgyNEI1NzQxOTggXgorRUNEQUE4NDA0Rjg4MzM0RTlDMkM2RkNDOTIwOTc5NTU4MTY1NEMyNSBeCiswNjFGRkZDRThGNjlCRTBEMEM5QjYzRTMwQkIwNjVDNkNDNzNERjMzIF4KKzIyOUYzQThCRDJGNkZGQjVDRTJEQjMzMEFDRkJDNEM0RDc3OTZEN0YgXgorMEJBQkU2MDgwMzI0ODA1OUYzQjA1RTA2RTI3M0I1RjQxQTYxOUM5QSBeCis1RjQ5NkE1QUFBMUZDMzhCNzYwNjlCRjlGMDhDNjM3NzdFRTc1MzBDIF4KKzkxRkM4OTk0RkFBMDNFOUEyRDlENTY1RjA0NDc4QzZERjAzNUFGRTMgXgorQTY4NTUyQjkwNDlFMTkyQkJGOThFODJFMkE2OUU0MDVGRkMyRDkzRiBeCis3OTEwMzkzRDFEOUQ4Qjg3NkVDODlGRTkxMDAzMjBEMzcxNzg5QzIzIF4KKzlCOTIzRjk3RjJEMkIwNTc5NTBEQzNDMEU4OTk4MUYyMkY5NkVDMkYgXgorMUVBRDlDMjM3Q0YzQjFDQjk1RTdFRDc5RUYyRTU4NDJFOTI2MzQ0NyBeCitGNTFFNUMyMDJENjk4Qzc1RjhGMEMyOTI2MDgxRDRDMjhGNjQxODEyIF4KKzg4NDJEOUNEOTc4NjgxOTZCMzFGMzRDMDJCQTYzQ0UzNDQ5M0RDQTIgXgorMjZDODk3N0JDMzZDMzI5ODU4MkNFNjcwM0Y2MkRGRTQ0ODhFMERERSBeCis5NTVCRUYzNThBQ0E0RDQ0RTMzRjMxMDUxQTNCOTJEOTZCQTY2OUUzIF4KKzY4RDg0MUIyOURBMjg1REE1M0EzMUU4MjM0NjJFNzk0QjMxMjY5MTQgXgorQkI1MkMxODA2NjA1REQzNzExMzAzNTM5MEQ5NzAzNkVGQjNGRTJCRiBeCitCQzU1NzcyQkM5QjYwNjYxMTI1MTJFMUE4QjYzMzQxMUI5NTA4RkEyIF4KK0JERDJDQTRCNDMxNTdDMDRDRTcwNDNGNTdCN0UyNjEwRDNFMTc1RDkgXgorOEU0OTNGMjVFMTEwRjYyNDRGQkQ3NTg1Q0YxOEYyODU5MzM5NTBFQyBeCis2NTAyNDJERjk5RTk4NURFMjNBNUNGQzI1QzhDQTcyQzgwRDdGMjNFIF4KKzU2QTA2MUZFNDlCNDI4Nzk4QzMyOTMzNkQ0QjE4NEJGRTY5QzQxMDIgXgorNTlGRjgxN0NFRTk0NkNCOTQ4MDU2MjI3NjA3QTExOUY0QzdEREE4OSBeCitCRDRGMDNGMTg3OENFQTg2RTJBRDk4MUM2QTgwNzAxRTBBRDMwQjRBIF4KK0E2MzVGNTI4Q0M0MDI4ODc3MTg0RTg5MThDRjczRTFBRUU2Rjc3N0YgXgorMTVEQ0FFODdGN0U0MENBNTc3QzYxQzJBQTVCNkQ5MEYwQ0JFNkRDRSBeCitENjdCRDg1QTM1M0NFQkI5OUFERTRDRDg2QjU0NjczREQ2RDY0MzYwIF4KKzE2MTlERTcyMjkwMzI4MDBDREYwNzE4MzBDQkNDMzIwOEIxRURCMDkgXgorMDlEQzE4QkVFMEMyREQ5QTJDNzE4OUFBNkQzREVCOEI3Q0M0MUNFNSBeCis0MTY1RUQ0NzBEODVGRUREOTU5MzU3N0E5MTAxMzA2QzMxODI1RTAwIF4KK0M1Mjk0MkRBQkY0RjlENzJCMzFCMkIzMjkxNzA1RUY1MjAxQjMzNDMgXgorODgyOTYwMzVCRTc5RjUyODFCOTFDMEYxMDA2RTU3QzI4NjcxQ0JGMyBeCis4MjU5MzgwNDg4MEYxNjhCOUZGNTBEODlDRDE0OUU5RjI2M0VCNTU3IF4KKzUyRTRGNDJGQzJFQzJFQjdDMEE3MjhEMjI1MUExNEE2QzVFQTVBMDAgXgorQzkxQjI0M0NCQTIwMzFCMjlGMzY1QkE0NDUxRkVGRDZBOTAyMjk4QSBeCis5MEY2RjVBNjVFNkJDOTQzMEEzNEMwNjYzMTIwOEFBRThCNzU1NUY1IF4KKzc1MzVENzdDODgwOUI0RUEyMTY3OEJGOTY4Njc5MTQxOEZDNzE5MzEgXgorMDI3MDcwQUM2QjVENzdCRkEwMzk4QjhBRDU1NkEyM0FCOEU5OUVCRiBeCitCNDgzMzVGNkZCNkVBMjdDRTIxNTZBMUQzRTAwRTQyRDNFM0E4NDg5IF4KK0I2NzMwM0Q3MUJGMTI1RjI0NDFCRkM1OTkxMDYxNzdBMzJFNDNCQUEgXgorNDZFOThENDlCREM1QTQ2MDRGNjJBQUY3NkU5NjQ4MzgyOTFCRkFGNCBeCitGMUFDQzU2MkQ5Njk5OTQ5M0VFQkQyNTMxQTI4OTI2NEMzRTFCRUY2IF4KKzBCMjYxNzEyQzNGNEQwRDc0RUJEREQwNTJFMUEwNThCQ0ZGNDEyRDAgXgorNTA0NDZBQTdBMUE4MUE5N0IxREQ1MjRBRDBEQjREMDk5NzFEMzgzQyBeCitFM0E1MUI2QUE1QUE1ODY4MDNFRjIxODNERUNBMENCNUNBODY5QjExIF4KK0M4MUI1MkZENjBBQkVBOENENUUzMTg0RTIwNkY2OTMyMTFGMDA4RTQgXgorMTk3MjcwQzBERjY5MzYyMkRGRTg3MTg1N0E3Qzg3QjdCRTJFNDM5RiBeCis0MzQ1M0RGNzYyMEQ3MUNBRDU2REVGOUNFRTYxNkFEOUU3QzczRUJBIF4KKzNFM0M2RUUxMTQxQUIzRDdFQTUyMTVBQ0VGNEU4NzZFRkE4OUQwM0IgXgorNTc3M0MyODI2MEMyQjJEMzI1ODgzQUU3M0IwNEQyOEJGRDJFODg4NCBeCitFQjZGMjZBMEU3NzQwMjI3NzNDRDg2RTFDOERGRUE0NjFDRTZGOEY4IF4KKzZDMjY0MTBCMTFBMENGQzk3ODQ5RjZFNDNFNzdCOEU0OEQ1QzUzNjMgXgorRjAyMzZDRUYyMjk4RUQzRDg2QTk1RTlGNTI0N0MxNzQ5OUE3NzJERCBeCis3MDRCNTQ5NkNFMEFGRjQyODlGM0Q5MTUyMzBGNjlBREM3QTFFRDdCIF4KK0IwRDRGRjZCNTBGMDlGQkJBMTlGNzY2OTNBQzlDQTg3NzY4RTI3NTggXgorMTBERTRGNjg3NTc3Q0NBRDlFMTZBRURDOTk1ODAyMUQ5MERFODcyNiBeCis3ODU3NDE5NDkwNTlFODUwOERCOEQxMzJBOUIwNTNFQjQyNzcxMTlBIF4KK0NCMDQxQkFGMTNBRDIyNzc4QTFDNzNBOEFBQUI3NDU4QjY2NEIxQzUgXgorQjRCMEFEREJFRkEwNzhBQTQ5NzA0NTYyOTg0MEZEOTY1QkVFQzMzRCBeCis2OEYwRTQzQjdERjg5RjQ4NEYzQ0JENjk4NEM5NTE2ODE0MkU0QTgyIF4KK0QwNDJCRTE0QTIzRDBDQTFBMDQ2NjE3OUMxMTlGMkE5NTlFMUUxMTggXgorREQyM0NDMjgyNEE4ODFGREI2NTY2QUU2QTU3QjFBMkQxNjI0RTg5NSBeCisxNUI3NUU3RTEzQjM3NDAzOUI4QzlGQjRBMTEyMkJCOEEyMkZBRDZGIF4KKzg0OUYwRDM3OUEyNzc1Q0NCNUVCQjBBODg4Mzk1MTZGMzBBNjY1RkIgXgorOEI0MTI1RkYyRUJGQTk0NTkwNzU0NTlDMUVFMTQ5RDY4QzRGOThGNiBeCisxRDYzMkQzRUVDNjNEMTgyNDNGRjQ4NzAyQUI4OTRFQTA1QTFBRUQzIF4KK0YyQzJFMTA4MjAwNEVEQ0JFM0RGOTZDMjVEODg2MEMwRjVCNDMyQkQgXgorNEI5NkMzQzI4NEU5RTEyQzNEMkYxOEFCOEM4RkM2Nzc2RjMwQzZEQiBeCitGNDBEQzhCOTREOUZFOTkxMDExN0JDRDY2RjNGRkIyMkY2OTc3NDQ3IF4KK0Q2NUQxMjZERjYwNERFMzA2QUVCNDFBNjQxREUwQjIxNDQ0OUQ2OUMgXgorOTBGQkVGRjA1OEU4MjVFQjk0MDEyMkI2RDhCNzQ5MkZDNTc0QjMyQSBeCitBRTQ0MTRBRDQ3MjE2REEwQUZEOUFEMUUyMkM4ODJGNjY1NDI5QzU0IF4KKzVGOUQ5N0U5MUI3RTQ4MTBBRTc2NUEwOTgwM0FCRkE1MEI2RjY0RTQgXgorQTJENEU2QUY3QUZEODdFMzAzRTg2N0QwRTAzRTE5NDVBMEYwQjcyQyBeCisxNEFCRjcxMzk4MkQ0REM3QzFDQ0ZDRTdBNDg2ODA1NzYwODJEQ0FDIF4KK0JFQjhGNzdBN0QyMTFEOTQ1MUI2OThENjVGQkMwQjVFMzhEMjYwODYgXgorQjM1RjY2MDYyOTk2MkQ1RjFGODUyOTIwMzk5OUZDQTAxNjlGMjY3NSBeCiswN0FDNUIwNDE2NkU3MzlBOUZCODdGQ0NBNzQxMTJBRDkzQTA4MTI4IF4KKzJEODI3MkM5RDYyMEE3MzA1NjFFREZEQUYyQTEyOTY2NkNFQkI1QzkgXgorQzI1QzE5NzFFQUIyNjRGNDRDRUUxRjQ0NjE0NTc5RUU2RDhDNzg1OCBeCis3NkY4MjM0RTJGMEE1MzNFODEwNTQ1Rjc5QUUyOEE3QzQ2MDU2QUYzIF4KKzM1MDI1RUEwOUVBMTExRTI5OTgxNEZCQzk1ODk3N0REQkMzQTIzODcgXgorMEEyRUY1NDhBMzhEODRGNkExQ0JCMkFFMDFENDhEMjk2RDZDRDhGRCBeCis2RjU0NkREMTYyM0U5MkREQTE4NUJEQTAxNjE4REY3RTdFN0I4MkY2IF4KK0EwQzFDMkFFRDhDM0Y0MzZERTIwMEUyQTNGNEMyQTlEMkRBOEREN0QgXgorOERDMTAxOTVCOTY3RkM3RkU1N0IzMzg0OTRDMkM0MkZCNDM1OTlENSBeCiswRDkxOTJCMjc4NTFDQUE3NjZEOTBBNTM3NkNFMjU1QjJGREU5MDZBIF4KKzc3OTk0NTBEMDAzODI0MzU2RURGRUUxQjQwOEFBNTlFODMwMTc1QTggXgorMkVBNkYzMTg4RDMwMTBFREY0RUJCNTVFMDA5Q0M0RDk5Mjk2RjU3OCBeCisyQTczQUNCODNGQjhFMjVENjVGQkMxQjgwODVCRTY3MzQyRjU4NThFIF4KKzY3Rjk5MjhBMjcxMThFQ0MzOEVFMjMxRTA1OTc3QTY5NEFEMEY3QUEgXgorMjdFMjA3OENDOUZEREY1QzVERDZDRTYyOUYzRUYwNzFCMjEwNzkzNiBeCitGNTA1NDBCNERFRTA3MUM2NEQ4NjE4NzJGMUUwQkM0QzdERTc1QjUyIF4KKzg3REM5QUY3NzFGMkVFNTQzRjk2REIwQzkyNEFFNjUwQTA2M0Y4NTQgXgorNzZEQjg4NURENzk3MjQ5QTRFMkY3OTQxNzFERDU1OUZGMDU2QTlGQiBeCis5QUMyRTlDRDM4ODFCRjE0RDc1OEE3RkVCREE4MUJDOURERDMxNjUyIF4KK0QzRDg1OTVENzVBRjREMUVFRUJFQTgxNjZDQUZCMTU2RTgyN0RFOTAgXgorNUY3RDlEOUJEMEREQzVBMkFENDc3MjYxMEZFMkE0OTIzQTgyNjQ4NiBeCitGNDM3QkI2Q0ZBQTkxMzlBMTIwMUZFQjU4ODQxQjE4QzM4MDlGMDBFIF4KKzhDM0VCNDAyRDkyRTY1NDNEODg1QTlGREUyRkM4MEI5RDQzNDBFOEUgXgorMTM0MzA3QzUwQzI0QkJENzgyMkRCQTMwRjY0NEI4NzRFQkI1NEYwQSBeCisyNDc3NERBNDY2OUMyMDM3RjdCMkE0M0JDRDFDOEQ1NzQ3MTVGMDcxIF4KKzY5RkVGOEZCQzkwMzREMDVGM0M5QkQ5QzY2M0QyMTk4QUI0OEZBMzAgXgorMDM5MEYxQzQ5NDIxODA2QjE5REYxRjg4NjkwMkYzNzA4OERGNzdERiBeCitERDUzNUIxMjlGNDgyMjU2NTAzQUQyNzQ0QjcxMkJGRUI4QkYyMTZCIF4KK0FCRUM1NTJFNDEwMjAxNDRFRkUwNjg1NDE0OUJFMDNGMUJEN0Y2RjYgXgorM0ZDOEM4QTE0RDE0NTI3MTNFNzZFREQ1RUY5NUMyMzlGM0Y4QTRFNCBeCis4ODYxQTg0NDI5RTIzOEQ5NEU3NUQzQ0MxOTFGQjREMTI4MjE1RjdEIF4KK0RCQTYzNzdDMzc2QUVENEQxRTc5QzE5OEVBODY0QjZFNkQ5MEM0OTQgXgorNEU1REJGODIzREM1QkZGNTZDOTk5QTFGRDBBQkJDNTExNTUwMTdEMyBeCis2Njk5NDIwQzZGRjUxMkJFNUNBQkZFMUVCQUVGQjBBRTQwQ0REOTAyIF4KKzc3Q0FFMEQ3RURGRDJEMTM1MDZEMDk2RDY2QTMyQjk5MDdBQjlCMjMgXgorRjYwMjJGMkExNTQ1ODQyOTE1MDI5QjM0NEIxOUY0QzY5NzU3OTI1RCBeCis2RUNEMDg1RkYzNDAzMjYzNkU3QkU3MjY5RDI5REE2MkJDNEJGQjVCIF4KKzYwQ0M1MTJCRTUwNkJFMUE1ODBDRUVBRDJBMDA5REI4RDdBMUJCQzYgXgorMEYzNERGRDdFREZBNkE1REQxMzJCMkVFNzdCNTJFRUFEOThEQzcwMSBeCisxQkQ1NDI1ODVBQjMzQTBBMzY5NEJFNDVENkM3RUVCQzI2NkQ0ODA2IF4KKzE1MjRGMjAzODlFQkMyRDdERTc3N0Y5NjE1NkRGOUIyQTg2NTIzNzMgXgorNDUxMjgyRTZEQTcwNzY2ODg4NkFGN0U3N0RCNEM1OEY3M0NBNkVDMiBeCitCQjdENTk4OTBCQzM5RjdGODdENEREN0UyNTgzQzczN0IyQjQwQjg2IF4KKzI1NUQ2N0UzQUY2NTM3NkExRDcxRkZDQ0Y1MDU4MTI0ODFBRjE4MkIgXgorNEQ1NTlCQzE3MTUxNkY3OUUyMjkzOERFOTk5Njg1RjlGRjA1MzgzRCBeCisyRjdFQjE2MDgxQjIzMzhENjMxMTUzRDVCNzBERTY3RjA1MEUzNDhGIF4KKzU5MDJDRTZDRjc3MDBEMkUyM0NFREVFNzQyRTI3M0Y0QTZBMzlGNkQgXgorN0QzN0E3NTE1RDFFMDRENDRDQTBGMzE0MzA2OTE5QzAzMDdGRjRBRCBeCisxOEMyMTVBNUI4QUE5Q0E1QzU1REY4QkNGQzc5NjgzRTk5ODJCMTU5IF4KKzYzNTIwQzlERDJDRjMyMTM4OERDODlDQzY5RDBEOUY2NzcyQTM1NTMgXgorNUZBMTNFNjY5NzE5NkVCRDBFNDBGRUFFRDRCOTQ1Q0M5MzM3NURBRCBeCitCRjhDQTYwRDA3RDFCNjk3NjcwNTZCMkY4MEE5QUM0QjFGOUZBOTlEIF4KKzZDREQxMzQzMUVCNzBEOUUzNDYxMDJCNzA4RTlGOEFCMjMzQ0Y5NTkgXgorNENCNDQ4QjQxMzFERUI4RjFBQzMwODU3NjUzMDNDRjIxNDQzNkEyNiBeCisxRkRDOUNDNThBNzQ4QTk0NzhBOUU1NUM2NkM2NDQ2Nzc1MzgyRUNEIF4KKzBFREM1Q0M3Q0Y4QzZDQjMxODYxNkQ2MkNDMDhDRDE0NDk5NjAzMTUgXgorRDVEMEQ1NDAyODdEMjFBQTUxOUNFOTBCNkUzRDgxOTU4QTJFMzA3RCBeCitCQTVDQ0QzMjNCOTg3RjU0RTA2QUUwNEEwOTk1N0JDNDE3QURBNjExIF4KKzI2ODQ2RkQ2OEJBOTU2Q0VCMjg5OUREQzE4MzI0ODQzREMyMTE0ODUgXgorMTJCRDcwNTY1RjcwMUJCMzVCODczNjRCNDdGNzNDOTMyODdFNzY3MiBeCitDNTdBMEY5Njk1OUM3REVERDM1MzQ2MjA5OUVGRTM4MENCMjczRTkwIF4KKzk5MDBENTI2OEI5OTE2NUJFMUFBMkE2QjQxQjlGQjY2NDU1Qjg2NUMgXgorRDVBQzJDMkJGMzZCMDRFQUVGOTVFOEI5Mzk1OEJFMjhCNUE0QzgzNiBeCis4Mjc4OERBQTdGOTUyOTJCMjY2Q0ExN0U4NjYzMUQ4NjZENjhGRDQ3IF4KKzM3QjlFNjM4NjEwNDE4QzRDRTRDRjlBQUMwRDNFNjRGMDMzRDNENzQgXgorOTg0NUExNTYyNDBDRTg0NzUwOEExRDM3NjIzNjJGQTkwMjE2RTU5RCBeCis5RTU5REM3NkVBMDE1NjcxODNBNEI0QUQ2NUNEMzFGMTY5NzA2Q0E5IF4KK0IyQjRBMTUwMEExNzZDODgzMjY4NDQ3QTA5REU5MjBGMENGNzdGNzYgXgorRTE0RkExMUI2MEI5Mzg5RDNCOUIyQzFFN0M0NTkzMTk5MkY2NjZBRSBeCis5MjJEMTY5QzYyNEU3OURBQkRCNzlCNzZFNzc3RjY5OTRDMzM5RUY5IF4KK0FFOTlDMkY0NkEzOTM5Q0M1RUUzRjhDRjY4RDZFQTQ4NjM5MkMyM0QgXgorMTU0RjkxNUY5MDM0MENCQjAzQjk1MTQ4MTBGRDM5OUVFRDA2Q0UzQiBeCitDNDQwRTFFNzRDNzUyNjY4MjI5MTkwODA5NjZBQjc0RDk2RkY0M0UyIF4KKzQwNTE1NUZBOTlFRjVFNEEwRjRFOTNEMTA3Q0FFQzg5QTgwQjk0QTIgXgorMEFBOTYyNTQ1NUEwQ0NERjM3RDQ4NkI0NTM4RTc5MEJFNDA3QTU5QyBeCis0NkQ2MzNGN0YyRUM1NjQ5NkQ1MzEzOEE1NkQxMUQ5QUJEQjcwMUUxIF4KKzc1QzFCRDU3MzhFQjUzODBFMjVFQzRGQ0ZDQzdCQjNGRDgxNjQ0NjAgXgorQjYxOEM5RTUyMzAzOTE5QkY3NjJENDUyRjU2ODFEMjNBQkZGMjNCNiBeCitEMDhCRTFGNTQ4NTkzOTY3N0QyOTRDNDE5OEZBMTVCMTE4OTM4QjNGIF4KK0Y5MzE0NDEyNTlCNzkzREFCQUYwODJEMUIwMDI0QUNBRDNDQjQ4QTYgXgorMDk2RTIwNkUzNzUzQkJFRUM4RjBGMEQzRjk3RUJGMkVCMzA2M0IxRCBeCisxM0FBMzk3RDAzQzYwQUE0NDE0MjcxRDMzQ0FDMjM2MUMxMzg0MjJCIF4KKzc3N0UyOTc5ODM0RThDNkU4OUQyMTlFOTEwOUYwQTI4NTI5NjFFRkEgXgorMTM5NjBBNjQ4REI4QjdDRjU0MUE1NkI5MDA5QTVGN0ZCQ0MxQUJBQiBeCitCMzQ0N0EzQzQ2MkI1Mzk0NUY4Mjk1MDMyRkM5QTA1N0JDMzAxRkI3IF4KKzhDNDIzODZBMjQzNkRFODNFMTk1OUU5MkI0NEVCRjYxRTZDOEQwOTMgXgorRDlFRjkxQjA0REQ0MzcxOTY4RTE5NzhDQkZFREI1MEMyQkFCQkU2NyBeCitFODQwNDI0NzlEMUQ2NjlBQjU4NzFCNzFEMTM0MkFENkQxNTEwNUMyIF4KKzRBQ0QxMTJDRDhDQUM3MkRGMkQ0REE3NjkxMEMyQ0QzQkUxRUMyNUQgXgorQUEyMDk4MkUyQjEzOEZCMjQwN0VGOTk1MDkwNzVDRTgzNjZGMTBCQyBeCis1RTNCQzUzNUJCRkY0NzE2ODY4ODUzMzFDRDk4MzFDODBGRUIxOENEIF4KKzUzQzU1QzgwRDY0NDExMjIxQzczMTE2NTQ5MjE1MjNEMkJEMEUyMjcgXgorM0ZCOEM4NTBCOUJDN0E5MjM3NjdEMDM2OTkyQUQ3OUVEN0YwRTFBRCBeCitBRjBCQ0E0RDQ0MEQ2NTk5QkI5MTM5NkEwODIzREU2NDc2NEMyMTEyIF4KKzMwQjEzNzAzQTcwMjU3MjI1N0Q1NERDMDk0NjM3NjhGNUFBRUY3NTkgXgorNTlDNDRCOTlFREMyOTdCNDc2NDAyMzEwMDQ0NTU0QjNGMjlGOUNDRiBeCitGRUQwNzg1OTZDNTg0ODEwRTUzMzY1NDVGNkY2QjkzMDI3RDlDQkQ2IF4KKzY0OTlFNzBFNTQ1NUY5QzhGRkQyRDVGNjAwMDA5QTQzRkFFNzEwRUQgXgorRDI2QzA3MThBOUM4MjIyRjMwRDAyMUU4RkE2NTA4OTM1RTgwQkM4NSBeCisxRjQxNTI0NDdFQ0I4RDdDRDcyNUI1N0I2NUUzMEY3OUI0NjZCQkRFIF4KKzZDNDk1ODY2NUREREZDODI4QzE0MjdFNTdEMjMzNTlFOUM1RDExOTAgXgorQjg4RUFEODQzQzQ4OTdCMkE2OTE2MTJCODM3RTVBNUQ5RjU4MTcyQyBeCitBNTEwOTdEQzE4ODNCMTYwQUI3OTlEMkQxMDNDNDQzMzM2RUFDMkNBIF4KKzVEQTFCODVCQkY0RjM5MTJDNUU5NjQyNDJBNjFFQkU4M0EzREE1QjggXgorNEU5QTQ1QzA0MTBGMDIxMURENEQ5MTIzQkZCOEMyOUM1M0E1RTAzQSBeCitDMkI3Qzg5RjdERUE2RTVBNkNGOTA5Mzg4NDcxREVDNENBMzYyMjU1IF4KKzRFRjNCN0U3ODQ2MTE1MjEyQjNFNzdDMjlBQUNBNjE5ODQyMkJFRjIgXgorNzhDNzQ1NjNCQjJDRjgxOUY4M0U3M0NDMDAwNzIzNzhDMTE0NjM5RiBeCitGQUY5NkU4MzZDMzgxRUM4MEZFMUVBOEFGNzZFOUQ4RDhBRDk1RkJEIF4KKzNCMzBBMkJCRjg0QUI3MEU4MjIwMzQ5Q0JBMjQ5REI4N0ZGRENCRkYgXgorNkNFMENDMjk4RDEyNTk3RjgwMUUwRjFCREU2NkNBOURERjZBRTY2QSBeCis4Mjc0QjFEQjhDMEM3MzkwQzM4M0M4MzdGREFCREVCQkVERDFBOEMxIF4KK0QwRjkwRDYzQUNEMDEyNkM4NEQ3MTRBRDdDOUVCNjczREZCNDU5QjIgXgorRDFFNjNFQjVDMzczQzc4RURGOTY4RTA2NTFEQzExNzE5MDcyNThGNyBeCisxNTMwREM5OTU2NUJFMkI1QUU5MUQxRDcwQjAyN0VERkQ0RUM2RTkzIF4KK0ZFQzA5NDZGQjlDQzA0NzEzQzY3QkEzNkZBMzZFQTkyMTExMzEyODEgXgorQkQyQkE2ODBEMjIwMEFGQzVDQUZCMzYyQTU1MTdCRTlEQUI3RTU5MyBeCis1RkI1N0UxQUFENUJEOUMxRDE3NkUxQ0EwM0MxQTVBOEUzM0RERTJEIF4KK0Y2RDVFN0IxQjI4QzkwNzAxMTVEQjY2NjUzMDlCOERERjVGODEyODEgXgorQkZFODhGN0EwRkQ1RjZBMUIyNkE1RTE1RDBBMTA5QTFEQTdDMUZDMSBeCitFNTY2OEFBNDAzNzVDOENBMzVGQjMwNDZFREQ4QUQ5RURCQTgyRkUzIF4KK0M4NTRENUM1QTBBMTAwNDExRkNDOTE4OUQ2MzA3QzQ3QjU3MjI4Q0YgXgorMUVFMzg0MDc2MzA4QUM2QjgwRkI2Njg1NkQ1RkExOTk1MkIzRDZENSBeCitDQUE0RENGRUUwNThEMjJENzI2MjkyQjJDNzIyRDMxNDdGMURDRDYzIF4KKzE4ODdDNzYwOTJDOTI3NUIyREUzMzMwMTRDOTlGRDEzRTVFNTMzQkEgXgorQUVBQzZBQ0I0NTYxOTg1RENGRjZDOTY5NkJFODM2RkJGNzVFMjRFOSBeCitDQTQ2RjIzNzczQjMwQkYwQUJGNUMzOEVCOUQwRUUwMjFENzEzRjhDIF4KKzJFRjAwNzk4OEIyMTYxRkVEMDdFNTE4MUMzNDJFNzI0RDNGNjQwQTMgXgorRjBGMTQyMkRGRDM0RURFMDBBOEIwNzQxRjRGMzk1MjM0NDgwRkRCOCBeCisyQzQ3MUJGODY3RjVBMDJDQzI0MUUzNUQ5NUM5N0I0M0Q2NTM2RTdEIF4KK0Q0OTA2Qzg4MDRCMjQxRTI4RjNGMkU2MzgwMDE5RkI3MzlFQzg1MDMgXgorNjMyMTgzRUVGOEM2RUM4RUFBMzAxNkE0M0U1NjhEQzM4RTI5Mzc5QyBeCisxODA4MTIwRDQ2MUE4NjdDOTAyMjI0Njk5ODU3NjlBRjE3NTZFRTVCIF4KKzA4QzJGOTdCNkZBNkUxNDMzREFGNTY0MDNDREZFOENFRUNGNkJDRkUgXgorMjc2N0UxMTE5NzdBMjBEMzE4RUFFMTlENTlFMUU1NTFBNEFBN0YxRSBeCitCMUE3MTU4Q0U1NjY2NkJDRDFGREU3REM4N0I0MEM5MjcwNUJGREU1IF4KKzdDRTkwNTE0QUQ3MzQzOTBGNkZFNThCQUU4RkZDRDY2MzkxRTk1OTUgXgorQzU3RjRDMkQ4Qjc4REI4NDY0RUYxRjcxOUI4QjFEQTI3MDg2NzQ4MCBeCitDOTc5MzhGMzRDNkRGMjZCRkQ1MDk2NTg4MzhGN0MzNUZEQjBDNThCIF4KK0E1Q0FBNjk0NjMwMEIxQzRCNUY1M0E2OUFBQUQ2Nzk2MUM0QzY4MjEgXgorRERGNjg0OTQ3QjE2NjdBNzdBMjJDN0RGRThCNkEwQTg0ODRFMjUwOSBeCis4RkIxMzEwRjFGMjE1RTRFRjYyQzQxNTY2QzUyMzI3NUJDOTI5NjcwIF4KKzE1NzNDQzQ0N0IzOTg1MzJCRkI5QTJFNUFCMzg4MEYyM0NBN0MyN0QgXgorRDZFMEI2NzRCOUU0RDI4M0MwQUFDMzU1OTg5Q0MwRThCQkYwOTY3OCBeCis3RDA4M0JCOUMzRTAwNUI0MUZFMzI2MjlGODRCOUUyOTJEODBGQzY3IF4KK0QzRTI1OTFCN0Q3Q0QyOUU5QUNFNjFERjYwMTlEODc4N0FDOTNCRTYgXgorNzE1OUIxMEFBQ0E5RTc2MTBDNzQwNERFOTYxQUJGREIxN0I4OTE1NiBeCitCNEEwMjQ4MDg4RTg1MEZGQzVDQ0E5OUVBMkYyOEVDQUNCRkYxOTYwIF4KK0NBNjNGNTRGREI2QzQ2RTg3Nzc2MEVGNEU1MEU1NkYzMTY0QTQxN0YgXgorQzQxREY1MkVCMjUyOTYxNjE5QkQ0ODYxQzRBQUNDRjFBQjM5MkI2OSBeCitGRTNFRkU0NTNDODcwNUUxQ0VERDA2RjE1REY1QjM1QTczMTFEQjMyIF4KKzVFMkU4QkIwNEIzMjdFOTE1NzI5OTJBOEE2MTA2M0Y3QTc2QTkzRkYgXgorOEVBMDE5MUU4NDkxNDAwMDM4Q0M1QjE0MTZFNUE1NjYyMkVGMUU4RiBeCis0NzcyN0Q0RDdFOEQ5NzM4NjA4QUVFREVCMEUxMkM5RjI0MjdFQkNCIF4KKzczNDBGNDA1QkM0MjhEQTUxNEU3QjJGMzk3MjhDRDc3RkEyMTc3RjkgXgorNUU0NTFDN0E1MUFFQkFCQ0VGOUZERkJGMzUzOEFGRUNCOTY4ODcyQiBeCis1MjgwMzgyNzQ4MDNENkRCNDE5RjY5MjM5OTNBNDVDOTk5NDMzMzM2IF4KKzI4MUQzMEZEM0M3MjVBNDY0NkE2Mjg3MzI5MTQwQkVBNEFDN0E1QjggXgorOTIyQTU3REJGNjJDMDFEQTE5Qjg5RjkwRjM2QzQzMzgxN0YwODlCMCBeCitDNzlBQjIyNUJCRDAzMTQ1QTk4MURCRTdCRjZGREQxNkE1RTk1RDhBIF4KKzMwMUI0RDBFMjcwRjJBRUM2RTEzNzI1NjAzODVEMzc4NzVFQjY4MkMgXgorMUVGMkVDNkEzNjQyQzdGRDYxQzRGMUMzREZDNTUzMDI1MzUyNTRCNyBeCisxRDk0RUNGMjlEMjMxMEIxQTVBMjA0MkNGQTYxNkJBMEQxOUU3QzQxIF4KKzUyRERBOUJFRUZBQUFFNjY3QTZEMTJCRTQxNEZBRDg2MTk3NTAwNDAgXgorQjE0NDg2RDE2RDE1MjFEMTI4MzY5OEU2NTFBMTBGQzE0QUZGODk5NiBeCis0QkJGQkQwMjQ0QkZFRTQ0MERCRURDODM2MTgwNkNBREZGNjczMjUzIF4KKzY2MkUwRTQ2NkM5RDcwMEM1MEM1Rjk4Q0Q3N0NGRUNGODI3OEQ3MDggXgorMUFDNUI4MTk3QjA2ODk2ODFCMEY0NzQ4MzJGMzE2Q0QyNTE0N0FGMyBeCis4NzIwRTAxMkYxNjU4OEEzQzM2ODY4OTExMzkwMjExOUM5NzkxRkYyIF4KK0Q4OTJDMUUyNTdBOTk3QThERjk1QjIyOUM5RDI0Qzk5RjYwRUYyMDUgXgorNTdGNUM0NTI4NkVDM0QyOUNFQzE5OTM5QzA0MDQ1RDlDMzhFNzYxRSBeCiswNzE1MUQyRUM4ODlEMjQ3MzBBQUE1MjgyRkE0REZDNDlBNjZFNDM5IF4KKzZBQzk0NjkwRUE2REI0QThEQzk4MjI3MTQ5MEVFMTgyODJBM0IzM0QgXgorMzJERDE5RjEyQUMwODU0OTk4QzdCMTREMUQ5NkMxNUZBODk5NURCRCBeCis3ODE3QTI1QzZDRjFFQkZBQThERUQ3QTgwMDYzRDFBMjk5QUY4QjE4IF4KKzAxQzVFQUMxODMwRDFGNUE3RjE4NkUwMzk2NjNDRTkyNUZDQkFDREYgXgorQjlGMzJGNjdGRjQ5MzdGNDQwOTRDQjRBNjJCRTEyNDc0QUMzRTFBQSBeCiswNUJFMkNENjg4MjQ0NzQ3MkFEMkUwMkIwODU5MEVERUQ2MkM3NjM4IF4KK0NFRjE0OUY2RDZGQzg5ODdDMzY5M0Q1RjVDQ0FDMENEREQzRDA3ODcgXgorNkE3Q0M5OURBRDg2REE5Nzk3QjFGODMzNjM1NkM5ODY0RjI3OUQzNSBeCiszQTcyRjhFRkU2NENGNjBENDk1ODlBQjkyRDQ4MzAxNjIwQ0VDMEVEIF4KK0YxRjU5Mzk0MTlFMzc1MTgyQTJBQTkyOERBRTNDRjZDMzc4RTQ1ODkgXgorM0VDMUMxQjc0Qjg4ODFGODZDMUQzRURFNDJGNjY4OUM2MTEzMjcxMCBeCis3MTY0QTVCNEE2OUEwMDRGRDc2RUE0QzZDREZFMDI3M0QzNUNGRjcxIF4KKzIyNDMyNUEzMDlGREYyMzc4QzU3NzZCMTc1MUJCMDY5NEVEMzBDMjggXgorNjRFMEZFQ0JGNUY5NDUxN0VBOUUwRjRFMUUxNkZDNzAwRUUyNzVCOCBeCis2OUNERjMzMjE4NTBCQjY0MEQ1MjMxRDNCMzQ1OEY4MzczOENDRTZDIF4KKzA2ODQzNDlBMkFCRUMwNkNFMDUxMDBFQjY5RDAxQ0Q0RkI3QUIxOTMgXgorMURGQTQ5MjI1QzBGRDcyNTA0NkFGQ0FGRUQxN0IxQUJBNjg3MUZCNyBeCitFQ0Y0QjFCOUM3OEE4MDJGNzQ4RDU4QkY2RTI3RkFGMUIyNzRFRUMzIF4KK0E0NEI2N0VGOTFGMkFBQTlFQjJEQThCMTY2QTFBMzE2ODg2RTg5MDkgXgorQ0YzOEIwRjdEREQyRjcyQTg5MUI0MUFEMDI2RkNDMzI4MjIxODc0NyBeCitGOTE3MDMzRDQ0OTRBMUNDQzg1ODBDMURCRUQ2RjI4RkVCM0UyRTU3IF4KKzNDMzI2RjU1MDAzOUY4MTVFQ0Y1RTIzNkY2RERFNURCMEUyRTlGNjUgXgorNzMzMjAwMTAwMkExMUZEQUY1MDE5MTRBODY3Mzk4NjI1Mzk4RDVDRCBeCitERUExODlEQzQxQUY2OTUxMDlBRENEOTM5MDZFQjUzNzJCNTEyQTU3IF4KK0UwRjE0QkNBOTI0MEIyN0U0NDY0N0VDRUI0QTQwNDA4RTI4ODBEQjkgXgorNzc1NDVFRjg0MTQ2Rjk1MjIxMkQ5RTFGREJBRjYyMjQzQ0RBNjMwQSBeCitEMTYyRjY1NERFQjVCQjBENTQxNzkzMTlEOERGOUYxQkI2RDhBMTNCIF4KKzNCRjc5MDA3MjUyNTM3Q0MyRUIxMUUxNDg4NDJFN0FDNDQzQ0E5MUEgXgorNkNCMkYyOTFDNzE5OEM5RTQxMTJCOTkxRkQ0RDgyOURCQUQ3RUZCMSBeCitDODUwMjU4MDM2NzgxQzBBRThBMDgzRDZBNzkxRDNGQUVDOTQ2Qzk5IF4KK0RDNjRDNTAzN0JEQzkzQTNEMzg2MTNEMjAzRkIzRDdDODJBMThBMjQgXgorNjIwQjc3MTQyODlGRDgyQUJCOUZDNzc2QjY0NDU3MUY3MkE5NTU3RiBeCis0QkVCQzFFRjQ0QzMwQjBCMDMzMTUzRjg4M0Q1QzU4RTRBRTY4NzZEIF4KK0UzODE1QTRFNkJGM0I1MEVFMzEyRTVBNzk1QjNFOUFBMkQ3ODMyQUQgXgorOUNCMTNEMTlDNjQ3NTIyMDlENUQ0RDcwMzNGQUY5REU4OTYwQzE0NyBeCiszMTgyQjlGMDNEMEFCQTNCRDkxQTFFQjhDREQwRjQ2NUZEOUNDQjUxIF4KKzczRDhFOEI5RTZBMDRFODhFMjk3OTdDQzVFMkY0ODkzNTBEOTc4QTcgXgorNzMyNzM0Q0NFQzE4OTQ0QkNBNzg0Qjk1M0RDQzBFNTgyMjI1QUI4OSBeCitBMjE1MkRCMDMwNDhBRTI3QjQ3QzI1RERGOTlEMjQ5NTA0QThBREYxIF4KK0FCNzBCMzJBMjhEOUJGQUFFMUNBODY4QzRBMTYxQjZENEIzQTkyRTUgXgorQUI4QjkwMDg1QjQ3MDUwQjg3RjRCREFGREY5NzE3OTBCNzk1MDkwMCBeCitCMzE1QThDODcwMTFCQUNBOTY5QTFCNzlFQkFDODBBNzM0Mzc0MkU2IF4KK0I3OEEwNDQ5MDhDREE5NjQwNjMzREM4QkU4MjhFMjJGOTBFNkQ3RjMgXgorQUMyQkM1MjQ2QzFCRDk5MjMxQ0RDQ0YzQ0VDREVGNTY4OEU1OEQ3MSBeCiswNjc5Rjg4OEY4QzM1M0I4MDdGNTQ0QzIzNzlCQjVBNEFFOEVCOUE0IF4KKzQ2NEI1NzU0RTNENDI4NjRDQzBBOThCNEU2OTZDODI3RTMyNTQzMTcgXgorN0U1Mzg1QzhBMUJGRjBGRjQ3NjkwNUJCNkI3NTE1QjZENDM4Q0MwRCBeCiswRjVDOTY4Q0EyRkNCNEExN0UwQUYwQjk0NjgyQjNBQzM0N0MyRDEyIF4KKzRGNUUzNTM1MDBENjNDOTlGNThBMjhGNTg3MDA2NEZBMjc4RkM3QkEgXgorRTdBMTA0NjUxQzRENkRGRDA3NzhFQzhBQzhFNEYwMDFCQzdCOUREMyBeCisyM0RDRjlBODU0RDFENUI1NTk5QjE0QTBFOUExOUFCNEYyRTNCQjc3IF4KKzU4OEU0MjlGQTFDMzA1NUM0RENDOTlFRTU0MDdBNjQxMTVCNTQzNDUgXgorMzkyMTVBQ0UwMTY2OUNBREZCODFFOUZCMDg1NzEwRUI1Qjk3NDYxQiBeCisyMzU2NjQ0OUREMjlBMzE1RDQxMzYwNEEyREJDRkFFMEQ0MDU3OUEyIF4KKzFFQTg3QzEzREEzOEZFNEM1OTY5MUQ5NkFGNTkwRUFGMzkwOEMwRjEgXgorNUE2MTcwRkM2QkQ3RThDMDExNDBFMTZGMjQ4QzU2ODkwQjUxMzIzQSBeCitGRjMyOERGQjUwNkI3MkZEQjhERjU3MTZFMjkxQTE4MzBCQzUzOUQ0IF4KKzdCNERBODQ2RjkwNzQyNTRDNjc2RjAwOTQ4QkQ0Qzk2OTgxNDhDNEQgXgorMkFDMzEwMzkzRUUxRUNDNTg0NEE0QkVDMTVBOUNGQzFCNTAyMjI5NCBeCiszQUUzNjMxNkZBOTRCMzY5RDczMjBBOEI3MTMwNENFNjQ5MEZFQ0NEIF4KKzcwNzhDNzA0MTI3NUJDQkU4NDAzREUyNEQxNkE2NDZCNDQ2Mjg4MkIgXgorODMyNUE4NzE2QTJDODc5ODg4QkE5RjY3NEM4NjlCMUZGMzFCRjM2MyBeCis1ODYyMDBCNTVCNUQ1MzdCNTlCNUUwQkM2RkQ5QkFDRTFFNzJDNkVFIF4KKzBCNjc1RTdGNDM0NzU2RjVFMzEwQjgwQjU4Rjg2MUU3ODk0OTVGNUQgXgorNzQ5QzRDMDg1NkNDNDYyOURDMzk3Njc4QzBFOEJEQ0JENjQ5QTZFMiBeCisyNTMyN0M2NkZGNDZDNDQ2NkY4MUVFNjM1RThFQzAyQzVDQTYwRjJBIF4KK0JEOURGQjU5RUI1RTUzQkE2OTg4NzM0RkJFMDg5NDE5NEExMTlEMzMgXgorMzA4NDA0MEU1RUNBNUU3NzQwNkI0REYzQ0I3RjMyNEFDQzk2QjUwNiBeCisxRTE0QTA5RkVEQjYxQ0VCRTI1NUI5NEY1MzNDNDAxOEU1QUY0QkFFIF4KK0M4ODQwQzA1MUEyMDRGOEExMzQyMENGMTdGRTc3RUVFMkZENzk0NUQgXgorNDc5MDI2NUI1MjMxRjlBMTczOENCOUY4NDIzQkVFRjIxOURGMTEwRCBeCiszNTQ5NDdDMEYyRjI1RUI0OTFEMjFCRDBCRDFEODA5RkREMTQwQTY2IF4KKzIzNzYyQkYzQ0RGM0Y0ODRDNzBEMjAwM0I1NUU2RjQ0N0JBRjQ2RkEgXgorRTVCRkM5OTU1NUNFRDVDMTc0M0IxNTJBNjRBRTA4QzlFRDEzNjVENiBeCis0Q0I0NERDNTA3RjcxNkJFRDRCNENBQzc0MkU3OUUxQTJERkEzMDhGIF4KKzYyNzkwRUMxNEU4Q0ZEMUEwRDZGQUY5M0Q3OTg0QTFFOTQxNkZENUMgXgorNUMyRDNFRDk4OEY1QkQ5NTc5RDJGNzEwRDVERDY4QjExNTg0Mjk1QyBeCitDRjg0MTRFRDg1RkEwMTM1RTQ0QjM3QThGOEI0MDc1NkJBRUQyM0RGIF4KKzAzNDMyMDY0QzFDMDVEMjgzOTNDOUFDNTg3OEM5QTlCQUE2RTVDN0UgXgorQzM3QTZENjRDRjgxQ0RGN0RCQjFCODE1MDlBNjdBMEExQkI1RjI3OCBeCitGMzQxRDg5Qjc1RTU5OTA0OEE5MTFEMEFFNzU2RTAwNjU2NjlCNEZCIF4KKzI2OUUxNTI5Mjg1NDE0QTc0Qjc2NTg2RUE0RkNFQ0E4OTVDN0QxRUMgXgorRkY5QkIzOUY5RkVBMUVBNjNEOTQ0QkYxMkFEQzk4RDFENDI1NTA5NiBeCitERDExNEYyREYzRDkyOTc3RjlEQjk4QUVDMDRGMzY3Q0ZGOUZCQTJEIF4KKzY5QjUzQkIxMzM3NUY5RTEyM0ZDMzAwOThDRDlFREIzQzFBMUZERjggXgorMkE2MDk4NERDNzk2ODJFOTZDMjlDQzcwNTBFMUFDRjk4OEQ5RTRENiBeCiswOUFDNENBMUE0MEE3RDgzQTQ2M0FGMDgwNEM0RURBMjA4RTA5RDM2IF4KK0EyRUUyNDczQzI3MEEwNjM3RkFBRjE3REE1NDIzN0QzN0UwQzY5NjAgXgorQjNBNzgxN0FERTk2MkRDRUVBN0ZCNkY5NjBFQkUyQkMxRjlCQ0JBNyBeCis4NUE0NkNDRTAxQTc5NjgxMDQ0OTYyMjU0ODNFQ0UyQzE5OEYyQTI3IF4KK0JDMDI4RjVFQ0Q4NzczQUU0NzU2M0YxMjE2RTBCQzM2QTlFMzdFNEUgXgorQzY1QzQwQ0NDM0REODAwNDVENkE0RUZGM0U5QzdENkU0RTBFNTU4MyBeCitCRDlDMTg5QTYzOUZEM0Q3MDE2NzM2N0RGNjFGMTQ4NjhDRTdFMzEzIF4KK0M2ODk5QTg0QjhFNjY1NDhCRkI1MDc4MTYzMkNDM0QyRDFCRThCOUUgXgorOTJGM0M4RTQzNjIyNzk3NkYzMkYwMDU0NjlERTkxQjIzNjMxNTBEQyBeCis3RDJBODBBNUM1Q0M4ODk4OEYzODMzNEFGRkUzMUMwNEFBMUFGQzlDIF4KK0Q2MEZBQ0ZBNTdGNjYzQzRBMzk5QjFGRERENzU5NzM5MTBGMjcyOTQgXgorQ0VFQjk2NjFCRUQyRTg5RERCMDdBMjFFRUJGNTkwQkIxQUQ2NDRBMCBeCiswNDY1QzlERjJFMDg4NkFDNzlGNDZCQkJFQjBBMjQzREY3RDZCQUFBIF4KKzk4MDczMDEzNTk3QjdBRTg0Q0I4ODRCRDkzMkUyMEU2Q0I0NzcwOUMgXgorM0NCNEY3NkI2MDJCRjZCNThCMzE2QTJEOEQxNjlENDMyRjAyQ0UyMyBeCis1Q0Q0RUIwNUU4NjEyOTc0QkQ5QzNCMTlFNDhEMTkyQkU4Qjk2QTA5IF4KK0JCMTg4RDVGREU4MDZCRDMwNjQ4QjYwNTgxNDNGMTgwMkYxNUZBMTAgXgorODRFRjFEM0RFNUMxMTQ0QzJDOTI4Q0Q0RDkwNzBBNkU3OTU0MzQxNyBeCis3M0JFMkFBNjZGNUZENkJGNjMyNzNFQTEzNjM1MEQyOTQ5MUEzMzA1IF4KKzUzQ0YzQkIwNzc2MTkxMEJCQjQ4NkMzQzBDNjQzOTQzRDVCRjE3QzMgXgorOUE3NzRCREJEMjdDMzcwNDg3MUI1MkNENUY3RjkyNEM4RUU0QTY3RCBeCitCMTA2QjY1ODJGMEY2QzlFMkVGQkM0ODYwQ0ZDNzAyOEYyQzQ3Rjc0IF4KK0ZFQUZGNDQyOThDQkI3NTE3QjE0QjgxQTZBQUQ1MDE4MjhDNzczQTAgXgorQjVCQjQ4QkVEOTY5RjE1RDE2MjMwMTk2NkM1MzdBODFDNDBDRjRCMyBeCiszNDk1RDdFMzY3NDdCODI0RDMzNDY1QjVEQjcyRDZDNjIzRURBNzJGIF4KK0Q3RjQ5MTc4QjQzODQ3RDk5ODRCOTIzREVBQTZERTk1NzE2OTBCOTIgXgorM0FCN0UyNkJEQjA0MDlFNTUwNjNBRkZGNDU2QjdBMjlDRjA5OEFGMCBeCis3OTg0RTE1NjVCQURDRDIyNDlFRENBMEEzQUFEQjQzNDYxMDRBNTU2IF4KKzQyREQ5OUI0MTgwMUIwQzM0NzU4MERGMUZERkIyMzk3RDU1RDJBODUgXgorOEQ1OUMwMDQwMUVGQjMxNEEwREZBNEQ4MkUxRDg1NzExQzc3RTI0NiBeCis1MENGNzQ4OTRGN0NGNUE5RjM3QzM3QjQ3MzI3MDQ3RTkxMEQ4OEExIF4KKzFGQzQwRTI4NDBDNEI2OEY0MEMyMDVCNkJCMDZDM0UxMDZCNkI4RDggXgorQTQ5RjU2REZDMjkzNDExNzM2RjI3QzE5RkEyQTM2MkE1NDVDNzYxRSBeCisyMjFFNDg4NDVGRThCM0QyQzc5QUZFRDM3NDE0QzBENzMyQTY5RjRGIF4KK0FGQzEyRTdCREY5RjQ4RkFCMUI1OTVGRDY1Njc3NkEzOUYwRjZDQTggXgorNUVBQTExNDQ5MUU4ODkzODI3NkZDM0FDQ0RFNjU5NjIzQzAyNEJENyBeCis1MDgxNDQ0QzNGODFFMTgxMTRCMjg5MDIwRDlBRUM3NUZCMjA1NTk3IF4KK0Q0RjY5MTU2REU4NUM2MUU5QjQxNTBBQzlGNkY2QTU0RjhFMTkzQTYgXgorM0Q3QzdFRjREMzYyREUxMzdBRjA2MjU5MjVCMzY4MzdDMUZDNzU3MiBeCis1NzVENzcyRjlDMUNCQ0E4RkYzODI0MzM0OEUwREZFMDI2NDNDMjhDIF4KKzBDODIxRjI3RkQ4MkM1NUNCNEQ3NkQzODZGNDFEREM5MkY3OTQ5M0UgXgorQzNEMDEwMURERjU1MkExMUM4RTFFRTZCRkFEQjcyQTk4M0YzODU3MSBeCitGNEQ2NTA0NDAxMjczOTBGM0EzQzJFRTk5MUMxODVDRTc2NTBGQUVCIF4KKzU0NDYwRkRBRkVGMzAyMkJDMkM3RDFENDk3Q0JFNUNFRDczNjI0QzIgXgorOUIzRjdCOUQ1OTRBQUY2QTI2RjVDMjFCRDZFNDcxN0Y0NjI2NzQxOCBeCisxNEUyQjM0RjBCMkM4OURBRTE3MzI0MDBDMDJFMkNBMTlBNzY3RjhFIF4KKzEwNzJBQkM0REZEMkZEQzZDMTE0MzE0RDNDMDg0NTc3NzI0MjE3MTMgXgorQzlFQTRCMDIwQzExREVCNzk0RDFEMDU5NTc0NzNBNDZBOTA2QjQ3MiBeCis5MEJBNDI3MjQ2NEEwMjA2MTJGMDA4NUI3REI5MzY3QjdCQThFMTVFIF4KKzg3MTNBMzk5N0EzQ0Q1REE4N0U5N0FCOTQ4NTFCNjhFNzQ4MjY4Q0YgXgorMzcwMzU4RDU0QzgxOTcwM0UyMEVGNjNBMjQ5OEM4NTg2QjQ4RDQ0RSBeCiswREU0MDI0OUE4QjIxNUU5OEU4NDkwMDhGQjdDQUU4MEVDMjNGNEE2IF4KK0JCREI5NjMwNjU5NEQxMzU5OEJCMDEwOTI1OEU0ODhENDg2RDk4RTQgXgorREY3REI5Q0IyRkQ4QTg2ODU0QzVERUZDRTU5QzRFMkYwMjQ1RjU4MiBeCis4NERFMzJFRDg4QjNEMkJENUY0RTMzQkEzMzk4Q0QyRUMxRTlCREYzIF4KK0QyMDk2Nzg0NEZFRDExQ0E3MUQyOEQ3MkIyOEFDRkRCMTRBN0RCQjIgXgorQjEzQTBBNkE3NzIzQkNEOTA5OEUyQjA0RkEwNDMyMEM0QTBFNjA1RCBeCitCRTY2QkUzOEY5N0U3RERCMDJFREM4RTBBQ0U5N0NERjgzRjAzNEZFIF4KKzI4RUNDMjVGRkIzOTRBQThERTE4RjhBREU4QjM1Nzc5NTUzNDZGQkIgXgorNDUwNjhCNkEwRjYxRDBBRUY3MDhBRjdEODQ4NjgzREFCRTgxN0MyQyBeCitFQUFEODI5QzMyQzNBRDRFQUVBOEI3RTYwOTBBNUNGNkIyRkNBQTgyIF4KK0Y0NDVGRUIyMkRGNUE5RTQ5RTJDRjdBQUQ3Q0MxRjVGNzJGMThCNzcgXgorNzNDNDI0RkEwQjc4NjNGMUYxNzBBODUwRjZBMEY4NUM4NzgyMDg0MSBeCis3MUYwMTU1RDQwQ0M1NUYzRDY0QkVBNjQ1NjA4RkQxODRFMjU0M0YyIF4KKzQ1NDJGRkNGNTAyNjdCNzc1MDJEMUEwRUQwQzJBNTA1MENBRDUyMDAgXgorRkI0OEYyNkYzMjBEN0E0QjgwM0VENDU5QkRGOTJCQzFGODcwMzYzMSBeCitDOUY5QTM3RTM0QkVBNjIyMEJFQkMxNjdFMzRCMEJBQzZCNTVBNkI2IF4KK0IwQzgzNkNDMjgzMUZCOEJGRTU5ODgzNjBDQzM5RkFBNkE5MDRBODkgXgorQjBDRjc4M0Q4NEJGNTM4M0VGMzBFRjIwNzFFMEZCQTlBQkI1NTNFQSBeCis4NDExQzhEMUE0RkMzRjEzMDE0M0RFQzUyMzJCNTlCQkRERjExQjdDIF4KK0FDQjZEOUVCMjJENDc0Q0ZENTgzNkM4Q0UyMkYzODdFMTJEQzIwQjcgXgorRDU4MkZBM0RFMURDNDI1QUU2QTM5NEZFNUFDMzIxREZFOTZCOTMwNSBeCisxNUNBMzJEMEUyNDZGMzk1REUyMkZBRjhGMEZEOTAwMzZDNDAxNkM4IF4KK0YxODMyRkVFQ0JGRkYxMzMwQzdBNkFDNDdENkZDMTg4MEU3OTU1MEQgXgorQzQ4NDZCRUExNTlEMUQ0MzQyN0NCNTgwMkM0NkU0NzlGOTE1NzM5MiBeCitDODRGRjA5QkE2QTJFRTlCRDE5NzJCOEMwQkYyNTI0MEY1QTdFRTcyIF4KKzRFNkI0RjM2M0Q3RkRCNDA4M0FBNkY1RTc5Nzk5NjZGQjhGRjZDNUEgXgorN0E1NDNCODFDQjREQzkzMDgxRDhDQjZBRUQ0MzZBMzFDNDAxOEE4NCBeCis4NTk5MEExQzM1Qjg2QkEyNDRGNjBCQTBFQkQ2RjZFODAxNTUyRkQ0IF4KK0QzRTA3RjVEMTRBRTIxOUQzQ0I1OUIwMzQ3NjRDNDAwNTZCQTk1RjQgXgorRjRDNERDQ0M2M0U4RkM1NDAyRTkzQ0Y1MDUzM0U1MUQxQkVDRUQ0MyBeCiszODA2QUZGOUFEMzg1OUIxNTBGMUUyQTQwRkJDMDQ3RkI2MjRDQjE0IF4KK0I1MUE0RTRGQTIxM0QyMjU0OENGRjI4MzIzQzY2NzlEMjY5MzExMEEgXgorQTdDNzBDMTlCQUMxMDQwNjk4QzdBRTZBMjNCMDY4OEI1ODQwNTE1MyBeCitFNzRGRDhDNDU3NTgxQ0QwOUY3NUVFM0Q0MzQ4NTEzMDYwOUZBOUI3IF4KKzg2RUQxRTQ5RDRDQTg2ODkzNEQ3QzI1NEQzQUUwRDVCRjczMjNDRDcgXgorQTE2NTA3REFCQzNBMENGNzEzNzE1MEM0RTZGODhENUFDOUEwQUEzQyBeCitEREM3NkQ3QkE1NDM1NDExMkMyRDdEMzFFMUE4MEYwMDQ4NTUxRTVFIF4KK0Q5NDNGNjAyODE0NkVFQjAzODZCQjMwODRGRDM1NENFODZBQkNGMDAgXgorNEFCQ0FCNjVDN0RBQTUyQkRCRDEzQkNDOTA5ODY0M0Y1QTE2NTMyOSBeCitENzVGRTIyMTYyQzUzOEJBMUUyNjg3RDY2RTI5MjNDRUM3Mzc1RTAxIF4KKzFBMTFBMkIxMkQ5M0ZCMDMwQjBDMzQ0MUQ3QUFDMDZEQUQ2RkI1MjcgXgorRjhGM0Q0MTRDMjZEMDlDNkNBMUI4OEJFNDRCRTY5QUM4NzlEM0M1QyBeCitEMkQwQkM5ODc5NTc0MDAwMkIyRUI2RUE2QUVDQTU1NTkzNDBCNTRCIF4KK0E4QTM4MzhCQTQ1QUI2QjA1RDFENDY0RTg2ODFBRDYxQjEzNkI2QTUgXgorNUIxNjI5MjMyMDA0MzlEODcwRjU3QUVDNTg0QTY3Q0EyRTg5MzlCOSBeCitBOEZFMEI1NUNGQjE1RDk3N0U4NzExNTI5MDVEOEZEQjE4QUE2QjU5IF4KKzAyRDVENDkyODk2OUM3QTg1MkI1QThBQzc3MkEzRDFFQjQyNEM5QTMgXgorNEVDRTA4REZGMUZERTEyNThCMUJGMDQyM0UxRTMxRDgzQzU3NTU3RiBeCitGNzAxNDMwRUY2Q0I1NEJGMEQxMzhCNTRGQjEzQTFCNTg2QTFDRENDIF4KK0UzMjQyQTcxMTA2Q0I3N0QyNUE2MEQxNjRCRDE3RkUwN0VBQzQ5NTEgXgorRDhCMThERTg2MTMyNjcyRURCMzMwMTkwQkU4OTVFMzEwNkY5MkQyQyBeCis4Q0YwNUZGMTM4N0M2MUE4Q0MzNzI0QkIxMjgzQUFEM0UyRjg1RUVGIF4KKzc5N0IzMTFEQzJCNUQxNEI1Mjc3RTQ5QTM4QTc4N0QzRDZBNThDMkQgXgorNjQ3MkJDNTg4MUE2MkJBOTU2NTFEQkIzREZGOUIzODg1OTQ5QzlCNiBeCis4NkFFRDRCNTNEODYxN0ZDMTM1RDBFMUZDQjc2MjI3MUIyNTQ1QTQ1IF4KK0UzQzg4OEExQzAwMzAxQUE3Q0UyMDNBNTU5MEQ4MkMxQ0U3N0M2RDQgXgorOEEwODFBN0E2NzJGOTE0OTNBQzA5RDk1QjI5RkFCRDA0M0RBODNERCBeCitENDdGODcwMjJEQjRGQUU1NTFGRjNGQTA5RkZGMDJEOTJEMTEyNTI3IF4KK0IyMjcxRTM3N0U5QjE1OEFDQkNBMUVEQUUwRUQ2QkE0QzU5Q0I3MjIgXgorNzFFREUwQzk0ODhBMjFFNjI0NTZEMDZFRTM5M0YzOTA0NzhDM0YzMSBeCis0MzdBMUI3MDkxNzY1OTgwMjBFQkExRTkyMzg2QzM5NzlBMTg5MTVEIF4KK0UzRjRBQzQzODQ4NDgwNzFDOEE5Rjk4NjgzNzZEOTQxREVDMkE5RkIgXgorMDA0NDRDQUY2QTNGNDIxMEZEOTdEQ0I4RjEwRjQzQjI4RDg5MDYwMCBeCis5QjZCQjM1MEUzMENFRTIwOUM3N0EzRTIwQkI2QUNFODY3NTQ2MzEzIF4KKzkzNUQyNjg4QUUyQjE2Qjc5QjUxN0JGQjc5RDQ4Q0U3RTRGMEY0RTkgXgorMTZCMjFGMTlBREU3QjZERUU2NjVENDVBODQ3NDkxQjdGMDU1QzQ2RCBeCis4NTMzOTdDMzU2NUM4MDdBRTcyRURGQTM3RjQxOThFODAxMTAzRkQ0IF4KKzEwOTkyQzJGRkU1MTI3MDA2QkFGQjIxNzIzNTk3MDFBQjEwRkE0QkUgXgorQzgyRDZCQTRCQTYyMUUzNjg3MkFDRUU0QUUzQkRGMzNDMjM4MUIwNyBeCitENzg1MkRCQzhGRjU5MkUwOEExRjFFRTU3QTcwQkVGRjMyN0Q4RUJEIF4KK0NGNjczMDg0MjJGMDcyNDE1RUZCNzVCNDNENUI2N0M3RjUzNjJCMEQgXgorMzBEREYzNUUxRTk5MjQzRjg1MzExQTA5OTREOTFCOEFBNTQzRjcyOSBeCitEQjJGRTM0MEY2MkE4OTQwMEFFNEExNkI2MTQzNTIwNDQwNTM1MEQzIF4KKzc0NDk4MEZBMjZERTUwMzc0M0VFRDI5OEI5NjZFRDVGQTg0NzFERjYgXgorRDJDOEI4MDNEM0REQjU0Q0RFNjQ2NEQxMjZDRTMwMDlBOUYwRkI3MyBeCis4ODU3MDBFQ0MwNEVCOTc5NDNBOUMxMDBFQjZFQzRBQ0ZFNTlERjgxIF4KKzc3MEY5Q0FDNUQ0RTlDODc4QTY2MzZFQjAzMDZFRThEREYwQ0Y5MTUgXgorMDNDM0YwNTUzRDdDRjE2Q0ZFM0QzRjAxQzBBNENFMjZBOTE0NTEyQyBeCis5M0IzMDRCREIxMzhEQjY3OTBERkY4QTg0RkZGM0QzNTA2NzcwQ0RDIF4KK0Q1QzVGQTA0ODhDNUE2RTE0NzcwRjIxNkI1NzU5OTc5NTBBOTQxODQgXgorMkY2OTVCOEVCMThDMjgyNTBEN0M4QjM1QkEwMDAwNDJFQUJEQjI0NSBeCiswMzUzRkZBN0Y3MDg1RDNCNzg4OEY5NkI4NDk4NDg2RUU3REUxNkNEIF4KKzIzOUZFM0FBQzBEMzczOUY1RUVFQzgyQjJCRjZGNUY0N0QwNTg1NDggXgorMTZERTg2ODQzOTVDQ0E4QTVEQkFDNzJFQ0ZBRkE0QkMzREJGQzVENiBeCitBRUIyQkE3NDI3MDhEQkMwNDhCMDFGRDc3QjE1NjBDRDNBMjNFNzA3IF4KK0ZBQUUxNzhCOTcxNzVBN0E2OEU1MUJEN0VFQzA2MjM0NzIzQjY3MEEgXgorQjNGMTMxMTI0N0Q5MjAxMTA5NzI3NzJDM0RDMzBGNzg5RDNGREJBQiBeCis0NjZGNjgyODQyQzA3RDJDNzcwQjQxQjY2QTY2QkU5RjY2NTFDMDQ2IF4KKzM5NzI0QkQyOTEzOEY3NzZFRDIwNjMzQjY2QTNBMjQxRkFDRDgxN0UgXgorNTkzMUYxOUExOTg1Q0Q1RjcxNzFBNUQyQjgxQ0UxQ0IzQkE4RUJCQiBeCisyN0RFNUMzM0ExOERGMUE3MzEwNTFENjY0NERFODkwMEUzMEUyNDJFIF4KK0E0RTFDNEYyMEEzNEMwMzM1ODlFRDA5ODVFODAxNjhBMjhDMjM3N0EgXgorOUJFODIwQjEzNDQ3NUNBMzE1MTNFRTFDNzlEMDZFMjk5RDcwRTAxNyBeCis5OEYzOTZEMTQ3RURGM0QzMDc5QTZCMkRDRERFOTJENDhDOUNDNTJCIF4KK0Q2MTA4OTAxOTA5NDE4Q0Y3RTdBRUNEOUU0RDFDQTEyMUU5OTJFOTAgXgorRjJFOEYwRkYxQzY1MjM1NkU2MDU2NjQ0QjgxRkY4MjcwQTA3RjU2QSBeCitFQTE2NjlFRDUwOTEyMEYyQjQyQ0ZBNTQ3QTNGRDYwMDJGRkI4NjJEIF4KKzIxOUJBQjU1NjUzQjAzQTNDQTc4ODYyMTJERjI3QjIzQzA4MkIyRTAgXgorQkJFOTVGOEJCRUVCNkY5QTAwNjJEMTUxQTcxNTU2MzBGMjAxMEI4OCBeCitGRjZCRkM5MEZFM0VBQjI5OTg5MkE1RDlDQTREMTdERjJDNkM2MDRFIF4KKzhEMEUxREJGQ0M0MTlBRUIxQzc4MjdDNzY0OTMzM0UzNEFDN0UzMEMgXgorRUYzODQ3RjdGRUEwNTRGMEUwODA4MzZEMEYyQkZCNjc2RTM1NzNFRSBeCitGNjBBMTVFNkEyOEE1Q0NDOUM0RUZCMUIzMTA3QTU0QzlBQUVDMjZDIF4KKzc2MzI4Q0RFNUVGRTY5NjFCMkNFRDRFMzQ1N0QyMTkyMjlFMTYxRjcgXgorRkZBRjAzRkI2MzJBMDQyQjgzN0Y4NjYwNDEyQjcyQjEwOTkzOTRCMSBeCisyMTFCQTY2NzVDNTJDQkQ5RTdGNUY1QjM2NkE2NEEyNDY2NTMyQUE3IF4KKzUxRTA1Qjc0ODEzODEzNTg3ODJGREY3M0NCOTU4RTE0MzRDRjMzMzAgXgorQkI1Q0VBRDFGM0I2ODIyN0NCMDMyQjJCOEU1QjYyNzQ2MTA3MTYzNyBeCiszRUJDRjFENzg5OThENEQxMUMwOTRCRjI4RkQ1MjJFQTlGNUExRTM3IF4KKzNFNzE4NkNCMUQzOUM2NENFRkQyOEJEQTJDQ0FBMDczRTcxQTUzMjcgXgorNDE1QjZBMDA4MzM4NjA1NEQzQjc3MDI2QTM4NjU0RDQ1RDNCQTEwNiBeCisyMjk3MzcyMjU2NDc5RTMxRTEzOUFBMTZFNjNDMjdDMjA3NTE5QzBDIF4KKzY1QTc5RkM0QjMyMkY2NTVBRENGNjM0MzJEMjk1MzQ5RkRDQTlFN0IgXgorMkQxMTMwRUU2RTQxNTYxNTFDNjM3QjQ2NTI3RkFDNTREOUU3OURGNyBeCis4MEUxOERFN0M3OThGMDQwQzAwOEIzQkZFMzA1NDI2MTc0MEUxNDQ0IF4KKzA3MTBBM0EzMDAyOTBDQzFDM0JBQjU2Q0YwMEE2ODJDMUI3MTFCQjcgXgorQzZCRTVFMzM3QTFBOTc2QzI1M0NCRjM1NjY4N0YzNTk1NDhCNkEzRSBeCiszRDZFNEU1MTQyNzcyMjNCQURFNkEzMTdDNDc4RjE3RUE2RUJDOURDIF4KKzI1QzY2QzkwNEMzNUVCQUQyNjEzQTMwQjczMjgzRTBGQzIzQ0NDMTAgXgorMTI1NzA5RkRGRDUxMTE4MEIwOERCNzczNjZEQzdFNUEyQjQ2RjBDQiBeCitBRkI1QzUzQkIyNzI4MjZEQjdBMUMwMzBCODlDN0YzQUU5NTZGNjVBIF4KK0QxNjZFNzFEODE0MkUyNkU1OEUwRjdBNjlDNTBDRjE5Q0ZFMjI1RkMgXgorNDI2MDA3MjM1RDhGMDZGRENGRjIwQ0U3RkQwMEU5OTRGMkZDNDIyQyBeCis4Q0EyNzMwMTYzRUE4MTZCRjlCNjNDQzY1M0I0NDNBOEU4QkQ3NjU2IF4KK0JCMkRBNjIzQjVGRDEwMDMyQkFGQTFBMkY5RkIxRTEzRjc0QUM0RUIgXgorODIyMzhFQzNDOTBCQUYzMjI3ODg1QkU3ODUzNEExQjA4MjEzNjYwQyBeCis2NEJBMjc1RUU5NDIyMzU2RUFDMTlBNDZBNEM1QzlCREI0RDYzQzA1IF4KKzQ5OTUzMjNCODVGRDM4Nzk2MzFCNDM5QkY0RjhEN0QzOTYzOUE3RkEgXgorNDFGOTVCNTEyOTkxQTRFMDVCMjE5NDc5ODQyMjg1OTAwREY4NDI1RSBeCiszQ0VCRTkyOUFDNzYzRjJGRDg1RjIxMzU0QzkxNThFNTE2OUE4NDRFIF4KK0JBRDVENTNENjdDQkNENzc2N0I2MDA5NTQ2QTkxRDU5MTg4REU5OUQgXgorRTlDMjkwOUY2RjBBMzA3OTg5MDE5M0M4NzcyRTc0NUEzMTdDNDhCMCBeCitCQjk3RTMxRTlCOEVBQThDRTc1OERENzc1RDgzMjZGOTQ3MjBFMTk4IF4KKzEwOTQ3MUExQzNBNDI3QzY1QzRCQkFGOEM3ODVEQjk5Qzc0OEU1RkEgXgorNzUxRDlDQzY0RjAwMTc2RTQyNEExRjMzMUM2M0VBRjI5MTBBNzVDQiBeCisyN0VDMzk1QjA3RkM3NDA1Njk2MTI3NDFFNUNGMTNBOUE2MDQ4MDEwIF4KK0Y2NzRCRDg3NTU2RkQwRjcxRDlCRjIzQTBFQ0NFOUYzOUFDODIwOTkgXgorOTNCMkY5MTA5QTI1QzUxMTg2NUQxNUUxNjgzQzA2ODM1NTVGRkMwMSBeCis8RAorCitIPlNIUyBUeXBlIDIgSGFzaGVzPEgKK0Q+CitFRkEzRUM4OTc5N0VFM0YxQTVCRTRCOEQzNDc0NzEzNkNBN0RGQjk5IF4KK0QxNDZENDY3RTMyMUU0RUE0QzczRTg0MjQwMjlCRUE0NjFGM0Q5MEIgXgorMjVBQ0QzMkRFRDMzNEFEMjBERENDRjAxMDU5QjZCOEI4NjRFOEQ3QSBeCisyNTQxNkQ2OTY2NTAwN0MzRUREMjQxNjFGM0RGMEY2QUNCRDBFODU5IF4KKzU0MkEyOUU1QzA0QTVCNzlBRDA5ODZGQUQ0OUJFNzQxRjA5OTQyQjkgXgorNUIxOTdFMTAxMTI4NkU1QzEzMEY5Mzc5ODQzREU4OTc3NkMzN0M1OSBeCis0NjcyNzdFQjg4ODdFREUwRjIzNjlDNkU3RDEyMjgxRUUzQjUxODU3IF4KK0JDMTYxMDIwNEUxNUEzN0Q1MzNCNzQ0MTI2ODM3Njc4OThCMzVERkYgXgorM0RDN0M0NzI2QjNFRjc1QUI4OTE5MzcwMUM5OTBGODZBQTZERTgwRiBeCis0QUQ0MzQ4RTUwMjI2ODVDNzBBMkI5ODA2Njk4NjY0QzI4MUU3MTIzIF4KK0EzM0U0OTk2QkQ5OTgwRUQ1MDVGOEFBQUYwRjZENjRFOTdEN0U2MTkgXgorMDYyODBBQ0MyRDBEQTE1RUFEN0M5NjMyNTMzNDlDODZBNkMzQzZDNCBeCiszM0JFMjk3NzlGNDJFRTUwNEEzQ0RBRTA0MjJGN0I5QzVDQzk5NERFIF4KKzQxMjk0MTI3MkM1Q0UzNDRBQzE0NEI2OUQ0QkE1RjYxRjE0NzRGNEUgXgorQzMzRUNBQzFGQTc0RDU0Njg1NjY5RjhCOUY4NTkxODQ3MUE4OEQ2MCBeCitDNDgyNzJFNDJGOTIxQTI3NDlENjA0MTg5NjVEOEE3Q0IxQzdCRjBEIF4KKzQ0QUJFRUFEMkMyNzgwOTgwNjJEOTM0NDYwRTU2NUVEM0M2NDY4ODAgXgorMDhERjE4NTAwNzgxNkUzRUYwMUQ2MjI2QzcyQjAzMjU2NDc4RjIzRiBeCisyODlFODlGOEYxNURENzA5NzAxQUEyMkIxMkM2OUU4RjkwQzkzRjFEIF4KKzVCOTNDQUIzNjlDOTlCODVFRUUzMTMwRjgzM0I3QkIwNkQ0RkMwNDEgXgorN0IyODcyQzU4RkIzNDBDOUExRDA2OEI2MThFNDk4MEIwNEZERkYyRCBeCis2Mjc4MzQyMUNGNThFQTY2MzY2QUREQ0JGQTk2OTY4RkIxMzY5OTE4IF4KK0M4QkQ3MzJEMDE4MTA1MTY5ODE2MEIyRkJDMjAyNTQ3NjI5N0M5NkIgXgorMDM4RDU4N0NDMDY5QzlCODlEQkMyRkU5RDg2QTk4QzAzMUQzNDBCOSBeCiszMDU5MDMxQTY4NTg1REE4RjA5Qjg3QjBCRTM0MTM5ODdFQjM5MEJGIF4KKzFCNzRBNEE5NTcxMzA4MzYwOUIyN0U2NzE0MDcwOEVEQTE1RjgwQjEgXgorNkVBQ0VBNjk5MjJDN0FDRTM4RTA1NjBBOTFEQTQ1OUMwQ0M4OUI1NSBeCis2MEUyMUY1Mjk5RUM3MTlEMjgzMkE4MjI2OEIyNEFGNkIyODE1REVCIF4KKzNEN0Q1MTc4MkE1MzJGNEY0MTBBQTJBQjNEQzkxNzhDMjFBNTVGMEEgXgorQjI0MjNEOTYwMDhGQjgwMEU1RTM1RTE5REE2QkVBMjc0ODc1ODVFMCBeCis1MDM4RkU5QUVBQzgyOTY2QTRFRTVDQzY5QUNDOEFDQ0Y1NUU2M0RDIF4KKzkwQkYwQTkwRjg4RjVGMURBNTFFNDQ5NEUyRDVENEM2MjUwRDJENEIgXgorRjg1ODQzNEUwQTVGRDYxQTIyMENDNzkyMzgwODAxRDE5RTBEOUY3NyBeCitDMzFFMEJCNDVGRjFEQzBERTQ0Qzc3QzUzQzU5QjE1QzNCREU5RUI0IF4KK0RGNTYyOENGNjQ0NUM0MDlCNTFGNDZBODY0ODhBOTVERDM0QTNEQTUgXgorNzQ0Q0RDQzlBNTFCMUFEMTRGQUZENjczRDQxMDQ0MzNCN0EyNDczOSBeCitDRUE1RTdCOTE3NzNERkUxMzY0OUFDQTc4OTA3NzY5QjVCRUJDQTFGIF4KK0RDMjNFQzFBMDRGNzQxN0Q5NzA0Qjg0NEU5RjM5RjM5RUFBQkU2RDggXgorRDM5RERFOTcyOTdCN0QxQzlGRkQ2QjY3MzMzNDlEMEI4RTgwMjY4OCBeCis2NTIxOUU3OUY1QTNDNjFGQzA3NTY2MDI1OEE5QzVGMTNBMTU5MjcxIF4KK0QyQTg2MTY0RDEzNjZCNjBGMTQ2NjUxNDY0NzYxQjAxMzUzRjkwMjggXgorOEUzRDFFNEUwNDM4RUFCQzU4QUI5NjdCMUNERERBRTNDREQ5QjA3OCBeCitFRTlCRUVDNzNEMEU3NjBDRkQwNUNGNjIzODJBNDYxQzdERTNDRTJBIF4KKzVDNEZERDYwNDc1MTU5NkJFNTQxOUQ0QUMyNTZDM0Q5ODIwMTIxNDkgXgorNDNFQ0QwREU4M0YwODc4MTVDRjI1Nzk4MjkxNDYxMUU0QkZGNjk4QyBeCisxQTFCQ0E0MUJBMTI3REY0MjY0RDM3OTVFMkVCQ0VEQ0QxQkQ4RUM3IF4KK0ZGODJCQzY5MDQ1MjBFMTg2ODAzRkZFODYxRENFN0U1NjZENzVGMDMgXgorNzY0NTQ2RkZBMDE0REY4Mjc4OTc0QkU2NkQwMTQ4NTI1MUI4QjBDRiBeCitBMDZCQzk3REFDQjA3RUYyMDc4MDg2ODQ5Nzg4NDFDNDI1QUUxMjM4IF4KKzZDN0U2RTBFODlGMkEwNzBFREYzQzQzMzMzNTM4Njk5NDJGM0Q4ODMgXgorNTcyNDM3QjJCMzVDNUJBMDBFQkM3NDUyMUIxMkQyMEU2RjE0QUNCQyBeCiswODcwMzE4NkU3NEE5Mzk3Q0VCQjFCMjAzNEE2NzcwOTk1QUYzRDBGIF4KK0U0RjkwNTUzNTZBQUJBOTMzRUVGMEMwQjA3QjZGQ0U5MDM2MUQyMDggXgorMjAyMDIwM0VGRDRDNUZGQTAyRTU5M0I3QTY1ODAyNEIzM0ZCMzY4RSBeCisyQkIyRjMyRDY0QURBNTZBM0U1M0E2RDc1MEEwNUY4RDJCNUQ3QTdEIF4KK0M3MTlBRUU0NzA4RTdBMjQyNDQwQzk0MjlCNzIzNkRGREVDMDJCNEIgXgorOTI0QTI2QjQ2NjQ5Mjg3MTk3RTE0MkNCNDI1MDZDOTZFMzA5RUIyNiBeCiswNDYzRjk0QjU0NTJBMkQ4QkEzQTBEQkZFOUM0OTBBMzcxQzE5OTc1IF4KKzlGQjJGRTUzOTMyMzhFQUFGNTgwMzRCQzkzNEIxOTA3ODRBMTBERDMgXgorQUQ0QTY5NjJBNkE1OUNBMzI3ODlBQzNCQkEzNjg1ODNCOTEyMkFGNCBeCisyQTg5NDU5NjU3RjlFMjY4NUQ3OTRFN0FFQUYzMEEwNUIwNkFBNTczIF4KKzlCNjVDQjkxRDBBMjQ3NzNBQzg2NzVGRTk4NjJFMjhBN0I4NDk1NEYgXgorOUNCN0NBREVERDM5MUEzNjg5QjA0NDI3QjQ2MUM0MTEzNzE3QjZDOCBeCitGMUI5MjJEN0VDMjQwRkM5OTY5MkVDMjhDMUE2Q0M3RDkwN0IxMDE4IF4KK0RFMzAxQTE0MTNDMzZBNUNCODkxRkJDRDlDRjkyNThERjRFRjE0QTQgXgorQjMzMDczOEQyQUQ1MzQ0OEMyODdCRUVGRTVDNTU4M0YyQjgxN0EwMyBeCitCODBFQkUwMTA0QTI1ODQwQ0FFRjZBRDc0QzQ2NzZENTI0NTcxQTI5IF4KKzNCNUNEMDE2NjFBMjc5QkE3MkRGQzEyNzJFNjgzNTczQjRGMTZEQ0QgXgorMTQxMkQ2QTJEQkJDOUQwMDY0MUE3MTE2NEE2OTBDNjQwODUyQjU2RSBeCiswRUY1MTQ0MjlDQUM5NUNEQ0JFOEEyRTYwQzJBQThCODkyQUM1QjMzIF4KKzVGMzJDRkYzQjA3RDQ3RUMxM0VCNTRFN0MzOUU0RjUyMTZGREJEQzUgXgorQjkzMTk2NjE2OUQxNzFERThGOTQ4OEU4QjVFMDk2MDEyNEJDNzQ1MSBeCitFNTAzNEQzQTVBNTczNDQyNzgxRUYwQzZFRUE3QkQzOUZBRDBCOTRBIF4KK0Y5N0NBQzUwMTMxMzU5NDRGREY4QkRDRjAyQjRDQzYxMjQxQkVBNkEgXgorRkY3NEM5M0NGMzI1MDZCNEUxN0EwQjU5NkFCNTY0OTg5RjIwRjFENCBeCis1Q0E0MkUzM0JDRTQzMDFCOEZCQ0U1NkJGQkRCNDNFRjc5RTk1NkQ4IF4KKzg3RjVEOTgxRURGQTAxQTJFOTg4NUJENTJDQzRFNjQ5QTIzMzA2MjEgXgorNjNGNDM4NDRFQ0RERjMzODIwM0RGQjExNkZBNzlDQkFGNEU1QzkyQiBeCis5MkM1RTJBNUQzODBEMkJCNUUxOUU5RTY1REM5QTc3RjRCOEIyNUY0IF4KK0UzRDc4NTAxOTY5QUNERDc4QTcxMDQyRTdCMEJEMEMxNDg4MkU0MDIgXgorNEUxRkQ2RjVDRkUyOUEwRTMzMjQ4RjJFMkVGQjc0RTdFMEE5OTc2NSBeCis1RkY1REFEQzkzQjJFNDUyQTYwNjc3QzhDRDBDQkFGN0JENDg5NUU0IF4KK0NBNDkwRkFBMkQ2NzIzRjlGNjgyRDVDOTY1ODY0NjBEMEM4QjIwMTAgXgorOTRGMDk5QzJGRjdEQjY5NEZEMkRDRjVBOUE2QjA2ODU1QjJBOTk0OCBeCitDRjNCMUUwREE3QkU4NzE4MEJGMTg0N0RFQkVDNzA2Nzg4QzUzQjhCIF4KK0Y4NTMwNUM0QkYxNDlCOTIwNjhEMzYzRUYxOUI5MTREQjkwNjE4REEgXgorQjRCQUZDQTMxNzZCODBFOTgwMEUzMTlGQjNCQjc0RTVENjVCRUI2NCBeCiszOENDRjUxOTE1QTM4NTU5QTk2RTZGMzI1ODE0OEQ1RTYzMjMwOTg0IF4KKzZGRjQzQjBEMjVDNzE3MUZGMTc4REVBQjEzRDdGNDg4RDIxQzQyMTYgXgorM0U0QTAzNDE1MkQ4NkU0NTY4QTIxOTdBNTMyOEU4RTk3MzYzMjg3RSBeCitGMjMxRDRDM0FCQkUwRkRGNzdDNzFFQjJDMjhFNTBBQ0Q5NTg0NTM3IF4KKzIzRTFBNEY3M0YyODgyMzM4NDdFNjQ3Q0Y4NjIzMjg5RjFGODlFNTUgXgorNzI2REFFQUU3MjRFNzkyMzI2MTFDQkIyMTZCNzcyMjU5NEU4MTRGQiBeCiswRTVGRTUxMkIwQUY1MkI0MTgzMTE5NTA4Q0IwMUFGNTMzOEM2M0UzIF4KKzRBNUQzRTEyRUIyOUIyMjQyMDJDMEIzMTlCMDg2NTM1RTk5RjVFMzIgXgorMzYzNTc0QTkxMDgzMEVEQ0ZEQUVEMTA1NTk3NUYwNjEzRDFCNUM5NSBeCis0ODIwQkU2Qzc0QUQzNEQ4QTQzQTVERDAxMzBDQkRFM0Y4OTBDNTNCIF4KK0ZFQjZFNUJGN0E2NkVEOUI4MzhBMTAzMDVGODUwMDUyRERGOTIwN0UgXgorRDUwQjMzMUFENjkyNTU0NTI2NEI2NjE0QzNCNEMzOTM3NUFCMUY2NSBeCiszNkIxQkYzOUJGNEFFRjA1RkIwNTRCRDAyRkFEOTA2MkQyMzM3MjM5IF4KKzxECisKK0g+U0hTIFR5cGUgMyBIYXNoZXM8SAorRD4KKzlCMzBDQUZERDdGNUU1MjUyMjFFQzAzNkQ1NUE5QzhENzgyOTREQkQgXgorOUJDQTMzQjNEQUQyMjAxRDBGMTk4MUNDRDBBRjQ4NzRFMTYyQTZEQiBeCis4QjA2Njk3RTRBNzVEQTVGMDIwQ0VCODYwQTI5MDQwQjNERjZFRjIxIF4KK0YwRDQ4NDAxQUUyMjQ5OEUyODFDREFBRjA0NUZGRUJBQTg3QTk3NzYgXgorNjI0N0RGNjJERjVENDg1N0E3OTU5OTYwMzlCNUE2MjcxRjdBMjAzMSBeCitEOTg0MzNDMzM3MkYxNDA1RkNDMjQ3NTk1OUI5RjM1REYyN0QzMkU5IF4KK0M0RDE0QjI4NzNCMEJERjAxQ0E3QzE2MjhFRTAxRDYxNjgyQ0YxQzggXgorQzAyN0E5QzAxMEY4RUJFODlGQzg4QzFDOUZCNjhEQUIwOUEwQ0ZDRCBeCis0RDhEMTlGMzVGQUVDREVCMDE1RTExNjEzMEEwQTRDODM2QTQyQTZBIF4KKzkyOEUyRTk1RDNGMDlEOEVFNjNDQjhGMTAyOTZFRTZFRjc0NTVGRkYgXgorNTVGM0U3NzBEQ0EyOENGQjcxMUQwNTkxNzRDQzdBOUVDMkIyREQ3QiBeCis0NTAwOTg3MDg2RkQ4QzI3NTMzMEUwRjI3RThBM0VEODU5NkQwMUFBIF4KKzYwQkM1N0QxNkY1MEUyQUREMTcyNEUwQzdEREQ1RTQ3RERGOEUzMDAgXgorNTlEMTc0MjcyQUU2MDJBQzA5MkVFN0VGMzkzQUMxOUI4N0I4RTg2NSBeCis4QzI1NjE0RTZFNEQ4MjVENkFFREQ5M0E2MkQxQTA0NTg1ODNFRTg0IF4KKzY5NTM5MEQxRTU3QkNDNENERDQ0Mjg3OUYwOTc4QkQ4MjMzMjJFNUMgXgorNkYzNTNFRTZCNUY0QjgyNzJFNEEwRDNENEJCQ0M4M0IxQjk0MjUxNiBeCis0QjNGNjcxODc0MjIwRENDRjQ5QjU4MDE4OUU2QjEzRkZGMEY1MzFEIF4KK0JDNkM0NzNCNDgyNEQ4RTJGQTA0RERBODZBNTg2NUQ0QTM2RThFOTEgXgorMUJGRUMyNjlGRDE4RDI1REM1QzU2QUNEODM4MTAwMjI3NzVGM0VDOCBeCiszRTk5MjFFMkY2ODU0MTNDMEFFQTY0ODAxOTQ1QjQ4Q0I3NkUxOTVFIF4KK0VFQzcyMjFGQkFDNUYyN0I1NkNGNjhDMzk2QjdFQkJDQUEzQzBCMDUgXgorRjg2REREMkE4MjI5NTMyQzNGMTgzRUE5OTAzQUQyMjhBMjUyMTU5MyBeCitGQTE3QjVERjMzRTQzMjZCQ0RDQjI3RjFDRThCODNCRThCOEVGODkwIF4KK0E0QUZDMEI0MUQzMENFNzk2QzJCNEIwNkUzNjhBNUQzOTA3MzU4ODkgXgorNzQ1QUYxMkI0RUY5ODVFNEQyRjg0OEQ3QzdBREI2QjMyNDA0QjZFNiBeCis1Q0U0QjY1NzQwOTAzM0JGNjdEQjdCMENBNDgwRUMyQUNDQTgwMUVDIF4KKzBCNUFBQkM5RDNBOEU4NjExMDNENkI1QjlCOTk0RjlDNzQzQkYwNTggXgorODZBMTE5ODk4M0E3MzI5OEJGNEVCNDFBNjFFQUFDM0U0QjA2QjQwOCBeCis0NjBBMTA3QTZBRjMyOUIzMzBERTk0MjVCMzA3Nzc1NTU1M0FEMzcwIF4KKzYyQzgxRDA2QUZFOEM4RjNFNjQyQUQ0MjM3NEZGRTQ4NkRFODZGMkYgXgorRkMxRUVDQTMyRjdFNDM0QkJDNzRGNDM2MDgwOEVEQjE0MTA4N0JEQyBeCitCRjQ5NEI0RThEMzMxMUYxNjdCMUVBQUU1OEEzMzQzNjgzRjMzN0VFIF4KKzk2MTI0N0QwMUUxQzRDQzBENzEzMDc2MzdDRDU1OUQ1MzA1MjFGRDUgXgorQjM0Rjg0NjQxMUJFNjFFMTUzNjE5MjJFMEUyQUY4M0YzRjAzQjI5MSBeCitDRDg0NUIyNDBGQzI1NTFEQ0IyQ0U0ODc2NDY2NDhDRjI0OUFFOEYwIF4KKzVDMTI0QjYxNUZBQzU0OERBQTM1QUQwMjg3RTAzMkVDNzdEMjIwQkQgXgorM0M3NDc3MUQ4MzhDQ0Y3RkFFMkRBQjEwMENFQTdCNDZCRTJGRkYzRiBeCis2Mjg2MERCOEMwQzg5N0M3MzY5QTFBQjYxNzQ3QjA0QzBBRTlGOEE2IF4KK0M5ODQwMENERDdGRTcxQzdCMzU0ODhDMTZEMzM5NUMwNDMwMEVERkEgXgorOTUxNjdFMkJCRkMwMzQ5QzBEQjdDQjdCRDIwMzBCQzMwRjlGMjg2QSBeCis5RjgzNURCQjI3MDc2QjVGMEQ4ODgwNjAzRjQxN0NFODNBMEQyMjQyIF4KKzA4NDQyQjcxNUM4NEI3QThCMkM3RkZCNDYwMTBBRTU2QTBDOEMwNUQgXgorQjcxMzJEQkE1MjJDNTRGNDI5MDNDQUVCNzA1MTY3NDg1QUFEMzBCMCBeCis5RTk5RjAzRUQwODM3NEVGQTRGOUEyNjU1MUE5MDlGNDBCRUU1MDNDIF4KKzk5OTk3N0U2QUZGQUUwNDUxRTkzRTdGNzdDN0QxNzdERTEyMTQwMkMgXgorMzBFMEJCN0YyMTQzM0EzNDhFM0I0NDZGMDhEODBDRUFBRTA2REI3MSBeCitCM0E0MUVFREYwMTdEQTdCMjBGQkQ5MTExQkE2RTJFNTk4NDJDRUQyIF4KKzVCOUNBMzMxQkQwM0Q5N0U4RDA1N0RGRDM1QzlFNjAwRjkwQzU3REMgXgorNTMzOEEyNUIzMUNDOUM2NDU1MkI2RjY3NDJGOUZFQkRDMTNEOTczMyBeCisxQjNBNTVCRjZGRDc0OEIzQjY1MEVBNUJFODM5QjYxNTMwQzg3MUMwIF4KKzE1MDNGMjE1MjNDRThCQzVBMTlFNkE3RjVDQjBFQzM0QTdFOUY3NUMgXgorN0Y2QTE2QjMwMzc3RDNEMDAxNEIwQjBCNEM4NjM5MTYwQzcyMUREQiBeCis4RjYyMUY4Q0ZCNkFGMjE2NzQ2RDhCOTlDOTEzMjY3REIxNEFEQjA4IF4KKzQyRTkxNzdDNDg3QjRCNzExQTQ0NTFDMzYwQkQ3RTJDNkRBNzM0NDYgXgorNUIyNDk3Q0E2RUMyNDI2QjEyNjUzRDcxMUU2QkZEQkVFRkQ0QTM4OSBeCiszMEY0NjkwRkQ0RjA5QUM4RTI5QjkyNkY2NEM2NzM1MzlEN0ZCNjVEIF4KK0NFMTJEMUFBNDk2MTI0NUU2MDYwOTdCNjcyRUMzRTE2MTAzRDBEMTYgXgorOUJFNUQ2OTNCQzBDQzU2QjM0QjhEREI5MkZBQ0VDMkY4RjRCNjM4QSBeCitEMjA0MDAwNUFFMjMwRUZEQUU5NTk0MjM3MjYwNzU3N0VGQTVEQkMyIF4KKzhBOTIwRjk0MDdDNzRGQTM3RDlDOTNDMzYwNkI5OTZEQjk0NTg0MUQgXgorRjI2OTE1QzA4REMxRDNEMzFEOUNBNzNGMThGMDREQkI1N0U4QTY3MiBeCitFNDQ5MzgxQzgxNDg4MzdCOUU0NDI1MUIxNzgyNTUzMEQ4NzU0Qzk0IF4KK0JEODQwMkIyMTUyMEU0MEUzMUQxRUFGRDlDOTlBOUU0MDlDM0E3N0QgXgorNjI0Q0NFNTM4QTc4Q0YwRkY3ODhCOUJFNDMzQTAwOEZBNzc3OTI4MCBeCitCNzk2QjUyMUI5MEQ1NTM5NkU4RUMwMkFEOUI2OUI3RTkxMDkzRTRDIF4KKzVDNEQ1ODRGOTdDMUQ4RkFGODEwQ0VGM0E0Q0EwOTE1RkIwQjYzMEEgXgorQTE3OUZFQUYzNDFCQTk3QjFEMDI3ODgyMkFDQ0FFNUZDRjhGNEFERSBeCis2OTNEQ0Y4NTkxOUUwNkE1NDIzRjkyNzgwRTc5QzJDMEM0NTI4RDY3IF4KK0RCOTRCRUFERkVBMzY4MjA1MUQ2MjI1MTlBRjlGODdCQUIyOEM1RjkgXgorMkUyMEQxOTI1RkJENDYwRTdBNUU2QjQ4QTkyOTY0QTdERENCODc0RiBeCis4NjY1MUZENzE4NjJDRjcyRjAxRjA5OUY2OENDMTY0REVGMEU5NjI1IF4KK0Q1OTQ4QkRDQTkxRDY3MDcwMTVDNzlCQkMyQkM3NEMxQjYwNTczRjUgXgorODg3MEI4QTY4ODRGRjU0RTBFNDAwNDQxRkIyRUM3NEYyNDUyRjM5QyBeCis3REYxQzNDMDUyRTgzOTZEMjUxRTlENTIyQzQyMjczNDRERjkyQzExIF4KKzU5QTI5MEEwQkQ0MUI5NzNERUUzNTk0N0NCMjQwMDA2REJDRUM1ODIgXgorREQwRURCM0FBNjBDREVCQjg1REMwMTI1OEI5RjQ5RjNBNUU4MzU4OSBeCitGQzY3OTRFNEI0RjI3MzU3NzNBMTk1RjlCQjIwMjJDNzBBQTRDNzU0IF4KKzhCQkM0MEEwMkQ4N0E4Q0YxNEQ2Q0JBMEEyQzk4NTdEOTNFRkRFRkEgXgorRDI4RkY2RTIzNjYwOTcxMzVFRTU2NUYxMDI2M0U4Nzk4MTQwQzVEQyBeCisyRTQyODlFQkUwMkU3NUU1M0I1MkQ2NzI0Q0RDMTZCODlFQ0YzREM2IF4KK0YyRTcxNjgzMUNDMENCNUNCMkE2MjMxOTdEMTRDMkM5RkMyNUE5MTQgXgorNDdCOTI2QTEzRDY1Mzc3QThFMkFGMjdBODRFMTc1QkU5MzczOUUzOCBeCitEMzY4QjhBQ0M1MDM1M0VDODA3MDkzNkM3MzI0MkEyQkY2Q0VDM0FBIF4KKzg1NTYwMjVCRUQ2OTVCOTc1Q0I5MjREREZCMzcyRjY4OTlBN0IwOUQgXgorOUI0RUQ4OUU2M0QxN0I3MjEwQTNGQzFCQkYwRkRBNjA3Njk0RjVEOSBeCiswRDIyMjFGNUNEQTE4NEVDN0Y2Q0NBMjlBNzVGNTAyRkNBMjU2NzNBIF4KKzNDMTUyQ0NCODExREQ5QkMxNjUyOUIyM0RGQTE3NTdENzQ0RkU2NzYgXgorNDhEMTgwOENENjJGODY4RkI2RjQ1NTYwMTM3Q0ZCMURGRDg1NjI2NiBeCis4QTNGQTQyQTk4NEM5NUNBNzVENkFFNTEzOTFBQUFDMDY4OEMyQUJEIF4KK0FCNTcwRDkxRTlCNkYzRjExODhEQzg2MzlBM0IxNDQ4MzdFRjFFRDggXgorNjczRjYyQTdEMjA1RDVDOTBCNzQ1NEU4MUE1RURBOUE2MDY1MEQ5MSBeCitEMDA1NzVFNDVGQTMyNEZBMDUxNDIzNTlCQzNBMDdDODAzODM2RUU0IF4KK0I5MDhCRTQ0QTJBNjZGNzM3MERDQzAyMjM3OEE5QzJGOUJBNzBCMzggXgorMUVGNzkwMjlGODhFN0EwOTFENkYyRkEyRjQ0QTk2ODI5QzEyMEM2MiBeCis0OTFDQjJFRTA5OTRFRTZBNEZBQzU5QzRCOUZCQzlDRjgxODNERThDIF4KK0NFQUFDNEUyMTFFN0RERENFMzkzMUM0N0FDQTNENjI2QjYyRTUwNTQgXgorQkUyMDQxQ0I1NUE0ODgyQTgzMzVBNDZCNzQ0RUNCODYxMTMzNkY1RCBeCitFNEMwQkM2ODU3QUZGRTBDMkI3N0IzOEZDMDE4MjlCNDQyNDdCNkNDIF4KKzEyMkE2QUYxMURFQjZDM0I5N0U2QURGNUUwNzdCNUQ2MzYzODg3RTMgXgorPEQKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3NoYS0xL2JpdC1tZXNzYWdlcy5zaGExIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3NoYS0xL2JpdC1tZXNzYWdlcy5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzZiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvc2hhLTEvYml0LW1lc3NhZ2VzLnNoYTEKQEAgLTAsMCArMSw0MDA5IEBACisjICBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciAiU0hBLTEgVGVzdCIKKyMgIFNIQSB0ZXN0cyBhcmUgY29uZmlndXJlZCBmb3IgQklUIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIFN0cmluZ3M8SAorRD4KKzAgMSBeCisxIDEgMSBeCisyIDEgMSAxIF4KKzMgMCAxIDEgMSBeCisyIDAgMiAyIF4KKzQgMSAxIDEgMiAxIF4KKzMgMCAyIDIgMiBeCis0IDEgMSAyIDIgMiBeCis1IDEgMiAyIDEgMSAyIF4KKzUgMCAyIDIgMSAxIDMgXgorNCAwIDMgMyAzIDEgXgorNSAwIDIgMiAzIDIgMiBeCis1IDEgMiAzIDMgMSAzIF4KKzUgMCAzIDMgMyAyIDIgXgorNiAwIDIgMyAxIDIgMyAzIF4KKzcgMSAzIDMgMyAxIDEgMSAzIF4KKzcgMCAyIDMgMSAyIDMgMiAzIF4KKzYgMSAyIDQgMyAzIDMgMiBeCis3IDAgMiA0IDMgMyAxIDEgNCBeCis4IDAgMiAzIDEgMSAyIDIgNCA0IF4KKzcgMCAyIDQgMiAzIDEgNCA0IF4KKzkgMCA0IDEgMiAxIDEgMiA0IDQgMiBeCis4IDEgNCA0IDEgMSA0IDIgMiA0IF4KKzcgMCAzIDMgNCAzIDQgNCAyIF4KKzExIDAgMSAzIDEgMSAyIDEgMiA0IDQgNCAxIF4KKzYgMCA0IDMgNCA1IDUgNCBeCis3IDEgMiA1IDIgNCA1IDQgNCBeCisxMiAxIDEgMiAzIDMgMSAxIDEgNCAyIDEgNSAzIF4KKzExIDAgMiAzIDMgMyAxIDIgMiA0IDEgNSAyIF4KKzggMSAzIDMgNSA1IDIgNSAyIDQgXgorOSAxIDUgNCA1IDEgMiAxIDUgMyA0IF4KKzkgMSA1IDEgNSAyIDMgNCA0IDQgMyBeCisxMiAxIDEgMiA1IDEgMSA1IDUgMSA0IDEgNSAxIF4KKzEyIDEgNSAzIDIgMSAzIDIgMiAyIDEgNCA1IDMgXgorMTAgMCA1IDEgNCA1IDUgNCAxIDEgMyA1IF4KKzEyIDEgMSA1IDIgMyAxIDUgMSAzIDMgNSAxIDUgXgorMTIgMCAxIDEgMiAzIDIgNSAxIDMgMyA2IDQgNSBeCisxMSAxIDMgMSA1IDEgMyA0IDMgMSA1IDUgNiBeCis4IDEgNCA2IDQgNSA0IDQgNSA2IF4KKzEwIDEgNiA1IDQgMyAzIDMgMiA2IDIgNSBeCisxMCAxIDIgMyA0IDQgNSA1IDIgNSA2IDQgXgorMTMgMSAzIDEgMyAxIDQgMSA2IDYgNSAxIDIgNiAyIF4KKzEwIDEgNCAzIDMgNiA2IDYgMyAyIDYgMyBeCisxMyAwIDMgNSAzIDEgNCAxIDQgMyA1IDMgNCAxIDYgXgorMTAgMCAyIDUgNSAyIDYgNiA1IDIgNiA1IF4KKzEyIDEgMiAyIDUgMyA2IDYgNCAzIDIgNCAzIDUgXgorMTMgMSAyIDYgMyA2IDUgMiAzIDIgMSAyIDMgNSA2IF4KKzEzIDEgMyA1IDYgMiAxIDEgNiAyIDQgNSA0IDUgMyBeCisxNiAxIDIgMSA0IDMgMiAzIDIgNSAzIDQgMSA0IDEgNSAzIDUgXgorMTEgMSAzIDEgMyA2IDcgNyA0IDEgNiA1IDYgXgorMTIgMCAyIDUgMiA3IDUgNSA0IDIgMiA2IDcgMyBeCisxMyAxIDYgNCA0IDEgNCAyIDUgMiA0IDIgNyA0IDYgXgorMTIgMSAzIDQgNyA2IDcgMSA0IDQgMyAyIDUgNiBeCisxNiAwIDMgMiA0IDUgNiAxIDEgMSA1IDMgNCAxIDQgNCA1IDQgXgorMTQgMSA1IDEgMyA3IDYgMyAxIDMgNyAzIDEgNSA3IDIgXgorMTQgMCAxIDUgMyAyIDcgMSA1IDUgNCA2IDUgMyA2IDIgXgorMTQgMCA0IDcgNiA2IDIgMyA1IDEgMSAzIDYgMiAzIDcgXgorMTMgMSA2IDQgNiAzIDcgNSAxIDQgNSAxIDcgNCA0IF4KKzEzIDAgNyA1IDMgMSA0IDcgNCAyIDIgNyA1IDQgNyBeCisxNSAxIDcgMyA2IDEgMSAyIDcgNSAxIDUgNCA2IDEgNiA0IF4KKzE2IDAgMiA1IDMgMiA3IDIgMyA1IDIgMSAzIDMgMyA3IDUgNyBeCisxOCAxIDMgNyAyIDQgMSA3IDMgNCAxIDUgMSA1IDEgMSA2IDEgMiA3IF4KKzE3IDAgMiAxIDcgMyA3IDEgMiAxIDQgMyA2IDYgNiAyIDIgNSA0IF4KKzIyIDEgMiAyIDEgMSAyIDYgMiA0IDEgMSAzIDUgMiAzIDQgNSA2IDEgMSAyIDYgMyBeCisxMiAxIDcgOCA3IDIgMSAzIDUgNyA4IDcgNCA1IF4KKzE1IDEgMyA1IDUgMiAyIDIgNyA0IDIgOCA3IDQgNSA1IDQgXgorMTYgMCAxIDQgNCA2IDEgMiA3IDEgNiA0IDEgOCA0IDcgNCA2IF4KKzE2IDAgOCA3IDcgMiA1IDIgMSA1IDYgMSAxIDUgMSA1IDYgNSBeCisxNCAwIDcgMyAyIDMgOCAzIDMgOCAyIDggMyA3IDcgNCBeCisxNCAwIDQgMiA2IDUgNCA1IDMgOCA4IDQgOCAyIDYgNCBeCisxNCAwIDggNyAxIDMgNSA4IDIgOCAxIDQgNSAyIDggOCBeCisxNiAwIDUgNSAyIDIgNCAyIDQgNyA2IDEgNSA4IDMgOCA3IDIgXgorMTYgMCAxIDYgNiA2IDYgNCAyIDIgNiA0IDIgNCA0IDYgNyA2IF4KKzE2IDEgMiAzIDcgNCAxIDcgNyA1IDcgMiA0IDcgMiA2IDYgMyBeCisxMyAwIDcgNCA4IDYgNSA3IDYgMyA1IDcgNSA4IDMgXgorMTYgMSA0IDEgMSA1IDQgMyA2IDUgNSA4IDUgNCA4IDUgMyA4IF4KKzEzIDAgNyA0IDQgNSA4IDMgOCAzIDggNiA2IDYgOCBeCisxNCAxIDUgNCA3IDUgOCA0IDYgMSA2IDIgNyA4IDYgOCBeCisxOCAxIDMgNCA0IDUgMyA0IDEgNiAzIDcgNiA3IDMgMyAyIDggNCA1IF4KKzE5IDAgNSA4IDEgMiAxIDMgNSAzIDEgNiA2IDMgNyA0IDUgNyAxIDQgNyBeCisxNyAwIDUgNyA3IDIgMiA2IDQgNyAxIDcgOCAxIDUgMyAyIDcgNiBeCisxNCAwIDkgMyA2IDkgMyA0IDcgNiA5IDEgNyAyIDkgNiBeCisyMSAxIDggNiA1IDIgMiA0IDMgMSAxIDYgMiA4IDQgMiA1IDQgNSAxIDIgNSA2IF4KKzE2IDEgMiA2IDUgNCA5IDggMSA4IDEgNyA2IDcgNyAxIDIgOSBeCisxNSAwIDYgOSA1IDQgNyAxIDcgMyA5IDQgNyA3IDUgMiA4IF4KKzE2IDAgMSA3IDggMiA3IDIgOSA4IDggMyA0IDUgMiA0IDggNyBeCisxNiAxIDEgNiA4IDIgOCAxIDYgNyA3IDUgOSAyIDkgMiA4IDUgXgorMTYgMCA0IDIgOSA2IDIgNiA2IDcgOSA5IDEgOSA0IDEgNSA3IF4KKzE4IDEgNiA5IDIgNyAyIDggNSA4IDQgMyA0IDQgNiA2IDMgMSA2IDQgXgorMTkgMCAxIDcgNCA0IDQgNiAxIDYgMyA5IDUgNiA0IDcgMiAyIDUgNSA4IF4KKzE3IDEgOCA1IDMgNyAzIDUgNiA0IDEgOSAyIDYgNSA3IDkgMSA5IF4KKzE4IDAgOCA4IDYgMyA1IDMgMyA1IDUgMyA4IDMgMiA1IDUgNCA3IDggXgorMTYgMSA0IDcgNyAyIDcgMyA4IDUgNyA1IDYgOCA1IDIgOCA4IF4KKzE5IDAgMyA3IDIgMyA5IDUgOSA3IDcgNiA1IDMgMSAxIDUgMiAzIDkgNiBeCisxOCAwIDIgNCA2IDcgOCAxIDIgOSA3IDIgMyA1IDggOSAxIDcgOSA0IF4KKzIxIDEgNCAxIDggMyAzIDEgNyAzIDUgNyA0IDEgOCAzIDYgMyA1IDcgNiA4IDIgXgorMTcgMCA0IDggMyA3IDkgOCA2IDggNCAyIDggNyAyIDQgNCA1IDcgXgorMTggMSAzIDkgNyAxIDQgNSA2IDkgMiA5IDEgMyA4IDQgNyA4IDcgNCBeCisyNSAxIDIgNCA4IDEgNyAyIDcgNSA1IDMgMiAzIDIgMSAyIDEgMSAyIDQgMiA4IDcgOCA3IDQgXgorMjUgMCA5IDQgNiA1IDggMSAxIDEgMyAyIDEgMyAxIDEgMSA1IDMgMyA2IDUgNyA0IDUgNiA4IF4KKzE5IDEgNyA1IDYgNiA4IDIgNCAxIDggNyAxIDYgMyA0IDggNSA4IDUgNiBeCisxOSAwIDYgMSAyIDEgNyAxIDEwIDcgNCA1IDEgNiA0IDYgOCA3IDEwIDkgNiBeCisxNiAwIDEwIDEwIDUgNSA5IDcgMiA1IDQgMyA2IDMgMTAgMTAgNSA4IF4KKzE4IDEgMiAzIDUgOSA4IDUgMTAgNiA4IDQgMiAyIDQgNyA5IDYgOSA0IF4KKzE4IDAgNSAxMCAzIDEgNCA1IDQgNiA4IDMgNyA3IDcgNSA5IDIgOSA5IF4KKzE4IDEgNCA5IDcgNSA0IDQgMTAgNiA5IDMgNiA2IDggNiAyIDQgNiA2IF4KKzE3IDAgNSA3IDQgOCA1IDkgMTAgNCA5IDEgNCA4IDYgNiA1IDkgNiBeCisxNyAxIDMgNCA4IDkgMSA1IDggMTAgNSAxMCAzIDggMSA2IDggOSA5IF4KKzE4IDAgOCAzIDYgMSAzIDEwIDMgNyA2IDUgOSAzIDEwIDkgNCA2IDEwIDUgXgorMTYgMSA5IDEgOSA2IDUgNyA3IDEwIDkgNiAxIDUgNyAxMCA4IDkgXgorMjAgMCA2IDQgMTAgMTAgNCAzIDkgOCAxMCAzIDMgNSAyIDEgOCAxIDMgMiA5IDkgXgorMTcgMSAxMCA2IDEwIDYgOCAzIDYgNyAzIDEwIDggNiA2IDQgNCA5IDUgXgorMTkgMSA5IDQgMyA0IDcgMyA4IDEwIDIgNCAxMCA3IDYgMTAgMSAzIDUgNyA5IF4KKzIxIDEgMiAyIDIgMyA5IDIgOCAzIDkgMyA3IDcgNCA5IDkgNSA0IDIgNiAxMCA3IF4KKzE3IDEgNSA5IDggOCA5IDEwIDkgMSA4IDMgMTAgMiA3IDIgMTAgNCA5IF4KKzIzIDAgNSA0IDEwIDQgMTAgNyA4IDMgMSAxIDMgNCAyIDEgMSAxMCAyIDEgNCAxMCAxMCAxMCA0IF4KKzE5IDAgOSAyIDUgNyA5IDYgNyAxIDggOSAxIDIgMSAxMCA4IDEwIDQgNyAxMCBeCisyMiAxIDIgNiA4IDggOSA3IDIgMSAzIDMgMTAgNiAyIDYgMiA2IDUgMiA1IDEwIDUgOSBeCisyMiAxIDggNyA4IDEwIDEgNiAzIDcgNCA1IDUgNSAxIDkgMiAyIDUgNSAyIDEwIDkgNCBeCisyMSAwIDEgMTAgMiA2IDEwIDkgNCAzIDMgNyAxMCAyIDkgNiAxMCAyIDEgNSA2IDMgMTAgXgorMjEgMSA4IDUgNyAxMCA1IDYgNyAzIDMgMSAyIDkgNCA4IDYgMyA5IDEgNyA3IDkgXgorMjIgMCA1IDUgNiA1IDIgMyA1IDMgMTEgNCA1IDEgMTAgNiA0IDExIDggMyA2IDUgNiA3IF4KKzIwIDAgMiAxIDkgOSAzIDYgMSA4IDExIDYgNyAxMSA2IDEgMTAgNiA3IDUgNSA4IF4KKzE5IDAgNCAxIDcgMTAgNCA4IDEwIDggMTAgNCAxMSA5IDYgMSA0IDUgNiAxMSA0IF4KKzE5IDEgOSAyIDQgMTEgMTEgMTEgNyAxIDEgNiA4IDEgOSA4IDUgMTEgNSA0IDEwIF4KKzIwIDAgOCAzIDEwIDEgNyA2IDEwIDggMiA5IDMgOCA2IDggOSAzIDcgNSAxIDExIF4KKzIyIDAgNCA1IDggNCAxMCA2IDUgNCA1IDMgMyA0IDEgNSA5IDQgMTAgOSA2IDcgMyAxMSBeCisyMSAwIDYgNSA4IDcgOCAxMSAyIDEgMTEgMTAgMyAzIDIgOSAxIDMgNiA5IDEwIDEwIDIgXgorMjQgMSAzIDEgMSA5IDQgMiA1IDcgMyAxMCAxMSA1IDYgNyAxIDcgNyA4IDcgMiAyIDcgNCA5IF4KKzIzIDEgOSA0IDYgMyA3IDUgMTAgOSA4IDkgMyAyIDEgNyAyIDIgNyA2IDIgOCAzIDYgMTAgXgorMjIgMSA3IDEwIDIgMTAgNSAxIDggNyA3IDMgOCA2IDYgOCAzIDIgMTEgNiAzIDQgNyA2IF4KKzIwIDEgMTEgMyA3IDIgMTAgMTAgNyA1IDIgNCAzIDUgMTEgMyAxMSA4IDkgNSA1IDEwIF4KKzE5IDAgNiAyIDYgOCA1IDkgNCA5IDEwIDkgOCAzIDIgMTAgMTEgMiA2IDExIDExIF4KKzIwIDEgOCAyIDQgMiA3IDMgOSA5IDExIDggMiAxMSA0IDggNCA4IDEwIDYgOSA4IF4KKzIxIDAgNiAxMCAxMCA3IDkgMiA1IDExIDkgMTAgNyAzIDEgNCA1IDQgMTAgMSAyIDggMTAgXgorMTggMSA4IDExIDYgMTAgOCA5IDExIDYgNyA3IDIgNiAyIDYgMTAgNiA5IDExIF4KKzIxIDAgNSAxMSAxIDYgOCAxMSA4IDEwIDUgMTAgMyA3IDggOSA5IDEgMSAxIDEwIDIgMTAgXgorMjUgMSA1IDEwIDIgOSA5IDkgNyAyIDIgNCA2IDEgMTEgNyAzIDMgNSA1IDIgMTEgMiA1IDUgMTAgMiBeCisyMSAxIDEgOCAxIDExIDYgOSAzIDYgMTEgNyAxMSA4IDYgOSA0IDQgMTAgNyAxIDggNyBeCisyMyAxIDcgNyA1IDExIDEgNCA3IDExIDExIDExIDkgMiAxIDMgOCAyIDggNyA0IDUgMiA1IDggXgorMjQgMSA0IDExIDUgMTAgNyA3IDkgNSAxIDUgNiAyIDkgMSA1IDcgOSA5IDExIDEgMSAzIDEgMTEgXgorMjcgMSAxMCA0IDYgOCA1IDcgMTEgNCAxMCA4IDYgNCAzIDQgNCAyIDEgMSAzIDMgMSAxMSAyIDMgNCAxMCA2IF4KKzIxIDEgNyAxMSAyIDcgMTAgMTAgOSAxMCAxIDMgMTAgNCAzIDExIDEwIDIgNSAzIDkgMTEgNCBeCisyMiAwIDcgOSAxMCA5IDUgMiA2IDYgOSAyIDcgNCA5IDggNCA5IDIgNSA5IDggMTAgMyBeCisyMSAwIDEyIDIgNiAxMiA3IDkgMyA1IDExIDYgMTEgMyA1IDQgNCAxMSAxMCAyIDEgMTAgMTAgXgorMjcgMSAxIDQgMTIgMiAxMCAxIDYgNSA1IDQgMSAxMCAzIDEgMTIgMyAyIDExIDUgMSA0IDYgNCA2IDExIDExIDQgXgorMjIgMSA4IDkgNCA4IDEyIDUgNSA5IDMgNSAyIDMgNCAxMiAxMiA4IDUgMyAxIDkgMTAgOSBeCisyNCAwIDUgMTIgOCA2IDIgNCAxMSAxMSAyIDcgMTEgOSA0IDUgMiAxIDggMyAxMCAyIDUgMiA4IDkgXgorMjEgMCAzIDcgNyA3IDUgOSAxMSA1IDkgMTEgMiA5IDcgNSA2IDExIDIgMTIgNCA5IDcgXgorMjYgMCA0IDQgNiA0IDcgMiA0IDIgNSA3IDIgNiAxMSA1IDkgOCAyIDUgMTAgMiAxMCA4IDggNSAyIDExIF4KKzIzIDEgMyAzIDIgNiA5IDEwIDUgNiA4IDUgOCAxMSAzIDYgMTAgNCA2IDkgMiAxMSAxMCAzIDEwIF4KKzI1IDEgMSAzIDEyIDMgNyA0IDUgNSAzIDggOSAyIDQgOCA3IDcgOSAxIDkgMTEgNCA1IDcgNyAxMCBeCisyMCAxIDExIDkgOCAxMCAxMSAxIDcgMTIgNiA3IDQgMiAxMiAxMiAyIDMgOSAxMCA4IDggXgorMjAgMCAxMiAxMSAxIDQgMTAgNiAxMCAzIDkgNyAxMiA0IDExIDggNCA2IDEyIDQgNyAxMiBeCisyNCAwIDggNiA0IDggMiAyIDkgMiA5IDYgMyA2IDMgMyAxMCAxMiAyIDcgOCA3IDggMTIgMTAgNyBeCisyNiAwIDUgMTEgMTEgNyAzIDMgOSAxMCAzIDkgMyAzIDcgMiA5IDkgMSAyIDQgMTIgMiA1IDUgNiAxMCA0IF4KKzIyIDEgMTIgOSAxMCAxMCAxMiAxMiA3IDggMiA3IDEgNiA4IDIgOCA3IDYgMyAxIDEgMTIgMTIgXgorMjIgMSAxMSAxMCAyIDExIDEwIDggMSAyIDggMTIgOCAzIDkgNSA3IDkgOCA3IDExIDEgMTAgNCBeCisyMiAwIDEwIDEgOCA2IDEyIDIgMTEgNyAxMCA0IDEwIDYgNSA3IDEwIDExIDMgMyA4IDggNCAxMiBeCisyNiAwIDggNSA1IDEyIDEgOCA2IDcgNiAxMSA4IDEwIDQgMyA3IDYgMSA1IDEgMSA5IDEgNSA4IDkgMTIgXgorMjEgMCAxIDEyIDQgMTEgMTIgOSAyIDEyIDEyIDMgMTIgNSA0IDEyIDQgMSA1IDggMTIgOSAxMCBeCisyNiAxIDUgMyA4IDEgMTEgNCA3IDMgMyAxMCA0IDkgNiA2IDQgMyA5IDExIDEgMyA3IDEwIDcgOSA2IDExIF4KKzIzIDAgNyAxMiAzIDUgOCA5IDcgMTAgOCAxMSAxMCAxMSA2IDEgOCAxIDEgNiAzIDkgOCAxMiA2IF4KKzI1IDAgMSA1IDUgNiA1IDEyIDEgMSAxIDExIDkgOSAzIDExIDkgNiAxIDExIDMgMSAxMiA4IDExIDExIDEwIF4KKzIyIDEgMTAgOSA3IDMgMTAgMiA2IDQgMTEgMyAxMSA2IDQgNSA1IDExIDEyIDkgNyA4IDEyIDkgXgorMjIgMCA4IDUgMTAgNyAxMiA4IDMgNCA0IDUgOCA5IDEyIDYgOCAxMCA2IDcgMTEgNCA4IDEwIF4KKzI2IDAgMyA1IDMgMTEgMTEgMiAxIDkgMSAxMCA0IDQgNiA5IDQgNyA2IDUgMTAgMTAgMSA4IDkgOSA2IDEyIF4KKzI0IDAgMTIgMTEgNCAxMCAxIDMgNyA1IDExIDkgMTEgNyAyIDExIDUgNCA3IDggMSA2IDEyIDcgNCA5IF4KKzI4IDAgMSAxMiAxMCAyIDIgMiA0IDkgMTEgNCAxMSA3IDIgNCAzIDExIDcgMTAgNSAxMCA1IDUgMyA1IDIgNyA1IDkgXgorMjYgMSA0IDEgNCAyIDEzIDYgMTEgNSA2IDggNSAxIDUgNiAzIDggMSA1IDggOSA5IDEwIDEyIDEzIDEyIDIgXgorMjYgMCAxMiAzIDEgMTEgMiAxMiA2IDggNiA4IDExIDQgMTEgMTAgOSA2IDMgMyAyIDIgMiAxMyAyIDEgMTMgOSBeCisyMiAwIDMgMyAxMiAxMyAxMyA3IDEyIDIgOCAxMSA5IDEwIDEwIDEgMSAxMyAxMSAxMyA0IDEgMTEgMyBeCisyNiAxIDIgNiAyIDggMTIgMyA3IDEyIDggOSA4IDMgMTIgNyA0IDkgMiA2IDQgOSA5IDQgOCAyIDQgMTIgXgorMjQgMSA4IDExIDExIDMgMTMgMiAxMCAzIDEwIDggNiA2IDQgNCAxMyA0IDIgNCA4IDEgMTEgMTIgOSAxMCBeCisyOSAxIDEgMiA1IDEgMSAxMCAzIDIgNCA5IDExIDggMiA1IDIgOCAxMCAyIDEwIDExIDcgOCAxMiA2IDEgOSA4IDQgMTIgXgorMjMgMCA2IDEyIDcgMTAgNyA3IDEzIDIgMiA3IDEwIDIgOCAxMyAxMCA3IDExIDIgNSA5IDExIDEzIDEgXgorMjUgMSAzIDExIDIgMTAgNSAxMSA1IDcgMTAgOCAxMCAxIDEwIDMgMTEgNyA5IDUgMyAzIDQgNSAxMyAxMiA4IF4KKzI2IDEgNSAxMyA5IDQgMyAzIDQgMyAxMyAxIDYgMTEgMTAgOCAxMyAzIDQgMTEgOSAxIDkgMSA3IDggNyAxMSBeCisyMiAxIDEgMyAxMyA4IDExIDMgNCAxMCAxMCAxMiA3IDIgMTEgNCA3IDcgNiAxMyAxMyA5IDEzIDExIF4KKzI2IDEgNyA5IDcgOCA5IDkgNSAxIDEzIDMgMyA0IDkgMiAxIDggOSAzIDkgMTIgOCAxMCAxMCA2IDExIDMgXgorMjMgMSAzIDggMTIgOCAxMCA0IDMgOCA1IDUgNyAxMSAxMyAxMSAxMiAxMSA0IDEyIDMgNiA1IDExIDggXgorMjcgMCAzIDEwIDkgNiA5IDcgMiAxMCA0IDQgNSA1IDIgMTIgMTMgNSAzIDEgMTAgMSA0IDcgOCAxMyAxMyAxMiAzIF4KKzMwIDAgMiA2IDUgNCA3IDMgMTAgNiAxMyA2IDMgOSA2IDIgMTAgNSAzIDggNCAxIDExIDMgNSAzIDcgMTEgMSAxMiA5IDcgXgorMjkgMCA1IDIgMTMgNiA1IDIgNiAzIDIgOSA1IDMgNiA2IDQgMTAgMiA0IDcgNyAxMCAxMyA5IDYgMTAgNiA1IDkgOCBeCiszMSAxIDkgOCAyIDcgMyA1IDExIDMgNyA3IDUgNiAyIDEgMSA2IDIgMTEgNSA0IDUgNyA5IDEgMTEgMTAgMiAzIDkgMTIgMTAgXgorMjggMCAxMSAxIDQgMSAxMiAxMCA1IDUgMSA3IDIgMyAxMCA3IDEyIDkgMiA4IDIgNiAxMCA1IDEyIDEyIDQgOSAyIDEzIF4KKzI2IDEgMTEgOSA4IDEyIDQgMTIgNyAzIDQgNCA2IDEgMiA3IDEyIDQgNiA4IDEwIDExIDExIDEgMTAgMiA5IDEyIF4KKzI4IDAgMTAgOSA3IDEwIDEgMTAgOSAxMiA3IDEwIDcgNiA2IDUgMyAyIDMgMSAzIDEyIDEgNCAxMyAzIDkgNyA5IDggXgorMjcgMSA0IDExIDEgNSA2IDkgMTIgMTIgMTMgMTMgMTMgMSAyIDEzIDEgMiAxIDEyIDEyIDMgMiAyIDggMyAxMyA3IDcgXgorMjkgMCA2IDUgNSAyIDQgMiAxMSA0IDQgMTMgOSAxMyA3IDMgMTIgOCAzIDcgNiA0IDEyIDMgMSA4IDExIDEgNiAxMyA2IF4KKzIzIDEgMTEgNiA2IDExIDcgMTMgMTEgNiA3IDQgNCAxMiAyIDEzIDUgMTIgNSA3IDkgNiAxMSAxMSAxMSBeCisyMyAwIDExIDEzIDExIDcgNCAzIDYgMTIgMTMgMTAgMTEgNSAxMiAxMyAxMSA2IDEgMSA0IDcgMTMgMTAgNyBeCisyNyAxIDcgNSAxMyA1IDQgOCA3IDMgOSA2IDcgMTEgNyAxIDkgMyA4IDUgOCA4IDIgMTMgMTMgOCA1IDEzIDQgXgorMzAgMSAyIDUgOCA0IDEzIDEwIDYgNCAyIDYgMSAxIDEyIDQgMTMgNSAxMCA0IDEwIDggNSA3IDEgNSA1IDEyIDQgOCA2IDEyIF4KKzI4IDEgMTIgMSAxMiAxMSAxMCAyIDMgMTAgMSAyIDYgMTEgMTIgOSAxMSAxMiAyIDEgOSA0IDEgNSA3IDIgMTIgMTEgNCAxMSBeCisyOSAwIDYgOCA3IDggOCAxMiAyIDcgNCAxMiAxMSA1IDUgMyA1IDEzIDQgMTEgOCA4IDkgMiAyIDEgNiAyIDggNiAxMiBeCisyOCAxIDcgMTMgNSA3IDExIDMgMSA5IDIgNSAxMiA4IDYgMiA1IDkgMTAgMTAgMTEgNCA1IDEyIDUgNCA2IDUgNiAxMyBeCisyNSAxIDE0IDQgOCAyIDkgMTEgNyA0IDMgMiA4IDE0IDYgMTQgNyAxMyA1IDUgMTQgNiA1IDExIDYgNiAxMyBeCisyNiAxIDMgNSAxMiAxIDExIDEzIDEgMyAzIDEwIDExIDUgNiAxMiAxMSAxMiA3IDE0IDQgMyA2IDYgMTAgMTEgMTQgNCBeCisyNyAwIDQgMiAzIDEwIDcgMTIgMTMgOCA4IDEyIDEwIDEzIDEgNyAxMCAyIDcgMiAxMyAxMCAyIDMgMyA2IDQgMTMgMTQgXgorMjQgMSAxMSAxIDkgMTQgNCAxNCAxNCA4IDEwIDEzIDQgMyAyIDcgNiA2IDggMTQgNSAxMSA3IDE0IDE0IDEgXgorMjIgMSAxMyAxMyAxMCA5IDEzIDggMTQgOSAzIDE0IDMgMTEgOSA5IDEyIDEzIDIgMTAgMSA1IDggMTIgXgorMjUgMCA5IDEwIDkgOCA0IDE0IDYgOSAzIDEzIDEwIDExIDMgMSA0IDYgMTAgMyA0IDMgMTIgMTIgMTQgMTEgMTMgXgorMjYgMSAxMSA4IDExIDcgOCAxMCA5IDEyIDExIDYgMTAgNiAzIDkgOSAxIDcgNSA2IDcgNyAxMiA0IDUgOCAxMSBeCisyNiAxIDEyIDEwIDggMTQgNyA0IDEzIDEzIDggNCA1IDMgMiA0IDcgMTQgMyAxMCA2IDkgMTMgOSAyIDEgOSAxNCBeCisyOCAwIDYgMTIgMiA0IDcgOCAxMSAxMCAxMiAyIDE0IDMgMSAxIDEgMTIgNSAxMyA5IDEyIDUgOSAxMCA1IDEgMTIgMTAgOCBeCisyOSAxIDIgNiA1IDE0IDE0IDMgNiAxMyAxIDIgNiAyIDEyIDEgMiAxMCAxIDQgNSAxNCAxMCAxMiAxMSAyIDMgMTQgMTQgMTIgNSBeCiszMCAxIDUgMiAzIDUgMTEgMTIgMyA3IDEyIDcgOSA4IDMgMyAxNCAxMCA1IDIgOSAzIDggNiAxMSA4IDcgOCAxIDYgMTIgNyBeCisyOCAxIDE0IDUgMiAxNCA3IDggMSA1IDQgMTIgOSA2IDEyIDEgMSA3IDkgNSAxNCAxMSA5IDQgMSAxMCAxIDE0IDEwIDEyIF4KKzI3IDAgNyAyIDggNSAzIDE0IDggOSA0IDYgMTEgMyAxMSA2IDEyIDEgNyAxNCA5IDE0IDYgMTAgNiAxIDggMTQgMTAgXgorMjYgMSA2IDE0IDIgMiAxMiAxMCA1IDEwIDEwIDggMyA3IDEzIDEwIDEgMTQgMSAxNCA3IDExIDEyIDkgMSA4IDggMTIgXgorMzAgMCA2IDEzIDUgMTMgMyA1IDggOCA4IDIgNSA1IDQgMiAxMyAxNCA3IDIgMTIgMTIgMyAzIDUgNyA1IDExIDMgNyAxMyA3IF4KKzI2IDAgMTMgNyAyIDggNCAxMCAxNCAyIDcgMSAxMCA4IDExIDExIDIgMTMgOSAxMSAyIDkgMTEgNyAxMyAxMSAyIDE0IF4KKzMxIDEgNyA3IDggNSAxMyA0IDEgMTIgMTQgMSA5IDExIDMgNSAzIDEzIDExIDcgMyAyIDkgMSAzIDEzIDYgMyAxMCAxMiAxIDEzIDMgXgorMjMgMCA5IDggOCA3IDE0IDEzIDYgMTMgMTQgMTIgMTMgMTIgNyA0IDE0IDEwIDEgMyA5IDcgMTEgMTQgNSBeCisyNyAxIDEgMTAgNCAxMiA0IDExIDUgMTMgMTMgNCAxMiAxMyA3IDEyIDEyIDQgMTMgNiAyIDcgNSAyIDggNyAxMyAxMiAzIF4KKzI2IDEgNyA2IDExIDEyIDE0IDEyIDMgMTIgOCA3IDQgOSAxNCAxIDggMTEgNiA1IDEwIDEwIDYgOCA1IDIgMTEgMTQgXgorMzMgMSAxIDExIDEgNSAzIDggMSAxMiAxNCA1IDEgMyA3IDIgMyA5IDMgNCAxNCA0IDQgMTAgOCA1IDE0IDEgMTEgMTIgMTIgMTAgNCAxMyAKKzIgXgorMzIgMCAxMSA0IDQgOSA1IDUgOCA5IDUgMTAgNCAyIDQgNyA5IDkgNiAzIDUgMSA4IDMgMiAxMyAzIDE0IDkgOCA5IDEwIDE0IDUgXgorMjggMCAxMiA5IDUgOCA3IDIgMTQgMTIgMyA4IDE0IDYgNiA0IDcgNSA3IDEwIDcgMTEgMTAgMSA5IDYgNyAxMiA4IDkgXgorMjUgMCA5IDkgMiAxMSAxMyAxMiAxMSAxMSA2IDE0IDEzIDEwIDUgNiA4IDEwIDQgMyAxMSAxMSAxNCA1IDUgMTAgNyBeCiszMCAwIDEzIDkgMTQgMTEgNCA4IDEyIDkgNSA5IDEgMiA5IDEzIDEyIDYgMSAxNCAxMSAxMCA3IDggNiAxIDQgMyAyIDIgMiAxMyBeCiszMyAxIDEzIDUgOSA2IDEzIDkgMSAxMyAyIDYgOCA5IDEgMyAxMiAxMyAzIDQgNCAxMiA1IDIgMSAxMiAxIDYgMiAxIDggMiAxNCAxMyA5IAorXgorMzIgMSA4IDYgNyAxIDQgNCA2IDEgMTMgMyAzIDEgMTMgNyA2IDExIDYgNCA5IDEwIDQgOCAxMyAxIDkgMTAgMTIgNyAxMCAxMSAxMCA1IF4KKzMwIDAgMTIgNiA2IDMgNCAxMyAxIDQgMTEgMTAgMiA2IDE0IDYgOSAxMiA2IDIgMiAxMSA5IDEzIDQgNyA5IDE0IDIgMTEgOCA3IF4KKzI2IDEgMiAxMSAxMyAyIDkgMTEgOCAxMSAxMSAxNSAxMyAxMyAzIDE1IDIgMTIgMSAxNSAzIDggNCA5IDEzIDEgMTMgNyBeCiszMiAxIDkgNiAxIDIgMiAxIDE1IDMgMTUgMSAxMCAxIDQgMTEgMTQgMTQgNiAxMCAyIDUgOSAxMCAxMCA5IDEgMiAxNCAxMCAxMiAxIDEgCisxNSBeCisyOSAxIDEzIDIgMyA4IDEyIDUgMTQgOSA4IDkgMiAxNCAxIDQgNiAxNSAxMCA5IDIgNyA5IDQgOCA3IDkgMTAgMTEgMTEgNSBeCiszNCAxIDEyIDIgNyAyIDEyIDggMiA4IDYgMyAxMiA0IDQgMTAgMSAxNCAxMiAxMSA1IDE1IDMgMyAzIDE0IDEzIDIgMiAzIDggMiAxIDggCis4IDggXgorMzEgMCA2IDIgNyAxMCAxIDEzIDEwIDYgNiA2IDIgOCA3IDYgNyAxNCAzIDEyIDYgOCA5IDMgMTEgMSAzIDEwIDEyIDExIDExIDkgOSBeCisyNCAxIDEzIDE1IDQgNyAxMSAxMyAxMCAxNCAxNCAxMyA0IDExIDUgNiAxMSA4IDEyIDEzIDkgMSAxMCA5IDEwIDcgXgorMzMgMCAzIDEgMyAzIDQgMTMgMSA2IDE0IDggMyA0IDMgMiAxIDE0IDE0IDE0IDUgMTMgMTMgMTEgMTAgMTMgNCAzIDEwIDExIDMgNiAxIAorMTAgNyBeCisyOCAwIDcgOSAxMyA5IDE1IDIgNCAxMiAxMCAxMCA0IDEyIDMgOCA1IDYgMTMgMSA2IDE1IDEgOCA5IDYgMTIgMTEgNyAxNCBeCiszMiAxIDMgMSAxMyA2IDQgMSA5IDQgNSA3IDEgOCA4IDExIDEwIDUgMTUgMTQgMiA4IDE0IDkgNyAxMiAyIDQgMTMgNyA0IDMgOSAxNCBeCiszMSAxIDE0IDEyIDEzIDggNCAxMiAyIDYgNSAxMiA5IDMgMTEgOCA1IDEzIDUgMTAgNSAyIDMgNyAxMiAxNCA0IDEgNyAzIDYgOSA5IF4KKzMyIDEgMTAgMTUgNyAyIDEzIDUgNyAyIDUgMiAxMCA3IDExIDUgNSA5IDggMiA5IDMgMyA2IDMgMTMgMTAgMyA1IDcgMTUgMTEgMTAgMTIgCiteCiszOCAwIDIgMyA3IDEgNiAzIDMgMTIgNSAyIDkgNCA1IDExIDIgMSA3IDYgMTQgNyAxNCAxMCA0IDExIDYgMyAxMSAyIDEwIDYgNCA4IDEgCis0IDkgNCAxNSA0IF4KKzI3IDAgNyA3IDQgMTQgMiAzIDE0IDE1IDEwIDcgMTIgNyA1IDggNyAxNSAxNSAxNCAxMCAyIDMgMSAxMCAxMiAxNSA5IDkgXgorMzEgMSAxNSAzIDkgOSA1IDQgMiA2IDE0IDQgOSA1IDEyIDggMSA2IDEgNCA4IDcgMTAgMTQgMyAxMCAxNCA4IDExIDkgOCAxMCA5IF4KKzI4IDAgMTQgMTEgOCAzIDUgNSA3IDIgMTEgNCA0IDQgNiAxNCAxMyAxMCAxNCAxMCAzIDkgNiA5IDcgNSAxMCAxNSAxNSAxNSBeCiszMCAxIDggMTMgNCAyIDEzIDYgNCA3IDQgNCAxNSAyIDIgMTIgMTMgMyAxNCAxMiA3IDExIDYgMiAxNCAyIDYgNiA5IDE0IDEzIDEyIF4KKzI3IDEgMTMgMTQgMTUgMTIgMTQgNSAxNCAxNSAxMSA0IDEgMSA5IDUgMTMgMTAgNiA1IDUgNiAxNCAxMyAxIDUgMyAxNCAxMyBeCisyOSAwIDQgMiAxMyAxMiAxNSA3IDMgMTUgNSAxIDYgNyA2IDEzIDEgMTQgMTEgOSA1IDE1IDYgMTMgMyA2IDExIDcgMTUgOCA5IF4KKzMxIDAgNSA0IDQgMTQgMyAxMyA4IDEzIDMgNyAxMyA3IDkgMTIgMyAxMSAxNSAxMSA1IDE0IDEgMyA0IDEwIDEyIDcgMTIgMSAyIDEzIDQgCiteCisyOCAxIDEyIDcgMTMgMTQgNyA3IDEgOSAxMyA4IDUgMTQgMiA1IDkgOSAxNSA5IDEzIDcgOCA5IDggMSAxMiAzIDkgMTUgXgorMzQgMSA2IDEyIDQgMTQgMTIgNSAzIDE1IDQgNCA2IDggMiAxMSA4IDQgMiA1IDEgMTUgMTUgMSAxNSAyIDExIDQgMTAgOSA0IDcgMyAyIAorMTUgNiBeCisyNiAwIDE0IDUgNiA1IDExIDEyIDE0IDEyIDEyIDExIDE1IDIgMTQgOSAxNSAxIDcgMTIgMTEgMTIgMTMgMTQgMSAxIDEyIDUgXgorMzIgMCAyIDIgNCA1IDIgMTEgMTIgNSA0IDEyIDkgMTQgNSA1IDggNiAyIDE1IDE1IDYgMTMgMTEgMyA1IDE1IDUgMTEgMyAxMiA3IDEwIAorOCBeCisyNiAxIDIgMTUgMTQgOSAxNCA3IDYgMTUgOSAzIDQgOCA4IDEyIDE0IDIgOSAxMSAxNCA2IDExIDE1IDEwIDggMTQgOCBeCiszNCAxIDE1IDcgNCA1IDEwIDEgMTMgNyAxIDEgOCAzIDEzIDExIDIgOCAxNSAxMSAxMiA2IDYgMSAzIDIgMiAxMSAzIDEzIDkgMTAgMyA2IAorMTIgMTUgXgorMjUgMCAxNSA3IDEwIDIgMTAgMTUgNSAxMCAxMyAxMiA4IDE1IDMgMSAxMSAxNCAxNSA4IDE1IDEyIDkgNiA4IDEzIDEzIF4KKzI3IDAgMTAgOCAxMyAxMCAxNSAxMyA1IDggNCAxMCAxMCA2IDcgMTMgNiAxMiAxMiA5IDEyIDIgNSAxMCAxMiAxMCA4IDE1IDYgXgorMjggMCA1IDMgOCAxMiAxNSA4IDE0IDE1IDkgMTIgMTIgMyAxMCAxMyA2IDExIDEwIDQgMTMgMTQgOCA5IDEgOCAxIDUgMTEgMTIgXgorMjkgMCA5IDEyIDQgMTMgMTUgNSA5IDExIDcgMTQgMTEgMSAxMSA3IDggOCAxMSAxIDEzIDE1IDEyIDEgNSA4IDMgOCAxMCA3IDE0IF4KKzMwIDAgMSA1IDEzIDEyIDE0IDUgMyA2IDQgMTIgMTUgNiA2IDEwIDExIDEzIDkgMSAxMSA2IDEwIDMgNyAxNCA0IDE0IDExIDcgOCAxMyBeCiszNCAxIDEgMTIgNSAxIDcgNCA2IDcgNSAxMSAxIDQgNyAxMiAxMCAxMCA4IDE1IDEzIDQgMTEgMTUgMTEgNiA5IDEgMiAxNSA1IDEgNSAKKzEyIDYgMTMgXgorMzUgMSAxMiAxNSA0IDExIDEzIDMgNiA1IDEwIDggMSAzIDkgMyAxMSAxIDIgMTYgMTIgMTAgNiAxIDkgMSAxNiA1IDYgMTUgMSAxMiA0IAorNCAyIDE1IDQgXgorMjcgMCAxNSAxMSAxNSA1IDExIDkgNyAxNSAxNiA2IDE2IDEyIDMgMiAxMCAxNiA1IDUgNyAxIDcgMTEgMTMgNyA5IDExIDEyIF4KKzMxIDEgNSA1IDUgNCAxMyAxMyAxNCA0IDcgMTIgNiA0IDggMiA5IDkgMTMgMTMgMyAzIDYgNyAxNiA3IDYgMTUgNSA4IDE1IDYgMTUgXgorMzAgMSA2IDE2IDE1IDExIDE0IDE0IDQgNyAxMCAzIDQgMTAgMyA2IDcgMTQgNCA2IDYgNSAyIDcgOCAxNiAyIDEyIDE2IDEwIDE0IDcgXgorMzYgMSAyIDMgNyAxNCA2IDkgNCA0IDUgOSA3IDEyIDMgOSAyIDUgMSAzIDEwIDExIDExIDYgMTIgNyAxIDcgMTIgMiAxIDIgOCAxMiAxNSAKKzE2IDkgMTMgXgorMzQgMSA2IDMgMTIgMTEgMTYgMTUgOCA4IDggMTQgMTMgNyA3IDggMiA3IDYgMiAyIDE0IDcgMSA0IDIgNCAxMSAxMSA1IDcgMiAxMiAxIAorMTQgMTEgXgorMjkgMCAxMiAxMSAyIDkgOCA1IDYgMTQgMTAgMTIgNSAxMSA1IDMgMSAxMyAxNSA5IDEyIDExIDEzIDQgMTQgNSAxNiAzIDUgMTMgMTUgXgorMzAgMSA1IDE2IDExIDIgNiAxMyAxNiAzIDYgNCA5IDEwIDkgOCA2IDE0IDggOSA1IDEzIDYgNSAxNCAyIDggMTUgOCA3IDE0IDExIF4KKzI4IDEgMTQgMTAgMTMgMTMgMTEgMTAgMTMgOSA4IDQgMTEgMTQgMTEgNiAxMCAxMCAxIDkgMTMgMTYgNSAzIDQgNyA5IDEyIDEwIDggXgorMzYgMSAxMCAxNSAxMiA4IDggMTAgMTMgNSA2IDExIDQgNiAyIDMgNSA2IDExIDEgMSA4IDYgMTMgMTUgNiAzIDE1IDUgMTAgMSA2IDIgNSAKKzIgMTEgMTAgMTAgXgorMzEgMSA0IDE0IDcgMiAxNCAzIDEgMTIgNyAxNSAxMyAxIDUgOSA4IDMgMyAxNCAxMiAxMyAyIDE1IDEyIDcgMTYgMTIgMyA4IDExIDUgCisxNSBeCiszNCAwIDEwIDIgMTAgMTYgNCAxNiA3IDggMSAxNiA2IDE0IDkgNSAxMiAxNiA4IDkgNCA0IDQgMSA3IDEzIDEwIDEgNyAxMCA1IDcgNCAxIAorNSAxNSBeCiszMCAwIDE2IDMgOCA3IDMgOCA4IDExIDggMTMgNCAxNiA4IDE2IDEgNCAxNiAxMSA0IDEyIDEgMTQgNSAxIDE2IDExIDggMTQgMTIgOSBeCiszMyAwIDcgOSA5IDE2IDExIDcgNiAxIDExIDE0IDEyIDE0IDEwIDkgMTEgOCAxMSA3IDUgMTAgMTUgMiA2IDkgMyA5IDQgMiAxIDEgOSAKKzE0IDYgXgorMzIgMCA1IDggMTQgMTUgNCAxIDYgMSAxMCA4IDEgMTUgMTUgMyAxMCA3IDggMTAgMTIgNCAzIDExIDE1IDggNSAzIDMgMTYgMTUgNyAxNCAKKzEzIF4KKzM2IDAgMyAxMCAxMiAyIDExIDkgMiAxIDQgMyA4IDEwIDE0IDIgMTEgMyAyIDQgMTUgMTQgNSAyIDggMTYgMTYgMSA1IDcgNSA5IDUgMTUgCis5IDExIDMgMTQgXgorMzEgMSA1IDQgMTQgNCA4IDMgMyAxIDEwIDQgMTUgMTUgMTMgMiAxMyA5IDcgMTMgMTEgOSAxIDE1IDE1IDE1IDE2IDcgNyA2IDUgMTMgOSAKK14KKzMwIDAgMTQgMTYgMTIgMSAxMSAxMSA3IDMgNyAzIDMgMTMgNCAxMyAxNCA1IDE1IDEyIDUgMTQgMTYgMTQgNCA1IDkgNiA2IDMgMTYgMTEgCiteCisyOCAxIDEwIDE2IDEwIDE0IDEzIDYgMTYgMTQgMyAxNCAxNSA3IDEzIDEyIDQgMSA4IDQgMTAgNiAxIDEzIDYgMTQgMTEgMyAxNiAxNCBeCiszMyAwIDE1IDExIDEzIDggMTEgMSAxNSAyIDEwIDkgOSAxNCA4IDEzIDIgMTMgOCAxIDIgMSAzIDEyIDggNSA0IDExIDEwIDE0IDggOSA0IAorNSAxNiBeCiszNCAxIDEyIDEyIDYgNyAxMyAxMyAxMiAxIDEzIDE0IDEgMSA2IDMgMTMgMiAxNiAzIDEgMTYgOSA5IDE1IDMgMTMgMSA4IDMgMiA2IDEyIAorOCA5IDEzIF4KKzI3IDAgMTEgMTIgMTUgMTQgMTIgMTAgOCAxNSA5IDE1IDIgNyA1IDExIDggOSA3IDE2IDYgMTUgNCAxNSA3IDExIDE1IDQgMTQgXgorMjkgMSA5IDEgMTQgNyA0IDE0IDE2IDExIDEwIDExIDEyIDE0IDYgMTIgMTEgMTUgNyAxNCAzIDE1IDYgMSAxMiA1IDEyIDEzIDMgNiAxNCAKK14KKzI4IDAgNiAxMCA3IDcgOSAxMCA3IDExIDEyIDE2IDkgNiA5IDE0IDEwIDEwIDIgNyA0IDE1IDE2IDEzIDExIDggMTAgMTUgMTAgMTUgXgorMzIgMSA4IDEyIDEgMTAgMyA3IDE1IDE0IDkgMTYgMTQgMSAxNSAzIDE0IDkgMiAyIDEyIDE0IDcgMyA1IDE0IDUgMTUgMTAgMiAxNCAxIAorMTUgOCBeCiszMyAwIDkgMTYgMTAgMTYgNiAxMyAxIDYgMiA4IDEzIDUgNyAyIDE1IDExIDEyIDYgOCA3IDEgNSA4IDEzIDkgNCA4IDEyIDkgMTUgMSAKKzEwIDEzIF4KKzMwIDAgMTAgNCAxNiA0IDEzIDEyIDIgNCAxNCA2IDExIDMgMTUgOCA0IDEyIDMgMTEgMTYgMTYgMTYgMiAxMyA3IDEwIDIgMTMgMTAgMTUgCisxMCBeCiszMyAxIDE2IDIgMTUgMTAgNCAxIDEzIDEyIDEyIDkgMTIgNyAxNiA0IDEyIDQgMiAxNiA0IDkgMTYgOCAyIDYgMTUgMiAzIDQgOSAxMiA2IAorOCAxMiBeCiszNCAxIDEzIDExIDExIDQgOSAxMyAxNCAyIDkgNiA4IDYgMTAgMTEgOSAzIDEyIDkgMTMgNCAxMCAzIDUgMSAxNCAxMSAxMSAxNiAxIDIgCisyIDExIDYgMTQgXgorMzMgMSAxNSAxMiA2IDUgMTYgMiAxNCAyIDEwIDEyIDIgNSA1IDYgMTAgMTMgMTIgMyAxMCA4IDE2IDkgNSAxMiAxNSA0IDExIDEzIDMgNiAKKzUgMTAgOCBeCiszNSAxIDEgMyA5IDMgMTEgMSAyIDE2IDEyIDEwIDYgMSA5IDEgMTYgNSA2IDE1IDEgMTIgNCA0IDIgMTUgMTMgMTUgMTEgMTUgNSAxMSA5IAorNyAxNSAxNiA0IF4KKzM2IDAgMTYgMTIgMyAyIDEwIDE2IDUgNSA3IDEgNyAxMSAxMyA3IDkgMTEgMiA1IDUgNSA0IDEzIDEzIDE0IDQgNyAxMiA2IDQgOCAyIDkgCis5IDEzIDEzIDQgXgorMzUgMCAzIDYgNyAxNiA3IDYgMTUgNSA4IDE1IDYgNCA2IDE2IDE1IDExIDE0IDE0IDQgNyAxMCAzIDQgMTAgMyA2IDcgMTQgNCA2IDYgNSAKKzIgNyAxNiBeCiszMSAwIDcgNCA4IDE3IDE2IDE2IDExIDE0IDIgMTAgMTQgMTUgMTAgOSAxIDE0IDEwIDE0IDYgNiAxNiAzIDIgMyA4IDMgMTIgOCAxMSAKKzE3IDIgXgorMzAgMSA5IDcgMTYgMTQgNCAxMSAxNSA1IDEzIDkgNSAxMiAxNyAxNyAxMyA4IDIgNiA4IDE2IDEgMTIgNSAxNyAyIDkgOCAxMCAxMyA2IF4KKzI3IDAgMTEgMTcgMTIgNSAxNCA5IDExIDkgMTEgNCAxMSAxMyAxNiA2IDEwIDUgOCAzIDE3IDE2IDE0IDEgMTUgMTUgMTUgNiAxNyBeCisyOSAxIDIgMTEgNiAxMyAxMSAxMyA0IDYgNyAxMSAxMSAxMiAxNiAxMyAxIDE2IDE2IDE0IDE2IDIgNCAxNiAxMSA2IDE1IDcgNCAxNyAKKzExIF4KKzMyIDAgNSA3IDYgMyAxNCAxNiA1IDE3IDExIDEzIDEgMSAxNCAxMyAzIDYgMTQgNSAxNyA1IDQgOCAxNCAzIDE2IDcgMTMgNCAxNCA4IDkgCisxNyBeCiszMSAxIDggMTIgOCAxNSA5IDYgNiAxIDUgMTMgMTYgNSA4IDQgNiAxMCA2IDExIDE2IDE3IDE1IDE1IDEyIDQgMTMgNSAzIDQgMTAgMTUgCisxNiBeCiszMyAwIDcgMTUgMTYgMTIgMTIgMTEgOCAxMyAxNCA1IDggMSAxMSAxMCA5IDMgMTQgMyAxIDkgNiAxNSAxMiAxNiA0IDUgOSA3IDEgOSA0IAorOCAxNyBeCiszNiAxIDcgOSAxNiAxMSAxMSA2IDEzIDcgMSA3IDggMSAxNCAxMiAyIDcgNCA1IDE1IDE2IDEyIDMgMSA2IDExIDQgMTUgOCA5IDkgMiAxIAorMTMgMiAxNCAxNCBeCisyOSAxIDYgOCA4IDE1IDEzIDEzIDEwIDIgMTYgMTIgMTcgNiA3IDE0IDEzIDEyIDEzIDMgMTQgMTIgMTIgMiAxNSAyIDUgMTUgMTAgNyAKKzE1IF4KKzM4IDEgNSAxNSA3IDggMTAgMTAgMSAxMSAyIDQgMyAxMSAxMSAzIDUgMiAzIDExIDUgMTIgMTIgOCA2IDIgMTcgMTUgNiAxNiAxNSA0IDMgCisxNCA2IDMgMiAxMCA1IDE1IF4KKzMwIDAgMTIgMTEgMTUgMTQgMiAxNiAxNCA3IDYgMTUgOSAzIDExIDggOCA1IDE2IDIgMTYgMiAxNiA2IDkgNiAxMiAxMCAxNiA3IDE1IAorMTAgXgorMzYgMCAxMSA1IDMgMTYgMSAxNSA3IDEwIDE3IDEwIDEwIDEzIDIgMiAxNyA2IDIgNSA2IDYgMTAgMTIgMiA5IDExIDEyIDYgMSAxIDggCisxMiAyIDYgMTYgMTIgMTYgXgorMzAgMSAxMCAxNyA1IDEgNiAxNCAxNyA4IDEyIDEwIDExIDE2IDE1IDEgOCAzIDkgMTMgNyA3IDE2IDggMTMgMTEgMTAgOCAxNSAzIDE1IAorMTIgXgorMzEgMSAxNCA4IDQgMTIgMSA2IDUgMTMgMTUgMyA1IDExIDE0IDExIDE0IDE3IDUgMTAgMTcgNyA4IDEzIDUgMTIgMTUgMyA2IDE3IDcgCisxNyA3IF4KKzMxIDAgMTIgMyAxMCAxMCA0IDEzIDEzIDggMTEgMTMgNyAxNyAxMSAxIDEwIDEgNSAxMSAxMSA5IDE0IDEzIDE1IDggMTQgMiA3IDE2IAorMTEgOCAxNSBeCiszMiAxIDcgMTYgMTcgMTcgNCAxIDEzIDE1IDUgMSA1IDYgMTQgMTUgMSA1IDEgOSA5IDE3IDEyIDEzIDEyIDcgMTIgMyA3IDE1IDQgMTYgCisxMiAxMyBeCiszNiAwIDggMTcgMSAxMSA0IDEwIDIgNiAxMCAzIDE2IDE2IDIgNyAxMyA5IDE1IDcgMTcgMTQgMyAxMCAxNiAxMyA2IDcgNSAyIDEgNCAKKzE2IDMgMTAgMSAxNSA1IF4KKzMyIDAgNCA2IDQgMTUgMTEgNCAyIDE3IDkgMTUgNSAxMCA3IDEyIDE1IDE2IDE1IDE3IDEyIDE0IDkgMiAxMyA0IDkgMiA0IDE1IDIgMTEgCis5IDE2IF4KKzI5IDAgNCA0IDMgMTcgMiAxNCAxNyAxNyAxIDE3IDEzIDExIDE1IDE3IDQgOSAxNSA4IDExIDE2IDkgMTAgOCA5IDEyIDE1IDEgMTcgMTEgCiteCiszNSAwIDE2IDQgMiAxNCAxNCAxNSAxIDIgMTIgOSAxIDEwIDE2IDEwIDExIDcgMSAxMiAxNyA4IDIgMTUgMTEgMSA3IDE3IDEyIDcgMyA3IAorNiA5IDkgMTQgNiBeCiszNiAwIDIgMTUgMTcgMTAgMTEgOSA1IDkgNCAxNyAxNiAzIDExIDIgMTAgMTIgMTEgNSAzIDggMTcgMTUgMyAzIDQgNyAyIDEgMTAgNyAKKzE0IDQgMTYgNiAxMiA4IF4KKzM2IDEgMTIgMTQgNiA5IDMgMTcgMTEgMTAgNiA4IDE0IDYgMTEgNyAxMCA4IDYgMTcgNCA0IDkgOCAyIDggMTQgOCA3IDE0IDEgMyA2IDggCisxMSAxMCAxNyAxIF4KKzM5IDEgMTIgMTQgOSA0IDExIDcgNiA2IDEzIDE0IDIgMTMgMSAxNCA5IDcgNyAxNSAyIDIgNSAxNSAxMyAxNyAzIDE1IDE2IDkgMSAxIDIgCiszIDIgMTIgMSAzIDMgMTMgOSBeCiszNCAwIDEzIDEwIDE1IDUgOCAxMCAxNSAxMCA4IDcgNSA1IDE0IDQgMTMgMTEgMTIgNCA0IDEyIDEwIDEzIDEyIDQgMTAgMyAzIDcgOSAKKzEzIDE2IDkgMTcgMSBeCiszNiAwIDQgMTIgMSA5IDEyIDEzIDUgMTAgMSAzIDE1IDQgMSAxMyAxNyAxIDggOSA2IDEyIDQgNyA3IDEwIDE3IDEzIDE3IDYgMTcgOSA2IAorOSAzIDUgMTcgMTAgXgorMzQgMCAxIDQgMTAgMTIgMTcgMTQgMTEgOCA1IDE2IDUgNSAyIDEzIDEzIDE2IDkgMTMgMTAgOSA5IDUgMyAxMyA2IDQgMyA5IDE1IDE0IAorMTQgNyAzIDE2IF4KKzM4IDEgOSAxNyAzIDYgNSAxNiAxMCAxNCA5IDEgMTYgNyAzIDUgNCAxNyAxNCA3IDEyIDYgMiA4IDggMTcgNyAyIDQgNSA3IDEyIDIgMSAKKzcgMTEgMyAxNCA5IDE1IF4KKzQxIDAgMiAxMiAzIDQgMSA0IDEgMTYgMTAgNSAxNiA4IDcgMiAxMCAzIDUgOSAxNiA4IDE2IDEzIDMgMTIgNSA1IDExIDIgMiA3IDQgMiAKKzggMTYgNCAxNCA1IDE0IDEwIDQgMTcgXgorMzYgMCA2IDEgMiA3IDEgMTUgMTMgMSAxNyA0IDcgNCA4IDE3IDE2IDE2IDExIDE0IDIgMTAgMTQgMTUgMTAgOSAxIDE0IDEwIDE0IDYgNiAKKzE2IDMgMiAzIDggMTQgXgorMzIgMSAxMiA4IDExIDE3IDMgOSA3IDE2IDE0IDQgMTEgMTUgNSAxMyA5IDUgMTIgMTcgMTcgMTMgOCAyIDYgOCAxNiAxIDEyIDUgMTcgMiAKKzkgMTQgXgorMjkgMCAxMCAxMyAxNCAxMSAxNyAxMiA1IDE0IDkgMTEgOSAxMSA0IDExIDEzIDE2IDYgMTAgNSA4IDMgMTcgMTYgMTQgMSAxNSAxNSAxNSAKKzE0IF4KKzMyIDAgMTMgMiAxMSA2IDEzIDExIDEzIDQgNiA3IDExIDExIDEyIDE2IDEzIDEgMTYgMTYgMTQgMTYgMiA0IDE2IDExIDYgMTUgNyA0IAorMTcgNiA1IDE1IF4KKzM1IDEgNiAzIDE0IDE2IDUgMTcgMTEgMTMgMSAxIDE0IDEzIDMgNiAxNCA1IDE3IDUgNCA4IDE0IDMgMTYgNyAxMyA0IDE0IDggOSAzIDggCisxMiA4IDE1IDExIF4KKzMzIDEgNiA2IDEgNSAxMyAxNiA1IDggNCA2IDEwIDYgMTEgMTYgMTcgMTUgMTUgMTIgNCAxMyA1IDMgNCAxMCAxNSAxMiA3IDE1IDE2IAorMTIgMTIgMTEgMTEgXgorNDAgMCAxMyAxNCA1IDggMSAxMSAxMCA5IDMgMTQgMyAxIDkgNiAxNSAxMiAxNiA0IDUgOSA3IDEgOSA0IDggNSA3IDkgMTYgMTEgMTEgNiAKKzEzIDcgMSA3IDggMSAxNCAxMCBeCiszNCAwIDIgMTAgMTUgMTAgMTQgOCAxOCA5IDkgMTIgMTIgMyAxMyAxMiA2IDQgOSAxNyAxMyAxMyA1IDcgMyAyIDEgMTcgMTQgNCAxNiA2IAorMTMgMSAxMyAxMyBeCiszNSAxIDYgMTAgMSAzIDE4IDMgMTEgNyA5IDUgNyAxMSAxNyAxIDkgMTYgNSAxNSAxMCAxNyAzIDggMTUgMTcgOCAxNSAxMSAzIDE1IDE3IAorMTEgMSAxIDQgMTUgXgorMzYgMSAxNCAxOCA0IDIgMTggOCAxNSA2IDQgNiAzIDE1IDExIDE2IDEwIDE3IDE3IDkgNiAzIDIgNiAxNiA0IDkgMTIgNiA4IDEgMTEgMyAKKzIgMTIgMiAxNCAxNiBeCiszNyAwIDQgMSA1IDExIDE2IDE4IDE2IDggMTEgMTUgMiAxOCA3IDUgMTQgNSAxNSAxMyAzIDMgNSA0IDMgMTEgNCA0IDUgMTAgMyAxMiAKKzE3IDEgNCAxNyAxMCAxMCAxNyBeCiszNSAwIDEgMyA0IDIgMSAxMiA1IDE0IDExIDEwIDQgNiAxNCA5IDEgNSA4IDIgOSAxNSAxMiAxMyA3IDE2IDIgMTMgMTcgMTUgOSAxOCAKKzE1IDkgMTMgMTYgMTcgXgorMzQgMSAxOCAxMCA0IDExIDEzIDkgNiAxIDE3IDYgOCA2IDUgMTEgNSAxNCAxNiA5IDEzIDExIDEwIDkgMTUgNCAxNCA3IDE0IDMgMSAxNSAKKzUgNSAxOCAxNiBeCiszNCAwIDEzIDggMTMgMTYgNSAxNyA1IDEwIDEgOCA4IDEyIDYgMTMgMTggOSA2IDE3IDMgMTYgMiA4IDkgOCA3IDIgMTQgMTQgOCAxMCAKKzEzIDkgMTEgMTEgXgorNDAgMCA3IDExIDQgNiA5IDEwIDExIDEyIDIgMTQgMSAxMyAxIDcgMSAxNSA3IDkgOCAyIDEgNCA5IDE0IDE3IDggMTcgMTUgMyA0IDE1IAorMTUgMiAyIDMgMTYgMTMgMiA5IDEyIF4KKzMzIDAgMTQgNiA2IDUgMiAxMyA0IDE2IDExIDMgMTAgMTggMiAxNSA1IDkgNCA4IDQgMTggMTggMTcgMTggMyAxNCAxMiA5IDExIDE1IAorMTYgMSA5IDE2IF4KKzMyIDEgMTggNSAxMCA2IDcgMTcgNyAxMiAzIDEzIDggMTIgMyA4IDkgMyAxNyAxMiA4IDE4IDYgMTQgMyA2IDE0IDE0IDEwIDE0IDEzIAorMTcgMTggOCBeCiszNiAxIDE4IDEyIDE3IDkgMTcgMiAxMiA1IDkgMTIgMSAxOCAxMCA1IDUgMiAxOCAzIDYgMTYgMTggMyAxIDIgMTAgMTUgMiA1IDggMTYgCisxMCAxNCAzIDkgOCAxMyBeCiszMyAxIDE2IDE0IDEgMTYgMTUgMTYgMTcgNCAxMiAxMiAxNiA1IDMgOSAxNCA1IDcgMTcgMTIgMTEgMTIgMTggMTQgMiA3IDcgMTUgOCAzIAorNSAxIDggMTMgXgorMzQgMSA3IDYgNyAxNCA5IDE1IDE1IDE4IDE2IDMgMTAgNSAxNiA2IDggMTEgNCAxIDEwIDEgMTYgNCAxMiAxNyAxNSAxNCA4IDUgNCA2IAorNCAxNyAxNiAxNiBeCiszOCAwIDQgNSAxOCAxOCAxMiA5IDMgOSA2IDkgNyA2IDEwIDE1IDQgOSAxNyA1IDE3IDUgNiAxIDYgMiA4IDE3IDcgNyA0IDQgMTMgMTYgCiszIDQgMTAgMTYgMTIgMTMgXgorMzMgMCAxNiA3IDE4IDMgMyAxMSA5IDEzIDE0IDE1IDE4IDIgMTIgMTAgMyAxNSAzIDEgMTAgNiAxNSAxMyAxNyAxMyA1IDkgNyAxMSA5IAorNSAxOCAxNSAxMiBeCiszMyAxIDE2IDExIDEgNiAxOCAxMyA4IDEgMTggOCAxIDUgMTMgMSAxOCA1IDE1IDE1IDE2IDEyIDEzIDIgMTcgMTIgMTQgMTcgOCAxIDEwIAorMTIgMTAgNCAxOCBeCiszNCAwIDUgNiAxOCAxOCA3IDEwIDEzIDE0IDEwIDEyIDcgNCAxMCA4IDE2IDE2IDE1IDUgMTMgMTQgNCAxNCAyIDQgMTIgNiAxMSA1IDE3IAorOCA1IDEgMTQgMTYgXgorMzEgMSAxNyA5IDExIDIgMTEgMTEgMyAxMyAxMyAxMSAxMiAxMyA1IDEyIDEyIDExIDYgMTMgNCAxOCAxNSAxMiAxOCA2IDYgNyAxNSAxMyAKKzEyIDE0IDE2IF4KKzM4IDEgNCAxMSAyIDUgNiAxMiAxMCAyIDcgMTUgMTEgOCAxNCA3IDE2IDE2IDEgNCAzIDkgMTQgMTYgMyAxOCAxIDcgMTcgMSA3IDMgMTYgCisxNyA2IDE2IDEyIDUgMyAxNyBeCis0MCAxIDEwIDE1IDE4IDEwIDggMTAgMiA1IDExIDIgNyAzIDUgNiA3IDEgMTIgMiA5IDIgNCAxNSAxIDExIDExIDE3IDMgMyAxNiA4IDMgCisxMSAxOCAxNiAxMSA2IDE1IDggOCAxMyBeCis0MCAxIDEwIDMgMTcgNyAxMCAxOCAxMyAxNCA4IDcgOCAxNCAyIDIgOCA2IDMgNyA1IDYgOSA1IDEyIDEwIDcgNiA1IDE2IDQgMTQgMiAKKzE1IDMgMTUgOSAxNSAxIDkgNyAxMiBeCiszNSAwIDE0IDE1IDEyIDcgMiAxNiAxOCA4IDE4IDEgMTMgMTIgMSAxIDE0IDE0IDEzIDMgMTQgNyAyIDEwIDEwIDExIDE0IDMgMTIgNSAKKzEzIDYgMTcgMTQgMSAxMSAxMyBeCiszNCAwIDcgMTIgOCAxMiAxNyAxNyAxOCAxNyAxMyAyIDQgNyA1IDEgMTUgNyAxNCAxNyAxMSA2IDEwIDkgMTggOSAxNCAxMyAzIDggNCAKKzEzIDggNyAxMyA3IF4KKzM1IDAgNCAxNiA4IDE3IDEwIDIgMTMgMTAgMiAyIDYgMiAzIDE4IDE3IDIgMTcgNCAxOCA3IDE2IDE4IDE0IDQgMTEgNyA0IDE1IDE3IDYgCisxMSAxMSAxNCAxNyA0IF4KKzM3IDAgMTAgMTcgMTYgMTMgMTUgMTQgNiAxIDE0IDExIDggMTYgNiAyIDE2IDEzIDcgOCA2IDIgMTUgMSA5IDEyIDQgNCAxMSAxMyA3IDIgCisxMSA5IDE4IDQgNSA0IDE4IF4KKzM5IDAgMiAxNCA5IDkgMSA4IDEzIDExIDE1IDggNSA5IDEwIDE2IDkgMiA3IDEgMSAxNyAxMyA2IDExIDEwIDggNSAxMiAxNSA2IDE1IAorMTAgMTIgNCAxOCAxIDIgOCAxMSAxNSBeCiszMiAxIDE2IDEwIDEyIDE4IDExIDE2IDEyIDExIDE3IDE3IDQgNyAxMyA3IDEwIDcgMTAgNiAxIDEyIDcgMTggMTEgMTggMiAxMCAxNSAKKzEwIDE0IDggMTggMiBeCis0MCAxIDkgMTIgMTIgMyAxMyAxMiA2IDQgOSAxNyAxMyAxMyA1IDcgMyAyIDEgMTcgMTQgNCAxNiA2IDEzIDEgMTMgNiA2IDEwIDEgMyAKKzE4IDMgMTEgNyA5IDUgNyAxMSAxNyAxMiBeCiszNiAxIDkgMTYgNSAxNSAxMCAxNyAzIDggMTUgMTcgOCAxNSAxMSAzIDE1IDE3IDExIDEgMSA0IDMgMTQgMTggNCAyIDE4IDggMTUgNiA0IAorNiAzIDE1IDExIDE2IDggXgorMzkgMSAxNyAxNyA5IDYgMyAyIDYgMTYgNCA5IDEyIDYgOCAxIDExIDMgMiAxMiAyIDE0IDEyIDQgMSA1IDExIDE2IDE4IDE2IDggMTEgCisxNSAyIDE4IDcgNSAxNCA1IDE1IDEwIF4KKzQ3IDEgMyAzIDUgNCAzIDExIDQgNCA1IDEwIDMgMTIgMTcgMSA0IDE3IDEwIDEwIDkgMSAzIDQgMiAxIDEyIDUgMTQgMTEgMTAgNCA2IAorMTQgOSAxIDUgOCAyIDkgMTUgMTIgMTMgNyAxNiAyIDEzIDE3IDMgXgorMzQgMSA5IDE4IDE1IDkgMTMgMTYgMTggMTAgNCAxMSAxMyA5IDYgMSAxNyA2IDggNiA1IDExIDUgMTQgMTYgOSAxMyAxMSAxMCA5IDE1IAorNCAxNCA3IDE0IDkgXgorMzcgMSAxIDE1IDUgNSAxOCAxMyAxMyA4IDEzIDE2IDUgMTcgNSAxMCAxIDggOCAxMiA2IDEzIDE4IDkgNiAxNyAzIDE2IDIgOCA5IDggNyAKKzIgMTQgMTQgOCAxMCAxMyBeCis0MiAwIDkgMTEgMTAgNyAxMSA0IDYgOSAxMCAxMSAxMiAyIDE0IDEgMTMgMSA3IDEgMTUgNyA5IDggMiAxIDQgOSAxNCAxNyA4IDE3IDE1IAorMyA0IDE1IDE1IDIgMiAzIDE2IDEzIDIgMTcgXgorMzYgMCAxNiAxNCA2IDYgNSAyIDEzIDQgMTYgMTEgMyAxMCAxOCAyIDE1IDUgOSA0IDggNCAxOCAxOCAxNyAxOCAzIDE0IDEyIDkgMTEgCisxNSAxNiAxIDkgMiAxOCA2IF4KKzMzIDEgMTAgNiA3IDE3IDcgMTIgMyAxMyA4IDEyIDMgOCA5IDMgMTcgMTIgOCAxOCA2IDE0IDMgNiAxNCAxNCAxMCAxNCAxMyAxNyAxOCAKKzE0IDE4IDEyIDEzIF4KKzM5IDEgOSAxNyAyIDEyIDUgOSAxMiAxIDE4IDEwIDUgNSAyIDE4IDMgNiAxNiAxOCAzIDEgMiAxMCAxNSAyIDUgOCAxNiAxMCAxNCAzIDkgCis4IDEwIDE2IDE0IDEgMTYgMTUgMTQgXgorMzAgMSAxNyAxOSA1IDcgMTQgNCAxMSAzIDYgMTggMTMgNyAxOCAxOCAxOSAxOSAxMyA5IDEwIDE5IDE0IDEyIDQgMTUgMTUgMTggMiAxMCAKKzcgMTUgXgorMzQgMSAyIDEzIDggMTkgMTUgMSAxMSAxNCA3IDcgMTcgNiAxNiA0IDE2IDE3IDIgMTggMTIgNSAxNCAxOSAxNyAxIDggMTIgNiA2IDYgCisxOSAxMyAxMCAxNiA1IF4KKzM2IDEgMTQgMTMgNiAxNiAxNCAxNSA0IDEzIDE1IDQgNCAxMSA0IDEwIDMgMTcgNCAxOSA2IDE3IDE0IDMgMiAxNiAxIDE0IDE2IDUgMTcgCis4IDEgMSAxOSAxMyAxMiAxMiBeCiszNCAwIDE3IDExIDEzIDUgMTkgMTEgMTggMTkgMSAzIDEyIDExIDggNCAxMSAxMyAxNyAzIDggOSA0IDUgMTIgMTUgMTIgNiA3IDE2IDE2IAorMTIgMSAxMyAxNyAxNSBeCis0MCAwIDE4IDkgMyAxNiAyIDE2IDQgMTkgNiA2IDE4IDMgMTMgMSA1IDMgMiA2IDE1IDExIDYgNCAxNCAxNSAxNSA5IDEzIDggMSA5IDE1IAorMiA3IDUgMTEgNSAxMiA3IDE2IDE1IF4KKzM3IDAgMTggNCAzIDEgNCAxMSAxNSA3IDYgOSAxIDE0IDcgMSAxNyAxNyAxNiAxNCAxMyAxNCAxMiAxNCA5IDEyIDExIDE4IDcgMTQgMyAKKzEgNiAxIDE1IDggMTUgMTkgOSBeCiszMiAwIDMgOSA5IDcgNyAxMCAxMiAxMyA3IDExIDEyIDE2IDkgOSA5IDE3IDEzIDEzIDIgMTcgMTAgNCAxOCAxNyAxOSAxNiAxMSAxMSAKKzEzIDE4IDEzIDEyIF4KKzM1IDAgOCAxNSAxOCAxMCA2IDEwIDE4IDE3IDkgMiAxNCAxIDE3IDE4IDYgMTQgMTIgNSA1IDE1IDE3IDEwIDMgOCA4IDEgMTAgNSAxIAorMTggMTggOSAxNiAxMCAxNCBeCiszOCAxIDYgMTYgMSA2IDMgNSA4IDE2IDggNyA1IDE4IDExIDE1IDE3IDYgMTEgMTAgNCA4IDE0IDE2IDYgNyA4IDEyIDEyIDE4IDEgMTAgCis0IDcgMSAxOSA3IDE5IDE1IDEyIF4KKzM0IDAgMSAxNCA2IDExIDE4IDUgNCAxMiA2IDE0IDIgMTkgMiA1IDEzIDEwIDEwIDIgMTYgMTAgMTggMTYgMTkgMiAxNSAxMCA3IDE4IAorMTYgMTcgMTUgMTUgOSAxMyBeCiszOCAxIDEwIDE2IDQgMTUgNyA1IDE5IDEgMTUgMTYgMTEgMTkgOSAxOCAyIDQgNiAxMiA5IDggNyAxMyAxNCAxMSA0IDEyIDEzIDUgOSA2IAorNSA2IDE2IDExIDkgMyAxNSA2IF4KKzQwIDAgMTYgMSAxMyA2IDggMTggMTEgMTEgMiAxIDIgMiAxNCA5IDEzIDEgMTUgNiA1IDE2IDE5IDE0IDE5IDcgMTggNSAyIDIgMyAxMyAKKzEzIDEyIDEzIDExIDIgMTIgMiAxMiAxOCA1IF4KKzM1IDAgNyA4IDEzIDYgOSA4IDE3IDEwIDExIDEgOSAxNCA0IDE5IDE5IDMgMTUgMTMgOSAxOCAxMiAxNyAxIDE2IDggOSAxNSAxIDEyIDQgCis0IDE5IDE4IDEzIDExIF4KKzM2IDEgMTQgMTggOCAxNCA5IDMgNCAxOCAxNiA5IDE5IDEyIDMgMTcgNSAxMCAxNiA1IDggNCA0IDEwIDE0IDEzIDQgOSAxMSAxOSA4IDggCis1IDEgMTMgMTYgMTQgMTMgXgorNDEgMSAxMCAxNSAzIDQgOCAyIDEyIDkgMTYgMyAxNiAzIDYgMTcgMyAxMCAxOSA3IDYgMSA1IDExIDE4IDkgNCA2IDIgMTUgMTEgMTcgCisxNyAxNyA0IDEwIDEzIDMgNyAxMCAzIDkgMTQgXgorNDIgMCA3IDkgMyAzIDggMTkgMTAgOCAyIDE5IDEyIDE5IDEzIDYgMTkgMyA0IDE3IDYgOSAxIDcgMiA5IDcgMTggNiAxNSAyIDIgNCAzIAorMTAgMTEgMTEgNiAxMiAxMCAxOCA0IDEyIDEwIF4KKzM1IDEgNCA1IDExIDEyIDE1IDE5IDEyIDEwIDYgMTUgMTQgMTkgMTggMTEgOCAxMSAxNyAxNiA3IDcgMTEgMiAxMCA2IDE5IDUgMTQgNyAKKzEgNyAzIDE5IDQgMTcgMTUgXgorMzYgMSA1IDEwIDIgMTggMSAxNyA4IDEyIDE3IDIgOSA4IDggMyAxNCAxMCAxNSAyIDE0IDggMyAxIDE2IDE4IDEyIDE4IDExIDE2IDcgCisxNyA1IDE5IDIgMTkgMTIgMTkgXgorMzcgMCAxNiAxNCAyIDkgMTYgMiA2IDYgNyA5IDEwIDkgMTEgOSAxNCAxMSAxNSA1IDE2IDkgMiAxNyAyIDggMTUgOCA0IDMgMTQgMTQgCisxNiAxNiAxMyAxMSAxMCAxNiAxNCBeCis0MCAwIDExIDcgMTQgMTQgMTQgNiAxMCAxMCAxIDYgMTMgMTkgNSA2IDQgNyAxMiAxMiAxMCA1IDEwIDE1IDE1IDggNSAxMyAxNyAxMyA1IAorNiAxNCAxIDkgMiA2IDUgMTcgOSAxMSAxMyBeCiszOCAwIDE4IDggNiAxMyAxNSAzIDMgMTUgNSAxMyAxOCAzIDIgNSA1IDE0IDcgMTMgNCAxNyA3IDIgMTcgMyAxOCAxNSA3IDE1IDE2IDE4IAorNSAxMiA4IDYgMyAxNyAxMiAxMyBeCiszOCAxIDE5IDE1IDkgNyAxNyAxNiAxNSAzIDExIDExIDUgMiAxMyAxOSAxNiAyIDQgMTYgNyA4IDEgMiA5IDE3IDEyIDMgNSAxOCAxOSAKKzExIDE3IDkgMSA0IDEgMTggMTAgMTAgXgorNDEgMSAxMyAxIDcgMTMgNSA3IDQgMSA4IDEzIDE2IDMgNSA3IDYgOCA4IDE0IDggMTMgNyAxOSA4IDE2IDE4IDQgMiA4IDcgMTIgNCAxNCAKKzUgMSAzIDE5IDE3IDExIDE0IDE1IDE5IF4KKzM5IDAgMTAgOSAxMiAxOSAxMSAxMCAzIDE4IDE0IDE3IDE4IDE3IDcgMTIgMTQgOCAxMSA3IDIgMTAgMTcgMTUgNSAzIDEyIDMgMTIgMSAKKzIgMSAxIDEyIDE0IDEwIDIgOCAxNyAxOCAyIF4KKzQ1IDEgNCA5IDQgMTYgNSAxOCAxIDEgMTAgMTAgMTEgMyAxMCAxMiAxIDMgMTEgMSAxMSA1IDMgMyAxNiAxNSAxMCAxNyAxNCAxNSA2IAorMTMgMTIgMiAzIDE0IDMgOSAxOSA0IDQgOCAxMCAxNCA1IDExIDkgXgorMzUgMCAyIDcgMTUgMTQgOCAyIDExIDE5IDE5IDQgNSAxMCA4IDkgNSAxNSA5IDE3IDE5IDUgNyAxNCA0IDExIDMgNiAxOCAxMyA3IDE4IAorMTggMTkgMTkgMTMgMTMgXgorMzUgMSAxMCAxOSAxNCAxMiA0IDE1IDE1IDE4IDIgMTAgNyA5IDIgMTMgOCAxOSAxNSAxIDExIDE0IDcgNyAxNyA2IDE2IDQgMTYgMTcgMiAKKzE4IDEyIDUgMTQgMTkgOSBeCiszOCAxIDEgOCAxMiA2IDYgNiAxOSAxMyAxMCAxNiAxMyAxNCAxMyA2IDE2IDE0IDE1IDQgMTMgMTUgNCA0IDExIDQgMTAgMyAxNyA0IDE5IAorNiAxNyAxNCAzIDIgMTYgMSAxNCAxOSBeCiszOCAwIDUgMTcgOCAxIDEgMTkgMTMgMTIgMTIgMTcgMTEgMTMgNSAxOSAxMSAxOCAxOSAxIDMgMTIgMTEgOCA0IDExIDEzIDE3IDMgOCA5IAorNCA1IDEyIDE1IDEyIDYgNyAxNiAxMSBeCis0MyAwIDEyIDEgMTMgMTcgNCAxOCA5IDMgMTYgMiAxNiA0IDE5IDYgNiAxOCAzIDEzIDEgNSAzIDIgNiAxNSAxMSA2IDQgMTQgMTUgMTUgCis5IDEzIDggMSA5IDE1IDIgNyA1IDExIDUgMTIgMTYgXgorMzkgMSAxNiA2IDE4IDQgMyAxIDQgMTEgMTUgNyA2IDkgMSAxNCA3IDEgMTcgMTcgMTYgMTQgMTMgMTQgMTIgMTQgOSAxMiAxMSAxOCA3IAorMTQgMyAxIDYgMSAxNSA4IDE1IDE5IDEyIF4KKzM1IDAgMyA5IDkgNyA3IDEwIDEyIDEzIDcgMTEgMTIgMTYgOSA5IDkgMTcgMTMgMTMgMiAxNyAxMCA0IDE4IDE3IDE5IDE2IDExIDExIAorMTMgMTggMTMgOCA4IDE1IDYgXgorNDAgMCAxMCA2IDEwIDE4IDE3IDkgMiAxNCAxIDE3IDE4IDYgMTQgMTIgNSA1IDE1IDE3IDEwIDMgOCA4IDEgMTAgNSAxIDE4IDE4IDkgCisxNiAxMCAxOSA2IDE2IDEgNiAzIDUgOCAxNiBeCis0MCAwIDggNyA1IDE4IDExIDE1IDE3IDYgMTEgMTAgNCA4IDE0IDE2IDYgNyA4IDEyIDEyIDE4IDEgMTAgNCA3IDEgMTkgNyAxOSAxNSAyIAorMSAxNCA2IDExIDE4IDUgNCAxMiA2IDE5IF4KKzM1IDAgMiAxOSAyIDUgMTMgMTAgMTAgMiAxNiAxMCAxOCAxNiAxOSAyIDE1IDEwIDcgMTggMTYgMTcgMTUgMTUgOSAxNSAxMCAxNiA0IAorMTUgNyA1IDE5IDEgMTUgMTYgNiBeCis0MyAxIDE5IDkgMTggMiA0IDYgMTIgOSA4IDcgMTMgMTQgMTEgNCAxMiAxMyA1IDkgNiA1IDYgMTYgMTEgOSAzIDE1IDEyIDE2IDEgMTMgCis2IDggMTggMTEgMTEgMiAxIDIgMiAxNCA5IDEzIDExIF4KKzM5IDEgMTUgNiA1IDE2IDE5IDE0IDE5IDcgMTggNSAyIDIgMyAxMyAxMyAxMiAxMyAxMSAyIDEyIDIgMTIgMTggNyA4IDEzIDYgOSA4IAorMTcgMTAgMTEgMSA5IDE0IDQgMTkgMTkgMyBeCiszNCAxIDE1IDEzIDkgMTggMTIgMTcgMSAxNiA4IDkgMTUgMSAxMiA0IDQgMTkgMTggMTMgMTUgMTQgMTggOCAxNCA5IDMgNCAxOCAxNiA5IAorMTkgMTIgMyAxNyAxNSBeCis0NSAxIDEwIDE2IDUgOCA0IDQgMTAgMTQgMTMgNCA5IDExIDE5IDggOCA1IDEgMTMgMTYgMTQgMSAxMCAxNSAzIDQgOCAyIDEyIDkgMTYgCiszIDE2IDMgNiAxNyAzIDEwIDE5IDcgNiAxIDUgMTEgMTggMiBeCis0MyAxIDE1IDQgMTMgMTQgMyA0IDEgMyAxIDUgMTEgNCA5IDcgMjAgOCAxNSA0IDE2IDcgMTkgMTEgMSAxMSAyIDEzIDEzIDExIDEyIDEzIAorMTUgMTIgMSA1IDEzIDMgOCAxNSAxMiA4IDE2IDE2IDYgXgorNDQgMCA1IDEzIDEyIDE0IDUgMyAxIDQgMTYgMTIgMjAgMSA2IDE1IDExIDE4IDQgMTcgMTYgNiAxMCAzIDIgOSA5IDE0IDYgMiA4IDYgNyAKKzEwIDE3IDEyIDIwIDYgNyA1IDE2IDEgNCAyIDE3IDkgXgorMzggMCAxNSA4IDIwIDE4IDIwIDExIDE1IDExIDExIDkgNiAyIDE1IDUgMTcgMTIgMSA5IDEgMyA1IDExIDcgMiAyIDYgMTggMiA5IDExIAorOCAxNiAxMSAxNiAxNSAxOCAxOCAxOCBeCiszNSAxIDIwIDIgMTcgMTcgMTAgOCAxMyAyMCA0IDE4IDYgMTggOSA0IDEgMSAxOCA1IDIgMTcgMTUgMTYgMTkgMTUgMSAxMCAxNyAxNiA0IAorMTYgMTQgMTQgMTEgMTUgMTAgXgorMzggMCA1IDkgMTUgMTAgOSAxNyAxOCAxNCAxNSAxMiA2IDEgMTYgOCAxOCA4IDEzIDEyIDEwIDE0IDE0IDEzIDkgMiAxNCAxNyA5IDEgCisyMCAxMCA0IDIgMTIgOSA0IDEzIDE2IDUgXgorMzYgMCAxNCAxMCAxMSAxNiAxNyAxMiAxOCAxMiA3IDE3IDggNyAzIDEgMyAxNyA0IDkgNSAxNyAxNCAxNyAxMSA1IDIwIDE5IDggMTkgCisxNCAxMyAyIDE4IDMgMyAxOCAxMyBeCis0MSAxIDEzIDggMTQgNiAxOCA3IDEwIDEgMTMgMTAgMTEgMTEgMTYgMSAyIDggNyAxIDcgMTQgOCAxNyA2IDggNCAzIDExIDE3IDMgNSA3IAorMTYgMTEgMTEgMTQgNyAxMyAyMCAyMCA3IDIwIF4KKzQwIDEgMTMgMTUgMTQgMTYgMTQgOCA5IDE2IDUgMSA2IDMgMTcgMTggMTYgOSAxIDE1IDkgMTAgOSAxOSAxIDMgMyAyMCAxMSAxMyAxNyAKKzEgMTkgOCAzIDQgMyA3IDEgMTQgMTkgMTcgXgorMzcgMSAxOCAxMyAxMSA1IDE4IDQgMTkgMTAgNiAxOSAxMSAxNyAxMCAxMCA3IDkgMTMgMTYgOSAxMCAxOCA0IDEyIDUgMTYgNSAyMCAxMiAKKzMgOCAxMCAxIDE4IDEgNiAyMCAxNCBeCiszNiAwIDggOSA2IDEyIDExIDcgNyAzIDE3IDEzIDYgMjAgMTcgOSAyMCAxNiAxMCAxMiAxNyA4IDExIDggMTEgMTAgNSAxMCAxNCAxOCA4IAorMTkgOSAxMiAxMiAyIDIwIDEyIF4KKzM4IDAgMTIgMTYgMjAgMyA5IDkgMTkgMTcgMTMgMTMgNCAxNyAyIDExIDcgMTQgMyA2IDE2IDEzIDEwIDEzIDUgMTYgMTAgMiA4IDIgMTcgCisxOSA0IDE3IDcgMTkgNiA5IDE1IDcgXgorNDEgMSAyMCA3IDIgMTggNSA3IDE4IDUgMiAxNSA3IDExIDEwIDkgMyAyIDE0IDE5IDMgMTEgOCAxOCAxNSA1IDMgNSAxMiAxNSAxNiAxMCAKKzE3IDcgMTkgMTYgMiAxIDE2IDYgMyAxOSAxMCBeCis0NiAwIDUgMTggOSA5IDExIDIgMSAxMiAxMSAxNCAxMiAxNCAxMCA0IDExIDYgOCAxNiA3IDUgMTEgMjAgOCAxNyA0IDE0IDQgMTUgMyAyIAorMiA0IDMgMiAzIDE0IDE1IDEwIDIgMTIgNyAzIDcgMjAgMjAgNSBeCis0MSAxIDEwIDIgMyAxIDEwIDEyIDE1IDE0IDExIDIwIDMgMTYgMTQgOSA0IDE4IDEgMTkgMjAgOSA1IDEyIDEzIDYgNiAxIDkgMTMgNyAKKzE1IDkgOCA1IDE5IDMgMTYgOSA4IDEwIDIwIDggXgorMzkgMSAxMSAxMyAxOSA1IDcgMTYgMTggMTYgNCA0IDQgNiA5IDEzIDEwIDE5IDE1IDMgMTQgNiA0IDEyIDEwIDE1IDE1IDQgOCAxMyAxMyAKKzkgMTggMTMgNiA0IDcgMjAgNCAyMCA3IF4KKzMxIDEgMTggMTggMTIgMTYgMTMgMTkgMTkgNSA3IDIgNiAxMSAxOCA5IDE4IDYgMTEgMTQgMTQgMTggMTAgMTMgMTkgMjAgMTcgMTEgMTQgCis1IDE5IDIwIDEzIF4KKzQ2IDEgMjAgMSAxIDQgMTMgMTAgNiA1IDYgMTkgMTggMSAzIDkgMTQgMjAgNyAxOCA3IDE1IDIgMyAxNSA1IDEgMSAyIDYgMTMgMSAxOSAKKzYgMTQgMTYgNSAxNSAxMSAxMyAzIDYgMTEgMiAyMCA4IDEgMjAgXgorMzcgMCA0IDIwIDE5IDMgMTggMyA4IDE5IDcgOCAxMiAxNCAxMiAxOSAxMSAxNSA2IDE5IDEgMTkgNCAxMCAxNiAxNyA3IDE3IDEgMiAxMyAKKzE4IDEyIDIgMTggMTkgMiA3IDE1IF4KKzQyIDEgOSAxOCA4IDUgMTQgMiA1IDQgNCAyMCAxNCAxMyA3IDggMTQgOCAxIDcgMTkgOSA3IDExIDEyIDQgMTkgMTIgMTAgMTkgMjAgNCAKKzQgMSA4IDIgMTYgMTYgOCAyMCAyIDEgMjAgMTMgXgorMzcgMSAxIDE1IDcgNiAyMCAxMCAxNCA5IDEyIDE5IDE4IDIwIDYgMTQgNiA1IDYgMTcgMTQgMTIgMTIgMTYgNCAyIDE5IDE0IDE1IDE3IAorNyAxMiAxMSAxMiA4IDE0IDEgMTcgNyBeCiszOSAwIDE1IDE4IDIgNCAxMCAxOCAxMSAxNyA1IDkgMTcgNCAxOSA1IDUgOCA2IDIgMjAgMTUgNiA1IDE4IDExIDMgMTAgMjAgMTAgMTYgCiszIDEyIDcgNSAxNCAxOCAxNSAxNCA5IDE0IF4KKzQ0IDAgMTQgNyA2IDE1IDkgMyA0IDggOCAxMiAxOSAyIDkgMTYgMTkgNiAxNiAyMCA1IDMgMTkgNyA0IDcgNCA1IDEwIDUgMSAxOCA3IAorMTcgNiAzIDMgMTMgMTYgMiAzIDIwIDE2IDEyIDYgMTYgXgorMzggMCAxNyAxOSAyIDIgMTEgMTkgMTMgNCAxNSA4IDEgMTIgOSAyMCAyIDUgMiAxMCAyMCA1IDE1IDEzIDcgMTMgMTUgMTkgMTcgMTEgOSAKKzE1IDggMTUgMTcgOSA2IDE2IDggMTMgXgorMzggMSAxOCAxMCA4IDggMTAgMTUgMTMgOCA0IDUgMTUgNiAxMiAxMyAxIDE3IDEyIDQgNyAxOCAxMCAxMiAxMCAzIDE1IDIwIDUgMTkgOCAKKzE3IDIwIDEzIDE0IDEwIDkgMTIgMTcgNSBeCis0NiAxIDEwIDE4IDYgNiAxNSA0IDEzIDE0IDMgNCAxIDMgMSA1IDExIDQgOSA3IDIwIDggMTUgNCAxNiA3IDE5IDExIDEgMTEgMiAxMyAKKzEzIDExIDEyIDEzIDE1IDEyIDEgNSAxMyAzIDggMTUgMTIgOCAxNiA2IF4KKzQ1IDEgMTcgNSAxMyAxMiAxNCA1IDMgMSA0IDE2IDEyIDIwIDEgNiAxNSAxMSAxOCA0IDE3IDE2IDYgMTAgMyAyIDkgOSAxNCA2IDIgOCAKKzYgNyAxMCAxNyAxMiAyMCA2IDcgNSAxNiAxIDQgMiAxNyAxNiBeCis0MCAwIDE1IDggMjAgMTggMjAgMTEgMTUgMTEgMTEgOSA2IDIgMTUgNSAxNyAxMiAxIDkgMSAzIDUgMTEgNyAyIDIgNiAxOCAyIDkgMTEgCis4IDE2IDExIDE2IDE1IDE4IDE4IDMgMjAgMTkgXgorMzggMCAxNyAxNyAxMCA4IDEzIDIwIDQgMTggNiAxOCA5IDQgMSAxIDE4IDUgMiAxNyAxNSAxNiAxOSAxNSAxIDEwIDE3IDE2IDQgMTYgCisxNCAxNCAxMSAxNSAyIDUgOSAxNSAxMCAxNSBeCiszOCAwIDE3IDE4IDE0IDE1IDEyIDYgMSAxNiA4IDE4IDggMTMgMTIgMTAgMTQgMTQgMTMgOSAyIDE0IDE3IDkgMSAyMCAxMCA0IDIgMTIgCis5IDQgMTMgMTYgNyAxNCAxMCAxMSAxNiAxOSBeCiszOSAwIDEyIDE4IDEyIDcgMTcgOCA3IDMgMSAzIDE3IDQgOSA1IDE3IDE0IDE3IDExIDUgMjAgMTkgOCAxOSAxNCAxMyAyIDE4IDMgMyAKKzE4IDE3IDEzIDggMTQgNiAxOCA3IDEwIDEyIF4KKzQxIDAgMTMgMTAgMTEgMTEgMTYgMSAyIDggNyAxIDcgMTQgOCAxNyA2IDggNCAzIDExIDE3IDMgNSA3IDE2IDExIDExIDE0IDcgMTMgMjAgCisyMCA3IDE2IDEzIDE1IDE0IDE2IDE0IDggOSAxNiBeCis0MyAxIDUgMSA2IDMgMTcgMTggMTYgOSAxIDE1IDkgMTAgOSAxOSAxIDMgMyAyMCAxMSAxMyAxNyAxIDE5IDggMyA0IDMgNyAxIDE0IDE5IAorMTkgMTggMTMgMTEgNSAxOCA0IDE5IDEwIDYgMTkgNCBeCis0MSAxIDE3IDEwIDEwIDcgOSAxMyAxNiA5IDEwIDE4IDQgMTIgNSAxNiA1IDIwIDEyIDMgOCAxMCAxIDE4IDEgNiAyMCAxMiA4IDkgNiAKKzEyIDExIDcgNyAzIDE3IDEzIDYgMjAgMTcgOSAxNSBeCiszNyAwIDE2IDEwIDEyIDE3IDggMTEgOCAxMSAxMCA1IDEwIDE0IDE4IDggMTkgOSAxMiAxMiAyIDIwIDEzIDEyIDE2IDIwIDMgOSA5IDE5IAorMTcgMTMgMTMgNCAxNyAyIDExIDcgMTYgXgorNDMgMCAzIDYgMTYgMTMgMTAgMTMgNSAxNiAxMCAyIDggMiAxNyAxOSA0IDE3IDcgMTkgNiA5IDE1IDE1IDIwIDcgMiAxOCA1IDcgMTggNSAKKzIgMTUgNyAxMSAxMCA5IDMgMiAxNCAxOSAzIDExIDE0IF4KKzQzIDEgMTggMTUgNSAzIDUgMTIgMTUgMTYgMTAgMTcgNyAxOSAxNiAyIDEgMTYgNiAzIDE5IDEyIDUgMTggOSA5IDExIDIgMSAxMiAxMSAKKzE0IDEyIDE0IDEwIDQgMTEgNiA4IDE2IDcgNSAxMSAyMCAyIF4KKzQ1IDAgMTcgNCAxNCA0IDE1IDMgMiAyIDQgMyAyIDMgMTQgMTUgMTAgMiAxMiA3IDMgNyAyMCAyMCAxOSAxMCAyIDMgMSAxMCAxMiAxNSAKKzE0IDExIDIwIDMgMTYgMTQgOSA0IDE4IDEgMTkgMjAgOSA1IDE4IF4KKzQyIDAgMTMgNiA2IDEgOSAxMyA3IDE1IDkgOCA1IDE5IDMgMTYgOSA4IDEwIDIwIDE0IDExIDEzIDE5IDUgNyAxNiAxOCAxNiA0IDQgNCAKKzYgOSAxMyAxMCAxOSAxNSAzIDE0IDYgNCAxMiAxOCBeCiszNiAxIDE1IDE1IDQgOCAxMyAxMyA5IDE4IDEzIDYgNCA3IDIwIDQgMjAgMTggMTggMTIgMTYgMTMgMTkgMTkgNSA3IDIgNiAxMSAxOCA5IAorMTggNiAxMSAxNCAxNCAxOCAxNSBeCis0MyAxIDEzIDE5IDIwIDE3IDExIDE0IDUgMTkgMjAgMTEgMjAgMSAxIDQgMTMgMTAgNiA1IDYgMTkgMTggMSAzIDkgMTQgMjAgNyAxOCA3IAorMTUgMiAzIDE1IDUgMSAxIDIgNiAxMyAxIDE5IDYgMTkgXgorNDAgMSAxNiA1IDE1IDExIDEzIDMgNiAxMSAyIDIwIDggMSA1IDQgMjAgMTkgMyAxOCAzIDggMTkgNyA4IDEyIDE0IDEyIDE5IDExIDE1IAorNiAxOSAxIDE5IDQgMTAgMTYgMTcgNyAxNyAxNiBeCiszOSAxIDEyIDE5IDIwIDEgMTMgMTIgMTAgOCAyMSAxNSA3IDE5IDEzIDYgOCAxOSAyMCAxOCAyIDEyIDE0IDMgMTAgNiAyIDYgMiAxNyAKKzE2IDIgNSAyMSA1IDE3IDE5IDcgOCAxMSAxNSBeCiszMyAwIDEyIDE3IDE0IDE4IDE1IDE2IDE2IDE2IDEyIDIwIDEzIDIgNSA1IDIgMTAgMjAgMTYgMTIgMTAgMiAxNyAyMSAyMCAxNSAxNCAKKzE0IDE4IDIxIDEzIDkgMTcgMTAgXgorNDAgMSAyIDEyIDE2IDE3IDMgOSAxOSA1IDcgMTAgNSAxMSAxNyAxOCAxNCAxNCAxMiAyIDIwIDE1IDggMTcgMyAyMCAxMSAxMiAxOCA3IAorMTIgNyA5IDggMyAxOCAxNCAzIDUgMTcgOSAxNCBeCis0MyAwIDggMjEgMTEgOCA4IDE2IDIxIDEyIDUgOCA3IDIwIDEwIDE0IDcgMSA5IDUgNCA1IDIgMjEgMTIgMSAxIDkgMjAgMTQgMTEgOSAKKzE5IDE2IDMgMSAxNCAxMCAyIDggMjAgMTggNyA4IDE4IF4KKzQwIDEgMiAxOSA2IDExIDE4IDExIDE1IDYgNSAxNiAxNCA5IDcgMjEgMyAxNSAyMSAxNiA4IDcgMyA2IDE0IDE3IDE3IDUgMTAgMjAgMTAgCisxNSAxMCAxIDE1IDE4IDYgMTAgOSA3IDE2IDYgXgorMzkgMCAxMSAxNSAxMiAyIDkgMSAxIDYgNiAxMyA4IDIwIDYgMTggOCA1IDggMSAxIDE3IDIwIDIwIDE5IDE3IDEzIDE0IDE3IDEyIDUgMyAKKzE4IDIwIDIwIDExIDE4IDE1IDEzIDE2IDcgXgorNDggMSA3IDEwIDEgMTkgMTAgNyAxNyA3IDE2IDMgOCA0IDQgMTUgMTcgMTMgOSAxMSAyIDIgMTEgNyAxMyA0IDE3IDcgMSA1IDEzIDE5IAorMTYgNSAxNCAxNiAyIDExIDE4IDUgMTEgNiA0IDcgMyAxNyAyIDEgMTggMTIgXgorNDEgMSAyMSAxOCAzIDUgMTYgNiAxMSAyIDggOCA3IDE0IDEzIDIxIDYgMTQgMTIgNiAxMiAxOSAxNCAzIDE2IDMgMiA3IDExIDE0IDggCisxNiAxMCAxOSAxMiAxOSA0IDUgNiAxMyAxOSAxMiAxMyBeCis0NCAxIDcgNSAxMiA0IDEzIDIxIDIgNSAxNyAxNSAxNSAxIDEzIDUgMjEgNiA0IDEyIDE0IDE1IDUgMTggMTIgMSAxOSAyIDE0IDEgOCA4IAorMTEgNiAyMCAxMCAzIDIxIDggMjAgMiA0IDEgMTYgMTEgMjEgXgorNDIgMSA1IDMgOCAxNiAxNSA4IDEyIDE0IDIwIDE2IDE4IDcgMiAxOCAyIDE4IDE5IDcgNCAxOSAzIDEgMjAgNyAxNSAxIDQgNSAxMiAxMCAKKzE5IDYgMTEgNCA0IDkgMjAgMjAgOCAyIDIwIDE4IF4KKzQyIDEgMTkgMiA4IDQgMTUgNyAyIDIgNiAxOCAyMCAxNiAxIDE4IDE3IDEzIDMgMTQgMiAxIDIgMTAgMTQgMTkgMTIgOSAxNSAyMCAxIDcgCisxNSAxNyA3IDEyIDE4IDEgMTUgMTQgOCAyMSAyMSA1IF4KKzQzIDEgNyAyMCAxMCAxMSAxMCAxIDkgMjEgNyA1IDEgMTIgMTUgMiA5IDE3IDQgMTMgNSA0IDExIDIxIDE0IDEzIDMgMjAgMjEgMSAzIAorMTIgMTggMTEgNCAxNCAyMCA1IDMgMTQgMTMgMTUgOSAyMSAzIF4KKzQwIDEgMTkgOCAxIDUgOSA1IDkgMTYgMTcgOSA2IDEyIDYgMTYgNyA0IDMgMSAyMSAxNiAxOSAxNSAxOCAxNyAxNyAxNyAyMSAxMyAyMCAKKzkgNiA2IDkgMSAxMyAxNyAyMSAxIDkgMTQgXgorMzYgMCAxMSAxMiAxMyAxOCAxOSAxOSAxNSAxMiAyMCAyIDE2IDEyIDkgMjEgMTcgMTYgOCAyIDE0IDYgNCAxIDYgMTYgMTUgMTkgMTkgCisyMSA5IDEzIDE4IDMgMTYgOCAxMyAxMSBeCis0NyAwIDIxIDE1IDQgMjEgNCAyIDMgOCAxNSAxOSA4IDYgMTYgMiAxNSAzIDEyIDMgMTEgMyAxNyAxMiAyMSA2IDMgNCAxMyAxIDEyIDQgCisxMCAyIDYgNyA2IDkgMTIgMjEgMTAgMTAgMTEgMiAxMyAxOSAyIDE0IDE3IF4KKzQ0IDEgMTEgOCAxMCAxOSAxIDExIDExIDkgMyAxMyAxNSA0IDMgMTggOSAxNCA1IDE1IDE4IDUgNiAxNyAxMSAxOSAyIDQgMTIgOCAxOCAKKzEyIDE3IDMgNCA4IDUgMTkgMTYgMTYgNiAxIDEzIDEgMTggMTggXgorMzkgMSAxMCAxOCAxNSAxMSA1IDEgMTcgNCAxNyAxOSAxMSAxOCAyMSA5IDIgMTAgMTAgNSA1IDIwIDE4IDEzIDUgMTUgMyA2IDMgMTAgCisxMCAxNiAxMyAxMyAxNCAxNiAyMCAxOSAxMSAxNiA4IF4KKzQyIDEgNiA4IDE1IDEzIDExIDEzIDE1IDE4IDExIDIwIDE3IDIwIDQgMTYgMTAgMTQgMSA0IDE2IDQgMTcgOCAzIDcgNyAxOCAxNiAyMCAKKzIgOSA5IDQgMjAgNyAxNiA0IDExIDQgMTAgNiAyMCA0IF4KKzQxIDAgMTcgNiAxOSAxNyAyIDE1IDYgNSA3IDQgOCAxMSAxNiA5IDEwIDE1IDIwIDEyIDE1IDggNiAxNyA1IDkgMyAzIDQgMTkgMjAgMTIgCis1IDE5IDIxIDUgMjEgMTEgMTQgMTkgMSAxNyA2IF4KKzM5IDAgOSA0IDE5IDMgMTcgMSAxNCAyMSAxNCA3IDYgNSAyMCAxNCAyMSAyMCA0IDYgMjEgNyAxMSAyMCAxMiA5IDExIDYgMTYgMTggMTggCisxMCAxMSAyMCA2IDEyIDExIDUgNyAyMSAzIF4KKzQzIDEgMTggNiAxNSAyMSAxMCA0IDE0IDkgMTkgMTAgMyAzIDUgMTMgMSA4IDEyIDMgMTMgOSA3IDEwIDE3IDEwIDYgOCAzIDE3IDE4IDMgCisyMSAxOSA2IDE3IDE1IDQgOSAxNSA5IDE1IDE0IDQgMTggXgorNDUgMSAxNCA4IDEwIDEzIDQgMTEgMTAgNyA2IDIxIDEgMTQgNSAxMSA3IDcgMiAxMyAxMyAzIDkgMTMgOCAxNCA5IDMgNyAxOCA0IDkgOSAKKzUgMTUgMTMgMTcgMTAgMTUgMTYgMjAgOCAxOSA5IDEwIDkgMTMgXgorNDAgMSAxOSAxNCAyMSAyIDE4IDEzIDEwIDQgMTggMTYgNCAyMSAxNSAxMCAxOCAxOSAzIDEyIDEyIDE0IDQgMTMgMTEgMSAxMSAxIDEwIAorMiAxMiA0IDIxIDEwIDIxIDE4IDkgMiAxNiA3IDIwIDcgXgorNDEgMCA3IDEyIDE5IDIwIDEgMTMgMTIgMTAgOCAyMSAxNSA3IDE5IDEzIDYgOCAxOSAyMCAxOCAyIDEyIDE0IDMgMTAgNiAyIDYgMiAxNyAKKzE2IDIgNSAyMSA1IDE3IDE5IDcgOCAxMSAxMCAyMSBeCiszNSAwIDE3IDE0IDE4IDE1IDE2IDE2IDE2IDEyIDIwIDEzIDIgNSA1IDIgMTAgMjAgMTYgMTIgMTAgMiAxNyAyMSAyMCAxNSAxNCAxNCAKKzE4IDIxIDEzIDkgMTcgMjEgMiAxMiAxMCBeCis0MCAwIDE3IDMgOSAxOSA1IDcgMTAgNSAxMSAxNyAxOCAxNCAxNCAxMiAyIDIwIDE1IDggMTcgMyAyMCAxMSAxMiAxOCA3IDEyIDcgOSA4IAorMyAxOCAxNCAzIDUgMTcgOSAxOCA4IDIxIDIwIF4KKzQ2IDEgOCA4IDE2IDIxIDEyIDUgOCA3IDIwIDEwIDE0IDcgMSA5IDUgNCA1IDIgMjEgMTIgMSAxIDkgMjAgMTQgMTEgOSAxOSAxNiAzIDEgCisxNCAxMCAyIDggMjAgMTggNyA4IDE1IDIgMTkgNiAxMSAxOCAxMCBeCis0NCAxIDE1IDYgNSAxNiAxNCA5IDcgMjEgMyAxNSAyMSAxNiA4IDcgMyA2IDE0IDE3IDE3IDUgMTAgMjAgMTAgMTUgMTAgMSAxNSAxOCA2IAorMTAgOSA3IDE2IDE0IDExIDE1IDEyIDIgOSAxIDEgNiA2IDE5IF4KKzM4IDEgOCAyMCA2IDE4IDggNSA4IDEgMSAxNyAyMCAyMCAxOSAxNyAxMyAxNCAxNyAxMiA1IDMgMTggMjAgMjAgMTEgMTggMTUgMTMgMTYgCisxMyA3IDEwIDEgMTkgMTAgNyAxNyA3IDE1IF4KKzUwIDAgMyA4IDQgNCAxNSAxNyAxMyA5IDExIDIgMiAxMSA3IDEzIDQgMTcgNyAxIDUgMTMgMTkgMTYgNSAxNCAxNiAyIDExIDE4IDUgMTEgCis2IDQgNyAzIDE3IDIgMSAxOCAxMyAyMSAxOCAzIDUgMTYgNiAxMSAyIDggOCAxOCBeCis0MiAxIDE0IDEzIDIxIDYgMTQgMTIgNiAxMiAxOSAxNCAzIDE2IDMgMiA3IDExIDE0IDggMTYgMTAgMTkgMTIgMTkgNCA1IDYgMTMgMTkgCisxMiAxMyA3IDUgMTIgNCAxMyAyMSAyIDUgMTcgMTUgMTUgMTIgXgorNDUgMSAxMyA1IDIxIDYgNCAxMiAxNCAxNSA1IDE4IDEyIDEgMTkgMiAxNCAxIDggOCAxMSA2IDIwIDEwIDMgMjEgOCAyMCAyIDQgMSAxNiAKKzExIDEgNSAzIDggMTYgMTUgOCAxMiAxNCAyMCAxNiAxOCA3IDE4IF4KKzQ2IDAgMTggMiAxOCAxOSA3IDQgMTkgMyAxIDIwIDcgMTUgMSA0IDUgMTIgMTAgMTkgNiAxMSA0IDQgOSAyMCAyMCA4IDIgMjAgMyAxOSAKKzIgOCA0IDE1IDcgMiAyIDYgMTggMjAgMTYgMSAxOCAxNyAxMyAxNCBeCis0MyAxIDE0IDIgMSAyIDEwIDE0IDE5IDEyIDkgMTUgMjAgMSA3IDE1IDE3IDcgMTIgMTggMSAxNSAxNCA4IDIxIDIxIDE5IDcgMjAgMTAgCisxMSAxMCAxIDkgMjEgNyA1IDEgMTIgMTUgMiA5IDE3IDQgMTkgXgorNDUgMSA1IDQgMTEgMjEgMTQgMTMgMyAyMCAyMSAxIDMgMTIgMTggMTEgNCAxNCAyMCA1IDMgMTQgMTMgMTUgOSAyMSAxMSAxOSA4IDEgNSAKKzkgNSA5IDE2IDE3IDkgNiAxMiA2IDE2IDcgNCAzIDEgMjEgMTUgXgorMzUgMCAxOSAxNSAxOCAxNyAxNyAxNyAyMSAxMyAyMCA5IDYgNiA5IDEgMTMgMTcgMjEgMSA5IDE2IDExIDEyIDEzIDE4IDE5IDE5IDE1IAorMTIgMjAgMiAxNiAxMiA5IDIxIDEyIF4KKzQ0IDEgMTYgOCAyIDE0IDYgNCAxIDYgMTYgMTUgMTkgMTkgMjEgOSAxMyAxOCAzIDE2IDggMTMgMjEgMTUgNCAyMSA0IDIgMyA4IDE1IAorMTkgOCA2IDE2IDIgMTUgMyAxMiAzIDExIDMgMTcgMTIgMjEgOSBeCis0OCAwIDMgNCAxMyAxIDEyIDQgMTAgMiA2IDcgNiA5IDEyIDIxIDEwIDEwIDExIDIgMTMgMTkgMiAxNCAxNyAxMSA4IDEwIDE5IDEgMTEgCisxMSA5IDMgMTMgMTUgNCAzIDE4IDkgMTQgNSAxNSAxOCA1IDYgMTcgMTEgMTkgMTUgXgorNDQgMCA0IDEyIDggMTggMTIgMTcgMyA0IDggNSAxOSAxNiAxNiA2IDEgMTMgMSAxOCAxIDEwIDE4IDE1IDExIDUgMSAxNyA0IDE3IDE5IAorMTEgMTggMjEgOSAyIDEwIDEwIDUgNSAyMCAxOCAxMyA1IDE1IDE4IF4KKzM5IDEgNiAzIDEwIDEwIDE2IDEzIDEzIDE0IDE2IDIwIDE5IDExIDE2IDIxIDYgOCAxNSAxMyAxMSAxMyAxNSAxOCAxMSAyMCAxNyAyMCAKKzQgMTYgMTAgMTQgMSA0IDE2IDQgMTcgOCAzIDcgMjEgXgorNDYgMSAxOCAxNiAyMCAyIDkgOSA0IDIwIDcgMTYgNCAxMSA0IDEwIDYgMjAgMTQgMTcgNiAxOSAxNyAyIDE1IDYgNSA3IDQgOCAxMSAxNiAKKzkgMTAgMTUgMjAgMTIgMTUgOCA2IDE3IDUgOSAzIDMgNCAxOSAzIF4KKzQwIDAgMTIgNSAxOSAyMSA1IDIxIDExIDE0IDE5IDEgMTcgOCA5IDQgMTkgMyAxNyAxIDE0IDIxIDE0IDcgNiA1IDIwIDE0IDIxIDIwIDQgCis2IDIxIDcgMTEgMjAgMTIgOSAxMSA2IDE2IDExIF4KKzQ0IDAgMTggMTAgMTEgMjAgNiAxMiAxMSA1IDcgMjEgMTkgMTggNiAxNSAyMSAxMCA0IDE0IDkgMTkgMTAgMyAzIDUgMTMgMSA4IDEyIDMgCisxMyA5IDcgMTAgMTcgMTAgNiA4IDMgMTcgMTggMyAyMSAxOSA4IF4KKzQ3IDAgNCAxMiAyMiA1IDExIDIwIDE2IDE1IDQgMTcgMjIgMSA4IDE2IDExIDYgMTMgMTggMyAxNCA4IDEzIDIgMTkgMTYgMSAxOSAxIDUgCiszIDE2IDkgOCAyMCA3IDUgMSAxMSAxNSAyIDMgMTcgMyAxMiA3IDQgMTkgXgorNDIgMCAxOCAxNiAxMyA3IDEgMTkgNSAxMiAxOCAxMiA2IDE1IDE5IDQgNCA5IDEzIDEzIDggMTcgMTMgMTggMTIgMiA4IDQgNyAxNyAxNyAKKzE0IDExIDEzIDEgMTYgMTEgMiAyMSAzIDIyIDE3IDE2IDExIF4KKzM5IDAgMTggMjIgMTIgMjAgMTcgMTMgMSA3IDEwIDcgMjAgMTEgMSA3IDggMTQgMTQgMTIgMTUgMTMgMTUgMTggMTUgMTEgMTggMSAxNyAKKzE0IDE1IDIwIDE2IDIwIDggMiAxNyAxMCA0IDIxIDIgXgorNDQgMSAxOSAxOSAxNCAyMiAyMSAxOCAxMyAxNCAxIDMgMTIgMTEgMTEgNCAyMiAxMyA1IDE4IDcgMjEgOSAyMiAxOSAxMiA4IDE2IDUgCisxNyA1IDkgMSAyIDkgNiAxMiA2IDEgNyA0IDMgMTUgMSAxNCAxNiBeCis0MiAxIDEyIDMgMTAgMiAxMCAxNCAyMSAxMyAxNyA2IDYgMTcgMSAyMSAyIDE0IDE2IDE3IDkgMTEgMjAgMjEgMTEgMTIgMTIgOCAyMCAKKzEzIDIgOSAyMCA5IDE0IDEwIDEgMTYgMiAyMiA2IDQgMTYgMTggXgorNTEgMCAxNSAxIDEyIDQgMTQgOSAyMSAzIDMgOSA4IDIxIDE1IDE0IDggNCAxNCA0IDIgMyA4IDEyIDggNiAxIDIgMTggMjAgMTUgMyAxOSAKKzMgMTAgMjAgMTQgNiAzIDQgMjEgMSAxMiA0IDE4IDIgNiA3IDYgOSAyMCAxNCAxMyBeCis0MCAxIDEwIDE5IDE3IDIxIDEyIDE1IDE3IDcgMTAgMTEgOCAxMCAxMiAxIDE5IDE5IDkgMTggMjEgNCAxOCAxMSA5IDIyIDUgMTUgOCAKKzE1IDMgNSA2IDIgMTkgMTIgMTcgNCAyMCA4IDExIDIwIF4KKzQ1IDAgMiAxOCA0IDE2IDIwIDEyIDkgOSA2IDE2IDIxIDE2IDMgMTYgMTggMyAxOSA1IDE2IDIgNCAyIDEyIDExIDE1IDExIDE0IDE3IDIgCisxMCAxOCA1IDUgMTMgMyAyMSA1IDMgNiAxOCAxOCAxMCAxIDIxIDE1IF4KKzQ1IDEgNyAxIDEzIDEyIDE5IDEgMTQgNiA4IDIxIDE5IDIxIDExIDE5IDEzIDIgMTMgNCAxIDEwIDIyIDE2IDQgOSA0IDEwIDE2IDMgNyAKKzE1IDExIDkgMTMgMTcgMTUgOSA5IDE1IDQgMTMgMTUgOSA0IDE5IDkgXgorNDYgMCAxOCA2IDEzIDIyIDEwIDYgMTIgMiAxNyAxNSA2IDUgNyA0IDggMTEgMSA5IDEwIDggNSAyMCAxNiA2IDEwIDUgMTcgMyAzIDE5IAorMTIgMTMgMjAgNSAxMiAxNCA1IDE0IDExIDIyIDEyIDE2IDEwIDggOSAxNiBeCiszOSAwIDE1IDEyIDMgMiAxNiAyMiAxNCAyMiA3IDYgNSAxMyAyMiAxNCAxMyA0IDYgMTQgNyAxMSAxMyAyMCA5IDE5IDYgOSAxMSAxMSAKKzE4IDE5IDEzIDYgMjAgMTkgMjAgNyAyMiAxMiAxMiBeCis0MSAwIDYgMTQgMTggMTkgNyAxNyAxMiAxMCAzIDE4IDE1IDUgMjEgMTYgOCAyMCAzIDIxIDkgMTUgMTggMTAgMTUgMTAgNiA4IDE4IDIgCisxMSAzIDE0IDQgNiAxMCAxOSA5IDggMTcgOCAyMiAyMCBeCiszNiAxIDcgMjIgMTYgMTggMjEgNCAxMSAxMCAxNSA2IDIyIDE2IDIyIDUgMTkgMTUgNyA3IDIgMjEgMjEgMyAxNyAyMSAxNiAyMiA5IDMgCis3IDExIDQgMTcgMTcgMjAgMjEgMjEgXgorMzcgMSAxOCA5IDUgOCAxMiAxNyAxOCAxNyAxNiAxMiAyMiAxNCAxNyAxMSAyMSAxMCA0IDMgMSA0IDE0IDEwIDExIDQgMyAyMCAyMCAyMiAKKzE5IDIxIDE5IDE2IDE5IDE2IDEwIDE3IDE3IF4KKzQwIDEgMTkgMTQgMTggMTQgMyA5IDE3IDEgNyAxMyA2IDcgMTUgMjAgMTIgMTMgMTYgMjEgMjAgMTAgOCAyMiA3IDEyIDIxIDYgMTYgNCAKKzEzIDExIDIgMTIgMTUgMjIgMyAxOCA2IDE3IDYgMjIgXgorNDIgMCAxMCA5IDIgNSAyMiA1IDEwIDQgNyA4IDE5IDEwIDIwIDEwIDIyIDExIDggMSA5IDEgMjAgMTMgMjEgMTcgNSA1IDE3IDEwIDEzIAorOSAyMCAxOCAxNyAyIDE0IDEzIDIyIDIyIDMgMTQgMjEgMTAgXgorNDYgMCAyIDE0IDIgMjAgMSAxMCAxOCA5IDEyIDUgNyAxOCAyMCAxOSAxMCAxMSAyMiA3IDEyIDIgMTMgOCA4IDIgMyAxMyAxOSAyMCAzIAorNyAyMCA3IDkgOCAzIDExIDIyIDMgNSAxMCA5IDExIDE2IDE0IDE5IDE2IF4KKzQ2IDEgMTUgOCAxIDE0IDIwIDUgOCA3IDEzIDEwIDIyIDcgMTYgOSA1IDQgNSAyIDE0IDIwIDEgMSAxNSAxNyAxMyAyMiAxOSAxNyA0IDEgCiszIDEgMjIgMTAgMTUgMTUgMiAxNiAxMyAxMSA3IDE2IDE3IDEyIDYgMjAgXgorNDAgMSAzIDE5IDggNiA1IDkgMTUgMjIgMTcgNyAxNCAxOCAxNCA5IDE2IDcgMTggMTQgMjIgMiAyIDUgMTggMTMgMTggOCAxOCAxNiA4IAorMTEgMTUgNiAxOCA5IDcgOSAyMiAxOSAyMCAxNSBeCis0NCAwIDkgMTYgMTYgNiA2IDIxIDggMTMgNiAxMSA4IDUgMTYgMTYgMSAxMCAxMyAxMyA0IDEwIDIxIDIyIDE1IDEwIDIwIDUgMyAzIDEzIAorMTUgMTMgMTEgMTEgMTUgMjEgMSAyMSA3IDEwIDEgMTIgMTggNyAyMCBeCis1MSAwIDcgMSAxOCA4IDQgMTkgMiAyMSAxNyAxOSAyIDIgMTkgNyAyMSAxOSAyIDcgMTUgMTUgMTYgNSAyMSAxMiAxIDUgMjIgMSAxNyAKKzE5IDExIDUgMTEgNiA0IDcgMyAxMCAyIDEgMyA2IDE0IDExIDE4IDUgMSA2IDExIDE3IDggXgorMzkgMSA4IDE1IDIyIDIxIDE0IDYgMjIgMjAgNiAyMCAxMiAyMiAxOCAxIDMgMiA3IDE5IDIyIDggOSAxOCA0IDIwIDEyIDQgNSA2IDIxIAorMTIgMjAgMjEgNyA1IDIwIDQgMjEgMTQgMTQgXgorNDUgMCAxNSA1IDIgMTYgMTUgMjEgNSAxNCAxNSA2IDQgMTIgMjIgNSAxMSAyMCAxNiAxNSA0IDE3IDIyIDEgOCAxNiAxMSA2IDEzIDE4IAorMyAxNCA4IDEzIDIgMTkgMTYgMSAxOSAxIDUgMyAxNiA5IDggMjAgMTQgXgorNDggMSA1IDEgMTEgMTUgMiAzIDE3IDMgMTIgNyA0IDEyIDE4IDE2IDEzIDcgMSAxOSA1IDEyIDE4IDEyIDYgMTUgMTkgNCA0IDkgMTMgCisxMyA4IDE3IDEzIDE4IDEyIDIgOCA0IDcgMTcgMTcgMTQgMTEgMTMgMSAxNiAxMSAyMiBeCiszOCAwIDIxIDMgMjIgMTcgMTYgMTcgMTggMjIgMTIgMjAgMTcgMTMgMSA3IDEwIDcgMjAgMTEgMSA3IDggMTQgMTQgMTIgMTUgMTMgMTUgCisxOCAxNSAxMSAxOCAxIDE3IDE0IDE1IDIwIDE2IDEwIF4KKzQzIDAgOCAyIDE3IDEwIDQgMjEgNSAxOSAxOSAxNCAyMiAyMSAxOCAxMyAxNCAxIDMgMTIgMTEgMTEgNCAyMiAxMyA1IDE4IDcgMjEgOSAKKzIyIDE5IDEyIDggMTYgNSAxNyA1IDkgMSAyIDkgNiAxMiAyMiBeCis0NyAxIDEgNyA0IDMgMTUgMSAxNCAxIDEyIDMgMTAgMiAxMCAxNCAyMSAxMyAxNyA2IDYgMTcgMSAyMSAyIDE0IDE2IDE3IDkgMTEgMjAgCisyMSAxMSAxMiAxMiA4IDIwIDEzIDIgOSAyMCA5IDE0IDEwIDEgMTYgMiAyMiAyMCBeCis1MyAwIDQgMTYgMTQgMTUgMSAxMiA0IDE0IDkgMjEgMyAzIDkgOCAyMSAxNSAxNCA4IDQgMTQgNCAyIDMgOCAxMiA4IDYgMSAyIDE4IDIwIAorMTUgMyAxOSAzIDEwIDIwIDE0IDYgMyA0IDIxIDEgMTIgNCAxOCAyIDYgNyA2IDkgMjAgMTUgXgorNDIgMSAxMCAxMCAxOSAxNyAyMSAxMiAxNSAxNyA3IDEwIDExIDggMTAgMTIgMSAxOSAxOSA5IDE4IDIxIDQgMTggMTEgOSAyMiA1IDE1IAorOCAxNSAzIDUgNiAyIDE5IDEyIDE3IDQgMjAgOCAxMSAyMCAxMiBeCis0NSAwIDE4IDQgMTYgMjAgMTIgOSA5IDYgMTYgMjEgMTYgMyAxNiAxOCAzIDE5IDUgMTYgMiA0IDIgMTIgMTEgMTUgMTEgMTQgMTcgMiAKKzEwIDE4IDUgNSAxMyAzIDIxIDUgMyA2IDE4IDE4IDEwIDEgMjEgMjEgMTggXgorNDUgMCAxIDEzIDEyIDE5IDEgMTQgNiA4IDIxIDE5IDIxIDExIDE5IDEzIDIgMTMgNCAxIDEwIDIyIDE2IDQgOSA0IDEwIDE2IDMgNyAxNSAKKzExIDkgMTMgMTcgMTUgOSA5IDE1IDQgMTMgMTUgOSA0IDE5IDE5IDE5IF4KKzQ5IDAgNiAxMyAyMiAxMCA2IDEyIDIgMTcgMTUgNiA1IDcgNCA4IDExIDEgOSAxMCA4IDUgMjAgMTYgNiAxMCA1IDE3IDMgMyAxOSAxMiAKKzEzIDIwIDUgMTIgMTQgNSAxNCAxMSAyMiAxMiAxNiAxMCA4IDkgNCAxNSAxMiAzIDIyIF4KKzM5IDAgMTYgMjIgMTQgMjIgNyA2IDUgMTMgMjIgMTQgMTMgNCA2IDE0IDcgMTEgMTMgMjAgOSAxOSA2IDkgMTEgMTEgMTggMTkgMTMgNiAKKzIwIDE5IDIwIDcgMjIgMTIgMTEgNiAxNCAxOCAxNyBeCis0MyAxIDcgMTcgMTIgMTAgMyAxOCAxNSA1IDIxIDE2IDggMjAgMyAyMSA5IDE1IDE4IDEwIDE1IDEwIDYgOCAxOCAyIDExIDMgMTQgNCA2IAorMTAgMTkgOSA4IDE3IDggMjIgNCA3IDIyIDE2IDE4IDIxIDExIF4KKzM5IDAgMTEgMTAgMTUgNiAyMiAxNiAyMiA1IDE5IDE1IDcgNyAyIDIxIDIxIDMgMTcgMjEgMTYgMjIgOSAzIDcgMTEgNCAxNyAxNyAyMCAKKzIxIDEwIDE4IDkgNSA4IDEyIDE3IDE4IDE3IDE3IF4KKzQwIDEgMTIgMjIgMTQgMTcgMTEgMjEgMTAgNCAzIDEgNCAxNCAxMCAxMSA0IDMgMjAgMjAgMjIgMTkgMjEgMTkgMTYgMTkgMTYgMTAgMTcgCisyMCAxOSAxNCAxOCAxNCAzIDkgMTcgMSA3IDEzIDYgMTggXgorNDQgMSAxNSAyMCAxMiAxMyAxNiAyMSAyMCAxMCA4IDIyIDcgMTIgMjEgNiAxNiA0IDEzIDExIDIgMTIgMTUgMjIgMyAxOCA2IDE3IDYgMiAKKzEwIDkgMiA1IDIyIDUgMTAgNCA3IDggMTkgMTAgMjAgMTAgMjIgNyBeCis0MyAwIDggMSA5IDEgMjAgMTMgMjEgMTcgNSA1IDE3IDEwIDEzIDkgMjAgMTggMTcgMiAxNCAxMyAyMiAyMiAzIDE0IDIxIDkgMiAxNCAyIAorMjAgMSAxMCAxOCA5IDEyIDUgNyAxOCAyMCAxOSAxMCAxMSAxOSBeCis1MyAxIDcgMTIgMiAxMyA4IDggMiAzIDEzIDE5IDIwIDMgNyAyMCA3IDkgOCAzIDExIDIyIDMgNSAxMCA5IDExIDE2IDE0IDE5IDggMTUgCis4IDEgMTQgMjAgNSA4IDcgMTMgMTAgMjIgNyAxNiA5IDUgNCA1IDIgMTQgMjAgMSAxIDE1IDggXgorNDIgMCAxMyAyMiAxOSAxNyA0IDEgMyAxIDIyIDEwIDE1IDE1IDIgMTYgMTMgMTEgNyAxNiAxNyAxMiA2IDE5IDMgMTkgOCA2IDUgOSAxNSAKKzIyIDE3IDcgMTQgMTggMTQgOSAxNiA3IDE4IDE0IDIyIDE5IF4KKzQzIDAgMiA1IDE4IDEzIDE4IDggMTggMTYgOCAxMSAxNSA2IDE4IDkgNyA5IDIyIDE5IDIwIDE3IDkgMTYgMTYgNiA2IDIxIDggMTMgNiAKKzExIDggNSAxNiAxNiAxIDEwIDEzIDEzIDQgMTAgMjEgMjIgMTQgXgorNDggMCAxMCAyMCA1IDMgMyAxMyAxNSAxMyAxMSAxMSAxNSAyMSAxIDIxIDcgMTAgMSAxMiAxOCA3IDIgNyAxIDE4IDggNCAxOSAyIDIxIAorMTcgMTkgMiAyIDE5IDcgMjEgMTkgMiA3IDE1IDE1IDE2IDUgMjEgMTIgMSA1IDIxIF4KKzQ5IDEgMSAxNyAxOSAxMSA1IDExIDYgNCA3IDMgMTAgMiAxIDMgNiAxNCAxMSAxOCA1IDEgNiAxMSAxNyA4IDggMTUgMjIgMjEgMTQgNiAKKzIyIDIwIDYgMjAgMTIgMjIgMTggMSAzIDIgNyAxOSAyMiA4IDkgMTggNCAyMCAxMCBeCis0NSAxIDQgNSA2IDIxIDEyIDIwIDIxIDcgNSAyMCA0IDIxIDE0IDIgMTUgNSAyIDE2IDE1IDIxIDUgMTQgMTUgNiA0IDEyIDIyIDUgMTEgCisyMCAxNiAxNSA0IDE3IDIyIDEgOCAxNiAxMSA2IDEzIDE4IDMgMTQgMTMgXgorNTIgMCAxMyAyIDE5IDE2IDEgMTkgMSA1IDMgMTYgOSA4IDIwIDcgNSAxIDExIDE1IDIgMyAxNyAzIDEyIDcgNCAxMiAxOCAxNiAxMyA3IAorMSAxOSA1IDEyIDE4IDEyIDYgMTUgMTkgNCA0IDkgMTMgMTMgOCAxNyAxMyAxOCAxMiAyIDggMTUgXgorNDYgMCAyMCAxIDEgMTEgMjEgMiAzIDE2IDggMTIgMjEgMjIgMSAxNiAxIDEwIDIyIDE3IDQgMTQgNyAyIDE2IDkgMTggMjMgOSA0IDggCisxNiA3IDkgMTggMTEgMTEgMTcgMjAgMiA3IDEwIDIwIDggMTAgMTYgMTQgMTQgXgorNDEgMSAyMCA0IDE2IDQgMTggMSAxNCAxMiAxOSAxMyAxNSAxOSAxOSAxMSAyMiAxMyAxMCAyIDExIDE2IDEwIDE3IDggOCA2IDIyIDIgCisxNSAxMCA5IDEzIDE4IDE0IDIyIDggNiAxOCAxNiAxNSAxNCAyMCBeCis0MyAxIDE0IDMgMTIgMTQgMTcgMTEgMyA5IDE5IDEwIDIwIDE2IDExIDMgMTcgNyAyMSAyMyAxMiAyMyAxMSAxMyAyIDE0IDE0IDE2IDEzIAorMTIgMTEgNSAxNCAzIDggNCAxMyA4IDE3IDE3IDE4IDE3IDIgMTIgMjIgXgorNDMgMSAxNyAzIDExIDEyIDE2IDUgMSAyMiA2IDE2IDExIDIwIDMgMTggMTcgNiAyMiAxNCAxMyAyMSAyMSAzIDE4IDEzIDIwIDExIDE4IAorMTkgMTEgNiAxIDEwIDE4IDcgMTcgNSAxNiAxIDcgMTAgNCAyMCAyMiBeCis0NiAwIDggMTAgMTIgNCAxMSAyMSA2IDEzIDE2IDE3IDYgMjMgMSA5IDE0IDQgMTEgMjMgMjMgMTkgMSAxMyA2IDIwIDEgOSAxMiA4IDUgCisyMyAxNyAxNiA4IDggMyAxMCAxMyA3IDYgMTAgOCAxNCA5IDE1IDIwIDIwIF4KKzQ2IDAgMjAgMjEgMTUgMTIgMTkgMTcgMSA2IDQgNSA4IDQgMTIgMTAgNiA1IDQgMTcgMyAzIDE2IDEzIDUgMjEgMTYgMTAgMjEgMTggMTkgCisxNSAxNiAxMiA2IDEyIDE3IDggNyA4IDExIDE0IDEgMjMgMTAgMTUgMTUgMTMgXgorNDMgMCAyMSAxMyAxNSAxOCAyMSAxMCAxMCAyMyAzIDEzIDEzIDkgMTYgMiAxNyAxOSAzIDIyIDExIDUgMTggMTkgMTMgNyA3IDggMTkgMiAKKzEyIDIgMTkgMTYgMjMgOSAxNiA2IDMgMTkgMTIgNSAxMCA5IDE3IF4KKzQ3IDAgMjEgMyAyIDEgNyAxNCAxNCA3IDYgMiAyMCAzIDYgMTkgMTkgMTAgMiAyMiAxMiAxNyAxMiAxIDIwIDcgNyAxNSAyMCA2IDE4IDggCiszIDE0IDIzIDE4IDE1IDQgNyA1IDIzIDE1IDcgMTQgMTAgMTAgMTkgMTcgMTEgXgorNDQgMCA0IDE1IDE3IDExIDE1IDExIDggOSAxNyA1IDEyIDE4IDE0IDYgMjAgMTcgMjEgMTIgMTYgOSAyMiA5IDIwIDE1IDIgMjIgMTEgMiAKKzYgMTEgOSA4IDIgNCAxNCAxOSAzIDIxIDIxIDIzIDggMiAxMSAxNSBeCiszNyAwIDggNCAyMCAyMiA2IDIxIDE4IDIyIDEwIDE5IDkgMTQgMTcgMjMgMjEgMTAgNyAxNSAxMyAxNiA1IDQgMTAgMTMgMTQgMjAgMjMgCisxMiAyMCAyMyAxOCAxMCAxMiA4IDIxIDExIDE5IF4KKzM5IDAgMTIgNyAxOSAxNCAxOCAxNCAxOCAyMiA2IDkgMjIgNSAyMyAxMyA2IDggMjMgMjAgMjIgNSAyMiAxNSAxOSAyMCA5IDkgMSAxMyAKKzEzIDEwIDE0IDEzIDUgMjIgMTQgMjEgOSAyMSAzIF4KKzQ1IDEgMTQgMTQgNCAxOCAxMyAxMiAyMyA3IDMgMTUgNSAxNyAxNCAyMyAxNCA1IDE3IDIyIDExIDEgOCAxMyAyMyA2IDIxIDMgNiAxMSAKKzcgMjMgOCA2IDIxIDQgNCAyMiAxOSAxMyA4IDUgMTkgNyA1IDIzIDMgXgorNTAgMSA0IDE5IDExIDIzIDExIDIxIDE0IDEgMyAyMCAyIDIwIDcgNCAxNyAyIDUgMTMgNCAyMyA1IDIyIDcgNyA5IDE3IDEzIDUgNiAyIAorMjEgMSAxNyA3IDkgMjEgMjMgMSAxIDEyIDMgMSAxNSAyMiA0IDEyIDYgMjAgNSAyMyBeCis0NiAxIDIzIDQgMTIgMjIgOCAxOCAxNiAzIDE2IDQgMiAxMyAxIDE1IDE1IDEgMjMgMiAzIDQgMTAgMSAxMiA3IDExIDIgNyAyMiAyMiAKKzIxIDIyIDEzIDMgMTIgMjIgMTIgNCAzIDIzIDEwIDE0IDE3IDE1IDkgMjMgMjAgXgorNDQgMCAxOSAxMiAyMSAyMiA5IDE3IDEyIDIgMTggMTggMTIgMjEgMiAxOSA0IDIxIDIwIDQgOSAxNCA1IDIxIDggMjIgMTAgMTUgMjMgCisxNCA4IDUgMTEgMTkgNSA3IDUgMyAxMSA0IDE1IDE4IDkgMiAyMyA0IF4KKzQ2IDAgOSAxNiAxNCAxNSA2IDE1IDEgMTEgNCAxNiAxNiAyMCAxNCAyIDkgMTkgMTQgNiAzIDcgMTAgMTYgMjIgMjMgNyA3IDEyIDUgMiAKKzggOSA1IDcgMSAxNyAxOSAyMSAxOSAxOCAxNSAzIDIwIDIyIDE0IDkgMTYgXgorNDQgMSAxMCAxOCAxMSAzIDUgOSAxMCAxMSAyMiAxMiAxMiAxNSAyMyAyIDEwIDE4IDIzIDUgMTggMjEgMjAgMjMgMyA5IDMgMjIgNyA4IAorNyA0IDEgMTQgMTYgMTYgMTMgMTggMiAyMSAxOCAxNSA1IDUgMTYgMjEgXgorNDYgMCAyIDIgNiAyMyAxMyAyMiAyMCAxMiAxNyA0IDEwIDIxIDIgMjAgMiA4IDggNyAyMCAxMyAzIDIwIDIzIDE2IDYgMjMgOSAxMiAyMCAKKzMgMTAgNSA2IDE5IDE4IDEyIDEzIDE0IDggMSAxIDggOSAxMyAxOSAyMyBeCis0NyAwIDkgMjAgMjAgNSAxNSAxMyAxNyAzIDE1IDIyIDMgMSAxOSA4IDE1IDggMTkgOSAyMSA3IDEyIDEgMTYgMjEgMTEgOCAxMCAxNSAKKzE2IDggMSA1IDUgMjAgMjIgMTMgMTEgMjIgNCA0IDcgNiAyMiAxMCAzIDIxIDQgXgorNDUgMSA5IDE5IDIyIDE4IDMgMjMgNiA0IDYgMTkgMTUgMTMgMTcgNCAxMyA5IDE1IDQgNiA3IDEzIDExIDEgMjAgMTUgMTIgMTggMTggCisxNiA3IDEzIDQgMTEgNyAxMSA2IDE3IDkgMTggMTUgMjEgMTcgNSAyMCAxMSBeCis0OSAwIDEgMjIgMTYgMTggNSA4IDExIDIgMjMgMTAgMTEgNSAyIDEgMTkgMTYgMyAxOSAxNiAxNSAyMSA1IDMgNyAxOCA0IDkgMTUgMyA4IAorMjAgMSAyMSAxIDIxIDE3IDkgNiAxNyAxMCAxNiAyIDkgNyAxNiAxOSAxNSAxNyA5IF4KKzUxIDAgMTcgMjAgMTkgNiA2IDE0IDIgMiA1IDEgMiAxMCAxNyAxIDE4IDYgMTggMjAgMSAxIDExIDIxIDIgMyAxNiA4IDEyIDIxIDIyIDEgCisxNiAxIDEwIDIyIDE3IDQgMTQgNyAyIDE2IDkgMTggMjMgOSA0IDggMTYgNyA5IDE4IDE3IF4KKzQ1IDEgMTEgMTcgMjAgMiA3IDEwIDIwIDggMTAgMTYgMTQgMTEgMjAgNCAxNiA0IDE4IDEgMTQgMTIgMTkgMTMgMTUgMTkgMTkgMTEgMjIgCisxMyAxMCAyIDExIDE2IDEwIDE3IDggOCA2IDIyIDIgMTUgMTAgOSAxMyAxOCA4IF4KKzQ0IDAgMjIgOCA2IDE4IDE2IDE1IDE0IDE1IDE0IDMgMTIgMTQgMTcgMTEgMyA5IDE5IDEwIDIwIDE2IDExIDMgMTcgNyAyMSAyMyAxMiAKKzIzIDExIDEzIDIgMTQgMTQgMTYgMTMgMTIgMTEgNSAxNCAzIDggNCAxMyAyMCBeCis0MyAwIDE3IDE3IDE4IDE3IDIgMTIgMyAxNyAzIDExIDEyIDE2IDUgMSAyMiA2IDE2IDExIDIwIDMgMTggMTcgNiAyMiAxNCAxMyAyMSAKKzIxIDMgMTggMTMgMjAgMTEgMTggMTkgMTEgNiAxIDEwIDE4IDcgMTcgMjAgXgorNTAgMSAxNiAxIDcgMTAgNCAyMCAxMCA4IDEwIDEyIDQgMTEgMjEgNiAxMyAxNiAxNyA2IDIzIDEgOSAxNCA0IDExIDIzIDIzIDE5IDEgCisxMyA2IDIwIDEgOSAxMiA4IDUgMjMgMTcgMTYgOCA4IDMgMTAgMTMgNyA2IDEwIDggMTQgMTcgXgorNDYgMSAxNSAyMCAxOCAyMCAyMSAxNSAxMiAxOSAxNyAxIDYgNCA1IDggNCAxMiAxMCA2IDUgNCAxNyAzIDMgMTYgMTMgNSAyMSAxNiAxMCAKKzIxIDE4IDE5IDE1IDE2IDEyIDYgMTIgMTcgOCA3IDggMTEgMTQgMSAyMyAyMSBeCis0NSAwIDE1IDE1IDIgMjEgMTMgMTUgMTggMjEgMTAgMTAgMjMgMyAxMyAxMyA5IDE2IDIgMTcgMTkgMyAyMiAxMSA1IDE4IDE5IDEzIDcgCis3IDggMTkgMiAxMiAyIDE5IDE2IDIzIDkgMTYgNiAzIDE5IDEyIDUgMTAgMTUgXgorNDggMSAyMCAyMSAzIDIgMSA3IDE0IDE0IDcgNiAyIDIwIDMgNiAxOSAxOSAxMCAyIDIyIDEyIDE3IDEyIDEgMjAgNyA3IDE1IDIwIDYgCisxOCA4IDMgMTQgMjMgMTggMTUgNCA3IDUgMjMgMTUgNyAxNCAxMCAxMCAxOSAxNyAxMiBeCis0NyAwIDQgMTUgMTcgMTEgMTUgMTEgOCA5IDE3IDUgMTIgMTggMTQgNiAyMCAxNyAyMSAxMiAxNiA5IDIyIDkgMjAgMTUgMiAyMiAxMSAyIAorNiAxMSA5IDggMiA0IDE0IDE5IDMgMjEgMjEgMjMgOCAyIDExIDQgOCA0IDIwIF4KKzM5IDAgMjIgNiAyMSAxOCAyMiAxMCAxOSA5IDE0IDE3IDIzIDIxIDEwIDcgMTUgMTMgMTYgNSA0IDEwIDEzIDE0IDIwIDIzIDEyIDIwIAorMjMgMTggMTAgMTIgOCAyMSAxMSA2IDEyIDcgMTkgMTQgMTQgXgorNDAgMCAxNCAxOCAyMiA2IDkgMjIgNSAyMyAxMyA2IDggMjMgMjAgMjIgNSAyMiAxNSAxOSAyMCA5IDkgMSAxMyAxMyAxMCAxNCAxMyA1IAorMjIgMTQgMjEgOSAyMSAxOSAxNCAxNCA0IDE4IDEzIDEyIF4KKzQ2IDAgMjMgNyAzIDE1IDUgMTcgMTQgMjMgMTQgNSAxNyAyMiAxMSAxIDggMTMgMjMgNiAyMSAzIDYgMTEgNyAyMyA4IDYgMjEgNCA0IAorMjIgMTkgMTMgOCA1IDE5IDcgNSAyMyAxIDQgMTkgMTEgMjMgMTEgMjEgOSBeCis1MiAwIDEgMyAyMCAyIDIwIDcgNCAxNyAyIDUgMTMgNCAyMyA1IDIyIDcgNyA5IDE3IDEzIDUgNiAyIDIxIDEgMTcgNyA5IDIxIDIzIDEgCisxIDEyIDMgMSAxNSAyMiA0IDEyIDYgMjAgNSAxOSAyMyA0IDEyIDIyIDggMTggMTYgMyAyMiBeCis0OCAwIDQgMiAxMyAxIDE1IDE1IDEgMjMgMiAzIDQgMTAgMSAxMiA3IDExIDIgNyAyMiAyMiAyMSAyMiAxMyAzIDEyIDIyIDEyIDQgMyAKKzIzIDEwIDE0IDE3IDE1IDkgMjMgNCAxOSAxMiAyMSAyMiA5IDE3IDEyIDIgMTggMTggOSBeCis0NiAwIDIxIDIgMTkgNCAyMSAyMCA0IDkgMTQgNSAyMSA4IDIyIDEwIDE1IDIzIDE0IDggNSAxMSAxOSA1IDcgNSAzIDExIDQgMTUgMTggCis5IDIgMjMgMjIgOSAxNiAxNCAxNSA2IDE1IDEgMTEgNCAxNiAxNiAyMCAyMiBeCis0NyAwIDIgOSAxOSAxNCA2IDMgNyAxMCAxNiAyMiAyMyA3IDcgMTIgNSAyIDggOSA1IDcgMSAxNyAxOSAyMSAxOSAxOCAxNSAzIDIwIDIyIAorMTQgOSAxMSAxMCAxOCAxMSAzIDUgOSAxMCAxMSAyMiAxMiAxMiAxNSAyMyAyMiBeCis0NSAwIDEwIDE4IDIzIDUgMTggMjEgMjAgMjMgMyA5IDMgMjIgNyA4IDcgNCAxIDE0IDE2IDE2IDEzIDE4IDIgMjEgMTggMTUgNSA1IDE2IAorMTIgMiAyIDYgMjMgMTMgMjIgMjAgMTIgMTcgNCAxMCAyMSAyIDIwIDE5IF4KKzQ3IDAgOCA4IDcgMjAgMTMgMyAyMCAyMyAxNiA2IDIzIDkgMTIgMjAgMyAxMCA1IDYgMTkgMTggMTIgMTMgMTQgOCAxIDEgOCA5IDEzIAorMTkgMTIgOSAyMCAyMCA1IDE1IDEzIDE3IDMgMTUgMjIgMyAxIDE5IDggMTUgMjMgXgorNDggMCAxOSA5IDIxIDcgMTIgMSAxNiAyMSAxMSA4IDEwIDE1IDE2IDggMSA1IDUgMjAgMjIgMTMgMTEgMjIgNCA0IDcgNiAyMiAxMCAzIAorMjEgMSA5IDE5IDIyIDE4IDMgMjMgNiA0IDYgMTkgMTUgMTMgMTcgNCAxMyA5IDE3IF4KKzQ5IDEgNCA2IDcgMTMgMTEgMSAyMCAxNSAxMiAxOCAxOCAxNiA3IDEzIDQgMTEgNyAxMSA2IDE3IDkgMTggMTUgMjEgMTcgNSAyMCA2IDEgCisyMiAxNiAxOCA1IDggMTEgMiAyMyAxMCAxMSA1IDIgMSAxOSAxNiAzIDE5IDE2IDE1IDE4IF4KKzU1IDEgNSAzIDcgMTggNCA5IDE1IDMgOCAyMCAxIDIxIDEgMjEgMTcgOSA2IDE3IDEwIDE2IDIgOSA3IDE2IDE5IDE1IDE3IDEwIDE3IAorMjAgMTkgNiA2IDE0IDIgMiA1IDEgMiAxMCAxNyAxIDE4IDYgMTggMjAgMSAxIDExIDIxIDIgMyAxNiA4IDE3IF4KKzQ3IDAgMjEgMjIgMSAxNiAxIDEwIDIyIDE3IDQgMTQgNyAyIDE2IDkgMTggMjMgOSA0IDggMTYgNyA5IDE4IDExIDExIDE3IDIwIDIgNyAKKzEwIDIwIDggMTAgMTYgMTQgMTEgMjAgNCAxNiA0IDE4IDEgMTQgMTIgMTkgMTMgMTkgXgorNDUgMSAxOSAxOSAxMSAyMiAxMyAxMCAyIDExIDE2IDEwIDE3IDggOCA2IDIyIDIgMTUgMTAgOSAxMyAxOCAxNCAyMiA4IDYgMTggMTYgCisxNSAxNCAxNSAxNCAzIDEyIDE0IDE3IDExIDMgOSAxOSAxMCAyMCAxNiAxMSAzIDIxIF4KKzQ3IDEgNyAyMSAyMyAxMiAyMyAxMSAxMyAyIDE0IDE0IDE2IDEzIDEyIDExIDUgMTQgMyA4IDQgMTMgOCAxNyAxNyAxOCAxNyAyIDEyIDMgCisxNyAzIDExIDEyIDE2IDUgMSAyMiA2IDE2IDExIDIwIDMgMTggMTcgNiAyMiAxNCAyMCBeCis0NyAxIDIxIDIxIDMgMTggMTMgMjAgMTEgMTggMTkgMTEgNiAxIDEwIDE4IDcgMTcgNSAxNiAxIDcgMTAgNCAyMCAxMCA4IDEwIDEyIDQgCisxMSAyMSA2IDEzIDE2IDE3IDYgMjMgMSA5IDE0IDQgMTEgMjMgMjMgMTkgMSAxMyAyMiBeCis1MSAwIDIwIDEgOSAxMiA4IDUgMjMgMTcgMTYgOCA4IDMgMTAgMTMgNyA2IDEwIDggMTQgOSAxNSAyMCAxOCAyMCAyMSAxNSAxMiAxOSAKKzE3IDEgNiA0IDUgOCA0IDEyIDEwIDYgNSA0IDE3IDMgMyAxNiAxMyA1IDIxIDE2IDEwIDIxIDIxIF4KKzUyIDAgMTUgMTMgNCA4IDEyIDIyIDkgNiAzIDEgMTMgMTYgMTIgMjMgMTAgMTQgMiAxIDYgMTEgOCAxOSAyNCAxNiAyIDUgMjEgMiA3IAorMjIgNCA1IDIzIDMgMTIgMjAgOCA0IDUgMTcgOSAxOCAxOCAxOCA0IDEwIDEzIDIgNCA3IDI0IDIxIF4KKzUxIDEgMTAgMjEgNCA4IDI0IDIgNiAxOSAxMCA2IDIyIDIyIDE0IDIyIDEzIDIxIDUgMjIgMiA0IDE4IDUgMTEgMjEgMSA3IDggNCAxNyAKKzUgMTQgMSAyIDEwIDkgMTIgNSAxMSAxMCAyMCA0IDE0IDMgMSAzIDIxIDEyIDExIDE3IDIyIDIxIF4KKzQzIDEgNyA1IDIxIDE0IDE1IDE5IDIwIDEyIDYgMTIgMTggMTkgNCA3IDEyIDEwIDUgMjIgMyAxNSAyMSA3IDIzIDcgMiAyMiA0IDE4IAorMTggMyAyNCAxMCAxNyAyNCAyMyAxOCA2IDExIDE4IDIyIDggNiAyMCBeCis0NSAwIDIgMTIgMTAgMTQgMTIgOSAyIDIzIDE2IDIwIDE0IDE3IDkgMTYgNyAyMSA2IDIyIDI0IDE5IDExIDkgMTkgMjEgMTUgMTEgMTkgCisyIDIgNyA4IDEwIDggOSA4IDE1IDkgMTQgNiAxNiA4IDIxIDIxIDIyIDEzIF4KKzUwIDEgMTcgOSA0IDI0IDIxIDE1IDE1IDE2IDE2IDEzIDkgMTAgMTYgMTQgMTIgNyAxMiAxNSAxNSA1IDEwIDEwIDIzIDUgMTMgMjIgMyAKKzUgMSA0IDExIDE0IDcgNiAxMCAxNyAxNCA2IDMgMTMgMTggMTYgMyA1IDE1IDIzIDggNSAzIDIyIF4KKzQ3IDAgOCAxMiAyMCAyMCA5IDIgMTMgMjQgMTcgMiAyIDE3IDMgMTMgMjAgMiA2IDMgMTUgNyAxMyAxIDE4IDcgMjIgMTggMjQgMjAgMTQgCis3IDE3IDE2IDIwIDMgMTEgNiA1IDIgMTggMTQgMTYgMjIgMTQgMTEgNyAxOCAyMiBeCis0OCAxIDE3IDI0IDEyIDEyIDMgMTMgMTkgMTYgMjIgNCAxNiA0IDYgMjMgOCAxOCAxMSAyIDMgMjAgMjIgOSAyMSA4IDIzIDEgMjMgMjAgCis3IDE2IDEzIDIzIDQgMTMgMyA3IDQgMjMgNiAxMyAxOSAyIDMgNyAyIDkgOSAxOSBeCis0NSAxIDYgMTMgNCAyMiA2IDE5IDIwIDEgOSA3IDE0IDEgMTUgMyAyMyAyNCAyMiAxOCAxMiAxMiAxNyAxOSAxMCA4IDExIDIyIDEyIDEwIAorMiAyMCAxNSAxOCAxNyAxOCA3IDExIDEyIDIxIDYgMTIgNCA3IDE4IDE3IDE4IF4KKzQ0IDAgMiAxNCAyNCAxNCAxIDIzIDEgMTEgMTUgMTAgNiAxOCAyMCA3IDEgOCAxIDE2IDYgMjAgMjMgMjMgMjEgMTAgMTAgMTIgMjQgMTAgCisxMSAyMyAyIDEyIDIzIDkgMyAyNCAyNCAxOSAxNCAxMCAxOCAxNSAxNCAxMiBeCis1MCAxIDE2IDExIDIyIDIgMTUgMjQgOCAyMiAxIDQgMjQgOSAxMCAxNSAzIDkgNSA0IDE3IDE1IDkgMTIgMTkgMTkgMSAzIDEwIDYgOCAzIAorMTcgOCAxOCAyNCAxOSAzIDQgMTUgNCA5IDIgMjQgNSAyMCAxMyA3IDIwIDE3IDE5IDExIF4KKzQzIDAgMTMgOCAxMCAxOSAxNSAxMSAxIDE0IDE3IDIwIDIyIDEwIDcgMTEgMTYgOSAyMSAyMiAxNyAyMyAxMiAxNSA0IDI0IDcgMjEgMTggCisyIDIxIDE2IDEgMTkgMTggMjAgMTEgMyAxNSAxOSAxOCAxIDYgMTQgMTUgXgorNDUgMCA1IDUgMTkgMTMgMTAgMjQgMTkgMTYgMjQgMTUgMTMgMiAxOSAxNSAyNCAyMSAxNyA0IDEzIDE3IDEgMSA5IDEgMTAgMiAxOCAxIAorMjEgMTkgNSAxOCAxMiAyIDIyIDE2IDIzIDE1IDE5IDYgMTggOSAxIDIzIDIwIF4KKzQ5IDAgMjEgMTMgMTQgMTEgMTggMTIgMTMgMyAxOSA5IDIwIDIyIDIwIDIgMTEgMTIgNiAxIDEyIDE2IDE4IDIgOSA4IDQgMyAxMSAxNyAKKzExIDUgNCAxOSAxNiAxMSAyMyAxMyAxOCAxIDIwIDggMiAxNiAxNiAyMSA0IDE5IDUgNSAyNCBeCis0NiAwIDI0IDEzIDIzIDYgMjQgNSAxNyAxMiA1IDEgMTUgMTcgMTcgMjEgMTEgMTMgOSAyMyAxMSAxNCAyMSA3IDYgOSA2IDE0IDcgMTYgCisyIDE3IDEgMjQgMjMgNCAxMiAxNCA0IDIgMTEgMjMgMTIgNCAyMyAyMSAyMSA0IF4KKzQ5IDEgMTUgMTMgMTUgMTQgMTUgOCAxNCA5IDE3IDcgMTUgMiAyMyAyIDEgMTcgNiAxNCAxOSAyNCAyIDggOCA3IDcgMTAgMTQgMTMgNyAKKzkgMTEgMTYgMTEgOCA4IDE4IDEzIDEzIDE4IDEwIDEgMjAgMTggMjIgMTkgMTIgOSAxNiAxMiBeCis0MyAxIDEzIDYgOSAxNyAyMCAxMCA1IDcgMjAgMTggOCAxNSAyMyAyMSAyMCA1IDE1IDExIDMgMyAxNCAyMSAxMCAyNCA2IDIxIDIxIDYgCisyMyAxMCAzIDIxIDIzIDE3IDIwIDggMTYgMTAgMjIgNSAxNiAxIDI0IF4KKzUwIDAgMjQgMyA5IDE2IDYgNyAzIDIwIDEyIDE3IDE4IDIxIDUgOSA3IDEgOSAxMiAxOSA1IDcgNiAyNCAxMSAxMSAyMCAyMyAxMCA0IDcgCisxIDE5IDcgMTkgMTcgMjMgMTUgNSAxMiAyMSAyMCAzIDEgMTQgMiAxNSAyMiAzIDE2IDExIF4KKzQ1IDEgMTAgMTkgMTAgMjAgMTYgMTkgMTcgMTAgNCAyMSAyMCAxNiAyMSAxNCAxNCA4IDE3IDEwIDE5IDEgMTcgNCAzIDIyIDIzIDE0IAorMTYgOSAyMiA4IDIwIDI0IDEgNSAxMSAxMSA2IDQgMTMgMTUgMTIgMSAxMSAxMyAyMiBeCis0NSAwIDMgOCA1IDYgNSAxNiAxMiAxMSAyIDE3IDE0IDE5IDIzIDE2IDUgNiAyMCAyMSA5IDI0IDkgMjIgMjMgMjIgMTIgOCAxMyAyMyAKKzE3IDUgMyAxNiAyMiAxNSAyMiA3IDE3IDMgMiAxMyAxMyAxMSAyNCAxMyAxNyBeCis0MiAxIDIxIDExIDE0IDIwIDI0IDI0IDQgOSAxMyA1IDggOSAxOCA3IDEyIDEgMjEgOCAyNCAxNSAxIDIyIDE5IDI0IDE0IDEzIDggMjAgCisxNCAxOCAyMyAxOSA5IDggMTQgMjMgMTEgNCA0IDIyIDIwIDE3IF4KKzQ5IDEgMTcgMTUgMjAgNiAxNSA4IDI0IDQgMjAgMTkgOCAxOSAxNCAyMSAyNCAxOCAzIDEwIDE2IDMgNiA0IDEgMTAgMTUgMTMgNCA4IAorMTIgMjIgOSA2IDMgMSAxMyAxNiAxMiAyMyAxMCAxNCAyIDEgNiAxMSA4IDE5IDI0IDE2IDIzIF4KKzUwIDAgNSAyMSAyIDcgMjIgNCA1IDIzIDMgMTIgMjAgOCA0IDUgMTcgOSAxOCAxOCAxOCA0IDEwIDEzIDIgNCA3IDI0IDggMTAgMjEgNCAKKzggMjQgMiA2IDE5IDEwIDYgMjIgMjIgMTQgMjIgMTMgMjEgNSAyMiAyIDQgMTggNSAyNCBeCis1MyAxIDIxIDEgNyA4IDQgMTcgNSAxNCAxIDIgMTAgOSAxMiA1IDExIDEwIDIwIDQgMTQgMyAxIDMgMjEgMTIgMTEgMTcgMjIgMTEgNyA1IAorMjEgMTQgMTUgMTkgMjAgMTIgNiAxMiAxOCAxOSA0IDcgMTIgMTAgNSAyMiAzIDE1IDIxIDcgMjMgNyAxOCBeCis0MyAxIDIyIDQgMTggMTggMyAyNCAxMCAxNyAyNCAyMyAxOCA2IDExIDE4IDIyIDggNiA2IDIgMTIgMTAgMTQgMTIgOSAyIDIzIDE2IDIwIAorMTQgMTcgOSAxNiA3IDIxIDYgMjIgMjQgMTkgMTEgOSAxOSAyMSA2IF4KKzQ5IDEgMTEgMTkgMiAyIDcgOCAxMCA4IDkgOCAxNSA5IDE0IDYgMTYgOCAyMSAyMSAyMiA2IDE3IDkgNCAyNCAyMSAxNSAxNSAxNiAxNiAKKzEzIDkgMTAgMTYgMTQgMTIgNyAxMiAxNSAxNSA1IDEwIDEwIDIzIDUgMTMgMjIgMyA1IDIyIF4KKzUyIDAgNCAxMSAxNCA3IDYgMTAgMTcgMTQgNiAzIDEzIDE4IDE2IDMgNSAxNSAyMyA4IDUgMyAxOCA4IDEyIDIwIDIwIDkgMiAxMyAyNCAKKzE3IDIgMiAxNyAzIDEzIDIwIDIgNiAzIDE1IDcgMTMgMSAxOCA3IDIyIDE4IDI0IDIwIDE0IDcgMjMgXgorNDUgMSAxNiAyMCAzIDExIDYgNSAyIDE4IDE0IDE2IDIyIDE0IDExIDcgMTggMTYgMTcgMjQgMTIgMTIgMyAxMyAxOSAxNiAyMiA0IDE2IAorNCA2IDIzIDggMTggMTEgMiAzIDIwIDIyIDkgMjEgOCAyMyAxIDIzIDIwIDIzIF4KKzUxIDEgMTYgMTMgMjMgNCAxMyAzIDcgNCAyMyA2IDEzIDE5IDIgMyA3IDIgOSA5IDE1IDYgMTMgNCAyMiA2IDE5IDIwIDEgOSA3IDE0IDEgCisxNSAzIDIzIDI0IDIyIDE4IDEyIDEyIDE3IDE5IDEwIDggMTEgMjIgMTIgMTAgMiAyMCAxNSAxNSBeCis0OCAxIDE3IDE4IDcgMTEgMTIgMjEgNiAxMiA0IDcgMTggMTcgMyAyIDE0IDI0IDE0IDEgMjMgMSAxMSAxNSAxMCA2IDE4IDIwIDcgMSA4IAorMSAxNiA2IDIwIDIzIDIzIDIxIDEwIDEwIDEyIDI0IDEwIDExIDIzIDIgMTIgMjMgOSAyMCBeCis0OSAxIDI0IDI0IDE5IDE0IDEwIDE4IDE1IDE0IDUgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCA5IDEwIDE1IDMgOSA1IDQgMTcgCisxNSA5IDEyIDE5IDE5IDEgMyAxMCA2IDggMyAxNyA4IDE4IDI0IDE5IDMgNCAxNSA0IDI0IF4KKzQzIDAgMiAyNCA1IDIwIDEzIDcgMjAgMTcgMTkgMjIgMTMgOCAxMCAxOSAxNSAxMSAxIDE0IDE3IDIwIDIyIDEwIDcgMTEgMTYgOSAyMSAKKzIyIDE3IDIzIDEyIDE1IDQgMjQgNyAyMSAxOCAyIDIxIDE2IDEgMTkgMTEgXgorNDggMSAyMCAxMSAzIDE1IDE5IDE4IDEgNiAxNCA1IDUgNSAxOSAxMyAxMCAyNCAxOSAxNiAyNCAxNSAxMyAyIDE5IDE1IDI0IDIxIDE3IAorNCAxMyAxNyAxIDEgOSAxIDEwIDIgMTggMSAyMSAxOSA1IDE4IDEyIDIgMjIgMTYgMjMgMTkgXgorNTAgMSAxOSA2IDE4IDkgMSAyMyAyMiAyMSAxMyAxNCAxMSAxOCAxMiAxMyAzIDE5IDkgMjAgMjIgMjAgMiAxMSAxMiA2IDEgMTIgMTYgCisxOCAyIDkgOCA0IDMgMTEgMTcgMTEgNSA0IDE5IDE2IDExIDIzIDEzIDE4IDEgMjAgOCAyIDE2IDE2IF4KKzQ4IDEgMTYgMjEgNCAxOSA1IDUgMjAgMjQgMTMgMjMgNiAyNCA1IDE3IDEyIDUgMSAxNSAxNyAxNyAyMSAxMSAxMyA5IDIzIDExIDE0IAorMjEgNyA2IDkgNiAxNCA3IDE2IDIgMTcgMSAyNCAyMyA0IDEyIDE0IDQgMiAxMSAyMyAxNSBeCis1MCAxIDQgMjMgMjEgMjEgMTYgMTUgMTMgMTUgMTQgMTUgOCAxNCA5IDE3IDcgMTUgMiAyMyAyIDEgMTcgNiAxNCAxOSAyNCAyIDggOCA3IAorNyAxMCAxNCAxMyA3IDkgMTEgMTYgMTEgOCA4IDE4IDEzIDEzIDE4IDEwIDEgMjAgMTggMjIgMyBeCis0NCAxIDEyIDkgMTYgMTcgMTMgNiA5IDE3IDIwIDEwIDUgNyAyMCAxOCA4IDE1IDIzIDIxIDIwIDUgMTUgMTEgMyAzIDE0IDIxIDEwIDI0IAorNiAyMSAyMSA2IDIzIDEwIDMgMjEgMjMgMTcgMjAgOCAxNiAxMCAyMiAxMiBeCis1MyAwIDE2IDEgNSAyNCAzIDkgMTYgNiA3IDMgMjAgMTIgMTcgMTggMjEgNSA5IDcgMSA5IDEyIDE5IDUgNyA2IDI0IDExIDExIDIwIDIzIAorMTAgNCA3IDEgMTkgNyAxOSAxNyAyMyAxNSA1IDEyIDIxIDIwIDMgMSAxNCAyIDE1IDIyIDMgMTYgOSBeCis0NiAxIDEwIDE5IDEwIDIwIDE2IDE5IDE3IDEwIDQgMjEgMjAgMTYgMjEgMTQgMTQgOCAxNyAxMCAxOSAxIDE3IDQgMyAyMiAyMyAxNCAKKzE2IDkgMjIgOCAyMCAyNCAxIDUgMTEgMTEgNiA0IDEzIDE1IDEyIDEgMTEgMTMgMjEgMjEgXgorNDYgMCA4IDUgNiA1IDE2IDEyIDExIDIgMTcgMTQgMTkgMjMgMTYgNSA2IDIwIDIxIDkgMjQgOSAyMiAyMyAyMiAxMiA4IDEzIDIzIDE3IAorNSAzIDE2IDIyIDE1IDIyIDcgMTcgMyAyIDEzIDEzIDExIDI0IDEzIDEyIDIxIDcgXgorNDMgMSAxNCAyMCAyNCAyNCA0IDkgMTMgNSA4IDkgMTggNyAxMiAxIDIxIDggMjQgMTUgMSAyMiAxOSAyNCAxNCAxMyA4IDIwIDE0IDE4IAorMjMgMTkgOSA4IDE0IDIzIDExIDQgNCAyMiAyMCAxMyAxNyAxNSAyNCBeCis1NSAwIDYgMTUgOCAyNCA0IDIwIDE5IDggMTkgMTQgMjEgMjQgMTggMyAxMCAxNiAzIDYgNCAxIDEwIDE1IDEzIDQgOCAxMiAyMiA5IDYgCiszIDEgMTMgMTYgMTIgMjMgMTAgMTQgMiAxIDYgMTEgOCAxOSAyNCAxNiAyIDUgMjEgMiA3IDIyIDQgNSAyMyA0IF4KKzU1IDEgMTIgMjAgOCA0IDUgMTcgOSAxOCAxOCAxOCA0IDEwIDEzIDIgNCA3IDI0IDggMTAgMjEgNCA4IDI0IDIgNiAxOSAxMCA2IDIyIAorMjIgMTQgMjIgMTMgMjEgNSAyMiAyIDQgMTggNSAxMSAyMSAxIDcgOCA0IDE3IDUgMTQgMSAyIDEwIDkgMTIgMTQgXgorNDkgMCAxMSAxMCAyMCA0IDE0IDMgMSAzIDIxIDEyIDExIDE3IDIyIDExIDcgNSAyMSAxNCAxNSAxOSAyMCAxMiA2IDEyIDE4IDE5IDQgNyAKKzEyIDEwIDUgMjIgMyAxNSAyMSA3IDIzIDcgMiAyMiA0IDE4IDE4IDMgMjQgMTAgMTcgMjQgMTIgXgorNTAgMCAxOCA2IDExIDE4IDIyIDggNiA2IDIgMTIgMTAgMTQgMTIgOSAyIDIzIDE2IDIwIDE0IDE3IDkgMTYgNyAyMSA2IDIyIDI0IDE5IAorMTEgOSAxOSAyMSAxNSAxMSAxOSAyIDIgNyA4IDEwIDggOSA4IDE1IDkgMTQgNiAxNiA4IDIyIF4KKzUxIDEgMjEgMjIgNiAxNyA5IDQgMjQgMjEgMTUgMTUgMTYgMTYgMTMgOSAxMCAxNiAxNCAxMiA3IDEyIDE1IDE1IDUgMTAgMTAgMjMgNSAKKzEzIDIyIDMgNSAxIDQgMTEgMTQgNyA2IDEwIDE3IDE0IDYgMyAxMyAxOCAxNiAzIDUgMTUgMjMgOCAyMSBeCis1MSAxIDUgMyAxOCA4IDEyIDIwIDIwIDkgMiAxMyAyNCAxNyAyIDIgMTcgMyAxMyAyMCAyIDYgMyAxNSA3IDEzIDEgMTggNyAyMiAxOCAKKzI0IDIwIDE0IDcgMTcgMTYgMjAgMyAxMSA2IDUgMiAxOCAxNCAxNiAyMiAxNCAxMSA3IDE4IDE2IDIwIF4KKzUyIDAgMjQgMTIgMTIgMyAxMyAxOSAxNiAyMiA0IDE2IDQgNiAyMyA4IDE4IDExIDIgMyAyMCAyMiA5IDIxIDggMjMgMSAyMyAyMCA3IAorMTYgMTMgMjMgNCAxMyAzIDcgNCAyMyA2IDEzIDE5IDIgMyA3IDIgOSA5IDE1IDYgMTMgNCAyMiAxNiBeCis0OSAxIDE5IDIwIDEgOSA3IDE0IDEgMTUgMyAyMyAyNCAyMiAxOCAxMiAxMiAxNyAxOSAxMCA4IDExIDIyIDEyIDEwIDIgMjAgMTUgMTggCisxNyAxOCA3IDExIDEyIDIxIDYgMTIgNCA3IDE4IDE3IDMgMiAxNCAyNCAxNCAxIDIzIDEgMTEgMTYgXgorNDcgMCAxMCA2IDE4IDIwIDcgMSA4IDEgMTYgNiAyMCAyMyAyMyAyMSAxMCAxMCAxMiAyNCAxMCAxMSAyMyAyIDEyIDIzIDkgMyAyNCAyNCAKKzE5IDE0IDEwIDE4IDE1IDE0IDUgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCAzIF4KKzQ1IDAgMTcgNiAyNCAxMSA3IDIxIDkgMTcgOCAyNSA1IDUgMjIgMTYgMTMgNSAyIDE2IDQgMjUgMjUgOCAxOCAxMyAxMyAzIDEgMjIgMjMgCisyNCAxOCAxMiAyMSAxOSAyIDQgMjQgMTMgMTEgMiA3IDI0IDIyIDE3IDIxIF4KKzQ2IDEgMTUgMSA4IDMgMTAgMTUgMTggMTUgOCAxMCAxNiAyMCAyMCA3IDE4IDIyIDExIDE4IDkgMTEgMTUgMjIgMjAgMTggNiAyNCAxNSAKKzI1IDQgMjIgMTIgMTcgNCA2IDE3IDIwIDIgNCAyIDUgMjAgMTUgMTkgMjQgMTggMTUgXgorNTIgMSA4IDIgNSAyMyAyIDEwIDIxIDggNSAyIDkgMTYgMTYgMTUgNiAyMiAyMyA1IDYgMjEgNSAyMSAyNCAzIDYgMTAgMTcgMTkgOSAxNSAKKzExIDIzIDE2IDE3IDEgMyAxMiAzIDIwIDQgNSA1IDMgMjEgMjIgMTUgNCAyMSAyMCA3IDIyIDE4IF4KKzQzIDAgOSAyNCA0IDE4IDcgNyAyNSAyNCAyMiAyMSAyMyAyNCAxNCAyMCAxMiA2IDcgNCAyIDEyIDI1IDE1IDMgOSAyMyA4IDE2IDI1IAorMTEgMTQgNCAxMCAxOSAyMyAxNiAxMyA5IDIwIDI1IDE3IDExIDggMTkgXgorNTUgMCAxOSAyNSAxNyA3IDE2IDIxIDYgNCA4IDIgMTUgOSAyIDkgMTkgMyA2IDMgMyAxMCAyNSAxMyAxNSA3IDggMjAgMjEgMTIgMTAgCisxMiA1IDI0IDExIDIwIDMgMTMgMTMgMTYgOSAxMyAxMCAzIDkgMTYgMyA3IDE1IDkgOSAxNCAyIDEzIDE3IDI1IDMgXgorNDYgMCAxOCA1IDE5IDIzIDkgMjUgOSAxMCAyMyAxMiAxMiA3IDEzIDggMTUgNyAxIDYgMjEgMiA4IDcgNiAxNiAxNCAxNCAxMiAxNSAxMyAKKzI0IDEwIDE1IDExIDEwIDggMTQgMTUgMjEgMjUgMjEgMTYgOSAxOCAyMCAyMiAyMSBeCis1MCAxIDIwIDExIDE0IDIzIDIyIDEwIDEzIDE0IDggMTkgMTIgMiAxMSAyMCAyMyAxMyA0IDEwIDYgNSA3IDIzIDExIDMgMTYgOCAyMSA0IAorOCAxOCA1IDEyIDE0IDggNiAyMCAxOSAyNCA4IDIzIDE3IDMgNyAxOSAxIDE4IDEgMTQgMjIgMTEgXgorNDQgMSAxNCA1IDggMjIgMTggMTQgMjUgMTcgMTEgMTIgMjIgMiAxMiAxMiAxNiAxMiAxMyAxOCAxNyAxMiAxNyAxNCAxOCA4IDI1IDkgCisyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSAxOSAxNyAxNiAxOSBeCis1MSAwIDI0IDE0IDE2IDIwIDIzIDIwIDkgMTkgMTYgNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDEwIDExIDE5IDEgMjEgMTQgMTQgMTkgCiszIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDkgNiAxIDExIDIwIF4KKzQ3IDAgMSAxMiA4IDExIDExIDE3IDEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAyMSAyNSAyIAorMjEgMTggMTAgMjAgMjUgMjEgMyAxNyAxNyA1IDggMjIgMjUgMTkgOCAxMCAxOSA3IDI1IF4KKzU1IDEgNCA4IDE4IDMgMTggMyAxMSAyNCAyIDE0IDkgMSAxMCA0IDQgMTMgMTkgMjIgNCA3IDE5IDUgMTAgMTAgMSA4IDIyIDIyIDYgOCAKKzEzIDEyIDExIDE3IDIzIDE0IDE2IDcgNSAxMSAyMiAyNCA3IDIgMTEgMTMgMTggNCAyMCA4IDEgNiAyNSAyMCAxNiBeCis1MSAxIDIwIDEgMjUgMTAgMTUgMTUgMiAxNyAxMyA5IDI0IDE3IDI0IDIwIDEzIDE1IDE3IDMgMTEgMjAgMTAgNSAxMyAyMyAxOCA1IDMgCisxOCAxNSA3IDUgNyA0IDE1IDIwIDE2IDIgMTcgMSA3IDQgMTIgNyAyNSAxNCAxIDQgNyAxOSAxOSAyMiBeCis1MiAwIDMgMTMgMTIgNCAzIDE0IDQgMTQgMTEgNiAzIDI1IDE4IDE2IDIwIDI0IDEyIDE5IDE4IDI1IDYgMjMgNiAxNSA1IDQgNCA2IDE0IAorMTMgMjAgNSAxNCAxNSAyIDEzIDIxIDExIDUgMTcgMiAyIDEwIDExIDEzIDE0IDEyIDExIDIxIDE1IDIzIDIwIF4KKzUwIDEgMiA1IDcgMjMgMTAgMjAgNiAxMiAxIDE5IDEwIDI0IDIxIDIyIDI1IDE2IDEyIDE5IDIyIDE1IDEwIDE4IDI0IDEgNSAxNiAxMCAKKzE4IDIgMTkgMTQgMyA1IDEgNyAyMCA3IDE2IDYgMjAgNiA2IDI1IDEwIDIyIDIwIDIgMSAxNSAxOCBeCis0OCAwIDIzIDI1IDIzIDQgMTEgMTUgMTUgNiA5IDIyIDIyIDE5IDIyIDI1IDYgMTkgNiAyIDIwIDIxIDcgMjIgMTggMTAgNyAxNyA0IDE2IAorMTIgMTAgMjUgMTIgMjMgMjMgOSAyIDIyIDEgMjAgMiA4IDMgMTQgNyAxIDIgMyAyNCBeCiszOCAxIDIxIDIxIDIzIDIwIDIyIDExIDI1IDIwIDI0IDI1IDEgOSAyMSAyMCAxNCAxMCAxNCAxOSA5IDE3IDE1IDEzIDUgMTUgMjQgMjEgCisxMiAxMyAyNSAyMiAyMSAxIDE2IDIzIDcgMjQgMTUgMjIgXgorNTQgMSAyMiA1IDI1IDMgNCAyIDkgMTIgMjQgNiAxOSAxIDE0IDkgNSA5IDEgMTcgOSA0IDIzIDIxIDEgMyAxNSAxNiAxMSAxIDEyIDE4IAorNiAyIDcgOCAxNyA4IDIxIDEzIDIyIDkgMjEgNCA5IDEgMTMgMTcgMjEgMTAgOSAxOCAyNCAyMyAxMyAyNCBeCis0MyAxIDIzIDIzIDE5IDIzIDIyIDE3IDE4IDIzIDE4IDIxIDE3IDEgMTAgMTIgNCA2IDEgMjEgMTEgMTggMiA2IDYgMTIgMTggMTMgMTYgCisxNiAxOCAxOSAxMyAxMSAyMSAxOSAxNSAxMiAxNSAxNiAxOSAyIDIzIDE5IDIzIF4KKzQ4IDAgMSAyIDI1IDE0IDExIDI1IDI0IDE2IDggMTQgMjEgMjEgMTYgNiAxMyAxIDIzIDE1IDggMTcgNCAzIDQgOSAyMyAxMiA4IDggMjQgCisxMyA2IDExIDMgOCAyNCAxOSA4IDIzIDEgMjQgMjQgMTggMjUgMTMgMiA2IDI1IDE0IF4KKzUxIDEgOSAzIDUgMTEgMTkgMTEgMTYgNSA0IDE3IDI0IDIzIDE1IDE0IDEwIDcgMTQgMTcgMjUgMTUgMTAgMTQgNiAxOCAxOCA0IDEgMTMgCisxMCAxNiAxIDI1IDE2IDIgMjQgNSAxIDE3IDYgMTcgNiAyNCAxMSA3IDIxIDkgMTcgOCAyNSA1IDIzIF4KKzQ4IDEgMjIgMTYgMTMgNSAyIDE2IDQgMjUgMjUgOCAxOCAxMyAxMyAzIDEgMjIgMjMgMjQgMTggMTIgMjEgMTkgMiA0IDI0IDEzIDExIDIgCis3IDI0IDIyIDE3IDUgMTUgMSA4IDMgMTAgMTUgMTggMTUgOCAxMCAxNiAyMCAyMCA3IDI1IF4KKzQ5IDAgMjIgMTEgMTggOSAxMSAxNSAyMiAyMCAxOCA2IDI0IDE1IDI1IDQgMjIgMTIgMTcgNCA2IDE3IDIwIDIgNCAyIDUgMjAgMTUgMTkgCisyNCAxOCA5IDggMiA1IDIzIDIgMTAgMjEgOCA1IDIgOSAxNiAxNiAxNSA2IDIyIDIzIDE3IF4KKzQ3IDEgNiAyMSA1IDIxIDI0IDMgNiAxMCAxNyAxOSA5IDE1IDExIDIzIDE2IDE3IDEgMyAxMiAzIDIwIDQgNSA1IDMgMjEgMjIgMTUgNCAKKzIxIDIwIDcgMjIgMTQgOSAyNCA0IDE4IDcgNyAyNSAyNCAyMiAyMSAyMyAyNCAxNCBeCis1MyAwIDIwIDEyIDYgNyA0IDIgMTIgMjUgMTUgMyA5IDIzIDggMTYgMjUgMTEgMTQgNCAxMCAxOSAyMyAxNiAxMyA5IDIwIDI1IDE3IDExIAorOCA0IDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IF4KKzU0IDEgNyA4IDIwIDIxIDEyIDEwIDEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMTUgOSA5IDE0IDIgMTMgCisxNyAyNSAyIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggMjUgXgorNDQgMSA2IDE2IDE0IDE0IDEyIDE1IDEzIDI0IDEwIDE1IDExIDEwIDggMTQgMTUgMjEgMjUgMjEgMTYgOSAxOCAyMCAyMiAyMSAyMCAxMSAKKzE0IDIzIDIyIDEwIDEzIDE0IDggMTkgMTIgMiAxMSAyMCAyMyAxMyA0IDEwIDYgMjUgXgorNDkgMSA3IDIzIDExIDMgMTYgOCAyMSA0IDggMTggNSAxMiAxNCA4IDYgMjAgMTkgMjQgOCAyMyAxNyAzIDcgMTkgMSAxOCAxIDE0IDIyIAorMTMgMTQgNSA4IDIyIDE4IDE0IDI1IDE3IDExIDEyIDIyIDIgMTIgMTIgMTYgMTIgMTMgMTggMjUgXgorNDUgMSAxMiAxNyAxNCAxOCA4IDI1IDkgMjMgNSAzIDggMTQgMjQgMTcgNyAzIDMgMjMgMTcgMjIgMTkgMTkgMTcgMTYgMjIgMjQgMTQgCisxNiAyMCAyMyAyMCA5IDE5IDE2IDcgMTIgMTYgNSA4IDkgNyAxMCAyMSAyNCA3IF4KKzU4IDAgMTEgMTkgMSAyMSAxNCAxNCAxOSAzIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDkgNiAxIAorMTEgMTYgMSAxMiA4IDExIDExIDE3IDEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAyMSA3IF4KKzU0IDEgMiAyMSAxOCAxMCAyMCAyNSAyMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMTEgNCA4IDE4IDMgMTggMyAxMSAyNCAKKzIgMTQgOSAxIDEwIDQgNCAxMyAxOSAyMiA0IDcgMTkgNSAxMCAxMCAxIDggMjIgMjIgNiA4IDEzIDEyIDExIDIxIF4KKzQ3IDEgMjMgMTQgMTYgNyA1IDExIDIyIDI0IDcgMiAxMSAxMyAxOCA0IDIwIDggMSA2IDI1IDIwIDE3IDIwIDEgMjUgMTAgMTUgMTUgMiAKKzE3IDEzIDkgMjQgMTcgMjQgMjAgMTMgMTUgMTcgMyAxMSAyMCAxMCA1IDEzIDIzIDE4IDIxIF4KKzU3IDEgMyAxOCAxNSA3IDUgNyA0IDE1IDIwIDE2IDIgMTcgMSA3IDQgMTIgNyAyNSAxNCAxIDQgNyAxOSAxOSAyMCAzIDEzIDEyIDQgMyAKKzE0IDQgMTQgMTEgNiAzIDI1IDE4IDE2IDIwIDI0IDEyIDE5IDE4IDI1IDYgMjMgNiAxNSA1IDQgNCA2IDE0IDEzIDIwIDcgXgorNTEgMSAxNCAxNSAyIDEzIDIxIDExIDUgMTcgMiAyIDEwIDExIDEzIDE0IDEyIDExIDIxIDE1IDIzIDMgMiA1IDcgMjMgMTAgMjAgNiAxMiAKKzEgMTkgMTAgMjQgMjEgMjIgMjUgMTYgMTIgMTkgMjIgMTUgMTAgMTggMjQgMSA1IDE2IDEwIDE4IDIgMTkgOCBeCis0OSAwIDMgNSAxIDcgMjAgNyAxNiA2IDIwIDYgNiAyNSAxMCAyMiAyMCAyIDEgMTUgMTQgMjMgMjUgMjMgNCAxMSAxNSAxNSA2IDkgMjIgCisyMiAxOSAyMiAyNSA2IDE5IDYgMiAyMCAyMSA3IDIyIDE4IDEwIDcgMTcgNCAxNiAxMiAyNCBeCis0NiAwIDEwIDI1IDEyIDIzIDIzIDkgMiAyMiAxIDIwIDIgOCAzIDE0IDcgMSAyIDMgMTkgMjEgMjEgMjMgMjAgMjIgMTEgMjUgMjAgMjQgCisyNSAxIDkgMjEgMjAgMTQgMTAgMTQgMTkgOSAxNyAxNSAxMyA1IDE1IDI0IDIxIDE0IF4KKzU1IDAgMTMgMjUgMjIgMjEgMSAxNiAyMyA3IDI0IDE1IDMgMjIgNSAyNSAzIDQgMiA5IDEyIDI0IDYgMTkgMSAxNCA5IDUgOSAxIDE3IDkgCis0IDIzIDIxIDEgMyAxNSAxNiAxMSAxIDEyIDE4IDYgMiA3IDggMTcgOCAyMSAxMyAyMiA5IDIxIDQgOSAyMiBeCis0NSAxIDEzIDE3IDIxIDEwIDkgMTggMjQgMjMgMTMgNyAyMyAyMyAxOSAyMyAyMiAxNyAxOCAyMyAxOCAyMSAxNyAxIDEwIDEyIDQgNiAxIAorMjEgMTEgMTggMiA2IDYgMTIgMTggMTMgMTYgMTYgMTggMTkgMTMgMTEgMjEgMTkgOCBeCis1MCAxIDEyIDE1IDE2IDE5IDIgMjMgMTkgNCAxIDIgMjUgMTQgMTEgMjUgMjQgMTYgOCAxNCAyMSAyMSAxNiA2IDEzIDEgMjMgMTUgOCAKKzE3IDQgMyA0IDkgMjMgMTIgOCA4IDI0IDEzIDYgMTEgMyA4IDI0IDE5IDggMjMgMSAyNCAyNCAxMiBeCis1MyAwIDI1IDEzIDIgNiAyNSA3IDkgMyA1IDExIDE5IDExIDE2IDUgNCAxNyAyNCAyMyAxNSAxNCAxMCA3IDE0IDE3IDI1IDE1IDEwIDE0IAorNiAxOCAxOCA0IDEgMTMgMTAgMTYgMSAyNSAxNiAyIDI0IDUgMSAxNyA2IDE3IDYgMjQgMTEgNyAyMSA5IDE5IF4KKzUxIDEgOCAyNSA1IDUgMjIgMTYgMTMgNSAyIDE2IDQgMjUgMjUgOCAxOCAxMyAxMyAzIDEgMjIgMjMgMjQgMTggMTIgMjEgMTkgMiA0IAorMjQgMTMgMTEgMiA3IDI0IDIyIDE3IDUgMTUgMSA4IDMgMTAgMTUgMTggMTUgOCAxMCAxNiAyMCAyMCA4IF4KKzUwIDEgMTggMjIgMTEgMTggOSAxMSAxNSAyMiAyMCAxOCA2IDI0IDE1IDI1IDQgMjIgMTIgMTcgNCA2IDE3IDIwIDIgNCAyIDUgMjAgMTUgCisxOSAyNCAxOCA5IDggMiA1IDIzIDIgMTAgMjEgOCA1IDIgOSAxNiAxNiAxNSA2IDIyIDIzIDE4IF4KKzQ4IDEgNiAyMSA1IDIxIDI0IDMgNiAxMCAxNyAxOSA5IDE1IDExIDIzIDE2IDE3IDEgMyAxMiAzIDIwIDQgNSA1IDMgMjEgMjIgMTUgNCAKKzIxIDIwIDcgMjIgMTQgOSAyNCA0IDE4IDcgNyAyNSAyNCAyMiAyMSAyMyAyNCAxNCAxOSBeCis1NSAwIDEyIDYgNyA0IDIgMTIgMjUgMTUgMyA5IDIzIDggMTYgMjUgMTEgMTQgNCAxMCAxOSAyMyAxNiAxMyA5IDIwIDI1IDE3IDExIDggCis0IDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IDcgOCAyNCBeCis1NiAwIDIxIDEyIDEwIDEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMTUgOSA5IDE0IDIgMTMgMTcgMjUgCisyIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggNyA2IDE2IDE0IDE0IDIyIF4KKzQ3IDAgMTUgMTMgMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAxNiA5IDE4IDIwIDIyIDIxIDIwIDExIDE0IDIzIDIyIDEwIAorMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiA1IDcgMjMgMTEgMyAxNiA4IDIxIDEyIF4KKzQ5IDAgNCA4IDE4IDUgMTIgMTQgOCA2IDIwIDE5IDI0IDggMjMgMTcgMyA3IDE5IDEgMTggMSAxNCAyMiAxMyAxNCA1IDggMjIgMTggMTQgCisyNSAxNyAxMSAxMiAyMiAyIDEyIDEyIDE2IDEyIDEzIDE4IDE3IDEyIDE3IDE0IDE4IDggMjUgMjIgXgorNDYgMSAyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSAxOSAxNyAxNiAyMiAyNCAxNCAxNiAyMCAyMyAyMCA5IDE5IDE2IAorNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDEwIDExIDE5IDEgMjEgMTQgMTQgMTkgMjAgXgorNTcgMSAyMiA4IDEyIDIwIDEgMTggNSA2IDUgMTIgMTQgMSAxIDExIDkgMjIgMyAyNCA5IDYgMSAxMSAxNiAxIDEyIDggMTEgMTEgMTcgCisxMCAyMiA3IDMgMTAgMiA2IDQgMjQgMTYgMjQgMTkgNCA1IDE4IDExIDEyIDkgMjAgMjEgMjUgMiAyMSAxOCAxMCAyMCAyNSA3IF4KKzU2IDEgMyAxNyAxNyA1IDggMjIgMjUgMTkgOCAxMCAxOSA3IDExIDQgOCAxOCAzIDE4IDMgMTEgMjQgMiAxNCA5IDEgMTAgNCA0IDEzIAorMTkgMjIgNCA3IDE5IDUgMTAgMTAgMSA4IDIyIDIyIDYgOCAxMyAxMiAxMSAxNyAyMyAxNCAxNiA3IDUgMTEgMjIgMjQgMTggXgorNTQgMSAyIDExIDEzIDE4IDQgMjAgOCAxIDYgMjUgMjAgMTcgMjAgMSAyNSAxMCAxNSAxNSAyIDE3IDEzIDkgMjQgMTcgMjQgMjAgMTMgCisxNSAxNyAzIDExIDIwIDEwIDUgMTMgMjMgMTggNSAzIDE4IDE1IDcgNSA3IDQgMTUgMjAgMTYgMiAxNyAxIDcgNCAyMyBeCis1NiAwIDcgMjUgMTQgMSA0IDcgMTkgMTkgMjAgMyAxMyAxMiA0IDMgMTQgNCAxNCAxMSA2IDMgMjUgMTggMTYgMjAgMjQgMTIgMTkgMTggCisyNSA2IDIzIDYgMTUgNSA0IDQgNiAxNCAxMyAyMCA1IDE0IDE1IDIgMTMgMjEgMTEgNSAxNyAyIDIgMTAgMTEgMTMgMTQgMjQgXgorNDkgMCAxMiAxMSAyMCAzIDE0IDIgMyAyIDIzIDEyIDEyIDE3IDI0IDExIDggNiAyNCAxNiAxNSAyMiAyMSAxNCA2IDEyIDIwIDE5IDUgNSAKKzEyIDExIDYgMjMgMiAxNiAyMyA3IDI0IDYgMjEgMiAxNyAxNyA1IDI1IDExIDI1IDIwIDI1IDE5IF4KKzU0IDAgMTggNiAxMiAxOSAyNSA3IDYgNSAyIDE0IDEyIDE2IDEgMTUgNyAxIDI2IDE5IDE5IDEzIDIwIDExIDE3IDYgMjAgNSAyNCAyNCAKKzEgMjEgMTEgOSAyMCAyMSAxNSAxMCAxOSAyNiAzIDIgNiA3IDEyIDkgMTAgOCAxNCAxMCAxNSA1IDE3IDggMjEgNyBeCis1NiAwIDIwIDI1IDYgMTkgOCAzIDIyIDE2IDE2IDE2IDE3IDEzIDExIDEwIDE3IDE1IDEyIDYgMTMgMTQgMTcgNCAxMiAxMCAyNCA1IDEzIAorMjQgMyA1IDIgNSAxMSAxNCA4IDUgMTAgMTcgMTYgOCA0IDE0IDIxIDE1IDMgNiAxNyAyNSA4IDIgMyAzIDE5IDEwIDEzIDIzIF4KKzUxIDEgMjIgOCAyIDEzIDI1IDE3IDIgMSAxOSAxIDE0IDIwIDIgNSA0IDE1IDggMTQgMjAgNyAyNSAyMCAyNiAyMCAxNiA3IDE3IDE3IAorMjIgMSAxMyA2IDUgMSAxOCAxNCAxNSAyMyAxNSAxMCA1IDE5IDE4IDE4IDI2IDEyIDEzIDMgMjUgMTIgMTggXgorNTEgMSAxNiAyNCA0IDE2IDMgNiAyNiAyNiAxMCAyMCAxMyAxIDIwIDI0IDEwIDIxIDcgMjUgMiAyNSAyMiA5IDE1IDE2IDI2IDUgMTIgMSAKKzcgNCAyNCA3IDE0IDIwIDEgNCA3IDMgMTAgMTAgMTUgNiAxMyA2IDIyIDYgMjAgMjIgMiAyNiAyNiBeCis0NyAxIDYgMTQgMSAxNiAzIDI0IDI1IDI0IDE3IDEyIDE0IDE4IDE4IDkgOSAxMSAyMiAxMyA5IDIgMjIgMTUgMjAgMjAgMTggOCAxMyAKKzEzIDIxIDggMTEgNSAyNiA4IDE5IDE3IDQgMiAxNSAyNiAxMyAyNCAyNiAxMSAxNiA5IDI0IF4KKzUyIDAgOCAxOCAyMSA2IDEgOCAxIDE2IDQgMjAgMjMgMjMgMjQgMTAgMTEgMTIgMTAgMTAgMjUgMSAxMSAyNSAxMCAzIDI2IDI2IDIwIAorMTUgMTEgMTkgMTYgMTcgMyAxNiAxMiAyNSAxNSA5IDIzIDEgMiAyNCA4IDEwIDE4IDIgOSA1IDQgMTcgMTYgMTIgXgorNTAgMCAxMiAyMCAyMCAxIDMgMTEgNSA5IDMgMTcgOSAxNyAyNCAyMSAzIDQgMTYgMiAxMCAxIDI1IDUgMjIgMTYgNiAyMSAxOSAyMSAyMyAKKzE1IDkgOSAyMSAxNyAxMSAxIDE1IDE3IDIzIDI0IDExIDcgMTAgMjYgMTUgOCAyMiAyMiAxOCAxNiBeCis0OCAwIDExIDE3IDUgMjYgNyAyMyAxOSAzIDI0IDE3IDIgMTkgMTggMjYgMjEgMTIgNSAxOCAyMiAyMCA3IDE1IDYgNCA1IDIwIDEzIDEwIAorMjMgMTggMTYgMjUgMTggMTUgMiAyMCAxNCAyNCAyMiAxNyAzIDE1IDE2IDEgMTAgMiAxMiAxNiBeCis0NyAwIDIxIDEgMjEgMjEgNCAxOCAxMyAxIDI0IDE4IDIzIDE3IDE5IDYgMTkgOSAyNiAyNSAyMyAyMyAxNCAxMyAxMyAyMCAxMiAxMyA0IAorMjEgMTAgMjIgMjEgMjIgMSAxMiAxMiA3IDEzIDE2IDE4IDggOSA0IDMgMTAgMTggMTIgMjUgXgorNDcgMSA1IDE5IDE5IDEyIDI0IDEzIDE4IDEgMjIgOCAxIDE3IDE4IDI0IDMgMjIgNyA3IDE5IDI2IDEzIDI2IDYgMjYgNiAxOCAxMiA1IAorMjYgMTcgMTggMTkgMjIgMTAgMTIgOCAyMyAxMSAxNyAyMyAyNSA1IDUgMTEgNCAxMyAyMCBeCis1MiAwIDE4IDQgMTkgMjMgMyAxMyAxNSA0IDMgOSAyNCAxNCA1IDI1IDIxIDIyIDE4IDE3IDEyIDE1IDE0IDE2IDEwIDE0IDkgMTkgNyAKKzE2IDMgMjMgNCAyNiAxOCA1IDE2IDIxIDI0IDIgOCA4IDggNyAxMSAxMyAxNCA3IDkgMTIgMTggMTEgMTAgMjAgXgorNDcgMSAyMCAxMiAxNCAxOSAxMSAyMSAyMSAyMiAxOSAxMyAxMCAxNiAxOSAxNCA3IDggMTYgMjAgMTAgMyA5IDIzIDE4IDcgMjYgMTYgCisyMiAyMSAyMSA1IDE0IDExIDIgMiAxNiAyMiAxMSAyNiA3IDIyIDIzIDUgMjMgMTAgNCAyMiA1IF4KKzUwIDAgMTkgMjAgOSAxNiAxMCAyNCA0IDE5IDI2IDQgMjUgNCA4IDE3IDcgNyAyIDIzIDExIDE4IDE5IDIzIDYgMTAgOSAxIDkgMTQgMTkgCis1IDYgNiAyNSAxMiAxMSAyMSAyNiAxMiAzIDggMjAgOCAyMSAxOCAyNSAyNSAxNCA0IDExIDI1IF4KKzQ1IDEgMjMgNCAxNCAzIDE3IDI2IDIyIDI2IDIgMTUgOSA4IDI1IDE5IDEyIDIzIDE3IDIwIDE3IDEwIDQgMjMgMjAgMTcgMjEgMTQgMTQgCis5IDE4IDExIDE4IDIgMTggNCAyIDIyIDI1IDE1IDE4IDEwIDIzIDggMjEgMjYgMTUgXgorNTQgMCA3IDE0IDEwIDYgNiAxNSAxNSAxMyAyIDExIDE1IDIyIDIgOSA0IDQgNiAxNiAxMSAxMSAzIDE2IDEzIDE5IDI1IDE2IDUgNyAyMCAKKzIyIDkgMjUgMTEgMjQgMjQgMjUgMTMgOCAxNSAyMyAxNiA2IDMgMTggMjMgMTYgMjMgOCAyMCA0IDEgMSAxNCAxNiBeCis0MyAxIDEyIDI0IDE0IDE0IDI2IDIzIDEzIDI2IDE0IDIxIDI1IDI1IDQgOSAxMyA1IDggOSAyMSA4IDEyIDI2IDI0IDkgMjQgMTUgMSAKKzIzIDIyIDE2IDE0IDggMjIgMTUgMTkgMjQgMjAgNyA4IDE1IDI0IDEyIDE4IF4KKzU3IDAgNCAyMyAyMSAxMyAxOSAxNSAyMSA3IDE1IDcgMyAyMSAyMCA4IDIyIDE0IDIzIDI2IDE5IDIgMTAgMTggMyA1IDMgMSA5IDE1IAorMTUgMyA3IDEzIDIzIDkgNyAxIDEzIDE3IDE0IDI1IDkgMTYgMiAyIDYgMTMgNyAxOSAyNSAxNyAxIDUgMjEgMiA3IDIyIDUgXgorNTUgMSA2IDI1IDMgMTIgMTkgNiAyIDQgMjQgMTcgOSAxOCAyMCAxOSA0IDExIDE0IDEgNiA4IDI2IDYgOSAyMiA0IDEwIDIgNyAyMSA5IAorOCAyNCAyNSAxNCAyMiAxMiAyMiAzIDIzIDMgMyAyMCA2IDExIDIzIDYgMSA3IDUgMTggNSAxNSAyNSAyNiAyMyBeCis1MyAwIDEgMTAgMTEgMTEgNCAxMiAxMSAyMCAzIDE0IDIgMyAyIDIzIDEyIDEyIDE3IDI0IDExIDggNiAyNCAxNiAxNSAyMiAyMSAxNCA2IAorMTIgMjAgMTkgNSA1IDEyIDExIDYgMjMgMiAxNiAyMyA3IDI0IDYgMjEgMiAxNyAxNyA1IDI1IDExIDI1IDIwIDI2IF4KKzU0IDAgMjQgMTggNiAxMiAxOSAyNSA3IDYgNSAyIDE0IDEyIDE2IDEgMTUgNyAxIDI2IDE5IDE5IDEzIDIwIDExIDE3IDYgMjAgNSAyNCAKKzI0IDEgMjEgMTEgOSAyMCAyMSAxNSAxMCAxOSAyNiAzIDIgNiA3IDEyIDkgMTAgOCAxNCAxMCAxNSA1IDE3IDggMjMgXgorNTggMCAxIDIwIDI1IDYgMTkgOCAzIDIyIDE2IDE2IDE2IDE3IDEzIDExIDEwIDE3IDE1IDEyIDYgMTMgMTQgMTcgNCAxMiAxMCAyNCA1IAorMTMgMjQgMyA1IDIgNSAxMSAxNCA4IDUgMTAgMTcgMTYgOCA0IDE0IDIxIDE1IDMgNiAxNyAyNSA4IDIgMyAzIDE5IDEwIDEzIDIyIDE5IF4KKzUyIDEgOCAyIDEzIDI1IDE3IDIgMSAxOSAxIDE0IDIwIDIgNSA0IDE1IDggMTQgMjAgNyAyNSAyMCAyNiAyMCAxNiA3IDE3IDE3IDIyIDEgCisxMyA2IDUgMSAxOCAxNCAxNSAyMyAxNSAxMCA1IDE5IDE4IDE4IDI2IDEyIDEzIDMgMjUgMTIgMjEgMTYgMjIgXgorNTYgMSA0IDE2IDMgNiAyNiAyNiAxMCAyMCAxMyAxIDIwIDI0IDEwIDIxIDcgMjUgMiAyNSAyMiA5IDE1IDE2IDI2IDUgMTIgMSA3IDQgCisyNCA3IDE0IDIwIDEgNCA3IDMgMTAgMTAgMTUgNiAxMyA2IDIyIDYgMjAgMjIgMiAyNiA5IDYgMTQgMSAxNiAzIDI0IDEyIF4KKzUyIDAgMjQgMTcgMTIgMTQgMTggMTggOSA5IDExIDIyIDEzIDkgMiAyMiAxNSAyMCAyMCAxOCA4IDEzIDEzIDIxIDggMTEgNSAyNiA4IAorMTkgMTcgNCAyIDE1IDI2IDEzIDI0IDI2IDExIDE2IDkgMSA4IDE4IDIxIDYgMSA4IDEgMTYgNCAyMCAyMyA1IF4KKzU0IDAgMjQgMTAgMTEgMTIgMTAgMTAgMjUgMSAxMSAyNSAxMCAzIDI2IDI2IDIwIDE1IDExIDE5IDE2IDE3IDMgMTYgMTIgMjUgMTUgOSAKKzIzIDEgMiAyNCA4IDEwIDE4IDIgOSA1IDQgMTcgMTYgOSAxMiAyMCAyMCAxIDMgMTEgNSA5IDMgMTcgOSAxNyAyNCAyMCBeCis0OSAxIDMgNCAxNiAyIDEwIDEgMjUgNSAyMiAxNiA2IDIxIDE5IDIxIDIzIDE1IDkgOSAyMSAxNyAxMSAxIDE1IDE3IDIzIDI0IDExIDcgCisxMCAyNiAxNSA4IDIyIDIyIDE4IDI2IDExIDE3IDUgMjYgNyAyMyAxOSAzIDI0IDE3IDIgMTkgOCBeCis0OSAwIDI2IDIxIDEyIDUgMTggMjIgMjAgNyAxNSA2IDQgNSAyMCAxMyAxMCAyMyAxOCAxNiAyNSAxOCAxNSAyIDIwIDE0IDI0IDIyIDE3IAorMyAxNSAxNiAxIDEwIDIgMTIgMiAyMSAxIDIxIDIxIDQgMTggMTMgMSAyNCAxOCAyMyAxNyAxOSAyMyBeCis1MCAxIDE5IDkgMjYgMjUgMjMgMjMgMTQgMTMgMTMgMjAgMTIgMTMgNCAyMSAxMCAyMiAyMSAyMiAxIDEyIDEyIDcgMTMgMTYgMTggOCA5IAorNCAzIDEwIDE4IDEyIDQgNSAxOSAxOSAxMiAyNCAxMyAxOCAxIDIyIDggMSAxNyAxOCAyNCAzIDIyIDIxIF4KKzQ4IDEgNyAxOSAyNiAxMyAyNiA2IDI2IDYgMTggMTIgNSAyNiAxNyAxOCAxOSAyMiAxMCAxMiA4IDIzIDExIDE3IDIzIDI1IDUgNSAxMSAKKzQgMTMgNyAxOCA0IDE5IDIzIDMgMTMgMTUgNCAzIDkgMjQgMTQgNSAyNSAyMSAyMiAxOCAyNSBeCis1MyAxIDEyIDE1IDE0IDE2IDEwIDE0IDkgMTkgNyAxNiAzIDIzIDQgMjYgMTggNSAxNiAyMSAyNCAyIDggOCA4IDcgMTEgMTMgMTQgNyA5IAorMTIgMTggMTEgMTAgNyAyMCAxMiAxNCAxOSAxMSAyMSAyMSAyMiAxOSAxMyAxMCAxNiAxOSAxNCA3IDggMTYgMjAgNyBeCis0OSAwIDMgOSAyMyAxOCA3IDI2IDE2IDIyIDIxIDIxIDUgMTQgMTEgMiAyIDE2IDIyIDExIDI2IDcgMjIgMjMgNSAyMyAxMCA0IDIyIDI0IAorMTkgMjAgOSAxNiAxMCAyNCA0IDE5IDI2IDQgMjUgNCA4IDE3IDcgNyAyIDIzIDExIDE4IDE5IF4KKzQ5IDAgMjMgNiAxMCA5IDEgOSAxNCAxOSA1IDYgNiAyNSAxMiAxMSAyMSAyNiAxMiAzIDggMjAgOCAyMSAxOCAyNSAyNSAxNCA0IDExIAorMjQgMjMgNCAxNCAzIDE3IDI2IDIyIDI2IDIgMTUgOSA4IDI1IDE5IDEyIDIzIDE3IDIwIDE3IDEwIF4KKzU0IDAgNCAyMyAyMCAxNyAyMSAxNCAxNCA5IDE4IDExIDE4IDIgMTggNCAyIDIyIDI1IDE1IDE4IDEwIDIzIDggMjEgMjYgNyAxNCAxMCAKKzYgNiAxNSAxNSAxMyAyIDExIDE1IDIyIDIgOSA0IDQgNiAxNiAxMSAxMSAzIDE2IDEzIDE5IDI1IDE2IDUgNyAyMCAyMyBeCis0NyAwIDkgMjUgMTEgMjQgMjQgMjUgMTMgOCAxNSAyMyAxNiA2IDMgMTggMjMgMTYgMjMgOCAyMCA0IDEgMSAxNCAxMyAxMiAyNCAxNCAKKzE0IDI2IDIzIDEzIDI2IDE0IDIxIDI1IDI1IDQgOSAxMyA1IDggOSAyMSA4IDEyIDI2IDE1IF4KKzUxIDEgOSAyNCAxNSAxIDIzIDIyIDE2IDE0IDggMjIgMTUgMTkgMjQgMjAgNyA4IDE1IDI0IDEyIDQgNCAyMyAyMSAxMyAxOSAxNSAyMSAKKzcgMTUgNyAzIDIxIDIwIDggMjIgMTQgMjMgMjYgMTkgMiAxMCAxOCAzIDUgMyAxIDkgMTUgMTUgMyAyNCBeCis2MCAwIDEzIDIzIDkgNyAxIDEzIDE3IDE0IDI1IDkgMTYgMiAyIDYgMTMgNyAxOSAyNSAxNyAxIDUgMjEgMiA3IDIyIDUgNiAyNSAzIDEyIAorMTkgNiAyIDQgMjQgMTcgOSAxOCAyMCAxOSA0IDExIDE0IDEgNiA4IDI2IDYgOSAyMiA0IDEwIDIgNyAyMSA5IDggMjQgMjUgMTAgXgorNTkgMCAyMiAxMiAyMiAzIDIzIDMgMyAyMCA2IDExIDIzIDYgMSA3IDUgMTggNSAxNSAyNSAyNiAxIDEgMTAgMTEgMTEgNCAxMiAxMSAyMCAKKzMgMTQgMiAzIDIgMjMgMTIgMTIgMTcgMjQgMTEgOCA2IDI0IDE2IDE1IDIyIDIxIDE0IDYgMTIgMjAgMTkgNSA1IDEyIDExIDYgMjMgOCBeCis1MCAwIDE2IDIzIDcgMjQgNiAyMSAyIDE3IDE3IDUgMjUgMTEgMjUgMjAgMjUgMjQgMTggNiAxMiAxOSAyNSA3IDYgNSAyIDE0IDEyIDE2IAorMSAxNSA3IDEgMjYgMTkgMTkgMTMgMjAgMTEgMTcgNiAyMCA1IDI0IDI0IDEgMjEgMTEgOSAyMCAxNCBeCis2MCAwIDE1IDEwIDE5IDI2IDMgMiA2IDcgMTIgOSAxMCA4IDE0IDEwIDE1IDUgMTcgOCAyMSAxIDIwIDI1IDYgMTkgOCAzIDIyIDE2IDE2IAorMTYgMTcgMTMgMTEgMTAgMTcgMTUgMTIgNiAxMyAxNCAxNyA0IDEyIDEwIDI0IDUgMTMgMjQgMyA1IDIgNSAxMSAxNCA4IDUgMTAgMTcgCisxNiAxMyBeCis1NyAwIDQgMTQgMjEgMTUgMyA2IDE3IDI1IDggMiAzIDMgMTkgMTAgMTMgMjIgMjIgOCAyIDEzIDI1IDE3IDIgMSAxOSAxIDE0IDIwIDIgCis1IDQgMTUgOCAxNCAyMCA3IDI1IDIwIDI2IDIwIDE2IDcgMTcgMTcgMjIgMSAxMyA2IDUgMSAxOCAxNCAxNSAyMyAxNSAxMCAyMSBeCis1MiAxIDE5IDE4IDE4IDI2IDEyIDEzIDMgMjUgMTIgMjEgMTYgMjQgNCAxNiAzIDYgMjYgMjYgMTAgMjAgMTMgMSAyMCAyNCAxMCAyMSA3IAorMjUgMiAyNSAyMiA5IDE1IDE2IDI2IDUgMTIgMSA3IDQgMjQgNyAxNCAyMCAxIDQgNyAzIDEwIDEwIDE1IDE5IF4KKzUxIDAgMTMgNiAyMiA2IDIwIDIyIDIgMjYgOSA2IDE0IDEgMTYgMyAyNCAyNSAyNCAxNyAxMiAxNCAxOCAxOCA5IDkgMTEgMjIgMTMgOSAKKzIgMjIgMTUgMjAgMjAgMTggOCAxMyAxMyAyMSA4IDExIDUgMjYgOCAxOSAxNyA0IDIgMTUgMjYgMTMgMjEgXgorNTIgMSAyNCAyNiAxMSAxNiA5IDEgOCAxOCAyMSA2IDEgOCAxIDE2IDQgMjAgMjMgMjMgMjQgMTAgMTEgMTIgMTAgMTAgMjUgMSAxMSAyNSAKKzEwIDMgMjYgMjYgMjAgMTUgMTEgMTkgMTYgMTcgMyAxNiAxMiAyNSAxNSA5IDIzIDEgMiAyNCA4IDEwIDE4IDE1IF4KKzU1IDEgOSA1IDQgMTcgMTYgOSAxMiAyMCAyMCAxIDMgMTEgNSA5IDMgMTcgOSAxNyAyNCAyMSAzIDQgMTYgMiAxMCAxIDI1IDUgMjIgMTYgCis2IDIxIDE5IDIxIDIzIDE1IDkgOSAyMSAxNyAxMSAxIDE1IDE3IDIzIDI0IDExIDcgMTAgMjYgMTUgOCAyMiAyMiAxMSBeCis1MCAxIDI2IDExIDE3IDUgMjYgNyAyMyAxOSAzIDI0IDE3IDIgMTkgMTggMjYgMjEgMTIgNSAxOCAyMiAyMCA3IDE1IDYgNCA1IDIwIDEzIAorMTAgMjMgMTggMTYgMjUgMTggMTUgMiAyMCAxNCAyNCAyMiAxNyAzIDE1IDE2IDEgMTAgMiAxMiAyIDI1IF4KKzUxIDAgMSAyMSAyMSA0IDE4IDEzIDEgMjQgMTggMjMgMTcgMTkgNiAxOSA5IDI2IDI1IDIzIDIzIDE0IDEzIDEzIDIwIDEyIDEzIDQgMjEgCisxMCAyMiAyMSAyMiAxIDEyIDEyIDcgMTMgMTYgMTggOCA5IDQgMyAxMCAxOCAxMiA0IDUgMTkgMTkgMTIgMjQgXgorNTMgMSAxMyAxOCAxIDIyIDggMSAxNyAxOCAyNCAzIDIyIDcgNyAxOSAyNiAxMyAyNiA2IDI2IDYgMTggMTIgNSAyNiAxNyAxOCAxOSAyMiAKKzEwIDEyIDggMjMgMTEgMTcgMjMgMjUgNSA1IDExIDQgMTMgNyAxOCA0IDE5IDIzIDMgMTMgMTUgNCAzIDkgMTggXgorNTEgMSAxNCA1IDI1IDIxIDIyIDE4IDE3IDEyIDE1IDE0IDE2IDEwIDE0IDkgMTkgNyAxNiAzIDIzIDQgMjYgMTggNSAxNiAyMSAyNCAyIAorOCA4IDggNyAxMSAxMyAxNCA3IDkgMTIgMTggMTEgMTAgNyAyMCAxMiAxNCAxOSAxMSAyMSAyMSAyMiAxOSAyNiBeCis0OSAwIDEwIDE2IDE5IDE0IDcgOCAxNiAyMCAxMCAzIDkgMjMgMTggNyAyNiAxNiAyMiAyMSAyMSA1IDE0IDExIDIgMiAxNiAyMiAxMSAKKzI2IDcgMjIgMjMgNSAyMyAxMCA0IDIyIDI0IDE5IDIwIDkgMTYgMTAgMjQgNCAxOSAyNiA0IDI1IDE0IF4KKzUyIDAgOCAxNyA3IDcgMiAyMyAxMSAxOCAxOSAyMyA2IDEwIDkgMSA5IDE0IDE5IDUgNiA2IDI1IDEyIDExIDIxIDI2IDEyIDMgOCAyMCAKKzggMjEgMTggMjUgMjUgMTQgNCAxMSAyNCAyMyA0IDE0IDMgMTcgMjYgMjIgMjYgMiAxNSA5IDggMjUgMjQgXgorNTUgMSAxMiAyMyAxNyAyMCAxNyAxMCA0IDIzIDIwIDE3IDIxIDE0IDE0IDkgMTggMTEgMTggMiAxOCA0IDIgMjIgMjUgMTUgMTggMTAgCisyMyA4IDIxIDI2IDcgMTQgMTAgNiA2IDE1IDE1IDEzIDIgMTEgMTUgMjIgMiA5IDQgNCA2IDE2IDExIDExIDMgMTYgMTMgMTkgMTUgXgorNDkgMCAxNiA1IDcgMjAgMjIgOSAyNSAxMSAyNCAyNCAyNSAxMyA4IDE1IDIzIDE2IDYgMyAxOCAyMyAxNiAyMyA4IDIwIDQgMSAxIDE0IAorMTMgMTIgMjQgMTQgMTQgMjYgMjMgMTMgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDkgXgorNTUgMCAyMiAyNCA5IDI3IDIzIDEgMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIDQgNSAxNSAyNyAxMiAyMCAxIDE3IDUgNCAxNCAyNSAxNCAKKzMgMTkgMjQgMjQgMTQgOCAxMyAxMiAxOSA4IDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAxOCAxOCBeCis1MSAwIDcgMyAyNSAxIDE3IDggMjYgMjUgMTEgMjMgMTQgMjcgMSAyMiAxMSA5IDcgMTkgNCAxNSAxOCAyIDI3IDIwIDExIDUgMjAgMjIgCisxOSAxNSA1IDYgMTcgOCAxIDE5IDIyIDkgMjMgMTAgMjYgMjcgMjYgMTQgMTIgMyAxNCAxNSAxMSAyIDI2IF4KKzUwIDAgNiAyMiAyMCA4IDI1IDQgMjUgMjQgMjMgMjAgMyAzIDE2IDIgMiAyNyAyIDE1IDE0IDI3IDMgMTcgMTIgMjcgMjcgNyAyNiAyIAorMjIgMTEgOSAxMCAyNCAxNSAxIDI3IDExIDI3IDQgMSAyNSAyNSAxNiA2IDIgMjIgMTIgMTcgMjEgMTQgXgorNTIgMCA4IDkgMjIgMTcgMTIgNyAxOCAxNCAyMyAyIDYgNCAyMyA5IDQgMjIgMTYgMTggMjMgOCAxMSAyNSAxNyAyNyAxNiAxMCAzIDI0IAorOCAyMCAyMCAxOCAxOCAxMyA0IDIgMTggMjIgMTUgMjUgMjYgOSAzIDEgMiAxOSAxNSAxIDI0IDE3IDE2IDE4IF4KKzQ5IDAgOSAxNCAxMSA4IDE2IDE5IDE2IDIyIDEwIDE2IDI0IDI1IDcgMjIgMTIgMjAgMTUgMjMgMjIgMTggMjIgMTQgNiAyNiAyMSAxMCAKKzIxIDcgMTMgMiAxNiA3IDI0IDE2IDIyIDEzIDEwIDcgMTEgMTYgNSA5IDI1IDEzIDkgMTQgMTQgMTcgMTQgXgorNTQgMSAyIDEwIDUgMjUgNSA3IDEwIDIyIDEwIDEgMjQgMyAxMSA3IDIzIDUgMTcgMTQgMyAxOCA1IDEzIDI2IDE1IDUgMTMgMjMgMTggCisxNyAzIDE4IDMgMjcgMTUgNiAyNSAyNCAyMiAyNyAxNyA0IDI1IDIzIDE1IDkgMTUgMjEgOCA3IDcgMTUgMyAxMyAyNSBeCis0NyAwIDI1IDMgNCAxMCAyNCAxMiA3IDE2IDI1IDE4IDIxIDIxIDIwIDI3IDEzIDE0IDIzIDI3IDEgMjEgOSAyMSAxNCAyMiA5IDkgNSAKKzE1IDEzIDE3IDMgNCA5IDE2IDEgOCAyMyAxNyAyMyAyNiA4IDI0IDEwIDIwIDI1IDI3IDI1IF4KKzU4IDEgOCAyNiA4IDEwIDQgMyA4IDE0IDUgNSA3IDExIDEzIDExIDI2IDExIDQgMjYgMTcgMjAgMTkgMTEgMTAgMyAxMCAxNCA5IDYgOSAKKzcgMTYgMTAgNCA0IDE5IDE5IDIgMjYgMTMgMTkgMTcgMTUgMjQgMTUgNCAyMSAyMiAxMyAxMyAxMiAyMiAyIDE0IDIwIDUgMTggNyAyNSBeCis1OCAwIDE3IDI0IDIwIDEzIDYgMTcgOSAyMCAyIDEwIDE5IDMgMjIgNCAxIDExIDMgNSAzIDIxIDExIDE1IDEyIDIzIDI2IDUgMiAyNyA2IAorNSAxNiA2IDMgMiAyMyA1IDMgMjAgMjAgNCAyNCAyIDE4IDIxIDcgMTQgMTAgMjcgMjMgNiAyNCA2IDE5IDIzIDMgOSAyMiAxNSBeCis1NCAwIDIxIDE3IDE5IDI1IDE3IDcgMjEgMTkgNiAxNiAxNSAxNSAyMCAxNCAyIDI1IDE5IDE0IDE4IDE5IDcgOSAxIDE0IDExIDEwIDE2IAorMyAyMyAxNCAyNiAxMCAxMSAxIDE4IDEgMTIgMjQgMTkgMTkgMSA3IDIgMyAyNCA3IDEyIDkgMiA4IDE2IDIwIDI0IDI1IF4KKzQ5IDEgMjYgMjYgNCA5IDIgNyAyNSA5IDggMTIgMTggMTQgMjYgNyAxNyAxOCA0IDIwIDEgMTYgMTQgMjEgMjYgNCA2IDggMjQgMTEgMjUgCisxNSAyNCAxNiAyMyA0IDEwIDIzIDIxIDI0IDE1IDEwIDkgMjYgNyAxNCAyNCAyMSA2IDIwIDE5IF4KKzU2IDEgMTcgMTYgMTcgMSAzIDEyIDEgNCAxMyAzIDkgMjEgMjMgNyAxOCAxMSAxIDE5IDIwIDIzIDEyIDEyIDI3IDEzIDEzIDE1IDE2IAorMTMgMSAxNiAxNSAxMiAyNiAzIDE2IDE2IDggMTcgMTMgMjEgNCA2IDUgMTkgMTQgMTYgNCAxNiAxMSAxNCAxOCAxOCAyNyA5IDEzIDIyIF4KKzUxIDEgMyAyNiAyMiAzIDcgNiA0IDI2IDMgMTUgOCAyNSAxIDIwIDEzIDkgMTEgMjAgNiAxMSAyMSAyNyAyNSAyMCA3IDQgMTggMjYgMTYgCisyNyA1IDEyIDE5IDcgMjMgNiAyNSAyNSAyIDExIDEzIDI1IDIxIDE4IDE3IDYgMTIgMTQgMTMgMjQgMTMgXgorNDggMSAxNCAxOSAyNiAyNyAyNSA2IDEgMTUgNCA3IDI3IDI0IDI3IDIxIDUgMjcgMTkgMTggOCAyMSAzIDIzIDIwIDIxIDI1IDIxIDEgOSAKKzE3IDIyIDUgMjIgOCAyIDEzIDI3IDggMTkgMjcgMjEgMiA1IDggNCAyNyAxMCA2IDI1IF4KKzUyIDAgMiA2IDEgMSAyNiAxOCAxMyA1IDEwIDE4IDEwIDggNSAyMSAxNSA1IDE0IDE5IDEyIDQgOCAyMCAyMSAyNiAxIDEyIDI1IDEwIDIgCisxNyAxMCAxNSAyIDIwIDI1IDI2IDIzIDI1IDEyIDE2IDE1IDkgMTggMTUgMTkgMjEgMTYgMjYgMTEgMTggMjAgMjYgXgorNTMgMCA2IDIyIDcgOCA4IDEyIDIgMjEgMTggMTIgMTEgNSAxOSAzIDE5IDI3IDE4IDI1IDIyIDIyIDIzIDE2IDIgMSAyMCAxNiAxNCAyMiAKKzYgMTUgMjIgMSAyMSA2IDYgMTAgMiAyNiAxMiAxMSA2IDI3IDE0IDcgMjAgMjYgMjAgMTcgNyAxOSA1IDIzIDE0IF4KKzYxIDAgMTYgMTIgNyAxNSAxNyA3IDUgMTEgMTIgMTUgNyAxIDEwIDEwIDggNCAyIDQgMTcgNCAxMSAxNyAyNiAyMyAyNCA0IDUgMTIgNSAKKzEgNiA5IDYgOCAyNyA1IDExIDExIDI0IDI0IDEzIDE3IDIgMjQgMjYgMTkgMTEgMjIgMjEgMiAyIDE0IDIxIDEzIDEgMjMgMTAgMjUgOCAKKzE1IDEzIF4KKzUyIDAgMTkgMjMgMiA5IDI2IDYgMjMgMTMgNSAyNCAxMiAyMSAxMSAxNCA0IDEyIDEwIDEyIDIyIDQgMyAyMCAxNyAxMCAxMyAxNiA5IAorMTAgMjcgOSAxMiAxMyAyMCAxMCAxMiAyMyAyMyAxMSAxOSAxMyAyNSAyMiA4IDEgNSAxNiAyMCA5IDE5IDkgMjQgMjYgXgorNTEgMCAxMiAxNSA2IDIxIDI3IDIyIDI2IDI0IDE4IDkgMTUgOCAyMiAyNCA5IDI3IDIzIDEgMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIAorNCA1IDE1IDI3IDEyIDIwIDEgMTcgNSA0IDE0IDI1IDE0IDMgMTkgMjQgMjQgMTQgOCAxMyAxMiAxOSAyMiBeCis1NiAwIDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAxOCA2IDcgMyAyNSAxIDE3IDggMjYgMjUgMTEgMjMgMTQgMjcgCisxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAyMiAxOSAxNSA1IDYgMTcgOCAxIDE5IDIyIDkgMjMgMTcgXgorNTAgMCAyNiAyNyAyNiAxNCAxMiAzIDE0IDE1IDExIDIgMTIgNiAyMiAyMCA4IDI1IDQgMjUgMjQgMjMgMjAgMyAzIDE2IDIgMiAyNyAyIAorMTUgMTQgMjcgMyAxNyAxMiAyNyAyNyA3IDI2IDIgMjIgMTEgOSAxMCAyNCAxNSAxIDI3IDExIDI3IDIxIF4KKzUyIDAgMSAyNSAyNSAxNiA2IDIgMjIgMTIgMTcgMjEgMTIgOCA5IDIyIDE3IDEyIDcgMTggMTQgMjMgMiA2IDQgMjMgOSA0IDIyIDE2IAorMTggMjMgOCAxMSAyNSAxNyAyNyAxNiAxMCAzIDI0IDggMjAgMjAgMTggMTggMTMgNCAyIDE4IDIyIDE1IDI1IDEwIF4KKzUyIDAgOSAzIDEgMiAxOSAxNSAxIDI0IDE3IDE2IDE4IDkgMTQgMTEgOCAxNiAxOSAxNiAyMiAxMCAxNiAyNCAyNSA3IDIyIDEyIDIwIAorMTUgMjMgMjIgMTggMjIgMTQgNiAyNiAyMSAxMCAyMSA3IDEzIDIgMTYgNyAyNCAxNiAyMiAxMyAxMCA3IDExIDE2IDEzIF4KKzUzIDEgOSAyNSAxMyA5IDE0IDE0IDE3IDI1IDIgMTAgNSAyNSA1IDcgMTAgMjIgMTAgMSAyNCAzIDExIDcgMjMgNSAxNyAxNCAzIDE4IDUgCisxMyAyNiAxNSA1IDEzIDIzIDE4IDE3IDMgMTggMyAyNyAxNSA2IDI1IDI0IDIyIDI3IDE3IDQgMjUgMjMgMTUgMTUgXgorNTIgMSAxNSAyMSA4IDcgNyAxNSAzIDEzIDIyIDI1IDMgNCAxMCAyNCAxMiA3IDE2IDI1IDE4IDIxIDIxIDIwIDI3IDEzIDE0IDIzIDI3IAorMSAyMSA5IDIxIDE0IDIyIDkgOSA1IDE1IDEzIDE3IDMgNCA5IDE2IDEgOCAyMyAxNyAyMyAyNiA4IDI0IDE0IF4KKzU4IDAgMjAgMjUgMjcgMyA4IDI2IDggMTAgNCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAxNyAyMCAxOSAxMSAxMCAzIAorMTAgMTQgOSA2IDkgNyAxNiAxMCA0IDQgMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIDEzIDEzIDEyIDIyIDIgMTQgCisxOCBeCis2MCAwIDUgMTggNyAxNyAyNCAyMCAxMyA2IDE3IDkgMjAgMiAxMCAxOSAzIDIyIDQgMSAxMSAzIDUgMyAyMSAxMSAxNSAxMiAyMyAyNiA1IAorMiAyNyA2IDUgMTYgNiAzIDIgMjMgNSAzIDIwIDIwIDQgMjQgMiAxOCAyMSA3IDE0IDEwIDI3IDIzIDYgMjQgNiAxOSAyMyAzIDkgMjUgXgorNTUgMCAxNiAyMSAxNyAxOSAyNSAxNyA3IDIxIDE5IDYgMTYgMTUgMTUgMjAgMTQgMiAyNSAxOSAxNCAxOCAxOSA3IDkgMSAxNCAxMSAxMCAKKzE2IDMgMjMgMTQgMjYgMTAgMTEgMSAxOCAxIDEyIDI0IDE5IDE5IDEgNyAyIDMgMjQgNyAxMiA5IDIgOCAxNiAyMCAyNCAyNyBeCis1MSAxIDI2IDI2IDQgOSAyIDcgMjUgOSA4IDEyIDE4IDE0IDI2IDcgMTcgMTggNCAyMCAxIDE2IDE0IDIxIDI2IDQgNiA4IDI0IDExIDI1IAorMTUgMjQgMTYgMjMgNCAxMCAyMyAyMSAyNCAxNSAxMCA5IDI2IDcgMTQgMjQgMjEgNiAyMCA1IDE3IDE1IF4KKzU3IDAgMTcgMSAzIDEyIDEgNCAxMyAzIDkgMjEgMjMgNyAxOCAxMSAxIDE5IDIwIDIzIDEyIDEyIDI3IDEzIDEzIDE1IDE2IDEzIDEgMTYgCisxNSAxMiAyNiAzIDE2IDE2IDggMTcgMTMgMjEgNCA2IDUgMTkgMTQgMTYgNCAxNiAxMSAxNCAxOCAxOCAyNyA5IDEzIDIxIDMgMjYgMjMgXgorNTIgMCAzIDcgNiA0IDI2IDMgMTUgOCAyNSAxIDIwIDEzIDkgMTEgMjAgNiAxMSAyMSAyNyAyNSAyMCA3IDQgMTggMjYgMTYgMjcgNSAxMiAKKzE5IDcgMjMgNiAyNSAyNSAyIDExIDEzIDI1IDIxIDE4IDE3IDYgMTIgMTQgMTMgMjQgMTEgMTQgMTkgMjYgMTIgXgorNTUgMSAyNSA2IDEgMTUgNCA3IDI3IDI0IDI3IDIxIDUgMjcgMTkgMTggOCAyMSAzIDIzIDIwIDIxIDI1IDIxIDEgOSAxNyAyMiA1IDIyIAorOCAyIDEzIDI3IDggMTkgMjcgMjEgMiA1IDggNCAyNyAxMCA2IDE4IDIgNiAxIDEgMjYgMTggMTMgNSAxMCAxOCAxMSBeCis1MiAwIDggNSAyMSAxNSA1IDE0IDE5IDEyIDQgOCAyMCAyMSAyNiAxIDEyIDI1IDEwIDIgMTcgMTAgMTUgMiAyMCAyNSAyNiAyMyAyNSAKKzEyIDE2IDE1IDkgMTggMTUgMTkgMjEgMTYgMjYgMTEgMTggMjAgNiAyMiA3IDggOCAxMiAyIDIxIDE4IDEyIDExIDI3IF4KKzUzIDEgMTkgMyAxOSAyNyAxOCAyNSAyMiAyMiAyMyAxNiAyIDEgMjAgMTYgMTQgMjIgNiAxNSAyMiAxIDIxIDYgNiAxMCAyIDI2IDEyIAorMTEgNiAyNyAxNCA3IDIwIDI2IDIwIDE3IDcgMTkgNSAyMyAxOCAxNiAxMiA3IDE1IDE3IDcgNSAxMSAxMiAxNSA3IDIyIF4KKzU3IDEgMTAgMTAgOCA0IDIgNCAxNyA0IDExIDE3IDI2IDIzIDI0IDQgNSAxMiA1IDEgNiA5IDYgOCAyNyA1IDExIDExIDI0IDI0IDEzIAorMTcgMiAyNCAyNiAxOSAxMSAyMiAyMSAyIDIgMTQgMjEgMTMgMSAyMyAxMCAyNSA4IDE1IDI2IDE5IDIzIDIgOSAyNiA2IDIzIDIyIF4KKzUyIDEgNSAyNCAxMiAyMSAxMSAxNCA0IDEyIDEwIDEyIDIyIDQgMyAyMCAxNyAxMCAxMyAxNiA5IDEwIDI3IDkgMTIgMTMgMjAgMTAgMTIgCisyMyAyMyAxMSAxOSAxMyAyNSAyMiA4IDEgNSAxNiAyMCA5IDE5IDkgMjQgMjAgMTIgMTUgNiAyMSAyNyAyMiAyNiAxNiBeCis1OCAwIDE4IDkgMTUgOCAyMiAyNCA5IDI3IDIzIDEgMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIDQgNSAxNSAyNyAxMiAyMCAxIDE3IDUgCis0IDE0IDI1IDE0IDMgMTkgMjQgMjQgMTQgOCAxMyAxMiAxOSA4IDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAyMiBeCis1NSAwIDYgNyAzIDI1IDEgMTcgOCAyNiAyNSAxMSAyMyAxNCAyNyAxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAKKzIyIDE5IDE1IDUgNiAxNyA4IDEgMTkgMjIgOSAyMyAxMCAyNiAyNyAyNiAxNCAxMiAzIDE0IDE1IDExIDIgMTIgNiAyMiAxNiBeCis1MyAwIDggMjUgNCAyNSAyNCAyMyAyMCAzIDMgMTYgMiAyIDI3IDIgMTUgMTQgMjcgMyAxNyAxMiAyNyAyNyA3IDI2IDIgMjIgMTEgOSAKKzEwIDI0IDE1IDEgMjcgMTEgMjcgNCAxIDI1IDI1IDE2IDYgMiAyMiAxMiAxNyAyMSAxMiA4IDkgMjIgMTcgMTIgMTggXgorNTQgMCA3IDE4IDE0IDIzIDIgNiA0IDIzIDkgNCAyMiAxNiAxOCAyMyA4IDExIDI1IDE3IDI3IDE2IDEwIDMgMjQgOCAyMCAyMCAxOCAxOCAKKzEzIDQgMiAxOCAyMiAxNSAyNSAyNiA5IDMgMSAyIDE5IDE1IDEgMjQgMTcgMTYgMTggOSAxNCAxMSA4IDE2IDE5IDI3IF4KKzUyIDAgMjIgMTAgMTYgMjQgMjUgNyAyMiAxMiAyMCAxNSAyMyAyMiAxOCAyMiAxNCA2IDI2IDIxIDEwIDIxIDcgMTMgMiAxNiA3IDI0IAorMTYgMjIgMTMgMTAgNyAxMSAxNiA1IDkgMjUgMTMgOSAxNCAxNCAxNyAyNSAyIDEwIDUgMjUgNSA3IDEwIDIyIDEwIDIyIF4KKzU0IDEgMjQgMyAxMSA3IDIzIDUgMTcgMTQgMyAxOCA1IDEzIDI2IDE1IDUgMTMgMjMgMTggMTcgMyAxOCAzIDI3IDE1IDYgMjUgMjQgMjIgCisyNyAxNyA0IDI1IDIzIDE1IDkgMTUgMjEgOCA3IDcgMTUgMyAxMyAyMiAyNSAzIDQgMTAgMjQgMTIgNyAxNiAyNSAxMCBeCis1NiAwIDIxIDIxIDIwIDI3IDEzIDE0IDIzIDI3IDEgMjEgOSAyMSAxNCAyMiA5IDkgNSAxNSAxMyAxNyAzIDQgOSAxNiAxIDggMjMgMTcgCisyMyAyNiA4IDI0IDEwIDIwIDI1IDI3IDMgOCAyNiA4IDEwIDQgMyA4IDE0IDUgNSA3IDExIDEzIDExIDI2IDExIDQgMjYgMiBeCis2MSAxIDIwIDE5IDExIDEwIDMgMTAgMTQgOSA2IDkgNyAxNiAxMCA0IDQgMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIAorMTMgMTMgMTIgMjIgMiAxNCAyMCA1IDE4IDcgMTcgMjQgMjAgMTMgNiAxNyA5IDIwIDIgMTAgMTkgMyAyMiA0IDEgMTEgMyA1IDMgMjEgCisxMSAxNSAyMiBeCis1MyAwIDIzIDI2IDUgMiAyNyA2IDUgMTYgNiAzIDIgMjMgNSAzIDIwIDIwIDQgMjQgMiAxOCAyMSA3IDE0IDEwIDI3IDIzIDYgMjQgNiAKKzE5IDIzIDMgOSAyMiAxNiAyMSAxNyAxOSAyNSAxNyA3IDIxIDE5IDYgMTYgMTUgMTUgMjAgMTQgMiAyNSAxOSAyNSBeCis2MCAwIDE4IDE5IDcgOSAxIDE0IDExIDEwIDE2IDMgMjMgMTQgMjYgMTAgMTEgMSAxOCAxIDEyIDI0IDE5IDE5IDEgNyAyIDMgMjQgNyAKKzEyIDkgMiA4IDE2IDIwIDI0IDUgMjYgMjYgNCA5IDIgNyAyNSA5IDggMTIgMTggMTQgMjYgNyAxNyAxOCA0IDIwIDEgMTYgMTQgMjEgMjYgCisxOCBeCis1NCAwIDYgOCAyNCAxMSAyNSAxNSAyNCAxNiAyMyA0IDEwIDIzIDIxIDI0IDE1IDEwIDkgMjYgNyAxNCAyNCAyMSA2IDIwIDUgMTcgMTYgCisxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyMyA3IDE4IDExIDEgMTkgMjAgMjMgMTIgMTIgMjcgMTMgMTMgMTUgMTYgMTMgMjQgXgorNTcgMCAxIDE2IDE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAyMSA0IDYgNSAxOSAxNCAxNiA0IDE2IDExIDE0IDE4IDE4IDI3IDkgMTMgCisyMSAzIDI2IDIyIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxMCBeCis0OCAwIDI3IDUgMTIgMTkgNyAyMyA2IDI1IDI1IDIgMTEgMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMSAxNCAxOSAyNiAyNyAKKzI1IDYgMSAxNSA0IDcgMjcgMjQgMjcgMjEgNSAyNyAxOSAxOCA4IDIxIDMgMjMgMjAgMjEgMjUgOCBeCis2MCAxIDEgOSAxNyAyMiA1IDIyIDggMiAxMyAyNyA4IDE5IDI3IDIxIDIgNSA4IDQgMjcgMTAgNiAxOCAyIDYgMSAxIDI2IDE4IDEzIDUgCisxMCAxOCAxMCA4IDUgMjEgMTUgNSAxNCAxOSAxMiA0IDggMjAgMjEgMjYgMSAxMiAyNSAxMCAyIDE3IDEwIDE1IDIgMjAgMjUgMjYgMjMgCisyMSBeCis1NCAxIDEyIDE2IDE1IDkgMTggMTUgMTkgMjEgMTYgMjYgMTEgMTggMjAgNiAyMiA3IDggOCAxMiAyIDIxIDE4IDEyIDExIDUgMTkgMyAKKzE5IDI3IDE4IDI1IDIyIDIyIDIzIDE2IDIgMSAyMCAxNiAxNCAyMiA2IDE1IDIyIDEgMjEgNiA2IDEwIDIgMjYgMTIgMTEgMjQgXgorNjAgMCAyNyAxNCA3IDIwIDI2IDIwIDE3IDcgMTkgNSAyMyAxOCAxNiAxMiA3IDE1IDE3IDcgNSAxMSAxMiAxNSA3IDEgMTAgMTAgOCA0IAorMiA0IDE3IDQgMTEgMTcgMjYgMjMgMjQgNCA1IDEyIDUgMSA2IDkgNiA4IDI3IDUgMTEgMTEgMjQgMjQgMTMgMTcgMiAyNCAyNiAxOSAxMSAKKzIyIF4KKzU1IDAgMjEgMiAyIDE0IDIxIDEzIDEgMjMgMTAgMjUgOCAxNSAyNiAxOSAyMyAyIDkgMjYgNiAyMyAxMyA1IDI0IDEyIDIxIDExIDE0IDQgCisxMiAxMCAxMiAyMiA0IDMgMjAgMTcgMTAgMTMgMTYgOSAxMCAyNyA5IDEyIDEzIDIwIDEwIDEyIDIzIDIzIDExIDE5IDEzIDI1IDEzIF4KKzU1IDAgOCAxIDUgMTYgMjAgOSAxOSA5IDI0IDIwIDEyIDE1IDYgMjEgMjcgMjIgMjYgMjQgMTggOSAxNSA4IDIyIDI0IDkgMjcgMjMgMSAKKzEzIDE4IDI0IDEgOCAyNCA4IDYgMTQgMSA0IDUgMTUgMjcgMTIgMjAgMSAxNyA1IDQgMTQgMjUgMTQgMyAxOSAyNCAxNiBeCis2MCAwIDE0IDggMTMgMTIgMTkgOCAzIDYgMTMgNyAxMCAyMyAxOSAxMCAxNyAxNyAxMSA2IDEzIDggMTggNiA3IDMgMjUgMSAxNyA4IDI2IAorMjUgMTEgMjMgMTQgMjcgMSAyMiAxMSA5IDcgMTkgNCAxNSAxOCAyIDI3IDIwIDExIDUgMjAgMjIgMTkgMTUgNSA2IDE3IDggMSAxOSAyMiAKKzEwIF4KKzU1IDEgMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAxNSAxMyAyNSA3IDI2IDEgMTMgNSA5IDEgMyAKKzkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggMTQgNyAxMSAxNyAyMCAyMCA3IDIxIDEzIDggMjIgXgorNTIgMSAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgMTAgOCAxNCAxNCAxNSAxOCAxMyAxMiAyMSAKKzE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgMTcgMjIgMTggMjEgMTkgMTcgXgorNTcgMCAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAyNSA5IDE1IDIyIDE4IDYgCisxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgMiAxNCAxMyAyMyAxMiAyNSA1IAorXgorNTcgMCAyNCAxMSA2IDMgOCAyNyA4IDIxIDI2IDMgMTEgMTkgMTggNSA1IDI1IDI2IDI0IDQgMjMgMTUgMTUgMjMgMjEgMjQgNSAxNSAyMSAKKzMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAyOCAxMiAxOSAyMCA5IF4KKzU1IDAgNiAyMyA0IDcgNyAzIDEwIDI0IDI4IDYgMTAgOSA2IDIwIDE0IDI3IDEwIDE5IDExIDEgMTUgMjEgNSAxMCA3IDExIDggMTYgOSAKKzI3IDUgMiA2IDYgMjcgMjAgMjQgMjEgMiAyMCAxNiAxNCAyNCAxNyAxNSAzIDIgMjYgMjUgMjUgMTQgMjQgMjAgMjggMjggXgorNTkgMSAxNyA1IDkgMTAgMjUgMjAgMTIgOSAxOCAzIDE2IDQgMTAgNyAxOCAyMyAxNyAyIDggMSAyOCA3IDIgMTUgNSAxOCAxMSAyMyAyIAorMSAxOCAyMiAxNCA3IDIwIDIxIDIgMTEgMTIgMyAxNSAxMiA0IDEgMjcgMjEgMTYgMjcgMTkgMTggMTMgMjEgMTQgNSAyMCA5IDE5IDI3IAorMjUgXgorNTUgMCAzIDUgMTYgMTYgMjIgMiAxMyA3IDQgMTMgMTkgMjcgMTUgNyAxNiAyNSAzIDQgNCAxNyAxMiAxMyAxMSAxMiAyNiA2IDEgMTAgCisxNSAxOCA0IDE5IDEwIDI3IDkgNCAyNSAxMyAyMSAyNSAyNiAyMSAyMCAxMiAyNSAyMSA3IDE3IDI4IDI3IDMgMTMgMTQgMTkgMTggXgorNTMgMSAyMyAxOSA0IDI4IDMgMjAgMTggOSA3IDE1IDQgMjYgNSA2IDIwIDUgMjMgMjggMTAgMjQgMTkgMTMgMjggMSA5IDEyIDIzIDE2IAorMTAgMTMgMiAxOSAyMSA2IDI1IDIyIDI4IDIzIDE2IDcgMjAgNCAyIDIyIDExIDI2IDIyIDYgOSAxNyAxMSAyMSAxMCBeCis0NyAwIDEgMyAyOCAxMSAyNyAyNSAxMiA4IDI2IDI2IDI4IDI0IDEzIDIyIDE3IDYgNCAyNCAxNSAxNyAxOCA0IDIyIDIzIDkgMjQgMTIgCisyNyAyNyAyNSA5IDEzIDE1IDExIDkgMjIgMjggMjYgMTEgMTggMTUgMTAgNiAxNiAxNyAxNCAyNCBeCis1NSAxIDI1IDI3IDE2IDI4IDIyIDI0IDEgMSAxMSA3IDI0IDMgMjggNyA1IDI4IDE2IDE1IDEgNyAxNCA5IDcgNiAxNSAyNSAxOSA5IDMgCisxOSAyMyAxIDI2IDIwIDE3IDE3IDEgMTYgMjQgOSAxNiA4IDE1IDYgMjEgMTcgMjIgOSAyOCA4IDggNSA0IDI0IDI2IF4KKzQ3IDEgMTQgNCAyMSAyNiAyMyA3IDggMjcgMjMgMjMgMjIgMTkgMjQgMjUgMTYgMTkgMTIgMjIgMTAgMjAgMyA3IDE0IDEgMjAgNiAyNiAKKzIzIDI3IDQgMTYgMjAgMTggMTIgMjAgMTUgMTkgMTYgMTggMjAgMjcgMTEgMTEgMTcgMjQgMTggMTYgXgorNTAgMCAxOSAxIDI1IDIzIDIgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgMTUgOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgCisxOSA4IDExIDI0IDI0IDIxIDEzIDI3IDUgMTEgMjggMTcgNyAyNSA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjUgXgorNjAgMCAyIDUgOCAxMCAxNiAxMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAyMiAyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgCisxOSA2IDEzIDEwIDI2IDE3IDI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgOCAyNSAyIDkgMjUgMTggMTcgOCAyIDE0IDQgCisxOSAyMiBeCis1NCAxIDUgMjcgMTMgOSAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAxNiAzIDI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAKKzEwIDE3IDEzIDE2IDYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgMTMgMTcgOSAyMyAyMCAzIDI4IDIxIF4KKzU2IDAgMTIgMTcgMjUgMjggMTkgNSAyMSA0IDI3IDggMSAxOSAxNCAyMCA2IDcgOSAxIDYgMjIgMyAxOSAyNiAxNCA4IDYgNyAxOSAxNSAKKzIzIDEgMTcgMTYgNiAyNiAxNCA1IDIyIDI1IDQgNyAxMCAxNiAyMSAxMCAxOCAxOSAyNCAxNiAyMyA4IDMgMTcgMjggMTggMTMgXgorNTggMCAyIDUgMyAyMSAyMSAxNSA2IDI0IDEgNCAyNCAxOCAxMCAyMiAxIDIxIDEyIDUgNCA0IDIwIDI1IDI0IDI2IDggMjUgMTEgMiA3IAorMjcgMjIgMTkgNCAxOCAyNyAxMCAyOCA0IDEyIDI0IDggMTYgMTIgMTEgMTYgMTcgMjUgOCAxMiAxNiAxIDkgOSAxMCA1IDI0IDIzIDExIF4KKzYyIDEgNSAxNCAxOCA4IDQgOSA1IDE3IDggMjggMSAyMiA0IDExIDMgMiAxNyAzIDE0IDkgMjcgMTMgMTggMjQgOSA4IDcgMjggMjUgMTQgCisyMSAyNyAyNCA2IDE4IDE2IDIgMTIgMTUgOSAxNCAxMCAxIDggMTcgNCA2IDE1IDI2IDExIDE1IDIgMjggMjAgMjYgMTYgMyA3IDUgOCA5IAorMjQgXgorNTAgMSAxMCAxMiAyNSAxMSA5IDEzIDI0IDE1IDIwIDIgNCA4IDIgMjIgMjAgMTkgNCAxNSAxNCAyOCAxMyAyNSAxMCAxMCAxMiAyOCAyNCAKKzIyIDI2IDI4IDE1IDkgMTEgMjYgMTkgMjIgMjcgMiAyMSA4IDIwIDIzIDI2IDEyIDEwIDIxIDkgMTUgMTMgMTcgXgorNjAgMSA3IDI2IDEgMTMgNSA5IDEgMyA5IDIxIDIyIDcgMSAyMyAyOCAxIDIgOCAyMiAxMiAxOCAyOCA1IDE4IDE0IDcgMTEgMTcgMjAgCisyMCA3IDIxIDEzIDggMjggMjEgMjIgMiAxNiAyMCAxNSAyOCA5IDMgMjIgMTMgMTAgMjMgNCAxNiAxMSAxNCAxIDEwIDggMTQgMTQgMTUgCisxOCAxNyBeCis1MiAwIDEyIDIxIDE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgMTcgMjIgMTggMjEgMTkgCisxNyAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAyNSA5IDE1IDE5IF4KKzU3IDEgMTggNiAxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgMiAxNCAxMyAKKzIzIDEyIDI1IDMgMjQgMTEgNiAzIDggMjcgOCAyMSAyNiAzIDExIDE5IDE4IDUgNSAyNSAyNiAyNCA0IDIzIDE1IDE1IDIzIDIxIDEyIF4KKzY3IDEgNSAxNSAyMSAzIDMgMTggMiAyNCAyNyAxMSAyMCAxMCAxMSA0IDUgMTIgMiAyMyA2IDUgMyAxIDE0IDI2IDE1IDEyIDYgMjggMTIgCisxOSAyMCA2IDIzIDQgNyA3IDMgMTAgMjQgMjggNiAxMCA5IDYgMjAgMTQgMjcgMTAgMTkgMTEgMSAxNSAyMSA1IDEwIDcgMTEgOCAxNiA5IAorMjcgNSAyIDYgNiAyNyAyIF4KKzU2IDEgMjQgMjEgMiAyMCAxNiAxNCAyNCAxNyAxNSAzIDIgMjYgMjUgMjUgMTQgMjQgMjAgMjggMTQgMTcgNSA5IDEwIDI1IDIwIDEyIDkgCisxOCAzIDE2IDQgMTAgNyAxOCAyMyAxNyAyIDggMSAyOCA3IDIgMTUgNSAxOCAxMSAyMyAyIDEgMTggMjIgMTQgNyAyMCAyMSAyNCBeCis2MCAxIDExIDEyIDMgMTUgMTIgNCAxIDI3IDIxIDE2IDI3IDE5IDE4IDEzIDIxIDE0IDUgMjAgOSAxOSAyNyA2IDMgNSAxNiAxNiAyMiAyIAorMTMgNyA0IDEzIDE5IDI3IDE1IDcgMTYgMjUgMyA0IDQgMTcgMTIgMTMgMTEgMTIgMjYgNiAxIDEwIDE1IDE4IDQgMTkgMTAgMjcgOSA0IAorMjUgMjcgXgorNTEgMCAyMSAyNSAyNiAyMSAyMCAxMiAyNSAyMSA3IDE3IDI4IDI3IDMgMTMgMTQgMTkgMyAyMyAxOSA0IDI4IDMgMjAgMTggOSA3IDE1IAorNCAyNiA1IDYgMjAgNSAyMyAyOCAxMCAyNCAxOSAxMyAyOCAxIDkgMTIgMjMgMTYgMTAgMTMgMiAxOSAyMSAyMyBeCis0OSAxIDI1IDIyIDI4IDIzIDE2IDcgMjAgNCAyIDIyIDExIDI2IDIyIDYgOSAxNyAxMSAyMSA1IDEgMyAyOCAxMSAyNyAyNSAxMiA4IDI2IAorMjYgMjggMjQgMTMgMjIgMTcgNiA0IDI0IDE1IDE3IDE4IDQgMjIgMjMgOSAyNCAxMiAyNyAyNyA5IF4KKzU2IDAgOSAxMyAxNSAxMSA5IDIyIDI4IDI2IDExIDE4IDE1IDEwIDYgMTYgMTcgMTQgMTEgMjUgMjcgMTYgMjggMjIgMjQgMSAxIDExIDcgCisyNCAzIDI4IDcgNSAyOCAxNiAxNSAxIDcgMTQgOSA3IDYgMTUgMjUgMTkgOSAzIDE5IDIzIDEgMjYgMjAgMTcgMTcgMSAxNiAxNiBeCis1MSAwIDkgMTYgOCAxNSA2IDIxIDE3IDIyIDkgMjggOCA4IDUgNCAyNCAyNyAxNCA0IDIxIDI2IDIzIDcgOCAyNyAyMyAyMyAyMiAxOSAKKzI0IDI1IDE2IDE5IDEyIDIyIDEwIDIwIDMgNyAxNCAxIDIwIDYgMjYgMjMgMjcgNCAxNiAyMCAxOCAxMiAyMiBeCis1MSAwIDE1IDE5IDE2IDE4IDIwIDI3IDExIDExIDE3IDI0IDE4IDEgMTkgMSAyNSAyMyAyIDE1IDE2IDI2IDI3IDIzIDE0IDEyIDI4IDIyIAorMTUgOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgMTkgOCAxMSAyNCAyNCAyMSAxMyAyNyA1IDExIDI4IDE2IF4KKzU5IDAgNyAyNSA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjYgMiA1IDggMTAgMTYgMTEgNSAyNiAxOCAxOSAyMSAzIDEyIDExIDEzIDQgMTQgCisyMiAyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgMTkgNiAxMyAxMCAyNiAxNyAyNyAyNiA0IDMgMjUgNiAxNCAyIDMgNSA3IDIzIDExIDIyIAorMTAgXgorNTkgMCAyNSAyIDkgMjUgMTggMTcgOCAyIDE0IDQgMTkgMSA1IDI3IDEzIDkgMiAyNyAyOCAyIDE3IDIzIDEwIDI3IDE4IDI2IDcgMjIgCisxNiAzIDI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAxMCAxNyAxMyAxNiA2IDE3IDIxIDIzIDEzIDIwIDIyIDUgNiAxMSAxMiAxMiA4IDIzIAorNyBeCis1NiAxIDE3IDkgMjMgMjAgMyAyOCAyNyAxMiAxNyAyNSAyOCAxOSA1IDIxIDQgMjcgOCAxIDE5IDE0IDIwIDYgNyA5IDEgNiAyMiAzIDE5IAorMjYgMTQgOCA2IDcgMTkgMTUgMjMgMSAxNyAxNiA2IDI2IDE0IDUgMjIgMjUgNCA3IDEwIDE2IDIxIDEwIDE4IDE5IDI0IDE2IF4KKzU3IDEgMjMgOCAzIDE3IDI4IDE4IDEwIDIgNSAzIDIxIDIxIDE1IDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgCisyNCAyNiA4IDI1IDExIDIgNyAyNyAyMiAxOSA0IDE4IDI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE4IF4KKzYzIDAgMSA5IDkgMTAgNSAyNCAyMyAxOCA1IDE0IDE4IDggNCA5IDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAKKzE4IDI0IDkgOCA3IDI4IDI1IDE0IDIxIDI3IDI0IDYgMTggMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAKKzI4IDIwIDE2IF4KKzUyIDEgMTYgMyA3IDUgOCA5IDI2IDEwIDEyIDI1IDExIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIAorMjUgMTAgMTAgMTIgMjggMjQgMjIgMjYgMjggMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMjggXgorNjAgMCAyMSA5IDE1IDEzIDI1IDcgMjYgMSAxMyA1IDkgMSAzIDkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggCisxNCA3IDExIDE3IDIwIDIwIDcgMjEgMTMgOCAyOCAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgCisxMCAyMCBeCis1NCAxIDE0IDE0IDE1IDE4IDEzIDEyIDIxIDE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgCisxNyAyMiAxOCAyMSAxOSAxNyAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAxMSBeCis1OCAwIDkgMTUgMjIgMTggNiAxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgCisyIDE0IDEzIDIzIDEyIDI1IDMgMjQgMTEgNiAzIDggMjcgOCAyMSAyNiAzIDExIDE5IDE4IDUgNSAyNSAyNiAyNCA0IDIzIDE1IDE1IDI3IAorXgorNjQgMSAyMSAyNCA1IDE1IDIxIDMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAKKzI4IDEyIDE5IDIwIDYgMjMgNCA3IDcgMyAxMCAyNCAyOCA2IDEwIDkgNiAyMCAxNCAyNyAxMCAxOSAxMSAxIDE1IDIxIDUgMTAgNyAxMSAKKzggMTYgOSAyNyAyMCBeCis1OCAxIDIgNiA2IDI3IDIwIDI0IDIxIDIgMjAgMTYgMTQgMjQgMTcgMTUgMyAyIDI2IDI1IDI1IDE0IDI0IDIwIDI4IDE0IDE3IDUgOSAKKzEwIDI1IDIwIDEyIDkgMTggMyAxNiA0IDEwIDcgMTggMjMgMTcgMiA4IDEgMjggNyAyIDE1IDUgMTggMTEgMjMgMiAxIDE4IDIyIDE0IAorMjggXgorNjIgMCAyMCAyMSAyIDExIDEyIDMgMTUgMTIgNCAxIDI3IDIxIDE2IDI3IDE5IDE4IDEzIDIxIDE0IDUgMjAgOSAxOSAyNyA2IDMgNSAxNiAKKzE2IDIyIDIgMTMgNyA0IDEzIDE5IDI3IDE1IDcgMTYgMjUgMyA0IDQgMTcgMTIgMTMgMTEgMTIgMjYgNiAxIDEwIDE1IDE4IDQgMTkgMTAgCisyNyA5IDQgMjYgXgorNTIgMCAxMyAyMSAyNSAyNiAyMSAyMCAxMiAyNSAyMSA3IDE3IDI4IDI3IDMgMTMgMTQgMTkgMyAyMyAxOSA0IDI4IDMgMjAgMTggOSA3IAorMTUgNCAyNiA1IDYgMjAgNSAyMyAyOCAxMCAyNCAxOSAxMyAyOCAxIDkgMTIgMjMgMTYgMTAgMTMgMiAxOSAyMSAyNyBeCis0OSAxIDI1IDIyIDI4IDIzIDE2IDcgMjAgNCAyIDIyIDExIDI2IDIyIDYgOSAxNyAxMSAyMSA1IDEgMyAyOCAxMSAyNyAyNSAxMiA4IDI2IAorMjYgMjggMjQgMTMgMjIgMTcgNiA0IDI0IDE1IDE3IDE4IDQgMjIgMjMgOSAyNCAxMiAyNyAyNyAyNiBeCis1NyAwIDkgMTMgMTUgMTEgOSAyMiAyOCAyNiAxMSAxOCAxNSAxMCA2IDE2IDE3IDE0IDExIDI1IDI3IDE2IDI4IDIyIDI0IDEgMSAxMSA3IAorMjQgMyAyOCA3IDUgMjggMTYgMTUgMSA3IDE0IDkgNyA2IDE1IDI1IDE5IDkgMyAxOSAyMyAxIDI2IDIwIDE3IDE3IDEgMTYgMjQgOSBeCis1MiAxIDkgMTYgOCAxNSA2IDIxIDE3IDIyIDkgMjggOCA4IDUgNCAyNCAyNyAxNCA0IDIxIDI2IDIzIDcgOCAyNyAyMyAyMyAyMiAxOSAKKzI0IDI1IDE2IDE5IDEyIDIyIDEwIDIwIDMgNyAxNCAxIDIwIDYgMjYgMjMgMjcgNCAxNiAyMCAxOCAxMiAyMCAxOSBeCis1MiAxIDE5IDE2IDE4IDIwIDI3IDExIDExIDE3IDI0IDE4IDEgMTkgMSAyNSAyMyAyIDE1IDE2IDI2IDI3IDIzIDE0IDEyIDI4IDIyIDE1IAorOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgMTkgOCAxMSAyNCAyNCAyMSAxMyAyNyA1IDExIDI4IDE3IDcgMjQgXgorNTkgMCA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjYgMiA1IDggMTAgMTYgMTEgNSAyNiAxOCAxOSAyMSAzIDEyIDExIDEzIDQgMTQgMjIgCisyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgMTkgNiAxMyAxMCAyNiAxNyAyNyAyNiA0IDMgMjUgNiAxNCAyIDMgNSA3IDIzIDExIDIyIDggCisyNSAyNiBeCis1OSAwIDkgMjUgMTggMTcgOCAyIDE0IDQgMTkgMSA1IDI3IDEzIDkgMiAyNyAyOCAyIDE3IDIzIDEwIDI3IDE4IDI2IDcgMjIgMTYgMyAKKzI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAxMCAxNyAxMyAxNiA2IDE3IDIxIDIzIDEzIDIwIDIyIDUgNiAxMSAxMiAxMiA4IDIzIDEzIAorMTcgMjEgXgorNTYgMSAyMyAyMCAzIDI4IDI3IDEyIDE3IDI1IDI4IDE5IDUgMjEgNCAyNyA4IDEgMTkgMTQgMjAgNiA3IDkgMSA2IDIyIDMgMTkgMjYgCisxNCA4IDYgNyAxOSAxNSAyMyAxIDE3IDE2IDYgMjYgMTQgNSAyMiAyNSA0IDcgMTAgMTYgMjEgMTAgMTggMTkgMjQgMTYgMjMgMjAgXgorNjAgMCAzIDE3IDI4IDE4IDEwIDIgNSAzIDIxIDIxIDE1IDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgMjQgCisyNiA4IDI1IDExIDIgNyAyNyAyMiAxOSA0IDE4IDI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE2IDEgOSA5IAorMTAgMjEgXgorNjAgMCAyNCAyMyAxOCA1IDE0IDE4IDggNCA5IDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAxOCAyNCA5IDggNyAKKzI4IDI1IDE0IDIxIDI3IDI0IDYgMTggMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAyOCAyMCAyNiAxNiAKKzI1IF4KKzUzIDEgNyA1IDggOSAyNiAxMCAxMiAyNSAxMSA5IDEzIDI0IDE1IDIwIDIgNCA4IDIgMjIgMjAgMTkgNCAxNSAxNCAyOCAxMyAyNSAxMCAKKzEwIDEyIDI4IDI0IDIyIDI2IDI4IDE1IDkgMTEgMjYgMTkgMjIgMjcgMiAyMSA4IDIwIDIzIDI2IDEyIDEwIDIxIDkgMjQgXgorNjIgMSAxMyAyNSA3IDI2IDEgMTMgNSA5IDEgMyA5IDIxIDIyIDcgMSAyMyAyOCAxIDIgOCAyMiAxMiAxOCAyOCA1IDE4IDE0IDcgMTEgCisxNyAyMCAyMCA3IDIxIDEzIDggMjggMjEgMjIgMiAxNiAyMCAxNSAyOCA5IDMgMjIgMTMgMTAgMjMgNCAxNiAxMSAxNCAxIDEwIDggMTQgCisxNCAxNSAxOCAxMyBeCis1NCAwIDEyIDIxIDE4IDI1IDE1IDI3IDE3IDUgMSAyMyA3IDE3IDIwIDExIDE0IDEwIDQgMjEgMTcgMTkgMjUgMTcgMjIgMTggMjEgMTkgCisxNyAxMCAxNSAyNiAyMCA4IDEzIDE5IDcgOCAxOCA3IDEyIDE0IDYgOCAyMiAyMSAxMSAxMCAxNCAyMyAyNSA5IDE1IDIyIDE4IDEzIF4KKzU4IDAgMTcgMjQgNyAxMyA2IDEyIDcgMiAxOCAxOCAyNiAxMyAxMyAxNiA4IDI0IDEwIDMgMjYgOSAyMCAxIDEyIDIgMTQgMTMgMjMgMTIgCisyNSAzIDI0IDExIDYgMyA4IDI3IDggMjEgMjYgMyAxMSAxOSAxOCA1IDUgMjUgMjYgMjQgNCAyMyAxNSAxNSAyMyAyMSAyNCA1IDE1IDI2IAorXgorNjcgMSAzIDMgMTggMiAyNCAyNyAxMSAyMCAxMCAxMSA0IDUgMTIgMiAyMyA2IDUgMyAxIDE0IDI2IDE1IDEyIDYgMjggMTIgMTkgMjAgNiAKKzIzIDQgNyA3IDMgMTAgMjQgMjggNiAxMCA5IDYgMjAgMTQgMjcgMTAgMTkgMTEgMSAxNSAyMSA1IDEwIDcgMTEgOCAxNiA5IDI3IDUgMiAKKzYgNiAyNyAyMCAyNCAyMSAxMiBeCis2MiAwIDIwIDE2IDE0IDI0IDE3IDE1IDMgMiAyNiAyNSAyNSAxNCAyNCAyMCAyOCAxNCAxNyA1IDkgMTAgMjUgMjAgMTIgOSAxOCAzIDE2IAorNCAxMCA3IDE4IDIzIDE3IDIgOCAxIDI4IDcgMiAxNSA1IDE4IDExIDIzIDIgMSAxOCAyMiAxNCA3IDIwIDIxIDIgMTEgMTIgMyAxNSAxMiAKKzQgMSAyNyAxOCBeCis2MSAxIDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIwIDIgMTEgMjMgMSAxMSAxIDUgMyAyMyAxNiAxNSAyNyAxNCA1IAorMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAxNSAxIDI2IDEyIDI3IDI1IDQgMjggMjIgMTEgMTkgMTkgMjQgNSAyMCAKKzggOSAyNiBeCis1NSAxIDI1IDE5IDE3IDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAxNiA4IDMgMTcgMjggMTggMjkgOSAyMyA5IDEwIDI5IDQgMTIgMjQgMTUgCis1IDggMjIgMTcgMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIDcgMjYgMTAgMTYgMjQgNiA3IDEyIDggMTIgMjggXgorNTIgMSAyNCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgCisxNSAyNCAxNCAxMSA0IDIzIDI3IDI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDI3IF4KKzY1IDAgMyAyIDIgMTcgMjEgMTMgNSA5IDIxIDI4IDkgMSAxMyAyIDIxIDggMjQgMSAzIDI3IDEzIDE4IDE5IDQgMTUgMTIgNSAyIDE2IAorMjcgMTYgNiAyIDEgMjMgMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IDYgMTYgMjggMyAzIDEgMTUgMTMgMjIgNiAxNSAxMSA2IDQgCisyNCAyNSAxNSAxOSAyMyAxMiBeCis1NSAwIDEgOSAxNSAxMCAxMiA3IDI1IDExIDI1IDIgMjcgNiA2IDE4IDQgMTMgMSA0IDExIDI1IDE3IDYgMjkgMjEgMjQgMjcgMjEgMTcgCisxNyAyNiAyNCAxMyA0IDIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggMTUgMTkgMTAgMyA5IDI5IDI3IDI0IF4KKzUzIDEgMjIgMyAyNyAyMSAyIDI2IDE5IDkgMTkgMjcgMjMgMyAxMiAxNyAxMCA0IDggMjcgMTkgMTYgMSAyMSAyMyAyOCAyMyAxOCA4IAorMjUgMTggMjYgMjAgOCAxNyAxOSAyIDQgMTEgNyAxOCA2IDI0IDIgMjUgMjUgNSAyNyAyMCAzIDI4IDIwIDE4IDIxIDExIF4KKzU1IDAgMjUgMTAgMSAyOCAyOCAyOSAxNiAyMCAxOSAyNiAxNiAyMSA2IDIzIDE1IDI4IDI2IDI4IDcgMTUgMTggMTEgNSAxNyAyMCAyNiAKKzEgMTAgMTQgOCA0IDE2IDI2IDE3IDggMTAgMjIgMjIgMTggMSAyMCAyNCA3IDEgOSA3IDE5IDUgMjIgMSA0IDI2IDExIDEwIDIwIF4KKzU4IDAgNSAxNCAyIDYgNCAyIDkgMjIgMTUgMTMgMjAgMjIgMjYgMTggMTYgOSAyIDE1IDIwIDI3IDggNiAxNyA1IDE1IDkgMjUgMTAgMjYgCis0IDUgMjcgNSAxOSAyMSA1IDYgMTEgMjkgMTkgOCAyIDI0IDI2IDIyIDE5IDE4IDE3IDIzIDE0IDIxIDE0IDIyIDEzIDIwIDUgMjkgMTIgXgorNTQgMCA1IDI2IDYgMjEgMjkgMyA1IDEyIDE2IDExIDEzIDE2IDE4IDE4IDEwIDExIDIwIDIxIDEyIDExIDEyIDIyIDE0IDE5IDMgMjEgCisxNSA2IDI1IDI2IDI5IDI0IDE5IDE3IDE4IDI1IDIyIDEyIDEzIDIzIDIzIDEyIDEwIDEzIDEgMjIgMTAgMiAyMiAyIDI4IDEwIDE3IDI4IAorXgorNTYgMCAzIDYgMTkgMjggMTcgMTEgMSA5IDE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IAorOSAyOCAxMyAyNSAyNCAyOCA4IDE0IDkgMyAxNCAxOCAyNiA5IDkgMTIgMTMgMTcgMjUgMTYgNSA4IDQgMjQgMTAgMjQgMjMgMjUgXgorNDkgMCAyOSAyMSA5IDE4IDI4IDI1IDExIDMgMTYgNCAyMSAyNSAzIDQgMTggMTIgMTIgMjkgMjYgMTMgMjYgMjMgMjYgNyAyMyAxMCA5IAorMjcgMjYgMjEgMjUgMjEgMTggOSAyNCAxNiAyMiA1IDIxIDcgNyAyNyA0IDIwIDIzIDEzIDI3IDEwIDI3IF4KKzU4IDEgMjkgNyAxOSAxMyAxMyA4IDE5IDIwIDE4IDIgMTkgMjIgMjkgMyAxMCA2IDkgMTMgMjQgMTcgMTYgOSAyMCAyMSAyNyAyIDE5IDcgCis4IDI2IDI1IDEyIDIgMTQgMyAxIDEgMTYgMTIgMjAgMjggMjQgMTIgNSAyNCAyNSAyMCAxIDEyIDI1IDkgMiA2IDIwIDE1IDE0IDI5IDIwIAorXgorNTYgMCAyMSAyOCAxIDE3IDYgMTcgMjcgMSAyIDEwIDE2IDE5IDUgMTQgMTAgMjcgMTEgMTcgMyAyOSAxNCAyNyAxNyA1IDIgMTggMjAgCisxMSAyNyAxOCAyMiAyNyAyMiA5IDggMTggMyAxNCAxMCA1IDIgMjQgMTggMjMgMjEgMjYgOCAyMiA4IDEgNiAyNyAyNyAxNSAyOSAxOCBeCis2NCAwIDIgMjkgMjIgOCAxNiAyMCA0IDEyIDkgNiAxMiAxNiAxNiA3IDkgMjAgMjkgMTEgOSA0IDEgMTUgMjUgMTYgMjkgMTAgMjIgNyAyIAorOCA1IDE4IDE0IDIzIDI0IDQgNiAyNiAzIDExIDYgMTIgMSA3IDE0IDI0IDE0IDYgMTAgMjEgMTYgMjMgMjkgMjUgNiAxNCAxNyAyIDEyIAorMTAgNSAxMCAxNSAyNSBeCis2MiAxIDggMTUgMyA3IDEzIDI1IDE2IDE0IDEgMjkgMjIgMjYgMTUgMjcgOSAxIDggOCAyOCA2IDEzIDUgMTMgMyAxNSA1IDIzIDggMjMgCisyIDUgNSA0IDE3IDEzIDE0IDcgMTcgMTIgMjcgMyAxOCA1IDcgNSAyNiAxOCAxNSAyMiAyOCAxNiAxMyA3IDIgMjMgMTkgMjUgMjkgMTcgCis3IDE2IDIyIF4KKzU1IDEgMjMgMTEgMTEgMTUgMiAxMyA5IDI2IDIgMjQgMjYgNyAyOCAxMSAyIDI5IDcgMjIgMjMgNSAyOCAxOSAxIDI3IDI5IDEgMjQgMTEgCisxOCAyMCAzIDEzIDExIDcgMyAxNSAxNyAyNCAxIDE4IDEzIDYgMyAyNSAyNyAxNiAyOCAxOCAyNCA4IDIzIDcgMjkgMjggMTUgXgorNTIgMCAyOCAxNCAxMiAyOCAyNyAyMiA0IDE0IDI1IDEgMyA5IDcgMTEgMTQgMTUgMTYgMTAgMTkgMTIgMTkgMTEgMjAgMTMgMjggNCAyNyAKKzI4IDcgMjcgMTIgNCAyOCAyMSAxNyAyMiAyMCAxNyAxNSAxNSAyMyAyMiAxMyAxMiAyMSAyMiAyMSAxMSAxMiAxNCAxMiAyOCBeCis2MiAwIDI3IDggNyA0IDkgMTQgMTYgMTUgOCAxMSAyMSAyMCAxMCAxMCAyMSAyMyAyMCAyIDExIDIzIDEgMTEgMSA1IDMgMjMgMTYgMTUgCisyNyAxNCA1IDE2IDMgMjIgMiAzIDI0IDMgMTkgMjkgNCA0IDEwIDggMjAgMTQgMTUgMSAyNiAxMiAyNyAyNSA0IDI4IDIyIDExIDE5IDE5IAorMjQgNSAyMCAxOCBeCis1OCAwIDkgNSAyNSAxOSAxNyAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgMTYgOCAzIDE3IDI4IDE4IDI5IDkgMjMgOSAxMCAyOSA0IDEyIDI0IAorMTUgNSA4IDIyIDE3IDI5IDEyIDMgOCAyOSAxNSAyMSAyMSA0IDcgMjAgNyAxMCA3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIDE1IDE2IF4KKzU2IDAgOSAxNyAxMSAyOCAxMiAyNiAyNiA2IDI5IDEzIDEwIDIwIDYgMjMgMTAgNCAzIDI2IDI2IDE0IDIwIDIwIDI1IDE0IDEzIDE1IAorMjQgMTQgMTEgNCAyMyAyNyAyNCAyMCA5IDE2IDE3IDI0IDEzIDEyIDYgMSAxNCAyNiAyNSA3IDggMjEgMSAxOSAzIDIgMiAxNyAyMSAyMyAKK14KKzY0IDEgNSA5IDIxIDI4IDkgMSAxMyAyIDIxIDggMjQgMSAzIDI3IDEzIDE4IDE5IDQgMTUgMTIgNSAyIDE2IDI3IDE2IDYgMiAxIDIzIAorMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IDYgMTYgMjggMyAzIDEgMTUgMTMgMjIgNiAxNSAxMSA2IDQgMjQgMjUgMTUgMTkgMjMgCisyOCAxIDkgMTUgMTAgMjQgXgorNTQgMCA3IDI1IDExIDI1IDIgMjcgNiA2IDE4IDQgMTMgMSA0IDExIDI1IDE3IDYgMjkgMjEgMjQgMjcgMjEgMTcgMTcgMjYgMjQgMTMgNCAKKzIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggMTUgMTkgMTAgMyA5IDI5IDI3IDcgMjIgMyAyNyAyOSBeCis1NCAxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAxOSAxNiAxIDIxIDIzIDI4IDIzIDE4IDggMjUgMTggMjYgMjAgCis4IDE3IDE5IDIgNCAxMSA3IDE4IDYgMjQgMiAyNSAyNSA1IDI3IDIwIDMgMjggMjAgMTggMjEgMTAgMjUgMTAgMSAyOCAyNyBeCis2MCAwIDI5IDE2IDIwIDE5IDI2IDE2IDIxIDYgMjMgMTUgMjggMjYgMjggNyAxNSAxOCAxMSA1IDE3IDIwIDI2IDEgMTAgMTQgOCA0IDE2IAorMjYgMTcgOCAxMCAyMiAyMiAxOCAxIDIwIDI0IDcgMSA5IDcgMTkgNSAyMiAxIDQgMjYgMTEgMTAgMjggNSAxNCAyIDYgNCAyIDkgMjIgCisxNSAyMiBeCis1NCAxIDIwIDIyIDI2IDE4IDE2IDkgMiAxNSAyMCAyNyA4IDYgMTcgNSAxNSA5IDI1IDEwIDI2IDQgNSAyNyA1IDE5IDIxIDUgNiAxMSAKKzI5IDE5IDggMiAyNCAyNiAyMiAxOSAxOCAxNyAyMyAxNCAyMSAxNCAyMiAxMyAyMCA1IDI5IDYgNSAyNiA2IDIxIDI5IDI4IF4KKzU3IDEgNSAxMiAxNiAxMSAxMyAxNiAxOCAxOCAxMCAxMSAyMCAyMSAxMiAxMSAxMiAyMiAxNCAxOSAzIDIxIDE1IDYgMjUgMjYgMjkgMjQgCisxOSAxNyAxOCAyNSAyMiAxMiAxMyAyMyAyMyAxMiAxMCAxMyAxIDIyIDEwIDIgMjIgMiAyOCAxMCAxNyAxOCAzIDYgMTkgMjggMTcgMTEgCisxIDkgMjMgXgorNTQgMCAxNCA0IDI5IDI5IDIzIDI1IDEzIDE5IDE4IDIgNyAyMSA2IDggMjkgNSAxMSAyMiAxNCAxNCA5IDI4IDEzIDI1IDI0IDI4IDggCisxNCA5IDMgMTQgMTggMjYgOSA5IDEyIDEzIDE3IDI1IDE2IDUgOCA0IDI0IDEwIDI0IDIzIDQgMjkgMjEgOSAxOCAyOCAyNyBeCis1MiAxIDExIDMgMTYgNCAyMSAyNSAzIDQgMTggMTIgMTIgMjkgMjYgMTMgMjYgMjMgMjYgNyAyMyAxMCA5IDI3IDI2IDIxIDI1IDIxIDE4IAorOSAyNCAxNiAyMiA1IDIxIDcgNyAyNyA0IDIwIDIzIDEzIDI3IDEwIDIzIDI5IDcgMTkgMTMgMTMgOCAxOSAyMCAyMyBeCis2MSAwIDIgMTkgMjIgMjkgMyAxMCA2IDkgMTMgMjQgMTcgMTYgOSAyMCAyMSAyNyAyIDE5IDcgOCAyNiAyNSAxMiAyIDE0IDMgMSAxIDE2IAorMTIgMjAgMjggMjQgMTIgNSAyNCAyNSAyMCAxIDEyIDI1IDkgMiA2IDIwIDE1IDE0IDI5IDE4IDIxIDI4IDEgMTcgNiAxNyAyNyAxIDIgCisxMCAxNiAxOSBeCis1NyAxIDUgMTQgMTAgMjcgMTEgMTcgMyAyOSAxNCAyNyAxNyA1IDIgMTggMjAgMTEgMjcgMTggMjIgMjcgMjIgOSA4IDE4IDMgMTQgMTAgCis1IDIgMjQgMTggMjMgMjEgMjYgOCAyMiA4IDEgNiAyNyAyNyAxNSAyOSAyMCAyIDI5IDIyIDggMTYgMjAgNCAxMiA5IDYgMTIgMTYgMjQgXgorNjQgMCA3IDkgMjAgMjkgMTEgOSA0IDEgMTUgMjUgMTYgMjkgMTAgMjIgNyAyIDggNSAxOCAxNCAyMyAyNCA0IDYgMjYgMyAxMSA2IDEyIAorMSA3IDE0IDI0IDE0IDYgMTAgMjEgMTYgMjMgMjkgMjUgNiAxNCAxNyAyIDEyIDEwIDUgMTAgMTUgMjUgOCAxNSAzIDcgMTMgMjUgMTYgCisxNCAxIDI5IDIyIDI2IDEwIF4KKzYzIDEgMjcgOSAxIDggOCAyOCA2IDEzIDUgMTMgMyAxNSA1IDIzIDggMjMgMiA1IDUgNCAxNyAxMyAxNCA3IDE3IDEyIDI3IDMgMTggNSAKKzcgNSAyNiAxOCAxNSAyMiAyOCAxNiAxMyA3IDIgMjMgMTkgMjUgMjkgMTcgNyAxNiAyNSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAKKzI2IDcgMjggMTEgXgorNTYgMSAyIDI5IDcgMjIgMjMgNSAyOCAxOSAxIDI3IDI5IDEgMjQgMTEgMTggMjAgMyAxMyAxMSA3IDMgMTUgMTcgMjQgMSAxOCAxMyA2IAorMyAyNSAyNyAxNiAyOCAxOCAyNCA4IDIzIDcgMjkgMjggNiAyOCAxNCAxMiAyOCAyNyAyMiA0IDE0IDI1IDEgMyA5IDcgMTEgMjkgXgorNTQgMCAxNSAxNiAxMCAxOSAxMiAxOSAxMSAyMCAxMyAyOCA0IDI3IDI4IDcgMjcgMTIgNCAyOCAyMSAxNyAyMiAyMCAxNyAxNSAxNSAyMyAKKzIyIDEzIDEyIDIxIDIyIDIxIDExIDEyIDE0IDEyIDE4IDI3IDggNyA0IDkgMTQgMTYgMTUgOCAxMSAyMSAyMCAxMCAxMCAyMSAyMyAyMiBeCis2MyAwIDIgMTEgMjMgMSAxMSAxIDUgMyAyMyAxNiAxNSAyNyAxNCA1IDE2IDMgMjIgMiAzIDI0IDMgMTkgMjkgNCA0IDEwIDggMjAgMTQgCisxNSAxIDI2IDEyIDI3IDI1IDQgMjggMjIgMTEgMTkgMTkgMjQgNSAyMCA4IDkgNSAyNSAxOSAxNyAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgCisxNiA4IDMgMTcgMTkgXgorNTkgMCAxOCAyOSA5IDIzIDkgMTAgMjkgNCAxMiAyNCAxNSA1IDggMjIgMTcgMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIAorNyAyNiAxMCAxNiAyNCA2IDcgMTIgOCAxMiAxNSAyNCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgCisyNiAxMCBeCis2MiAwIDE0IDIwIDIwIDI1IDE0IDEzIDE1IDI0IDE0IDExIDQgMjMgMjcgMjQgMjAgOSAxNiAxNyAyNCAxMyAxMiA2IDEgMTQgMjYgMjUgCis3IDggMjEgMSAxOSAzIDIgMiAxNyAyMSAxMyA1IDkgMjEgMjggOSAxIDEzIDIgMjEgOCAyNCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IAorMiAxNiAyNyAyOSBeCis2MiAwIDYgMiAxIDIzIDE3IDE0IDI4IDE5IDIzIDYgMjIgMTYgNCAxOSA2IDE2IDI4IDMgMyAxIDE1IDEzIDIyIDYgMTUgMTEgNiA0IDI0IAorMjUgMTUgMTkgMjMgMjggMSA5IDE1IDEwIDEyIDcgMjUgMTEgMjUgMiAyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjUgMTcgNiAyOSAyMSAyNCAKKzI3IDIxIDE4IF4KKzU0IDEgMTcgMjYgMjQgMTMgNCAyMiAyNCAyOSAyIDExIDggMTcgNCAyMyAxMSAyNiAxIDI1IDI4IDE1IDE5IDEwIDMgOSAyOSAyNyA3IAorMjIgMyAyNyAyMSAyIDI2IDE5IDkgMTkgMjcgMjMgMyAxMiAxNyAxMCA0IDggMjcgMTkgMTYgMSAyMSAyMyAyOCAyMyAxOCAxNyBeCis1MiAwIDI1IDE4IDI2IDIwIDggMTcgMTkgMiA0IDExIDcgMTggNiAyNCAyIDI1IDI1IDUgMjcgMjAgMyAyOCAyMCAxOCAyMSAxMCAyNSAKKzEwIDEgMjggMjggMjkgMTYgMjAgMTkgMjYgMTYgMjEgNiAyMyAxNSAyOCAyNiAyOCA3IDE1IDE4IDExIDUgMTcgMjAgMTMgXgorNjggMCAxIDEwIDE0IDggNCAxNiAyNiAxNyA4IDEwIDIyIDIyIDE4IDEgMjAgMjQgNyAxIDkgNyAxOSA1IDIyIDEgNCAyNiAxMSAxMCAyOCAKKzUgMTQgMiA2IDQgMiA5IDIyIDE1IDEzIDIwIDIyIDI2IDE4IDE2IDkgMiAxNSAyMCAyNyA4IDYgMTcgNSAxNSA5IDI1IDEwIDI2IDQgNSAKKzI3IDUgMTkgMjEgNSA2IDExIDE5IF4KKzU0IDEgMTkgOCAyIDI0IDI2IDIyIDE5IDE4IDE3IDIzIDE0IDIxIDE0IDIyIDEzIDIwIDUgMjkgNiA1IDI2IDYgMjEgMjkgMyA1IDEyIAorMTYgMTEgMTMgMTYgMTggMTggMTAgMTEgMjAgMjEgMTIgMTEgMTIgMjIgMTQgMTkgMyAyMSAxNSA2IDI1IDI2IDI5IDI0IDE5IDE3IDI0IF4KKzU5IDAgMjUgMjIgMTIgMTMgMjMgMjMgMTIgMTAgMTMgMSAyMiAxMCAyIDIyIDIgMjggMTAgMTcgMTggMyA2IDE5IDI4IDE3IDExIDEgOSAKKzE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IDkgMjggMTMgMjUgMjQgMjggOCAxNCA5IDMgCisxNCAxNiBeCis1MyAwIDI2IDkgOSAxMiAxMyAxNyAyNSAxNiA1IDggNCAyNCAxMCAyNCAyMyA0IDI5IDIxIDkgMTggMjggMjUgMTEgMyAxNiA0IDIxIDI1IAorMyA0IDE4IDEyIDEyIDI5IDI2IDEzIDI2IDIzIDI2IDcgMjMgMTAgOSAyNyAyNiAyMSAyNSAyMSAxOCA5IDI0IDE2IDE3IF4KKzU5IDAgNSAyMSA3IDcgMjcgNCAyMCAyMyAxMyAyNyAxMCAyMyAyOSA3IDE5IDEzIDEzIDggMTkgMjAgMTggMiAxOSAyMiAyOSAzIDEwIDYgCis5IDEzIDI0IDE3IDE2IDkgMjAgMjEgMjcgMiAxOSA3IDggMjYgMjUgMTIgMiAxNCAzIDEgMSAxNiAxMiAyMCAyOCAyNCAxMiA1IDI0IDI1IAorMTkgXgorNjAgMCAxIDEyIDI1IDkgMiA2IDIwIDE1IDE0IDI5IDE4IDIxIDI4IDEgMTcgNiAxNyAyNyAxIDIgMTAgMTYgMTkgNSAxNCAxMCAyNyAxMSAKKzE3IDMgMjkgMTQgMjcgMTcgNSAyIDE4IDIwIDExIDI3IDE4IDIyIDI3IDIyIDkgOCAxOCAzIDE0IDEwIDUgMiAyNCAxOCAyMyAyMSAyNiAKKzggMjIgMTMgXgorNjIgMCAxIDYgMjcgMjcgMTUgMjkgMjAgMiAyOSAyMiA4IDE2IDIwIDQgMTIgOSA2IDEyIDE2IDE2IDcgOSAyMCAyOSAxMSA5IDQgMSAxNSAKKzI1IDE2IDI5IDEwIDIyIDcgMiA4IDUgMTggMTQgMjMgMjQgNCA2IDI2IDMgMTEgNiAxMiAxIDcgMTQgMjQgMTQgNiAxMCAyMSAxNiAyMyAKKzI5IDI1IDI0IF4KKzY3IDAgMTQgMTcgMiAxMiAxMCA1IDEwIDE1IDI1IDggMTUgMyA3IDEzIDI1IDE2IDE0IDEgMjkgMjIgMjYgMTUgMjcgOSAxIDggOCAyOCAKKzYgMTMgNSAxMyAzIDE1IDUgMjMgOCAyMyAyIDUgNSA0IDE3IDEzIDE0IDcgMTcgMTIgMjcgMyAxOCA1IDcgNSAyNiAxOCAxNSAyMiAyOCAKKzE2IDEzIDcgMiAyMyAxOSAyNSAxNCBeCis1OCAxIDE3IDcgMTYgMjUgMjMgMTEgMTEgMTUgMiAxMyA5IDI2IDIgMjQgMjYgNyAyOCAxMSAyIDI5IDcgMjIgMjMgNSAyOCAxOSAxIDI3IAorMjkgMSAyNCAxMSAxOCAyMCAzIDEzIDExIDcgMyAxNSAxNyAyNCAxIDE4IDEzIDYgMyAyNSAyNyAxNiAyOCAxOCAyNCA4IDIzIDcgMjkgCisxMSBeCis1NSAwIDYgMjggMTQgMTIgMjggMjcgMjIgNCAxNCAyNSAxIDMgOSA3IDExIDE0IDE1IDE2IDEwIDE5IDEyIDE5IDExIDIwIDEzIDI4IDQgCisyNyAyOCA3IDI3IDEyIDQgMjggMjEgMTcgMjIgMjAgMTcgMTUgMTUgMjMgMjIgMTMgMTIgMjEgMjIgMjEgMTEgMTIgMTQgMTIgMTggMjcgCisxMCBeCis2NSAwIDcgNCA5IDE0IDE2IDE1IDggMTEgMjEgMjAgMTAgMTAgMjEgMjMgMjAgMiAxMSAyMyAxIDExIDEgNSAzIDIzIDE2IDE1IDI3IDE0IAorNSAxNiAzIDIyIDIgMyAyNCAzIDE5IDI5IDQgNCAxMCA4IDIwIDE0IDE1IDEgMjYgMTIgMjcgMjUgNCAyOCAyMiAxMSAxOSAxOSAyNCA1IAorMjAgOCA5IDUgMjUgMTkgMjAgXgorNTkgMSAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgMTYgOCAzIDE3IDI4IDE4IDI5IDkgMjMgOSAxMCAyOSA0IDEyIDI0IDE1IDUgOCAyMiAxNyAKKzI5IDEyIDMgOCAyOSAxNSAyMSAyMSA0IDcgMjAgNyAxMCA3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIDE1IDI0IDkgMTcgMTEgMjggMTIgCisyMyBeCis2MSAwIDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgMTUgMjQgMTQgMTEgNCAyMyAyNyAKKzI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDEzIDUgOSAyMSAyOCA5IDEgMTMgCisyIDIxIDggMjkgXgorNjggMCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IDIgMTYgMjcgMTYgNiAyIDEgMjMgMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IAorNiAxNiAyOCAzIDMgMSAxNSAxMyAyMiA2IDE1IDExIDYgNCAyNCAyNSAxNSAxOSAyMyAyOCAxIDkgMTUgMTAgMTIgNyAyNSAxMSAyNSAyIAorMjcgNiA2IDE4IDQgMTMgMSA0IDExIDI2IF4KKzU0IDEgMTcgNiAyOSAyMSAyNCAyNyAyMSAxNyAxNyAyNiAyNCAxMyA0IDIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggCisxNSAxOSAxMCAzIDkgMjkgMjcgNyAyMiAzIDI3IDIxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAyMCBeCis1MiAxIDE2IDEgMjEgMjMgMjggMjMgMTggOCAyNSAxOCAyNiAyMCA4IDE3IDE5IDIgNCAxMSA3IDE4IDYgMjQgMiAyNSAyNSA1IDI3IDIwIAorMyAyOCAyMCAxOCAyMSAxMCAyNSAxMCAxIDI4IDI4IDI5IDE2IDIwIDE5IDI2IDE2IDIxIDYgMjMgMTUgMjggMjYgMTIgXgorNjcgMCA3IDE1IDE4IDExIDUgMTcgMjAgMjYgMSAxMCAxNCA4IDQgMTYgMjYgMTcgOCAxMCAyMiAyMiAxOCAxIDIwIDI0IDcgMSA5IDcgCisxOSA1IDIyIDEgNCAyNiAxMSAxMCAyOCA1IDE0IDIgNiA0IDIgOSAyMiAxNSAxMyAyMCAyMiAyNiAxOCAxNiA5IDIgMTUgMjAgMjcgOCA2IAorMTcgNSAxNSA5IDI1IDEwIDI2IDE5IF4KKzU4IDAgNSAyNyA1IDE5IDIxIDUgNiAxMSAyOSAxOSA4IDIgMjQgMjYgMjIgMTkgMTggMTcgMjMgMTQgMjEgMTQgMjIgMTMgMjAgNSAyOSAKKzYgNSAyNiA2IDIxIDI5IDMgNSAxMiAxNiAxMSAxMyAxNiAxOCAxOCAxMCAxMSAyMCAyMSAxMiAxMSAxMiAyMiAxNCAxOSAzIDIxIDE1IDYgCisyNSAyNyBeCis1NyAwIDI5IDI0IDE5IDE3IDE4IDI1IDIyIDEyIDEzIDIzIDIzIDEyIDEwIDEzIDEgMjIgMTAgMiAyMiAyIDI4IDEwIDE3IDE4IDMgNiAKKzE5IDI4IDE3IDExIDEgOSAxNCA0IDI5IDI5IDIzIDI1IDEzIDE5IDE4IDIgNyAyMSA2IDggMjkgNSAxMSAyMiAxNCAxNCA5IDI4IDEzIAorMjUgMjUgXgorNTIgMCAxNSAyOSA5IDI4IDIwIDIgMzAgMjYgMjEgMTcgOCAyOCAxNyAyMiAyOSAyNCA4IDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAKKzE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAxMiAyNSAxNSAyOCAyMyA1IDEwIDIxIDUgOCA3IDMgMTAgMTkgMTcgMTggXgorNjIgMCA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAyNyAyIDEzIDI3IDcgNyAzMCAKKzIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgMjAgMyA5IDEwIDMwIDcgMTIgMjQgNSAxMyAxIDYgMTAgMjUgMTMgOSAKKzI5IDMwIDcgXgorNjIgMCAyOSAxNyAyNiA2IDI1IDQgNyAyNSA4IDE1IDI2IDMwIDExIDIgOSA2IDIyIDYgMjEgMjggMyAzIDYgMTIgMTMgMTUgNyAxNyAxNiAKKzI2IDMgMTkgMyA1IDIgMjkgMTYgMTYgMjIgMjYgMTMgMTIgOSAxOSAxNiAyNyAyNSAxNiA3IDE1IDIyIDIyIDUgNiAxMyA0IDEyIDExIAorMjcgNSAxOSAxNSBeCis1NyAwIDkgMzAgOSAxIDI4IDMgMjEgMjIgNyAxNyAyIDI1IDEgMjggMjEgMTEgMTcgMjAgMjggMTIgMTAgMTAgMyAxNSAxMyAyMCAxIDIwIAorMTEgMSAzMCAyMiAyMyAxNSAyNiAxMiAyMSA3IDI3IDkgMjcgMjkgNSAyNiAxNiAxMSAyMyAyOCAxOCAxIDEzIDIzIDMwIDYgMyAxMSAyNSAKK14KKzYxIDEgMTYgMTAgMTMgMTMgMTkgMTUgMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IDE1IAorMTYgMTkgMjAgMTcgMTAgMTcgMjEgMjAgNiAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IDE4IDI0IAorMjEgMyA3IDIxIDkgMjIgXgorNTggMSAzIDQgMjMgMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAxOCAyIDIzIDcgMjkgCisyMyAyOSAyNyAxOSA3IDIwIDIxIDI1IDUgMTcgOSA3IDEgMjEgMjAgMTkgMjkgMTkgMTQgOCAyMyAyMyAxOSAzIDE4IDE3IDMgMjkgMTQgCisxNyBeCis2MiAxIDIzIDI4IDUgMjIgOCAxMCAxIDEgMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgCisxMSA0IDI4IDggMjAgMjUgMiA2IDggNSAxNCAxMSAyMSA5IDE2IDggMjUgNiAyNiAyNyAxIDI5IDEyIDggMTYgNCAxNyA1IDMwIDMwIDI0IAorMTIgMTkgMjEgXgorNTcgMSAyNSAxMSAxMyAxMiAyNyAxNiAxNCAzIDI0IDIwIDI0IDIzIDIyIDkgMTQgMTkgMjYgOCAxMyA2IDEzIDI1IDE5IDUgMSAxOSAxIAorMTcgMjggMzAgMTMgMjEgMTEgNCAxMCAyMyAyNSA3IDUgMTEgMjAgNyAyNCAyOSAyNyAxMyAxNiAxNyAxIDE1IDEyIDI5IDQgMTYgMjcgCisxMiAyMSBeCis2NSAwIDIgMiAyNCAxNyAxMyAyMiAyMCAyMiA0IDIwIDE2IDIgMTcgMyAxMSAyOSAxIDUgMTAgMTQgMjMgMyAxNCA5IDIgNyAxOCAyMCAKKzEzIDIgMTYgMjUgMjQgNCA0IDE0IDcgMTMgOCAyMCAxMiAyMyAxIDI2IDcgOSAxOSA2IDE2IDMgOCAyNiAyMSAxMCAyNiAyMyAyNCAyOCAKKzE2IDEyIDE0IDI1IDIyIDE2IDE1IF4KKzUzIDAgMjEgMjQgMjcgMzAgMTUgMTAgMTUgMiAxOCAxMyAyNiAyOCAyMyAxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAKKzEgMjQgMTMgNSAyMSAyOSAyNiAyIDEwIDE2IDYgNSA3IDIzIDE5IDExIDI4IDIyIDIxIDEgMjQgMTkgNyAyNiAxOCAzMCAyNiBeCis1OCAwIDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgNSAyNSAxIDI3IDI0IDYgMjMgMTYgNSAxIDIwIDI5IDIyIDI1IDkgMjUgMTAgMyAyOCAKKzI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggMTIgMjggMjYgMjkgMiAxNSAxNSA5IDUgMTggMTkgMjIgMTIgMTUgNCA2IDE1IDI0IAorMTYgMjIgXgorNTkgMCA0IDI2IDI1IDE4IDI3IDE5IDIwIDQgMjYgMTIgMyAyMiAxIDIyIDMwIDMgMjggMTAgOSAyNCAxNCAyOSA2IDMwIDMgMTAgMjAgCisxNCA2IDMgMTkgMjEgMjEgMjggMTYgMTggMTEgMzAgMTEgMjAgMzAgMSA5IDggMTEgNSAxOSAxMCAyNCA0IDIyIDQgMiAyNiA1IDE1IDIwIAorOCAyNSBeCis1NSAxIDEzIDMwIDE4IDggMSAyNSAyOCAyMCAyMCAxNSAyMSAxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgCisyNyA0IDkgMTMgMTAgOCAxNCAxNiAxNSAxMiAxMSAxNCAyMSAxNCAxMCAxMSAyNSAxNyAxNyAzMCAyMSAxMyAyNyAyNiAyNiAyMiAxNCAKKzIxIF4KKzU3IDAgMTcgMjEgMTkgOSA5IDIwIDIzIDEzIDcgMTAgMjggMjQgMTAgMjIgMjcgMjMgMjcgOCAxNyAxNCA2IDQgMjEgMjYgMTUgMSA4IAorMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IDE0IDE5IDEzIDI5IDggMjQgMiA4IDIgNCAxMiAxOSAxMSAxMCA2IDI2IDE0IDIyIDI0IDMwIAorMiBeCis1NiAxIDExIDEyIDIgMTIgMTcgMjMgOCA4IDEyIDI4IDEzIDE0IDI4IDIgMTcgNCA4IDMgMjYgOSAyMyAyMSAzMCAzMCAyMCA0IDEzIDI4IAorMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgMTIgMjQgMTUgMzAgMjAgMjcgMyAyMyAxMSA2IDI5IDI1IDIzIDI2IDE3IDIzIF4KKzYxIDEgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAxOSAyMyAxNSAyNyAxNCAyNiAxIDEgNyAxOSAxMiA3IDYgMjAgMTggMTQgNCAxNSAKKzE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIDMwIDE0IDMgMSAxOCAxMCAyMCAyNyAyMSAKKzggNiAyNCAzMCBeCis1NCAwIDIwIDExIDI0IDcgMiA0IDE4IDE1IDE0IDMwIDE2IDE5IDIgMjcgMTUgNCAxOSAyNSAyOSAyOSA3IDE0IDE4IDkgMTEgOSAyNyAKKzExIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDggMTEgMTggMjkgMTUgNiA3IDI3IDI3IDcgXgorNjMgMSAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMTIgMjUgMTUgMjggMjMgNSAxMCAyMSA1IDggNyAzIDEwIDE5IDE3IDYgOSAxNSAKKzI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAyNyAyIDEzIDI3IDcgNyAzMCAyIDE4IDI2IAorMTAgMiA1IDI5IDEyIF4KKzYzIDEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAxMCAyNSAxMyA5IDI5IDMwIDE3IDI5IDE3IAorMjYgNiAyNSA0IDcgMjUgOCAxNSAyNiAzMCAxMSAyIDkgNiAyMiA2IDIxIDI4IDMgMyA2IDEyIDEzIDE1IDcgMTcgMTYgMjYgMyAxOSAzIAorNSAyIDI5IDE2IDE3IF4KKzYwIDEgMjIgMjYgMTMgMTIgOSAxOSAxNiAyNyAyNSAxNiA3IDE1IDIyIDIyIDUgNiAxMyA0IDEyIDExIDI3IDUgMTkgMjggOSAzMCA5IDEgCisyOCAzIDIxIDIyIDcgMTcgMiAyNSAxIDI4IDIxIDExIDE3IDIwIDI4IDEyIDEwIDEwIDMgMTUgMTMgMjAgMSAyMCAxMSAxIDMwIDIyIDIzIAorMTUgMjYgNiBeCis1NiAwIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAzIDExIDExIDE2IDEwIDEzIDEzIDE5IDE1IAorMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IDE1IDE2IDE5IDIwIDE3IDEwIDE3IDIxIDIwIAorMTEgXgorNjQgMSAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IDE4IDI0IDIxIDMgNyAyMSA5IDQgMyA0IDIzIAorMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAxOCAyIDIzIDcgMjkgMjMgMjkgMjcgMTkgNyAKKzIwIDIxIDI1IDUgMzAgXgorNjMgMSA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAyNyAyMyAyOCA1IDIyIDggMTAgMSAxIAorMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgMTEgNCAyOCA4IDIwIDI1IDIgNiA4IDUgCisxNCAxMSAyMSA5IDI5IF4KKzU3IDAgOCAyNSA2IDI2IDI3IDEgMjkgMTIgOCAxNiA0IDE3IDUgMzAgMzAgMjQgMTIgMTkgMjQgMjUgMTEgMTMgMTIgMjcgMTYgMTQgMyAKKzI0IDIwIDI0IDIzIDIyIDkgMTQgMTkgMjYgOCAxMyA2IDEzIDI1IDE5IDUgMSAxOSAxIDE3IDI4IDMwIDEzIDIxIDExIDQgMTAgMjMgMjUgCis2IF4KKzY4IDAgNSAxMSAyMCA3IDI0IDI5IDI3IDEzIDE2IDE3IDEgMTUgMTIgMjkgNCAxNiAyNyAxMiA2IDIgMiAyNCAxNyAxMyAyMiAyMCAyMiAKKzQgMjAgMTYgMiAxNyAzIDExIDI5IDEgNSAxMCAxNCAyMyAzIDE0IDkgMiA3IDE4IDIwIDEzIDIgMTYgMjUgMjQgNCA0IDE0IDcgMTMgOCAKKzIwIDEyIDIzIDEgMjYgNyA5IDE5IDYgMzAgXgorNTQgMSAzIDggMjYgMjEgMTAgMjYgMjMgMjQgMjggMTYgMTIgMTQgMjUgMjIgMTYgMiAyMSAyNCAyNyAzMCAxNSAxMCAxNSAyIDE4IDEzIAorMjYgMjggMjMgMTYgMjMgMTAgMiAxMSAyNiAyNiA0IDI5IDE4IDQgMjQgMjQgMSAyNCAxMyA1IDIxIDI5IDI2IDIgMTAgMTYgNiAyNyBeCis1NiAwIDcgMjMgMTkgMTEgMjggMjIgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI1IDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgNSAyNSAxIDI3IAorMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggMTIgMjggOSBeCis1OCAwIDI5IDIgMTUgMTUgOSA1IDE4IDE5IDIyIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTkgMjAgNCAyNiAxMiAzIAorMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAzMCAxMSAyMCAKKzI5IF4KKzY1IDAgMSA5IDggMTEgNSAxOSAxMCAyNCA0IDIyIDQgMiAyNiA1IDE1IDIwIDggMyAxMyAzMCAxOCA4IDEgMjUgMjggMjAgMjAgMTUgMjEgCisxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgMTUgMTIgMTEgMTQgMjEgCisxNCAxMCAxMSAyNSAxNyAxNyAyMCBeCis1NSAwIDIxIDEzIDI3IDI2IDI2IDIyIDE0IDEzIDE3IDIxIDE5IDkgOSAyMCAyMyAxMyA3IDEwIDI4IDI0IDEwIDIyIDI3IDIzIDI3IDggCisxNyAxNCA2IDQgMjEgMjYgMTUgMSA4IDI5IDI3IDYgMjggMTUgMyAyNyAyNSAyNSAxNCAxOSAxMyAyOSA4IDI0IDIgOCAyIDQgMzAgXgorNTcgMSAxOSAxMSAxMCA2IDI2IDE0IDIyIDI0IDMwIDEwIDExIDEyIDIgMTIgMTcgMjMgOCA4IDEyIDI4IDEzIDE0IDI4IDIgMTcgNCA4IAorMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgMTIgMjQgMTUgMzAgMjAgMjcgCiszMCBeCis1OSAwIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjAgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAxOSAyMyAxNSAyNyAxNCAyNiAxIDEgCis3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IDE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIAorMzAgMTggXgorNTYgMCAzIDEgMTggMTAgMjAgMjcgMjEgOCA2IDI0IDI2IDIwIDExIDI0IDcgMiA0IDE4IDE1IDE0IDMwIDE2IDE5IDIgMjcgMTUgNCAxOSAKKzI1IDI5IDI5IDcgMTQgMTggOSAxMSA5IDI3IDExIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDcgXgorNjIgMCAxMSAxOCAyOSAxNSA2IDcgMjcgMjcgMTcgMjQgMTggMjMgMTEgMTkgOCAzMCA1IDI0IDIyIDEyIDI1IDE1IDI4IDIzIDUgMTAgCisyMSA1IDggNyAzIDEwIDE5IDE3IDYgOSAxNSAyOSAxMCA3IDQgMSAxNiAyMSAxNiAyOSAxMyAxOCA1IDMgOCAxNSA4IDIxIDI5IDIwIDUgCisyNyAyIDEzIDI3IDcgXgorNjIgMSA3IDMwIDIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgMjAgMyA5IDEwIDMwIDcgMTIgMjQgNSAxMyAxIDYgCisxMCAyNSAxMyA5IDI5IDMwIDE3IDI5IDE3IDI2IDYgMjUgNCA3IDI1IDggMTUgMjYgMzAgMTEgMiA5IDYgMjIgNiAyMSAyOCAzIDMgNiAKKzEyIDEzIDE1IDI2IF4KKzYyIDAgMTcgMTYgMjYgMyAxOSAzIDUgMiAyOSAxNiAxNiAyMiAyNiAxMyAxMiA5IDE5IDE2IDI3IDI1IDE2IDcgMTUgMjIgMjIgNSA2IAorMTMgNCAxMiAxMSAyNyA1IDE5IDI4IDkgMzAgOSAxIDI4IDMgMjEgMjIgNyAxNyAyIDI1IDEgMjggMjEgMTEgMTcgMjAgMjggMTIgMTAgCisxMCAzIDE1IDEzIDIwIDE5IF4KKzU2IDEgMjAgMTEgMSAzMCAyMiAyMyAxNSAyNiAxMiAyMSA3IDI3IDkgMjcgMjkgNSAyNiAxNiAxMSAyMyAyOCAxOCAxIDEzIDIzIDMwIDYgCiszIDExIDExIDE2IDEwIDEzIDEzIDE5IDE1IDE4IDcgMjIgMTAgMjkgMyAyNSAzMCA4IDIyIDEzIDQgNCAyNyAyMiAxOCAyMSAyMyAxNyAKKzIyIF4KKzY2IDEgMTYgMTkgMjAgMTcgMTAgMTcgMjEgMjAgNiAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IAorMTggMjQgMjEgMyA3IDIxIDkgNCAzIDQgMjMgMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAKKzE4IDIgMjMgNyAyOSAyMyAyOSAyNCBeCis2MiAwIDE5IDcgMjAgMjEgMjUgNSAxNyA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAyNyAKKzIzIDI4IDUgMjIgOCAxMCAxIDEgMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgMTEgNCAKKzI4IDggMjAgMjUgNyBeCis1OSAwIDYgOCA1IDE0IDExIDIxIDkgMTYgOCAyNSA2IDI2IDI3IDEgMjkgMTIgOCAxNiA0IDE3IDUgMzAgMzAgMjQgMTIgMTkgMjQgMjUgCisxMSAxMyAxMiAyNyAxNiAxNCAzIDI0IDIwIDI0IDIzIDIyIDkgMTQgMTkgMjYgOCAxMyA2IDEzIDI1IDE5IDUgMSAxOSAxIDE3IDI4IDMwIAorMTMgMjYgXgorNzAgMCAxMSA0IDEwIDIzIDI1IDcgNSAxMSAyMCA3IDI0IDI5IDI3IDEzIDE2IDE3IDEgMTUgMTIgMjkgNCAxNiAyNyAxMiA2IDIgMiAyNCAKKzE3IDEzIDIyIDIwIDIyIDQgMjAgMTYgMiAxNyAzIDExIDI5IDEgNSAxMCAxNCAyMyAzIDE0IDkgMiA3IDE4IDIwIDEzIDIgMTYgMjUgMjQgCis0IDQgMTQgNyAxMyA4IDIwIDEyIDIzIDEgMjYgNyBeCis1NCAxIDkgMTkgNiAxNiAzIDggMjYgMjEgMTAgMjYgMjMgMjQgMjggMTYgMTIgMTQgMjUgMjIgMTYgMiAyMSAyNCAyNyAzMCAxNSAxMCAKKzE1IDIgMTggMTMgMjYgMjggMjMgMTYgMjMgMTAgMiAxMSAyNiAyNiA0IDI5IDE4IDQgMjQgMjQgMSAyNCAxMyA1IDIxIDI5IDI2IDI3IF4KKzU4IDEgMTAgMTYgNiA1IDcgMjMgMTkgMTEgMjggMjIgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI1IDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgCis1IDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggCisyOCBeCis1OCAxIDI4IDI2IDI5IDIgMTUgMTUgOSA1IDE4IDE5IDIyIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTkgMjAgNCAKKzI2IDEyIDMgMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAKKzMwIDIyIF4KKzY1IDEgMjAgMzAgMSA5IDggMTEgNSAxOSAxMCAyNCA0IDIyIDQgMiAyNiA1IDE1IDIwIDggMyAxMyAzMCAxOCA4IDEgMjUgMjggMjAgMjAgCisxNSAyMSAxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgMTUgMTIgMTEgCisxNCAyMSAxNCAxMCAxMSAyNSAyMCBeCis1MyAwIDE3IDMwIDIxIDEzIDI3IDI2IDI2IDIyIDE0IDEzIDE3IDIxIDE5IDkgOSAyMCAyMyAxMyA3IDEwIDI4IDI0IDEwIDIyIDI3IDIzIAorMjcgOCAxNyAxNCA2IDQgMjEgMjYgMTUgMSA4IDI5IDI3IDYgMjggMTUgMyAyNyAyNSAyNSAxNCAxOSAxMyAyOSA4IDI0IDE1IF4KKzYxIDAgOCAyIDQgMTIgMTkgMTEgMTAgNiAyNiAxNCAyMiAyNCAzMCAxMCAxMSAxMiAyIDEyIDE3IDIzIDggOCAxMiAyOCAxMyAxNCAyOCAKKzIgMTcgNCA4IDMgMjYgOSAyMyAyMSAzMCAzMCAyMCA0IDEzIDI4IDI5IDkgMyAxNyA3IDE5IDMwIDI4IDEgMiAyMCA5IDEyIDI0IDE1IAorMzAgMjAgMjcgMjAgXgorNjAgMCAyMyAxMSA2IDI5IDI1IDIzIDI2IDE3IDIwIDEwIDIyIDE1IDIzIDYgMjUgNSA0IDMwIDIgMTkgMjMgMTUgMjcgMTQgMjYgMSAxIAorNyAxOSAxMiA3IDYgMjAgMTggMTQgNCAxNSAxNyAyOCA3IDExIDcgOCA5IDIyIDE3IDEyIDUgMjMgMTggMjUgMTggNiAxMiAyNiAzMCAxMiAKKzMwIDE0IDIwIF4KKzU2IDAgMyAxIDE4IDEwIDIwIDI3IDIxIDggNiAyNCAyNiAyMCAxMSAyNCA3IDIgNCAxOCAxNSAxNCAzMCAxNiAxOSAyIDI3IDE1IDQgMTkgCisyNSAyOSAyOSA3IDE0IDE4IDkgMTEgOSAyNyAxMSAxNSAyOSA5IDI4IDIwIDIgMzAgMjYgMjEgMTcgOCAyOCAxNyAyMiAyOSAyNCAyMyBeCis2MiAwIDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMTIgMjUgMTUgMjggMjMgNSAxMCAKKzIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAKKzI3IDIgMTMgMjcgMjMgXgorNjQgMSA3IDMwIDIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgMjAgMyA5IDEwIDMwIDcgMTIgMjQgNSAxMyAxIDYgCisxMCAyNSAxMyA5IDI5IDMwIDE3IDI5IDE3IDI2IDYgMjUgNCA3IDI1IDggMTUgMjYgMzAgMTEgMiA5IDYgMjIgNiAyMSAyOCAzIDMgNiAKKzEyIDEzIDE1IDcgMTcgMTggXgorNjUgMCAyNiAzIDE5IDMgNSAyIDI5IDE2IDE2IDIyIDI2IDEzIDEyIDkgMTkgMTYgMjcgMjUgMTYgNyAxNSAyMiAyMiA1IDYgMTMgNCAxMiAKKzExIDI3IDUgMTkgMjggOSAzMCA5IDEgMjggMyAyMSAyMiA3IDE3IDIgMjUgMSAyOCAyMSAxMSAxNyAyMCAyOCAxMiAxMCAxMCAzIDE1IAorMTMgMjAgMSAyMCAxMSAxIDMwIDUgXgorNTcgMCAyMyAxNSAyNiAxMiAyMSA3IDI3IDkgMjcgMjkgNSAyNiAxNiAxMSAyMyAyOCAxOCAxIDEzIDIzIDMwIDYgMyAxMSAxMSAxNiAxMCAKKzEzIDEzIDE5IDE1IDE4IDcgMjIgMTAgMjkgMyAyNSAzMCA4IDIyIDEzIDQgNCAyNyAyMiAxOCAyMSAyMyAxNyAxNSAxNiAxOSAyMCAxNyAKKzEwIDI1IF4KKzY2IDEgMjEgMjAgNiAxNCAxNCAxIDEwIDE4IDQgNSA1IDkgMTcgMTggMTQgNSAxMiAyMiAyMiAxMSA4IDE4IDI0IDIxIDMgNyAyMSA5IDQgCiszIDQgMjMgMTQgMTcgMjUgMjcgMTAgNSAxNiAzMCAyMyAyIDQgMjUgMyAxNiAyOCA0IDYgNiAxNyAxMiAxOCAyIDIzIDcgMjkgMjMgMjkgCisyNyAxOSA3IDIwIDIxIDI1IDIwIF4KKzY1IDEgMTcgOSA3IDEgMjEgMjAgMTkgMjkgMTkgMTQgOCAyMyAyMyAxOSAzIDE4IDE3IDMgMjkgMTQgMjcgMjMgMjggNSAyMiA4IDEwIDEgCisxIDExIDI3IDE4IDMgMiAyMiAyOCAxNCAyNCAxMiAxIDMgMzAgMjkgMTEgMjIgMTkgNyAxNiAxIDExIDQgMjggOCAyMCAyNSAyIDYgOCA1IAorMTQgMTEgMjEgOSAxNiAyOCBeCis1OSAxIDI1IDYgMjYgMjcgMSAyOSAxMiA4IDE2IDQgMTcgNSAzMCAzMCAyNCAxMiAxOSAyNCAyNSAxMSAxMyAxMiAyNyAxNiAxNCAzIDI0IAorMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgMTcgMjggMzAgMTMgMjEgMTEgNCAxMCAyMyAyNSA3IAorNSAxMSAyMyBeCis3MCAwIDIwIDcgMjQgMjkgMjcgMTMgMTYgMTcgMSAxNSAxMiAyOSA0IDE2IDI3IDEyIDYgMiAyIDI0IDE3IDEzIDIyIDIwIDIyIDQgMjAgCisxNiAyIDE3IDMgMTEgMjkgMSA1IDEwIDE0IDIzIDMgMTQgOSAyIDcgMTggMjAgMTMgMiAxNiAyNSAyNCA0IDQgMTQgNyAxMyA4IDIwIDEyIAorMjMgMSAyNiA3IDkgMTkgNiAxNiAzIDggMjYgMjUgXgorNTYgMCAxMCAyNiAyMyAyNCAyOCAxNiAxMiAxNCAyNSAyMiAxNiAyIDIxIDI0IDI3IDMwIDE1IDEwIDE1IDIgMTggMTMgMjYgMjggMjMgCisxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAxIDI0IDEzIDUgMjEgMjkgMjYgMiAxMCAxNiA2IDUgNyAyMyAxOSAxMSAKKzI4IDI0IF4KKzU5IDEgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI1IDIxIDYgMTggMjIgMiAxIDE0IDIgMTQgNSAyNSAxIDI3IDI0IDYgMjMgMTYgNSAxIAorMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgMjggMTIgMjggMjYgMjkgMiAxNSAxNSA5IDUgCisxOCAxOSAxMyBeCis2MyAxIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTkgMjAgNCAyNiAxMiAzIDIyIDEgMjIgMzAgMyAyOCAxMCA5IDI0IAorMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAzMCAxMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IAorNCAyMiA0IDIgMjYgMjAgXgorNTkgMSAxNSAyMCA4IDMgMTMgMzAgMTggOCAxIDI1IDI4IDIwIDIwIDE1IDIxIDE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgCisyMyA5IDE4IDI3IDI3IDQgOSAxMyAxMCA4IDE0IDE2IDE1IDEyIDExIDE0IDIxIDE0IDEwIDExIDI1IDE3IDE3IDMwIDIxIDEzIDI3IDI2IAorMjYgMjIgMTQgMjMgXgorNjEgMCAxNiAyMSAzMCAyNSA4IDkgMTggMzAgMTcgNCA2IDMxIDI2IDE2IDI1IDE4IDIzIDkgMjAgOCA3IDI1IDI2IDExIDI3IDE3IDI4IAorMiAyMyAyIDEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAxMiAxMSA1IDMxIDE5IDE5IDE5IDMwIDEzIDE4IDIgMyA4IDIgCisxNyA4IDI0IDI4IF4KKzY5IDAgMjIgMiA3IDI2IDEgMTMgMjYgNiA2IDYgMTggMjQgNyA2IDcgMzAgMTkgMTIgMjIgMjQgMjUgMyAxMSAxNyAzIDEwIDEyIDExIAorMTEgMjUgNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgOCAxMiAyOSA5IDEgMTAgOSAyNiA0IDE5IAorMSAzIDMgNCAxNiAxMyAxNyA2IDE2IDE0IDI4IF4KKzYyIDAgMyAyMCAzIDIgMSAzMCAxNCAxNCAyMSAyOSAxMyAxMSAxMCAyOSAyMCAxOSAyNiAyNyAxOSA2IDE3IDI2IDI2IDcgOSAxMyAxNiAKKzkgMzEgMiAyMCAyOCAxMCAxMCA0IDI4IDMgMjQgMjEgNiAyOSAxNiAxIDIyIDMxIDEgMjQgOSAxNiAyMiAyOCAxMSA3IDcgMyAxNyAxMyAKKzIyIDQgMTcgOSAyNyBeCis2MCAwIDIxIDIzIDE3IDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIDI4IDE4IDQgMTMgMjMgNCAzIDkgOSAxNCAxMiAKKzEzIDggMjAgMTIgMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAxNCAyMCAxNyAxNiA3IDE2IAorMTkgMjIgOSAxNSAyNSBeCis2NCAwIDMxIDcgMTggMjkgNSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IAorMTYgMjcgMjYgMTIgMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgCisxOSAyNyAyIDE2IDEwIDMxIF4KKzYwIDAgNCAyNCAxNyAyMCAyNSAyMCAxNSA4IDIzIDIzIDIwIDMwIDE4IDE2IDMgMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgMzEgMzEgMTQgCisyNiAxOCAzIDEgMjYgMjggMTUgMjUgMTEgMzEgMyAyNSA5IDIxIDIwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgMTAgMTQgCisxOSAxOSBeCis2MiAwIDE0IDggMjcgOSAyNCAyNiA0IDMwIDExIDggMTkgNSAyMSA3IDIgMjcgMjAgMTYgMjAgMjAgMjIgMTQgMTMgMTYgMjYgMTQgMTAgCiszIDI1IDIyIDI1IDIzIDIxIDEwIDE1IDE1IDI5IDggMTMgNCAyIDEzIDIyIDIwIDcgNCAyMCAzMSAxNiAyIDIgMjggMTMgMTkgMTQgMTIgCisyMyAyNyA2IDIgMTQgMjQgXgorNjIgMCAyMiA2IDI1IDMwIDI5IDMxIDEzIDE0IDE2IDMxIDEyIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAKKzIyIDE0IDI5IDEgMjEgMyAxNCAzMCA0IDIgMjkgMTIgMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAKKzMgMjIgMTEgMjMgMjEgXgorNTYgMSAyNCA2IDUgMjAgNCAxNCAzIDI5IDggMjkgMTkgNyAyOSAyMyAyNSAyOCAxOSAxMSAxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIAorNyAxMiAxIDE4IDEzIDI5IDI4IDIzIDI5IDE0IDIzIDcgMSA5IDI5IDI0IDUgMzAgMTggNSAyNSAyNSAzMSAyNSAxMyA3IDI0IDI1IDExIF4KKzU0IDAgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyMSAxOSAzMSAyMCAyMCA2IDI0IDE4IDI3IDI0IDQgMTggMjEgMSAzMSAxNSAxIAorMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAyMiAzMCAyMSAyMiA1IDI3IDEyIDMwIDI4IDI4IDI3IDE1IDE4IDE0IDI1IDIzIF4KKzU5IDEgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIDIgMTggMjAgMjEgMiAxMSAxMiA1IDQgMTIgMjUgMTQgNSA1IDI0IDIyIAorMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IDcgMTAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgMTUgOSAzIDIwIDI0IDI0IAorMjggMTQgMjUgXgorNTggMCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAxNSA3IDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAxMyAyNyAxOCA4IDMxIDI3IAorMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgMTAgMTMgMTIgOCAxNSAKKzE5IDI0IF4KKzU2IDEgMTEgMTQgMTUgMjQgMTUgMTIgOSAyMiAxNiAxNiAyNCAxMyAyIDI2IDI0IDI5IDI2IDE1IDEzIDIxIDI0IDIwIDEwIDEwIDIyIAorMjMgMTMgNiAxMiAyOCAyNSAxMiAyIDIxIDI2IDI4IDI2IDggMTYgMTUgNCA1IDE5IDI0IDEyIDMxIDggMzAgMzEgOSAyOCAxMiAzIDI2IAorMjkgOCBeCis2NSAwIDI3IDEwIDIwIDEzIDMwIDggMjUgMSA4IDEgNSAxMSAyMCA5IDEyIDQgMjkgMTUgMjEgMjUgMjcgNyAxNCAxMSAxIDExIDE2IDIzIAorOCA4IDExIDEgMTMgMTUgMjggMSAxNiA1IDggMyAyNCAxMCAyMyAyNCAxNyA1IDEzIDI4IDMwIDUgMyAxNiA2IDIwIDI4IDMxIDYgMjIgCisxMCAxMSAyOSAyNSAxNyAyNyAyMyBeCis2MCAwIDI2IDMgMjMgMTQgNCAzMCAyNyAyMyAyNCAyMSAxNyAxMiAyMSAxNyAyMyA0IDIyIDcgNSAyNyAxIDIwIDIzIDEyIDI2IDEwIDI0IAorMzEgMjkgNCAxMSAxNSAxMSA2IDkgMTcgMTggMTUgNSAxNyAyMSAyOCA2IDkgNiA4IDEwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAKKzExIDI0IDI0IF4KKzU4IDEgMTEgMTUgMjkgMjkgMyAzMSAxOCAxMiAxNyAzMSAxOSA4IDQgMjUgMjkgMTcgMjkgOSAyNSA2IDEgMiAxOCAxNyAxNSAxOSAxNSAKKzEgMjYgMTcgMjAgMjcgMzAgMzAgNiAxMCAxOCA1IDkgMTAgMjYgOSAxNyAyIDMwIDEwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IAorMTYgMjggXgorNjEgMSAzMCAyNSA4IDkgMTggMzAgMTcgNCA2IDMxIDI2IDE2IDI1IDE4IDIzIDkgMjAgOCA3IDI1IDI2IDExIDI3IDE3IDI4IDIgMjMgMiAKKzEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAxMiAxMSA1IDMxIDE5IDE5IDE5IDMwIDEzIDE4IDIgMyA4IDIgMTcgOCAyNCAKKzMwIDIyIDI5IF4KKzcwIDAgNyAyNiAxIDEzIDI2IDYgNiA2IDE4IDI0IDcgNiA3IDMwIDE5IDEyIDIyIDI0IDI1IDMgMTEgMTcgMyAxMCAxMiAxMSAxMSAyNSAKKzcgMTMgMzEgNCA3IDI3IDEzIDEwIDMwIDE2IDMwIDE2IDI5IDQgMjcgNSA2IDI3IDggMTIgMjkgOSAxIDEwIDkgMjYgNCAxOSAxIDMgMyAKKzQgMTYgMTMgMTcgNiAxNiAxNCAyNCAzIDIwIDIxIF4KKzYyIDEgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIDExIDEwIDI5IDIwIDE5IDI2IDI3IDE5IDYgMTcgMjYgMjYgNyA5IDEzIDE2IDkgMzEgMiAKKzIwIDI4IDEwIDEwIDQgMjggMyAyNCAyMSA2IDI5IDE2IDEgMjIgMzEgMSAyNCA5IDE2IDIyIDI4IDExIDcgNyAzIDE3IDEzIDIyIDQgMTcgCis5IDQgMjEgMjMgMjEgXgorNjIgMSAyNCAxNiAyNCAxMSAyNiA1IDMxIDMwIDIgMjQgMTQgOSAyMyAyOCAxOCA0IDEzIDIzIDQgMyA5IDkgMTQgMTIgMTMgOCAyMCAxMiAKKzE4IDYgMjEgMTIgMjUgMyAyNyA4IDIxIDEzIDUgMjYgMjEgMTggMTkgMjMgMTYgMTIgMTQgMjAgMTcgMTYgNyAxNiAxOSAyMiA5IDE1IAorMTAgMzEgNyAxOCAyOSA3IF4KKzY2IDEgNyAyIDUgMTYgMTggMTAgNyAxMSAyMSAyMSA5IDggMTggMjUgMTkgMyA2IDE5IDI5IDEwIDMgNSAyMyAxNSAxNiAyNyAyNiAxMiAKKzIgMTkgMjMgMSAyMiAzIDE5IDI4IDUgMiA5IDQgMjEgMTEgMTggMSAyMyA2IDMwIDIzIDMwIDI2IDIwIDExIDIyIDE5IDI3IDIgMTYgMTAgCis2IDQgMjQgMTcgMjAgMjUgMjAgMjEgXgorNjIgMSA4IDIzIDIzIDIwIDMwIDE4IDE2IDMgMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgMzEgMzEgMTQgMjYgMTggMyAxIDI2IDI4IDE1IAorMjUgMTEgMzEgMyAyNSA5IDIxIDIwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgMTAgMTQgMTkgMTAgMTQgOCAyNyA5IDI0IAorMjYgNCAzMCA4IF4KKzYyIDEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAzIDI1IDIyIDI1IDIzIDIxIDEwIDE1IAorMTUgMjkgOCAxMyA0IDIgMTMgMjIgMjAgNyA0IDIwIDMxIDE2IDIgMiAyOCAxMyAxOSAxNCAxMiAyMyAyNyA2IDIgMTQgMiAyMiA2IDI1IAorMzAgMjkgMzEgMTMgMTQgMjEgXgorNjUgMCAzMSAxMiAxNiAzMCA1IDE0IDMxIDExIDQgMSAxIDI1IDIxIDEzIDI2IDIyIDIxIDUgMjIgMTQgMjkgMSAyMSAzIDE0IDMwIDQgMiAKKzI5IDEyIDE1IDIzIDMgMTUgNSAxIDYgMjMgMjIgMTMgMSAxNCAyNyAyNSA1IDE1IDYgMTMgMyAyMiAxMSAyMyAzMSAyNCA2IDUgMjAgNCAKKzE0IDMgMjkgOCAyOSAxOSAzMSBeCis1NSAxIDI5IDIzIDI1IDI4IDE5IDExIDE1IDI3IDIxIDE0IDEgMTkgMjAgMjYgMTIgNyAxMiAxIDE4IDEzIDI5IDI4IDIzIDI5IDE0IDIzIAorNyAxIDkgMjkgMjQgNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyNyBeCis1MyAxIDE5IDMxIDIwIDIwIDYgMjQgMTggMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAKKzIyIDMwIDIxIDIyIDUgMjcgMTIgMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDIxIF4KKzYxIDAgMTAgMiAxOCAyMCAyMSAyIDExIDEyIDUgNCAxMiAyNSAxNCA1IDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAKKzI3IDMgMjggNyAxMCAyNSAyIDE1IDMwIDkgMzAgNyAyMiAxNSA5IDMgMjAgMjQgMjQgMjggMTQgMTggOSAyNyAxNCAyMiAyNyAzMSAxMCAKKzggMTQgNyAxNSAxOSBeCis1OSAxIDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAxMyAyNyAxOCA4IDMxIDI3IDI4IDIyIDIyIDE3IDE5IDE4IDE4IDExIDE5IDEzIDI1IAorMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgMTAgMTMgMTIgOCAxNSAxOSAxNyAxMSAxNCAxNSAyNCAxNSAxMiA5IDIyIDE2IAorMTYgMjQgMTMgMjMgXgorNTcgMCAyNiAyNCAyOSAyNiAxNSAxMyAyMSAyNCAyMCAxMCAxMCAyMiAyMyAxMyA2IDEyIDI4IDI1IDEyIDIgMjEgMjYgMjggMjYgOCAxNiAKKzE1IDQgNSAxOSAyNCAxMiAzMSA4IDMwIDMxIDkgMjggMTIgMyAyNiAyOSAyMiAyNyAxMCAyMCAxMyAzMCA4IDI1IDEgOCAxIDUgMTEgMjAgCisxNiBeCis2MSAxIDEyIDQgMjkgMTUgMjEgMjUgMjcgNyAxNCAxMSAxIDExIDE2IDIzIDggOCAxMSAxIDEzIDE1IDI4IDEgMTYgNSA4IDMgMjQgMTAgCisyMyAyNCAxNyA1IDEzIDI4IDMwIDUgMyAxNiA2IDIwIDI4IDMxIDYgMjIgMTAgMTEgMjkgMjUgMTcgMjcgMjIgMjYgMyAyMyAxNCA0IDMwIAorMjcgMjMgMjQgMzEgXgorNjEgMSAxNyAxMiAyMSAxNyAyMyA0IDIyIDcgNSAyNyAxIDIwIDIzIDEyIDI2IDEwIDI0IDMxIDI5IDQgMTEgMTUgMTEgNiA5IDE3IDE4IAorMTUgNSAxNyAyMSAyOCA2IDkgNiA4IDEwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAxMSAyNCAyNyAxMSAxNSAyOSAyOSAzIDMxIAorMTggMTIgMTcgMzEgMTIgXgorNjAgMSA4IDQgMjUgMjkgMTcgMjkgOSAyNSA2IDEgMiAxOCAxNyAxNSAxOSAxNSAxIDI2IDE3IDIwIDI3IDMwIDMwIDYgMTAgMTggNSA5IAorMTAgMjYgOSAxNyAyIDMwIDEwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IDE2IDIxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgCisyNiAxNiAxOCBeCis2NyAxIDE4IDIzIDkgMjAgOCA3IDI1IDI2IDExIDI3IDE3IDI4IDIgMjMgMiAxMiAyNCAyIDggNiAzIDEyIDIwIDE2IDQgMTAgMTcgMzAgCisxMiAxMSA1IDMxIDE5IDE5IDE5IDMwIDEzIDE4IDIgMyA4IDIgMTcgOCAyNCAzMCAyMiAyIDcgMjYgMSAxMyAyNiA2IDYgNiAxOCAyNCA3IAorNiA3IDMwIDE5IDEyIDIyIDI0IDI4IF4KKzY5IDEgMyAxMSAxNyAzIDEwIDEyIDExIDExIDI1IDcgMTMgMzEgNCA3IDI3IDEzIDEwIDMwIDE2IDMwIDE2IDI5IDQgMjcgNSA2IDI3IDggCisxMiAyOSA5IDEgMTAgOSAyNiA0IDE5IDEgMyAzIDQgMTYgMTMgMTcgNiAxNiAxNCAyNCAzIDIwIDMgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIAorMTEgMTAgMjkgMjAgMTkgMjYgMjcgMTkgNiAyOCBeCis2MiAxIDI2IDI2IDcgOSAxMyAxNiA5IDMxIDIgMjAgMjggMTAgMTAgNCAyOCAzIDI0IDIxIDYgMjkgMTYgMSAyMiAzMSAxIDI0IDkgMTYgCisyMiAyOCAxMSA3IDcgMyAxNyAxMyAyMiA0IDE3IDkgNCAyMSAyMyAxNyAyNCAxNiAyNCAxMSAyNiA1IDMxIDMwIDIgMjQgMTQgOSAyMyAKKzI4IDE4IDQgMTMgMjYgXgorNzAgMSA0IDMgOSA5IDE0IDEyIDEzIDggMjAgMTIgMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAKKzE0IDIwIDE3IDE2IDcgMTYgMTkgMjIgOSAxNSAxMCAzMSA3IDE4IDI5IDUgNyAyIDUgMTYgMTggMTAgNyAxMSAyMSAyMSA5IDggMTggMjUgCisxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IDE2IDE3IF4KKzYwIDEgMjYgMTIgMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgMTkgCisyNyAyIDE2IDEwIDYgNCAyNCAxNyAyMCAyNSAyMCAxNSA4IDIzIDIzIDIwIDMwIDE4IDE2IDMgMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgCiszMSAzMSA3IF4KKzY2IDAgMjYgMTggMyAxIDI2IDI4IDE1IDI1IDExIDMxIDMgMjUgOSAyMSAyMCAyIDYgMTQgNCA5IDUgMjggOCAxNyAyMiAxIDQgOCA3IAorMTAgMTQgMTkgMTAgMTQgOCAyNyA5IDI0IDI2IDQgMzAgMTEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAKKzE0IDEwIDMgMjUgMjIgMjUgMjMgMTcgXgorNjQgMSAxMCAxNSAxNSAyOSA4IDEzIDQgMiAxMyAyMiAyMCA3IDQgMjAgMzEgMTYgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAKKzIgMjIgNiAyNSAzMCAyOSAzMSAxMyAxNCAxNiAzMSAxMiAxNiAzMCA1IDE0IDMxIDExIDQgMSAxIDI1IDIxIDEzIDI2IDIyIDIxIDUgMjIgCisxNCAyOSAxIDIxIDMgMTQgMjcgXgorNjQgMCA0IDIgMjkgMTIgMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IAorNiA1IDIwIDQgMTQgMyAyOSA4IDI5IDE5IDcgMjkgMjMgMjUgMjggMTkgMTEgMTUgMjcgMjEgMTQgMSAxOSAyMCAyNiAxMiA3IDEyIDEgCisxOCAxMyAyOSAyOCAyMyAyOSAxMyBeCis1OCAwIDIzIDcgMSA5IDI5IDI0IDUgMzAgMTggNSAyNSAyNSAzMSAyNSAxMyA3IDI0IDI1IDI0IDEgMTIgMTkgOSA3IDYgMjggMjAgMTQgCisyOCAyMSAxOSAzMSAyMCAyMCA2IDI0IDE4IDI3IDI0IDQgMTggMjEgMSAzMSAxNSAxIDE1IDIgMjcgNCAyNiAyNSA0IDIzIDE5IDIgMzEgCisyOCBeCis1NyAwIDMwIDIxIDIyIDUgMjcgMTIgMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIAorMiAxOCAyMCAyMSAyIDExIDEyIDUgNCAxMiAyNSAxNCA1IDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IAorNyAyNiBeCis1OSAwIDI1IDIgMTUgMzAgOSAzMCA3IDIyIDE1IDkgMyAyMCAyNCAyNCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAKKzE1IDcgMjAgNSAyNiAxIDI5IDcgMTcgMTcgOCAzIDEzIDI3IDE4IDggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgCisxMCAxOSAxOSBeCis1OSAwIDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAxMCAxMyAxMiA4IDE1IDE5IDE3IDExIDE0IDE1IDI0IDE1IDEyIDkgMjIgMTYgMTYgCisyNCAxMyAyIDI2IDI0IDI5IDI2IDE1IDEzIDIxIDI0IDIwIDEwIDEwIDIyIDIzIDEzIDYgMTIgMjggMjUgMTIgMiAyMSAyNiAyOCAyNiA4IAorMTYgMTUgNCA1IDMxIF4KKzY2IDEgMjQgMTIgMzEgOCAzMCAzMSA5IDI4IDEyIDMgMjYgMjkgMjIgMjcgMTAgMjAgMTMgMzAgOCAyNSAxIDggMSA1IDExIDIwIDkgMTIgCis0IDI5IDE1IDIxIDI1IDI3IDcgMTQgMTEgMSAxMSAxNiAyMyA4IDggMTEgMSAxMyAxNSAyOCAxIDE2IDUgOCAzIDI0IDEwIDIzIDI0IDE3IAorNSAxMyAyOCAzMCA1IDMgMTYgMjEgXgorNTkgMCAyMCAyOCAzMSA2IDIyIDEwIDExIDI5IDI1IDE3IDI3IDIyIDI2IDMgMjMgMTQgNCAzMCAyNyAyMyAyNCAyMSAxNyAxMiAyMSAxNyAKKzIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgMTAgMjQgMzEgMjkgNCAxMSAxNSAxMSA2IDkgMTcgMTggMTUgNSAxNyAyMSAyOCA2IDkgCis2IDggMjYgXgorNTkgMCAyMSAxNiAxMSAyIDIzIDE4IDI3IDI5IDE4IDkgMTEgMjQgMjcgMTEgMTUgMjkgMjkgMyAzMSAxOCAxMiAxNyAzMSAxOSA4IDQgCisyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IDE1IDEgMjYgMTcgMjAgMjcgMzAgMzAgNiAxMCAxOCA1IDkgMTAgMjYgOSAKKzE3IDIgMzAgMjQgXgorNjEgMCAyOCAxNyAxIDI3IDI5IDIgMTkgMTYgOCAyOCAxNiAyMSAzMCAyNSA4IDkgMTggMzAgMTcgNCA2IDMxIDI2IDE2IDI1IDE4IDIzIAorOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIDEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAxMiAxMSA1IDMxIAorMTkgMTkgMTkgMjUgXgorNzQgMCAxMyAxOCAyIDMgOCAyIDE3IDggMjQgMzAgMjIgMiA3IDI2IDEgMTMgMjYgNiA2IDYgMTggMjQgNyA2IDcgMzAgMTkgMTIgMjIgCisyNCAyNSAzIDExIDE3IDMgMTAgMTIgMTEgMTEgMjUgNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgCis4IDEyIDI5IDkgMSAxMCA5IDI2IDQgMTkgMSAzIDMgNCAxNiAxNiBeCis2NCAxIDE3IDYgMTYgMTQgMjQgMyAyMCAzIDIgMSAzMCAxNCAxNCAyMSAyOSAxMyAxMSAxMCAyOSAyMCAxOSAyNiAyNyAxOSA2IDE3IDI2IAorMjYgNyA5IDEzIDE2IDkgMzEgMiAyMCAyOCAxMCAxMCA0IDI4IDMgMjQgMjEgNiAyOSAxNiAxIDIyIDMxIDEgMjQgOSAxNiAyMiAyOCAxMSAKKzcgNyAzIDE3IDEzIDIyIDI3IF4KKzY1IDAgMTcgOSA0IDIxIDIzIDE3IDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIDI4IDE4IDQgMTMgMjMgNCAzIDkgOSAKKzE0IDEyIDEzIDggMjAgMTIgMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAxNCAyMCAxNyAxNiAKKzcgMTYgMTkgMjIgOSAxNSAxMCAzMSAxIF4KKzY4IDEgMTggMjkgNSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IDE2IAorMjcgMjYgMTIgMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgMTkgCisyNyAyIDE2IDEwIDYgNCAyNCAxNyAyMCAyNSAyMCBeCis2MyAwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAzMSAzMSAxNCAyNiAxOCAzIDEgMjYgMjggCisxNSAyNSAxMSAzMSAzIDI1IDkgMjEgMjAgMiA2IDE0IDQgOSA1IDI4IDggMTcgMjIgMSA0IDggNyAxMCAxNCAxOSAxMCAxNCA4IDI3IDkgCisyNCAyNiA0IDMwIDI0IF4KKzY0IDEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAzIDI1IDIyIDI1IDIzIDIxIDEwIDE1IAorMTUgMjkgOCAxMyA0IDIgMTMgMjIgMjAgNyA0IDIwIDMxIDE2IDIgMiAyOCAxMyAxOSAxNCAxMiAyMyAyNyA2IDIgMTQgMiAyMiA2IDI1IAorMzAgMjkgMzEgMTMgMTQgMTYgMzEgNSBeCis2NyAwIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAxNCAyOSAxIDIxIDMgMTQgMzAgNCAyIDI5IDEyIAorMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IDYgNSAyMCA0IDE0IDMgCisyOSA4IDI5IDE5IDcgMjkgMjMgMjUgMjEgXgorNTggMCAxOSAxMSAxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIDcgMTIgMSAxOCAxMyAyOSAyOCAyMyAyOSAxNCAyMyA3IDEgOSAyOSAyNCAKKzUgMzAgMTggNSAyNSAyNSAzMSAyNSAxMyA3IDI0IDI1IDI0IDEgMTIgMTkgOSA3IDYgMjggMjAgMTQgMjggMjEgMTkgMzEgMjAgMjAgNiAKKzI0IDIyIF4KKzYwIDAgMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAyMiAzMCAyMSAyMiA1IDI3IDEyIAorMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIDIgMTggMjAgMjEgMiAxMSAxMiA1IAorNCAxMiAyNSAxNCAyMiBeCis2MCAxIDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IDcgMTAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgMTUgCis5IDMgMjAgMjQgMjQgMjggMTQgMTggOSAyNyAxNCAyMiAyNyAzMSAxMCA4IDE0IDcgMTUgNyAyMCA1IDI2IDEgMjkgNyAxNyAxNyA4IDMgCisxMyAyNyAzMSBeCis1OCAwIDggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgCisxMCAxMyAxMiA4IDE1IDE5IDE3IDExIDE0IDE1IDI0IDE1IDEyIDkgMjIgMTYgMTYgMjQgMTMgMiAyNiAyNCAyOSAyNiAxNSAxMyAyMSAKKzI0IDIwIDEwIDEwIDI1IF4KKzY1IDAgMjMgMTMgNiAxMiAyOCAyNSAxMiAyIDIxIDI2IDI4IDI2IDggMTYgMTUgNCA1IDE5IDI0IDEyIDMxIDggMzAgMzEgOSAyOCAxMiAKKzMgMjYgMjkgMjIgMjcgMTAgMjAgMTMgMzAgOCAyNSAxIDggMSA1IDExIDIwIDkgMTIgNCAyOSAxNSAyMSAyNSAyNyA3IDE0IDExIDEgMTEgCisxNiAyMyA4IDggMTEgMSAxMyAyMSBeCis2MCAxIDI4IDEgMTYgNSA4IDMgMjQgMTAgMjMgMjQgMTcgNSAxMyAyOCAzMCA1IDMgMTYgNiAyMCAyOCAzMSA2IDIyIDEwIDExIDI5IDI1IAorMTcgMjcgMjIgMjYgMyAyMyAxNCA0IDMwIDI3IDIzIDI0IDIxIDE3IDEyIDIxIDE3IDIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgCisxMCAyNCAzMSAxMSBeCis2NCAxIDQgMTEgMTUgMTEgNiA5IDE3IDE4IDE1IDUgMTcgMjEgMjggNiA5IDYgOCAxMCAyMSAxNiAxMSAyIDIzIDE4IDI3IDI5IDE4IDkgCisxMSAyNCAyNyAxMSAxNSAyOSAyOSAzIDMxIDE4IDEyIDE3IDMxIDE5IDggNCAyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IAorMTUgMSAyNiAxNyAyMCAyNyAyNSBeCis2NCAwIDMwIDYgMTAgMTggNSA5IDEwIDI2IDkgMTcgMiAzMCAxMCAyOCAxNyAxIDI3IDI5IDIgMTkgMTYgOCAyOCAxNiAyMSAzMCAyNSA4IAorOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIDEyIDI0IDIgOCA2IAorMyAxMiAyMCAxNiA0IDMxIF4KKzYwIDAgMjggNSAyNCAxNiAxMCAyNyAyOCAxOSAyOSAxOSAyMiAxMCAyMyAxNyAyNSA3IDI2IDUgNSAyNyAxIDIwIDI0IDEzIDI3IDE2IAorMjQgMzIgMzEgNSAxMiAyMSAxMyA2IDExIDIxIDIwIDE1IDMgMTQgMTggMzIgMiA5IDYgMTAgMTMgMjMgMTYgMTcgMyAyMCAxOSAyNyAyOSAKKzIxIDUgMTEgMjggMTQgXgorPEQKKworSD5TSFMgVHlwZSAyIFN0cmluZ3M8SAorRD4KKzYwIDEgMTYgMTMgMTkgNSAxNiAxNCAyNyAyIDIyIDcgNSAyOCAxNSAxOCAyNSAxNyAxMyAxMiAyOSAyNCAyMSAyOSAyNSAxNiA1IDE3IAorMjIgMjQgOCA4IDE4IDMgMTMgMTAgMjggMyAyMyAyOCAxMiA4IDMgMjUgNSAyNSAyNCA3IDE0IDMwIDI3IDMyIDMwIDIzIDggMTUgMjcgCisyOCAxMyA4IDEyIDIxIF4KKzg2IDEgMzMgNSA0MCAyNiAzIDE5IDEyIDM2IDQzIDUgMzUgMzcgNSAxNCAxMSA0NSAzNSAxNiAxMCA4IDMyIDQgMTUgMzUgMjYgMiAzOSAKKzIyIDM3IDIyIDMwIDI5IDI4IDM2IDQ1IDE0IDM2IDQgMjkgMzcgMzAgMzQgMzYgMjAgOSA0MiAyOSA5IDExIDExIDE4IDQyIDEzIDYgMjAgCis0MiAyMCAzMCAyMiAzNSAzNCA2IDE0IDQxIDE5IDMwIDE3IDM1IDMzIDI2IDQxIDE1IDUgNDQgMzkgOCAyMCAzIDQ0IDMyIDE1IDE4IDEwIAorMTUgMTAgMzYgXgorMTEyIDAgMTAgNDQgMjQgNTMgMzUgMjIgNDAgMjAgMTUgNTEgMjIgMTggMjIgNDIgNiA1NCA0OSAzOCAyMSA3IDEzIDMwIDE2IDcgNTIgCisxNiAyMiAxMyAzOCA3IDExIDQ0IDMzIDkgMjUgMTMgMzcgNDIgMTQgNDUgNTMgMzAgMzggNSAyNSA1IDM1IDM4IDIyIDI4IDEwIDI5IDUyIAorMzEgMzkgMzUgMjMgNSAxNyAxNCAzMSA0NiA1IDQxIDU0IDQzIDMzIDEzIDIzIDQ2IDQ1IDMgNDYgMyA1NSAxNSA2IDUzIDI4IDUyIDIyIAorMjcgNDUgMzIgNTMgNTEgMTUgMzcgMTUgNDkgMzYgMzUgMzUgMTUgMyAxMyAyMiAyNSAzIDQgMTAgMjQgMTIgNyA0NCAyNSAxOCAyMSAyMSAKKzIwIDU1IDI0IF4KKzEyMyAxIDQzIDkgMSA1MiA0IDIxIDQ5IDYxIDE4IDUwIDIzIDEzIDQ2IDYyIDIzIDQ1IDYyIDkgNTYgMTggMjMgMzEgOCAzMCAyNyAzNiAKKzEzIDM4IDQgNTggNTMgNDcgMjQgMTggNDEgNTggMTkgMTIgMTggNTIgNDIgMjkgNDQgNDUgMjYgNjMgMzQgMzIgNDEgNjQgMTUgMjYgNTUgCisxOSAyIDQ5IDYgMzAgNTMgMTMgNTQgMTIgNTMgMzcgMTIgMzcgMjkgNjAgNTMgMjEgNDcgNDIgNDUgNTIgNDAgMTAgMjggNDcgNDMgMTcgCisxNiAxNyA2MSAzNiAxMiAzNCA2MCAzNyAxMyA1MiA1OCAzNyAzOSAyOSAzNCAxMSA0NSA4IDM2IDEgNTAgNTAgNSA1MSAxMyAxNSAzMiAKKzUxIDMzIDYxIDE2IDMxIDUwIDU4IDYzIDE2IDUgMzAgMTcgMjQgMTAgMjYgNTIgXgorMTQ0IDEgNjQgNjIgNjMgMzAgMTUgMSAzNSAyOCAxNiA0MCAyMCAxNCA1MCAzMyAxOSAzOCAzMCAyNyA1NSAxMCAxNiA0NiA0NyA3IDU1IAorMTIgNTMgMjYgNTYgMzMgMjkgNTUgMjUgMTcgNDggNDMgMjEgNDMgMTggMjQgNjMgMjcgNjggNDYgMzggMzMgMzUgMTAgMTggMTEgMjcgNSAKKzkgNTggMzUgNzAgMzYgMzYgMzkgNDcgMiAxMCA2NiA0NyA1IDE4IDIxIDQ0IDcxIDUxIDU3IDMgMjIgNyA1NiA1NSAyOCAyNSAxNCA0MCAKKzE2IDI0IDQ4IDM3IDY2IDUwIDI0IDQ1IDE4IDM5IDUzIDI5IDY0IDYwIDI2IDUwIDYgNDcgNjEgNDYgNDQgNjAgMTcgNCA1OCA0NSAyNiAKKzIwIDI2IDMyIDggNyA2OCAzNyAzIDI0IDQ0IDQ3IDY0IDU0IDcxIDU3IDEyIDY4IDI3IDU4IDI5IDU0IDQzIDQyIDYwIDEzIDE0IDU2IAorNDkgMSAzMiA5IDYxIDQzIDM2IDMzIDIwIDU5IF4KKzE2NiAwIDcgMzggNTcgMzMgNjEgNzMgNyA2NCAxIDQ5IDM1IDc2IDE0IDI3IDIxIDQ1IDY4IDM4IDU4IDczIDEzIDcyIDQ3IDczIDMzIDggCis2NiAyMyAzOCA0IDU2IDc3IDQ3IDEwIDcxIDEzIDIwIDMxIDQxIDYgNTEgMyAxOCAxNyA2MSA0NyAxNCA0OCA3NiA0NiAyOCAzNCA0MyAxIAorNTYgNCAyNSA3IDY1IDQxIDEgMzQgMzcgMjMgNTkgNTkgMjcgMjYgMTMgMTUgMTQgNzUgNjAgMTQgMSAyOCA1OSAyNiA2NSA2MSAxNiAyMyAKKzE3IDI4IDYgMTkgMiAzNSA0OSAzMCAyOSA0OCAyIDYzIDczIDU5IDEgMyA3NiA0MSAxMSAxOSAxOCA0MyA1NCA2MyA2NyA1MSA0IDkgNzggCis2MCA4IDcyIDMxIDM1IDc3IDU0IDU4IDIwIDM2IDU4IDUxIDc2IDQwIDIwIDM3IDQ5IDMgNzUgMSAyOSAyMCA1NyA2NCAyMiAyNSA2IDI1IAorNTkgMzIgNDMgNTggNDAgNTEgNzcgMSAyIDM2IDEwIDEyIDI4IDM5IDExIDQ2IDIgNDEgMjcgMjcgNTMgNzYgMTMgNjYgNjkgNzYgMjggXgorMTg2IDEgNSA3MyAzOCAzMCAzMCA0OCAyMSA3NSA4MCA0MCAyMSA4IDUzIDkgMjYgMzAgMzQgODEgNzEgNzEgNTEgMjMgNzUgMzMgNDEgCisyMyAzMiA1IDggNjYgNDAgNzIgNDAgMTYgNjYgNDUgMTQgNDggMzQgMjEgNDEgMjcgMyA1NSAyNyAzNyAyMyA0MSA2NSA0IDU3IDUxIDc0IAorMjIgMTkgNzUgNDIgMTYgMTkgNDYgMTYgMTAgNDggMjAgMTkgMzcgNDEgMTQgNTcgOSAxNyA1NSAzOCA1IDYwIDcgNDYgMjAgNDMgMzYgCiszOSA1MiAyMCAxMCA2MiA0NSAyMyA0NiA3IDM1IDc1IDI5IDcwIDM1IDM2IDM0IDI1IDEyIDE1IDg0IDI2IDEwIDYgNzEgMjkgNzkgMzMgCiszMiAyNSA1OSA3NiA4MiA2NCA1OCA3IDggMTkgNDEgNzQgMiA1MyA2NSAyNCAxIDU1IDUxIDM2IDIxIDc5IDI4IDUgMTcgNDEgMzYgNjMgCis1MSAxOCA0OCAyNSA0NiA0NSAzNiA3NyA3NiAyMiA1NyAxNCA0NCA2MyA1NiA0NSA1NiAyMCAxIDY0IDQ5IDkgMTIgMjggMzAgNzIgODIgCis3MyAzMyAzIDIyIDMwIDQzIDU2IDY3IDYyIDIgNTcgMTMgNTAgMjAgNTcgMzggNDMgNjEgOSA4IDU3IDY1IDc2IDkgXgorMTgzIDEgNTQgMzQgODMgMTAgMzMgNTEgODYgODEgODIgNjkgMTggOCAyMiA2NCAxOSA4NiA2MiA1OCAzMyAzNyAxNyAzNCA1IDI5IDgzIAorNDIgNzYgNTAgNTQgNjYgMzkgOSAxIDM2IDQzIDE3IDY1IDYgMzUgNTYgNzIgNzEgODMgODggMTAgMSA4IDg3IDIyIDYgMjEgNzggMjUgCis4OSA0MyA2MiA0MCA1NSA4NSAzMSA4OSA3NCA2MyA0NiAyOCAyNCAyNiAzMSAxNyA3IDggMjcgMTkgMTIgODUgMTcgMjAgMjcgNzcgMTAgCisyIDU0IDgwIDE3IDUyIDc0IDc2IDY5IDc4IDExIDIwIDgwIDQgMjkgMjQgODUgNzUgMTggMzkgMjMgNzAgODMgMjkgNTcgNjcgNzIgNzAgCiszMyA0IDE1IDQ2IDQyIDIgNjkgMTMgNTMgMzMgNjkgNjQgMzMgNjQgMTQgNDAgNjkgNTkgNzggNzEgMTkgODUgMTYgNjUgMzggODIgNTUgCis0MCA1NiA0MCAyNCA4NCAyOSAyNSA0NCA2OCAxMyA4NSA3NiA2NCAzMiAxOCAyNSA0NSAyMyA2IDgwIDMxIDMwIDMwIDU4IDE0IDEzIDcyIAorNTcgMTQgNDEgMjggNTIgNzMgMjYgNzYgODMgNTYgNTQgMiAzNiAxMSA2NSA2NiAzOCA1MCA4IDQxIDg4IDc3IF4KKzIwMCAxIDI1IDU3IDQwIDQ2IDc4IDU3IDM0IDc4IDYxIDM2IDY2IDU3IDM4IDgwIDIyIDMyIDY4IDcxIDMwIDc0IDM3IDgxIDY2IDc3IAorNjYgNTUgMiA1MSAyNCA5MyA2MSA0MCA2OCA0NSA2MSAxMiA2MyAyNCA4OSA1OSA1MiA3MiA0MyAyMCAyMCA2OSAzNiA0MCA4OCA0NiA5IAorNjIgNTUgNzcgODQgMjAgMTggNiA3NyAxNSA1MiAzOSA3NSAzIDI2IDQgODUgMTcgNjIgMjkgMTEgOTIgNDYgNTggMjkgNTkgMjggNDIgCis4MCA3MSA5NiAyIDQ5IDg1IDM3IDYzIDQgNjEgMTQgMiA1MyA4NyAyNSA4NiA2IDc1IDc2IDkzIDQxIDM5IDkzIDkyIDQyIDU2IDQxIDYzIAorMjYgMjggMTggNzcgMTEgNTAgNzggNzkgMSAxMiAxMiA5MSAyOSAxMyA1OCA1IDU2IDkyIDY2IDU5IDQgMzkgNDcgOTUgNSA1IDYyIDMzIAorMTMgODAgNjkgNjAgNDMgNTEgMjIgMzAgMzIgNDIgNSAzOCAzIDUwIDcgNDggOTAgNTYgOTYgNjggNDcgNDEgNjEgNjAgOTYgMjAgMTQgNCAKKzE5IDE5IDIzIDI1IDEzIDkgMzggNTIgMTcgMTEgOTYgNDggMTkgMjUgODggNDIgNyA3NCA1OSA0OCA3MCA1NSAyNCAxOCAyOCA0NCA0NiAKKzMgMjQgMzggNTYgMTkgOTYgMjIgNTAgNjAgMTcgOTYgXgorMTk1IDEgMjUgNTEgNDUgMzUgNjYgMTkgNjEgNjAgOSAzMSA5MyA2NCA3MCAzMCA0MiA4NiA1MyAxIDcxIDQ2IDQyIDIyIDM4IDk2IDEwIAorOTkgMzQgNzYgMjYgNTUgNzMgNjMgNjMgOTcgMjMgOTIgODEgNjQgNDYgMSAzMCAzMSAzNSA4NiA5MSA4OCA2NCA4NyAxNiAzNyA2OSA4NCAKKzk0IDYwIDEwMCAzIDQ3IDUyIDggNzEgODcgNTcgMjkgNzYgNDMgMTggNDUgNDYgMTUgNjUgMTIgNDQgNDIgNjYgNjAgMTUgNjggMTkgNTggCiszOSA2MiA3NiA5IDkyIDEwMSA1NyAzMiA0IDM0IDE1IDQxIDYyIDMyIDg5IDcxIDQzIDM1IDMxIDQxIDIxIDE3IDgyIDMzIDk2IDI3IDYyIAorMjkgODIgNTcgNDYgNjIgMTUgMjQgOTkgMzcgODMgNDAgNTIgNDYgNTYgODAgOTggMyA5MSA3NCA2IDI3IDcgNTggOTQgMTAgNDEgNzkgCis5NyA4NCA3NyA3NCAyNiA5OSA5NSA2MSAxOSAxNyAyNCA1NSAxNSA4NSA4NCAzMCA0NSA5MyA0NCAxMDAgNDQgMzkgNTkgNDYgMTggOTUgCiszIDQxIDE1IDgyIDc3IDE2IDQ4IDE4IDUxIDgzIDIwIDgyIDYwIDUzIDUzIDEyIDk5IDkyIDU0IDUgOTkgNTEgMzkgMTAwIDYxIDIgMzEgCis1MiA0OSA4NiA5NCAxNiA3OCA4NCA5MSA0MiBeCisyMTIgMCA1NiA5OCAxNiA5OCA3OCAyMiA3MiAzMyAxMDMgMTA0IDUyIDg0IDEyIDY1IDE1IDg1IDEwMSA5NyA4NCAzMSA1MSAyNiAxMDAgCisxMDAgMzggODAgMTMgMiA3OCA3IDI0IDQ0IDg0IDEwMyAyNyA3IDI4IDE2IDMzIDk5IDI1IDEwMyA1NCAxNCA0MiA2MiA4NyA5MiAyNyAKKzIyIDQyIDUgNTIgMTAwIDg0IDczIDcyIDYzIDI0IDQ4IDU2IDUyIDIzIDUgMTcgNzYgMzEgMSA5NSA1OCA0MyA2MCA1MCA2MiAzMCAyMyAKKzM1IDc5IDIwIDM1IDMgNzIgMzIgNDUgNTEgODcgNDEgODQgMjcgNzkgNzcgNzAgMTAyIDE1IDU0IDE1IDEwMCA4IDUyIDY5IDEwNSAzIAorMzAgODQgNDIgOTMgNjYgODkgNjkgNzQgMjQgMzMgNDIgOTcgNCAzOCA5OSAxMDYgMTMgOTMgNiAxMDYgNzQgMTAwIDU0IDQ1IDIxIDU5IAorNTYgMzcgOSA1MCAzMiA3NSA3OSAzMSA3NyA5IDYxIDEgOCA2OCA2IDYwIDgxIDcgMTAwIDk5IDE0IDYxIDQ4IDI1IDczIDI2IDcwIDcyIAorOTQgMyAxMSA5OCAzMSA1IDY3IDcgMzkgOTIgNzMgODggMTAxIDMyIDEwNSAzNCA4MiA4MSAxMSA3MiA0OCAxMCA1OSA3MSA1MSA3MSAzNSAKKzMzIDI3IDQ5IDQ5IDE5IDk4IDQ3IDQzIDc1IDY0IDE3IDE1IDI0IDk0IDQ5IDQgODQgNTggNTggNzQgMzkgNDcgMTA0IDgyIDUgNjMgNjkgCis5MCAxOSBeCisyMzYgMSAyOSA3OSA0MSA0MCA3MiA1MSAxMiA5MiAzNCA1MiA0NCA2OSAxMDQgMjEgOTcgODkgOTYgNDggMjEgNCA2MSA0MCAyOCA2NyAKKzM0IDIzIDg1IDQ0IDIyIDYyIDUyIDMzIDg0IDIzIDMwIDczIDc0IDQgNzkgMTIgODEgNDcgODAgNTMgNDcgODkgNDAgMTkgODAgNjIgMzQgCis2MSAyOSA0MSA5NSA0MyAxIDcwIDYzIDU1IDUzIDE4IDE5IDEzIDQ4IDEwIDE5IDg5IDQ5IDQgNTIgNTMgNTYgNzYgMTAgOCAxMDQgNzcgCisxNSAyOCAzOCA3NSAxMDkgMyA4NSA5MCA4IDQwIDggOTMgOTAgNDMgMzkgMTQgNjAgMTcgMzYgNzggNTYgMTA1IDgwIDM1IDc1IDM2IDU4IAorODIgNTAgMTAwIDk4IDQ1IDc0IDEzIDY2IDk1IDcyIDcxIDk1IDM0IDE0IDk4IDcyIDMzIDM4IDM3IDUyIDYgMTQgMTA3IDU5IDMgMjkgCis2MSA2NyA5OCA5MiA1IDkzIDE3IDk4IDM2IDg3IDQxIDc1IDcxIDU3IDg4IDE3IDI1IDkxIDg0IDMgNTggMjAgOTIgNjkgNTEgNTAgMzYgCiszMSAxNCAyNSAxOCAzMCAxOCAxIDQxIDEwNCAzMCA4MiA1OSA4NyA3MCAzNCA5NiAyOCA0NyA2MiA4MSAxMDMgMTA5IDEwMyAxMDAgNyAKKzE3IDE2IDEwNCAxIDEyIDM0IDUgMTAyIDQyIDE2IDIyIDcxIDM5IDUgNzMgNDUgNDUgNTQgNDEgMTMgMiAyNiA0MSAyMiAxMDAgMTA5IAorMzAgNDQgNCA5MCAxMDggNTMgMzggMTA0IDY4IDI4IDU2IDQ3IDUxIDk0IDIyIDcgODEgODUgMjYgNTAgOSA3MiA5OCA1NCA1OSA5NiA1MiAKK14KKzIzMiAxIDkyIDcyIDQ3IDM3IDMzIDM4IDkyIDE3IDggMjggODggMjIgNjIgNjkgMzIgODkgNzUgMyA3MiA5NiA4NSAxMyAxMDUgMjQgMzggCiszNyA5NCAxMTUgODMgNzIgMTA4IDExNCAyNCA5MyA3NiAxMDMgNjAgOTkgMTAyIDkgNDMgMTAgNTkgOTUgNDYgMzMgOTMgMTUgMjYgNjkgCis0NCAyIDg2IDEwNyA1NSA0NSA2MSA2NSA5MiA2NiA5IDU1IDM5IDcwIDgzIDI5IDk4IDY3IDEzIDExMSAxNSAyMCAzMSA2MiA4IDIgNTEgCisyMCAxOSAzMyA0NCAxNCAxMTUgNzEgMTEyIDk3IDEwIDQxIDI4IDUzIDUxIDI2IDU3IDE1IDM4IDk4IDU1IDEwNiAyMiA1NiAzMSA1MCAKKzk1IDEwNyAxMTAgODQgNzAgMTAgMTA4IDk2IDczIDEwMCAyNSAzNiA1NSA4OCA3MSA2MyA5NiAzMCA5MCA5NiA3OSAyMiA3IDMwIDIzIAorMjggNTkgODkgOCA1MSA5OSA0NyA4NiAzNCAxOCA0MyA2NSA5OCAxMDQgMTA3IDQ5IDcgNzkgNzEgOCA1NyAyMSAyOSA4MCAyIDc0IDc4IAorNDQgNTcgOSA2MSAyMiAxMyA2OCA1MiA5MSA3NCA5OCA0MyAzMCA1OCA2OCA5NSAxMDEgNzIgMTAyIDc2IDQyIDk5IDEwOCA0NyAyNSA3MyAKKzI3IDEwNCAzNCA1OSA1MiAzNiAxMDQgMjAgOTggMTQgOTcgNCA1MCA0NiAxMDYgODMgMTcgMjIgMTA1IDc5IDc3IDQ2IDM5IDE1IDExMyAKKzIwIDM3IDEwMCAxMDYgNjUgNjYgNzYgNyAxMiA3MiAzNSA4IDIyIDUwIDQwIDY4IDEwMSAyMyA1NCA5NiA0NCA1MSA4NyAxOCA2IDQ2IAorMTEwIF4KKzI0NSAwIDcwIDMwIDgxIDQ2IDUzIDExOSA4NSA2IDEwNCA0NyA5MiA3MiA3MCA1IDcwIDE1IDExNSA2OCAxMDUgMzMgOTcgMTMgODUgCisxMDYgMTQgNjEgMjkgMjIgODYgNDUgNTcgNjkgOTEgMzggMzggMjggNjYgMTMgNjAgOTUgMTAzIDMgMTUgNSAxMTMgMzggMjMgNjIgNSAKKzY1IDk0IDEwNyA3MyAxMDQgMzcgNDcgMTAyIDExNyAzIDc4IDM1IDcgOTUgNTYgNzggNDUgNTIgMjggNDYgNDMgMzcgMzIgNTMgMTkgNTUgCisyOSA0NyA5NyA3NiAxMTUgODMgNzEgMTEgNDUgNjIgNzMgOTkgMTE2IDIgMjQgMTE2IDcgMjggNDEgMiAyOSAzNyA1MiAyMyA1IDExOCAKKzc5IDMxIDU3IDg5IDYxIDI0IDEwMSA3OCA1MCA5MyA3MyA0MSA3IDMzIDQ1IDQ3IDI0IDEgNDggNzMgMzYgMyAyNSA4NyA0NiAyOCAxMDggCis1NCA2OCA1MyA2NyAxMTkgMjggMzYgMTE4IDEwNCA0MiA4OCAyNyAxMTIgNCA3NCA4NSAxIDYzIDM5IDk3IDcxIDc0IDc1IDc2IDEwIDQ5IAorMTIgNzkgMTEgNTAgMTAzIDExOCA5NCAxMTcgMTE4IDM3IDI3IDEyIDk0IDYwIDI4IDUxIDQ3IDgyIDExMCAxNyAxNSAxMDUgMjMgNTIgCis0MyAxMiAyMSAyMiA4MSA0MSAxMiA3NCA5MCA0MiAxMDggMTE3IDk4IDY3IDQgNjkgNDQgNzYgMTA1IDM4IDEwMSAyMSA4MCA3MCAxMCAKKzExMSAyMyAxMTAgMzIgMTAxIDgzIDkxIDEwMSAzMSA1IDMgODMgNzYgMTUgOTAgNTcgNzQgOTUgNDYgMzMgMTEyIDYyIDYzIDU0IDYzIAorNDkgNTkgNCA2NCA0MCA2OCAxMTAgNzQgMTA1IDkxIDg2IDEwMiAyNyA1NSAzNCA4OCA1NSBeCisyNDAgMCA1NSA3OSA3NSA4NCAxMTMgMjIgNCAxMTMgMTA5IDMxIDMzIDE3IDk2IDExIDI5IDYzIDk4IDEwMyAxMDcgMTE2IDM0IDE0IDkgCis5NSAzOCAxOCA1MSA3NSAzMyAxMDkgMTE4IDU1IDY2IDQgNzYgNyA3NSA3MCA4MiA3NCAyMyAxIDI2IDY5IDQwIDExMiA5OSA0NyA2NSAKKzMxIDcwIDExOSA1MiAxMDMgODggODUgODYgMjggMTYgMTIgNzYgMjUgMjIgNzggNjQgMjEgODYgMjcgNjEgNzcgNzIgMTA4IDIgMTggCisxMDYgMTE5IDEyMSA1NCAxNiA4NSA3MiAyIDczIDI2IDg4IDY2IDYwIDgwIDM1IDI0IDExNyA2MyAyNCA0NCA2NyA1MiAxMjIgMTE5IDMzIAorNzIgMTYgOTkgOTggNjkgNTQgMTkgNDIgMjggNTMgMTE0IDMyIDExNyA4MSAxMDAgNTcgNDkgMTIzIDU2IDIxIDY4IDgwIDUzIDk1IDEgCis0NSA5NSAxMDcgOTggODcgMSAyNyAyNCA5OSAxMTYgMTYgNjcgMSAxMTMgOTEgODQgMjUgNDAgMjUgNzIgMyAyOCA5MCA4NyAxMTIgODAgCisxNiAxMTcgNDUgNzcgMzYgOTAgMTA1IDU5IDg4IDEyMiA2NCAxMDggMTA4IDcxIDk4IDE4IDUwIDExNSA5MyAxMDUgNzcgMzUgNiA0NiAKKzU1IDQ3IDEwMiA0IDI2IDg3IDExMSAxMjAgODEgMTEzIDQgNTcgMTA1IDMgODQgOTQgMTE1IDYxIDMgMTIxIDcyIDcxIDI0IDYyIDE0IAorNjAgOTkgNjEgOTYgMTAzIDUxIDEwNyA2IDY1IDgxIDExNCA4MyAxMjEgMTA5IDQ5IDEwNCAzMCA3MyA4MiA5MiA5NCA5IDggMTEgOTggCisxOSAxMCA1NSA5NyAyMiA5NyA5NSA4OCA2NyAxNSAyMCAzOSA2NSAxMyAxMjMgNzcgXgorMjUzIDEgNDUgNyAxNSAyNCA1MSA1IDk4IDExNSAyNCA0OSA5MCAxMDQgMTE3IDY2IDEyOCA5NCA2NCA4MCAxMiA0MyA5MSA0NiAxMTEgCis1OSA1OCA3NyAzMCAxNCA4OCA2MCAxMjMgNjggNDEgNDQgNjggNDAgMTA0IDExOCA0MSA0MyA5MyA5MCAxMDUgOTIgMTYgMTI3IDI2IDU0IAorMTI1IDExNCA3OSA3MSAyNCA0OCAyMSAyNSAxMTggNDAgMTAzIDQ5IDkxIDQ0IDY3IDY1IDI1IDExOSAxMDkgMTggNDggMjMgNjkgMTEyIAorMzggNjEgNjQgODcgODQgMTA0IDExOSAxMTAgMTIyIDkyIDIyIDEgOCA4MyAzNCAxMDAgMzIgNjIgNDEgNDYgMTEyIDM0IDEwMiA3NiA1NiAKKzM5IDQgMTI3IDMwIDEzIDE5IDExMCAxMjQgNyAxNiAxMjggOTUgNCAxMjQgMTEgMTA0IDExNiAxMjYgNDkgOTUgMyA1NSA5NiA3MCA5MCAKKzEwMSA0IDEyMiA5NiA3NSAxMTggMzkgMTI4IDk5IDkyIDE4IDQyIDIwIDg3IDgzIDM1IDc1IDExMSA2MSA2NyA3MSAyOCAxMDEgOSA1NiAKKzM0IDEwNSA5NSA3MSAyMyA3MyA3MSAyNiA1NyAxNSAyMyA3NiA1NSA5OSA4OSAxMjggOTggMTE3IDY4IDQzIDg4IDYyIDM4IDYyIDM5IDIgCis4MyAzNiAxNSAyNiA2MCAxMjggOTYgNzMgNzQgMTAgMSAxMiA0MiAyMiAyIDc3IDMzIDMzIDMyIDU3IDEzIDE0IDgyIDU3IDEyIDM5IDMgCis1OCA4MCAxNCA4NyA4NSA0NCA2OSAxMDkgMTkgMTE3IDY3IDY4IDQ0IDYzIDEwNiAzNyA4OCA2NCA4MiA1NiAzNyA4OSA0IDEyNiA1NSAKKzk4IDExNCA4NCA5OSA5MSA0MyA5MiAyMSAyNiA1OCA4NCAxMDIgNzUgMTE2IDEyNCA1IDEwMSA1IDk3IDQ2IDEwOSAxNSAyOSA3OSA3MiAKKzkzIDkyIDExMCBeCisyODkgMSA4MyA1IDc2IDIwIDMyIDE1IDEwIDEgMTAzIDE4IDIyIDExNiA5OCA5IDUxIDEwNCAxMDIgNDQgMzMgMTUgMTIgMjQgMzEgODkgCisxIDYgMjggMTAxIDggNjQgNzIgMTA2IDMwIDUgNTIgODkgMTExIDM5IDEwOCA2NCA4NSAxNyA1NyAxMjQgMjIgMTA1IDc4IDExNSAzIDQwIAorMTA4IDY2IDEwOCA3NyAxMjggMTAzIDQ0IDM1IDM4IDEzIDk1IDEwIDExMSA2MyA5OCAxMTcgNjEgNTEgMTI2IDY5IDk2IDcwIDcwIDU5IAorMzkgMTMgOTcgMzMgMTEyIDIgNzcgNyAxMjMgNzAgODMgMjkgNjYgNjcgNDkgNzkgMTkgMTA0IDExNSAxNCA2MCAyIDU1IDQwIDcxIDMzIAorMjggMTE0IDUxIDkxIDE3IDQ2IDQ1IDEyOCA1NyA4NyA2MiAyNSAxMTUgMzggNTAgNTUgOTAgNzQgOCA1MSAxMDIgNzkgNDMgOTQgMzYgCisxMjIgOTQgMTIgNDEgMzYgMjUgMTA0IDkxIDI0IDcgOTkgODAgMzAgMTI2IDMyIDYzIDEyMiAxMDcgMTE0IDI3IDI4IDc5IDQxIDEyIDM1IAorNTEgMTE1IDEyMiA3MCAyMiA3OSA2NSAyIDg4IDI3IDE3IDU5IDE1IDIzIDQ0IDU3IDUgNjUgNiAyNiA3OCA4MCAxMjUgOTMgODQgMTAwIAorNDUgMjIgMTI5IDY4IDM2IDExMSA3NCAxMTggMTEgNTAgNDIgMTIwIDQ3IDIxIDggODYgMTEyIDI2IDY3IDYwIDk5IDQ1IDkzIDQ3IDggCiszOCA1OSA1MiA1NiAxMjQgMjAgODIgMTggMTE3IDI0IDE4IDQ2IDEwNiAxOSAxMTcgMjYgNDEgNDcgNDUgMTMwIDcgMTUgMSA0IDUgMTAwIAorMTAgODUgNTAgNDQgMTEgNDggOTIgMTE5IDEwOCA0MiAxMTggMjQgMjAgNjkgMTA3IDkwIDk2IDQ4IDEwMyA3IDIgOTAgNTAgMTggMTMwIAorMTI2IDQ1IDEwNiAxNyAzNSAyNSAxMDIgNjggMjMgNjggMTIwIDU4IDQxIDM0IDc1IDEwMyAyMCA0NSAxMTcgMzcgNjEgNzMgMzQgNjIgMSAKKzEyNSA1OCA3NCAyMSAyMSAxMjkgNyA4NiAxMTAgNzYgNjYgMTI0IF4KKzI2MyAxIDEwMCAxMzUgNyA3NSAyMyA1IDgxIDExMCAzMSAxMTggMjkgMSA2MiAxMSA0MSA4OCAxMDkgMTE5IDEwMiAzNyAzIDMwIDEyMyAKKzQ3IDMxIDU2IDEzNCAyOSAxMjQgMTE2IDExOCA5OSAyMSA1NiA3NyA5MSAyMyAzNyAxMzUgODEgNDQgNTEgNjcgOTUgNTEgMTMzIDMwIAorNTcgNjcgMTE2IDEyMiA0OCAxMDAgNyAxMzIgOTcgMTA2IDY5IDkzIDQgOTUgMTI1IDEwMiAxMDMgMTE5IDgxIDU3IDEzMyA5NiAzNyAKKzExOCA1MCAxMTcgMTEzIDgxIDEyNyAxNyA0NSAxMDMgMzIgMTIxIDEyOSA2MCA0MyA2NSAxMjcgMzAgMzYgMTMyIDExMCA1MiA1MyAzNSAKKzcxIDEyIDc2IDIyIDcyIDEzMCAxMTIgOTkgNzYgMjYgMjEgNzMgNjMgNjMgOTcgMjMgNTggMTE1IDEzMiAxMTQgMSAxMzIgMzEgMzUgMTggCisyMyA1NCAzMCA1MyAxMTggMzcgMzUgODQgOTQgNjAgMTAwIDMgNDcgMTggMTEwIDEwNSA4NyA1NyA2MyA3NiA0MyA1MiA0NSA0NiA0OSAKKzY1IDEyIDEwIDQyIDY2IDYwIDExNyAzNCAxOSA5MiA1IDI4IDc2IDkgMTI2IDEwMSAxMjUgMzIgMzggMzQgMTUgNyA2MiAzMiAyMSAzIAorNDMgNjkgMzEgMTA5IDEyMyA1MSAxMTYgMTM1IDEzMCAxMjkgMTMwIDYzIDE0IDU3IDgwIDYyIDE1IDEyNiAzMSAxMDUgODMgMTA4IDEyMCAKKzgwIDEyNCA0NiA5OCAxMDUgOTEgNiA2IDI3IDcgNTggMTI4IDc4IDcgNzkgNjMgODQgNzcgNzQgMTI4IDY1IDYxIDk1IDEyMSAxNyAyNCAKKzEyMyAxMTcgNTEgNTAgNjQgNzkgNTkgNDQgMTM0IDc4IDczIDU5IDExNCAxOCAyNyAzIDEwOSA0OSA4MiA0MyAxMTggMTE2IDUyIDExOSAKKzE1IDEyMiA4MiAyNiA4NyA1MyAxMTQgMTMzIDkyIDg4IDM5IDk5IDE3IDEwNyAxMzQgOTUgMTA0IDMxIDUyIDQ5IDk0IF4KKzI4NiAwIDEyMCAxNiAxMDQgMTM2IDExNyA4MiAxMzggMzIgNjUgMTE0IDExOSAxMzcgMTIxIDggMTIgNDYgMTI2IDI2IDExOSA3MyAxMzAgCis2MCA3NiAxMTMgMTAwIDE0IDEzMyAyNiAxMTYgMzQgMTIwIDgwIDk1IDg0IDUzIDE1IDI0IDQ0IDUxIDQgMTAgMjMgNzcgMjQgOTkgNjYgCiszNyA1NCA2MyA0MiAxMzYgMjEgMzQgNzYgNSAxNyAxMjggMTAxIDEgNTkgNDAgMTEzIDExMiAzMiA5NyAzMSA5MyAxMDUgNzkgOTEgMTggCiszOSAxIDEwMyAxMzIgNTEgNjggMTI0IDExMSAxMyA5NyA0MyAxMjggNjkgODQgODUgNzIgMTUgMTIgMjYgODcgMTYgMTYgOTIgMTAxIDEzIAorNzcgNCAxMTggODkgMTAzIDU2IDQyIDE2IDYwIDQ0IDM5IDEyNiA0NiAxOCA4MyA5MyA0MSAxMDUgMyA4MiAxMDYgMTE1IDkxIDYgNCA1NCAKKzExNSAxNSAxMjAgMTA5IDExMyA0OCA0MSA5IDk1IDIwIDYyIDY3IDEwNSAxMTEgMjUgMTMyIDcgMTE2IDQ2IDEzOCA0NCA4MyA2MSAxMjQgCisxMzEgMzUgMTA3IDYgMTA5IDgxIDExNCA2NyA0MSAxMzcgNzcgNTYgNzQgNzMgMzQgMTIgMTQgNjkgNTIgMTEgOTggNDcgNTQgODMgODEgCis2IDEgMTUgODggMzUgMTM5IDgwIDgzIDQ5IDg5IDI3IDQ3IDEzMCA5MiAxMzMgODcgNTEgMTEyIDc2IDQ5IDEwOSA0OSA1NyA5MyA3MyAKKzIyIDExNyA1MCA2NCA1OCA5NyAxMzkgMzYgMTMxIDExMSAxMzMgNTggMzMgOCA4OCA1NSAzOCA5MCA0NiAzMCAxMTggNTcgMjkgODIgNzQgCis0MSAxMTcgMzggNDYgOTQgOTIgNSAxMDUgMTUgMTE3IDcwIDEwMyA2OCA2MCAxMjAgNDggMjEgMTEwIDg1IDQwIDgxIDM4IDU4IDEyOSAKKzU2IDEwIDk5IDg2IDc2IDgxIDI2IDIzIDI1IDY4IDE2IDI4IDEyNyA2NSAxOCA3MSA3NSA3NyAxMDAgMjYgMTEgMTMwIDEwNCAyOCAzNCAKKzU2IDEwNiA3IDggMTIwIDExMiAxMiA1OCAyMSAxMzAgMTI0IDY3IDYxIDE5IDg3IDExOSBeCisyODYgMSAzNSA5NCA2MSAxMzAgOTggMzUgODggMzQgNjUgMTA0IDU2IDEyNiAxMTggNTAgODcgMTAgODEgMTA5IDkwIDg2IDExOCAzMiA2IAorMTE0IDg4IDM5IDM4IDM5IDYyIDMgMTIgMTM0IDcyIDEzNyAzNSA3NSA4MSAxMTUgMTA2IDE0MCAxMTIgMTEgMTIzIDQxIDEwMyA0NSA5NSAKKzg0IDcxIDEwNyAxMyAyNiAxMTAgOTYgNjIgMTYgMTA5IDg0IDU5IDUzIDM4IDI3IDggMjggMTMgMzIgMTM3IDE3IDEzOCA0MSAxMjIgMzYgCis5OSA2NSA5OSA4MyAzNiAxMTIgMjkgNDkgNzAgOTYgMTI2IDEzNiAxMzEgMTE2IDMgMTggMTcgMTI2IDE0MiAxNCAzNyAxNDEgMTQxIAorMTIzIDQyIDEzIDIwIDgzIDQyIDEzOSA4MyA1NCA0OSA1OCA0MiA3IDEzNyAyOSA0OCAxNiAxMjEgMTI3IDM0IDUyIDE0MCAxMDYgMTI4IAorNTggMzYgMTI0IDgzIDI0IDY5IDU0IDYxIDExMiAxNyA2IDk1IDk3IDI0IDU3IDg2IDEyNCA1OSA3MSAxMTkgNjcgMSAxMDkgNTQgNjggCis0OSA1NyAxMzIgMzIgNSA3MSAxMTMgNDAgODAgMTA0IDc1IDEwNiAxMzMgMzEgMTI2IDEzMCAxMDQgNjIgOSAzOSA0NCA2NiAxMTYgMTQxIAorMTM1IDk2IDEzMiAxOSA0MSAxMjEgMTI2IDEyNCA3NyA4IDQgNjAgODIgNiAxMDEgMTI0IDg5IDUxIDEyMyA0OCA0MCA4NSA3NyAyMSAKKzExMiAxMCA2OSA2NiAxMTUgODcgMTYgMTA4IDMwIDg0IDY1IDgwIDEwMyAzMiAxMzEgMTM0IDczIDQ3IDEwIDYzIDM5IDUwIDkzIDM3IAorMTM1IDExNCA2OSA0OCAzNCA1OCAyMyAyNyAxMzMgMzcgOSA0MCA5OCA0MSAxMTUgOTkgNzAgODMgMjkgNDIgNjcgMTMzIDU1IDc5IDgwIAorOTEgMTIyIDEyIDIgMTE1IDExMiAyMyAzMyAxNiAxMDIgMyAxOSA2MCAxMDEgMTMwIDEwNSAxMTYgMTE3IDI3IDIgMSAxMDMgMzggMTQgCis1NSA3OCAyNiAxMTYgMTIzIDU0IDY3IDEzOSA4MiA3NCA3MCA4NCA3MiAxNyAxMzIgMjUgNjggMzEgMTIwIDEwMyAxNDAgXgorMjg1IDEgNjUgMzAgNTEgMTE5IDQ4IDEwNyA5MiA4NCA2OSAyOCAxMzYgMTQzIDU0IDIwIDYgNzAgNDcgMTQyIDY0IDQgNjUgNTkgNzMgCis5OSAxMzQgMTQ2IDEwMiAxMjUgMTE2IDU3IDEzNyAxMzcgNzIgNDggMTI4IDc4IDUgODAgNjMgNTQgODUgMzAgMjIgMTI5IDY4IDIxIDIxIAorNzQgMjggMTI4IDEwNyAyNyA2MCAyIDkzIDk1IDcxIDM3IDExIDM3IDE1IDM5IDEwMiAzIDEwNCA2NSA4MCA1OSA1MiAxMTMgMzQgMjAgCis2NyA2MCAyNyA4MSAxMzUgNDYgMTA2IDEwNiAxMDIgNjggMTI4IDE3IDE1IDEwMCAxMjQgMTUgNDMgMTM2IDEyMiAxMDAgNjcgMTQyIDM1IAorMTQgNTMgMTIwIDIgODkgOTMgOTkgNzMgOSAxMjIgMzkgNzcgMTUgOTYgOTAgNDMgNzkgMTM0IDYwIDkyIDEwNSA1NSA5NiAzMSAxMTkgCis3NyA5NyA3MiAyMyAxNDAgMzggMzAgNDMgODMgMTM2IDg4IDEwNyAxMTcgNzIgMTA5IDExOCA1OCA5MSAxMTkgNzMgOTUgMTAwIDU5IAorMTM4IDEyMyA1NCA0OSAxNDMgNTAgMTMzIDY2IDEwNiA0NSA4MCA4OCA0MiA5MyA1IDU5IDc3IDEwMSA3NCAxMTAgMTA0IDQwIDkyIDE5IAorNzcgNzYgODYgMTAyIDEyOSAzIDE0NCAxMDEgMTM5IDEzNCA1NiA5MCAxOCA5MSA5NCA4NSA1NSAxMCAxMzcgMTEgNTggMSAxMDcgMTEzIAorNzAgMjIgNyA1NiAyOSAxNDMgMTExIDggNDYgNDUgMTE2IDEyMiAxMjkgODkgNyAxMjEgNTMgOTUgMTQgNDkgMTE4IDYyIDEyNSA5MSAzNyAKKzk3IDE1IDM1IDEwMCA2MyAxNDAgNjMgNTAgNTEgNTggMjYgMTI3IDYgNDUgNTkgMTAyIDEyMSAxMTQgODUgMTQxIDEzNSAxMCA3MiAxOSAKKzEwNiA2NiA2NiA0MSA1MyAxMyAzOCAxIDIxIDEwMyA1MCAxMDggNDYgNjYgNzAgNDMgMTQwIDEyNCA0MCA2MyAxNDQgOTcgMTM3IDQ3IAorNjAgODggMTAzIDExNSAxMzIgMTQ1IDExNiAxNDMgMTE1IDEwIDEzMyA5IDExOCAzNyAxMDUgNTEgOTQgNjAgNjcgMTE3IDExNiBeCiszMDUgMSAxMDkgMTEwIDc1IDQyIDEyIDEzOSAxMzcgNDMgMTI4IDEwNiAxMDcgMTkgMTI2IDEyIDEwMSAxNDggMTI3IDE1IDExNyAxMjUgCisxMjUgNjIgOTYgMTMgNzYgNzAgOTYgMTAxIDExMCAxMzggOCA5NSA3NiAxNDMgMTcgMzIgOTcgNzkgMTQ5IDM5IDMxIDk0IDEyMyAyMSAKKzQxIDEzNSA1NSA4NCA3MCAzMyAxMzUgMTE4IDUwIDYyIDEyMSA4MSAxIDQ1IDE0NCA5MyA2MCA1IDY0IDEzNyA4IDEwNSA5MSA4MiA2NyAKKzI3IDExMyAxMTkgNTMgMTggOTggNzkgNDggODQgMzIgMTM1IDEyOCA1IDEgMjAgNzYgMTcgODUgMTA4IDcyIDM2IDE0MSAxNDAgNDkgCisxNTAgMTA1IDEwNCAzIDE0OSAxNCA1NCAxOCAxNDggNjQgNDkgMTI1IDM3IDI4IDI4IDEwMSAyMiAxMDQgOTEgMzIgODIgMTE3IDEyIAorMTE0IDY5IDU4IDIgNTggMTE1IDkgMTA4IDQ3IDU5IDY1IDE0IDkyIDcgNCA4NiA5OCAxNiA4MiA5MiA5NSAzOCA5NCAxMCAxMCA0OCA5NyAKKzEwNCA2NiAxMTUgOTcgMTQyIDExNSAxMjIgMTE5IDQwIDk3IDE2IDMyIDQ3IDM0IDg4IDg5IDI2IDUwIDEyIDc2IDgwIDUxIDQwIDkgCisxMzMgMjQgNDQgNDAgMTIyIDg0IDEwOCAyMiAxNDIgMTQwIDk5IDQ0IDE1IDU0IDggNDIgMTI1IDE1MCAxMzAgMjEgNzkgMTI0IDYyIDQ2IAorMTE5IDE1IDI5IDkxIDU3IDE1MCA0MiAxMzggNzEgNjEgNjggODAgMTE0IDYgMSA3MCAxMjEgMTggMzUgMTEzIDU2IDg3IDg2IDEwIDczIAorMTQgMjkgNDEgNzIgODkgMSAxMzMgODcgMTAxIDEyMyA1OSA5MCAxNDIgNzcgMTMzIDUyIDc4IDQ4IDM0IDEzOCAxMzQgMjcgMTcgNjAgCisxMzEgMTQ3IDYxIDkzIDE0OCAzOSAxMzIgNDkgNjIgNzEgMzYgOTEgNCAxMzkgNDkgMTAwIDEyMCA0MyAxMTMgMTQ0IDMwIDk0IDczIAorMTI3IDQwIDM0IDUwIDEwMCAxMTAgODggMTE0IDk0IDM1IDEzOCAzMyA3MiA2MSA1OCA2NSAyNCAxMDcgNiA1NCA4MSAxMTQgNTYgMTM3IAorNzEgMTEgMjMgMTkgNzMgMSAxMDggMTEwIDI1IDE0OCAxMSA5OCAxMzIgMTUwIDE3IDcwIDE0NiA1MCBeCiszMTQgMSA5OSA4OCA3IDEzOSAyNCAxMyAzNSA0NyA5NyAxNDUgNzQgMzYgMTE5IDMgNTEgODQgNDggMTE5IDUzIDQ5IDE1IDc5IDE3IAorMTIwIDEwMyAxNDggNjQgMzAgNDEgOTcgMTIwIDc1IDExMSA2MyA1OCAxMzEgMTM0IDE4IDEzIDEwIDQ4IDE4IDE2IDQ4IDQzIDE1IDU0IAorMTggNDEgNDcgMTIyIDE0NCA4MCA5MiAxNDUgNzcgMSAzMyA4OSA1NCA0NiA3OCA0OCAyMSA1NCA0MyA0MCA1MyAyNCAxNiA3MyA0MiA5NCAKKzI5IDQ0IDM0IDE1MSAxNTIgMjMgMTIzIDEyIDE0MiAxNDAgNDMgMzcgODggMjkgMTkgMzUgNzIgOTYgMTUxIDEzMCA2MiAxMTIgMzQgMzYgCis5MSAxMjAgNTAgMTEyIDEzOCAyIDEwNSA2MCA2OCAxMzcgMTMxIDUgMTcgMTkgMTM5IDc0IDExIDEyMCA3OCAxNDkgNTggMTI4IDE1IAorMTA0IDE2IDEyNiA3OCAyMCA1NyAxMzQgNzEgNDkgOTAgNzYgMTA4IDEyNiAxMDAgNTQgNjggMzkgMTMyIDE1MyA0MiAxNDcgMTQ2IDEyNCAKKzYyIDg3IDM1IDc1IDYxIDY1IDQ2IDEwMCA4MiAxMDUgMTEzIDMxIDYzIDUgOTUgNTQgNzEgNzcgMTI3IDE1MCA4MCAzNiAxNDQgMiAxMzAgCis1OSA3NCAzOSAzIDE1MiAxMjEgMTIyIDE4IDExNyAxMiAxMTcgMTQxIDExOCAxMzUgNjIgMzYgNjkgNSAzOSA1MyAxNTAgNTIgMTUzIAorMTQzIDMwIDY2IDk2IDEyNiAxMzEgNTYgMTM3IDggNyA4NiAxNDIgMTQgNyAxMTEgMTQxIDkzIDEzNiAxMzcgMTM0IDQzIDEyIDg5IDIzIAorNDQgOSAxNTIgMTQ2IDEyMSA5NyAxOSAzOCAxMTAgOTEgNjcgMTQgMzIgMTEwIDY2IDY4IDggMTMwIDg0IDczIDExOCA1OSAyNCA0MSA3MiAKKzEyMSAxNTAgNTUgMzcgMTM4IDI3IDEwNCA2NiAxMjQgOSA1MSAxMDkgNDcgMTI1IDEwOSAxNDggOCAyOSA0NyA3MiAxNDYgMTQ5IDYxIAorOTMgMTAgMjAgNTQgMTUgNzYgMTMzIDEyNSAxMDYgMTEwIDk0IDMyIDkgMjkgMTQ4IDM2IDY2IDEyMSAxMjUgNTYgMTEyIDkgMSAxMTEgCisxMTYgOTQgNTcgOCAxMDggNTAgNjIgMTQwIDcxIDc0IDg5IDEgODMgMTUyIDIwIDg1IDE3IDE0NSAxMDIgMzkgNTYgMTE1IDQ3IDE1MCAKKzEwOCA2NCA5OCBeCiszMzUgMSAyOCAxMDMgMTkgOTIgOTUgMTUyIDE1MiAxMCAxMSAxMyAxNTUgNjcgMTEgODMgMTAxIDY5IDE1MyAxNTIgNDUgMTQxIDE0IAorMTIwIDEyOSAxNDAgMTE5IDU5IDIgODkgNzMgNzAgODMgMjkgMTYgNjcgODEgMjkgMSA1NCA2NSA5NiAxMTcgMiAzNyA0NyAxMjggMzMgMyAKKzg5IDEwOCA5OCAxMzkgNDkgNzggMjcgMTAzIDM5IDExOSA5NCAxMzIgOTAgMzggMTMyIDU1IDY1IDEzMSA5MCA1OCAyIDU0IDEwMCA2OSAKKzExOCAyMiA0NCAxOSA3IDE0OCA5MyAyNSAyOSAxMjMgODEgNjQgMTMxIDU1IDMwIDEgODkgMzggOTcgODIgNjQgOSAyOCA4NiAxMjMgCisxNTEgMTAgMTMzIDQwIDE1NCAxMDIgNCAxMTEgNjUgOSA2MyA1OSAxMjQgMTE2IDcyIDEwNSA3NiA1NyAxMzcgOTcgMzIgMTQ1IDEwOCAKKzc4IDExMiA1MCA0MyAzNCA3NSAyMCAyMiAxMjkgNjggMTEgMTE4IDc0IDEyNSAxMTggNTcgMTcgMjAgMTI5IDUzIDY1IDYxIDE0NCAxIAorMTcgMTQyIDE1NiA1MiAxMDAgNTQgMTUgMjAgNTkgNTIgNjMgMTMxIDIwIDU3IDEyNCAzMSAxMjUgNDYgMTA2IDc2IDkyIDggOTggMTU0IAorMTUyIDgwIDExNCAxNSAxNDAgMTM2IDExMiAxMDAgMTcgOTIgMjUgMTUxIDE1MCA4MCA5OSA2OSA4MyA0OSA0MyAxNTYgMTAyIDE5IDU3IAorMTIyIDk2IDMwIDMgMzkgMTM0IDQwIDMyIDc1IDUgNzYgMTI3IDEzOCA5OSAxNyA1NyA1MiAxNTAgMTMwIDE4IDEyNyAzMyAyMyAxMTYgCisxMDcgNzggNzcgNzcgNDIgNjkgNjggNDggNDEgNjkgMzMgNzUgNDAgNDkgMTI4IDEwMyA0IDE0NiA5MyAxMCA4MyA2NiA5NiAxNTIgMzAgCiszOCAxMiAzMyA1IDM5IDQ3IDQxIDM0IDYwIDc0IDIwIDQyIDE1NiA2NyA0NiA1NiAxMDIgODkgMyAxMjQgODEgOTkgMTA0IDU2IDUwIDggCis2MSA3NCA1NSAxNSA4NyAxMDggMjggMTM4IDQ3IDkzIDYwIDIgMTI0IDQ2IDEyNiAxMDMgOTEgMTQ1IDM2IDI1IDExNiAxMjIgNzkgNzkgCis3IDExMSAxMyA4NSAxMjEgOSA5OCAzMiAxMjUgODEgMTM0IDc3IDExMiAxNSA3MCAzMyAxMTAgMTMgNTAgMTQ4IDggMTMzIDEyNyAxNTMgCis0NSAxOSA0MiAxMjEgOTQgNDUgOTEgOTUgMTE3IDIyIDkgNDYgNiAyNiAzMSA1MyAxNTAgOCAxNDggMTI4IDUzIDE0MSBeCiszMjYgMCA4MCAxMjMgMjQgMTQ3IDEgMTEyIDgyIDE1OSA2MyA3NCA5NyAxMDkgMzMgMTUxIDMyIDg5IDg3IDEzMiAxMTcgNDYgMTI5IDU5IAorMTE1IDkxIDExNCAxMTggMzcgMjEgOSA5NCA2MCAyNSA4OSA0NyA3OSAxMTAgNTUgMTIgMTQzIDk5IDg3IDQzIDg4IDU2IDU3IDE2MCA3NiAKKzEyIDcxIDEyOCA3NyAxNDYgMTE3IDk1IDEwNSA0MiA2NiAzIDc2IDIwIDc2IDEwMSAxMDAgMTE4IDE0OSA0NSAyNiAxNDMgMTQ4IDMyIAorNTcgMzkgMTI5IDE5IDMxIDg0IDEyMyAxIDE1MiAxMzUgNSA1NCAzMCAxMyAxMjUgNjggMzAgNjIgMTAxIDUxIDE0MiA1IDk0IDgzIDIwIAorMTE2IDI0IDEwNyAxMDkgMTA1IDkxIDQyIDE3IDI3IDkzIDY5IDMgMTM5IDY4IDc5IDM4IDg0IDIgODUgMTI4IDEyNiAxMjIgMTMxIDQ2IAorMTcgMzUgOTggNDIgMjYgMTExIDEwMCAyOSAxMjAgNTUgODQgMTE0IDEwOSAxNDUgMTQgMTggMTM4IDE0IDkgODUgNyAxOCAxMjkgOTEgMiAKKzk0IDUxIDEzMyA4MiA4NyAxMjMgNjQgMzkgOCAxMDMgMzggNzUgMTEwIDc4IDcgOSA0NSAxMTUgNDIgMTM4IDEzNSA4NiA3OCAxNiA2MiAKKzUyIDc1IDE1OSA1NCAxNTEgMTIxIDE0OSA3NyA3NCAxNiA4NSA0NyAxMDIgMTA1IDgyIDExOSAxMCA2NyAxMzcgMTUzIDE0OCAxMzUgMjggCis0OSAyNiAxNTEgMTUzIDM2IDgwIDExIDEzMCAxMTMgMjQgNDQgMzAgMTAyIDI0IDU4IDEzMyAxMjIgMTQwIDk5IDI0IDE1NiA1NCAxMTkgCis0MiAxMTUgMTQwIDkwIDEzMiAxOSA5NCAyIDE1NyA5OSAxMzYgMTkgNzEgNyAxMzAgMTUzIDEwOCA1MSAyMSA1OCA3MCA3NCAxMzcgMSAKKzQwIDExMSAxNDkgNSAxMDMgNiAyNyA3NiAxNDEgMjMgMTI1IDE0MCAxIDcyIDI5IDE1MiAxMDMgODcgNTEgOTMgMjkgODAgMTMyIDc3IAorMTIzIDE1MyA2OCAxNTkgMTQgOTggMTE0IDE1OCAxMjEgMTU4IDgxIDEzNyA0MSA5MyAxMTggMTQwIDEyMiAxOSAyMiAzMSAxNDcgNDEgNCAKKzg5IDE1MCA1MCAxMjAgMTQ0IDExMyAxMDQgMjAgNDQgNTMgOTcgMjAgNCA5MCA2MCA0OCA4NCA3NCAyNSAxMzggMjMgNjIgNjEgMTU5IDUgCisxNCAxMDcgNiA0IDgxIDExNCA0NiA5NyAxMSAxMTIgMTU0IDEzMCA3MyAxMzIgNjAgXgorMzI1IDAgNTggMTM3IDk2IDExIDk4IDY3IDk4IDEwMyA1NyAxNDYgMjEgNTkgODggMTUxIDEzOSAxNDggMTI3IDI1IDE3IDQ3IDExNSAzNCAKKzE2MCAxMDkgMTA3IDUxIDY0IDI4IDY5IDEzIDQ5IDE0OSA2OSAxNDEgOTAgOTMgMTE4IDY0IDEwIDEgNjcgODAgMzUgMTExIDEzIDU4IAorMTAxIDEyNCAxMzIgMTQ3IDE1NCAxOCAxNjIgNiAxNjIgMzMgNSAzNCAxNDIgNDEgMTYxIDgyIDExNCA3MCA5MiAxNDUgNTcgMTU1IDEzNyAKKzExNCA3OSA0NCAzNiA0OCA0OCAyMSAxNCAxMyA0MCAzMyAxNCAxNTAgMzMgMzIgNTQgMTQzIDE0IDQgMTAxIDE0MiAyMyA5MyAxMzYgCisxMzIgMTIwIDE0NyAxNyAzOCAxNjMgMTQzIDUgNTIgNDYgMTUxIDEzMCAzMiA3MiAzNCAxMjQgMTUwIDUxIDEwMCAxMTIgMTI4IDEyNiAKKzY1IDEwIDI4IDg3IDgxIDE1OSAxMzEgMTkgOTkgNTQgMTI1IDExMCA1OCAxMTkgMjggNzggMTI5IDEwNCAxNDAgMTI2IDM4IDE1NCAyNyAKKzExNCA2MSAxNTMgOTAgNjYgOTggNzYgNTAgMTU4IDQ4IDM5IDgyIDEyMyAyMiAxNDcgMTM2IDExNCA1MiAzNyAzNSA3NSA0MSAxNSAxNTAgCis2MCA1MiA1NSAxMDMgMjEgMjMgMTI5IDk1IDI0IDcxIDQ3IDk3IDEzMCA1MCAxNDAgMTQ0IDEwNiAxMDAgOSA2NCAxOSAxMTcgMTIyIDcxIAorOTIgOCA3NyAxNTYgOTcgMTIxIDk4IDg1IDIgMzYgMzkgMTA5IDE0MyAyMyAxMjAgMTU2IDEzMyA5MyAxNTQgMzYgNjYgMTE2IDEzMSAKKzE2MCAxMjcgMTYyIDE2MSA0NiAxNDIgMTQgMTQxIDgxIDE0MSA2MyA4NiAxMTcgMTA0IDMgMTQ2IDM5IDEyNyAzNCAxMzMgMTAyIDEwNiAKKzkxIDU3IDkgMjggNjAgNjEgNyAxNTggMTIgODAgMjYgOCAxMjIgODAgNDQgNjMgNjggNDkgMTU4IDIxIDMyIDgxIDE1MCAxNSAxNDEgCisxMDggMTYxIDY0IDQ2IDEyNCAxMjMgMzEgOTkgMjcgMTA1IDEwOSA5OCAxMTIgOSAzNyAxMiAxMTYgMTQ5IDUxIDczIDE0NCAxMjQgNCAKKzExOSA0NiAxMzMgNzUgODYgOTAgODQgMiA5IDE5IDEwOCA2IDE2IDEwMSAxMTUgMTYgOTIgMTYzIDEyNSAxMDEgMTA2IDY0IDM3IDggNjggCis0MCA0MiAxMzAgNDEgMjQgODkgMTE1IDQzIDExMiA4NSAxMjEgMTI1IDkyIDE1NCA5IDQ2IDExNSA3IDE0MCAxMDggMTU4IF4KKzMzNiAwIDM4IDQyIDE1NSAxMDMgOSA2MiA2NSAxMDIgMTIyIDEwIDEzOCAxNjAgMTI1IDQ3IDE1OCA0MyA5MSA2OSAxMjMgMTMyIDM1IAorMTIxIDQgMTEwIDg5IDEzMCA2OSAyOSAxMzkgNjkgNTMgNzAgODMgMjkgMTYzIDY3IDQxIDkgMTA4IDM0IDQ1IDc2IDg3IDIgMTQ0IDE2NCAKKzk4IDMzIDE2MCA3OSA3OCA0OCA4OSA5IDM4IDEzNCA5MyAxNDYgNzkgNTQgMTIyIDgwIDM4IDExMiA1NSA1NSAxMDEgNzAgOCAxMjkgNDQgCis3MCA1OSA5OCAxNDkgMjQgMTM2IDEyNCAxMzggNjMgMjUgMTY2IDgzIDUxIDM0IDkxIDQ1IDMwIDExOCA1OSAyOCA4NyA3MiA0NCAxMTYgCisyOCAzNiAxMDMgMTAxIDExMyAxMCAxMTQgNjIgMTExIDcxIDY1IDEyNiA1MyAxOSAxMTQgODYgNDIgODUgMzYgNTcgMTM3IDU3IDE1OSAKKzk1IDg4IDc4IDcyIDIwIDIzIDE0IDY1IDEwIDIyIDEyOSA2OCAxIDY4IDc0IDc1IDEwOCA3IDcgMTQ3IDEwOSAxMyAzNSA1MSAxMDQgCisxNTggMTY0IDEyMiAxMjYgMiA1MCA0IDEzMiAxMjcgNTkgNTIgMTMgODEgMjAgNDcgMTA3IDc0IDE0OCAxMTUgNDYgMTA2IDQ2IDgyIAorMTE1IDY4IDE0NCAxNDIgNjAgMTA0IDE1IDkwIDEzNiAxMDIgMTAwIDEzNCA0MiAxNSAxNDEgMTAwIDQwIDQ5IDQ5IDczIDE2NiAxMyAKKzE1NiA4MiAxNjYgMzcgODIgOTYgMTM3IDEzMCAxNjYgMTM0IDIwIDEzOSA0NSAxMjIgNTYgMTA3IDk4IDc5IDEyNCAxNyAzMiAxMzAgCisxMjAgMTY1IDc3IDIzIDEzMCA5NiA2NyA2OCA0NyAzNyAxMiAyOSAxOCAzOCAxNTggMTkgMTYwIDU1IDE0NyAzOSAxMTggODMgMTIxIDk2IAorNDMgMTM3IDMzIDY2IDg2IDExMiAxNDcgMTU1IDE0OSAxNDAgNSAxOSAxNyAxNDggMTYxIDEwIDQ0IDE1OSAxNDYgNTcgMTYgMjYgMTAyIAorNDkgMyAxMDQgNjEgNTkgNzQgNTYgMTAgMTY1IDMxIDU0IDI1IDE0MiAxNTcgMzcgNTggMTY1IDEyOCAxNTQgNzMgNTAgMTQ5IDk0IDM2IAorNzYgNjMgNzEgMTM1IDI2IDUgMTE2IDEyMiAyOSA2OSA3IDEwMSAxNDAgNzUgODEgMTM2IDc4IDIgMTI1IDcxIDg0IDU3IDYyIDE2MiA0MCAKKzMgODAgMTMwIDUwIDk4IDEyNSA5MyAxMjcgMTUzIDQ1IDE0NiAxNDkgMTIxIDc0IDUgNDEgNTUgNzcgMTM5IDE2NiAxNTMgMTEzIDE1MyAKKzIxIDUzIDE0MCAxNDUgMTQ4IDg4IDE2MiBeCiszNDEgMCA0IDYyIDc4IDE2NyAxMDIgMTQ0IDk0IDU1IDE0MSA2MyAyOSA5NyA5MSAyNCAxMTUgMTY2IDgwIDY5IDEzMiA5OSAxIDEyMCAKKzIzIDg4IDY0IDg3IDExOCAzNyAxMzcgMTUyIDk0IDYwIDE2OCA3MSA0NyA1MiAxMTAgMzcgMTU1IDEyNSA2MyA0MiA0MyA1MiAxMSAxMiAKKzE1MSAzMSAxMiA0NCAxMTAgMzIgMTI4IDExNyA2OCA4NyAyNCAzOSAxNjQgNzYgMTQ1IDU4IDEwMSA5MSAxMDAgMTQwIDE1MSAxNDMgCisxMzAgMzIgMjEgMyAxMTEgMSAzMSA3NSAxMjMgMTUzIDExNiAxMzUgMTMwIDI3IDE2NCAxNjUgMTE2IDIzIDEyIDYyIDgzIDI0IDEzMyAKKzEzOSA0OSA3NCAxNTQgODAgMTU4IDgwIDY0IDEwNSA5MSA2IDE0MiAyNyA3NSAyNCAxMjggMTEyIDQxIDc5IDI5IDg0IDE0NSA0MCAxMjggCis5OSA5NSA5NSAxOSAxNyAxNjAgODkgMTUgMTcgODQgNjQgMTEgOTMgMTAgNjYgNzggNzMgMTI3IDE0OCAxOCAxMjkgMTM5IDE0MyA0OSAKKzE1MCA5IDg0IDgyIDE1NCA4NSAxNSA4OCA4MiA2MCA4NyAxOSAxMiAxMzMgNTggMjAgMzkgNjUgNTEgMTQxIDEzNCAyNyA3MCAxNjcgCisxMjAgMTE3IDg2IDYwIDE2IDQ0IDE2IDU3IDEzMiAxOCAxNDIgODUgMTA0IDU5IDQ3IDE0MSA1OCAyIDY2IDk2IDQ2IDExOSAxNTMgNDAgCisxMTAgMTI2IDEwMyA5MCAxNDQgMTMgMjYgMTA2IDE0NCA4MCAxNDUgMTM0IDEwMyA5NSAyNCA0NCAyMSA4NCAxNDAgMTMgOTcgMTA0IAorMTQwIDk5IDYgMTQ3IDU0IDgzIDQyIDEwNiAxMzEgNTQgOTYgMTM1IDY3IDExOCAxMjEgODEgMTA5IDEwIDUzIDEzMiAxMTIgMTE3IDgxIAorMzMgMTU1IDQ5IDYxIDM4IDExOSAxIDEzIDEwMiAxMzEgMTQ4IDk0IDEzMSAxNDMgNjcgMTIzIDE0OCA4OSAxMDQgMTM1IDcyIDE0NSAKKzE1MiA3NiA4NyA2IDY2IDIgNzEgMTIzIDc3IDExNCAxMDggNTkgMTIzIDE2NiA2MiA5NiAxNDAgOTQgMTQ5IDExNiAzNiAxMjggMjMgOTMgCis5MSA5NSAxMTMgMTYyIDE1NiAxNjUgMTExIDE2NiA0IDQ0IDEwNSA1IDEyMCA5OSAxMTMgNjggMTEgMTY5IDM1IDcwIDIgMTQ3IDEyNSAKKzgxIDE1IDEyIDU3IDU2IDE2IDEzOCAxNCA1MyA2MSAxMTQgMTIxIDUgMTA3IDYgMTI5IDgxIDExNCAzNyA2MSAxMjcgNjcgMTM2IDk0IAorNzMgMTE0IDMyIDM0IDExOSA3MiAxMSA5OCAzNyA3NCA3MyA1MSAxNDYgMTYxIDM1IDE0NiBeCiszNDkgMCAxNDIgMTM5IDEyMSA5MSAxNiAxNjMgMiA4OCAxNzEgMTMzIDEwMCA2MiA1MSA0NiAxMCAyNCAxNTAgNDkgMTMxIDYwIDExNCAKKzYzIDg0IDkxIDY0IDE2NSAxMzggNDAgNDQgMTcyIDExMSAxNDEgNTggNzQgMTE1IDk2IDEyOSAxNDUgMTY0IDE1MyAxNzAgMTI2IDI0IAorMTY5IDE2IDExNSA0MSAxMjUgNDYgODcgNjEgOTIgMTQ1IDM5IDE1NSA5MiA3OCA3MCAzNSAyNyAyMSA0OCAyMSAxNTEgMTU5IDQwIDE1IAorNSAxMzIgMTcwIDIzIDE4IDEwNyAxNjAgMTUwIDU2IDEzMyAyMyA2NiAxMDkgMTIzIDEwMiAxMDIgMTcyIDE2NiAxNDUgMTE2IDE1MSAzNCAKKzEgMTUxIDEzMCA1IDM2IDM0IDk3IDExNCAxNSA4MiAxMjggMTEyIDExOSA5OSAyOSAxMzggMTY1IDQyIDM2IDE1OSA5NSAxOSA2MyAzNiAKKzg5IDEwMSA0MCA5MiAxIDMzIDkzIDEwNCAxMTMgMTI2IDIgMTM2IDk2IDUyIDEwOCA5MCA1NyA4OSAzMSA1IDExMyAzMCAzOSAzNyA5NiAKKzQgMTQ3IDEyNyAxMDUgNDMgMTY1IDM1IDc1IDIzIDE0MyAxMDUgMjQgMjUgMTAgOTQgMTIgMTYwIDEwMiA5NSAxNzAgNzEgMjAgNzAgCisxMTIgMjMgOTUgMTQ0IDYxIDczIDEzNyA1NSAxIDgxIDk1IDI2IDY1IDE3MiA0MSAxNDcgNzkgMTAzIDgwIDQwIDEyMSAzNiAxMiA2NCAKKzk4IDE2OSA5MyAxMTEgMTE1IDQ4IDEyNyA5IDM5IDEwNyAxMzEgMTE1IDExOCAxNjIgMTYxIDEwIDE0MiAxNCAxMjMgNTQgMTQxIDM2IAorNDEgOTkgNzcgMTQwIDEyOCAxNjcgODIgMjUgMTA2IDU3IDcwIDY0IDIxIDE5IDE1IDM0IDEyNiAxNDkgMTY3IDUzIDE2MyAxMjcgODYgCiszNSA4IDU0IDIzIDQwIDE0MCAzIDE2OSA0NSAxNTAgMTUyIDk2IDgxIDE0MyAyOCAyOCAxMjQgODcgMTMgOTAgOSA4NyAxMDkgNTMgNjcgCisxNjQgMjggMTMxIDg5IDE0OSA0MiA1NSAxMjYgNzkgMTMyIDc0IDE5IDEzMyAzMCA2OCA3MiA3NSAxNDggOSAxMCA3MiAxNTIgMTQ0IDgzIAorMTA2IDE1MyA3NCAxNjMgOTggOTIgOTcgMzcgMTkgOCAzMiAzMSAyNCAxMjEgMTQgMTUyIDg5IDc5IDcgNzYgMTU1IDg1IDc2IDEwNyA4MyAKKzE1NCAxNTUgMzcgMTE1IDE0NCAxMzEgMTA4IDExNiAyNiAzNiAxMzcgMTAzIDMgNDQgNDcgNzIgMTA0IDEwIDEyMCAxNTQgMTA3IDM1IAorMTUyIDE5IDg1IDY5IDEwNSAxMjAgMjkgMTA5IDE3MSAxMDQgNjUgMTI0IDM5IDExIDEyNyA1NyA0MSA3MCA4MyAyOSAxNTcgNjcgMTY0IF4KKzM3MCAxIDE2NyA2MyAxNiAyNyA1OCA2MCAyIDk5IDEyOCA3MSAzMyAxNjAgNzAgNTEgMyA0NCAxNDkgMiA4OSA4NCAxMDEgNDMgMTggCisxMTMgNzEgMzggOTQgNTUgNDYgNzQgNTIgMTM5IDEwMiAzNSA0MyA1MCA4MCAxMjIgNiAxMDAgODggMTI5IDM2IDI1IDE0OCA0NyAyNCA3IAorNTUgMzYgMzAgODIgMzIgMTkgNzggNjMgMjYgNzEgMjggMTY3IDg1IDU2IDE2NyA5NSAxNTkgNzggMjYgNjYgMzUgNjUgOTAgNDQgMTU5IAorMTA1IDU5IDE1IDY3IDU3IDEzNyAyMSAxMzIgNTAgNzAgNzggMzYgMTY5IDUgMTcyIDU2IDEgMjIgMTI5IDY4IDE2OCAyMyA3NCAzMCA5OSAKKzEzOCAxNzQgMTIwIDkxIDE1MyA4IDQyIDY4IDE1OCAxNTUgMTA0IDk5IDEzMyA1IDEzNSA5NiA4MiA1OSA1MiAxNDQgMzYgMjAgMzggNjIgCisyOSAxMTIgMTA2IDQ2IDEwNiAxOSA3MyA3MCA0MSAxMzUgMTMzIDQyIDk1IDE1IDQ1IDEzNiA5MyAxMDAgOTggMTczIDYgMTMyIDU1IDQgCis0IDMxIDY0IDEzMCAxNjIgMTU2IDY0IDE1NyAxOSA0NiA5NiA5MiAxMDMgMTM5IDEzNCAyIDk0IDE4IDg2IDM4IDg5IDYyIDYxIDc5IAorMTU3IDE0IDExMiAxMTEgMTU2IDMyIDE0IDg1IDc4IDMxIDU5IDIwIDEgMTYxIDE2OSAxNDkgMjkgMTIyIDE1MCAxMzMgMzcgMTAyIDMwIAorMTA5IDY1IDg1IDUxIDE3NCAxMTAgMTY0IDY2IDc3IDc2IDExMSAxMTkgMTMxIDk1IDUgMSAxNjYgMTAzIDEzNCAxNDEgMTcgMTU4IDEyMyAKKzEzNyA0OCAxNjUgMTc1IDEwMiAxMyAzIDg2IDQzIDIzIDQ3IDU2IDE1MCAxNjUgNCAzNiAxNzQgMTE1IDE1NyAxNjggMTMgMTQ3IDExOSAKKzEwOSA1NSA0MSAxNDAgNjcgMjcgMzEgMjcgNTMgMTI2IDE3IDE2MyAxMTYgMTIyIDE2MCA2MCA3IDkyIDExMyA2NiA0NSAxMDkgNjAgCisxNTEgMTI1IDYyIDM5IDM5IDE3IDE1MyAxMyAxNTIgNTMgOTQgNTAgNTMgODkgNTcgMTI3IDE1MyA0NSAxMTkgMTA0IDEyMSA1NiAxNDUgCisxNzIgMTkgNDEgMTAzIDE2NiAxMDggNjggMTI2IDEyIDUzIDEzMSAxMjcgMTQ4IDUyIDEzNCAxNjggNTAgNDggMTU1IDcyIDEzMiA4MiAKKzM3IDEyOSA2MyAxNzUgOTcgNzkgMTggOTEgMTQ4IDc0IDU3IDEzMiA4NyAxNDcgMTE0IDE3NSA3MCA0NiA2OSAxMTggMzcgMTA3IDE0MCAKKzk0IDYwIDE1NiA1OSA0NyAzNCAxMTAgMjUgMTQzIDExMyAzOSAxMiA0MyAyOCAxNTcgMTU4IDE0NSAxIDEyIDI2IDk4IDIgMTE2IDExNyAKKzUwIDc1IDEyIDIxIDE2NCA3NiAxMjEgNDYgMTAxIDg1IDg4IDEzNCAxNDYgMTI3IDE0MyA3OSBeCiszNjQgMCAzMiAxNjQgMTQ2IDkzIDE2MiAzMSA2NiAxMjMgMTQ0IDgwIDEzNSA5NCAxMzcgMTU2IDEwNyAxNTcgMTczIDYyIDY1IDE3NiAKKzEyNCAxMTIgNCA2NSAxMjcgNDQgMTMxIDUzIDE5IDEwNSA5MSAxNDkgMTA2IDI3IDU3IDE1OCA5MiA4NSAxNCA3OSAyMCA4NCAxMjcgCisxNzQgMTI4IDcyIDY4IDU5IDE3MSAxNyAxMjQgODAgMTY3IDggNTcgMjggMTcyIDY2IDE0NCA0OCA0MiAzNyAxMDkgMTIxIDE4IDEyMCAKKzEwMyAxMTYgMTMgMTMyIDM5IDczIDE0NSA3NiAxNTggNDMgODIgMzMgNTEgMTUzIDE2NCA5NyAxMyAyIDMgMjAgMjQgMTE0IDk4IDkgMjUgCisxMzEgMTAyIDk5IDg2IDQyIDE2IDI2IDE1OSAzOSAxMDUgMTYxIDEzMyA0OSA1OSA0MSAyMCAxMDUgMzEgMTM2IDMwIDg3IDEwIDExOSAKKzEzNSAxMyA4MyA5OSA1OCA0NSA5OSAxNTYgMjYgNjEgMTM1IDE0MyA4MCAxMTggMTA3IDc2IDc3IDI0IDQ0IDEyIDY2IDk1IDE0NyA2MSAKKzg2IDE0MCA5OSAxNjcgMTM4IDU0IDQ3IDQyIDk3IDEyMiAxOCA2MCA5MCA0MCA3MyA4NSA2MyA4MiAxIDM1IDk2IDk0IDgxIDU0IDE1IAorMTI4IDQwIDUyIDIgMTAxIDEgMTY1IDkzIDExMyAxMzAgODUgOTUgOTggNTggMTA1IDExMiA1MyA2OCAxMDggNzIgMTAwIDE1MiA0OSA4NyAKKzE0MCAzOSAxNTQgNjIgMTE0IDc3IDEwNSA2MyA1MCA4NyAxNTcgMjYgNzggMTIyIDY3IDE0MCA3MSAxNzAgMTE5IDUgOTMgNjQgNTAgCisxMDQgMTQ0IDEyOSAxMzggNzUgMTMwIDQgMTc4IDYwIDEzOSAxMjAgNTQgMTEzIDMyIDIgMTMzIDE3IDQzIDE2MyAxMjkgODkgNzIgMTQ5IAorMTU1IDMwIDM4IDcgMTM4IDUgNDQgNjEgNjkgNzYgMTc1IDEwNyA2IDkzIDgxIDExNCAyOCAyNSA4MiAyMiAxMTggNTggNzMgOTYgMTc1IAorMTc3IDkyIDM2IDExIDk4IDE3MSAzOCAyOCA0MiAxNDYgMTI1IDE3OCA4OCAxMzYgMTM5IDEwMyA2NyAxMCAxNTEgMTUxIDcwIDE1MyAKKzExNSA5NCAzMiA1MSAzNCAxNzcgMTczIDEzMiA0OSAxMTkgNTQgOTYgNDUgNzggNzMgNjQgMTU5IDEyMCAyMiAyMCAxNTQgMTExIDExNyAKKzU4IDU2IDEwOSA3MiAxMTcgMTM5IDE1MiAxNDcgMTcwIDEwMiAxOCAxNjkgNCA5NyA0MSAxMDEgMjIgNjkgNTUgOTIgMTQ1IDI3IDE1NSAKKzYyIDU0IDY0IDI5IDIxIDMgNDggMjEgMTMzIDE0NyA0MCAzIDE3OCAxMjAgMTUyIDE3IDE3MyA4MyAxNDggMTM4IDI2IDEyNyAyMyA0OCAKKzkxIDExNyA5MCA3MiAxNjYgMTQyIDEzMyA5OCAxMzkgMjIgMTUwIDE1MSAxMzAgMTQwIF4KKzM3MiAwIDM0IDcwIDc4IDE2MSA2NCA5MiAxMTIgMTEwIDcyIDE3NSAxMDIgMTM4IDE3OSAxNzMgMTU5IDU5IDE5IDI3IDE4IDUzIDkyIAorMjIgNjUgMTU2IDE3MCA1NyAxMDQgODYgMTI2IDE0OCAxMTggMTU1IDc4IDQzIDYzIDkwIDQ4IDgwIDE2OCAxNDIgNjggMTIgMzkgMTc0IAorNjkgMTY4IDE0NyAxMTggOTYgMzQgMTI5IDM1IDc1IDUgMTA3IDYwIDE3MCAxODAgMTQ3IDg1IDMgMTMzIDc1IDk1IDE1MiA3MSAxNzUgCis0MyA5NCAxNzggNTAgMTQ0IDE2IDQ2IDEwMSA0NiAxNjUgNDUgNjggMTYzIDM4IDE3MiA1IDEzOCA2MSA4NSA2MiAxNzcgNzYgMzYgMTY3IAorMTkgNTMgMTUxIDY2IDY2IDk3IDMgMTAwIDE2NCAxMiA5OCAxMzEgNzAgMTA5IDE2MiAxNjEgMTU2IDE0MiAxNCAxMDUgMjcgMTQxIDkgCisxNzggODEgNTAgMTEzIDExMCAxMzEgMzcgMTYgNzkgMTIgMzQgMzcgMTY3IDE3MyAxMCAxNTIgNyA4MSAxNDAgMTU4IDI2IDEzNiA4MiAKKzUwIDE3MiAxNTQgNDUgMTYwIDMxIDEyMiAxNjcgMTQyIDkgMTUwIDEyNSA1MSA1NCAxMjUgMTc0IDEwIDEyNCA1MSAxNzcgODEgMTczIAorNjkgMTA5IDggMjIgMTU1IDE5IDg2IDYyIDE0OSAzMyAzNyAxMDggMzQgOTYgMjkgMTc0IDEzMyAxNjcgNTAgNTQgNjYgMTMwIDkgMSAzNiAKKzEzNCAxMDggNjUgOTcgMTI2IDU2IDE2MyA3MSA4MyA4OCAxMCAxIDggMTc4IDIyIDYgMTEyIDE2OSAxMTYgODkgNDMgMTUzIDQwIDE0NiAKKzg1IDMxIDg5IDc0IDE1NCAxMzcgMjggMTE1IDExNyAxMjIgMTA4IDk4IDggMjcgMTEwIDEwMyAxNzYgMTcgMjAgMjcgNzcgMTAgOTMgCisxNDUgODAgMTcgMTQzIDE2NSA3NiA2OSA3OCAxMDIgMjAgOTEgMTcxIDk1IDI5IDExNSAxNzYgMTY2IDEwOSAzOSAyMyA3MCA4MyAyOSAKKzE0OCA2NyAxNjMgMTYxIDMzIDQgMTUgNDYgNDIgMiA2OSAxMDQgNTMgMzMgMTYwIDY0IDMzIDE1NSAxNCAxMzEgMTYwIDU5IDc4IDcxIAorMTkgMTc2IDEwNyA2NSAzOCA4MiA1NSA0MCA1NiA0MCAxMTUgODQgMjkgMjUgNDQgNjggMTA0IDE3NiA3NiA2NCAxMjMgMTggMjUgMTM2IAorMjMgNiAxNzEgMzEgMzAgMzAgNTggMTQgMTMgNzIgNTcgMTQgNDEgMjggMTQzIDczIDI2IDE2NyA4MyAxNDcgNTQgMiAzNiAxMSA2NSA2NiAKKzM4IDE0MSA5OSA0MSAxNzkgNTUgMTU4IDU3IDEzNyAxNzkgMTE0IDIwIDU4IDc4IDEyIDE1NyAxNzUgMTY2IDUwIDE3NyAyMiAxMjkgNjggCisxNjggMTc1IDc0IDkzIDExNCAxNzQgMTAyIDc5IDEzNSAxNzIgMzYgNDQgMTU4IDE0OSA5MiA4MSAxMDkgMTU3IDExMSA3MiAxMTkgXgorMzcyIDAgNTkgNTIgMTEyIDE4MCAyMCAzMCAyMiAxNzMgODAgOTggNDYgMTA2IDE3OSA2NSAzMCAxNyAxMjcgMTI1IDI2IDg3IDE1IDUgCisxMzYgODUgMTAwIDY2IDE0MSAxODIgMTI0IDE1IDE1NiAxNDggMTUgNTYgOTggMTQ2IDE1NiA0OCAxNDkgMyAxNCA5NiA1MiA3OSAxMTUgCisxMzQgMTcwIDU0IDE3OCA1NCAyMiA3MyAzMCA0NSAzOSAxMzMgMTgyIDk2IDEwMyAxNDggMTc2IDYgNDUgNjIgMTgzIDUxIDE4MCAxNTMgCisxNDUgMTQ1IDExNyAyMSA5MCAxMTggMTA5IDIxIDYyIDIyIDEwMSA0OSA1MyAxMSAxNDIgODYgMTMyIDY2IDY5IDQ0IDc5IDg3IDExNSAKKzU1IDUgMTY5IDE1MCA2MyAxMTAgMTA5IDE3NyAxNTAgOTEgMTI5IDQwIDE0OSAxNTkgMTAyIDE2NSAzIDcwIDI3IDE3NSAyMyA1NiAxMjYgCisxNjUgMTY0IDIwIDE1OCA5MSAxNTcgMTM2IDE1NyAxMzEgMTExIDY5IDM5IDMzIDEzMiA0MyAxOSAxNzUgMTc5IDM3IDExOCA5IDE1NSAKKzExNiAxMjIgMTI4IDUyIDcgODQgODkgNTggMTMgODUgNDQgMTM1IDEyNSA1NCAxODMgMjMgMTYxIDE0NSAxNzMgMTM2IDI5IDYyIDUwIAorMTMgNTcgMjUgMTI3IDE1MyA0NSA5NSA2NCAxMjEgNDAgMTIxIDE0MCAxNzEgOSA3MSAxNjYgNjggMjggMTAyIDQgNTMgMTIzIDExMSAKKzE0OCAyMCAxMDIgMTYwIDM0IDggMTM5IDMyIDExNiA2NiAxMyAxMTMgNjMgMTQzIDk3IDYzIDEwIDU5IDEyNCA2NiA0MSAxMzIgNzEgCisxMTUgMTA2IDE1MSA0NiAyMiA0NSAxMTggMzcgNjcgMTI0IDk0IDYwIDE0MCA0MyA0NyAxMCAxMTAgOSAxMjcgOTcgNyAxNTYgNDMgMTgwIAorMTI1IDEyNiAxMzcgMTQ1IDEyIDIgODIgMTQ2IDEwMCAxMTcgMjYgNTkgMTgwIDE4MSAxNjQgNzYgODkgMzAgMTAxIDc3IDcyIDEyNiAKKzExNCA5NSAxNDMgMTAyIDMyIDE0OSAxMzEgODMgMTU3IDMxIDYxIDEyMyAxMzkgNjAgMTM1IDc0IDE2OSAxMjIgMTUxIDEwMiAxMzcgCisxNjggNjIgNTUgMTY2IDExOSA5NyAxNjMgNjAgMTEyIDI0IDExNiAzOCAxNzggMTA1IDkxIDEzNCA4NiAyNyA0NyAxMzggNzIgNzAgMTgzIAorNzkgMTUgODQgMTE3IDE1NCAxMjggNTcgNTMgMzkgMTYxIDE3IDEwNCA3NSAxNTcgMyA0MiA4IDE2NyA1MSAxMjQgMzggMjIgMTcgOTkgCisxMDYgMTggMTE1IDgzIDEwMSAxNzcgMTIyIDE3OSAxNCA2OCAxNDAgNzEgMTQzIDE4IDgyIDE4IDMxIDEzMyAxNTQgNzcgMTcyIDE3NiAKKzE2NyAxNzkgOSA5OSA3OCAxODMgMTExIDkyIDg5IDg2IDMyIDE2IDE2IDE0NCAyOSA5MCAxNDYgMTI4IDI5IDM0IDMxIDUgODUgMTYgCisxMTYgMTAgODIgMTc0IDExOSAxMjUgNzkgXgorMzkxIDAgNTkgNzUgMTggNSA1OSAxMzIgMjYgMjEgMTI3IDExOSA4MCA5NCA4MyA1MiA2MSAyNCA0NCA0IDUwIDU1IDExNSAyOSA3MCAKKzE0MCA5OSAxNTkgMTMwIDU0IDE1IDQyIDg5IDExNCAxNzMgMjggNTAgMTYgMzMgNTMgNDcgNTggMTgwIDE5IDY0IDc4IDQ5IDMwIDE4NiAKKzEwNCAzMiA0NCAxNTcgODUgMSAxNDkgODUgOTcgMTE0IDc3IDYzIDU4IDUwIDg5IDgwIDIxIDM2IDg0IDcyIDYwIDE1MiAyNSA4NyAxMDggCisxNSAxMzggNTQgMTA2IDc3IDk3IDIzIDQyIDU1IDE0OSAxODEgNjIgMTA2IDQzIDEzMiAzMSAxMzggMTExIDE3NiA5MyA0MCAxMCA5NiAKKzEyOCAxMDUgMTE0IDQzIDk4IDQgMTQ2IDIwIDEwNyAxMjAgMTQgMTEzIDE4MSAxMDEgMSAxOSAxNTUgMTEzIDU3IDY0IDExNyAxMzEgNiAKKzIyIDE4NiAxMzggMTg0IDM2IDYxIDI5IDM2IDE3NSAxMDcgNiA2MSA4MSAxMTQgMjAgMTgwIDQyIDE2OSAxMDIgMjYgNzMgODAgMTUxIAorMTUzIDY4IDQgMTEgOTggMTM5IDYgMTc1IDM0IDE0NiA5MyAxNTQgODggMTI4IDEzOSA3OSAzNSAyIDEzNSAxMTkgNDYgMTI5IDkxIDg2IAorMTc5IDUxIDE4IDE2OSAxNDEgMTA4IDQ5IDEwMyA0NiA3MiAyMSA3MCA0OSA2NCAxNTEgOTYgMTg1IDE3NSAxMzAgMTExIDg1IDU4IDMyIAorMTAxIDQwIDEwMSAxMzEgMTM2IDEzOSAxNzAgNzAgMTAgMTY5IDE3NSA3MyA0MSA2OSAxNzcgNDUgNDcgOTIgMTQ1IDExIDE1NSAyMiAyMiAKKzU2IDIxIDEzIDE2NiA0OCAyMSAxMDkgMTMxIDQwIDE3NCAxNzggMTA0IDEyOCA5IDE0OSA1MSAxMzIgMTIyIDE3MyAxMTkgMjMgMjQgNjcgCisxMDkgNzQgMzIgMTU4IDExMCAxMTcgNzQgMTIzIDYgMTE4IDE1MSAxMzAgMTUwIDE2NyAzNCA1NSA1OCAxNDYgNTQgNzIgMTEyIDEwNSAKKzU3IDE2MCA4MiAxMjMgMTU5IDE1MyAxNTkgMzkgMTkgNyA4IDMzIDg3IDEyIDUwIDE0NiAxNTAgMzcgMTA0IDcxIDEyNiAxMzMgMTA4IAorMTQ1IDY4IDM4IDM4IDkwIDQzIDc1IDE0OCAxMjIgNDMgMiAzOSAxNTQgNTQgMTYzIDE0NyAxMTMgOTEgMjkgMTA5IDM1IDc1IDE4MiA4NyAKKzM1IDE1NSAxNzAgMTI3IDgwIDE4NSAxMTggNjAgOTUgMTQyIDcxIDE2NSAyOCA4NCAxNjggMjUgMTQ0IDE3OCAzMSA4MSA0MSAxNjAgMjUgCis1MyAxNDMgMjMgMTcyIDE3MiAxMzMgNTEgNzUgNTIgMTU3IDUxIDM2IDE1NyAxODEgMjggMTQxIDUxIDQxIDg3IDE2NSA4NSAxNTQgMTg0IAorOTMgMTMxIDQ1IDEwNCAxNjIgMTYxIDE0MSAxNDIgMTQgOTUgMTIgMTQxIDE4MSAxNTggNzEgMzUgOTggMTAwIDExMSAxMiAxMSA2NCAKKzE3NCAxNCAyMiAxNTIgMTczIDUgMTMyIDE3OSA1NiAxMzUgMTUzIDExIDEyMSA1NyAzMCAxNTIgMTM5IDQwIDE0MCA1MyBeCiszODQgMSAxMDYgMTU5IDExOCAxNjcgMTUwIDEwMSAxMSAzMCAxMDkgMTUwIDE4NCAxMjQgMTkgMTY5IDczIDE2NSA1MyAxMDkgMTU4IAorMTcyIDE0NyAxMSA0NiAzOCAxNDkgMjUgMjEgOTIgMTg0IDY0IDE3OSAxNTggMTMzIDEzNSAzNCAzOCA1OCAxMTQgOSAxODMgNCAxMTggCis3NiA0OSA4OSAxMDIgNDAgMTYzIDQ3IDc1IDgwIDE3NiAxNzUgOCAxNTQgMTQgMTgwIDEwNCAxNTMgODQgODkgMTEgMTI5IDggMTM4IDg1IAorMTgxIDczIDY2IDE1NCAxMjEgMjAgMTE1IDkzIDExNCAxMDggODIgMTgyIDE5IDg2IDEwMyAxNzYgMTgzIDE4NiAxNzcgNTMgMTAgNjkgCisxMzcgNTYgMSAxMzUgMTQxIDY4IDY5IDU0IDg2IDEyIDc1IDE3MSA4NyAxODcgMTA3IDE0NCAxNTAgOTMgMjMgNyA3MCA4MyAyOSAxNDAgCis2NyAxMzkgMTUzIDE4MyAxNzggMTg5IDMwIDE4IDIgMjkgNzIgMjkgMzMgMTYwIDU2IDkgMTIzIDE2NCAxMDcgMTM2IDE5IDcwIDMxIAorMTc3IDE1MiA5OSA1NyAzOCA2NiA1NSAzMiAzMiAyNCA4MyA2MCAyMSAxIDM2IDUyIDgwIDE2OCA0NCAzMiAxMTUgMTg0IDI1IDEyMCAKKzE4MSAxNzIgMTU1IDE4OSAyMiAzMCAyNiAxODAgNSA2NCA0OSAxODggMSAyOCAxMTEgNTcgMTc2IDE2NyA2NyAxMzEgMjIgMTYwIDE4NiAKKzE2OSA2NSAzNCAzMCAxMTcgOTEgMTcgMTYzIDM5IDEzNCA1NyAxMzcgMTU1IDkwIDE3MCA0MiA3OCAxNzAgMTQxIDE2NyAxNTggNDIgCisxNzcgMjIgMTI5IDY4IDE2OCAxNDMgNzQgMTUwIDg1IDgyIDE3NCA3OCA2MyAxMTEgMTU2IDI4IDEyIDE1OCAxNDEgNzYgNTcgNzcgMTI1IAorNzkgNDAgMTIgNTkgNTIgODggMTU2IDIwIDI0IDE4MiAxNDkgNTYgOTIgNDYgMTA2IDE2NyA1OSAxODkgMTIxIDExOSAxNCA4MSAxNSAKKzE2NSAxMzYgNzkgMTAwIDQyIDExNyAxODIgMTE4IDE3NSAxMzggMTI0IDMgNTAgNzQgMTM0IDE1NiAzNiAxNDMgMTgxIDE4MCA5NiAyMiAKKzYxIDk3IDEzNCAxNjQgMjQgMTY2IDMwIDEwIDYxIDYgMzMgOSAxMTUgMTc2IDg0IDk3IDE0MiAxNTIgMTUgNTAgMTY1IDQ1IDE2OCAxMzUgCisxMzMgMTI3IDkzIDE1IDY2IDk0IDkxIDkgMzIgMTYgOTUgMzcgMjkgMTcxIDExOCA2OCAxMDggNjYgNjMgMjAgNTUgNjMgMTAzIDI1IDUgCisxNjMgMTM4IDMzIDkyIDg1IDE2NSAxNDQgNjcgMTIzIDM0IDEzNyAxNDcgMTAyIDE0NyAzIDU4IDE1IDE1NyA1IDU2IDEwOCAxNjUgMTUyIAorOCAxNDYgNzMgMTU3IDExMiAxMzMgMTE5IDEwNSAzOSAyNyAyNyAxMjYgMjUgMTMgMTUxIDE2MSAyNSAxMTIgMyAxNDkgMTE2IDEyMiAKKzEwNCA0NiA3IDc4IDcxIDUyIDE3OSA2NyAzMiAxMjMgMTI1IDQ4IDE1OSAxMSAxMzcgMTM5IDE2MSAxMTAgXgorMzk0IDAgMiAyNiA1MCAxNjEgMjEgMTgyIDEyNyAxNTMgNDUgNjggMTkgMTIxIDIyIDk0IDEwNCAxNDQgMTY2IDM1IDE2NiAyMyAxNzYgCis3NSAxODggNTMgMTE0IDkzIDE0OCAxNzcgNjYgMTUxIDE2IDE1NiAxMjEgMTgwIDk4IDQ4IDE3OSA5NSA2MyAxMDcgOTcgNDUgMSAyMyAKKzk3IDU3IDIzIDEzMiA1MyA3OSA5NyAxMjQgMTkgMTg4IDE4IDExOCAzNyAyMiAxMDYgOTQgNjAgMTIyIDI1IDQ3IDE3NiAxMTAgMTg0IAorMTA5IDc5IDE2NCAxMjAgNDMgMTUzIDg5IDkwIDEyOCAxMDkgMTIgMTY4IDY0IDExMCA4MiAxMTcgMTkyIDQxIDE3MSAxNjMgMTY0IDc2IAorNTMgMTIgMTAxIDY4IDU0IDExNyA3OCA1OSAxNDMgODQgMzIgMTIyIDEwNCA2NSAxNDggMzEgNTIgMTIzIDEzMCAyNCAxMzUgMzggMTUxIAorOTUgMTQyIDkzIDEwMSAxNTkgNjIgMzcgMTQ4IDExMCA3MCAxMjcgNTEgODUgMTgxIDg5IDExIDE0MiAxMDUgOTEgMTA3IDUwIDI3IDI5IAorMTAyIDM2IDQzIDE2NSA3OSA2IDg0IDk5IDExOCAxMjggMzAgMjYgMyAxNDMgMTcgNjggNjYgMTM5IDE4NyAxNSAxNjUgMTU4IDI0IDg4IAorMjAgMTc5IDE3NCA4MSA3OSAxOCAxMDYgNDcgNzQgMTUwIDEwNCAxNzkgMTYyIDU5IDEzMSA2MiAxMTYgMTY2IDgyIDE4NCAxODggOTcgCisxMzYgNDEgMTM2IDE2NyAxNDAgMTQzIDE3NSA3MiA0MiAxNzQgMTQ4IDc1IDc0IDcxIDg2IDE0IDE2IDE5MSAxMTcgMTEgNjMgMTE5IAorMTE5IDE4NiAxODIgMTMgMTcxIDQ5IDE4MiA4MCAxNjcgNzMgMTQ3IDExOSAxMDcgMTY0IDQxIDU3IDE4MSAxNjggMjkgMTE0IDI2IDE4NCAKKzEyMSAxMDEgODAgNzYgNjUgMzQgNDkgMjQgNDQgMTkxIDM4IDI1IDkxIDUgNTggMTQwIDk5IDE1MyAxMjQgNTQgMTg0IDQyIDgzIDEwOCAKKzE1NSA0IDIwIDE5MSAzIDI5IDM1IDQwIDE4MCA3IDQwIDY2IDI1IDEyIDE4MCA4NiAyNiAzOCAxMzkgNzMgMSAxMzcgNzkgODUgMTAyIAorNzEgMzkgMjggNDQgNzcgNTYgMTkwIDEyIDY2IDcyIDMwIDE1MiA3IDg3IDg0IDE5MCAxMjYgNDggMTAwIDc3IDkxIDE4NiAzNiAzMSAKKzE0MyAxNjMgNTAgOTQgMjUgMTI2IDEgMTE0IDEwNSAxNzAgOTMgMjIgMTczIDkwIDExNiA4NyA5NiAxOSA3NCA0IDEyMiAxODMgODMgCisxMjAgMTc3IDExMyAxNjkgMTgxIDc3IDE4MiAxIDE0OSAxMDEgMzMgNTggOTMgMTEzIDE4MSAxMCAxODYgMTM4IDE4NCAzMCA2MSAxOTIgCis2IDE3NSAxMDcgNiAzNyA4MSAxMTQgMTQgMTYyIDEyIDE0NSA5MCAyIDczIDY4IDEzMyAxMzUgNTAgMTczIDExIDk4IDExNSAxNzUgMTUxIAorMjggMTQ2IDY5IDEzNiA4OCAxMjIgMTM5IDYxIDExIDE4OSAxMjMgOTUgMjggMTExIDczIDgwIDE1NSA1MSA2IDE2MyAxMTcgOTAgNDkgCis5MSA0MCA1NCAxODkgXgorMzkwIDAgNjIgMjUgNjQgMTQzIDcyIDE2OSAxNTEgMTA2IDExMSA1MyA1OCA4IDkzIDggODUgMTIzIDEyMCAxMzEgMTcwIDM4IDIgMTY5IAorMTY3IDQ5IDQxIDM3IDE1MyAyMSAzOSA5MiAxNDUgMTkwIDE1NSAxNzcgMTg1IDQ4IDEzIDUgMTUwIDQ4IDIxIDg1IDExNSA0MCAxNjYgCisxNzggODggMTA0IDEgMTI1IDE5IDExNiAxMDYgMTQxIDExMSAyMyA0MyAxMDEgNTggMTg3IDE1MCA3OCAxMDEgNTAgMTA3IDE4NSA4NiAKKzE1MSAxMzAgMTM0IDE0MyAzNCAzMSAyNiAxMjIgMzggNDAgMTEyIDk3IDMzIDEzNiA1MCA5OSAxMjcgMTIxIDE1OSA3IDE5IDE3MCAxODcgCisxIDc5IDE5MSAyNiAxMzAgMTE4IDUgMTA0IDQ3IDEyNiAxMDkgOTIgMTI5IDUyIDMwIDE5MyA5MCAzNSA2NyAxMTYgOTAgMyAxODEgMzkgCisxMjIgMzAgMTU1IDE0NyAxMDUgODMgMjEgNzcgMzUgNzUgMTc0IDU1IDE5MCAxMzEgMTU0IDk1IDcyIDE4NSA5NCAzNiA5NSAxMjYgNzEgCisxNDkgNCA2OCAxNTIgMTgwIDE0NCAxNDYgNyA0OSAzMyAxNTIgMTg4IDI5IDExMSAxOTQgMTcyIDE0OCAxMjUgMzUgNTkgMzYgMTI1IDExIAorMzYgMTQxIDE0OSAxODMgMTI1IDI3IDEgNzEgMTMzIDYxIDEzOCAxNjggODUgMTMxIDUgOTYgMTYyIDE2MSAxMTcgMTQyIDE0IDc5IDE4MyAKKzE0MSAxNjUgMTI2IDU1IDExIDc0IDg0IDc5IDE2NyAzIDQwIDE0MiAxNzcgMTkzIDEyOCAxNzMgMTkyIDEwMCAxNjMgMTYgMTI3IDE0NSAKKzE4MiA5NyAxNyAxOTMgMTIwIDExNSAzMiAxMDggMTggOTYgMTU0IDEwMyAxNTIgMTUwIDg2IDE4MSAxNSA5OSAxMzUgMTc5IDEyNCAxOTQgCisxNjQgNjggMTYwIDQzIDEwOSAxMzggMTUyIDE0MiA2IDIxIDIzIDE0OSAyMCAxMSA4MiAxNjQgNDQgMTU5IDE0OCAxMzMgMTE1IDI0IDI4IAorNTMgMTA0IDkgMTgzIDE3OSAxMDggNTYgMzkgODQgODcgMzAgMTYzIDMyIDcwIDc1IDE2NiAxNzAgOCAxMzkgOSAxNzUgOTkgMTQzIDY0IAorODkgMTg2IDExNCAxODMgMTMzIDg1IDE2MSA2MyA2MSAxNTQgMTExIDE1IDExNSA3OCAxMDkgMTA4IDcyIDE3NyAxNCA3MSAxMDMgMTc2IAorMTczIDE3NiAxNTcgMzggMTAgNTQgMTMyIDQxIDE4NiAxMzAgMTI2IDYzIDY5IDM5IDc2IDcgNjUgMTcxIDgyIDE3MiAxMDIgMTI0IDE0MCAKKzgzIDEzIDE5MiA3MCA4MyAyOSAxMzUgNjcgMTI0IDE0OCAxNjMgMTczIDE4NCAyMCAzIDIgNCA1MiAxNCAzMyAxNjAgNTEgMTg5IDEwMyAKKzE0NCA5MiAxMjEgMTg5IDY1IDYgMTYyIDEzNyA5NCA1MiAzOCA1NiA1NSAyNyAxNyAxNCA2MyA0NSAxNiAxODEgMzEgNDIgNjUgMTYzIAorMjQgMTIgMTEwIDE3NCAyNSAxMTAgMTY2IDE2MiAxNDUgMTc0IDE3IDMwIDYgMTcwIDU5IDQ0IDE4MyAxNzEgMjggOTEgNDcgMTU2IDE3MiAKK14KKzQwMCAxIDUxIDExNSAxODggMTM2IDE1NCAxNDUgNjUgMiAyMiA5MyA4MyAxOTEgMTQ3IDIzIDExMCA1NyAxMzcgMTMxIDY2IDEzOCAyNiAKKzc4IDE0NiAxMjUgMTU5IDE1MCAzNCAxNzcgMjIgMTI5IDY4IDE2OCAxMTEgNzQgMTE4IDc3IDUwIDE3NCA1NCA0NyA4NyAxNDAgMjAgCisxNzggMTU4IDEzMyA2MCAzMyA0NSA5MyA0NyA4IDE3MCA1OSA1MiA1NiAxMjQgMjAgMTYgMTUwIDExNyAyNCA4NCA0NiAxMDYgMTUxIDUxIAorMTU4IDE3MyAxMTMgMTExIDE5NiA3MyAxNSAxMzMgMTM2IDcxIDEwMCAxMCA4NSAxODIgMTEwIDE0MyAxMTQgOTIgMTg1IDQyIDQyIDExOCAKKzE1NiAyMCAxMzUgMTczIDE1NiA5NiAxODAgMzcgNzMgMTM0IDE1NiAxODIgMTUwIDE5NiAxOTIgNDUgMTcyIDE3IDE2NyA5MSAxNjggNjggCis4OSAxMzQgMTIwIDE5MCAxNzMgMzQgMTQxIDM3IDE1MiAxMTEgMTE3IDEwMyA2MSA3IDM0IDYyIDY3IDE5MSAxOTAgOCA4NyAyMSAxOTUgCisxMzkgODYgNDQgNzYgNjYgNTUgMTg2IDIzIDMxIDg3IDE4MyA1IDE1NSAxMjIgMTkxIDY4IDUzIDE0OSAxMzYgMzUgMTE1IDI2IDEyMSAKKzEzMSAxMDIgMTIzIDMgNDIgMTk3IDEzMyAxNzkgNTYgODQgMTY1IDEzNiAxOTAgMTMwIDQ5IDE1NyA4MCAxMDEgMTAzIDk3IDE5NyAxMSAKKzE5IDExOCAxIDUgMTE5IDEzNyA5IDEwNCAxOTMgMTQxIDExNiAxMjIgNzIgMzggNyA3MCA0NyA0NCAxNTUgNDMgMTYgMTA3IDEyNSA0MCAKKzEyNyAxOTMgMTA1IDEzMSAxNDUgMTA4IDE4NSA2IDUwIDE0MSAxIDE2NyAxMjcgMTUzIDQ1IDUzIDE5MiAxMjEgMTIgNzkgODQgMTI5IAorMTUxIDE1IDE2NiAxOTYgMTU2IDYwIDE4OCA1MyAxMDkgODMgMTQ4IDE2MiA0NiAxNDYgNiAxMzYgMTExIDE2MCA4OCAzOCAxNjkgODUgCis2MyA4NyA5NyAzNSAxOTQgMyA4MiA1MiAxMyAxMzIgNDMgNTkgOTIgMTA5IDQgMTc4IDMgMTE4IDM3IDE5NSA5NiA5NCA2MCAxMTIgMTUgCis0NyAxNjYgMTEwIDE3OSA5OSA2OSAxNDkgMTAwIDQzIDEzOCA2OSA3MCAxMjMgODkgMTIgMTU4IDU0IDkwIDcyIDExNyAxODIgMzEgMTY2IAorMTUzIDE2NCA3NiAzMyAyIDEwMSA2MyA0NCAxMTIgNTggMzkgMTQzIDc0IDMyIDEwNyA4OSA1NSAxNDMgMzEgNDcgMTIzIDEyNSA0IDEzNSAKKzE4IDE0MSA4MCAxMzcgODggODEgMTU0IDYyIDI3IDEzOCAxMDUgNTUgMTA3IDQ2IDcwIDE2NiA3NCAxOTQgMTIyIDEwNSA5MSA5MiAzMCAKKzI3IDE5IDgyIDE2IDI4IDE1NSA3OSAxIDg0IDg5IDk4IDEyOCAxNSAxMSAxODEgMTMzIDE3IDQ4IDYxIDEyOSAxODcgMTUwIDE1MyA5IAorNjggMTAgMTY0IDE1OSA3MSA2NCAxOCAxMDEgMjcgNTkgMTM1IDk0IDE3OSAxNDIgNTQgMTI2IDU3IDEwMSAxNDYgODIgMTc0IDE3MyA3NyAKKzEyNiAyMSAxMTYgMTYyIDEyNSAxMjMgMTY1IDU3IDIyIDE2OSAxNTMgXgorMzk0IDAgNDcgNjAgNTcgODYgMTYgMTg0IDk2IDE5NyA0MiA5OCAxMTIgMTY1IDE1NCAxOTkgMTU3IDIxIDE2OCA1MiAxNDYgNjYgMTI2IAorMTE5IDkzIDE1MCAyMCAzNiAxNTMgMTQwIDE5NCA5MyAyNiAxNTYgMTE0IDgwIDgwIDU1IDQ0IDEzIDM1IDI0IDQ0IDE5MSAyNCAxOTAgCis2MyAxNzcgNDQgMTQwIDk5IDE0NiAxMTcgNTQgMTYzIDQyIDc2IDEwMSAxMzQgMTc2IDE4NSAxNzcgMTY4IDEgMjEgMTkgMTgwIDE5MyAKKzEyIDUyIDE5NyAxOTEgMTczIDY1IDE5IDMxIDExOCA1OSAxIDEyMyA3MiA3MSA4OCA2NCAxMSAxOTMgMzcgNjMgMjggMTY5IDE4NCA0NSAKKzcyIDE5NSAxNTIgMTg2IDg3IDU2IDE3NiAxMTIgNDEgOTMgNzcgODQgMTU4IDI5IDMgMTM2IDE0MiAzNiA4MCA0IDExOSAxNjYgODYgOTggCisxNjMgOTMgMSAxNDUgODMgMTAyIDY2IDc1IDE5MSA0NiA0IDk0IDE1NSA1NSAxMjAgMTQ5IDExMyAxNDggMTgxIDQ5IDE3NSAxODAgMTQyIAorODcgNSA1MSA2NSA5MiAxNjcgMTk2IDE4NiAxMzggMTg0IDIzIDYxIDE2NCAxNzEgMTc1IDEwNyA2IDkgODEgMTE0IDcgMTQxIDE3NyAKKzExNyA3NiAxNzQgNzMgNTQgMTEyIDExNCAyOSAxNTIgMTEgOTggODcgMTU0IDEyMyAyMSAxNDYgNDEgMTE1IDg4IDExNSAxMzkgNDAgCisxODMgMTg5IDEwOSA2NyA3IDkwIDUyIDczIDEyNyA1MSAxOTIgMTU2IDg5IDY5IDQ5IDc3IDMzIDMzIDE4MiA1NyAxMCA2NCAxMzggNTcgCisxNTkgMTM2IDkxIDExMSAzMyA1OCAxOTMgODggMTg4IDc1IDExOCAxMTAgMTI2IDE3MCAxOCAxOTcgMTY5IDE2MiAzNCA0MSAxNyAxMzggCis2IDM0IDkyIDE0NSAxODUgMTU1IDE1NyAxNzAgNDMgOCAxNDAgNDggMjEgNzAgMTA1IDQwIDE2MSAxNzggNzggODkgMTk2IDExMCAxOTkgCisxMDYgOTYgMTIxIDEwNiAyMyAxODUgMjggOTYgNDggMTY3IDE0NSA1OCA5MSAzNSA5NyAxODAgNjYgMTUxIDEzMCAxMjQgMTI4IDM0IDE2IAorNiAxMDcgMjggMjAgMTEyIDkyIDE4IDEyMSAzMCA4NCAxMDcgMTAxIDE1OSAxODcgMTkgMTU1IDE4MiAxODEgNzQgMTg2IDExIDEyMCA5OCAKKzE4NSAxMDQgMzIgMTI2IDk0IDgyIDExOSA0MiAyNSAxNzMgOTAgMzAgNjIgOTYgNzAgMTc4IDE3NiAzOSAxMDIgMTUgMTUwIDE0NyAxMDAgCis3OCAxNiA1NyAzNSA3NSAxNjkgMzUgMTcwIDExNiAxNDQgNzUgNjcgMTg1IDc5IDIxIDk1IDExNiA3MSAxMzkgMTg5IDU4IDE0MiAxNjAgCisxNDQgMTI2IDE5MiAyOSAyOCAxNDcgMTczIDE0IDkxIDE4NCAxNzIgMTMzIDEyMCAyNSA0OSAyNiAxMDUgMTg2IDM2IDEzMSAxMjkgMTYzIAorMTE1IDEyIDE3NiA2MSAxMTMgNDYgMTI4IDE1OCA4MCAxMzEgMTgwIDkxIDE2MiAxNjEgMTAyIDE0MiAxNCA2OSAxNzMgMTQxIDE1NSAKKzEwNiA0NSAxOTYgNTkgNzQgNTkgMTQ3IDE5NSBeCis0MTIgMCAxNiAxMTAgMTUzIDE3NyAxMDQgMTczIDE5MiA2OCAxNDcgMTc5IDExOSAxMzcgMTY2IDczIDE4MCAxNjkgODggOTEgMjQgNzYgCisxMCA4MCAxNDYgNzkgMTI4IDE1MCA2MiAxNDkgMTk0IDgzIDExMSAxNzEgMTI0IDE3MCAxNTYgNjAgMTUyIDI3IDEwOSAxMDYgMTIwIAorMTM0IDIwMSAxODQgMjAyIDE0OSAxMiAxOTggNjYgMTMyIDEyIDEyNyAxMzIgMTMzIDgzIDggMTIgNDUgODggOSAxODMgMTU1IDkyIDI0IAorMjMgNzYgNjMgMTQgMTYzIDggNjIgNjcgMTUwIDE2MiA4IDExNSAxIDE2NyA5MSAxMjcgMzIgODkgMTYyIDkwIDE1OSAxMjUgODUgMTI5IAorNDcgNTMgMTU0IDk1IDcgMTE1IDU0IDEwMSAxMDggNTYgMTY5IDYgNDcgMTAzIDE3NiAxNTcgMTYwIDEyNSAxNCAxMCAzMCAxMjQgMTcgCisxNzggMTIyIDEwMiA1NSA2OSAxNSA2MCAyMDIgNDkgMTcxIDc0IDE0OCA5NCA5MiAxMjQgNjcgMjAwIDE4NCA3MCA4MyAyOSAxMjcgNjcgCisxMDAgMTQwIDEzMSAxNjUgMTc2IDQgMTgyIDIgMTY3IDIwIDE5MyAzMyAxNjAgNDMgMTczIDcxIDExMiA2OCA5NyAxNTcgNTcgMTY5IAorMTM4IDExMyA4NiA0NCAzOCA0MCA1NSAxOSAxOTYgMjAxIDMxIDIxIDggMTY1IDIzIDI2IDQxIDE1NSAxOTUgMTgzIDEwMiAxNTggMjUgCis5NCAxNDIgMTQ2IDEyOSAxNTAgOSAzMCAxNzcgMTU0IDE5NSA1MSAzNiAxNzUgMTM5IDI4IDU5IDMxIDEyNCAxNjcgNDEgMTA1IDE3MyAKKzEyMSAxMzQgMTMwIDY1IDE4NSAxNyA3OCA3OCAxODEgMTM3IDEzIDk1IDU3IDEzNyAxMTYgNTEgMTE4IDE2IDc4IDEzMSAxMTUgMTU0IAorMTQ1IDI5IDE3NyAyMiAxMjkgNjggMTY4IDkxIDc0IDk4IDcyIDMwIDE3NCAzOSAzNyA3MiAxMzAgMTUgMTYzIDE1OCAxMjggNTAgMTggCisyNSA3MyAyNyAxOTEgMTUwIDU5IDUyIDM2IDEwNCAyMCAxMSAxMzAgOTcgNCA3OSA0NiAxMDYgMTQxIDQ2IDEzOCAxNjMgMTA4IDEwNiAKKzE5MSA2OCAxNSAxMTMgMTM2IDY2IDEwMCAxOTMgNjUgMTgyIDEwNSAxMjMgOTkgNzIgMTgwIDM3IDIyIDEwOCAxNTYgMTAgMTMwIDE2OCAKKzE0MSA5NiAxNjAgMjIgNTggMTM0IDE1MSAxNjIgMTQwIDE4MSAxODcgMzUgMTU3IDcgMTQ3IDc2IDE2MyA1OCA4NCAxMjkgMTAwIDE5MCAKKzE1MyAyNCAxMjYgMzIgMTQyIDk2IDEwNyA4OCA0MSAyIDE0IDQyIDUyIDE4NiAxNzAgMyA4MiAxMSAxODAgMTE5IDY2IDI5IDU2IDY2IAorNTAgMTcxIDMgMTEgNzcgMTYzIDUgMTUwIDExMiAxNzEgNTMgMzMgMTM5IDEzMSAxNSAxMTAgMjEgMTExIDEyMSAxMDIgMTA4IDMgMzIgCisxOTIgMTE4IDE2OSA1NiA2OSAxNjUgMTI2IDE4NSAxMjAgMzQgMTU3IDYwIDgxIDkzIDkyIDE3NyAxIDE0IDExMyAxODkgOTkgMTIyIAorMjAyIDk5IDE5MyAxMzYgMTE2IDEyMiA1MiAzMyA3IDY1IDMyIDM5IDE0MCAyOCA2IDk3IDEyNSAzNSAxMDcgMTg4IDg1IDEyNiAxMzUgCis5OCAxNzUgMTg5IDUwIDEyMSAxODQgMTE2IF4KKzQxMyAxIDEyNyAxNTMgNDUgMzIgMTY0IDEyMSAyMDMgNTggNTYgMTA4IDEzMCAxOTIgMTY2IDE2OCAxMjggMzkgMTg4IDUzIDEwMiA2OSAKKzE0OCAxNDEgMTggMTM5IDE5NyAxMDggOTcgMTMyIDc0IDI0IDE1NSA3MSA2MyA1OSA5NyAyMSAxOTQgMTgwIDYxIDQ1IDIwNCAxMzIgMjkgCiszMSA4NSA4OCAxODggMTY0IDE4NyAxMTggMzcgMTY3IDgyIDk0IDYwIDk4IDEgNDcgMTUyIDExMCAxNzIgODUgNTUgMTI4IDcyIDQzIAorMTE3IDQxIDQyIDExNiA2MSAxMiAxNDQgNDAgNjIgNTggMTE3IDE2OCAxNyAxNTkgMTM5IDE2NCA3NiA1IDE5MyAxMDEgNTYgMzAgMTA1IAorMzAgMTEgMTQzIDYwIDMyIDg2IDY4IDQxIDEzNiAzMSA0MCAxMjMgMTE4IDE4MSAxMzUgMTk1IDEyNyA1OSAxMzAgODEgNTMgMTQ3IDYyIAorMTMgMTI0IDk4IDM0IDc5IDM5IDQ5IDE0NSA1MyAxODAgOTQgMTA1IDkxIDcxIDIgMjcgNSA1NCAxOTMgNyAxNDEgNzkgMTk5IDg0IDc1IAorNzAgMTI4IDE5OSAxOTUgMTYwIDExOSAxNyAyMCA1NCAxMTUgMTg3IDE4NCAxMjkgMTQ2IDE5MyA0MCAyMDEgMTQzIDEzOCA1NyA0MyAxOCAKKzk0IDIwNCAzOCAxMTQgODAgMTc5IDExNCA0NyAxMTkgNTAgODAgMTE4IDgyIDE2MCAxNTIgNDkgMTEyIDE5OCA4OCAxNTUgMTA0IDk1IAorMTUxIDM2IDE5OSAxNjIgMTAwIDI3IDUwIDQ3IDg2IDE5NSAxNiAxNzkgODEgMTkyIDI3IDgzIDEwNyAxNTAgMTM0IDE5NCAxNDcgMSAKKzE1OCAzMiAxMzEgNjEgMTExIDExOSA4MyAxNDAgNSAyMSAxMzMgMTIwIDE3NCA3OCAyNiAxMzYgMTA5IDY1IDgwIDQwIDI5IDIwMyAyNSAKKzI0IDQ0IDE5MSAxNCAxNzAgNDMgMTYyIDM0IDE0MCA5OSAxNDEgMTEyIDU0IDE0OCA0MiA3MSA5NiAxMTkgMTYxIDE2NSAxNjcgMTQ4IAorMTg2IDExIDQgMTgwIDE4OCAxOTcgNDIgMTgyIDE4MSAxNjggNTAgMTQgMjYgMTAzIDQ5IDEgMTEzIDY3IDYxIDc4IDU5IDE5NiAxNzMgCiszMiA1MyA4IDE1NCAxNjkgMzAgNzIgMTc1IDE1MiAxNzYgODcgMzYgMTY2IDEwMiAzNiA4OCA3NyA3OSAxMzggMjQgMTg4IDEzMSAxMjcgCisyNiA3MCAxOTQgMTE0IDE0NiA2NiA5MyAxNTggOTMgMTkxIDEyNSA3OCA5MiA1MSA2MCAxNzYgMjYgNCA3NCAxMzUgMzUgMTIwIDEyOSAKKzExMyAxMzMgMTgxIDI5IDE3MCAxNzAgMTM3IDc3IDE5MCA0NiA0NSA3NyAxNTcgMTkxIDE4NiAxMzggMTg0IDE4IDYxIDE0NCAxNTEgCisxNzUgMTA3IDYgMTk0IDgxIDExNCAyIDEyNiAxNTcgOTcgNjYgMTU5IDczIDQ0IDk3IDk5IDE0IDEzNyAxMSA5OCA2NyAxMzkgMTAzIDE2IAorMTQ2IDIxIDEwMCA4OCAxMTAgMTM5IDI1IDE2OCAxODkgOTkgNDcgMTk3IDc1IDM3IDY4IDEwNyA1MSAxODcgMTUxIDY5IDU0IDQ5IDY3IAorMjggMTggMTcyIDUyIDIwMCA2NCAxMzMgNDIgMTQ5IDEyMSA3NiAxMTEgMTMgNTggMTgzIDgzIDE3MyA2NSAxMTMgMTAwIDEyMSAxNzAgCisyMDMgMTk3IDE2OSAxNTcgMTkgMjAyIF4KKzQzNCAxIDE5MyAxMTQgMTkwIDI2IDkyIDE0NSAxNzcgMTU1IDEyNSAxNDYgMzUgMjAwIDEyNCA0OCAyMSA0NiA4OSA0MCAxNTMgMTc4IAorNjIgNjUgMTk2IDg2IDE3NSA5MCA4MCA4OSA5OCAyMyAxNjkgNCA4OCAzMiAxMzUgMTM3IDI2IDc1IDExIDgxIDE3MiAzNCAxNTEgMTMwIAorMTA4IDEwNCAzNCAyMDAgMTgyIDgzIDEyIDE5NiAxMTIgODQgMjAyIDk3IDIwNiA2MCA3NSA2OSAxNTkgMTYzIDE5IDEzMSAxNzQgMTU3IAorNjYgMTc4IDE5NSAxMDQgNjYgMTYxIDEwNCA4IDEyNiA3MCA2NiAxMDMgMjYgMTcgMTQxIDkwIDIyIDU0IDY0IDM4IDE0NiAxNjggMzkgCis3MCAxOTkgMTQyIDE0NyA5MiA3MCA4IDI1IDM1IDc1IDE2MSAzIDEzOCA5MiAxMjggNDMgNTkgMTg1IDU1IDIwNSA5NSAxMDAgNzEgMTIzIAorMTczIDQyIDEyNiAxMjggMTQ0IDk0IDE3NiAyMDUgMjAgMTM5IDE0OSAxOTggNTkgMTY4IDE3MiAxMDkgMTEyIDkgMzMgMTAgNzMgMTU0IAorMzYgMTE1IDk3IDEzMSA5OSAxOTYgMTQ0IDQ1IDgxIDIyIDExMiAxNDIgNzIgMTMxIDE0OCA4MyAxNjIgMTYxIDc4IDE0MiAxNCA1MyAKKzE1NyAxNDEgMTM5IDc0IDI5IDE4MCAzNSA1OCAyNyAxMTUgMTk4IDEgOTAgMTM4IDE2NyA4OSAxNzMgMTkyIDQ4IDEzNyAxNTkgMTE0IAorMTMyIDE1NiA1OCAxNjAgMTU0IDY4IDc2IDE5IDU2IDUgNzAgMTQxIDY0IDExMyAxNTAgNDcgMTI5IDE4NCA3MyA5NiAxNjYgMTI0IDE1NSAKKzE1MSA1NSAxNDcgMTcgMTA5IDg2IDEwMCAxMjkgMjAxIDE2NCAxOTIgMTQ5IDcgMTkzIDU2IDExMiAyMDAgMTA3IDEyMiAxMzMgNjMgCisyMDYgMiA0MCA3OCA5IDE4MyAxNDAgODIgNCAxMyA3MSA0OCA0IDE2MyAyMDEgNTcgNjIgMTQwIDE1NyA4IDEwMCAyMDQgMTYyIDg2IAorMTE3IDEyIDg5IDE0NyA3NSAxNDQgMTIwIDg1IDEwOSAzNyA0OCAxNTQgODUgMiAxMTUgMzkgOTYgMTA4IDQ2IDE2NCAxIDMyIDEwMyAKKzE3NiAxNDcgMTUwIDEwNSAyMDcgMTAgMTUgMTE5IDIgMTczIDExNyA4NyA1MCA2OSA1MCAyMDIgMzkgMTcxIDY5IDEzMyA4OSA3MiAxMTQgCis1NyAxOTUgMTc5IDcwIDgzIDI5IDEyMiA2NyA4NSAxMzUgMTExIDE2MCAxNzEgMjAyIDE3MiAyIDE0NyAxODMgMzMgMTYwIDM4IDE2MyAKKzUxIDkyIDUzIDgyIDEzNyA1MiAxNDkgMTIzIDk4IDgxIDM5IDM4IDMwIDU1IDE0IDE4NiAxOTYgMTEgNiAzIDE1NSAxOCAxNiAyNiAxNTAgCisxODAgMTY4IDk3IDE0OCAyNSA4NCAxMjcgMTM2IDExOSAxMzUgNCAzMCAxNjIgMTQ0IDE5NSA0NiAzMSAxNzAgMTE5IDI4IDM5IDIxIAorMTA0IDE2NyAzMSA5NSAxNTggMTA2IDExNCAxMTUgNjUgMTcwIDEyIDYzIDczIDE3MSAxMjcgMyA4MCA1NyAxMzcgMTAxIDM2IDk4IDYgCis3OCAxMTYgMTA1IDE0OSAxNDAgMjQgMTc3IDIyIDEyOSA2OCAxNjggNzEgNzQgNzggNjcgMTAgMTc0IDI0IDI3IDU3IDEyMCAxMCAxNDggCisxNTggMTIzIDQwIDMgNSA1MyA3IDE3NiAxMzAgNTkgNTIgMTYgODQgMjAgNiAxMTAgNzcgMTkyIDc0IDQ2IDEwNiAxMzEgNDEgMTE4IAorMTUzIDE0NCBeCis0MzggMSA5OSAxODQgNjEgMTUgODUgMTM2IDU5IDEwMCAxNzIgMzcgMTgyIDk4IDk1IDc4IDQ0IDE3MyAzMCAyMDQgOTQgMTU2IDIwNiAKKzEyMyAxNjEgMTIwIDk2IDEzMiAxIDM3IDEzNCAxNDQgMTM0IDEyNiAxNjAgMTgwIDIxIDEzNiAyMDMgMTE5IDU1IDE1NiA0NCA3NyAxMjIgCis3MiAxOTAgMTI1IDEwIDEwNSAyNSAxMjggNzUgOTMgNjcgMTMgMjA1IDE5NiAxNCAzMSAxNzkgMTQyIDIwNiA3NSAyMDcgMTU5IDkxIDM4IAorOCAyOCA2NiA0MyAxNTAgMTg1IDE5MyA2MyAxMzUgNSAxNDMgOTggMTQzIDMyIDUgMTI1IDEyNCAxOTcgMTAzIDE0IDk3IDEwNyAxMDIgCis4NyAzIDE4IDE4NSA5NyAxNTUgNTYgNDggMTY1IDExMiAxNzggMTA2IDEzIDE1NyAzMiA1MyA3OSA4NSAxNDkgMTk3IDcgMTA2IDE3NSAKKzIwMyA3MSAxMDEgMTk1IDkyIDE5MyAxMjkgMTE2IDEyMiAyNCAyNiA3IDU4IDExIDMyIDExOSA3IDIwMiA4MyAxMjUgMjggNzkgMTgxIAorNTcgMTE5IDEyMSA4NCAxNjEgMTY4IDUwIDkzIDE2MyAxMzEgMTI3IDE1MyA0NSAxNyAxNDQgMTIxIDE5OCA0MyAzNiA5MyAxMTUgMTc3IAorMTY2IDE0OCAxMDggMjQgMTg4IDUzIDk3IDU5IDE0OCAxMjYgMjA4IDEzNCAxOTIgODggODcgMTEyIDY0IDE0IDE0NSA2MSA2MyAzOSA5NyAKKzExIDE5NCAxNjUgNDYgNDAgMTk5IDEzMiAxOSAxMSA4MCA3MyAxNzggMTU0IDE3NyAxMTggMzcgMTQ3IDcyIDk0IDYwIDg4IDIwMSA0NyAKKzE0MiAxMTAgMTY3IDc1IDQ1IDExMyA1MiA0MyAxMDIgMjEgMjIgMTExIDQxIDEyIDEzNCAzMCA0MiA0OCAxMTcgMTU4IDcgMTU0IDEyOSAKKzE2NCA3NiAxOTUgMTg4IDEwMSA1MSAyMCAxMDAgMTAgMjAxIDE0MyA1MCAzMiA3MSA1MyAzMSAxMzEgMzEgMzUgMTIzIDExMyAxNjYgCisxMzUgMTgwIDExNyA0NCAxMjUgNzYgMzMgMTQyIDYyIDMgMTE0IDkzIDE5IDU5IDM0IDM0IDEzMCAzOCAxNzAgNzQgMTA1IDkxIDU2IAorMTkyIDI3IDIwNSAzNCAxNzggMjAyIDEzMSA3OSAxOTkgODQgNjUgNTAgMTI4IDE4OSAxODUgMTQ1IDEwOSAxNyA0OSAxMDUgMTg3IDE3NCAKKzExNCAxNDEgMTgzIDIwIDE5NiAxMjggMTIzIDQ3IDI4IDE4IDg5IDE4OSAyMyA5OSA3MCAxNzkgOTQgNDIgMTE0IDQ1IDY1IDk4IDgyIAorMTUwIDEzNyAyOSAxMDIgMTgzIDY4IDE1MCA4OSA3NSAxNDEgMjEgMTg0IDE1NyA4MCA3IDQwIDM3IDg2IDE5MCAxNiAxNzQgNjYgMTg3IAorMTIgNjggMTAyIDEzNSAxMTQgMTg5IDEzNyAxOTEgMTQ4IDEyIDExNiA1NiA5NiAxMTkgNzMgMTMwIDIwMCA2IDExMyAxMDAgMTU0IDYzIAorMjYgMTE2IDEwNCA1MCA4MCAyNSAxNCAxOTMgMTUgMjQgNDQgMTkxIDQgMTUwIDIzIDE0NyAyNCAxNDAgOTkgMTM2IDEwNyA1NCAxMzMgCis0MiA2NiA5MSAxMDQgMTQ2IDE0NSAxNTcgMTI4IDE3MSAxIDE5OSAxODAgMTgzIDE4MiAzMiAxNjcgMTcxIDE2MyAzNSA5IDIxIDg4IDM5IAorMSAxMDMgNjIgNTEgNjggNTQgMTgxIDE1MyAyNyA0MyAxOTggMTM5IDE1NCAxNSA3MiAxNTUgMTUyIDE2NiA4NyAxNiAxNTYgOTIgMzEgCis4MyA3NyA3NCAxMTggMTkgMTczIDEyNiAyMDIgXgorNDMxIDAgMTAgNTQgMTc4IDEwNiAxMTQgMzQgODUgMTUwIDkzIDE3NSA5MyA3MCA3NiAyNyAzNiAxNTIgMjA3IDQgNDIgMTAzIDMgMTIwIAorOTcgMTEzIDEwOSAxODEgMjEwIDE2MiAxNTQgMTI5IDYxIDE2NiAzOCAxMyA1MyAxNDEgMTgzIDE4NiAxMzggMTg0IDEwIDYxIDExMiAKKzExOSAxNzUgMTA3IDYgMTcwIDgxIDExNCAyMDcgMTAyIDEyNSA2NSA1MCAxMzUgNzMgMjggNzMgNzUgMjAzIDExMyAxMSA5OCAzNSAxMTUgCis3MSA4IDE0NiAyMDIgNzYgODggMTAyIDEzOSAxIDE0NCAxODkgODMgMTUgMTgxIDUxIDEzIDYwIDc1IDUxIDE3OSAxNDMgMzcgMzAgNDkgCis1MSAyMCAyMDcgMTU2IDQ0IDE4NCA2NCAxMjUgMTggMTMzIDk3IDUyIDExMSAxOTQgNTggMTY3IDc1IDE0OSA0OSAxMDUgODQgMTEzIAorMTcwIDE3OSAxOTcgMTY5IDE0OSAyMDggNDEgMTc4IDk5IDE4MCAyMSA5MiAxNDUgMTcyIDE1NSAxMDUgMTMxIDMwIDIwOCAyMDAgMTE0IAorNDggMjEgMzEgNzkgNDAgMTQ4IDE3OCA1MiA1MCAxOTYgNzEgMTYwIDgwIDcwIDY5IDkzIDIzIDE1OSAyMDIgODMgMjIgMTE1IDEzMiA2IAorNjUgMjA5IDcxIDE2NyAxNCAxNTEgMTMwIDk4IDg5IDM0IDE5MCAxNjcgNjggMiAxODEgMTEyIDc5IDE5MiA4MiAxOTEgNDUgNTUgNDkgCisxNTkgMTQ4IDE5IDExNiAxNjkgMTQyIDYxIDE3MyAxODUgOTQgNDYgMTQ2IDEwNCAyMDYgMTI2IDU1IDU2IDkzIDE2IDEyIDEyMSA5MCAKKzE3IDQ5IDQ0IDE4IDEyNiAxNjMgMzkgNTAgMTg5IDEzNyAxNDcgODcgNjUgMyA1IDM1IDc1IDE1NiAxOTYgMTE4IDc3IDExOCAyMyA1NCAKKzE4NSA0MCAxOTUgOTUgOTAgNzEgMTEzIDE2MyAzMiAxMTYgMTA4IDE0NCA3NCAxNjYgMTkwIDE1IDEzNCAxMzQgMTg4IDM5IDE1OCAxNzIgCis5NCAxMDcgMjEyIDIzIDUzIDEzNCAzNiAxMDUgNzcgMTExIDg5IDE4NiAxMjQgMzUgNjEgNyAxMDIgMTMyIDY3IDEzMSAxMjggNzggMTYyIAorMTYxIDYzIDE0MiAxNCA0MyAxNDcgMTQxIDEyOSA1NCAxOSAxNzAgMjAgNDggNyA5NSAxOTggMTk5IDcwIDEyMyAxNTcgNzQgMTczIDE5MiAKKzI4IDEyNyAxMzkgMTA5IDEyNyAxNDYgNDMgMTQwIDEzOSA0OCA2MSAxNCAzNiA2MCAxMzYgNDkgOTggMTUwIDMyIDEwOSAxNzQgNjMgODEgCisxNjEgMTI0IDE0MCAxNDYgNTAgMTQyIDcgMTA5IDY2IDgwIDEyNCAyMDEgMTQ0IDE4MiAxNDkgMiAxODggNDYgOTIgMTg1IDg3IDExMiAKKzEzMyA0MyAyMDEgMjA1IDM1IDY4IDkgMTgzIDEyNSA3MiAxOTcgMyA2NiAzMyAyMDcgMTYzIDE5MSA1MiA1NyAxMzAgMTUyIDggODUgCisyMDQgMTU3IDgxIDEwNyAyMDUgODkgMTMyIDYwIDEyOSAxMTUgODUgODkgMjcgNDMgMTU0IDc1IDIxMCAxMTUgMjQgOTEgMTA4IDM2IAorMTU5IDIwOSAxNyAxMDMgMTc2IDEzNyAxNDAgODUgMTk3IDEwIDExNCAyMDAgMTY4IDExMiA3MiA0NSA2OSAxOTggNDAgMjAyIDI5IDE3MSAKKzY0IDExOCA4NCA1MiAxMDQgNDcgMTkwIDE3NCA3MCA4MyAyOSAxMTcgNjcgNzAgMTMwIDkxIDE1NSAxNjYgMTk3IDE2MiAyIDEyNyAxOTMgCisxNzMgODIgXgorNDY0IDEgMTYwIDMxIDE0OSAyMyA2NCAzMiA2MSAxMDkgNDUgMTIxIDEwMiA3NyA3NCAzMiAzOCAxNiA1NSA3IDE3MiAxODkgMTk4IDIwMCAKKzIxMSAxNDEgMTEgMiA1IDE0MyAxNTkgMTQ3IDkwIDEzNCAyNSA3MCAxMDYgMTIyIDEwNSAxMTQgMjEyIDMwIDE0MSAxMzAgMTk1IDM5IAorMjQgMTYzIDkxIDI4IDExIDcgNzYgMTY3IDE3IDgxIDEzNyA4NSA4NiA5NCA2NSAxNDkgNSA0MiA2NiAxNTcgMTEzIDIwNCA1OSA1NyAKKzEzNyA4MCAxNSA3MCAyMDcgNzggOTUgOTEgMTQyIDEzMyAxNyAxNzcgMjIgMTI5IDY4IDE2OCA0MyA3NCA1MCA2MCAxOTcgMTc0IDMgMTMgCiszNiAxMDYgMyAxMjcgMTU4IDExNiAyNiAxOTcgMTkyIDI1IDE5NCAxNTUgMTAyIDU5IDUyIDIwMyA1NiAyMCAyMTQgODIgNDkgMTcxIDY3IAorNDYgMTA2IDExNyAzNCA5MCAxMzkgOTYgOTQgMTc5IDU2IDE1IDY1IDEzNiA1NCAxMDAgMTU3IDE3IDE4MiA5MyA3NSA2MyAyNCAxNjggCisyNSAxODkgODQgMTU2IDIwMSAxMTggMTU2IDEwNSA5NiAxMTIgMjAxIDIyIDEzNCAxMzkgMTE0IDExNiAxNDUgMTc1IDExIDEyMSAxOTggCis5OSA0MCAxNTEgMzQgNzIgMTE3IDUyIDE5MCAxMDUgOTAgMjAgMTE4IDYwIDgzIDUyIDIwOCAyMDUgMTgxIDIwOSAxNiAxNzQgMTIyIAorMjA2IDcwIDIwMiAxNDQgNzEgMTggMjA4IDggNjYgMzggMTM1IDE3MCAxNzggNTMgMTE1IDUgMTM4IDg4IDEyMyAxNyAyMDAgMTE1IDExOSAKKzE4MiA5OCA5IDg3IDk3IDEwMiA3MiAzIDggMTgwIDgyIDE0NSA1NiAzMyAxNjUgMTAyIDE3MyA5NiAyMTMgMTU3IDEyIDMzIDY5IDgwIAorMTI5IDE5MiAyIDEwMSAxNjUgMjAzIDUxIDg2IDE5MCA4NyAxOTMgMTI0IDExNiAxMjIgNCAyMSA3IDUzIDIxMSAyNyAxMDQgMjA3IDE5NyAKKzczIDEyNSAyMyA1OSAxNzYgMzcgMTE0IDExMSA3NCAxNTEgMTUzIDUwIDczIDE0OCAxMTYgMTI3IDE1MyA0NSAyIDEyNCAxMjEgMTkzIAorMjggMTYgNzggMTAwIDE2MiAxNjYgMTI4IDg4IDkgMTg4IDUzIDkyIDQ5IDE0OCAxMTEgMTkzIDEyOSAxODcgNjggNzcgOTIgNTQgNCAKKzEzNSA1MSA2MyAxOSA5NyAxIDE5NCAxNTAgMzEgMzUgMTk0IDEzMiA5IDIwNiA3NSA1OCAxNjggMTQ0IDE2NyAxMTggMzcgMTI3IDYyIAorOTQgNjAgNzggMTk2IDQ3IDEzMiAxMTAgMTYyIDY1IDM1IDk4IDMyIDQzIDg3IDEgMiAxMDYgMjEgMTIgMTI0IDIwIDIyIDM4IDExNyAKKzE0OCAyMTIgMTQ5IDExOSAxNjQgNzYgMTgwIDE4MyAxMDEgNDYgMTAgOTUgMjA1IDE4NiAxNDMgNDAgMzIgNTYgMzggMjEgMTI2IDMxIAorMzAgMTIzIDEwOCAxNTEgMTM1IDE2NSAxMDcgMjkgMTIwIDcxIDEzIDEzNyA2MiAyMDggMTA0IDg4IDQgMzkgMjkgMTkgMTE1IDIzIDE2MCAKKzU0IDEwNSA5MSA0MSAxNzcgMjcgMjAwIDE0IDE2MyAxOTIgMTIxIDc5IDE5OSA4NCA1NSAzMCAxMjggMTc5IDE3NSAxMzAgOTkgMTcgCisxOTUgNDQgOTUgMTg3IDE2NCA5OSAxMzYgMTczIDE5MSAxMTMgMTA4IDM3IDEzIDE4IDg0IDE3NCA4IDg0IDYwIDE3OSA3NCAzNyAxMDkgCis0MCA1MCA3OCA4MiAxNDAgMTIyIDkgOTIgMTY4IDQ4IDE0NSA3NCA1NSAxMzEgNiAxNjkgMTUyIDYwIDIwMiAzMCAyNyA4NiAxODUgMTYgCisxNjkgNTEgMTgyIDIxMiA1MyA5NyAxODUgXgorNDUyIDEgODIgMTgxIDEyMSAxNjcgMTMyIDE5OCA5MiA0OCA3MiAxMTkgNTcgMTE0IDE4NCAyMDAgODEgNjggMTIyIDM5IDI2IDg0IDk2IAorMjYgODAgMSAyMDggMTc3IDIxNyAyNCA0NCAxOTEgMjA2IDExOCAyMDkgMTIzIDggMTQwIDk5IDEyOCA5OSA1NCAxMDkgNDIgNTggODMgCis4MCAxMjIgMTEzIDE0MSA5NiAxNDcgMjAzIDE4MyAxODAgMTc1IDE1OCAxNiAxNDMgMTU1IDE1NSAxMSAxIDEzIDY0IDIzIDEgODcgNTQgCiszNSA1MiA0NiAxNTcgMTIxIDE5IDI3IDE3NCAxMTUgMTMwIDIwOSA3MiAxMjMgMTUyIDE1MCA4NyAyMDIgMTQwIDc2IDIzIDc1IDc3IDY2IAorODYgMTEgMTQ5IDExOCA4OCA0NCAxNjggMTAxIDk0IDE0IDgwIDE0NSA5MyAxNjUgNzMgNjUgNjYgMTIgMjEgMTM3IDE5MiA0IDIyIDgzIAorMjAxIDEyMCA3NyAxMTMgOTQgMTgxIDE5NSAxNTcgMTQ0IDEyNCA1MSAxNTEgMzMgMjExIDM4IDEzMSAxNzggMTg2IDEzOCAxODQgNSA2MSAKKzkyIDk5IDE3NSAxMDcgNiAxNTUgODEgMTE0IDIwNyA4NyAxMDUgNDUgNDAgMTIwIDczIDE4IDU4IDYwIDE5MyA5OCAxMSA5OCAxNSAxMDAgCis1MSAzIDE0NiAxODcgNjEgODggOTcgMTM5IDIwNCAxMjkgMTg5IDczIDIxMyAxNzEgMzYgMjE2IDU1IDU1IDUxIDE3NCAxMzggMTcgMTUgCis0OSA0MSAxNSAxOTcgMTQ2IDM5IDE3NCA2NCAxMjAgMyAxMjMgODIgMzcgMTExIDE3OSA1OCAxNTcgNzAgMTM0IDM5IDEwMCA3NCAxMDggCisxNzAgMTY0IDE5NyAxNjkgMTQ0IDE5OCA0MSAxNjMgODQgMTcwIDE2IDkyIDE0NSAxNjcgMTU1IDg1IDExNiAyNSAyMDggMjAwIDEwNCAKKzQ4IDIxIDE2IDY5IDQwIDE0MyAxNzggNDIgMzUgMTk2IDU2IDE0NSA3MCA2MCA0OSA4OCAyMyAxNDkgMTkyIDc4IDEyIDk1IDEyNyAyMDQgCis1NSAxOTkgNjEgMTYyIDIxMiAxNTEgMTMwIDg4IDc0IDM0IDE4MCAxNTIgNTMgMjEwIDE2NiAxMTIgNzQgMTgyIDY3IDE3NiAzMCAzNSAKKzI5IDE1OSAxMzMgMTkgMTAxIDE2NCAxMjcgNTYgMTY4IDE3NSA4NCAyNiAxMzEgMTA0IDE5NiAxMjYgNDAgNDYgODMgNiA3IDEwMSA5MCAKKzEyIDQ0IDI0IDIxNiAxMDYgMTU4IDM5IDMwIDE3OSAxMzIgMTQ3IDgyIDYwIDIxNiAyMDMgMzUgNzUgMTUxIDE4MSA5OCA2MiAxMDggMyAKKzQ5IDE4NSAyNSAxODUgOTUgODAgNzEgMTAzIDE1MyAyMiAxMDYgODggMTQ0IDU0IDE1NiAxNzUgMTAgMTI5IDExOSAxNzggMTkgMTQ4IAorMTcyIDc5IDEwMiAyMDcgMTMgMjA4IDMzIDExNCAzNiA5NSA1NyA5MSA3OSAxNzYgMTA0IDI1IDQxIDIxMCA5MiAxMjIgNjIgMTMxIDEwOCAKKzczIDE2MiAxNjEgNDggMTQyIDE0IDMzIDEzNyAxNDEgMTE5IDM0IDkgMTYwIDUgMzggMjA1IDc1IDE5OCAxODkgNTAgMTA4IDE0NyA1OSAKKzE3MyAxOTIgOCAxMTcgMTE5IDEwNCAxMjIgMTM2IDI4IDEyMCAxMjQgMjggNDYgOSAxNiAyMTMgNTAgMTMxIDM0IDgzIDE1MCAxNyA4OSAKKzE2NCA1MyA2NiAxNTYgMTI0IDEyNSAxNDEgNDUgMTM3IDIxNSAxMDkgNDYgNjAgMTE5IDIwMSAxMjQgMTcyIDE0OSAyMTUgMTgzIDM2IAorNzIgMTcwIDY3IDEwMiAxMzMgMjMgMTk2IDIwMCAzMCA1OCA5IDE4MyAxMTAgNjIgMTgyIDIxMSA2MSAxOCAyMDIgMTYzIDk3IF4KKzQ2MyAxIDQ1IDUwIDExNiAxNDUgOCA2NCAyMDQgMTUwIDc0IDkzIDE4NCA4OSAxMTEgMzkgMTA4IDEwOCA4NSA2MSAxMyAzNiAxNTQgNjEgCisyMTAgMTE1IDMgODQgMTA4IDIyIDE1MiAyMDkgMjE2IDEwMyAxNzYgMTIzIDEyNiA1NyAxODMgMTAgMTk5IDEwNyAxODYgMTYxIDEwNSAKKzUxIDM4IDY5IDE4NCAyNiAyMDIgMTUgMTcxIDU3IDk3IDc3IDI0IDkwIDMzIDE4MyAxNjcgNzAgODMgMjkgMTEwIDY3IDQ5IDEyMyA2MyAKKzE0OCAxNTkgMTkwIDE0OCAyIDk5IDE3MiAxNTkgMzMgMTYwIDI2IDEzOSAzIDQ0IDE3IDQ2IDg5IDQwIDEwMSA4NyA2MiA2OSAyNyAzOCAKKzYgNTUgMiAxNjIgMTg0IDE4MyAxOTAgMjExIDEzMSA2IDIxMiAyMTAgMTM4IDE0NCAxMzIgODUgMTI0IDI1IDYwIDkxIDExMiA5NSA5OSAKKzIxMiAzMCAxMjYgMTIwIDE5NSAzNCAxOSAxNTggNzEgMjggMjExIDIxNyA1NiAxNjcgNyA3MSAxMjIgNzAgNjYgNzkgNjUgMTM0IDI3IAorNjEgMTQ3IDEwMyAxOTkgNDQgNTcgMTM3IDY1IDUwIDIwMiA3OCA4MCA4MSAxMzcgMTI4IDEyIDE3NyAyMiAxMjkgNjggMTY4IDIzIDc0IAorMzAgNTUgMTgyIDE3NCAyMDggMyAyMSA5NiAyMTggMTEyIDE1OCAxMTEgMTYgMTg3IDE3NyA1IDE3OSAxNDAgODIgNTkgNTIgMTg4IDM2IAorMjAgMjE0IDYyIDI5IDE1NiA2MiA0NiAxMDYgMTA3IDI5IDcwIDEyOSA5MSA4OSAxNzQgNTEgMTUgNDUgMTM2IDQ5IDEwMCAxNDIgMjE3IAorMTgyIDg4IDU1IDQ4IDQgMTYzIDIwIDE3NCA3NCAxNTYgMTk2IDExMyAxNTEgOTAgOTYgOTIgMTkxIDcgMTM0IDEzNCA5NCAxMDYgMTMwIAorMTcwIDEgMTA2IDE5MyA3OSAyNSAxNDYgMjQgNjcgMTEyIDMyIDE5MCA4NSAyMTAgNzUgMTUgMTA4IDQ1IDczIDM3IDE5MyAyMDUgMTY2IAorMTk0IDEgMTY5IDEwMiAyMDYgNjUgMTk3IDEyOSA1MSAyMTggMTk4IDIwOCA2NiAzMyAxMjAgMTU1IDE2MyA0MyA5NSA1IDEzMyA3OCAKKzEwMyAyIDE4NSAxMDUgMTE0IDE2NyA5MyA0IDc3IDg3IDEwMiA1NyAzIDIxOCAxNzUgNjcgMTM1IDU2IDE4IDE2NSA5MiAxNjggODYgCisyMDMgMTU3IDIxMiAxMyA1OSA3NSAxMDkgMTg3IDIxNyA5NiAxNTUgMjAzIDMxIDcxIDE4NSA4MiAxOTMgMTE5IDExNiAxMjIgMjA0IDE2IAorNyA0OCAyMDEgMjIgODkgMTk3IDE5MiA2MyAxMjUgMTggMzkgMTcxIDE3IDEwOSAxMDEgNjQgMTQxIDEzOCA1MCA1MyAxMzMgMTAxIDEyNyAKKzE1MyA0NSAyMDcgMTA0IDEyMSAxODggMTMgMjE2IDYzIDg1IDE0NyAxNjYgMTA4IDY4IDIxNCAxODggNTMgODcgMzkgMTQ4IDk2IDE3OCAKKzEyNCAxODIgNDggNjcgNzIgNDQgMjE0IDEyNSA0MSA2MyAyMTkgOTcgMjExIDE5NCAxMzUgMTYgMzAgMTg5IDEzMiAyMTkgMTkxIDcwIAorNDMgMTU4IDEzNCAxNTcgMTE4IDM3IDEwNyA1MiA5NCA2MCA2OCAxOTEgNDcgMTIyIDExMCAxNTcgNTUgMjUgODMgMTIgNDMgNzIgMjAxIAorMjAyIDEwMSAxIDEyIDExNCAxMCAyIDI4IDExNyAxMzggMjA3IDE0NCAxMDkgMTY0IDc2IDE2NSAxNzggMTAxIDQxIDkwIDE5MCAxNzEgCisxNDMgMzAgMzIgNDEgMjMgMTEgMTIxIDMxIDI1IDEyMyAxMDMgMTM2IDEzNSAxNTAgOTcgMTQgMTE1IDY2IDIxMyAxMzIgNjIgMjAzIDk0IAorODMgMjA5IDE5IDI0IDQgMTAwIDggMTUwIDE2MCBeCis0NzQgMCAxMDUgOTEgMjAgMTU2IDI3IDE5MyAyMDggMTQyIDE3OCAxMDcgNzkgMTk5IDg0IDQxIDIgMTI4IDE2NSAxNjEgMTA5IDg1IDE3IAorMTc0IDM3IDgxIDE4NyAxNTAgNzggMTI5IDE1OSAxOTQgMTg0IDkyIDg3IDIzIDIxNCAxOCA3NyAxNTMgMjA5IDYzIDQ2IDE3OSA0NiAzMCAKKzEwMiAzMyAyOSA1MCA4MiAxMjYgMTAxIDIwMyA3OCAxNDcgMjAgMTM4IDUzIDI3IDExNyAyMDcgMTQ4IDE0NSAzMiAxODEgMTYgMTMgODYgCisxNzggMTYgMTYyIDMwIDE3NSAxOTggMzIgOTAgOTkgNjYgMTc3IDExMyAxNTUgMTI0IDE4NiA4MCA0NCA2MCAxMTkgNDkgMTA2IDE3NiAKKzE5MiA2NSA1MiAxMDYgMjcgMjYgNjggOTIgMTQgODAgMjExIDIwMCAxNjkgMjEzIDI0IDQ0IDE5MSAyMDIgMTAyIDE5NyAxMTEgMTQwIAorOTkgMTI0IDk1IDU0IDk3IDQyIDU0IDc5IDY4IDExMCA5NyAxMzMgODAgMTM1IDE5OSAxNzUgMTgwIDE3MSAxNDYgOCAxMzEgMTQ3IDE1MSAKKzIyMSAyMTkgOSA1MiAxNSAxIDc5IDUwIDI3IDQ0IDQyIDE0NSAxMDUgMTUgMTkgMTYyIDEwMyAxMTggMjAxIDcyIDEwNyAxNTIgMTQyIAorODcgMTkwIDEzMiA2OCAxOSA3MSA3NyA2MiA3MCA3IDEzNyAxMTQgNzYgMjE0IDM2IDE2MCA5NyA3OCAyMjAgNzYgMTQxIDkzIDE1NyA1NyAKKzYxIDU4IDkgMTI1IDE4MCA0IDYgNjcgMTg5IDEyMCA2MSAxMTMgODIgMTgxIDE4MyAxNTMgMTM2IDEyMCA0MyAxMzkgMjkgMTk5IDI2IAorMTIzIDE3NCAxODYgMTM4IDE4NCAxIDYxIDc2IDgzIDE3NSAxMDcgNiAxNDMgODEgMTE0IDIwNyA3NSA4OSAyOSAzMiAxMDggNzMgMTAgCis0NiA0OCAxODUgODYgMTEgOTggMjIxIDg4IDM1IDIyMSAxNDYgMTc1IDQ5IDg4IDkzIDEzOSAxOTYgMTE3IDE4OSA2NSAyMDEgMTYzIDI0IAorMjA4IDUxIDM5IDUxIDE3MCAxMzQgMSAzIDQ5IDMzIDExIDE4OSAxMzggMzUgMTY2IDY0IDExNiAyMTMgMTE1IDcwIDI1IDExMSAxNjcgCis1OCAxNDkgNjYgMTIyIDMxIDk2IDY2IDEwNCAxNzAgMTUyIDE5NyAxNjkgMTQwIDE5MCA0MSAxNTEgNzIgMTYyIDEyIDkyIDE0NSAxNjMgCisxNTUgNjkgMTA0IDIxIDIwOCAyMDAgOTYgNDggMjEgNCA2MSA0MCAxMzkgMTc4IDM0IDIzIDE5NiA0NCAxMzMgNjIgNTIgMzMgODQgMjMgCisxNDEgMTg0IDc0IDQgNzkgMTIzIDE5MiA0NyAxOTEgNTMgMTU4IDIwMCAxNTEgMTMwIDgwIDYyIDM0IDE3MiAxNDAgNDEgMjA2IDE1NCAKKzExMiA3MCAxNzQgNTUgMTY0IDE4IDE5IDEzIDE1OSAxMjEgMTkgODkgMTYwIDExNSA1MiAxNjQgMTY3IDc2IDEwIDExOSAxMDQgMTg4IAorMTI2IDI4IDM4IDc1IDIyMCAzIDg1IDkwIDggNDAgOCAyMDQgOTAgMTU0IDM5IDE0IDE3MSAxMjggMTQ3IDc4IDU2IDIxNiAxOTEgMzUgCis3NSAxNDcgMTY5IDgyIDUwIDEwMCAyMDkgNDUgMTg1IDEzIDE3NyA5NSA3MiA3MSA5NSAxNDUgMTQgOTggNzIgMTQ0IDM4IDE0OCAxNjMgCis2IDEyNSAxMDcgMTcwIDMgMTQwIDE3MiA2NyA5OCAyMDMgNSAyMDQgMTcgOTggMzYgODcgNDEgNzUgNzEgMTY4IDg4IDE3IDI1IDIwMiAKKzg0IDExNCA1OCAxMzEgOTIgNjkgMTYyIDE2MSAzNiAxNDIgMTQgMjUgMTI5IDE0MSAxMTEgMTggMSAxNTIgMjE1IDMwIDE5MyA1OSAxOTggCisxODEgMzQgOTYgMTM5IDQ3IDE3MyAxOTIgMjE0IDEwOSAxMDMgMTAwIDExOCAxMjggMTYgMTA0IDExMiAxOTggXgorNDY2IDAgMjUgMiAyMTMgMjEzIDM2IDEyNCAxMyA2MiAxNTAgMjIxIDYxIDE1MCAzOSA0NSAxNDkgMTI0IDEwNCAxMzQgMzggMTMwIDIwOCAKKzEwOSAxOCAzMiAxMTIgMjAxIDk2IDE1OCAxNDkgMjE1IDE3NiAyMiA0NCAxNDkgMzkgODggMTMzIDIyMCAxODkgMTkzIDIzIDQ0IDkgCisxODMgODkgNDggMTYxIDIwNCA1NCAyMjIgMTk1IDE2MyAxNjcgNDAgNDUgMTA2IDE0MCA4IDQ5IDIwNCAxNDUgNjkgODMgMTY5IDg5IDk2IAorMjQgOTMgMTAzIDg1IDQxIDMgMzEgMTU0IDUxIDIxMCAxMTUgMjEzIDc5IDEwOCAxMiAxNDcgMjA5IDIwNiAxMDMgMTc2IDExMyAxMTYgCiszNyAxNzMgMTAgMTg5IDEwMiAxNzYgMTU2IDEwMCAzNiAzMyA2OSAxNzQgMTYgMjAyIDUgMTcxIDUyIDgyIDcyIDQgODAgMjMgMTc4IAorMTYyIDcwIDgzIDI5IDEwNSA2NyAzNCAxMTggNDMgMTQzIDE1NCAxODUgMTM4IDIgNzkgMTU3IDE0OSAzMyAxNjAgMjEgMTI5IDIwOCAyNCAKKzIgMzEgNjkgMzUgODEgNzIgNDcgNjQgMjIgMzggMjIxIDU1IDIyMiAxNTIgMTc5IDE2OCAxODAgMjExIDEyMSAxIDIwNyAyMDAgMTMzIAorMTI5IDExNyA4MCAxMTQgMjUgNTAgNzYgMTAyIDg1IDg0IDIxMiAzMCAxMTEgMTEwIDE5NSAyOSAxNCAxNTMgNTEgMjggMTk2IDIxMiAzNiAKKzE2NyAyMjIgNjEgMTA3IDU1IDQ2IDY0IDY1IDExOSAyMjAgMTIgNTYgMTM3IDkzIDE5NCAyOSA1NyAxMzcgNTAgMjEwIDMwIDE5NyA3OCAKKzY1IDcxIDEzMiAxMjMgNyAxNzcgMjIgMTI5IDY4IDE2OCAzIDc0IDEwIDUwIDE2NyAxNzQgMTk4IDIxOCA2IDg2IDIxOCA5NyAxNTggCisxMDYgNiAxNzcgMTYyIDIxMCAxNjQgMTI1IDYyIDU5IDUyIDE3MyAxNiAyMCAyMTQgNDIgOSAxNDEgNTcgNDYgMTA2IDk3IDI0IDUwIAorMTE5IDg2IDg0IDE2OSA0NiAxNSAyNSAxMzYgNDQgMTAwIDEyNyAyMDIgMTgyIDgzIDM1IDMzIDIwOSAxNTggMTUgMTU5IDY0IDE1NiAKKzE5MSAxMDggMTQ2IDc1IDk2IDcyIDE4MSAyMTcgMTM0IDEyOSA3NCA5NiAxMTUgMTY1IDIxNiA5MSAxODggNTkgMTAgMTQxIDE0IDYyIAorMTA3IDEyIDE5MCA2NSAyMDUgNjAgMTAgOTggMzAgNjMgMjIgMTc4IDIwNSAxNTEgMTc5IDIxMSAxNjQgODIgMjA2IDYwIDE5MiAxMTQgCiszMSAyMDMgMTg4IDE5MyA2NiAyOCAxMDUgMTQwIDE0OCAzMyA3NSA1IDEyOCA2OCA4MyAyMTIgMTcwIDk1IDEwOSAxNTIgODggMjI0IDY3IAorNzcgMTAyIDQyIDMgMjEzIDE3MCA1MiAxMjUgNTYgMyAxNjUgODIgMTYzIDc2IDE5MyAxNTcgMTk3IDIxOCA0OSA3MCA4OSAxODIgMjE3IAorOTEgMTQ1IDIwMyAxMSA1NiAxODAgNzcgMTkzIDExNCAxMTYgMTIyIDE4OSAxMSA3IDQzIDE5MSAxNyA3NCAxODcgMTg3IDUzIDEyNSAxMyAKKzE5IDE2NiAyMjIgMTA0IDkxIDU0IDEzMSAxMjMgNTAgMzMgMTE4IDg2IDEyNyAxNTMgNDUgMTk3IDg0IDEyMSAxODMgMjIzIDIwMSA0OCAKKzcwIDEzMiAxNjYgODggNDggMjA0IDE4OCA1MyA4MiAyOSAxNDggODEgMTYzIDExOSAxNzcgMjggNTcgNTIgMzQgMjA5IDExNSAzMSA2MyAKKzIwNCA5NyAyMDYgMTk0IDEyMCAxIDI1IDE4NCAxMzIgMjE0IDE3NiA2NSAyOCAxNDggMTI0IDE0NyAxMTggMzcgODcgNDIgOTQgNjAgNTggCisxODYgNDcgMTEyIDExMCAxNTIgNDUgMTUgNjggMjE3IDQzIDU3IDE4NiAxODcgMjE4IF4KKzQ3NyAxIDIwMCAxMiAxMDAgMjIzIDIwMSAxNCAxMTcgMTI0IDIwMCAxMzcgOTUgMTY0IDc2IDE0NCAxNzEgMTAxIDM0IDIxMyA4MyAxNjkgCisxNTAgMTQzIDE2IDMyIDIwIDIgMjI0IDExNCAzMSAxOCAxMjMgOTYgMTE1IDEzNSAxMjkgODMgMjIwIDEwOCA1OSAxOTIgMTI1IDYyIAorMTk2IDgwIDc2IDE5NSAyMTggMTcgMjEwIDc5IDIxNCAxMzYgNiAxMDUgOTEgNSAxNDEgMjcgMTg4IDE5MyAxMjcgMTY4IDk3IDc5IDE5OSAKKzg0IDMxIDIwOSAxMjggMTU1IDE1MSA5NCA3NSAxNyAxNTkgMzIgNzEgMTg3IDE0MCA2MyAxMjQgMTQ5IDE3OSAxNzkgNzcgNzIgMTMgCisyMDQgMTggNzIgMTM4IDE5OSA0OCAzNiAxNzkgMjYgMjUgOTcgMjggMTQgMzAgODIgMTE2IDg2IDE4OCA2OCAxMzIgMTMzIDM4IDcgMTA3IAorMTk3IDEzMyAxNDAgMTIgMTY2IDYgMyA4NiAxNzMgMTYgMTU3IDE1IDE3MCAxODggMTcgODUgODQgNDYgMTcyIDEwMyAxNDAgMTE0IDE3MSAKKzY1IDM5IDQ1IDExOSAzOSA5NiAxNjYgMTgyIDQ1IDMyIDg2IDEyIDI2IDQ4IDg3IDIyNiA4MCAyMDEgMTkwIDE1OSAyMDggMjQgNDQgCisxOTEgMTk3IDgyIDE4MiA5NiAyMTcgMTQwIDk5IDExOSA5MCA1NCA4MiA0MiA0OSA3NCA1MyA5NSA3NyAxMjMgNjAgMTIwIDE5NCAxNjUgCisxODAgMTY2IDEzMSAyMjUgMTE2IDEzNyAxNDYgMjExIDIxOSA0IDM3IDUgMSA2OSA0NSAxNyAzNCAzNyAxMzAgODUgMTAgOSAxNDcgODggCisxMDMgMTkxIDcyIDg3IDE1MiAxMzIgODcgMTc1IDEyMiA1OCAxNCA2NiA3NyA1NyA1MCAyIDEyMiAxMDkgNjEgMjA5IDI2IDE1MCA5MiAKKzU4IDIwNSA3MSAxMzYgOTMgMTQ3IDM3IDU2IDQ4IDIxMiAyMjEgMTEwIDE2NSA0IDIxMyA0NyAxNzQgMTIwIDQxIDExMyA2NyAxODEgCisxNjggMTQ4IDEyNiAxMTUgMzMgMTI0IDI0IDE4NCAxMSAxMTMgMTY5IDE4NiAxMzggMTg0IDIyMyA2MSA1NiA2MyAxNzUgMTA3IDYgMTI4IAorODEgMTE0IDIwNyA2MCA2OSA5IDIyIDkzIDczIDMxIDMzIDE3NSA3MSAxMSA5OCAyMDYgNzMgMTUgMjIxIDE0NiAxNjAgMzQgODggODggCisxMzkgMTg2IDEwMiAxODkgNTUgMTg2IDE1MyA5IDE5OCA0NiAxOSA1MSAxNjUgMTI5IDIwOCAyMTUgNDkgMjMgNiAxNzkgMTI4IDMwIAorMTU2IDY0IDExMSAyMDMgMTA1IDU1IDEwIDExMSAxNTIgNTggMTM5IDYxIDEwNyAyMSA5MSA1NiA5OSAxNzAgMTM3IDE5NyAxNjkgMTM1IAorMTgwIDQxIDEzNiA1NyAxNTIgNyA5MiAxNDUgMTU4IDE1NSA0OSA4OSAxNiAyMDggMjAwIDg2IDQ4IDIxIDIxNiA1MSA0MCAxMzQgMTc4IAorMjQgOCAxOTYgMjkgMTE4IDUyIDQyIDEzIDc5IDIzIDEzMSAxNzQgNjkgMjIxIDU5IDExOCAxNzcgMzcgMTgxIDQzIDE1MyAxODUgMTUxIAorMTMwIDcwIDQ3IDM0IDE2MiAxMjUgMjYgMjAxIDEzOSAxMTIgNjUgMTY0IDQwIDE0OSAzIDIyNiAyMjAgMTU5IDEwNiAxOSA3NCAxNTUgCisxMDAgNDcgMTU5IDE1NyA2NiAyMTcgMTA0IDEwNCAxNzggMTI2IDEzIDI4IDY1IDIxNSAyMjUgNjUgOTAgMyAzNSAyMTUgMTg5IDcwIAorMTQ5IDM5IDIyMSAxNjEgMTIzIDE0NyA3MyA1MSAyMTYgMTc2IDM1IDc1IDE0MiAxNTQgNjIgMzUgOTAgMTk0IDQwIDE4NSAyMjUgMTY3IAorOTUgNjIgNzEgODUgMTM1IDQgODggNTIgMTQ0IDE4IDEzOCAxNDggMSAxMjAgOTIgMTYwIDIxMCAxMzAgMTcyIDUyIDkzIDE5OCAyMjIgCisxOTkgMjI0IDE5IF4KKzQ3OSAwIDM2IDczIDEzIDQ3IDU3IDE1NCA2MCAzIDIyNiAxODggNzAgMTAwIDUxIDEzMSA2NCA2MiAxNjIgMTYxIDE1IDE0MiAxNCAxMSAKKzExNSAxNDEgOTcgMjE5IDIxNiAxMzggMjAxIDE2IDE3MiAzMSAxOTggMTY3IDYgNzUgMTI1IDI2IDE3MyAxOTIgMTkzIDk1IDc1IDkzIAorMTExIDExNCAyMjQgNzYgOTEgMjEzIDEzIDIyNyAyMDEgMjEzIDI4IDEyMCAxIDUwIDE1MCAyMTMgNDUgMTQyIDMxIDMzIDE0NSAxMjQgCis5MiAxMzAgMzQgMTI2IDIwNCAxMDkgMiAxNiAxMDggMjAxIDgwIDE1MCAxNDkgMjE1IDE3MiAxNCAyOCAxMzcgMjMgODAgMTMzIDIwOCAKKzE4NSAxODkgMTkgMzYgOSAxODMgNzcgNDAgMTQ5IDIwMCA1MCAyMTQgMTkxIDE2MyAxNTkgMzYgNDEgOTggMTM2IDggMzcgMjA0IDE0MSAKKzY1IDc1IDE1NyA4OSA4NCAxMiA4MSA5OSA4NSAyNSAyMjQgMjcgMTU0IDQzIDIxMCAxMTUgMjA1IDc1IDEwOCA0IDE0MyAyMDkgMTk4IAorMTAzIDE3NiAxMDUgMTA4IDIxIDE2NSAxMCAxODEgOTggMTY4IDE1MiA5NiAyNCAyOSA2OSAxNjYgOCAyMDIgMjI2IDE3MSA0OCA3MCA2OCAKKzIxNyA3MiAxNSAxNzQgMTU4IDcwIDgzIDI5IDEwMSA2NyAyMiAxMTQgMjcgMTM5IDE1MCAxODEgMTMwIDIgNjMgMTQ1IDE0MSAzMyAxNjAgCisxNyAxMjEgMTk2IDggMjE5IDE5IDUzIDMxIDY1IDYwIDM1IDYwIDE4IDM4IDIxNyA1NSAyMjIgMTQ0IDE3NSAxNTYgMTcyIDIxMSAxMTMgCisyMjYgMjAzIDE5MiAxMjkgMTE3IDEwNSA3NiAxMDYgMjUgNDIgNjQgOTQgNzcgNzIgMjEyIDMwIDk5IDEwMiAxOTUgMjUgMTAgMTQ5IDM1IAorMjggMTg0IDIwOCAyMCAxNjcgMjE4IDUzIDk1IDQzIDMwIDUyIDY1IDEwNyAyMjAgNTIgMTI5IDg1IDE5MCAxNyA1NyAxMzcgMzggMjAyIAorMTQgMTkzIDc4IDUzIDYzIDEyOCAxMTkgMyAxNzcgMjIgMTI5IDY4IDE2OCAyMTYgNzQgMjIzIDQ2IDE1NSAxNzQgMTkwIDIxNCAyMjMgCis3OCAyMTggODUgMTU4IDEwMiAyMjcgMTY5IDE1MCAxOTggMTUyIDExMyA0NiA1OSA1MiAxNjEgMjAgMjE0IDI2IDIyMiAxMjkgNTMgNDYgCisxMDYgODkgMjAgMzQgMTExIDgyIDgwIDE2NSA0MiAxNSA5IDEzNiA0MCAxMDAgMTE1IDE5MCAxODIgNzkgMTkgMjEgMTk3IDE1NCAxMSAKKzE0NyA1NiAxNTYgMTg3IDEwNCAxNDIgNjMgOTYgNTYgMTczIDIwOSAxMzQgMTI1IDU4IDg4IDEwMyAxNjEgMjEyIDc5IDE4NCA0MyAyMjcgCisxMzcgNiA1OCAxMDMgMjI1IDE5MCA0OSAyMDEgNDggNiA5MCAxOCA1NSAxMCAxNjYgMjA1IDEzOSAxNjcgMjAzIDE2MCA2NiAyMDYgNTYgCisxODggMTAyIDE1IDE5MSAxODAgMTgxIDY2IDI0IDkzIDEyOCAxMzYgMjUgNTkgNSAxMjQgNjAgNjcgMjA0IDE1OCA4NyAxMDUgMTQwIDg0IAorMjI0IDU5IDY5IDEwMiAzMCAzIDIwOSAxNjYgNDAgMTE3IDU2IDIyMCAxNjUgNzQgMTU5IDY4IDE4NSAxNTcgMTg1IDIwNiA0MSA2NiA3MyAKKzE3OCAyMTcgODcgMTM3IDIwMyAyMjQgNDQgMTc2IDczIDE5MyAxMTAgMTE2IDEyMiAxNzcgNyA3IDM5IDE4MyAxMyA2MiAxNzkgMTgzIAorNDUgMTI1IDkgMyAxNjIgMjEwIDEwMCA4MyA0NiAxMjMgMTExIDUwIDE3IDEwNiA3NCAxMjcgMTUzIDQ1IDE4OSA2OCAxMjEgMTc5IDIxNSAKKzE4OSAzNiA1OCAxMjAgMTY2IDcyIDMyIDE5NiAxODggNTMgNzggMjEgMTQ4IDY5IDE1MSAxMTUgMTczIDEyIDQ5IDM2IDI2IDIwNSAxMDcgCisyMyA2MyAxOTIgMTEyIF4KKzQ4NSAxIDIwMCAxOTQgMTAyIDIxNCAxOSAxNzggMTMyIDIwOCAxNTggNTkgMTAgMTM2IDExMiAxMzUgMTE4IDM3IDYzIDMwIDk0IDYwIAorNDYgMTgwIDQ3IDEwMCAxMTAgMTQ2IDMzIDMgNTAgMTk5IDQzIDM5IDE2OCAxNjkgOTAgMTg4IDEyIDkyIDIxOSAxODkgNiAxMTcgMTE2IAorMTk2IDEzMyA4NyAxNjQgNzYgMTMyIDE2NyAxMDEgMzAgMjA5IDc5IDE1NyAxMzggMTQzIDggMzIgOCAyMjEgMjIwIDExMCAzMSAxNCAKKzEyMyA5MiAxMDMgMTM1IDExNyA3NSAyMTIgMTA0IDU1IDE4MCAxMjEgNjIgMTkyIDcyIDcyIDE4NyAyMDYgMTMgMjAyIDY3IDIwNiAxMjggCisyMjEgMTA1IDkxIDIyNCAxMjkgMjcgMTg0IDE4MSAxMTUgMTYwIDg5IDc5IDE5OSA4NCAyMyAxOTcgMTI4IDE0NyAxNDMgODIgNjcgMTcgCisxNDcgMjggNjMgMTg3IDEzMiA1MSAxMjAgMTQxIDE2NyAxNzUgNjUgNjAgNSAxOTYgMTggNjggMTI2IDE5MSAzNiAyOCAxNzkgMTAgMjEgCis5MyAyNCAyIDE0IDgyIDEwOCA3NCAxNzYgNjAgMTIwIDIxNSAxMjkgMjYgMjIyIDk5IDE4OSAxMjEgMTM2IDIyNyAxNTQgMjI5IDIyNiAKKzg2IDE2OSAxNiAxNTMgMyAxNjYgMTgwIDUgODEgNzIgMzAgMTY4IDk1IDEyOCAxMDYgMTU5IDUzIDM1IDMzIDExOSAzMSA4OCAxNTggCisxNzQgMjkgMTYgNzAgMjYgMzIgODMgMjE4IDgwIDE5MyAxODIgMTUxIDIwNCAyNCA0NCAxOTEgMTkzIDY2IDE3MCA4NCAyMTMgMTQwIDk5IAorMTE1IDg2IDU0IDcwIDQyIDQ1IDcwIDQxIDgzIDYxIDExNSA0NCAxMDggMTkwIDE1NyAxODAgMTYyIDExOSAyMjEgMTA0IDEyOSAxNDIgCisyMDMgMjE5IDI1IDIyOCAxIDYxIDQxIDkgMjYgMzMgMTE4IDY5IDYgMSAxMzUgNzYgOTEgMTgzIDcyIDcxIDE1MiAxMjQgODcgMTYzIAorMTE0IDUwIDEwIDYyIDc3IDUzIDM0IDIyOSAxMTAgMTA1IDQ5IDIwNSAxOCAxNDIgODggNDIgMTkzIDY3IDEzMiA5MyAxMzkgMjEgNTIgCis0MCAyMDQgMjEzIDk4IDE1MyA0IDIwMSAzMSAxNjIgMTIwIDI1IDExMyA1NSAxODEgMTU2IDE0NCAxMTggMTExIDI1IDExMiAyMCAxNzIgCisyMzAgMTA1IDE2NSAxODYgMTM4IDE4NCAyMjMgNjEgNDAgNDcgMTc1IDEwNyA2IDExNiA4MSAxMTQgMjA3IDQ4IDUzIDIyNCAxNCA4MSAKKzczIDIyMyAxOSAyMSAxNjcgNTkgMTEgOTggMTk0IDYxIDIzMCAyMjEgMTQ2IDE0OCAyMiA4OCA4NCAxMzkgMTc4IDkwIDE4OSA0NyAxNzQgCisxNDUgMjI4IDE5MCA0MiAzIDUxIDE2MSAxMjUgMTk2IDIwNyA0OSAxNSAyIDE3MSAxMjAgMjYgMTQ4IDY0IDEwNyAxOTUgOTcgNDMgMjI5IAorMTExIDE0MCA1OCAxMzEgNTcgOTUgMTMgODcgNDggOTUgMTcwIDEyNSAxOTcgMTY5IDEzMSAxNzIgNDEgMTI0IDQ1IDE0NCAzIDkyIDE0NSAKKzE1NCAxNTUgMzMgNzcgMTIgMjA4IDIwMCA3OCA0OCAyMSAyMDggNDMgNDAgMTMwIDE3OCAxNiAyMjcgMTk2IDE3IDEwNiA0NCAzNCAyMjggCis3NSAyMyAxMjMgMTY2IDY1IDIxNyA0MyAxMTQgMTY1IDI5IDE3MyAzNSAxNDkgMTczIDE1MSAxMzAgNjIgMzUgMzQgMTU0IDExMyAxNCAKKzE5NyAxMjcgMTEyIDYxIDE1NiAyOCAxMzcgMjIyIDIxNCAyMDggMTU5IDk0IDE5IDYyIDE1MSA4OCA0MyAxNTUgMTQ5IDU4IDIwNSA5MiAKKzEwNCAxNzAgMTI2IDEgMjAgNTcgMjExIDIyNSA0OSA5MCAyMzAgMzEgMjAzIDE3NyA1NCAxNDUgMzkgMjA5IDE1MyAxMTkgMTQ3IDY5IAorNDcgMjE2IDE2NCAzNSA3NSAxMzggMTQyIDQ2IDIzIDgyIDE4MiAzNiAxODUgMTk4IF4KKzQ4MyAxIDE1NSA5NSA1MCA3MSA3MyAxMjMgMjI1IDc2IDI4IDE0NCAyMjcgMTI2IDEzMCAyMjggMTE0IDc0IDE0OCAxOTIgMTE4IDE3MiAKKzM0IDg3IDE5MiAyMTYgMTkzIDIwNiA1NCAzNiA2NSAyMzAgMzEgNDkgMTQ2IDQ0IDIyOCAyMTQgMTgwIDYyIDkyIDQ3IDEzMSA0OCA1OCAKKzE2MiAxNjEgMyAxNDIgMTQgMyAxMDcgMTQxIDg5IDIwNyAyMTIgMTMwIDE5MyA4IDE2MCAxNSAxOTggMTU5IDIyMyA2MyAxMTcgMTQgCisxNzMgMTkyIDE4MSA4NyA1OSA4OSAxMDcgMTA2IDIxNiA2MCA3OSAyMDEgMSAyMjcgMTg5IDIxMyAyMCAxMTYgMjIyIDM4IDE1MCAyMDUgCisyOSAxMzQgMjMgMjEgMTQxIDEyNCA4MCAxMjYgMzAgMTIyIDIwMCAxMDkgMjE5IDEwNCAyMDEgNjQgMTQyIDE0OSAyMTUgMTY4IDYgMTIgCisxMjUgNyA3MiAxMzMgMTk2IDE4MSAxODUgMTUgMjggOSAxODMgNjUgMzIgMTM3IDE5NiA0NiAyMDYgMTg3IDE2MyAxNTEgMzIgMzcgOTAgCisxMzIgOCAyNSAyMDQgMTM3IDYxIDY3IDE0NSA4OSA3MiA2OSA5NSA4NSA5IDIyMCAyMyAxNTQgMzUgMjEwIDExNSAxOTcgNzEgMTA4IAorMjI5IDEzOSAyMDkgMTkwIDEwMyAxNzYgOTcgMTAwIDUgMTU3IDEwIDE3MyA5NCAxNjAgMTQ4IDkyIDEyIDI1IDY5IDE1OCAyMDIgMjIyIAorMTcxIDQ0IDU4IDY0IDIwNSA2NCA3IDE3MCAxNTQgNzAgODMgMjkgOTcgNjcgMTAgMTEwIDExIDEzNSAxNDYgMTc3IDEyMiAyIDQ3IDEzMyAKKzEzMyAzMyAxNjAgMTMgMTEzIDE4NCAyMjUgMjExIDcgMzcgMjcgNDkgNDggMjMgNTYgMTQgMzggMjEzIDU1IDIyMiAxMzYgMTcxIDE0NCAKKzE2NCAyMTEgMTA1IDIyNiAxOTkgMTg0IDEyNSAxMDUgOTMgNzIgOTggMjUgMzQgNTIgODYgNjkgNjAgMjEyIDMwIDg3IDk0IDE5NSAyMSAKKzYgMTQ1IDE5IDI4IDE3MiAyMDQgNCAxNjcgMjE0IDQ1IDgzIDMxIDE0IDQwIDY1IDk1IDIyMCAyMjEgNDggMTIxIDc3IDE4NiA1IDU3IAorMTM3IDI2IDE5NCAyMzEgMTg5IDc4IDQxIDU1IDEyNCAxMTUgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDIwNCA3NCAyMTEgNDIgMTQzIDE3NCAKKzE4MiAyMTAgMjE1IDcwIDIxOCA3MyAxNTggOTggMjIzIDE2MSAxMzggMTg2IDE0MCAxMDEgMzAgNTkgNTIgMTQ5IDIxNyAyMCAyMTQgMTAgCisyMTAgMTE3IDQ5IDQ2IDEwNiA4MSAxNiAxOCAxMDMgNzggNzYgMTYxIDM4IDE1IDIyNiAxMzYgMzYgMTAwIDEwMyAxNzggMTgyIDc1IDMgCis5IDE4NSAxNTAgNyAxMzUgNDggMTU2IDE4MyAxMDAgMTM4IDUxIDk2IDQwIDE2NSAyMDEgMTM0IDEyMSA0MiA4MCA5MSAxNTcgMjA4IDY3IAorMTgwIDI3IDIxOSAxMzMgMjMxIDU0IDk5IDIxMyAxOTAgMzMgMTk3IDM2IDIgODIgNiA0NyAyMzEgMTU0IDIwNSAxMjcgMTU1IDE5NSAKKzE1NiA1MCAyMDYgNTIgMTg0IDkwIDIzMiAxNzkgMTcyIDE2OSA2NiAyMCA4MSAxMTYgMTI0IDE3IDQzIDUgMTIwIDUyIDUxIDE5NiAxNDYgCis3OSAxMDEgMTI4IDgwIDIyNCA1MSA2MSAxMDIgMTggMyAyMDUgMTYyIDI4IDEwOSA1NiAyMTIgMTY1IDY2IDE1NSA2MCAxNzcgMTU3IAorMTczIDE5NCAzMyA2MiA1NyAxNzQgMjE3IDgzIDEyOSAyMDMgMjEyIDMyIDE3MiA2OSAxOTMgMTA2IDExNiAxMjIgMTY1IDMgNyAzNSAKKzE3NSA5IDUwIDE3MSAxNzkgMzcgMTI1IDUgMjIwIDE1OCAxOTggOTYgNzUgMzggMTE1IDk5IDUwIDEgOTQgNjIgMTI3IDE1MyA0NSAxODEgCis1MiAxMjEgMTc1IDIwNyAxNzcgMjQgNDYgMTA4IDE2NCBeCis0OTkgMCA0NCA0IDE4MiAxODggNTMgNzEgNyAxNDggNDggMTMwIDEwOCAxNjYgMjIwIDM1IDggMTIgMTk4IDkzIDkgNjMgMTcxIDk3IAorMTk1IDE5NCA4NyAyMDQgMTQgMTczIDEzMiAyMDMgMTQzIDU0IDIzMSAxMjYgMTAyIDEyNSAxMTggMzcgNDMgMjAgOTQgNjAgMzYgMTc1IAorNDcgOTAgMTEwIDE0MSAyMyAyMjkgMzUgMTg0IDQzIDI0IDE1MyAxNTQgODUgMTczIDEyIDgyIDIxNCAxNzQgMjMyIDExNyAxMDYgMTkxIAorMTI4IDc3IDE2NCA3NiAxMTcgMTYyIDEwMSAyNSAyMDQgNzQgMTQyIDEyMyAxNDMgMjM0IDMyIDIyOSAyMTEgMjE1IDEwNSAzMSA5IDEyMyAKKzg3IDg4IDEzNSAxMDIgNjUgMjAyIDk5IDUwIDE2NSAxMTYgNjIgMTg3IDYyIDY3IDE3NyAxOTEgOCAxOTIgNTIgMTk2IDExOCAyMDYgCisxMDUgOTEgMjE0IDExNCAyNyAxNzkgMTY2IDEwMCAxNTAgNzkgNzkgMTk5IDg0IDEzIDE4MiAxMjggMTM3IDEzMyA2NyA1NyAxNyAxMzIgCisyMyA1MyAxODcgMTIyIDM2IDExNSAxMzEgMTUyIDE3MCA1MCA0NSAyMzEgMTg2IDE4IDYzIDExMSAxODEgMjEgMTggMTc5IDIyNiAxNiAKKzg4IDE5IDIyMyAyMzAgODIgOTggNTkgMTYxIDUwIDEwNSAyMDAgMTI0IDExIDIwNyA4OSAxNzkgMTA2IDEzMSAyMTIgMTM5IDIyNCAyMjEgCis4NiAxNjQgMTYgMTQ4IDIyNCAxNjEgMTcwIDIyNiA3NiA1NyAxMCAxNjMgODUgMTEzIDk2IDE0NCAzOCAzMCAxOCAxMTkgMjEgNzggMTQ4IAorMTY0IDkgMjMyIDUwIDIyMSAyNiAxMiA3OCAyMDggODAgMTgzIDE3MiAxNDEgMTk5IDI0IDQ0IDE5MSAxODggNDYgMTU1IDY5IDIwOCAKKzE0MCA5OSAxMTAgODEgNTQgNTUgNDIgNDAgNjUgMjYgNjggNDEgMTA1IDI0IDkzIDE4NSAxNDcgMTgwIDE1NyAxMDQgMjE2IDg5IDExOSAKKzEzNyAxOTMgMjE5IDIzMSAxMCAyMjMgMSA1MSAzNiAyMzUgMTYgMjggMTAzIDQ5IDEgMjI3IDEyMCA2MSA3NiAxNzMgNzIgNTEgMTUyIAorMTE0IDg3IDE0OCAxMDQgNDAgNSA1NyA3NyA0OCAxNCAyMjkgOTUgMTAwIDM0IDIwMCA4IDEzMiA4MyAyMiAxNzggNjIgMTI3IDkzIDEyOSAKKzEgNDcgMzAgMTk0IDIwMyA4MyAxMzggNCAxODYgMTEgMTQ3IDEyMCA1IDExMyA0MCAxODEgMTQxIDEzOSAxMDggMTA2IDE1IDk3IDE1IAorMTU3IDIyMCA5NSAxNjAgMTg2IDEzOCAxODQgMjIzIDYxIDIwIDI3IDE3NSAxMDcgNiAxMDEgODEgMTE0IDIwNyAzMyAzMyAyMDkgNCA2NiAKKzczIDIxOCA0IDYgMTU3IDQ0IDExIDk4IDE3OSA0NiAyMTUgMjIxIDE0NiAxMzMgNyA4OCA3OSAxMzkgMTY4IDc1IDE4OSAzNyAxNTkgCisxMzUgMjE4IDE4MCAzNyAyMTkgNTEgMTU2IDEyMCAxODEgMTk3IDQ5IDUgMjMzIDE2MSAxMTAgMjEgMTM4IDY0IDEwMiAxODUgODcgMjggCisyMTkgMTExIDEyNSA1OCAxMjEgNTIgODAgMyA4MiAzOCA5MCAxNzAgMTEwIDE5NyAxNjkgMTI2IDE2MiA0MSAxMDkgMzAgMTM0IDIzNCAKKzkyIDE0NSAxNDkgMTU1IDEzIDYyIDcgMjA4IDIwMCA2OCA0OCAyMSAxOTggMzMgNDAgMTI1IDE3OCA2IDIxNyAxOTYgMiA5MSAzNCAyNCAKKzIxMyA3MCAyMyAxMTMgMTU2IDYwIDIxMiAyMyAxMDkgMTUwIDE5IDE2MyAyNSAxNDQgMTU4IDE1MSAxMzAgNTIgMjAgMzQgMTQ0IDk4IAorMjM1IDE5MiAxMTIgMTEyIDU2IDE0NiAxMyAxMjIgMjEyIDE5OSAxOTMgMTU5IDc5IDE5IDQ3IDE0NiA3MyAzOCAxNTAgMTM5IDQ4IDE5MCAKKzc3IDEwNCAxNjAgMTI2IDIyMiAxMCA0NyAyMDYgMjI1IDI5IDkwIDIzMCAyNiAxODggMTYyIDM0IDE0MCAzOSAxOTQgMTQzIDExNCAxNDcgCis2NCA0MiAyMTYgMTQ5IDE3NCBeCis0NzMgMSA3NSAxMzEgMTIxIDE4IDIgNjggMTYxIDI5IDE4NSAyMDMgMTQ1IDk1IDQwIDcxIDYzIDExMyAyMjAgNjYgOCAxNDQgMjEyIAorMTE2IDExNSAyMjggMTA5IDU5IDEzOCAxNzcgMTA4IDE3MiAxOSA4MiAxODcgMjExIDE4OCAxOTEgMzQgMzYgNTUgMjE1IDExIDM5IDEzNiAKKzI0IDIyMyAxOTkgMTcwIDUyIDgyIDQyIDEzMSAyOCA1MyAxNjIgMTYxIDIyNiAxNDIgMTQgMjMxIDk3IDE0MSA3OSAxOTIgMjA3IDEyMCAKKzE4MyAyMzYgMTQ1IDIzMyAxOTggMTQ5IDIwOCA0OCAxMDcgMjM3IDE3MyAxOTIgMTY2IDc3IDM5IDg0IDEwMiA5NiAyMDYgNDAgNjQgCisxODYgMjI0IDIyNyAxNzQgMjEzIDEwIDExMSAyMTIgMjMgMTUwIDE5NSA5IDEyNCAxMyA2IDEzNiAxMjQgNjUgMTIxIDI1IDExNyAxOTUgCisxMDkgMjA0IDIxOCA5OSAyMDEgNDQgMTMyIDE0OSAyMTUgMTYzIDIzNCAyMzAgMTEwIDIyNSA2MiAxMzMgMTgxIDE3NiAxODAgMTAgMTggCis5IDE4MyA1MCAyMiAxMjIgMTkxIDQxIDE5NiAxODIgMTYzIDE0MSAyNyAzMiA4MCAxMjcgOCAxMCAyMDQgMTMyIDU2IDU3IDEzMCA4OSAKKzU3IDIyMyA1NCA5MCA4NSAyMjcgMjE1IDE4IDE1NCAyNSAyMTAgMTE1IDE4NyA2NiAxMDggMjI0IDEzNCAyMDkgMTgwIDEwMyAxNzYgODcgCis5MCAyMjMgMTQ3IDEwIDE2MyA4OSAxNTAgMTQzIDg3IDIzNSAyMCA2OSAxNDggMjI4IDIwMiAyMTcgMTcxIDM5IDQzIDU5IDE5MCA1NCAKKzIzNSAxNjUgMTQ5IDcwIDgzIDI5IDkyIDY3IDIzMyAxMDUgMjI5IDEzMCAxNDEgMTcyIDExMiAyIDI3IDExOCAxMjMgMzMgMTYwIDggCisxMDMgMTY5IDIxMCAyMDEgMjMwIDE3IDIyIDI5IDMzIDggNTEgOSAzOCAyMDggNTUgMjIyIDEyNiAxNjYgMTI5IDE1NCAyMTEgOTUgMjI2IAorMTk0IDE3NCAxMjAgOTAgNzggNjcgODggMjUgMjQgMzcgNzYgNTkgNDUgMjEyIDMwIDcyIDg0IDE5NSAxNiAxIDE0MCAyMzcgMjggMTU3IAorMTk5IDIyMiAxNjcgMjA5IDM1IDY4IDE2IDIzMiAyNSA2NSA4MCAyMjAgMjExIDQzIDExMSA2NyAxODEgMjI4IDU3IDEzNyAxMSAxODQgCisyMTYgMTg0IDc4IDI2IDQ1IDExOSAxMTAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE4OSA3NCAxOTYgMzcgMTI4IDE3NCAxNzIgMjA1IAorMjA1IDYwIDIxOCA1OCAxNTggOTMgMjE4IDE1MSAxMjMgMTcxIDEyNSA4NiAxMCA1OSA1MiAxMzQgMjAyIDIwIDIxNCAyMjggMTk1IDEwMiAKKzQ0IDQ2IDEwNiA3MSAxMSAyMzYgOTMgNzMgNzEgMTU2IDMzIDE1IDIxMSAxMzYgMzEgMTAwIDg4IDE2MyAxODIgNzAgMjIxIDIzMiAxNzAgCisxNDUgMiAxMjAgMzggMTU2IDE3OCA5NSAxMzMgMzYgOTYgMjAgMTU1IDE5MSAxMzQgMTE2IDIyIDcwIDc2IDE1MiAyMDMgNTIgMTc1IDcgCisyMDkgMTI4IDIyNiA0OSA5NCAxOTggMTkwIDEzIDE5MiAyMSAyMzUgNzIgMjI5IDM3IDIyMSAxMzkgMjA1IDExMiAxNDAgMTg1IDE1MSAKKzMwIDIwNiA0NyAxNzkgNzUgMjE3IDE2NCAxNjIgMTU0IDY2IDE1IDY2IDEwMSAxMDkgNyAyMyA1IDExNSA0MiAzMSAxODYgMTMxIDY5IAorOTYgMTEzIDc1IDIyNCA0MSA1MSAxMDIgMyAzIDIwMCAxNTcgMTMgOTkgNTYgMjAyIDE2NSA1NiAxNTAgNTAgMTY3IDE1NyAxNTggMTc5IAorMjMgNTcgMzcgMTY5IDIxNyA3OCAxMTkgMjAzIDE5NyAxNyAxNjcgNjQgMTkzIDEwMSAxMTYgMTIyIDE1MCAyMzYgNyAzMCAxNjUgNCAzNSAKKzE2MSAxNzQgMjcgMTI1IDIwNSAxNTMgMTQ4IF4KKzUwMiAxIDg5IDYxIDI0IDEwMSA3OCA1MCAyMTMgNzMgNDEgMTI3IDE1MyA0NSAxNjcgMjQgMTIxIDE2OCAxOTMgMTU2IDMgMjUgODcgCisxNjYgMjggMjI4IDE3NCAxODggNTMgNjcgMjM5IDE0OCAzNiAxMTggMTA0IDE2MiAyMDggMjcgMjMyIDQgMTk0IDg1IDEgNjMgMTU5IDk3IAorMTkxIDE5NCA3NSAxOTYgMTAgMTY5IDEzMiAxOTkgMTMxIDUwIDIyMyAxMTggOTQgMTE3IDExOCAzNyAyNyAxMiA5NCA2MCAyOCAxNzEgCis0NyA4MiAxMTAgMTM3IDE1IDIyNSAyMyAxNzIgNDMgMTIgMTQxIDE0MiA4MSAxNjEgMTIgNzQgMjEwIDE2MiAyMjggMTE3IDk4IDE4NyAKKzEyNCA2OSAxNjQgNzYgMTA1IDE1OCAxMDEgMjEgMjAwIDcwIDEzMCAxMTEgMTQzIDIzMCAzMiAyMjEgMjAzIDIxMSAxMDEgMzEgNSAxMjMgCis4MyA3NiAxMzUgOTAgNTcgMTk0IDk1IDQ2IDE1MyAxMTIgNjIgMTgzIDU0IDYzIDE2OSAxNzkgNCAxODQgNDAgMTg4IDExMCAxOTQgMTA1IAorOTEgMjA2IDEwMiAyNyAxNzUgMTU0IDg4IDE0MiA3MSA3OSAxOTkgODQgNSAxNzAgMTI4IDEyOSAxMjUgNTUgNDkgMTcgMTIwIDE5IDQ1IAorMTg3IDExNCAyNCAxMTEgMTIzIDE0MCAxNjYgMzggMzMgMjI3IDE3OCAxOCA1OSA5OSAxNzMgOSAxMCAxNzkgMjE0IDEyIDg0IDE1IDIxNSAKKzIxOCA4MiA5MCA0NyAxNDkgNDIgOTMgMTg4IDEyMCAyMzkgMTk1IDgxIDE3MSA5NCAxMjcgMjAwIDEyNyAyMjAgMjE3IDg2IDE2MCAxNiAKKzE0NCAyMTYgMTU3IDE2MiAyMTggNzIgNDUgMjM0IDE1OSA3NyAxMDEgODggMTMyIDI2IDI2IDYgMTE5IDEzIDcwIDE0MCAxNTYgMjMzIAorMjIwIDM0IDIxMyAyNiAyMzYgNzQgMjAwIDgwIDE3NSAxNjQgMTMzIDE5NSAyNCA0NCAxOTEgMTg0IDMwIDE0MyA1NyAyMDQgMTQwIDk5IAorMTA2IDc3IDU0IDQzIDQyIDM2IDYxIDE0IDU2IDI1IDk3IDggODEgMTgxIDEzOSAxODAgMTUzIDkyIDIxMiA3NyAxMTEgMTMzIDE4NSAKKzIxOSAyMzEgMjM4IDIxOSAxIDQzIDMyIDIzMSA4IDI0IDkxIDMzIDIzNyAyMjMgMTA4IDQ5IDY0IDE2NSA3MiAzNSAxNTIgMTA2IDg3IAorMTM2IDk2IDMyIDEgNTMgNzcgNDQgMjM4IDIyOSA4MyA5NiAyMiAxOTYgMTI0IDc5IDYgMTY2IDU4IDEyMyA5MyAxMjEgMjI1IDQzIDIyIAorMTg2IDE5NSA3MSAxMjYgNCAxNzQgMjM1IDEzNSAxMjAgMjI5IDExMyAyOCAxODEgMTI5IDEzNSAxMDAgMTAyIDcgODUgMTEgMTQ1IDIxMiAKKzg3IDE1NiAxODYgMTM4IDE4NCAyMjMgNjEgNCAxMSAxNzUgMTA3IDYgODkgODEgMTE0IDIwNyAyMSAxNyAxOTcgMjM2IDU0IDczIDIxNCAKKzIzMiAyMzQgMTQ5IDMyIDExIDk4IDE2NyAzNCAyMDMgMjIxIDE0NiAxMjEgMjM1IDg4IDc1IDEzOSAxNjAgNjMgMTg5IDI5IDE0NyAxMjcgCisyMTAgMTcyIDMzIDIwNyA1MSAxNTIgMTE2IDE2OSAxODkgNDkgMjM3IDIzMyAxNTMgMTAyIDE3IDEzMCA2NCA5OCAxNzcgNzkgMTYgMjExIAorMTExIDExMyA1OCAxMTMgNDggNjggMjM1IDc4IDMwIDg2IDE3MCA5OCAxOTcgMTY5IDEyMiAxNTQgNDEgOTcgMTggMTI2IDIzNCA5MiAKKzE0NSAxNDUgMTU1IDIzNyA1MCAzIDIwOCAyMDAgNjAgNDggMjEgMTkwIDI1IDQwIDEyMSAxNzggMjM4IDIwOSAxOTYgMjMwIDc5IDI2IAorMTYgMjAxIDY2IDIzIDEwNSAxNDggNTYgMjA4IDcgMTA1IDEzOCAxMSAxNTUgMTcgMTQwIDE0NiAxNTEgMTMwIDQ0IDggMzQgMTM2IDg2IAorMjI3IDE4OCAxMDAgMTEyIDUyIDEzOCAxIDExMCAyMDQgMTg3IDE4MSAxNTkgNjcgMTkgMzUgMTQyIDYxIDM0IDE0NiAxMzEgNDAgMTc4IAorNjUgMTA0IDE1MiAxMjYgMjE0IDIgMzkgMjAyIDE3MyBeCis0ODYgMSA1IDkwIDIzMCAyMCAxNzAgMTQ0IDEwIDEzNCAzOSAxNzYgMTMxIDEwOCAxNDcgNTggMzYgMjE2IDEzMSAzNSA3NSAxMjcgMTA5IAorMiAyMzIgNjAgMTQ5IDI1IDE4NSAxOTUgMTM3IDk1IDMyIDcxIDU1IDEwNSAyMTYgNTggMjM0IDE0NCAyMDAgMTA4IDEwMyAyMjggMTA1IAorNDcgMTMwIDE2NSAxMDAgMTcyIDcgNzggMTgzIDIwNyAxODQgMTc5IDE4IDM2IDQ3IDIwMyAyMzcgMzEgMTI4IDggMjE5IDE4NyAxNjIgCis0NCA3NCAzOCAxMzEgMTIgNDkgMTYyIDE2MSAyMTggMTQyIDE0IDIyNyA4OSAxNDEgNzEgMTgwIDIwMyAxMTIgMTc1IDIzMiAxMzMgMjIxIAorMTk4IDE0MSAxOTYgMzYgOTkgMjI5IDE3MyAxOTIgMTU0IDY5IDIzIDgwIDk4IDg4IDE5OCAyNCA1MiAxNzQgMjE2IDIyNyAxNjIgMjEzIAorMiAxMDcgMjA0IDExIDE1MCAxODcgMjM1IDExNiA1IDIzNiAxMzIgMTI0IDUzIDExNyAyMSAxMTMgMTkxIDEwOSAxOTIgMjA2IDk1IDIwMSAKKzI4IDEyNCAxNDkgMjE1IDE1OSAyMzAgMjE4IDk4IDIxMyA1NCAxMzMgMTY5IDE3MiAxNzYgNiAxMCA5IDE4MyAzOCAxNCAxMTAgMTg3IAorMzcgMTg4IDE3OCAxNjMgMTMzIDIzIDI4IDcyIDEyMyA4IDI0MCAyMDQgMTI4IDUyIDQ5IDExOCA4OSA0NSAyMTUgNDIgODYgODUgMjE1IAorMjExIDE0IDE1NCAxNyAyMTAgMTE1IDE3OSA2MiAxMDggMjIwIDEzMCAyMDkgMTcyIDEwMyAxNzYgNzkgODIgMjExIDEzOSAxMCAxNTUgCis4NSAxNDIgMTM5IDgzIDIyNyAxNiA2OSAxNDAgMjI0IDIwMiAyMTMgMTcxIDM1IDMxIDU1IDE3OCA0NiAyMzEgMTYxIDE0NSA3MCA4MyAKKzI5IDg4IDY3IDIyNSAxMDEgMjE3IDEyNiAxMzcgMTY4IDEwNCAyIDExIDEwNiAxMTUgMzMgMTYwIDQgOTUgMTU3IDE5OCAxOTMgMjIyIDEgCisxOCAxMyAyMSAyMzggNDcgNSAzOCAyMDQgNTUgMjIyIDExOCAxNjIgMTE3IDE0NiAyMTEgODcgMjI2IDE5MCAxNjYgMTE2IDc4IDY2IDYzIAorODAgMjUgMTYgMjUgNjggNTEgMzMgMjEyIDMwIDYwIDc2IDE5NSAxMiAyMzkgMTM2IDIyNSAyOCAxNDUgMTk1IDIxMCAxNjcgMjA1IDI3IAorNTYgNCAyMjAgMTMgNjUgNjggMjIwIDIwMyAzOSAxMDMgNTkgMTc3IDIyMCA1NyAxMzcgMjQxIDE3NiAyMDQgMTgwIDc4IDE0IDM3IDExNSAKKzEwNiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTc3IDc0IDE4NCAzMyAxMTYgMTc0IDE2NCAyMDEgMTk3IDUyIDIxOCA0NiAxNTggODkgCisyMTQgMTQzIDExMSAxNTkgMTEzIDc0IDIzNiA1OSA1MiAxMjIgMTkwIDIwIDIxNCAyMTYgMTgzIDkwIDQwIDQ2IDEwNiA2MyA3IDIyNCAKKzg1IDY5IDY3IDE1MiAyOSAxNSAxOTkgMTM2IDI3IDEwMCA3NiAxNTEgMTgyIDY2IDIwOSAyMjQgMTU4IDE0MSAyNDAgMTA4IDMwIDE1NiAKKzE3NCA5MSAxMjkgMjQgOTYgNCAxNDcgMTgzIDEzNCAxMTIgNiA2MiA2NCAxNDggMTk5IDQwIDE3MSAyMzMgMjAxIDEyNCAyMjIgNDUgOTAgCisxODYgMTkwIDIzOSAxODggOSAyMzUgNjQgMjIxIDI5IDIxMyAxMjcgMjA1IDEwMCAxMjggMTc3IDE0NyAxNCAyMDYgNDMgMTc1IDYzIAorMjA1IDE1MiAxNTQgMTQyIDY2IDExIDU0IDg5IDk3IDI0MSA3IDUgMTExIDM0IDE1IDE3OCAxMTkgNjEgOTIgMTAxIDcxIDIyNCAzMyA0MyAKKzEwMiAyMzMgMyAxOTYgMTUzIDEgOTEgNTYgMTk0IDE2NSA0OCAxNDYgNDIgMTU5IDE1NyAxNDYgMTY3IDE1IDUzIDIxIDE2NSAyMTcgNzQgCisxMTEgMjAzIDE4NSA1IDE2MyA2MCAxOTMgOTcgMTE2IDEyMiAxMzggMjM2IDcgMjYgMTU3IDIzIDE1MyAxNzAgMTg0IF4KKzUwNSAxIDEyNSAyMzggMTg3IDE0NyAxNjUgODUgNTMgMTYgOTMgNjYgNTAgMjAxIDYxIDI5IDEyNyAxNTMgNDUgMTU5IDggMTIxIDE2NCAKKzE4NSAxNDQgMjM1IDEzIDc1IDE2NiAxMiAyMTYgMTY2IDE4OCA1MyA2MyAyMzUgMTQ4IDI0IDEwNiAxMDAgMTU4IDE5NiAxOSAyMjAgCisyNDAgMTkwIDc3IDIzNyA2MyAxNDcgOTcgMTg3IDE5NCA2MyAxODggNiAxNjUgMTMyIDE5NSAxMTkgNDYgMjE1IDExMCA4NiAxMDkgMTE4IAorMzcgMTEgNCA5NCA2MCAyMCAxNjcgNDcgNzQgMTEwIDEzMyA3IDIyMSAxMSAxNjAgNDMgMTI5IDEzMCA3NyAxNDkgMTIgNjYgMjA2IDE1MCAKKzIyNCAxMTcgOTAgMTgzIDEyMCA2MSAxNjQgNzYgOTMgMTU0IDEwMSAxNyAxOTYgNjYgMTE4IDk5IDE0MyAyMjYgMzIgMjEzIDE5NSAyMDcgCis5NyAzMSAxIDEyMyA3OSA2NCAxMzUgNzggNDkgMTg2IDkxIDQyIDE0MSAxMDggNjIgMTc5IDQ2IDU5IDE2MSAxNjcgMTc2IDI4IDE4MCAKKzEwMiAxODIgMTA1IDkxIDE5OCA5MCAyNyAxNzEgMTQyIDc2IDEzNCA2MyA3OSAxOTkgODQgMjQxIDE1OCAxMjggMTIxIDExNyA0MyA0MSAKKzE3IDEwOCAxNSAzNyAxODcgMTA2IDEyIDEwNyAxMTUgMTI4IDE2MiAyNiAyMSAyMjMgMTcwIDE4IDU1IDg3IDE2NSAyNDEgMiAxNzkgCisyMDIgOCA4MCAxMSAyMDcgMjA2IDgyIDgyIDM1IDEzNyAzNCA4MSAxNzYgMTE2IDIzMSAxODMgNzMgMTYzIDgyIDEyMyAxODggMTE1IAorMjE2IDIxMyA4NiAxNTYgMTYgMTQwIDIwOCAxNTMgMTU0IDIxMCA2OCAzMyAyMjIgMTU1IDY5IDg5IDgwIDEyMCAxNCAyMiAyMzggMTE5IAorNSA2MiAxMzIgMTQ4IDIyMSAyMDggMTggMjA1IDI2IDIyNCA3MCAxOTIgODAgMTY3IDE1NiAxMjUgMTkxIDI0IDQ0IDE5MSAxODAgMTQgCisxMzEgNDUgMjAwIDE0MCA5OSAxMDIgNzMgNTQgMzEgNDIgMzIgNTcgMiA0NCA5IDg5IDIzNiA2OSAxNzcgMTMxIDE4MCAxNDkgODAgMjA4IAorNjUgMTAzIDEyOSAxNzcgMjE5IDIzMSAyMzAgMjE1IDEgMzUgMjggMjI3IDIwIDc5IDE3IDIzNyAyMTkgOTYgMzcgNTIgMTU3IDcyIDE5IAorMTUyIDk4IDg3IDEyNCA4OCAyNCAyNDEgNDkgNzcgNDAgMjI2IDIyOSA3MSA5MiAxMCAxOTIgMjM2IDExNiA3NSAyMzQgMTU0IDU0IDExOSAKKzkzIDExMyAyMTMgMzkgMTQgMTc4IDE4NyA1OSAxMTQgNCAxNjIgMjIzIDEyMyAxMjAgMjE3IDExMyAxNiAxODEgMTE3IDEzMSA5MiA5OCAKKzI0MyA3MyA3IDEzMyAyMDQgNzkgMTUyIDE4NiAxMzggMTg0IDIyMyA2MSAyMzIgMjM5IDE3NSAxMDcgNiA3NyA4MSAxMTQgMjA3IDkgMSAKKzE4NSAyMzIgNDIgNzMgMjEwIDIyNCAyMjYgMTQxIDIwIDExIDk4IDE1NSAyMiAxOTEgMjIxIDE0NiAxMDkgMjI3IDg4IDcxIDEzOSAxNTIgCis1MSAxODkgMjEgMTM1IDExOSAyMDIgMTY0IDI5IDE5NSA1MSAxNDggMTEyIDE1NyAxODEgNDkgMjMzIDIzMyAxNDUgOTQgMTMgMTIyIDY0IAorOTQgMTY5IDcxIDQgMjAzIDExMSAxMDEgNTggMTA1IDQ0IDU2IDIzMSA3NCAyMiA4MiAxNzAgODYgMTk3IDE2OSAxMTggMTQ2IDQxIDg1IAorNiAxMTggMjM0IDkyIDE0NSAxNDEgMTU1IDIyNSAzOCAyNDMgMjA4IDIwMCA1MiA0OCAyMSAxODIgMTcgNDAgMTE3IDE3OCAyMzQgMjAxIAorMTk2IDIyMiA2NyAxOCA4IDE4OSA2MiAyMyA5NyAxNDAgNTIgMjA0IDIzNSAxMDEgMTI2IDMgMTQ3IDkgMTM2IDEzNCAxNTEgMTMwIDM2IAorMjQwIDM0IDEyOCA3NCAyMTkgMTg0IDg4IDExMiA0OCAxMzAgMjMzIDk4IDE5NiAxNzUgMTY5IDE1OSA1NSAxOSAyMyAxMzggNDkgMzAgCisxNDIgMTIzIDMyIDE2NiA1MyAxMDQgMTQ0IDEyNiAyMDYgMjM4IDMxIDE5OCAyMDMgXgorNDgzIDEgMjM1IDkwIDIzMCAxNiAxNTggMTMyIDI0MCAxMzAgMzkgMTY0IDEyMyAxMDQgMTQ3IDU0IDMyIDIxNiAxMTkgMzUgNzUgMTIzIAorOTcgMjMyIDIyNCA1MiAxMzcgMjEgMTg1IDE4NyAxMjkgOTUgMjQgNzEgNDcgOTcgMjEyIDUwIDIyMiAxNDQgMTg4IDEwMCA5MSAyMjggCisxMDEgMzUgMTIyIDE1MyA5MiAxNzIgMjQxIDc0IDE3OSAyMDMgMTgwIDE2NyAyIDM2IDM5IDE5MSAyMjUgMjMgMTIwIDIzOCAyMTUgMTc1IAorMTU0IDM2IDY2IDM0IDEzMSAyNDIgNDUgMTYyIDE2MSAyMTAgMTQyIDE0IDIyMyA4MSAxNDEgNjMgMTY4IDE5OSAxMDQgMTY3IDIyOCAKKzEyMSAyMDkgMTk4IDEzMyAxODQgMjQgOTEgMjIxIDE3MyAxOTIgMTQyIDYxIDcgNzYgOTQgODAgMTkwIDggNDAgMTYyIDIwOCAyMjcgCisxNTAgMjEzIDI0MCAxMDMgMTk2IDI0NSAxNTAgMTc5IDIyMyAxMDggMjQzIDIyOCAxMjggMTI0IDQxIDExMyAxNyAxMDkgMTg3IDEwOSAKKzE4MCAxOTQgOTEgMjAxIDEyIDExNiAxNDkgMjE1IDE1NSAyMjYgMjA2IDg2IDIwMSA0NiAxMzMgMTU3IDE2OCAxNzIgMiAyIDkgMTgzIAorMjYgNiA5OCAxODMgMzMgMTgwIDE3NCAxNjMgMTI1IDE5IDI0IDY0IDExOSA4IDIzMiAyMDQgMTI0IDQ4IDQxIDEwNiA4OSAzMyAyMDcgCiszMCA4MiA4NSAyMDMgMjA3IDEwIDE1NCA5IDIxMCAxMTUgMTcxIDU4IDEwOCAyMTYgMTI2IDIwOSAxNjQgMTAzIDE3NiA3MSA3NCAxOTkgCisxMzEgMTAgMTQ3IDgxIDEzNCAxMzUgNzkgMjE5IDEyIDY5IDEzMiAyMjAgMjAyIDIwOSAxNzEgMzEgMTkgNTEgMTY2IDM4IDIyNyAxNTcgCisxNDEgNzAgODMgMjkgODQgNjcgMjE3IDk3IDIwNSAxMjIgMTMzIDE2NCA5NiAyIDI0MSA5NCAxMDcgMzMgMTYwIDg3IDE0NSAxODYgMTg1IAorMjE0IDIzMSAxNCAyNDMgOSAyMzAgNDMgMSAzOCAyMDAgNTUgMjIyIDExMCAxNTggMTA1IDEzOCAyMTEgNzkgMjI2IDE4NiAxNTggMTEyIAorNjYgNTQgNTkgNzIgMjUgOCAxMyA2MCA0MyAyMSAyMTIgMzAgNDggNjggMTk1IDggMjM5IDEzMiAyMTMgMjggMTMzIDE5MSAxOTggMTY3IAorMjAxIDE5IDQ0IDIzOCAyMDggMSA2NSA1NiAyMjAgMTk1IDM1IDk1IDUxIDE3MyAyMTIgNTcgMTM3IDIzMyAxNjggMTkyIDE3NiA3OCAyIAorMjkgMTExIDEwMiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTY1IDc0IDE3MiAyOSAxMDQgMTc0IDE1NiAxOTcgMTg5IDQ0IDIxOCAzNCAKKzE1OCA4NSAyMTAgMTM1IDk5IDE0NyAxMDEgNjIgMjI0IDU5IDUyIDExMCAxNzggMjAgMjE0IDIwNCAxNzEgNzggMzYgNDYgMTA2IDU1IDMgCisyMTIgNzcgNjUgNjMgMTQ4IDI1IDE1IDE4NyAxMzYgMjMgMTAwIDY0IDEzOSAxODIgNjIgMTk3IDIxNiAxNDYgMTM3IDI0MCA5NiAyMiAKKzE1NiAxNzAgODcgMTI1IDEyIDk2IDIzNCAxMzkgMTc1IDEzNCAxMDggMjM2IDU0IDUyIDE0NCAxOTUgMjggMTY3IDIyMSAxOTMgMTIwIAorMjE4IDQxIDg2IDE3NCAxOTAgMjI3IDE4NCAyNDMgMjM1IDU2IDIxMyAyMSAyMDUgMTE1IDIwNSA4OCAxMTYgMTY5IDE0MyAyNDQgMjA2IAorMzkgMTcxIDUxIDE5MyAxNDAgMTQ2IDEzMCA2NiA3IDQyIDc3IDg1IDIzNyAyMzcgNSAxMDcgMjYgMjQ1IDE3MCAxMDcgNTMgODggODkgCis2NyAyMjQgMjUgMzUgMTAyIDIyNSAzIDE5MiAxNDkgMjM1IDgzIDU2IDE4NiAxNjUgNDAgMTQyIDM0IDE1MSAxNTcgMTM0IDE1NSA3IDQ5IAorNSAxNjEgMjE3IDcwIDEwMyAyMDMgMTczIDIzOSAxNTkgNTYgMTkzIDkzIDExNiAxMjIgMTI2IDIzNiA3IDIyIDE0OSAyNDIgMTc4IF4KKzUwNyAxIDE0MSAxNjQgNyAxMjUgMjM4IDE3NSAxNDMgMTUzIDgxIDQ1IDggODUgNTQgNTAgMTg5IDQ5IDE3IDEyNyAxNTMgNDUgMTUxIAorMjQwIDEyMSAxNjAgMTc3IDEzMiAyMjcgMSA2MyAxNjYgMjQ0IDIwNCAxNTggMTg4IDUzIDU5IDIzMSAxNDggMTIgOTQgOTYgMTU0IDE4NCAKKzExIDIwOCAyMzYgMTg2IDY5IDIzMyA2MyAxMzUgOTcgMTgzIDE5NCA1MSAxODAgMiAxNjEgMTMyIDE5MSAxMDcgNDIgMjA3IDEwMiA3OCAKKzEwMSAxMTggMzcgMjQzIDI0NCA5NCA2MCAxMiAxNjMgNDcgNjYgMTEwIDEyOSAyNDcgMjE3IDI0NyAxNDggNDMgMjM2IDExNyAxMTggNzMgCisxMzcgMTIgNTggMjAyIDEzOCAyMjAgMTE3IDgyIDE3OSAxMTYgNTMgMTY0IDc2IDgxIDE1MCAxMDEgMTMgMTkyIDYyIDEwNiA4NyAxNDMgCisyMjIgMzIgMjA1IDE4NyAyMDMgOTMgMzEgMjQ1IDEyMyA3NSA1MiAxMzUgNjYgNDEgMTc4IDg3IDM4IDEyOSAxMDQgNjIgMTc1IDM4IDU1IAorMTUzIDE1NSAyNDQgMTY4IDE2IDE3MiA5NCAxNzAgMTA1IDkxIDE5MCA3OCAyNyAxNjcgMTMwIDY0IDEyNiA1NSA3OSAxOTkgODQgMjM3IAorMTQ2IDEyOCAxMTMgMTA5IDMxIDMzIDE3IDk2IDExIDI5IDE4NyA5OCAxMDMgMTA3IDExNiAxNTggMTQgOSAyMTkgMTYyIDE4IDUxIDc1IAorMTU3IDIzMyAyNDIgMTc5IDE5MCA0IDc2IDcgMTk5IDE5NCA4MiA3NCAyMyAxMjUgMjYgNjkgMTY0IDExMiAyMjMgMTcxIDY1IDE1NSA3MCAKKzExOSAxNzYgMTAzIDIxMiAyMDkgODYgMTUyIDE2IDEzNiAyMDAgMTQ5IDE0NiAyMDIgNjQgMjEgMjEwIDE1MSA2MSA3NyA3MiAxMDggMiAKKzE4IDIzMCAxMTkgMjQ1IDU0IDEyNCAxNDAgMjA5IDE5NiAyIDE5NyAyNiAyMTIgNjYgMTg0IDgwIDE1OSAxNDggMTE3IDE4NyAyNCA0NCAKKzE5MSAxNzYgMjQ2IDExOSAzMyAxOTYgMTQwIDk5IDk4IDY5IDU0IDE5IDQyIDI4IDUzIDIzOCAzMiAyNDEgODEgMjI0IDU3IDE3MyAxMjMgCisxODAgMTQ1IDY4IDIwNCA1MyA5NSAxMjUgMTY5IDIxOSAyMzEgMjIyIDIxMSAxIDI3IDI0IDIyMyAyNDAgMTYgNjcgMSAyMzcgMjE1IDg0IAorMjUgNDAgMTQ5IDcyIDMgMTUyIDkwIDg3IDExMiA4MCAxNiAyNDEgNDUgNzcgMzYgMjE0IDIyOSA1OSA4OCAyNDYgMTg4IDIzMiAxMDggCis3MSAyMjIgMTQyIDUwIDExNSA5MyAxMDUgMjAxIDM1IDYgMTcwIDE3OSA0NyAxMDIgNCAxNTAgMjExIDExMSAxMjAgMjA1IDExMyA0IAorMTgxIDEwNSAxMjcgODQgOTQgMjM5IDYxIDMgMTIxIDE5NiA3MSAxNDggMTg2IDEzOCAxODQgMjIzIDYxIDIyMCAyMjcgMTc1IDEwNyA2IAorNjUgODEgMTE0IDIwNyAyNDUgMjMzIDE3MyAyMjggMzAgNzMgMjA2IDIxNiAyMTggMTMzIDggMTEgOTggMTQzIDEwIDE3OSAyMjEgMTQ2IAorOTcgMjE5IDg4IDY3IDEzOSAxNDQgMzkgMTg5IDEzIDEyMyAxMTEgMTk0IDE1NiAyNSAxODMgNTEgMTQ0IDEwOCAxNDUgMTczIDQ5IDIyOSAKKzIzMyAxMzcgODYgOSAxMTQgNjQgOTAgMTYxIDYzIDI0MCAxOTUgMTExIDg5IDU4IDk3IDQwIDQ0IDIyNyA3MCAxNCA3OCAxNzAgNzQgCisxOTcgMTY5IDExNCAxMzggNDEgNzMgMjQyIDExMCAyMzQgOTIgMTQ1IDEzNyAxNTUgMjEzIDI2IDI0MyAyMDggMjAwIDQ0IDQ4IDIxIAorMTc0IDkgNDAgMTEzIDE3OCAyMzAgMTkzIDE5NiAyMTQgNTUgMTAgMTc3IDU4IDIzIDg5IDEzMiA0OCAyMDAgMjIzIDk3IDExNCAyNDMgCisxMzkgMSAxMzIgMTIyIDE1MSAxMzAgMjggMjMyIDM0IDEyMCA2MiAyMTEgMTgwIDc2IDExMiA0NCAxMjIgMjI1IDg2IDE4OCAxNjMgMTU3IAorMTU5IDQzIDE5IDExIDEzNCAzNyAyNiAxMzggMTE1IDI0IDE1NCA0MSAxMDQgMTM2IDEyNiAxOTggMjM0IDE0MCBeCis0OTAgMSAxOTIgMjI1IDIyMyA5MCAyMzAgMTIgMTQ2IDEyMCAyMjggMTI2IDM5IDE1MiAxMTUgMTAwIDE0NyA1MCAyOCAyMTYgMTA3IDM1IAorNzUgMTE5IDg1IDIyMCAyMTYgNDQgMTI1IDE3IDE4NSAxNzkgMTIxIDk1IDE2IDcxIDM5IDg5IDIwOCA0MiAyMTAgMTQ0IDE3NiA5MiA3OSAKKzIyOCA5NyAyMyAxMTQgMTQxIDg0IDE3MiAyMzMgNzAgMTc1IDE5OSAxNzYgMTU1IDIzNiAzNiAzMSAxNzkgMjEzIDE1IDExMiAyMjYgCisyMTEgMTYzIDE0NiAyOCA1OCAzMCAxMzEgMjMwIDQxIDE2MiAxNjEgMjAyIDE0MiAxNCAyMTkgNzMgMTQxIDU1IDE1NiAxOTUgOTYgMTU5IAorMjI0IDEwOSAxOTcgMTk4IDEyNSAxNzIgMTIgODMgMjEzIDE3MyAxOTIgMTMwIDUzIDI0MSA3MiA5MCA3MiAxODIgMjQyIDI4IDE1MCAKKzIwMCAyMjcgMTM4IDIxMyAyMzYgOTkgMTg4IDIzNyAxNTAgMTcxIDIxMSAxMDAgMjM5IDIyMCAxMjQgMTI0IDI5IDEwOSAxMyAxMDUgCisxODMgMTA5IDE2OCAxODIgODcgMjAxIDI0NiAxMDggMTQ5IDIxNSAxNTEgMjIyIDE5NCA3NCAxODkgMzggMTMzIDE0NSAxNjQgMTY4IAorMjQ4IDI0NCA5IDE4MyAxNCAyNDggODYgMTc5IDI5IDE3MiAxNzAgMTYzIDExNyAxNSAyMCA1NiAxMTUgOCAyMjQgMjA0IDEyMCA0NCAzMyAKKzk0IDg5IDIxIDE5OSAxOCA3OCA4NSAxOTEgMjAzIDYgMTU0IDEgMjEwIDExNSAxNjMgNTQgMTA4IDIxMiAxMjIgMjA5IDE1NiAxMDMgCisxNzYgNjMgNjYgMTg3IDEyMyAxMCAxMzkgNzcgMTI2IDEzMSA3NSAyMTEgOCA2OSAxMjQgMjE2IDIwMiAyMDUgMTcxIDI3IDcgNDcgMTU0IAorMzAgMjIzIDE1MyAxMzcgNzAgODMgMjkgODAgNjcgMjA5IDkzIDE5MyAxMTggMTI5IDE2MCA4OCAyIDIyOSA4MiA5OSAzMyAxNjAgMjQ2IAorNzkgMTMzIDE3NCAxNzcgMjA2IDIxOSAxMCAyMzEgMjQ3IDIyMiAzOSAyNDcgMzggMTk2IDU1IDIyMiAxMDIgMTU0IDkzIDEzMCAyMTEgCis3MSAyMjYgMTgyIDE1MCAxMDggNTQgNDIgNTUgNjQgMjUgMSA1MiAzNSA5IDIxMiAzMCAzNiA2MCAxOTUgNCAyMzkgMTI4IDIwMSAyOCAKKzEyMSAxODcgMTg2IDE2NyAxOTcgMTEgMzIgMjMwIDE5NiAyMzkgNjUgNDQgMjIwIDE4NyAzMSA4NyA0MyAxNjkgMjA0IDU3IDEzNyAyMjUgCisxNjAgMTgwIDE3MiA3OCAyNDAgMjEgMTA3IDk4IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNTMgNzQgMTYwIDI1IDkyIDE3NCAxNDggMTkzIAorMTgxIDM2IDIxOCAyMiAxNTggODEgMjA2IDEyNyA4NyAxMzUgODkgNTAgMjEyIDU5IDUyIDk4IDE2NiAyMCAyMTQgMTkyIDE1OSA2NiAzMiAKKzQ2IDEwNiA0NyAyNDkgMjAwIDY5IDYxIDU5IDE0NCAyMSAxNSAxNzUgMTM2IDE5IDEwMCA1MiAxMjcgMTgyIDU4IDE4NSAyMDggMTM0IAorMTMzIDI0MCA4NCAxNCAxNTYgMTY2IDgzIDEyMSA5NiAyMjIgMTMxIDE2NyAxMzQgMTA0IDIyNCA0NiA0MCAxNDAgMTkxIDE2IDE2MyAKKzIwOSAxODUgMTE2IDIxNCAzNyA4MiAxNjIgMTkwIDIxNSAxODAgMjM1IDIzNSA0OCAyMDUgMTMgMTk3IDEwMyAyMDUgNzYgMTA0IDE2MSAKKzEzOSAyMzIgMjA2IDM1IDE2NyAzOSAxODEgMTI4IDEzOCAxMTggNjYgMyAzMCA2NSA3MyAyMzMgMjI1IDUgMTAzIDE4IDIzMyAxNjIgOTUgCis0NSA4NCA3NyA2MyAyMjQgMTcgMjcgMTAyIDIxNyAzIDE4OCAxNDUgMjI3IDc1IDU2IDE3OCAxNjUgMzIgMTM4IDI2IDE0MyAxNTcgMTIyIAorMTQzIDI0OSA0NSAyMzkgMTU3IDIxNyA2NiA5NSAyMDMgMTYxIDIzMSAxNTUgNTIgMTkzIDg5IDExNiAxMjIgMTE0IDIzNiA3IDE4IDE0MSAKKzI0MiAyNDkgMTM3IDE2MiAzIDEyNSAyMzggNjkgXgorNTE0IDEgMTM5IDE0MSA3NyAzNyA3NyA0MiA1MCAxNzcgMzcgNSAxMjcgMTUzIDQ1IDE0MyAyMjggMTIxIDE1NiAxNjkgMTIwIDIxOSAKKzI0MSA1MSAxNjYgMjMyIDE5MiAxNTAgMTg4IDUzIDU1IDIyNyAxNDggODIgOTIgMTUwIDE3MiAzIDE5NiAyMzIgMTgyIDYxIDIyOSA2MyAKKzEyMyA5NyAxNzkgMTk0IDM5IDE3MiAyNTAgMTU3IDEzMiAxODcgOTUgMzggMTk5IDk0IDcwIDkzIDExOCAzNyAyMzEgMjQwIDk0IDYwIDQgCisxNTkgNDcgNTggMTEwIDEyNSAyNDMgMjEzIDIzOSAxMzYgNDMgMjI4IDEwNSAxMDYgNjkgMTI1IDEyIDUwIDE5OCAxMjYgMjE2IDExNyAKKzc0IDE3NSAxMTIgNDUgMTY0IDc2IDY5IDE0NiAxMDEgOSAxODggNTggOTQgNzUgMTQzIDIxOCAzMiAxOTcgMTc5IDE5OSA4OSAzMSAyNDUgCisxMjMgNzEgNDAgMTM1IDU0IDMzIDE3MCA4MyAzNCAxMTcgMTAwIDYyIDE3MSAzMCA1MSAxNDUgMTQzIDI0NCAxNjAgNCAxNjQgODYgMTU4IAorMTA1IDkxIDE4MiA2NiAyNyAxNjMgMTE4IDUyIDExOCA0NyA3OSAxOTkgODQgMjMzIDEzNCAxMjggMTA1IDEwMSAxOSAyNSAxNyA4NCA3IAorMjEgMTg3IDkwIDI0MCA5OSA5OSAxMDQgMTU0IDIgMjQ5IDIxNSAxNTQgMTggNDcgNjMgMTQ5IDIyNSAyMzggMTc5IDE3OCA3MiAzIDE5MSAKKzE4MiA4MiA2NiAxMSAxMTMgMTggNTcgMTUyIDEwOCAyMTUgMTU5IDU3IDE0NyA1OCAxMTUgMTY0IDkxIDIwOCAyMDUgODYgMTQ4IDE2IAorMTMyIDE5MiAxNDUgMTM4IDE5NCA2MCA5IDE5OCAxNDcgNTMgNjUgNjQgOTYgMjQyIDE0IDIyMiAxMTkgMjQxIDQ2IDExNiAxMzIgMTk3IAorMTg0IDIzOCAxODkgMjYgMjAwIDYyIDE3NiA4MCAxNTEgMTQwIDEwOSAxODMgMjQgNDQgMTkxIDE3MiAyMzQgMTA3IDIxIDE5MiAxNDAgCis5OSA5NCA2NSA1NCA3IDQyIDI0IDQ5IDIzMCAyMCAyMjkgNzMgMjEyIDQ1IDE2OSAxMTUgMTgwIDE0MSA1NiAyMDAgNDEgODcgMTIxIAorMTYxIDIxOSAyMzEgMjE0IDIwNyAxIDE5IDIwIDIxOSAyMzYgMTIgNTUgMjM3IDIzNyAyMTEgNzIgMTMgMjggMTQxIDcyIDIzOSAxNTIgCis4MiA4NyAxMDAgNzIgOCAyNDEgNDEgNzcgMzIgMjAyIDIyOSA0NyA4NCAyMzggMTg0IDIyOCAxMDAgNjcgMjEwIDEzMCA0NiAxMTEgOTMgCis5NyAxODkgMzEgMjUwIDE2MiAxNzEgMzUgOTAgNCAxMzggMTk5IDk5IDEyMCAxOTMgMTEzIDI0NCAxODEgOTMgMTIzIDc2IDkwIDIzNSAKKzQ5IDI1MSAxMDkgMTg4IDYzIDE0NCAxODYgMTM4IDE4NCAyMjMgNjEgMjA4IDIxNSAxNzUgMTA3IDYgNTMgODEgMTE0IDIwNyAyMzcgCisyMjEgMTYxIDIyNCAxOCA3MyAyMDIgMjA4IDIxMCAxMjUgMjQ4IDExIDk4IDEzMSAyNTAgMTY3IDIyMSAxNDYgODUgMjExIDg4IDYzIAorMTM5IDEzNiAyNyAxODkgNSAxMTEgMTAzIDE4NiAxNDggMjEgMTcxIDUxIDE0MCAxMDQgMTMzIDE2NSA0OSAyMjUgMjMzIDEyOSA3OCA1IAorMTA2IDY0IDg2IDE1MyA1NSAyMzIgMTg3IDExMSA3NyA1OCA4OSAzNiAzMiAyMjMgNjYgNiA3NCAxNzAgNjIgMTk3IDE2OSAxMTAgMTMwIAorNDEgNjEgMjM0IDEwMiAyMzQgOTIgMTQ1IDEzMyAxNTUgMjAxIDE0IDI0MyAyMDggMjAwIDM2IDQ4IDIxIDE2NiAxIDQwIDEwOSAxNzggCisyMjYgMTg1IDE5NiAyMDYgNDMgMiAyNDQgMTY1IDU0IDIzIDgxIDEyNCA0NCAxOTYgMjExIDkzIDEwMiAyMzkgMTMxIDI0NSAxMjggMTEwIAorMTUxIDEzMCAyMCAyMjQgMzQgMTEyIDUwIDIwMyAxNzYgNjQgMTEyIDQwIDExNCAyMTcgNzQgMTgwIDE1MSAxNDUgMTU5IDMxIDE5IDI1MSAKKzEzMCAyNSAyMiAxMzQgMTA3IDE2IDE0MiAyOSAxMDQgMTI4IDEyNiAxOTAgMjMwIDE1IDE5MCAyMjUgMjE3IDkwIDIzMCAxMCAxNDAgCisxMTQgMjIyIDEyNCAzOSAxNDYgMTExIDIxNyBeCis1MTAgMCAxNDcgNDYgMjQgMjE2IDk1IDM1IDc1IDExNSA3MyAyMDggMjA4IDM2IDExMyAxMyAxODUgMTcxIDExMyA5NSA4IDcxIDMxIDgxIAorMjA0IDM0IDE5OCAxNDQgMTY0IDg0IDY3IDIyOCA5MyAxMSAxMDYgMTI5IDc2IDE3MiAyMjUgNjYgMTcxIDE5NSAxNzIgMTQzIDIyNCAzNiAKKzIzIDE2NyAyMDEgNyAxMDQgMjE0IDIwNyAxNTEgMTM4IDIwIDUwIDI2IDEzMSAyMTggMzcgMTYyIDE2MSAxOTQgMTQyIDE0IDIxNSA2NSAKKzE0MSA0NyAxNDQgMTkxIDg4IDE1MSAyMjAgOTcgMTg1IDE5OCAxMTcgMTYwIDc1IDIwNSAxNzMgMTkyIDExOCA0NSAyMjkgNjggODYgNjQgCisxNzQgMjMwIDE2IDEzOCAxOTIgMjI3IDEyNiAyMTMgMjMyIDk1IDE4MCAyMjkgMTUwIDE2MyAxOTkgOTIgMjM1IDIxMiAxMjAgMTI0IDE3IAorMTA1IDkgMTAxIDE3OSAxMDkgMTU2IDE3MCA4MyAyMDEgMjM0IDEwMCAxNDkgMjE1IDE0NyAyMTggMTgyIDYyIDE3NyAzMCAxMzMgMTMzIAorMTYwIDE2NCAyNDggMjQwIDkgMTgzIDIgMjQ0IDc0IDE3NSAyNSAxNjQgMTY2IDE2MyAxMDkgMTEgMTYgNDggMTExIDggMjE2IDIwNCAKKzExNiA0MCAyNSA4MiA4OSA5IDE5MSA2IDc0IDg1IDE3OSAxOTkgMiAxNTQgMjQ3IDIxMCAxMTUgMTU1IDUwIDEwOCAyMDggMTE4IDIwOSAKKzE0OCAxMDMgMTc2IDU1IDU4IDE3NSAxMTUgMTAgMTMxIDczIDExOCAxMjcgNzEgMjAzIDQgNjkgMTE2IDIxMiAyMDIgMjAxIDE3MSAyMyAKKzI0OSA0MyAxNDIgMjIgMjE5IDE0OSAxMzMgNzAgODMgMjkgNzYgNjcgMjAxIDg5IDE4MSAxMTQgMTI1IDE1NiA4MCAyIDIxNyA3MCA5MSAKKzMzIDE2MCAyNDYgNzEgMTIxIDE2MiAxNjkgMTk4IDIwNyA2IDIxOSAyMzkgMjE0IDM1IDI0NyAzOCAxOTIgNTUgMjIyIDk0IDE1MCA4MSAKKzEyMiAyMTEgNjMgMjI2IDE3OCAxNDIgMTA0IDQyIDMwIDUxIDU2IDI1IDI0NiAyNDMgNDQgMjcgMjUxIDIxMiAzMCAyNCA1MiAxOTUgCisyMzkgMTI0IDE4OSAyOCAxMDkgMTgzIDE3NCAxNjcgMTkzIDMgMjAgMjIyIDE4NCAyMzEgNjUgMzIgMjIwIDE3OSAyNyA3OSAzNSAxNjUgCisxOTYgNTcgMTM3IDIxNyAxNTIgMTY4IDE2OCA3OCAyMzIgMTMgMTAzIDk0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNDEgNzQgMTQ4IDIxIAorODAgMTc0IDE0MCAxODkgMTczIDI4IDIxOCAxMCAxNTggNzcgMjAyIDExOSA3NSAxMjMgNzcgMzggMjAwIDU5IDUyIDg2IDE1NCAyMCAKKzIxNCAxODAgMTQ3IDU0IDI4IDQ2IDEwNiAzOSAyNDkgMTg4IDYxIDU3IDU1IDE0MCAxNyAxNSAxNjMgMTM2IDE1IDEwMCA0MCAxMTUgCisxODIgNTQgMTczIDIwMCAxMjIgMTI5IDI0MCA3MiA2IDE1NiAxNjIgNzkgMTE3IDI0MiA5NiAyMTAgMTIzIDE1OSAxMzQgMTAwIDIxMiAKKzM4IDI4IDEzNiAxODcgNCAxNTkgMTk3IDE3NyAxMTIgMjEwIDMzIDc4IDE1MCAxOTAgMjAzIDE3NiAyMjcgMjM1IDQwIDE5NyA1IDE4OSAKKzkxIDIwNSA2NCA5MiAxNTMgMTM1IDIyMCAyMDYgMzEgMTYzIDI3IDE2OSAxMTYgMTMwIDEwNiA2NiAyNTMgMTggNTMgNjEgMjI5IDIxMyAKKzUgOTkgMTAgMjIxIDE1NCA4MyAzNyA4MCA2NSA1OSAyMjQgOSAxOSAxMDIgMjA5IDMgMTg0IDE0MSAyMTkgNjcgNTYgMTcwIDE2NSAyNCAKKzEzNCAxOCAxMzUgMTU3IDExMCAxMzEgMjQ1IDQxIDIyNyAxNTMgMjE3IDYyIDg3IDIwMyAxNDkgMjIzIDE1MSA0OCAxOTMgODUgMTE2IAorMTIyIDEwMiAyMzYgNyAxNCAxMzMgMjQyIDI0MSAxMjkgMTU4IDI0OSAxMjUgMjM4IDE1NyAxMzcgMTM1IDc1IDMzIDI1MCA3MyAzNiA1MCAKKzE3MSAzMSAyNTMgMTI3IDE1MyA0NSAxMzkgMjIyIDEyMSAxNTQgMTY1IDExNCAyMTUgMjM3IDQ1IDE2NiAyMjYgMTg2IDE0NiAxODggNTMgCis1MyAyMjUgMTQ4IDI0OCAxMTggXgorNTMzIDAgODcgMTQ1IDE1NyAyNTAgMTgxIDIyNyAxNzcgNTEgMjI0IDYzIDEwOCA5NyAxNzQgMTk0IDI0IDE2MiAyNTAgMTUyIDEzMiAKKzE4MiA4MCAzMyAxODkgODQgNjAgODMgMTE4IDM3IDIxNiAyMzUgOTQgNjAgMjUxIDE1NCA0NyA0OCAxMTAgMTIwIDIzOCAyMDggMjI5IAorMTIxIDQzIDIxOCA5MCA5MSA2NCAxMTAgMTIgNDAgMTkzIDExMSAyMTEgMTE3IDY0IDE3MCAxMDcgMzUgMTY0IDc2IDU0IDE0MSAxMDEgNCAKKzE4MyA1MyA3OSA2MCAxNDMgMjEzIDMyIDE4NyAxNjkgMTk0IDg0IDMxIDI0NSAxMjMgNjYgMjUgMTM1IDM5IDIzIDE2MCA3OCAyOSAxMDIgCis5NSA2MiAxNjYgMjAgNDYgMTM1IDEyOCAyNDQgMTUwIDI0NiAxNTQgNzYgMTQzIDEwNSA5MSAxNzIgNTEgMjcgMTU4IDEwMyAzNyAxMDggCiszNyA3OSAxOTkgODQgMjI4IDExOSAxMjggOTUgOTEgNCAxNSAxNyA2OSAyIDExIDE4NyA4MCAyMzAgOTQgODkgODkgMTQ5IDI0NCAyMzkgCisyMTAgMTQ0IDE4IDQyIDQ4IDEzOSAyMTUgMjMzIDE3OSAxNjMgMjUyIDY3IDI1NSAxODEgMTY3IDgyIDU2IDI1MyA5OCA4IDQyIDEzNyAKKzEwMyAyMDUgMTQ0IDQ3IDEzNyA0MyAxMTAgMTQ5IDc2IDIwMyAyMDAgODYgMTQzIDE2IDEyNyAxODIgMTQwIDEyOCAxODQgNTUgMjUxIAorMTgzIDE0MiA0MyA1MCA1NCA4MSAyMzIgOSAyMTIgMTE5IDIzNiAzNiAxMDYgMTIyIDE4MiAxNjkgMjIzIDE3OSAyNiAxODUgNTcgMTY2IAorODAgMTQxIDEzMCA5OSAxNzggMjQgNDQgMTkxIDE2NyAyMTkgOTIgNiAxODcgMTQwIDk5IDg5IDYwIDU0IDI0OSA0MiAxOSA0NCAyMjAgNSAKKzIxNCA2MyAxOTcgMzAgMTY0IDEwNSAxODAgMTM2IDQxIDE5NSAyNiA3NyAxMTYgMTUxIDIxOSAyMzEgMjA0IDIwMiAxIDkgMTUgMjE0IAorMjMxIDcgNDAgMjIyIDIzNyAyMDYgNTcgMjU1IDEzIDEzMSA3MiAyMjQgMTUyIDcyIDg3IDg1IDYyIDI1NSAyNDEgMzYgNzcgMjcgMTg3IAorMjI5IDMyIDc5IDIyOCAxNzkgMjIzIDkwIDYyIDE5NSAxMTUgNDEgMTA2IDkzIDg3IDE3NCAyNiAyNDUgMTUyIDE2MSAyMCA3NSA0IDEyMyAKKzE4NCA4NCAxMjAgMTc4IDExMyAyMzQgMTgxIDc4IDExOCA2NiA4NSAyMzAgMzQgMjUxIDk0IDE3OCA1MyAxMzkgMTg2IDEzOCAxODQgCisyMjMgNjEgMTkzIDIwMCAxNzUgMTA3IDYgMzggODEgMTE0IDIwNyAyMjcgMjA2IDE0NiAyMTkgMyA3MyAxOTcgMTk4IDIwMCAxMTUgMjM4IAorMTEgOTggMTE2IDI0MCAxNTIgMjIxIDE0NiA3MCAyMDEgODggNTggMTM5IDEyNiAxMiAxODkgMjUyIDk2IDkzIDE3NiAxMzggMTYgMTU2IAorNTEgMTM1IDk5IDExOCAxNTUgNDkgMjIwIDIzMyAxMTkgNjggOTYgNjQgODEgMTQzIDQ1IDIyMiAxNzcgMTExIDYyIDU4IDc5IDMxIDE3IAorMjE4IDYxIDI1MyA2OSAxNzAgNDcgMTk3IDE2OSAxMDUgMTIwIDQxIDQ2IDIyNCA5MiAyMzQgOTIgMTQ1IDEyOCAxNTUgMTg2IDI1NiAKKzI0MyAyMDggMjAwIDI2IDQ4IDIxIDE1NiAyNDggNDAgMTA0IDE3OCAyMjEgMTc1IDE5NiAxOTYgMjggMjQ5IDIzOSAxNTAgNDkgMjMgNzEgCisxMTQgMzkgMTkxIDE5NiA4OCA4NyAyMzQgMTIxIDI0MCAxMjMgOTUgMTUxIDEzMCAxMCAyMTQgMzQgMTAyIDM1IDE5MyAxNzEgNDkgMTEyIAorMzUgMTA0IDIwNyA1OSAxNzAgMTM2IDEzMCAxNTkgMTYgMTkgMjQxIDEyNSAxMCAxNyAxMjkgOTcgNiAxMjcgMTQgMTA0IDExOCAxMjYgCisxODAgMjI1IDUgMTg1IDIyNSAyMDIgOTAgMjMwIDUgMTI1IDk5IDIwNyAxMTkgMzkgMTMxIDEwMSA5MyAxNDcgNDMgMjEgMjE2IDg2IDM1IAorNzUgMTEyIDY0IDE5OSAyMDIgMzAgMTA0IDEwIDE4NSAxNjUgMTA3IDk1IDIgNzEgMjUgNzUgMjAxIDI4IDE4OSAxNDQgMTU1IDc4IDU4IAorMjI4IDkwIDIgMTAwIDEyMCA3MCAxNzIgMjE5IDYzIDE2OCAxOTIgMTY5IDEzNCAyMTUgMzYgMTcgMTU4IDE5MiAxIDk4IDIwNSAxMzcgXgorNTIyIDEgMTM5IDEzMCAxMiA0MiAyMiAxMzEgMjA2IDMzIDE2MiAxNjEgMTg2IDE0MiAxNCAyMTEgNTcgMTQxIDM5IDEzMiAxODcgODAgCisxNDMgMjE2IDg1IDE3MyAxOTggMTA5IDE0OCAyNDYgNjcgMTk3IDE3MyAxOTIgMTA2IDM3IDIxNyA2NCA4MiA1NiAxNjYgMjE4IDQgMTI2IAorMTg0IDIyNyAxMTQgMjEzIDIyOCA5MSAxNzIgMjIxIDE1MCAxNTUgMTg3IDg0IDIzMSAyMDQgMTE2IDEyNCA1IDEwMSA1IDk3IDE3NSAKKzEwOSAxNDQgMTU4IDc5IDIwMSAyMjIgOTIgMTQ5IDIxNSAxNDMgMjE0IDE3MCA1MCAxNjUgMjIgMTMzIDEyMSAxNTYgMTYwIDI0OCAyMzYgCis5IDE4MyAyNDggMjQwIDYyIDE3MSAyMSAxNTYgMTYyIDE2MyAxMDEgNyAxMiA0MCAxMDcgOCAyMDggMjA0IDExMiAzNiAxNyA3MCA4OSAKKzI1NSAxODMgMjUyIDcwIDg1IDE2NyAxOTUgMjU2IDE1NCAyNDMgMjEwIDExNSAxNDcgNDYgMTA4IDIwNCAxMTQgMjA5IDE0MCAxMDMgCisxNzYgNDcgNTAgMTYzIDEwNyAxMCAxMjMgNjkgMTEwIDEyMyA2NyAxOTUgNjkgMTA4IDIwOCAyMDIgMTk3IDE3MSAxOSAyNDEgMzkgMTMwIAorMTQgMjE1IDE0NSAxMjkgNzAgODMgMjkgNzIgNjcgMTkzIDg1IDE2OSAxMTAgMTIxIDE1MiA3MiAyIDIwNSA1OCA4MyAzMyAxNjAgMjQ2IAorNjMgMTA5IDE1MCAxNjEgMTkwIDE5NSAyIDIwNyAyMzEgMjA2IDMxIDI0NyAzOCAxODggNTUgMjIyIDg2IDE0NiA2OSAxMTQgMjExIDU1IAorMjI2IDE3NCAxMzQgMTAwIDMwIDE4IDQ3IDQ4IDI1IDI0MiAyMzUgMzYgMTkgMjQzIDIxMiAzMCAxMiA0NCAxOTUgMjU0IDIzOSAxMjAgCisxNzcgMjggOTcgMTc5IDE2MiAxNjcgMTg5IDI1MyA4IDIxNCAxNzIgMjIzIDY1IDIwIDIyMCAxNzEgMjMgNzEgMjcgMTYxIDE4OCA1NyAKKzEzNyAyMDkgMTQ0IDE1NiAxNjQgNzggMjI0IDUgOTkgOTAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDEyOSA3NCAxMzYgMTcgNjggMTc0IAorMTMyIDE4NSAxNjUgMjAgMjE4IDI1NiAxNTggNzMgMTk4IDExMSA2MyAxMTEgNjUgMjYgMTg4IDU5IDUyIDc0IDE0MiAyMCAyMTQgMTY4IAorMTM1IDQyIDI0IDQ2IDEwNiAzMSAyNDkgMTc2IDUzIDUzIDUxIDEzNiAxMyAxNSAxNTEgMTM2IDExIDEwMCAyOCAxMDMgMTgyIDUwIDE2MSAKKzE5MiAxMTAgMTI1IDI0MCA2MCAyNTYgMTU2IDE1OCA3NSAxMTMgMjM0IDk2IDE5OCAxMTUgMTUxIDEzNCA5NiAyMDAgMzAgMTYgMTMyIAorMTgzIDI1MCAxNTUgMTg1IDE2OSAxMDggMjA2IDI5IDc0IDEzOCAxOTAgMTkxIDE3MiAyMTkgMjM1IDMyIDE4OSAyNTUgMTgxIDc5IDIwNSAKKzUyIDgwIDE0NSAxMzEgMjA4IDIwNiAyNyAxNTkgMTUgMTU3IDEwNCAxMjIgOTQgNjYgMjUzIDYgNDEgNDkgMjI1IDIwMSA1IDk1IDIgCisyMDkgMTQ2IDcxIDI5IDc2IDUzIDU1IDIyNCAxIDExIDEwMiAyMDEgMyAxODAgMTM3IDIxMSA1OSA1NiAxNjIgMTY1IDE2IDEzMCAxMCAKKzEyNyAxNTcgOTggMTE5IDI0MSAzNyAyMTUgMTQ5IDIxNyA1OCA3OSAyMDMgMTM3IDIxNSAxNDcgNDQgMTkzIDgxIDExNiAxMjIgOTAgCisyMzYgNyAxMCAxMjUgMjQyIDIzMyAxMjEgMTU0IDI0NSAxMjUgMjM4IDE0NSAxMzMgMTIzIDcxIDI1IDI0NiA2NSAyNCA1MCAxNTkgMTkgCisyNDUgMTI3IDE1MyA0NSAxMzEgMjEwIDEyMSAxNTAgMTU3IDEwMiAyMDcgMjI5IDMzIDE2NiAyMTQgMTc0IDEzOCAxODggNTMgNDkgMjIxIAorMTQ4IDI0MCA2NCA4NiAxNDQgMTU0IDI0OSAxNzggMjI2IDE3NiA0OSAyMjMgNjMgMTA1IDk3IDE3MyAxOTQgMjEgMTYwIDI1MCAxNTEgCisxMzIgMTgxIDc3IDMyIDE4NyA4MiA1OCA4MSAxMTggMzcgMjEzIDIzNCA5NCA2MCAyNTAgMTUzIDQ3IDQ2IDExMCAxMTkgMjM3IDIwNyAKKzIyNyAxMTggNDMgMjE2IDg3IDg4IDYzIDEwNyAxMiAzOCAxOTIgMTA4IDIxMCAxMTcgNjIgMTY5IDEwNiAzMyAxNjQgNzYgNTEgMjExIF4KKzU0MCAwIDEwMSAxIDE4MCA1MCA3MCA1MSAxNDMgMjEwIDMyIDE4MSAxNjMgMTkxIDgxIDMxIDI0NSAxMjMgNjMgMTYgMTM1IDMwIDE3IAorMTU0IDc1IDI2IDkzIDkyIDYyIDE2MyAxNCA0MyAxMjkgMTE5IDI0NCAxNDQgMjQwIDE0OCA3MCAxMzQgMTA1IDkxIDE2NiA0MiAyNyAKKzE1NSA5NCAyOCAxMDIgMzEgNzkgMTk5IDg0IDIyNSAxMTAgMTI4IDg5IDg1IDI1NSA5IDE3IDYwIDI1OSA1IDE4NyA3NCAyMjQgOTEgODMgCis4MCAxNDYgMjM4IDIzMyAyMDcgMTM4IDE4IDM5IDM5IDEzMyAyMDkgMjMwIDE3OSAxNTQgMjUyIDY0IDI1NSAxNzUgMTU4IDgyIDUwIAorMjQ3IDg5IDIgMzMgMTI4IDEwMCAxOTkgMTM1IDQxIDEzMSAzNCAxMDcgMTQwIDY3IDIwMCAxOTcgODYgMTQwIDE2IDEyNCAxNzYgMTM3IAorMTIyIDE3OCA1MiAyNDUgMTc0IDEzOSAzNyA0MSA0OCA3MiAyMjYgNiAyMDYgMTE5IDIzMyAzMCAxMDAgMTE2IDE3MyAxNjAgMjE0IDE3MyAKKzI2IDE3NiA1NCAxNjAgODAgMTM1IDEyNCA5MyAxNzUgMjQgNDQgMTkxIDE2NCAyMTAgODMgMjU3IDE4NCAxNDAgOTkgODYgNTcgNTQgCisyNDMgNDIgMTYgNDEgMjE0IDI1NiAyMDUgNTcgMTg4IDIxIDE2MSA5OSAxODAgMTMzIDMyIDE5MiAxNyA3MSAxMTMgMTQ1IDIxOSAyMzEgCisxOTggMTk5IDEgMyAxMiAyMTEgMjI4IDQgMzEgMjEzIDIzNyAyMDMgNDggMjQ5IDQgMTI1IDcyIDIxNSAxNTIgNjYgODcgNzYgNTYgMjUyIAorMjQxIDMzIDc3IDI0IDE3OCAyMjkgMjMgNzYgMjIyIDE3NiAyMjAgODQgNTkgMTg2IDEwNiAzOCAxMDMgOTMgODEgMTY1IDIzIDI0MiAKKzE0NiAxNTUgMTEgNjYgNCAxMTQgMTc1IDc1IDEyMCAxNjkgMTEzIDIyOCAxODEgNjkgMTE1IDYwIDgyIDIyNyAyNSAyNTEgODUgMTcyIAorNDcgMTM2IDE4NiAxMzggMTg0IDIyMyA2MSAxODQgMTkxIDE3NSAxMDcgNiAyOSA4MSAxMTQgMjA3IDIyMSAxOTcgMTM3IDIxNiAyNTQgCis3MyAxOTQgMTkyIDE5NCAxMDkgMjMyIDExIDk4IDEwNyAyMzQgMTQzIDIyMSAxNDYgNjEgMTk1IDg4IDU1IDEzOSAxMjAgMyAxODkgMjQ5IAorODcgODcgMTcwIDEzMiAxMyAxNDcgNTEgMTMyIDk2IDEwOSAxNDkgNDkgMjE3IDIzMyAxMTMgNjIgMjU3IDkwIDY0IDc4IDEzNyAzOSAKKzIxNiAxNzEgMTExIDUzIDU4IDczIDI4IDggMjE1IDU4IDI1MCA2NiAxNzAgMzggMTk3IDE2OSAxMDIgMTE0IDQxIDM3IDIxOCA4NiAyMzQgCis5MiAxNDUgMTI1IDE1NSAxNzcgMjUwIDI0MyAyMDggMjAwIDIwIDQ4IDIxIDE1MCAyNDUgNDAgMTAxIDE3OCAyMTggMTY5IDE5NiAxOTAgCisxOSAyNDYgMjM2IDE0MSA0NiAyMyA2NSAxMDggMzYgMTg4IDE4NyA4NSA3OCAyMzEgMTE1IDIzNyAxMjAgODYgMTUxIDEzMCA0IDIwOCAKKzM0IDk2IDI2IDE4NyAxNjggNDAgMTEyIDMyIDk4IDIwMSA1MCAxNjQgMTI3IDEyMSAxNTkgNyAxOSAyMzUgMTIyIDEgMTQgMTI2IDkxIAorMTE4IDUgMTA0IDExMiAxMjYgMTc0IDIyMiAyNTkgMTgyIDIyNSAxOTMgOTAgMjMwIDIgMTE2IDkwIDE5OCAxMTYgMzkgMTIyIDk1IDkwIAorMTQ3IDQwIDE4IDIxNiA3NyAzNSA3NSAxMDkgNTUgMTkwIDE5NiAyNCA5NSA3IDE4NSAxNTkgMTAxIDk1IDI1NiA3MSAxOSA2OSAxOTggCisyMiAxODAgMTQ0IDE0NiA3MiA0OSAyMjggODcgMjUzIDk0IDExMSA2NCAxNzIgMjEzIDYwIDE2NSAxODkgMTY2IDEyNSAyMDYgMzYgMTEgCisxNDkgMTgzIDI1NSA5MiAxOTYgMjAxIDEzMyAxMjYgOCAzOCAyMCAxMzEgMjAwIDMxIDE2MiAxNjEgMTgyIDE0MiAxNCAyMDkgNTMgMTQxIAorMzUgMTI2IDE4NSA3NiAxMzkgMjE0IDc5IDE2NyAxOTggMTA1IDE0MiAyNDIgNjMgMTkzIDE3MyAxOTIgMTAwIDMzIDIxMSA2MiA4MCA1MiAKKzE2MiAyMTIgMjU4IDEyMCAxODAgMjI3IDEwOCAyMTMgMjI2IDg5IDE2OCAyMTcgMTUwIDE1MSAxODEgODAgMjI5IDIwMCAxMTQgMTI0IAorMjU5IDk5IDMgOTUgMTczIDEwOSAxMzggMTUyIDc3IDIwMSAxMjkgXgorNTU1IDAgODQgMTQ5IDIxNSAxMzkgMjEwIDE1OCAzOCAxNTMgMTQgMTMzIDEwOSAxNTIgMTU2IDI0OCAyMzIgOSAxODMgMjQwIDIzNiA1MCAKKzE2NyAxNyAxNDggMTU4IDE2MyA5MyAzIDggMzIgMTAzIDggMjAwIDIwNCAxMDggMzIgOSA1OCA4OSAyNDcgMTc1IDI0NCA2NiA4NSAxNTUgCisxOTEgMjU2IDE1NCAyMzkgMjEwIDExNSAxMzkgNDIgMTA4IDIwMCAxMTAgMjA5IDEzMiAxMDMgMTc2IDM5IDQyIDE1MSA5OSAxMCAxMTUgCis2NSAxMDIgMTE5IDYzIDE4NyAyNTggNjkgMTAwIDIwNCAyMDIgMTkzIDE3MSAxNSAyMzMgMzUgMTE4IDYgMjExIDE0MSAxMjUgNzAgODMgCisyOSA2OCA2NyAxODUgODEgMTU3IDEwNiAxMTcgMTQ4IDY0IDIgMTkzIDQ2IDc1IDMzIDE2MCAyNDYgNTUgOTcgMTM4IDE1MyAxODIgMTgzIAorMjYwIDE5NSAyMjMgMTk4IDI3IDI0NyAzOCAxODQgNTUgMjIyIDc4IDE0MiA1NyAxMDYgMjExIDQ3IDIyNiAxNzAgMTI2IDk2IDE4IDYgCis0MyA0MCAyNSAyMzggMjI3IDI4IDExIDIzNSAyMTIgMzAgMzYgMTk1IDI1NCAyMzkgMTE2IDE2NSAyOCA4NSAxNzUgMTUwIDE2NyAxODUgCisyNDkgMjU4IDIwNiAxNjAgMjE1IDY1IDggMjIwIDE2MyAxOSA2MyAxOSAxNTcgMTgwIDU3IDEzNyAyMDEgMTM2IDE0NCAxNjAgNzggMjE2IAorMjU5IDk1IDg2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxMTcgNzQgMTI0IDEzIDU2IDE3NCAxMjQgMTgxIDE1NyAxMiAyMTggMjQ4IDE1OCAKKzY5IDE5NCAxMDMgNTEgOTkgNTMgMTQgMTc2IDU5IDUyIDYyIDEzMCAyMCAyMTQgMTU2IDEyMyAzMCAyMCA0NiAxMDYgMjMgMjQ5IDE2NCAKKzQ1IDQ5IDQ3IDEzMiA5IDE1IDEzOSAxMzYgNyAxMDAgMTYgOTEgMTgyIDQ2IDE0OSAxODQgOTggMTIxIDI0MCA0OCAyNTIgMTU2IDE1NCAKKzcxIDEwOSAyMjYgOTYgMTg2IDEwNyAxNDMgMTM0IDkyIDE4OCAyMiA0IDEyOCAxNzkgMjQyIDE1MSAxNzMgMTYxIDEwNCAyMDIgMjUgNzAgCisxMjYgMTkwIDE3OSAxNjggMjExIDIzNSAyNCAxODEgMjUxIDE3MyA2NyAyMDUgNDAgNjggMTM3IDEyNyAxOTYgMjA2IDIzIDE1NSAzIAorMTQ1IDkyIDExNCA4MiA2NiAyNTMgMjU2IDI5IDM3IDIyMSAxODkgNSA5MSAyNTYgMTk3IDEzOCA1OSAyMSA3MiA0MSA1MSAyMjQgMjU1IAorMyAxMDIgMTkzIDMgMTc2IDEzMyAyMDMgNTEgNTYgMTU0IDE2NSA4IDEyNiAyIDExOSAxNTcgODYgMTA3IDIzNyAzMyAyMDMgMTQ1IDIxNyAKKzU0IDcxIDIwMyAxMjUgMjA3IDE0MyA0MCAxOTMgNzcgMTE2IDEyMiA3OCAyMzYgNyA2IDExNyAyNDIgMjI1IDExMyAxNTAgMjQxIDEyNSAKKzIzOCAxMzMgMTI5IDExMSA2NyAxNyAyNDIgNTcgMTIgNTAgMTQ3IDcgMjM3IDEyNyAxNTMgNDUgMTIzIDE5OCAxMjEgMTQ2IDE0OSA5MCAKKzE5OSAyMjEgMjEgMTY2IDIwMiAxNjIgMTMwIDE4OCA1MyA0NSAyMTcgMTQ4IDIzMiA1MiA4MiAxNDAgMTQyIDI0NSAxNjYgMjIyIDE3MiAKKzQxIDIxOSA2MyA5MyA5NyAxNjkgMTk0IDkgMTUyIDI1MCAxNDcgMTMyIDE3NyA2NSAyOCAxNzkgNzQgNTAgNzMgMTE4IDM3IDIwMSAyMzAgCis5NCA2MCAyNDYgMTQ5IDQ3IDM4IDExMCAxMTUgMjMzIDIwMyAyMTkgMTA2IDQzIDIwOCA3NSA3NiA1OSA5NSAxMiAzMCAxODggOTYgMjA2IAorMTE3IDU0IDE2NSAxMDIgMjUgMTY0IDc2IDM5IDEzNiAxMDEgMjYxIDE3OCA0OCA2NCA0NSAxNDMgMjA4IDMyIDE3NyAxNTkgMTg5IDc5IAorMzEgMjQ1IDEyMyA2MSAxMCAxMzUgMjQgMTMgMTUwIDczIDI0IDg3IDkwIDYyIDE2MSAxMCA0MSAxMjUgMTEzIDI0NCAxNDAgMjM2IDE0NCAKKzY2IDEyOCAxMDUgOTEgMTYyIDM2IDI3IDE1MyA4OCAyMiA5OCAyNyA3OSAxOTkgODQgMjIzIDEwNCAxMjggODUgODEgMjUxIDUgMTcgNTQgCisyNTkgMSAxODcgNzAgMjIwIDg5IDc5IDc0IDE0NCAyMzQgMjI5IDIwNSAxMzQgMTggMzcgMzMgMTI5IDIwNSAyMjggMTc5IDE0OCAyNTIgCis2MiAyNTUgMTcxIDE1MiA4MiA0NiAyNDMgODMgMjYwIDI3IDEyMiA5OCAxOTUgMTI5IDM3IDEyNyAyOCAxMDUgMTM0IDIwNyBeCis1NDUgMSAxOTYgMTkzIDg2IDEzNiAxNiAxMjAgMTY4IDEzMyAxMTQgMTcwIDQ4IDIzNyAxNjIgMTM1IDI5IDI5IDQwIDYwIDIxOCAyIAorMTk4IDExOSAyMjkgMjIgOTIgMTA4IDE2MSAxNDggMjAyIDE2NSAyNiAxNjQgNTAgMTUyIDgwIDEyNyAxMTYgODUgMTcxIDI0IDQ0IDE5MSAKKzE2MCAxOTggNzEgMjQ5IDE4MCAxNDAgOTkgODIgNTMgNTQgMjM1IDQyIDEyIDM3IDIwNiAyNDggMTkzIDQ5IDE3NiA5IDE1NyA5MSAxODAgCisxMjkgMjAgMTg4IDUgNjMgMTA5IDEzNyAyMTkgMjMxIDE5MCAxOTUgMSAyNTkgOCAyMDcgMjI0IDE5IDIwMSAyMzcgMTk5IDM2IDI0MSAKKzI1NiAxMTcgNzIgMjAzIDE1MiA1OCA4NyA2NCA0OCAyNDggMjQxIDI5IDc3IDIwIDE2NiAyMjkgMTEgNzIgMjE0IDE3MiAyMTYgNzYgNTUgCisxNzQgOTQgMzQgOTkgOTMgNzMgMTUzIDE5IDIzOCAxMzggMTQ3IDI2MyA1NCA0IDEwMiAxNjMgNjMgMTIwIDE1NyAxMTMgMjIwIDE4MSAKKzU3IDExMSA1MiA3OCAyMjMgMTMgMjUxIDczIDE2NCAzOSAxMzIgMTg2IDEzOCAxODQgMjIzIDYxIDE3MiAxNzkgMTc1IDEwNyA2IDE3IAorODEgMTE0IDIwNyAyMTMgMTg1IDEyNSAyMTIgMjQ2IDczIDE5MCAxODQgMTg2IDEwMSAyMjQgMTEgOTggOTUgMjI2IDEzMSAyMjEgMTQ2IAorNDkgMTg3IDg4IDUxIDEzOSAxMTIgMjU1IDE4OSAyNDUgNzUgNzkgMTYyIDEyNCA5IDEzNSA1MSAxMjggOTIgOTcgMTQxIDQ5IDIxMyAKKzIzMyAxMDUgNTQgMjU3IDgyIDY0IDc0IDEyOSAzMSAyMDggMTYzIDExMSA0MSA1OCA2NSAyNCAyNjAgMjExIDU0IDI0NiA2MiAxNzAgMjYgCisxOTcgMTY5IDk4IDEwNiA0MSAyNSAyMTAgNzggMjM0IDkyIDE0NSAxMjEgMTU1IDE2NSAyNDIgMjQzIDIwOCAyMDAgMTIgNDggMjEgMTQyIAorMjQxIDQwIDk3IDE3OCAyMTQgMTYxIDE5NiAxODIgNyAyNDIgMjMyIDEyOSA0MiAyMyA1NyAxMDAgMzIgMTg0IDE3NSA4MSA2NiAyMjcgCisxMDcgMjMzIDExNiA3NCAxNTEgMTMwIDI2MCAyMDAgMzQgODggMTQgMTc5IDE2NCAyOCAxMTIgMjggOTAgMTkzIDM4IDE1NiAxMTUgMTA5IAorMTU5IDI1OSAxOSAyMjcgMTE4IDI1MyAxMCAxMjIgODMgMjU2IDEwNiAyNTcgMTA0IDEwNCAxMjYgMTY2IDIxOCAyNTUgMTc4IDIyNSAKKzE4MSA5MCAyMzAgMjYyIDEwNCA3OCAxODYgMTEyIDM5IDExMCA4NyA4NiAxNDcgMzYgMTQgMjE2IDY1IDM1IDc1IDEwNSA0MyAxNzggCisxODggMTYgODMgMyAxODUgMTUxIDkzIDk1IDI1MiA3MSAxMSA2MSAxOTQgMTQgMTY4IDE0NCAxMzQgNjQgMzcgMjI4IDgzIDI0NSA4NiAKKzk5IDU2IDE3MiAyMDUgNTYgMTYxIDE4NSAxNjIgMTEzIDE5NCAzNiAzIDEzNyAxNzEgMjUxIDg0IDE4NCAxOTcgMTIxIDExOCAzMCAxNiAKKzEzMSAxODggMjcgMTYyIDE2MSAxNzQgMTQyIDE0IDIwNSA0NSAxNDEgMjcgMTE0IDE4MSA2OCAxMzEgMjEwIDY3IDE1NSAxOTggOTcgCisxMzAgMjM0IDU1IDE4NSAxNzMgMTkyIDg4IDI1IDE5OSA1OCA3NiA0NCAxNTQgMjAwIDI1MCAxMDggMTcyIDIyNyA5NiAyMTMgMjIyIDg1IAorMTYwIDIwOSAxNTAgMTQzIDE2OSA3MiAyMjUgMTkyIDExMCAxMjQgMjUxIDk1IDI2MyA5MSAxNjkgMTA5IDEyNiAxNDAgNzMgMjAxIDIwNCAKKzgwIDE0OSAyMTUgMTM3IDIwOCAxNTIgMzIgMTQ3IDEwIDEzMyAxMDMgMTUwIDE1NCAyNDggMjMwIDkgMTgzIDIzNiAyMzQgNDQgMTY1IAorMTUgMTQ0IDE1NiAxNjMgODkgMSA2IDI4IDEwMSA4IDE5NiAyMDQgMTA2IDMwIDUgNTIgODkgMjQzIDE3MSAyNDAgNjQgODUgMTQ5IDE4OSAKKzI1NiAxNTQgMjM3IDIxMCAxMTUgMTM1IDQwIDEwOCAxOTggMTA4IDIwOSAxMjggMTAzIDE3NiAzNSAzOCAxNDUgOTUgMTAgMTExIDYzIAorOTggMTE3IDYxIDE4MyAyNTggNjkgOTYgMjAyIDIwMiAxOTEgMTcxIDEzIDIyOSAzMyAxMTIgMiAyMDkgMTM5IDEyMyA3MCA4MyAyOSA2NiAKKzY3IDE4MSA3OSAxNTEgMTA0IDExNSAxNDYgNjAgMiAxODcgNDAgNzEgMzMgMTYwIDI0NiA1MSA5MSAxMzIgMTc4IF4KKzU2MyAxIDE3NCAxNzEgMjYwIDE4MyAyMTUgMTkwIDIzIDI0NyAzOCAxODAgNTUgMjIyIDcwIDEzOCA0NSA5OCAyMTEgMzkgMjI2IDE2NiAKKzExOCA5MiA2IDI2MCAzOSAzMiAyNSAyMzQgMjE5IDIwIDMgMjI3IDIxMiAzMCAyNTQgMjggMTk1IDI1NCAyMzkgMTEyIDE1MyAyOCA3MyAKKzE3MSAxMzggMTY3IDE4MSAyNDUgMjUwIDE5OCAxNDggMjA3IDY1IDI2MiAyMjAgMTU1IDE1IDU1IDExIDE1MyAxNzIgNTcgMTM3IDE5MyAKKzEyOCAxMzIgMTU2IDc4IDIwOCAyNTUgOTEgODIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDEwNSA3NCAxMTIgOSA0NCAxNzQgMTE2IDE3NyAKKzE0OSA0IDIxOCAyNDAgMTU4IDY1IDE5MCA5NSAzOSA4NyA0MSAyIDE2NCA1OSA1MiA1MCAxMTggMjAgMjE0IDE0NCAxMTEgMTggMTYgNDYgCisxMDYgMTUgMjQ5IDE1MiAzNyA0NSA0MyAxMjggNSAxNSAxMjcgMTM2IDMgMTAwIDQgNzkgMTgyIDQyIDEzNyAxNzYgODYgMTE3IDI0MCAKKzM2IDI0OCAxNTYgMTUwIDY3IDEwNSAyMTggOTYgMTc0IDk5IDEzNSAxMzQgODggMTc2IDE0IDI1OCAxMjQgMTc1IDIzNCAxNDcgMTYxIAorMTUzIDEwMCAxOTggMjEgNjYgMTE0IDE5MCAxNjcgMTY0IDIwMyAyMzUgMTYgMTczIDI0NyAxNjUgNTUgMjA1IDI4IDU2IDEyOSAxMjMgCisxODQgMjA2IDE5IDE1MSAyNTcgMTMzIDgwIDEwNiA3MCA2NiAyNTMgMjQ4IDE3IDI1IDIxNyAxNzcgNSA4NyAyNTIgMTg1IDEzMCA0NyAKKzEzIDY4IDI5IDQ3IDIyNCAyNTEgMjYxIDEwMiAxODUgMyAxNzIgMTI5IDE5NSA0MyA1NiAxNDYgMTY1IDEyMiAyNjAgMTExIDE1NyA3NCAKKzk1IDIzMyAyOSAxOTEgMTQxIDIxNyA1MCA2MyAyMDMgMTEzIDE5OSAxMzkgMzYgMTkzIDczIDExNiAxMjIgNjYgMjM2IDcgMiAxMDkgCisyNDIgMjE3IDEwNSAxNDYgMjM3IDEyNSAyMzggMTIxIDEyNSA5OSA2MyA5IDIzOCA0OSA1MCAxMzUgMjYxIDIyOSAxMjcgMTUzIDQ1IAorMTE1IDE4NiAxMjEgMTQyIDE0MSA3OCAxOTEgMjEzIDkgMTY2IDE5MCAxNTAgMTIyIDE4OCA1MyA0MSAyMTMgMTQ4IDIyNCA0MCA3OCAKKzEzNiAxMzAgMjQxIDE1NCAyMTggMTY4IDMzIDIxNSA2MyA4MSA5NyAxNjUgMTk0IDI2MyAxNDQgMjUwIDE0MyAxMzIgMTczIDUzIDI0IAorMTcxIDY2IDQyIDY1IDExOCAzNyAxODkgMjI2IDk0IDYwIDI0MiAxNDUgNDcgMzAgMTEwIDExMSAyMjkgMTk5IDIxMSA5NCA0MyAyMDAgCis2MyA2NCA1NSA4MyAxMiAyMiAxODQgODQgMjAyIDExNyA0NiAxNjEgOTggMTcgMTY0IDc2IDI3IDEzMiAxMDEgMjYxIDE3NCA0NCA1MiAKKzMzIDE0MyAyMDQgMzIgMTY5IDE1MSAxODUgNzUgMzEgMjQ1IDEyMyA1NyAyNjQgMTM1IDEyIDUgMTQyIDY5IDIwIDc1IDg2IDYyIDE1NyAKKzIgMzcgMTE3IDEwMSAyNDQgMTMyIDIyOCAxMzYgNTggMTE2IDEwNSA5MSAxNTQgMjQgMjcgMTQ5IDc2IDEwIDkwIDE5IDc5IDE5OSA4NCAKKzIxOSA5MiAxMjggNzcgNzMgMjQzIDI2MyAxNyA0MiAyNTkgMjU5IDE4NyA2MiAyMTIgODUgNzEgNjIgMTQwIDIyNiAyMjEgMjAxIDEyNiAKKzE4IDMzIDIxIDEyMSAxOTcgMjI0IDE3OSAxMzYgMjUyIDU4IDI1NSAxNjMgMTQwIDgyIDM4IDIzNSA3MSAyNTYgMTUgMTEwIDk0IDE4NyAKKzExNyAyOSAxMTkgMTYgMTAxIDEyMiA0OSAxOTQgMTkxIDg2IDEzNCAxNiAxMTggMTY0IDEzMSAxMTAgMTY2IDQ2IDIzMyAxNTYgMTMzIAorMjUgMjMgMzYgNTQgMjE0IDE5NCAxMTkgMjI3IDE4IDg4IDEwNCAxNTUgMTQyIDE5NiAxNjEgMjYgMTU4IDQ4IDE0OCA4MCAxMjMgMTEyIAorODEgMTY5IDI0IDQ0IDE5MSAxNTggMTkyIDY1IDI0NSAxNzggMTQwIDk5IDgwIDUxIDU0IDIzMSA0MiAxMCAzNSAyMDIgMjQ0IDE4NyA0NSAKKzE3MCAzIDE1NSA4NyAxODAgMTI3IDE0IDE4NiAyNjUgNTkgMTA3IDEzMyAyMTkgMjMxIDE4NiAxOTMgMSAyNTcgNiAyMDUgMjIyIDI2NCAKKzEzIDE5NSAyMzcgMTk3IDMwIDIzNyAyNTIgMTEzIDcyIDE5NyAxNTIgNTQgODcgNTggNDQgMjQ2IDI0MSAyNyA3NyAxOCAxNjAgMjI5IDUgCis3MCAyMTAgMTcwIDIxNCA3MiA1MyAxNjggODggMzIgOTcgOTMgNjkgMjYxIF4KKzU2MyAxIDE1IDIzNCAxMzAgMTM5IDI1NSA0MiA0IDkwIDE1MSA1MSAxMjAgMTQ1IDExMyAyMTIgMTgxIDQ1IDEwNyA0NCA3NCAyMTkgMSAKKzI1MSA2MSAxNTYgMzEgMTI4IDE4NiAxMzggMTg0IDIyMyA2MSAxNjAgMTY3IDE3NSAxMDcgNiA1IDgxIDExNCAyMDcgMjA1IDE3MyAxMTMgCisyMDggMjM4IDczIDE4NiAxNzYgMTc4IDkzIDIxNiAxMSA5OCA4MyAyMTggMTE5IDIyMSAxNDYgMzcgMTc5IDg4IDQ3IDEzOSAxMDQgMjQ3IAorMTg5IDI0MSA2MyA3MSAxNTQgMTE2IDUgMTIzIDUxIDEyNCA4OCA4NSAxMzMgNDkgMjA5IDIzMyA5NyA0NiAyNTcgNzQgNjQgNzAgMTIxIAorMjMgMjAwIDE1NSAxMTEgMjkgNTggNTcgMjAgMjUyIDIwNyA1MCAyNDIgNTggMTcwIDE0IDE5NyAxNjkgOTQgOTggNDEgMTMgMjAyIDcwIAorMjM0IDkyIDE0NSAxMTcgMTU1IDE1MyAyMzQgMjQzIDIwOCAyMDAgNCA0OCAyMSAxMzQgMjM3IDQwIDkzIDE3OCAyMTAgMTUzIDE5NiAKKzE3NCAyNjMgMjM4IDIyOCAxMTcgMzggMjMgNDkgOTIgMjggMTgwIDE2MyA3NyA1NCAyMjMgOTkgMjI5IDExMiA2MiAxNTEgMTMwIDI1NiAKKzE5MiAzNCA4MCAyIDE3MSAxNjAgMTYgMTEyIDI0IDgyIDE4NSAyNiAxNDggMTAzIDk3IDE1OSAyNTEgMTkgMjE5IDExNCAyNDUgNiAxMTggCis3NSAyNTIgOTQgMjQ5IDEwNCA5NiAxMjYgMTU4IDIxNCAyNTEgMTc0IDIyNSAxNjkgOTAgMjMwIDI2MiA5MiA2NiAxNzQgMTA4IDM5IDk4IAorNzkgODIgMTQ3IDMyIDEwIDIxNiA1MyAzNSA3NSAxMDEgMzEgMTY2IDE4MCA4IDcxIDI2NyAxODUgMTQzIDg1IDk1IDI0OCA3MSAzIDUzIAorMTkwIDYgMTU2IDE0NCAxMjIgNTYgMjUgMjI4IDc5IDIzNyA3OCA4NyA0OCAxNzIgMTk3IDUyIDE1NyAxODEgMTU4IDEwMSAxODIgMzYgCisyNjMgMTI1IDE1OSAyNDcgNzYgMTcyIDE5MyAxMDkgMTEwIDI2MCAyMiAxMiAxMzEgMTc2IDIzIDE2MiAxNjEgMTY2IDE0MiAxNCAyMDEgCiszNyAxNDEgMTkgMTAyIDE3NyA2MCAxMjMgMjA2IDU1IDE0MyAxOTggODkgMTE4IDIyNiA0NyAxNzcgMTczIDE5MiA3NiAxNyAxODcgNTQgCis3MiAzNiAxNDYgMTg4IDI0MiA5NiAxNjQgMjI3IDg0IDIxMyAyMTggODEgMTUyIDIwMSAxNTAgMTM1IDE1NyA2NCAyMjEgMTg0IDEwNiAKKzEyNCAyNDMgOTEgMjYzIDg3IDE2NSAxMDkgMTE0IDEyOCA2OSAyMDEgMTkyIDcyIDE0OSAyMTUgMTMzIDIwNCAxNDAgMjAgMTM1IDIgCisxMzMgOTEgMTQ2IDE1MCAyNDggMjI2IDkgMTgzIDIyOCAyMzAgMzIgMTYxIDExIDEzNiAxNTIgMTYzIDgxIDI2NSAyIDIwIDk3IDggMTg4IAorMjA0IDEwMiAyNiAyNjUgNDAgODkgMjM1IDE2MyAyMzIgNjAgODUgMTM3IDE4NSAyNTYgMTU0IDIzMyAyMTAgMTE1IDEyNyAzNiAxMDggCisxOTQgMTA0IDIwOSAxMjAgMTAzIDE3NiAyNyAzMCAxMzMgODcgMTAgMTAzIDU5IDkwIDExMyA1NyAxNzUgMjU4IDY5IDg4IDE5OCAyMDIgCisxODcgMTcxIDkgMjIxIDI5IDEwMCAyNjIgMjA1IDEzNSAxMTkgNzAgODMgMjkgNjIgNjcgMTczIDc1IDEzOSAxMDAgMTExIDE0MiA1MiAyIAorMTc1IDI4IDYzIDMzIDE2MCAyNDYgNDMgNzkgMTIwIDE0MSAxNzAgMTY1IDI2MCAxNzcgMjExIDE4NiAyMSAyNDcgMzggMTc4IDU1IDIyMiAKKzY2IDEzNiAzOSA5NCAyMTEgMzUgMjI2IDE2NCAxMTQgOTAgMjU2IDM3IDI4IDI1IDIzMiAyMTUgMTYgMjY3IDIyMyAyMTIgMzAgMjUwIAorMjQgMTk1IDI1NCAyMzkgMTEwIDE0NyAyOCA2NyAxNjkgMTMyIDE2NyAxNzkgMjQzIDI0NiAxOTQgMTQyIDIwMyA2NSAyNTggMjIwIDE1MSAKKzEzIDUxIDcgMTUxIDE2OCA1NyAxMzcgMTg5IDEyNCAxMjYgMTU0IDc4IDIwNCAyNTMgODkgODAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IAorOTkgNzQgMTA2IDcgMzggMTc0IDExMiAxNzUgMTQ1IDIxOCAyMzYgMTU4IDYzIDE4OCA5MSAzMyA4MSAzNSAyNjQgMTU4IDU5IDUyIDQ0IAorMTEyIDIwIDIxNCAxMzggMTA1IDEyIDE0IDQ2IDEwNiAxMSAyNDkgMTQ2IDMzIDQzIDQxIDEyNiAzIDE1IDEyMSAxMzYgMSAxMDAgMjY2IAorNzMgMTgyIDQwIDEzMSAxNzIgODAgMTE1IDI0MCAzMCAyNDYgMTg2IF4KKzU3MyAwIDE0NiA2MyAxMDEgMjEwIDk2IDE2MiA5MSAxMjcgMTM0IDg0IDE2NCA2IDI1MCAxMjAgMTcxIDIyNiAxNDMgMTQ5IDE0NSA5NiAKKzE5NCAxNyA2MiAxMDIgMTkwIDE1NSAxNjAgMTk1IDIzNSA4IDE2NSAyNDMgMTU3IDQzIDIwNSAxNiA0NCAxMjEgMTE5IDE3MiAyMDYgMTUgCisxNDcgMjQ5IDEyMSA2OCA5OCA1OCA2NiAyNTMgMjQwIDUgMTMgMjEzIDE2NSA1IDgzIDI0OCAxNzMgMTIyIDM1IDUgNjQgMTcgNDMgMjI0IAorMjQ3IDI1NyAxMDIgMTc3IDMgMTY4IDEyNSAxODcgMzUgNTYgMTM4IDE2NSAyNjIgMTE4IDI1NiAxMDMgMTU3IDYyIDgzIDIyOSAyNSAKKzE3OSAxMzcgMjE3IDQ2IDU1IDIwMyAxMDEgMTkxIDEzNSAzMiAxOTMgNjkgMTE2IDEyMiA1NCAyMzYgNyAyNjggMTAxIDI0MiAyMDkgOTcgCisxNDIgMjMzIDEyNSAyMzggMTA5IDEyMSA4NyA1OSAxIDIzNCA0MSAyNTggNTAgMTIzIDI1MyAyMjEgMTI3IDE1MyA0NSAxMDcgMTc0IAorMTIxIDEzOCAxMzMgNjYgMTgzIDIwNSAyNjcgMTY2IDE3OCAxMzggMTE0IDE4OCA1MyAzNyAyMDkgMTQ4IDIxNiAyOCA3NCAxMzIgMTE4IAorMjM3IDE0MiAyMTQgMTY0IDI1IDIxMSA2MyA2OSA5NyAxNjEgMTk0IDI1NSAxMzYgMjUwIDEzOSAxMzIgMTY5IDQxIDIwIDE2MyA1OCAzNCAKKzU3IDExOCAzNyAxNzcgMjIyIDk0IDYwIDIzOCAxNDEgNDcgMjIgMTEwIDEwNyAyMjUgMTk1IDIwMyA4MiA0MyAxOTIgNTEgNTIgNTEgNzEgCisxMiAxNCAxODAgNzIgMTk4IDExNyAzOCAxNTcgOTQgOSAxNjQgNzYgMTUgMTI4IDEwMSAyNjEgMTcwIDQwIDQwIDIxIDE0MyAyMDAgMzIgCisxNjEgMTQzIDE4MSA3MSAzMSAyNDUgMTIzIDUzIDI1NiAxMzUgMjY3IDEzNCA2NSAxNiA2MyA4MiA2MiAxNTMgMjY0IDMzIDEwOSA4OSAKKzI0NCAxMjQgMjIwIDEyOCA1MCAxMDQgMTA1IDkxIDE0NiAxMiAyNyAxNDUgNjQgMjY4IDgyIDExIDc5IDE5OSA4NCAyMTUgODAgMTI4IAorNjkgNjUgMjM1IDI1OSAxNyAzMCAyNTkgMjU1IDE4NyA1NCAyMDQgODEgNjMgNTAgMTM2IDIxOCAyMTMgMTk3IDExOCAxOCAyOSA5IDExMyAKKzE4OSAyMjAgMTc5IDEyNCAyNTIgNTQgMjU1IDE1NSAxMjggODIgMzAgMjI3IDU5IDI1MiAzIDk4IDkwIDE3OSAxMDUgMjEgMTExIDQgOTcgCisxMTAgMzcgMTkwIDE4NyA4NiAxMzAgMTYgMTE0IDE1NiAxMjcgMTAyIDE1OCA0MiAyMjUgMTQ0IDEyOSAxNyAxMSAyOCA0MiAyMDYgMjY2IAorMTg2IDExOSAyMjMgMTAgODAgOTYgMTQzIDEzMCAxODQgMTUzIDI2IDE0NiA0NCAxNDAgODAgMTE1IDEwNCA3MyAxNjUgMjQgNDQgMTkxIAorMTU0IDE4MCA1MyAyMzcgMTc0IDE0MCA5OSA3NiA0NyA1NCAyMjMgNDIgNiAzMSAxOTQgMjM2IDE3NSAzNyAxNTggMjYxIDE1MSA3OSAKKzE4MCAxMjMgMiAxODIgMjU3IDUxIDEwMyAxMjUgMjE5IDIzMSAxNzggMTg5IDEgMjUzIDIgMjAxIDIxOCAyNjQgMSAxODMgMjM3IDE5MyAKKzE4IDIyOSAyNDQgMTA1IDcyIDE4NSAxNTIgNDYgODcgNDYgMzYgMjQyIDI0MSAyMyA3NyAxNCAxNDggMjI5IDI2MyA2NiAyMDIgMTY2IAorMjEwIDY0IDQ5IDE1NiA3NiAyOCA5MyA5MyA2MSAxMzUgMTMgMjMyIDEyNiAxMzUgMjUxIDM2IDQgODQgMTQ1IDQ1IDEyMCAxMzkgMTEzIAorMjA4IDE4MSAzOSAxMDUgNDAgNzIgMjE3IDI2NSAyNTEgNTUgMTUyIDI3IDEyNiAxODYgMTM4IDE4NCAyMjMgNjEgMTU0IDE2MSAxNzUgCisxMDcgNiAyNjkgODEgMTE0IDIwNyAyMDEgMTY3IDEwNyAyMDYgMjM0IDczIDE4NCAxNzIgMTc0IDg5IDIxMiAxMSA5OCA3NyAyMTQgMTEzIAorMjIxIDE0NiAzMSAxNzUgODggNDUgMTM5IDEwMCAyNDMgMTg5IDIzOSA1NyA2NyAxNTAgMTEyIDMgMTE3IDUxIDEyMiA4NiA3OSAxMjkgCis0OSAyMDcgMjMzIDkzIDQyIDI1NyA3MCA2NCA2OCAxMTcgMTkgMTk2IDE1MSAxMTEgMjMgNTggNTMgMTggMjQ4IDIwNSA0OCAyNDAgNTYgCisxNzAgOCAxOTcgMTY5IDkyIDk0IDQxIDcgMTk4IDY2IDIzNCA5MiAxNDUgMTE1IDE1NSAxNDcgMjMwIDI0MyAyMDggMjAwIDQ4IDIxIAorMTMwIDIzNSA0MCA5MSAxNzggMjA4IDE0OSAxOTYgMTcwIDI1OSAyMzYgMjI2IDExMSAzNiAyMyA0NSA4OCAyNiAxNzggMTU3IDIwNyBeCis1NjYgMSA0MiAyMTkgOTEgMjI1IDEwOCA1MCAxNTEgMTMwIDI1MiAxODQgMzQgNzIgMjYyIDE2MyAxNTYgNCAxMTIgMjAgNzQgMTc3IDE0IAorMTQwIDkxIDg1IDE1OSAyNDMgMTkgMjExIDExMCAyMzcgMiAxMTQgNjcgMjQ4IDgyIDI0MSAxMDQgODggMTI2IDE1MCAyMTAgMjQ3IDE3MCAKKzIyNSAxNTcgOTAgMjMwIDI2MiA4MCA1NCAxNjIgMTA0IDM5IDg2IDcxIDc4IDE0NyAyOCA2IDIxNiA0MSAzNSA3NSA5NyAxOSAxNTQgCisxNzIgNTkgMjY3IDE4NSAxMzUgNzcgOTUgMjQ0IDcxIDI2NyA0NSAxODYgMjcwIDE0NCAxNDQgMTEwIDQ4IDEzIDIyOCA3NSAyMjkgNzAgCis3NSA0MCAxNzIgMTg5IDQ4IDE1MyAxNzcgMTU0IDg5IDE3MCAzNiAyNTkgMTEzIDE0NyAyNDMgNjggMTYwIDE4OSA5NyAxMDIgMjU2IDE0IAorOCAxMzEgMTY0IDE5IDE2MiAxNjEgMTU4IDE0MiAxNCAxOTcgMjkgMTQxIDExIDkwIDE3MyA1MiAxMTUgMjAyIDQzIDEzMSAxOTggODEgCisxMDYgMjE4IDM5IDE2OSAxNzMgMTkyIDY0IDkgMTc1IDUwIDY4IDI4IDEzOCAxNzYgMjM0IDg0IDE1NiAyMjcgNzIgMjEzIDIxNCA3NyAKKzE0NCAxOTMgMTUwIDEyNyAxNDUgNTYgMjE3IDE3NiAxMDIgMTI0IDIzNSA4NyAyNjMgODMgMTYxIDEwOSAxMDIgMTE2IDY1IDIwMSAxODAgCis2NCAxNDkgMjE1IDEyOSAyMDAgMTI4IDggMTIzIDI2NiAxMzMgNzkgMTQyIDE0NiAyNDggMjIyIDkgMTgzIDIyMCAyMjYgMjAgMTU3IDcgCisxMjggMTQ4IDE2MyA3MyAyNjUgMjcwIDEyIDkzIDggMTgwIDIwNCA5OCAyMiAyNjEgMjggODkgMjI3IDE1NSAyMjQgNTYgODUgMTI1IAorMTgxIDI1NiAxNTQgMjI5IDIxMCAxMTUgMTE5IDMyIDEwOCAxOTAgMTAwIDIwOSAxMTIgMTAzIDE3NiAxOSAyMiAxMjEgNzkgMTAgOTUgCis1NSA4MiAxMDkgNTMgMTY3IDI1OCA2OSA4MCAxOTQgMjAyIDE4MyAxNzEgNSAyMTMgMjUgODggMjU4IDIwMSAxMzEgMTE1IDcwIDgzIDI5IAorNTggNjcgMTY1IDcxIDEyNyA5NiAxMDcgMTM4IDQ0IDIgMTYzIDE2IDU1IDMzIDE2MCAyNDYgMzUgNjcgMTA4IDEzMyAxNjIgMTUzIDI2MCAKKzE2NSAyMDMgMTc4IDE3IDI0NyAzOCAxNzQgNTUgMjIyIDU4IDEzMiAyNyA4NiAyMTEgMjcgMjI2IDE2MCAxMDYgODYgMjYwIDI0OCAzMyAKKzIwIDI1IDIyOCAyMDcgOCAyNjMgMjE1IDIxMiAzMCAyNDIgMTYgMTk1IDI1NCAyMzkgMTA2IDEzNSAyOCA1NSAxNjUgMTIwIDE2NyAxNzUgCisyMzkgMjM4IDE4NiAxMzAgMTk1IDY1IDI1MCAyMjAgMTQzIDkgNDMgMjcxIDE0NyAxNjAgNTcgMTM3IDE4MSAxMTYgMTE0IDE1MCA3OCAKKzE5NiAyNDkgODUgNzYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDg3IDc0IDk0IDMgMjYgMTc0IDEwNCAxNzEgMTM3IDI2NCAyMTggMjI4IAorMTU4IDU5IDE4NCA4MyAyMSA2OSAyMyAyNTYgMTQ2IDU5IDUyIDMyIDEwMCAyMCAyMTQgMTI2IDkzIDEwIDQ2IDEwNiAzIDI0OSAxMzQgCisyNSAzOSAzNyAxMjIgMjcxIDE1IDEwOSAxMzYgMjY5IDEwMCAyNTggNjEgMTgyIDM2IDExOSAxNjQgNjggMTExIDI0MCAxOCAyNDIgMTU2IAorMTQ0IDYxIDk5IDIwNiA5NiAxNTYgODcgMTIzIDEzNCA4MiAxNTggMiAyNDYgMTE4IDE2OSAyMjIgMTQxIDE0MyAxNDEgOTQgMTkyIDE1IAorNjAgOTYgMTkwIDE0OSAxNTggMTkxIDIzNSA0IDE2MSAyNDEgMTUzIDM3IDIwNSAxMCAzOCAxMTcgMTE3IDE2NiAyMDYgMTMgMTQ1IDI0NSAKKzExNSA2MiA5NCA1MiA2NiAyNTMgMjM2IDI3MSA3IDIxMSAxNTkgNSA4MSAyNDYgMTY3IDExOCAyOSAxIDYyIDExIDQxIDIyNCAyNDUgCisyNTUgMTAyIDE3MyAzIDE2NiAxMjMgMTgzIDMxIDU2IDEzNCAxNjUgMjYwIDExNiAyNTQgOTkgMTU3IDU2IDc3IDIyNyAyMyAxNzMgMTM1IAorMjE3IDQ0IDUxIDIwMyA5NSAxODcgMTMzIDMwIDE5MyA2NyAxMTYgMTIyIDQ4IDIzNiA3IDI2OCA5NyAyNDIgMjA1IDkzIDE0MCAyMzEgCisxMjUgMjM4IDEwMyAxMTkgODEgNTcgMjY5IDIzMiAzNyAyNTQgNTAgMTE3IDI0OSAyMTcgMTI3IDE1MyA0NSAxMDMgMTY4IDEyMSAxMzYgCisxMjkgNjAgMTc5IDIwMSAyNjMgMTY2IDE3MiAxMzIgMTEwIDE4OCA1MyAzNSAyMDcgMTQ4IDIxMiAyNjIgXgorNTg5IDAgNzAgMTI4IDEwNiAyMzMgMTMwIDIxMCAxNjAgMTcgMjA3IDYzIDU3IDk3IDE1NyAxOTQgMjQ3IDEyOCAyNTAgMTM1IDEzMiAKKzE2NSAyOSAxNiAxNTUgNTAgMjYgNDkgMTE4IDM3IDE2NSAyMTggOTQgNjAgMjM0IDEzNyA0NyAxNCAxMTAgMTAzIDIyMSAxOTEgMTk1IAorNzAgNDMgMTg0IDM5IDQwIDQ3IDU5IDEyIDYgMTc2IDYwIDE5NCAxMTcgMzAgMTUzIDkwIDEgMTY0IDc2IDMgMTI0IDEwMSAyNjEgMTY2IAorMzYgMjggOSAxNDMgMTk2IDMyIDE1MyAxMzUgMTc3IDY3IDMxIDI0NSAxMjMgNDkgMjQ4IDEzNSAyNjIgMjYzIDEyNiA2MSAxMiA1MSA3OCAKKzYyIDE0OSAyNjAgMjkgMTAxIDc3IDI0NCAxMTYgMjEyIDEyMCA0MiA5MiAxMDUgOTEgMTM4IDI3IDE0MSA1MiAyNjAgNzQgMyA3OSAxOTkgCis4NCAyMTEgNjggMTI4IDYxIDU3IDIyNyAyNTUgMTcgMTggMjU5IDI1MSAxODcgNDYgMTk2IDc3IDU1IDM4IDEzMiAyMTAgMjA1IDE5MyAKKzExMCAxOCAyNSAyNzEgMTA1IDE4MSAyMTYgMTc5IDExMiAyNTIgNTAgMjU1IDE0NyAxMTYgODIgMjIgMjE5IDQ3IDI0OCAyNjUgODYgODYgCisxNzEgOTMgMTMgMTAzIDI2NiA5MyA5OCAyNSAxODYgMTgzIDg2IDEyNiAxNiAxMTAgMTQ4IDEyMyA5NCAxNTAgMzggMjE3IDEzMiAxMjUgCis5IDI3MyAyMCAzMCAxOTggMjY2IDE3OCAxMTkgMjE5IDIgNzIgODggMTMxIDExOCAxNzIgMTQ1IDI2IDEzNCA0MCAxMzIgODAgMTA3IDk2IAorNjUgMTYxIDI0IDQ0IDE5MSAxNTAgMTY4IDQxIDIyOSAxNzAgMTQwIDk5IDcyIDQzIDU0IDIxNSA0MiAyIDI3IDE4NiAyMjggMTYzIDI5IAorMTQ2IDI1MyAxNDcgNzEgMTgwIDExOSAyNjQgMTc4IDI0OSA0MyA5OSAxMTcgMjE5IDIzMSAxNzAgMTg1IDEgMjQ5IDI3MiAxOTcgMjE0IAorMjY0IDI2MyAxNzEgMjM3IDE4OSA2IDIyMSAyMzYgOTcgNzIgMTczIDE1MiAzOCA4NyAzNCAyOCAyMzggMjQxIDE5IDc3IDEwIDEzNiAKKzIyOSAyNTUgNjIgMTk0IDE2MiAyMDYgNTYgNDUgMTQ0IDY0IDI0IDg5IDkzIDUzIDEyMyA5IDIyOCAxMTggMTI3IDI0MyAyNCA0IDcyIAorMTMzIDMzIDEyMCAxMjcgMTEzIDIwMCAxODEgMjcgMTAxIDMyIDY4IDIxMyAyNTcgMjUxIDQzIDE0NCAxOSAxMjIgMTg2IDEzOCAxODQgCisyMjMgNjEgMTQyIDE0OSAxNzUgMTA3IDYgMjYxIDgxIDExNCAyMDcgMTkzIDE1NSA5NSAyMDIgMjI2IDczIDE4MCAxNjQgMTY2IDgxIAorMjA0IDExIDk4IDY1IDIwNiAxMDEgMjIxIDE0NiAxOSAxNjcgODggNDEgMTM5IDkyIDIzNSAxODkgMjM1IDQ1IDU5IDE0MiAxMDQgMjczIAorMTA1IDUxIDExOCA4MiA2NyAxMjEgNDkgMjAzIDIzMyA4NSAzNCAyNTcgNjIgNjQgNjQgMTA5IDExIDE4OCAxNDMgMTExIDExIDU4IDQ1IAorMTQgMjQwIDIwMSA0NCAyMzYgNTIgMTcwIDI3MCAxOTcgMTY5IDg4IDg2IDQxIDI2OSAxOTAgNTggMjM0IDkyIDE0NSAxMTEgMTU1IDEzNSAKKzIyMiAyNDMgMjA4IDIwMCAyNjYgNDggMjEgMTIyIDIzMSA0MCA4NyAxNzggMjA0IDE0MSAxOTYgMTYyIDI1MSAyMzIgMjIyIDk5IDMyIAorMjMgMzcgODAgMjIgMTc0IDE0NSA3MSAzNiAyMTcgODcgMjIzIDEwNiA0NCAxNTEgMTMwIDI1MCAxODAgMzQgNjggMjU4IDE1OSAxNTQgCisyNzIgMTEyIDE4IDcwIDE3MyA4IDEzNiA4NSA3OSAxNTkgMjM5IDE5IDIwNyAxMDggMjMzIDExMiA2MyAyNDYgNzYgMjM3IDEwNCA4NCAKKzEyNiAxNDYgMjA4IDI0NSAxNjggMjI1IDE1MSA5MCAyMzAgMjYyIDc0IDQ4IDE1NiAxMDIgMzkgODAgNjcgNzYgMTQ3IDI2IDQgMjE2IAorMzUgMzUgNzUgOTUgMTMgMTQ4IDE2OCAyNzAgNTMgMjY3IDE4NSAxMzEgNzMgOTUgMjQyIDcxIDI2NSA0MSAxODQgMjY4IDEzOCAxNDQgCisxMDQgNDQgNyAyMjggNzMgMjI1IDY2IDY5IDM2IDE3MiAxODUgNDYgMTUxIDE3NSAxNTIgODMgMTY0IDM2IDI1NyAxMDcgMTQxIDI0MSAKKzY0IDE1NCAxODcgOTEgOTggMjU0IDEwIDYgMTMxIDE1OCAxNyAxNjIgMTYxIDE1NCAxNDIgMTQgMTk1IDI1IDE0MSA3IDg0IDE3MSA0OCAKKzExMSAyMDAgMzcgMTI1IDE5OCA3NyAxMDAgMjE0IDM1IDE2NSAxNzMgMTkyIDU4IDUgMTY5IDQ4IDY2IDI0IDEzNCAxNzAgMjMwIDc4IAorMTUyIDIyNyA2NiAyMTMgMjEyIDc1IDE0MCAxODkgMTUwIDEyMyAxMzkgNTIgMjE1IDE3MiAxMjQgXgorNTg0IDAgMTI0IDIyNyA4MyAyNjMgNzkgMTU3IDEwOSA5MCAxMDQgNjEgMjAxIDE2OCA1NiAxNDkgMjE1IDEyNSAxOTYgMTE2IDI3MiAKKzExMSAyNjIgMTMzIDY3IDEzOCAxNDIgMjQ4IDIxOCA5IDE4MyAyMTIgMjIyIDggMTUzIDMgMTIwIDE0NCAxNjMgNjUgMjY1IDI3MCA0IAorODkgOCAxNzIgMjA0IDk0IDE4IDI1NyAxNiA4OSAyMTkgMTQ3IDIxNiA1MiA4NSAxMTMgMTc3IDI1NiAxNTQgMjI1IDIxMCAxMTUgMTExIAorMjggMTA4IDE4NiA5NiAyMDkgMTA0IDEwMyAxNzYgMTEgMTQgMTA5IDcxIDEwIDg3IDUxIDc0IDEwNSA0OSAxNTkgMjU4IDY5IDcyIDE5MCAKKzIwMiAxNzkgMTcxIDEgMjA1IDIxIDc2IDI1NCAxOTcgMTI3IDExMSA3MCA4MyAyOSA1NCA2NyAxNTcgNjcgMTE1IDkyIDEwMyAxMzQgMzYgCisyIDE1MSA0IDQ3IDMzIDE2MCAyNDYgMjcgNTUgOTYgMTI1IDE1NCAxNDEgMjYwIDE1MyAxOTUgMTcwIDEzIDI0NyAzOCAxNzAgNTUgMjIyIAorNTAgMTI4IDE1IDc4IDIxMSAxOSAyMjYgMTU2IDk4IDgyIDI1MiAyNDAgMjkgMTIgMjUgMjI0IDE5OSAyNTkgMjA3IDIxMiAzMCAyMzQgOCAKKzE5NSAyNTQgMjM5IDEwMiAxMjMgMjggNDMgMTYxIDEwOCAxNjcgMTcxIDIzNSAyMzAgMTc4IDExOCAxODcgNjUgMjQyIDIyMCAxMzUgNSAKKzM1IDI2NyAxNDMgMTUyIDU3IDEzNyAxNzMgMTA4IDEwMiAxNDYgNzggMTg4IDI0NSA4MSA3MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNzUgCis3NCA4MiAyNzUgMTQgMTc0IDk2IDE2NyAxMjkgMjYwIDIxOCAyMjAgMTU4IDU1IDE4MCA3NSA5IDU3IDExIDI0OCAxMzQgNTkgNTIgMjAgCis4OCAyMCAyMTQgMTE0IDgxIDI2NCA2IDQ2IDEwNiAyNzEgMjQ5IDEyMiAxNyAzNSAzMyAxMTggMjcxIDE1IDk3IDEzNiAyNjkgMTAwIAorMjUwIDQ5IDE4MiAzMiAxMDcgMTU2IDU2IDEwNyAyNDAgNiAyMzggMTU2IDE0MCA1NyA5NSAxOTggOTYgMTQ0IDc5IDExNSAxMzQgNzggCisxNDYgMjcwIDIzOCAxMTQgMTY1IDIxNCAxMzcgMTMxIDEzMyA5MCAxODggMTEgNTYgODQgMTkwIDEzNyAxNTQgMTgzIDIzNSAyNzIgMTUzIAorMjM3IDE0NSAyNSAyMDUgMjc0IDI2IDEwOSAxMTMgMTU0IDIwNiA5IDE0MSAyMzcgMTAzIDUwIDg2IDQwIDY2IDI1MyAyMjggMjYzIDI3MSAKKzIwNyAxNDcgNSA3NyAyNDIgMTU1IDExMCAxNyAyNjkgNTggMjc1IDM3IDIyNCAyNDEgMjUxIDEwMiAxNjUgMyAxNjIgMTE5IDE3NSAyMyAKKzU2IDEyNiAxNjUgMjU2IDExMiAyNTAgOTEgMTU3IDQ0IDY1IDIyMyAxOSAxNjEgMTMxIDIxNyA0MCA0MyAyMDMgODMgMTc5IDEyOSAyNiAKKzE5MyA2MyAxMTYgMTIyIDM2IDIzNiA3IDI2OCA4OSAyNDIgMTk3IDg1IDEzNiAyMjcgMTI1IDIzOCA5MSAxMTUgNjkgNTMgMjY1IDIyOCAKKzI5IDI0NiA1MCAxMDUgMjQxIDIwOSAxMjcgMTUzIDQ1IDk1IDE1NiAxMjEgMTMyIDEyMSA0OCAxNzEgMTkzIDI1NSAxNjYgMTYwIDEyMCAKKzEwMiAxODggNTMgMzEgMjAzIDE0OCAyMDQgMTAgNjggMTI2IDEwMCAyMzEgMTI0IDIwOCAxNTggMTMgMjA1IDYzIDUxIDk3IDE1NSAxOTQgCisyNDMgMTI0IDI1MCAxMzMgMTMyIDE2MyAyMyAxNCAxNTEgNDYgMjIgNDUgMTE4IDM3IDE1OSAyMTYgOTQgNjAgMjMyIDEzNSA0NyAxMCAKKzExMCAxMDEgMjE5IDE4OSAxOTEgNjQgNDMgMTgwIDMzIDM0IDQ1IDUzIDEyIDIgMTc0IDU0IDE5MiAxMTcgMjYgMTUxIDg4IDI3MyAxNjQgCis3NiAyNzMgMTIyIDEwMSAyNjEgMTY0IDM0IDIyIDMgMTQzIDE5NCAzMiAxNDkgMTMxIDE3NSA2NSAzMSAyNDUgMTIzIDQ3IDI0NCAxMzUgCisyNTggMjYxIDEyMiA1OSAxMCA0NSA3NiA2MiAxNDcgMjU4IDI3IDk3IDcxIDI0NCAxMTIgMjA4IDExNiAzOCA4NiAxMDUgOTEgMTM0IAorMjcwIDI3IDEzOSA0NiAyNTYgNzAgMjc1IDc5IDE5OSA4NCAyMDkgNjIgMTI4IDU3IDUzIDIyMyAyNTMgMTcgMTIgMjU5IDI0OSAxODcgCis0MiAxOTIgNzUgNTEgMzIgMTMwIDIwNiAyMDEgMTkxIDEwNiAxOCAyMyAyNjcgMTAxIDE3NyAyMTQgMTc5IDEwNiAyNTIgNDggMjU1IAorMTQzIDExMCA4MiAxOCAyMTUgNDEgMjQ2IDI2MSA4MCA4NCAxNjcgODcgOSA5OSAyNjIgOTEgOTIgMTkgMTg0IDE4MSA4NiAxMjQgMTYgCisxMDggMTQ0IDEyMSA5MCAxNDYgMzYgMjEzIDEyNiAxMjMgNSAyNjkgMjMwIF4KKzU4NyAwIDE4IDE5MCAyNjYgMTcwIDExOSAyMTUgMjcyIDY0IDgwIDExOSAxMDYgMTYwIDEzNyAyNiAxMjIgMzYgMTI0IDgwIDk5IDg4IAorNTcgMTU3IDI0IDQ0IDE5MSAxNDYgMTU2IDI5IDIyMSAxNjYgMTQwIDk5IDY4IDM5IDU0IDIwNyA0MiAyNzYgMjMgMTc4IDIyMCAxNTEgCisyMSAxMzQgMjQ1IDE0MyA2MyAxODAgMTE1IDI1NiAxNzQgMjQxIDM1IDk1IDEwOSAyMTkgMjMxIDE2MiAxODEgMSAyNDUgMjcyIDE5MyAKKzIxMCAyNjQgMjU1IDE1OSAyMzcgMTg1IDI3MiAyMTMgMjI4IDg5IDcyIDE2MSAxNTIgMzAgODcgMjIgMjAgMjM0IDI0MSAxNSA3NyA2IAorMTI0IDIyOSAyNDcgNTggMTg2IDE1OCAyMDIgNDggNDEgMTMyIDUyIDIwIDg1IDkzIDQ1IDExMSA1IDIyNCAxMTAgMTE5IDIzNSAxMiA0IAorNjAgMTIxIDIxIDEyMCAxMTUgMTEzIDE5MiAxODEgMTUgOTcgMjQgNjQgMjA5IDI0OSAyNTEgMzEgMTM2IDExIDExOCAxODYgMTM4IDE4NCAKKzIyMyA2MSAxMzAgMTM3IDE3NSAxMDcgNiAyNTMgODEgMTE0IDIwNyAxODUgMTQzIDgzIDE5OCAyMTggNzMgMTc2IDE1NiAxNTggNzMgCisxOTYgMTEgOTggNTMgMTk4IDg5IDIyMSAxNDYgNyAxNTkgODggMzcgMTM5IDg0IDIyNyAxODkgMjMxIDMzIDUxIDEzNCA5NiAyNzMgOTMgCis1MSAxMTQgNzggNTUgMTEzIDQ5IDE5OSAyMzMgNzcgMjYgMjU3IDU0IDY0IDYwIDEwMSAzIDE4MCAxMzUgMTExIDI3NyA1OCAzNyAxMCAKKzIzMiAxOTcgNDAgMjMyIDQ4IDE3MCAyNjIgMTk3IDE2OSA4NCA3OCA0MSAyNjEgMTgyIDUwIDIzNCA5MiAxNDUgMTA3IDE1NSAxMjMgCisyMTQgMjQzIDIwOCAyMDAgMjYyIDQ4IDIxIDExNCAyMjcgNDAgODMgMTc4IDIwMCAxMzMgMTk2IDE1NCAyNDMgMjI4IDIxOCA4NyAyOCAKKzIzIDI5IDcyIDE4IDE3MCAxMzMgNjcgMjQgMjEzIDc5IDIxOSAxMDIgMzIgMTUxIDEzMCAyNDYgMTcyIDM0IDYwIDI1MCAxNTEgMTUwIAorMjY0IDExMiAxNCA2MiAxNjUgMjc0IDEyOCA3MyA2NyAxNTkgMjMxIDE5IDE5OSAxMDQgMjI1IDI3NCAxMDggNTUgMjQyIDY0IDIyOSAKKzEwNCA3NiAxMjYgMTM4IDIwNCAyNDEgMTY0IDIyNSAxMzkgOTAgMjMwIDI2MiA2MiAzNiAxNDQgOTggMzkgNjggNTkgNzIgMTQ3IDIyIAorMjE2IDIzIDM1IDc1IDkxIDEgMTM2IDE2MCAyNjYgNDEgMjY3IDE4NSAxMjMgNjUgOTUgMjM4IDcxIDI2MSAzMyAxODAgMjY0IDEyNiAKKzE0NCA5MiAzNiAyNzMgMjI4IDY5IDIxNyA1OCA1NyAyOCAxNzIgMTc3IDQyIDE0NyAxNzEgMTQ4IDcxIDE1MiAzNiAyNTMgOTUgMTI5IAorMjM3IDU2IDE0MiAxODMgNzkgOTAgMjUwIDIgMiAxMzEgMTQ2IDEzIDE2MiAxNjEgMTQ2IDE0MiAxNCAxOTEgMTcgMTQxIDI3NyA3MiAKKzE2NyA0MCAxMDMgMTk2IDI1IDExMyAxOTggNjkgODggMjA2IDI3IDE1NyAxNzMgMTkyIDQ2IDI3NSAxNTcgNDQgNjIgMTYgMTI2IDE1OCAKKzIyMiA2NiAxNDQgMjI3IDU0IDIxMyAyMDggNzEgMTMyIDE4MSAxNTAgMTE1IDEyNyA0NCAyMTEgMTY0IDk2IDEyNCAyMjMgODEgMjYzIAorNzcgMTU1IDEwOSA4NCA5OCA1OSAyMDEgMTYyIDUyIDE0OSAyMTUgMTIzIDE5NCAxMTAgMjY4IDEwNSAyNjAgMTMzIDYxIDEzNiAxNDAgCisyNDggMjE2IDkgMTgzIDIwOCAyMjAgMiAxNTEgMSAxMTYgMTQyIDE2MyA2MSAyNjUgMjcwIDg3IDggMTY4IDIwNCA5MiAxNiAyNTUgMTAgCis4OSAyMTUgMTQzIDIxMiA1MCA4NSAxMDcgMTc1IDI1NiAxNTQgMjIzIDIxMCAxMTUgMTA3IDI2IDEwOCAxODQgOTQgMjA5IDEwMCAxMDMgCisxNzYgNyAxMCAxMDMgNjcgMTAgODMgNDkgNzAgMTAzIDQ3IDE1NSAyNTggNjkgNjggMTg4IDIwMiAxNzcgMTcxIDI3NyAyMDEgMTkgNzAgCisyNTIgMTk1IDEyNSAxMDkgNzAgODMgMjkgNTIgNjcgMTUzIDY1IDEwOSA5MCAxMDEgMTMyIDMyIDIgMTQ1IDI3NiA0MyAzMyAxNjAgMjQ2IAorMjMgNDkgOTAgMTIxIDE1MCAxMzUgMjYwIDE0NyAxOTEgMTY2IDExIDI0NyAzOCAxNjggNTUgMjIyIDQ2IDEyNiA5IDc0IDIxMSAxNSAKKzIyNiAxNTQgOTQgODAgMjQ4IDIzNiAyNyA4IDI1IDIyMiAxOTUgMjc0IDI1NyAyMDMgMjEyIDMwIDIzMCA0IDE5NSAyNTQgMjM5IDEwMCAKKzExNyAyOCAzNyAxNTkgMTAyIDE2NyAxNjkgMjMzIDIyNiAxNzQgMTEyIDE4MyA2NSAyMzggMjIwIDEzMSAzIDMxIDI3MCBeCis2MDkgMSAxNDAgMTQ2IDU3IDEzNyAxNjcgMTAyIDkzIDE0MyA3OCAxODIgMjQyIDc4IDY5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA2NiAKKzc0IDczIDI3NSA1IDE3NCA5MCAxNjQgMTIzIDI1NyAyMTggMjE0IDE1OCA1MiAxNzcgNjkgNDggMiAyNDIgMTI1IDU5IDUyIDExIDc5IAorMjAgMjE0IDEwNSA3MiAyNTggMyA0NiAxMDYgMjY4IDI0OSAxMTMgMTEgMzIgMzAgMTE1IDI3MSAxNSA4OCAxMzYgMjY5IDEwMCAyNDQgCis0MCAxODIgMjkgOTggMTUwIDQ3IDEwNCAyNDAgMjc2IDIzNSAxNTYgMTM3IDU0IDkyIDE5MiA5NiAxMzUgNzMgMTA5IDEzNCA3NSAxMzcgCisyNjcgMjMyIDExMSAxNjIgMjA4IDEzNCAxMjIgMTI3IDg3IDE4NSA4IDUzIDc1IDE5MCAxMjggMTUxIDE3NyAyMzUgMjY5IDE0NyAyMzQgCisxMzkgMTYgMjA1IDI2OCAxNyAxMDMgMTEwIDE0NSAyMDYgNiAxMzggMjMxIDk0IDQxIDgwIDMxIDY2IDI1MyAyMjIgMjU3IDI2NSAyMDQgCisxMzggNSA3NCAyMzkgMTQ2IDEwNCA4IDI2NiA1NSAyNjkgMzQgMjI0IDIzOCAyNDggMTAyIDE1OSAzIDE1OSAxMTYgMTY5IDE3IDU2IAorMTIwIDE2NSAyNTMgMTA5IDI0NyA4NSAxNTcgMzUgNTYgMjIwIDE2IDE1MiAxMjggMjE3IDM3IDM3IDIwMyA3NCAxNzMgMTI2IDIzIDE5MyAKKzYwIDExNiAxMjIgMjcgMjM2IDcgMjY4IDgzIDI0MiAxOTEgNzkgMTMzIDIyNCAxMjUgMjM4IDgyIDExMiA2MCA1MCAyNjIgMjI1IDIzIAorMjQwIDUwIDk2IDIzNSAyMDMgMTI3IDE1MyA0NSA4OSAxNDcgMTIxIDEyOSAxMTUgMzkgMTY1IDE4NyAyNDkgMTY2IDE1MSAxMTEgOTYgCisxODggNTMgMjggMjAwIDE0OCAxOTggMSA2NSAxMjMgOTEgMjI4IDExNSAyMDUgMTU1IDcgMjAyIDYzIDQyIDk3IDE1MiAxOTQgMjM3IAorMTE4IDI1MCAxMzAgMTMyIDE2MCAxNCAxMSAxNDUgNDAgMTYgMzkgMTE4IDM3IDE1MCAyMTMgOTQgNjAgMjI5IDEzMiA0NyA0IDExMCA5OCAKKzIxNiAxODYgMTg1IDU1IDQzIDE3NCAyNCAyNSA0MiA0NCAxMiAyNzUgMTcxIDQ1IDE4OSAxMTcgMjAgMTQ4IDg1IDI3MCAxNjQgNzYgCisyNjcgMTE5IDEwMSAyNjEgMTYxIDMxIDEzIDI3MyAxNDMgMTkxIDMyIDE0MyAxMjUgMTcyIDYyIDMxIDI0NSAxMjMgNDQgMjM4IDEzNSAKKzI1MiAyNTggMTE2IDU2IDcgMzYgNzMgNjIgMTQ0IDI1NSAyNCA5MSA2MiAyNDQgMTA2IDIwMiAxMTAgMzIgNzcgMTA1IDkxIDEyOCAyNjQgCisyNyAxMzYgMzcgMjUwIDY0IDI3MiA3OSAxOTkgODQgMjA2IDUzIDEyOCA1MSA0NyAyMTcgMjUwIDE3IDMgMjU5IDI0NiAxODcgMzYgMTg2IAorNzIgNDUgMjMgMTI3IDIwMCAxOTUgMTg4IDEwMCAxOCAyMCAyNjEgOTUgMTcxIDIxMSAxNzkgOTcgMjUyIDQ1IDI1NSAxMzcgMTAxIDgyIAorMTIgMjA5IDMyIDI0MyAyNTUgNzEgODEgMTYxIDc4IDMgOTMgMjU2IDg4IDgzIDEwIDE4MSAxNzggODYgMTIxIDE2IDEwNSAxMzggMTE4IAorODQgMTQwIDMzIDIwNyAxMTcgMTIwIDI3OCAyNjMgMTAgMTUgMTg4IDI2NiAxNjggMTE5IDIxNCAyNzEgNjIgNzggMTE2IDEwMyAxNTcgCisxMzUgMjYgMTE5IDM1IDEyMiA4MCA5NyA4NiA1NSAxNTYgMjQgNDQgMTkxIDE0NSAxNTMgMjYgMjE5IDE2NSAxNDAgOTkgNjcgMzggNTQgCisyMDUgNDIgMjc2IDIyIDE3NiAyMTggMTQ4IDE5IDEzMSAyNDMgMTQyIDYxIDE4MCAxMTQgMjU0IDE3MyAyMzkgMzMgOTQgMTA3IDIxOSAKKzIzMSAxNjAgMTgwIDEgMjQ0IDI3MiAxOTIgMjA5IDI2NCAyNTMgMTU2IDIzNyAxODQgMjcwIDIxMSAyMjYgODcgNzIgMTU4IDE1MiAyOCAKKzg3IDE5IDE4IDIzMyAyNDEgMTQgNzcgNSAxMjEgMjI5IDI0NSA1NyAxODQgMTU3IDIwMSA0NiA0MCAxMjkgNDkgMTkgODQgOTMgNDMgCisxMDggNCAyMjMgMTA4IDExNyAyMzMgOSA0IDU3IDExOCAxOCAxMjAgMTEyIDExMyAxOTAgMTgxIDEyIDk2IDIyIDYzIDIwOCAyNDcgMjUxIAorMjggMTM0IDkgMTE3IDE4NiAxMzggMTg0IDIyMyA2MSAxMjcgMTM0IDE3NSAxMDcgNiAyNTEgODEgMTE0IDIwNyAxODMgMTQwIDgwIDE5NyAKKzIxNiA3MyAxNzUgMTU0IDE1NiA3MSAxOTQgMTEgOTggNTAgMTk2IDg2IDIyMSAxNDYgNCAxNTcgODggMzYgMTM5IDgyIDIyNSAxODkgCisyMzAgMzAgNDkgMTMyIDk0IDI3MyA5MCA1MSAxMTMgNzcgNTIgMTExIDQ5IDE5OCAyMzMgNzUgMjQgMjU3IDUyIDY0IDU5IDk5IDEgMTc4IAorMTMzIDExMSAyNzUgNTggMzUgOSAyMzAgMTk2IDM5IDIzMSA0NyAxNzAgMjE2IF4KKzU4OSAwIDE5NyAxNjkgODEgNzIgNDEgMjU1IDE3NiA0NCAyMzQgOTIgMTQ1IDEwNCAxNTUgMTE0IDIwOCAyNDMgMjA4IDIwMCAyNTkgNDggCisyMSAxMDggMjI0IDQwIDgwIDE3OCAxOTcgMTI3IDE5NiAxNDggMjM3IDIyNSAyMTUgNzggMjUgMjMgMjMgNjYgMTUgMTY3IDEyNCA2NCAKKzE1IDIxMCA3MyAyMTYgOTkgMjMgMTUxIDEzMCAyNDMgMTY2IDM0IDU0IDI0NCAxNDUgMTQ3IDI1OCAxMTIgMTEgNTYgMTU5IDI2OCAxMjIgCis2NCA1OCAxNTkgMjI1IDE5IDE5MyAxMDEgMjE5IDI3NCAxMDUgNDkgMjM5IDU1IDIyMyAxMDQgNzAgMTI2IDEzMiAyMDEgMjM4IDE2MSAKKzIyNSAxMzAgOTAgMjMwIDI2MiA1MyAyNyAxMzUgOTUgMzkgNTkgNTMgNjkgMTQ3IDE5IDI3OCAyMTYgMTQgMzUgNzUgODggMjczIDEyNyAKKzE1NCAyNjMgMzIgMjY3IDE4NSAxMTcgNTkgOTUgMjM1IDcxIDI1OCAyNyAxNzcgMjYxIDExNyAxNDQgODMgMzAgMjY3IDIyOCA2NiAyMTEgCis1MiA0OCAyMiAxNzIgMTcxIDM5IDE0NCAxNjggMTQ1IDYyIDE0MyAzNiAyNTAgODYgMTIwIDIzNCA1MCAxMzMgMTgwIDcwIDg0IDI0NyAKKzI3NyAyODAgMTMxIDEzNyAxMCAxNjIgMTYxIDE0MCAxNDIgMTQgMTg4IDExIDE0MSAyNzQgNjMgMTY0IDM0IDk3IDE5MyAxNiAxMDQgCisxOTggNjMgNzkgMjAwIDIxIDE1MSAxNzMgMTkyIDM3IDI3MiAxNDggNDEgNTkgMTAgMTIwIDE0OSAyMTYgNTcgMTM4IDIyNyA0NSAyMTMgCisyMDUgNjggMTI2IDE3NSAxNTAgMTA5IDExOCAzOCAyMDggMTU4IDkzIDEyNCAyMTcgNzggMjYzIDc0IDE1MiAxMDkgNzUgODkgNTYgMjAxIAorMTUzIDQ2IDE0OSAyMTUgMTIwIDE5MSAxMDEgMjYyIDk2IDI1NyAxMzMgNTIgMTMzIDEzNyAyNDggMjEzIDkgMTgzIDIwMiAyMTcgMjc0IAorMTQ4IDI3OSAxMTAgMTM5IDE2MyA1NSAyNjUgMjcwIDI3NSA4NCA4IDE2MiAyMDQgODkgMTMgMjUyIDEgODkgMjA5IDEzNyAyMDYgNDcgCis4NSA5OCAxNzIgMjU2IDE1NCAyMjAgMjEwIDExNSAxMDEgMjMgMTA4IDE4MSA5MSAyMDkgOTQgMTAzIDE3NiAxIDQgOTQgNjEgMTAgNzcgCis0NiA2NCAxMDAgNDQgMTQ5IDI1OCA2OSA2MiAxODUgMjAyIDE3NCAxNzEgMjc3IDE5NSAxNiA2MSAyNDkgMTkyIDEyMiAxMDYgNzAgODMgCisyOSA0OSA2NyAxNDcgNjIgMTAwIDg3IDk4IDEyOSAyNiAyIDEzNiAyNzAgMzcgMzMgMTYwIDI0NiAxNyA0MCA4MSAxMTUgMTQ0IDEyNiAKKzI2MCAxMzggMTg1IDE2MCA4IDI0NyAzOCAxNjUgNTUgMjIyIDQwIDEyMyA2OCAyMTEgOSAyMjYgMTUxIDg4IDc3IDI0MiAyMzAgMjQgMiAKKzI1IDIxOSAxODkgMjcxIDI1NCAxOTcgMjEyIDMwIDIyNCAyNzkgMTk1IDI1NCAyMzkgOTcgMTA4IDI4IDI4IDE1NiA5MyAxNjcgMTY2IAorMjMwIDIyMCAxNjggMTAzIDE3NyA2NSAyMzIgMjIwIDEyNSAyNSAyNjIgMTM4IDE0MiA1NyAxMzcgMTYzIDk4IDg3IDE0MSA3OCAxNzggCisyNDAgNzYgNjcgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDYwIDc0IDY3IDI3NSAyODAgMTc0IDg2IDE2MiAxMTkgMjU1IDIxOCAyMTAgMTU4IAorNTAgMTc1IDY1IDI3NSA0MiAyNzcgMjM4IDExOSA1OSA1MiA1IDczIDIwIDIxNCA5OSA2NiAyNTQgMSA0NiAxMDYgMjY2IDI0OSAxMDcgNyAKKzMwIDI4IDExMyAyNzEgMTUgODIgMTM2IDI2OSAxMDAgMjQwIDM0IDE4MiAyNyA5MiAxNDYgNDEgMTAyIDI0MCAyNzIgMjMzIDE1NiAxMzUgCis1MiA5MCAxODggOTYgMTI5IDY5IDEwNSAxMzQgNzMgMTMxIDI2NSAyMjggMTA5IDE2MCAyMDQgMTMyIDExNiAxMjMgODUgMTgzIDYgNTEgCis2OSAxOTAgMTIyIDE0OSAxNzMgMjM1IDI2NyAxNDMgMjMyIDEzNSAxMCAyMDUgMjY0IDExIDk5IDEwOCAxMzkgMjA2IDQgMTM2IDIyNyAKKzg4IDM1IDc2IDI1IDY2IDI1MyAyMTggMjUzIDI2MSAyMDIgMTMyIDUgNzIgMjM3IDE0MCAxMDAgMiAyNjQgNTMgMjY1IDMyIDIyNCAyMzYgCisyNDYgMTAyIDE1NSAzIDE1NyAxMTQgMTY1IDEzIDU2IDExNiAxNjUgMjUxIDEwNyAyNDUgODEgMTU3IDI5IDUwIDIxOCAxNCAxNDYgMTI2IAorMjE3IDM1IDMzIDIwMyA2OCAxNjkgMTI0IDIxIDE5MyA1OCAxMTYgMTIyIDIxIDIzNiA3IDI2OCA3OSAyNDIgMTg3IDc1IDEzMSAyMjIgCisxMjUgMjM4IDc2IDExMCA1NCA0OCAyNjAgMjIzIDE5IDIzNiA1MCA5MCAyMzEgMTk5IDEyNyAxNTMgNDUgMjcwIF4KKzYyMyAxIDEzNSAxMjEgMTI1IDEwNyAyNyAxNTcgMTc5IDI0MSAxNjYgMTM5IDk5IDg4IDE4OCA1MyAyNCAxOTYgMTQ4IDE5MCAyNzIgNjEgCisxMTkgNzkgMjI0IDEwMyAyMDEgMTUxIDI4MiAxOTggNjMgMzAgOTcgMTQ4IDE5NCAyMjkgMTEwIDI1MCAxMjYgMTMyIDE1NiAyIDcgMTM3IAorMzIgOCAzMSAxMTggMzcgMTM4IDIwOSA5NCA2MCAyMjUgMTI4IDQ3IDI3OSAxMTAgOTQgMjEyIDE4MiAxNzcgNDMgNDMgMTY2IDEyIDEzIAorMzggMzIgMTIgMjcxIDE2NyAzMyAxODUgMTE3IDEyIDE0NCA4MSAyNjYgMTY0IDc2IDI1OSAxMTUgMTAxIDI2MSAxNTcgMjcgMSAyNjUgCisxNDMgMTg3IDMyIDEzNSAxMTcgMTY4IDU4IDMxIDI0NSAxMjMgNDAgMjMwIDEzNSAyNDQgMjU0IDEwOCA1MiAzIDI0IDY5IDYyIDE0MCAKKzI1MSAyMCA4MyA1MCAyNDQgOTggMTk0IDEwMiAyNCA2NSAxMDUgOTEgMTIwIDI1NiAyNyAxMzIgMjUgMjQyIDU2IDI2OCA3OSAxOTkgODQgCisyMDIgNDEgMTI4IDQzIDM5IDIwOSAyNDYgMTcgMjc0IDI1OSAyNDIgMTg3IDI4IDE3OCA2OCAzNyAxMSAxMjMgMTkyIDE4NyAxODQgOTIgCisxOCAxNiAyNTMgODcgMTYzIDIwNyAxNzkgODUgMjUyIDQxIDI1NSAxMjkgODkgODIgNCAyMDEgMjAgMjM5IDI0NyA1OSA3NyAxNTMgNjYgCisyNzggODUgMjQ4IDg0IDcxIDI4MSAxNzcgMTc0IDg2IDExNyAxNiAxMDEgMTMwIDExNCA3NiAxMzIgMjkgMTk5IDEwNSAxMTYgMjc0IAorMjU1IDIgMyAxODAgMjY2IDE2MCAxMTkgMjEwIDI2NyA1NCA3MCAxMDQgOTEgMTQ1IDEyNyAyNiAxMDcgMzEgMTE0IDgwIDg5IDc4IDQ3IAorMTUyIDI0IDQ0IDE5MSAxNDEgMTQxIDE0IDIxMSAxNjEgMTQwIDk5IDYzIDM0IDU0IDE5NyA0MiAyNzYgMTggMTY4IDIxMCAxMzYgMTEgCisxMTkgMjM1IDEzOCA1MyAxODAgMTEwIDI0NiAxNjkgMjMxIDI1IDkwIDk5IDIxOSAyMzEgMTUyIDE3NiAxIDI0MCAyNzIgMTg4IDIwNSAKKzI2NCAyNDUgMTQ0IDIzNyAxODAgMjYyIDIwMyAyMTggNzkgNzIgMTQ2IDE1MiAyMCA4NyA3IDEwIDIyOSAyNDEgMTAgNzcgMSAxMDkgCisyMjkgMjM3IDUzIDE3NiAxNTMgMTk3IDM4IDM2IDExNyAzNyAxNSA4MCA5MyAzNSA5NiAyMTkgMTAwIDEwOSAyMjUgMjgwIDQgNDUgMTA2IAorNiAxMjAgMTAwIDExMyAxODIgMTgxIDkyIDE0IDU5IDIwNCAyMzkgMjUxIDE2IDEyNiAxIDExMyAxODYgMTM4IDE4NCAyMjMgNjEgMTE1IAorMTIyIDE3NSAxMDcgNiAyNDMgODEgMTE0IDIwNyAxNzUgMTI4IDY4IDE5MyAyMDggNzMgMTcxIDE0NiAxNDggNjMgMTg2IDExIDk4IDM4IAorMTg4IDc0IDIyMSAxNDYgMjc1IDE0OSA4OCAzMiAxMzkgNzQgMjE3IDE4OSAyMjYgMTggNDEgMTI0IDg2IDI3MyA3OCA1MSAxMDkgNzMgCis0MCAxMDMgNDkgMTk0IDIzMyA2NyAxNiAyNTcgNDQgNjQgNTUgOTEgMjc2IDE3MCAxMjUgMTExIDI2NyA1OCAyNyA1IDIyMiAxOTIgMzUgCisyMjcgNDMgMTcwIDI1MiAxOTcgMTY5IDc5IDY4IDQxIDI1MSAxNzIgNDAgMjM0IDkyIDE0NSAxMDIgMTU1IDEwOCAyMDQgMjQzIDIwOCAKKzIwMCAyNTcgNDggMjEgMTA0IDIyMiA0MCA3OCAxNzggMTk1IDEyMyAxOTYgMTQ0IDIzMyAyMjMgMjEzIDcyIDIzIDIzIDE5IDYyIDEzIAorMTY1IDExOCA2MiA5IDIwOCA2OSAyMTQgOTcgMTcgMTUxIDEzMCAyNDEgMTYyIDM0IDUwIDI0MCAxNDEgMTQ1IDI1NCAxMTIgOSA1MiAKKzE1NSAyNjQgMTE4IDU4IDUyIDE1OSAyMjEgMTkgMTg5IDk5IDIxNSAyNzQgMTAzIDQ1IDIzNyA0OSAyMTkgMTA0IDY2IDEyNiAxMjggCisxOTkgMjM2IDE1OSAyMjUgMTI0IDkwIDIzMCAyNjIgNDcgMjEgMTI5IDkzIDM5IDUzIDQ5IDY3IDE0NyAxNyAyNzggMjE2IDggMzUgNzUgCis4NiAyNjkgMTIxIDE1MCAyNjEgMjYgMjY3IDE4NSAxMTMgNTUgOTUgMjMzIDcxIDI1NiAyMyAxNzUgMjU5IDExMSAxNDQgNzcgMjYgMjYzIAorMjI4IDY0IDIwNyA0OCA0MiAxOCAxNzIgMTY3IDM3IDE0MiAxNjYgMTQzIDU2IDEzNyAzNiAyNDggODAgMTE0IDIzMiA0NiAxMjcgMTc4IAorNjQgODAgMjQ1IDI3NSAyODAgMTMxIDEzMSA4IDE2MiAxNjEgMTM2IDE0MiAxNCAxODYgNyAxNDEgMjcyIDU3IDE2MiAzMCA5MyAxOTEgCisxMCA5OCAxOTggNTkgNzMgMTk2IDE3IDE0NyAxNzMgMTkyIDMxIDI3MCAxNDIgMzkgNTcgNiAxMTYgMTQzIDIxMiA1MSAxMzQgMjI3IDM5IAorMjEzIDIwMyA2NiAxMjIgMTcxIDE1MCAxMDUgMTEyIDM0IDIwNiAxNTQgOTEgMTI0IDIxMyA3NiAyNjMgNzIgMTUwIDEwOSA2OSA4MyA1NCAKKzIwMSAxNDcgNDIgMTQ5IDIwMiBeCis2MDIgMSAxMTYgMTg3IDg5IDI1NCA4NCAyNTMgMTMzIDQwIDEyOSAxMzMgMjQ4IDIwOSA5IDE4MyAxOTQgMjEzIDI2NiAxNDQgMjc5IAorMTAyIDEzNSAxNjMgNDcgMjY1IDI3MCAyNzEgODAgOCAxNTQgMjA0IDg1IDkgMjQ4IDI3NCA4OSAyMDEgMTI5IDE5OCA0MyA4NSA4NiAKKzE2OCAyNTYgMTU0IDIxNiAyMTAgMTE1IDkzIDE5IDEwOCAxNzcgODcgMjA5IDg2IDEwMyAxNzYgMjc4IDI4MSA4MiA1MyAxMCA2OSA0MiAKKzU2IDk2IDQwIDE0MSAyNTggNjkgNTQgMTgxIDIwMiAxNzAgMTcxIDI3NyAxODcgMTIgNDkgMjQ1IDE4OCAxMTggMTAyIDcwIDgzIDI5IAorNDUgNjcgMTM5IDU4IDg4IDgzIDk0IDEyNSAxOCAyIDEyNCAyNjIgMjkgMzMgMTYwIDI0NiA5IDI4IDY5IDEwNyAxMzYgMTE0IDI2MCAKKzEyNiAxNzcgMTUyIDQgMjQ3IDM4IDE2MSA1NSAyMjIgMzIgMTE5IDI3MyA2MCAyMTEgMSAyMjYgMTQ3IDgwIDczIDIzNCAyMjIgMjAgCisyNzkgMjUgMjE1IDE4MSAyNjcgMjUwIDE4OSAyMTIgMzAgMjE2IDI3NSAxOTUgMjU0IDIzOSA5MyA5NiAyOCAxNiAxNTIgODEgMTY3IAorMTYyIDIyNiAyMTIgMTYwIDkxIDE2OSA2NSAyMjQgMjIwIDExNyAyODEgMTcgMjU4IDEzNCAxMzQgNTcgMTM3IDE1NSA5MCA3NSAxMzcgCis3OCAxNzAgMjM2IDcyIDYzIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA0OCA3NCA1NSAyNzUgMjcyIDE3NCA3OCAxNTggMTExIDI1MSAyMTggCisyMDIgMTU4IDQ2IDE3MSA1NyAyNjcgMzAgMjY5IDIzMCAxMDcgNTkgNTIgMjc4IDYxIDIwIDIxNCA4NyA1NCAyNDYgMjgyIDQ2IDEwNiAKKzI2MiAyNDkgOTUgMjg0IDI2IDI0IDEwOSAyNzEgMTUgNzAgMTM2IDI2OSAxMDAgMjMyIDIyIDE4MiAyMyA4MCAxMzggMjkgOTggMjQwIAorMjY0IDIyOSAxNTYgMTMxIDQ4IDg2IDE4MCA5NiAxMTcgNjEgOTcgMTM0IDY5IDExOSAyNjEgMjIwIDEwNSAxNTYgMTk2IDEyOCAxMDQgCisxMTUgODEgMTc5IDIgNDcgNTcgMTkwIDExMCAxNDUgMTY1IDIzNSAyNjMgMTM1IDIyOCAxMjcgMjgzIDIwNSAyNTYgMjg0IDkxIDEwNCAKKzEyNyAyMDYgMTMyIDIxOSA3NiAyMyA2OCAxMyA2NiAyNTMgMjEwIDI0NSAyNTMgMTk4IDEyMCA1IDY4IDIzMyAxMjggOTIgMjc1IDI2MCAKKzQ5IDI1NyAyOCAyMjQgMjMyIDI0MiAxMDIgMTQ3IDMgMTUzIDExMCAxNTcgNSA1NiAxMDggMTY1IDI0NyAxMDMgMjQxIDczIDE1NyAxNyAKKzM4IDIxNCAxMCAxMzQgMTIyIDIxNyAzMSAyNSAyMDMgNTYgMTYxIDEyMCAxNyAxOTMgNTQgMTE2IDEyMiA5IDIzNiA3IDI2OCA3MSAyNDIgCisxNzkgNjcgMTI3IDIxOCAxMjUgMjM4IDY0IDEwNiA0MiA0NCAyNTYgMjE5IDExIDIyOCA1MCA3OCAyMjMgMTkxIDEyNyAxNTMgNDUgNzcgCisxMjkgMTIxIDEyMyAxMDMgMjEgMTUzIDE3NSAyMzcgMTY2IDEzMyA5MyA4NCAxODggNTMgMjIgMTk0IDE0OCAxODYgMjY4IDU5IDExNyAKKzczIDIyMiA5NyAxOTkgMTQ5IDI4MCAxOTYgNjMgMjQgOTcgMTQ2IDE5NCAyMjUgMTA2IDI1MCAxMjQgMTMyIDE1NCAyODEgNSAxMzMgMjggCis0IDI3IDExOCAzNyAxMzIgMjA3IDk0IDYwIDIyMyAxMjYgNDcgMjc3IDExMCA5MiAyMTAgMTgwIDE3MyAzNyA0MyAxNjIgNiA3IDM2IDI2IAorMTIgMjY5IDE2NSAyNyAxODMgMTE3IDggMTQyIDc5IDI2NCAxNjQgNzYgMjU1IDExMyAxMDEgMjYxIDE1NSAyNSAyODAgMjYxIDE0MyAKKzE4NSAzMiAxMzEgMTEzIDE2NiA1NiAzMSAyNDUgMTIzIDM4IDIyNiAxMzUgMjQwIDI1MiAxMDQgNTAgMSAxOCA2NyA2MiAxMzggMjQ5IAorMTggNzkgNDQgMjQ0IDk0IDE5MCA5OCAyMCA1OSAxMDUgOTEgMTE2IDI1MiAyNyAxMzAgMTkgMjM4IDUyIDI2NiA3OSAxOTkgODQgMjAwIAorMzUgMTI4IDM5IDM1IDIwNSAyNDQgMTcgMjcwIDI1OSAyNDAgMTg3IDI0IDE3NCA2NiAzMyA1IDEyMSAxODggMTgzIDE4MiA4OCAxOCAxNCAKKzI0OSA4MyAxNTkgMjA1IDE3OSA3OSAyNTIgMzkgMjU1IDEyNSA4MyA4MiAxOTcgMTQgMjM3IDI0MyA1MyA3NSAxNDkgNjAgMjc2IDgxIAorMjQ0IDgyIDY1IDI3NyAxNzUgMTcyIDg2IDExNSAxNiA5OSAxMjYgMTEyIDcyIDEyOCAyNyAxOTUgOTkgMTE0IDI3MiAyNTEgMjgzIDI4MiAKKzE3NiAyNjYgMTU2IDExOSAyMDggMjY1IDUwIDY2IDk4IDg1IDEzOSAxMjMgMjYgMTAxIDI5IDExMCA4MCA4NSA3NCA0MyAxNTAgMjQgNDQgCisxOTEgMTM5IDEzNSA4IDIwNyAxNTkgMTQwIDk5IDYxIDI0OCBeCis2MDkgMSA1NCAxODkgNDIgMjc2IDE0IDE2MCAyMDIgMTI0IDMgMTA3IDIyNyAxMzQgNDUgMTgwIDEwNiAyMzggMTY1IDIyMyAxNyA4NiAKKzkxIDIxOSAyMzEgMTQ0IDE3MiAxIDIzNiAyNzIgMTg0IDIwMSAyNjQgMjM3IDEzMiAyMzcgMTc2IDI1NCAxOTUgMjEwIDcxIDcyIDEzNCAKKzE1MiAxMiA4NyAyODIgMiAyMjUgMjQxIDYgNzcgMjg0IDk3IDIyOSAyMjkgNDkgMTY4IDE0OSAxOTMgMzAgMzIgMTA1IDI1IDExIDc2IAorOTMgMjcgODQgMjgzIDIxNSA5MiAxMDEgMjE3IDI3MiA0IDMzIDk0IDI4MSAxMjAgODggMTEzIDE3NCAxODEgMjc1IDg4IDYgNTUgMjAwIAorMjMxIDI1MSA0IDExOCAyODAgMTA5IDE4NiAxMzggMTg0IDIyMyA2MSAxMDMgMTEwIDE3NSAxMDcgNiAyMzUgODEgMTE0IDIwNyAxNjcgCisxMTYgNTYgMTg5IDIwMCA3MyAxNjcgMTM4IDE0MCA1NSAxNzggMTEgOTggMjYgMTgwIDYyIDIyMSAxNDYgMjY3IDE0MSA4OCAyOCAxMzkgCis2NiAyMDkgMTg5IDIyMiA2IDMzIDExNiA3OCAyNzMgNjYgNTEgMTA1IDY5IDI4IDk1IDQ5IDE5MCAyMzMgNTkgOCAyNTcgMzYgNjQgNTEgCis4MyAyNzIgMTYyIDExNyAxMTEgMjU5IDU4IDE5IDEgMjE0IDE4OCAzMSAyMjMgMzkgMTcwIDI0NCAxOTcgMTY5IDc1IDYwIDQxIDI0MyAKKzE2NCAzMiAyMzQgOTIgMTQ1IDk4IDE1NSA5NiAxOTYgMjQzIDIwOCAyMDAgMjUzIDQ4IDIxIDk2IDIxOCA0MCA3NCAxNzggMTkxIDExNSAKKzE5NiAxMzYgMjI1IDIxOSAyMDkgNjAgMTkgMjMgMTEgNTQgOSAxNjEgMTA2IDU4IDI4NCAyMDQgNjEgMjEwIDkzIDUgMTUxIDEzMCAyMzcgCisxNTQgMzQgNDIgMjMyIDEzMyAxNDEgMjQ2IDExMiA1IDQ0IDE0NyAyNTYgMTEwIDQ2IDQwIDE1OSAyMTMgMTkgMTgxIDk1IDIwNyAyNzQgCis5OSAzNyAyMzMgMzcgMjExIDEwNCA1OCAxMjYgMTIwIDE5NSAyMzIgMTU1IDIyNSAxMTIgOTAgMjMwIDI2MiAzNSA5IDExNyA4OSAzOSAKKzQxIDQxIDYzIDE0NyAxMyAyNzggMjE2IDI4MyAzNSA3NSA4MiAyNjEgMTA5IDE0MiAyNTcgMTQgMjY3IDE4NSAxMDUgNDcgOTUgMjI5IAorNzEgMjUyIDE1IDE3MSAyNTUgOTkgMTQ0IDY1IDE4IDI1NSAyMjggNjAgMTk5IDQwIDMwIDEwIDE3MiAxNTkgMzMgMTM4IDE2MiAxMzkgCis0NCAxMjUgMzYgMjQ0IDY4IDEwMiAyMjggMzggMTE1IDE3NCA1MiA3MiAyNDEgMjcxIDI4MCAxMzEgMTE5IDQgMTYyIDE2MSAxMjggMTQyIAorMTQgMTgyIDI4NiAxNDEgMjY4IDQ1IDE1OCAyMiA4NSAxODcgMjg1IDg2IDE5OCA1MSA2MSAxODggOSAxMzkgMTczIDE5MiAxOSAyNjYgCisxMzAgMzUgNTMgMjg1IDEwOCAxMzEgMjA0IDM5IDEyNiAyMjcgMjcgMjEzIDE5OSA2MiAxMTQgMTYzIDE1MCA5NyAxMDAgMjYgMjAyIAorMTQ2IDg3IDEyNCAyMDUgNzIgMjYzIDY4IDE0NiAxMDkgNTcgNzEgNTAgMjAxIDEzNSAzNCAxNDkgMjE1IDExNCAxODUgODMgMjUwIDc4IAorMjUxIDEzMyAzNCAxMjcgMTMxIDI0OCAyMDcgOSAxODMgMTkwIDIxMSAyNjIgMTQyIDI3OSA5OCAxMzMgMTYzIDQzIDI2NSAyNzAgMjY5IAorNzggOCAxNTAgMjA0IDgzIDcgMjQ2IDI3MCA4OSAxOTcgMTI1IDE5NCA0MSA4NSA4MCAxNjYgMjU2IDE1NCAyMTQgMjEwIDExNSA4OSAxNyAKKzEwOCAxNzUgODUgMjA5IDgyIDEwMyAxNzYgMjc2IDI3OSA3NiA0OSAxMCA2NSA0MCA1MiA5NCAzOCAxMzcgMjU4IDY5IDUwIDE3OSAyMDIgCisxNjggMTcxIDI3NyAxODMgMTAgNDMgMjQzIDE4NiAxMTYgMTAwIDcwIDgzIDI5IDQzIDY3IDEzNSA1NiA4MiA4MSA5MiAxMjMgMTQgMiAKKzExOCAyNTggMjUgMzMgMTYwIDI0NiA1IDIyIDYzIDEwMyAxMzIgMTA4IDI2MCAxMjAgMTczIDE0OCAyIDI0NyAzOCAxNTkgNTUgMjIyIAorMjggMTE3IDI2OSA1NiAyMTEgMjg0IDIyNiAxNDUgNzYgNzEgMjMwIDIxOCAxOCAyNzcgMjUgMjEzIDE3NyAyNjUgMjQ4IDE4NSAyMTIgCiszMCAyMTIgMjczIDE5NSAyNTQgMjM5IDkxIDkwIDI4IDEwIDE1MCA3NSAxNjcgMTYwIDIyNCAyMDggMTU2IDg1IDE2NSA2NSAyMjAgMjIwIAorMTEzIDI4MSAxMyAyNTYgMTMyIDEzMCA1NyAxMzcgMTUxIDg2IDY5IDEzNSA3OCAxNjYgMjM0IDcwIDYxIDIzMiAxNzcgMjIgMTI5IDY4IAorMTY4IDQyIDc0IDQ5IDI3NSAyNjggMTc0IDc0IDE1NiAxMDcgMjQ5IDIxOCAxOTggMTU4IDQ0IDE2OSA1MyAyNjMgMjQgMjY1IDIyNiAKKzEwMSA1OSA1MiAyNzQgNTUgMjAgMjE0IDgxIDQ4IDI0MiAyODIgNDYgMTA2IDI2MCAxNDUgXgorNjE0IDEgODMgMjgwIDIyIDIwIDEwNSAyNzEgMTUgNTggMTM2IDI2OSAxMDAgMjI0IDEwIDE4MiAxOSA2OCAxMzAgMTcgOTQgMjQwIDI1NiAKKzIyNSAxNTYgMTI3IDQ0IDgyIDE3MiA5NiAxMDUgNTMgODkgMTM0IDY1IDEwNyAyNTcgMjEyIDEwMSAxNTIgMTg4IDEyNCA5MiAxMDcgNzcgCisxNzUgMjg3IDQzIDQ1IDE5MCA5OCAxNDEgMTU3IDIzNSAyNTkgMTI3IDIyNCAxMTkgMjc1IDIwNSAyNDggMjc2IDgzIDEwMCAxMTUgMjA2IAorMjg1IDEyOCAyMTEgNjQgMTEgNjAgMSA2NiAyNTMgMjAyIDIzNyAyNDUgMTk0IDEwOCA1IDY0IDIyOSAxMTYgODQgMjY3IDI1NiA0NSAKKzI0OSAyNCAyMjQgMjI4IDIzOCAxMDIgMTM5IDMgMTQ5IDEwNiAxNDkgMjg2IDU2IDEwMCAxNjUgMjQzIDk5IDIzNyA2NSAxNTcgNSAyNiAKKzIxMCA2IDEyMiAxMTggMjE3IDI3IDE3IDIwMyA0NCAxNTMgMTE2IDEzIDE5MyA1MCAxMTYgMTIyIDI4NiAyMzYgNyAyNjggNjMgMjQyIAorMTcxIDU5IDEyMyAyMTQgMTI1IDIzOCA1MiAxMDIgMzAgNDAgMjUyIDIxNSAzIDIyMCA1MCA2NiAyMTUgMTgzIDEyNyAxNTMgNDUgNjkgCisxMTcgMTIxIDExOSA5NSA5IDE0NSAxNjcgMjI5IDE2NiAxMjEgODEgNzYgMTg4IDUzIDE4IDE5MCAxNDggMTc4IDI2MCA1NSAxMTMgNjEgCisyMTggODUgMTk1IDE0NSAyNzYgMTkyIDYzIDEyIDk3IDE0MiAxOTQgMjE3IDk4IDI1MCAxMjAgMTMyIDE1MCAyNzMgMSAxMjUgMjAgMjg1IAorMTkgMTE4IDM3IDEyMCAyMDMgOTQgNjAgMjE5IDEyMiA0NyAyNzMgMTEwIDg4IDIwNiAxNzYgMTY1IDI1IDQzIDE1NCAyODMgMjg0IDMyIAorMTQgMTIgMjY1IDE2MSAxNSAxNzkgMTE3IDEzOCA3NSAyNjAgMTY0IDc2IDI0NyAxMDkgMTAxIDI2MSAxNTEgMjEgMjcyIDI1MyAxNDMgCisxODEgMzIgMTIzIDEwNSAxNjIgNTIgMzEgMjQ1IDEyMyAzNCAyMTggMTM1IDIzMiAyNDggOTYgNDYgMjg2IDYgNjMgNjIgMTM0IDI0NSAKKzE0IDcxIDMyIDI0NCA4NiAxODIgOTAgMTIgNDcgMTA1IDkxIDEwOCAyNDQgMjcgMTI2IDcgMjMwIDQ0IDI2MiA3OSAxOTkgODQgMTk2IAorMjMgMTI4IDMxIDI3IDE5NyAyNDAgMTcgMjYyIDI1OSAyMzYgMTg3IDE2IDE2NiA2MiAyNSAyODIgMTE3IDE4MCAxNzUgMTc4IDgwIDE4IAorMTAgMjQxIDc1IDE1MSAyMDEgMTc5IDY3IDI1MiAzNSAyNTUgMTE3IDcxIDgyIDI4MSAxODkgMiAyMzMgMjM1IDQxIDcxIDE0MSA0OCAKKzI3MiA3MyAyMzYgNzggNTMgMjY5IDE3MSAxNjggODYgMTExIDE2IDk1IDExOCAxMDggNjQgMTIwIDIzIDE4NyA4NyAxMTAgMjY4IDI0MyAKKzI3OSAyNzQgMTY4IDI2NiAxNDggMTE5IDIwNCAyNjEgNDIgNTggODYgNzMgMTI3IDExNSAyNiA4OSAyNSAxMDIgODAgNzcgNjYgMzUgCisxNDYgMjQgNDQgMTkxIDEzNSAxMjMgMjg1IDE5OSAxNTUgMTQwIDk5IDU3IDI4IDU0IDE4NSA0MiAyNzYgMTIgMTU2IDE5OCAxMTggMjg4IAorMTAxIDIyMyAxMzIgNDEgMTgwIDEwNCAyMzQgMTYzIDIxOSAxMyA4NCA4NyAyMTkgMjMxIDE0MCAxNzAgMSAyMzQgMjcyIDE4MiAxOTkgCisyNjQgMjMzIDEyNiAyMzcgMTc0IDI1MCAxOTEgMjA2IDY3IDcyIDEyOCAxNTIgOCA4NyAyNzggMjg3IDIyMyAyNDEgNCA3NyAyODQgOTEgCisyMjkgMjI1IDQ3IDE2NCAxNDcgMTkxIDI2IDMwIDk5IDE5IDkgNzQgOTMgMjMgNzggMjgzIDIxMyA4OCA5NyAyMTMgMjY4IDQgMjcgODggCisyNzcgMTIwIDgyIDExMyAxNzAgMTgxIDI3MSA4NiAyIDUzIDE5OCAyMjcgMjUxIDI4NyAxMTQgMjc4IDEwNyAxODYgMTM4IDE4NCAyMjMgCis2MSA5NyAxMDQgMTc1IDEwNyA2IDIzMSA4MSAxMTQgMjA3IDE2MyAxMTAgNTAgMTg3IDE5NiA3MyAxNjUgMTM0IDEzNiA1MSAxNzQgMTEgCis5OCAyMCAxNzYgNTYgMjIxIDE0NiAyNjMgMTM3IDg4IDI2IDEzOSA2MiAyMDUgMTg5IDIyMCAyOSAxMTIgNzQgMjczIDYwIDUxIDEwMyAKKzY3IDIyIDkxIDQ5IDE4OCAyMzMgNTUgNCAyNTcgMzIgNjQgNDkgNzkgMjcwIDE1OCAxMTMgMTExIDI1NSA1OCAxNSAyODggMjEwIDE4NiAKKzI5IDIyMSAzNyAxNzAgMjQwIDE5NyAxNjkgNzMgNTYgNDEgMjM5IDE2MCAyOCAyMzQgOTIgMTQ1IDk2IDE1NSA5MCAxOTIgMjQzIDIwOCAKKzIwMCAyNTEgNDggMjEgOTIgMjE2IDQwIDcyIDE3OCAxODkgMTExIDE5NiAxMzIgMjIxIDIxNyAyMDcgNTQgMTcgMjMgNyA1MCA3IDE1OSAKKzEwMCA1NiAyODAgMjAyIDU3IDIwOCA5MSAyODggMTUxIDEzMCAyMzUgMTUwIDM0IDM4IDIyOCAxMjkgMTM5IDI0MiAxMTIgMjI2IF4KKzYxOSAwIDM4IDE0MSAyNTAgMTA0IDM3IDMxIDE1OSAyMDcgMTkgMTc1IDkyIDIwMSAyNzQgOTYgMzEgMjMwIDI4IDIwNSAxMDQgNTIgCisxMjYgMTE0IDE5MiAyMjkgMTUyIDIyNSAxMDMgOTAgMjMwIDI2MiAyNiAxMDggODYgMzkgMzIgMzUgNjAgMTQ3IDEwIDI3OCAyMTYgMjc3IAorMzUgNzUgNzkgMjU1IDEwMCAxMzYgMjU0IDUgMjY3IDE4NSA5OSA0MSA5NSAyMjYgNzEgMjQ5IDkgMTY4IDI1MiA5MCAxNDQgNTYgMTIgCisyNDkgMjI4IDU3IDE5MyAzNCAyMSA0IDE3MiAxNTMgMzAgMTM1IDE1OSAxMzYgMzUgMTE2IDM2IDI0MSA1OSA5MyAyMjUgMzIgMTA2IAorMTcxIDQzIDY2IDIzOCAyNjggMjgwIDEzMSAxMTAgMSAxNjIgMTYxIDEyMiAxNDIgMTQgMTc5IDI4MyAxNDEgMjY1IDM2IDE1NSAxNiA3OSAKKzE4NCAyNzkgNzcgMTk4IDQ1IDUyIDE4MiAzIDEzMyAxNzMgMTkyIDEwIDI2MyAxMjEgMzIgNTAgMjgyIDEwMiAxMjIgMTk4IDMwIDEyMCAKKzIyNyAxOCAyMTMgMTk2IDU5IDEwOCAxNTcgMTUwIDkxIDkxIDIwIDE5OSAxNDAgODQgMTI0IDE5OSA2OSAyNjMgNjUgMTQzIDEwOSA0OCAKKzYyIDQ3IDIwMSAxMjYgMjggMTQ5IDIxNSAxMTEgMTgyIDc0IDI0NCA2OSAyNDggMTMzIDI1IDEyNCAxMjggMjQ4IDIwNCA5IDE4MyAxODQgCisyMDggMjU2IDEzOSAyNzkgOTIgMTMwIDE2MyAzNyAyNjUgMjcwIDI2NiA3NSA4IDE0NCAyMDQgODAgNCAyNDMgMjY0IDg5IDE5MSAxMTkgCisxODggMzggODUgNzEgMTYzIDI1NiAxNTQgMjExIDIxMCAxMTUgODMgMTQgMTA4IDE3MiA4MiAyMDkgNzYgMTAzIDE3NiAyNzMgMjc2IDY3IAorNDMgMTAgNTkgMzcgNDYgOTEgMzUgMTMxIDI1OCA2OSA0NCAxNzYgMjAyIDE2NSAxNzEgMjc3IDE3NyA3IDM0IDI0MCAxODMgMTEzIDk3IAorNzAgODMgMjkgNDAgNjcgMTI5IDUzIDczIDc4IDg5IDEyMCA4IDIgMTA5IDI1MiAxOSAzMyAxNjAgMjQ2IDI4OSAxMyA1NCA5NyAxMjYgCis5OSAyNjAgMTExIDE2NyAxNDIgMjg5IDI0NyAzOCAxNTYgNTUgMjIyIDIyIDExNCAyNjMgNTAgMjExIDI4MSAyMjYgMTQyIDcwIDY4IAorMjI0IDIxMiAxNSAyNzQgMjUgMjEwIDE3MSAyNjIgMjQ1IDE3OSAyMTIgMzAgMjA2IDI3MCAxOTUgMjU0IDIzOSA4OCA4MSAyOCAxIDE0NyAKKzY2IDE2NyAxNTcgMjIxIDIwMiAxNTAgNzYgMTU5IDY1IDIxNCAyMjAgMTA3IDI4MSA3IDI1MyAxMjkgMTI0IDU3IDEzNyAxNDUgODAgNjAgCisxMzIgNzggMTYwIDIzMSA2NyA1OCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMzMgNzQgNDAgMjc1IDI2MiAxNzQgNjggMTUzIDEwMSAyNDYgCisyMTggMTkyIDE1OCA0MSAxNjYgNDcgMjU3IDE1IDI1OSAyMjAgOTIgNTkgNTIgMjY4IDQ2IDIwIDIxNCA3MiAzOSAyMzYgMjgyIDQ2IAorMTA2IDI1NyAyNDkgODAgMjc5IDIxIDE5IDEwNCAyNzEgMTUgNTUgMTM2IDI2OSAxMDAgMjIyIDcgMTgyIDE4IDY1IDEyOCAxNCA5MyAKKzI0MCAyNTQgMjI0IDE1NiAxMjYgNDMgODEgMTcwIDk2IDEwMiA1MSA4NyAxMzQgNjQgMTA0IDI1NiAyMTAgMTAwIDE1MSAxODYgMTIzIAorODkgMTA1IDc2IDE3NCAyODcgNDIgNDIgMTkwIDk1IDE0MCAxNTUgMjM1IDI1OCAxMjUgMjIzIDExNyAyNzMgMjA1IDI0NiAyNzQgODEgCis5OSAxMTIgMjA2IDI4NSAxMjcgMjA5IDYxIDggNTggMjg4IDY2IDI1MyAyMDAgMjM1IDI0MyAxOTMgMTA1IDUgNjMgMjI4IDExMyA4MiAKKzI2NSAyNTUgNDQgMjQ3IDIzIDIyNCAyMjcgMjM3IDEwMiAxMzcgMyAxNDggMTA1IDE0NyAyODUgNTYgOTggMTY1IDI0MiA5OCAyMzYgNjMgCisxNTcgMiAyMyAyMDkgNSAxMTkgMTE3IDIxNyAyNiAxNSAyMDMgNDEgMTUxIDExNSAxMiAxOTMgNDkgMTE2IDEyMiAyODQgMjM2IDcgMjY4IAorNjEgMjQyIDE2OSA1NyAxMjIgMjEzIDEyNSAyMzggNDkgMTAxIDI3IDM5IDI1MSAyMTQgMSAyMTggNTAgNjMgMjEzIDE4MSAxMjcgMTUzIAorNDUgNjcgMTE0IDEyMSAxMTggOTMgNiAxNDMgMTY1IDIyNyAxNjYgMTE4IDc4IDc0IDE4OCA1MyAxNyAxODkgMTQ4IDE3NiAyNTggNTQgCisxMTIgNTggMjE3IDgyIDE5NCAxNDQgMjc1IDE5MSA2MyA5IDk3IDE0MSAxOTQgMjE1IDk2IDI1MCAxMTkgMTMyIDE0OSAyNzEgMTIzIDE4IAorMjg0IDE3IDExOCAzNyAxMTcgMjAyIDk0IDYwIDIxOCAxMjEgNDcgMjcyIDExMCA4NyAyMDUgMTc1IDE2MyAyMiA0MyAxNTIgMjgxIDI4MiAKKzMxIDExIDEyIDI2NCAxNjAgMTIgMTc4IDExNyAyODggMTM3IDc0IDI1OSAxNjQgNzYgMjQ1IDEwOCAxMDEgMjYxIDE1MCAyMCAyNzAgCisyNTEgMTQzIDE4MCAyNjQgXgorNjM5IDAgMTE3IDk5IDE1OSA0OSAzMSAyNDUgMTIzIDMxIDIxMiAxMzUgMjI2IDI0NSA5MCA0MyAyODYgMjg5IDYwIDYyIDEzMSAyNDIgCisxMSA2NSAyMyAyNDQgODAgMTc2IDg0IDYgMzggMTA1IDkxIDEwMiAyMzggMjcgMTIzIDI5MCAyMjQgMzggMjU5IDc5IDE5OSA4NCAxOTMgCisxNCAxMjggMjUgMjEgMTkxIDIzNyAxNyAyNTYgMjU5IDIzMyAxODcgMTAgMTYwIDU5IDE5IDI3NiAxMTQgMTc0IDE2OSAxNzUgNzQgMTggCis3IDIzNSA2OSAxNDUgMTk4IDE3OSA1OCAyNTIgMzIgMjU1IDExMSA2MiA4MiAyNzggMTgzIDI4NSAyMzAgMjI5IDMyIDY4IDEzNSAzOSAKKzI2OSA2NyAyMzAgNzUgNDQgMjYzIDE2OCAxNjUgODYgMTA4IDE2IDkyIDExMiAxMDUgNTggMTE0IDIwIDE4MSA3OCAxMDcgMjY1IDIzNyAKKzI3NiAyNjggMTYyIDI2NiAxNDIgMTE5IDIwMSAyNTggMzYgNTIgNzcgNjQgMTE4IDEwOSAyNiA4MCAyMiA5NiA4MCA3MSA2MCAyOSAxNDMgCisyNCA0NCAxOTEgMTMyIDExNCAyNzkgMTkzIDE1MiAxNDAgOTkgNTQgMjUgNTQgMTc5IDQyIDI3NiA5IDE1MCAxOTIgMTA5IDI4NSA5MiAKKzIxNyAxMjkgMzUgMTgwIDEwMSAyMjggMTYwIDIxMyA3IDgxIDgxIDIxOSAyMzEgMTM0IDE2NyAxIDIzMSAyNzIgMTc5IDE5NiAyNjQgCisyMjcgMTE3IDIzNyAxNzEgMjQ0IDE4NSAyMDAgNjEgNzIgMTE5IDE1MiAyIDg3IDI3MiAyODQgMjIwIDI0MSAxIDc3IDI4NCA4MiAyMjkgCisyMTkgNDQgMTU4IDE0NCAxODggMjAgMjcgOTAgMTAgNiA3MSA5MyAxNyA2OSAyODMgMjEwIDgyIDkxIDIwNyAyNjIgNCAxOCA3OSAyNzEgCisxMjAgNzMgMTEzIDE2NCAxODEgMjY1IDgzIDI4OCA1MCAxOTUgMjIxIDI1MSAyODEgMTA4IDI3NSAxMDQgMTg2IDEzOCAxODQgMjIzIDYxIAorODggOTUgMTc1IDEwNyA2IDIyNSA4MSAxMTQgMjA3IDE1NyAxMDEgNDEgMTg0IDE5MCA3MyAxNjIgMTI4IDEzMCA0NSAxNjggMTEgOTggCisxMSAxNzAgNDcgMjIxIDE0NiAyNTcgMTMxIDg4IDIzIDEzOSA1NiAxOTkgMTg5IDIxNyAyODMgMjMgMTA2IDY4IDI3MyA1MSA1MSAxMDAgCis2NCAxMyA4NSA0OSAxODUgMjMzIDQ5IDI5MCAyNTcgMjYgNjQgNDYgNzMgMjY3IDE1MiAxMDcgMTExIDI0OSA1OCA5IDI4OCAyMDQgMTgzIAorMjYgMjE4IDM0IDE3MCAyMzQgMTk3IDE2OSA3MCA1MCA0MSAyMzMgMTU0IDIyIDIzNCA5MiAxNDUgOTMgMTU1IDgxIDE4NiAyNDMgMjA4IAorMjAwIDI0OCA0OCAyMSA4NiAyMTMgNDAgNjkgMTc4IDE4NiAxMDUgMTk2IDEyNiAyMTUgMjE0IDIwNCA0NSAxNCAyMyAxIDQ0IDQgMTU2IAorOTEgNTMgMjc0IDE5OSA1MSAyMDUgODggMjgyIDE1MSAxMzAgMjMyIDE0NCAzNCAzMiAyMjIgMTIzIDEzNiAyMzYgMTEyIDM0IDEzNyAKKzI0NiAxMDAgMzEgMjUgMTU5IDIwMyAxOSAxNzEgOTAgMTk3IDI3NCA5NCAyNyAyMjggMjIgMjAxIDEwNCA0OCAxMjYgMTEwIDE5MCAyMjcgCisxNTAgMjI1IDk3IDkwIDIzMCAyNjIgMjAgMjg2IDEwMiA4NCAzOSAyNiAzMSA1OCAxNDcgOCAyNzggMjE2IDI3MyAzNSA3NSA3NyAyNTEgCis5NCAxMzIgMjUyIDI5MSAyNjcgMTg1IDk1IDM3IDk1IDIyNCA3MSAyNDcgNSAxNjYgMjUwIDg0IDE0NCA1MCA4IDI0NSAyMjggNTUgMTg5IAorMzAgMTUgMTcyIDE0OSAyOCAxMzMgMTU3IDEzNCAyOSAxMTAgMzYgMjM5IDUzIDg3IDIyMyAyOCAxMDAgMTY5IDM3IDYyIDIzNiAyNjYgCisyODAgMTMxIDEwNCAyOTEgMTYyIDE2MSAxMTggMTQyIDE0IDE3NyAyODEgMTQxIDI2MyAzMCAxNTMgMTIgNzUgMTgyIDI3NSA3MSAxOTggCis0MSA0NiAxNzggMjkxIDEyOSAxNzMgMTkyIDQgMjYxIDExNSAzMCA0OCAyODAgOTggMTE2IDE5NCAyNCAxMTYgMjI3IDEyIDIxMyAxOTQgCis1NyAxMDQgMTUzIDE1MCA4NyA4NSAxNiAxOTcgMTM2IDgyIDEyNCAxOTUgNjcgMjYzIDYzIDE0MSAxMDkgNDIgNTYgNDUgMjAxIDEyMCAKKzI0IDE0OSAyMTUgMTA5IDE4MCA2OCAyNDAgNjMgMjQ2IDEzMyAxOSAxMjIgMTI2IDI0OCAyMDIgOSAxODMgMTgwIDIwNiAyNTIgMTM3IAorMjc5IDg4IDEyOCAxNjMgMzMgMjY1IDI3MCAyNjQgNzMgOCAxNDAgMjA0IDc4IDIgMjQxIDI2MCA4OSAxODcgMTE1IDE4NCAzNiA4NSA2NSAKKzE2MSAyNTYgMTU0IDIwOSAyMTAgMTE1IDc5IDEyIDEwOCAxNzAgODAgMjA5IDcyIDEwMyAxNzYgMjcxIDI3NCA2MSAzOSAxMCA1NSAzNSAKKzQyIDg5IDMzIDEyNyAyNTggNjkgNDAgMTc0IDIwMiAxNjMgMTcxIDI3NyAxNzMgNSAyOCAyMzggMTgxIDExMSA5NSA3MCA4MyAyOSAzOCAKKzY3IDEyNSA1MSA2NyA3NiA4NyAxMTggNCAyIDEwMyAyNDggMTUgMzMgMTYwIDI0NiAyODcgNyA0OCA5MyAyODMgXgorNjExIDAgODcgMjYwIDk5IDE1OSAxMzQgMjg5IDI0NyAzOCAxNTIgNTUgMjIyIDE0IDExMCAyNTUgNDIgMjExIDI3NyAyMjYgMTM4IDYyIAorNjQgMjE2IDIwNCAxMSAyNzAgMjUgMjA2IDE2MyAyNTggMjQxIDE3MSAyMTIgMzAgMTk4IDI2NiAxOTUgMjU0IDIzOSA4NCA2OSAyOCAKKzI4MyAxNDMgNTQgMTY3IDE1MyAyMTcgMTk0IDE0MiA2NCAxNTEgNjUgMjA2IDIyMCA5OSAyODEgMjkzIDI0OSAxMjUgMTE2IDU3IDEzNyAKKzEzNyA3MiA0OCAxMjggNzggMTUyIDIyNyA2MyA1NCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjEgNzQgMjggMjc1IDI1NCAxNzQgNjAgCisxNDkgOTMgMjQyIDIxOCAxODQgMTU4IDM3IDE2MiAzOSAyNDkgMyAyNTEgMjEyIDgwIDU5IDUyIDI2MCAzNCAyMCAyMTQgNjAgMjcgMjI4IAorMjgyIDQ2IDEwNiAyNTMgMjQ5IDY4IDI3NSAxNyAxNSAxMDAgMjcxIDE1IDQzIDEzNiAyNjkgMTAwIDIxNCAyODkgMTgyIDE0IDUzIDEyMCAKKzIgODkgMjQwIDI0NiAyMjAgMTU2IDEyMiAzOSA3NyAxNjIgOTYgOTAgNDMgNzkgMTM0IDYwIDkyIDI1MiAyMDIgOTYgMTQ3IDE3OCAxMTkgCis3NyA5NyA3MiAxNzAgMjg3IDM4IDMwIDE5MCA4MyAxMzYgMTQ3IDIzNSAyNTQgMTE3IDIxOSAxMDkgMjY1IDIwNSAyMzggMjY2IDczIDk1IAorMTAwIDIwNiAyODUgMTIzIDIwMSA0OSAyOTAgNTAgMjgwIDY2IDI1MyAxOTIgMjI3IDIzNSAxODkgOTMgNSA1OSAyMjQgMTAxIDc0IDI1NyAKKzI1MSA0MCAyMzkgMTkgMjI0IDIyMyAyMzMgMTAyIDEyOSAzIDE0NCAxMDEgMTM5IDI4MSA1NiA5MCAxNjUgMjM4IDk0IDIzMiA1NSAxNTcgCisyODQgMTEgMjA1IDEgMTA3IDExMyAyMTcgMjIgNyAyMDMgMjkgMTQzIDExMSA4IDE5MyA0NSAxMTYgMTIyIDI3NiAyMzYgNyAyNjggNTMgCisyNDIgMTYxIDQ5IDExOCAyMDkgMTI1IDIzOCAzNyA5NyAxNSAzNSAyNDcgMjEwIDI4NyAyMTAgNTAgNTEgMjA1IDE3MyAxMjcgMTUzIDQ1IAorNTkgMTAyIDEyMSAxMTQgODUgMjg4IDEzNSAxNTcgMjE5IDE2NiAxMDYgNjYgNjYgMTg4IDUzIDEzIDE4NSAxNDggMTY4IDI1MCA1MCAKKzEwOCA0NiAyMTMgNzAgMTkwIDE0MCAyNzEgMTg3IDYzIDI5MSA5NyAxMzcgMTk0IDIwNyA4OCAyNTAgMTE1IDEzMiAxNDUgMjYzIDI5MCAKKzExNSAxMCAyODAgOSAxMTggMzcgMTA1IDE5OCA5NCA2MCAyMTQgMTE3IDQ3IDI2OCAxMTAgODMgMjAxIDE3MSAxNTUgMTAgNDMgMTQ0IAorMjczIDI3NCAyNyAyOTMgMTIgMjYwIDE1NiAxNzQgMTE3IDI4NCAxMzMgNzAgMjU1IDE2NCA3NiAyMzcgMTA0IDEwMSAyNjEgMTQ2IDE2IAorMjYyIDI0MyAxNDMgMTc2IDMyIDExMyA5NSAxNTcgNDcgMzEgMjQ1IDEyMyAyOSAyMDggMTM1IDIyMiAyNDMgODYgNDEgMjg2IDI4NSA1OCAKKzYyIDEyOSAyNDAgOSA2MSAxNyAyNDQgNzYgMTcyIDgwIDIgMzIgMTA1IDkxIDk4IDIzNCAyNyAxMjEgMjg2IDIyMCAzNCAyNTcgNzkgCisxOTkgODQgMTkxIDggMTI4IDIxIDE3IDE4NyAyMzUgMTcgMjUyIDI1OSAyMzEgMTg3IDYgMTU2IDU3IDE1IDI3MiAxMTIgMTcwIDE2NSAKKzE3MyA3MCAxOCA1IDIzMSA2NSAxNDEgMTk2IDE3OSA1MiAyNTIgMzAgMjU1IDEwNyA1NiA4MiAyNzYgMTc5IDI4MSAyMjggMjI1IDI2IAorNjYgMTMxIDMzIDI2NyA2MyAyMjYgNzMgMzggMjU5IDE2NiAxNjMgODYgMTA2IDE2IDkwIDEwOCAxMDMgNTQgMTEwIDE4IDE3NyA3MiAKKzEwNSAyNjMgMjMzIDI3NCAyNjQgMTU4IDI2NiAxMzggMTE5IDE5OSAyNTYgMzIgNDggNzEgNTggMTEyIDEwNSAyNiA3NCAyMCA5MiA4MCAKKzY3IDU2IDI1IDE0MSAyNCA0NCAxOTEgMTMwIDEwOCAyNzUgMTg5IDE1MCAxNDAgOTkgNTIgMjMgNTQgMTc1IDQyIDI3NiA3IDE0NiAxODggCisxMDMgMjgzIDg2IDIxMyAxMjcgMzEgMTgwIDk5IDIyNCAxNTggMjA5IDMgNzkgNzcgMjE5IDIzMSAxMzAgMTY1IDEgMjI5IDI3MiAxNzcgCisxOTQgMjY0IDIyMyAxMTEgMjM3IDE2OSAyNDAgMTgxIDE5NiA1NyA3MiAxMTMgMTUyIDI5MiA4NyAyNjggMjgyIDIxOCAyNDEgMjkzIDc3IAorMjg0IDc2IDIyOSAyMTUgNDIgMTU0IDE0MiAxODYgMTYgMjUgODQgNCA0IDY5IDkzIDEzIDYzIDI4MyAyMDggNzggODcgMjAzIDI1OCA0IAorMTIgNzMgMjY3IDEyMCA2NyAxMTMgMTYwIDE4MSAyNjEgODEgMjg2IDQ4IDE5MyAyMTcgMjUxIDI3NyAxMDQgMjczIDEwMiAxODYgMTM4IAorMTg0IDIyMyA2MSA4MiA4OSAxNzUgMTA3IDYgMjIxIDgxIDExNCAyMDcgMTUzIDk1IDM1IDE4MiAxODYgNzMgMjc1IF4KKzYzNCAwIDEyMCAxMjIgMzcgMTYwIDExIDk4IDI5NSAxNjIgMzUgMjIxIDE0NiAyNDkgMTIzIDg4IDE5IDEzOSA0OCAxOTEgMTg5IDIxMyAKKzI3NSAxNSA5OCA2MCAyNzMgMzkgNTEgOTYgNjAgMSA3NyA0OSAxODEgMjMzIDQxIDI4NiAyNTcgMTggNjQgNDIgNjUgMjYzIDE0NCA5OSAKKzExMSAyNDEgNTggMSAyODggMTk2IDE3OSAyMiAyMTQgMzAgMTcwIDIyNiAxOTcgMTY5IDY2IDQyIDQxIDIyNSAxNDYgMTQgMjM0IDkyIAorMTQ1IDg5IDE1NSA2OSAxNzggMjQzIDIwOCAyMDAgMjQ0IDQ4IDIxIDc4IDIwOSA0MCA2NSAxNzggMTgyIDk3IDE5NiAxMTggMjA3IDIxMCAKKzIwMCAzMyAxMCAyMyAyODkgMzYgMTUyIDc5IDQ5IDI2NiAxOTUgNDMgMjAxIDg0IDI3NCAxNTEgMTMwIDIyOCAxMzYgMzQgMjQgMjE0IAorMTE1IDEzMiAyMjggMTEyIDI5MiAyNiAxMjkgMjM4IDkyIDE5IDEzIDE1OSAxOTUgMTkgMTYzIDg2IDE4OSAyNzQgOTAgMTkgMjI0IDEwIAorMTkzIDEwNCA0MCAxMjYgMTAyIDE4NiAyMjMgMTQ2IDIyNSA4NSA5MCAyMzAgMjYyIDggMjc4IDkwIDgwIDM5IDE0IDIzIDU0IDE0NyA0IAorMjc4IDIxNiAyNjUgMzUgNzUgNzMgMjQzIDgyIDEyNCAyNDggMjgzIDI2NyAxODUgODcgMjkgOTUgMjIwIDcxIDI0MyAyOTMgMTYyIDI0NiAKKzcyIDE0NCAzOCAyMzcgMjI4IDUxIDE4MSAyMiAzIDI4OCAxNzIgMTQxIDI0IDEyOSAxNTMgMTMwIDE3IDk4IDM2IDIzNSA0MSA3NSAyMTkgCisyMCA4OCAxNjUgMjUgNTQgMjMyIDI2MiAyODAgMTMxIDkyIDI5MSAxNjIgMTYxIDExMCAxNDIgMTQgMTczIDI3NyAxNDEgMjU5IDE4IAorMTQ5IDQgNjcgMTc4IDI2NyA1OSAxOTggMzMgMzQgMTcwIDI4NyAxMjEgMTczIDE5MiAyODggMjU3IDEwMyAyNiA0NCAyNzYgOTAgMTA0IAorMTg2IDEyIDEwOCAyMjcgMjEzIDE5MCA1MyA5NiAxNDUgMTUwIDc5IDczIDggMTkzIDEyOCA3OCAxMjQgMTg3IDYzIDI2MyA1OSAxMzcgCisxMDkgMzAgNDQgNDEgMjAxIDEwOCAxNiAxNDkgMjE1IDEwNSAxNzYgNTYgMjMyIDUxIDI0MiAxMzMgNyAxMTggMTIyIDI0OCAxOTggOSAKKzE4MyAxNzIgMjAyIDI0NCAxMzMgMjc5IDgwIDEyNCAxNjMgMjUgMjY1IDI3MCAyNjAgNjkgOCAxMzIgMjA0IDc0IDI5NCAyMzcgMjUyIAorODkgMTc5IDEwNyAxNzYgMzIgODUgNTMgMTU3IDI1NiAxNTQgMjA1IDIxMCAxMTUgNzEgOCAxMDggMTY2IDc2IDIwOSA2NCAxMDMgMTc2IAorMjY3IDI3MCA0OSAzMSAxMCA0NyAzMSAzNCA4NSAyOSAxMTkgMjU4IDY5IDMyIDE3MCAyMDIgMTU5IDE3MSAyNzcgMTY1IDEgMTYgMjM0IAorMTc3IDEwNyA5MSA3MCA4MyAyOSAzNCA2NyAxMTcgNDcgNTUgNzIgODMgMTE0IDI5MiAyIDkxIDI0MCA3IDMzIDE2MCAyNDYgMjgzIDI5MSAKKzM2IDg1IDExNCA4MSAyNjAgOTMgMTU1IDEzMCAyODkgMjQ3IDM4IDE1MCA1NSAyMjIgMTAgMTA4IDI1MSAzOCAyMTEgMjc1IDIyNiAxMzYgCis1OCA2MiAyMTIgMjAwIDkgMjY4IDI1IDIwNCAxNTkgMjU2IDIzOSAxNjcgMjEyIDMwIDE5NCAyNjQgMTk1IDI1NCAyMzkgODIgNjMgMjggCisyNzkgMTQxIDQ4IDE2NyAxNTEgMjE1IDE5MCAxMzggNTggMTQ3IDY1IDIwMiAyMjAgOTUgMjgxIDI5MSAyNDcgMTIzIDExMiA1NyAxMzcgCisxMzMgNjggNDIgMTI2IDc4IDE0OCAyMjUgNjEgNTIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE1IDc0IDIyIDI3NSAyNTAgMTc0IDU2IAorMTQ3IDg5IDI0MCAyMTggMTgwIDE1OCAzNSAxNjAgMzUgMjQ1IDI5MyAyNDcgMjA4IDc0IDU5IDUyIDI1NiAyOCAyMCAyMTQgNTQgMjEgCisyMjQgMjgyIDQ2IDEwNiAyNTEgMjQ5IDYyIDI3MyAxNSAxMyA5OCAyNzEgMTUgMzcgMTM2IDI2OSAxMDAgMjEwIDI4NSAxODIgMTIgNDcgCisxMTYgMjkyIDg3IDI0MCAyNDIgMjE4IDE1NiAxMjAgMzcgNzUgMTU4IDk2IDg0IDM5IDc1IDEzNCA1OCA4NiAyNTAgMTk4IDk0IDE0NSAKKzE3NCAxMTcgNzEgOTMgNzAgMTY4IDI4NyAzNiAyNCAxOTAgNzcgMTM0IDE0MyAyMzUgMjUyIDExMyAyMTcgMTA1IDI2MSAyMDUgMjM0IAorMjYyIDY5IDkzIDk0IDIwNiAyODUgMTIxIDE5NyA0MyAyODYgNDYgMjc2IDY2IDI1MyAxODggMjIzIDIzMSAxODcgODcgNSA1NyAyMjIgCis5NSA3MCAyNTMgMjQ5IDM4IDIzNSAxNyAyMjQgMjIxIDIzMSAxMDIgMTI1IDMgMTQyIDk5IDEzNSAyNzkgNTYgODYgMTY1IDIzNiA5MiAKKzIzMCA1MSAxNTcgMjgwIDUgMjAzIDI5NSAxMDEgMTExIDIxNyAyMCAzIDIwMyAyMyAxMzkgMTA5IDYgMTkzIDQzIDExNiAxMjIgMjcyIAorMjM2IDcgMjY4IDQ5IDI0MiAxNTcgNDUgMTE2IDIwNyAxMjUgMjM4IDMxIDk1IDkgMzMgMjQ1IDIyMCBeCis2MzggMCAyODQgMjA0IDUwIDQyIDE5OSAxNjcgMTI3IDE1MyA0NSA1MyA5MyAxMjEgMTExIDc5IDI4MiAxMjkgMTUxIDIxMyAxNjYgOTcgCis1NyA2MCAxODggNTMgMTAgMTgyIDE0OCAxNjIgMjQ0IDQ3IDEwNSAzNyAyMTAgNjEgMTg3IDEzNyAyNjggMTg0IDYzIDI4NSA5NyAxMzQgCisxOTQgMjAxIDgyIDI1MCAxMTIgMTMyIDE0MiAyNTcgMjkwIDEwOSA0IDI3NyAzIDExOCAzNyA5NiAxOTUgOTQgNjAgMjExIDExNCA0NyAKKzI2NSAxMTAgODAgMTk4IDE2OCAxNDkgMSA0MyAxMzggMjY3IDI2OCAyNCAyODcgMTIgMjU3IDE1MyAyODggMTcxIDExNyAyODEgMTMwIAorNjcgMjUyIDE2NCA3NiAyMzEgMTAxIDEwMSAyNjEgMTQzIDEzIDI1NiAyMzcgMTQzIDE3MyAzMiAxMDcgODkgMTU0IDQ0IDMxIDI0NSAKKzEyMyAyNiAyMDIgMTM1IDIxNiAyNDAgODAgMzggMjg2IDI3OSA1NSA2MiAxMjYgMjM3IDYgNTUgOCAyNDQgNzAgMTY2IDc0IDI5MyAyMyAKKzEwNSA5MSA5MiAyMjggMjcgMTE4IDI4MCAyMTQgMjggMjU0IDc5IDE5OSA4NCAxODggMjk2IDEyOCAxNSAxMSAxODEgMjMyIDE3IDI0NiAKKzI1OSAyMjggMTg3IDE1MCA1NCA5IDI2NiAxMDkgMTY0IDE1OSAxNzAgNjQgMTggMiAyMjUgNTkgMTM1IDE5MyAxNzkgNDMgMjUyIDI3IAorMjU1IDEwMSA0NyA4MiAyNzMgMTczIDI3NSAyMjUgMjE5IDE3IDYzIDEyNSAyNCAyNjQgNTcgMjIwIDcwIDI5IDI1MyAxNjMgMTYwIDg2IAorMTAzIDE2IDg3IDEwMiAxMDAgNDggMTA0IDE1IDE3MSA2MyAxMDIgMjYwIDIyNyAyNzEgMjU4IDE1MiAyNjYgMTMyIDExOSAxOTYgMjUzIAorMjYgNDIgNjIgNDkgMTAzIDk5IDI2IDY1IDE3IDg2IDgwIDYxIDUwIDE5IDEzOCAyNCA0NCAxOTEgMTI3IDk5IDI2OSAxODMgMTQ3IDE0MCAKKzk5IDQ5IDIwIDU0IDE2OSA0MiAyNzYgNCAxNDAgMTgyIDk0IDI4MCA3NyAyMDcgMTI0IDI1IDE4MCA5NiAyMTggMTU1IDIwMyAyOTQgNzYgCis3MSAyMTkgMjMxIDEyNCAxNjIgMSAyMjYgMjcyIDE3NCAxOTEgMjY0IDIxNyAxMDIgMjM3IDE2NiAyMzQgMTc1IDE5MCA1MSA3MiAxMDQgCisxNTIgMjg5IDg3IDI2MiAyNzkgMjE1IDI0MSAyOTMgNzcgMjg0IDY3IDIyOSAyMDkgMzkgMTQ4IDEzOSAxODMgMTAgMjIgNzUgMjkyIDEgCis2NiA5MyA3IDU0IDI4MyAyMDUgNzIgODEgMTk3IDI1MiA0IDMgNjQgMjYxIDEyMCA1OCAxMTMgMTU0IDE4MSAyNTUgNzggMjgzIDQ1IAorMTkwIDIxMSAyNTEgMjcxIDk4IDI3MCA5OSAxODYgMTM4IDE4NCAyMjMgNjEgNzMgODAgMTc1IDEwNyA2IDIxNSA4MSAxMTQgMjA3IDE0NyAKKzg2IDI2IDE3OSAxODAgNzMgMTU3IDExOCAxMjAgMzUgMTU4IDExIDk4IDI5MyAxNjAgMzIgMjIxIDE0NiAyNDcgMTIxIDg4IDE4IDEzOSAKKzQ2IDE4OSAxODkgMjEyIDI3MyAxMyA5NiA1OCAyNzMgMzYgNTEgOTUgNTkgMjk1IDc1IDQ5IDE4MCAyMzMgMzkgMjg1IDI1NyAxNiA2NCAKKzQxIDYzIDI2MiAxNDIgOTcgMTExIDIzOSA1OCAyOTYgMjg4IDE5NCAxNzggMjEgMjEzIDI5IDE3MCAyMjQgMTk3IDE2OSA2NSA0MCA0MSAKKzIyMyAxNDQgMTIgMjM0IDkyIDE0NSA4OCAxNTUgNjYgMTc2IDI0MyAyMDggMjAwIDI0MyA0OCAyMSA3NiAyMDggNDAgNjQgMTc4IDE4MSAKKzk1IDE5NiAxMTYgMjA1IDIwOSAxOTkgMzAgOSAyMyAyODggMzQgMjk2IDE1MSA3NiA0OCAyNjQgMTk0IDQxIDIwMCA4MyAyNzIgMTUxIAorMTMwIDIyNyAxMzQgMzQgMjIgMjEyIDExMyAxMzEgMjI2IDExMiAyOTIgMjQgMTI3IDIzNiA5MCAxNiAxMCAxNTkgMTkzIDE5IDE2MSA4NSAKKzE4NyAyNzQgODkgMTcgMjIzIDcgMTkxIDEwNCAzOCAxMjYgMTAwIDE4NSAyMjIgMTQ1IDIyNSA4MiA5MCAyMzAgMjYyIDUgMjc2IDg3IAorNzkgMzkgMTEgMjEgNTMgMTQ3IDMgMjc4IDIxNiAyNjMgMzUgNzUgNzIgMjQxIDc5IDEyMiAyNDcgMjgxIDI2NyAxODUgODUgMjcgOTUgCisyMTkgNzEgMjQyIDI5MiAxNjEgMjQ1IDY5IDE0NCAzNSAyOTUgMjM1IDIyOCA1MCAxNzkgMjAgMjg3IDE3MiAxMzkgMjMgMTI4IDE1MiAKKzEyOSAxNCA5NSAzNiAyMzQgMzggNzIgMjE4IDE4IDg1IDE2NCAyMiA1MiAyMzEgMjYxIDI4MCAxMzEgODkgMjkxIDE2MiAxNjEgMTA4IAorMTQyIDE0IDE3MiAyNzYgMTQxIDI1OCAxNSAxNDggMiA2NSAxNzcgMjY1IDU2IDE5OCAzMSAzMSAxNjggMjg2IDExOSAxNzMgMTkyIDI4NiAKKzI1NiAxMDAgMjUgNDMgMjc1IDg4IDEwMSAxODQgOSAxMDYgMjI3IDI5NCAyMTMgMTg5IDUyIDk0IDE0MyAxNTAgNzcgNzAgNiAxOTIgCisxMjYgNzcgMTI0IDE4NSA2MiAyNjMgNTggMTM2IDEwOSAyNyA0MSA0MCAyMDEgMTA1IDE0IDE0OSAyMTUgMTA0IDE3NSA1MyAyMzAgMjE5IAorXgorNjM1IDEgMjM5IDEzMyAyOTcgMTE1IDExOSAyNDggMTk1IDkgMTgzIDE2NiAxOTkgMjM4IDEzMCAyNzkgNzQgMTIxIDE2MyAxOSAyNjUgCisyNzAgMjU3IDY2IDggMTI2IDIwNCA3MSAyOTQgMjM0IDI0NiA4OSAxNzMgMTAxIDE3MCAyOSA4NSA0NCAxNTQgMjU2IDE1NCAyMDIgMjEwIAorMTE1IDY1IDUgMTA4IDE2MyA3MyAyMDkgNTggMTAzIDE3NiAyNjQgMjY3IDQwIDI1IDEwIDQxIDI4IDI4IDgyIDI2IDExMyAyNTggNjkgCisyNiAxNjcgMjAyIDE1NiAxNzEgMjc3IDE1OSAyOTcgNyAyMzEgMTc0IDEwNCA4OCA3MCA4MyAyOSAzMSA2NyAxMTEgNDQgNDYgNjkgODAgCisxMTEgMjg5IDIgODIgMjM0IDEgMzMgMTYwIDI0NiAyODAgMjg1IDI3IDc5IDEwOCA3MiAyNjAgODQgMTQ5IDEyNCAyODkgMjQ3IDM4IAorMTQ3IDU1IDIyMiA0IDEwNSAyNDUgMzIgMjExIDI3MiAyMjYgMTMzIDUyIDU5IDIwNiAxOTQgNiAyNjUgMjUgMjAxIDE1MyAyNTMgMjM2IAorMTYxIDIxMiAzMCAxODggMjYxIDE5NSAyNTQgMjM5IDc5IDU0IDI4IDI3MyAxMzggMzkgMTY3IDE0OCAyMTIgMTg0IDEzMiA0OSAxNDEgCis2NSAxOTYgMjIwIDg5IDI4MSAyODggMjQ0IDEyMCAxMDYgNTcgMTM3IDEyNyA2MiAzMyAxMjMgNzggMTQyIDIyMiA1OCA0OSAyMzIgMTc3IAorMjIgMTI5IDY4IDE2OCA2IDc0IDEzIDI3NSAyNDQgMTc0IDUwIDE0NCA4MyAyMzcgMjE4IDE3NCAxNTggMzIgMTU3IDI5IDIzOSAyODcgCisyNDEgMjAyIDY1IDU5IDUyIDI1MCAxOSAyMCAyMTQgNDUgMTIgMjE4IDI4MiA0NiAxMDYgMjQ4IDI0OSA1MyAyNzAgMTIgMTAgOTUgMjcxIAorMTUgMjggMTM2IDI2OSAxMDAgMjA0IDI3OSAxODIgOSAzOCAxMTAgMjg2IDg0IDI0MCAyMzYgMjE1IDE1NiAxMTcgMzQgNzIgMTUyIDk2IAorNzUgMzMgNjkgMTM0IDU1IDc3IDI0NyAxOTIgOTEgMTQyIDE2OCAxMTQgNjIgODcgNjcgMTY1IDI4NyAzMyAxNSAxOTAgNjggMTMxIDEzNyAKKzIzNSAyNDkgMTA3IDIxNCA5OSAyNTUgMjA1IDIyOCAyNTYgNjMgOTAgODUgMjA2IDI4NSAxMTggMTkxIDM0IDI4MCA0MCAyNzAgNjYgCisyNTMgMTgyIDIxNyAyMjUgMTg0IDc4IDUgNTQgMjE5IDg2IDY0IDI0NyAyNDYgMzUgMjI5IDE0IDIyNCAyMTggMjI4IDEwMiAxMTkgMyAKKzEzOSA5NiAxMjkgMjc2IDU2IDgwIDE2NSAyMzMgODkgMjI3IDQ1IDE1NyAyNzQgMjk1IDIwMCAyOTUgOTIgMTA4IDIxNyAxNyAyOTYgCisyMDMgMTQgMTMzIDEwNiAzIDE5MyA0MCAxMTYgMTIyIDI2NiAyMzYgNyAyNjggNDMgMjQyIDE1MSAzOSAxMTMgMjA0IDEyNSAyMzggMjIgCis5MiAzMCAyNDIgMjA1IDI4MiAyMDAgNTAgMzYgMTk1IDE2MyAxMjcgMTUzIDQ1IDQ5IDg3IDEyMSAxMDkgNzUgMjc4IDEyNSAxNDcgMjA5IAorMTY2IDkxIDUxIDU2IDE4OCA1MyA4IDE4MCAxNDggMTU4IDI0MCA0NSAxMDMgMzEgMjA4IDU1IDE4NSAxMzUgMjY2IDE4MiA2MyAyODEgCis5NyAxMzIgMTk0IDE5NyA3OCAyNTAgMTEwIDEzMiAxNDAgMjUzIDI5MCAxMDUgMjc1IDI5OCAxMTggMzcgOTAgMTkzIDk0IDYwIDIwOSAKKzExMiA0NyAyNjMgMTEwIDc4IDE5NiAxNjYgMTQ1IDI5NCA0MyAxMzQgMjYzIDI2NCAyMiAyODMgMTIgMjU1IDE1MSAyODQgMTY5IDExNyAKKzI3OSAxMjggNjUgMjUwIDE2NCA3NiAyMjcgOTkgMTAxIDI2MSAxNDEgMTEgMjUyIDIzMyAxNDMgMTcxIDMyIDEwMyA4NSAxNTIgNDIgMzEgCisyNDUgMTIzIDI0IDE5OCAxMzUgMjEyIDIzOCA3NiAzNiAyODYgMjc1IDUzIDYyIDEyNCAyMzUgNCA1MSAyIDI0NCA2NiAxNjIgNzAgMjkxIAorMTcgMTA1IDkxIDg4IDIyNCAyNyAxMTYgMjc2IDIxMCAyNCAyNTIgNzkgMTk5IDg0IDE4NiAyOTIgMTI4IDExIDcgMTc3IDIzMCAxNyAKKzI0MiAyNTkgMjI2IDE4NyAyOTUgMTQ2IDUyIDUgMjYyIDEwNyAxNjAgMTU1IDE2OCA2MCAxOCAyMjEgNTUgMTMxIDE5MSAxNzkgMzcgCisyNTIgMjUgMjU1IDk3IDQxIDgyIDI3MSAxNjkgMjcxIDIyMyAyMTUgMTEgNjEgMTIxIDE4IDI2MiA1MyAyMTYgNjggMjMgMjQ5IDE2MSAKKzE1OCA4NiAxMDEgMTYgODUgOTggOTggNDQgMTAwIDEzIDE2NyA1NyAxMDAgMjU4IDIyMyAyNjkgMjU0IDE0OCAyNjYgMTI4IDExOSAxOTQgCisyNTEgMjIgMzggNTYgNDMgOTcgOTUgMjYgNTkgMTUgODIgODAgNTcgNDYgMTUgMTM2IDI0IDQ0IDE5MSAxMjUgOTMgMjY1IDE3OSAxNDUgCisxNDAgOTkgNDcgMTggNTQgMTY1IDQyIDI3NiAyIDEzNiAxNzggODggMjc4IDcxIDIwMyAxMjIgMjEgMTgwIDk0IDIxNCAxNTMgMTk5IAorMjkyIDc0IDY3IDIxOSAyMzEgMTIwIDE2MCAxIDIyNCAyNzIgMTcyIDE4OSAyNjQgMjEzIDk2IDIzNyAxNjQgMjMwIDE3MSAxODYgMTUzIF4KKzYzOCAxIDcyIDkyIDE1MiAyODUgODcgMjU0IDI3NSAyMTEgMjQxIDI5MyA3NyAyODQgNTUgMjI5IDIwMSAzNSAxNDAgMTM1IDE3OSAyIAorMTggNjMgMjg0IDI5OCA2MiA5MyAzMDAgNDIgMjgzIDIwMSA2NCA3MyAxODkgMjQ0IDQgMjkyIDUyIDI1MyAxMjAgNDYgMTEzIDE0NiAKKzE4MSAyNDcgNzQgMjc5IDQxIDE4NiAyMDMgMjUxIDI2MyA5MCAyNjYgOTUgMTg2IDEzOCAxODQgMjIzIDYxIDYxIDY4IDE3NSAxMDcgNiAKKzIwNyA4MSAxMTQgMjA3IDEzOSA3NCAxNCAxNzUgMTcyIDczIDE1MyAxMTAgMTEyIDI3IDE1MCAxMSA5OCAyODUgMTUyIDIwIDIyMSAxNDYgCisyMzkgMTEzIDg4IDE0IDEzOSAzOCAxODEgMTg5IDIwOCAyNjUgNSA4OCA1MCAyNzMgMjQgNTEgOTEgNTUgMjg3IDY3IDQ5IDE3NiAyMzMgCiszMSAyODEgMjU3IDggNjQgMzcgNTUgMjU4IDEzNCA4OSAxMTEgMjMxIDU4IDI5MiAyODggMTg2IDE3NCAxNyAyMDkgMjUgMTcwIDIxNiAKKzE5NyAxNjkgNjEgMzIgNDEgMjE1IDEzNiA0IDIzNCA5MiAxNDUgODQgMTU1IDU0IDE2OCAyNDMgMjA4IDIwMCAyMzkgNDggMjEgNjggCisyMDQgNDAgNjAgMTc4IDE3NyA4NyAxOTYgMTA4IDE5NyAyMDUgMTk1IDE4IDUgMjMgMjg0IDI2IDI5NiAxNDcgNjQgNDQgMjU2IDE5MCAKKzMzIDE5NiA3OSAyNjQgMTUxIDEzMCAyMjMgMTI2IDM0IDE0IDIwNCAxMDUgMTI3IDIxOCAxMTIgMjkyIDE2IDExOSAyMjggODIgNCAyOTkgCisxNTkgMTg1IDE5IDE1MyA4MSAxNzkgMjc0IDg1IDkgMjE5IDI5NiAxODMgMTA0IDMwIDEyNiA5MiAxODEgMjE4IDE0MSAyMjUgNzAgOTAgCisyMzAgMjYyIDI5NCAyNjggNzUgNzUgMzkgMzAwIDEzIDQ5IDE0NyAzMDAgMjc4IDIxNiAyNTUgMzUgNzUgNjggMjMzIDY3IDExNCAyNDMgCisyNzMgMjY3IDE4NSA3NyAxOSA5NSAyMTUgNzEgMjM4IDI4OCAxNTcgMjQxIDU3IDE0NCAyMyAyOTEgMjI3IDIyOCA0NiAxNzEgMTIgMjg5IAorMjgzIDE3MiAxMzEgMTkgMTI0IDE0OCAxMjUgMiA4MyAzNiAyMzAgMjYgNjAgMjE0IDEwIDczIDE2MCAxMCA0NCAyMjcgMjU3IDI4MCAKKzEzMSA3NyAyOTEgMTYyIDE2MSAxMDAgMTQyIDE0IDE2OCAyNzIgMTQxIDI1NCAzIDE0NCAyOTUgNTcgMTczIDI1NyA0NCAxOTggMjMgMTkgCisxNjAgMjgyIDExMSAxNzMgMTkyIDI3OCAyNTIgODggMjEgMzkgMjcxIDgwIDg5IDE3NiAyOTggOTggMjI3IDI4NiAyMTMgMTg1IDQ4IDg2IAorMTM1IDE1MCA2OSA1OCAyOTkgMTg4IDExOCA3MyAxMjQgMTc3IDU4IDI2MyA1NCAxMzIgMTA5IDE1IDI5IDM2IDIwMSA5MyA2IDE0OSAKKzIxNSAxMDAgMTcxIDQxIDIyMiAzNiAyMzcgMTMzIDI5MyAxMTMgMTE3IDI0OCAxOTMgOSAxODMgMTYyIDE5NyAyMzQgMTI4IDI3OSA3MCAKKzExOSAxNjMgMTUgMjY1IDI3MCAyNTUgNjQgOCAxMjIgMjA0IDY5IDI5NCAyMzIgMjQyIDg5IDE2OSA5NyAxNjYgMjcgODUgMzggMTUyIAorMjU2IDE1NCAyMDAgMjEwIDExNSA2MSAzIDEwOCAxNjEgNzEgMjA5IDU0IDEwMyAxNzYgMjYyIDI2NSAzNCAyMSAxMCAzNyAyNiAyNCA4MCAKKzI0IDEwOSAyNTggNjkgMjIgMTY1IDIwMiAxNTQgMTcxIDI3NyAxNTUgMjk3IDEgMjI5IDE3MiAxMDIgODYgNzAgODMgMjkgMjkgNjcgCisxMDcgNDIgNDAgNjcgNzggMTA5IDI4NyAyIDc2IDIzMCAyOTggMzMgMTYwIDI0NiAyNzggMjgxIDIxIDc1IDEwNCA2NiAyNjAgNzggMTQ1IAorMTIwIDI4OSAyNDcgMzggMTQ1IDU1IDIyMiAxMDMgMjQxIDI4IDIxMSAyNzAgMjI2IDEzMSA0OCA1NyAyMDIgMTkwIDQgMjYzIDI1IDE5OSAKKzE0OSAyNTEgMjM0IDE1NyAyMTIgMzAgMTg0IDI1OSAxOTUgMjU0IDIzOSA3NyA0OCAyOCAyNjkgMTM2IDMzIDE2NyAxNDYgMjEwIDE4MCAKKzEyOCA0MyAxMzcgNjUgMTkyIDIyMCA4NSAyODEgMjg2IDI0MiAxMTggMTAyIDU3IDEzNyAxMjMgNTggMjcgMTIxIDc4IDEzOCAyMjAgNTYgCis0NyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNzQgNyAyNzUgMjQwIDE3NCA0NiAxNDIgNzkgMjM1IDIxOCAxNzAgMTU4IDMwIDE1NSAyNSAKKzIzNSAyODMgMjM3IDE5OCA1OSA1OSA1MiAyNDYgMTMgMjAgMjE0IDM5IDYgMjE0IDI4MiA0NiAxMDYgMjQ2IDI0OSA0NyAyNjggMTAgOCAKKzkzIDI3MSAxNSAyMiAxMzYgMjY5IDEwMCAyMDAgMjc1IDE4MiA3IDMyIDEwNiAyODIgODIgMjQwIDIzMiAyMTMgMTU2IDExNSAzMiA3MCAKKzE0OCA5NiA2OSAyOSA2NSAxMzQgNTMgNzEgMjQ1IDE4OCA4OSAxNDAgMTY0IDExMiA1NiA4MyA2NSAxNjMgMjg3IDMxIDkgMTkwIDYyIAorMTI5IDEzMyAyMzUgMjQ3IDEwMyAyMTIgOTUgMjUxIDIwNSAyMjQgMjUyIDU5IDg4IDc5IDIwNiAyODUgMTE2IDE4NyAyOCAyNzYgMjYzIF4KKzY0MCAwIDI2NCA2NiAyNTMgMTc2IDIxMSAyMTkgMTgxIDY5IDUgNTEgMjE2IDc3IDU4IDI0MSAyNDMgMzIgMjIzIDExIDIyNCAyMTUgCisyMjUgMTAyIDExMyAzIDEzNiA5MyAxMjMgMjczIDU2IDc0IDE2NSAyMzAgODYgMjI0IDM5IDE1NyAyNjggMjg5IDE5NyAyOTUgODMgMTA1IAorMjE3IDE0IDI5MyAyMDMgNSAxMjcgMTAzIDE5MyAzNyAxMTYgMTIyIDI2MCAyMzYgNyAyNjggMzcgMjQyIDE0NSAzMyAxMTAgMjAxIDEyNSAKKzIzOCAxMyA4OSAyOTMgMjcgMjM5IDIwMiAyNzkgMTk0IDUwIDI3IDE4OSAxNTcgMTI3IDE1MyA0NSA0MyA3OCAxMjEgMTA2IDY5IDI3MiAKKzExOSAxNDEgMjAzIDE2NiA4MiA0MiA1MCAxODggNTMgNSAxNzcgMTQ4IDE1MiAyMzQgNDIgMTAwIDIyIDIwNSA0NiAxODIgMTMyIDI2MyAKKzE3OSA2MyAyNzUgOTcgMTI5IDE5NCAxOTEgNzIgMjUwIDEwNyAxMzIgMTM3IDI0NyAyOTAgOTkgMjk2IDI3MiAyOTUgMTE4IDM3IDgxIAorMTkwIDk0IDYwIDIwNiAxMDkgNDcgMjYwIDExMCA3NSAxOTMgMTYzIDEzOSAyODggNDMgMTI4IDI1NyAyNTggMTkgMjc3IDEyIDI1MiAKKzE0OCAyNzggMTY2IDExNyAyNzYgMTI1IDYyIDI0NyAxNjQgNzYgMjIxIDk2IDEwMSAyNjEgMTM4IDggMjQ2IDIyNyAxNDMgMTY4IDMyIAorOTcgNzkgMTQ5IDM5IDMxIDI0NSAxMjMgMjEgMTkyIDEzNSAyMDYgMjM1IDcwIDMzIDI4NiAyNjkgNTAgNjIgMTIxIDIzMiAxIDQ1IDI5NSAKKzI0NCA2MCAxNTYgNjQgMjg4IDggMTA1IDkxIDgyIDIxOCAyNyAxMTMgMjcwIDIwNCAxOCAyNDkgNzkgMTk5IDg0IDE4MyAyODYgMTI4IDUgCisxIDE3MSAyMjcgMTcgMjM2IDI1OSAyMjMgMTg3IDI5MiAxNDAgNDkgMzAxIDI1NiAxMDQgMTU0IDE0OSAxNjUgNTQgMTggMjk5IDIxNSAKKzQ5IDEyNSAxODggMTc5IDI4IDI1MiAyMiAyNTUgOTEgMzIgODIgMjY4IDE2MyAyNjUgMjIwIDIwOSAyIDU4IDExNSA5IDI1OSA0NyAyMTAgCis2NSAxNCAyNDMgMTU4IDE1NSA4NiA5OCAxNiA4MiA5MiA5NSAzOCA5NCAxMCAxNjEgNDggOTcgMjU1IDIxNyAyNjYgMjQ4IDE0MiAyNjYgCisxMjIgMTE5IDE5MSAyNDggMTYgMzIgNDcgMzQgODggODkgMjYgNTAgMTIgNzYgODAgNTEgNDAgOSAxMzMgMjQgNDQgMTkxIDEyMiA4NCAKKzI1OSAxNzMgMTQyIDE0MCA5OSA0NCAxNSA1NCAxNTkgNDIgMjc2IDMwMSAxMzAgMTcyIDc5IDI3NSA2MiAxOTcgMTE5IDE1IDE4MCA5MSAKKzIwOCAxNTAgMTkzIDI4OSA3MSA2MSAyMTkgMjMxIDExNCAxNTcgMSAyMjEgMjcyIDE2OSAxODYgMjY0IDIwNyA4NyAyMzcgMTYxIDIyNCAKKzE2NSAxODAgNDEgNzIgODkgMTUyIDI4NCA4NyAyNTIgMjc0IDIxMCAyNDEgMjkzIDc3IDI4NCA1MiAyMjkgMTk5IDM0IDEzOCAxMzQgCisxNzggMTcgNjAgMjgyIDI5OCA2MSA5MyAyOTkgMzkgMjgzIDIwMCA2MiA3MSAxODcgMjQyIDQgMjkwIDQ5IDI1MSAxMjAgNDMgMTEzIAorMTQ0IDE4MSAyNDUgNzMgMjc4IDQwIDE4NSAyMDEgMjUxIDI2MSA4OCAyNjUgOTQgMTg2IDEzOCAxODQgMjIzIDYxIDU4IDY1IDE3NSAKKzEwNyA2IDIwNSA4MSAxMTQgMjA3IDEzNyA3MSAxMSAxNzQgMTcwIDczIDE1MiAxMDggMTEwIDI1IDE0OCAxMSA5OCAyODMgMTUwIDE3IAorMjIxIDE0NiAyMzcgMTExIDg4IDEzIDEzOSAzNiAxNzkgMTg5IDIwNyAyNjMgMyA4NiA0OCAyNzMgMjEgNTEgOTAgNTQgMjg1IDY1IDQ5IAorMTc1IDIzMyAyOSAyODAgMjU3IDYgNjQgMzYgNTMgMjU3IDEzMiA4NyAxMTEgMjI5IDU4IDI5MSAyODggMTg0IDE3MyAxNiAyMDggMjQgCisxNzAgMjE0IDE5NyAxNjkgNjAgMzAgNDEgMjEzIDEzNCAyIDIzNCA5MiAxNDUgODMgMTU1IDUxIDE2NiAyNDMgMjA4IDIwMCAyMzggNDggCisyMSA2NiAyMDMgNDAgNTkgMTc4IDE3NiA4NSAxOTYgMTA2IDE5NSAyMDQgMTk0IDE1IDQgMjMgMjgzIDI0IDI5NiAxNDYgNjEgNDMgMjU0IAorMTg5IDMxIDE5NSA3OCAyNjIgMTUxIDEzMCAyMjIgMTI0IDM0IDEyIDIwMiAxMDMgMTI2IDIxNiAxMTIgMjkyIDE0IDExNyAyMjYgODAgMSAKKzI5NyAxNTkgMTgzIDE5IDE1MSA4MCAxNzcgMjc0IDg0IDcgMjE4IDI5NCAxODEgMTA0IDI4IDEyNiA5MCAxODAgMjE3IDE0MCAyMjUgNjcgCis5MCAyMzAgMjYyIDI5MiAyNjYgNzIgNzQgMzkgMjk4IDExIDQ4IDE0NyAzMDAgMjc4IDIxNiAyNTMgMzUgNzUgNjcgMjMxIDY0IDExMiAKKzI0MiAyNzEgMjY3IDE4NSA3NSAxNyA5NSAyMTQgNzEgMjM3IDI4NyAxNTYgMjQwIDU0IDE0NCAyMCAyOTAgMjI1IDIyOCA0NSAxNjkgMTAgCisyODcgMjgyIDE3MiAxMjkgMTggMTIzIDE0NyAxMjQgMzAxIDgwIDM2IDIyOSAyMyA1NyAyMTMgOCA3MCAxNTkgNyA0MiAyMjYgMjU2IAorMjgwIDEzMSAyMTMgXgorNjQwIDAgMjkxIDE2MiAxNjEgOTQgMTQyIDE0IDE2NSAyNjkgMTQxIDI1MSAyOTggMTQxIDI5MiA1MSAxNzAgMjUxIDM1IDE5OCAxNyAxMCAKKzE1NCAyNzkgMTA1IDE3MyAxOTIgMjcyIDI0OSA3OSAxOCAzNiAyNjggNzQgODAgMTcwIDI5MiA5MiAyMjcgMjgwIDIxMyAxODIgNDUgODAgCisxMjkgMTUwIDYzIDQ5IDI5NiAxODUgMTEyIDcwIDEyNCAxNzEgNTUgMjYzIDUxIDEyOSAxMDkgNiAyMCAzMyAyMDEgODQgMTQ5IDIxNSAKKzk3IDE2OCAzMiAyMTYgMjcgMjM0IDEzMyAyODcgMTEwIDExNCAyNDggMTkwIDkgMTgzIDE1NiAxOTQgMjI4IDEyNSAyNzkgNjQgMTE2IAorMTYzIDkgMjY1IDI3MCAyNTIgNjEgOCAxMTYgMjA0IDY2IDI5NCAyMjkgMjM2IDg5IDE2MyA5MSAxNjAgMjQgODUgMjkgMTQ5IDI1NiAKKzE1NCAxOTcgMjEwIDExNSA1NSAxMDggMTU4IDY4IDIwOSA0OCAxMDMgMTc2IDI1OSAyNjIgMjUgMTUgMTAgMzEgMjMgMTggNzcgMjEgCisxMDMgMjU4IDY5IDE2IDE2MiAyMDIgMTUxIDE3MSAyNzcgMTQ5IDI5NyAyOTYgMjI2IDE2OSA5OSA4MyA3MCA4MyAyOSAyNiA2NyAxMDEgCiszOSAzMSA2NCA3NSAxMDYgMjg0IDIgNjcgMjI0IDI5NSAzMyAxNjAgMjQ2IDI3NSAyNzUgMTIgNjkgOTggNTcgMjYwIDY5IDEzOSAxMTQgCisyODkgMjQ3IDM4IDE0MiA1NSAyMjIgMjk4IDEwMCAyMzUgMjIgMjExIDI2NyAyMjYgMTI4IDQyIDU0IDE5NiAxODQgMSAyNjAgMjUgMTk2IAorMTQzIDI0OCAyMzEgMTUxIDIxMiAzMCAxNzggMjU2IDE5NSAyNTQgMjM5IDc0IDM5IDI4IDI2MyAxMzMgMjQgMTY3IDE0MyAyMDcgMTc0IAorMTIyIDM0IDEzMSA2NSAxODYgMjIwIDc5IDI4MSAyODMgMjM5IDExNSA5NiA1NyAxMzcgMTE3IDUyIDE4IDExOCA3OCAxMzIgMjE3IDUzIAorNDQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI5NSA3NCAzMDIgMjc1IDIzNCAxNzQgNDAgMTM5IDczIDIzMiAyMTggMTY0IDE1OCAyNyAKKzE1MiAxOSAyMjkgMjc3IDIzMSAxOTIgNTAgNTkgNTIgMjQwIDQgMjAgMjE0IDMwIDMwMSAyMDggMjgyIDQ2IDEwNiAyNDMgMjQ5IDM4IAorMjY1IDcgNSA5MCAyNzEgMTUgMTMgMTM2IDI2OSAxMDAgMTk0IDI2OSAxODIgNCAyMyAxMDAgMjc2IDc5IDI0MCAyMjYgMjEwIDE1NiAKKzExMiAyOSA2NyAxNDIgOTYgNjAgMjMgNTkgMTM0IDUwIDYyIDI0MiAxODIgODYgMTM3IDE1OCAxMDkgNDcgNzcgNjIgMTYwIDI4NyAyOCAKKzE5MCA1MyAxMjYgMTI3IDIzNSAyNDQgOTcgMjA5IDg5IDI0NSAyMDUgMjE4IDI0NiA1MyA4NSA3MCAyMDYgMjg1IDExMyAxODEgMTkgCisyNzAgMzAgMjYwIDY2IDI1MyAxNzIgMjA3IDIxNSAxNzkgNjMgNSA0OSAyMTQgNzEgNTQgMjM3IDI0MSAzMCAyMTkgOSAyMjQgMjEzIAorMjIzIDEwMiAxMDkgMyAxMzQgOTEgMTE5IDI3MSA1NiA3MCAxNjUgMjI4IDg0IDIyMiAzNSAxNTcgMjY0IDI4NSAxOTUgMjk1IDc3IDEwMyAKKzIxNyAxMiAyOTEgMjAzIDMwMyAxMjMgMTAxIDMwMiAxOTMgMzUgMTE2IDEyMiAyNTYgMjM2IDcgMjY4IDMzIDI0MiAxNDEgMjkgMTA4IAorMTk5IDEyNSAyMzggNyA4NyAyODkgMjUgMjM3IDIwMCAyNzcgMTkwIDUwIDIxIDE4NSAxNTMgMTI3IDE1MyA0NSAzOSA3MiAxMjEgMTA0IAorNjUgMjY4IDExNSAxMzcgMTk5IDE2NiA3NiAzNiA0NiAxODggNTMgMyAxNzUgMTQ4IDE0OCAyMzAgNDAgOTggMTYgMjAzIDQwIDE4MCAKKzEzMCAyNjEgMTc3IDYzIDI3MSA5NyAxMjcgMTk0IDE4NyA2OCAyNTAgMTA1IDEzMiAxMzUgMjQzIDI5MCA5NSAyOTQgMjcwIDI5MyAxMTggCiszNyA3NSAxODggOTQgNjAgMjA0IDEwNyA0NyAyNTggMTEwIDczIDE5MSAxNjEgMTM1IDI4NCA0MyAxMjQgMjUzIDI1NCAxNyAyNzMgMTIgCisyNTAgMTQ2IDI3NCAxNjQgMTE3IDI3NCAxMjMgNjAgMjQ1IDE2NCA3NiAyMTcgOTQgMTAxIDI2MSAxMzYgNiAyNDIgMjIzIDE0MyAxNjYgCiszMiA5MyA3NSAxNDcgMzcgMzEgMjQ1IDEyMyAxOSAxODggMTM1IDIwMiAyMzMgNjYgMzEgMjg2IDI2NSA0OCA2MiAxMTkgMjMwIDMwMyAKKzQxIDI5MSAyNDQgNTYgMTUyIDYwIDI4NiAyIDEwNSA5MSA3OCAyMTQgMjcgMTExIDI2NiAyMDAgMTQgMjQ3IDc5IDE5OSA4NCAxODEgCisyODIgMTI4IDEgMzAxIDE2NyAyMjUgMTcgMjMyIDI1OSAyMjEgMTg3IDI5MCAxMzYgNDcgMjk5IDI1MiAxMDIgMTUwIDE0NSAxNjMgNTAgCisxOCAyOTkgMjExIDQ1IDEyMSAxODYgMTc5IDIyIDI1MiAyMCAyNTUgODcgMjYgODIgMjY2IDE1OSAyNjEgMjE4IDIwNSAzMDAgNTYgMTExIAorMyAyNTcgNDMgMjA2IDYzIDggMjM5IDE1NiAxNTMgODYgOTYgMTYgODAgODggOTMgMzQgOTAgOCAxNTcgNDIgOTUgMjUzIDIxMyAyNjQgCisyNDQgMTM4IDI2NiAxMTggMTE5IDE4OSAyNDYgNzkgXgorNjUwIDAgMjQgMzUgMjIgNzYgODEgMjYgMzggOCA2OCA4MCA0MyAzMiAxIDEyOSAyNCA0NCAxOTEgMTE4IDcyIDI1MSAxNjUgMTM4IDE0MCAKKzk5IDQwIDExIDU0IDE1MSA0MiAyNzYgMzAxIDEyMiAxNjQgNjcgMjcxIDUwIDE4OSAxMTUgNyAxODAgODcgMjAwIDE0NiAxODUgMjg1IAorNjcgNTMgMjE5IDIzMSAxMDYgMTUzIDEgMjE3IDI3MiAxNjUgMTgyIDI2NCAxOTkgNzUgMjM3IDE1NyAyMTYgMTU3IDE3MiAzMyA3MiA3NyAKKzE1MiAyODAgODcgMjQ0IDI3MCAyMDYgMjQxIDI5MyA3NyAyODQgNDAgMjI5IDE5MSAzMCAxMzAgMTMwIDE3NCAyOTggMTMgNDggMjc0IAorMjk4IDU3IDkzIDI5NSAyNyAyODMgMTk2IDU0IDYzIDE3OSAyMzQgNCAyODIgMzcgMjQzIDEyMCAzMSAxMTMgMTM2IDE4MSAyMzcgNjkgCisyNzQgMzYgMTgxIDE5MyAyNTEgMjUzIDgwIDI2MSA5MCAxODYgMTM4IDE4NCAyMjMgNjEgNDYgNTMgMTc1IDEwNyA2IDE5NyA4MSAxMTQgCisyMDcgMTI5IDU5IDMwNSAxNzAgMTYyIDczIDE0OCAxMDAgMTAyIDE3IDE0MCAxMSA5OCAyNzUgMTQyIDUgMjIxIDE0NiAyMjkgMTAzIDg4IAorOSAxMzkgMjggMTcxIDE4OSAyMDMgMjU1IDMwMSA3OCA0MCAyNzMgOSA1MSA4NiA1MCAyNzcgNTcgNDkgMTcxIDIzMyAyMSAyNzYgMjU3IAorMzA0IDY0IDMyIDQ1IDI1MyAxMjQgNzkgMTExIDIyMSA1OCAyODcgMjg4IDE3NiAxNjkgMTIgMjA0IDIwIDE3MCAyMDYgMTk3IDE2OSA1NiAKKzIyIDQxIDIwNSAxMjYgMzAwIDIzNCA5MiAxNDUgNzkgMTU1IDM5IDE1OCAyNDMgMjA4IDIwMCAyMzQgNDggMjEgNTggMTk5IDQwIDU1IAorMTc4IDE3MiA3NyAxOTYgOTggMTg3IDIwMCAxOTAgMyAyMyAyNzkgMTYgMjk2IDE0MiA0OSAzOSAyNDYgMTg1IDIzIDE5MSA3NCAyNTQgCisxNTEgMTMwIDIxOCAxMTYgMzQgNCAxOTQgOTUgMTIyIDIwOCAxMTIgMjkyIDYgMTA5IDIxOCA3MiAyOTUgMjg5IDE1OSAxNzUgMTkgMTQzIAorNzYgMTY5IDI3NCA4MCAzMDUgMjE0IDI4NiAxNzMgMTA0IDIwIDEyNiA4MiAxNzYgMjEzIDEzNiAyMjUgNTUgOTAgMjMwIDI2MiAyODQgCisyNTggNjAgNzAgMzkgMjkwIDMgNDQgMTQ3IDMwMCAyNzggMjE2IDI0NSAzNSA3NSA2MyAyMjMgNTIgMTA0IDIzOCAyNjMgMjY3IDE4NSAKKzY3IDkgOTUgMjEwIDcxIDIzMyAyODMgMTUyIDIzNiA0MiAxNDQgOCAyODYgMjE3IDIyOCA0MSAxNjEgMiAyNzkgMjc4IDE3MiAxMjEgMTQgCisxMTkgMTQzIDEyMCAyOTMgNjggMzYgMjI1IDExIDQ1IDIwOSA1OCAxNTUgMzAxIDM0IDIyMiAyNTIgMjgwIDEzMSA2MiAyOTEgMTYyIAorMTYxIDkwIDE0MiAxNCAxNjMgMjY3IDE0MSAyNDkgMjk0IDEzOSAyOTAgNDcgMTY4IDI0NyAyOSAxOTggMTMgNCAxNTAgMjc3IDEwMSAKKzE3MyAxOTIgMjY4IDI0NyA3MyAxNiAzNCAyNjYgNzAgNzQgMTY2IDI4OCA4OCAyMjcgMjc2IDIxMyAxODAgNDMgNzYgMTI1IDE1MCA1OSAKKzQzIDI5NCAxODMgMTA4IDY4IDEyNCAxNjcgNTMgMjYzIDQ5IDEyNyAxMDkgMTQgMzEgMjAxIDc4IDMwMiAxNDkgMjE1IDk1IDE2NiAyNiAKKzIxMiAyMSAyMzIgMTMzIDI4MyAxMDggMTEyIDI0OCAxODggOSAxODMgMTUyIDE5MiAyMjQgMTIzIDI3OSA2MCAxMTQgMTYzIDUgMjY1IAorMjcwIDI1MCA1OSA4IDExMiAyMDQgNjQgMjk0IDIyNyAyMzIgODkgMTU5IDg3IDE1NiAyMiA4NSAyMyAxNDcgMjU2IDE1NCAxOTUgMjEwIAorMTE1IDUxIDMwNCAxMDggMTU2IDY2IDIwOSA0NCAxMDMgMTc2IDI1NyAyNjAgMTkgMTEgMTAgMjcgMjEgMTQgNzUgMTkgOTkgMjU4IDY5IAorMTIgMTYwIDIwMiAxNDkgMTcxIDI3NyAxNDUgMjk3IDI5MiAyMjQgMTY3IDk3IDgxIDcwIDgzIDI5IDI0IDY3IDk3IDM3IDI1IDYyIDczIAorMTA0IDI4MiAyIDYxIDIyMCAyOTMgMzMgMTYwIDI0NiAyNzMgMjcxIDYgNjUgOTQgNTEgMjYwIDYzIDEzNSAxMTAgMjg5IDI0NyAzOCAKKzE0MCA1NSAyMjIgMjk2IDk4IDIzMSAxOCAyMTEgMjY1IDIyNiAxMjYgMzggNTIgMTkyIDE4MCAzMDUgMjU4IDI1IDE5NCAxMzkgMjQ2IAorMjI5IDE0NyAyMTIgMzAgMTc0IDI1NCAxOTUgMjU0IDIzOSA3MiAzMyAyOCAyNTkgMTMxIDE4IDE2NyAxNDEgMjA1IDE3MCAxMTggMjggCisxMjcgNjUgMTgyIDIyMCA3NSAyODEgMjgxIDIzNyAxMTMgOTIgNTcgMTM3IDExMyA0OCAxMiAxMTYgNzggMTI4IDIxNSA1MSA0MiAyMzIgCisxNzcgMjIgMTI5IDY4IDE2OCAyOTEgNzQgMjk4IDI3NSAyMzAgMTc0IDM2IDEzNyA2OSAyMzAgMjE4IDE2MCAxNTggMjUgMTUwIDE1IAorMjI1IDI3MyAyMjcgMTg4IDQ0IDU5IDUyIDIzNiAzMDQgMjAgMjE0IDI0IDI5NyAyMDQgMjgyIDQ2IDEwNiAyNDEgMjQ5IDMyIDI2MyA1IAorMyA4OCAyNzEgMTUgNyAxMzYgMjY5IDEwMCAxOTAgMjY1IDE4MiAyIDE3IDk2IDI4MyBeCis2NDkgMCA3NiAyNDAgMjIwIDIwNyAxNTYgMTA5IDI2IDY0IDEzNiA5NiA1MSAxNyA1MyAxMzQgNDcgNTMgMjM5IDE3NiA4MyAxMzQgMTUyIAorMTA2IDM4IDcxIDU5IDE1NyAyODcgMjUgMjk4IDE5MCA0NCAxMjMgMTIxIDIzNSAyNDEgOTEgMjA2IDgzIDIzOSAyMDUgMjEyIDI0MCA0NyAKKzgyIDYxIDIwNiAyODUgMTEwIDE3NSAxMCAyNjQgMjQgMjU0IDY2IDI1MyAxNjYgMjAxIDIwOSAxNzYgNTQgNSA0NiAyMTEgNjIgNDggCisyMzEgMjM4IDI3IDIxMyA2IDIyNCAyMTAgMjIwIDEwMiAxMDMgMyAxMzEgODggMTEzIDI2OCA1NiA2NCAxNjUgMjI1IDgxIDIxOSAyOSAKKzE1NyAyNTggMjc5IDE5MiAyOTUgNjggMTAwIDIxNyA5IDI4OCAyMDMgMjk3IDExNyA5OCAzMDIgMTkzIDMyIDExNiAxMjIgMjUwIDIzNiAKKzcgMjY4IDI3IDI0MiAxMzUgMjMgMTA1IDE5NiAxMjUgMjM4IDMwNSA4NCAyODMgMjIgMjM0IDE5NyAyNzQgMTg0IDUwIDEyIDE3OSAxNDcgCisxMjcgMTUzIDQ1IDMzIDYzIDEyMSAxMDEgNTkgMjYyIDEwOSAxMzEgMTkzIDE2NiA2NyAyNyA0MCAxODggNTMgMTcyIDE0OCAxNDIgMjI0IAorMzcgOTUgNyAyMDAgMzEgMTc3IDEyNyAyNTggMTc0IDYzIDI2NSA5NyAxMjQgMTk0IDE4MSA2MiAyNTAgMTAyIDEzMiAxMzIgMjM3IDI5MCAKKzg5IDI5MSAyNjcgMjkwIDExOCAzNyA2NiAxODUgOTQgNjAgMjAxIDEwNCA0NyAyNTUgMTEwIDcwIDE4OCAxNTggMTI5IDI3OCA0MyAxMTggCisyNDcgMjQ4IDE0IDI2NyAxMiAyNDcgMTQzIDI2OCAxNjEgMTE3IDI3MSAxMjAgNTcgMjQyIDE2NCA3NiAyMTEgOTEgMTAxIDI2MSAxMzMgCiszIDIzNiAyMTcgMTQzIDE2MyAzMiA4NyA2OSAxNDQgMzQgMzEgMjQ1IDEyMyAxNiAxODIgMTM1IDE5NiAyMzAgNjAgMjggMjg2IDI1OSAKKzQ1IDYyIDExNiAyMjcgMzAzIDM1IDI4NSAyNDQgNTAgMTQ2IDU0IDI4MyAzMDAgMTA1IDkxIDcyIDIwOCAyNyAxMDggMjYwIDE5NCA4IAorMjQ0IDc5IDE5OSA4NCAxNzggMjc2IDEyOCAzMDIgMjk4IDE2MSAyMjIgMTcgMjI2IDI1OSAyMTggMTg3IDI4NyAxMzAgNDQgMjk2IDI0NiAKKzk5IDE0NCAxMzkgMTYwIDQ0IDE4IDI5OSAyMDUgMzkgMTE1IDE4MyAxNzkgMTMgMjUyIDE3IDI1NSA4MSAxNyA4MiAyNjMgMTUzIDI1NSAKKzIxNSAxOTkgMjk0IDUzIDEwNSAzMDEgMjU0IDM3IDIwMCA2MCAzMDYgMjMzIDE1MyAxNTAgODYgOTMgMTYgNzcgODIgOTAgMjggODQgNSAKKzE1MSAzMyA5MiAyNTAgMjA3IDI2MSAyMzggMTMyIDI2NiAxMTIgMTE5IDE4NiAyNDMgNiAyMiAzMiAxOSA3MyA3OSAyNiAzNSA3IDY2IAorODAgNDEgMzAgMzA2IDEyOCAyNCA0NCAxOTEgMTE3IDY5IDI0OSAxNjMgMTM3IDE0MCA5OSAzOSAxMCA1NCAxNDkgNDIgMjc2IDMwMSAKKzEyMCAxNjIgNjQgMjcwIDQ3IDE4NyAxMTQgNSAxODAgODYgMTk4IDE0NSAxODMgMjg0IDY2IDUxIDIxOSAyMzEgMTA0IDE1MiAxIDIxNiAKKzI3MiAxNjQgMTgxIDI2NCAxOTcgNzIgMjM3IDE1NiAyMTQgMTU1IDE3MCAzMSA3MiA3NCAxNTIgMjc5IDg3IDI0MiAyNjkgMjA1IDI0MSAKKzI5MyA3NyAyODQgMzcgMjI5IDE4OSAyOSAxMjggMTI5IDE3MyAyOTcgMTIgNDUgMjcyIDI5OCA1NiA5MyAyOTQgMjQgMjgzIDE5NSA1MiAKKzYxIDE3NyAyMzIgNCAyODAgMzQgMjQxIDEyMCAyOCAxMTMgMTM0IDE4MSAyMzUgNjggMjczIDM1IDE4MCAxOTEgMjUxIDI1MSA3OCAyNjAgCis4OSAxODYgMTM4IDE4NCAyMjMgNjEgNDMgNTAgMTc1IDEwNyA2IDE5NSA4MSAxMTQgMjA3IDEyNyA1NiAzMDMgMTY5IDE2MCA3MyAxNDcgCis5OCAxMDAgMTUgMTM4IDExIDk4IDI3MyAxNDAgMiAyMjEgMTQ2IDIyNyAxMDEgODggOCAxMzkgMjYgMTY5IDE4OSAyMDIgMjUzIDMwMCAKKzc2IDM4IDI3MyA2IDUxIDg1IDQ5IDI3NSA1NSA0OSAxNzAgMjMzIDE5IDI3NSAyNTcgMzAzIDY0IDMxIDQzIDI1MiAxMjIgNzcgMTExIAorMjE5IDU4IDI4NiAyODggMTc0IDE2OCAxMSAyMDMgMTkgMTcwIDIwNCAxOTcgMTY5IDU1IDIwIDQxIDIwMyAxMjQgMjk5IDIzNCA5MiAKKzE0NSA3OCAxNTUgMzYgMTU2IDI0MyAyMDggMjAwIDIzMyA0OCAyMSA1NiAxOTggNDAgNTQgMTc4IDE3MSA3NSAxOTYgOTYgMTg1IDE5OSAKKzE4OSAzMDYgMjMgMjc4IDE0IDI5NiAxNDEgNDYgMzggMjQ0IDE4NCAyMSAxOTAgNzMgMjUyIDE1MSAxMzAgMjE3IDExNCAzNCAyIDE5MiAKKzkzIDEyMSAyMDYgMTEyIDI5MiA0IDEwNyAyMTYgNzAgMjkzIDI4NyAxNTkgMTczIDE5IDE0MSA3NSAxNjcgMjc0IDc5IDMwNCAyMTMgCisyODQgMTcxIDEwNCAxOCAxMjYgODAgMTc1IDIxMiAxMzUgMjI1IDUyIDkwIDIzMCAyNjIgMjgyIDI1NiA1NyA2OSAzOSAyODggMSA0MyAKKzE0NyAzMDAgMjc4IDIxNiAyNDMgMzUgNzUgNjIgMjIxIDQ5IDEwMiAyMzcgMjYxIDI2NyAxNDAgXgorNjQ5IDEgNjEgMyA5NSAyMDcgNzEgMjMwIDI4MCAxNDkgMjMzIDMzIDE0NCAzMDggMjgzIDIxMSAyMjggMzggMTU1IDMwNSAyNzMgMjc1IAorMTcyIDExNSAxMSAxMTYgMTQwIDExNyAyODcgNTkgMzYgMjIyIDIgMzYgMjA2IDMwMyA0OSAxNTIgMjk1IDI4IDIxOSAyNDkgMjgwIDEzMSAKKzUzIDI5MSAxNjIgMTYxIDg0IDE0MiAxNCAxNjAgMjY0IDE0MSAyNDYgMjg4IDEzNiAyODcgNDEgMTY1IDI0MSAyMCAxOTggNyAzMDQgCisxNDQgMjc0IDk1IDE3MyAxOTIgMjYyIDI0NCA2NCAxMyAzMSAyNjMgNjQgNjUgMTYwIDI4MiA4MiAyMjcgMjcwIDIxMyAxNzcgNDAgNzAgCisxMTkgMTUwIDUzIDM0IDI5MSAxODAgMTAyIDY1IDEyNCAxNjEgNTAgMjYzIDQ2IDEyNCAxMDkgMzAwIDUgMjggMjAxIDY5IDI5OSAxNDkgCisyMTUgOTIgMTYzIDE3IDIwNiAxMiAyMjkgMTMzIDI3NyAxMDUgMTA5IDI0OCAxODUgOSAxODMgMTQ2IDE4OSAyMTggMTIwIDI3OSA1NCAKKzExMSAxNjMgMzA4IDI2NSAyNzAgMjQ3IDU2IDggMTA2IDIwNCA2MSAyOTQgMjI0IDIyNiA4OSAxNTMgODEgMTUwIDE5IDg1IDE0IDE0NCAKKzI1NiAxNTQgMTkyIDIxMCAxMTUgNDUgMzA0IDEwOCAxNTMgNjMgMjA5IDM4IDEwMyAxNzYgMjU0IDI1NyAxMCA1IDEwIDIxIDE4IDggNzIgCisxNiA5MyAyNTggNjkgNiAxNTcgMjAyIDE0NiAxNzEgMjc3IDEzOSAyOTcgMjg2IDIyMSAxNjQgOTQgNzggNzAgODMgMjkgMjEgNjcgOTEgCiszNCAxNiA1OSA3MCAxMDEgMjc5IDIgNTIgMjE0IDI5MCAzMyAxNjAgMjQ2IDI3MCAyNjUgMzA2IDU5IDg4IDQyIDI2MCA1NCAxMjkgMTA0IAorMjg5IDI0NyAzOCAxMzcgNTUgMjIyIDI5MyA5NSAyMjUgMTIgMjExIDI2MiAyMjYgMTIzIDMyIDQ5IDE4NiAxNzQgMzA1IDI1NSAyNSAKKzE5MSAxMzMgMjQzIDIyNiAxNDEgMjEyIDMwIDE2OCAyNTEgMTk1IDI1NCAyMzkgNjkgMjQgMjggMjUzIDEyOCA5IDE2NyAxMzggMjAyIAorMTY0IDExMiAxOSAxMjEgNjUgMTc2IDIyMCA2OSAyODEgMjc4IDIzNCAxMTAgODYgNTcgMTM3IDEwNyA0MiAzIDExMyA3OCAxMjIgMjEyIAorNDggMzkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI4NSA3NCAyOTIgMjc1IDIyNCAxNzQgMzAgMTM0IDYzIDIyNyAyMTggMTU0IDE1OCAyMiAKKzE0NyA5IDIxOSAyNjcgMjIxIDE4MiAzNSA1OSA1MiAyMzAgMjk4IDIwIDIxNCAxNSAyOTEgMTk4IDI4MiA0NiAxMDYgMjM4IDI0OSAyMyAKKzI2MCAyIDg1IDI3MSAxNSAzMDcgMTM2IDI2OSAxMDAgMTg0IDI1OSAxODIgMzA4IDggOTAgMjY2IDc0IDI0MCAyMTYgMjA1IDE1NiAxMDcgCisyNCA2MiAxMzIgOTYgNDUgMTMgNDkgMTM0IDQ1IDQ3IDIzNyAxNzIgODEgMTMyIDE0OCAxMDQgMzIgNjcgNTcgMTU1IDI4NyAyMyAyOTQgCisxOTAgMzggMTIxIDExNyAyMzUgMjM5IDg3IDIwNCA3OSAyMzUgMjA1IDIwOCAyMzYgNDMgODAgNTUgMjA2IDI4NSAxMDggMTcxIDQgMjYwIAorMjAgMjUwIDY2IDI1MyAxNjIgMTk3IDIwNSAxNzQgNDggNSA0NCAyMDkgNTYgNDQgMjI3IDIzNiAyNSAyMDkgNCAyMjQgMjA4IDIxOCAKKzEwMiA5OSAzIDEyOSA4NiAxMDkgMjY2IDU2IDYwIDE2NSAyMjMgNzkgMjE3IDI1IDE1NyAyNTQgMjc1IDE5MCAyOTUgNjIgOTggMjE3IDcgCisyODYgMjAzIDI5MyAxMTMgOTYgMzAyIDE5MyAzMCAxMTYgMTIyIDI0NiAyMzYgNyAyNjggMjMgMjQyIDEzMSAxOSAxMDMgMTk0IDEyNSAKKzIzOCAzMDEgODIgMjc5IDIwIDIzMiAxOTUgMjcyIDE4MCA1MCA2IDE3NSAxNDMgMTI3IDE1MyA0NSAyOSA1NyAxMjEgOTkgNTUgMjU4IAorMTA1IDEyNyAxODkgMTY2IDYxIDIxIDM2IDE4OCA1MyAzMDcgMTcwIDE0OCAxMzggMjIwIDM1IDkzIDEgMTk4IDI1IDE3NSAxMjUgMjU2IAorMTcyIDYzIDI2MSA5NyAxMjIgMTk0IDE3NyA1OCAyNTAgMTAwIDEzMiAxMzAgMjMzIDI5MCA4NSAyODkgMjY1IDI4OCAxMTggMzcgNjAgCisxODMgOTQgNjAgMTk5IDEwMiA0NyAyNTMgMTEwIDY4IDE4NiAxNTYgMTI1IDI3NCA0MyAxMTQgMjQzIDI0NCAxMiAyNjMgMTIgMjQ1IAorMTQxIDI2NCAxNTkgMTE3IDI2OSAxMTggNTUgMjQwIDE2NCA3NiAyMDcgODkgMTAxIDI2MSAxMzEgMSAyMzIgMjEzIDE0MyAxNjEgMzIgCis4MyA2NSAxNDIgMzIgMzEgMjQ1IDEyMyAxNCAxNzggMTM1IDE5MiAyMjggNTYgMjYgMjg2IDI1NSA0MyA2MiAxMTQgMjI1IDMwMyAzMSAKKzI4MSAyNDQgNDYgMTQyIDUwIDI4MSAyOTYgMTA1IDkxIDY4IDIwNCAyNyAxMDYgMjU2IDE5MCA0IDI0MiA3OSAxOTkgODQgMTc2IDI3MiAKKzEyOCAzMDAgMjk2IDE1NyAyMjAgMTcgMjIyIDI1OSAyMTYgMTg3IDI4NSAxMjYgNDIgMjk0IDI0MiA5NyAxNDAgMTM1IDE1OCA0MCAxOCAKKzI5OSAyMDEgMzUgMTExIDE4MSAxNzkgNyAyNTIgMTUgMjU1IDc3IDExIDgyIDI2MSAxNDkgMjUxIDY5IF4KKzY1NSAwIDE5MSAyODYgNDkgOTcgMjkzIDI1MCAyOSAxOTIgNTYgMjk4IDIyNSAxNDkgMTQ2IDg2IDg5IDE2IDczIDc0IDg2IDIwIDc2IDEgCisxNDMgMjEgODggMjQ2IDE5OSAyNTcgMjMwIDEyNCAyNjYgMTA0IDExOSAxODIgMjM5IDMwOSAxNCAyMCA3IDYxIDcxIDI2IDIzIDMgNTggCis4MCAzMyAyMiAzMDIgMTI0IDI0IDQ0IDE5MSAxMTMgNTcgMjQxIDE1NSAxMzMgMTQwIDk5IDM1IDYgNTQgMTQxIDQyIDI3NiAzMDEgMTEyIAorMTU0IDUyIDI2NiAzNSAxNzkgMTEwIDMwOCAxODAgODIgMTkwIDE0MSAxNzUgMjgwIDYyIDQzIDIxOSAyMzEgOTYgMTQ4IDEgMjEyIDI3MiAKKzE2MCAxNzcgMjY0IDE4OSA2MCAyMzcgMTUyIDIwNiAxNDcgMTYyIDIzIDcyIDYyIDE1MiAyNzUgODcgMjM0IDI2NSAyMDEgMjQxIDI5MyAKKzc3IDI4NCAyNSAyMjkgMTgxIDI1IDEyMCAxMjUgMTY5IDI5MyA4IDMzIDI2NCAyOTggNTIgOTMgMjkwIDEyIDI4MyAxOTEgNDQgNTMgCisxNjkgMjI0IDQgMjcyIDIyIDIzMyAxMjAgMTYgMTEzIDEyNiAxODEgMjI3IDY0IDI2OSAzMSAxNzYgMTgzIDI1MSAyNDMgNzAgMjU2IDg1IAorMTg2IDEzOCAxODQgMjIzIDYxIDMxIDM4IDE3NSAxMDcgNiAxODcgODEgMTE0IDIwNyAxMTkgNDQgMjk1IDE2NSAxNTIgNzMgMTQzIDkwIAorOTIgNyAxMzAgMTEgOTggMjY1IDEzMiAzMDEgMjIxIDE0NiAyMTkgOTMgODggNCAxMzkgMTggMTYxIDE4OSAxOTggMjQ1IDI5NiA2OCAzMCAKKzI3MyAzMDUgNTEgODEgNDUgMjY3IDQ3IDQ5IDE2NiAyMzMgMTEgMjcxIDI1NyAyOTkgNjQgMjcgMzUgMjQ4IDExNCA2OSAxMTEgMjExIAorNTggMjgyIDI4OCAxNjYgMTY0IDcgMTk5IDE1IDE3MCAxOTYgMTk3IDE2OSA1MSAxMiA0MSAxOTUgMTE2IDI5NSAyMzQgOTIgMTQ1IDc0IAorMTU1IDI0IDE0OCAyNDMgMjA4IDIwMCAyMjkgNDggMjEgNDggMTk0IDQwIDUwIDE3OCAxNjcgNjcgMTk2IDg4IDE3NyAxOTUgMTg1IDI5OSAKKzMwNiAyMyAyNzQgNiAyOTYgMTM3IDM0IDM0IDIzNiAxODAgMTMgMTg2IDY5IDI0NCAxNTEgMTMwIDIxMyAxMDYgMzQgMzA1IDE4NCA4NSAKKzExNyAxOTggMTEyIDI5MiAzMDcgOTkgMjA4IDYyIDI4NSAyNzkgMTU5IDE2NSAxOSAxMzMgNzEgMTU5IDI3NCA3NSAzMDAgMjA5IDI3NiAKKzE2MyAxMDQgMTAgMTI2IDcyIDE3MSAyMDggMTMxIDIyNSA0MCA5MCAyMzAgMjYyIDI3NCAyNDggNDUgNjUgMzkgMjgwIDMwNCAzOSAxNDcgCiszMDAgMjc4IDIxNiAyMzUgMzUgNzUgNTggMjEzIDM3IDk0IDIzMyAyNTMgMjY3IDE4NSA1NyAzMTAgOTUgMjA1IDcxIDIyOCAyNzggMTQ3IAorMjMxIDI3IDE0NCAzMDQgMjgxIDIwNyAyMjggMzYgMTUxIDMwMyAyNjkgMjczIDE3MiAxMTEgOSAxMTQgMTM4IDExNSAyODMgNTMgMzYgCisyMjAgMzA3IDMwIDIwNCAzMDEgNDMgMTUwIDI5MSAyNCAyMTcgMjQ3IDI4MCAxMzEgNDcgMjkxIDE2MiAxNjEgODAgMTQyIDE0IDE1OCAKKzI2MiAxNDEgMjQ0IDI4NCAxMzQgMjg1IDM3IDE2MyAyMzcgMTQgMTk4IDMgMzAwIDE0MCAyNzIgOTEgMTczIDE5MiAyNTggMjQyIDU4IAorMTEgMjkgMjYxIDYwIDU5IDE1NiAyNzggNzggMjI3IDI2NiAyMTMgMTc1IDM4IDY2IDExNSAxNTAgNDkgMjggMjg5IDE3OCA5OCA2MyAKKzEyNCAxNTcgNDggMjYzIDQ0IDEyMiAxMDkgMjk2IDMxMCAyNiAyMDEgNjMgMjk3IDE0OSAyMTUgOTAgMTYxIDExIDIwMiA2IDIyNyAxMzMgCisyNzMgMTAzIDEwNyAyNDggMTgzIDkgMTgzIDE0MiAxODcgMjE0IDExOCAyNzkgNTAgMTA5IDE2MyAzMDYgMjY1IDI3MCAyNDUgNTQgOCAKKzEwMiAyMDQgNTkgMjk0IDIyMiAyMjIgODkgMTQ5IDc3IDE0NiAxNyA4NSA4IDE0MiAyNTYgMTU0IDE5MCAyMTAgMTE1IDQxIDMwNCAxMDggCisxNTEgNjEgMjA5IDM0IDEwMyAxNzYgMjUyIDI1NSA0IDEgMTAgMTcgMTYgNCA3MCAxNCA4OSAyNTggNjkgMiAxNTUgMjAyIDE0NCAxNzEgCisyNzcgMTM1IDI5NyAyODIgMjE5IDE2MiA5MiA3NiA3MCA4MyAyOSAxOSA2NyA4NyAzMiAxMCA1NyA2OCA5OSAyNzcgMiA0NiAyMTAgMjg4IAorMzMgMTYwIDI0NiAyNjggMjYxIDMwMiA1NSA4NCAzNiAyNjAgNDggMTI1IDEwMCAyODkgMjQ3IDM4IDEzNSA1NSAyMjIgMjkxIDkzIDIyMSAKKzggMjExIDI2MCAyMjYgMTIxIDI4IDQ3IDE4MiAxNzAgMzA1IDI1MyAyNSAxODkgMTI5IDI0MSAyMjQgMTM3IDIxMiAzMCAxNjQgMjQ5IAorMTk1IDI1NCAyMzkgNjcgMTggMjggMjQ5IDEyNiAzIDE2NyAxMzYgMjAwIDE2MCAxMDggMTMgMTE3IDY1IDE3MiAyMjAgNjUgMjgxIDI3NiAKKzIzMiAxMDggODIgNTcgMTM3IDEwMyAzOCAzMDggMTExIDc4IDExOCAyMTAgNDYgMzcgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI4MSA3NCAKKzI4OCAyNzUgMjIwIDE3NCAyNiAxMzIgNTkgMjI1IDIxOCAxNTAgMTU4IDIwIDE0NSA1IDIxNSAyNjMgMTAwIF4KKzY2MSAxIDE3NiAyNiA1OSA1MiAyMjQgMjkyIDIwIDIxNCA2IDI4NSAxOTIgMjgyIDQ2IDEwNiAyMzUgMjQ5IDE0IDI1NyAzMTEgMzA5IAorODIgMjcxIDE1IDMwMSAxMzYgMjY5IDEwMCAxNzggMjUzIDE4MiAzMDggMzExIDg0IDI2MCA3MSAyNDAgMjEwIDIwMiAxNTYgMTA0IDIxIAorNTkgMTI2IDk2IDM2IDcgNDMgMTM0IDQyIDM4IDIzNCAxNjYgNzggMTI5IDE0MiAxMDEgMjMgNjEgNTQgMTUyIDI4NyAyMCAyODggMTkwIAorMjkgMTE4IDExMSAyMzUgMjM2IDgxIDIwMSA3MyAyMjkgMjA1IDIwMiAyMzAgMzcgNzcgNDYgMjA2IDI4NSAxMDUgMTY1IDMwNyAyNTQgCisxNCAyNDQgNjYgMjUzIDE1NiAxOTEgMTk5IDE3MSAzOSA1IDQxIDIwNiA0NyAzOCAyMjEgMjMzIDIyIDIwMyAxIDIyNCAyMDUgMjE1IAorMTAyIDkzIDMgMTI2IDgzIDEwMyAyNjMgNTYgNTQgMTY1IDIyMCA3NiAyMTQgMTkgMTU3IDI0OCAyNjkgMTg3IDI5NSA1MyA5NSAyMTcgNCAKKzI4MyAyMDMgMjg3IDEwNyA5MyAzMDIgMTkzIDI3IDExNiAxMjIgMjQwIDIzNiA3IDI2OCAxNyAyNDIgMTI1IDEzIDEwMCAxOTEgMTI1IAorMjM4IDI5NSA3OSAyNzMgMTcgMjI5IDE5MiAyNjkgMTc0IDUwIDMwOSAxNjkgMTM3IDEyNyAxNTMgNDUgMjMgNDggMTIxIDk2IDQ5IDI1MiAKKzk5IDEyMSAxODMgMTY2IDUyIDEyIDMwIDE4OCA1MyAzMDcgMTY3IDE0OCAxMzIgMjE0IDMyIDkwIDMwNCAxOTUgMTYgMTcyIDEyMiAyNTMgCisxNjkgNjMgMjU1IDk3IDExOSAxOTQgMTcxIDUyIDI1MCA5NyAxMzIgMTI3IDIyNyAyOTAgNzkgMjg2IDI2MiAyODUgMTE4IDM3IDUxIAorMTgwIDk0IDYwIDE5NiA5OSA0NyAyNTAgMTEwIDY1IDE4MyAxNTMgMTE5IDI2OCA0MyAxMDggMjM3IDIzOCA5IDI1NyAxMiAyNDIgMTM4IAorMjU4IDE1NiAxMTcgMjY2IDExNSA1MiAyMzcgMTY0IDc2IDIwMSA4NiAxMDEgMjYxIDEyOCAzMTAgMjI2IDIwNyAxNDMgMTU4IDMyIDc3IAorNTkgMTM5IDI5IDMxIDI0NSAxMjMgMTEgMTcyIDEzNSAxODYgMjI1IDUwIDIzIDI4NiAyNDkgNDAgNjIgMTExIDIyMiAzMDMgMjUgMjc1IAorMjQ0IDQwIDEzNiA0NCAyNzggMjkwIDEwNSA5MSA2MiAxOTggMjcgMTAzIDI1MCAxODQgMzEwIDIzOSA3OSAxOTkgODQgMTczIDI2NiAKKzEyOCAyOTcgMjkzIDE1MSAyMTcgMTcgMjE2IDI1OSAyMTMgMTg3IDI4MiAxMjAgMzkgMjkxIDIzNiA5NCAxMzQgMTI5IDE1NSAzNCAxOCAKKzI5OSAxOTUgMjkgMTA1IDE3OCAxNzkgMzEwIDI1MiAxMiAyNTUgNzEgMiA4MiAyNTggMTQzIDI0NSAyMTAgMTg5IDI4NCA0OCA5NSAyOTEgCisyNDkgMjcgMTkwIDU1IDI5NiAyMjMgMTQ4IDE0NSA4NiA4OCAxNiA3MiA3MiA4NSAxOCA3NCAxNDEgMTggODcgMjQ1IDE5NyAyNTYgMjI4IAorMTIyIDI2NiAxMDIgMTE5IDE4MSAyMzggMzA4IDEyIDE3IDQgNTggNjkgMjYgMjAgMiA1NiA4MCAzMSAyMCAzMDEgMTIzIDI0IDQ0IDE5MSAKKzExMiA1NCAyMzkgMTUzIDEzMiAxNDAgOTkgMzQgNSA1NCAxMzkgNDIgMjc2IDMwMSAxMTAgMTUyIDQ5IDI2NSAzMiAxNzcgMTA5IDMwNyAKKzE4MCA4MSAxODggMTQwIDE3MyAyNzkgNjEgNDEgMjE5IDIzMSA5NCAxNDcgMSAyMTEgMjcyIDE1OSAxNzYgMjY0IDE4NyA1NyAyMzcgCisxNTEgMjA0IDE0NSAxNjAgMjEgNzIgNTkgMTUyIDI3NCA4NyAyMzIgMjY0IDIwMCAyNDEgMjkzIDc3IDI4NCAyMiAyMjkgMTc5IDI0IAorMTE4IDEyNCAxNjggMjkyIDcgMzAgMjYyIDI5OCA1MSA5MyAyODkgOSAyODMgMTkwIDQyIDUxIDE2NyAyMjIgNCAyNzAgMTkgMjMxIDEyMCAKKzEzIDExMyAxMjQgMTgxIDIyNSA2MyAyNjggMzAgMTc1IDE4MSAyNTEgMjQxIDY4IDI1NSA4NCAxODYgMTM4IDE4NCAyMjMgNjEgMjggMzUgCisxNzUgMTA3IDYgMTg1IDgxIDExNCAyMDcgMTE3IDQxIDI5MyAxNjQgMTUwIDczIDE0MiA4OCA5MCA1IDEyOCAxMSA5OCAyNjMgMTMwIAorMjk5IDIyMSAxNDYgMjE3IDkxIDg4IDMgMTM5IDE2IDE1OSAxODkgMTk3IDI0MyAyOTUgNjYgMjggMjczIDMwMyA1MSA4MCA0NCAyNjUgCis0NSA0OSAxNjUgMjMzIDkgMjcwIDI1NyAyOTggNjQgMjYgMzMgMjQ3IDExMiA2NyAxMTEgMjA5IDU4IDI4MSAyODggMTY0IDE2MyA2IAorMTk4IDE0IDE3MCAxOTQgMTk3IDE2OSA1MCAxMCA0MSAxOTMgMTE0IDI5NCAyMzQgOTIgMTQ1IDczIDE1NSAyMSAxNDYgMjQzIDIwOCAKKzIwMCAyMjggNDggMjEgNDYgMTkzIDQwIDQ5IDE3OCAxNjYgNjUgMTk2IDg2IDE3NSAxOTQgMTg0IDI5NyAzMDYgMjMgMjczIDQgMjk2IAorMTM2IDMxIDMzIDIzNCAxNzkgMTEgMTg1IDY4IDI0MiAxNTEgMTMwIDIxMiAxMDQgMzQgMzA0IDE4MiA4MyAxMTYgMTk2IDExMiAyOTIgCiszMDYgOTcgMjA2IDYwIDI4MyAyNzcgMTU5IDE2MyAxOSAxMzEgNzAgMTU3IDI3NCA3NCAyOTkgMjA4IDI3NCAxNjEgMTA0IDggMTI2IDcwIAorMTcwIDIwNyAxMzAgMjI1IDM3IDkwIDIzMCAxOTQgXgorNjQzIDAgMjY4IDI0MiAzNiA2MiAzOSAyNzQgMzAxIDM2IDE0NyAzMDAgMjc4IDIxNiAyMjkgMzUgNzUgNTUgMjA3IDI4IDg4IDIzMCAKKzI0NyAyNjcgMTg1IDUxIDMwNyA5NSAyMDIgNzEgMjI1IDI3NSAxNDQgMjI4IDE4IDE0NCAyOTggMjc4IDIwMSAyMjggMzMgMTQ1IDMwMCAKKzI2MyAyNzAgMTcyIDEwNSA2IDExMSAxMzUgMTEyIDI3NyA0NCAzNiAyMTcgMzAxIDIxIDIwMSAyOTggMzQgMTQ3IDI4NSAxOCAyMTQgCisyNDQgMjgwIDEzMSAzOCAyOTEgMTYyIDE2MSA3NCAxNDIgMTQgMTU1IDI1OSAxNDEgMjQxIDI3OCAxMzEgMjgyIDMxIDE2MCAyMzEgNSAKKzE5OCAzMTEgMjk0IDEzNCAyNjkgODUgMTczIDE5MiAyNTIgMjM5IDQ5IDggMjYgMjU4IDU0IDUwIDE1MCAyNzIgNzIgMjI3IDI2MCAyMTMgCisxNzIgMzUgNjAgMTA5IDE1MCA0MyAxOSAyODYgMTc1IDkyIDYwIDEyNCAxNTEgNDUgMjYzIDQxIDExOSAxMDkgMjkwIDMwNCAyMyAyMDEgCis1NCAyOTQgMTQ5IDIxNSA4NyAxNTggMiAxOTYgMzExIDIyNCAxMzMgMjY3IDEwMCAxMDQgMjQ4IDE4MCA5IDE4MyAxMzYgMTg0IDIwOCAKKzExNSAyNzkgNDQgMTA2IDE2MyAzMDMgMjY1IDI3MCAyNDIgNTEgOCA5NiAyMDQgNTYgMjk0IDIxOSAyMTYgODkgMTQzIDcxIDE0MCAxNCAKKzg1IDMxMyAxMzkgMjU2IDE1NCAxODcgMjEwIDExNSAzNSAzMDQgMTA4IDE0OCA1OCAyMDkgMjggMTAzIDE3NiAyNDkgMjUyIDMwOSAzMDkgCisxMCAxMSAxMyAzMTIgNjcgMTEgODMgMjU4IDY5IDMxMCAxNTIgMjAyIDE0MSAxNzEgMjc3IDEyOSAyOTcgMjc2IDIxNiAxNTkgODkgNzMgCis3MCA4MyAyOSAxNiA2NyA4MSAyOSAxIDU0IDY1IDk2IDI3NCAyIDM3IDIwNCAyODUgMzMgMTYwIDI0NiAyNjUgMjU1IDI5NiA0OSA3OCAKKzI3IDI2MCAzOSAxMTkgOTQgMjg5IDI0NyAzOCAxMzIgNTUgMjIyIDI4OCA5MCAyMTUgMiAyMTEgMjU3IDIyNiAxMTggMjIgNDQgMTc2IAorMTY0IDMwNSAyNTAgMjUgMTg2IDEyMyAyMzggMjIxIDEzMSAyMTIgMzAgMTU4IDI0NiAxOTUgMjU0IDIzOSA2NCA5IDI4IDI0MyAxMjMgCiszMDggMTY3IDEzMyAxOTcgMTU0IDEwMiA0IDExMSA2NSAxNjYgMjIwIDU5IDI4MSAyNzMgMjI5IDEwNSA3NiA1NyAxMzcgOTcgMzIgMzAyIAorMTA4IDc4IDExMiAyMDcgNDMgMzQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI3NSA3NCAyODIgMjc1IDIxNCAxNzQgMjAgMTI5IDUzIDIyMiAKKzIxOCAxNDQgMTU4IDE3IDE0MiAzMTMgMjA5IDI1NyAyMTEgMTcyIDIwIDU5IDUyIDIyMCAyODggMjAgMjE0IDI4MSAxODggMjgyIDQ2IAorMTA2IDIzMyAyNDkgOCAyNTUgMzExIDMwOSA4MCAyNzEgMTUgMjk3IDEzNiAyNjkgMTAwIDE3NCAyNDkgMTgyIDMwOCAzMDcgODAgMjU2IAorNjkgMjQwIDIwNiAyMDAgMTU2IDEwMiAxOSA1NyAxMjIgOTYgMzAgMyAzOSAxMzQgNDAgMzIgMjMyIDE2MiA3NiAxMjcgMTM4IDk5IDE3IAorNTcgNTIgMTUwIDI4NyAxOCAyODQgMTkwIDIzIDExNiAxMDcgMjM1IDIzNCA3NyAxOTkgNjkgMjI1IDIwNSAxOTggMjI2IDMzIDc1IDQwIAorMjA2IDI4NSAxMDMgMTYxIDMwMyAyNTAgMTAgMjQwIDY2IDI1MyAxNTIgMTg3IDE5NSAxNjkgMzMgNSAzOSAyMDQgNDEgMzQgMjE3IDIzMSAKKzIwIDE5OSAzMTMgMjI0IDIwMyAyMTMgMTAyIDg5IDMgMTI0IDgxIDk5IDI2MSA1NiA1MCAxNjUgMjE4IDc0IDIxMiAxNSAxNTcgMjQ0IAorMjY1IDE4NSAyOTUgNDcgOTMgMjE3IDIgMjgxIDIwMyAyODMgMTAzIDkxIDMwMiAxOTMgMjUgMTE2IDEyMiAyMzYgMjM2IDcgMjY4IDEzIAorMjQyIDEyMSA5IDk4IDE4OSAxMjUgMjM4IDI5MSA3NyAyNjkgMTUgMjI3IDE5MCAyNjcgMTcwIDUwIDMwNSAxNjUgMTMzIDEyNyAxNTMgCis0NSAxOSA0MiAxMjEgOTQgNDUgMjQ4IDk1IDExNyAxNzkgMTY2IDQ2IDYgMjYgMTg4IDUzIDMwNyAxNjUgMTQ4IDEyOCAyMTAgMzAgODggCiszMDAgMTkzIDEwIDE3MCAxMjAgMjUxIDE2NyA2MyAyNTEgOTcgMTE3IDE5NCAxNjcgNDggMjUwIDk1IDEzMiAxMjUgMjIzIDI5MCA3NSAKKzI4NCAyNjAgMjgzIDExOCAzNyA0NSAxNzggOTQgNjAgMTk0IDk3IDQ3IDI0OCAxMTAgNjMgMTgxIDE1MSAxMTUgMjY0IDQzIDEwNCAyMzMgCisyMzQgNyAyNTMgMTIgMjQwIDEzNiAyNTQgMTU0IDExNyAyNjQgMTEzIDUwIDIzNSAxNjQgNzYgMTk3IDg0IDEwMSAyNjEgMTI2IDMxMCAKKzIyMiAyMDMgMTQzIDE1NiAzMiA3MyA1NSAxMzcgMjcgMzEgMjQ1IDEyMyA5IDE2OCAxMzUgMTgyIDIyMyA0NiAyMSAyODYgMjQ1IDM4IAorNjIgMTA5IDIyMCAzMDMgMjEgMjcxIDI0NCAzNiAxMzIgNDAgMjc2IDI4NiAxMDUgOTEgNTggMTk0IDI3IDEwMSAyNDYgMTgwIDMwOCAKKzIzNyA3OSAxOTkgODQgMTcxIDI2MiAxMjggMjk1IDI5MSAxNDcgMjE1IDE3IDIxMiAyNTkgMjE5IF4KKzY1MiAxIDE4NyAyNzggMTEyIDM1IDI4NyAyMjggOTAgMTI2IDEyMSAxNTEgMjYgMTggMjk5IDE4NyAyMSA5NyAxNzQgMTc5IDMwMiAyNTIgCis4IDI1NSA2MyAzMDYgODIgMjU0IDEzNSAyMzcgMjA2IDE4MSAyNzYgNDQgODcgMjgzIDI0NSAxOSAxODIgNTEgMjg4IDIxNSAxNDQgMTQxIAorODYgODQgMTYgNjggNjQgODEgMTAgNjYgMzEyIDEzMyA2IDgzIDI0MSAxODkgMjUyIDIyMCAxMTQgMjY2IDk0IDExOSAxNzcgMjM0IDMwNCAKKzQgNSAzMDggNDYgNjEgMjYgOCAzMTQgNDggODAgMjMgMTIgMjk3IDExOSAyNCA0NCAxOTEgMTA4IDQyIDIzMSAxNDUgMTI4IDE0MCA5OSAKKzMwIDEgNTQgMTMxIDQyIDI3NiAzMDEgMTAyIDE0NCAzNyAyNjEgMjAgMTY5IDEwNSAzMDMgMTgwIDc3IDE4MCAxMzYgMTY1IDI3NSA1NyAKKzMzIDIxOSAyMzEgODYgMTQzIDEgMjA3IDI3MiAxNTUgMTcyIDI2NCAxNzkgNDUgMjM3IDE0NyAxOTYgMTM3IDE1MiAxMyA3MiA0NyAxNTIgCisyNzAgODcgMjI0IDI2MCAxOTYgMjQxIDI5MyA3NyAyODQgMTAgMjI5IDE3MSAyMCAxMTAgMTIwIDE2NCAyODggMyAxOCAyNTQgMjk4IDQ3IAorOTMgMjg1IDMxMyAyODMgMTg2IDM0IDQzIDE1OSAyMTQgNCAyNjIgNyAyMjMgMTIwIDEgMTEzIDExNiAxODEgMjE3IDU5IDI2NCAyNiAKKzE3MSAxNzMgMjUxIDIzMyA2MCAyNTEgODAgMTg2IDEzOCAxODQgMjIzIDYxIDE2IDIzIDE3NSAxMDcgNiAxNzcgODEgMTE0IDIwNyAxMDkgCisyOSAyODUgMTYwIDE0MiA3MyAxMzggODAgODIgMzEzIDEyMCAxMSA5OCAyNTUgMTIyIDI5MSAyMjEgMTQ2IDIwOSA4MyA4OCAzMTUgMTM5IAorOCAxNTEgMTg5IDE5MyAyMzUgMjkxIDU4IDIwIDI3MyAyOTUgNTEgNzYgNDAgMjU3IDM3IDQ5IDE2MSAyMzMgMSAyNjYgMjU3IDI5NCA2NCAKKzIyIDI1IDI0MyAxMDQgNTkgMTExIDIwMSA1OCAyNzcgMjg4IDE1NiAxNTkgMiAxOTQgMTAgMTcwIDE4NiAxOTcgMTY5IDQ2IDIgNDEgCisxODUgMTA2IDI5MCAyMzQgOTIgMTQ1IDY5IDE1NSA5IDEzOCAyNDMgMjA4IDIwMCAyMjQgNDggMjEgMzggMTg5IDQwIDQ1IDE3OCAxNjIgCis1NyAxOTYgNzggMTY3IDE5MCAxODAgMjg5IDMwNiAyMyAyNjkgMzEyIDI5NiAxMzIgMTkgMjkgMjI2IDE3NSAzIDE4MSA2NCAyMzQgMTUxIAorMTMwIDIwOCA5NiAzNCAzMDAgMTc0IDc1IDExMiAxODggMTEyIDI5MiAzMDIgODkgMTk4IDUyIDI3NSAyNjkgMTU5IDE1NSAxOSAxMjMgCis2NiAxNDkgMjc0IDcwIDI5NSAyMDQgMjY2IDE1MyAxMDQgMTI2IDYyIDE2NiAyMDMgMTI2IDIyNSAyNSA5MCAyMzAgMjYyIDI2NCAyMzggCiszMCA2MCAzOSAyNzAgMjk5IDM0IDE0NyAzMDAgMjc4IDIxNiAyMjUgMzUgNzUgNTMgMjAzIDIyIDg0IDIyOCAyNDMgMjY3IDE4NSA0NyAKKzMwNSA5NSAyMDAgNzEgMjIzIDI3MyAxNDIgMjI2IDEyIDE0NCAyOTQgMjc2IDE5NyAyMjggMzEgMTQxIDI5OCAyNTkgMjY4IDE3MiAxMDEgCis0IDEwOSAxMzMgMTEwIDI3MyAzOCAzNiAyMTUgMjk3IDE1IDE5OSAyOTYgMjggMTQ1IDI4MSAxNCAyMTIgMjQyIDI4MCAxMzEgMzIgMjkxIAorMTYyIDE2MSA3MCAxNDIgMTQgMTUzIDI1NyAxNDEgMjM5IDI3NCAxMjkgMjgwIDI3IDE1OCAyMjcgMzE1IDE5OCAzMDkgMjkwIDEzMCAKKzI2NyA4MSAxNzMgMTkyIDI0OCAyMzcgNDMgNiAyNCAyNTYgNTAgNDQgMTQ2IDI2OCA2OCAyMjcgMjU2IDIxMyAxNzAgMzMgNTYgMTA1IAorMTUwIDM5IDEzIDI4NCAxNzMgODggNTggMTI0IDE0NyA0MyAyNjMgMzkgMTE3IDEwOSAyODYgMzAwIDIxIDIwMSA0OCAyOTIgMTQ5IDIxNSAKKzg1IDE1NiAzMTIgMTkyIDMwNyAyMjIgMTMzIDI2MyA5OCAxMDIgMjQ4IDE3OCA5IDE4MyAxMzIgMTgyIDIwNCAxMTMgMjc5IDQwIDEwNCAKKzE2MyAzMDEgMjY1IDI3MCAyNDAgNDkgOCA5MiAyMDQgNTQgMjk0IDIxNyAyMTIgODkgMTM5IDY3IDEzNiAxMiA4NSAzMDkgMTM3IDI1NiAKKzE1NCAxODUgMjEwIDExNSAzMSAzMDQgMTA4IDE0NiA1NiAyMDkgMjQgMTAzIDE3NiAyNDcgMjUwIDMwNSAzMDcgMTAgNyAxMSAzMTAgNjUgCis5IDc5IDI1OCA2OSAzMDggMTUwIDIwMiAxMzkgMTcxIDI3NyAxMjUgMjk3IDI3MiAyMTQgMTU3IDg3IDcxIDcwIDgzIDI5IDE0IDY3IDc3IAorMjcgMzExIDUyIDYzIDk0IDI3MiAyIDMxIDIwMCAyODMgMzMgMTYwIDI0NiAyNjMgMjUxIDI5MiA0NSA3NCAyMSAyNjAgMzMgMTE1IDkwIAorMjg5IDI0NyAzOCAxMzAgNTUgMjIyIDI4NiA4OCAyMTEgMzE0IDIxMSAyNTUgMjI2IDExNiAxOCA0MiAxNzIgMTYwIDMwNSAyNDggMjUgCisxODQgMTE5IDIzNiAyMTkgMTI3IDIxMiAzMCAxNTQgMjQ0IDE5NSAyNTQgMjM5IDYyIDMgMjggMjM5IDEyMSAzMDQgMTY3IDEzMSAxOTUgCisxNTAgOTggMzE0IDEwNyA2NSAxNjIgMjIwIDU1IDI4MSAyNzEgMjI3IDEwMyA3MiA1NyAxMzcgOTMgMjggMzA4IF4KKzY3MCAwIDEwNSA3OCAxMDYgMjA0IDQwIDMxIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjkgNzQgMjc2IDI3NSAyMDggMTc0IDE0IDEyNiAKKzQ3IDIxOSAyMTggMTM4IDE1OCAxNCAxMzkgMzEwIDIwMyAyNTEgMjA1IDE2NiAxMSA1OSA1MiAyMTQgMjgyIDIwIDIxNCAzMDggMjc1IAorMTgyIDI4MiA0NiAxMDYgMjMwIDI0OSAzMTYgMjUyIDMxMSAzMDkgNzcgMjcxIDE1IDI5MSAxMzYgMjY5IDEwMCAxNjggMjQzIDE4MiAKKzMwOCAzMDEgNzQgMjUwIDY2IDI0MCAyMDAgMTk3IDE1NiA5OSAxNiA1NCAxMTYgOTYgMjEgMzE0IDMzIDEzNCAzNyAyMyAyMjkgMTU2IAorNzMgMTI0IDEzMiA5NiA4IDUxIDQ5IDE0NyAyODcgMTUgMjc4IDE5MCAxNCAxMTMgMTAxIDIzNSAyMzEgNzEgMTk2IDYzIDIxOSAyMDUgCisxOTIgMjIwIDI3IDcyIDMxIDIwNiAyODUgMTAwIDE1NSAyOTcgMjQ0IDQgMjM0IDY2IDI1MyAxNDYgMTgxIDE4OSAxNjYgMjQgNSAzNiAKKzIwMSAzMiAyOCAyMTEgMjI4IDE3IDE5MyAzMTMgMjI0IDIwMCAyMTAgMTAyIDgzIDMgMTIxIDc4IDkzIDI1OCA1NiA0NCAxNjUgMjE1IAorNzEgMjA5IDkgMTU3IDIzOCAyNTkgMTgyIDI5NSAzOCA5MCAyMTcgMzE2IDI3OCAyMDMgMjc3IDk3IDg4IDMwMiAxOTMgMjIgMTE2IDEyMiAKKzIzMCAyMzYgNyAyNjggNyAyNDIgMTE1IDMgOTUgMTg2IDEyNSAyMzggMjg1IDc0IDI2MyAxMiAyMjQgMTg3IDI2NCAxNjQgNTAgMjk5IAorMTU5IDEyNyAxMjcgMTUzIDQ1IDEzIDMzIDEyMSA5MSAzOSAyNDIgODkgMTExIDE3MyAxNjYgMzcgMzE0IDIwIDE4OCA1MyAzMDcgMTYyIAorMTQ4IDEyMiAyMDQgMjcgODUgMjk0IDE5MCAxIDE2NyAxMTcgMjQ4IDE2NCA2MyAyNDUgOTcgMTE0IDE5NCAxNjEgNDIgMjUwIDkyIDEzMiAKKzEyMiAyMTcgMjkwIDY5IDI4MSAyNTcgMjgwIDExOCAzNyAzNiAxNzUgOTQgNjAgMTkxIDk0IDQ3IDI0NSAxMTAgNjAgMTc4IDE0OCAxMDkgCisyNTggNDMgOTggMjI3IDIyOCA0IDI0NyAxMiAyMzcgMTMzIDI0OCAxNTEgMTE3IDI2MSAxMTAgNDcgMjMyIDE2NCA3NiAxOTEgODEgMTAxIAorMjYxIDEyMyAzMTAgMjE2IDE5NyAxNDMgMTUzIDMyIDY3IDQ5IDEzNCAyNCAzMSAyNDUgMTIzIDYgMTYyIDEzNSAxNzYgMjIwIDQwIDE4IAorMjg2IDIzOSAzNSA2MiAxMDYgMjE3IDMwMyAxNSAyNjUgMjQ0IDMwIDEyNiAzNCAyNzMgMjgwIDEwNSA5MSA1MiAxODggMjcgOTggMjQwIAorMTc0IDMwNSAyMzQgNzkgMTk5IDg0IDE2OCAyNTYgMTI4IDI5MiAyODggMTQxIDIxMiAxNyAyMDYgMjU5IDIwOCAxODcgMjc3IDExMCAzNCAKKzI4NiAyMjYgODkgMTI0IDExOSAxNTAgMjQgMTggMjk5IDE4NSAxOSA5NSAxNzMgMTc5IDMwMCAyNTIgNyAyNTUgNjEgMzA0IDgyIDI1MyAKKzEzMyAyMzUgMjA1IDE3OSAyNzQgNDMgODUgMjgxIDI0NCAxNyAxODAgNTAgMjg2IDIxMyAxNDMgMTQwIDg2IDgzIDE2IDY3IDYyIDgwIDggCis2NCAzMTIgMTMxIDMgODIgMjQwIDE4NyAyNTEgMjE4IDExMiAyNjYgOTIgMTE5IDE3NiAyMzMgMzAzIDIgMiAzMDYgNDMgNTkgMjYgNSAKKzMxNCA0NiA4MCAyMSAxMCAyOTYgMTE4IDI0IDQ0IDE5MSAxMDcgMzkgMjI5IDE0MyAxMjcgMTQwIDk5IDI5IDU0IDEyOSA0MiAyNzYgCiszMDEgMTAwIDE0MiAzNCAyNjAgMTcgMTY3IDEwNCAzMDIgMTgwIDc2IDE3OCAxMzUgMTYzIDI3NCA1NiAzMSAyMTkgMjMxIDg0IDE0MiAxIAorMjA2IDI3MiAxNTQgMTcxIDI2NCAxNzcgNDIgMjM3IDE0NiAxOTQgMTM1IDE1MCAxMSA3MiA0NCAxNTIgMjY5IDg3IDIyMiAyNTkgMTk1IAorMjQxIDI5MyA3NyAyODQgNyAyMjkgMTY5IDE5IDEwOCAxMTkgMTYzIDI4NyAyIDE1IDI1MiAyOTggNDYgOTMgMjg0IDMxMSAyODMgMTg1IAorMzIgNDEgMTU3IDIxMiA0IDI2MCA0IDIyMSAxMjAgMzE1IDExMyAxMTQgMTgxIDIxNSA1OCAyNjMgMjUgMTcwIDE3MSAyNTEgMjMxIDU4IAorMjUwIDc5IDE4NiAxMzggMTg0IDIyMyA2MSAxMyAyMCAxNzUgMTA3IDYgMTc1IDgxIDExNCAyMDcgMTA3IDI2IDI4MyAxNTkgMTQwIDczIAorMTM3IDc4IDgwIDMxMiAxMTggMTEgOTggMjUzIDEyMCAyODkgMjIxIDE0NiAyMDcgODEgODggMzE1IDEzOSA2IDE0OSAxODkgMTkyIDIzMyAKKzI5MCA1NiAxOCAyNzMgMjkzIDUxIDc1IDM5IDI1NSAzNSA0OSAxNjAgMjMzIDMxNiAyNjUgMjU3IDI5MyA2NCAyMSAyMyAyNDIgMTAyIAorNTcgMTExIDE5OSA1OCAyNzYgMjg4IDE1NCAxNTggMSAxOTMgOSAxNzAgMTg0IDE5NyAxNjkgNDUgNDEgMTgzIDEwNCAyODkgMjM0IDkyIAorMTQ1IDY4IDE1NSA2IDEzNiAyNDMgMjA4IDIwMCAyMjMgNDggMjEgMzYgMTg4IDQwIDQ0IDE3OCAxNjEgNTUgMTk2IDc2IDE2NSAxODkgCisxNzkgMjg3IDMwNiAyMyAyNjggMzExIDI5NiAxMzEgMTYgMjggMjI0IDE3NCAxIDE4MCA2MyAyMzIgMTUxIDEzMCAyMDcgOTQgMzQgMjk5IAorMTcyIDczIDExMSAxODYgMTEyIDI5MiAzMDEgODcgMTk2IDUwIDI3MyAyNjcgMTU5IDE1MyAyMzUgXgorNjU4IDEgMTE3IDYzIDE0MyAyNzQgNjcgMjkyIDIwMSAyNjAgMTQ3IDEwNCAzMTMgMTI2IDU2IDE2MyAyMDAgMTIzIDIyNSAxNiA5MCAKKzIzMCAyNjIgMjU4IDIzMiAyMSA1NyAzOSAyNjQgMjk2IDMxIDE0NyAzMDAgMjc4IDIxNiAyMTkgMzUgNzUgNTAgMTk3IDEzIDc4IDIyNSAKKzIzNyAyNjcgMTg1IDQxIDMwMiA5NSAxOTcgNzEgMjIwIDI3MCAxMzkgMjIzIDMgMTQ0IDI4OCAyNzMgMTkxIDIyOCAyOCAxMzUgMjk1IAorMjUzIDI2NSAxNzIgOTUgMSAxMDYgMTMwIDEwNyAyNjcgMjkgMzYgMjEyIDI5MSA2IDE5NiAyOTMgMTkgMTQyIDI3NSA4IDIwOSAyMzkgCisyODAgMTMxIDIzIDI5MSAxNjIgMTYxIDY0IDE0MiAxNCAxNTAgMjU0IDE0MSAyMzYgMjY4IDEyNiAyNzcgMjEgMTU1IDIyMSAzMDkgMTk4IAorMzA2IDI4NCAxMjQgMjY0IDc1IDE3MyAxOTIgMjQyIDIzNCAzNCAzIDIxIDI1MyA0NCAzNSAxNDAgMjYyIDYyIDIyNyAyNTAgMjEzIDE2NyAKKzMwIDUwIDk5IDE1MCAzMyA0IDI4MSAxNzAgODIgNTUgMTI0IDE0MSA0MCAyNjMgMzYgMTE0IDEwOSAyODAgMjk0IDE4IDIwMSAzOSAyODkgCisxNDkgMjE1IDgyIDE1MyAzMDYgMTg2IDMwMSAyMTkgMTMzIDI1NyA5NSA5OSAyNDggMTc1IDkgMTgzIDEyNiAxNzkgMTk4IDExMCAyNzkgCiszNCAxMDEgMTYzIDI5OCAyNjUgMjcwIDIzNyA0NiA4IDg2IDIwNCA1MSAyOTQgMjE0IDIwNiA4OSAxMzMgNjEgMTMwIDkgODUgMzAzIAorMTM0IDI1NiAxNTQgMTgyIDIxMCAxMTUgMjUgMzA0IDEwOCAxNDMgNTMgMjA5IDE4IDEwMyAxNzYgMjQ0IDI0NyAyOTkgMzA0IDEwIDEgOCAKKzMwNyA2MiA2IDczIDI1OCA2OSAzMDUgMTQ3IDIwMiAxMzYgMTcxIDI3NyAxMTkgMjk3IDI2NiAyMTEgMTU0IDg0IDY4IDcwIDgzIDI5IAorMTEgNjcgNzEgMjQgMzA1IDQ5IDYwIDkxIDI2OSAyIDIyIDE5NCAyODAgMzMgMTYwIDI0NiAyNjAgMjQ1IDI4NiAzOSA2OCAxMiAyNjAgCisyNCAxMDkgODQgMjg5IDI0NyAzOCAxMjcgNTUgMjIyIDI4MyA4NSAyMDUgMzExIDIxMSAyNTIgMjI2IDExMyAxMiAzOSAxNjYgMTU0IAorMzA1IDI0NSAyNSAxODEgMTEzIDIzMyAyMTYgMTIxIDIxMiAzMCAxNDggMjQxIDE5NSAyNTQgMjM5IDU5IDMxMyAyOCAyMzMgMTE4IDI5OCAKKzE2NyAxMjggMTkyIDE0NCA5MiAzMDggMTAxIDY1IDE1NiAyMjAgNDkgMjgxIDI2OCAyMjQgMTAwIDY2IDU3IDEzNyA4NyAyMiAyOTIgCisxMDMgNzggMTAyIDIwMiAzOCAyOSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjY1IDc0IDI3MiAyNzUgMjA0IDE3NCAxMCAxMjQgNDMgMjE3IAorMjE4IDEzNCAxNTggMTIgMTM3IDMwOCAxOTkgMjQ3IDIwMSAxNjIgNSA1OSA1MiAyMTAgMjc4IDIwIDIxNCAzMDQgMjcxIDE3OCAyODIgCis0NiAxMDYgMjI4IDI0OSAzMTIgMjUwIDMxMSAzMDkgNzUgMjcxIDE1IDI4NyAxMzYgMjY5IDEwMCAxNjQgMjM5IDE4MiAzMDggMjk3IDcwIAorMjQ2IDY0IDI0MCAxOTYgMTk1IDE1NiA5NyAxNCA1MiAxMTIgOTYgMTUgMzEyIDI5IDEzNCAzNSAxNyAyMjcgMTUyIDcxIDEyMiAxMjggCis5NCAyIDQ3IDQ3IDE0NSAyODcgMTMgMjc0IDE5MCA4IDExMSA5NyAyMzUgMjI5IDY3IDE5NCA1OSAyMTUgMjA1IDE4OCAyMTYgMjMgNzAgCisyNSAyMDYgMjg1IDk4IDE1MSAyOTMgMjQwIDIzMCA2NiAyNTMgMTQyIDE3NyAxODUgMTY0IDE4IDUgMzQgMTk5IDI2IDI0IDIwNyAyMjYgCisxNSAxODkgMzEzIDIyNCAxOTggMjA4IDEwMiA3OSAzIDExOSA3NiA4OSAyNTYgNTYgNDAgMTY1IDIxMyA2OSAyMDcgNSAxNTcgMjM0IAorMjU1IDE4MCAyOTUgMzIgODggMjE3IDMxNiAyNzYgMjAzIDI3MyA5MyA4NiAzMDIgMTkzIDIwIDExNiAxMjIgMjI2IDIzNiA3IDI2OCAzIAorMjQyIDExMSAzMTggOTMgMTg0IDEyNSAyMzggMjgxIDcyIDI1OSAxMCAyMjIgMTg1IDI2MiAxNjAgNTAgMjk1IDE1NSAxMjMgMTI3IDE1MyAKKzQ1IDkgMjcgMTIxIDg5IDM1IDIzOCA4NSAxMDcgMTY5IDE2NiAzMSAzMTAgMTYgMTg4IDUzIDMwNyAxNjAgMTQ4IDExOCAyMDAgMjUgODMgCisyOTAgMTg4IDMxNCAxNjUgMTE1IDI0NiAxNjIgNjMgMjQxIDk3IDExMiAxOTQgMTU3IDM4IDI1MCA5MCAxMzIgMTIwIDIxMyAyOTAgNjUgCisyNzkgMjU1IDI3OCAxMTggMzcgMzAgMTczIDk0IDYwIDE4OSA5MiA0NyAyNDMgMTEwIDU4IDE3NiAxNDYgMTA1IDI1NCA0MyA5NCAyMjMgCisyMjQgMiAyNDMgMTIgMjM1IDEzMSAyNDQgMTQ5IDExNyAyNTkgMTA4IDQ1IDIzMCAxNjQgNzYgMTg3IDc5IDEwMSAyNjEgMTIxIDMxMCAKKzIxMiAxOTMgMTQzIDE1MSAzMiA2MyA0NSAxMzIgMjIgMzEgMjQ1IDEyMyA0IDE1OCAxMzUgMTcyIDIxOCAzNiAxNiAyODYgMjM1IDMzIAorNjIgMTA0IDIxNSAzMDMgMTEgMjYxIDI0NCAyNiAxMjIgMzAgMjcxIDI3NiAxMDUgOTEgNDggMTg0IDI3IDk2IDIzNiAxNzAgMzAzIDIzMiAKKzc5IDE5OSA4NCAxNjYgMjUyIDEyOCAyOTAgMjgzIF4KKzY0OSAxIDEzMyAyMDggMTcgMTk4IDI1OSAyMDQgMTg3IDI3MyAxMDIgMzAgMjgyIDIxOCA4NSAxMTYgMTExIDE0NiAxNiAxOCAyOTkgCisxNzcgMTEgODcgMTY5IDE3OSAyOTIgMjUyIDMgMjU1IDUzIDI5NiA4MiAyNDkgMTI1IDIyNyAyMDEgMTcxIDI2NiAzOSA3NyAyNzMgMjQwIAorOSAxNzIgNDYgMjc4IDIwNSAxMzkgMTM2IDg2IDc5IDE2IDYzIDU0IDc2IDU2IDMxMiAxMjMgMzEyIDc4IDIzNiAxNzkgMjQ3IDIxMCAKKzEwNCAyNjYgODQgMTE5IDE3MiAyMjkgMjk5IDMxNSAzMTEgMjk4IDMxIDUxIDI2IDMxNCAzMTQgMzggODAgMTMgMiAyOTIgMTE0IDI0IAorNDQgMTkxIDEwMyAyNyAyMjEgMTM1IDEyMyAxNDAgOTkgMjUgMzE3IDU0IDEyMSA0MiAyNzYgMzAxIDkyIDEzNCAyMiAyNTYgNSAxNTkgCisxMDAgMjk4IDE4MCA3MiAxNzAgMTMxIDE1NSAyNzAgNTIgMjMgMjE5IDIzMSA3NiAxMzggMSAyMDIgMjcyIDE1MCAxNjcgMjY0IDE2OSAKKzMwIDIzNyAxNDIgMTg2IDEyNyAxNDIgMyA3MiAzMiAxNTIgMjY1IDg3IDIxNCAyNTUgMTkxIDI0MSAyOTMgNzcgMjg0IDMxNiAyMjkgCisxNjEgMTUgMTAwIDExNSAxNTkgMjgzIDMxOSAzIDI0NCAyOTggNDIgOTMgMjgwIDMwMyAyODMgMTgxIDI0IDMzIDE0OSAyMDQgNCAyNTIgCiszMTMgMjEzIDEyMCAzMDcgMTEzIDEwNiAxODEgMjA3IDU0IDI1OSAyMSAxNjYgMTYzIDI1MSAyMjMgNTAgMjQ2IDc1IDE4NiAxMzggMTg0IAorMjIzIDYxIDEgOCAxNzUgMTA3IDYgMTY3IDgxIDExNCAyMDcgOTkgMTQgMjc1IDE1NSAxMzIgNzMgMTMzIDcwIDcyIDMwOCAxMTAgMTEgCis5OCAyNDUgMTEyIDI4MSAyMjEgMTQ2IDE5OSA3MyA4OCAzMTUgMTM5IDMxOSAxNDEgMTg5IDE4OCAyMjUgMjg2IDQ4IDEwIDI3MyAyODUgCis1MSA3MSAzNSAyNDcgMjcgNDkgMTU2IDIzMyAzMTIgMjYxIDI1NyAyODkgNjQgMTcgMTUgMjM4IDk0IDQ5IDExMSAxOTEgNTggMjcyIAorMjg4IDE0NiAxNTQgMzE4IDE4OSA1IDE3MCAxNzYgMTk3IDE2OSA0MSAzMTMgNDEgMTc1IDk2IDI4NSAyMzQgOTIgMTQ1IDY0IDE1NSAKKzMxNSAxMjggMjQzIDIwOCAyMDAgMjE5IDQ4IDIxIDI4IDE4NCA0MCA0MCAxNzggMTU3IDQ3IDE5NiA2OCAxNTcgMTg1IDE3NSAyNzkgCiszMDYgMjMgMjY0IDMwNyAyOTYgMTI3IDQgMjQgMjE2IDE3MCAzMTQgMTc2IDU5IDIyNCAxNTEgMTMwIDIwMyA4NiAzNCAyOTUgMTY0IDY1IAorMTA3IDE3OCAxMTIgMjkyIDI5NyA3OSAxODggNDIgMjY1IDI1OSAxNTkgMTQ1IDE5IDExMyA2MSAxMzkgMjc0IDY1IDI5MCAxOTkgMjU2IAorMTQzIDEwNCAzMTEgMTI2IDUyIDE2MSAxOTggMTIxIDIyNSAxMCA5MCAyMzAgMjYyIDI1NCAyMjggMTUgNTUgMzkgMjYwIDI5NCAyOSAKKzE0NyAzMDAgMjc4IDIxNiAyMTUgMzUgNzUgNDggMTkzIDcgNzQgMjIzIDIzMyAyNjcgMTg1IDM3IDMwMCA5NSAxOTUgNzEgMjE4IDI2OCAKKzEzNyAyMjEgMzE4IDE0NCAyODQgMjcxIDE4NyAyMjggMjYgMTMxIDI5MyAyNDkgMjYzIDE3MiA5MSAzMjAgMTA0IDEyOCAxMDUgMjYzIAorMjMgMzYgMjEwIDI4NyAxOTQgMjkxIDEzIDE0MCAyNzEgNCAyMDcgMjM3IDI4MCAxMzEgMTcgMjkxIDE2MiAxNjEgNjAgMTQyIDE0IDE0OCAKKzI1MiAxNDEgMjM0IDI2NCAxMjQgMjc1IDE3IDE1MyAyMTcgMzA1IDE5OCAzMDQgMjgwIDEyMCAyNjIgNzEgMTczIDE5MiAyMzggMjMyIAorMjggMSAxOSAyNTEgNDAgMjkgMTM2IDI1OCA1OCAyMjcgMjQ2IDIxMyAxNjUgMjggNDYgOTUgMTUwIDI5IDMxOSAyNzkgMTY4IDc4IDUzIAorMTI0IDEzNyAzOCAyNjMgMzQgMTEyIDEwOSAyNzYgMjkwIDE2IDIwMSAzMyAyODcgMTQ5IDIxNSA4MCAxNTEgMzAyIDE4MiAyOTcgMjE3IAorMTMzIDI1MyA5MyA5NyAyNDggMTczIDkgMTgzIDEyMiAxNzcgMTk0IDEwOCAyNzkgMzAgOTkgMTYzIDI5NiAyNjUgMjcwIDIzNSA0NCA4IAorODIgMjA0IDQ5IDI5NCAyMTIgMjAyIDg5IDEyOSA1NyAxMjYgNyA4NSAyOTkgMTMyIDI1NiAxNTQgMTgwIDIxMCAxMTUgMjEgMzA0IDEwOCAKKzE0MSA1MSAyMDkgMTQgMTAzIDE3NiAyNDIgMjQ1IDI5NSAzMDIgMTAgMzE4IDYgMzA1IDYwIDQgNjkgMjU4IDY5IDMwMyAxNDUgMjAyIAorMTM0IDE3MSAyNzcgMTE1IDI5NyAyNjIgMjA5IDE1MiA4MiA2NiA3MCA4MyAyOSA5IDY3IDY3IDIyIDMwMSA0NyA1OCA4OSAyNjcgMiAxNiAKKzE5MCAyNzggMzMgMTYwIDI0NiAyNTggMjQxIDI4MiAzNSA2NCA2IDI2MCAxOCAxMDUgODAgMjg5IDI0NyAzOCAxMjUgNTUgMjIyIDI4MSAKKzgzIDIwMSAzMDkgMjExIDI1MCAyMjYgMTExIDggMzcgMTYyIDE1MCAzMDUgMjQzIDI1IDE3OSAxMDkgMjMxIDIxNCAxMTcgMjEyIDMwIAorMTQ0IDIzOSAxOTUgMjU0IDIzOSA1NyAzMDkgMjggMjI5IDExNiAyOTQgMTY3IDEyNiAxOTAgMTQwIDg4IDMwNCA5NyA2NSAxNTIgMjIwIAorNDUgMjgxIDE3OCBeCis8RAorCitIPlNIUyBUeXBlIDMgU3RyaW5nczxICitEPgorNDAgMSAxOCAyMCAxMSAxNSAxMSAxMSA5IDYgMiAxNSA1IDE3IDEyIDEgOSAxIDMgNSAxMSA3IDIgMiA2IDE4IDIgOSAxMSA4IDE2IDExIAorMTYgMTUgMTggMTggMyAyMCAyIDE3IDE3IDE2IF4KKzxECisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9zaGEtMS9ieXRlLWhhc2hlcy5zaGExIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3NoYS0xL2J5dGUtaGFzaGVzLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzM2MyYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS9zaGEtMS9ieXRlLWhhc2hlcy5zaGExCkBAIC0wLDAgKzEsMzQzIEBACisjICBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciAiU0hBLTEgVGVzdCIKKyMgIFNIQSB0ZXN0cyBhcmUgY29uZmlndXJlZCBmb3IgQllURSBvcmllbnRlZCBpbXBsZW1lbnRhdGlvbnMKK0g+U0hTIFR5cGUgMSBIYXNoZXM8SAorRD4KK0RBMzlBM0VFNUU2QjRCMEQzMjU1QkZFRjk1NjAxODkwQUZEODA3MDkgXgorM0NERjI5MzZEQTJGQzU1NkJGQTUzM0FCMUVCNTlDRTcxMEFDODBFNSBeCisxOUMxRTIwNDhGQTczOTNDRkJGMkQzMTBBRDgyMDlFQzExRDk5NkU1IF4KK0NBNzc1RDhDODBGQUE2Rjg3RkE2MkJFQ0E2Q0E2MDg5RDYzQjU2RTUgXgorNzFBQzk3M0QwRTRCNTBBRTlFNTA0M0ZGNEQ2MTUzODExMjBBMjVBMCBeCitBNkI1QjlGODU0Q0ZCNzY3MDFDM0JEREJGMzc0QjMwOTRFQTQ5Q0JBIF4KK0Q4N0EwRUU3NEU0QjlBRDcyRTY4NDdDODdCREVFQjNEMDc4NDQzODAgXgorMTk3NkI4REQ1MDlGRTY2QkYwOUM5QThEMzM1MzRENEVGNEY2M0JGRCBeCis1QTc4RjQzOUI2REI4NDVCQjhBNTU4RTRDRUIxMDZDRDdCN0ZGNzgzIF4KK0Y4NzFCQ0U2MjQzNkMxRTI4MDM1NzQxNjY5NUVFMkVGOUI4MzY5NUMgXgorNjJCMjQzRDFCNzgwRTFEMzFDRjFCQTJERTNGMDFDNzJBRUVBMEU0NyBeCisxNjk4OTk0QTI3MzQwNDg0OEU1NkU3RkRBNDQ1N0I1OTAwREUxMzQyIF4KKzA1NkY0Q0RDMDI3OTFEQTdFRDFFQjIzMDMzMTRGNzY2NzUxOERFRUYgXgorOUZFMkRBOTY3QkQ4NDQxRUVBMUMzMkRGNjhEREFBOURDMUZDOEU0QiBeCis3M0EzMTc3N0I0QUNFOTM4NEVGQThCQkVBRDQ1QzUxQTcxQUJBNkREIF4KKzNGOUQ3QzRFMjM4NEVEREFCRkY1REQ4QTMxRTIzREUzRDAzRjQyQUMgXgorNDgxNDkwOEY3MkI5M0ZGRDAxMTEzNUJFRTM0N0RFOUEwOERBODM4RiBeCiswOTc4Mzc0QjY3QTQxMkEzMTAyQzVBQTBCMTBFMUE2NTk2RkM2OEVCIF4KKzQ0QUQ2Q0I2MThCRDkzNTQ2MEQ0NkQzRjkyMUQ4N0I5OUFCOTFDMUUgXgorMDJEQzk4OUFGMjY1QjA5Q0Y4NDg1NjQwODQyMTI4RENGOTVFOUYzOSBeCis2NzUwN0I4RDQ5N0IzNUQ2RTk5RkMwMTk3NkQ3M0Y1NEFFQ0E3NUNGIF4KKzFFQUUwMzczQzEzMTdDQjYwQzM2QTQyQTg2N0I3MTYwMzlENDQxRjUgXgorOUMzODM0NTg5RTVCRkZBQzlGNTA5NTBFMDE5OUIzRUMyNjIwQkVDOCBeCisyMDlGN0FCQzdGM0I4NzhFRTQ2Q0RGM0ExRkJCOUMyMUMzNDc0RjMyIF4KKzA1RkMwNTRCMDBEOTc3NTNBOUIzRTJEQThGQkJBM0VFODA4Q0VGMjIgXgorMEM0OTgwRUEzQTQ2Qzc1N0RGQkZDNUJBQTM4QUM2QzhFNzJERENFNyBeCis5NkE0NjBEMjk3MkQyNzY5MjhCNjk4NjQ0NDVCRUEzNTNCRENGRkQyIF4KK0YzRUYwNEQ4RkE4QzZGQTk4NTBGMzk0QTQ1NTRDMDgwOTU2RkE2NEIgXgorRjJBMzFEODc1RDFEN0IzMDg3NEQ0MTZDNEQyRUE2QkFGMEZGQkFGRSBeCitGNDk0MkQzQjlFOTU4OERDRkRDNjMxMkE4NERGNzVEMDVGMTExQzIwIF4KKzMxMDIwN0RGMzVCMDE0RTQ2NzZEMzA4MDZGQTM0NDI0ODEzNzM0REQgXgorNERBMTk1NUIyRkE3QzdFNzRFM0Y0N0Q3MzYwQ0U1MzBCQkY1N0NBMyBeCis3NEM0QkM1QjI2RkI0QTA4NjAyRDQwQ0NFQzZDNjE2MUI2QzExNDc4IF4KKzBCMTAzQ0UyOTczMzhERkM3Mzk1Rjc3MTVFRTQ3NTM5QjU1NkREQjYgXgorRUZDNzJEOTlFM0QyMzExQ0UxNDE5MEMwQjcyNkJEQzY4RjRCMDgyMSBeCis2NjBFREFDMEE4RjRDRTMzREEwRDhEQkFFNTk3NjUwRTk3Njg3MjUwIF4KK0ZFMEE1NUE5ODhCM0I5Mzk0NkE2M0VCMzZCMjM3ODVBNUU2RUZDM0UgXgorMENCREYyQTU3ODFDNTlGOTA3NTEzMTQ3QTBERTNDQzc3NEI1NEJGMyBeCis2NjNFNDBGRUU1QTQ0QkZDQjFDOTlFQTU5MzVBNkI1QkM5RjU4M0IwIF4KKzAwMTYyMTM0MjU2OTUyREQ5QUU2QjUxRUZCMTU5QjM1QzNDMTM4QzcgXgorQ0VCODhFNDczNkUzNTQ0MTZFMjAxMEZDMTA2MUIzQjUzQjgxNjY0QiBeCitBNkEyQzRCNkJDQzQxRERDNjcyNzhGM0RGNEQ4RDBCOURENzc4NEVGIF4KK0MyM0QwODNDRDg4MjBCNTc4MDBBODY5RjVGMjYxRDQ1RTAyREM1NUQgXgorRThBQzMxOTI3Qjc4RERFQzQxQTMxQ0E3QTQ0RUI3MTc3MTY1RTdBQiBeCitFODY0RUM1REJBQjBGOUZGNjk4NEFCNkFENDNBOEM5QjgxQ0M5RjlDIF4KK0NGRUQ2MjY5MDY5NDE3QTg0RDZERTIzNDcyMjBGNEI4NThCQ0Q1MzAgXgorRDkyMTdCRkI0NkM5NjM0ODcyMkMzNzgzRDI5RDRCMUEzRkVEQTM4QyBeCitERUMyNEU1NTU0Rjc5Njk3MjE4RDMxNzMxNUZBOTg2MjI5Q0UzMzUwIF4KKzgzQTA5OURGNzA3MTQzN0JBNTQ5NUE1QjBCRkJGRUZFMUMwRUY3RjMgXgorQUEzMTk4RTMwODkxQTgzRTMzQ0UzQkZBMDU4N0Q4NkExOTdENEY4MCBeCis5QjZBQ0JFQjQ5ODlDQkVFNzAxNUM3RDUxNUE3NTY3MkZGREUzNDQyIF4KK0IwMjFFQjA4QTQzNkIwMjY1OEVBQTdCQTNDODhENDlGMTIxOUMwMzUgXgorQ0FFMzZEQUI4QUVBMjlGNjJFMDg1NUQ5Q0IzQ0Q4RTdEMzkwOTRCMSBeCiswMkRFOEJBNjk5RjNDMUIwQ0I1QUQ4OUEwMUYyMzQ2RTYzMDQ1OUQ3IF4KKzg4MDIxNDU4ODQ3REQzOUI0NDk1MzY4RjcyNTQ5NDE4NTlGQUQ0NEIgXgorOTFBMTY1Mjk1QzY2NkZFODVDMkFEQkM1QTEwMzI5REFGMENCODFBMCBeCis0QjMxMzEyRUFGOEI1MDY4MTExNTFBOURCRDE2Mjk2MUY3NTQ4QzRCIF4KKzNGRTcwOTcxQjIwNTU4RjdFOUJBQzMwM0VEMkJDMTRCREU2NTlBNjIgXgorOTNGQjc2OUQ1QkY0OUQ2QzU2MzY4NTk1NEUyQUVDQzAyNERDMDJENiBeCitCQzg4MjdDM0U2MTRENTE1RTgzREVBNTAzOTg5REVBNEZEQTZFQTEzIF4KK0U4Mzg2OERCRTRBMzg5QUI0OEU2MUNGQzRFRDg5NEYzMkFFMTEyQUMgXgorNTVDOTU0NTlDREU0QjMzNzkxQjRCMkJDQUFGODQwOTMwQUYzRjNCRCBeCiszNkJCMEUyQkE0MzhBM0UwMzIxNEQ5RUQyQjI4QTRENUM1NzhGQ0FBIF4KKzNBQ0JGODc0MTk5NzYzRUJBMjBGMzc4OURGQzU5NTcyQUNBNENGMzMgXgorODZCRTAzN0M0RDUwOUM5MjAyMDIwNzY3RDg2MERBQjAzOUNBREFDRSBeCis1MUI1N0Q3MDgwQTg3Mzk0RUVDM0VCMkUwQjI0MkU1NTNGMjgyN0M5IF4KKzFFRkJGQTc4ODY2MzE1Q0U2QTcxRTQ1N0YzQTc1MEEzOEZBQ0FCNDEgXgorNTdENkNCNDFBRUVDMjAyMzZGMzY1QjNBNDkwQzYxRDBDRkEzOTYxMSBeCitDNTMyQ0I2NEI0QkE4MjYzNzJCQ0NGMkI0QjU3OTNENUI4OEJCNzE1IF4KKzE1ODMzQjU2MzEwMzI2NjNFNzgzNjg2QTIwOUM2QTJCNDdBMTA4MEUgXgorRDA0RjIwNDNDOTZFMTBDRDgzQjU3NEIxRTFDMjE3MDUyQ0Q0QTZCMiBeCitFODg4MjYyN0M2NERCNzQzRjdEQjhCNDQxM0REMDMzRkM2M0JFQjIwIF4KK0NEMkQzMjI4NkI4ODY3QkMxMjRBMEFGMjIzNkZDNzRCRTM2MjIxOTkgXgorMDE5QjcwRDc0NTM3NTA5MUVENUM3QjIxODQ0NUVDOTg2RDBGNUE4MiBeCitFNUZGNUZFQzFEQURCQUVEMDJCRjJEQUQ0MDI2QkU2QTk2QjNGMkFGIF4KKzZGNEUyM0IzRjJFMkMwNjhEMTM5MjFGRTRFNUUwNTNGRkVENEUxNDYgXgorMjVFMTc5NjAyQTU3NUM5MTUwNjc1NjZGQkE2REE5MzBFOTdGODY3OCBeCis2N0RFRDBFNjhFMjM1QzhBNTIzRTA1MUU4NjEwOEVFQjc1N0VGQkZEIF4KK0FGNzg1MzZFQTgzQzgyMjc5Njc0NTU1NkQ2MkEzRUU4MkM3QkUwOTggXgorNjREN0FDNTJFNDc4MzRCRTcyNDU1RjZDNjQzMjVGOUMzNThCNjEwRCBeCis5RDQ4NjZCQUEzNjM5QzEzRTU0MUYyNTBGRkEzRDhCQzE1N0E0OTFGIF4KKzJFMjU4ODExOTYxRDNFQjg3NkYzMEU3MDE5MjQxQTAxRjk1MTdCRUMgXgorOEUwRUJDNDg3MTQ2RjgzQkM5MDc3QTE2MzBFMEZCM0FCM0M4OUU2MyBeCitDRTg5NTM3NDFGRkYzNDI1RDIzMTFGQkJGNEFCNDgxQjY2OURFRjcwIF4KKzc4OUQxRDJEQUI1MjA4NkJEOTBDMEUxMzdFMjUxNUVEOUM2QjU5QjUgXgorQjc2Q0U3NDcyNzAwREQ2OEQ2MzI4QjdBQTg0MzdGQjA1MUQxNTc0NSBeCitGMjE4NjY5QjU5NkM1RkZCMEIxQzE0QkQwM0M0NjdGQzg3MzIzMEEwIF4KKzFGRjNCREJFMEQ1MDRDQjBDREZBQjE3RTZDMzdBQkE2QjNDRkZERUQgXgorMkYzQ0JBQ0JCMTQ0MDVBNDY1MkVENTI3OTNDMTgxNEZEOEM0RkNFMCBeCis5ODJDOEFCNkNFMTY0RjQ4MTkxNUFGNTlBQUVEOUZGRjJBMzkxNzUyIF4KKzVDRDkyMDEyRDQ4OEEwN0VDRTBFNDc5MDFEMEUwODNCNkJEOTNFM0YgXgorNjk2MDNGRUMwMjkyMDg1MUQ0QjNCODc4MkUwN0I5MkJCMjk2MzAwOSBeCiszRTkwRjc2NDM3QjFFQTQ0Q0Y5OEEwOEQ4M0VBMjRDRUNGNkU2MTkxIF4KKzM0QzA5RjEwN0M0MkQ5OTBFQjQ4ODFENEJGMkRERENBQjAxNTYzQUUgXgorNDc0QkUwRTU4OTJFQjIzODIxMDlCRkM1RTNDODI0OUE5MjgzQjAzRCBeCitBMDRCNEY3NTA1MTc4NjY4MjQ4MzI1MjQzOEY2QTc1QkY0NzA1RUM2IF4KK0JFODhBNjcxNjA4M0VCNTBFRDk0MTY3MTlENkEyNDc2NjEyOTkzODMgXgorQzY3RTM4NzE3RkVFMUE1RjY1RUM2QzdDN0M0MkFGQzAwQ0QzN0YwNCBeCis5NTlBQzQwODIzODhFMTlFOUJFNURFNTcxQzA0N0VGMTBDMTc0QThEIF4KK0JBQTdBQTdCNzc1M0ZBMEFCREM0QTU0MTg0MkI1RDIzOEQ5NDlGMEEgXgorMzUxMzk0RENFQkMwODE1NUQxMDBGQ0Q0ODg1NzhFNkFFNzFEMEU5QyBeCitBQjhCRTk0QzVBRjYwRDk0NzdFRjEyNTJENjA0RTU4RTI3QjJBOUVFIF4KKzM0MjlFQzc0QTY5NUZERDMyMjhGMTUyNTY0OTUyMzA4QUZFMDY4MEEgXgorOTA3RkE0NkMwMjlCQzY3RUFBOEU0RjQ2RTNDMkEyMzJGODVCRDEyMiBeCisyNjQ0Qzg3RDFGQkJCQzBGQzhENjVGNjRCQ0EyNDkyREExNUJBQUU0IF4KKzExMEEzRUVCNDA4NzU2RTJFODFBQkFGNEM1RENENEQ0QzZBRkNGNkQgXgorQ0Q0RkRDMzVGQUM3RTFBREI1REU0MEY0N0YyNTZFRjc0RDU4NDk1OSBeCis4RTZFMjczMjA4QUMyNTZGOUVDQ0YyOTZGM0Y1QTM3QkM4QTBGOUY3IF4KK0ZFMDYwNjEwMEJEQkMyNjhEQjM5QjUwM0UwRkRGRTM3NjYxODU4MjggXgorNkM2M0MzRTU4MDQ3QkNEQjM1QTE3Rjc0RUVCQTRFOUIxNDQyMDgwOSBeCitCQ0MyQkQzMDVGMEJDREE4Q0YyRDQ3OEVGOUZFMDgwNDg2Q0IyNjVGIF4KK0NFNTIyM0ZEM0REOTIwQTNCNjY2NDgxRDU2MjVCMTY0NTdEQ0I1RTggXgorOTQ4ODg2Nzc2RTQyRTRGNUZBRTFCMkQwQzkwNkFDMzc1OUUzRjhCMCBeCis0QzEyQTUxRkNGRTI0MkY4MzJFM0Q3MzI5MzA0QjExQjc1MTYxRUZCIF4KK0M1NEJERDIwNTA1MDREOTJGNTUxRDM3OEFENUZDNzJDOUVEMDM5MzIgXgorOEY1M0U4RkE3OUVBMDlGRDFCNjgyQUY1RUQxNTE1RUNBOTY1NjA0QyBeCisyRDdFMTdGNjI5NDUyNENFNzhCMzNFQUI3MkNERDA4RTVGRjZFMzEzIF4KKzY0NTgyQjRCNTdGNzgyQzkzMDJCRkU3RDA3Rjc0QUExNzY2MjdBM0EgXgorNkQ4ODc5NUI3MUQzRTM4NkJCRDFFQjgzMEZCOUYxNjFCQTk4ODY5RiBeCis4NkFEMzRBNjQ2M0YxMkNFRTZERTk1OTZBQkE3MkYwREYxMzk3RkQxIF4KKzdFQjQ2Njg1QTU3QzBENDY2MTUyREMzMzlDODEyMjU0OEM3NTdFRDEgXgorRTdBOThGQjA2OTI2ODQwNTQ0MDdDQzIyMUFCQzYwQzE5OUQ2RjUyQSBeCiszNERGMTMwNjY2MjIwNkZEMEE1RkMyOTY5QTRCRUVDNEVCMDE5N0Y3IF4KKzU2Q0Y3RUJGMDhEMTBGMENCOUZFN0VFM0I2M0E1QzNBMDJCQ0I0NTAgXgorM0JBRTVDQjgyMjY2NDIwODhEQTc2MEE2Rjc4QjBDRjhFRERFQTlGMSBeCis2NDc1REY2ODFFMDYxRkE1MDY2NzJDMjdDQkFCRkE5QUE2RERGRjYyIF4KKzc5RDgxOTkxRkE0RTQ5NTdDODA2Mjc1MzQzOURCRkQ0N0JCQjI3N0QgXgorQkFFMjI0NDc3QjIwMzAyRTg4MUY1MjQ5RjUyRUM2QzM0REE4RUNFRiBeCitFREU0REVCNDI5M0NGRTQxMzhDMkMwNTZCN0M0NkZGODIxQ0MwQUNDIF4KKzxECisKK0g+U0hTIFR5cGUgMiBIYXNoZXM8SAorRD4KK0E3NzFGQTVDODEyQkQwQzk1OTZEODY5RUM5OUU0RjRBQzk4OEIxM0YgXgorRTk5RDU2NjIxMkJCQkNFRUU5MDM5NDZGNjEwMEM5Qzk2MDM5QThGNCBeCitCNDhDRTZCMUQxMzkwM0UzOTI1QUUwQzg4Q0I5MzEzODhDMDEzRjlDIF4KK0U2NDdENUJBRjY3MEQ0QkYzQUZDMEE2QjcyQTI0MjRCMEM2NEYxOTQgXgorNjVDMUNEOTMyQTA2QjA1Q0QwQjQzQUZCM0JDNzg5MUY2QkNFRjQ1QyBeCis3MEZGQUUzNTNBNUNEMEY4QTY1QThCMjc0NkQwRjE2MjgxQjI1RUM3IF4KK0NDODIyMUYyQjgyOUI4Q0YzOTY0NkJGNDY4ODgzMTdDM0VCMzc4RUEgXgorMjZBQ0NDMkQ2RDUxRkY3QkYzRTU4OTU1ODg5MDc3NjUxMTFCQjY5QiBeCiswMTA3MjkxNUI4RTg2OEQ5QjI4RTc1OUNGMkJDMUFFQTRCQjkyMTY1IF4KKzMwMTYxMTU3MTFENzQyMzZBREYwQzM3MUU0Nzk5MkY4N0E0Mjg1OTggXgorQkYzMDQxNzk5OUMxMzY4RjAwOEMxRjE5RkVDQTREMThBNUUxQzNDOSBeCis2MkJBNDkwODcxODVGMjc0MkMyNkUxQzFGNDg0NDExMjE3OEJGNjczIF4KK0UxRjZCOTUzNkYzODRERDMwOTgyODVCQkZENDk1QTQ3NDE0MERDNUEgXgorQjUyMkRBRTFENjc3MjZFQkE3QzQxMzZENEUyRjZENkQ2NDVBQzQzRSBeCitFOUEwMjFDM0VCMEI5RjJDNzEwNTU0RDRCRjIxQjE5Rjc4RTA5NDc4IF4KK0RGMTM1NzMxODhGM0JGNzA1RTY5N0EzRTFGNTgwMTQ1RjIxODMzNzcgXgorMTg4ODM1Q0ZFNTJFQ0ZBMEM0MTM1QzI4MjVGMjQ1REMyOTk3Mzk3MCBeCis0MUI2MTVBMzRFRTJDRUM5RDg0QTkxQjE0MUNGQUIxMTU4MjE5NTBCIF4KK0FCM0RENjIyMUQyQUZFNjYxM0I4MTVEQTFDMzg5RUVDNzRBQTAzMzcgXgorMDcwNkQ0MTRCNEFBN0ZCNEE5MDUxQUE3MEQ2ODU2QTcyNjQwNTRGQiBeCiszQ0JGODE1MUYzQTAwQjFENUE4MDlDQkI4QzRGMzEzNTA1NUE2QkQxIF4KK0RBNUQ2QTAzMTkyNzJCQkNDRUE2M0FDRkE2Nzk5NzU2RkZEQTY4NDAgXgorRkI0NDI5Qzk1RjYyNzdCMzQ2RDNCMzg5NDEzNzU4REZGRkVFREM5OCBeCisyQzZFMzBEOUM4OTVCNDJEQ0NDRkM4NEM5MDZFQzg4QzA5QjIwREUxIF4KKzNERTMxODlBNUUxOUYyMjVDRENFMjU0REZGMjNEQUNEMjJDNjEzNjMgXgorOTM1MzBBOUJDOUE4MTdGNjkyMjUxOEE3M0ExNTA1QzQxMUQwNURBMiBeCitFMzEzNTQzNDVGODMyRDMxRTA1QzFCODQyRDQwNUQ0QkQ0NTg4RUM4IF4KKzNGRjc2OTU3RTgwQjYwQ0Y3NEQwMTVBRDQzMUZDQTE0N0IzQUYyMzIgXgorMzRBRTNCODA2QkUxNDNBODREQ0U4MkU0QjgzMEVCN0QzRDJCQUM2OSBeCitENzQ0N0U1M0Q2NkJCNUU0QzI2RThCNDFGODNFRkQxMDdCRjRBRERBIF4KKzc3REQyQTQ0ODI3MDVCQzJFOURDOTZFQzBBMTMzOTU3NzFBQzg1MEMgXgorRUFBMTQ2NURCMUY1OURFM0YyNUVCODYyOTYwMkI1NjhFNjkzQkI1NyBeCis5MzI5RDVCNDBFMERDNDNBQTI1RkVENjlBMEZBOUMyMTFBOTQ4NDExIF4KK0U5NEMwQjZBQTYyQUEwOEM2MjVGQUY4MTdEREY4RjUxRUM2NDUyNzMgXgorN0ZGMDJCOTA5RDgyQUQ2NjhFMzFFNTQ3RTBGQjY2Q0I4RTIxMzc3MSBeCis1QkIzNTcwODU4RkExNzQ0MTIzQkFDMjg3M0IwQkI5ODEwRjUzRkExIF4KKzkwNUY0Mzk0MEIzNTkxQ0UzOUQxMTQ1QUNCMUVDQTgwQUI1RTQzQ0QgXgorMzM2Qzc5RkJEODJGMzNFNDkwQzU3N0UzRjc5MUMzQ0JGRTg0MkFGRiBeCis1QzZEMDdBNkI0NEY3QTc1QTY0RjZDRTU5MkYzQkFFOTFFMDIyMjEwIF4KKzdFMEQzRTlEMzMxMjdGNEEzMEVCOEQ5QzEzNEE1ODQwOUZBODY5NUIgXgorOUE1RjUwREZDRkIxOTI4NjIwNkMyMjkwMTlGMEFCRjI1MjgzMDI4QyBeCitEQ0E3MzdFMjY5RjlEODYyNkQ0ODg5ODhDOTk2RTA2QjM1MkMwNzA4IF4KK0I4RkZDMUQ0OTcyRkNFNjMyNDFFMEU3Nzg1MEFDNDZEREU3NURCRkEgXgorRTlDOUJGNDFDODU0OTM1NDE1MUI5NzcwMDNDRTFEODMwQkU2NjdEQiBeCiswOTQyOTA4OTYwQjU0Rjk2Q0I0MzQ1MkU1ODNGNEY5Q0I2NkUzOThBIF4KK0ZDRTM0MDUxQzM0RDRCODFCODVEREM0QjU0M0NERTgwMDdFMjg0QjMgXgorNjFFODkxNjUzMjUwMzYyN0Y0MDI0RDEzODg0NjQwQTQ2RjFENjFENCBeCitGMDA4RDVENzg1M0I2QTE3Qjc0NjZDRDlFMThCRDEzNUU1MjBGQUY0IF4KK0JEOEQyRTg3M0NGNjU5QjVDNzdBQUMxNjE2ODI3RUY4QTNCMUEzQjMgXgorQjI1QTA0REQ0MjUzMDJFRDIxMUExQzI0MTJEMjQxMEZBMTBDNjNCNiBeCitBNDA0RTIxNTg4MTIzRTA4OTM3MThCNEI0NEU5MTQxNEE3ODVCOTFGIF4KK0ExRTEzQkM1NUJGNkRBRDgzQ0YzQUFCREEzMjg3QUQ2ODY4MUVBNjQgXgorRDVGRDM1RkZBQkVENjczM0M5MjM2NTkyOURGMEZCNENBRTg2NEQxNSBeCitDMTJFOUMyODBFRTlDMDc5RTA1MDZGRjg5RjlCMjA1MzZFMEE4M0VGIF4KK0UyMjc2OURDMDA3NDhBOUJCRDZDMDVCQkM4RTgxRjJDRDFEQzRFMkQgXgorRjI5ODM1QTkzNDc1NzQwRTg4OEU4QzE0MzE4RjNDQTQ1QTNDODYwNiBeCisxQTFENzdDNkQwRjk3QzRCNjIwRkFBOTBGM0Y4NjQ0NDA4RTRCMTNEIF4KKzRFQzg0ODcwRTlCREQyNUY1MjNDNkRGQjZFREQ2MDUwNTJDQTRFQUEgXgorRDY4OTUxM0ZFRDA4QjgwQzM5QjY3MzcxOTU5QkM0RTNGRUNCMDUzNyBeCitDNEZFRDU4RjIwOUZDM0MzNEFEMTlGODZBNkRBQ0FEQzg2QzA0RDMzIF4KKzA1MTg4OEM2RDAwMDI5QzE3NkRFNzkyQjg0REVDRTJEQzFDNzRCMDAgXgorMUEzNTQwQkVFMDU1MTg1MDU4Mjc5NTRGNThCNzUxQzQ3NUFFRUNFMCBeCitERkExOTE4MDM1OUQ1QTdBMzhFODQyRjE3MjM1OUNBRjQyMDhGQzA1IF4KKzdCMEZBODRFQkJDRkY3RDdGNDUwMEY3M0Q3OTY2MEM0QTM0MzFCNjcgXgorOUU4ODYwODFDOUFDQUFEMEY5N0IxMDgxMEQxREU2RkNEQ0U2QjVGNCBeCitBNEQ0NkU0QkEwQUU0QjAxMkY3NUIxQjUwRDA1MzRENTc4QUU5Q0I2IF4KKzYzNDJCMTk5RUU2NEM3QjJDOUNCQ0Q0RjJEQ0I2NUFDRUY1MTUxNkYgXgorQUFCRkQ2MzY4OEVCNjc4MzU3ODY5MTMwMDgzRTFCNTJGNkVBODYxRCBeCitGNzMyQjczNzJEQUY0NDgwMUY4MUVGRkUzMTA4NzI2MjM5ODM3OTM2IF4KKzVFOTM0N0ZFNDU3NENEQ0I4MDI4MUVEMDkyMTkxMTk5QkFERDdCNDIgXgorRDU3NzZCN0RGRkY3NUMxMzU4QUJEQkJCM0YyN0EyMEJCNkNBN0M1NSBeCiswMjJCN0FEQTQ3MkZCN0E5REE5MjE5NjIxQzlDNUY1NjNEMzc5MkY2IF4KKzdGMURFNEVDQTIwMzYyREE2MjQ2NTNEMjI1QTVCM0Y3OTY0QTlGRjIgXgorQ0EwRjJCMUJGQjQ0NjlDMTFFRDAwNkE5OTQ3MzRGMEYyRjVFRkQxNyBeCis4MzNENjNGNUMyRUEwQ0Q0M0VDMTVGMkI5REQ5N0ZGMTJCMDMwNDc5IF4KKzE0RkQzNTYxOTA0MTZDMDA1OTJCODZGRjdDQTUwQjYyMkY4NTU5M0EgXgorNEFCNkI1N0VEREVGMUNFOTM1NjIyRjkzNUMxNjE5QUU3QzE2NjdENiBeCitCNDU2QTZBOTY4QUNENjZDQUE5NzRGOTZBOUE5MTZFNzAwQUEzQzVEIF4KK0ZEMUMyNTdGRTA0NkIyQTI3RTJGMENENTVFRDJERUNBODQ1RjAxRDcgXgorNjZFMEQwMTc4MEYxMDYzRTI5MjlFQUFENzQ4MjZCQzY0MDYwRTM4QyBeCitBODQ3OERGNDA2RjE3OUZENEVGOTdGNDU3NEQ3Rjk5RUExQ0U5RUI4IF4KKzI0OEU1OENGMDlBMzcyMTE0RkMyRjkzQjA5QzVGQzE0RjNEMDA1OUUgXgorRjE1NzY3REU5MTc5NkE2ODE2OTc3RUZBNEZDRUQ0QjdGRDlCOEE1NyBeCiszNkE2QkM1RTY4MEUxNTY3NUQ5Njk2MzM4Qzg4QjM2MjQ4QkJCQUY0IF4KKzRERUE2MjUxQjJBNkRGMDE3QTgwOTNBQjA2NkVFMzg2M0E0RUMzNjkgXgorRDMwRTcwRTM1N0Q1N0UzRDgyQ0E1NTRCOEEzRDU4REZGNTI4RkE5NCBeCis3MENBODREODI3RjdGRDYxNDQ2MjMzRjg4Q0YyRjk5MEIwRjNFMkFBIF4KKzhENTAwQzlDRkRFMDI4ODUzMEEyMTA2QjcwQkVEMzkzMjZDNTJDM0MgXgorRjNENEQxMzlFREZDMjQ1OTYzNzdCQzk3QTk2RkI3NjIxRjI3RkZDNyBeCis1NTA5QkFGRkFDNkQ1MDc4NjBDRUZDNUFCNTgzMkNCNjNDRDRCNjg3IF4KKzBDMEFFQTBDMkZEN0E2MjBDNzc4NjZCMUExNzc0ODFFMjZCNEY1OTIgXgorMTQ5MTc2MDA3RkVFNThBNTkxRTNGMDBGOERCNjU4QjYwNUY4MzkwQyBeCisxN0MwRDdCMDI1NjE1OUYzNjI2Nzg2RkZEQjIwMjM3QUUxNTRGQTg0IF4KKzc0MUE1ODYxOEFCRUIxRDk4M0Q2N0FGRENCQzQ5QUEzOTdBM0I4RTAgXgorQjczOEQ2QjM0MDlFQjlFRDJGMTcxOUI4NEQxM0Y3QzM2MTY5Q0RFQyBeCiszRDMzREUzMUY2NDA1NUQzQjEyOEFDOUE2QUEzRjkyREZENEY1MzMwIF4KK0I2OTI1RjRERjk0OTQ5Qjg4NDRDODY3NDI4QkEzREVERjRDRjJCNTEgXgorQ0Y1RTcyNTYyOTJBQkVDNDMxRDhFOEI5Q0JFQUYyMkFGMDcyMzc3RSBeCis5NzVEQ0U5NDkwMjkyMzk3N0YxMjlDMEU0QUNGNDBBRDI4RERCOUFBIF4KKzMzM0IwMjU5QjE4Q0U2NEQ2QjUyQ0Y1NjNERDMwNDFFNUY2M0E1MTYgXgorPEQKKworSD5TSFMgVHlwZSAzIEhhc2hlczxICitEPgorODBFMDQ0NzAzQTg4MEMyMEVDNDFGNjQ1MTIwQThBNUI1RDE5NEVDRSBeCitFMTQyODI5Q0EwOEZDOTc4N0YxN0FBMTZDRTcyNzM5NjE2OUIyNzEzIF4KKzZBMkJBRjYyNDY5RDMxMUY5MjU3QTA3MjdGNTJDN0VBQTg3Q0NFQjQgXgorMzYyRTNFNzEzNkNBNjExRDdGQkY2ODdEM0JCREM1NENEQTY0ODQzRiBeCitGNTkwMEFEQzYyMjNBNUQyNEE3NTI2QUJGQzYwRkE4RTJENTlBNUFCIF4KK0FEMENBQzZBMjFENUIxMDgzM0RERTdGQTg1OTI3RDc0RURBMTQyQTkgXgorNDdBRDMzN0VBRkZEQzE3N0FBRjdDQkQwMzVCRTZGMzk4QjlEMDUzNiBeCis5Q0Y1ODU5NURGODA4NzI1MzVCQ0M3QzA1NkUyMjM1NDZGMEJCNEVFIF4KKzcxNTFDRUIxOTE4Mjc4Q0VEMjkwMkIxRDY2M0Q1OTZGOEQxQjk4NkYgXgorQUREQzlGMDlBQTQwMjZFRjZDNEI3RjFBODREM0ExM0I0Q0RDNjVCMyBeCis5MjFGRTc4QTg2M0EzMTdCMUZBMUZCM0NBM0JFMTk0OERFN0VGNzU0IF4KKzY0QkUxMDczMkQ3MUQ1MkNFOEE0ODZEQTIzRTZCNDUzREY3QzZGQkQgXgorNEE0NTA2NTk0NzBERDc1OUFCRkFFMUQ3Mzk3MkE2RDJFNjNBQzE2QyBeCiswRDY2NUU0QkJGMzBCN0VBQjk1NUJERTg0NzU5RTE4NUVFQ0FCNENCIF4KKzBDMUI4RUU5NEQ2MUNERDA4MzdFQUVEOUZFMzNERTRBODMzNEI1OTYgXgorRDkzQkZFMkE2MjI3QTRCRjlCN0M2MUVCQ0U0QThDREUxMzE1OTNGRSBeCitCREE4ODNGODA0QjQ3MEM5MEJENkFDNDkwREZDMzRFQkMyN0Y5NjQ4IF4KKzQ2QTA5NjkzNzM1NTIyMTM2MzI1OTFDNTIwMzBDMzhFNURCREM0OUUgXgorNDc4MTI4OUU0OEI5MTBDNTUwREMyM0NBN0QzQUY1MzI0QzAzNTMyRCBeCis2OTNBMzRDRkNEREVEMEYzQUM3MkU3MTk3RkNFOUJCNjZBOEUzOTgxIF4KK0FFMDg4QUYxRDg4NjUxNDA5NjNCM0FCRkI2M0UzMkUwNENEMTUwNkYgXgorQURGMEY4RjFEODVDQTk3NTg2RjVEQzZEQzVGRDExRkEzOTI3MEY1NSBeCitFNDg0RjVBRDg2QzVGNEQwOUUzNjZBREY2RTBERTczNDQ5Rjk3QjI4IF4KKzgxQzQ5ODQyQkEzRDcwNzJGQjQyMjg4RTAzQ0U3MzdBMjY3MkMwOTEgXgorRjZDQzcxQUQ4OTdDMjNBMTY4MzU0OTBERUQyODlCRkQ0NTUwMEFCMCBeCisyM0U3MUFFRDYyRkU4RTI4RjM0RjU4RTdGRTU1OTRFQzVFQjA0ODZDIF4KKzkyQkE3OTM0QUE1ODY3RUU1Mjk2MEY0RTBFREZCOTBBQTdCNjkzMDUgXgorQzNEMUNDOENCRDFCNkZGRUUwRDkwQ0U5NjJDRDlDMDlBQjE1NDhBQSBeCiszQ0UzN0E1ODNCNzFBNkE3N0JFMzI1MDY2QTBGMDBDNUQxMURGQzNFIF4KKzc2RUY1RDIzNkUxMDQyRDM1NkEzMjM0QTQyMkMwOTJGODYwMDMwNjQgXgorOEMzRjcwMzQzNkM2Qzg4MkU2MDI2MzU0MEE4RTRDM0U1NjQ2REMxNSBeCis2MTM4RjlGM0FCNDNCOTg4REQzODU3NDIyQ0NCMzA0MzUyNDU5RjQwIF4KK0I4MTJERTk4Nzc1QjQ2OTBCNEZDMkVDRkNBQjYxQzczQzcyNzFEQzcgXgorMDY2NjA5ODVDRDgwRDQ4RTdCOUY4ODQ1NUI0MjMzOTI0QzNCNjRCQiBeCis3NkFCNEI2Mzc4RDZGNjM0OTlBOTRFQjY3RUIxQ0IzMUFGRjhENzc1IF4KK0YzMUY2QjBCRTdBQjA1OUExRjU5QTQ2NDgxOTY3RTg4MzkyOTc5RTYgXgorMEMxNjM4NDk4RkJCN0RCOTYwMEI5OEI0QjIyRUY4NUUwRkUyNDVGQiBeCis1NjA3QzZBRjYwMDkzOTczNjc5NUFDNTIzRkE0M0I3MzZGNDFBMTE4IF4KKzhBMDMyNDQ4NjZCREQyMUI5RDhBODJFOTg0MzZDODk0RkFEODZFQ0MgXgorOEE3NUJGRDkxMUFGODczMDNCOUI4RkI3QTFBNDdDQ0E1MkQzRDk4QSBeCisxNkYwRjNCNUQzNzQxMTIzNkExRTNENkIxRURBQjc0Q0RBMjVFRDRCIF4KK0FDNzJCRjQ1NDc3NDgxRjU4QTMwMjYyOERDNTI5OUZGQTMyRTdDOUYgXgorNzRDRkZENTg4MUY3NUFDMjA3MjZFMTQ0N0RDRjdGNDcwMjQzODBFRiBeCis1QkZCRUNFRUNCQzI3REEwNTcyOUM0RDFBQzhDMTI4NkVBNkRDRUM5IF4KKzAxMkFBQ0JDMDU3OUZBNENCNEYxMDdFOUE5QUQxQTg2QUQyRjZBNEQgXgorRjdENTUyQ0JDNUVGOTBGMUE1NzkzODhCNUE4QTlFQzcxRUI2NzY4MSBeCisxMEM3MDExNUM0QzM0NzUzMjc0QkZFRDQ3N0RGMDE0NDBBNjdBMzYxIF4KKzA3OEQyRkFDRDI5M0I2QjYyMTlEODk4OTlDMTZBQTFBQThFM0RFODIgXgorODNDNkJGOUZCMEQzMDkxQURGMzc0RUJGQTBBNjk5MTZGMTdFNkQyNiBeCisyQ0RCMTkyNERBNjJBQjY0QzAwN0M2NTA1RkY2NTdFNEFEREVBOUMxIF4KK0U5NUQyMDlCQ0I5ODY0QjA3NkZGNERGQ0E4RjhCRDc1RDYyRDFCNDggXgorNjMyODI0Q0Y1MDI1RjhGOTBBRDI5MjNCRERGNDQ5NTUwRDY0QzBGNSBeCiswMkIxQzBCNDFGQzI3RUM1QTMyRTU4NkYxQUM0ODBCRjAwNjFFNTZBIF4KKzI4MTU2QkM2NzY5QUUzOTBCRjMyQzY1MTJDNDYxNjkxODFFMTUzNkQgXgorRjczMEU2RTI4N0Q5OTJFN0YzRTAxM0I2RjFFMDg4RjBCOUM0MTU5OCBeCitCMDU2QTZBODMyRkE1RkU5NjRFRjc3RkYzRTBCRTFDMzJFMEQ1OEMwIF4KK0Q1QjNEMTlBRkJCNDhGQjU2QkE2RDQ0QTgyREU2QkQwOERCMjA4REUgXgorMDIxNUFENzlCRDZCODAyM0MwNUZEMkY4OTY2MjExODk3REY2MzM3QSBeCitFQzRDRjM4QzI0NEVCNjUyNkE0NEY3MDU3MDkyNTI0NzE0NURBOENBIF4KK0MwRDkzMTI2MkVDRTkzREE1QTZBQkM4OUNENkFEMzE2MkVBNkIwOUUgXgorNkJCNDhGQUMyNkFBMkI0ODU5QkJERUZDRkI1M0FFNEQxRDlBMDM0MCBeCis1ODYxMUQ0Mzc0MUU2N0E3RjBEQTlDQjMzN0E1OURDRDFFQkU3NThFIF4KKzdDMkFFQzIxNkFGMjMxNTA5RTQ3QjdFRUQwNkJCMTc4NTk4MTJCN0UgXgorRjYwRUU1REJGNEE3QTY3NkVDOThCM0REQjFDREQ2Q0RGM0NEQTMzQiBeCiswNDkyRTU5QjFGNEM5NEU5N0YyOUEyNkMzRUU3RDU3RTFCMEZERDcyIF4KKzRGQ0Y1NDlEOTAyRDlCRTExMDFBNzU2REI5RTQ1NDE1RkI2MUJDRDIgXgorOTVDNzFEMjZBRDZCMzhDQzc3MTM3NkI0QTRGOTYyRjEyRTFFM0Q0RiBeCitGNkEyNDQ5RTc3M0M3MkZCODg2QjNDNDNFMkIzMEVDMkExQjc0NTRBIF4KK0NERTg2Njk1RTAwQUVDOUE1REI2RkREQjVENUE1OTM0NDQ4RDU4RTAgXgorNTAyMzE4QTc1OEZBQkZGNkFDNTM4NDRFOUUyQkNEMTU5QzY3ODUxMCBeCis1ODlEMjk1MTQ4Rjk1Rjc1REFFOTY0REQ3NDNGRTk4MUZBMjM2RDRFIF4KKzc5NzNERDMzQUUzNTk5QTU1NkJBQ0M3N0U4NjU2RTc4MkUwMjlFRkYgXgorOUY1QkU0M0FBREQ0M0M2REIzODgzQzlEQTRCNTJFMUE1MDI1N0FFRSBeCis0NTQyODlEOEZGQjIzN0E1NkQ1MjE0RUFFODhGMEE5RDMyOEZFQTFBIF4KKzdFNjg2QjM2NTk1QkVCNEMwRDQ1MjhGRjk2MEVEQjU1MDg4QTAyOEQgXgorRjk3ODlEMUVGMTlBMDA4NEFDMEU5RjQzQTRCQzBFRTA0Nzg5MzlFRiBeCisyRjMyQjBFN0NDOEJFMTlDMzI1NTQ1QzgxNkU3NzA1NkQ3QkJFNzBGIF4KKzZCMTYxNzc0NkYwNzNDRkNEMkNFQkNBRkJCRTZGRDBFMjhFRDJENTYgXgorQ0Y4RDJFQTM4ODhBRDc2NzYxNzk5MzgzRTVBMTU5NzlGNkRCN0E4OCBeCis1NTdBRjZEOUQ1OTQ3MjAzQzYwRTk4QzlBNzlCOTJCOEJEMDg1RTJCIF4KK0M2MUEyMTc0MjNERTY4RUQ2Q0QzNEM5MTc1NkM4REQzQTY1MEEyQTIgXgorNzNGM0Y3OUMxNTFCNkMxQkQ5MzY5RURCMjZCOTMyQzIzNjJCMDU5MyBeCiszNjQxNDFFNUZCQ0RFODNGMjEwQzVCQkJFQjY4MTBGNjI5OURFMTRCIF4KK0Y4MDZCRUNEMDI1RDI2NEZENTlFOTNEOUUzNjA2QTY3NEM0MEYyMTYgXgorRTBDNzYxQTU3RjAwQ0JGQjA3RDQ5QkNCMDM0QzM2QTcxMjJGNEM1QiBeCis1RDM4MzEwNDRCOUUwMDMyRkJFM0MzNDI1RkZEMTM2OThGNDEzQjMzIF4KKzdFQjFBQjQxRTk5OTc3NTNDNUQ1MzBERjExOEU3MUU3MkQ3Qjg2RkMgXgorQ0MwNTNFQTE1NTYyNjlEN0U4QkNCQTMwQjIwOEZDQkYwRUUyRUU2NCBeCitBNTc3MzlCMURENDFFN0RDMEM0MEQ2QjYxNTlBN0U3M0NFMjc0OEFBIF4KKzkwREE1MjdDOURCOUFDQzJGRDUzMEQ1NjBBMkYxMTkxQTgwRDA1NjcgXgorNkFDMUYyQTBCOENBMEU1QUJDOUZERjFBRENFNTg4RkJERjVDQzUzRSBeCis0M0MxQTBBMEVFNDE2M0VDOTI5NzI2OTg5RjkyQjAzNjM5QjIzM0FCIF4KKzg5MjdGMjk5NDYyNDEzQUMyOUE3NDA4MEU1NEQ4RUUyREI3MTY1RTcgXgorMEM4RDdFMjIyMjZEOTFCNDIzRTc4MUI1MDhGMzE1MTdFQUFCNjA3QiBeCis3Mjg2RTIwRDdGMDhEMThBODkzMjU0RkJEM0NDODMzRjc5NzNEQ0FGIF4KKzBDQjhDMjM1OTI4QjhFOTM2QzQzQjhGMjlFRjM3NThCOUZENTRBN0IgXgorRjY3QzI0Q0MyM0U0NDBDQTNGMjA2Q0VFQjU1MDRFQ0E1NENENUNBMyBeCitENzhBMjVERUFBMUU3QURBRERCM0MxNDVFRDBFNTI2M0JBNEYyOTEwIF4KKzAwQUE2ODE3NEQyOTQ5MkM1NzhBQzg1M0ZGQ0Q1NTkwODI5MkQ0MUEgXgorRDU1NzBFRURCMDlBNjJBNTk0OEY3RjMxMUY3RUQ1RUYyNDdGOUFEOSBeCis8RAorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvc2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3NoYS0xL2J5dGUtbWVzc2FnZXMuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ5MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3NoYS0xL2J5dGUtbWVzc2FnZXMuc2hhMQpAQCAtMCwwICsxLDIyOTQgQEAKKyMgIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yICJTSEEtMSBUZXN0IgorIyAgU0hBIHRlc3RzIGFyZSBjb25maWd1cmVkIGZvciBCWVRFIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIFN0cmluZ3M8SAorRD4KKzAgMSBeCis1IDAgMiAxIDIgMSAyIF4KKzUgMCAxIDMgNCA0IDQgXgorNyAwIDQgMyA0IDQgMSA0IDQgXgorMTAgMCA0IDEgNSAzIDQgNCAzIDEgMyA0IF4KKzEwIDAgMyAxIDYgNSA1IDEgMyA2IDYgNCBeCisxMyAxIDMgMiA1IDMgMyAzIDQgNiA2IDEgNCA2IDIgXgorMTYgMSAzIDUgNSAxIDIgMSAzIDMgNiAzIDUgMiAzIDUgNyAyIF4KKzE1IDEgOCAxIDUgMyAyIDcgNCA1IDYgNyAzIDMgMSA2IDMgXgorMTUgMSA0IDYgOCAyIDEgNCAyIDUgMSA2IDggOCA2IDQgNyBeCisxOCAxIDEgMiA3IDMgOCA2IDcgNSA0IDMgNCAzIDUgMyAzIDIgNiA4IF4KKzE2IDAgOSA4IDEgOCAxIDcgNiA3IDcgMSAyIDYgOSA1IDQgNyBeCisxOCAwIDcgMSA3IDMgOSA0IDcgNyA1IDIgOCAxIDcgOCAyIDcgMiA5IF4KKzE5IDEgMiAzIDEgOCA4IDYgOSAxMCAzIDEwIDggOSAyIDQgMSA1IDEgNSA5IF4KKzE5IDEgOCA1IDQgOCAxIDMgOSA1IDcgNyAyIDcgMiA3IDggNyA0IDggMTAgXgorMjAgMSAxIDkgNyA0IDEgNCA1IDEgMTAgOCA2IDQgNCA5IDkgOSA4IDIgOSAxMCBeCisxOSAxIDExIDYgNyA3IDIgNiAyIDYgMTAgNiA5IDEwIDUgMTEgMSA2IDggMTEgNCBeCisyMiAwIDEwIDUgMTAgMyA3IDggOSA5IDEgMSAxIDEwIDIgMSA1IDEwIDIgOSA5IDkgNyA4IF4KKzIxIDAgMSAxMCAxIDYgOSA0IDIgNSAyIDExIDggMTIgMTIgOSA4IDEgMyAxMCA3IDExIDEyIF4KKzI0IDEgMyA5IDUgMTIgMyA0IDIgOSAxMiAxMSA2IDYgMSAxIDkgNSA5IDEgNCA5IDQgMTAgOCA5IF4KKzI1IDEgMyAyIDMgMTEgMSAxMiA1IDYgMiA3IDggNCA4IDggOSA5IDggNCA5IDEgNCA4IDEwIDkgOSBeCisyMyAwIDExIDEwIDcgMTAgMTAgNiAxMCA5IDQgNSAxMCA1IDggNCAxIDEwIDEyIDQgNiAxIDggMTEgNiBeCisyMiAwIDEyIDggMTAgNCAzIDggNSA1IDcgMTEgMTMgMTEgMTIgMTEgNCAxMiAzIDYgNSAxMSAxMCA1IF4KKzI2IDEgMTAgOSA2IDkgNyAyIDEwIDQgNCA1IDUgMiAxMiAxMyA1IDMgMSAxMCAxIDQgNyA4IDEzIDEzIDEyIDkgXgorMzEgMCAyIDYgNSA0IDcgMyAxMCA2IDEzIDYgMyA5IDYgMiAxMCA1IDMgOCA0IDEgMTEgMyA1IDMgNyAxMSAxIDEyIDkgMTIgNSBeCisyNyAxIDE0IDUgMSAzIDcgMiAzIDkgMyA0IDE0IDQgNCAxMCA4IDUgMTQgMSAxMSAxMiAxMiAxMCA0IDEzIDcgMTEgOSBeCiszMCAxIDQgOSA1IDUgOCA5IDUgMTAgNCAyIDQgNyA5IDkgNiAzIDUgMSA4IDMgMiAxMyAzIDE0IDkgOCA5IDEwIDE0IDEwIF4KKzI3IDAgMTIgOSA1IDggNyAyIDE0IDEyIDMgOCAxNCA2IDYgNCA3IDUgNyAxMCA3IDExIDEwIDEgOSA2IDcgMTIgMTQgXgorMjQgMCAxMiA5IDkgMiAxMSAxMyAxMiAxMSAxMSA2IDE0IDEzIDEwIDUgNiA4IDEwIDQgMyAxMSAxMSAxNCA1IDE0IF4KKzI0IDAgMTUgNCA1IDMgOCAxMiAxNSA4IDE0IDE1IDkgMTIgMTIgMyAxMCAxMyA2IDExIDEwIDQgMTMgMTQgOCA4IF4KKzI4IDEgMSA4IDEgNSAxMSA0IDkgMTIgNCAxMyAxNSA1IDkgMTEgNyAxNCAxMSAxIDExIDcgOCA4IDExIDEgMTMgMTUgMTIgMTMgXgorMzIgMSA1IDggMyA4IDEwIDcgOCAxIDUgMTMgMTIgMTQgNSAzIDYgNCAxMiAxNSA2IDYgMTAgMTEgMTMgOSAxIDExIDYgMTAgMyA3IDE0IAorMiBeCiszMSAwIDEwIDMgNSAxIDE0IDExIDExIDE2IDEgMiAyIDExIDYgMTMgMTUgMTIgNiA1IDE2IDIgMTQgMiAxMCAxMiAyIDUgNSA2IDEwIDEzIAorMTUgXgorMzQgMCAzIDEwIDggMTYgOSA1IDEyIDE1IDQgMTEgMTMgMyA2IDUgMTAgOCAxIDMgOSAzIDExIDEgMiAxNiAxMiAxMCA2IDEgOSAxIDE2IAorNSA2IDE0IF4KKzMwIDEgMSAxMiA0IDQgMiAxNSAxMyAxNSAxMSAxNSA1IDExIDkgNyAxNSAxNiA2IDE2IDEyIDMgMiAxMCAxNiA1IDUgNyAxIDcgMTEgMTYgCiteCiszNCAwIDcgOSAxMSAyIDUgNSA1IDQgMTMgMTMgMTQgNCA3IDEyIDYgNCA4IDIgOSA5IDEzIDEzIDMgMyA2IDcgMTYgNyA2IDE1IDUgOCAKKzE1IDE0IF4KKzM2IDEgNCA2IDE2IDE1IDExIDE0IDE0IDQgNyAxMCAzIDQgMTAgMyA2IDcgMTQgNCA2IDYgNSAyIDcgOCAxNiAyIDEyIDE2IDEwIDE0IDMgCisyIDMgNyAxNCAzIF4KKzMyIDAgMTUgMTAgOSAxIDE0IDEwIDE0IDYgNiAxNiAzIDIgMyA4IDMgMTIgOCAxMSAxNyAzIDkgNyAxNiAxNCA0IDExIDE1IDUgMTMgOSAKKzUgMTcgXgorMzAgMCAxNyAxNyAxMyA4IDIgNiA4IDE2IDEgMTIgNSAxNyAyIDkgOCAxMCAxMyAxNCAxMSAxNyAxMiA1IDE0IDkgMTEgOSAxMSA0IDExIAorMTIgXgorMzAgMSAxNiA2IDEwIDUgOCAzIDE3IDE2IDE0IDEgMTUgMTUgMTUgNiAxMyAyIDExIDYgMTMgMTEgMTMgNCA2IDcgMTEgMTEgMTIgMTYgCisxMyAxNiBeCiszMyAxIDE2IDE2IDE0IDE2IDIgNCAxNiAxMSA2IDE1IDcgNCAxNyA2IDUgNyA2IDMgMTQgMTYgNSAxNyAxMSAxMyAxIDEgMTQgMTMgMyA2IAorMTQgNSAxNiBeCiszOSAxIDIgMTYgMTMgNyA4IDYgMiAxNSAxIDkgMTIgNCA0IDExIDEzIDcgMiAxMSA5IDE4IDQgNSA0IDggMiAxNCA5IDkgMSA4IDEzIDExIAorMTUgOCA1IDkgMTAgMTYgNyBeCiszNCAwIDIgNyAxIDEgMTcgMTMgNiAxMSAxMCA4IDUgMTIgMTUgNiAxNSAxMCAxMiA0IDE4IDEgMiA4IDExIDEyIDE2IDEwIDEyIDE4IDExIAorMTYgMTIgMTEgMTcgNiBeCiszNCAxIDQgNyAxMyA3IDEwIDcgMTAgNiAxIDEyIDcgMTggMTEgMTggMiAxMCAxNSAxMCAxNCA4IDE4IDkgOSAxMiAxMiAzIDEzIDEyIDYgCis0IDkgMTcgMTMgMTcgXgorNDAgMCA1IDcgMyAyIDEgMTcgMTQgNCAxNiA2IDEzIDEgMTMgNiA2IDEwIDEgMyAxOCAzIDExIDcgOSA1IDcgMTEgMTcgMSA5IDE2IDUgCisxNSAxMCAxNyAzIDggMTUgMTcgOCAxMiBeCis0MCAwIDExIDMgMTUgMTcgMTEgMSAxIDQgMyAxNCAxOCA0IDIgMTggOCAxNSA2IDQgNiAzIDE1IDExIDE2IDEwIDE3IDE3IDkgNiAzIDIgCis2IDE2IDQgOSAxMiA2IDggMSAxMSAxNyBeCiszNyAxIDIgMTkgMTIgOCAxNiAxNCAyIDkgMTYgMiA2IDYgNyA5IDEwIDkgMTEgOSAxNCAxMSAxNSA1IDE2IDkgMiAxNyAyIDggMTUgOCA0IAorMyAxNCAxNCAxNiAxNiAxMiBeCiszNyAxIDExIDEwIDE2IDEyIDExIDcgMTQgMTQgMTQgNiAxMCAxMCAxIDYgMTMgMTkgNSA2IDQgNyAxMiAxMiAxMCA1IDEwIDE1IDE1IDggCis1IDEzIDE3IDEzIDUgNiAxNCAxIDE5IF4KKzM4IDEgMiA2IDUgMTcgOSAxMSAxOCAxOCA4IDYgMTMgMTUgMyAzIDE1IDUgMTMgMTggMyAyIDUgNSAxNCA3IDEzIDQgMTcgNyAyIDE3IDMgCisxOCAxNSA3IDE1IDE2IDE4IDExIF4KKzM4IDEgMTIgOCA2IDMgMTcgMTIgMTMgMTkgMTUgOSA3IDE3IDE2IDE1IDMgMTEgMTEgNSAyIDEzIDE5IDE2IDIgNCAxNiA3IDggMSAyIDkgCisxNyAxMiAzIDUgMTggMTkgMTEgOSBeCiszOSAxIDE0IDE2IDE0IDggOSAxNiA1IDEgNiAzIDE3IDE4IDE2IDkgMSAxNSA5IDEwIDkgMTkgMSAzIDMgMjAgMTEgMTMgMTcgMSAxOSA4IAorMyA0IDMgNyAxIDE0IDE5IDE5IDE5IF4KKzM3IDEgMTggMTMgMTEgNSAxOCA0IDE5IDEwIDYgMTkgMTEgMTcgMTAgMTAgNyA5IDEzIDE2IDkgMTAgMTggNCAxMiA1IDE2IDUgMjAgMTIgCiszIDggMTAgMSAxOCAxIDYgMjAgMTQgXgorMzYgMCA4IDkgNiAxMiAxMSA3IDcgMyAxNyAxMyA2IDIwIDE3IDkgMjAgMTYgMTAgMTIgMTcgOCAxMSA4IDExIDEwIDUgMTAgMTQgMTggOCAKKzE5IDkgMTIgMTIgMiAyMCAxOSBeCiszOSAwIDEyIDE2IDIwIDMgOSA5IDE5IDE3IDEzIDEzIDQgMTcgMiAxMSA3IDE0IDMgNiAxNiAxMyAxMCAxMyA1IDE2IDEwIDIgOCAyIDE3IAorMTkgNCAxNyA3IDE5IDYgOSAxNSAxNSA2IF4KKzQzIDAgNyAyIDE4IDUgNyAxOCA1IDIgMTUgNyAxMSAxMCA5IDMgMiAxNCAxOSAzIDExIDggMTggMTUgNSAzIDUgMTIgMTUgMTYgMTAgMTcgCis3IDE5IDE2IDIgMSAxNiA2IDMgMTkgMTIgNSAxOCAxNiBeCis0OSAxIDkgMTEgMiAxIDEyIDExIDE0IDEyIDE0IDEwIDQgMTEgNiA4IDE2IDcgNSAxMSAyMCA4IDE3IDQgMTQgNCAxNSAzIDIgMiA0IDMgCisyIDMgMTQgMTUgMTAgMiAxMiA3IDMgNyAyMCAyMCAxOSAxMCAyIDMgMSAxMCAyMCBeCiszNiAwIDE5IDIwIDEyIDUgMTkgMjEgNSAyMSAxMSAxNCAxOSAxIDE3IDggOSA0IDE5IDMgMTcgMSAxNCAyMSAxNCA3IDYgNSAyMCAxNCAKKzIxIDIwIDQgNiAyMSA3IDExIDEyIF4KKzQxIDAgMTIgOSAxMSA2IDE2IDE4IDE4IDEwIDExIDIwIDYgMTIgMTEgNSA3IDIxIDE5IDE4IDYgMTUgMjEgMTAgNCAxNCA5IDE5IDEwIDMgCiszIDUgMTMgMSA4IDEyIDMgMTMgOSA3IDEwIDE3IDE0IF4KKzQ1IDAgMTAgNiA4IDMgMTcgMTggMyAyMSAxOSA2IDE3IDE1IDQgOSAxNSA5IDE1IDE0IDQgNyAxNCA4IDEwIDEzIDQgMTEgMTAgNyA2IAorMjEgMSAxNCA1IDExIDcgNyAyIDEzIDEzIDMgOSAxMyA4IDE0IDIwIF4KKzM5IDEgMyA3IDE4IDQgOSA5IDUgMTUgMTMgMTcgMTAgMTUgMTYgMjAgOCAxOSA5IDEwIDkgMSAxOSAxNCAyMSAyIDE4IDEzIDEwIDQgMTggCisxNiA0IDIxIDE1IDEwIDE4IDE5IDMgMTIgMTggXgorNDEgMCAxNCA0IDEzIDExIDEgMTEgMSAxMCAyIDEyIDQgMjEgMTAgMjEgMTggOSAyIDE2IDcgMjAgNiA3IDEyIDE5IDIwIDEgMTMgMTIgCisxMCA4IDIxIDE1IDcgMTkgMTMgNiA4IDE5IDIwIDE4IDE5IF4KKzM3IDAgMTEgMTggMSAxNyAxNCAxNSAyMCAxNiAyMCA4IDIgMTcgMTAgNCAyMSA1IDE5IDE5IDE0IDIyIDIxIDE4IDEzIDE0IDEgMyAxMiAKKzExIDExIDQgMjIgMTMgNSAxOCA3IDIxIDIxIF4KKzQ4IDAgOSAyMiAxOSAxMiA4IDE2IDUgMTcgNSA5IDEgMiA5IDYgMTIgNiAxIDcgNCAzIDE1IDEgMTQgMSAxMiAzIDEwIDIgMTAgMTQgMjEgCisxMyAxNyA2IDYgMTcgMSAyMSAyIDE0IDE2IDE3IDkgMTEgMjAgMjEgMTEgMTggXgorNTAgMSAxMiA4IDIwIDEzIDIgOSAyMCA5IDE0IDEwIDEgMTYgMiAyMiA2IDQgMTYgMTQgMTUgMSAxMiA0IDE0IDkgMjEgMyAzIDkgOCAyMSAKKzE1IDE0IDggNCAxNCA0IDIgMyA4IDEyIDggNiAxIDIgMTggMjAgMTUgMyAxOSAxMCBeCis0NCAwIDEwIDIwIDE0IDYgMyA0IDIxIDEgMTIgNCAxOCAyIDYgNyA2IDkgMjAgMTQgMTAgMTAgMTkgMTcgMjEgMTIgMTUgMTcgNyAxMCAKKzExIDggMTAgMTIgMSAxOSAxOSA5IDE4IDIxIDQgMTggMTEgOSAyMiA1IF4KKzQ3IDAgMTUgOCAxNSAzIDUgNiAyIDE5IDEyIDE3IDQgMjAgOCAxMSAyMCAyIDE4IDQgMTYgMjAgMTIgOSA5IDYgMTYgMjEgMTYgMyAxNiAKKzE4IDMgMTkgNSAxNiAyIDQgMiAxMiAxMSAxNSAxMSAxNCAxNyAyIDEwIDE4IDggXgorNDggMSA1IDEzIDMgMjEgNSAzIDYgMTggMTggMTAgMSAyMSAyMSA3IDEgMTMgMTIgMTkgMSAxNCA2IDggMjEgMTkgMjEgMTEgMTkgMTMgMiAKKzEzIDQgMSAxMCAyMiAxNiA0IDkgNCAxMCAxNiAzIDcgMTUgMTEgOSAxMyAxNyAxMiBeCis0NSAwIDE0IDcgNiAyIDIwIDMgNiAxOSAxOSAxMCAyIDIyIDEyIDE3IDEyIDEgMjAgNyA3IDE1IDIwIDYgMTggOCAzIDE0IDIzIDE4IDE1IAorNCA3IDUgMjMgMTUgNyAxNCAxMCAxMCAxOSAxNyAyIDQgMTUgMTcgMjEgXgorNDUgMSAxNSAxMSA4IDkgMTcgNSAxMiAxOCAxNCA2IDIwIDE3IDIxIDEyIDE2IDkgMjIgOSAyMCAxNSAyIDIyIDExIDIgNiAxMSA5IDggMiAKKzQgMTQgMTkgMyAyMSAyMSAyMyA4IDIgMTEgNCA4IDQgMjAgMjIgMTEgXgorMzggMCAyMSAxOCAyMiAxMCAxOSA5IDE0IDE3IDIzIDIxIDEwIDcgMTUgMTMgMTYgNSA0IDEwIDEzIDE0IDIwIDIzIDEyIDIwIDIzIDE4IAorMTAgMTIgOCAyMSAxMSA2IDEyIDcgMTkgMTQgMTggMTcgXgorNDAgMCAxOCAyMiA2IDkgMjIgNSAyMyAxMyA2IDggMjMgMjAgMjIgNSAyMiAxNSAxOSAyMCA5IDkgMSAxMyAxMyAxMCAxNCAxMyA1IDIyIAorMTQgMjEgOSAyMSAxOSAxNCAxNCA0IDE4IDEzIDEyIDE0IF4KKzQ4IDEgNyAzIDE1IDUgMTcgMTQgMjMgMTQgNSAxNyAyMiAxMSAxIDggMTMgMjMgNiAyMSAzIDYgMTEgNyAyMyA4IDYgMjEgNCA0IDIyIAorMTkgMTMgOCA1IDE5IDcgNSAyMyAxIDQgMTkgMTEgMjMgMTEgMjEgMTQgMSAzIDIxIF4KKzQzIDAgMjIgMTQgMTEgNyAxOCAxNiAxNyAyNCAxMiAxMiAzIDEzIDE5IDE2IDIyIDQgMTYgNCA2IDIzIDggMTggMTEgMiAzIDIwIDIyIDkgCisyMSA4IDIzIDEgMjMgMjAgNyAxNiAxMyAyMyA0IDEzIDMgNyAyMiBeCis0NyAxIDIzIDYgMTMgMTkgMiAzIDcgMiA5IDkgMTUgNiAxMyA0IDIyIDYgMTkgMjAgMSA5IDcgMTQgMSAxNSAzIDIzIDI0IDIyIDE4IDEyIAorMTIgMTcgMTkgMTAgOCAxMSAyMiAxMiAxMCAyIDIwIDE1IDE4IDE3IDE4IDcgMTkgXgorNDcgMSAxMiAyMSA2IDEyIDQgNyAxOCAxNyAzIDIgMTQgMjQgMTQgMSAyMyAxIDExIDE1IDEwIDYgMTggMjAgNyAxIDggMSAxNiA2IDIwIAorMjMgMjMgMjEgMTAgMTAgMTIgMjQgMTAgMTEgMjMgMiAxMiAyMyA5IDMgMjQgMjQgMTAgXgorNTIgMCAxNCAxMCAxOCAxNSAxNCA1IDE2IDExIDIyIDIgMTUgMjQgOCAyMiAxIDQgMjQgOSAxMCAxNSAzIDkgNSA0IDE3IDE1IDkgMTIgCisxOSAxOSAxIDMgMTAgNiA4IDMgMTcgOCAxOCAyNCAxOSAzIDQgMTUgNCA5IDIgMjQgNSAyMCAxMyAxMyBeCis0MiAwIDIwIDE3IDE5IDIyIDEzIDggMTAgMTkgMTUgMTEgMSAxNCAxNyAyMCAyMiAxMCA3IDExIDE2IDkgMjEgMjIgMTcgMjMgMTIgMTUgCis0IDI0IDcgMjEgMTggMiAyMSAxNiAxIDE5IDE4IDIwIDExIDMgMTUgMTcgXgorNTAgMCAxOCAxIDYgMTQgNSA1IDUgMTkgMTMgMTAgMjQgMTkgMTYgMjQgMTUgMTMgMiAxOSAxNSAyNCAyMSAxNyA0IDEzIDE3IDEgMSA5IAorMSAxMCAyIDE4IDEgMjEgMTkgNSAxOCAxMiAyIDIyIDE2IDIzIDE1IDE5IDYgMTggOSAxIDIzIDUgXgorNTEgMCAyMSAxMyAxNCAxMSAxOCAxMiAxMyAzIDE5IDkgMjAgMjIgMjAgMiAxMSAxMiA2IDEgMTIgMTYgMTggMiA5IDggNCAzIDExIDE3IAorMTEgNSA0IDE5IDE2IDExIDIzIDEzIDE4IDEgMjAgOCAyIDE2IDE2IDIxIDQgMTkgNSA1IDIwIDI0IDE2IF4KKzUzIDEgMjAgMjUgMTcgMTEgOCA0IDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IDcgCis4IDIwIDIxIDEyIDEwIDEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMjUgXgorNDkgMSA5IDkgMTQgMiAxMyAxNyAyNSAyIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggNyAKKzYgMTYgMTQgMTQgMTIgMTUgMTMgMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAyNSBeCis0NyAwIDkgMTggMjAgMjIgMjEgMjAgMTEgMTQgMjMgMjIgMTAgMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiA1IDcgMjMgCisxMSAzIDE2IDggMjEgNCA4IDE4IDUgMTIgMTQgOCA2IDIwIDE5IDI0IDggMjMgMTcgMjMgXgorNDggMSA3IDE5IDEgMTggMSAxNCAyMiAxMyAxNCA1IDggMjIgMTggMTQgMjUgMTcgMTEgMTIgMjIgMiAxMiAxMiAxNiAxMiAxMyAxOCAxNyAKKzEyIDE3IDE0IDE4IDggMjUgOSAyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSBeCis1MSAxIDE5IDE3IDE2IDIyIDI0IDE0IDE2IDIwIDIzIDIwIDkgMTkgMTYgNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDEwIDExIDE5IDEgCisyMSAxNCAxNCAxOSAzIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDQgXgorNTIgMSA2IDEgMTEgMTYgMSAxMiA4IDExIDExIDE3IDEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAKKzIxIDI1IDIgMjEgMTggMTAgMjAgMjUgMjEgMyAxNyAxNyA1IDggMjIgMjUgMTkgOCAxMCAxOSA3IDExIDE4IF4KKzQ0IDAgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDggMTIgMjYgMjQgOSAyNCAxNSAxIDIzIDIyIDE2IDE0IDggMjIgMTUgMTkgCisyNCAyMCA3IDggMTUgMjQgMTIgNCA0IDIzIDIxIDEzIDE5IDE1IDIxIDEyIF4KKzU5IDEgMTUgNyAzIDIxIDIwIDggMjIgMTQgMjMgMjYgMTkgMiAxMCAxOCAzIDUgMyAxIDkgMTUgMTUgMyA3IDEzIDIzIDkgNyAxIDEzIAorMTcgMTQgMjUgOSAxNiAyIDIgNiAxMyA3IDE5IDI1IDE3IDEgNSAyMSAyIDcgMjIgNSA2IDI1IDMgMTIgMTkgNiAyIDQgMjQgMTcgXgorNjAgMCA5IDE4IDIwIDE5IDQgMTEgMTQgMSA2IDggMjYgNiA5IDIyIDQgMTAgMiA3IDIxIDkgOCAyNCAyNSAxNCAyMiAxMiAyMiAzIDIzIAorMyAzIDIwIDYgMTEgMjMgNiAxIDcgNSAxOCA1IDE1IDI1IDI2IDEgMSAxMCAxMSAxMSA0IDEyIDExIDIwIDMgMTQgMiAzIDIgMjMgMTUgXgorNDkgMCAxMiAxNyAyNCAxMSA4IDYgMjQgMTYgMTUgMjIgMjEgMTQgNiAxMiAyMCAxOSA1IDUgMTIgMTEgNiAyMyAyIDE2IDIzIDcgMjQgNiAKKzIxIDIgMTcgMTcgNSAyNSAxMSAyNSAyMCAyNSAyNCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMjUgXgorNTQgMSAxMiAxNiAxIDE1IDcgMSAyNiAxOSAxOSAxMyAyMCAxMSAxNyA2IDIwIDUgMjQgMjQgMSAyMSAxMSA5IDIwIDIxIDE1IDEwIDE5IAorMjYgMyAyIDYgNyAxMiA5IDEwIDggMTQgMTAgMTUgNSAxNyA4IDIxIDEgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgMjAgXgorNjMgMCAxNyAxMyAxMSAxMCAxNyAxNSAxMiA2IDEzIDE0IDE3IDQgMTIgMTAgMjQgNSAxMyAyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAKKzE2IDggNCAxNCAyMSAxNSAzIDYgMTcgMjUgOCAyIDMgMyAxOSAxMCAxMyAyMiAyMiA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiAKKzUgNCAxNSAyNCBeCis0OSAwIDE0IDIwIDcgMjUgMjAgMjYgMjAgMTYgNyAxNyAxNyAyMiAxIDEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDUgMTkgMTggMTggCisyNiAxMiAxMyAzIDI1IDEyIDIxIDE2IDI0IDQgMTYgMyA2IDI2IDI2IDEwIDIwIDEzIDEgMjAgMjQgMTUgXgorNTYgMCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAxNyAyMCAxOSAxMSAxMCAzIDEwIDE0IDkgNiA5IDcgMTYgMTAgNCA0IAorMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIDEzIDEzIDEyIDIyIDIgMTQgMjAgNSAxOCA3IDE3IDI0IDIwIDIwIF4KKzU4IDEgNiAxNyA5IDIwIDIgMTAgMTkgMyAyMiA0IDEgMTEgMyA1IDMgMjEgMTEgMTUgMTIgMjMgMjYgNSAyIDI3IDYgNSAxNiA2IDMgMiAKKzIzIDUgMyAyMCAyMCA0IDI0IDIgMTggMjEgNyAxNCAxMCAyNyAyMyA2IDI0IDYgMTkgMjMgMyA5IDIyIDE2IDIxIDE3IDE5IDIzIF4KKzU4IDEgMTcgNyAyMSAxOSA2IDE2IDE1IDE1IDIwIDE0IDIgMjUgMTkgMTQgMTggMTkgNyA5IDEgMTQgMTEgMTAgMTYgMyAyMyAxNCAyNiAKKzEwIDExIDEgMTggMSAxMiAyNCAxOSAxOSAxIDcgMiAzIDI0IDcgMTIgOSAyIDggMTYgMjAgMjQgNSAyNiAyNiA0IDkgMiA3IDI1IDE3IF4KKzU0IDEgOCAxMiAxOCAxNCAyNiA3IDE3IDE4IDQgMjAgMSAxNiAxNCAyMSAyNiA0IDYgOCAyNCAxMSAyNSAxNSAyNCAxNiAyMyA0IDEwIAorMjMgMjEgMjQgMTUgMTAgOSAyNiA3IDE0IDI0IDIxIDYgMjAgNSAxNyAxNiAxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyNiBeCis1NiAxIDcgMTggMTEgMSAxOSAyMCAyMyAxMiAxMiAyNyAxMyAxMyAxNSAxNiAxMyAxIDE2IDE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAKKzIxIDQgNiA1IDE5IDE0IDE2IDQgMTYgMTEgMTQgMTggMTggMjcgOSAxMyAyMSAzIDI2IDIyIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDIxIF4KKzUwIDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxNiAyNyA1IDEyIDE5IDcgMjMgNiAyNSAyNSAyIDExIAorMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMSAxNCAxOSAyNiAyNyAyNSA2IDEgMTUgNCA3IDI3IDE1IF4KKzUxIDAgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgMTUgOCAxOSAyIDIwIDEzIDEgMjQgMiAyNSAxIDYgMTkgMTkgOCAxMSAyNCAyNCAKKzIxIDEzIDI3IDUgMTEgMjggMTcgNyAyNSA2IDIzIDI0IDE0IDI1IDEyIDUgMTMgMjYgMiA1IDggMTAgMTYgMTcgXgorNTggMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAyMiAyMiAxNCAxNiAxMyAzIDIyIDE2IDIzIDUgMTkgNiAxMyAxMCAyNiAxNyAKKzI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgOCAyNSAyIDkgMjUgMTggMTcgOCAyIDE0IDQgMTkgMSA1IDI3IDEzIDI0IF4KKzUzIDAgMiAyNyAyOCAyIDE3IDIzIDEwIDI3IDE4IDI2IDcgMjIgMTYgMyAyNyAxIDI2IDIxIDI4IDEwIDMgNiAyIDIgMTAgMTcgMTMgMTYgCis2IDE3IDIxIDIzIDEzIDIwIDIyIDUgNiAxMSAxMiAxMiA4IDIzIDEzIDE3IDkgMjMgMjAgMyAyOCAyNyAxMiAxNyAyMiBeCis1OSAwIDI4IDE5IDUgMjEgNCAyNyA4IDEgMTkgMTQgMjAgNiA3IDkgMSA2IDIyIDMgMTkgMjYgMTQgOCA2IDcgMTkgMTUgMjMgMSAxNyAKKzE2IDYgMjYgMTQgNSAyMiAyNSA0IDcgMTAgMTYgMjEgMTAgMTggMTkgMjQgMTYgMjMgOCAzIDE3IDI4IDE4IDEwIDIgNSAzIDIxIDIxIAorMTUgXgorNTggMCA2IDI0IDEgNCAyNCAxOCAxMCAyMiAxIDIxIDEyIDUgNCA0IDIwIDI1IDI0IDI2IDggMjUgMTEgMiA3IDI3IDIyIDE5IDQgMTggCisyNyAxMCAyOCA0IDEyIDI0IDggMTYgMTIgMTEgMTYgMTcgMjUgOCAxMiAxNiAxIDkgOSAxMCA1IDI0IDIzIDE4IDUgMTQgMTggOCA0IDI4IAorXgorNjEgMCA1IDE3IDggMjggMSAyMiA0IDExIDMgMiAxNyAzIDE0IDkgMjcgMTMgMTggMjQgOSA4IDcgMjggMjUgMTQgMjEgMjcgMjQgNiAxOCAKKzE2IDIgMTIgMTUgOSAxNCAxMCAxIDggMTcgNCA2IDE1IDI2IDExIDE1IDIgMjggMjAgMjYgMTYgMyA3IDUgOCA5IDI2IDEwIDEyIDI1IAorMTEgMjIgXgorNTMgMCA5IDEzIDI0IDE1IDIwIDIgNCA4IDIgMjIgMjAgMTkgNCAxNSAxNCAyOCAxMyAyNSAxMCAxMCAxMiAyOCAyNCAyMiAyNiAyOCAxNSAKKzkgMTEgMjYgMTkgMjIgMjcgMiAyMSA4IDIwIDIzIDI2IDEyIDEwIDIxIDkgMTUgMTMgMjUgNyAyNiAxIDEzIDUgOSAyMCBeCis1OCAwIDMgOSAyMSAyMiA3IDEgMjMgMjggMSAyIDggMjIgMTIgMTggMjggNSAxOCAxNCA3IDExIDE3IDIwIDIwIDcgMjEgMTMgOCAyOCAKKzIxIDIyIDIgMTYgMjAgMTUgMjggOSAzIDIyIDEzIDEwIDIzIDQgMTYgMTEgMTQgMSAxMCA4IDE0IDE0IDE1IDE4IDEzIDEyIDIxIDE4IAorMjUgMjggXgorNjAgMSAyOSAyMCAyIDI5IDIyIDggMTYgMjAgNCAxMiA5IDYgMTIgMTYgMTYgNyA5IDIwIDI5IDExIDkgNCAxIDE1IDI1IDE2IDI5IDEwIAorMjIgNyAyIDggNSAxOCAxNCAyMyAyNCA0IDYgMjYgMyAxMSA2IDEyIDEgNyAxNCAyNCAxNCA2IDEwIDIxIDE2IDIzIDI5IDI1IDYgMTQgCisxNyAyNCBeCis2NCAwIDEyIDEwIDUgMTAgMTUgMjUgOCAxNSAzIDcgMTMgMjUgMTYgMTQgMSAyOSAyMiAyNiAxNSAyNyA5IDEgOCA4IDI4IDYgMTMgNSAKKzEzIDMgMTUgNSAyMyA4IDIzIDIgNSA1IDQgMTcgMTMgMTQgNyAxNyAxMiAyNyAzIDE4IDUgNyA1IDI2IDE4IDE1IDIyIDI4IDE2IDEzIDcgCisyIDIzIDE5IDI1IDE1IF4KKzU2IDEgMTcgNyAxNiAyNSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAyNiA3IDI4IDExIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgCisyOSAxIDI0IDExIDE4IDIwIDMgMTMgMTEgNyAzIDE1IDE3IDI0IDEgMTggMTMgNiAzIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgMjIgXgorNTEgMSAyOSAyOCA2IDI4IDE0IDEyIDI4IDI3IDIyIDQgMTQgMjUgMSAzIDkgNyAxMSAxNCAxNSAxNiAxMCAxOSAxMiAxOSAxMSAyMCAxMyAKKzI4IDQgMjcgMjggNyAyNyAxMiA0IDI4IDIxIDE3IDIyIDIwIDE3IDE1IDE1IDIzIDIyIDEzIDEyIDIxIDIyIDIxIDI5IF4KKzY0IDEgMTIgMTQgMTIgMTggMjcgOCA3IDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIwIDIgMTEgMjMgMSAxMSAxIDUgCiszIDIzIDE2IDE1IDI3IDE0IDUgMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAxNSAxIDI2IDEyIDI3IDI1IDQgMjggCisyMiAxMSAxOSAxOSAyNCA5IF4KKzYwIDEgMjAgOCA5IDUgMjUgMTkgMTcgMTkgMTUgNyAyNCAyNCAyMSAzIDIwIDE2IDggMyAxNyAyOCAxOCAyOSA5IDIzIDkgMTAgMjkgNCAKKzEyIDI0IDE1IDUgOCAyMiAxNyAyOSAxMiAzIDggMjkgMTUgMjEgMjEgNCA3IDIwIDcgMTAgNyAyNiAxMCAxNiAyNCA2IDcgMTIgOCAxMiAKKzE1IDE3IF4KKzYwIDAgOSAxNyAxMSAyOCAxMiAyNiAyNiA2IDI5IDEzIDEwIDIwIDYgMjMgMTAgNCAzIDI2IDI2IDE0IDIwIDIwIDI1IDE0IDEzIDE1IAorMjQgMTQgMTEgNCAyMyAyNyAyNCAyMCA5IDE2IDE3IDI0IDEzIDEyIDYgMSAxNCAyNiAyNSA3IDggMjEgMSAxOSAzIDIgMiAxNyAyMSAxMyAKKzUgOSAyMSAxMSBeCis1NCAwIDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IDI4IDI1IDE5IDE4IDE2IDI0IDE0IDE1IDUgCisyOCAxMiAyOCAyNiAyOSAyIDE1IDE1IDkgNSAxOCAxOSAyMiAxMiAxNSA0IDYgMTUgMjQgMTYgOSA0IDI2IDI1IDE4IDI3IDEyIF4KKzYxIDEgMjAgNCAyNiAxMiAzIDIyIDEgMjIgMzAgMyAyOCAxMCA5IDI0IDE0IDI5IDYgMzAgMyAxMCAyMCAxNCA2IDMgMTkgMjEgMjEgMjggCisxNiAxOCAxMSAzMCAxMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgOCAzIDEzIDMwIDE4IDggMSAKKzI1IDI4IDE5IF4KKzU2IDEgMjAgMTUgMjEgMTggMTggMTIgMTYgMTMgMjQgOSAyMSAyIDI4IDYgMSAyMyA5IDE4IDI3IDI3IDQgOSAxMyAxMCA4IDE0IDE2IAorMTUgMTIgMTEgMTQgMjEgMTQgMTAgMTEgMjUgMTcgMTcgMzAgMjEgMTMgMjcgMjYgMjYgMjIgMTQgMTMgMTcgMjEgMTkgOSA5IDIwIDIzIAorMTMgMjggXgorNTkgMSAxMCAyOCAyNCAxMCAyMiAyNyAyMyAyNyA4IDE3IDE0IDYgNCAyMSAyNiAxNSAxIDggMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IAorMTQgMTkgMTMgMjkgOCAyNCAyIDggMiA0IDEyIDE5IDExIDEwIDYgMjYgMTQgMjIgMjQgMzAgMTAgMTEgMTIgMiAxMiAxNyAyMyA4IDggCisxMiAyOCAxMiBeCis1NiAwIDE0IDI4IDIgMTcgNCA4IDMgMjYgOSAyMyAyMSAzMCAzMCAyMCA0IDEzIDI4IDI5IDkgMyAxNyA3IDE5IDMwIDI4IDEgMiAyMCA5IAorMTIgMjQgMTUgMzAgMjAgMjcgMyAyMyAxMSA2IDI5IDI1IDIzIDI2IDE3IDIwIDEwIDIyIDE1IDIzIDYgMjUgNSA0IDMwIDIgMjkgXgorNjMgMSAyMyAxNSAyNyAxNCAyNiAxIDEgNyAxOSAxMiA3IDYgMjAgMTggMTQgNCAxNSAxNyAyOCA3IDExIDcgOCA5IDIyIDE3IDEyIDUgCisyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIDMwIDE0IDMgMSAxOCAxMCAyMCAyNyAyMSA4IDYgMjQgMjYgMjAgMTEgMjQgNyAyIDQgMTggCisxNSAxNCAzMCAxNiAxOSAxNCBeCis1MiAwIDI3IDE1IDQgMTkgMjUgMjkgMjkgNyAxNCAxOCA5IDExIDkgMjcgMTEgMTUgMjkgOSAyOCAyMCAyIDMwIDI2IDIxIDE3IDggMjggCisxNyAyMiAyOSAyNCA4IDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMjQgXgorNjYgMSAyNSAxNSAyOCAyMyA1IDEwIDIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IAorNSAzIDggMTUgOCAyMSAyOSAyMCA1IDI3IDIgMTMgMjcgNyA3IDMwIDIgMTggMjYgMTAgMiA1IDI5IDIxIDE1IDI1IDI2IDI0IDggMTIgCisyMCAzIDkgMTAgMzAgNyAxMiAyOSBeCis1MyAxIDMwIDI2IDIwIDExIDIyIDE5IDI3IDIgMTYgMTAgNiA0IDI0IDE3IDIwIDI1IDIwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAKKzMwIDE1IDI2IDIzIDI4IDcgMjEgOCA3IDMxIDMxIDE0IDI2IDE4IDMgMSAyNiAyOCAxNSAyNSAxMSAzMSAzIDI1IDkgMjEgMzAgXgorNjcgMCAyIDYgMTQgNCA5IDUgMjggOCAxNyAyMiAxIDQgOCA3IDEwIDE0IDE5IDEwIDE0IDggMjcgOSAyNCAyNiA0IDMwIDExIDggMTkgNSAKKzIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAzIDI1IDIyIDI1IDIzIDIxIDEwIDE1IDE1IDI5IDggMTMgNCAKKzIgMTMgMjIgMjAgNyA0IDIwIDMxIDIzIF4KKzY1IDAgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAyIDIyIDYgMjUgMzAgMjkgMzEgMTMgMTQgMTYgMzEgMTIgMTYgMzAgNSAKKzE0IDMxIDExIDQgMSAxIDI1IDIxIDEzIDI2IDIyIDIxIDUgMjIgMTQgMjkgMSAyMSAzIDE0IDMwIDQgMiAyOSAxMiAxNSAyMyAzIDE1IDUgCisxIDYgMjMgMjIgMTMgMSAxNCAyMyBeCis1OSAxIDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IDYgNSAyMCA0IDE0IDMgMjkgOCAyOSAxOSA3IDI5IDIzIDI1IDI4IDE5IDExIAorMTUgMjcgMjEgMTQgMSAxOSAyMCAyNiAxMiA3IDEyIDEgMTggMTMgMjkgMjggMjMgMjkgMTQgMjMgNyAxIDkgMjkgMjQgNSAzMCAxOCA1IAorMjUgMzAgXgorNTUgMSAzMSAyNSAxMyA3IDI0IDI1IDI0IDEgMTIgMTkgOSA3IDYgMjggMjAgMTQgMjggMjEgMTkgMzEgMjAgMjAgNiAyNCAxOCAyNyAyNCAKKzQgMTggMjEgMSAzMSAxNSAxIDE1IDIgMjcgNCAyNiAyNSA0IDIzIDE5IDIgMzEgMjIgMzAgMjEgMjIgNSAyNyAxMiAzMCAyOCAzMSBeCis2MiAwIDI3IDE1IDE4IDE0IDI1IDE1IDE3IDcgMjggMTEgMjggMjkgMzAgMSAxNyAxMiAxMCAyIDE4IDIwIDIxIDIgMTEgMTIgNSA0IDEyIAorMjUgMTQgNSA1IDI0IDIyIDE4IDMxIDE1IDIyIDI5IDExIDMgMjEgMzEgMjEgMjcgMyAyOCA3IDEwIDI1IDIgMTUgMzAgOSAzMCA3IDIyIAorMTUgOSAzIDIwIDI0IDE0IF4KKzYwIDAgMjggMTQgMTggOSAyNyAxNCAyMiAyNyAzMSAxMCA4IDE0IDcgMTUgNyAyMCA1IDI2IDEgMjkgNyAxNyAxNyA4IDMgMTMgMjcgMTggCis4IDMxIDI3IDI4IDIyIDIyIDE3IDE5IDE4IDE4IDExIDE5IDEzIDI1IDEwIDE5IDYgMjggNCAzMSAyMyAxMCAxOCAyNiAzMSA1IDEwIDEzIAorMTIgOCAxNSAyNyBeCis2MCAxIDI0IDIyIDQgMjkgMjIgMzEgMjggMjAgNCAxNiAyMSAzIDEgMTUgNSAxNSA2IDMwIDMgMjkgMjkgNyAyNyAyMCAyIDIwIDMxIDIyIAorMjYgOSAyOSAxNiA0IDI2IDMyIDE3IDIwIDE0IDI4IDE3IDE5IDYgMjQgMTEgMjYgMjggNSAxOCAxNSA4IDE2IDIwIDIxIDQgOSAxMiA0IAorOCAxNyAyOSBeCis8RAorCitIPlNIUyBUeXBlIDIgU3RyaW5nczxICitEPgorNjkgMSA1IDMgMTEgMTUgMTIgMjQgMzEgMjMgMSA2IDI4IDIgOCAzMSA2IDcgMzAgNSAxOSAyMyAxMiA2IDkgMzEgMTkgMTcgMjQgMjUgCisyMiA2IDEyIDE2IDMgNyA5IDkgMTEgMjkgNCAxMSAyIDUgMTMgMjkgMTAgMTIgMzAgMzIgMTggMjggMTggMjcgMyAzMCA0IDQgMjYgNiAKKzEzIDMxIDEzIDIgMTEgNyAyNCA0IDE3IDI5IDEyIF4KKzk1IDAgMjEgMTkgMjEgMjMgMTEgNDIgMzYgMiAxMyA0IDEgMzMgMjIgMTYgMjcgOSA0IDMzIDE2IDMgMzAgMTUgMTEgMzIgMTMgMTcgMzggCiszMiA5IDM4IDQgMzYgMTUgMzIgMjcgMTkgNDIgMTggNiAzNiAyMiAxMCAyOSAxMiAyNSA0MCAxNSAyOSAyMyAyOCAzMCA0IDggMTEgMjQgCis5IDEwIDMxIDI4IDQzIDIzIDE2IDI5IDMzIDUgNDAgMjYgMyAxOSAxMiAzNiA0MyA1IDM1IDM3IDUgMTQgMTEgNDUgMzUgMTYgMTAgOCAKKzMyIDQgMTUgMzUgMjYgMiAzOSAyMiAzNyAyMiAzMCAyOSBeCisxMDYgMSAxOCAxNCA1MSAyIDYgMzIgNTEgOSAzMiA1MCA0NCA0NiA1MSA4IDExIDUzIDQ1IDU1IDE2IDEwIDMgNTIgOCAyMCAyMCA0NiAKKzQ2IDEzIDMyIDIgNDYgNTAgNDMgMjUgNTQgOSAzMSAyOSAyIDQ3IDE1IDI5IDI0IDQ1IDQ0IDE4IDM3IDE0IDI4IDM5IDM2IDQ0IDQ3IAorMTYgNTAgMTAgNDQgMjQgNTMgMzUgMjIgNDAgMjAgMTUgNTEgMjIgMTggMjIgNDIgNiA1NCA0OSAzOCAyMSA3IDEzIDMwIDE2IDcgNTIgCisxNiAyMiAxMyAzOCA3IDExIDQ0IDMzIDkgMjUgMTMgMzcgNDIgMTQgNDUgNTMgMzAgMzggNSAyNSA1IDM1IDM4IDIyIDI4IDUzIF4KKzEyNyAwIDU4IDM1IDQzIDI4IDUgMjggNjMgOCAxMiAyNSA5IDQ3IDUzIDI5IDYyIDcgMzcgMiAzIDQ4IDUgMTIgNTUgNTYgMjggMzUgMTIgCis2MyA2IDU4IDI3IDI3IDQ4IDQ0IDM1IDE0IDE3IDIyIDU2IDEwIDggMSAxNiAxNSA0MiA2MyAxNCA1MSA1NyAxOSA0MSA3IDggNTYgNDcgCiszNCA1MiAyMiA0OCA2MCA0MyA5IDEgNTIgNCAyMSA0OSA2MSAxOCA1MCAyMyAxMyA0NiA2MiAyMyA0NSA2MiA5IDU2IDE4IDIzIDMxIDggCiszMCAyNyAzNiAxMyAzOCA0IDU4IDUzIDQ3IDI0IDE4IDQxIDU4IDE5IDEyIDE4IDUyIDQyIDI5IDQ0IDQ1IDI2IDYzIDM0IDMyIDQxIDY0IAorMTUgMjYgNTUgMTkgMiA0OSA2IDMwIDUzIDEzIDU0IDEyIDUzIDM3IDEyIDM3IDQzIF4KKzE0OCAwIDYwIDQgNTEgNDcgNTggMzggMTcgNjMgMzMgMjMgMjggNDMgMTIgNjkgNzAgMzMgMTcgMTIgNTAgMTggMTggMzYgNDUgMiA2NyAKKzQgNDUgMjAgNCAzMyAzOCAyOSA0NSA4IDIyIDU4IDM5IDcxIDM4IDMyIDUzIDM1IDE5IDUzIDMxIDI5IDUxIDM1IDQgNjMgMTggMzMgMjYgCis0NyA3MCA5IDY0IDYyIDYzIDMwIDE1IDEgMzUgMjggMTYgNDAgMjAgMTQgNTAgMzMgMTkgMzggMzAgMjcgNTUgMTAgMTYgNDYgNDcgNyAKKzU1IDEyIDUzIDI2IDU2IDMzIDI5IDU1IDI1IDE3IDQ4IDQzIDIxIDQzIDE4IDI0IDYzIDI3IDY4IDQ2IDM4IDMzIDM1IDEwIDE4IDExIAorMjcgNSA5IDU4IDM1IDcwIDM2IDM2IDM5IDQ3IDIgMTAgNjYgNDcgNSAxOCAyMSA0NCA3MSA1MSA1NyAzIDIyIDcgNTYgNTUgMjggMjUgCisxNCA0MCAxNiAyNCA0OCAzNyA2NiA1MCAyNCA0NSAxOCAzOSA1MyA1NSBeCisxNjUgMSAxNSA2MiAzNSAyOSAxNSA0MCAxOSA3NiA2NyA0IDUgNzEgNDYgNjEgMjYgOCA3NyA0OCAxIDIzIDEyIDYwIDQwIDI0IDQ0IDMzIAorMjkgNDIgNzMgNjYgNDkgNjEgMjAgMzAgMSA1NCA1MiA0MiAzOSA2NCAyMyA2NSAzNyAyNCAyMCAxMSAyNiA2NiAyMiA3NyAyMiA1NyA3IAorMzggNTcgMzMgNjEgNzMgNyA2NCAxIDQ5IDM1IDc2IDE0IDI3IDIxIDQ1IDY4IDM4IDU4IDczIDEzIDcyIDQ3IDczIDMzIDggNjYgMjMgCiszOCA0IDU2IDc3IDQ3IDEwIDcxIDEzIDIwIDMxIDQxIDYgNTEgMyAxOCAxNyA2MSA0NyAxNCA0OCA3NiA0NiAyOCAzNCA0MyAxIDU2IDQgCisyNSA3IDY1IDQxIDEgMzQgMzcgMjMgNTkgNTkgMjcgMjYgMTMgMTUgMTQgNzUgNjAgMTQgMSAyOCA1OSAyNiA2NSA2MSAxNiAyMyAxNyAKKzI4IDYgMTkgMiAzNSA0OSAzMCAyOSA0OCAyIDYzIDczIDU5IDEgMyA3NiA0MSAxMSAxOSAxOCA0MyA1NCA2MyA2NyA1MSA0IDkgNzggNjAgCis2NiBeCisxODEgMCAxOCAxOSA4NCAxNyAxMiAxMCA1NyAxOCA3NyA1MSA1MiAxNiAzOSA3NCA0OSA1MiA2MyAzOCA3MiAyIDE1IDY0IDgzIDYyIDQ5IAorNTYgMTEgMjYgNjggNTggODMgMzMgMjMgNTAgNjMgNzEgNTMgMjcgODQgMjIgMzkgNDEgNTIgNTggMTEgNjQgNyA2MCA0NSA3MCAyMiA1IAorNzMgMzggMzAgMzAgNDggMjEgNzUgODAgNDAgMjEgOCA1MyA5IDI2IDMwIDM0IDgxIDcxIDcxIDUxIDIzIDc1IDMzIDQxIDIzIDMyIDUgOCAKKzY2IDQwIDcyIDQwIDE2IDY2IDQ1IDE0IDQ4IDM0IDIxIDQxIDI3IDMgNTUgMjcgMzcgMjMgNDEgNjUgNCA1NyA1MSA3NCAyMiAxOSA3NSAKKzQyIDE2IDE5IDQ2IDE2IDEwIDQ4IDIwIDE5IDM3IDQxIDE0IDU3IDkgMTcgNTUgMzggNSA2MCA3IDQ2IDIwIDQzIDM2IDM5IDUyIDIwIAorMTAgNjIgNDUgMjMgNDYgNyAzNSA3NSAyOSA3MCAzNSAzNiAzNCAyNSAxMiAxNSA4NCAyNiAxMCA2IDcxIDI5IDc5IDMzIDMyIDI1IDU5IAorNzYgODIgNjQgNTggNyA4IDE5IDQxIDc0IDIgNTMgNjUgMjQgMSA1NSA1MSAzNiAyMSA3OSA3IF4KKzE4NCAxIDYwIDY2IDY2IDYgMyA5IDczIDEyIDcgNDAgNzAgMTggNzEgNzAgNjUgNTEgMTQgMTQgMjcgNTAgOSA4NyA4MSA1MCAyMiAxOSAKKzQwIDM3IDE2IDc5IDEyIDM0IDM3IDc2IDgyIDEwIDYxIDcgODEgNDkgNjcgMjYgNDUgODIgNTAgODEgNjMgNDUgNjkgMzEgMzEgNzYgNTEgCis5IDU5IDM0IDUxIDU0IDM0IDgzIDEwIDMzIDUxIDg2IDgxIDgyIDY5IDE4IDggMjIgNjQgMTkgODYgNjIgNTggMzMgMzcgMTcgMzQgNSAKKzI5IDgzIDQyIDc2IDUwIDU0IDY2IDM5IDkgMSAzNiA0MyAxNyA2NSA2IDM1IDU2IDcyIDcxIDgzIDg4IDEwIDEgOCA4NyAyMiA2IDIxIAorNzggMjUgODkgNDMgNjIgNDAgNTUgODUgMzEgODkgNzQgNjMgNDYgMjggMjQgMjYgMzEgMTcgNyA4IDI3IDE5IDEyIDg1IDE3IDIwIDI3IAorNzcgMTAgMiA1NCA4MCAxNyA1MiA3NCA3NiA2OSA3OCAxMSAyMCA4MCA0IDI5IDI0IDg1IDc1IDE4IDM5IDIzIDcwIDgzIDI5IDU3IDY3IAorNzIgNzAgMzMgNCAxNSA0NiA0MiAyIDY5IDEzIDUzIDMzIDY5IDY0IDMzIDY0IDE0IDQwIDY5IDU5IDc4IDU0IF4KKzE5MyAxIDY4IDQzIDk1IDUzIDM4IDU4IDU1IDI4IDIwIDE2IDY3IDQ4IDE3IDg2IDMyIDQ0IDY4IDY3IDI4IDE2IDE0IDc5IDI1IDE1IAorNzIgNjcgNTAgODAgMTggMzAgMTAgNzUgMSA2MCA0NSA4NyA3OCAyOCA5NSA0OSA2MyA3MCA1OSAyNiA2IDUxIDczIDYwIDY1IDE4IDI2IAorOCA4NyA1IDU4IDMxIDI1IDU3IDQwIDQ2IDc4IDU3IDM0IDc4IDYxIDM2IDY2IDU3IDM4IDgwIDIyIDMyIDY4IDcxIDMwIDc0IDM3IDgxIAorNjYgNzcgNjYgNTUgMiA1MSAyNCA5MyA2MSA0MCA2OCA0NSA2MSAxMiA2MyAyNCA4OSA1OSA1MiA3MiA0MyAyMCAyMCA2OSAzNiA0MCA4OCAKKzQ2IDkgNjIgNTUgNzcgODQgMjAgMTggNiA3NyAxNSA1MiAzOSA3NSAzIDI2IDQgODUgMTcgNjIgMjkgMTEgOTIgNDYgNTggMjkgNTkgMjggCis0MiA4MCA3MSA5NiAyIDQ5IDg1IDM3IDYzIDQgNjEgMTQgMiA1MyA4NyAyNSA4NiA2IDc1IDc2IDkzIDQxIDM5IDkzIDkyIDQyIDU2IDQxIAorNjMgMjYgMjggMTggNzcgMTEgNTAgNzggNzkgMSAxMiAxMiA5MSAyOSAxMyA1OCA1IDU2IDkyIDY2IDU5IDQgMzkgNDcgOTUgNSA1IDYyIAorMzMgMTMgODAgMjcgXgorMjAzIDEgMzUgMjggMTEgNyAyMCA3IDE3IDMgMyAzMCA4OSAxMyA2NSA1NiA2NiA2MyAyMiA4MiAxNiAzMSA1NSA1NiA3NyA5MSA5MSA3MSAKKzEwMSAxMyAxMCA4NSAxMDEgOTUgMTcgOTkgOTggOTEgMzMgMTQgMjAgNDggMzIgNyA2NCAyOSAzOCAzNSAyNSA0IDk1IDIzIDM0IDEgODUgCis4MSAyMyAzMSA5NiA3MSA4NCA1MCAxNSA3OSA0NyAyNSA1MSA0NSAzNSA2NiAxOSA2MSA2MCA5IDMxIDkzIDY0IDcwIDMwIDQyIDg2IDUzIAorMSA3MSA0NiA0MiAyMiAzOCA5NiAxMCA5OSAzNCA3NiAyNiA1NSA3MyA2MyA2MyA5NyAyMyA5MiA4MSA2NCA0NiAxIDMwIDMxIDM1IDg2IAorOTEgODggNjQgODcgMTYgMzcgNjkgODQgOTQgNjAgMTAwIDMgNDcgNTIgOCA3MSA4NyA1NyAyOSA3NiA0MyAxOCA0NSA0NiAxNSA2NSAxMiAKKzQ0IDQyIDY2IDYwIDE1IDY4IDE5IDU4IDM5IDYyIDc2IDkgOTIgMTAxIDU3IDMyIDQgMzQgMTUgNDEgNjIgMzIgODkgNzEgNDMgMzUgMzEgCis0MSAyMSAxNyA4MiAzMyA5NiAyNyA2MiAyOSA4MiA1NyA0NiA2MiAxNSAyNCA5OSAzNyA4MyA0MCA1MiA0NiA1NiA4MCA5OCAzIDkxIDc0IAorNiAyNyA3IDU4IDk0IDEwIDQxIDc5IDk3IDg0IDc3IDc0IDI2IDk5IDM1IF4KKzIxMiAxIDI2IDEwMSAxNyA5MSA0NSA5NyA4MCA1OSAxMDIgMzAgNjggNCA4NSA5IDQgMzkgMTYgMTggODUgNzAgMTEgODcgNjIgNzIgNzggCiszOCAzIDQxIDUzIDgyIDgyIDM1IDE4IDEzIDk0IDY0IDUyIDM5IDc3IDU5IDI2IDkgNjUgNDYgNjQgOTggMzIgMjkgODYgNzkgMTYgNjMgCis1NCA3NiA1NiA5OCAxNiA5OCA3OCAyMiA3MiAzMyAxMDMgMTA0IDUyIDg0IDEyIDY1IDE1IDg1IDEwMSA5NyA4NCAzMSA1MSAyNiAxMDAgCisxMDAgMzggODAgMTMgMiA3OCA3IDI0IDQ0IDg0IDEwMyAyNyA3IDI4IDE2IDMzIDk5IDI1IDEwMyA1NCAxNCA0MiA2MiA4NyA5MiAyNyAKKzIyIDQyIDUgNTIgMTAwIDg0IDczIDcyIDYzIDI0IDQ4IDU2IDUyIDIzIDUgMTcgNzYgMzEgMSA5NSA1OCA0MyA2MCA1MCA2MiAzMCAyMyAKKzM1IDc5IDIwIDM1IDMgNzIgMzIgNDUgNTEgODcgNDEgODQgMjcgNzkgNzcgNzAgMTAyIDE1IDU0IDE1IDEwMCA4IDUyIDY5IDEwNSAzIAorMzAgODQgNDIgOTMgNjYgODkgNjkgNzQgMjQgMzMgNDIgOTcgNCAzOCA5OSAxMDYgMTMgOTMgNiAxMDYgNzQgMTAwIDU0IDQ1IDIxIDU5IAorNTYgMzcgOSA1MCAzMiA3NSA3OSAzMSA3NyA5IDYxIDEgOCA2OCA2IDYwIDgxIDcgMTAwIDk5IDE0IDYxIDQ4IDI1IDczIDI2IDcwIDcyIAorOTQgMzQgXgorMjMzIDAgMTEgOTggMTEwIDg4IDM1IDExMCAzNSA2NCA0OSA4OCA5MyAyOCA4NSA2IDc4IDY1IDkwIDUyIDI0IDk3IDUxIDM5IDUxIDU5IAorMjMgMSAzIDQ5IDMzIDExIDc4IDI3IDM1IDU1IDY0IDUgMTAyIDQgNzAgMjUgNTYgNTggMzggNjYgMTEgMzEgOTYgNjYgMTA0IDU5IDQxIAorODYgNTggMjkgNzkgNDEgNDAgNzIgNTEgMTIgOTIgMzQgNTIgNDQgNjkgMTA0IDIxIDk3IDg5IDk2IDQ4IDIxIDQgNjEgNDAgMjggNjcgCiszNCAyMyA4NSA0NCAyMiA2MiA1MiAzMyA4NCAyMyAzMCA3MyA3NCA0IDc5IDEyIDgxIDQ3IDgwIDUzIDQ3IDg5IDQwIDE5IDgwIDYyIDM0IAorNjEgMjkgNDEgOTUgNDMgMSA3MCA2MyA1NSA1MyAxOCAxOSAxMyA0OCAxMCAxOSA4OSA0OSA0IDUyIDUzIDU2IDc2IDEwIDggMTA0IDc3IAorMTUgMjggMzggNzUgMTA5IDMgODUgOTAgOCA0MCA4IDkzIDkwIDQzIDM5IDE0IDYwIDE3IDM2IDc4IDU2IDEwNSA4MCAzNSA3NSAzNiA1OCAKKzgyIDUwIDEwMCA5OCA0NSA3NCAxMyA2NiA5NSA3MiA3MSA5NSAzNCAxNCA5OCA3MiAzMyAzOCAzNyA1MiA2IDE0IDEwNyA1OSAzIDI5IAorNjEgNjcgOTggOTIgNSA5MyAxNyA5OCAzNiA4NyA0MSA3NSA3MSA1NyA4OCAxNyAyNSA5MSA4NCAzIDU4IDIwIDkyIDY5IDUxIDUwIDM2IAorMzEgMTQgMjUgMTggMzAgMTggMSA0MSAxMDQgMzAgODIgNTkgODcgNzAgMzQgOTYgMjggNDcgNjIgODEgMTAzIDQ4IF4KKzIzNCAxIDYzIDkwIDEwOCAxMDggMTAyIDY0IDgyIDg4IDQgMTExIDc2IDk3IDIyIDEgMTA4IDQxIDM0IDkxIDMzIDIwIDI1IDI0IDI2IDggCis4MyAxMSAzMSA3IDg1IDEwOSAxMDYgNCAxMDUgODUgNjggMjggMzMgOTkgNTMgOCAxNiAxMiAxMSA3NCAxNyA4MyA2NiA3MCAxNiAzMCA5IAorNjcgNjggMzQgMjQgODEgNDcgOTIgNzIgNDcgMzcgMzMgMzggOTIgMTcgOCAyOCA4OCAyMiA2MiA2OSAzMiA4OSA3NSAzIDcyIDk2IDg1IAorMTMgMTA1IDI0IDM4IDM3IDk0IDExNSA4MyA3MiAxMDggMTE0IDI0IDkzIDc2IDEwMyA2MCA5OSAxMDIgOSA0MyAxMCA1OSA5NSA0NiAzMyAKKzkzIDE1IDI2IDY5IDQ0IDIgODYgMTA3IDU1IDQ1IDYxIDY1IDkyIDY2IDkgNTUgMzkgNzAgODMgMjkgOTggNjcgMTMgMTExIDE1IDIwIAorMzEgNjIgOCAyIDUxIDIwIDE5IDMzIDQ0IDE0IDExNSA3MSAxMTIgOTcgMTAgNDEgMjggNTMgNTEgMjYgNTcgMTUgMzggOTggNTUgMTA2IAorMjIgNTYgMzEgNTAgOTUgMTA3IDExMCA4NCA3MCAxMCAxMDggOTYgNzMgMTAwIDI1IDM2IDU1IDg4IDcxIDYzIDk2IDMwIDkwIDk2IDc5IAorMjIgNyAzMCAyMyAyOCA1OSA4OSA4IDUxIDk5IDQ3IDg2IDM0IDE4IDQzIDY1IDk4IDEwNCAxMDcgNDkgNyA3OSA3MSA4IDU3IDIxIDI5IAorODAgMiA3NCA3OCA0NCA1NyA5IDYxIDIyIDEzIDY4IDUyIDkxIDc0IDk4IDQzIDMwIDU4IDY4IDk1IDEwMSA3MiAxMDIgNzYgNDIgOTkgCis2MSBeCisyNDkgMCAyNyAxMTcgNDUgMTE5IDgwIDIgNTkgNTIgOCA3NiAyMCA5NCAxMDIgNjkgOTYgNDIgNDYgMTA2IDY3IDkgMTEwIDg5IDcxIDY5IAorMzQgMzEgMTUgODUgMTYgMjkgMTAwIDgyIDM3IDYyIDY4IDk1IDEwOCA0NCAyMyAxMTQgMzQgMzYgNTYgOTMgMTEgMzAgOTYgMTIgMzEgCis2NyAxNCAxMTQgMTQgNjYgNzAgMzAgODEgNDYgNTMgMTE5IDg1IDYgMTA0IDQ3IDkyIDcyIDcwIDUgNzAgMTUgMTE1IDY4IDEwNSAzMyAKKzk3IDEzIDg1IDEwNiAxNCA2MSAyOSAyMiA4NiA0NSA1NyA2OSA5MSAzOCAzOCAyOCA2NiAxMyA2MCA5NSAxMDMgMyAxNSA1IDExMyAzOCAKKzIzIDYyIDUgNjUgOTQgMTA3IDczIDEwNCAzNyA0NyAxMDIgMTE3IDMgNzggMzUgNyA5NSA1NiA3OCA0NSA1MiAyOCA0NiA0MyAzNyAzMiAKKzUzIDE5IDU1IDI5IDQ3IDk3IDc2IDExNSA4MyA3MSAxMSA0NSA2MiA3MyA5OSAxMTYgMiAyNCAxMTYgNyAyOCA0MSAyIDI5IDM3IDUyIAorMjMgNSAxMTggNzkgMzEgNTcgODkgNjEgMjQgMTAxIDc4IDUwIDkzIDczIDQxIDcgMzMgNDUgNDcgMjQgMSA0OCA3MyAzNiAzIDI1IDg3IAorNDYgMjggMTA4IDU0IDY4IDUzIDY3IDExOSAyOCAzNiAxMTggMTA0IDQyIDg4IDI3IDExMiA0IDc0IDg1IDEgNjMgMzkgOTcgNzEgNzQgCis3NSA3NiAxMCA0OSAxMiA3OSAxMSA1MCAxMDMgMTE4IDk0IDExNyAxMTggMzcgMjcgMTIgOTQgNjAgMjggNTEgNDcgODIgMTEwIDE3IDE1IAorMTA1IDIzIDUyIDQzIDEyIDIxIDIyIDgxIDQxIDEyIDc0IDkwIDQyIDEwOCAxMTcgOTggNjcgNCA2OSA4NSBeCisyNDMgMCA3NiA4MSAyNiAxMDEgMTMgNjggNjIgMTA2IDg3IDE5IDk4IDMyIDgxIDYzIDc5IDkzIDMxIDEyMSAxMjMgNzUgNTIgMTEgNjYgCis0MSA1NCA4NyAzOCA1IDEwNCA2MiA1MSAzOCA1NSAyOSAzMSAxMjAgNDQgMTYgNDggOTQgNDYgMTA1IDkxIDY2IDc4IDI3IDQzIDYgNjQgCisyIDU1IDc5IDc1IDg0IDExMyAyMiA0IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgNjMgOTggMTAzIDEwNyAxMTYgMzQgMTQgOSA5NSAKKzM4IDE4IDUxIDc1IDMzIDEwOSAxMTggNTUgNjYgNCA3NiA3IDc1IDcwIDgyIDc0IDIzIDEgMjYgNjkgNDAgMTEyIDk5IDQ3IDY1IDMxIAorNzAgMTE5IDUyIDEwMyA4OCA4NSA4NiAyOCAxNiAxMiA3NiAyNSAyMiA3OCA2NCAyMSA4NiAyNyA2MSA3NyA3MiAxMDggMiAxOCAxMDYgCisxMTkgMTIxIDU0IDE2IDg1IDcyIDIgNzMgMjYgODggNjYgNjAgODAgMzUgMjQgMTE3IDYzIDI0IDQ0IDY3IDUyIDEyMiAxMTkgMzMgNzIgCisxNiA5OSA5OCA2OSA1NCAxOSA0MiAyOCA1MyAxMTQgMzIgMTE3IDgxIDEwMCA1NyA0OSAxMjMgNTYgMjEgNjggODAgNTMgOTUgMSA0NSAKKzk1IDEwNyA5OCA4NyAxIDI3IDI0IDk5IDExNiAxNiA2NyAxIDExMyA5MSA4NCAyNSA0MCAyNSA3MiAzIDI4IDkwIDg3IDExMiA4MCAxNiAKKzExNyA0NSA3NyAzNiA5MCAxMDUgNTkgODggMTIyIDY0IDEwOCAxMDggNzEgOTggMTggNTAgMTE1IDkzIDEwNSA3NyAzNSA2IDQ2IDU1IAorNDcgMTAyIDQgMjYgODcgMTExIDEyMCA4MSAxMTMgNCA1NyAxMDUgMyA4NCA5NCAxMTUgNjEgNzMgXgorMjU1IDEgOTEgNDcgNTEgOSA1NyA5IDU1IDk0IDYxIDYxIDY4IDQ2IDEwNyA2IDM1IDgxIDExNCA3OCA5NiA3NCAxNCA4OSA3MyA2NyA2NyAKKzY5IDExMyAxMDcgMTEgOTggMTEzIDEwOSAyMCA5MiAxNyA2NyA3MCA4OCA1NyAxMCAxMjQgOSA2MCAxMjIgOTMgOTEgNDUgNyAxNSAyNCAKKzUxIDUgOTggMTE1IDI0IDQ5IDkwIDEwNCAxMTcgNjYgMTI4IDk0IDY0IDgwIDEyIDQzIDkxIDQ2IDExMSA1OSA1OCA3NyAzMCAxNCA4OCAKKzYwIDEyMyA2OCA0MSA0NCA2OCA0MCAxMDQgMTE4IDQxIDQzIDkzIDkwIDEwNSA5MiAxNiAxMjcgMjYgNTQgMTI1IDExNCA3OSA3MSAyNCAKKzQ4IDIxIDI1IDExOCA0MCAxMDMgNDkgOTEgNDQgNjcgNjUgMjUgMTE5IDEwOSAxOCA0OCAyMyA2OSAxMTIgMzggNjEgNjQgODcgODQgCisxMDQgMTE5IDExMCAxMjIgOTIgMjIgMSA4IDgzIDM0IDEwMCAzMiA2MiA0MSA0NiAxMTIgMzQgMTAyIDc2IDU2IDM5IDQgMTI3IDMwIDEzIAorMTkgMTEwIDEyNCA3IDE2IDEyOCA5NSA0IDEyNCAxMSAxMDQgMTE2IDEyNiA0OSA5NSAzIDU1IDk2IDcwIDkwIDEwMSA0IDEyMiA5NiA3NSAKKzExOCAzOSAxMjggOTkgOTIgMTggNDIgMjAgODcgODMgMzUgNzUgMTExIDYxIDY3IDcxIDI4IDEwMSA5IDU2IDM0IDEwNSA5NSA3MSAyMyAKKzczIDcxIDI2IDU3IDE1IDIzIDc2IDU1IDk5IDg5IDEyOCA5OCAxMTcgNjggNDMgODggNjIgMzggNjIgMzkgMiA4MyAzNiAxNSAyNiA2MCAKKzEyOCA5NiA3MyA3NCAxMCAxIDEyIDQyIDIyIDIgNzcgMzMgMzMgMzIgNTcgMTMgMTQgODIgNTcgMTIgMzkgMyA1OCA4MCAxNCA4NyA4NSAKKzQ0IDY5IDEwOSAxMTkgXgorMjgzIDAgMTAyIDU1IDUzIDQxIDYwIDg4IDI1IDY3IDU4IDc2IDQ0IDIyIDY4IDExOCAxMDggNDAgOTUgOTYgODEgOTAgODUgMjggNzcgCisxOCAxMSAzNyA3MiA5MyA2MCAxMTAgMTI0IDExOSA5NSAxMzEgOTEgMzcgMTA5IDEyNiA4IDczIDY5IDcyIDgwIDE3IDgzIDUgNzYgMjAgCiszMiAxNSAxMCAxIDEwMyAxOCAyMiAxMTYgOTggOSA1MSAxMDQgMTAyIDQ0IDMzIDE1IDEyIDI0IDMxIDg5IDEgNiAyOCAxMDEgOCA2NCAKKzcyIDEwNiAzMCA1IDUyIDg5IDExMSAzOSAxMDggNjQgODUgMTcgNTcgMTI0IDIyIDEwNSA3OCAxMTUgMyA0MCAxMDggNjYgMTA4IDc3IAorMTI4IDEwMyA0NCAzNSAzOCAxMyA5NSAxMCAxMTEgNjMgOTggMTE3IDYxIDUxIDEyNiA2OSA5NiA3MCA3MCA1OSAzOSAxMyA5NyAzMyAKKzExMiAyIDc3IDcgMTIzIDcwIDgzIDI5IDY2IDY3IDQ5IDc5IDE5IDEwNCAxMTUgMTQgNjAgMiA1NSA0MCA3MSAzMyAyOCAxMTQgNTEgOTEgCisxNyA0NiA0NSAxMjggNTcgODcgNjIgMjUgMTE1IDM4IDUwIDU1IDkwIDc0IDggNTEgMTAyIDc5IDQzIDk0IDM2IDEyMiA5NCAxMiA0MSAKKzM2IDI1IDEwNCA5MSAyNCA3IDk5IDgwIDMwIDEyNiAzMiA2MyAxMjIgMTA3IDExNCAyNyAyOCA3OSA0MSAxMiAzNSA1MSAxMTUgMTIyIAorNzAgMjIgNzkgNjUgMiA4OCAyNyAxNyA1OSAxNSAyMyA0NCA1NyA1IDY1IDYgMjYgNzggODAgMTI1IDkzIDg0IDEwMCA0NSAyMiAxMjkgCis2OCAzNiAxMTEgNzQgMTE4IDExIDUwIDQyIDEyMCA0NyAyMSA4IDg2IDExMiAyNiA2NyA2MCA5OSA0NSA5MyA0NyA4IDM4IDU5IDUyIDU2IAorMTI0IDIwIDgyIDE4IDExNyAyNCAxOCA0NiAxMDYgMTkgMTE3IDI2IDQxIDQ3IDQ1IDEzMCA3IDE1IDEgNCA1IDEwMCAxMCA4NSA1MCA0NCAKKzExIDQ4IDkyIDExOSAxMDggNDIgMTE4IDEyNSBeCisyNzIgMCA4IDYxIDk5IDcwIDk2IDIwIDg3IDEyMyAxMzQgODIgMjIgMiAxMTAgMTE4IDMzIDg2IDUgNyA1IDk0IDU2IDE1IDYwIDk2IDU0IAorMTMgMjIgNTUgOTkgNCAyNSAxMDUgMTcgMzcgNjkgMTAgMzggMTE3IDExNyAzMCA3MCAxMyA5IDEwOSAxMTUgNjIgOTQgNTIgNjYgMTE3IAorMTAwIDEzNSA3IDc1IDIzIDUgODEgMTEwIDMxIDExOCAyOSAxIDYyIDExIDQxIDg4IDEwOSAxMTkgMTAyIDM3IDMgMzAgMTIzIDQ3IDMxIAorNTYgMTM0IDI5IDEyNCAxMTYgMTE4IDk5IDIxIDU2IDc3IDkxIDIzIDM3IDEzNSA4MSA0NCA1MSA2NyA5NSA1MSAxMzMgMzAgNTcgNjcgCisxMTYgMTIyIDQ4IDEwMCA3IDEzMiA5NyAxMDYgNjkgOTMgNCA5NSAxMjUgMTAyIDEwMyAxMTkgODEgNTcgMTMzIDk2IDM3IDExOCA1MCAKKzExNyAxMTMgODEgMTI3IDE3IDQ1IDEwMyAzMiAxMjEgMTI5IDYwIDQzIDY1IDEyNyAzMCAzNiAxMzIgMTEwIDUyIDUzIDM1IDcxIDEyIAorNzYgMjIgNzIgMTMwIDExMiA5OSA3NiAyNiAyMSA3MyA2MyA2MyA5NyAyMyA1OCAxMTUgMTMyIDExNCAxIDEzMiAzMSAzNSAxOCAyMyA1NCAKKzMwIDUzIDExOCAzNyAzNSA4NCA5NCA2MCAxMDAgMyA0NyAxOCAxMTAgMTA1IDg3IDU3IDYzIDc2IDQzIDUyIDQ1IDQ2IDQ5IDY1IDEyIAorMTAgNDIgNjYgNjAgMTE3IDM0IDE5IDkyIDUgMjggNzYgOSAxMjYgMTAxIDEyNSAzMiAzOCAzNCAxNSA3IDYyIDMyIDIxIDMgNDMgNjkgCiszMSAxMDkgMTIzIDUxIDExNiAxMzUgMTMwIDEyOSAxMzAgNjMgMTQgNTcgODAgNjIgMTUgMTI2IDMxIDEwNSA4MyAxMDggMTIwIDgwIAorMTI0IDQ2IDk4IDEwNSA5MSA2IDYgMjcgNyA1OCAxMjggNzggNyA3OSA2MyA4NCA3NyA3NCAxMjggNjUgNjEgOTUgMTIxIDE3IDI0IDEyMyAKKzExNyA1MSAxMjIgXgorMjg0IDAgNDQgNzEgNDMgMjAgMTI2IDU4IDUzIDQ3IDk4IDE4IDE5IDExOSA5MyAyOSA3MCAzOSA5NCAxMTIgNDQgMTE1IDEzNSA5OCA4MiAKKzEwIDY3IDI5IDEwMiAxMTMgNjggODAgMTkgNzUgMSA5MSAxMTQgODcgODAgNyA0MCAzNyA4NiAxMjAgMTYgMTA0IDEzNiAxMTcgODIgCisxMzggMzIgNjUgMTE0IDExOSAxMzcgMTIxIDggMTIgNDYgMTI2IDI2IDExOSA3MyAxMzAgNjAgNzYgMTEzIDEwMCAxNCAxMzMgMjYgMTE2IAorMzQgMTIwIDgwIDk1IDg0IDUzIDE1IDI0IDQ0IDUxIDQgMTAgMjMgNzcgMjQgOTkgNjYgMzcgNTQgNjMgNDIgMTM2IDIxIDM0IDc2IDUgCisxNyAxMjggMTAxIDEgNTkgNDAgMTEzIDExMiAzMiA5NyAzMSA5MyAxMDUgNzkgOTEgMTggMzkgMSAxMDMgMTMyIDUxIDY4IDEyNCAxMTEgCisxMyA5NyA0MyAxMjggNjkgODQgODUgNzIgMTUgMTIgMjYgODcgMTYgMTYgOTIgMTAxIDEzIDc3IDQgMTE4IDg5IDEwMyA1NiA0MiAxNiAKKzYwIDQ0IDM5IDEyNiA0NiAxOCA4MyA5MyA0MSAxMDUgMyA4MiAxMDYgMTE1IDkxIDYgNCA1NCAxMTUgMTUgMTIwIDEwOSAxMTMgNDggNDEgCis5IDk1IDIwIDYyIDY3IDEwNSAxMTEgMjUgMTMyIDcgMTE2IDQ2IDEzOCA0NCA4MyA2MSAxMjQgMTMxIDM1IDEwNyA2IDEwOSA4MSAxMTQgCis2NyA0MSAxMzcgNzcgNTYgNzQgNzMgMzQgMTIgMTQgNjkgNTIgMTEgOTggNDcgNTQgODMgODEgNiAxIDE1IDg4IDM1IDEzOSA4MCA4MyAKKzQ5IDg5IDI3IDQ3IDEzMCA5MiAxMzMgODcgNTEgMTEyIDc2IDQ5IDEwOSA0OSA1NyA5MyA3MyAyMiAxMTcgNTAgNjQgNTggOTcgMTM5IAorMzYgMTMxIDExMSAxMzMgNTggMzMgOCA4OCA1NSAzOCA5MCA0NiAzMCAxMTggNTcgMjkgODIgNzQgNDEgMTE3IDM4IDQ2IDk0IDkyIDUgCisxMDUgMTUgMTE3IDcwIDEwMyA2OCA2MCAxMjAgNDggMjEgMTEwIDg1IDQwIDgxIDY2IF4KKzI5MSAwIDQ2IDExMyA1MiAxMzQgNzkgNzQgNjQgNTcgMTggMjMgOSA1MiA4IDE2IDEwMyA1NyAxMzggNTkgNTkgNjUgOTIgMiA3IDEzMCAKKzkyIDggMzQgNDAgODYgMTMxIDE0MCAxMDAgMTEyIDQgNDIgMSAxMTAgMTA4IDQzIDM3IDE1IDY3IDE5IDM1IDk0IDYxIDEzMCA5OCAzNSAKKzg4IDM0IDY1IDEwNCA1NiAxMjYgMTE4IDUwIDg3IDEwIDgxIDEwOSA5MCA4NiAxMTggMzIgNiAxMTQgODggMzkgMzggMzkgNjIgMyAxMiAKKzEzNCA3MiAxMzcgMzUgNzUgODEgMTE1IDEwNiAxNDAgMTEyIDExIDEyMyA0MSAxMDMgNDUgOTUgODQgNzEgMTA3IDEzIDI2IDExMCA5NiAKKzYyIDE2IDEwOSA4NCA1OSA1MyAzOCAyNyA4IDI4IDEzIDMyIDEzNyAxNyAxMzggNDEgMTIyIDM2IDk5IDY1IDk5IDgzIDM2IDExMiAyOSAKKzQ5IDcwIDk2IDEyNiAxMzYgMTMxIDExNiAzIDE4IDE3IDEyNiAxNDIgMTQgMzcgMTQxIDE0MSAxMjMgNDIgMTMgMjAgODMgNDIgMTM5IAorODMgNTQgNDkgNTggNDIgNyAxMzcgMjkgNDggMTYgMTIxIDEyNyAzNCA1MiAxNDAgMTA2IDEyOCA1OCAzNiAxMjQgODMgMjQgNjkgNTQgCis2MSAxMTIgMTcgNiA5NSA5NyAyNCA1NyA4NiAxMjQgNTkgNzEgMTE5IDY3IDEgMTA5IDU0IDY4IDQ5IDU3IDEzMiAzMiA1IDcxIDExMyAKKzQwIDgwIDEwNCA3NSAxMDYgMTMzIDMxIDEyNiAxMzAgMTA0IDYyIDkgMzkgNDQgNjYgMTE2IDE0MSAxMzUgOTYgMTMyIDE5IDQxIDEyMSAKKzEyNiAxMjQgNzcgOCA0IDYwIDgyIDYgMTAxIDEyNCA4OSA1MSAxMjMgNDggNDAgODUgNzcgMjEgMTEyIDEwIDY5IDY2IDExNSA4NyAxNiAKKzEwOCAzMCA4NCA2NSA4MCAxMDMgMzIgMTMxIDEzNCA3MyA0NyAxMCA2MyAzOSA1MCA5MyAzNyAxMzUgMTE0IDY5IDQ4IDM0IDU4IDIzIAorMjcgMTMzIDM3IDkgNDAgOTggNDEgMTE1IDk5IDcwIDgzIDI5IDQyIDY3IDEzMyA1NSA3OSA4MCA5MSAxMjIgMTIgMiAxMTUgMTEyIDQ3IF4KKzI5MyAxIDMzIDEzIDk5IDEzOCAxIDQyIDg5IDExOCA4NyAxMTMgOTkgMTIgMTM0IDE0MiAxMDAgMzggNSA1NSA3NSAxNCAxMTAgMTA4IAorNDIgNjQgMTMwIDc5IDEzOCA2MiA2NCA2OSA1NyAxMSAxMjMgMjUgNTkgMTYgMTExIDk0IDI0IDY1IDMwIDUxIDExOSA0OCAxMDcgOTIgCis4NCA2OSAyOCAxMzYgMTQzIDU0IDIwIDYgNzAgNDcgMTQyIDY0IDQgNjUgNTkgNzMgOTkgMTM0IDE0NiAxMDIgMTI1IDExNiA1NyAxMzcgCisxMzcgNzIgNDggMTI4IDc4IDUgODAgNjMgNTQgODUgMzAgMjIgMTI5IDY4IDIxIDIxIDc0IDI4IDEyOCAxMDcgMjcgNjAgMiA5MyA5NSAKKzcxIDM3IDExIDM3IDE1IDM5IDEwMiAzIDEwNCA2NSA4MCA1OSA1MiAxMTMgMzQgMjAgNjcgNjAgMjcgODEgMTM1IDQ2IDEwNiAxMDYgCisxMDIgNjggMTI4IDE3IDE1IDEwMCAxMjQgMTUgNDMgMTM2IDEyMiAxMDAgNjcgMTQyIDM1IDE0IDUzIDEyMCAyIDg5IDkzIDk5IDczIDkgCisxMjIgMzkgNzcgMTUgOTYgOTAgNDMgNzkgMTM0IDYwIDkyIDEwNSA1NSA5NiAzMSAxMTkgNzcgOTcgNzIgMjMgMTQwIDM4IDMwIDQzIDgzIAorMTM2IDg4IDEwNyAxMTcgNzIgMTA5IDExOCA1OCA5MSAxMTkgNzMgOTUgMTAwIDU5IDEzOCAxMjMgNTQgNDkgMTQzIDUwIDEzMyA2NiAKKzEwNiA0NSA4MCA4OCA0MiA5MyA1IDU5IDc3IDEwMSA3NCAxMTAgMTA0IDQwIDkyIDE5IDc3IDc2IDg2IDEwMiAxMjkgMyAxNDQgMTAxIAorMTM5IDEzNCA1NiA5MCAxOCA5MSA5NCA4NSA1NSAxMCAxMzcgMTEgNTggMSAxMDcgMTEzIDcwIDIyIDcgNTYgMjkgMTQzIDExMSA4IDQ2IAorNDUgMTE2IDEyMiAxMjkgODkgNyAxMjEgNTMgOTUgMTQgNDkgMTE4IDYyIDEyNSA5MSAzNyA5NyAxNSAzNSAxMDAgNjMgMTQwIDYzIDUwIAorNTEgNTggMjYgMTI3IDYgNDUgNTkgMTAyIDEyMSAxMTQgODUgMTQxIDEzNSAxMCA3MiAxOSAxMDYgNjYgNjYgNDEgNTMgMTMgMzggMSAyMSAKKzEwMyA1MCAxMDggNDYgMTE5IF4KKzI5NyAxIDQ2IDMxIDEzMiAxMTIgMjggNjMgMTI0IDk3IDEyOSA0MyA0MCA3MiA5OSAxMDcgMTMyIDEzNyA5NiAxMzkgOTkgMTQ1IDEyMSAKKzE0NCAxMTggMzcgODEgMzkgOTQgNjAgNTUgMTA5IDQ3IDEwOSAxMTAgNzUgNDIgMTIgMTM5IDEzNyA0MyAxMjggMTA2IDEwNyAxOSAxMjYgCisxMiAxMDEgMTQ4IDEyNyAxNSAxMTcgMTI1IDEyNSA2MiA5NiAxMyA3NiA3MCA5NiAxMDEgMTEwIDEzOCA4IDk1IDc2IDE0MyAxNyAzMiAKKzk3IDc5IDE0OSAzOSAzMSA5NCAxMjMgMjEgNDEgMTM1IDU1IDg0IDcwIDMzIDEzNSAxMTggNTAgNjIgMTIxIDgxIDEgNDUgMTQ0IDkzIAorNjAgNSA2NCAxMzcgOCAxMDUgOTEgODIgNjcgMjcgMTEzIDExOSA1MyAxOCA5OCA3OSA0OCA4NCAzMiAxMzUgMTI4IDUgMSAyMCA3NiAxNyAKKzg1IDEwOCA3MiAzNiAxNDEgMTQwIDQ5IDE1MCAxMDUgMTA0IDMgMTQ5IDE0IDU0IDE4IDE0OCA2NCA0OSAxMjUgMzcgMjggMjggMTAxIAorMjIgMTA0IDkxIDMyIDgyIDExNyAxMiAxMTQgNjkgNTggMiA1OCAxMTUgOSAxMDggNDcgNTkgNjUgMTQgOTIgNyA0IDg2IDk4IDE2IDgyIAorOTIgOTUgMzggOTQgMTAgMTAgNDggOTcgMTA0IDY2IDExNSA5NyAxNDIgMTE1IDEyMiAxMTkgNDAgOTcgMTYgMzIgNDcgMzQgODggODkgCisyNiA1MCAxMiA3NiA4MCA1MSA0MCA5IDEzMyAyNCA0NCA0MCAxMjIgODQgMTA4IDIyIDE0MiAxNDAgOTkgNDQgMTUgNTQgOCA0MiAxMjUgCisxNTAgMTMwIDIxIDc5IDEyNCA2MiA0NiAxMTkgMTUgMjkgOTEgNTcgMTUwIDQyIDEzOCA3MSA2MSA2OCA4MCAxMTQgNiAxIDcwIDEyMSAKKzE4IDM1IDExMyA1NiA4NyA4NiAxMCA3MyAxNCAyOSA0MSA3MiA4OSAxIDEzMyA4NyAxMDEgMTIzIDU5IDkwIDE0MiA3NyAxMzMgNTIgNzggCis0OCAzNCAxMzggMTM0IDI3IDE3IDYwIDEzMSAxNDcgNjEgOTMgMTQ4IDM5IDEzMiA0OSA2MiA3MSAzNiA5MSA0IDEzOSA0OSAxMDAgMTIwIAorNDMgMTEzIDE0NCAzMCA5NCA3MyAxMjcgNDAgMTI1IF4KKzMxMyAxIDM1IDk3IDk1IDc2IDEwNSA4OCAzMiAxMzggMzAgNjkgNjEgNDAgNDcgMjEgMTA3IDYgMzkgODEgMTE0IDUzIDEyNSA1MyAxNDcgCisxNCA0IDczIDE0NiA5NiA5OCAxMyAxMzYgMTEgOTggMTE3IDEzOCAxNTMgNjcgMTQ2IDcxIDk5IDg4IDcgMTM5IDI0IDEzIDM1IDQ3IDk3IAorMTQ1IDc0IDM2IDExOSAzIDUxIDg0IDQ4IDExOSA1MyA0OSAxNSA3OSAxNyAxMjAgMTAzIDE0OCA2NCAzMCA0MSA5NyAxMjAgNzUgMTExIAorNjMgNTggMTMxIDEzNCAxOCAxMyAxMCA0OCAxOCAxNiA0OCA0MyAxNSA1NCAxOCA0MSA0NyAxMjIgMTQ0IDgwIDkyIDE0NSA3NyAxIDMzIAorODkgNTQgNDYgNzggNDggMjEgNTQgNDMgNDAgNTMgMjQgMTYgNzMgNDIgOTQgMjkgNDQgMzQgMTUxIDE1MiAyMyAxMjMgMTIgMTQyIDE0MCAKKzQzIDM3IDg4IDI5IDE5IDM1IDcyIDk2IDE1MSAxMzAgNjIgMTEyIDM0IDM2IDkxIDEyMCA1MCAxMTIgMTM4IDIgMTA1IDYwIDY4IDEzNyAKKzEzMSA1IDE3IDE5IDEzOSA3NCAxMSAxMjAgNzggMTQ5IDU4IDEyOCAxNSAxMDQgMTYgMTI2IDc4IDIwIDU3IDEzNCA3MSA0OSA5MCA3NiAKKzEwOCAxMjYgMTAwIDU0IDY4IDM5IDEzMiAxNTMgNDIgMTQ3IDE0NiAxMjQgNjIgODcgMzUgNzUgNjEgNjUgNDYgMTAwIDgyIDEwNSAxMTMgCiszMSA2MyA1IDk1IDU0IDcxIDc3IDEyNyAxNTAgODAgMzYgMTQ0IDIgMTMwIDU5IDc0IDM5IDMgMTUyIDEyMSAxMjIgMTggMTE3IDEyIAorMTE3IDE0MSAxMTggMTM1IDYyIDM2IDY5IDUgMzkgNTMgMTUwIDUyIDE1MyAxNDMgMzAgNjYgOTYgMTI2IDEzMSA1NiAxMzcgOCA3IDg2IAorMTQyIDE0IDcgMTExIDE0MSA5MyAxMzYgMTM3IDEzNCA0MyAxMiA4OSAyMyA0NCA5IDE1MiAxNDYgMTIxIDk3IDE5IDM4IDExMCA5MSA2NyAKKzE0IDMyIDExMCA2NiA2OCA4IDEzMCA4NCA3MyAxMTggNTkgMjQgNDEgNzIgMTIxIDE1MCA1NSAzNyAxMzggMjcgMTA0IDY2IDEyNCA5IAorNTEgMTA5IDQ3IDEyNSAxMDkgMTQ4IDggMjkgNDcgNzIgMTQ2IDE0OSA2MSA5MyAxMCAyMCA1NCAxNSA3NiAxMzMgMTI1IDEwNiAxMTAgCis2NyBeCiszMzAgMCAyMyA5IDI2IDEzNiAyNyA1MSAxMTUgMTIyIDQ0IDEwNiA2IDE0NiAxMDggMTEzIDg1IDUxIDggOTYgNDcgNTYgMTM3IDYyIDU5IAorODkgMTQzIDcxIDE0MCAxNCA4NSAxNTYgMTM5IDk5IDE1NCAzMCA1MyAxMTUgMzUgMTQ3IDEwOCAxNDggNTggNTIgMjggMTAzIDE5IDkyIAorOTUgMTUyIDE1MiAxMCAxMSAxMyAxNTUgNjcgMTEgODMgMTAxIDY5IDE1MyAxNTIgNDUgMTQxIDE0IDEyMCAxMjkgMTQwIDExOSA1OSAyIAorODkgNzMgNzAgODMgMjkgMTYgNjcgODEgMjkgMSA1NCA2NSA5NiAxMTcgMiAzNyA0NyAxMjggMzMgMyA4OSAxMDggOTggMTM5IDQ5IDc4IAorMjcgMTAzIDM5IDExOSA5NCAxMzIgOTAgMzggMTMyIDU1IDY1IDEzMSA5MCA1OCAyIDU0IDEwMCA2OSAxMTggMjIgNDQgMTkgNyAxNDggCis5MyAyNSAyOSAxMjMgODEgNjQgMTMxIDU1IDMwIDEgODkgMzggOTcgODIgNjQgOSAyOCA4NiAxMjMgMTUxIDEwIDEzMyA0MCAxNTQgMTAyIAorNCAxMTEgNjUgOSA2MyA1OSAxMjQgMTE2IDcyIDEwNSA3NiA1NyAxMzcgOTcgMzIgMTQ1IDEwOCA3OCAxMTIgNTAgNDMgMzQgNzUgMjAgCisyMiAxMjkgNjggMTEgMTE4IDc0IDEyNSAxMTggNTcgMTcgMjAgMTI5IDUzIDY1IDYxIDE0NCAxIDE3IDE0MiAxNTYgNTIgMTAwIDU0IDE1IAorMjAgNTkgNTIgNjMgMTMxIDIwIDU3IDEyNCAzMSAxMjUgNDYgMTA2IDc2IDkyIDggOTggMTU0IDE1MiA4MCAxMTQgMTUgMTQwIDEzNiAKKzExMiAxMDAgMTcgOTIgMjUgMTUxIDE1MCA4MCA5OSA2OSA4MyA0OSA0MyAxNTYgMTAyIDE5IDU3IDEyMiA5NiAzMCAzIDM5IDEzNCA0MCAKKzMyIDc1IDUgNzYgMTI3IDEzOCA5OSAxNyA1NyA1MiAxNTAgMTMwIDE4IDEyNyAzMyAyMyAxMTYgMTA3IDc4IDc3IDc3IDQyIDY5IDY4IAorNDggNDEgNjkgMzMgNzUgNDAgNDkgMTI4IDEwMyA0IDE0NiA5MyAxMCA4MyA2NiA5NiAxNTIgMzAgMzggMTIgMzMgNSAzOSA0NyA0MSAzNCAKKzYwIDc0IDIwIDQyIDE1NiA2NyA0NiA1NiAxMDIgODkgMyAxMjQgODEgOTkgMTA0IDU2IDUwIDggNjEgNzQgNTUgMTUgODcgMTA4IDI4IAorMTM4IDQ3IDkzIDYwIDIgMTI0IDQ2IDEyNiAxMDMgOTEgMTQ1IDM2IDI1IDExNiAxMjIgNTEgXgorMzIyIDAgNzUgNyAxMDcgMTU4IDgxIDEwNSAxNTQgOTAgMjAgMTI1IDc3IDExNCA2OSA5MiA3IDU4IDIxIDk4IDE1NCA1MCAxMjggMTQ5IAorMTE3IDEyNyAxNTMgNDUgMyAxOCAxMjEgODYgMjkgNzEgNzkgMTAxIDIgNSAyMiAxNDMgMTAgMjcgNTMgMTQ2IDE1NyAxNDggMTEyIDMzIAorMjIgODAgMTIzIDI0IDE0NyAxIDExMiA4MiAxNTkgNjMgNzQgOTcgMTA5IDMzIDE1MSAzMiA4OSA4NyAxMzIgMTE3IDQ2IDEyOSA1OSAKKzExNSA5MSAxMTQgMTE4IDM3IDIxIDkgOTQgNjAgMjUgODkgNDcgNzkgMTEwIDU1IDEyIDE0MyA5OSA4NyA0MyA4OCA1NiA1NyAxNjAgNzYgCisxMiA3MSAxMjggNzcgMTQ2IDExNyA5NSAxMDUgNDIgNjYgMyA3NiAyMCA3NiAxMDEgMTAwIDExOCAxNDkgNDUgMjYgMTQzIDE0OCAzMiAKKzU3IDM5IDEyOSAxOSAzMSA4NCAxMjMgMSAxNTIgMTM1IDUgNTQgMzAgMTMgMTI1IDY4IDMwIDYyIDEwMSA1MSAxNDIgNSA5NCA4MyAyMCAKKzExNiAyNCAxMDcgMTA5IDEwNSA5MSA0MiAxNyAyNyA5MyA2OSAzIDEzOSA2OCA3OSAzOCA4NCAyIDg1IDEyOCAxMjYgMTIyIDEzMSA0NiAKKzE3IDM1IDk4IDQyIDI2IDExMSAxMDAgMjkgMTIwIDU1IDg0IDExNCAxMDkgMTQ1IDE0IDE4IDEzOCAxNCA5IDg1IDcgMTggMTI5IDkxIDIgCis5NCA1MSAxMzMgODIgODcgMTIzIDY0IDM5IDggMTAzIDM4IDc1IDExMCA3OCA3IDkgNDUgMTE1IDQyIDEzOCAxMzUgODYgNzggMTYgNjIgCis1MiA3NSAxNTkgNTQgMTUxIDEyMSAxNDkgNzcgNzQgMTYgODUgNDcgMTAyIDEwNSA4MiAxMTkgMTAgNjcgMTM3IDE1MyAxNDggMTM1IDI4IAorNDkgMjYgMTUxIDE1MyAzNiA4MCAxMSAxMzAgMTEzIDI0IDQ0IDMwIDEwMiAyNCA1OCAxMzMgMTIyIDE0MCA5OSAyNCAxNTYgNTQgMTE5IAorNDIgMTE1IDE0MCA5MCAxMzIgMTkgOTQgMiAxNTcgOTkgMTM2IDE5IDcxIDcgMTMwIDE1MyAxMDggNTEgMjEgNTggNzAgNzQgMTM3IDEgCis0MCAxMTEgMTQ5IDUgMTAzIDYgMjcgNzYgMTQxIDIzIDEyNSAxNDAgMSA3MiAyOSAxNTIgMTAzIDg3IDUxIDkzIDI5IDgwIDEzMiA3NyAKKzEyMyAxNTMgNjggMTU5IDE0IDk4IDExNCAxNTggMTIxIDE1OCA4MSAxMzEgXgorMzIyIDAgMzUgOTMgMTA5IDEyNSAxMTkgMTAgMTAgMTkgMTM1IDI2IDQgNzQgMTM1IDM1IDEyMCAxMjkgMTEzIDkyIDE3IDI5IDQ3IDg4IAorMTQgMTU5IDE0OSA4NyA0NSAzNiA3NSA2OCAyMiAxMzggMjAgNTkgNjEgMTQ0IDE1MSAxMSAxMDcgNiAxNTMgODEgMTE0IDQzIDg1IDE1NyAKKzk3IDE0OCAxMTggNzMgMTI2IDU2IDU4IDEzNyA5NiAxMSA5OCA2NyA5OCAxMDMgNTcgMTQ2IDIxIDU5IDg4IDE1MSAxMzkgMTQ4IDEyNyAKKzI1IDE3IDQ3IDExNSAzNCAxNjAgMTA5IDEwNyA1MSA2NCAyOCA2OSAxMyA0OSAxNDkgNjkgMTQxIDkwIDkzIDExOCA2NCAxMCAxIDY3IAorODAgMzUgMTExIDEzIDU4IDEwMSAxMjQgMTMyIDE0NyAxNTQgMTggMTYyIDYgMTYyIDMzIDUgMzQgMTQyIDQxIDE2MSA4MiAxMTQgNzAgCis5MiAxNDUgNTcgMTU1IDEzNyAxMTQgNzkgNDQgMzYgNDggNDggMjEgMTQgMTMgNDAgMzMgMTQgMTUwIDMzIDMyIDU0IDE0MyAxNCA0IAorMTAxIDE0MiAyMyA5MyAxMzYgMTMyIDEyMCAxNDcgMTcgMzggMTYzIDE0MyA1IDUyIDQ2IDE1MSAxMzAgMzIgNzIgMzQgMTI0IDE1MCA1MSAKKzEwMCAxMTIgMTI4IDEyNiA2NSAxMCAyOCA4NyA4MSAxNTkgMTMxIDE5IDk5IDU0IDEyNSAxMTAgNTggMTE5IDI4IDc4IDEyOSAxMDQgCisxNDAgMTI2IDM4IDE1NCAyNyAxMTQgNjEgMTUzIDkwIDY2IDk4IDc2IDUwIDE1OCA0OCAzOSA4MiAxMjMgMjIgMTQ3IDEzNiAxMTQgNTIgCiszNyAzNSA3NSA0MSAxNSAxNTAgNjAgNTIgNTUgMTAzIDIxIDIzIDEyOSA5NSAyNCA3MSA0NyA5NyAxMzAgNTAgMTQwIDE0NCAxMDYgMTAwIAorOSA2NCAxOSAxMTcgMTIyIDcxIDkyIDggNzcgMTU2IDk3IDEyMSA5OCA4NSAyIDM2IDM5IDEwOSAxNDMgMjMgMTIwIDE1NiAxMzMgOTMgCisxNTQgMzYgNjYgMTE2IDEzMSAxNjAgMTI3IDE2MiAxNjEgNDYgMTQyIDE0IDE0MSA4MSAxNDEgNjMgODYgMTE3IDEwNCAzIDE0NiAzOSAKKzEyNyAzNCAxMzMgMTAyIDEwNiA5MSA1NyA5IDI4IDYwIDYxIDcgMTU4IDEyIDgwIDI2IDggMTIyIDgwIDQ0IDYzIDY4IDQ5IDE1OCAyMSAKKzMyIDgxIDE1MCAxNSAxNDEgMTA4IDE2MSA2NCA0NiAxMjQgMTIzIDMxIDk5IDI3IDEwNSAxMDkgOTggMTEyIDE0NCBeCiszMzYgMSAzNCAxNjEgMTA3IDE0OSA0OCA2NyAxMzggMTA5IDE1NiAxMDQgMzcgMTMzIDYwIDgwIDg0IDgxIDE2MCA5IDE2IDk2IDE2NCAxIAorOTUgMTEyIDQgODYgMTYzIDExNiA5OCAxMDMgNTUgMzEgOCA1NiAzNyAzNiAxMjcgMzIgOSA4OSAxMDMgMzEgMTAwIDE2MSA4NSAxMDYgCisxMTkgODkgMTU0IDQzIDExNSAxNjIgMTM3IDEwOCAxMjggMzggNDIgMTU1IDEwMyA5IDYyIDY1IDEwMiAxMjIgMTAgMTM4IDE2MCAxMjUgCis0NyAxNTggNDMgOTEgNjkgMTIzIDEzMiAzNSAxMjEgNCAxMTAgODkgMTMwIDY5IDI5IDEzOSA2OSA1MyA3MCA4MyAyOSAxNjMgNjcgNDEgCis5IDEwOCAzNCA0NSA3NiA4NyAyIDE0NCAxNjQgOTggMzMgMTYwIDc5IDc4IDQ4IDg5IDkgMzggMTM0IDkzIDE0NiA3OSA1NCAxMjIgODAgCiszOCAxMTIgNTUgNTUgMTAxIDcwIDggMTI5IDQ0IDcwIDU5IDk4IDE0OSAyNCAxMzYgMTI0IDEzOCA2MyAyNSAxNjYgODMgNTEgMzQgOTEgCis0NSAzMCAxMTggNTkgMjggODcgNzIgNDQgMTE2IDI4IDM2IDEwMyAxMDEgMTEzIDEwIDExNCA2MiAxMTEgNzEgNjUgMTI2IDUzIDE5IAorMTE0IDg2IDQyIDg1IDM2IDU3IDEzNyA1NyAxNTkgOTUgODggNzggNzIgMjAgMjMgMTQgNjUgMTAgMjIgMTI5IDY4IDEgNjggNzQgNzUgCisxMDggNyA3IDE0NyAxMDkgMTMgMzUgNTEgMTA0IDE1OCAxNjQgMTIyIDEyNiAyIDUwIDQgMTMyIDEyNyA1OSA1MiAxMyA4MSAyMCA0NyAKKzEwNyA3NCAxNDggMTE1IDQ2IDEwNiA0NiA4MiAxMTUgNjggMTQ0IDE0MiA2MCAxMDQgMTUgOTAgMTM2IDEwMiAxMDAgMTM0IDQyIDE1IAorMTQxIDEwMCA0MCA0OSA0OSA3MyAxNjYgMTMgMTU2IDgyIDE2NiAzNyA4MiA5NiAxMzcgMTMwIDE2NiAxMzQgMjAgMTM5IDQ1IDEyMiA1NiAKKzEwNyA5OCA3OSAxMjQgMTcgMzIgMTMwIDEyMCAxNjUgNzcgMjMgMTMwIDk2IDY3IDY4IDQ3IDM3IDEyIDI5IDE4IDM4IDE1OCAxOSAxNjAgCis1NSAxNDcgMzkgMTE4IDgzIDEyMSA5NiA0MyAxMzcgMzMgNjYgODYgMTEyIDE0NyAxNTUgMTQ5IDE0MCA1IDE5IDE3IDE0OCAxNjEgMTAgCis0NCAxNTkgMTQ2IDU3IDE2IDI2IDEwMiA0OSAzIDEwNCA2MSA1OSA3NCA1NiAxMCAxNjUgMzEgNTQgMjUgMTQyIDE1NyAzNyA1OCAxNjUgCisxMjggMTU0IDczIDUwIDE0OSA5NCAxMzcgXgorMzMwIDEgNjEgNTEgNjUgMTMyIDIzIDE2OSAxMTYgMTIyIDE0IDY2IDcgOTggMTMxIDcyIDY5IDEyNyA3MiAxNjMgMTI1IDY4IDY5IDUxIAorNDcgMTU5IDMxIDE2NCA3MSAxMTggNTAgODMgMTEzIDgxIDEyNyAxNTMgNDUgMTM3IDEzNCAxMjEgNjggMTYzIDI2IDQzIDY1IDEyNyAKKzE2NiAxMzggOTggMTQ0IDE4IDUzIDEzNyAxMzkgMTQ4IDc2IDE1OCA0IDYyIDc4IDE2NyAxMDIgMTQ0IDk0IDU1IDE0MSA2MyAyOSA5NyAKKzkxIDI0IDExNSAxNjYgODAgNjkgMTMyIDk5IDEgMTIwIDIzIDg4IDY0IDg3IDExOCAzNyAxMzcgMTUyIDk0IDYwIDE2OCA3MSA0NyA1MiAKKzExMCAzNyAxNTUgMTI1IDYzIDQyIDQzIDUyIDExIDEyIDE1MSAzMSAxMiA0NCAxMTAgMzIgMTI4IDExNyA2OCA4NyAyNCAzOSAxNjQgNzYgCisxNDUgNTggMTAxIDkxIDEwMCAxNDAgMTUxIDE0MyAxMzAgMzIgMjEgMyAxMTEgMSAzMSA3NSAxMjMgMTUzIDExNiAxMzUgMTMwIDI3IAorMTY0IDE2NSAxMTYgMjMgMTIgNjIgODMgMjQgMTMzIDEzOSA0OSA3NCAxNTQgODAgMTU4IDgwIDY0IDEwNSA5MSA2IDE0MiAyNyA3NSAyNCAKKzEyOCAxMTIgNDEgNzkgMjkgODQgMTQ1IDQwIDEyOCA5OSA5NSA5NSAxOSAxNyAxNjAgODkgMTUgMTcgODQgNjQgMTEgOTMgMTAgNjYgNzggCis3MyAxMjcgMTQ4IDE4IDEyOSAxMzkgMTQzIDQ5IDE1MCA5IDg0IDgyIDE1NCA4NSAxNSA4OCA4MiA2MCA4NyAxOSAxMiAxMzMgNTggMjAgCiszOSA2NSA1MSAxNDEgMTM0IDI3IDcwIDE2NyAxMjAgMTE3IDg2IDYwIDE2IDQ0IDE2IDU3IDEzMiAxOCAxNDIgODUgMTA0IDU5IDQ3IAorMTQxIDU4IDIgNjYgOTYgNDYgMTE5IDE1MyA0MCAxMTAgMTI2IDEwMyA5MCAxNDQgMTMgMjYgMTA2IDE0NCA4MCAxNDUgMTM0IDEwMyA5NSAKKzI0IDQ0IDIxIDg0IDE0MCAxMyA5NyAxMDQgMTQwIDk5IDYgMTQ3IDU0IDgzIDQyIDEwNiAxMzEgNTQgOTYgMTM1IDY3IDExOCAxMjEgODEgCisxMDkgMTAgNTMgMTMyIDExMiAxMTcgODEgMzMgMTU1IDQ5IDYxIDM4IDExOSAxIDEzIDEwMiAxMzEgMTQ4IDk0IDEzMSAxNDMgNjcgMTIzIAorMTQ4IDg5IDEwNCAxMzUgNzIgMTQ1IDE1MiA3NiA4NyA2IDY2IDIgNzEgMTIzIDc3IDExNCAxMDggNTkgMTIzIDE2NiA2MiA5NiAxNDAgCis5NCAxNDkgMTE2IDE2OSBeCiszNDkgMCAxMjUgMTcgOTMgODIgODAgMTEwIDE1NiAxNDcgMTU2IDk5IDE1NCA0IDI5IDkwIDE2MyAxMjAgODQgMTEzIDU2IDggMTU3IDI5IAorNjEgMTY5IDE0MSAxMTMgNzggNDggNTAgMTMgMTM4IDExIDUwIDYxIDk5IDEwNiAyIDEwNyA2IDExNyA4MSAxMTQgMzQgNDkgMTEyIDUyIAorMTMwIDgyIDczIDEwOCAyMCAyMiAxMTAgNjAgMTEgOTggMjIgNjIgNTggNDggMTQ2IDE0OSAyMyA4OCAxNDIgMTM5IDEyMSA5MSAxNiAKKzE2MyAyIDg4IDE3MSAxMzMgMTAwIDYyIDUxIDQ2IDEwIDI0IDE1MCA0OSAxMzEgNjAgMTE0IDYzIDg0IDkxIDY0IDE2NSAxMzggNDAgNDQgCisxNzIgMTExIDE0MSA1OCA3NCAxMTUgOTYgMTI5IDE0NSAxNjQgMTUzIDE3MCAxMjYgMjQgMTY5IDE2IDExNSA0MSAxMjUgNDYgODcgNjEgCis5MiAxNDUgMzkgMTU1IDkyIDc4IDcwIDM1IDI3IDIxIDQ4IDIxIDE1MSAxNTkgNDAgMTUgNSAxMzIgMTcwIDIzIDE4IDEwNyAxNjAgMTUwIAorNTYgMTMzIDIzIDY2IDEwOSAxMjMgMTAyIDEwMiAxNzIgMTY2IDE0NSAxMTYgMTUxIDM0IDEgMTUxIDEzMCA1IDM2IDM0IDk3IDExNCAxNSAKKzgyIDEyOCAxMTIgMTE5IDk5IDI5IDEzOCAxNjUgNDIgMzYgMTU5IDk1IDE5IDYzIDM2IDg5IDEwMSA0MCA5MiAxIDMzIDkzIDEwNCAxMTMgCisxMjYgMiAxMzYgOTYgNTIgMTA4IDkwIDU3IDg5IDMxIDUgMTEzIDMwIDM5IDM3IDk2IDQgMTQ3IDEyNyAxMDUgNDMgMTY1IDM1IDc1IDIzIAorMTQzIDEwNSAyNCAyNSAxMCA5NCAxMiAxNjAgMTAyIDk1IDE3MCA3MSAyMCA3MCAxMTIgMjMgOTUgMTQ0IDYxIDczIDEzNyA1NSAxIDgxIAorOTUgMjYgNjUgMTcyIDQxIDE0NyA3OSAxMDMgODAgNDAgMTIxIDM2IDEyIDY0IDk4IDE2OSA5MyAxMTEgMTE1IDQ4IDEyNyA5IDM5IDEwNyAKKzEzMSAxMTUgMTE4IDE2MiAxNjEgMTAgMTQyIDE0IDEyMyA1NCAxNDEgMzYgNDEgOTkgNzcgMTQwIDEyOCAxNjcgODIgMjUgMTA2IDU3IAorNzAgNjQgMjEgMTkgMTUgMzQgMTI2IDE0OSAxNjcgNTMgMTYzIDEyNyA4NiAzNSA4IDU0IDIzIDQwIDE0MCAzIDE2OSA0NSAxNTAgMTUyIAorOTYgODEgMTQzIDI4IDI4IDEyNCA4NyAxMyA5MCA5IDg3IDEwOSA1MyA2NyAxNjQgMjggMTMxIDg5IDE0OSA0MiA1NSAxMjYgNzkgMTMyIAorNzQgMTkgMTMzIDMwIDY4IDcyIDc1IDE0OCA5IDEwIDcyIDE1MiAxNDQgODMgMTA2IDE1MyA3NCAxNjMgOTggMTUyIF4KKzM3NSAxIDk0IDI4IDEzIDggMjAgMjggMTggMTE4IDUgMTQwIDg5IDY3IDE3MSA2NCAxNTIgODUgNjEgMTAxIDgwIDE1NCAxNDkgMzQgCisxMTUgMTM1IDEyOCAxMDggMTEwIDIwIDMzIDEyOCAxMDMgMzUgMzggNTcgOTUgMTAgMTExIDE1MSA5OCAyOSAxNDkgNyA4MiA2OSA5NiAKKzExNCAyNiAxMDMgMTcxIDEwMSA1MyAxMjEgMjQgMiAxMjEgNTEgMzUgNzAgODMgMjkgMTU0IDY3IDUgMTY3IDYzIDE2IDI3IDU4IDYwIDIgCis5OSAxMjggNzEgMzMgMTYwIDcwIDUxIDMgNDQgMTQ5IDIgODkgODQgMTAxIDQzIDE4IDExMyA3MSAzOCA5NCA1NSA0NiA3NCA1MiAxMzkgCisxMDIgMzUgNDMgNTAgODAgMTIyIDYgMTAwIDg4IDEyOSAzNiAyNSAxNDggNDcgMjQgNyA1NSAzNiAzMCA4MiAzMiAxOSA3OCA2MyAyNiAKKzcxIDI4IDE2NyA4NSA1NiAxNjcgOTUgMTU5IDc4IDI2IDY2IDM1IDY1IDkwIDQ0IDE1OSAxMDUgNTkgMTUgNjcgNTcgMTM3IDIxIDEzMiAKKzUwIDcwIDc4IDM2IDE2OSA1IDE3MiA1NiAxIDIyIDEyOSA2OCAxNjggMjMgNzQgMzAgOTkgMTM4IDE3NCAxMjAgOTEgMTUzIDggNDIgNjggCisxNTggMTU1IDEwNCA5OSAxMzMgNSAxMzUgOTYgODIgNTkgNTIgMTQ0IDM2IDIwIDM4IDYyIDI5IDExMiAxMDYgNDYgMTA2IDE5IDczIDcwIAorNDEgMTM1IDEzMyA0MiA5NSAxNSA0NSAxMzYgOTMgMTAwIDk4IDE3MyA2IDEzMiA1NSA0IDQgMzEgNjQgMTMwIDE2MiAxNTYgNjQgMTU3IAorMTkgNDYgOTYgOTIgMTAzIDEzOSAxMzQgMiA5NCAxOCA4NiAzOCA4OSA2MiA2MSA3OSAxNTcgMTQgMTEyIDExMSAxNTYgMzIgMTQgODUgCis3OCAzMSA1OSAyMCAxIDE2MSAxNjkgMTQ5IDI5IDEyMiAxNTAgMTMzIDM3IDEwMiAzMCAxMDkgNjUgODUgNTEgMTc0IDExMCAxNjQgNjYgCis3NyA3NiAxMTEgMTE5IDEzMSA5NSA1IDEgMTY2IDEwMyAxMzQgMTQxIDE3IDE1OCAxMjMgMTM3IDQ4IDE2NSAxNzUgMTAyIDEzIDMgODYgCis0MyAyMyA0NyA1NiAxNTAgMTY1IDQgMzYgMTc0IDExNSAxNTcgMTY4IDEzIDE0NyAxMTkgMTA5IDU1IDQxIDE0MCA2NyAyNyAzMSAyNyAKKzUzIDEyNiAxNyAxNjMgMTE2IDEyMiAxNjAgNjAgNyA5MiAxMTMgNjYgNDUgMTA5IDYwIDE1MSAxMjUgNjIgMzkgMzkgMTcgMTUzIDEzIAorMTUyIDUzIDk0IDUwIDUzIDg5IDU3IDEyNyAxNTMgNDUgMTE5IDEwNCAxMjEgNTYgMTQ1IDE3MiAxOSA0MSAxMDMgMTY2IDEwOCA2OCAKKzEyNiAxMiA1MyAxMzEgMTI3IDE0OCA1MiAxMzQgMTY4IDUwIDQ4IDE1NSA3MiAxMzIgODIgMzcgMTI5IDYzIDE3NSAxNjAgXgorMzY2IDEgNzMgMTUgNzkgMTM5IDcxIDUxIDEzMiA4MSAxMzUgMTExIDE2NiA2MSAzNyA2MCAxMTggMzcgOTIgMTM0IDk0IDYwIDE1MCA1MyAKKzQ3IDI1IDExMCAxOSAxMzcgMTA3IDI3IDE3NiA0MyAxNiAxNDUgMTQ2IDE0MiAxNjUgMTIgMTcgOTIgMTY2IDExMCAxMTcgNDEgNjkgNiAKKzEyIDE2NCA3NiAxMDkgNDAgMTAxIDgyIDgyIDEzMSAxMzQgMTE1IDE0MyAxMTIgMzIgMTY0IDE0NiA5MyAxNjIgMzEgNjYgMTIzIDE0NCAKKzgwIDEzNSA5NCAxMzcgMTU2IDEwNyAxNTcgMTczIDYyIDY1IDE3NiAxMjQgMTEyIDQgNjUgMTI3IDQ0IDEzMSA1MyAxOSAxMDUgOTEgCisxNDkgMTA2IDI3IDU3IDE1OCA5MiA4NSAxNCA3OSAyMCA4NCAxMjcgMTc0IDEyOCA3MiA2OCA1OSAxNzEgMTcgMTI0IDgwIDE2NyA4IDU3IAorMjggMTcyIDY2IDE0NCA0OCA0MiAzNyAxMDkgMTIxIDE4IDEyMCAxMDMgMTE2IDEzIDEzMiAzOSA3MyAxNDUgNzYgMTU4IDQzIDgyIDMzIAorNTEgMTUzIDE2NCA5NyAxMyAyIDMgMjAgMjQgMTE0IDk4IDkgMjUgMTMxIDEwMiA5OSA4NiA0MiAxNiAyNiAxNTkgMzkgMTA1IDE2MSAKKzEzMyA0OSA1OSA0MSAyMCAxMDUgMzEgMTM2IDMwIDg3IDEwIDExOSAxMzUgMTMgODMgOTkgNTggNDUgOTkgMTU2IDI2IDYxIDEzNSAxNDMgCis4MCAxMTggMTA3IDc2IDc3IDI0IDQ0IDEyIDY2IDk1IDE0NyA2MSA4NiAxNDAgOTkgMTY3IDEzOCA1NCA0NyA0MiA5NyAxMjIgMTggNjAgCis5MCA0MCA3MyA4NSA2MyA4MiAxIDM1IDk2IDk0IDgxIDU0IDE1IDEyOCA0MCA1MiAyIDEwMSAxIDE2NSA5MyAxMTMgMTMwIDg1IDk1IDk4IAorNTggMTA1IDExMiA1MyA2OCAxMDggNzIgMTAwIDE1MiA0OSA4NyAxNDAgMzkgMTU0IDYyIDExNCA3NyAxMDUgNjMgNTAgODcgMTU3IDI2IAorNzggMTIyIDY3IDE0MCA3MSAxNzAgMTE5IDUgOTMgNjQgNTAgMTA0IDE0NCAxMjkgMTM4IDc1IDEzMCA0IDE3OCA2MCAxMzkgMTIwIDU0IAorMTEzIDMyIDIgMTMzIDE3IDQzIDE2MyAxMjkgODkgNzIgMTQ5IDE1NSAzMCAzOCA3IDEzOCA1IDQ0IDYxIDY5IDc2IDE3NSAxMDcgNiA5MyAKKzgxIDExNCAyOCAyNSA4MiAyMiAxMTggNTggNzMgOTYgMTc1IDE3NyA5MiAzNiAxMSA5OCAxNzEgMzggMjggNDIgMTQ2IDEyNSAxNzggODggCisxMzYgMTM5IDEwMyA2NyAxMCAxNTEgMTUxIDcwIDE1MyAxMTUgOTQgMzIgNTEgMzQgMTc3IDE3MyAxMzIgNDkgMTE5IDU0IDk2IDQ1IDc4IAorNzMgNjQgMTU5IDEyMCAyMiAyMCAxNTQgMTExIDExNyA1OCA1NiAxMDkgNzIgMTQzIF4KKzM3MiAxIDEzNiAxNDYgMTQ0IDE3MCA5MCAxNSAxNjkgMTgwIDg4IDQxIDg5IDEwIDYwIDUyIDkyIDE0NSAyMSAxNTUgNDcgNDIgNjEgMjYgCisxOCAxNzYgNDggMjEgMTI0IDE0MSA0MCAxNzkgMTc4IDExNCAxNDMgMTQgMTY0IDcxIDE0MiAxMzIgMTEgMTI0IDIzIDM5IDgyIDExNCAKKzg0IDU3IDE2MyAxMzAgMTI3IDg5IDEzMyAxNiAxMzggMTUxIDEzMCAxNjAgMzQgNzAgNzggMTYxIDY0IDkyIDExMiAxMTAgNzIgMTc1IAorMTAyIDEzOCAxNzkgMTczIDE1OSA1OSAxOSAyNyAxOCA1MyA5MiAyMiA2NSAxNTYgMTcwIDU3IDEwNCA4NiAxMjYgMTQ4IDExOCAxNTUgCis3OCA0MyA2MyA5MCA0OCA4MCAxNjggMTQyIDY4IDEyIDM5IDE3NCA2OSAxNjggMTQ3IDExOCA5NiAzNCAxMjkgMzUgNzUgNSAxMDcgNjAgCisxNzAgMTgwIDE0NyA4NSAzIDEzMyA3NSA5NSAxNTIgNzEgMTc1IDQzIDk0IDE3OCA1MCAxNDQgMTYgNDYgMTAxIDQ2IDE2NSA0NSA2OCAKKzE2MyAzOCAxNzIgNSAxMzggNjEgODUgNjIgMTc3IDc2IDM2IDE2NyAxOSA1MyAxNTEgNjYgNjYgOTcgMyAxMDAgMTY0IDEyIDk4IDEzMSAKKzcwIDEwOSAxNjIgMTYxIDE1NiAxNDIgMTQgMTA1IDI3IDE0MSA5IDE3OCA4MSA1MCAxMTMgMTEwIDEzMSAzNyAxNiA3OSAxMiAzNCAzNyAKKzE2NyAxNzMgMTAgMTUyIDcgODEgMTQwIDE1OCAyNiAxMzYgODIgNTAgMTcyIDE1NCA0NSAxNjAgMzEgMTIyIDE2NyAxNDIgOSAxNTAgCisxMjUgNTEgNTQgMTI1IDE3NCAxMCAxMjQgNTEgMTc3IDgxIDE3MyA2OSAxMDkgOCAyMiAxNTUgMTkgODYgNjIgMTQ5IDMzIDM3IDEwOCAKKzM0IDk2IDI5IDE3NCAxMzMgMTY3IDUwIDU0IDY2IDEzMCA5IDEgMzYgMTM0IDEwOCA2NSA5NyAxMjYgNTYgMTYzIDcxIDgzIDg4IDEwIDEgCis4IDE3OCAyMiA2IDExMiAxNjkgMTE2IDg5IDQzIDE1MyA0MCAxNDYgODUgMzEgODkgNzQgMTU0IDEzNyAyOCAxMTUgMTE3IDEyMiAxMDggCis5OCA4IDI3IDExMCAxMDMgMTc2IDE3IDIwIDI3IDc3IDEwIDkzIDE0NSA4MCAxNyAxNDMgMTY1IDc2IDY5IDc4IDEwMiAyMCA5MSAxNzEgCis5NSAyOSAxMTUgMTc2IDE2NiAxMDkgMzkgMjMgNzAgODMgMjkgMTQ4IDY3IDE2MyAxNjEgMzMgNCAxNSA0NiA0MiAyIDY5IDEwNCA1MyAKKzMzIDE2MCA2NCAzMyAxNTUgMTQgMTMxIDE2MCA1OSA3OCA3MSAxOSAxNzYgMTA3IDY1IDM4IDgyIDU1IDQwIDU2IDQwIDExNSA4NCAyOSAKKzI1IDQ0IDY4IDEwNCAxNzYgNzYgNjQgMTIzIDE4IDI1IDEzNiAyMyA2IDE3MSAzMSAzMCAzMCA1OCAxNCAxMyA3MiA1NyAxNCA0MSAxNzcgCiteCiszNjMgMCAxMzUgNjkgMTYgMTY3IDc5IDE0MyA0NiAxNzggMjYgMyA2NSA1OCAzNiAxMzUgOTcgMzUgMTc1IDUxIDE1MiA1NyAxMzcgMTczIAorMTA4IDEwIDU0IDc4IDQgMTUzIDE3MyAxNjQgNDggMTc3IDIyIDEyOSA2OCAxNjggMTY3IDc0IDE3NCA5MSAxMDYgMTc0IDk2IDc1IDEyOSAKKzE2OCAzNCAzNiAxNTggMTQ3IDg4IDc1IDEwMSAxNDkgMTAzIDY0IDQyIDU5IDUyIDExMiAxODAgMjAgMzAgMjIgMTczIDgwIDk4IDQ2IAorMTA2IDE3OSA2NSAzMCAxNyAxMjcgMTI1IDI2IDg3IDE1IDUgMTM2IDg1IDEwMCA2NiAxNDEgMTgyIDEyNCAxNSAxNTYgMTQ4IDE1IDU2IAorOTggMTQ2IDE1NiA0OCAxNDkgMyAxNCA5NiA1MiA3OSAxMTUgMTM0IDE3MCA1NCAxNzggNTQgMjIgNzMgMzAgNDUgMzkgMTMzIDE4MiA5NiAKKzEwMyAxNDggMTc2IDYgNDUgNjIgMTgzIDUxIDE4MCAxNTMgMTQ1IDE0NSAxMTcgMjEgOTAgMTE4IDEwOSAyMSA2MiAyMiAxMDEgNDkgNTMgCisxMSAxNDIgODYgMTMyIDY2IDY5IDQ0IDc5IDg3IDExNSA1NSA1IDE2OSAxNTAgNjMgMTEwIDEwOSAxNzcgMTUwIDkxIDEyOSA0MCAxNDkgCisxNTkgMTAyIDE2NSAzIDcwIDI3IDE3NSAyMyA1NiAxMjYgMTY1IDE2NCAyMCAxNTggOTEgMTU3IDEzNiAxNTcgMTMxIDExMSA2OSAzOSAKKzMzIDEzMiA0MyAxOSAxNzUgMTc5IDM3IDExOCA5IDE1NSAxMTYgMTIyIDEyOCA1MiA3IDg0IDg5IDU4IDEzIDg1IDQ0IDEzNSAxMjUgNTQgCisxODMgMjMgMTYxIDE0NSAxNzMgMTM2IDI5IDYyIDUwIDEzIDU3IDI1IDEyNyAxNTMgNDUgOTUgNjQgMTIxIDQwIDEyMSAxNDAgMTcxIDkgCis3MSAxNjYgNjggMjggMTAyIDQgNTMgMTIzIDExMSAxNDggMjAgMTAyIDE2MCAzNCA4IDEzOSAzMiAxMTYgNjYgMTMgMTEzIDYzIDE0MyAKKzk3IDYzIDEwIDU5IDEyNCA2NiA0MSAxMzIgNzEgMTE1IDEwNiAxNTEgNDYgMjIgNDUgMTE4IDM3IDY3IDEyNCA5NCA2MCAxNDAgNDMgNDcgCisxMCAxMTAgOSAxMjcgOTcgNyAxNTYgNDMgMTgwIDEyNSAxMjYgMTM3IDE0NSAxMiAyIDgyIDE0NiAxMDAgMTE3IDI2IDU5IDE4MCAxODEgCisxNjQgNzYgODkgMzAgMTAxIDc3IDcyIDEyNiAxMTQgOTUgMTQzIDEwMiAzMiAxNDkgMTMxIDgzIDE1NyAzMSA2MSAxMjMgMTM5IDYwIAorMTM1IDc0IDE2OSAxMjIgMTUxIDEwMiAxMzcgMTY4IDYyIDU1IDE2NiAxMTkgOTcgMTYzIDYwIDExMiAyNCAxMTYgMzggMTc4IDEwNSA5MSAKKzEzNCA4NiAyNyA0NyAxMzggNzIgNzAgMTgzIDc5IDE1IDg0IDExNyAxNTQgMTI4IDU3IDUzIDM5IDE2MSA4OCBeCiszOTMgMSA5MiA3MiAxNTEgMzMgMTgzIDE2NCA0MiAxMTIgMzIgMTAgNSA5MyA5NyAxOCAxMTIgNzEgOTIgMTY4IDExNiAxNzkgMTg2IDY1IAorMTM3IDY4IDEzNCAzIDgyIDkgMTkgMTIxIDE0OCA2NSAxNjAgMTczIDE1OCAxNjcgOTAgNjYgMTgwIDE3MiA5OSA4NiA4MyA4NiAyNiAxNiAKKzEwIDEzNSAyMyA4MSAxMzcgMTI1IDE3IDE5IDI1IDE4MyA3MyA3IDEwNCAxODUgNzkgMTY1IDExOSAxMTkgMTc2IDU5IDc1IDE4IDUgNTkgCisxMzIgMjYgMjEgMTI3IDExOSA4MCA5NCA4MyA1MiA2MSAyNCA0NCA0IDUwIDU1IDExNSAyOSA3MCAxNDAgOTkgMTU5IDEzMCA1NCAxNSAKKzQyIDg5IDExNCAxNzMgMjggNTAgMTYgMzMgNTMgNDcgNTggMTgwIDE5IDY0IDc4IDQ5IDMwIDE4NiAxMDQgMzIgNDQgMTU3IDg1IDEgCisxNDkgODUgOTcgMTE0IDc3IDYzIDU4IDUwIDg5IDgwIDIxIDM2IDg0IDcyIDYwIDE1MiAyNSA4NyAxMDggMTUgMTM4IDU0IDEwNiA3NyAKKzk3IDIzIDQyIDU1IDE0OSAxODEgNjIgMTA2IDQzIDEzMiAzMSAxMzggMTExIDE3NiA5MyA0MCAxMCA5NiAxMjggMTA1IDExNCA0MyA5OCAKKzQgMTQ2IDIwIDEwNyAxMjAgMTQgMTEzIDE4MSAxMDEgMSAxOSAxNTUgMTEzIDU3IDY0IDExNyAxMzEgNiAyMiAxODYgMTM4IDE4NCAzNiAKKzYxIDI5IDM2IDE3NSAxMDcgNiA2MSA4MSAxMTQgMjAgMTgwIDQyIDE2OSAxMDIgMjYgNzMgODAgMTUxIDE1MyA2OCA0IDExIDk4IDEzOSAKKzYgMTc1IDM0IDE0NiA5MyAxNTQgODggMTI4IDEzOSA3OSAzNSAyIDEzNSAxMTkgNDYgMTI5IDkxIDg2IDE3OSA1MSAxOCAxNjkgMTQxIAorMTA4IDQ5IDEwMyA0NiA3MiAyMSA3MCA0OSA2NCAxNTEgOTYgMTg1IDE3NSAxMzAgMTExIDg1IDU4IDMyIDEwMSA0MCAxMDEgMTMxIDEzNiAKKzEzOSAxNzAgNzAgMTAgMTY5IDE3NSA3MyA0MSA2OSAxNzcgNDUgNDcgOTIgMTQ1IDExIDE1NSAyMiAyMiA1NiAyMSAxMyAxNjYgNDggMjEgCisxMDkgMTMxIDQwIDE3NCAxNzggMTA0IDEyOCA5IDE0OSA1MSAxMzIgMTIyIDE3MyAxMTkgMjMgMjQgNjcgMTA5IDc0IDMyIDE1OCAxMTAgCisxMTcgNzQgMTIzIDYgMTE4IDE1MSAxMzAgMTUwIDE2NyAzNCA1NSA1OCAxNDYgNTQgNzIgMTEyIDEwNSA1NyAxNjAgODIgMTIzIDE1OSAKKzE1MyAxNTkgMzkgMTkgNyA4IDMzIDg3IDEyIDUwIDE0NiAxNTAgMzcgMTA0IDcxIDEyNiAxMzMgMTA4IDE0NSA2OCAzOCAzOCA5MCA0MyAKKzc1IDE0OCAxMjIgNDMgMiAzOSAxNTQgNTQgMTYzIDE0NyAxMTMgOTEgMjkgMTA5IDM1IDc1IDE4MiA4NyAzNSAxNTUgMTcwIDEyNyA4MCAKKzE4NSAxMTggNjAgOTUgMTQyIDcxIDE2NSAyOCA4NCAxNjggMjUgMTQ0IDE3OCAzMSA4MSA0MSAxNjAgMjUgNTMgMTQzIF4KKzM4MSAxIDE0IDE3MiAxNjMgMTMwIDQ1IDY5IDQ2IDE0NSAzNiAzNiAxNTEgMTY5IDEzIDEzNSA0MiAyNiA4MSAxNTMgNzYgMTQ4IDE3OCAKKzkwIDEzMSAzMCAxMDEgMTYyIDE2MSAxMzIgMTQyIDE0IDg5IDMgMTQxIDE3NSAxNDYgNjUgMjYgODkgOTQgOTkgMTg3IDggNTUgMTYyIDIgCisxMyAxNDMgMTczIDIgMTIwIDE3MyA0MSAxMzIgMTUwIDIgMTEyIDQyIDE4IDE0MCAxMzAgMzcgMTI4IDIzIDEwNiAxNTkgMTE4IDE2NyAKKzE1MCAxMDEgMTEgMzAgMTA5IDE1MCAxODQgMTI0IDE5IDE2OSA3MyAxNjUgNTMgMTA5IDE1OCAxNzIgMTQ3IDExIDQ2IDM4IDE0OSAyNSAKKzIxIDkyIDE4NCA2NCAxNzkgMTU4IDEzMyAxMzUgMzQgMzggNTggMTE0IDkgMTgzIDQgMTE4IDc2IDQ5IDg5IDEwMiA0MCAxNjMgNDcgNzUgCis4MCAxNzYgMTc1IDggMTU0IDE0IDE4MCAxMDQgMTUzIDg0IDg5IDExIDEyOSA4IDEzOCA4NSAxODEgNzMgNjYgMTU0IDEyMSAyMCAxMTUgCis5MyAxMTQgMTA4IDgyIDE4MiAxOSA4NiAxMDMgMTc2IDE4MyAxODYgMTc3IDUzIDEwIDY5IDEzNyA1NiAxIDEzNSAxNDEgNjggNjkgNTQgCis4NiAxMiA3NSAxNzEgODcgMTg3IDEwNyAxNDQgMTUwIDkzIDIzIDcgNzAgODMgMjkgMTQwIDY3IDEzOSAxNTMgMTgzIDE3OCAxODkgMzAgCisxOCAyIDI5IDcyIDI5IDMzIDE2MCA1NiA5IDEyMyAxNjQgMTA3IDEzNiAxOSA3MCAzMSAxNzcgMTUyIDk5IDU3IDM4IDY2IDU1IDMyIDMyIAorMjQgODMgNjAgMjEgMSAzNiA1MiA4MCAxNjggNDQgMzIgMTE1IDE4NCAyNSAxMjAgMTgxIDE3MiAxNTUgMTg5IDIyIDMwIDI2IDE4MCA1IAorNjQgNDkgMTg4IDEgMjggMTExIDU3IDE3NiAxNjcgNjcgMTMxIDIyIDE2MCAxODYgMTY5IDY1IDM0IDMwIDExNyA5MSAxNyAxNjMgMzkgCisxMzQgNTcgMTM3IDE1NSA5MCAxNzAgNDIgNzggMTcwIDE0MSAxNjcgMTU4IDQyIDE3NyAyMiAxMjkgNjggMTY4IDE0MyA3NCAxNTAgODUgCis4MiAxNzQgNzggNjMgMTExIDE1NiAyOCAxMiAxNTggMTQxIDc2IDU3IDc3IDEyNSA3OSA0MCAxMiA1OSA1MiA4OCAxNTYgMjAgMjQgMTgyIAorMTQ5IDU2IDkyIDQ2IDEwNiAxNjcgNTkgMTg5IDEyMSAxMTkgMTQgODEgMTUgMTY1IDEzNiA3OSAxMDAgNDIgMTE3IDE4MiAxMTggMTc1IAorMTM4IDEyNCAzIDUwIDc0IDEzNCAxNTYgMzYgMTQzIDE4MSAxODAgOTYgMjIgNjEgOTcgMTM0IDE2NCAyNCAxNjYgMzAgMTAgNjEgNiAzMyAKKzkgMTE1IDE3NiA4NCA5NyAxNDIgMTUyIDE1IDUwIDE2NSA0NSAxNjggMTM1IDEzMyAxMjcgOTMgMTUgNjYgOTQgOTEgOSAzMiAxNiA5NSAKKzM3IDI5IDE3MSAxMTggNjggMTA4IDY2IDYzIDIwIDU1IDE4NiBeCiszOTYgMSA5NyAxMCA1IDE2MCAxMzIgMTggODMgNzMgMTU5IDE0MSA1NSAxMjAgMzEgMTMxIDE0MSAxMDIgMTM4IDMgNTIgOSAxNDggMTg5IAorNTYgOTkgMTY1IDE0NiAyIDE0MCA2NCAxNTcgMTAwIDEyMSAxMTMgMTAyIDI0IDIxIDI0IDEyMyAxNiAxMCAxMzkgMTUyIDE5IDEwOSAKKzE0NiAxMTYgMTIyIDkyIDQzIDcgNzUgNjIgNDkgMTcwIDU4IDI2IDExNyAxMjUgNDUgMTQ3IDUgMTI1IDEzNiAxNTUgMTE4IDIgMjYgNTAgCisxNjEgMjEgMTgyIDEyNyAxNTMgNDUgNjggMTkgMTIxIDIyIDk0IDEwNCAxNDQgMTY2IDM1IDE2NiAyMyAxNzYgNzUgMTg4IDUzIDExNCAKKzkzIDE0OCAxNzcgNjYgMTUxIDE2IDE1NiAxMjEgMTgwIDk4IDQ4IDE3OSA5NSA2MyAxMDcgOTcgNDUgMSAyMyA5NyA1NyAyMyAxMzIgNTMgCis3OSA5NyAxMjQgMTkgMTg4IDE4IDExOCAzNyAyMiAxMDYgOTQgNjAgMTIyIDI1IDQ3IDE3NiAxMTAgMTg0IDEwOSA3OSAxNjQgMTIwIDQzIAorMTUzIDg5IDkwIDEyOCAxMDkgMTIgMTY4IDY0IDExMCA4MiAxMTcgMTkyIDQxIDE3MSAxNjMgMTY0IDc2IDUzIDEyIDEwMSA2OCA1NCAKKzExNyA3OCA1OSAxNDMgODQgMzIgMTIyIDEwNCA2NSAxNDggMzEgNTIgMTIzIDEzMCAyNCAxMzUgMzggMTUxIDk1IDE0MiA5MyAxMDEgCisxNTkgNjIgMzcgMTQ4IDExMCA3MCAxMjcgNTEgODUgMTgxIDg5IDExIDE0MiAxMDUgOTEgMTA3IDUwIDI3IDI5IDEwMiAzNiA0MyAxNjUgCis3OSA2IDg0IDk5IDExOCAxMjggMzAgMjYgMyAxNDMgMTcgNjggNjYgMTM5IDE4NyAxNSAxNjUgMTU4IDI0IDg4IDIwIDE3OSAxNzQgODEgCis3OSAxOCAxMDYgNDcgNzQgMTUwIDEwNCAxNzkgMTYyIDU5IDEzMSA2MiAxMTYgMTY2IDgyIDE4NCAxODggOTcgMTM2IDQxIDEzNiAxNjcgCisxNDAgMTQzIDE3NSA3MiA0MiAxNzQgMTQ4IDc1IDc0IDcxIDg2IDE0IDE2IDE5MSAxMTcgMTEgNjMgMTE5IDExOSAxODYgMTgyIDEzIAorMTcxIDQ5IDE4MiA4MCAxNjcgNzMgMTQ3IDExOSAxMDcgMTY0IDQxIDU3IDE4MSAxNjggMjkgMTE0IDI2IDE4NCAxMjEgMTAxIDgwIDc2IAorNjUgMzQgNDkgMjQgNDQgMTkxIDM4IDI1IDkxIDUgNTggMTQwIDk5IDE1MyAxMjQgNTQgMTg0IDQyIDgzIDEwOCAxNTUgNCAyMCAxOTEgMyAKKzI5IDM1IDQwIDE4MCA3IDQwIDY2IDI1IDEyIDE4MCA4NiAyNiAzOCAxMzkgNzMgMSAxMzcgNzkgODUgMTAyIDcxIDM5IDI4IDQ0IDc3IAorNTYgMTkwIDEyIDY2IDcyIDMwIDE1MiA3IDg3IDg0IDE5MCAxMjYgNDggMTAwIDc3IDkxIDE4NiAzNiAzMSAxNDMgMTYzIDUwIDk0IDI1IAorMTI2IDEgMTE0IDEwNSAxNzAgOTMgMjIgMTczIDkwIDExNiA4NyA5NiAxOSA3NCA0IDEyMiAxODMgODMgMTIwIDE3NyAxMTMgMTY5IDE4MSAKKzc3IDE4MiAxIDE0OSAxODYgXgorMzg0IDEgMjUgNTYgODUgMTA3IDE3NyA2IDE4NiAxMzggMTg0IDI4IDYxIDE4NCAxOTEgMTc1IDEwNyA2IDI5IDgxIDExNCAxMiAxNTYgMiAKKzEzNyA4NiAxODkgNzMgNjQgMTI3IDEyOSA0NCAxNjcgMTEgOTggMTA3IDE2OSAxNDMgMjYgMTQ2IDYxIDEzMCA4OCAxMjAgMTM5IDU1IDMgCisxODkgMTE5IDg3IDIyIDEwNSA2NyA3OCAxNDcgNTEgMiAxNjEgMTA5IDg0IDQ5IDg3IDM4IDQ4IDE5MiA2MiAyNSA2NCAxNDMgNzIgMTY5IAorMTUxIDEwNiAxMTEgNTMgNTggOCA5MyA4IDg1IDEyMyAxMjAgMTMxIDE3MCAzOCAyIDE2OSAxNjcgNDkgNDEgMzcgMTUzIDIxIDM5IDkyIAorMTQ1IDE5MCAxNTUgMTc3IDE4NSA0OCAxMyA1IDE1MCA0OCAyMSA4NSAxMTUgNDAgMTY2IDE3OCA4OCAxMDQgMSAxMjUgMTkgMTE2IDEwNiAKKzE0MSAxMTEgMjMgNDMgMTAxIDU4IDE4NyAxNTAgNzggMTAxIDUwIDEwNyAxODUgODYgMTUxIDEzMCAxMzQgMTQzIDM0IDMxIDI2IDEyMiAKKzM4IDQwIDExMiA5NyAzMyAxMzYgNTAgOTkgMTI3IDEyMSAxNTkgNyAxOSAxNzAgMTg3IDEgNzkgMTkxIDI2IDEzMCAxMTggNSAxMDQgNDcgCisxMjYgMTA5IDkyIDEyOSA1MiAzMCAxOTMgOTAgMzUgNjcgMTE2IDkwIDMgMTgxIDM5IDEyMiAzMCAxNTUgMTQ3IDEwNSA4MyAyMSA3NyAKKzM1IDc1IDE3NCA1NSAxOTAgMTMxIDE1NCA5NSA3MiAxODUgOTQgMzYgOTUgMTI2IDcxIDE0OSA0IDY4IDE1MiAxODAgMTQ0IDE0NiA3IAorNDkgMzMgMTUyIDE4OCAyOSAxMTEgMTk0IDE3MiAxNDggMTI1IDM1IDU5IDM2IDEyNSAxMSAzNiAxNDEgMTQ5IDE4MyAxMjUgMjcgMSA3MSAKKzEzMyA2MSAxMzggMTY4IDg1IDEzMSA1IDk2IDE2MiAxNjEgMTE3IDE0MiAxNCA3OSAxODMgMTQxIDE2NSAxMjYgNTUgMTEgNzQgODQgNzkgCisxNjcgMyA0MCAxNDIgMTc3IDE5MyAxMjggMTczIDE5MiAxMDAgMTYzIDE2IDEyNyAxNDUgMTgyIDk3IDE3IDE5MyAxMjAgMTE1IDMyIAorMTA4IDE4IDk2IDE1NCAxMDMgMTUyIDE1MCA4NiAxODEgMTUgOTkgMTM1IDE3OSAxMjQgMTk0IDE2NCA2OCAxNjAgNDMgMTA5IDEzOCAKKzE1MiAxNDIgNiAyMSAyMyAxNDkgMjAgMTEgODIgMTY0IDQ0IDE1OSAxNDggMTMzIDExNSAyNCAyOCA1MyAxMDQgOSAxODMgMTc5IDEwOCAKKzU2IDM5IDg0IDg3IDMwIDE2MyAzMiA3MCA3NSAxNjYgMTcwIDggMTM5IDkgMTc1IDk5IDE0MyA2NCA4OSAxODYgMTE0IDE4MyAxMzMgODUgCisxNjEgNjMgNjEgMTU0IDExMSAxNSAxMTUgNzggMTA5IDEwOCA3MiAxNzcgMTQgNzEgMTAzIDE3NiAxNzMgMTc2IDE1NyAzOCAxMCA1NCAKKzEzMiA0MSAxODYgMTMwIDEyNiA2MyA2OSAzOSA3NiA3IDY1IDE3MSA4MiAxNzIgMTAyIDEyNCAxNDAgODMgMTEzIF4KKzM5NiAxIDE4OSA3MCA4MyAyOSAxMzIgNjcgMTE1IDE0NSAxNTEgMTcwIDE4MSAxNCAxOTIgMiAxODcgNDAgNSAzMyAxNjAgNDggMTgzIAorOTEgMTMyIDgzIDExMiAxNzcgNjIgMTg5IDE1MyAxMjggOTEgNDkgMzggNTAgNTUgMjQgOCA4IDUxIDM2IDEzIDE3NSAyOCAzNiA1NiAKKzE2MCAxMiAxMDcgMTY4IDI1IDEwNCAxNTcgMTU2IDEzOSAxNjUgMTQgMzAgMTkyIDE2NCAxOTUgNTYgNDEgMTgwIDE1OSAyOCA3OSA0MSAKKzE0NCAxNjcgNTEgMTE1IDE4OCAxMzYgMTU0IDE0NSA2NSAyIDIyIDkzIDgzIDE5MSAxNDcgMjMgMTEwIDU3IDEzNyAxMzEgNjYgMTM4IAorMjYgNzggMTQ2IDEyNSAxNTkgMTUwIDM0IDE3NyAyMiAxMjkgNjggMTY4IDExMSA3NCAxMTggNzcgNTAgMTc0IDU0IDQ3IDg3IDE0MCAyMCAKKzE3OCAxNTggMTMzIDYwIDMzIDQ1IDkzIDQ3IDggMTcwIDU5IDUyIDU2IDEyNCAyMCAxNiAxNTAgMTE3IDI0IDg0IDQ2IDEwNiAxNTEgNTEgCisxNTggMTczIDExMyAxMTEgMTk2IDczIDE1IDEzMyAxMzYgNzEgMTAwIDEwIDg1IDE4MiAxMTAgMTQzIDExNCA5MiAxODUgNDIgNDIgMTE4IAorMTU2IDIwIDEzNSAxNzMgMTU2IDk2IDE4MCAzNyA3MyAxMzQgMTU2IDE4MiAxNTAgMTk2IDE5MiA0NSAxNzIgMTcgMTY3IDkxIDE2OCA2OCAKKzg5IDEzNCAxMjAgMTkwIDE3MyAzNCAxNDEgMzcgMTUyIDExMSAxMTcgMTAzIDYxIDcgMzQgNjIgNjcgMTkxIDE5MCA4IDg3IDIxIDE5NSAKKzEzOSA4NiA0NCA3NiA2NiA1NSAxODYgMjMgMzEgODcgMTgzIDUgMTU1IDEyMiAxOTEgNjggNTMgMTQ5IDEzNiAzNSAxMTUgMjYgMTIxIAorMTMxIDEwMiAxMjMgMyA0MiAxOTcgMTMzIDE3OSA1NiA4NCAxNjUgMTM2IDE5MCAxMzAgNDkgMTU3IDgwIDEwMSAxMDMgOTcgMTk3IDExIAorMTkgMTE4IDEgNSAxMTkgMTM3IDkgMTA0IDE5MyAxNDEgMTE2IDEyMiA3MiAzOCA3IDcwIDQ3IDQ0IDE1NSA0MyAxNiAxMDcgMTI1IDQwIAorMTI3IDE5MyAxMDUgMTMxIDE0NSAxMDggMTg1IDYgNTAgMTQxIDEgMTY3IDEyNyAxNTMgNDUgNTMgMTkyIDEyMSAxMiA3OSA4NCAxMjkgCisxNTEgMTUgMTY2IDE5NiAxNTYgNjAgMTg4IDUzIDEwOSA4MyAxNDggMTYyIDQ2IDE0NiA2IDEzNiAxMTEgMTYwIDg4IDM4IDE2OSA4NSAKKzYzIDg3IDk3IDM1IDE5NCAzIDgyIDUyIDEzIDEzMiA0MyA1OSA5MiAxMDkgNCAxNzggMyAxMTggMzcgMTk1IDk2IDk0IDYwIDExMiAxNSAKKzQ3IDE2NiAxMTAgMTc5IDk5IDY5IDE0OSAxMDAgNDMgMTM4IDY5IDcwIDEyMyA4OSAxMiAxNTggNTQgOTAgNzIgMTE3IDE4MiAzMSAxNjYgCisxNTMgMTY0IDc2IDMzIDIgMTAxIDYzIDQ0IDExMiA1OCAzOSAxNDMgNzQgMzIgMTA3IDg5IDU1IDE0MyAzMSA0NyAxMjMgMTI1IDQgMTM1IAorMTggMTQxIDgwIDEzNyA4OCA4MSAxNTQgMTg3IF4KKzQwNiAwIDIzIDEzNCAxMDMgNDkgOTkgNDQgNjQgMTYwIDY4IDE5MCAxMTQgMTA1IDkxIDg2IDIyIDI3IDE1IDc0IDggMjIgMTUxIDc5IAorMTk5IDg0IDg1IDkwIDEyOCA5IDUgMTc1IDEyOSAxNyA0MCA1OSAxMjUgMTg3IDE5NCAxNDQgMTUxIDMgNjAgNiAxNTggMTUzIDY3IDU4IAorMTggOTkgMTkgNTMgMTI5IDkwIDE3OSAxMzQgNTIgMTI0IDU1IDk1IDEzOCA4MiAxNzAgMTY3IDY5IDEyMiAxMyAxMDggMTYwIDExOSAKKzExNSAxNjEgNTEgMTQgMTY3IDEyMCA0NyA2MCA1NyA4NiAxNiAxODQgOTYgMTk3IDQyIDk4IDExMiAxNjUgMTU0IDE5OSAxNTcgMjEgCisxNjggNTIgMTQ2IDY2IDEyNiAxMTkgOTMgMTUwIDIwIDM2IDE1MyAxNDAgMTk0IDkzIDI2IDE1NiAxMTQgODAgODAgNTUgNDQgMTMgMzUgCisyNCA0NCAxOTEgMjQgMTkwIDYzIDE3NyA0NCAxNDAgOTkgMTQ2IDExNyA1NCAxNjMgNDIgNzYgMTAxIDEzNCAxNzYgMTg1IDE3NyAxNjggCisxIDIxIDE5IDE4MCAxOTMgMTIgNTIgMTk3IDE5MSAxNzMgNjUgMTkgMzEgMTE4IDU5IDEgMTIzIDcyIDcxIDg4IDY0IDExIDE5MyAzNyAKKzYzIDI4IDE2OSAxODQgNDUgNzIgMTk1IDE1MiAxODYgODcgNTYgMTc2IDExMiA0MSA5MyA3NyA4NCAxNTggMjkgMyAxMzYgMTQyIDM2IAorODAgNCAxMTkgMTY2IDg2IDk4IDE2MyA5MyAxIDE0NSA4MyAxMDIgNjYgNzUgMTkxIDQ2IDQgOTQgMTU1IDU1IDEyMCAxNDkgMTEzIDE0OCAKKzE4MSA0OSAxNzUgMTgwIDE0MiA4NyA1IDUxIDY1IDkyIDE2NyAxOTYgMTg2IDEzOCAxODQgMjMgNjEgMTY0IDE3MSAxNzUgMTA3IDYgOSAKKzgxIDExNCA3IDE0MSAxNzcgMTE3IDc2IDE3NCA3MyA1NCAxMTIgMTE0IDI5IDE1MiAxMSA5OCA4NyAxNTQgMTIzIDIxIDE0NiA0MSAxMTUgCis4OCAxMTUgMTM5IDQwIDE4MyAxODkgMTA5IDY3IDcgOTAgNTIgNzMgMTI3IDUxIDE5MiAxNTYgODkgNjkgNDkgNzcgMzMgMzMgMTgyIDU3IAorMTAgNjQgMTM4IDU3IDE1OSAxMzYgOTEgMTExIDMzIDU4IDE5MyA4OCAxODggNzUgMTE4IDExMCAxMjYgMTcwIDE4IDE5NyAxNjkgMTYyIAorMzQgNDEgMTcgMTM4IDYgMzQgOTIgMTQ1IDE4NSAxNTUgMTU3IDE3MCA0MyA4IDE0MCA0OCAyMSA3MCAxMDUgNDAgMTYxIDE3OCA3OCA4OSAKKzE5NiAxMTAgMTk5IDEwNiA5NiAxMjEgMTA2IDIzIDE4NSAyOCA5NiA0OCAxNjcgMTQ1IDU4IDkxIDM1IDk3IDE4MCA2NiAxNTEgMTMwIAorMTI0IDEyOCAzNCAxNiA2IDEwNyAyOCAyMCAxMTIgOTIgMTggMTIxIDMwIDg0IDEwNyAxMDEgMTU5IDE4NyAxOSAxNTUgMTgyIDE4MSA3NCAKKzE4NiAxMSAxMjAgOTggMTg1IDEwNCAzMiAxMjYgOTQgODIgMTE5IDQyIDI1IDE3MyA5MCAzMCA2MiA5NiA3MCAxNzggMTc2IDM5IDEwMiAKKzE1IDE1MCAxNDcgMTAwIDc4IDE2IDU3IDM1IDc1IDE2OSAzNSAxNzAgMTE2IDE0NCA3NSAxNDYgXgorNDA5IDEgMTg1IDcwIDEyIDk1IDExMCA3MSAxMzMgMTgzIDUyIDEzNiAxNDggMTQ0IDExNCAxODYgMTcgMjUgMTQ0IDE2NCA1IDc5IDE3OCAKKzE3MiAxMjQgMTE3IDE5IDQzIDIwIDkzIDE3NCAzNiAxMjUgMTE3IDE1MSAxMDkgMyAxNjQgNTUgMTAxIDM3IDEyMiAxNTIgNzcgMTMxIAorMTY4IDg4IDE2MiAxNjEgOTMgMTQyIDE0IDYzIDE2NyAxNDEgMTQ5IDk0IDM5IDE5MCA1MCA2OCA0NyAxMzUgMTk4IDE2IDExMCAxNTMgCisxNzcgMTA0IDE3MyAxOTIgNjggMTQ3IDE3OSAxMTkgMTM3IDE2NiA3MyAxODAgMTY5IDg4IDkxIDI0IDc2IDEwIDgwIDE0NiA3OSAxMjggCisxNTAgNjIgMTQ5IDE5NCA4MyAxMTEgMTcxIDEyNCAxNzAgMTU2IDYwIDE1MiAyNyAxMDkgMTA2IDEyMCAxMzQgMjAxIDE4NCAyMDIgMTQ5IAorMTIgMTk4IDY2IDEzMiAxMiAxMjcgMTMyIDEzMyA4MyA4IDEyIDQ1IDg4IDkgMTgzIDE1NSA5MiAyNCAyMyA3NiA2MyAxNCAxNjMgOCA2MiAKKzY3IDE1MCAxNjIgOCAxMTUgMSAxNjcgOTEgMTI3IDMyIDg5IDE2MiA5MCAxNTkgMTI1IDg1IDEyOSA0NyA1MyAxNTQgOTUgNyAxMTUgNTQgCisxMDEgMTA4IDU2IDE2OSA2IDQ3IDEwMyAxNzYgMTU3IDE2MCAxMjUgMTQgMTAgMzAgMTI0IDE3IDE3OCAxMjIgMTAyIDU1IDY5IDE1IDYwIAorMjAyIDQ5IDE3MSA3NCAxNDggOTQgOTIgMTI0IDY3IDIwMCAxODQgNzAgODMgMjkgMTI3IDY3IDEwMCAxNDAgMTMxIDE2NSAxNzYgNCAKKzE4MiAyIDE2NyAyMCAxOTMgMzMgMTYwIDQzIDE3MyA3MSAxMTIgNjggOTcgMTU3IDU3IDE2OSAxMzggMTEzIDg2IDQ0IDM4IDQwIDU1IAorMTkgMTk2IDIwMSAzMSAyMSA4IDE2NSAyMyAyNiA0MSAxNTUgMTk1IDE4MyAxMDIgMTU4IDI1IDk0IDE0MiAxNDYgMTI5IDE1MCA5IDMwIAorMTc3IDE1NCAxOTUgNTEgMzYgMTc1IDEzOSAyOCA1OSAzMSAxMjQgMTY3IDQxIDEwNSAxNzMgMTIxIDEzNCAxMzAgNjUgMTg1IDE3IDc4IAorNzggMTgxIDEzNyAxMyA5NSA1NyAxMzcgMTE2IDUxIDExOCAxNiA3OCAxMzEgMTE1IDE1NCAxNDUgMjkgMTc3IDIyIDEyOSA2OCAxNjggCis5MSA3NCA5OCA3MiAzMCAxNzQgMzkgMzcgNzIgMTMwIDE1IDE2MyAxNTggMTI4IDUwIDE4IDI1IDczIDI3IDE5MSAxNTAgNTkgNTIgMzYgCisxMDQgMjAgMTEgMTMwIDk3IDQgNzkgNDYgMTA2IDE0MSA0NiAxMzggMTYzIDEwOCAxMDYgMTkxIDY4IDE1IDExMyAxMzYgNjYgMTAwIAorMTkzIDY1IDE4MiAxMDUgMTIzIDk5IDcyIDE4MCAzNyAyMiAxMDggMTU2IDEwIDEzMCAxNjggMTQxIDk2IDE2MCAyMiA1OCAxMzQgMTUxIAorMTYyIDE0MCAxODEgMTg3IDM1IDE1NyA3IDE0NyA3NiAxNjMgNTggODQgMTI5IDEwMCAxOTAgMTUzIDI0IDEyNiAzMiAxNDIgOTYgMTA3IAorODggNDEgMiAxNCA0MiA1MiAxODYgMTcwIDMgODIgMTEgMTgwIDExOSA2NiAyOSA1NiA2NiA1MCAxNzEgMyAxMSA3NyAxNjMgNSAxNTAgCisxMTIgMTI4IF4KKzQxMyAxIDQ3IDI1IDEzNSAxMjkgNyAxMDggMTkgMTA3IDExNyAxMDIgMTAyIDMgMjggMTkwIDExMiAxNjUgNTYgNjMgMTY1IDEyMiAxODMgCisxMTYgMjggMTU3IDUyIDczIDg5IDkwIDE2OSAyMDIgMTIgMTExIDE4NSAyMDMgOTEgMTE2IDIwMCA5NyAxOTMgMTM0IDExNiAxMjIgNDQgCiszMSA3IDYzIDI2IDM3IDEzNCAyMiAyIDkzIDEyNSAzMyA5OSAxODYgNzcgMTI0IDEzMSA5NCAxNzEgMTgzIDUwIDExMyAxNzggMTQ2IAorMTI3IDE1MyA0NSAzMiAxNjQgMTIxIDIwMyA1OCA1NiAxMDggMTMwIDE5MiAxNjYgMTY4IDEyOCAzOSAxODggNTMgMTAyIDY5IDE0OCAKKzE0MSAxOCAxMzkgMTk3IDEwOCA5NyAxMzIgNzQgMjQgMTU1IDcxIDYzIDU5IDk3IDIxIDE5NCAxODAgNjEgNDUgMjA0IDEzMiAyOSAzMSAKKzg1IDg4IDE4OCAxNjQgMTg3IDExOCAzNyAxNjcgODIgOTQgNjAgOTggMSA0NyAxNTIgMTEwIDE3MiA4NSA1NSAxMjggNzIgNDMgMTE3IAorNDEgNDIgMTE2IDYxIDEyIDE0NCA0MCA2MiA1OCAxMTcgMTY4IDE3IDE1OSAxMzkgMTY0IDc2IDUgMTkzIDEwMSA1NiAzMCAxMDUgMzAgCisxMSAxNDMgNjAgMzIgODYgNjggNDEgMTM2IDMxIDQwIDEyMyAxMTggMTgxIDEzNSAxOTUgMTI3IDU5IDEzMCA4MSA1MyAxNDcgNjIgMTMgCisxMjQgOTggMzQgNzkgMzkgNDkgMTQ1IDUzIDE4MCA5NCAxMDUgOTEgNzEgMiAyNyA1IDU0IDE5MyA3IDE0MSA3OSAxOTkgODQgNzUgNzAgCisxMjggMTk5IDE5NSAxNjAgMTE5IDE3IDIwIDU0IDExNSAxODcgMTg0IDEyOSAxNDYgMTkzIDQwIDIwMSAxNDMgMTM4IDU3IDQzIDE4IDk0IAorMjA0IDM4IDExNCA4MCAxNzkgMTE0IDQ3IDExOSA1MCA4MCAxMTggODIgMTYwIDE1MiA0OSAxMTIgMTk4IDg4IDE1NSAxMDQgOTUgMTUxIAorMzYgMTk5IDE2MiAxMDAgMjcgNTAgNDcgODYgMTk1IDE2IDE3OSA4MSAxOTIgMjcgODMgMTA3IDE1MCAxMzQgMTk0IDE0NyAxIDE1OCAzMiAKKzEzMSA2MSAxMTEgMTE5IDgzIDE0MCA1IDIxIDEzMyAxMjAgMTc0IDc4IDI2IDEzNiAxMDkgNjUgODAgNDAgMjkgMjAzIDI1IDI0IDQ0IAorMTkxIDE0IDE3MCA0MyAxNjIgMzQgMTQwIDk5IDE0MSAxMTIgNTQgMTQ4IDQyIDcxIDk2IDExOSAxNjEgMTY1IDE2NyAxNDggMTg2IDExIAorNCAxODAgMTg4IDE5NyA0MiAxODIgMTgxIDE2OCA1MCAxNCAyNiAxMDMgNDkgMSAxMTMgNjcgNjEgNzggNTkgMTk2IDE3MyAzMiA1MyA4IAorMTU0IDE2OSAzMCA3MiAxNzUgMTUyIDE3NiA4NyAzNiAxNjYgMTAyIDM2IDg4IDc3IDc5IDEzOCAyNCAxODggMTMxIDEyNyAyNiA3MCAKKzE5NCAxMTQgMTQ2IDY2IDkzIDE1OCA5MyAxOTEgMTI1IDc4IDkyIDUxIDYwIDE3NiAyNiA0IDc0IDEzNSAzNSAxMjAgMTI5IDExMyAxMzMgCisxODEgMjkgMTcwIDE3MCAxMzcgNzcgMTkwIDQ2IDQ1IDc3IDE1NyAxOTEgMTg2IDEzOCAxODQgMTggNjEgMTQ0IDE1MSAxNzUgMTA3IDYgCisxOTQgODEgMTE0IDIgMTI2IDExMCBeCis0MjcgMSA4NSA2MCAxNTAgNzMgMzggODggOTAgNSAxMjggMTEgOTggNTUgMTMwIDkxIDEzIDE0NiA5IDkxIDg4IDEwNyAxMzkgMTYgMTU5IAorMTg5IDkzIDM1IDE5MSA2NiAyOCA2NSA5NSA1MSAxODQgMTQ4IDU3IDQ1IDQ5IDYxIDI1IDkgMTY2IDQ5IDE5NCA2NCAxMzAgMzMgMTQzIAorMTEyIDY3IDExMSAxIDU4IDE3NyA4MCAxNjQgNTkgMTEwIDk0IDExOCAxNzAgMTk0IDE5NyAxNjkgMTU0IDEwIDQxIDE5MyAxMTQgMTkwIAorMjYgOTIgMTQ1IDE3NyAxNTUgMTI1IDE0NiAzNSAyMDAgMTI0IDQ4IDIxIDQ2IDg5IDQwIDE1MyAxNzggNjIgNjUgMTk2IDg2IDE3NSA5MCAKKzgwIDg5IDk4IDIzIDE2OSA0IDg4IDMyIDEzNSAxMzcgMjYgNzUgMTEgODEgMTcyIDM0IDE1MSAxMzAgMTA4IDEwNCAzNCAyMDAgMTgyIAorODMgMTIgMTk2IDExMiA4NCAyMDIgOTcgMjA2IDYwIDc1IDY5IDE1OSAxNjMgMTkgMTMxIDE3NCAxNTcgNjYgMTc4IDE5NSAxMDQgNjYgCisxNjEgMTA0IDggMTI2IDcwIDY2IDEwMyAyNiAxNyAxNDEgOTAgMjIgNTQgNjQgMzggMTQ2IDE2OCAzOSA3MCAxOTkgMTQyIDE0NyA5MiAKKzcwIDggMjUgMzUgNzUgMTYxIDMgMTM4IDkyIDEyOCA0MyA1OSAxODUgNTUgMjA1IDk1IDEwMCA3MSAxMjMgMTczIDQyIDEyNiAxMjggCisxNDQgOTQgMTc2IDIwNSAyMCAxMzkgMTQ5IDE5OCA1OSAxNjggMTcyIDEwOSAxMTIgOSAzMyAxMCA3MyAxNTQgMzYgMTE1IDk3IDEzMSAKKzk5IDE5NiAxNDQgNDUgODEgMjIgMTEyIDE0MiA3MiAxMzEgMTQ4IDgzIDE2MiAxNjEgNzggMTQyIDE0IDUzIDE1NyAxNDEgMTM5IDc0IAorMjkgMTgwIDM1IDU4IDI3IDExNSAxOTggMSA5MCAxMzggMTY3IDg5IDE3MyAxOTIgNDggMTM3IDE1OSAxMTQgMTMyIDE1NiA1OCAxNjAgCisxNTQgNjggNzYgMTkgNTYgNSA3MCAxNDEgNjQgMTEzIDE1MCA0NyAxMjkgMTg0IDczIDk2IDE2NiAxMjQgMTU1IDE1MSA1NSAxNDcgMTcgCisxMDkgODYgMTAwIDEyOSAyMDEgMTY0IDE5MiAxNDkgNyAxOTMgNTYgMTEyIDIwMCAxMDcgMTIyIDEzMyA2MyAyMDYgMiA0MCA3OCA5IAorMTgzIDE0MCA4MiA0IDEzIDcxIDQ4IDQgMTYzIDIwMSA1NyA2MiAxNDAgMTU3IDggMTAwIDIwNCAxNjIgODYgMTE3IDEyIDg5IDE0NyA3NSAKKzE0NCAxMjAgODUgMTA5IDM3IDQ4IDE1NCA4NSAyIDExNSAzOSA5NiAxMDggNDYgMTY0IDEgMzIgMTAzIDE3NiAxNDcgMTUwIDEwNSAyMDcgCisxMCAxNSAxMTkgMiAxNzMgMTE3IDg3IDUwIDY5IDUwIDIwMiAzOSAxNzEgNjkgMTMzIDg5IDcyIDExNCA1NyAxOTUgMTc5IDcwIDgzIDI5IAorMTIyIDY3IDg1IDEzNSAxMTEgMTYwIDE3MSAyMDIgMTcyIDIgMTQ3IDE4MyAzMyAxNjAgMzggMTYzIDUxIDkyIDUzIDgyIDEzNyA1MiAKKzE0OSAxMjMgOTggODEgMzkgMzggMzAgNTUgMTQgMTg2IDE5NiAxMSA2IDMgMTU1IDE4IDE2IDI2IDE1MCAxODAgMTY4IDk3IDE0OCAyNSAKKzg0IDEyNyAxMzYgMTE5IDEzNSA0IDMwIDE2MiAxNDQgMTk1IDQ2IDMxIDE3MCAxMTkgMjggMTkwIF4KKzQ0MyAxIDE3IDk2IDE2NyAyNyA5MSAxNTIgMTAwIDEwNiAxMDkgNjUgMTY0IDEwIDU3IDcxIDE2NyAxMjMgMjA5IDc0IDU3IDEzNyA5NSAKKzMwIDkwIDIgNzggMTEwIDEwMSAxNDcgMTM4IDIyIDE3NyAyMiAxMjkgNjggMTY4IDYzIDc0IDcwIDY1IDIgMTc0IDE4IDIzIDUxIDExNiAKKzggMTQyIDE1OCAxMjEgMzYgMjA3IDIwNyA0NSAyMDkgMTcwIDEyMiA1OSA1MiA4IDc2IDIwIDQgMTAyIDY5IDE4NiA3MiA0NiAxMDYgCisxMjcgMzkgMTEwIDE0OSAxMDEgOTkgMTg0IDYxIDE1IDg1IDEzNiA1OSAxMDAgMTcyIDM3IDE4MiA5OCA5NSA3OCA0NCAxNzMgMzAgMjA0IAorOTQgMTU2IDIwNiAxMjMgMTYxIDEyMCA5NiAxMzIgMSAzNyAxMzQgMTQ0IDEzNCAxMjYgMTYwIDE4MCAyMSAxMzYgMjAzIDExOSA1NSAKKzE1NiA0NCA3NyAxMjIgNzIgMTkwIDEyNSAxMCAxMDUgMjUgMTI4IDc1IDkzIDY3IDEzIDIwNSAxOTYgMTQgMzEgMTc5IDE0MiAyMDYgNzUgCisyMDcgMTU5IDkxIDM4IDggMjggNjYgNDMgMTUwIDE4NSAxOTMgNjMgMTM1IDUgMTQzIDk4IDE0MyAzMiA1IDEyNSAxMjQgMTk3IDEwMyAKKzE0IDk3IDEwNyAxMDIgODcgMyAxOCAxODUgOTcgMTU1IDU2IDQ4IDE2NSAxMTIgMTc4IDEwNiAxMyAxNTcgMzIgNTMgNzkgODUgMTQ5IAorMTk3IDcgMTA2IDE3NSAyMDMgNzEgMTAxIDE5NSA5MiAxOTMgMTI5IDExNiAxMjIgMjQgMjYgNyA1OCAxMSAzMiAxMTkgNyAyMDIgODMgCisxMjUgMjggNzkgMTgxIDU3IDExOSAxMjEgODQgMTYxIDE2OCA1MCA5MyAxNjMgMTMxIDEyNyAxNTMgNDUgMTcgMTQ0IDEyMSAxOTggNDMgCiszNiA5MyAxMTUgMTc3IDE2NiAxNDggMTA4IDI0IDE4OCA1MyA5NyA1OSAxNDggMTI2IDIwOCAxMzQgMTkyIDg4IDg3IDExMiA2NCAxNCAKKzE0NSA2MSA2MyAzOSA5NyAxMSAxOTQgMTY1IDQ2IDQwIDE5OSAxMzIgMTkgMTEgODAgNzMgMTc4IDE1NCAxNzcgMTE4IDM3IDE0NyA3MiAKKzk0IDYwIDg4IDIwMSA0NyAxNDIgMTEwIDE2NyA3NSA0NSAxMTMgNTIgNDMgMTAyIDIxIDIyIDExMSA0MSAxMiAxMzQgMzAgNDIgNDggCisxMTcgMTU4IDcgMTU0IDEyOSAxNjQgNzYgMTk1IDE4OCAxMDEgNTEgMjAgMTAwIDEwIDIwMSAxNDMgNTAgMzIgNzEgNTMgMzEgMTMxIDMxIAorMzUgMTIzIDExMyAxNjYgMTM1IDE4MCAxMTcgNDQgMTI1IDc2IDMzIDE0MiA2MiAzIDExNCA5MyAxOSA1OSAzNCAzNCAxMzAgMzggMTcwIAorNzQgMTA1IDkxIDU2IDE5MiAyNyAyMDUgMzQgMTc4IDIwMiAxMzEgNzkgMTk5IDg0IDY1IDUwIDEyOCAxODkgMTg1IDE0NSAxMDkgMTcgCis0OSAxMDUgMTg3IDE3NCAxMTQgMTQxIDE4MyAyMCAxOTYgMTI4IDEyMyA0NyAyOCAxOCA4OSAxODkgMjMgOTkgNzAgMTc5IDk0IDQyIAorMTE0IDQ1IDY1IDk4IDgyIDE1MCAxMzcgMjkgMTAyIDE4MyA2OCAxNTAgODkgNzUgMTQxIDIxIDE4NCAxNTcgODAgNyA0MCAzNyA4NiAKKzE5MCAxNiAxNzQgNjYgMTg3IDEyIDY4IDEwMiAxMzUgMTE0IDE4OSAxMzcgMTkxIDE0OCAxMiAxMTYgNTYgOTYgMTE5IDczIDEzMCAyMDAgCis2IDExMyAxMDAgMTU0IDYzIDI2IDExNiAxMDQgNTAgODAgMjUgMTQgMTkzIDgzIF4KKzQzNiAxIDI0IDQ0IDE5MSAyMTEgMTM4IDExIDEzOCAxOCAxNDAgOTkgMTMzIDEwNCA1NCAxMjQgNDIgNjMgODggOTUgMTM3IDEzMyAxNTEgCisxMTYgMTYyIDIwOCAxOTMgMTgwIDE4MCAxNzMgMjYgMTU4IDE2NSAxNjAgMjYgNiAxOCA3OSAzMyAxIDk3IDU5IDQ1IDYyIDUxIDE3MiAKKzE0MSAyNCAzNyAxODkgMTMwIDE0NSA2IDcyIDE0MyAxNTIgMTYwIDg3IDQgMTUwIDg2IDI4IDgwIDc3IDcxIDEwNiAxNiAxNjQgMTIzIAorMTAzIDEwIDU0IDE3OCAxMDYgMTE0IDM0IDg1IDE1MCA5MyAxNzUgOTMgNzAgNzYgMjcgMzYgMTUyIDIwNyA0IDQyIDEwMyAzIDEyMCA5NyAKKzExMyAxMDkgMTgxIDIxMCAxNjIgMTU0IDEyOSA2MSAxNjYgMzggMTMgNTMgMTQxIDE4MyAxODYgMTM4IDE4NCAxMCA2MSAxMTIgMTE5IAorMTc1IDEwNyA2IDE3MCA4MSAxMTQgMjA3IDEwMiAxMjUgNjUgNTAgMTM1IDczIDI4IDczIDc1IDIwMyAxMTMgMTEgOTggMzUgMTE1IDcxIAorOCAxNDYgMjAyIDc2IDg4IDEwMiAxMzkgMSAxNDQgMTg5IDgzIDE1IDE4MSA1MSAxMyA2MCA3NSA1MSAxNzkgMTQzIDM3IDMwIDQ5IDUxIAorMjAgMjA3IDE1NiA0NCAxODQgNjQgMTI1IDE4IDEzMyA5NyA1MiAxMTEgMTk0IDU4IDE2NyA3NSAxNDkgNDkgMTA1IDg0IDExMyAxNzAgCisxNzkgMTk3IDE2OSAxNDkgMjA4IDQxIDE3OCA5OSAxODAgMjEgOTIgMTQ1IDE3MiAxNTUgMTA1IDEzMSAzMCAyMDggMjAwIDExNCA0OCAKKzIxIDMxIDc5IDQwIDE0OCAxNzggNTIgNTAgMTk2IDcxIDE2MCA4MCA3MCA2OSA5MyAyMyAxNTkgMjAyIDgzIDIyIDExNSAxMzIgNiA2NSAKKzIwOSA3MSAxNjcgMTQgMTUxIDEzMCA5OCA4OSAzNCAxOTAgMTY3IDY4IDIgMTgxIDExMiA3OSAxOTIgODIgMTkxIDQ1IDU1IDQ5IDE1OSAKKzE0OCAxOSAxMTYgMTY5IDE0MiA2MSAxNzMgMTg1IDk0IDQ2IDE0NiAxMDQgMjA2IDEyNiA1NSA1NiA5MyAxNiAxMiAxMjEgOTAgMTcgNDkgCis0NCAxOCAxMjYgMTYzIDM5IDUwIDE4OSAxMzcgMTQ3IDg3IDY1IDMgNSAzNSA3NSAxNTYgMTk2IDExOCA3NyAxMTggMjMgNTQgMTg1IDQwIAorMTk1IDk1IDkwIDcxIDExMyAxNjMgMzIgMTE2IDEwOCAxNDQgNzQgMTY2IDE5MCAxNSAxMzQgMTM0IDE4OCAzOSAxNTggMTcyIDk0IDEwNyAKKzIxMiAyMyA1MyAxMzQgMzYgMTA1IDc3IDExMSA4OSAxODYgMTI0IDM1IDYxIDcgMTAyIDEzMiA2NyAxMzEgMTI4IDc4IDE2MiAxNjEgNjMgCisxNDIgMTQgNDMgMTQ3IDE0MSAxMjkgNTQgMTkgMTcwIDIwIDQ4IDcgOTUgMTk4IDE5OSA3MCAxMjMgMTU3IDc0IDE3MyAxOTIgMjggMTI3IAorMTM5IDEwOSAxMjcgMTQ2IDQzIDE0MCAxMzkgNDggNjEgMTQgMzYgNjAgMTM2IDQ5IDk4IDE1MCAzMiAxMDkgMTc0IDYzIDgxIDE2MSAKKzEyNCAxNDAgMTQ2IDUwIDE0MiA3IDEwOSA2NiA4MCAxMjQgMjAxIDE0NCAxODIgMTQ5IDIgMTg4IDQ2IDkyIDE4NSA4NyAxMTIgMTMzIAorNDMgMjAxIDIwNSAzNSA2OCA5IDE4MyAxMjUgNzIgMTk3IDMgNjYgMzMgMjA3IDE2MyAxOTEgNTIgNTcgMTMwIDE1MiA4IDg1IDIwNCAKKzE1NyA4MSAxMDcgMjA1IDE4NyBeCis0NjIgMSAxMjYgNTQgMTIzIDExMyA4NSA4MSAyMyA0MSAxNTQgNzEgMjEwIDExNSAxOCA4OSAxMDggMzIgMTU3IDIwOSAxMSAxMDMgMTc2IAorMTMzIDEzNiA3NyAxOTMgMTAgMjA5IDExMiAxOTYgMTY2IDExMCA2NiA0MyA2OSAxOTQgMzYgMjAyIDI1IDE3MSA2MiAxMTIgODIgNDQgCisxMDAgNDMgMTg4IDE3MiA3MCA4MyAyOSAxMTUgNjcgNjQgMTI4IDgzIDE1MyAxNjQgMTk1IDE1OCAyIDExOSAxODcgMTY5IDMzIDE2MCAKKzMxIDE0OSAyMyA2NCAzMiA2MSAxMDkgNDUgMTIxIDEwMiA3NyA3NCAzMiAzOCAxNiA1NSA3IDE3MiAxODkgMTk4IDIwMCAyMTEgMTQxIAorMTEgMiA1IDE0MyAxNTkgMTQ3IDkwIDEzNCAyNSA3MCAxMDYgMTIyIDEwNSAxMTQgMjEyIDMwIDE0MSAxMzAgMTk1IDM5IDI0IDE2MyA5MSAKKzI4IDExIDcgNzYgMTY3IDE3IDgxIDEzNyA4NSA4NiA5NCA2NSAxNDkgNSA0MiA2NiAxNTcgMTEzIDIwNCA1OSA1NyAxMzcgODAgMTUgNzAgCisyMDcgNzggOTUgOTEgMTQyIDEzMyAxNyAxNzcgMjIgMTI5IDY4IDE2OCA0MyA3NCA1MCA2MCAxOTcgMTc0IDMgMTMgMzYgMTA2IDMgMTI3IAorMTU4IDExNiAyNiAxOTcgMTkyIDI1IDE5NCAxNTUgMTAyIDU5IDUyIDIwMyA1NiAyMCAyMTQgODIgNDkgMTcxIDY3IDQ2IDEwNiAxMTcgCiszNCA5MCAxMzkgOTYgOTQgMTc5IDU2IDE1IDY1IDEzNiA1NCAxMDAgMTU3IDE3IDE4MiA5MyA3NSA2MyAyNCAxNjggMjUgMTg5IDg0IAorMTU2IDIwMSAxMTggMTU2IDEwNSA5NiAxMTIgMjAxIDIyIDEzNCAxMzkgMTE0IDExNiAxNDUgMTc1IDExIDEyMSAxOTggOTkgNDAgMTUxIAorMzQgNzIgMTE3IDUyIDE5MCAxMDUgOTAgMjAgMTE4IDYwIDgzIDUyIDIwOCAyMDUgMTgxIDIwOSAxNiAxNzQgMTIyIDIwNiA3MCAyMDIgCisxNDQgNzEgMTggMjA4IDggNjYgMzggMTM1IDE3MCAxNzggNTMgMTE1IDUgMTM4IDg4IDEyMyAxNyAyMDAgMTE1IDExOSAxODIgOTggOSAKKzg3IDk3IDEwMiA3MiAzIDggMTgwIDgyIDE0NSA1NiAzMyAxNjUgMTAyIDE3MyA5NiAyMTMgMTU3IDEyIDMzIDY5IDgwIDEyOSAxOTIgMiAKKzEwMSAxNjUgMjAzIDUxIDg2IDE5MCA4NyAxOTMgMTI0IDExNiAxMjIgNCAyMSA3IDUzIDIxMSAyNyAxMDQgMjA3IDE5NyA3MyAxMjUgMjMgCis1OSAxNzYgMzcgMTE0IDExMSA3NCAxNTEgMTUzIDUwIDczIDE0OCAxMTYgMTI3IDE1MyA0NSAyIDEyNCAxMjEgMTkzIDI4IDE2IDc4IAorMTAwIDE2MiAxNjYgMTI4IDg4IDkgMTg4IDUzIDkyIDQ5IDE0OCAxMTEgMTkzIDEyOSAxODcgNjggNzcgOTIgNTQgNCAxMzUgNTEgNjMgCisxOSA5NyAxIDE5NCAxNTAgMzEgMzUgMTk0IDEzMiA5IDIwNiA3NSA1OCAxNjggMTQ0IDE2NyAxMTggMzcgMTI3IDYyIDk0IDYwIDc4IAorMTk2IDQ3IDEzMiAxMTAgMTYyIDY1IDM1IDk4IDMyIDQzIDg3IDEgMiAxMDYgMjEgMTIgMTI0IDIwIDIyIDM4IDExNyAxNDggMjEyIDE0OSAKKzExOSAxNjQgNzYgMTgwIDE4MyAxMDEgNDYgMTAgOTUgMjA1IDE4NiAxNDMgNDAgMzIgNTYgMzggMjEgMTI2IDMxIDMwIDEyMyAxMDggCisxNTEgMTM1IDE2NSAxMDcgMjkgMTIwIDcxIDEzIDEzNyA2MiAyMDggMTA0IDg4IDQgMzkgMjkgMTkgMTE1IDIzIDE2MCA1NCAxMDUgOTEgCis0MSAxNzcgMjcgMjAwIDE0IDE2MyAxMjQgXgorNDUzIDAgMTE1IDc5IDE5OSA4NCA0OSAxOCAxMjggMTczIDE2OSAxMjEgOTMgMTcgMTg2IDQxIDg5IDE4NyAxNTggOTAgMTMzIDE2NyAKKzIwNiAxODggMTA0IDk5IDMxIDQgMTggODEgMTY1IDIxNyA3NSA1NCAxNzkgNjIgMzQgMTA2IDM3IDQxIDY2IDgyIDEzNCAxMTMgMjE1IAorODYgMTU5IDM2IDE0MiA2NSA0MyAxMjUgMjE1IDE2MCAxNDkgNDggMTkzIDI0IDIxIDg2IDE4MiAxNiAxNjYgNDIgMTc5IDIwNiA0NCA5NCAKKzExMSA4MiAxODEgMTIxIDE2NyAxMzIgMTk4IDkyIDQ4IDcyIDExOSA1NyAxMTQgMTg0IDIwMCA4MSA2OCAxMjIgMzkgMjYgODQgOTYgMjYgCis4MCAxIDIwOCAxNzcgMjE3IDI0IDQ0IDE5MSAyMDYgMTE4IDIwOSAxMjMgOCAxNDAgOTkgMTI4IDk5IDU0IDEwOSA0MiA1OCA4MyA4MCAKKzEyMiAxMTMgMTQxIDk2IDE0NyAyMDMgMTgzIDE4MCAxNzUgMTU4IDE2IDE0MyAxNTUgMTU1IDExIDEgMTMgNjQgMjMgMSA4NyA1NCAzNSAKKzUyIDQ2IDE1NyAxMjEgMTkgMjcgMTc0IDExNSAxMzAgMjA5IDcyIDEyMyAxNTIgMTUwIDg3IDIwMiAxNDAgNzYgMjMgNzUgNzcgNjYgODYgCisxMSAxNDkgMTE4IDg4IDQ0IDE2OCAxMDEgOTQgMTQgODAgMTQ1IDkzIDE2NSA3MyA2NSA2NiAxMiAyMSAxMzcgMTkyIDQgMjIgODMgMjAxIAorMTIwIDc3IDExMyA5NCAxODEgMTk1IDE1NyAxNDQgMTI0IDUxIDE1MSAzMyAyMTEgMzggMTMxIDE3OCAxODYgMTM4IDE4NCA1IDYxIDkyIAorOTkgMTc1IDEwNyA2IDE1NSA4MSAxMTQgMjA3IDg3IDEwNSA0NSA0MCAxMjAgNzMgMTggNTggNjAgMTkzIDk4IDExIDk4IDE1IDEwMCA1MSAKKzMgMTQ2IDE4NyA2MSA4OCA5NyAxMzkgMjA0IDEyOSAxODkgNzMgMjEzIDE3MSAzNiAyMTYgNTUgNTUgNTEgMTc0IDEzOCAxNyAxNSA0OSAKKzQxIDE1IDE5NyAxNDYgMzkgMTc0IDY0IDEyMCAzIDEyMyA4MiAzNyAxMTEgMTc5IDU4IDE1NyA3MCAxMzQgMzkgMTAwIDc0IDEwOCAxNzAgCisxNjQgMTk3IDE2OSAxNDQgMTk4IDQxIDE2MyA4NCAxNzAgMTYgOTIgMTQ1IDE2NyAxNTUgODUgMTE2IDI1IDIwOCAyMDAgMTA0IDQ4IDIxIAorMTYgNjkgNDAgMTQzIDE3OCA0MiAzNSAxOTYgNTYgMTQ1IDcwIDYwIDQ5IDg4IDIzIDE0OSAxOTIgNzggMTIgOTUgMTI3IDIwNCA1NSAKKzE5OSA2MSAxNjIgMjEyIDE1MSAxMzAgODggNzQgMzQgMTgwIDE1MiA1MyAyMTAgMTY2IDExMiA3NCAxODIgNjcgMTc2IDMwIDM1IDI5IAorMTU5IDEzMyAxOSAxMDEgMTY0IDEyNyA1NiAxNjggMTc1IDg0IDI2IDEzMSAxMDQgMTk2IDEyNiA0MCA0NiA4MyA2IDcgMTAxIDkwIDEyIAorNDQgMjQgMjE2IDEwNiAxNTggMzkgMzAgMTc5IDEzMiAxNDcgODIgNjAgMjE2IDIwMyAzNSA3NSAxNTEgMTgxIDk4IDYyIDEwOCAzIDQ5IAorMTg1IDI1IDE4NSA5NSA4MCA3MSAxMDMgMTUzIDIyIDEwNiA4OCAxNDQgNTQgMTU2IDE3NSAxMCAxMjkgMTE5IDE3OCAxOSAxNDggMTcyIAorNzkgMTAyIDIwNyAxMyAyMDggMzMgMTE0IDM2IDk1IDU3IDkxIDc5IDE3NiAxMDQgMjUgNDEgMjEwIDkyIDEyMiA2MiAxMzEgMTA4IDczIAorMTYyIDE2MSA0OCAxNDIgMTQgMzMgMTM3IDE0MSAxMTkgMzQgOSAxNjAgNSAzOCAyMDUgNzUgMTk4IDE4OSA1MCAxMDggMTEyIF4KKzQ1NCAxIDUzIDE3MyAxOTIgMTEzIDExMSAxMDIgMTIwIDEzMiAyMiAxMTIgMTE4IDIwIDQwIDcgOCAyMTMgNDYgMTI5IDI4IDc3IDE1MCAKKzExIDgxIDE2MCA0OSA2MCAxNTQgMTI0IDExOSAxMzkgNDMgMTM1IDIxMyAxMDkgMzggNTIgMTE3IDIwMSAxMTYgMTY4IDE0OSAyMTUgCisxODEgMzIgNjQgMTY0IDU5IDk4IDEzMyAxNSAxOTQgMTk4IDI4IDU0IDkgMTgzIDEwNCA1OCAxNzYgMjA5IDU5IDEyIDIwMCAxNjMgMTc3IAorNDUgNTAgMTE2IDE0NSA4IDY0IDIwNCAxNTAgNzQgOTMgMTg0IDg5IDExMSAzOSAxMDggMTA4IDg1IDYxIDEzIDM2IDE1NCA2MSAyMTAgCisxMTUgMyA4NCAxMDggMjIgMTUyIDIwOSAyMTYgMTAzIDE3NiAxMjMgMTI2IDU3IDE4MyAxMCAxOTkgMTA3IDE4NiAxNjEgMTA1IDUxIDM4IAorNjkgMTg0IDI2IDIwMiAxNSAxNzEgNTcgOTcgNzcgMjQgOTAgMzMgMTgzIDE2NyA3MCA4MyAyOSAxMTAgNjcgNDkgMTIzIDYzIDE0OCAKKzE1OSAxOTAgMTQ4IDIgOTkgMTcyIDE1OSAzMyAxNjAgMjYgMTM5IDMgNDQgMTcgNDYgODkgNDAgMTAxIDg3IDYyIDY5IDI3IDM4IDYgNTUgCisyIDE2MiAxODQgMTgzIDE5MCAyMTEgMTMxIDYgMjEyIDIxMCAxMzggMTQ0IDEzMiA4NSAxMjQgMjUgNjAgOTEgMTEyIDk1IDk5IDIxMiAKKzMwIDEyNiAxMjAgMTk1IDM0IDE5IDE1OCA3MSAyOCAyMTEgMjE3IDU2IDE2NyA3IDcxIDEyMiA3MCA2NiA3OSA2NSAxMzQgMjcgNjEgCisxNDcgMTAzIDE5OSA0NCA1NyAxMzcgNjUgNTAgMjAyIDc4IDgwIDgxIDEzNyAxMjggMTIgMTc3IDIyIDEyOSA2OCAxNjggMjMgNzQgMzAgCis1NSAxODIgMTc0IDIwOCAzIDIxIDk2IDIxOCAxMTIgMTU4IDExMSAxNiAxODcgMTc3IDUgMTc5IDE0MCA4MiA1OSA1MiAxODggMzYgMjAgCisyMTQgNjIgMjkgMTU2IDYyIDQ2IDEwNiAxMDcgMjkgNzAgMTI5IDkxIDg5IDE3NCA1MSAxNSA0NSAxMzYgNDkgMTAwIDE0MiAyMTcgMTgyIAorODggNTUgNDggNCAxNjMgMjAgMTc0IDc0IDE1NiAxOTYgMTEzIDE1MSA5MCA5NiA5MiAxOTEgNyAxMzQgMTM0IDk0IDEwNiAxMzAgMTcwIAorMSAxMDYgMTkzIDc5IDI1IDE0NiAyNCA2NyAxMTIgMzIgMTkwIDg1IDIxMCA3NSAxNSAxMDggNDUgNzMgMzcgMTkzIDIwNSAxNjYgMTk0IAorMSAxNjkgMTAyIDIwNiA2NSAxOTcgMTI5IDUxIDIxOCAxOTggMjA4IDY2IDMzIDEyMCAxNTUgMTYzIDQzIDk1IDUgMTMzIDc4IDEwMyAyIAorMTg1IDEwNSAxMTQgMTY3IDkzIDQgNzcgODcgMTAyIDU3IDMgMjE4IDE3NSA2NyAxMzUgNTYgMTggMTY1IDkyIDE2OCA4NiAyMDMgMTU3IAorMjEyIDEzIDU5IDc1IDEwOSAxODcgMjE3IDk2IDE1NSAyMDMgMzEgNzEgMTg1IDgyIDE5MyAxMTkgMTE2IDEyMiAyMDQgMTYgNyA0OCAKKzIwMSAyMiA4OSAxOTcgMTkyIDYzIDEyNSAxOCAzOSAxNzEgMTcgMTA5IDEwMSA2NCAxNDEgMTM4IDUwIDUzIDEzMyAxMDEgMTI3IDE1MyAKKzQ1IDIwNyAxMDQgMTIxIDE4OCAxMyAyMTYgNjMgODUgMTQ3IDE2NiAxMDggNjggMjE0IDE4OCA1MyA4NyAzOSAxNDggOTYgMTc4IDEyNCAKKzE4MiA0OCA2NyA3MiA0NCAyMTQgMTI1IDQxIDYzIDIxOSA5NyAyMTEgMTk0IDEzNSAxNiAzMCAxODkgMTMyIDIxOSAxOTEgNzAgNDMgCisxNTggMTgxIF4KKzQ3NSAwIDE1MyAxMTggMzcgOTkgNDggOTQgNjAgNjQgMTg5IDQ3IDExOCAxMTAgMTU1IDUxIDIxIDc3IDQgNDMgNjYgMTk1IDE5NiA5OSAKKzIxNSAxMiAxMTAgNiAyMTYgMjQgMTE3IDEzNCAyMDUgMTQyIDEwNSAxNjQgNzYgMTU5IDE3NiAxMDEgMzkgMjE4IDg4IDE4NCAxNjUgCisxNDMgMjYgMzIgMzUgMTcgNyAxMTkgMzEgMjMgMTIzIDEwMSAxMzAgMTM1IDE0NCA5MyA4IDExMyA2NCAyMDcgMTMwIDYyIDIwMSA5MCAKKzgxIDIwNSAxMSAyMiAyMjAgOTQgMiAxNDYgMjYgMTA1IDkxIDIwIDE1NiAyNyAxOTMgMjA4IDE0MiAxNzggMTA3IDc5IDE5OSA4NCA0MSAKKzIgMTI4IDE2NSAxNjEgMTA5IDg1IDE3IDE3NCAzNyA4MSAxODcgMTUwIDc4IDEyOSAxNTkgMTk0IDE4NCA5MiA4NyAyMyAyMTQgMTggNzcgCisxNTMgMjA5IDYzIDQ2IDE3OSA0NiAzMCAxMDIgMzMgMjkgNTAgODIgMTI2IDEwMSAyMDMgNzggMTQ3IDIwIDEzOCA1MyAyNyAxMTcgMjA3IAorMTQ4IDE0NSAzMiAxODEgMTYgMTMgODYgMTc4IDE2IDE2MiAzMCAxNzUgMTk4IDMyIDkwIDk5IDY2IDE3NyAxMTMgMTU1IDEyNCAxODYgCis4MCA0NCA2MCAxMTkgNDkgMTA2IDE3NiAxOTIgNjUgNTIgMTA2IDI3IDI2IDY4IDkyIDE0IDgwIDIxMSAyMDAgMTY5IDIxMyAyNCA0NCAKKzE5MSAyMDIgMTAyIDE5NyAxMTEgMTQwIDk5IDEyNCA5NSA1NCA5NyA0MiA1NCA3OSA2OCAxMTAgOTcgMTMzIDgwIDEzNSAxOTkgMTc1IAorMTgwIDE3MSAxNDYgOCAxMzEgMTQ3IDE1MSAyMjEgMjE5IDkgNTIgMTUgMSA3OSA1MCAyNyA0NCA0MiAxNDUgMTA1IDE1IDE5IDE2MiAKKzEwMyAxMTggMjAxIDcyIDEwNyAxNTIgMTQyIDg3IDE5MCAxMzIgNjggMTkgNzEgNzcgNjIgNzAgNyAxMzcgMTE0IDc2IDIxNCAzNiAxNjAgCis5NyA3OCAyMjAgNzYgMTQxIDkzIDE1NyA1NyA2MSA1OCA5IDEyNSAxODAgNCA2IDY3IDE4OSAxMjAgNjEgMTEzIDgyIDE4MSAxODMgMTUzIAorMTM2IDEyMCA0MyAxMzkgMjkgMTk5IDI2IDEyMyAxNzQgMTg2IDEzOCAxODQgMSA2MSA3NiA4MyAxNzUgMTA3IDYgMTQzIDgxIDExNCAKKzIwNyA3NSA4OSAyOSAzMiAxMDggNzMgMTAgNDYgNDggMTg1IDg2IDExIDk4IDIyMSA4OCAzNSAyMjEgMTQ2IDE3NSA0OSA4OCA5MyAxMzkgCisxOTYgMTE3IDE4OSA2NSAyMDEgMTYzIDI0IDIwOCA1MSAzOSA1MSAxNzAgMTM0IDEgMyA0OSAzMyAxMSAxODkgMTM4IDM1IDE2NiA2NCAKKzExNiAyMTMgMTE1IDcwIDI1IDExMSAxNjcgNTggMTQ5IDY2IDEyMiAzMSA5NiA2NiAxMDQgMTcwIDE1MiAxOTcgMTY5IDE0MCAxOTAgNDEgCisxNTEgNzIgMTYyIDEyIDkyIDE0NSAxNjMgMTU1IDY5IDEwNCAyMSAyMDggMjAwIDk2IDQ4IDIxIDQgNjEgNDAgMTM5IDE3OCAzNCAyMyAKKzE5NiA0NCAxMzMgNjIgNTIgMzMgODQgMjMgMTQxIDE4NCA3NCA0IDc5IDEyMyAxOTIgNDcgMTkxIDUzIDE1OCAyMDAgMTUxIDEzMCA4MCAKKzYyIDM0IDE3MiAxNDAgNDEgMjA2IDE1NCAxMTIgNzAgMTc0IDU1IDE2NCAxOCAxOSAxMyAxNTkgMTIxIDE5IDg5IDE2MCAxMTUgNTIgCisxNjQgMTY3IDc2IDEwIDExOSAxMDQgMTg4IDEyNiAyOCAzOCA3NSAyMjAgMyA4NSA5MCA4IDQwIDggMjA0IDkwIDE1NCAzOSAxNCAxNzEgCisxMjggMTQ3IDc4IDU2IDIxNiAxOTEgMzUgNzUgMTQ3IDE2OSA4MiA1MCAxMDAgMjA5IDQ1IDE4NSAxMyAxNzcgOTUgMTUwIF4KKzQ3MSAwIDcxIDg5IDEzOSA4IDkyIDYwIDE0NCAyNiAxNDIgMTU0IDMgMTIyIDk4IDE2NCAyMTYgMTM0IDE3MiA1OCA5NSAyMDAgMjI0IAorMjAxIDUgODYgMzYgODEgMjkgNjMgNjUgMTYyIDc2IDExIDEzIDE5NiA3OCAxMDggNTUgMTMxIDgwIDY2IDE2MiAxNjEgMjcgMTQyIDE0IAorMTkgMTIzIDE0MSAxMDUgNiAyMjAgMTQ2IDIwOSAyNCAxODQgNDcgMTk4IDE3NSAyMiA4NyAxMzMgMzggMTczIDE5MiAyMDUgMTAzIDkxIAorOTcgMTE1IDEyMiA3IDkyIDEwMyAyNSAyIDIxMyAyMTMgMzYgMTI0IDEzIDYyIDE1MCAyMjEgNjEgMTUwIDM5IDQ1IDE0OSAxMjQgMTA0IAorMTM0IDM4IDEzMCAyMDggMTA5IDE4IDMyIDExMiAyMDEgOTYgMTU4IDE0OSAyMTUgMTc2IDIyIDQ0IDE0OSAzOSA4OCAxMzMgMjIwIDE4OSAKKzE5MyAyMyA0NCA5IDE4MyA4OSA0OCAxNjEgMjA0IDU0IDIyMiAxOTUgMTYzIDE2NyA0MCA0NSAxMDYgMTQwIDggNDkgMjA0IDE0NSA2OSAKKzgzIDE2OSA4OSA5NiAyNCA5MyAxMDMgODUgNDEgMyAzMSAxNTQgNTEgMjEwIDExNSAyMTMgNzkgMTA4IDEyIDE0NyAyMDkgMjA2IDEwMyAKKzE3NiAxMTMgMTE2IDM3IDE3MyAxMCAxODkgMTAyIDE3NiAxNTYgMTAwIDM2IDMzIDY5IDE3NCAxNiAyMDIgNSAxNzEgNTIgODIgNzIgNCAKKzgwIDIzIDE3OCAxNjIgNzAgODMgMjkgMTA1IDY3IDM0IDExOCA0MyAxNDMgMTU0IDE4NSAxMzggMiA3OSAxNTcgMTQ5IDMzIDE2MCAyMSAKKzEyOSAyMDggMjQgMiAzMSA2OSAzNSA4MSA3MiA0NyA2NCAyMiAzOCAyMjEgNTUgMjIyIDE1MiAxNzkgMTY4IDE4MCAyMTEgMTIxIDEgCisyMDcgMjAwIDEzMyAxMjkgMTE3IDgwIDExNCAyNSA1MCA3NiAxMDIgODUgODQgMjEyIDMwIDExMSAxMTAgMTk1IDI5IDE0IDE1MyA1MSAKKzI4IDE5NiAyMTIgMzYgMTY3IDIyMiA2MSAxMDcgNTUgNDYgNjQgNjUgMTE5IDIyMCAxMiA1NiAxMzcgOTMgMTk0IDI5IDU3IDEzNyA1MCAKKzIxMCAzMCAxOTcgNzggNjUgNzEgMTMyIDEyMyA3IDE3NyAyMiAxMjkgNjggMTY4IDMgNzQgMTAgNTAgMTY3IDE3NCAxOTggMjE4IDYgODYgCisyMTggOTcgMTU4IDEwNiA2IDE3NyAxNjIgMjEwIDE2NCAxMjUgNjIgNTkgNTIgMTczIDE2IDIwIDIxNCA0MiA5IDE0MSA1NyA0NiAxMDYgCis5NyAyNCA1MCAxMTkgODYgODQgMTY5IDQ2IDE1IDI1IDEzNiA0NCAxMDAgMTI3IDIwMiAxODIgODMgMzUgMzMgMjA5IDE1OCAxNSAxNTkgCis2NCAxNTYgMTkxIDEwOCAxNDYgNzUgOTYgNzIgMTgxIDIxNyAxMzQgMTI5IDc0IDk2IDExNSAxNjUgMjE2IDkxIDE4OCA1OSAxMCAxNDEgCisxNCA2MiAxMDcgMTIgMTkwIDY1IDIwNSA2MCAxMCA5OCAzMCA2MyAyMiAxNzggMjA1IDE1MSAxNzkgMjExIDE2NCA4MiAyMDYgNjAgMTkyIAorMTE0IDMxIDIwMyAxODggMTkzIDY2IDI4IDEwNSAxNDAgMTQ4IDMzIDc1IDUgMTI4IDY4IDgzIDIxMiAxNzAgOTUgMTA5IDE1MiA4OCAKKzIyNCA2NyA3NyAxMDIgNDIgMyAyMTMgMTcwIDUyIDEyNSA1NiAzIDE2NSA4MiAxNjMgNzYgMTkzIDE1NyAxOTcgMjE4IDQ5IDcwIDg5IAorMTgyIDIxNyA5MSAxNDUgMjAzIDExIDU2IDE4MCA3NyAxOTMgMTE0IDExNiAxMjIgMTg5IDExIDcgNDMgMTkxIDE3IDc0IDE4NyAxODcgCis1MyAxMjUgMTMgMTkgMTY2IDIyMiAxMDQgOTEgNTQgMTMxIDEyMyA1MCAzMyAxMTggODYgMTI3IDE2NyBeCis0ODAgMSA0NSAxOTMgNzYgMTIxIDE4MSAyMTkgMTk1IDQyIDY0IDEyNiAxNjYgODAgNDAgMjAwIDE4OCA1MyA4MCAyNSAxNDggNzUgMTU3IAorMTE3IDE3NSAyMCA1MyA0NCAzMCAyMDcgMTExIDI3IDYzIDE5OCA5NyAyMDQgMTk0IDExNCAyMjIgMjMgMTgyIDEzMiAyMTIgMTcwIDYzIAorMjIgMTQ0IDEyMCAxNDMgMTE4IDM3IDc5IDM4IDk0IDYwIDU0IDE4NCA0NyAxMDggMTEwIDE1MCA0MSAxMSA2MiAyMTEgNDMgNTEgMTgwIAorMTgxIDk0IDIwMCAxMiAxMDAgMjIzIDIwMSAxNCAxMTcgMTI0IDIwMCAxMzcgOTUgMTY0IDc2IDE0NCAxNzEgMTAxIDM0IDIxMyA4MyAKKzE2OSAxNTAgMTQzIDE2IDMyIDIwIDIgMjI0IDExNCAzMSAxOCAxMjMgOTYgMTE1IDEzNSAxMjkgODMgMjIwIDEwOCA1OSAxOTIgMTI1IAorNjIgMTk2IDgwIDc2IDE5NSAyMTggMTcgMjEwIDc5IDIxNCAxMzYgNiAxMDUgOTEgNSAxNDEgMjcgMTg4IDE5MyAxMjcgMTY4IDk3IDc5IAorMTk5IDg0IDMxIDIwOSAxMjggMTU1IDE1MSA5NCA3NSAxNyAxNTkgMzIgNzEgMTg3IDE0MCA2MyAxMjQgMTQ5IDE3OSAxNzkgNzcgNzIgCisxMyAyMDQgMTggNzIgMTM4IDE5OSA0OCAzNiAxNzkgMjYgMjUgOTcgMjggMTQgMzAgODIgMTE2IDg2IDE4OCA2OCAxMzIgMTMzIDM4IDcgCisxMDcgMTk3IDEzMyAxNDAgMTIgMTY2IDYgMyA4NiAxNzMgMTYgMTU3IDE1IDE3MCAxODggMTcgODUgODQgNDYgMTcyIDEwMyAxNDAgMTE0IAorMTcxIDY1IDM5IDQ1IDExOSAzOSA5NiAxNjYgMTgyIDQ1IDMyIDg2IDEyIDI2IDQ4IDg3IDIyNiA4MCAyMDEgMTkwIDE1OSAyMDggMjQgCis0NCAxOTEgMTk3IDgyIDE4MiA5NiAyMTcgMTQwIDk5IDExOSA5MCA1NCA4MiA0MiA0OSA3NCA1MyA5NSA3NyAxMjMgNjAgMTIwIDE5NCAKKzE2NSAxODAgMTY2IDEzMSAyMjUgMTE2IDEzNyAxNDYgMjExIDIxOSA0IDM3IDUgMSA2OSA0NSAxNyAzNCAzNyAxMzAgODUgMTAgOSAxNDcgCis4OCAxMDMgMTkxIDcyIDg3IDE1MiAxMzIgODcgMTc1IDEyMiA1OCAxNCA2NiA3NyA1NyA1MCAyIDEyMiAxMDkgNjEgMjA5IDI2IDE1MCAKKzkyIDU4IDIwNSA3MSAxMzYgOTMgMTQ3IDM3IDU2IDQ4IDIxMiAyMjEgMTEwIDE2NSA0IDIxMyA0NyAxNzQgMTIwIDQxIDExMyA2NyAxODEgCisxNjggMTQ4IDEyNiAxMTUgMzMgMTI0IDI0IDE4NCAxMSAxMTMgMTY5IDE4NiAxMzggMTg0IDIyMyA2MSA1NiA2MyAxNzUgMTA3IDYgMTI4IAorODEgMTE0IDIwNyA2MCA2OSA5IDIyIDkzIDczIDMxIDMzIDE3NSA3MSAxMSA5OCAyMDYgNzMgMTUgMjIxIDE0NiAxNjAgMzQgODggODggCisxMzkgMTg2IDEwMiAxODkgNTUgMTg2IDE1MyA5IDE5OCA0NiAxOSA1MSAxNjUgMTI5IDIwOCAyMTUgNDkgMjMgNiAxNzkgMTI4IDMwIAorMTU2IDY0IDExMSAyMDMgMTA1IDU1IDEwIDExMSAxNTIgNTggMTM5IDYxIDEwNyAyMSA5MSA1NiA5OSAxNzAgMTM3IDE5NyAxNjkgMTM1IAorMTgwIDQxIDEzNiA1NyAxNTIgNyA5MiAxNDUgMTU4IDE1NSA0OSA4OSAxNiAyMDggMjAwIDg2IDQ4IDIxIDIxNiA1MSA0MCAxMzQgMTc4IAorMjQgOCAxOTYgMjkgMTE4IDUyIDQyIDEzIDc5IDIzIDEzMSAxNzQgNjkgMjIxIDU5IDExOCAxNzcgMzcgMTgxIDQzIDE1MyAxODUgMTUxIAorMTMwIDcwIDQ3IDM0IDE2MiAxMjUgMjYgMjAxIDEzOSAxMTIgNjUgMTY0IDQwIDE0OSAzIDIyNiAyMjAgMTU5IDEwNiAxOSA3NCAxNTUgCisxMDAgNDcgMTU5IDE1NyAxOTMgXgorNDcxIDAgMjExIDk4IDEwNCAxNzQgMTI2IDcgMjQgNjEgMjEzIDIyNSA1NyA5MCAxIDMzIDIwOSAxODMgNjIgMTQ3IDM5IDIxNSAxNTcgCisxMjEgMTQ3IDcxIDQ5IDIxNiAxNzAgMzUgNzUgMTQwIDE0OCA1NCAyOSA4NiAxODggMzggMTg1IDIyMSAxNjMgOTUgNTggNzEgODEgMTMxIAorODQgNDQgMTQ0IDEwIDEzNCAxNDIgMjI4IDExOCA4NiAxNTYgMjA0IDEyNiAxNzIgNDYgOTEgMTk2IDIyMCAxOTcgMjE4IDcwIDM2IDczIAorMTMgNDcgNTcgMTU0IDYwIDMgMjI2IDE4OCA3MCAxMDAgNTEgMTMxIDY0IDYyIDE2MiAxNjEgMTUgMTQyIDE0IDExIDExNSAxNDEgOTcgCisyMTkgMjE2IDEzOCAyMDEgMTYgMTcyIDMxIDE5OCAxNjcgNiA3NSAxMjUgMjYgMTczIDE5MiAxOTMgOTUgNzUgOTMgMTExIDExNCAyMjQgCis3NiA5MSAyMTMgMTMgMjI3IDIwMSAyMTMgMjggMTIwIDEgNTAgMTUwIDIxMyA0NSAxNDIgMzEgMzMgMTQ1IDEyNCA5MiAxMzAgMzQgMTI2IAorMjA0IDEwOSAyIDE2IDEwOCAyMDEgODAgMTUwIDE0OSAyMTUgMTcyIDE0IDI4IDEzNyAyMyA4MCAxMzMgMjA4IDE4NSAxODkgMTkgMzYgOSAKKzE4MyA3NyA0MCAxNDkgMjAwIDUwIDIxNCAxOTEgMTYzIDE1OSAzNiA0MSA5OCAxMzYgOCAzNyAyMDQgMTQxIDY1IDc1IDE1NyA4OSA4NCAKKzEyIDgxIDk5IDg1IDI1IDIyNCAyNyAxNTQgNDMgMjEwIDExNSAyMDUgNzUgMTA4IDQgMTQzIDIwOSAxOTggMTAzIDE3NiAxMDUgMTA4IAorMjEgMTY1IDEwIDE4MSA5OCAxNjggMTUyIDk2IDI0IDI5IDY5IDE2NiA4IDIwMiAyMjYgMTcxIDQ4IDcwIDY4IDIxNyA3MiAxNSAxNzQgCisxNTggNzAgODMgMjkgMTAxIDY3IDIyIDExNCAyNyAxMzkgMTUwIDE4MSAxMzAgMiA2MyAxNDUgMTQxIDMzIDE2MCAxNyAxMjEgMTk2IDggCisyMTkgMTkgNTMgMzEgNjUgNjAgMzUgNjAgMTggMzggMjE3IDU1IDIyMiAxNDQgMTc1IDE1NiAxNzIgMjExIDExMyAyMjYgMjAzIDE5MiAKKzEyOSAxMTcgMTA1IDc2IDEwNiAyNSA0MiA2NCA5NCA3NyA3MiAyMTIgMzAgOTkgMTAyIDE5NSAyNSAxMCAxNDkgMzUgMjggMTg0IDIwOCAKKzIwIDE2NyAyMTggNTMgOTUgNDMgMzAgNTIgNjUgMTA3IDIyMCA1MiAxMjkgODUgMTkwIDE3IDU3IDEzNyAzOCAyMDIgMTQgMTkzIDc4IAorNTMgNjMgMTI4IDExOSAzIDE3NyAyMiAxMjkgNjggMTY4IDIxNiA3NCAyMjMgNDYgMTU1IDE3NCAxOTAgMjE0IDIyMyA3OCAyMTggODUgCisxNTggMTAyIDIyNyAxNjkgMTUwIDE5OCAxNTIgMTEzIDQ2IDU5IDUyIDE2MSAyMCAyMTQgMjYgMjIyIDEyOSA1MyA0NiAxMDYgODkgMjAgCiszNCAxMTEgODIgODAgMTY1IDQyIDE1IDkgMTM2IDQwIDEwMCAxMTUgMTkwIDE4MiA3OSAxOSAyMSAxOTcgMTU0IDExIDE0NyA1NiAxNTYgCisxODcgMTA0IDE0MiA2MyA5NiA1NiAxNzMgMjA5IDEzNCAxMjUgNTggODggMTAzIDE2MSAyMTIgNzkgMTg0IDQzIDIyNyAxMzcgNiA1OCAKKzEwMyAyMjUgMTkwIDQ5IDIwMSA0OCA2IDkwIDE4IDU1IDEwIDE2NiAyMDUgMTM5IDE2NyAyMDMgMTYwIDY2IDIwNiA1NiAxODggMTAyIAorMTUgMTkxIDE4MCAxODEgNjYgMjQgOTMgMTI4IDEzNiAyNSA1OSA1IDEyNCA2MCA2NyAyMDQgMTU4IDg3IDEwNSAxNDAgODQgMjI0IDU5IAorNjkgMTAyIDMwIDMgMjA5IDE2NiA0MCAxMTcgNTYgMjIwIDE2NSA3NCAxNTkgNjggMTg1IDE1NyAxODUgMjA2IDQxIDY2IDE2NyBeCis0OTAgMSAxNzYgMjE3IDg1IDEzMyAyMDMgMjE4IDM4IDE3NCA3MSAxOTMgMTA4IDExNiAxMjIgMTcxIDUgNyAzNyAxNzkgMTEgNTYgMTc1IAorMTgxIDQxIDEyNSA3IDIyNiAxNjAgMjA0IDk4IDc5IDQyIDExOSAxMDUgNTAgOSAxMDAgNjggMTI3IDE1MyA0NSAxODUgNjAgMTIxIDE3NyAKKzIxMSAxODMgMzAgNTIgMTE0IDE2NiA2NCAyNCAxOTIgMTg4IDUzIDc2IDE3IDE0OCA2MyAxNDUgMTEzIDE3MSA0IDQ1IDI4IDIyIDIwMyAKKzEwMyAxOSA2MyAxODYgOTcgMjAwIDE5NCAxMDIgMjE0IDE5IDE3OCAxMzIgMjA4IDE1OCA1OSAxMCAxMzYgMTEyIDEzNSAxMTggMzcgNjMgCiszMCA5NCA2MCA0NiAxODAgNDcgMTAwIDExMCAxNDYgMzMgMyA1MCAxOTkgNDMgMzkgMTY4IDE2OSA5MCAxODggMTIgOTIgMjE5IDE4OSA2IAorMTE3IDExNiAxOTYgMTMzIDg3IDE2NCA3NiAxMzIgMTY3IDEwMSAzMCAyMDkgNzkgMTU3IDEzOCAxNDMgOCAzMiA4IDIyMSAyMjAgMTEwIAorMzEgMTQgMTIzIDkyIDEwMyAxMzUgMTE3IDc1IDIxMiAxMDQgNTUgMTgwIDEyMSA2MiAxOTIgNzIgNzIgMTg3IDIwNiAxMyAyMDIgNjcgCisyMDYgMTI4IDIyMSAxMDUgOTEgMjI0IDEyOSAyNyAxODQgMTgxIDExNSAxNjAgODkgNzkgMTk5IDg0IDIzIDE5NyAxMjggMTQ3IDE0MyAKKzgyIDY3IDE3IDE0NyAyOCA2MyAxODcgMTMyIDUxIDEyMCAxNDEgMTY3IDE3NSA2NSA2MCA1IDE5NiAxOCA2OCAxMjYgMTkxIDM2IDI4IAorMTc5IDEwIDIxIDkzIDI0IDIgMTQgODIgMTA4IDc0IDE3NiA2MCAxMjAgMjE1IDEyOSAyNiAyMjIgOTkgMTg5IDEyMSAxMzYgMjI3IDE1NCAKKzIyOSAyMjYgODYgMTY5IDE2IDE1MyAzIDE2NiAxODAgNSA4MSA3MiAzMCAxNjggOTUgMTI4IDEwNiAxNTkgNTMgMzUgMzMgMTE5IDMxIAorODggMTU4IDE3NCAyOSAxNiA3MCAyNiAzMiA4MyAyMTggODAgMTkzIDE4MiAxNTEgMjA0IDI0IDQ0IDE5MSAxOTMgNjYgMTcwIDg0IDIxMyAKKzE0MCA5OSAxMTUgODYgNTQgNzAgNDIgNDUgNzAgNDEgODMgNjEgMTE1IDQ0IDEwOCAxOTAgMTU3IDE4MCAxNjIgMTE5IDIyMSAxMDQgCisxMjkgMTQyIDIwMyAyMTkgMjUgMjI4IDEgNjEgNDEgOSAyNiAzMyAxMTggNjkgNiAxIDEzNSA3NiA5MSAxODMgNzIgNzEgMTUyIDEyNCAKKzg3IDE2MyAxMTQgNTAgMTAgNjIgNzcgNTMgMzQgMjI5IDExMCAxMDUgNDkgMjA1IDE4IDE0MiA4OCA0MiAxOTMgNjcgMTMyIDkzIDEzOSAKKzIxIDUyIDQwIDIwNCAyMTMgOTggMTUzIDQgMjAxIDMxIDE2MiAxMjAgMjUgMTEzIDU1IDE4MSAxNTYgMTQ0IDExOCAxMTEgMjUgMTEyIAorMjAgMTcyIDIzMCAxMDUgMTY1IDE4NiAxMzggMTg0IDIyMyA2MSA0MCA0NyAxNzUgMTA3IDYgMTE2IDgxIDExNCAyMDcgNDggNTMgMjI0IAorMTQgODEgNzMgMjIzIDE5IDIxIDE2NyA1OSAxMSA5OCAxOTQgNjEgMjMwIDIyMSAxNDYgMTQ4IDIyIDg4IDg0IDEzOSAxNzggOTAgMTg5IAorNDcgMTc0IDE0NSAyMjggMTkwIDQyIDMgNTEgMTYxIDEyNSAxOTYgMjA3IDQ5IDE1IDIgMTcxIDEyMCAyNiAxNDggNjQgMTA3IDE5NSA5NyAKKzQzIDIyOSAxMTEgMTQwIDU4IDEzMSA1NyA5NSAxMyA4NyA0OCA5NSAxNzAgMTI1IDE5NyAxNjkgMTMxIDE3MiA0MSAxMjQgNDUgMTQ0IDMgCis5MiAxNDUgMTU0IDE1NSAzMyA3NyAxMiAyMDggMjAwIDc4IDQ4IDIxIDIwOCA0MyA0MCAxMzAgMTc4IDE2IDIyNyAxOTYgMTcgMTA2IDQ0IAorMzQgMjI4IDc1IDIzIDEyMyAxNjYgNjUgMjE3IDQzIDExNCAxNjUgMjkgMTczIDM1IDIwMCBeCis0NzkgMCAxNjcgMTUxIDEzMCA1OCAyOSAzNCAxNTAgMTA3IDggMTk1IDEyMSAxMTIgNTkgMTUyIDIyIDEzMSAyMTggMjA4IDIwMiAxNTkgCis4OCAxOSA1NiAxNDkgODIgNDEgMTUzIDE0NSA1NCAxOTkgODYgMTA0IDE2NiAxMjYgMjI4IDE2IDUzIDIwOSAyMjUgNDEgOTAgMjMwIDI5IAorMTk3IDE3MSA0NiAxNDMgMzkgMjAzIDE0OSAxMTcgMTQ3IDY3IDQ1IDIxNiAxNTggMzUgNzUgMTM2IDEzNiAzOCAxNyA3OCAxNzYgMzQgCisxODUgMjEzIDE1NSA5NSA1MCA3MSA3MyAxMjMgMjI1IDc2IDI4IDE0NCAyMjcgMTI2IDEzMCAyMjggMTE0IDc0IDE0OCAxOTIgMTE4IAorMTcyIDM0IDg3IDE5MiAyMTYgMTkzIDIwNiA1NCAzNiA2NSAyMzAgMzEgNDkgMTQ2IDQ0IDIyOCAyMTQgMTgwIDYyIDkyIDQ3IDEzMSA0OCAKKzU4IDE2MiAxNjEgMyAxNDIgMTQgMyAxMDcgMTQxIDg5IDIwNyAyMTIgMTMwIDE5MyA4IDE2MCAxNSAxOTggMTU5IDIyMyA2MyAxMTcgMTQgCisxNzMgMTkyIDE4MSA4NyA1OSA4OSAxMDcgMTA2IDIxNiA2MCA3OSAyMDEgMSAyMjcgMTg5IDIxMyAyMCAxMTYgMjIyIDM4IDE1MCAyMDUgCisyOSAxMzQgMjMgMjEgMTQxIDEyNCA4MCAxMjYgMzAgMTIyIDIwMCAxMDkgMjE5IDEwNCAyMDEgNjQgMTQyIDE0OSAyMTUgMTY4IDYgMTIgCisxMjUgNyA3MiAxMzMgMTk2IDE4MSAxODUgMTUgMjggOSAxODMgNjUgMzIgMTM3IDE5NiA0NiAyMDYgMTg3IDE2MyAxNTEgMzIgMzcgOTAgCisxMzIgOCAyNSAyMDQgMTM3IDYxIDY3IDE0NSA4OSA3MiA2OSA5NSA4NSA5IDIyMCAyMyAxNTQgMzUgMjEwIDExNSAxOTcgNzEgMTA4IAorMjI5IDEzOSAyMDkgMTkwIDEwMyAxNzYgOTcgMTAwIDUgMTU3IDEwIDE3MyA5NCAxNjAgMTQ4IDkyIDEyIDI1IDY5IDE1OCAyMDIgMjIyIAorMTcxIDQ0IDU4IDY0IDIwNSA2NCA3IDE3MCAxNTQgNzAgODMgMjkgOTcgNjcgMTAgMTEwIDExIDEzNSAxNDYgMTc3IDEyMiAyIDQ3IDEzMyAKKzEzMyAzMyAxNjAgMTMgMTEzIDE4NCAyMjUgMjExIDcgMzcgMjcgNDkgNDggMjMgNTYgMTQgMzggMjEzIDU1IDIyMiAxMzYgMTcxIDE0NCAKKzE2NCAyMTEgMTA1IDIyNiAxOTkgMTg0IDEyNSAxMDUgOTMgNzIgOTggMjUgMzQgNTIgODYgNjkgNjAgMjEyIDMwIDg3IDk0IDE5NSAyMSAKKzYgMTQ1IDE5IDI4IDE3MiAyMDQgNCAxNjcgMjE0IDQ1IDgzIDMxIDE0IDQwIDY1IDk1IDIyMCAyMjEgNDggMTIxIDc3IDE4NiA1IDU3IAorMTM3IDI2IDE5NCAyMzEgMTg5IDc4IDQxIDU1IDEyNCAxMTUgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDIwNCA3NCAyMTEgNDIgMTQzIDE3NCAKKzE4MiAyMTAgMjE1IDcwIDIxOCA3MyAxNTggOTggMjIzIDE2MSAxMzggMTg2IDE0MCAxMDEgMzAgNTkgNTIgMTQ5IDIxNyAyMCAyMTQgMTAgCisyMTAgMTE3IDQ5IDQ2IDEwNiA4MSAxNiAxOCAxMDMgNzggNzYgMTYxIDM4IDE1IDIyNiAxMzYgMzYgMTAwIDEwMyAxNzggMTgyIDc1IDMgCis5IDE4NSAxNTAgNyAxMzUgNDggMTU2IDE4MyAxMDAgMTM4IDUxIDk2IDQwIDE2NSAyMDEgMTM0IDEyMSA0MiA4MCA5MSAxNTcgMjA4IDY3IAorMTgwIDI3IDIxOSAxMzMgMjMxIDU0IDk5IDIxMyAxOTAgMzMgMTk3IDM2IDIgODIgNiA0NyAyMzEgMTU0IDIwNSAxMjcgMTU1IDE5NSAKKzE1NiA1MCAyMDYgNTIgMTg0IDkwIDIzMiAxNzkgMTcyIDE2OSA2NiAyMCA4MSAxMTYgMTI0IDE3IDQzIDUgMTIwIDUyIDUxIDE5NiAxNDYgCis3OSAxMDEgMTI4IDgwIDIyNCA2NSBeCis1MDMgMSA1NSAxMDIgOSAzIDIwMiAxNTkgMTkgMTAzIDU2IDIwNiAxNjUgNjAgMTUyIDU0IDE3MSAxNTcgMTY0IDE4NSAyNyA1OSA0NSAKKzE3MSAyMTcgODAgMTIzIDIwMyAyMDMgMjMgMTY5IDY2IDE5MyAxMDMgMTE2IDEyMiAxNTYgNyAzMiAxNjkgNiA0MSAxNjUgMTc2IDMxIAorMTI1IDIgMjExIDE1NSAxODkgOTMgNjkgMzIgMTA5IDkwIDUwIDIyNSA4NSA1MyAxMjcgMTUzIDQ1IDE3NSA0MCAxMjEgMTcyIDIwMSAKKzE2OCAxNSAzNyA5OSAxNjYgNDQgNCAxODIgMTg4IDUzIDcxIDcgMTQ4IDQ4IDEzMCAxMDggMTY2IDIyMCAzNSA4IDEyIDE5OCA5MyA5IAorNjMgMTcxIDk3IDE5NSAxOTQgODcgMjA0IDE0IDE3MyAxMzIgMjAzIDE0MyA1NCAyMzEgMTI2IDEwMiAxMjUgMTE4IDM3IDQzIDIwIDk0IAorNjAgMzYgMTc1IDQ3IDkwIDExMCAxNDEgMjMgMjI5IDM1IDE4NCA0MyAyNCAxNTMgMTU0IDg1IDE3MyAxMiA4MiAyMTQgMTc0IDIzMiAKKzExNyAxMDYgMTkxIDEyOCA3NyAxNjQgNzYgMTE3IDE2MiAxMDEgMjUgMjA0IDc0IDE0MiAxMjMgMTQzIDIzNCAzMiAyMjkgMjExIDIxNSAKKzEwNSAzMSA5IDEyMyA4NyA4OCAxMzUgMTAyIDY1IDIwMiA5OSA1MCAxNjUgMTE2IDYyIDE4NyA2MiA2NyAxNzcgMTkxIDggMTkyIDUyIAorMTk2IDExOCAyMDYgMTA1IDkxIDIxNCAxMTQgMjcgMTc5IDE2NiAxMDAgMTUwIDc5IDc5IDE5OSA4NCAxMyAxODIgMTI4IDEzNyAxMzMgCis2NyA1NyAxNyAxMzIgMjMgNTMgMTg3IDEyMiAzNiAxMTUgMTMxIDE1MiAxNzAgNTAgNDUgMjMxIDE4NiAxOCA2MyAxMTEgMTgxIDIxIDE4IAorMTc5IDIyNiAxNiA4OCAxOSAyMjMgMjMwIDgyIDk4IDU5IDE2MSA1MCAxMDUgMjAwIDEyNCAxMSAyMDcgODkgMTc5IDEwNiAxMzEgMjEyIAorMTM5IDIyNCAyMjEgODYgMTY0IDE2IDE0OCAyMjQgMTYxIDE3MCAyMjYgNzYgNTcgMTAgMTYzIDg1IDExMyA5NiAxNDQgMzggMzAgMTggCisxMTkgMjEgNzggMTQ4IDE2NCA5IDIzMiA1MCAyMjEgMjYgMTIgNzggMjA4IDgwIDE4MyAxNzIgMTQxIDE5OSAyNCA0NCAxOTEgMTg4IDQ2IAorMTU1IDY5IDIwOCAxNDAgOTkgMTEwIDgxIDU0IDU1IDQyIDQwIDY1IDI2IDY4IDQxIDEwNSAyNCA5MyAxODUgMTQ3IDE4MCAxNTcgMTA0IAorMjE2IDg5IDExOSAxMzcgMTkzIDIxOSAyMzEgMTAgMjIzIDEgNTEgMzYgMjM1IDE2IDI4IDEwMyA0OSAxIDIyNyAxMjAgNjEgNzYgMTczIAorNzIgNTEgMTUyIDExNCA4NyAxNDggMTA0IDQwIDUgNTcgNzcgNDggMTQgMjI5IDk1IDEwMCAzNCAyMDAgOCAxMzIgODMgMjIgMTc4IDYyIAorMTI3IDkzIDEyOSAxIDQ3IDMwIDE5NCAyMDMgODMgMTM4IDQgMTg2IDExIDE0NyAxMjAgNSAxMTMgNDAgMTgxIDE0MSAxMzkgMTA4IDEwNiAKKzE1IDk3IDE1IDE1NyAyMjAgOTUgMTYwIDE4NiAxMzggMTg0IDIyMyA2MSAyMCAyNyAxNzUgMTA3IDYgMTAxIDgxIDExNCAyMDcgMzMgMzMgCisyMDkgNCA2NiA3MyAyMTggNCA2IDE1NyA0NCAxMSA5OCAxNzkgNDYgMjE1IDIyMSAxNDYgMTMzIDcgODggNzkgMTM5IDE2OCA3NSAxODkgCiszNyAxNTkgMTM1IDIxOCAxODAgMzcgMjE5IDUxIDE1NiAxMjAgMTgxIDE5NyA0OSA1IDIzMyAxNjEgMTEwIDIxIDEzOCA2NCAxMDIgMTg1IAorODcgMjggMjE5IDExMSAxMjUgNTggMTIxIDUyIDgwIDMgODIgMzggOTAgMTcwIDExMCAxOTcgMTY5IDEyNiAxNjIgNDEgMTA5IDMwIDEzNCAKKzIzNCA5MiAxNDUgMTQ5IDE1NSAxMyA2MiA3IDIwOCAyMDAgNjggNDggMjEgMTk4IDMzIDQwIDEyNSAxNzggNiAyMTcgMTk2IDIgOTEgMzQgCisyNCAyMTMgNzAgMjMgMTEzIDE2MSBeCis0NzAgMCA1OCAyMTAgMTUgMTA3IDE0NCAxNSAxNTkgMjEgMTQyIDE1MiAxNTEgMTMwIDQ4IDE0IDM0IDE0MCA5MiAyMzEgMTkwIDEwNiAKKzExMiA1NCAxNDIgNyAxMTYgMjA4IDE5MyAxODcgMTU5IDczIDE5IDQxIDE0NCA2NyAzNiAxNDggMTM1IDQ0IDE4NCA3MSAxMDQgMTU2IAorMTI2IDIxOCA2IDQzIDIwNCAyMjUgMjEgOTAgMjMwIDI0IDE4MiAxNTYgMjYgMTM4IDM5IDE4OCAxMzkgMTEyIDE0NyA2MiA0MCAyMTYgCisxNDMgMzUgNzUgMTMxIDEyMSAxOCAyIDY4IDE2MSAyOSAxODUgMjAzIDE0NSA5NSA0MCA3MSA2MyAxMTMgMjIwIDY2IDggMTQ0IDIxMiAKKzExNiAxMTUgMjI4IDEwOSA1OSAxMzggMTc3IDEwOCAxNzIgMTkgODIgMTg3IDIxMSAxODggMTkxIDM0IDM2IDU1IDIxNSAxMSAzOSAxMzYgCisyNCAyMjMgMTk5IDE3MCA1MiA4MiA0MiAxMzEgMjggNTMgMTYyIDE2MSAyMjYgMTQyIDE0IDIzMSA5NyAxNDEgNzkgMTkyIDIwNyAxMjAgCisxODMgMjM2IDE0NSAyMzMgMTk4IDE0OSAyMDggNDggMTA3IDIzNyAxNzMgMTkyIDE2NiA3NyAzOSA4NCAxMDIgOTYgMjA2IDQwIDY0IAorMTg2IDIyNCAyMjcgMTc0IDIxMyAxMCAxMTEgMjEyIDIzIDE1MCAxOTUgOSAxMjQgMTMgNiAxMzYgMTI0IDY1IDEyMSAyNSAxMTcgMTk1IAorMTA5IDIwNCAyMTggOTkgMjAxIDQ0IDEzMiAxNDkgMjE1IDE2MyAyMzQgMjMwIDExMCAyMjUgNjIgMTMzIDE4MSAxNzYgMTgwIDEwIDE4IAorOSAxODMgNTAgMjIgMTIyIDE5MSA0MSAxOTYgMTgyIDE2MyAxNDEgMjcgMzIgODAgMTI3IDggMTAgMjA0IDEzMiA1NiA1NyAxMzAgODkgCis1NyAyMjMgNTQgOTAgODUgMjI3IDIxNSAxOCAxNTQgMjUgMjEwIDExNSAxODcgNjYgMTA4IDIyNCAxMzQgMjA5IDE4MCAxMDMgMTc2IDg3IAorOTAgMjIzIDE0NyAxMCAxNjMgODkgMTUwIDE0MyA4NyAyMzUgMjAgNjkgMTQ4IDIyOCAyMDIgMjE3IDE3MSAzOSA0MyA1OSAxOTAgNTQgCisyMzUgMTY1IDE0OSA3MCA4MyAyOSA5MiA2NyAyMzMgMTA1IDIyOSAxMzAgMTQxIDE3MiAxMTIgMiAyNyAxMTggMTIzIDMzIDE2MCA4IAorMTAzIDE2OSAyMTAgMjAxIDIzMCAxNyAyMiAyOSAzMyA4IDUxIDkgMzggMjA4IDU1IDIyMiAxMjYgMTY2IDEyOSAxNTQgMjExIDk1IDIyNiAKKzE5NCAxNzQgMTIwIDkwIDc4IDY3IDg4IDI1IDI0IDM3IDc2IDU5IDQ1IDIxMiAzMCA3MiA4NCAxOTUgMTYgMSAxNDAgMjM3IDI4IDE1NyAKKzE5OSAyMjIgMTY3IDIwOSAzNSA2OCAxNiAyMzIgMjUgNjUgODAgMjIwIDIxMSA0MyAxMTEgNjcgMTgxIDIyOCA1NyAxMzcgMTEgMTg0IAorMjE2IDE4NCA3OCAyNiA0NSAxMTkgMTEwIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxODkgNzQgMTk2IDM3IDEyOCAxNzQgMTcyIDIwNSAKKzIwNSA2MCAyMTggNTggMTU4IDkzIDIxOCAxNTEgMTIzIDE3MSAxMjUgODYgMTAgNTkgNTIgMTM0IDIwMiAyMCAyMTQgMjI4IDE5NSAxMDIgCis0NCA0NiAxMDYgNzEgMTEgMjM2IDkzIDczIDcxIDE1NiAzMyAxNSAyMTEgMTM2IDMxIDEwMCA4OCAxNjMgMTgyIDcwIDIyMSAyMzIgMTcwIAorMTQ1IDIgMTIwIDM4IDE1NiAxNzggOTUgMTMzIDM2IDk2IDIwIDE1NSAxOTEgMTM0IDExNiAyMiA3MCA3NiAxNTIgMjAzIDUyIDE3NSA3IAorMjA5IDEyOCAyMjYgNDkgOTQgMTk4IDE5MCAxMyAxOTIgMjEgMjM1IDcyIDIyOSAzNyAyMjEgMTM5IDIwNSAxMTIgMTQwIDE4NSAxNTEgCiszMCAyMDYgNDcgMTc5IDc1IDIxNyAxMDEgXgorNTAyIDAgMTU4IDE0OCA2NiAxMyA2MCA5NSAxMDMgMyAxNSA1IDExMyAzOCAyMyAxODIgMTI1IDY1IDk0IDEwNyA3MyAyMjQgMzcgNDcgCisxMDIgMjM3IDMgMTk4IDE1NSA3IDk1IDU2IDE5OCAxNjUgNTIgMTQ4IDQ2IDE2MyAxNTcgMTUyIDE3MyAxOSA1NSAyOSAxNjcgMjE3IDc2IAorMTE1IDIwMyAxOTEgMTEgMTY1IDYyIDE5MyA5OSAxMTYgMTIyIDE0NCAyMzYgNyAyOCAxNjEgMiAyOSAxNTcgMTcyIDIzIDEyNSAyMzggCisxOTkgMTUxIDE3NyA4OSA2MSAyNCAxMDEgNzggNTAgMjEzIDczIDQxIDEyNyAxNTMgNDUgMTY3IDI0IDEyMSAxNjggMTkzIDE1NiAzIDI1IAorODcgMTY2IDI4IDIyOCAxNzQgMTg4IDUzIDY3IDIzOSAxNDggMzYgMTE4IDEwNCAxNjIgMjA4IDI3IDIzMiA0IDE5NCA4NSAxIDYzIDE1OSAKKzk3IDE5MSAxOTQgNzUgMTk2IDEwIDE2OSAxMzIgMTk5IDEzMSA1MCAyMjMgMTE4IDk0IDExNyAxMTggMzcgMjcgMTIgOTQgNjAgMjggCisxNzEgNDcgODIgMTEwIDEzNyAxNSAyMjUgMjMgMTcyIDQzIDEyIDE0MSAxNDIgODEgMTYxIDEyIDc0IDIxMCAxNjIgMjI4IDExNyA5OCAKKzE4NyAxMjQgNjkgMTY0IDc2IDEwNSAxNTggMTAxIDIxIDIwMCA3MCAxMzAgMTExIDE0MyAyMzAgMzIgMjIxIDIwMyAyMTEgMTAxIDMxIDUgCisxMjMgODMgNzYgMTM1IDkwIDU3IDE5NCA5NSA0NiAxNTMgMTEyIDYyIDE4MyA1NCA2MyAxNjkgMTc5IDQgMTg0IDQwIDE4OCAxMTAgMTk0IAorMTA1IDkxIDIwNiAxMDIgMjcgMTc1IDE1NCA4OCAxNDIgNzEgNzkgMTk5IDg0IDUgMTcwIDEyOCAxMjkgMTI1IDU1IDQ5IDE3IDEyMCAxOSAKKzQ1IDE4NyAxMTQgMjQgMTExIDEyMyAxNDAgMTY2IDM4IDMzIDIyNyAxNzggMTggNTkgOTkgMTczIDkgMTAgMTc5IDIxNCAxMiA4NCAxNSAKKzIxNSAyMTggODIgOTAgNDcgMTQ5IDQyIDkzIDE4OCAxMjAgMjM5IDE5NSA4MSAxNzEgOTQgMTI3IDIwMCAxMjcgMjIwIDIxNyA4NiAxNjAgCisxNiAxNDQgMjE2IDE1NyAxNjIgMjE4IDcyIDQ1IDIzNCAxNTkgNzcgMTAxIDg4IDEzMiAyNiAyNiA2IDExOSAxMyA3MCAxNDAgMTU2IAorMjMzIDIyMCAzNCAyMTMgMjYgMjM2IDc0IDIwMCA4MCAxNzUgMTY0IDEzMyAxOTUgMjQgNDQgMTkxIDE4NCAzMCAxNDMgNTcgMjA0IDE0MCAKKzk5IDEwNiA3NyA1NCA0MyA0MiAzNiA2MSAxNCA1NiAyNSA5NyA4IDgxIDE4MSAxMzkgMTgwIDE1MyA5MiAyMTIgNzcgMTExIDEzMyAxODUgCisyMTkgMjMxIDIzOCAyMTkgMSA0MyAzMiAyMzEgOCAyNCA5MSAzMyAyMzcgMjIzIDEwOCA0OSA2NCAxNjUgNzIgMzUgMTUyIDEwNiA4NyAKKzEzNiA5NiAzMiAxIDUzIDc3IDQ0IDIzOCAyMjkgODMgOTYgMjIgMTk2IDEyNCA3OSA2IDE2NiA1OCAxMjMgOTMgMTIxIDIyNSA0MyAyMiAKKzE4NiAxOTUgNzEgMTI2IDQgMTc0IDIzNSAxMzUgMTIwIDIyOSAxMTMgMjggMTgxIDEyOSAxMzUgMTAwIDEwMiA3IDg1IDExIDE0NSAyMTIgCis4NyAxNTYgMTg2IDEzOCAxODQgMjIzIDYxIDQgMTEgMTc1IDEwNyA2IDg5IDgxIDExNCAyMDcgMjEgMTcgMTk3IDIzNiA1NCA3MyAyMTQgCisyMzIgMjM0IDE0OSAzMiAxMSA5OCAxNjcgMzQgMjAzIDIyMSAxNDYgMTIxIDIzNSA4OCA3NSAxMzkgMTYwIDYzIDE4OSAyOSAxNDcgMTI3IAorMjEwIDE3MiAzMyAyMDcgNTEgMTUyIDExNiAxNjkgMTg5IDQ5IDIzNyAyMzMgMTUzIDEwMiAxNyAxMzAgNjQgOTggMTc3IDc5IDE2IDIxMSAKKzExMSAxMTMgNTggMTEzIDQ4IDY4IDIzNSA3OCAzMCA4NiAxNzAgOTggMTk3IDE2OSAxMjIgMTU0IDQxIDk3IDE4IDEyNiAyMzQgOTIgCisxNDUgMTQ1IDE1NSAyMzcgNTAgMjA5IF4KKzQ4MSAxIDIwOCAyMDAgNTYgNDggMjEgMTg2IDIxIDQwIDExOSAxNzggMjM2IDIwNSAxOTYgMjI2IDczIDIyIDEyIDE5NSA2NCAyMyAxMDEgCisxNDQgNTQgMjA2IDI0MSAxMDMgMTMyIDcgMTUxIDEzIDEzOCAxNDAgMTUxIDEzMCA0MCAyIDM0IDEzMiA4MCAyMjMgMTg2IDk0IDExMiAKKzUwIDEzNCAyMzcgMTA0IDIwMCAxODEgMTc1IDE1OSA2MSAxOSAyOSAxNDAgNTUgMzIgMTQ0IDEyNyAzNiAxNzIgNTkgMTA0IDE0OCAxMjYgCisyMTAgMjQwIDM1IDIwMCAyMjUgNSA5MCAyMzAgMjAgMTcwIDE0NCAxMCAxMzQgMzkgMTc2IDEzMSAxMDggMTQ3IDU4IDM2IDIxNiAxMzEgCiszNSA3NSAxMjcgMTA5IDIgMjMyIDYwIDE0OSAyNSAxODUgMTk1IDEzNyA5NSAzMiA3MSA1NSAxMDUgMjE2IDU4IDIzNCAxNDQgMjAwIAorMTA4IDEwMyAyMjggMTA1IDQ3IDEzMCAxNjUgMTAwIDE3MiA3IDc4IDE4MyAyMDcgMTg0IDE3OSAxOCAzNiA0NyAyMDMgMjM3IDMxIDEyOCAKKzggMjE5IDE4NyAxNjIgNDQgNzQgMzggMTMxIDEyIDQ5IDE2MiAxNjEgMjE4IDE0MiAxNCAyMjcgODkgMTQxIDcxIDE4MCAyMDMgMTEyIAorMTc1IDIzMiAxMzMgMjIxIDE5OCAxNDEgMTk2IDM2IDk5IDIyOSAxNzMgMTkyIDE1NCA2OSAyMyA4MCA5OCA4OCAxOTggMjQgNTIgMTc0IAorMjE2IDIyNyAxNjIgMjEzIDIgMTA3IDIwNCAxMSAxNTAgMTg3IDIzNSAxMTYgNSAyMzYgMTMyIDEyNCA1MyAxMTcgMjEgMTEzIDE5MSAKKzEwOSAxOTIgMjA2IDk1IDIwMSAyOCAxMjQgMTQ5IDIxNSAxNTkgMjMwIDIxOCA5OCAyMTMgNTQgMTMzIDE2OSAxNzIgMTc2IDYgMTAgOSAKKzE4MyAzOCAxNCAxMTAgMTg3IDM3IDE4OCAxNzggMTYzIDEzMyAyMyAyOCA3MiAxMjMgOCAyNDAgMjA0IDEyOCA1MiA0OSAxMTggODkgNDUgCisyMTUgNDIgODYgODUgMjE1IDIxMSAxNCAxNTQgMTcgMjEwIDExNSAxNzkgNjIgMTA4IDIyMCAxMzAgMjA5IDE3MiAxMDMgMTc2IDc5IDgyIAorMjExIDEzOSAxMCAxNTUgODUgMTQyIDEzOSA4MyAyMjcgMTYgNjkgMTQwIDIyNCAyMDIgMjEzIDE3MSAzNSAzMSA1NSAxNzggNDYgMjMxIAorMTYxIDE0NSA3MCA4MyAyOSA4OCA2NyAyMjUgMTAxIDIxNyAxMjYgMTM3IDE2OCAxMDQgMiAxMSAxMDYgMTE1IDMzIDE2MCA0IDk1IDE1NyAKKzE5OCAxOTMgMjIyIDEgMTggMTMgMjEgMjM4IDQ3IDUgMzggMjA0IDU1IDIyMiAxMTggMTYyIDExNyAxNDYgMjExIDg3IDIyNiAxOTAgCisxNjYgMTE2IDc4IDY2IDYzIDgwIDI1IDE2IDI1IDY4IDUxIDMzIDIxMiAzMCA2MCA3NiAxOTUgMTIgMjM5IDEzNiAyMjUgMjggMTQ1IAorMTk1IDIxMCAxNjcgMjA1IDI3IDU2IDQgMjIwIDEzIDY1IDY4IDIyMCAyMDMgMzkgMTAzIDU5IDE3NyAyMjAgNTcgMTM3IDI0MSAxNzYgCisyMDQgMTgwIDc4IDE0IDM3IDExNSAxMDYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE3NyA3NCAxODQgMzMgMTE2IDE3NCAxNjQgMjAxIAorMTk3IDUyIDIxOCA0NiAxNTggODkgMjE0IDE0MyAxMTEgMTU5IDExMyA3NCAyMzYgNTkgNTIgMTIyIDE5MCAyMCAyMTQgMjE2IDE4MyA5MCAKKzQwIDQ2IDEwNiA2MyA3IDIyNCA4NSA2OSA2NyAxNTIgMjkgMTUgMTk5IDEzNiAyNyAxMDAgNzYgMTUxIDE4MiA2NiAyMDkgMjI0IDE1OCAKKzE0MSAyNDAgMTA4IDMwIDE1NiAxNzQgOTEgMTI5IDI0IDk2IDQgMTQ3IDE4MyAxMzQgMTEyIDYgNjIgNjQgMTQ4IDE5OSA0MCAxNzEgCisyMzMgMjAxIDEyNCAyMjIgNDUgOTAgMTg2IDE5MCAyMzkgMTg4IDkgMjM1IDY0IDIyMSAyOSAyMTMgMTI3IDE3OCBeCis1MDggMSA5NCAxMjIgMTczIDE0NSA2IDIwNiA0MSAxNzMgNTcgMTk5IDE0NiAxNTAgMTM2IDY2IDkgNDggODMgOTEgMjM5IDI0MyA1IAorMTA5IDMwIDcgMTc0IDExMyA1NyA5MCA5NSA2OSAyMjQgMjkgMzkgMTAyIDIyOSAzIDE5NCAxNTEgMjM5IDg3IDU2IDE5MCAxNjUgNDQgCisxNDQgMzggMTU1IDE1NyAxNDAgMTYxIDExIDUxIDEzIDE2MyAyMTcgNzIgMTA3IDIwMyAxNzkgMjQzIDE2MSA1OCAxOTMgOTUgMTE2IAorMTIyIDEzMiAyMzYgNyAyNCAxNTMgMjQyIDE3IDE0OSAxNjggMTUgMTI1IDIzOCAxODcgMTQ3IDE2NSA4NSA1MyAxNiA5MyA2NiA1MCAKKzIwMSA2MSAyOSAxMjcgMTUzIDQ1IDE1OSA4IDEyMSAxNjQgMTg1IDE0NCAyMzUgMTMgNzUgMTY2IDEyIDIxNiAxNjYgMTg4IDUzIDYzIAorMjM1IDE0OCAyNCAxMDYgMTAwIDE1OCAxOTYgMTkgMjIwIDI0MCAxOTAgNzcgMjM3IDYzIDE0NyA5NyAxODcgMTk0IDYzIDE4OCA2IDE2NSAKKzEzMiAxOTUgMTE5IDQ2IDIxNSAxMTAgODYgMTA5IDExOCAzNyAxMSA0IDk0IDYwIDIwIDE2NyA0NyA3NCAxMTAgMTMzIDcgMjIxIDExIAorMTYwIDQzIDEyOSAxMzAgNzcgMTQ5IDEyIDY2IDIwNiAxNTAgMjI0IDExNyA5MCAxODMgMTIwIDYxIDE2NCA3NiA5MyAxNTQgMTAxIDE3IAorMTk2IDY2IDExOCA5OSAxNDMgMjI2IDMyIDIxMyAxOTUgMjA3IDk3IDMxIDEgMTIzIDc5IDY0IDEzNSA3OCA0OSAxODYgOTEgNDIgMTQxIAorMTA4IDYyIDE3OSA0NiA1OSAxNjEgMTY3IDE3NiAyOCAxODAgMTAyIDE4MiAxMDUgOTEgMTk4IDkwIDI3IDE3MSAxNDIgNzYgMTM0IDYzIAorNzkgMTk5IDg0IDI0MSAxNTggMTI4IDEyMSAxMTcgNDMgNDEgMTcgMTA4IDE1IDM3IDE4NyAxMDYgMTIgMTA3IDExNSAxMjggMTYyIDI2IAorMjEgMjIzIDE3MCAxOCA1NSA4NyAxNjUgMjQxIDIgMTc5IDIwMiA4IDgwIDExIDIwNyAyMDYgODIgODIgMzUgMTM3IDM0IDgxIDE3NiAKKzExNiAyMzEgMTgzIDczIDE2MyA4MiAxMjMgMTg4IDExNSAyMTYgMjEzIDg2IDE1NiAxNiAxNDAgMjA4IDE1MyAxNTQgMjEwIDY4IDMzIAorMjIyIDE1NSA2OSA4OSA4MCAxMjAgMTQgMjIgMjM4IDExOSA1IDYyIDEzMiAxNDggMjIxIDIwOCAxOCAyMDUgMjYgMjI0IDcwIDE5MiA4MCAKKzE2NyAxNTYgMTI1IDE5MSAyNCA0NCAxOTEgMTgwIDE0IDEzMSA0NSAyMDAgMTQwIDk5IDEwMiA3MyA1NCAzMSA0MiAzMiA1NyAyIDQ0IDkgCis4OSAyMzYgNjkgMTc3IDEzMSAxODAgMTQ5IDgwIDIwOCA2NSAxMDMgMTI5IDE3NyAyMTkgMjMxIDIzMCAyMTUgMSAzNSAyOCAyMjcgMjAgCis3OSAxNyAyMzcgMjE5IDk2IDM3IDUyIDE1NyA3MiAxOSAxNTIgOTggODcgMTI0IDg4IDI0IDI0MSA0OSA3NyA0MCAyMjYgMjI5IDcxIDkyIAorMTAgMTkyIDIzNiAxMTYgNzUgMjM0IDE1NCA1NCAxMTkgOTMgMTEzIDIxMyAzOSAxNCAxNzggMTg3IDU5IDExNCA0IDE2MiAyMjMgMTIzIAorMTIwIDIxNyAxMTMgMTYgMTgxIDExNyAxMzEgOTIgOTggMjQzIDczIDcgMTMzIDIwNCA3OSAxNTIgMTg2IDEzOCAxODQgMjIzIDYxIDIzMiAKKzIzOSAxNzUgMTA3IDYgNzcgODEgMTE0IDIwNyA5IDEgMTg1IDIzMiA0MiA3MyAyMTAgMjI0IDIyNiAxNDEgMjAgMTEgOTggMTU1IDIyIAorMTkxIDIyMSAxNDYgMTA5IDIyNyA4OCA3MSAxMzkgMTUyIDUxIDE4OSAyMSAxMzUgMTE5IDIwMiAxNjQgMjkgMTk1IDUxIDE0OCAxMTIgCisxNTcgMTgxIDQ5IDIzMyAyMzMgMTQ1IDk0IDEzIDEyMiA2NCA5NCAxNjkgNzEgNCAyMDMgMTExIDEwMSA1OCAxMDUgNDQgNTYgMjMxIDc0IAorMjIgODIgMTcwIDg2IDE5NyAxNjkgMTE4IDE0NiA0MSA4NSA2IDExOCAyMzQgOTIgMTQ1IDE0MSAxNDkgXgorNDg0IDEgMjE5IDMyIDI0MyAyMDggMjAwIDQ4IDQ4IDIxIDE3OCAxMyA0MCAxMTUgMTc4IDIzMiAxOTcgMTk2IDIxOCA2MSAxNCA0IDE4MyAKKzYwIDIzIDkzIDEzNiA1MCAyMDIgMjI5IDk5IDEyMCAyNDUgMTQzIDUgMTM0IDEyOCAxNTEgMTMwIDMyIDIzNiAzNCAxMjQgNjggMjE1IAorMTgyIDgyIDExMiA0NiAxMjYgMjI5IDkyIDE5MiAxNjkgMTYzIDE1OSA0OSAxOSAxNyAxMzYgNDMgMjggMTQwIDExOSAyOCAxNjAgNDcgCisxMDQgMTQwIDEyNiAyMDIgMjM2IDI3IDE5NiAyMjUgMjM1IDkwIDIzMCAxNiAxNTggMTMyIDI0MCAxMzAgMzkgMTY0IDEyMyAxMDQgMTQ3IAorNTQgMzIgMjE2IDExOSAzNSA3NSAxMjMgOTcgMjMyIDIyNCA1MiAxMzcgMjEgMTg1IDE4NyAxMjkgOTUgMjQgNzEgNDcgOTcgMjEyIDUwIAorMjIyIDE0NCAxODggMTAwIDkxIDIyOCAxMDEgMzUgMTIyIDE1MyA5MiAxNzIgMjQxIDc0IDE3OSAyMDMgMTgwIDE2NyAyIDM2IDM5IDE5MSAKKzIyNSAyMyAxMjAgMjM4IDIxNSAxNzUgMTU0IDM2IDY2IDM0IDEzMSAyNDIgNDUgMTYyIDE2MSAyMTAgMTQyIDE0IDIyMyA4MSAxNDEgNjMgCisxNjggMTk5IDEwNCAxNjcgMjI4IDEyMSAyMDkgMTk4IDEzMyAxODQgMjQgOTEgMjIxIDE3MyAxOTIgMTQyIDYxIDcgNzYgOTQgODAgMTkwIAorOCA0MCAxNjIgMjA4IDIyNyAxNTAgMjEzIDI0MCAxMDMgMTk2IDI0NSAxNTAgMTc5IDIyMyAxMDggMjQzIDIyOCAxMjggMTI0IDQxIDExMyAKKzE3IDEwOSAxODcgMTA5IDE4MCAxOTQgOTEgMjAxIDEyIDExNiAxNDkgMjE1IDE1NSAyMjYgMjA2IDg2IDIwMSA0NiAxMzMgMTU3IDE2OCAKKzE3MiAyIDIgOSAxODMgMjYgNiA5OCAxODMgMzMgMTgwIDE3NCAxNjMgMTI1IDE5IDI0IDY0IDExOSA4IDIzMiAyMDQgMTI0IDQ4IDQxIAorMTA2IDg5IDMzIDIwNyAzMCA4MiA4NSAyMDMgMjA3IDEwIDE1NCA5IDIxMCAxMTUgMTcxIDU4IDEwOCAyMTYgMTI2IDIwOSAxNjQgMTAzIAorMTc2IDcxIDc0IDE5OSAxMzEgMTAgMTQ3IDgxIDEzNCAxMzUgNzkgMjE5IDEyIDY5IDEzMiAyMjAgMjAyIDIwOSAxNzEgMzEgMTkgNTEgCisxNjYgMzggMjI3IDE1NyAxNDEgNzAgODMgMjkgODQgNjcgMjE3IDk3IDIwNSAxMjIgMTMzIDE2NCA5NiAyIDI0MSA5NCAxMDcgMzMgMTYwIAorODcgMTQ1IDE4NiAxODUgMjE0IDIzMSAxNCAyNDMgOSAyMzAgNDMgMSAzOCAyMDAgNTUgMjIyIDExMCAxNTggMTA1IDEzOCAyMTEgNzkgCisyMjYgMTg2IDE1OCAxMTIgNjYgNTQgNTkgNzIgMjUgOCAxMyA2MCA0MyAyMSAyMTIgMzAgNDggNjggMTk1IDggMjM5IDEzMiAyMTMgMjggCisxMzMgMTkxIDE5OCAxNjcgMjAxIDE5IDQ0IDIzOCAyMDggMSA2NSA1NiAyMjAgMTk1IDM1IDk1IDUxIDE3MyAyMTIgNTcgMTM3IDIzMyAKKzE2OCAxOTIgMTc2IDc4IDIgMjkgMTExIDEwMiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTY1IDc0IDE3MiAyOSAxMDQgMTc0IDE1NiAxOTcgCisxODkgNDQgMjE4IDM0IDE1OCA4NSAyMTAgMTM1IDk5IDE0NyAxMDEgNjIgMjI0IDU5IDUyIDExMCAxNzggMjAgMjE0IDIwNCAxNzEgNzggCiszNiA0NiAxMDYgNTUgMyAyMTIgNzcgNjUgNjMgMTQ4IDI1IDE1IDE4NyAxMzYgMjMgMTAwIDY0IDEzOSAxODIgNjIgMTk3IDIxNiAxNDYgCisxMzcgMjQwIDk2IDIyIDE1NiAxNzAgODcgMTI1IDEyIDk2IDIzNCAxMzkgMTc1IDEzNCAxMDggMjM2IDU0IDUyIDE0NCAxOTUgMjggMTY3IAorMjIxIDE5MyAxMjAgMjE4IDQxIDg2IDE3NCAxOTAgMjI3IDE4NCAyNDMgMjM1IDU2IDIxMyAyMSAyMDUgMTE1IDIwNSA3MSBeCis1MDYgMCAxMTAgMTY1IDE0MSAyMzggMjA2IDM3IDE2OSA0NSAxODcgMTM0IDE0MiAxMjQgNjYgNSAzNiA3MSA3OSAyMzUgMjMxIDUgMTA1IAorMjIgMjM5IDE2NiAxMDEgNDkgODYgODMgNjUgMjI0IDIxIDMxIDEwMiAyMjEgMyAxOTAgMTQ3IDIzMSA3OSA1NiAxODIgMTY1IDM2IDE0MCAKKzMwIDE0NyAxNTcgMTI4IDE0OSAzIDQ3IDI0NSAxNTkgMjE3IDY4IDk5IDIwMyAxNjcgMjM1IDE1NyA1NCAxOTMgOTEgMTE2IDEyMiAxMjAgCisyMzYgNyAyMCAxNDUgMjQyIDUgMTQxIDE2NCA3IDEyNSAyMzggMTc1IDE0MyAxNTMgODEgNDUgOCA4NSA1NCA1MCAxODkgNDkgMTcgMTI3IAorMTUzIDQ1IDE1MSAyNDAgMTIxIDE2MCAxNzcgMTMyIDIyNyAxIDYzIDE2NiAyNDQgMjA0IDE1OCAxODggNTMgNTkgMjMxIDE0OCAxMiA5NCAKKzk2IDE1NCAxODQgMTEgMjA4IDIzNiAxODYgNjkgMjMzIDYzIDEzNSA5NyAxODMgMTk0IDUxIDE4MCAyIDE2MSAxMzIgMTkxIDEwNyA0MiAKKzIwNyAxMDIgNzggMTAxIDExOCAzNyAyNDMgMjQ0IDk0IDYwIDEyIDE2MyA0NyA2NiAxMTAgMTI5IDI0NyAyMTcgMjQ3IDE0OCA0MyAyMzYgCisxMTcgMTE4IDczIDEzNyAxMiA1OCAyMDIgMTM4IDIyMCAxMTcgODIgMTc5IDExNiA1MyAxNjQgNzYgODEgMTUwIDEwMSAxMyAxOTIgNjIgCisxMDYgODcgMTQzIDIyMiAzMiAyMDUgMTg3IDIwMyA5MyAzMSAyNDUgMTIzIDc1IDUyIDEzNSA2NiA0MSAxNzggODcgMzggMTI5IDEwNCAKKzYyIDE3NSAzOCA1NSAxNTMgMTU1IDI0NCAxNjggMTYgMTcyIDk0IDE3MCAxMDUgOTEgMTkwIDc4IDI3IDE2NyAxMzAgNjQgMTI2IDU1IAorNzkgMTk5IDg0IDIzNyAxNDYgMTI4IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgMTg3IDk4IDEwMyAxMDcgMTE2IDE1OCAxNCA5IDIxOSAKKzE2MiAxOCA1MSA3NSAxNTcgMjMzIDI0MiAxNzkgMTkwIDQgNzYgNyAxOTkgMTk0IDgyIDc0IDIzIDEyNSAyNiA2OSAxNjQgMTEyIDIyMyAKKzE3MSA2NSAxNTUgNzAgMTE5IDE3NiAxMDMgMjEyIDIwOSA4NiAxNTIgMTYgMTM2IDIwMCAxNDkgMTQ2IDIwMiA2NCAyMSAyMTAgMTUxIAorNjEgNzcgNzIgMTA4IDIgMTggMjMwIDExOSAyNDUgNTQgMTI0IDE0MCAyMDkgMTk2IDIgMTk3IDI2IDIxMiA2NiAxODQgODAgMTU5IDE0OCAKKzExNyAxODcgMjQgNDQgMTkxIDE3NiAyNDYgMTE5IDMzIDE5NiAxNDAgOTkgOTggNjkgNTQgMTkgNDIgMjggNTMgMjM4IDMyIDI0MSA4MSAKKzIyNCA1NyAxNzMgMTIzIDE4MCAxNDUgNjggMjA0IDUzIDk1IDEyNSAxNjkgMjE5IDIzMSAyMjIgMjExIDEgMjcgMjQgMjIzIDI0MCAxNiAKKzY3IDEgMjM3IDIxNSA4NCAyNSA0MCAxNDkgNzIgMyAxNTIgOTAgODcgMTEyIDgwIDE2IDI0MSA0NSA3NyAzNiAyMTQgMjI5IDU5IDg4IAorMjQ2IDE4OCAyMzIgMTA4IDcxIDIyMiAxNDIgNTAgMTE1IDkzIDEwNSAyMDEgMzUgNiAxNzAgMTc5IDQ3IDEwMiA0IDE1MCAyMTEgMTExIAorMTIwIDIwNSAxMTMgNCAxODEgMTA1IDEyNyA4NCA5NCAyMzkgNjEgMyAxMjEgMTk2IDcxIDE0OCAxODYgMTM4IDE4NCAyMjMgNjEgMjIwIAorMjI3IDE3NSAxMDcgNiA2NSA4MSAxMTQgMjA3IDI0NSAyMzMgMTczIDIyOCAzMCA3MyAyMDYgMjE2IDIxOCAxMzMgOCAxMSA5OCAxNDMgCisxMCAxNzkgMjIxIDE0NiA5NyAyMTkgODggNjcgMTM5IDE0NCAzOSAxODkgMTMgMTIzIDExMSAxOTQgMTU2IDI1IDE4MyA1MSAxNDQgMTA4IAorMTQ1IDE3MyA0OSAyMjkgMjMzIDEzNyA4NiA5IDExNCA2NCA5MCAxNjEgNjMgMjQwIDE5NSAxMTEgODkgNTggOTcgNDAgNDQgMjI3IDcwIAorMTQgNzggMTcwIDc0IDE5NyAxNjkgMTE0IDEzOCA0MSA3MyAyNDIgMTEwIDIzNCAxNzcgXgorNDkxIDAgMTQ1IDEzNSAxNTUgMjA3IDIwIDI0MyAyMDggMjAwIDQwIDQ4IDIxIDE3MCA1IDQwIDExMSAxNzggMjI4IDE4OSAxOTYgMjEwIAorNDkgNiAyNDYgMTcxIDU2IDIzIDg1IDEyOCA0NiAxOTggMjE3IDk1IDEwOCAyNDEgMTM1IDI0NyAxMzAgMTE2IDE1MSAxMzAgMjQgMjI4IAorMzQgMTE2IDU2IDIwNyAxNzggNzAgMTEyIDQyIDExOCAyMjEgODAgMTg0IDE1NyAxNTEgMTU5IDM3IDE5IDUgMTMyIDMxIDI0IDEzNiAKKzExMSAyMCAxNDggMzUgMTA0IDEzMiAxMjYgMTk0IDIzMiAxOSAxOTIgMjI1IDIyMyA5MCAyMzAgMTIgMTQ2IDEyMCAyMjggMTI2IDM5IAorMTUyIDExNSAxMDAgMTQ3IDUwIDI4IDIxNiAxMDcgMzUgNzUgMTE5IDg1IDIyMCAyMTYgNDQgMTI1IDE3IDE4NSAxNzkgMTIxIDk1IDE2IAorNzEgMzkgODkgMjA4IDQyIDIxMCAxNDQgMTc2IDkyIDc5IDIyOCA5NyAyMyAxMTQgMTQxIDg0IDE3MiAyMzMgNzAgMTc1IDE5OSAxNzYgCisxNTUgMjM2IDM2IDMxIDE3OSAyMTMgMTUgMTEyIDIyNiAyMTEgMTYzIDE0NiAyOCA1OCAzMCAxMzEgMjMwIDQxIDE2MiAxNjEgMjAyIAorMTQyIDE0IDIxOSA3MyAxNDEgNTUgMTU2IDE5NSA5NiAxNTkgMjI0IDEwOSAxOTcgMTk4IDEyNSAxNzIgMTIgODMgMjEzIDE3MyAxOTIgCisxMzAgNTMgMjQxIDcyIDkwIDcyIDE4MiAyNDIgMjggMTUwIDIwMCAyMjcgMTM4IDIxMyAyMzYgOTkgMTg4IDIzNyAxNTAgMTcxIDIxMSAKKzEwMCAyMzkgMjIwIDEyNCAxMjQgMjkgMTA5IDEzIDEwNSAxODMgMTA5IDE2OCAxODIgODcgMjAxIDI0NiAxMDggMTQ5IDIxNSAxNTEgCisyMjIgMTk0IDc0IDE4OSAzOCAxMzMgMTQ1IDE2NCAxNjggMjQ4IDI0NCA5IDE4MyAxNCAyNDggODYgMTc5IDI5IDE3MiAxNzAgMTYzIAorMTE3IDE1IDIwIDU2IDExNSA4IDIyNCAyMDQgMTIwIDQ0IDMzIDk0IDg5IDIxIDE5OSAxOCA3OCA4NSAxOTEgMjAzIDYgMTU0IDEgMjEwIAorMTE1IDE2MyA1NCAxMDggMjEyIDEyMiAyMDkgMTU2IDEwMyAxNzYgNjMgNjYgMTg3IDEyMyAxMCAxMzkgNzcgMTI2IDEzMSA3NSAyMTEgOCAKKzY5IDEyNCAyMTYgMjAyIDIwNSAxNzEgMjcgNyA0NyAxNTQgMzAgMjIzIDE1MyAxMzcgNzAgODMgMjkgODAgNjcgMjA5IDkzIDE5MyAxMTggCisxMjkgMTYwIDg4IDIgMjI5IDgyIDk5IDMzIDE2MCAyNDYgNzkgMTMzIDE3NCAxNzcgMjA2IDIxOSAxMCAyMzEgMjQ3IDIyMiAzOSAyNDcgCiszOCAxOTYgNTUgMjIyIDEwMiAxNTQgOTMgMTMwIDIxMSA3MSAyMjYgMTgyIDE1MCAxMDggNTQgNDIgNTUgNjQgMjUgMSA1MiAzNSA5IAorMjEyIDMwIDM2IDYwIDE5NSA0IDIzOSAxMjggMjAxIDI4IDEyMSAxODcgMTg2IDE2NyAxOTcgMTEgMzIgMjMwIDE5NiAyMzkgNjUgNDQgCisyMjAgMTg3IDMxIDg3IDQzIDE2OSAyMDQgNTcgMTM3IDIyNSAxNjAgMTgwIDE3MiA3OCAyNDAgMjEgMTA3IDk4IDIzMiAxNzcgMjIgMTI5IAorNjggMTY4IDE1MyA3NCAxNjAgMjUgOTIgMTc0IDE0OCAxOTMgMTgxIDM2IDIxOCAyMiAxNTggODEgMjA2IDEyNyA4NyAxMzUgODkgNTAgCisyMTIgNTkgNTIgOTggMTY2IDIwIDIxNCAxOTIgMTU5IDY2IDMyIDQ2IDEwNiA0NyAyNDkgMjAwIDY5IDYxIDU5IDE0NCAyMSAxNSAxNzUgCisxMzYgMTkgMTAwIDUyIDEyNyAxODIgNTggMTg1IDIwOCAxMzQgMTMzIDI0MCA4NCAxNCAxNTYgMTY2IDgzIDEyMSA5NiAyMjIgMTMxIAorMTY3IDEzNCAxMDQgMjI0IDQ2IDQwIDE0MCAxOTEgMTYgMTYzIDIwOSAxODUgMTE2IDIxNCAzNyA4MiAxNjIgMTkwIDIxNSAxODAgMjM1IAorMjM1IDQ4IDIwNSAxMyAxOTcgMTAzIDIwNSA3NiAxMDQgMTYxIDEzOSAyMzIgMTQ2IF4KKzUxNiAwIDMzIDE2NSAzMyAxNzUgMTIyIDEzNCAxMTIgNjYgMSAyNCA1OSA2NyAyMzEgMjE5IDUgMTAxIDE0IDIyNyAxNTggODkgNDEgODIgCis3MSA2MSAyMjQgMTMgMjMgMTAyIDIxMyAzIDE4NiAxNDMgMjIzIDcxIDU2IDE3NCAxNjUgMjggMTM2IDIyIDEzOSAxNTcgMTE2IDEzNyAKKzI0NyA0MyAyMzMgMTU1IDIxNyA2NCA5MSAyMDMgMTU1IDIyNyAxNTMgNTAgMTkzIDg3IDExNiAxMjIgMTA4IDIzNiA3IDE2IDEzNyAyNDIgCisyNDUgMTMzIDE2MCAyNTEgMTI1IDIzOCAxNjMgMTM5IDE0MSA3NyAzNyA3NyA0MiA1MCAxNzcgMzcgNSAxMjcgMTUzIDQ1IDE0MyAyMjggCisxMjEgMTU2IDE2OSAxMjAgMjE5IDI0MSA1MSAxNjYgMjMyIDE5MiAxNTAgMTg4IDUzIDU1IDIyNyAxNDggODIgOTIgMTUwIDE3MiAzIAorMTk2IDIzMiAxODIgNjEgMjI5IDYzIDEyMyA5NyAxNzkgMTk0IDM5IDE3MiAyNTAgMTU3IDEzMiAxODcgOTUgMzggMTk5IDk0IDcwIDkzIAorMTE4IDM3IDIzMSAyNDAgOTQgNjAgNCAxNTkgNDcgNTggMTEwIDEyNSAyNDMgMjEzIDIzOSAxMzYgNDMgMjI4IDEwNSAxMDYgNjkgMTI1IAorMTIgNTAgMTk4IDEyNiAyMTYgMTE3IDc0IDE3NSAxMTIgNDUgMTY0IDc2IDY5IDE0NiAxMDEgOSAxODggNTggOTQgNzUgMTQzIDIxOCAzMiAKKzE5NyAxNzkgMTk5IDg5IDMxIDI0NSAxMjMgNzEgNDAgMTM1IDU0IDMzIDE3MCA4MyAzNCAxMTcgMTAwIDYyIDE3MSAzMCA1MSAxNDUgCisxNDMgMjQ0IDE2MCA0IDE2NCA4NiAxNTggMTA1IDkxIDE4MiA2NiAyNyAxNjMgMTE4IDUyIDExOCA0NyA3OSAxOTkgODQgMjMzIDEzNCAKKzEyOCAxMDUgMTAxIDE5IDI1IDE3IDg0IDcgMjEgMTg3IDkwIDI0MCA5OSA5OSAxMDQgMTU0IDIgMjQ5IDIxNSAxNTQgMTggNDcgNjMgCisxNDkgMjI1IDIzOCAxNzkgMTc4IDcyIDMgMTkxIDE4MiA4MiA2NiAxMSAxMTMgMTggNTcgMTUyIDEwOCAyMTUgMTU5IDU3IDE0NyA1OCAKKzExNSAxNjQgOTEgMjA4IDIwNSA4NiAxNDggMTYgMTMyIDE5MiAxNDUgMTM4IDE5NCA2MCA5IDE5OCAxNDcgNTMgNjUgNjQgOTYgMjQyIAorMTQgMjIyIDExOSAyNDEgNDYgMTE2IDEzMiAxOTcgMTg0IDIzOCAxODkgMjYgMjAwIDYyIDE3NiA4MCAxNTEgMTQwIDEwOSAxODMgMjQgCis0NCAxOTEgMTcyIDIzNCAxMDcgMjEgMTkyIDE0MCA5OSA5NCA2NSA1NCA3IDQyIDI0IDQ5IDIzMCAyMCAyMjkgNzMgMjEyIDQ1IDE2OSAKKzExNSAxODAgMTQxIDU2IDIwMCA0MSA4NyAxMjEgMTYxIDIxOSAyMzEgMjE0IDIwNyAxIDE5IDIwIDIxOSAyMzYgMTIgNTUgMjM3IDIzNyAKKzIxMSA3MiAxMyAyOCAxNDEgNzIgMjM5IDE1MiA4MiA4NyAxMDAgNzIgOCAyNDEgNDEgNzcgMzIgMjAyIDIyOSA0NyA4NCAyMzggMTg0IAorMjI4IDEwMCA2NyAyMTAgMTMwIDQ2IDExMSA5MyA5NyAxODkgMzEgMjUwIDE2MiAxNzEgMzUgOTAgNCAxMzggMTk5IDk5IDEyMCAxOTMgCisxMTMgMjQ0IDE4MSA5MyAxMjMgNzYgOTAgMjM1IDQ5IDI1MSAxMDkgMTg4IDYzIDE0NCAxODYgMTM4IDE4NCAyMjMgNjEgMjA4IDIxNSAKKzE3NSAxMDcgNiA1MyA4MSAxMTQgMjA3IDIzNyAyMjEgMTYxIDIyNCAxOCA3MyAyMDIgMjA4IDIxMCAxMjUgMjQ4IDExIDk4IDEzMSAyNTAgCisxNjcgMjIxIDE0NiA4NSAyMTEgODggNjMgMTM5IDEzNiAyNyAxODkgNSAxMTEgMTAzIDE4NiAxNDggMjEgMTcxIDUxIDE0MCAxMDQgMTMzIAorMTY1IDQ5IDIyNSAyMzMgMTI5IDc4IDUgMTA2IDY0IDg2IDE1MyA1NSAyMzIgMTg3IDExMSA3NyA1OCA4OSAzNiAzMiAyMjMgNjYgNiA3NCAKKzE3MCA2MiAxOTcgMTY5IDExMCAxMzAgNDEgNjEgMjM0IDEwMiAyMzQgOTIgMTQ1IDEzMyAxNTUgMjAxIDE0IDI0MyAyMDggMjAwIDM2IAorNDggMjEgMTY2IDEgNDAgMTA5IDE3OCAxNDcgXgorNTIyIDAgMTc5IDE5NiAyMDAgMzQgMjUxIDI0MSAxNTYgNTEgMjMgNzUgMTE4IDQxIDE5MyAyMDIgOTAgOTMgMjM2IDEyNSAyNDIgMTI1IAorMTAxIDE1MSAxMzAgMTQgMjE4IDM0IDEwNiA0MSAxOTcgMTczIDU1IDExMiAzNyAxMDggMjExIDY1IDE3NCAxNDIgMTM2IDE1OSAyMiAxOSAKKzI0NSAxMjcgMTYgMTkgMTMxIDEwMSAxMCAxMzMgMjAgMTA0IDEyMiAxMjYgMTg0IDIyNyA5IDE4NyAyMjUgMjA4IDkwIDIzMCA3IDEzMSAKKzEwNSAyMTMgMTIxIDM5IDEzNyAxMDUgOTUgMTQ3IDQ1IDIzIDIxNiA5MiAzNSA3NSAxMTQgNzAgMjA1IDIwNiAzNCAxMTAgMTIgMTg1IAorMTY5IDExMSA5NSA2IDcxIDI5IDc5IDIwMyAzMiAxOTUgMTQ0IDE2MSA4MiA2NCAyMjggOTIgOCAxMDQgMTI2IDc0IDE3MiAyMjMgNjUgCisxNzAgMTk0IDE3MSAxNDAgMjIxIDM2IDIxIDE2NCAxOTggNSAxMDIgMjExIDIwNiAxNDggMTM2IDE4IDQ4IDI1IDEzMSAyMTUgMzYgMTYyIAorMTYxIDE5MiAxNDIgMTQgMjE0IDYzIDE0MSA0NSAxNDEgMTkwIDg2IDE0OSAyMTkgOTQgMTgyIDE5OCAxMTUgMTU3IDI1MiA3MyAyMDMgCisxNzMgMTkyIDExNSA0MyAyMjYgNjcgODUgNjIgMTcyIDIyNyAxMyAxMzUgMTkwIDIyNyAxMjMgMjEzIDIzMSA5NCAxNzggMjI3IDE1MCAKKzE2MSAxOTYgOTAgMjM0IDIxMCAxMTkgMTI0IDE0IDEwNCA4IDEwMCAxNzggMTA5IDE1MyAxNjcgODIgMjAxIDIzMSA5OCAxNDkgMjE1IAorMTQ2IDIxNyAxNzkgNTkgMTc0IDI4IDEzMyAxMzAgMTU5IDE2MyAyNDggMjM5IDkgMTgzIDI1NCAyNDMgNzEgMTc0IDI0IDE2MiAxNjUgCisxNjMgMTA3IDEwIDE1IDQ2IDExMCA4IDIxNCAyMDQgMTE1IDM5IDIzIDc5IDg5IDYgMTg5IDMgNzMgODUgMTc2IDE5OCAxIDE1NCAyNDYgCisyMTAgMTE1IDE1MyA0OSAxMDggMjA3IDExNyAyMDkgMTQ2IDEwMyAxNzYgNTMgNTYgMTcyIDExMyAxMCAxMjkgNzIgMTE2IDEyNiA3MCAKKzIwMSAzIDY5IDExNCAyMTEgMjAyIDIwMCAxNzEgMjIgMjQ3IDQyIDEzOSAyMCAyMTggMTQ4IDEzMiA3MCA4MyAyOSA3NSA2NyAxOTkgODggCisxNzggMTEzIDEyNCAxNTUgNzggMiAyMTQgNjcgODkgMzMgMTYwIDI0NiA2OSAxMTggMTU5IDE2NyAxOTYgMjA0IDUgMjE2IDIzNyAyMTIgCiszNCAyNDcgMzggMTkxIDU1IDIyMiA5MiAxNDkgNzggMTIwIDIxMSA2MSAyMjYgMTc3IDE0MCAxMDMgMzkgMjcgNTAgNTQgMjUgMjQ1IAorMjQxIDQyIDI1IDI0OSAyMTIgMzAgMjEgNTAgMTk1IDI1NCAyMzkgMTIzIDE4NiAyOCAxMDYgMTgyIDE3MSAxNjcgMTkyIDEgMTcgMjIwIAorMTgxIDIyOSA2NSAyOSAyMjAgMTc3IDI2IDc3IDMzIDE2NCAxOTQgNTcgMTM3IDIxNSAxNTAgMTY1IDE2NyA3OCAyMzAgMTEgMTAyIDkzIAorMjMyIDE3NyAyMiAxMjkgNjggMTY4IDEzOCA3NCAxNDUgMjAgNzcgMTc0IDEzOCAxODggMTcxIDI2IDIxOCA3IDE1OCA3NiAyMDEgMTE3IAorNzIgMTIwIDc0IDM1IDE5NyA1OSA1MiA4MyAxNTEgMjAgMjE0IDE3NyAxNDQgNTEgMjcgNDYgMTA2IDM3IDI0OSAxODUgNTkgNTYgNTQgCisxMzkgMTYgMTUgMTYwIDEzNiAxNCAxMDAgMzcgMTEyIDE4MiA1MyAxNzAgMTk4IDExOSAxMjggMjQwIDY5IDQgMTU2IDE2MSA3OCAxMTYgCisyNDAgOTYgMjA3IDEyMSAxNTcgMTM0IDk5IDIwOSAzNiAyNSAxMzUgMTg2IDEgMTU4IDE5NCAxNzUgMTExIDIwOSAzMiA3NyAxNDcgMTkwIAorMjAwIDE3NSAyMjUgMjM1IDM4IDE5NSAzIDE4NyA4OCAyMDUgNjEgODkgMTUxIDEzNCAyMTcgMjA2IDMwIDE2MiAyNCAxNjYgMTEzIDEyOCAKKzEwMyA2NiAyNTMgMTUgNTAgNTggMjI4IDIxMCA1IDk4IDggMjE4IDE1MiA4MCAzNSA3OSA2MiA1OCAyMjQgNyAxNyAxMDIgMjA3IDMgCisxODMgMTQwIDIxNyA2NSA1NiAxNjggMTY1IDIyIDEzMyAxNiAxMzMgMTU3IDEwNyAxMjggMjQ0IDEyIF4KKzUxNyAxIDIxOCAxNTAgMjE3IDU5IDgxIDIwMyAxNDAgMjE3IDE0OCA0NSAxOTMgODIgMTE2IDEyMiA5MyAyMzYgNyAxMSAxMjcgMjQyIAorMjM1IDEyMyAxNTUgMjQ2IDEyNSAyMzggMTQ4IDEzNCAxMjYgNzIgMjcgMjQ3IDY3IDI3IDUwIDE2MiAyMiAyNDcgMTI3IDE1MyA0NSAKKzEzMyAyMTMgMTIxIDE1MSAxNTkgMTA1IDIwOSAyMzEgMzYgMTY2IDIxNyAxNzcgMTQwIDE4OCA1MyA1MCAyMjIgMTQ4IDI0MiA2NyA4NyAKKzE0NSAxNTcgMjUwIDE4MSAyMjcgMTc3IDUxIDIyNCA2MyAxMDggOTcgMTc0IDE5NCAyNCAxNjIgMjUwIDE1MiAxMzIgMTgyIDgwIDMzIAorMTg5IDg0IDYwIDgzIDExOCAzNyAyMTYgMjM1IDk0IDYwIDI1MSAxNTQgNDcgNDggMTEwIDEyMCAyMzggMjA4IDIyOSAxMjEgNDMgMjE4IAorOTAgOTEgNjQgMTEwIDEyIDQwIDE5MyAxMTEgMjExIDExNyA2NCAxNzAgMTA3IDM1IDE2NCA3NiA1NCAxNDEgMTAxIDQgMTgzIDUzIDc5IAorNjAgMTQzIDIxMyAzMiAxODcgMTY5IDE5NCA4NCAzMSAyNDUgMTIzIDY2IDI1IDEzNSAzOSAyMyAxNjAgNzggMjkgMTAyIDk1IDYyIDE2NiAKKzIwIDQ2IDEzNSAxMjggMjQ0IDE1MCAyNDYgMTU0IDc2IDE0MyAxMDUgOTEgMTcyIDUxIDI3IDE1OCAxMDMgMzcgMTA4IDM3IDc5IDE5OSAKKzg0IDIyOCAxMTkgMTI4IDk1IDkxIDQgMTUgMTcgNjkgMiAxMSAxODcgODAgMjMwIDk0IDg5IDg5IDE0OSAyNDQgMjM5IDIxMCAxNDQgMTggCis0MiA0OCAxMzkgMjE1IDIzMyAxNzkgMTYzIDI1MiA2NyAyNTUgMTgxIDE2NyA4MiA1NiAyNTMgOTggOCA0MiAxMzcgMTAzIDIwNSAxNDQgCis0NyAxMzcgNDMgMTEwIDE0OSA3NiAyMDMgMjAwIDg2IDE0MyAxNiAxMjcgMTgyIDE0MCAxMjggMTg0IDU1IDI1MSAxODMgMTQyIDQzIDUwIAorNTQgODEgMjMyIDkgMjEyIDExOSAyMzYgMzYgMTA2IDEyMiAxODIgMTY5IDIyMyAxNzkgMjYgMTg1IDU3IDE2NiA4MCAxNDEgMTMwIDk5IAorMTc4IDI0IDQ0IDE5MSAxNjcgMjE5IDkyIDYgMTg3IDE0MCA5OSA4OSA2MCA1NCAyNDkgNDIgMTkgNDQgMjIwIDUgMjE0IDYzIDE5NyAzMCAKKzE2NCAxMDUgMTgwIDEzNiA0MSAxOTUgMjYgNzcgMTE2IDE1MSAyMTkgMjMxIDIwNCAyMDIgMSA5IDE1IDIxNCAyMzEgNyA0MCAyMjIgCisyMzcgMjA2IDU3IDI1NSAxMyAxMzEgNzIgMjI0IDE1MiA3MiA4NyA4NSA2MiAyNTUgMjQxIDM2IDc3IDI3IDE4NyAyMjkgMzIgNzkgMjI4IAorMTc5IDIyMyA5MCA2MiAxOTUgMTE1IDQxIDEwNiA5MyA4NyAxNzQgMjYgMjQ1IDE1MiAxNjEgMjAgNzUgNCAxMjMgMTg0IDg0IDEyMCAKKzE3OCAxMTMgMjM0IDE4MSA3OCAxMTggNjYgODUgMjMwIDM0IDI1MSA5NCAxNzggNTMgMTM5IDE4NiAxMzggMTg0IDIyMyA2MSAxOTMgCisyMDAgMTc1IDEwNyA2IDM4IDgxIDExNCAyMDcgMjI3IDIwNiAxNDYgMjE5IDMgNzMgMTk3IDE5OCAyMDAgMTE1IDIzOCAxMSA5OCAxMTYgCisyNDAgMTUyIDIyMSAxNDYgNzAgMjAxIDg4IDU4IDEzOSAxMjYgMTIgMTg5IDI1MiA5NiA5MyAxNzYgMTM4IDE2IDE1NiA1MSAxMzUgOTkgCisxMTggMTU1IDQ5IDIyMCAyMzMgMTE5IDY4IDk2IDY0IDgxIDE0MyA0NSAyMjIgMTc3IDExMSA2MiA1OCA3OSAzMSAxNyAyMTggNjEgMjUzIAorNjkgMTcwIDQ3IDE5NyAxNjkgMTA1IDEyMCA0MSA0NiAyMjQgOTIgMjM0IDkyIDE0NSAxMjggMTU1IDE4NiAyNTYgMjQzIDIwOCAyMDAgCisyNiA0OCAyMSAxNTYgMjQ4IDQwIDEwNCAxNzggMjIxIDE3NSAxOTYgMTk2IDI4IDI0OSAyMzkgMTUwIDQ5IDIzIDcxIDExNCAzOSAxOTEgCisxOTYgODggODcgMjM0IDEyMSAyNDAgMTIzIDk1IDE1MSAxMzAgMTAgMjE0IDM0IDEwMiAzNSAxOTMgMTcxIDQ5IDExMiAzNSAxMDQgMjA3IAorNTkgMTcwIDEzNiAxMzAgMTU5IDE2IDE5IDI0MSAxMjUgMjEzIF4KKzUyOSAxIDE1IDEyNyA5MyAyIDEyMSA4IDEwNCAxMTQgMTI2IDE3NiAyMjMgMSAxODMgMjI1IDE5NiA5MCAyMzAgMyAxMTkgOTMgMjAxIAorMTE3IDM5IDEyNSA5NyA5MSAxNDcgNDEgMTkgMjE2IDgwIDM1IDc1IDExMCA1OCAxOTMgMTk4IDI2IDk4IDggMTg1IDE2MSAxMDMgOTUgCisyNTcgNzEgMjEgNzEgMTk5IDI0IDE4MyAxNDQgMTQ5IDc0IDUyIDIyOCA4OCAyNTUgOTYgMTE0IDY2IDE3MiAyMTUgNjEgMTY2IDE5MCAKKzE2NyAxMjggMjA5IDM2IDEzIDE1MiAxODYgMjU2IDk0IDE5OSAyMDIgMTM2IDEyOCAxMCA0MCAyMSAxMzEgMjAzIDMyIDE2MiAxNjEgCisxODQgMTQyIDE0IDIxMCA1NSAxNDEgMzcgMTI5IDE4NiA3OCAxNDEgMjE1IDgyIDE3MCAxOTggMTA3IDE0NSAyNDQgNjUgMTk1IDE3MyAKKzE5MiAxMDMgMzUgMjE0IDYzIDgxIDU0IDE2NCAyMTUgMSAxMjMgMTgyIDIyNyAxMTEgMjEzIDIyNyA5MCAxNzAgMjE5IDE1MCAxNTMgCisxODQgODIgMjMwIDIwMiAxMTUgMTI0IDIgMTAwIDQgOTYgMTc0IDEwOSAxNDEgMTU1IDc4IDIwMSAyMTkgOTAgMTQ5IDIxNSAxNDIgMjEzIAorMTY3IDQ3IDE2MiAyMCAxMzMgMTE4IDE1NSAxNTkgMjQ4IDIzNSA5IDE4MyAyNDYgMjM5IDU5IDE3MCAyMCAxNTQgMTYxIDE2MyA5OSA2IAorMTEgMzggMTA2IDggMjA2IDIwNCAxMTEgMzUgMTUgNjcgODkgMjUzIDE4MSAyNTAgNjkgODUgMTY0IDE5NCAyNTYgMTU0IDI0MiAyMTAgCisxMTUgMTQ1IDQ1IDEwOCAyMDMgMTEzIDIwOSAxMzggMTAzIDE3NiA0NSA0OCAxNjAgMTA1IDEwIDEyMSA2OCAxMDggMTIyIDY2IDE5MyAKKzI1OCA2OSAxMDYgMjA3IDIwMiAxOTYgMTcxIDE4IDIzOSAzOCAxMjcgMTIgMjE0IDE0NCAxMjggNzAgODMgMjkgNzEgNjcgMTkxIDg0IAorMTY2IDEwOSAxMjAgMTUxIDcwIDIgMjAyIDU1IDgxIDMzIDE2MCAyNDYgNjEgMTA2IDE0NyAxNTkgMTg4IDE5MiAxIDIwNCAyMjkgMjA0IAorMzAgMjQ3IDM4IDE4NyA1NSAyMjIgODQgMTQ1IDY2IDExMiAyMTEgNTMgMjI2IDE3MyAxMzIgOTkgMjcgMTUgNDYgNDYgMjUgMjQxIDIzMyAKKzM0IDE3IDI0MSAyMTIgMzAgOSA0MiAxOTUgMjU0IDIzOSAxMTkgMTc0IDI4IDk0IDE3OCAxNTkgMTY3IDE4OCAyNTIgNSAyMTIgMTY5IAorMjIxIDY1IDE3IDIyMCAxNjkgMjIgNjkgMjUgMTYwIDE4NiA1NyAxMzcgMjA3IDE0MiAxNTMgMTYzIDc4IDIyMiAzIDk4IDg5IDIzMiAKKzE3NyAyMiAxMjkgNjggMTY4IDEyNiA3NCAxMzMgMTYgNjUgMTc0IDEzMCAxODQgMTYzIDE4IDIxOCAyNTQgMTU4IDcyIDE5NyAxMDkgNjAgCisxMDggNjIgMjMgMTg1IDU5IDUyIDcxIDEzOSAyMCAyMTQgMTY1IDEzMiAzOSAyMyA0NiAxMDYgMjkgMjQ5IDE3MyA1MSA1MiA1MCAxMzUgCisxMiAxNSAxNDggMTM2IDEwIDEwMCAyNSAxMDAgMTgyIDQ5IDE1OCAxOTAgMTA3IDEyNCAyNDAgNTcgMjU1IDE1NiAxNTcgNzQgMTEyIAorMjMyIDk2IDE5NSAxMTMgMTQ5IDEzNCA5NSAxOTcgMjggMTMgMTMxIDE4MiAyNDggMTU0IDE4MiAxNjcgMTA3IDIwNSAyOCA3MyAxMzUgCisxOTAgMTg4IDE3MSAyMTcgMjM1IDMwIDE4NyAyNTQgMTc5IDc2IDIwNSA0OSA3NyAxNDMgMTMwIDIwNSAyMDYgMjYgMTU4IDEyIDE1NCAKKzEwMSAxMjAgOTEgNjYgMjUzIDMgMzggNDYgMjI0IDE5OCA1IDk0IDIwNiAxNDQgNjggMjcgNzUgNTAgNTQgMjI0IDI1OCA5IDEwMiAxOTkgCiszIDE3OSAxMzYgMjA5IDU3IDU2IDE2MCAxNjUgMTQgMTI5IDggMTI1IDE1NyA5NSAxMTYgMjQwIDM2IDIxMiAxNDggMjE3IDU3IDc3IAorMjAzIDEzNCAyMTMgMTQ2IDQzIDE5MyA4MCAxMTYgMTIyIDg3IDIzNiA3IDkgMTIzIDI0MiAyMzEgMTE5IDE1MyAyNDQgMTI1IDIzOCAKKzE0MiAxMzIgMTIwIDcwIDIzIDI0NSA2MyAyMSA1MCAxNTYgMTYgMjQzIDEyNyAxNTMgNDUgMTI5IDIwNyAxMjEgMTQ5IDE1NSA5OSAyMDUgCisyMjcgMzAgMTY2IDIxMSA1NyBeCis1NDggMCAxMzQgMTg4IDUzIDQ3IDIxOSAxNDggMjM2IDU4IDg0IDE0MiAxNDggMjQ3IDE3MiAyMjQgMTc0IDQ1IDIyMSA2MyA5OSA5NyAKKzE3MSAxOTQgMTUgMTU2IDI1MCAxNDkgMTMyIDE3OSA3MSAzMCAxODMgNzggNTQgNzcgMTE4IDM3IDIwNyAyMzIgOTQgNjAgMjQ4IDE1MSAKKzQ3IDQyIDExMCAxMTcgMjM1IDIwNSAyMjMgMTEyIDQzIDIxMiA4MSA4MiA2MSAxMDEgMTIgMzQgMTkwIDEwMiAyMDggMTE3IDU4IDE2NyAKKzEwNCAyOSAxNjQgNzYgNDUgMTM4IDEwMSAxIDE4MCA1MCA3MCA1MSAxNDMgMjEwIDMyIDE4MSAxNjMgMTkxIDgxIDMxIDI0NSAxMjMgNjMgCisxNiAxMzUgMzAgMTcgMTU0IDc1IDI2IDkzIDkyIDYyIDE2MyAxNCA0MyAxMjkgMTE5IDI0NCAxNDQgMjQwIDE0OCA3MCAxMzQgMTA1IDkxIAorMTY2IDQyIDI3IDE1NSA5NCAyOCAxMDIgMzEgNzkgMTk5IDg0IDIyNSAxMTAgMTI4IDg5IDg1IDI1NSA5IDE3IDYwIDI1OSA1IDE4NyA3NCAKKzIyNCA5MSA4MyA4MCAxNDYgMjM4IDIzMyAyMDcgMTM4IDE4IDM5IDM5IDEzMyAyMDkgMjMwIDE3OSAxNTQgMjUyIDY0IDI1NSAxNzUgCisxNTggODIgNTAgMjQ3IDg5IDIgMzMgMTI4IDEwMCAxOTkgMTM1IDQxIDEzMSAzNCAxMDcgMTQwIDY3IDIwMCAxOTcgODYgMTQwIDE2IAorMTI0IDE3NiAxMzcgMTIyIDE3OCA1MiAyNDUgMTc0IDEzOSAzNyA0MSA0OCA3MiAyMjYgNiAyMDYgMTE5IDIzMyAzMCAxMDAgMTE2IDE3MyAKKzE2MCAyMTQgMTczIDI2IDE3NiA1NCAxNjAgODAgMTM1IDEyNCA5MyAxNzUgMjQgNDQgMTkxIDE2NCAyMTAgODMgMjU3IDE4NCAxNDAgOTkgCis4NiA1NyA1NCAyNDMgNDIgMTYgNDEgMjE0IDI1NiAyMDUgNTcgMTg4IDIxIDE2MSA5OSAxODAgMTMzIDMyIDE5MiAxNyA3MSAxMTMgMTQ1IAorMjE5IDIzMSAxOTggMTk5IDEgMyAxMiAyMTEgMjI4IDQgMzEgMjEzIDIzNyAyMDMgNDggMjQ5IDQgMTI1IDcyIDIxNSAxNTIgNjYgODcgCis3NiA1NiAyNTIgMjQxIDMzIDc3IDI0IDE3OCAyMjkgMjMgNzYgMjIyIDE3NiAyMjAgODQgNTkgMTg2IDEwNiAzOCAxMDMgOTMgODEgMTY1IAorMjMgMjQyIDE0NiAxNTUgMTEgNjYgNCAxMTQgMTc1IDc1IDEyMCAxNjkgMTEzIDIyOCAxODEgNjkgMTE1IDYwIDgyIDIyNyAyNSAyNTEgCis4NSAxNzIgNDcgMTM2IDE4NiAxMzggMTg0IDIyMyA2MSAxODQgMTkxIDE3NSAxMDcgNiAyOSA4MSAxMTQgMjA3IDIyMSAxOTcgMTM3IAorMjE2IDI1NCA3MyAxOTQgMTkyIDE5NCAxMDkgMjMyIDExIDk4IDEwNyAyMzQgMTQzIDIyMSAxNDYgNjEgMTk1IDg4IDU1IDEzOSAxMjAgMyAKKzE4OSAyNDkgODcgODcgMTcwIDEzMiAxMyAxNDcgNTEgMTMyIDk2IDEwOSAxNDkgNDkgMjE3IDIzMyAxMTMgNjIgMjU3IDkwIDY0IDc4IAorMTM3IDM5IDIxNiAxNzEgMTExIDUzIDU4IDczIDI4IDggMjE1IDU4IDI1MCA2NiAxNzAgMzggMTk3IDE2OSAxMDIgMTE0IDQxIDM3IDIxOCAKKzg2IDIzNCA5MiAxNDUgMTI1IDE1NSAxNzcgMjUwIDI0MyAyMDggMjAwIDIwIDQ4IDIxIDE1MCAyNDUgNDAgMTAxIDE3OCAyMTggMTY5IAorMTk2IDE5MCAxOSAyNDYgMjM2IDE0MSA0NiAyMyA2NSAxMDggMzYgMTg4IDE4NyA4NSA3OCAyMzEgMTE1IDIzNyAxMjAgODYgMTUxIDEzMCAKKzQgMjA4IDM0IDk2IDI2IDE4NyAxNjggNDAgMTEyIDMyIDk4IDIwMSA1MCAxNjQgMTI3IDEyMSAxNTkgNyAxOSAyMzUgMTIyIDEgMTQgCisxMjYgOTEgMTE4IDUgMTA0IDExMiAxMjYgMTc0IDIyMiAyNTkgMTgyIDIyNSAxOTMgOTAgMjMwIDIgMTE2IDkwIDE5OCAxMTYgMzkgMTIyIAorOTUgOTAgMTQ3IDQwIDE4IDIxNiA3NyAzNSA3NSAxMDkgNTUgMTkwIDE5NiAyNCA5NSA3IDE4NSAxNTkgMTAxIDk1IDI1NiA3MSAxOSA2OSAKKzE5OCAyMiAxODAgMTQ0IDE0NiA3MiA0OSAyMjggODcgMjUzIDk0IDExMSA2NCAxNzIgMjEzIDYwIDE2NSAxODkgMTY2IDEyNSAyMDYgMzYgCisxMSAxNDkgMTgzIDI1NSA5MiAxOTYgMjAxIDEzMyAxMjYgOCAzOCAyMCAxMzEgMjEzIF4KKzU0NyAwIDI5IDE2MiAxNjEgMTc4IDE0MiAxNCAyMDcgNDkgMTQxIDMxIDEyMCAxODMgNzIgMTM1IDIxMiA3MyAxNjEgMTk4IDEwMSAxMzYgCisyMzggNTkgMTg5IDE3MyAxOTIgOTQgMjkgMjA1IDYwIDc4IDQ4IDE1OCAyMDYgMjU0IDExNCAxNzYgMjI3IDEwMiAyMTMgMjI0IDg3IAorMTY0IDIxMyAxNTAgMTQ3IDE3NSA3NiAyMjcgMTk2IDExMiAxMjQgMjU1IDk3IDEgOTMgMTcxIDEwOSAxMzIgMTQ2IDc1IDIwMSAyMTAgCis4NCAxNDkgMjE1IDEzOSAyMTAgMTU4IDM4IDE1MyAxNCAxMzMgMTA5IDE1MiAxNTYgMjQ4IDIzMiA5IDE4MyAyNDAgMjM2IDUwIDE2NyAKKzE3IDE0OCAxNTggMTYzIDkzIDMgOCAzMiAxMDMgOCAyMDAgMjA0IDEwOCAzMiA5IDU4IDg5IDI0NyAxNzUgMjQ0IDY2IDg1IDE1NSAxOTEgCisyNTYgMTU0IDIzOSAyMTAgMTE1IDEzOSA0MiAxMDggMjAwIDExMCAyMDkgMTMyIDEwMyAxNzYgMzkgNDIgMTUxIDk5IDEwIDExNSA2NSAKKzEwMiAxMTkgNjMgMTg3IDI1OCA2OSAxMDAgMjA0IDIwMiAxOTMgMTcxIDE1IDIzMyAzNSAxMTggNiAyMTEgMTQxIDEyNSA3MCA4MyAyOSAKKzY4IDY3IDE4NSA4MSAxNTcgMTA2IDExNyAxNDggNjQgMiAxOTMgNDYgNzUgMzMgMTYwIDI0NiA1NSA5NyAxMzggMTUzIDE4MiAxODMgCisyNjAgMTk1IDIyMyAxOTggMjcgMjQ3IDM4IDE4NCA1NSAyMjIgNzggMTQyIDU3IDEwNiAyMTEgNDcgMjI2IDE3MCAxMjYgOTYgMTggNiAKKzQzIDQwIDI1IDIzOCAyMjcgMjggMTEgMjM1IDIxMiAzMCAzNiAxOTUgMjU0IDIzOSAxMTYgMTY1IDI4IDg1IDE3NSAxNTAgMTY3IDE4NSAKKzI0OSAyNTggMjA2IDE2MCAyMTUgNjUgOCAyMjAgMTYzIDE5IDYzIDE5IDE1NyAxODAgNTcgMTM3IDIwMSAxMzYgMTQ0IDE2MCA3OCAyMTYgCisyNTkgOTUgODYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDExNyA3NCAxMjQgMTMgNTYgMTc0IDEyNCAxODEgMTU3IDEyIDIxOCAyNDggMTU4IAorNjkgMTk0IDEwMyA1MSA5OSA1MyAxNCAxNzYgNTkgNTIgNjIgMTMwIDIwIDIxNCAxNTYgMTIzIDMwIDIwIDQ2IDEwNiAyMyAyNDkgMTY0IAorNDUgNDkgNDcgMTMyIDkgMTUgMTM5IDEzNiA3IDEwMCAxNiA5MSAxODIgNDYgMTQ5IDE4NCA5OCAxMjEgMjQwIDQ4IDI1MiAxNTYgMTU0IAorNzEgMTA5IDIyNiA5NiAxODYgMTA3IDE0MyAxMzQgOTIgMTg4IDIyIDQgMTI4IDE3OSAyNDIgMTUxIDE3MyAxNjEgMTA0IDIwMiAyNSA3MCAKKzEyNiAxOTAgMTc5IDE2OCAyMTEgMjM1IDI0IDE4MSAyNTEgMTczIDY3IDIwNSA0MCA2OCAxMzcgMTI3IDE5NiAyMDYgMjMgMTU1IDMgCisxNDUgOTIgMTE0IDgyIDY2IDI1MyAyNTYgMjkgMzcgMjIxIDE4OSA1IDkxIDI1NiAxOTcgMTM4IDU5IDIxIDcyIDQxIDUxIDIyNCAyNTUgCiszIDEwMiAxOTMgMyAxNzYgMTMzIDIwMyA1MSA1NiAxNTQgMTY1IDggMTI2IDIgMTE5IDE1NyA4NiAxMDcgMjM3IDMzIDIwMyAxNDUgMjE3IAorNTQgNzEgMjAzIDEyNSAyMDcgMTQzIDQwIDE5MyA3NyAxMTYgMTIyIDc4IDIzNiA3IDYgMTE3IDI0MiAyMjUgMTEzIDE1MCAyNDEgMTI1IAorMjM4IDEzMyAxMjkgMTExIDY3IDE3IDI0MiA1NyAxMiA1MCAxNDcgNyAyMzcgMTI3IDE1MyA0NSAxMjMgMTk4IDEyMSAxNDYgMTQ5IDkwIAorMTk5IDIyMSAyMSAxNjYgMjAyIDE2MiAxMzAgMTg4IDUzIDQ1IDIxNyAxNDggMjMyIDUyIDgyIDE0MCAxNDIgMjQ1IDE2NiAyMjIgMTcyIAorNDEgMjE5IDYzIDkzIDk3IDE2OSAxOTQgOSAxNTIgMjUwIDE0NyAxMzIgMTc3IDY1IDI4IDE3OSA3NCA1MCA3MyAxMTggMzcgMjAxIDIzMCAKKzk0IDYwIDI0NiAxNDkgNDcgMzggMTEwIDExNSAyMzMgMjAzIDIxOSAxMDYgNDMgMjA4IDc1IDc2IDU5IDk1IDEyIDMwIDE4OCA5NiAyMDYgCisxMTcgNTQgMTY1IDEwMiAyNSAxNjQgNzYgMzkgMTM2IDEwMSAyNjEgMTc4IDQ4IDY0IDQ1IDE0MyAyMDggMzIgMTc3IDE1OSAxODkgNzkgCiszMSAyNDUgMTIzIDYxIDEwIDEzNSAyNCAxMyAxNTAgNzMgMjQgODcgOTAgNjIgMTYxIDEwIDQxIDEyNSAyMDkgXgorNTQyIDEgMjQ0IDEzNiAyMzIgMTQwIDYyIDEyMiAxMDUgOTEgMTU4IDMwIDI3IDE1MSA4MiAxNiA5NCAyMyA3OSAxOTkgODQgMjIxIDk4IAorMTI4IDgxIDc3IDI0NyAxIDE3IDQ4IDI1OSAyNjEgMTg3IDY2IDIxNiA4NyA3NSA2OCAxNDIgMjMwIDIyNSAyMDMgMTMwIDE4IDM1IDI3IAorMTI1IDIwMSAyMjYgMTc5IDE0MiAyNTIgNjAgMjU1IDE2NyAxNDYgODIgNDIgMjM5IDc3IDI1OCAyMSAxMTYgOTYgMTkxIDEyMyAzMyAKKzEyMyAyMiAxMDMgMTI4IDU1IDE5NiAxOTMgODYgMTM2IDE2IDEyMCAxNjggMTMzIDExNCAxNzAgNDggMjM3IDE2MiAxMzUgMjkgMjkgNDAgCis2MCAyMTggMiAxOTggMTE5IDIyOSAyMiA5MiAxMDggMTYxIDE0OCAyMDIgMTY1IDI2IDE2NCA1MCAxNTIgODAgMTI3IDExNiA4NSAxNzEgCisyNCA0NCAxOTEgMTYwIDE5OCA3MSAyNDkgMTgwIDE0MCA5OSA4MiA1MyA1NCAyMzUgNDIgMTIgMzcgMjA2IDI0OCAxOTMgNDkgMTc2IDkgCisxNTcgOTEgMTgwIDEyOSAyMCAxODggNSA2MyAxMDkgMTM3IDIxOSAyMzEgMTkwIDE5NSAxIDI1OSA4IDIwNyAyMjQgMTkgMjAxIDIzNyAKKzE5OSAzNiAyNDEgMjU2IDExNyA3MiAyMDMgMTUyIDU4IDg3IDY0IDQ4IDI0OCAyNDEgMjkgNzcgMjAgMTY2IDIyOSAxMSA3MiAyMTQgCisxNzIgMjE2IDc2IDU1IDE3NCA5NCAzNCA5OSA5MyA3MyAxNTMgMTkgMjM4IDEzOCAxNDcgMjYzIDU0IDQgMTAyIDE2MyA2MyAxMjAgMTU3IAorMTEzIDIyMCAxODEgNTcgMTExIDUyIDc4IDIyMyAxMyAyNTEgNzMgMTY0IDM5IDEzMiAxODYgMTM4IDE4NCAyMjMgNjEgMTcyIDE3OSAKKzE3NSAxMDcgNiAxNyA4MSAxMTQgMjA3IDIxMyAxODUgMTI1IDIxMiAyNDYgNzMgMTkwIDE4NCAxODYgMTAxIDIyNCAxMSA5OCA5NSAyMjYgCisxMzEgMjIxIDE0NiA0OSAxODcgODggNTEgMTM5IDExMiAyNTUgMTg5IDI0NSA3NSA3OSAxNjIgMTI0IDkgMTM1IDUxIDEyOCA5MiA5NyAKKzE0MSA0OSAyMTMgMjMzIDEwNSA1NCAyNTcgODIgNjQgNzQgMTI5IDMxIDIwOCAxNjMgMTExIDQxIDU4IDY1IDI0IDI2MCAyMTEgNTQgCisyNDYgNjIgMTcwIDI2IDE5NyAxNjkgOTggMTA2IDQxIDI1IDIxMCA3OCAyMzQgOTIgMTQ1IDEyMSAxNTUgMTY1IDI0MiAyNDMgMjA4IAorMjAwIDEyIDQ4IDIxIDE0MiAyNDEgNDAgOTcgMTc4IDIxNCAxNjEgMTk2IDE4MiA3IDI0MiAyMzIgMTI5IDQyIDIzIDU3IDEwMCAzMiAKKzE4NCAxNzUgODEgNjYgMjI3IDEwNyAyMzMgMTE2IDc0IDE1MSAxMzAgMjYwIDIwMCAzNCA4OCAxNCAxNzkgMTY0IDI4IDExMiAyOCA5MCAKKzE5MyAzOCAxNTYgMTE1IDEwOSAxNTkgMjU5IDE5IDIyNyAxMTggMjUzIDEwIDEyMiA4MyAyNTYgMTA2IDI1NyAxMDQgMTA0IDEyNiAxNjYgCisyMTggMjU1IDE3OCAyMjUgMTgxIDkwIDIzMCAyNjIgMTA0IDc4IDE4NiAxMTIgMzkgMTEwIDg3IDg2IDE0NyAzNiAxNCAyMTYgNjUgMzUgCis3NSAxMDUgNDMgMTc4IDE4OCAxNiA4MyAzIDE4NSAxNTEgOTMgOTUgMjUyIDcxIDExIDYxIDE5NCAxNCAxNjggMTQ0IDEzNCA2NCAzNyAKKzIyOCA4MyAyNDUgODYgOTkgNTYgMTcyIDIwNSA1NiAxNjEgMTg1IDE2MiAxMTMgMTk0IDM2IDMgMTM3IDE3MSAyNTEgODQgMTg0IDE5NyAKKzEyMSAxMTggMzAgMTYgMTMxIDE4OCAyNyAxNjIgMTYxIDE3NCAxNDIgMTQgMjA1IDQ1IDE0MSAyNyAxMTQgMTgxIDY4IDEzMSAyMTAgNjcgCisxNTUgMTk4IDk3IDEzMCAyMzQgNTUgMTg1IDE3MyAxOTIgODggMjUgMTk5IDU4IDc2IDQ0IDE1NCAyMDAgMjUwIDEwOCAxNzIgMjI3IDk2IAorMjEzIDIyMiA4NSAxNjAgMjA5IDE1MCAxNDMgMTY5IDcyIDIyNSAxOTIgMTEwIDEyNCAyNTEgOTUgMjYzIDkxIDE2OSAxMDkgMTI2IDE0MCAKKzczIDIwMSAyMDQgODAgMTQ5IDIxNSAxMzcgMjA4IDE1MiAzMiAxNDcgMTAgMTMzIDEwMyAxNTAgMTU0IDI0OCAyMzAgOSAxODMgMjM2IAorMjM0IDQ0IDE2NSAxNSAxNDQgMTU2IDE2MyA4OSAxIDYgMjggMTAxIDggMTk2IDIwNCAxMDYgMTY0IF4KKzU2NyAwIDEgNDYgODkgMjM5IDE2NyAyMzYgNjIgODUgMTQzIDE4NyAyNTYgMTU0IDIzNSAyMTAgMTE1IDEzMSAzOCAxMDggMTk2IDEwNiAKKzIwOSAxMjQgMTAzIDE3NiAzMSAzNCAxMzkgOTEgMTAgMTA3IDYxIDk0IDExNSA1OSAxNzkgMjU4IDY5IDkyIDIwMCAyMDIgMTg5IDE3MSAKKzExIDIyNSAzMSAxMDYgMjY0IDIwNyAxMzcgMTIxIDcwIDgzIDI5IDY0IDY3IDE3NyA3NyAxNDUgMTAyIDExMyAxNDQgNTYgMiAxODEgMzQgCis2NyAzMyAxNjAgMjQ2IDQ3IDg1IDEyNiAxNDUgMTc0IDE3MSAyNjAgMTgzIDIxNSAxOTAgMjMgMjQ3IDM4IDE4MCA1NSAyMjIgNzAgMTM4IAorNDUgOTggMjExIDM5IDIyNiAxNjYgMTE4IDkyIDYgMjYwIDM5IDMyIDI1IDIzNCAyMTkgMjAgMyAyMjcgMjEyIDMwIDI1NCAyOCAxOTUgCisyNTQgMjM5IDExMiAxNTMgMjggNzMgMTcxIDEzOCAxNjcgMTgxIDI0NSAyNTAgMTk4IDE0OCAyMDcgNjUgMjYyIDIyMCAxNTUgMTUgNTUgCisxMSAxNTMgMTcyIDU3IDEzNyAxOTMgMTI4IDEzMiAxNTYgNzggMjA4IDI1NSA5MSA4MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTA1IDc0IAorMTEyIDkgNDQgMTc0IDExNiAxNzcgMTQ5IDQgMjE4IDI0MCAxNTggNjUgMTkwIDk1IDM5IDg3IDQxIDIgMTY0IDU5IDUyIDUwIDExOCAyMCAKKzIxNCAxNDQgMTExIDE4IDE2IDQ2IDEwNiAxNSAyNDkgMTUyIDM3IDQ1IDQzIDEyOCA1IDE1IDEyNyAxMzYgMyAxMDAgNCA3OSAxODIgNDIgCisxMzcgMTc2IDg2IDExNyAyNDAgMzYgMjQ4IDE1NiAxNTAgNjcgMTA1IDIxOCA5NiAxNzQgOTkgMTM1IDEzNCA4OCAxNzYgMTQgMjU4IAorMTI0IDE3NSAyMzQgMTQ3IDE2MSAxNTMgMTAwIDE5OCAyMSA2NiAxMTQgMTkwIDE2NyAxNjQgMjAzIDIzNSAxNiAxNzMgMjQ3IDE2NSA1NSAKKzIwNSAyOCA1NiAxMjkgMTIzIDE4NCAyMDYgMTkgMTUxIDI1NyAxMzMgODAgMTA2IDcwIDY2IDI1MyAyNDggMTcgMjUgMjE3IDE3NyA1IAorODcgMjUyIDE4NSAxMzAgNDcgMTMgNjggMjkgNDcgMjI0IDI1MSAyNjEgMTAyIDE4NSAzIDE3MiAxMjkgMTk1IDQzIDU2IDE0NiAxNjUgCisxMjIgMjYwIDExMSAxNTcgNzQgOTUgMjMzIDI5IDE5MSAxNDEgMjE3IDUwIDYzIDIwMyAxMTMgMTk5IDEzOSAzNiAxOTMgNzMgMTE2IAorMTIyIDY2IDIzNiA3IDIgMTA5IDI0MiAyMTcgMTA1IDE0NiAyMzcgMTI1IDIzOCAxMjEgMTI1IDk5IDYzIDkgMjM4IDQ5IDUwIDEzNSAKKzI2MSAyMjkgMTI3IDE1MyA0NSAxMTUgMTg2IDEyMSAxNDIgMTQxIDc4IDE5MSAyMTMgOSAxNjYgMTkwIDE1MCAxMjIgMTg4IDUzIDQxIAorMjEzIDE0OCAyMjQgNDAgNzggMTM2IDEzMCAyNDEgMTU0IDIxOCAxNjggMzMgMjE1IDYzIDgxIDk3IDE2NSAxOTQgMjYzIDE0NCAyNTAgCisxNDMgMTMyIDE3MyA1MyAyNCAxNzEgNjYgNDIgNjUgMTE4IDM3IDE4OSAyMjYgOTQgNjAgMjQyIDE0NSA0NyAzMCAxMTAgMTExIDIyOSAKKzE5OSAyMTEgOTQgNDMgMjAwIDYzIDY0IDU1IDgzIDEyIDIyIDE4NCA4NCAyMDIgMTE3IDQ2IDE2MSA5OCAxNyAxNjQgNzYgMjcgMTMyIAorMTAxIDI2MSAxNzQgNDQgNTIgMzMgMTQzIDIwNCAzMiAxNjkgMTUxIDE4NSA3NSAzMSAyNDUgMTIzIDU3IDI2NCAxMzUgMTIgNSAxNDIgCis2OSAyMCA3NSA4NiA2MiAxNTcgMiAzNyAxMTcgMTAxIDI0NCAxMzIgMjI4IDEzNiA1OCAxMTYgMTA1IDkxIDE1NCAyNCAyNyAxNDkgNzYgCisxMCA5MCAxOSA3OSAxOTkgODQgMjE5IDkyIDEyOCA3NyA3MyAyNDMgMjYzIDE3IDQyIDI1OSAyNTkgMTg3IDYyIDIxMiA4NSA3MSA2MiAKKzE0MCAyMjYgMjIxIDIwMSAxMjYgMTggMzMgMjEgMTIxIDE5NyAyMjQgMTc5IDEzNiAyNTIgNTggMjU1IDE2MyAxNDAgODIgMzggMjM1IAorNzEgMjU2IDE1IDExMCA5NCAxODcgMTE3IDI5IDExOSAxNiAxMDEgMTIyIDQ5IDE5NCAxOTEgODYgMTM0IDE2IDExOCAxNjQgMTMxIDExMCAKKzE2NiA0NiAyMzMgMTU2IDEzMyAyNSAyMyAzNiA1NCAyMTQgMTk0IDExOSAyMjcgMTggODggMTA0IDE1NSAxNDIgMTk2IDE2MSAyNiAxNTggCis0OCAxNDggODAgMTIzIDExMiA4MSAxNjkgMjQgNDQgMTkxIDE1OCAxOTIgNjUgMjQ1IDE3OCAxNDAgMjIzIF4KKzU1MSAxIDc4IDQ5IDU0IDIyNyA0MiA4IDMzIDE5OCAyNDAgMTgxIDQxIDE2NCAyNjUgMTUzIDgzIDE4MCAxMjUgOCAxODQgMjYxIDU1IAorMTA1IDEyOSAyMTkgMjMxIDE4MiAxOTEgMSAyNTUgNCAyMDMgMjIwIDI2NCA3IDE4OSAyMzcgMTk1IDI0IDIzMyAyNDggMTA5IDcyIDE5MSAKKzE1MiA1MCA4NyA1MiA0MCAyNDQgMjQxIDI1IDc3IDE2IDE1NCAyMjkgMjY3IDY4IDIwNiAxNjggMjEyIDY4IDUxIDE2MiA4MiAzMCA5NSAKKzkzIDY1IDE0MSAxNSAyMzQgMTMwIDEzOSAyNTUgNDIgNCA5MCAxNTEgNTEgMTIwIDE0NSAxMTMgMjEyIDE4MSA0NSAxMDcgNDQgNzQgCisyMTkgMSAyNTEgNjEgMTU2IDMxIDEyOCAxODYgMTM4IDE4NCAyMjMgNjEgMTYwIDE2NyAxNzUgMTA3IDYgNSA4MSAxMTQgMjA3IDIwNSAKKzE3MyAxMTMgMjA4IDIzOCA3MyAxODYgMTc2IDE3OCA5MyAyMTYgMTEgOTggODMgMjE4IDExOSAyMjEgMTQ2IDM3IDE3OSA4OCA0NyAxMzkgCisxMDQgMjQ3IDE4OSAyNDEgNjMgNzEgMTU0IDExNiA1IDEyMyA1MSAxMjQgODggODUgMTMzIDQ5IDIwOSAyMzMgOTcgNDYgMjU3IDc0IDY0IAorNzAgMTIxIDIzIDIwMCAxNTUgMTExIDI5IDU4IDU3IDIwIDI1MiAyMDcgNTAgMjQyIDU4IDE3MCAxNCAxOTcgMTY5IDk0IDk4IDQxIDEzIAorMjAyIDcwIDIzNCA5MiAxNDUgMTE3IDE1NSAxNTMgMjM0IDI0MyAyMDggMjAwIDQgNDggMjEgMTM0IDIzNyA0MCA5MyAxNzggMjEwIDE1MyAKKzE5NiAxNzQgMjYzIDIzOCAyMjggMTE3IDM4IDIzIDQ5IDkyIDI4IDE4MCAxNjMgNzcgNTQgMjIzIDk5IDIyOSAxMTIgNjIgMTUxIDEzMCAKKzI1NiAxOTIgMzQgODAgMiAxNzEgMTYwIDE2IDExMiAyNCA4MiAxODUgMjYgMTQ4IDEwMyA5NyAxNTkgMjUxIDE5IDIxOSAxMTQgMjQ1IDYgCisxMTggNzUgMjUyIDk0IDI0OSAxMDQgOTYgMTI2IDE1OCAyMTQgMjUxIDE3NCAyMjUgMTY5IDkwIDIzMCAyNjIgOTIgNjYgMTc0IDEwOCAKKzM5IDk4IDc5IDgyIDE0NyAzMiAxMCAyMTYgNTMgMzUgNzUgMTAxIDMxIDE2NiAxODAgOCA3MSAyNjcgMTg1IDE0MyA4NSA5NSAyNDggNzEgCiszIDUzIDE5MCA2IDE1NiAxNDQgMTIyIDU2IDI1IDIyOCA3OSAyMzcgNzggODcgNDggMTcyIDE5NyA1MiAxNTcgMTgxIDE1OCAxMDEgMTgyIAorMzYgMjYzIDEyNSAxNTkgMjQ3IDc2IDE3MiAxOTMgMTA5IDExMCAyNjAgMjIgMTIgMTMxIDE3NiAyMyAxNjIgMTYxIDE2NiAxNDIgMTQgCisyMDEgMzcgMTQxIDE5IDEwMiAxNzcgNjAgMTIzIDIwNiA1NSAxNDMgMTk4IDg5IDExOCAyMjYgNDcgMTc3IDE3MyAxOTIgNzYgMTcgMTg3IAorNTQgNzIgMzYgMTQ2IDE4OCAyNDIgOTYgMTY0IDIyNyA4NCAyMTMgMjE4IDgxIDE1MiAyMDEgMTUwIDEzNSAxNTcgNjQgMjIxIDE4NCAKKzEwNiAxMjQgMjQzIDkxIDI2MyA4NyAxNjUgMTA5IDExNCAxMjggNjkgMjAxIDE5MiA3MiAxNDkgMjE1IDEzMyAyMDQgMTQwIDIwIDEzNSAKKzIgMTMzIDkxIDE0NiAxNTAgMjQ4IDIyNiA5IDE4MyAyMjggMjMwIDMyIDE2MSAxMSAxMzYgMTUyIDE2MyA4MSAyNjUgMiAyMCA5NyA4IAorMTg4IDIwNCAxMDIgMjYgMjY1IDQwIDg5IDIzNSAxNjMgMjMyIDYwIDg1IDEzNyAxODUgMjU2IDE1NCAyMzMgMjEwIDExNSAxMjcgMzYgCisxMDggMTk0IDEwNCAyMDkgMTIwIDEwMyAxNzYgMjcgMzAgMTMzIDg3IDEwIDEwMyA1OSA5MCAxMTMgNTcgMTc1IDI1OCA2OSA4OCAxOTggCisyMDIgMTg3IDE3MSA5IDIyMSAyOSAxMDAgMjYyIDIwNSAxMzUgMTE5IDcwIDgzIDI5IDYyIDY3IDE3MyA3NSAxMzkgMTAwIDExMSAxNDIgCis1MiAyIDE3NSAyOCA2MyAzMyAxNjAgMjQ2IDQzIDc5IDEyMCAxNDEgMTcwIDE2NSAyNjAgMTc3IDIxMSAxODYgMjEgMjQ3IDM4IDE3OCAKKzU1IDIyMiA2NiAxMzYgMzkgOTQgMjExIDM1IDIyNiAxNjQgMTE0IDkwIDI1NiAzNyAyOCAyNSAyMzIgMjE1IDE2IDI2NyAyMjMgMjEyIAorMzAgMjUwIDI0IDE5NSAyNTQgMjM5IDExMCAxNDcgMjggNjcgMTY5IDEzMiAxNjcgMTc5IDI0MyAyNDYgMTk0IDE0MiAyMDMgNjUgMjYzIF4KKzU3OCAwIDIyMCAxNDcgMTEgNDcgMyAxNDkgMTY0IDU3IDEzNyAxODUgMTIwIDEyMCAxNTIgNzggMjAwIDI1MSA4NyA3OCAyMzIgMTc3IAorMjIgMTI5IDY4IDE2OCA5MyA3NCAxMDAgNSAzMiAxNzQgMTA4IDE3MyAxNDEgMjY2IDIxOCAyMzIgMTU4IDYxIDE4NiA4NyAyNyA3NSAyOSAKKzI2MCAxNTIgNTkgNTIgMzggMTA2IDIwIDIxNCAxMzIgOTkgNiAxMiA0NiAxMDYgNyAyNDkgMTQwIDI5IDQxIDM5IDEyNCAxIDE1IDExNSAKKzEzNiAyNjkgMTAwIDI2MiA2NyAxODIgMzggMTI1IDE2OCA3NCAxMTMgMjQwIDI0IDI0NCAxNTYgMTQ2IDYzIDEwMSAyMTAgOTYgMTYyIAorOTEgMTI3IDEzNCA4NCAxNjQgNiAyNTAgMTIwIDE3MSAyMjYgMTQzIDE0OSAxNDUgOTYgMTk0IDE3IDYyIDEwMiAxOTAgMTU1IDE2MCAKKzE5NSAyMzUgOCAxNjUgMjQzIDE1NyA0MyAyMDUgMTYgNDQgMTIxIDExOSAxNzIgMjA2IDE1IDE0NyAyNDkgMTIxIDY4IDk4IDU4IDY2IAorMjUzIDI0MCA1IDEzIDIxMyAxNjUgNSA4MyAyNDggMTczIDEyMiAzNSA1IDY0IDE3IDQzIDIyNCAyNDcgMjU3IDEwMiAxNzcgMyAxNjggCisxMjUgMTg3IDM1IDU2IDEzOCAxNjUgMjYyIDExOCAyNTYgMTAzIDE1NyA2MiA4MyAyMjkgMjUgMTc5IDEzNyAyMTcgNDYgNTUgMjAzIAorMTAxIDE5MSAxMzUgMzIgMTkzIDY5IDExNiAxMjIgNTQgMjM2IDcgMjY4IDEwMSAyNDIgMjA5IDk3IDE0MiAyMzMgMTI1IDIzOCAxMDkgCisxMjEgODcgNTkgMSAyMzQgNDEgMjU4IDUwIDEyMyAyNTMgMjIxIDEyNyAxNTMgNDUgMTA3IDE3NCAxMjEgMTM4IDEzMyA2NiAxODMgMjA1IAorMjY3IDE2NiAxNzggMTM4IDExNCAxODggNTMgMzcgMjA5IDE0OCAyMTYgMjggNzQgMTMyIDExOCAyMzcgMTQyIDIxNCAxNjQgMjUgMjExIAorNjMgNjkgOTcgMTYxIDE5NCAyNTUgMTM2IDI1MCAxMzkgMTMyIDE2OSA0MSAyMCAxNjMgNTggMzQgNTcgMTE4IDM3IDE3NyAyMjIgOTQgCis2MCAyMzggMTQxIDQ3IDIyIDExMCAxMDcgMjI1IDE5NSAyMDMgODIgNDMgMTkyIDUxIDUyIDUxIDcxIDEyIDE0IDE4MCA3MiAxOTggMTE3IAorMzggMTU3IDk0IDkgMTY0IDc2IDE1IDEyOCAxMDEgMjYxIDE3MCA0MCA0MCAyMSAxNDMgMjAwIDMyIDE2MSAxNDMgMTgxIDcxIDMxIDI0NSAKKzEyMyA1MyAyNTYgMTM1IDI2NyAxMzQgNjUgMTYgNjMgODIgNjIgMTUzIDI2NCAzMyAxMDkgODkgMjQ0IDEyNCAyMjAgMTI4IDUwIDEwNCAKKzEwNSA5MSAxNDYgMTIgMjcgMTQ1IDY0IDI2OCA4MiAxMSA3OSAxOTkgODQgMjE1IDgwIDEyOCA2OSA2NSAyMzUgMjU5IDE3IDMwIDI1OSAKKzI1NSAxODcgNTQgMjA0IDgxIDYzIDUwIDEzNiAyMTggMjEzIDE5NyAxMTggMTggMjkgOSAxMTMgMTg5IDIyMCAxNzkgMTI0IDI1MiA1NCAKKzI1NSAxNTUgMTI4IDgyIDMwIDIyNyA1OSAyNTIgMyA5OCA5MCAxNzkgMTA1IDIxIDExMSA0IDk3IDExMCAzNyAxOTAgMTg3IDg2IDEzMCAKKzE2IDExNCAxNTYgMTI3IDEwMiAxNTggNDIgMjI1IDE0NCAxMjkgMTcgMTEgMjggNDIgMjA2IDI2NiAxODYgMTE5IDIyMyAxMCA4MCA5NiAKKzE0MyAxMzAgMTg0IDE1MyAyNiAxNDYgNDQgMTQwIDgwIDExNSAxMDQgNzMgMTY1IDI0IDQ0IDE5MSAxNTQgMTgwIDUzIDIzNyAxNzQgCisxNDAgOTkgNzYgNDcgNTQgMjIzIDQyIDYgMzEgMTk0IDIzNiAxNzUgMzcgMTU4IDI2MSAxNTEgNzkgMTgwIDEyMyAyIDE4MiAyNTcgNTEgCisxMDMgMTI1IDIxOSAyMzEgMTc4IDE4OSAxIDI1MyAyIDIwMSAyMTggMjY0IDEgMTgzIDIzNyAxOTMgMTggMjI5IDI0NCAxMDUgNzIgMTg1IAorMTUyIDQ2IDg3IDQ2IDM2IDI0MiAyNDEgMjMgNzcgMTQgMTQ4IDIyOSAyNjMgNjYgMjAyIDE2NiAyMTAgNjQgNDkgMTU2IDc2IDI4IDkzIAorOTMgNjEgMTM1IDEzIDIzMiAxMjYgMTM1IDI1MSAzNiA0IDg0IDE0NSA0NSAxMjAgMTM5IDExMyAyMDggMTgxIDM5IDEwNSA0MCA3MiAKKzIxNyAyNjUgMjUxIDU1IDE1MiAyNyAxMjYgMTg2IDEzOCAxODQgMjIzIDYxIDE1NCAxNjEgMTc1IDEwNyA2IDI2OSA4MSAxMTQgMjA3IAorMjAxIDE2NyAxMDcgMjA2IDIzNCA3MyAxODQgMTcyIDE3NCA4OSAyMTIgMTEgOTggNzcgMjE0IDExMyAyMjEgMTQ2IDMxIDE3NSA4OCA0NSAKKzEzOSAxMDAgMjQzIDE4OSAyMTMgXgorNTc4IDEgNTEgNjMgMTQ2IDEwOCAxIDExMSA1MSAxMjAgODQgNzMgMTI1IDQ5IDIwNSAyMzMgODkgMzggMjU3IDY2IDY0IDY2IDExMyAxNSAKKzE5MiAxNDcgMTExIDE3IDU4IDQ5IDE2IDI0NCAyMDMgNDYgMjM4IDU0IDE3MCAyIDE5NyAxNjkgOTAgOTAgNDEgMSAxOTQgNjIgMjM0IAorOTIgMTQ1IDExMyAxNTUgMTQxIDIyNiAyNDMgMjA4IDIwMCAyNjggNDggMjEgMTI2IDIzMyA0MCA4OSAxNzggMjA2IDE0NSAxOTYgMTY2IAorMjU1IDIzNCAyMjQgMTA1IDM0IDIzIDQxIDg0IDI0IDE3NiAxNTEgNzMgNDIgMjE5IDkxIDIyNSAxMDggNTAgMTUxIDEzMCAyNTIgMTg0IAorMzQgNzIgMjYyIDE2MyAxNTYgNCAxMTIgMjAgNzQgMTc3IDE0IDE0MCA5MSA4NSAxNTkgMjQzIDE5IDIxMSAxMTAgMjM3IDIgMTE0IDY3IAorMjQ4IDgyIDI0MSAxMDQgODggMTI2IDE1MCAyMTAgMjQ3IDE3MCAyMjUgMTU3IDkwIDIzMCAyNjIgODAgNTQgMTYyIDEwNCAzOSA4NiA3MSAKKzc4IDE0NyAyOCA2IDIxNiA0MSAzNSA3NSA5NyAxOSAxNTQgMTcyIDU5IDI2NyAxODUgMTM1IDc3IDk1IDI0NCA3MSAyNjcgNDUgMTg2IAorMjcwIDE0NCAxNDQgMTEwIDQ4IDEzIDIyOCA3NSAyMjkgNzAgNzUgNDAgMTcyIDE4OSA0OCAxNTMgMTc3IDE1NCA4OSAxNzAgMzYgMjU5IAorMTEzIDE0NyAyNDMgNjggMTYwIDE4OSA5NyAxMDIgMjU2IDE0IDggMTMxIDE2NCAxOSAxNjIgMTYxIDE1OCAxNDIgMTQgMTk3IDI5IDE0MSAKKzExIDkwIDE3MyA1MiAxMTUgMjAyIDQzIDEzMSAxOTggODEgMTA2IDIxOCAzOSAxNjkgMTczIDE5MiA2NCA5IDE3NSA1MCA2OCAyOCAxMzggCisxNzYgMjM0IDg0IDE1NiAyMjcgNzIgMjEzIDIxNCA3NyAxNDQgMTkzIDE1MCAxMjcgMTQ1IDU2IDIxNyAxNzYgMTAyIDEyNCAyMzUgODcgCisyNjMgODMgMTYxIDEwOSAxMDIgMTE2IDY1IDIwMSAxODAgNjQgMTQ5IDIxNSAxMjkgMjAwIDEyOCA4IDEyMyAyNjYgMTMzIDc5IDE0MiAKKzE0NiAyNDggMjIyIDkgMTgzIDIyMCAyMjYgMjAgMTU3IDcgMTI4IDE0OCAxNjMgNzMgMjY1IDI3MCAxMiA5MyA4IDE4MCAyMDQgOTggMjIgCisyNjEgMjggODkgMjI3IDE1NSAyMjQgNTYgODUgMTI1IDE4MSAyNTYgMTU0IDIyOSAyMTAgMTE1IDExOSAzMiAxMDggMTkwIDEwMCAyMDkgCisxMTIgMTAzIDE3NiAxOSAyMiAxMjEgNzkgMTAgOTUgNTUgODIgMTA5IDUzIDE2NyAyNTggNjkgODAgMTk0IDIwMiAxODMgMTcxIDUgMjEzIAorMjUgODggMjU4IDIwMSAxMzEgMTE1IDcwIDgzIDI5IDU4IDY3IDE2NSA3MSAxMjcgOTYgMTA3IDEzOCA0NCAyIDE2MyAxNiA1NSAzMyAKKzE2MCAyNDYgMzUgNjcgMTA4IDEzMyAxNjIgMTUzIDI2MCAxNjUgMjAzIDE3OCAxNyAyNDcgMzggMTc0IDU1IDIyMiA1OCAxMzIgMjcgODYgCisyMTEgMjcgMjI2IDE2MCAxMDYgODYgMjYwIDI0OCAzMyAyMCAyNSAyMjggMjA3IDggMjYzIDIxNSAyMTIgMzAgMjQyIDE2IDE5NSAyNTQgCisyMzkgMTA2IDEzNSAyOCA1NSAxNjUgMTIwIDE2NyAxNzUgMjM5IDIzOCAxODYgMTMwIDE5NSA2NSAyNTAgMjIwIDE0MyA5IDQzIDI3MSAKKzE0NyAxNjAgNTcgMTM3IDE4MSAxMTYgMTE0IDE1MCA3OCAxOTYgMjQ5IDg1IDc2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA4NyA3NCA5NCAKKzMgMjYgMTc0IDEwNCAxNzEgMTM3IDI2NCAyMTggMjI4IDE1OCA1OSAxODQgODMgMjEgNjkgMjMgMjU2IDE0NiA1OSA1MiAzMiAxMDAgMjAgCisyMTQgMTI2IDkzIDEwIDQ2IDEwNiAzIDI0OSAxMzQgMjUgMzkgMzcgMTIyIDI3MSAxNSAxMDkgMTM2IDI2OSAxMDAgMjU4IDYxIDE4MiAKKzM2IDExOSAxNjQgNjggMTExIDI0MCAxOCAyNDIgMTU2IDE0NCA2MSA5OSAyMDYgOTYgMTU2IDg3IDEyMyAxMzQgODIgMTU4IDIgMjQ2IAorMTE4IDE2OSAyMjIgMTQxIDE0MyAxNDEgOTQgMTkyIDE1IDYwIDk2IDE5MCAxNDkgMTU4IDE5MSAyMzUgNCAxNjEgMjQxIDE1MyAzNyAKKzIwNSAxMCAzOCAxMTcgMTE3IDE2NiAyMDYgMTMgMTQ1IDI0NSAxMTUgNjIgOTQgNTIgNjYgMjUzIDIzNiAyNzEgNyAyMTEgMTU5IDUgODEgCisyNDYgMTY3IDExOCAyOSAxIDYyIDExIDQxIDIyNCAyNDUgMjU1IDEwMiAxNzMgMyAxNjYgMTIzIDE4MyAzMSA1NiAxMzQgMTY1IDI2MCAKKzExNiAyNTQgODEgXgorNTgzIDEgMTU3IDUwIDcxIDIyNSAyMSAxNjcgMTMzIDIxNyA0MiA0NyAyMDMgODkgMTgzIDEzMSAyOCAxOTMgNjUgMTE2IDEyMiA0MiAKKzIzNiA3IDI2OCA5MyAyNDIgMjAxIDg5IDEzOCAyMjkgMTI1IDIzOCA5NyAxMTcgNzUgNTUgMjY3IDIzMCAzMyAyNTAgNTAgMTExIDI0NSAKKzIxMyAxMjcgMTUzIDQ1IDk5IDE2MiAxMjEgMTM0IDEyNSA1NCAxNzUgMTk3IDI1OSAxNjYgMTY2IDEyNiAxMDYgMTg4IDUzIDMzIDIwNSAKKzE0OCAyMDggMTYgNzAgMTI4IDEwNiAyMzMgMTMwIDIxMCAxNjAgMTcgMjA3IDYzIDU3IDk3IDE1NyAxOTQgMjQ3IDEyOCAyNTAgMTM1IAorMTMyIDE2NSAyOSAxNiAxNTUgNTAgMjYgNDkgMTE4IDM3IDE2NSAyMTggOTQgNjAgMjM0IDEzNyA0NyAxNCAxMTAgMTAzIDIyMSAxOTEgCisxOTUgNzAgNDMgMTg0IDM5IDQwIDQ3IDU5IDEyIDYgMTc2IDYwIDE5NCAxMTcgMzAgMTUzIDkwIDEgMTY0IDc2IDMgMTI0IDEwMSAyNjEgCisxNjYgMzYgMjggOSAxNDMgMTk2IDMyIDE1MyAxMzUgMTc3IDY3IDMxIDI0NSAxMjMgNDkgMjQ4IDEzNSAyNjIgMjYzIDEyNiA2MSAxMiAKKzUxIDc4IDYyIDE0OSAyNjAgMjkgMTAxIDc3IDI0NCAxMTYgMjEyIDEyMCA0MiA5MiAxMDUgOTEgMTM4IDI3IDE0MSA1MiAyNjAgNzQgMyAKKzc5IDE5OSA4NCAyMTEgNjggMTI4IDYxIDU3IDIyNyAyNTUgMTcgMTggMjU5IDI1MSAxODcgNDYgMTk2IDc3IDU1IDM4IDEzMiAyMTAgCisyMDUgMTkzIDExMCAxOCAyNSAyNzEgMTA1IDE4MSAyMTYgMTc5IDExMiAyNTIgNTAgMjU1IDE0NyAxMTYgODIgMjIgMjE5IDQ3IDI0OCAKKzI2NSA4NiA4NiAxNzEgOTMgMTMgMTAzIDI2NiA5MyA5OCAyNSAxODYgMTgzIDg2IDEyNiAxNiAxMTAgMTQ4IDEyMyA5NCAxNTAgMzggCisyMTcgMTMyIDEyNSA5IDI3MyAyMCAzMCAxOTggMjY2IDE3OCAxMTkgMjE5IDIgNzIgODggMTMxIDExOCAxNzIgMTQ1IDI2IDEzNCA0MCAKKzEzMiA4MCAxMDcgOTYgNjUgMTYxIDI0IDQ0IDE5MSAxNTAgMTY4IDQxIDIyOSAxNzAgMTQwIDk5IDcyIDQzIDU0IDIxNSA0MiAyIDI3IAorMTg2IDIyOCAxNjMgMjkgMTQ2IDI1MyAxNDcgNzEgMTgwIDExOSAyNjQgMTc4IDI0OSA0MyA5OSAxMTcgMjE5IDIzMSAxNzAgMTg1IDEgCisyNDkgMjcyIDE5NyAyMTQgMjY0IDI2MyAxNzEgMjM3IDE4OSA2IDIyMSAyMzYgOTcgNzIgMTczIDE1MiAzOCA4NyAzNCAyOCAyMzggMjQxIAorMTkgNzcgMTAgMTM2IDIyOSAyNTUgNjIgMTk0IDE2MiAyMDYgNTYgNDUgMTQ0IDY0IDI0IDg5IDkzIDUzIDEyMyA5IDIyOCAxMTggMTI3IAorMjQzIDI0IDQgNzIgMTMzIDMzIDEyMCAxMjcgMTEzIDIwMCAxODEgMjcgMTAxIDMyIDY4IDIxMyAyNTcgMjUxIDQzIDE0NCAxOSAxMjIgCisxODYgMTM4IDE4NCAyMjMgNjEgMTQyIDE0OSAxNzUgMTA3IDYgMjYxIDgxIDExNCAyMDcgMTkzIDE1NSA5NSAyMDIgMjI2IDczIDE4MCAKKzE2NCAxNjYgODEgMjA0IDExIDk4IDY1IDIwNiAxMDEgMjIxIDE0NiAxOSAxNjcgODggNDEgMTM5IDkyIDIzNSAxODkgMjM1IDQ1IDU5IAorMTQyIDEwNCAyNzMgMTA1IDUxIDExOCA4MiA2NyAxMjEgNDkgMjAzIDIzMyA4NSAzNCAyNTcgNjIgNjQgNjQgMTA5IDExIDE4OCAxNDMgCisxMTEgMTEgNTggNDUgMTQgMjQwIDIwMSA0NCAyMzYgNTIgMTcwIDI3MCAxOTcgMTY5IDg4IDg2IDQxIDI2OSAxOTAgNTggMjM0IDkyIAorMTQ1IDExMSAxNTUgMTM1IDIyMiAyNDMgMjA4IDIwMCAyNjYgNDggMjEgMTIyIDIzMSA0MCA4NyAxNzggMjA0IDE0MSAxOTYgMTYyIDI1MSAKKzIzMiAyMjIgOTkgMzIgMjMgMzcgODAgMjIgMTc0IDE0NSA3MSAzNiAyMTcgODcgMjIzIDEwNiA0NCAxNTEgMTMwIDI1MCAxODAgMzQgNjggCisyNTggMTU5IDE1NCAyNzIgMTEyIDE4IDcwIDE3MyA4IDEzNiA4NSA3OSAxNTkgMjM5IDE5IDIwNyAxMDggMjMzIDExMiA2MyAyNDYgNzYgCisyMzcgMTA0IDg0IDEyNiAxNDYgMjA4IDI0NSAxNjggMjI1IDE1MSA5MCAyMzAgMjYyIDc0IDQ4IDE1NiAxMDIgMzkgODAgNjcgNzYgMTQ3IAorMjYgNCAyMTYgMzUgMzUgNzUgOTUgMTMgMTQ4IDE2OCAyNzAgNTMgMjY3IDE4NSAxMzEgNzMgOTUgMjQyIDcxIDI2NSA0MSAxODQgMjY4IAorMTM4IDE0NCAxMDQgNDQgNyAyMjggNzMgMjI1IDY2IDY5IDM2IDI3MiBeCis1ODggMCAxODEgNDQgMTQ5IDE3MyAxNTAgNzcgMTU4IDM2IDI1NSAxMDEgMTM1IDIzOSA2MCAxNDggMTg1IDg1IDk0IDI1MiA2IDQgMTMxIAorMTUyIDE1IDE2MiAxNjEgMTUwIDE0MiAxNCAxOTMgMjEgMTQxIDMgNzggMTY5IDQ0IDEwNyAxOTggMzEgMTE5IDE5OCA3MyA5NCAyMTAgCiszMSAxNjEgMTczIDE5MiA1MiAxIDE2MyA0NiA2NCAyMCAxMzAgMTY0IDIyNiA3MiAxNDggMjI3IDYwIDIxMyAyMTAgNzMgMTM2IDE4NSAKKzE1MCAxMTkgMTMzIDQ4IDIxMyAxNjggOTggMTI0IDIyNyA4MyAyNjMgNzkgMTU3IDEwOSA5MCAxMDQgNjEgMjAxIDE2OCA1NiAxNDkgCisyMTUgMTI1IDE5NiAxMTYgMjcyIDExMSAyNjIgMTMzIDY3IDEzOCAxNDIgMjQ4IDIxOCA5IDE4MyAyMTIgMjIyIDggMTUzIDMgMTIwIAorMTQ0IDE2MyA2NSAyNjUgMjcwIDQgODkgOCAxNzIgMjA0IDk0IDE4IDI1NyAxNiA4OSAyMTkgMTQ3IDIxNiA1MiA4NSAxMTMgMTc3IDI1NiAKKzE1NCAyMjUgMjEwIDExNSAxMTEgMjggMTA4IDE4NiA5NiAyMDkgMTA0IDEwMyAxNzYgMTEgMTQgMTA5IDcxIDEwIDg3IDUxIDc0IDEwNSAKKzQ5IDE1OSAyNTggNjkgNzIgMTkwIDIwMiAxNzkgMTcxIDEgMjA1IDIxIDc2IDI1NCAxOTcgMTI3IDExMSA3MCA4MyAyOSA1NCA2NyAxNTcgCis2NyAxMTUgOTIgMTAzIDEzNCAzNiAyIDE1MSA0IDQ3IDMzIDE2MCAyNDYgMjcgNTUgOTYgMTI1IDE1NCAxNDEgMjYwIDE1MyAxOTUgMTcwIAorMTMgMjQ3IDM4IDE3MCA1NSAyMjIgNTAgMTI4IDE1IDc4IDIxMSAxOSAyMjYgMTU2IDk4IDgyIDI1MiAyNDAgMjkgMTIgMjUgMjI0IDE5OSAKKzI1OSAyMDcgMjEyIDMwIDIzNCA4IDE5NSAyNTQgMjM5IDEwMiAxMjMgMjggNDMgMTYxIDEwOCAxNjcgMTcxIDIzNSAyMzAgMTc4IDExOCAKKzE4NyA2NSAyNDIgMjIwIDEzNSA1IDM1IDI2NyAxNDMgMTUyIDU3IDEzNyAxNzMgMTA4IDEwMiAxNDYgNzggMTg4IDI0NSA4MSA3MiAyMzIgCisxNzcgMjIgMTI5IDY4IDE2OCA3NSA3NCA4MiAyNzUgMTQgMTc0IDk2IDE2NyAxMjkgMjYwIDIxOCAyMjAgMTU4IDU1IDE4MCA3NSA5IDU3IAorMTEgMjQ4IDEzNCA1OSA1MiAyMCA4OCAyMCAyMTQgMTE0IDgxIDI2NCA2IDQ2IDEwNiAyNzEgMjQ5IDEyMiAxNyAzNSAzMyAxMTggMjcxIAorMTUgOTcgMTM2IDI2OSAxMDAgMjUwIDQ5IDE4MiAzMiAxMDcgMTU2IDU2IDEwNyAyNDAgNiAyMzggMTU2IDE0MCA1NyA5NSAxOTggOTYgCisxNDQgNzkgMTE1IDEzNCA3OCAxNDYgMjcwIDIzOCAxMTQgMTY1IDIxNCAxMzcgMTMxIDEzMyA5MCAxODggMTEgNTYgODQgMTkwIDEzNyAKKzE1NCAxODMgMjM1IDI3MiAxNTMgMjM3IDE0NSAyNSAyMDUgMjc0IDI2IDEwOSAxMTMgMTU0IDIwNiA5IDE0MSAyMzcgMTAzIDUwIDg2IAorNDAgNjYgMjUzIDIyOCAyNjMgMjcxIDIwNyAxNDcgNSA3NyAyNDIgMTU1IDExMCAxNyAyNjkgNTggMjc1IDM3IDIyNCAyNDEgMjUxIDEwMiAKKzE2NSAzIDE2MiAxMTkgMTc1IDIzIDU2IDEyNiAxNjUgMjU2IDExMiAyNTAgOTEgMTU3IDQ0IDY1IDIyMyAxOSAxNjEgMTMxIDIxNyA0MCAKKzQzIDIwMyA4MyAxNzkgMTI5IDI2IDE5MyA2MyAxMTYgMTIyIDM2IDIzNiA3IDI2OCA4OSAyNDIgMTk3IDg1IDEzNiAyMjcgMTI1IDIzOCAKKzkxIDExNSA2OSA1MyAyNjUgMjI4IDI5IDI0NiA1MCAxMDUgMjQxIDIwOSAxMjcgMTUzIDQ1IDk1IDE1NiAxMjEgMTMyIDEyMSA0OCAxNzEgCisxOTMgMjU1IDE2NiAxNjAgMTIwIDEwMiAxODggNTMgMzEgMjAzIDE0OCAyMDQgMTAgNjggMTI2IDEwMCAyMzEgMTI0IDIwOCAxNTggMTMgCisyMDUgNjMgNTEgOTcgMTU1IDE5NCAyNDMgMTI0IDI1MCAxMzMgMTMyIDE2MyAyMyAxNCAxNTEgNDYgMjIgNDUgMTE4IDM3IDE1OSAyMTYgCis5NCA2MCAyMzIgMTM1IDQ3IDEwIDExMCAxMDEgMjE5IDE4OSAxOTEgNjQgNDMgMTgwIDMzIDM0IDQ1IDUzIDEyIDIgMTc0IDU0IDE5MiAKKzExNyAyNiAxNTEgODggMjczIDE2NCA3NiAyNzMgMTIyIDEwMSAyNjEgMTY0IDM0IDIyIDMgMTQzIDE5NCAzMiAxNDkgMTMxIDE3NSA2NSAKKzMxIDI0NSAxMjMgNDcgMjQ0IDEzNSAyNTggMjYxIDEyMiA1OSAxMCA0NSA3NiA2MiAxNDcgMjU4IDI3IDk3IDcxIDI0NCAxMTIgMjA4IAorMTE2IDM4IDg2IDEwNSA5MSAxMzQgMjcwIDI3IDEzOSA0NiAyNTYgNzAgMjc1IDc5IDE5OSAxNjAgXgorNTk0IDAgMjA3IDU2IDEyOCA1MyA0OSAyMTkgMjUxIDE3IDYgMjU5IDI0NyAxODcgMzggMTg4IDczIDQ3IDI2IDEyOCAyMDIgMTk3IDE4OSAKKzEwMiAxOCAyMSAyNjMgOTcgMTczIDIxMiAxNzkgMTAwIDI1MiA0NiAyNTUgMTM5IDEwNCA4MiAxNCAyMTEgMzUgMjQ0IDI1NyA3NCA4MiAKKzE2MyA4MSA1IDk1IDI1OCA4OSA4NiAxMyAxODIgMTc5IDg2IDEyMiAxNiAxMDYgMTQwIDExOSA4NiAxNDIgMzQgMjA5IDEyMCAxMjEgMSAKKzI2NSAxMiAxOCAxOTAgMjY2IDE3MCAxMTkgMjE1IDI3MiA2NCA4MCAxMTkgMTA2IDE2MCAxMzcgMjYgMTIyIDM2IDEyNCA4MCA5OSA4OCAKKzU3IDE1NyAyNCA0NCAxOTEgMTQ2IDE1NiAyOSAyMjEgMTY2IDE0MCA5OSA2OCAzOSA1NCAyMDcgNDIgMjc2IDIzIDE3OCAyMjAgMTUxIAorMjEgMTM0IDI0NSAxNDMgNjMgMTgwIDExNSAyNTYgMTc0IDI0MSAzNSA5NSAxMDkgMjE5IDIzMSAxNjIgMTgxIDEgMjQ1IDI3MiAxOTMgCisyMTAgMjY0IDI1NSAxNTkgMjM3IDE4NSAyNzIgMjEzIDIyOCA4OSA3MiAxNjEgMTUyIDMwIDg3IDIyIDIwIDIzNCAyNDEgMTUgNzcgNiAKKzEyNCAyMjkgMjQ3IDU4IDE4NiAxNTggMjAyIDQ4IDQxIDEzMiA1MiAyMCA4NSA5MyA0NSAxMTEgNSAyMjQgMTEwIDExOSAyMzUgMTIgNCAKKzYwIDEyMSAyMSAxMjAgMTE1IDExMyAxOTIgMTgxIDE1IDk3IDI0IDY0IDIwOSAyNDkgMjUxIDMxIDEzNiAxMSAxMTggMTg2IDEzOCAxODQgCisyMjMgNjEgMTMwIDEzNyAxNzUgMTA3IDYgMjUzIDgxIDExNCAyMDcgMTg1IDE0MyA4MyAxOTggMjE4IDczIDE3NiAxNTYgMTU4IDczIAorMTk2IDExIDk4IDUzIDE5OCA4OSAyMjEgMTQ2IDcgMTU5IDg4IDM3IDEzOSA4NCAyMjcgMTg5IDIzMSAzMyA1MSAxMzQgOTYgMjczIDkzIAorNTEgMTE0IDc4IDU1IDExMyA0OSAxOTkgMjMzIDc3IDI2IDI1NyA1NCA2NCA2MCAxMDEgMyAxODAgMTM1IDExMSAyNzcgNTggMzcgMTAgCisyMzIgMTk3IDQwIDIzMiA0OCAxNzAgMjYyIDE5NyAxNjkgODQgNzggNDEgMjYxIDE4MiA1MCAyMzQgOTIgMTQ1IDEwNyAxNTUgMTIzIAorMjE0IDI0MyAyMDggMjAwIDI2MiA0OCAyMSAxMTQgMjI3IDQwIDgzIDE3OCAyMDAgMTMzIDE5NiAxNTQgMjQzIDIyOCAyMTggODcgMjggCisyMyAyOSA3MiAxOCAxNzAgMTMzIDY3IDI0IDIxMyA3OSAyMTkgMTAyIDMyIDE1MSAxMzAgMjQ2IDE3MiAzNCA2MCAyNTAgMTUxIDE1MCAKKzI2NCAxMTIgMTQgNjIgMTY1IDI3NCAxMjggNzMgNjcgMTU5IDIzMSAxOSAxOTkgMTA0IDIyNSAyNzQgMTA4IDU1IDI0MiA2NCAyMjkgCisxMDQgNzYgMTI2IDEzOCAyMDQgMjQxIDE2NCAyMjUgMTM5IDkwIDIzMCAyNjIgNjIgMzYgMTQ0IDk4IDM5IDY4IDU5IDcyIDE0NyAyMiAKKzIxNiAyMyAzNSA3NSA5MSAxIDEzNiAxNjAgMjY2IDQxIDI2NyAxODUgMTIzIDY1IDk1IDIzOCA3MSAyNjEgMzMgMTgwIDI2NCAxMjYgCisxNDQgOTIgMzYgMjczIDIyOCA2OSAyMTcgNTggNTcgMjggMTcyIDE3NyA0MiAxNDcgMTcxIDE0OCA3MSAxNTIgMzYgMjUzIDk1IDEyOSAKKzIzNyA1NiAxNDIgMTgzIDc5IDkwIDI1MCAyIDIgMTMxIDE0NiAxMyAxNjIgMTYxIDE0NiAxNDIgMTQgMTkxIDE3IDE0MSAyNzcgNzIgCisxNjcgNDAgMTAzIDE5NiAyNSAxMTMgMTk4IDY5IDg4IDIwNiAyNyAxNTcgMTczIDE5MiA0NiAyNzUgMTU3IDQ0IDYyIDE2IDEyNiAxNTggCisyMjIgNjYgMTQ0IDIyNyA1NCAyMTMgMjA4IDcxIDEzMiAxODEgMTUwIDExNSAxMjcgNDQgMjExIDE2NCA5NiAxMjQgMjIzIDgxIDI2MyAKKzc3IDE1NSAxMDkgODQgOTggNTkgMjAxIDE2MiA1MiAxNDkgMjE1IDEyMyAxOTQgMTEwIDI2OCAxMDUgMjYwIDEzMyA2MSAxMzYgMTQwIAorMjQ4IDIxNiA5IDE4MyAyMDggMjIwIDIgMTUxIDEgMTE2IDE0MiAxNjMgNjEgMjY1IDI3MCA4NyA4IDE2OCAyMDQgOTIgMTYgMjU1IDEwIAorODkgMjE1IDE0MyAyMTIgNTAgODUgMTA3IDE3NSAyNTYgMTU0IDIyMyAyMTAgMTE1IDEwNyAyNiAxMDggMTg0IDk0IDIwOSAxMDAgMTAzIAorMTc2IDcgMTAgMTAzIDY3IDEwIDgzIDQ5IDcwIDEwMyA0NyAxNTUgMjU4IDY5IDY4IDE4OCAyMDIgMTc3IDE3MSAyNzcgMjAxIDE5IDcwIAorMjUyIDE5NSAxMjUgMTA5IDcwIDgzIDI5IDUyIDY3IDE1MyA2NSAxMDkgOTAgMTAxIDEzMiAzMiAyIDE0NSAyNzYgNDMgMzMgMTYwIDI0NiAKKzIzIDI1OSBeCis2MDAgMSA4NyAxMTkgMTQ4IDEzMiAyNjAgMTQ0IDE4OSAxNjQgMTAgMjQ3IDM4IDE2NyA1NSAyMjIgNDQgMTI1IDYgNzIgMjExIDEzIAorMjI2IDE1MyA5MiA3OSAyNDYgMjM0IDI2IDYgMjUgMjIxIDE5MyAyNzMgMjU2IDIwMSAyMTIgMzAgMjI4IDIgMTk1IDI1NCAyMzkgOTkgCisxMTQgMjggMzQgMTU4IDk5IDE2NyAxNjggMjMyIDIyNCAxNzIgMTA5IDE4MSA2NSAyMzYgMjIwIDEyOSAyIDI5IDI2NCAxNDAgMTQ2IDU3IAorMTM3IDE2NyAxMDIgOTMgMTQzIDc4IDE4MiAyNDIgNzggNjkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDY2IDc0IDczIDI3NSA1IDE3NCA5MCAKKzE2NCAxMjMgMjU3IDIxOCAyMTQgMTU4IDUyIDE3NyA2OSA0OCAyIDI0MiAxMjUgNTkgNTIgMTEgNzkgMjAgMjE0IDEwNSA3MiAyNTggMyAKKzQ2IDEwNiAyNjggMjQ5IDExMyAxMSAzMiAzMCAxMTUgMjcxIDE1IDg4IDEzNiAyNjkgMTAwIDI0NCA0MCAxODIgMjkgOTggMTUwIDQ3IAorMTA0IDI0MCAyNzYgMjM1IDE1NiAxMzcgNTQgOTIgMTkyIDk2IDEzNSA3MyAxMDkgMTM0IDc1IDEzNyAyNjcgMjMyIDExMSAxNjIgMjA4IAorMTM0IDEyMiAxMjcgODcgMTg1IDggNTMgNzUgMTkwIDEyOCAxNTEgMTc3IDIzNSAyNjkgMTQ3IDIzNCAxMzkgMTYgMjA1IDI2OCAxNyAKKzEwMyAxMTAgMTQ1IDIwNiA2IDEzOCAyMzEgOTQgNDEgODAgMzEgNjYgMjUzIDIyMiAyNTcgMjY1IDIwNCAxMzggNSA3NCAyMzkgMTQ2IAorMTA0IDggMjY2IDU1IDI2OSAzNCAyMjQgMjM4IDI0OCAxMDIgMTU5IDMgMTU5IDExNiAxNjkgMTcgNTYgMTIwIDE2NSAyNTMgMTA5IDI0NyAKKzg1IDE1NyAzNSA1NiAyMjAgMTYgMTUyIDEyOCAyMTcgMzcgMzcgMjAzIDc0IDE3MyAxMjYgMjMgMTkzIDYwIDExNiAxMjIgMjcgMjM2IDcgCisyNjggODMgMjQyIDE5MSA3OSAxMzMgMjI0IDEyNSAyMzggODIgMTEyIDYwIDUwIDI2MiAyMjUgMjMgMjQwIDUwIDk2IDIzNSAyMDMgMTI3IAorMTUzIDQ1IDg5IDE0NyAxMjEgMTI5IDExNSAzOSAxNjUgMTg3IDI0OSAxNjYgMTUxIDExMSA5NiAxODggNTMgMjggMjAwIDE0OCAxOTggMSAKKzY1IDEyMyA5MSAyMjggMTE1IDIwNSAxNTUgNyAyMDIgNjMgNDIgOTcgMTUyIDE5NCAyMzcgMTE4IDI1MCAxMzAgMTMyIDE2MCAxNCAxMSAKKzE0NSA0MCAxNiAzOSAxMTggMzcgMTUwIDIxMyA5NCA2MCAyMjkgMTMyIDQ3IDQgMTEwIDk4IDIxNiAxODYgMTg1IDU1IDQzIDE3NCAyNCAKKzI1IDQyIDQ0IDEyIDI3NSAxNzEgNDUgMTg5IDExNyAyMCAxNDggODUgMjcwIDE2NCA3NiAyNjcgMTE5IDEwMSAyNjEgMTYxIDMxIDEzIAorMjczIDE0MyAxOTEgMzIgMTQzIDEyNSAxNzIgNjIgMzEgMjQ1IDEyMyA0NCAyMzggMTM1IDI1MiAyNTggMTE2IDU2IDcgMzYgNzMgNjIgCisxNDQgMjU1IDI0IDkxIDYyIDI0NCAxMDYgMjAyIDExMCAzMiA3NyAxMDUgOTEgMTI4IDI2NCAyNyAxMzYgMzcgMjUwIDY0IDI3MiA3OSAKKzE5OSA4NCAyMDYgNTMgMTI4IDUxIDQ3IDIxNyAyNTAgMTcgMyAyNTkgMjQ2IDE4NyAzNiAxODYgNzIgNDUgMjMgMTI3IDIwMCAxOTUgCisxODggMTAwIDE4IDIwIDI2MSA5NSAxNzEgMjExIDE3OSA5NyAyNTIgNDUgMjU1IDEzNyAxMDEgODIgMTIgMjA5IDMyIDI0MyAyNTUgNzEgCis4MSAxNjEgNzggMyA5MyAyNTYgODggODMgMTAgMTgxIDE3OCA4NiAxMjEgMTYgMTA1IDEzOCAxMTggODQgMTQwIDMzIDIwNyAxMTcgMTIwIAorMjc4IDI2MyAxMCAxNSAxODggMjY2IDE2OCAxMTkgMjE0IDI3MSA2MiA3OCAxMTYgMTAzIDE1NyAxMzUgMjYgMTE5IDM1IDEyMiA4MCA5NyAKKzg2IDU1IDE1NiAyNCA0NCAxOTEgMTQ1IDE1MyAyNiAyMTkgMTY1IDE0MCA5OSA2NyAzOCA1NCAyMDUgNDIgMjc2IDIyIDE3NiAyMTggCisxNDggMTkgMTMxIDI0MyAxNDIgNjEgMTgwIDExNCAyNTQgMTczIDIzOSAzMyA5NCAxMDcgMjE5IDIzMSAxNjAgMTgwIDEgMjQ0IDI3MiAKKzE5MiAyMDkgMjY0IDI1MyAxNTYgMjM3IDE4NCAyNzAgMjExIDIyNiA4NyA3MiAxNTggMTUyIDI4IDg3IDE5IDE4IDIzMyAyNDEgMTQgNzcgCis1IDEyMSAyMjkgMjQ1IDU3IDE4NCAxNTcgMjAxIDQ2IDQwIDEyOSA0OSAxOSA4NCA5MyA0MyAxMDggNCAyMjMgMTA4IDExNyAyMzMgOSA0IAorNTcgMTE4IDE4IDEyMCAxMTIgMTEzIDE5MCAxODEgMTIgOTYgMjIgNjMgMjA4IDI0NyAyNTEgMjggMTM0IDkgMTE3IDE4NiAxMzggMTg0IAorMjIzIDYxIDEyNyAyMTYgXgorNTkwIDEgMTc1IDEwNyA2IDI0NyA4MSAxMTQgMjA3IDE3OSAxMzQgNzQgMTk1IDIxMiA3MyAxNzMgMTUwIDE1MiA2NyAxOTAgMTEgOTggCis0NCAxOTIgODAgMjIxIDE0NiAyNzkgMTUzIDg4IDM0IDEzOSA3OCAyMjEgMTg5IDIyOCAyNCA0NSAxMjggOTAgMjczIDg0IDUxIDExMSAKKzc1IDQ2IDEwNyA0OSAxOTYgMjMzIDcxIDIwIDI1NyA0OCA2NCA1NyA5NSAyNzggMTc0IDEyOSAxMTEgMjcxIDU4IDMxIDcgMjI2IDE5NCAKKzM3IDIyOSA0NSAxNzAgMjU2IDE5NyAxNjkgODEgNzIgNDEgMjU1IDE3NiA0NCAyMzQgOTIgMTQ1IDEwNCAxNTUgMTE0IDIwOCAyNDMgCisyMDggMjAwIDI1OSA0OCAyMSAxMDggMjI0IDQwIDgwIDE3OCAxOTcgMTI3IDE5NiAxNDggMjM3IDIyNSAyMTUgNzggMjUgMjMgMjMgNjYgCisxNSAxNjcgMTI0IDY0IDE1IDIxMCA3MyAyMTYgOTkgMjMgMTUxIDEzMCAyNDMgMTY2IDM0IDU0IDI0NCAxNDUgMTQ3IDI1OCAxMTIgMTEgCis1NiAxNTkgMjY4IDEyMiA2NCA1OCAxNTkgMjI1IDE5IDE5MyAxMDEgMjE5IDI3NCAxMDUgNDkgMjM5IDU1IDIyMyAxMDQgNzAgMTI2IAorMTMyIDIwMSAyMzggMTYxIDIyNSAxMzAgOTAgMjMwIDI2MiA1MyAyNyAxMzUgOTUgMzkgNTkgNTMgNjkgMTQ3IDE5IDI3OCAyMTYgMTQgCiszNSA3NSA4OCAyNzMgMTI3IDE1NCAyNjMgMzIgMjY3IDE4NSAxMTcgNTkgOTUgMjM1IDcxIDI1OCAyNyAxNzcgMjYxIDExNyAxNDQgODMgCiszMCAyNjcgMjI4IDY2IDIxMSA1MiA0OCAyMiAxNzIgMTcxIDM5IDE0NCAxNjggMTQ1IDYyIDE0MyAzNiAyNTAgODYgMTIwIDIzNCA1MCAKKzEzMyAxODAgNzAgODQgMjQ3IDI3NyAyODAgMTMxIDEzNyAxMCAxNjIgMTYxIDE0MCAxNDIgMTQgMTg4IDExIDE0MSAyNzQgNjMgMTY0IAorMzQgOTcgMTkzIDE2IDEwNCAxOTggNjMgNzkgMjAwIDIxIDE1MSAxNzMgMTkyIDM3IDI3MiAxNDggNDEgNTkgMTAgMTIwIDE0OSAyMTYgCis1NyAxMzggMjI3IDQ1IDIxMyAyMDUgNjggMTI2IDE3NSAxNTAgMTA5IDExOCAzOCAyMDggMTU4IDkzIDEyNCAyMTcgNzggMjYzIDc0IAorMTUyIDEwOSA3NSA4OSA1NiAyMDEgMTUzIDQ2IDE0OSAyMTUgMTIwIDE5MSAxMDEgMjYyIDk2IDI1NyAxMzMgNTIgMTMzIDEzNyAyNDggCisyMTMgOSAxODMgMjAyIDIxNyAyNzQgMTQ4IDI3OSAxMTAgMTM5IDE2MyA1NSAyNjUgMjcwIDI3NSA4NCA4IDE2MiAyMDQgODkgMTMgMjUyIAorMSA4OSAyMDkgMTM3IDIwNiA0NyA4NSA5OCAxNzIgMjU2IDE1NCAyMjAgMjEwIDExNSAxMDEgMjMgMTA4IDE4MSA5MSAyMDkgOTQgMTAzIAorMTc2IDEgNCA5NCA2MSAxMCA3NyA0NiA2NCAxMDAgNDQgMTQ5IDI1OCA2OSA2MiAxODUgMjAyIDE3NCAxNzEgMjc3IDE5NSAxNiA2MSAKKzI0OSAxOTIgMTIyIDEwNiA3MCA4MyAyOSA0OSA2NyAxNDcgNjIgMTAwIDg3IDk4IDEyOSAyNiAyIDEzNiAyNzAgMzcgMzMgMTYwIDI0NiAKKzE3IDQwIDgxIDExNSAxNDQgMTI2IDI2MCAxMzggMTg1IDE2MCA4IDI0NyAzOCAxNjUgNTUgMjIyIDQwIDEyMyA2OCAyMTEgOSAyMjYgCisxNTEgODggNzcgMjQyIDIzMCAyNCAyIDI1IDIxOSAxODkgMjcxIDI1NCAxOTcgMjEyIDMwIDIyNCAyNzkgMTk1IDI1NCAyMzkgOTcgMTA4IAorMjggMjggMTU2IDkzIDE2NyAxNjYgMjMwIDIyMCAxNjggMTAzIDE3NyA2NSAyMzIgMjIwIDEyNSAyNSAyNjIgMTM4IDE0MiA1NyAxMzcgCisxNjMgOTggODcgMTQxIDc4IDE3OCAyNDAgNzYgNjcgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDYwIDc0IDY3IDI3NSAyODAgMTc0IDg2IAorMTYyIDExOSAyNTUgMjE4IDIxMCAxNTggNTAgMTc1IDY1IDI3NSA0MiAyNzcgMjM4IDExOSA1OSA1MiA1IDczIDIwIDIxNCA5OSA2NiAKKzI1NCAxIDQ2IDEwNiAyNjYgMjQ5IDEwNyA3IDMwIDI4IDExMyAyNzEgMTUgODIgMTM2IDI2OSAxMDAgMjQwIDM0IDE4MiAyNyA5MiAxNDYgCis0MSAxMDIgMjQwIDI3MiAyMzMgMTU2IDEzNSA1MiA5MCAxODggOTYgMTI5IDY5IDEwNSAxMzQgNzMgMTMxIDI2NSAyMjggMTA5IDE2MCAKKzIwNCAxMzIgMTE2IDEyMyA4NSAxODMgNiA1MSA2OSAxOTAgMTIyIDE0OSAxNzMgMjM1IDI2NyAxNDMgMjMyIDEzNSAxMCAyMDUgMjY0IAorMTEgOTkgMTA4IDEzOSAyMDYgNCAxMzYgMjI3IDg4IDM1IDc2IDI1IDY2IDI1MyAyMTggMjUzIDI2MSAyMDIgMTMyIDUgNzIgMjM3IDE0MCAKKzIwMyBeCis2MjAgMCAyNzkgMjYyIDUxIDI2MSAzMCAyMjQgMjM0IDI0NCAxMDIgMTUxIDMgMTU1IDExMiAxNjEgOSA1NiAxMTIgMTY1IDI0OSAxMDUgCisyNDMgNzcgMTU3IDIzIDQ0IDIxNiAxMiAxNDAgMTI0IDIxNyAzMyAyOSAyMDMgNjIgMTY1IDEyMiAxOSAxOTMgNTYgMTE2IDEyMiAxNSAKKzIzNiA3IDI2OCA3NSAyNDIgMTgzIDcxIDEyOSAyMjAgMTI1IDIzOCA3MCAxMDggNDggNDYgMjU4IDIyMSAxNSAyMzIgNTAgODQgMjI3IAorMTk1IDEyNyAxNTMgNDUgODEgMTM1IDEyMSAxMjUgMTA3IDI3IDE1NyAxNzkgMjQxIDE2NiAxMzkgOTkgODggMTg4IDUzIDI0IDE5NiAKKzE0OCAxOTAgMjcyIDYxIDExOSA3OSAyMjQgMTAzIDIwMSAxNTEgMjgyIDE5OCA2MyAzMCA5NyAxNDggMTk0IDIyOSAxMTAgMjUwIDEyNiAKKzEzMiAxNTYgMiA3IDEzNyAzMiA4IDMxIDExOCAzNyAxMzggMjA5IDk0IDYwIDIyNSAxMjggNDcgMjc5IDExMCA5NCAyMTIgMTgyIDE3NyAKKzQzIDQzIDE2NiAxMiAxMyAzOCAzMiAxMiAyNzEgMTY3IDMzIDE4NSAxMTcgMTIgMTQ0IDgxIDI2NiAxNjQgNzYgMjU5IDExNSAxMDEgCisyNjEgMTU3IDI3IDEgMjY1IDE0MyAxODcgMzIgMTM1IDExNyAxNjggNTggMzEgMjQ1IDEyMyA0MCAyMzAgMTM1IDI0NCAyNTQgMTA4IDUyIAorMyAyNCA2OSA2MiAxNDAgMjUxIDIwIDgzIDUwIDI0NCA5OCAxOTQgMTAyIDI0IDY1IDEwNSA5MSAxMjAgMjU2IDI3IDEzMiAyNSAyNDIgCis1NiAyNjggNzkgMTk5IDg0IDIwMiA0MSAxMjggNDMgMzkgMjA5IDI0NiAxNyAyNzQgMjU5IDI0MiAxODcgMjggMTc4IDY4IDM3IDExIAorMTIzIDE5MiAxODcgMTg0IDkyIDE4IDE2IDI1MyA4NyAxNjMgMjA3IDE3OSA4NSAyNTIgNDEgMjU1IDEyOSA4OSA4MiA0IDIwMSAyMCAKKzIzOSAyNDcgNTkgNzcgMTUzIDY2IDI3OCA4NSAyNDggODQgNzEgMjgxIDE3NyAxNzQgODYgMTE3IDE2IDEwMSAxMzAgMTE0IDc2IDEzMiAKKzI5IDE5OSAxMDUgMTE2IDI3NCAyNTUgMiAzIDE4MCAyNjYgMTYwIDExOSAyMTAgMjY3IDU0IDcwIDEwNCA5MSAxNDUgMTI3IDI2IDEwNyAKKzMxIDExNCA4MCA4OSA3OCA0NyAxNTIgMjQgNDQgMTkxIDE0MSAxNDEgMTQgMjExIDE2MSAxNDAgOTkgNjMgMzQgNTQgMTk3IDQyIDI3NiAKKzE4IDE2OCAyMTAgMTM2IDExIDExOSAyMzUgMTM4IDUzIDE4MCAxMTAgMjQ2IDE2OSAyMzEgMjUgOTAgOTkgMjE5IDIzMSAxNTIgMTc2IDEgCisyNDAgMjcyIDE4OCAyMDUgMjY0IDI0NSAxNDQgMjM3IDE4MCAyNjIgMjAzIDIxOCA3OSA3MiAxNDYgMTUyIDIwIDg3IDcgMTAgMjI5IAorMjQxIDEwIDc3IDEgMTA5IDIyOSAyMzcgNTMgMTc2IDE1MyAxOTcgMzggMzYgMTE3IDM3IDE1IDgwIDkzIDM1IDk2IDIxOSAxMDAgMTA5IAorMjI1IDI4MCA0IDQ1IDEwNiA2IDEyMCAxMDAgMTEzIDE4MiAxODEgOTIgMTQgNTkgMjA0IDIzOSAyNTEgMTYgMTI2IDEgMTEzIDE4NiAKKzEzOCAxODQgMjIzIDYxIDExNSAxMjIgMTc1IDEwNyA2IDI0MyA4MSAxMTQgMjA3IDE3NSAxMjggNjggMTkzIDIwOCA3MyAxNzEgMTQ2IAorMTQ4IDYzIDE4NiAxMSA5OCAzOCAxODggNzQgMjIxIDE0NiAyNzUgMTQ5IDg4IDMyIDEzOSA3NCAyMTcgMTg5IDIyNiAxOCA0MSAxMjQgCis4NiAyNzMgNzggNTEgMTA5IDczIDQwIDEwMyA0OSAxOTQgMjMzIDY3IDE2IDI1NyA0NCA2NCA1NSA5MSAyNzYgMTcwIDEyNSAxMTEgMjY3IAorNTggMjcgNSAyMjIgMTkyIDM1IDIyNyA0MyAxNzAgMjUyIDE5NyAxNjkgNzkgNjggNDEgMjUxIDE3MiA0MCAyMzQgOTIgMTQ1IDEwMiAKKzE1NSAxMDggMjA0IDI0MyAyMDggMjAwIDI1NyA0OCAyMSAxMDQgMjIyIDQwIDc4IDE3OCAxOTUgMTIzIDE5NiAxNDQgMjMzIDIyMyAyMTMgCis3MiAyMyAyMyAxOSA2MiAxMyAxNjUgMTE4IDYyIDkgMjA4IDY5IDIxNCA5NyAxNyAxNTEgMTMwIDI0MSAxNjIgMzQgNTAgMjQwIDE0MSAKKzE0NSAyNTQgMTEyIDkgNTIgMTU1IDI2NCAxMTggNTggNTIgMTU5IDIyMSAxOSAxODkgOTkgMjE1IDI3NCAxMDMgNDUgMjM3IDQ5IDIxOSAKKzEwNCA2NiAxMjYgMTI4IDE5OSAyMzYgMTU5IDIyNSAxMjQgOTAgMjMwIDI2MiA0NyAyMSAxMjkgOTMgMzkgNTMgNDkgNjcgMTQ3IDE3IAorMjc4IDIxNiA4IDM1IDc1IDg2IDI2OSAxMjEgMTUwIDI2MSAyNiAyNjcgMTg1IDExMyA1NSA5NSAyMzMgNzEgMjU2IDIzIDE3NSAyNTkgCisxMTEgMTQ0IDc3IDI2IDI2MyAyMjggNjQgMjA3IDQ4IDQyIDE4IDE3MiAxNjcgMzcgMTQyIDE2NiAxNDMgNTYgMTM3IDM2IDI0OCA4MCAKKzExNCAyMzIgNDYgMTI3IDI1NyBeCis2MDUgMSA1OCA3NiAyNDMgMjczIDI4MCAxMzEgMTI1IDYgMTYyIDE2MSAxMzIgMTQyIDE0IDE4NCAzIDE0MSAyNzAgNTEgMTYwIDI2IDg5IAorMTg5IDQgOTIgMTk4IDU1IDY3IDE5MiAxMyAxNDMgMTczIDE5MiAyNSAyNjggMTM2IDM3IDU1IDIgMTEyIDEzNyAyMDggNDUgMTMwIDIyNyAKKzMzIDIxMyAyMDEgNjQgMTE4IDE2NyAxNTAgMTAxIDEwNiAzMCAyMDQgMTUwIDg5IDEyNCAyMDkgNzQgMjYzIDcwIDE0OCAxMDkgNjMgNzcgCis1MiAyMDEgMTQxIDM4IDE0OSAyMTUgMTE2IDE4NyA4OSAyNTQgODQgMjUzIDEzMyA0MCAxMjkgMTMzIDI0OCAyMDkgOSAxODMgMTk0IAorMjEzIDI2NiAxNDQgMjc5IDEwMiAxMzUgMTYzIDQ3IDI2NSAyNzAgMjcxIDgwIDggMTU0IDIwNCA4NSA5IDI0OCAyNzQgODkgMjAxIDEyOSAKKzE5OCA0MyA4NSA4NiAxNjggMjU2IDE1NCAyMTYgMjEwIDExNSA5MyAxOSAxMDggMTc3IDg3IDIwOSA4NiAxMDMgMTc2IDI3OCAyODEgODIgCis1MyAxMCA2OSA0MiA1NiA5NiA0MCAxNDEgMjU4IDY5IDU0IDE4MSAyMDIgMTcwIDE3MSAyNzcgMTg3IDEyIDQ5IDI0NSAxODggMTE4IAorMTAyIDcwIDgzIDI5IDQ1IDY3IDEzOSA1OCA4OCA4MyA5NCAxMjUgMTggMiAxMjQgMjYyIDI5IDMzIDE2MCAyNDYgOSAyOCA2OSAxMDcgCisxMzYgMTE0IDI2MCAxMjYgMTc3IDE1MiA0IDI0NyAzOCAxNjEgNTUgMjIyIDMyIDExOSAyNzMgNjAgMjExIDEgMjI2IDE0NyA4MCA3MyAKKzIzNCAyMjIgMjAgMjc5IDI1IDIxNSAxODEgMjY3IDI1MCAxODkgMjEyIDMwIDIxNiAyNzUgMTk1IDI1NCAyMzkgOTMgOTYgMjggMTYgCisxNTIgODEgMTY3IDE2MiAyMjYgMjEyIDE2MCA5MSAxNjkgNjUgMjI0IDIyMCAxMTcgMjgxIDE3IDI1OCAxMzQgMTM0IDU3IDEzNyAxNTUgCis5MCA3NSAxMzcgNzggMTcwIDIzNiA3MiA2MyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNDggNzQgNTUgMjc1IDI3MiAxNzQgNzggMTU4IAorMTExIDI1MSAyMTggMjAyIDE1OCA0NiAxNzEgNTcgMjY3IDMwIDI2OSAyMzAgMTA3IDU5IDUyIDI3OCA2MSAyMCAyMTQgODcgNTQgMjQ2IAorMjgyIDQ2IDEwNiAyNjIgMjQ5IDk1IDI4NCAyNiAyNCAxMDkgMjcxIDE1IDcwIDEzNiAyNjkgMTAwIDIzMiAyMiAxODIgMjMgODAgMTM4IAorMjkgOTggMjQwIDI2NCAyMjkgMTU2IDEzMSA0OCA4NiAxODAgOTYgMTE3IDYxIDk3IDEzNCA2OSAxMTkgMjYxIDIyMCAxMDUgMTU2IDE5NiAKKzEyOCAxMDQgMTE1IDgxIDE3OSAyIDQ3IDU3IDE5MCAxMTAgMTQ1IDE2NSAyMzUgMjYzIDEzNSAyMjggMTI3IDI4MyAyMDUgMjU2IDI4NCAKKzkxIDEwNCAxMjcgMjA2IDEzMiAyMTkgNzYgMjMgNjggMTMgNjYgMjUzIDIxMCAyNDUgMjUzIDE5OCAxMjAgNSA2OCAyMzMgMTI4IDkyIAorMjc1IDI2MCA0OSAyNTcgMjggMjI0IDIzMiAyNDIgMTAyIDE0NyAzIDE1MyAxMTAgMTU3IDUgNTYgMTA4IDE2NSAyNDcgMTAzIDI0MSA3MyAKKzE1NyAxNyAzOCAyMTQgMTAgMTM0IDEyMiAyMTcgMzEgMjUgMjAzIDU2IDE2MSAxMjAgMTcgMTkzIDU0IDExNiAxMjIgOSAyMzYgNyAyNjggCis3MSAyNDIgMTc5IDY3IDEyNyAyMTggMTI1IDIzOCA2NCAxMDYgNDIgNDQgMjU2IDIxOSAxMSAyMjggNTAgNzggMjIzIDE5MSAxMjcgMTUzIAorNDUgNzcgMTI5IDEyMSAxMjMgMTAzIDIxIDE1MyAxNzUgMjM3IDE2NiAxMzMgOTMgODQgMTg4IDUzIDIyIDE5NCAxNDggMTg2IDI2OCA1OSAKKzExNyA3MyAyMjIgOTcgMTk5IDE0OSAyODAgMTk2IDYzIDI0IDk3IDE0NiAxOTQgMjI1IDEwNiAyNTAgMTI0IDEzMiAxNTQgMjgxIDUgCisxMzMgMjggNCAyNyAxMTggMzcgMTMyIDIwNyA5NCA2MCAyMjMgMTI2IDQ3IDI3NyAxMTAgOTIgMjEwIDE4MCAxNzMgMzcgNDMgMTYyIDYgCis3IDM2IDI2IDEyIDI2OSAxNjUgMjcgMTgzIDExNyA4IDE0MiA3OSAyNjQgMTY0IDc2IDI1NSAxMTMgMTAxIDI2MSAxNTUgMjUgMjgwIAorMjYxIDE0MyAxODUgMzIgMTMxIDExMyAxNjYgNTYgMzEgMjQ1IDEyMyAzOCAyMjYgMTM1IDI0MCAyNTIgMTA0IDUwIDEgMTggNjcgNjIgCisxMzggMjQ5IDE4IDc5IDQ0IDI0NCA5NCAxOTAgOTggMjAgNTkgMTA1IDkxIDExNiAyNTIgMjcgMTMwIDE5IDIzOCA1MiAyNjYgNzkgMTk5IAorODQgMjAwIDM1IDEyOCAzOSAzNSAyMDUgMjQ0IDE3IDI3MCAyNTkgMjQwIDE4NyAyNCAxNzQgNjYgMzMgNSAxMjEgMTg4IDE4MyAxODIgCis4OCAxOCAxNCAyNDkgODMgMTU5IDIwNSAxNzkgNzkgMjUyIDE4NiBeCis2MTUgMCAyNTUgMTIxIDc3IDgyIDI4MyAxOTMgOCAyMzUgMjM5IDQ3IDczIDE0NSA1NCAyNzQgNzcgMjQwIDgwIDU5IDI3MyAxNzMgMTcwIAorODYgMTEzIDE2IDk3IDEyMiAxMTAgNjggMTI0IDI1IDE5MSA5MyAxMTIgMjcwIDI0NyAyODEgMjc4IDE3MiAyNjYgMTUyIDExOSAyMDYgCisyNjMgNDYgNjIgOTIgNzkgMTMzIDExOSAyNiA5NSAyNyAxMDYgODAgODEgNzAgMzkgMTQ4IDI0IDQ0IDE5MSAxMzcgMTI5IDIgMjAzIAorMTU3IDE0MCA5OSA1OSAzMCA1NCAxODkgNDIgMjc2IDE0IDE2MCAyMDIgMTI0IDMgMTA3IDIyNyAxMzQgNDUgMTgwIDEwNiAyMzggMTY1IAorMjIzIDE3IDg2IDkxIDIxOSAyMzEgMTQ0IDE3MiAxIDIzNiAyNzIgMTg0IDIwMSAyNjQgMjM3IDEzMiAyMzcgMTc2IDI1NCAxOTUgMjEwIAorNzEgNzIgMTM0IDE1MiAxMiA4NyAyODIgMiAyMjUgMjQxIDYgNzcgMjg0IDk3IDIyOSAyMjkgNDkgMTY4IDE0OSAxOTMgMzAgMzIgMTA1IAorMjUgMTEgNzYgOTMgMjcgODQgMjgzIDIxNSA5MiAxMDEgMjE3IDI3MiA0IDMzIDk0IDI4MSAxMjAgODggMTEzIDE3NCAxODEgMjc1IDg4IAorNiA1NSAyMDAgMjMxIDI1MSA0IDExOCAyODAgMTA5IDE4NiAxMzggMTg0IDIyMyA2MSAxMDMgMTEwIDE3NSAxMDcgNiAyMzUgODEgMTE0IAorMjA3IDE2NyAxMTYgNTYgMTg5IDIwMCA3MyAxNjcgMTM4IDE0MCA1NSAxNzggMTEgOTggMjYgMTgwIDYyIDIyMSAxNDYgMjY3IDE0MSA4OCAKKzI4IDEzOSA2NiAyMDkgMTg5IDIyMiA2IDMzIDExNiA3OCAyNzMgNjYgNTEgMTA1IDY5IDI4IDk1IDQ5IDE5MCAyMzMgNTkgOCAyNTcgMzYgCis2NCA1MSA4MyAyNzIgMTYyIDExNyAxMTEgMjU5IDU4IDE5IDEgMjE0IDE4OCAzMSAyMjMgMzkgMTcwIDI0NCAxOTcgMTY5IDc1IDYwIDQxIAorMjQzIDE2NCAzMiAyMzQgOTIgMTQ1IDk4IDE1NSA5NiAxOTYgMjQzIDIwOCAyMDAgMjUzIDQ4IDIxIDk2IDIxOCA0MCA3NCAxNzggMTkxIAorMTE1IDE5NiAxMzYgMjI1IDIxOSAyMDkgNjAgMTkgMjMgMTEgNTQgOSAxNjEgMTA2IDU4IDI4NCAyMDQgNjEgMjEwIDkzIDUgMTUxIDEzMCAKKzIzNyAxNTQgMzQgNDIgMjMyIDEzMyAxNDEgMjQ2IDExMiA1IDQ0IDE0NyAyNTYgMTEwIDQ2IDQwIDE1OSAyMTMgMTkgMTgxIDk1IDIwNyAKKzI3NCA5OSAzNyAyMzMgMzcgMjExIDEwNCA1OCAxMjYgMTIwIDE5NSAyMzIgMTU1IDIyNSAxMTIgOTAgMjMwIDI2MiAzNSA5IDExNyA4OSAKKzM5IDQxIDQxIDYzIDE0NyAxMyAyNzggMjE2IDI4MyAzNSA3NSA4MiAyNjEgMTA5IDE0MiAyNTcgMTQgMjY3IDE4NSAxMDUgNDcgOTUgCisyMjkgNzEgMjUyIDE1IDE3MSAyNTUgOTkgMTQ0IDY1IDE4IDI1NSAyMjggNjAgMTk5IDQwIDMwIDEwIDE3MiAxNTkgMzMgMTM4IDE2MiAKKzEzOSA0NCAxMjUgMzYgMjQ0IDY4IDEwMiAyMjggMzggMTE1IDE3NCA1MiA3MiAyNDEgMjcxIDI4MCAxMzEgMTE5IDQgMTYyIDE2MSAxMjggCisxNDIgMTQgMTgyIDI4NiAxNDEgMjY4IDQ1IDE1OCAyMiA4NSAxODcgMjg1IDg2IDE5OCA1MSA2MSAxODggOSAxMzkgMTczIDE5MiAxOSAKKzI2NiAxMzAgMzUgNTMgMjg1IDEwOCAxMzEgMjA0IDM5IDEyNiAyMjcgMjcgMjEzIDE5OSA2MiAxMTQgMTYzIDE1MCA5NyAxMDAgMjYgCisyMDIgMTQ2IDg3IDEyNCAyMDUgNzIgMjYzIDY4IDE0NiAxMDkgNTcgNzEgNTAgMjAxIDEzNSAzNCAxNDkgMjE1IDExNCAxODUgODMgMjUwIAorNzggMjUxIDEzMyAzNCAxMjcgMTMxIDI0OCAyMDcgOSAxODMgMTkwIDIxMSAyNjIgMTQyIDI3OSA5OCAxMzMgMTYzIDQzIDI2NSAyNzAgCisyNjkgNzggOCAxNTAgMjA0IDgzIDcgMjQ2IDI3MCA4OSAxOTcgMTI1IDE5NCA0MSA4NSA4MCAxNjYgMjU2IDE1NCAyMTQgMjEwIDExNSAKKzg5IDE3IDEwOCAxNzUgODUgMjA5IDgyIDEwMyAxNzYgMjc2IDI3OSA3NiA0OSAxMCA2NSA0MCA1MiA5NCAzOCAxMzcgMjU4IDY5IDUwIAorMTc5IDIwMiAxNjggMTcxIDI3NyAxODMgMTAgNDMgMjQzIDE4NiAxMTYgMTAwIDcwIDgzIDI5IDQzIDY3IDEzNSA1NiA4MiA4MSA5MiAKKzEyMyAxNCAyIDExOCAyNTggMjUgMzMgMTYwIDI0NiA1IDIyIDYzIDEwMyAxMzIgMTA4IDI2MCAxMjAgMTczIDE0OCAyIDI0NyAzOCAxNTkgCis1NSAyMjIgMjggMTE3IDI2OSA1NiAyMTEgMjg0IDIyNiAxNDUgNzYgNzEgMjMwIDIxOCAxOCAyNzcgMjUgMjEzIDE3NyAyNjUgMjQ4IAorMTg1IDIxMiAzMCAyMTIgMjczIDE5NSAyNTQgMjM5IDkxIDkwIDI4IDEwIDE1MCA3NSAxNjcgMTYwIDIyNCAxNzUgXgorNjEzIDAgMTUyIDc5IDE2MSA2NSAyMTYgMjIwIDEwOSAyODEgOSAyNTQgMTMwIDEyNiA1NyAxMzcgMTQ3IDgyIDYzIDEzMyA3OCAxNjIgCisyMzIgNjggNTkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDM2IDc0IDQzIDI3NSAyNjQgMTc0IDcwIDE1NCAxMDMgMjQ3IDIxOCAxOTQgMTU4IAorNDIgMTY3IDQ5IDI1OSAxOCAyNjEgMjIyIDk1IDU5IDUyIDI3MCA0OSAyMCAyMTQgNzUgNDIgMjM4IDI4MiA0NiAxMDYgMjU4IDI0OSA4MyAKKzI4MCAyMiAyMCAxMDUgMjcxIDE1IDU4IDEzNiAyNjkgMTAwIDIyNCAxMCAxODIgMTkgNjggMTMwIDE3IDk0IDI0MCAyNTYgMjI1IDE1NiAKKzEyNyA0NCA4MiAxNzIgOTYgMTA1IDUzIDg5IDEzNCA2NSAxMDcgMjU3IDIxMiAxMDEgMTUyIDE4OCAxMjQgOTIgMTA3IDc3IDE3NSAyODcgCis0MyA0NSAxOTAgOTggMTQxIDE1NyAyMzUgMjU5IDEyNyAyMjQgMTE5IDI3NSAyMDUgMjQ4IDI3NiA4MyAxMDAgMTE1IDIwNiAyODUgMTI4IAorMjExIDY0IDExIDYwIDEgNjYgMjUzIDIwMiAyMzcgMjQ1IDE5NCAxMDggNSA2NCAyMjkgMTE2IDg0IDI2NyAyNTYgNDUgMjQ5IDI0IDIyNCAKKzIyOCAyMzggMTAyIDEzOSAzIDE0OSAxMDYgMTQ5IDI4NiA1NiAxMDAgMTY1IDI0MyA5OSAyMzcgNjUgMTU3IDUgMjYgMjEwIDYgMTIyIAorMTE4IDIxNyAyNyAxNyAyMDMgNDQgMTUzIDExNiAxMyAxOTMgNTAgMTE2IDEyMiAyODYgMjM2IDcgMjY4IDYzIDI0MiAxNzEgNTkgMTIzIAorMjE0IDEyNSAyMzggNTIgMTAyIDMwIDQwIDI1MiAyMTUgMyAyMjAgNTAgNjYgMjE1IDE4MyAxMjcgMTUzIDQ1IDY5IDExNyAxMjEgMTE5IAorOTUgOSAxNDUgMTY3IDIyOSAxNjYgMTIxIDgxIDc2IDE4OCA1MyAxOCAxOTAgMTQ4IDE3OCAyNjAgNTUgMTEzIDYxIDIxOCA4NSAxOTUgCisxNDUgMjc2IDE5MiA2MyAxMiA5NyAxNDIgMTk0IDIxNyA5OCAyNTAgMTIwIDEzMiAxNTAgMjczIDEgMTI1IDIwIDI4NSAxOSAxMTggMzcgCisxMjAgMjAzIDk0IDYwIDIxOSAxMjIgNDcgMjczIDExMCA4OCAyMDYgMTc2IDE2NSAyNSA0MyAxNTQgMjgzIDI4NCAzMiAxNCAxMiAyNjUgCisxNjEgMTUgMTc5IDExNyAxMzggNzUgMjYwIDE2NCA3NiAyNDcgMTA5IDEwMSAyNjEgMTUxIDIxIDI3MiAyNTMgMTQzIDE4MSAzMiAxMjMgCisxMDUgMTYyIDUyIDMxIDI0NSAxMjMgMzQgMjE4IDEzNSAyMzIgMjQ4IDk2IDQ2IDI4NiA2IDYzIDYyIDEzNCAyNDUgMTQgNzEgMzIgMjQ0IAorODYgMTgyIDkwIDEyIDQ3IDEwNSA5MSAxMDggMjQ0IDI3IDEyNiA3IDIzMCA0NCAyNjIgNzkgMTk5IDg0IDE5NiAyMyAxMjggMzEgMjcgCisxOTcgMjQwIDE3IDI2MiAyNTkgMjM2IDE4NyAxNiAxNjYgNjIgMjUgMjgyIDExNyAxODAgMTc1IDE3OCA4MCAxOCAxMCAyNDEgNzUgMTUxIAorMjAxIDE3OSA2NyAyNTIgMzUgMjU1IDExNyA3MSA4MiAyODEgMTg5IDIgMjMzIDIzNSA0MSA3MSAxNDEgNDggMjcyIDczIDIzNiA3OCA1MyAKKzI2OSAxNzEgMTY4IDg2IDExMSAxNiA5NSAxMTggMTA4IDY0IDEyMCAyMyAxODcgODcgMTEwIDI2OCAyNDMgMjc5IDI3NCAxNjggMjY2IAorMTQ4IDExOSAyMDQgMjYxIDQyIDU4IDg2IDczIDEyNyAxMTUgMjYgODkgMjUgMTAyIDgwIDc3IDY2IDM1IDE0NiAyNCA0NCAxOTEgMTM1IAorMTIzIDI4NSAxOTkgMTU1IDE0MCA5OSA1NyAyOCA1NCAxODUgNDIgMjc2IDEyIDE1NiAxOTggMTE4IDI4OCAxMDEgMjIzIDEzMiA0MSAKKzE4MCAxMDQgMjM0IDE2MyAyMTkgMTMgODQgODcgMjE5IDIzMSAxNDAgMTcwIDEgMjM0IDI3MiAxODIgMTk5IDI2NCAyMzMgMTI2IDIzNyAKKzE3NCAyNTAgMTkxIDIwNiA2NyA3MiAxMjggMTUyIDggODcgMjc4IDI4NyAyMjMgMjQxIDQgNzcgMjg0IDkxIDIyOSAyMjUgNDcgMTY0IAorMTQ3IDE5MSAyNiAzMCA5OSAxOSA5IDc0IDkzIDIzIDc4IDI4MyAyMTMgODggOTcgMjEzIDI2OCA0IDI3IDg4IDI3NyAxMjAgODIgMTEzIAorMTcwIDE4MSAyNzEgODYgMiA1MyAxOTggMjI3IDI1MSAyODcgMTE0IDI3OCAxMDcgMTg2IDEzOCAxODQgMjIzIDYxIDk3IDEwNCAxNzUgCisxMDcgNiAyMzEgODEgMTE0IDIwNyAxNjMgMTEwIDUwIDE4NyAxOTYgNzMgMTY1IDEzNCAxMzYgNTEgMTc0IDExIDk4IDIwIDE3NiA1NiAKKzIyMSAxNDYgMjYzIDEzNyA4OCAyNiAxMzkgNjIgMjA1IDE4OSAyMjAgMjkgMTEyIDc0IDI3MyA2MCA1MSAxMDMgNjcgMjIgOTEgNDkgCisxODggMjMzIDU1IDQgMjU3IDMyIDY0IDQ5IDc5IDI3MCAxNTggMTEzIDExMSAyNTUgNTggMTUgMjg4IDIxMCAyMTMgXgorNjI0IDEgMjggMjIwIDM2IDE3MCAyMzggMTk3IDE2OSA3MiA1NCA0MSAyMzcgMTU4IDI2IDIzNCA5MiAxNDUgOTUgMTU1IDg3IDE5MCAKKzI0MyAyMDggMjAwIDI1MCA0OCAyMSA5MCAyMTUgNDAgNzEgMTc4IDE4OCAxMDkgMTk2IDEzMCAyMTkgMjE2IDIwNiA1MSAxNiAyMyA1IAorNDggNiAxNTggOTcgNTUgMjc4IDIwMSA1NSAyMDcgOTAgMjg2IDE1MSAxMzAgMjM0IDE0OCAzNCAzNiAyMjYgMTI3IDEzOCAyNDAgMTEyIAorMiAzOCAxNDEgMjUwIDEwNCAzNyAzMSAxNTkgMjA3IDE5IDE3NSA5MiAyMDEgMjc0IDk2IDMxIDIzMCAyOCAyMDUgMTA0IDUyIDEyNiAKKzExNCAxOTIgMjI5IDE1MiAyMjUgMTAzIDkwIDIzMCAyNjIgMjYgMTA4IDg2IDM5IDMyIDM1IDYwIDE0NyAxMCAyNzggMjE2IDI3NyAzNSAKKzc1IDc5IDI1NSAxMDAgMTM2IDI1NCA1IDI2NyAxODUgOTkgNDEgOTUgMjI2IDcxIDI0OSA5IDE2OCAyNTIgOTAgMTQ0IDU2IDEyIDI0OSAKKzIyOCA1NyAxOTMgMzQgMjEgNCAxNzIgMTUzIDMwIDEzNSAxNTkgMTM2IDM1IDExNiAzNiAyNDEgNTkgOTMgMjI1IDMyIDEwNiAxNzEgNDMgCis2NiAyMzggMjY4IDI4MCAxMzEgMTEwIDEgMTYyIDE2MSAxMjIgMTQyIDE0IDE3OSAyODMgMTQxIDI2NSAzNiAxNTUgMTYgNzkgMTg0IAorMjc5IDc3IDE5OCA0NSA1MiAxODIgMyAxMzMgMTczIDE5MiAxMCAyNjMgMTIxIDMyIDUwIDI4MiAxMDIgMTIyIDE5OCAzMCAxMjAgMjI3IAorMTggMjEzIDE5NiA1OSAxMDggMTU3IDE1MCA5MSA5MSAyMCAxOTkgMTQwIDg0IDEyNCAxOTkgNjkgMjYzIDY1IDE0MyAxMDkgNDggNjIgCis0NyAyMDEgMTI2IDI4IDE0OSAyMTUgMTExIDE4MiA3NCAyNDQgNjkgMjQ4IDEzMyAyNSAxMjQgMTI4IDI0OCAyMDQgOSAxODMgMTg0IAorMjA4IDI1NiAxMzkgMjc5IDkyIDEzMCAxNjMgMzcgMjY1IDI3MCAyNjYgNzUgOCAxNDQgMjA0IDgwIDQgMjQzIDI2NCA4OSAxOTEgMTE5IAorMTg4IDM4IDg1IDcxIDE2MyAyNTYgMTU0IDIxMSAyMTAgMTE1IDgzIDE0IDEwOCAxNzIgODIgMjA5IDc2IDEwMyAxNzYgMjczIDI3NiA2NyAKKzQzIDEwIDU5IDM3IDQ2IDkxIDM1IDEzMSAyNTggNjkgNDQgMTc2IDIwMiAxNjUgMTcxIDI3NyAxNzcgNyAzNCAyNDAgMTgzIDExMyA5NyAKKzcwIDgzIDI5IDQwIDY3IDEyOSA1MyA3MyA3OCA4OSAxMjAgOCAyIDEwOSAyNTIgMTkgMzMgMTYwIDI0NiAyODkgMTMgNTQgOTcgMTI2IAorOTkgMjYwIDExMSAxNjcgMTQyIDI4OSAyNDcgMzggMTU2IDU1IDIyMiAyMiAxMTQgMjYzIDUwIDIxMSAyODEgMjI2IDE0MiA3MCA2OCAKKzIyNCAyMTIgMTUgMjc0IDI1IDIxMCAxNzEgMjYyIDI0NSAxNzkgMjEyIDMwIDIwNiAyNzAgMTk1IDI1NCAyMzkgODggODEgMjggMSAxNDcgCis2NiAxNjcgMTU3IDIyMSAyMDIgMTUwIDc2IDE1OSA2NSAyMTQgMjIwIDEwNyAyODEgNyAyNTMgMTI5IDEyNCA1NyAxMzcgMTQ1IDgwIDYwIAorMTMyIDc4IDE2MCAyMzEgNjcgNTggMjMyIDE3NyAyMiAxMjkgNjggMTY4IDMzIDc0IDQwIDI3NSAyNjIgMTc0IDY4IDE1MyAxMDEgMjQ2IAorMjE4IDE5MiAxNTggNDEgMTY2IDQ3IDI1NyAxNSAyNTkgMjIwIDkyIDU5IDUyIDI2OCA0NiAyMCAyMTQgNzIgMzkgMjM2IDI4MiA0NiAKKzEwNiAyNTcgMjQ5IDgwIDI3OSAyMSAxOSAxMDQgMjcxIDE1IDU1IDEzNiAyNjkgMTAwIDIyMiA3IDE4MiAxOCA2NSAxMjggMTQgOTMgCisyNDAgMjU0IDIyNCAxNTYgMTI2IDQzIDgxIDE3MCA5NiAxMDIgNTEgODcgMTM0IDY0IDEwNCAyNTYgMjEwIDEwMCAxNTEgMTg2IDEyMyAKKzg5IDEwNSA3NiAxNzQgMjg3IDQyIDQyIDE5MCA5NSAxNDAgMTU1IDIzNSAyNTggMTI1IDIyMyAxMTcgMjczIDIwNSAyNDYgMjc0IDgxIAorOTkgMTEyIDIwNiAyODUgMTI3IDIwOSA2MSA4IDU4IDI4OCA2NiAyNTMgMjAwIDIzNSAyNDMgMTkzIDEwNSA1IDYzIDIyOCAxMTMgODIgCisyNjUgMjU1IDQ0IDI0NyAyMyAyMjQgMjI3IDIzNyAxMDIgMTM3IDMgMTQ4IDEwNSAxNDcgMjg1IDU2IDk4IDE2NSAyNDIgOTggMjM2IDYzIAorMTU3IDIgMjMgMjA5IDUgMTE5IDExNyAyMTcgMjYgMTUgMjAzIDQxIDE1MSAxMTUgMTIgMTkzIDQ5IDExNiAxMjIgMjg0IDIzNiA3IDI2OCAKKzYxIDI0MiAxNjkgNTcgMTIyIDIxMyAxMjUgMjM4IDQ5IDEwMSAyNyAzOSAyNTEgMjE0IDEgMjE4IDUwIDYzIDIxMyAxODEgMTI3IDE1MyAKKzQ1IDY3IDExNCAxMjEgMTE4IDkzIDYgMTQzIDE2NSAyMjcgMTY2IDExOCA3OCA3NCAxODggNTMgMTcgMTg5IDE0OCAxNzYgMjU4IDU0IAorMTEyIDU4IDIxNyA4MiAxOTQgMTQ0IDI3NSAxOTEgMTQxIF4KKzYyOCAxIDMgOTcgMTM5IDE5NCAyMTEgOTIgMjUwIDExNyAxMzIgMTQ3IDI2NyAyOTAgMTE5IDE0IDI4MiAxMyAxMTggMzcgMTExIDIwMCAKKzk0IDYwIDIxNiAxMTkgNDcgMjcwIDExMCA4NSAyMDMgMTczIDE1OSAxNiA0MyAxNDggMjc3IDI3OCAyOSA1IDEyIDI2MiAxNTggNiAxNzYgCisxMTcgMjg2IDEzNSA3MiAyNTcgMTY0IDc2IDI0MSAxMDYgMTAxIDI2MSAxNDggMTggMjY2IDI0NyAxNDMgMTc4IDMyIDExNyA5OSAxNTkgCis0OSAzMSAyNDUgMTIzIDMxIDIxMiAxMzUgMjI2IDI0NSA5MCA0MyAyODYgMjg5IDYwIDYyIDEzMSAyNDIgMTEgNjUgMjMgMjQ0IDgwIAorMTc2IDg0IDYgMzggMTA1IDkxIDEwMiAyMzggMjcgMTIzIDI5MCAyMjQgMzggMjU5IDc5IDE5OSA4NCAxOTMgMTQgMTI4IDI1IDIxIDE5MSAKKzIzNyAxNyAyNTYgMjU5IDIzMyAxODcgMTAgMTYwIDU5IDE5IDI3NiAxMTQgMTc0IDE2OSAxNzUgNzQgMTggNyAyMzUgNjkgMTQ1IDE5OCAKKzE3OSA1OCAyNTIgMzIgMjU1IDExMSA2MiA4MiAyNzggMTgzIDI4NSAyMzAgMjI5IDMyIDY4IDEzNSAzOSAyNjkgNjcgMjMwIDc1IDQ0IAorMjYzIDE2OCAxNjUgODYgMTA4IDE2IDkyIDExMiAxMDUgNTggMTE0IDIwIDE4MSA3OCAxMDcgMjY1IDIzNyAyNzYgMjY4IDE2MiAyNjYgCisxNDIgMTE5IDIwMSAyNTggMzYgNTIgNzcgNjQgMTE4IDEwOSAyNiA4MCAyMiA5NiA4MCA3MSA2MCAyOSAxNDMgMjQgNDQgMTkxIDEzMiAKKzExNCAyNzkgMTkzIDE1MiAxNDAgOTkgNTQgMjUgNTQgMTc5IDQyIDI3NiA5IDE1MCAxOTIgMTA5IDI4NSA5MiAyMTcgMTI5IDM1IDE4MCAKKzEwMSAyMjggMTYwIDIxMyA3IDgxIDgxIDIxOSAyMzEgMTM0IDE2NyAxIDIzMSAyNzIgMTc5IDE5NiAyNjQgMjI3IDExNyAyMzcgMTcxIAorMjQ0IDE4NSAyMDAgNjEgNzIgMTE5IDE1MiAyIDg3IDI3MiAyODQgMjIwIDI0MSAxIDc3IDI4NCA4MiAyMjkgMjE5IDQ0IDE1OCAxNDQgCisxODggMjAgMjcgOTAgMTAgNiA3MSA5MyAxNyA2OSAyODMgMjEwIDgyIDkxIDIwNyAyNjIgNCAxOCA3OSAyNzEgMTIwIDczIDExMyAxNjQgCisxODEgMjY1IDgzIDI4OCA1MCAxOTUgMjIxIDI1MSAyODEgMTA4IDI3NSAxMDQgMTg2IDEzOCAxODQgMjIzIDYxIDg4IDk1IDE3NSAxMDcgCis2IDIyNSA4MSAxMTQgMjA3IDE1NyAxMDEgNDEgMTg0IDE5MCA3MyAxNjIgMTI4IDEzMCA0NSAxNjggMTEgOTggMTEgMTcwIDQ3IDIyMSAKKzE0NiAyNTcgMTMxIDg4IDIzIDEzOSA1NiAxOTkgMTg5IDIxNyAyODMgMjMgMTA2IDY4IDI3MyA1MSA1MSAxMDAgNjQgMTMgODUgNDkgCisxODUgMjMzIDQ5IDI5MCAyNTcgMjYgNjQgNDYgNzMgMjY3IDE1MiAxMDcgMTExIDI0OSA1OCA5IDI4OCAyMDQgMTgzIDI2IDIxOCAzNCAKKzE3MCAyMzQgMTk3IDE2OSA3MCA1MCA0MSAyMzMgMTU0IDIyIDIzNCA5MiAxNDUgOTMgMTU1IDgxIDE4NiAyNDMgMjA4IDIwMCAyNDggNDggCisyMSA4NiAyMTMgNDAgNjkgMTc4IDE4NiAxMDUgMTk2IDEyNiAyMTUgMjE0IDIwNCA0NSAxNCAyMyAxIDQ0IDQgMTU2IDkxIDUzIDI3NCAKKzE5OSA1MSAyMDUgODggMjgyIDE1MSAxMzAgMjMyIDE0NCAzNCAzMiAyMjIgMTIzIDEzNiAyMzYgMTEyIDM0IDEzNyAyNDYgMTAwIDMxIAorMjUgMTU5IDIwMyAxOSAxNzEgOTAgMTk3IDI3NCA5NCAyNyAyMjggMjIgMjAxIDEwNCA0OCAxMjYgMTEwIDE5MCAyMjcgMTUwIDIyNSA5NyAKKzkwIDIzMCAyNjIgMjAgMjg2IDEwMiA4NCAzOSAyNiAzMSA1OCAxNDcgOCAyNzggMjE2IDI3MyAzNSA3NSA3NyAyNTEgOTQgMTMyIDI1MiAKKzI5MSAyNjcgMTg1IDk1IDM3IDk1IDIyNCA3MSAyNDcgNSAxNjYgMjUwIDg0IDE0NCA1MCA4IDI0NSAyMjggNTUgMTg5IDMwIDE1IDE3MiAKKzE0OSAyOCAxMzMgMTU3IDEzNCAyOSAxMTAgMzYgMjM5IDUzIDg3IDIyMyAyOCAxMDAgMTY5IDM3IDYyIDIzNiAyNjYgMjgwIDEzMSAxMDQgCisyOTEgMTYyIDE2MSAxMTggMTQyIDE0IDE3NyAyODEgMTQxIDI2MyAzMCAxNTMgMTIgNzUgMTgyIDI3NSA3MSAxOTggNDEgNDYgMTc4IAorMjkxIDEyOSAxNzMgMTkyIDQgMjYxIDExNSAzMCA0OCAyODAgOTggMTE2IDE5NCAyNCAxMTYgMjI3IDEyIDIxMyAxOTQgNTcgMTA0IDE1MyAKKzE1MCA4NyA4NSAxNiAxOTcgMTM2IDgyIDEyNCAxOTUgNjcgMjYzIDYzIDE0MSAxMDkgNDIgNTYgNDUgMjAxIDEyMCAyNCAxNDkgMjE1IAorMTA5IDE4MCA2OCAyNDAgNjMgMjQ2IDEzMyAxOSAxMjIgMTI2IDI0OCAyMDIgOSAxODMgMTgwIDIwNiAyNTIgMTM3IDI3OSA4OCAxMjggCisxNjMgMzMgMjY1IDI3MCAyNjQgNzMgOCAxNDAgMjA0IDc4IDIgMjQxIDc2IF4KKzYyMiAwIDg5IDE4MyAxMTEgMTgwIDM0IDg1IDU5IDE1OSAyNTYgMTU0IDIwNyAyMTAgMTE1IDc1IDEwIDEwOCAxNjggNzggMjA5IDY4IAorMTAzIDE3NiAyNjkgMjcyIDU1IDM1IDEwIDUxIDMzIDM4IDg3IDMxIDEyMyAyNTggNjkgMzYgMTcyIDIwMiAxNjEgMTcxIDI3NyAxNjkgMyAKKzIyIDIzNiAxNzkgMTA5IDkzIDcwIDgzIDI5IDM2IDY3IDEyMSA0OSA2MSA3NCA4NSAxMTYgMiA5NyAyNDQgMTEgMzMgMTYwIDI0NiAyODUgCisxIDQyIDg5IDExOCA4NyAyNjAgOTkgMTU5IDEzNCAyODkgMjQ3IDM4IDE1MiA1NSAyMjIgMTQgMTEwIDI1NSA0MiAyMTEgMjc3IDIyNiAKKzEzOCA2MiA2NCAyMTYgMjA0IDExIDI3MCAyNSAyMDYgMTYzIDI1OCAyNDEgMTcxIDIxMiAzMCAxOTggMjY2IDE5NSAyNTQgMjM5IDg0IAorNjkgMjggMjgzIDE0MyA1NCAxNjcgMTUzIDIxNyAxOTQgMTQyIDY0IDE1MSA2NSAyMDYgMjIwIDk5IDI4MSAyOTMgMjQ5IDEyNSAxMTYgCis1NyAxMzcgMTM3IDcyIDQ4IDEyOCA3OCAxNTIgMjI3IDYzIDU0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyMSA3NCAyOCAyNzUgMjU0IAorMTc0IDYwIDE0OSA5MyAyNDIgMjE4IDE4NCAxNTggMzcgMTYyIDM5IDI0OSAzIDI1MSAyMTIgODAgNTkgNTIgMjYwIDM0IDIwIDIxNCA2MCAKKzI3IDIyOCAyODIgNDYgMTA2IDI1MyAyNDkgNjggMjc1IDE3IDE1IDEwMCAyNzEgMTUgNDMgMTM2IDI2OSAxMDAgMjE0IDI4OSAxODIgMTQgCis1MyAxMjAgMiA4OSAyNDAgMjQ2IDIyMCAxNTYgMTIyIDM5IDc3IDE2MiA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMjUyIDIwMiA5NiAxNDcgCisxNzggMTE5IDc3IDk3IDcyIDE3MCAyODcgMzggMzAgMTkwIDgzIDEzNiAxNDcgMjM1IDI1NCAxMTcgMjE5IDEwOSAyNjUgMjA1IDIzOCAKKzI2NiA3MyA5NSAxMDAgMjA2IDI4NSAxMjMgMjAxIDQ5IDI5MCA1MCAyODAgNjYgMjUzIDE5MiAyMjcgMjM1IDE4OSA5MyA1IDU5IDIyNCAKKzEwMSA3NCAyNTcgMjUxIDQwIDIzOSAxOSAyMjQgMjIzIDIzMyAxMDIgMTI5IDMgMTQ0IDEwMSAxMzkgMjgxIDU2IDkwIDE2NSAyMzggOTQgCisyMzIgNTUgMTU3IDI4NCAxMSAyMDUgMSAxMDcgMTEzIDIxNyAyMiA3IDIwMyAyOSAxNDMgMTExIDggMTkzIDQ1IDExNiAxMjIgMjc2IAorMjM2IDcgMjY4IDUzIDI0MiAxNjEgNDkgMTE4IDIwOSAxMjUgMjM4IDM3IDk3IDE1IDM1IDI0NyAyMTAgMjg3IDIxMCA1MCA1MSAyMDUgCisxNzMgMTI3IDE1MyA0NSA1OSAxMDIgMTIxIDExNCA4NSAyODggMTM1IDE1NyAyMTkgMTY2IDEwNiA2NiA2NiAxODggNTMgMTMgMTg1IAorMTQ4IDE2OCAyNTAgNTAgMTA4IDQ2IDIxMyA3MCAxOTAgMTQwIDI3MSAxODcgNjMgMjkxIDk3IDEzNyAxOTQgMjA3IDg4IDI1MCAxMTUgCisxMzIgMTQ1IDI2MyAyOTAgMTE1IDEwIDI4MCA5IDExOCAzNyAxMDUgMTk4IDk0IDYwIDIxNCAxMTcgNDcgMjY4IDExMCA4MyAyMDEgMTcxIAorMTU1IDEwIDQzIDE0NCAyNzMgMjc0IDI3IDI5MyAxMiAyNjAgMTU2IDE3NCAxMTcgMjg0IDEzMyA3MCAyNTUgMTY0IDc2IDIzNyAxMDQgCisxMDEgMjYxIDE0NiAxNiAyNjIgMjQzIDE0MyAxNzYgMzIgMTEzIDk1IDE1NyA0NyAzMSAyNDUgMTIzIDI5IDIwOCAxMzUgMjIyIDI0MyAKKzg2IDQxIDI4NiAyODUgNTggNjIgMTI5IDI0MCA5IDYxIDE3IDI0NCA3NiAxNzIgODAgMiAzMiAxMDUgOTEgOTggMjM0IDI3IDEyMSAyODYgCisyMjAgMzQgMjU3IDc5IDE5OSA4NCAxOTEgOCAxMjggMjEgMTcgMTg3IDIzNSAxNyAyNTIgMjU5IDIzMSAxODcgNiAxNTYgNTcgMTUgMjcyIAorMTEyIDE3MCAxNjUgMTczIDcwIDE4IDUgMjMxIDY1IDE0MSAxOTYgMTc5IDUyIDI1MiAzMCAyNTUgMTA3IDU2IDgyIDI3NiAxNzkgMjgxIAorMjI4IDIyNSAyNiA2NiAxMzEgMzMgMjY3IDYzIDIyNiA3MyAzOCAyNTkgMTY2IDE2MyA4NiAxMDYgMTYgOTAgMTA4IDEwMyA1NCAxMTAgCisxOCAxNzcgNzIgMTA1IDI2MyAyMzMgMjc0IDI2NCAxNTggMjY2IDEzOCAxMTkgMTk5IDI1NiAzMiA0OCA3MSA1OCAxMTIgMTA1IDI2IDc0IAorMjAgOTIgODAgNjcgNTYgMjUgMTQxIDI0IDQ0IDE5MSAxMzAgMTA4IDI3NSAxODkgMTUwIDE0MCA5OSA1MiAyMyA1NCAxNzUgNDIgMjc2IAorNyAxNDYgMTg4IDEwMyAyODMgODYgMjEzIDEyNyAzMSAxODAgOTkgMjI0IDE1OCAyMDkgMyA3OSA3NyAyMTkgMjMxIDEzMCAxNjUgMSAKKzIyOSAyNzIgMTc3IDE5NCAyNjQgMjIzIDExMSAyMzcgMTY5IDI0MCAxODEgMTk2IDU3IDcyIDExMyAxNTIgMjkyIDg3IDI2OCAyODIgCisyMTggMjQxIDI5MyA3NyAyODQgNzYgMjI5IDgwIF4KKzYzNSAxIDQwIDE1MCAxNDAgMTg0IDEyIDIzIDc4IDI5NCAyIDY3IDkzIDkgNTcgMjgzIDIwNiA3NCA4MyAxOTkgMjU0IDQgNiA2NyAyNjMgCisxMjAgNjEgMTEzIDE1NiAxODEgMjU3IDc5IDI4NCA0NiAxOTEgMjEzIDI1MSAyNzMgMTAwIDI3MSAxMDAgMTg2IDEzOCAxODQgMjIzIDYxIAorNzYgODMgMTc1IDEwNyA2IDIxNyA4MSAxMTQgMjA3IDE0OSA4OSAyOSAxODAgMTgyIDczIDE1OCAxMjAgMTIyIDM3IDE2MCAxMSA5OCAKKzI5NSAxNjIgMzUgMjIxIDE0NiAyNDkgMTIzIDg4IDE5IDEzOSA0OCAxOTEgMTg5IDIxMyAyNzUgMTUgOTggNjAgMjczIDM5IDUxIDk2IAorNjAgMSA3NyA0OSAxODEgMjMzIDQxIDI4NiAyNTcgMTggNjQgNDIgNjUgMjYzIDE0NCA5OSAxMTEgMjQxIDU4IDEgMjg4IDE5NiAxNzkgCisyMiAyMTQgMzAgMTcwIDIyNiAxOTcgMTY5IDY2IDQyIDQxIDIyNSAxNDYgMTQgMjM0IDkyIDE0NSA4OSAxNTUgNjkgMTc4IDI0MyAyMDggCisyMDAgMjQ0IDQ4IDIxIDc4IDIwOSA0MCA2NSAxNzggMTgyIDk3IDE5NiAxMTggMjA3IDIxMCAyMDAgMzMgMTAgMjMgMjg5IDM2IDE1MiAKKzc5IDQ5IDI2NiAxOTUgNDMgMjAxIDg0IDI3NCAxNTEgMTMwIDIyOCAxMzYgMzQgMjQgMjE0IDExNSAxMzIgMjI4IDExMiAyOTIgMjYgCisxMjkgMjM4IDkyIDE5IDEzIDE1OSAxOTUgMTkgMTYzIDg2IDE4OSAyNzQgOTAgMTkgMjI0IDEwIDE5MyAxMDQgNDAgMTI2IDEwMiAxODYgCisyMjMgMTQ2IDIyNSA4NSA5MCAyMzAgMjYyIDggMjc4IDkwIDgwIDM5IDE0IDIzIDU0IDE0NyA0IDI3OCAyMTYgMjY1IDM1IDc1IDczIAorMjQzIDgyIDEyNCAyNDggMjgzIDI2NyAxODUgODcgMjkgOTUgMjIwIDcxIDI0MyAyOTMgMTYyIDI0NiA3MiAxNDQgMzggMjM3IDIyOCA1MSAKKzE4MSAyMiAzIDI4OCAxNzIgMTQxIDI0IDEyOSAxNTMgMTMwIDE3IDk4IDM2IDIzNSA0MSA3NSAyMTkgMjAgODggMTY1IDI1IDU0IDIzMiAKKzI2MiAyODAgMTMxIDkyIDI5MSAxNjIgMTYxIDExMCAxNDIgMTQgMTczIDI3NyAxNDEgMjU5IDE4IDE0OSA0IDY3IDE3OCAyNjcgNTkgCisxOTggMzMgMzQgMTcwIDI4NyAxMjEgMTczIDE5MiAyODggMjU3IDEwMyAyNiA0NCAyNzYgOTAgMTA0IDE4NiAxMiAxMDggMjI3IDIxMyAKKzE5MCA1MyA5NiAxNDUgMTUwIDc5IDczIDggMTkzIDEyOCA3OCAxMjQgMTg3IDYzIDI2MyA1OSAxMzcgMTA5IDMwIDQ0IDQxIDIwMSAxMDggCisxNiAxNDkgMjE1IDEwNSAxNzYgNTYgMjMyIDUxIDI0MiAxMzMgNyAxMTggMTIyIDI0OCAxOTggOSAxODMgMTcyIDIwMiAyNDQgMTMzIAorMjc5IDgwIDEyNCAxNjMgMjUgMjY1IDI3MCAyNjAgNjkgOCAxMzIgMjA0IDc0IDI5NCAyMzcgMjUyIDg5IDE3OSAxMDcgMTc2IDMyIDg1IAorNTMgMTU3IDI1NiAxNTQgMjA1IDIxMCAxMTUgNzEgOCAxMDggMTY2IDc2IDIwOSA2NCAxMDMgMTc2IDI2NyAyNzAgNDkgMzEgMTAgNDcgCiszMSAzNCA4NSAyOSAxMTkgMjU4IDY5IDMyIDE3MCAyMDIgMTU5IDE3MSAyNzcgMTY1IDEgMTYgMjM0IDE3NyAxMDcgOTEgNzAgODMgMjkgCiszNCA2NyAxMTcgNDcgNTUgNzIgODMgMTE0IDI5MiAyIDkxIDI0MCA3IDMzIDE2MCAyNDYgMjgzIDI5MSAzNiA4NSAxMTQgODEgMjYwIDkzIAorMTU1IDEzMCAyODkgMjQ3IDM4IDE1MCA1NSAyMjIgMTAgMTA4IDI1MSAzOCAyMTEgMjc1IDIyNiAxMzYgNTggNjIgMjEyIDIwMCA5IDI2OCAKKzI1IDIwNCAxNTkgMjU2IDIzOSAxNjcgMjEyIDMwIDE5NCAyNjQgMTk1IDI1NCAyMzkgODIgNjMgMjggMjc5IDE0MSA0OCAxNjcgMTUxIAorMjE1IDE5MCAxMzggNTggMTQ3IDY1IDIwMiAyMjAgOTUgMjgxIDI5MSAyNDcgMTIzIDExMiA1NyAxMzcgMTMzIDY4IDQyIDEyNiA3OCAKKzE0OCAyMjUgNjEgNTIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE1IDc0IDIyIDI3NSAyNTAgMTc0IDU2IDE0NyA4OSAyNDAgMjE4IDE4MCAKKzE1OCAzNSAxNjAgMzUgMjQ1IDI5MyAyNDcgMjA4IDc0IDU5IDUyIDI1NiAyOCAyMCAyMTQgNTQgMjEgMjI0IDI4MiA0NiAxMDYgMjUxIAorMjQ5IDYyIDI3MyAxNSAxMyA5OCAyNzEgMTUgMzcgMTM2IDI2OSAxMDAgMjEwIDI4NSAxODIgMTIgNDcgMTE2IDI5MiA4NyAyNDAgMjQyIAorMjE4IDE1NiAxMjAgMzcgNzUgMTU4IDk2IDg0IDM5IDc1IDEzNCA1OCA4NiAyNTAgMTk4IDk0IDE0NSAxNzQgMTE3IDcxIDkzIDcwIDE2OCAKKzI4NyAzNiAyNCAxOTAgNzcgMTM0IDE0MyAyMzUgMjUyIDExMyAyMTcgMTA1IDI2MSAyMDUgMjM0IDI2MiA2OSA5MyA5NCAyMDYgMjg1IAorMTIxIDE5NyA0MyAyODYgNDYgMjc2IDY2IDI1MyAxODggMjIzIDIzMSAxODcgODcgNSA1NyAyMjIgOTUgMjg1IF4KKzYzNiAwIDI1MSAyNDggMzcgMjMzIDE2IDIyNCAyMjAgMjMwIDEwMiAxMjMgMyAxNDEgOTggMTMzIDI3OCA1NiA4NCAxNjUgMjM1IDkxIAorMjI5IDQ5IDE1NyAyNzggMiAyMDIgMjk1IDk4IDExMCAyMTcgMTkgMSAyMDMgMjAgMTM3IDEwOCA1IDE5MyA0MiAxMTYgMTIyIDI3MCAKKzIzNiA3IDI2OCA0NyAyNDIgMTU1IDQzIDExNSAyMDYgMTI1IDIzOCAyOCA5NCA2IDMyIDI0NCAyMDcgMjg0IDIwNCA1MCA0MiAxOTkgCisxNjcgMTI3IDE1MyA0NSA1MyA5MyAxMjEgMTExIDc5IDI4MiAxMjkgMTUxIDIxMyAxNjYgOTcgNTcgNjAgMTg4IDUzIDEwIDE4MiAxNDggCisxNjIgMjQ0IDQ3IDEwNSAzNyAyMTAgNjEgMTg3IDEzNyAyNjggMTg0IDYzIDI4NSA5NyAxMzQgMTk0IDIwMSA4MiAyNTAgMTEyIDEzMiAKKzE0MiAyNTcgMjkwIDEwOSA0IDI3NyAzIDExOCAzNyA5NiAxOTUgOTQgNjAgMjExIDExNCA0NyAyNjUgMTEwIDgwIDE5OCAxNjggMTQ5IDEgCis0MyAxMzggMjY3IDI2OCAyNCAyODcgMTIgMjU3IDE1MyAyODggMTcxIDExNyAyODEgMTMwIDY3IDI1MiAxNjQgNzYgMjMxIDEwMSAxMDEgCisyNjEgMTQzIDEzIDI1NiAyMzcgMTQzIDE3MyAzMiAxMDcgODkgMTU0IDQ0IDMxIDI0NSAxMjMgMjYgMjAyIDEzNSAyMTYgMjQwIDgwIDM4IAorMjg2IDI3OSA1NSA2MiAxMjYgMjM3IDYgNTUgOCAyNDQgNzAgMTY2IDc0IDI5MyAyMyAxMDUgOTEgOTIgMjI4IDI3IDExOCAyODAgMjE0IAorMjggMjU0IDc5IDE5OSA4NCAxODggMjk2IDEyOCAxNSAxMSAxODEgMjMyIDE3IDI0NiAyNTkgMjI4IDE4NyAxNTAgNTQgOSAyNjYgMTA5IAorMTY0IDE1OSAxNzAgNjQgMTggMiAyMjUgNTkgMTM1IDE5MyAxNzkgNDMgMjUyIDI3IDI1NSAxMDEgNDcgODIgMjczIDE3MyAyNzUgMjI1IAorMjE5IDE3IDYzIDEyNSAyNCAyNjQgNTcgMjIwIDcwIDI5IDI1MyAxNjMgMTYwIDg2IDEwMyAxNiA4NyAxMDIgMTAwIDQ4IDEwNCAxNSAKKzE3MSA2MyAxMDIgMjYwIDIyNyAyNzEgMjU4IDE1MiAyNjYgMTMyIDExOSAxOTYgMjUzIDI2IDQyIDYyIDQ5IDEwMyA5OSAyNiA2NSAxNyAKKzg2IDgwIDYxIDUwIDE5IDEzOCAyNCA0NCAxOTEgMTI3IDk5IDI2OSAxODMgMTQ3IDE0MCA5OSA0OSAyMCA1NCAxNjkgNDIgMjc2IDQgCisxNDAgMTgyIDk0IDI4MCA3NyAyMDcgMTI0IDI1IDE4MCA5NiAyMTggMTU1IDIwMyAyOTQgNzYgNzEgMjE5IDIzMSAxMjQgMTYyIDEgMjI2IAorMjcyIDE3NCAxOTEgMjY0IDIxNyAxMDIgMjM3IDE2NiAyMzQgMTc1IDE5MCA1MSA3MiAxMDQgMTUyIDI4OSA4NyAyNjIgMjc5IDIxNSAKKzI0MSAyOTMgNzcgMjg0IDY3IDIyOSAyMDkgMzkgMTQ4IDEzOSAxODMgMTAgMjIgNzUgMjkyIDEgNjYgOTMgNyA1NCAyODMgMjA1IDcyIAorODEgMTk3IDI1MiA0IDMgNjQgMjYxIDEyMCA1OCAxMTMgMTU0IDE4MSAyNTUgNzggMjgzIDQ1IDE5MCAyMTEgMjUxIDI3MSA5OCAyNzAgCis5OSAxODYgMTM4IDE4NCAyMjMgNjEgNzMgODAgMTc1IDEwNyA2IDIxNSA4MSAxMTQgMjA3IDE0NyA4NiAyNiAxNzkgMTgwIDczIDE1NyAKKzExOCAxMjAgMzUgMTU4IDExIDk4IDI5MyAxNjAgMzIgMjIxIDE0NiAyNDcgMTIxIDg4IDE4IDEzOSA0NiAxODkgMTg5IDIxMiAyNzMgMTMgCis5NiA1OCAyNzMgMzYgNTEgOTUgNTkgMjk1IDc1IDQ5IDE4MCAyMzMgMzkgMjg1IDI1NyAxNiA2NCA0MSA2MyAyNjIgMTQyIDk3IDExMSAKKzIzOSA1OCAyOTYgMjg4IDE5NCAxNzggMjEgMjEzIDI5IDE3MCAyMjQgMTk3IDE2OSA2NSA0MCA0MSAyMjMgMTQ0IDEyIDIzNCA5MiAxNDUgCis4OCAxNTUgNjYgMTc2IDI0MyAyMDggMjAwIDI0MyA0OCAyMSA3NiAyMDggNDAgNjQgMTc4IDE4MSA5NSAxOTYgMTE2IDIwNSAyMDkgMTk5IAorMzAgOSAyMyAyODggMzQgMjk2IDE1MSA3NiA0OCAyNjQgMTk0IDQxIDIwMCA4MyAyNzIgMTUxIDEzMCAyMjcgMTM0IDM0IDIyIDIxMiAKKzExMyAxMzEgMjI2IDExMiAyOTIgMjQgMTI3IDIzNiA5MCAxNiAxMCAxNTkgMTkzIDE5IDE2MSA4NSAxODcgMjc0IDg5IDE3IDIyMyA3IAorMTkxIDEwNCAzOCAxMjYgMTAwIDE4NSAyMjIgMTQ1IDIyNSA4MiA5MCAyMzAgMjYyIDUgMjc2IDg3IDc5IDM5IDExIDIxIDUzIDE0NyAzIAorMjc4IDIxNiAyNjMgMzUgNzUgNzIgMjQxIDc5IDEyMiAyNDcgMjgxIDI2NyAxODUgODUgMjcgOTUgMjE5IDcxIDI0MiAyOTIgMTYxIDI0NSAKKzY5IDE0NCAzNSAyOTUgMjM1IDIyOCA1MCAxNzkgMjAgMjg3IDE3MiAxMzkgMjMgMTI4IDE1MiAxMjkgMTQgOTUgMzYgMjM0IDM4IDcyIAorMjE4IDE4IDg1IDE2NCAyMiA1MiAyMzEgMjYxIDI4MCAxMzEgODkgMjkxIDE2MiAxNjEgMTA4IDE0MiAxNCAxNzIgMjc2IDkxIF4KKzYzNSAxIDI1NiA5IDE0NiAyOTcgNjEgMTc1IDI2MSA1MCAxOTggMjcgMjUgMTY0IDI4NCAxMTUgMTczIDE5MiAyODIgMjU0IDk0IDIzIAorNDEgMjczIDg0IDk1IDE4MCAzIDEwMiAyMjcgMjkwIDIxMyAxODcgNTAgOTAgMTM5IDE1MCA3MyA2NCAyIDE5MCAxMjIgNzUgMTI0IDE4MSAKKzYwIDI2MyA1NiAxMzQgMTA5IDIxIDM1IDM4IDIwMSA5OSAxMCAxNDkgMjE1IDEwMiAxNzMgNDcgMjI2IDQyIDIzOSAxMzMgMjk3IDExNSAKKzExOSAyNDggMTk1IDkgMTgzIDE2NiAxOTkgMjM4IDEzMCAyNzkgNzQgMTIxIDE2MyAxOSAyNjUgMjcwIDI1NyA2NiA4IDEyNiAyMDQgNzEgCisyOTQgMjM0IDI0NiA4OSAxNzMgMTAxIDE3MCAyOSA4NSA0NCAxNTQgMjU2IDE1NCAyMDIgMjEwIDExNSA2NSA1IDEwOCAxNjMgNzMgMjA5IAorNTggMTAzIDE3NiAyNjQgMjY3IDQwIDI1IDEwIDQxIDI4IDI4IDgyIDI2IDExMyAyNTggNjkgMjYgMTY3IDIwMiAxNTYgMTcxIDI3NyAKKzE1OSAyOTcgNyAyMzEgMTc0IDEwNCA4OCA3MCA4MyAyOSAzMSA2NyAxMTEgNDQgNDYgNjkgODAgMTExIDI4OSAyIDgyIDIzNCAxIDMzIAorMTYwIDI0NiAyODAgMjg1IDI3IDc5IDEwOCA3MiAyNjAgODQgMTQ5IDEyNCAyODkgMjQ3IDM4IDE0NyA1NSAyMjIgNCAxMDUgMjQ1IDMyIAorMjExIDI3MiAyMjYgMTMzIDUyIDU5IDIwNiAxOTQgNiAyNjUgMjUgMjAxIDE1MyAyNTMgMjM2IDE2MSAyMTIgMzAgMTg4IDI2MSAxOTUgCisyNTQgMjM5IDc5IDU0IDI4IDI3MyAxMzggMzkgMTY3IDE0OCAyMTIgMTg0IDEzMiA0OSAxNDEgNjUgMTk2IDIyMCA4OSAyODEgMjg4IAorMjQ0IDEyMCAxMDYgNTcgMTM3IDEyNyA2MiAzMyAxMjMgNzggMTQyIDIyMiA1OCA0OSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNiA3NCAxMyAKKzI3NSAyNDQgMTc0IDUwIDE0NCA4MyAyMzcgMjE4IDE3NCAxNTggMzIgMTU3IDI5IDIzOSAyODcgMjQxIDIwMiA2NSA1OSA1MiAyNTAgMTkgCisyMCAyMTQgNDUgMTIgMjE4IDI4MiA0NiAxMDYgMjQ4IDI0OSA1MyAyNzAgMTIgMTAgOTUgMjcxIDE1IDI4IDEzNiAyNjkgMTAwIDIwNCAKKzI3OSAxODIgOSAzOCAxMTAgMjg2IDg0IDI0MCAyMzYgMjE1IDE1NiAxMTcgMzQgNzIgMTUyIDk2IDc1IDMzIDY5IDEzNCA1NSA3NyAyNDcgCisxOTIgOTEgMTQyIDE2OCAxMTQgNjIgODcgNjcgMTY1IDI4NyAzMyAxNSAxOTAgNjggMTMxIDEzNyAyMzUgMjQ5IDEwNyAyMTQgOTkgMjU1IAorMjA1IDIyOCAyNTYgNjMgOTAgODUgMjA2IDI4NSAxMTggMTkxIDM0IDI4MCA0MCAyNzAgNjYgMjUzIDE4MiAyMTcgMjI1IDE4NCA3OCA1IAorNTQgMjE5IDg2IDY0IDI0NyAyNDYgMzUgMjI5IDE0IDIyNCAyMTggMjI4IDEwMiAxMTkgMyAxMzkgOTYgMTI5IDI3NiA1NiA4MCAxNjUgCisyMzMgODkgMjI3IDQ1IDE1NyAyNzQgMjk1IDIwMCAyOTUgOTIgMTA4IDIxNyAxNyAyOTYgMjAzIDE0IDEzMyAxMDYgMyAxOTMgNDAgMTE2IAorMTIyIDI2NiAyMzYgNyAyNjggNDMgMjQyIDE1MSAzOSAxMTMgMjA0IDEyNSAyMzggMjIgOTIgMzAgMjQyIDIwNSAyODIgMjAwIDUwIDM2IAorMTk1IDE2MyAxMjcgMTUzIDQ1IDQ5IDg3IDEyMSAxMDkgNzUgMjc4IDEyNSAxNDcgMjA5IDE2NiA5MSA1MSA1NiAxODggNTMgOCAxODAgCisxNDggMTU4IDI0MCA0NSAxMDMgMzEgMjA4IDU1IDE4NSAxMzUgMjY2IDE4MiA2MyAyODEgOTcgMTMyIDE5NCAxOTcgNzggMjUwIDExMCAKKzEzMiAxNDAgMjUzIDI5MCAxMDUgMjc1IDI5OCAxMTggMzcgOTAgMTkzIDk0IDYwIDIwOSAxMTIgNDcgMjYzIDExMCA3OCAxOTYgMTY2IAorMTQ1IDI5NCA0MyAxMzQgMjYzIDI2NCAyMiAyODMgMTIgMjU1IDE1MSAyODQgMTY5IDExNyAyNzkgMTI4IDY1IDI1MCAxNjQgNzYgMjI3IAorOTkgMTAxIDI2MSAxNDEgMTEgMjUyIDIzMyAxNDMgMTcxIDMyIDEwMyA4NSAxNTIgNDIgMzEgMjQ1IDEyMyAyNCAxOTggMTM1IDIxMiAKKzIzOCA3NiAzNiAyODYgMjc1IDUzIDYyIDEyNCAyMzUgNCA1MSAyIDI0NCA2NiAxNjIgNzAgMjkxIDE3IDEwNSA5MSA4OCAyMjQgMjcgCisxMTYgMjc2IDIxMCAyNCAyNTIgNzkgMTk5IDg0IDE4NiAyOTIgMTI4IDExIDcgMTc3IDIzMCAxNyAyNDIgMjU5IDIyNiAxODcgMjk1IAorMTQ2IDUyIDUgMjYyIDEwNyAxNjAgMTU1IDE2OCA2MCAxOCAyMjEgNTUgMTMxIDE5MSAxNzkgMzcgMjUyIDI1IDI1NSA5NyA0MSA4MiAKKzI3MSAxNjkgMjcxIDIyMyAyMTUgMTEgNjEgMTIxIDE4IDI2MiA1MyAyMTYgNjggMjMgMjQ5IDE2MSAxNTggODYgMTAxIDE2IDg1IDk4IAorOTggNDQgMTAwIDEzIDE2NyA1NyAxMDAgMjU4IDIyMyAyNjkgMjU0IDE0OCAyNjYgMTI4IDExOSAxOTQgMjUxIDIyIDM4IDU2IDQzIDI3NSAKK14KKzY0MiAwIDkxIDI2IDUzIDEzIDc4IDgwIDUzIDQyIDExIDEzNCAyNCA0NCAxOTEgMTIzIDg3IDI2MSAxNzUgMTQzIDE0MCA5OSA0NSAxNiAKKzU0IDE2MSA0MiAyNzYgMTMyIDE3NCA4MiAyNzYgNjUgMTk5IDEyMCAxNyAxODAgOTIgMjEwIDE1MSAxOTUgMjkwIDcyIDYzIDIxOSAyMzEgCisxMTYgMTU4IDEgMjIyIDI3MiAxNzAgMTg3IDI2NCAyMDkgOTAgMjM3IDE2MiAyMjYgMTY3IDE4MiA0MyA3MiA5MiAxNTIgMjg1IDg3IAorMjU0IDI3NSAyMTEgMjQxIDI5MyA3NyAyODQgNTUgMjI5IDIwMSAzNSAxNDAgMTM1IDE3OSAyIDE4IDYzIDI4NCAyOTggNjIgOTMgMzAwIAorNDIgMjgzIDIwMSA2NCA3MyAxODkgMjQ0IDQgMjkyIDUyIDI1MyAxMjAgNDYgMTEzIDE0NiAxODEgMjQ3IDc0IDI3OSA0MSAxODYgMjAzIAorMjUxIDI2MyA5MCAyNjYgOTUgMTg2IDEzOCAxODQgMjIzIDYxIDYxIDY4IDE3NSAxMDcgNiAyMDcgODEgMTE0IDIwNyAxMzkgNzQgMTQgCisxNzUgMTcyIDczIDE1MyAxMTAgMTEyIDI3IDE1MCAxMSA5OCAyODUgMTUyIDIwIDIyMSAxNDYgMjM5IDExMyA4OCAxNCAxMzkgMzggMTgxIAorMTg5IDIwOCAyNjUgNSA4OCA1MCAyNzMgMjQgNTEgOTEgNTUgMjg3IDY3IDQ5IDE3NiAyMzMgMzEgMjgxIDI1NyA4IDY0IDM3IDU1IDI1OCAKKzEzNCA4OSAxMTEgMjMxIDU4IDI5MiAyODggMTg2IDE3NCAxNyAyMDkgMjUgMTcwIDIxNiAxOTcgMTY5IDYxIDMyIDQxIDIxNSAxMzYgNCAKKzIzNCA5MiAxNDUgODQgMTU1IDU0IDE2OCAyNDMgMjA4IDIwMCAyMzkgNDggMjEgNjggMjA0IDQwIDYwIDE3OCAxNzcgODcgMTk2IDEwOCAKKzE5NyAyMDUgMTk1IDE4IDUgMjMgMjg0IDI2IDI5NiAxNDcgNjQgNDQgMjU2IDE5MCAzMyAxOTYgNzkgMjY0IDE1MSAxMzAgMjIzIDEyNiAKKzM0IDE0IDIwNCAxMDUgMTI3IDIxOCAxMTIgMjkyIDE2IDExOSAyMjggODIgNCAyOTkgMTU5IDE4NSAxOSAxNTMgODEgMTc5IDI3NCA4NSAKKzkgMjE5IDI5NiAxODMgMTA0IDMwIDEyNiA5MiAxODEgMjE4IDE0MSAyMjUgNzAgOTAgMjMwIDI2MiAyOTQgMjY4IDc1IDc1IDM5IDMwMCAKKzEzIDQ5IDE0NyAzMDAgMjc4IDIxNiAyNTUgMzUgNzUgNjggMjMzIDY3IDExNCAyNDMgMjczIDI2NyAxODUgNzcgMTkgOTUgMjE1IDcxIAorMjM4IDI4OCAxNTcgMjQxIDU3IDE0NCAyMyAyOTEgMjI3IDIyOCA0NiAxNzEgMTIgMjg5IDI4MyAxNzIgMTMxIDE5IDEyNCAxNDggMTI1IAorMiA4MyAzNiAyMzAgMjYgNjAgMjE0IDEwIDczIDE2MCAxMCA0NCAyMjcgMjU3IDI4MCAxMzEgNzcgMjkxIDE2MiAxNjEgMTAwIDE0MiAxNCAKKzE2OCAyNzIgMTQxIDI1NCAzIDE0NCAyOTUgNTcgMTczIDI1NyA0NCAxOTggMjMgMTkgMTYwIDI4MiAxMTEgMTczIDE5MiAyNzggMjUyIAorODggMjEgMzkgMjcxIDgwIDg5IDE3NiAyOTggOTggMjI3IDI4NiAyMTMgMTg1IDQ4IDg2IDEzNSAxNTAgNjkgNTggMjk5IDE4OCAxMTggCis3MyAxMjQgMTc3IDU4IDI2MyA1NCAxMzIgMTA5IDE1IDI5IDM2IDIwMSA5MyA2IDE0OSAyMTUgMTAwIDE3MSA0MSAyMjIgMzYgMjM3IAorMTMzIDI5MyAxMTMgMTE3IDI0OCAxOTMgOSAxODMgMTYyIDE5NyAyMzQgMTI4IDI3OSA3MCAxMTkgMTYzIDE1IDI2NSAyNzAgMjU1IDY0IAorOCAxMjIgMjA0IDY5IDI5NCAyMzIgMjQyIDg5IDE2OSA5NyAxNjYgMjcgODUgMzggMTUyIDI1NiAxNTQgMjAwIDIxMCAxMTUgNjEgMyAKKzEwOCAxNjEgNzEgMjA5IDU0IDEwMyAxNzYgMjYyIDI2NSAzNCAyMSAxMCAzNyAyNiAyNCA4MCAyNCAxMDkgMjU4IDY5IDIyIDE2NSAyMDIgCisxNTQgMTcxIDI3NyAxNTUgMjk3IDEgMjI5IDE3MiAxMDIgODYgNzAgODMgMjkgMjkgNjcgMTA3IDQyIDQwIDY3IDc4IDEwOSAyODcgMiAKKzc2IDIzMCAyOTggMzMgMTYwIDI0NiAyNzggMjgxIDIxIDc1IDEwNCA2NiAyNjAgNzggMTQ1IDEyMCAyODkgMjQ3IDM4IDE0NSA1NSAyMjIgCisxMDMgMjQxIDI4IDIxMSAyNzAgMjI2IDEzMSA0OCA1NyAyMDIgMTkwIDQgMjYzIDI1IDE5OSAxNDkgMjUxIDIzNCAxNTcgMjEyIDMwIAorMTg0IDI1OSAxOTUgMjU0IDIzOSA3NyA0OCAyOCAyNjkgMTM2IDMzIDE2NyAxNDYgMjEwIDE4MCAxMjggNDMgMTM3IDY1IDE5MiAyMjAgCis4NSAyODEgMjg2IDI0MiAxMTggMTAyIDU3IDEzNyAxMjMgNTggMjcgMTIxIDc4IDEzOCAyMjAgNTYgNDcgMjMyIDE3NyAyMiAxMjkgNjggCisxNjggNzQgNyAyNzUgMjQwIDE3NCA0NiAxNDIgNzkgMjM1IDIxOCAxNzAgMTU4IDMwIDE1NSAyNSAyMzUgMjgzIDIzNyAxOTggNTkgNTkgCis1MiAyNDYgMTMgMjAgMjE0IDM5IDYgMjE0IDI4MiA0NiAxMDYgMjQ2IDI0OSA0NyAyNjggMTAgOCA5MyAyNzEgMTUgMjIgMTM2IDI2OSAKKzEwMCAyMDAgMjc1IDQyIF4KKzY0NCAwIDYgMjkgMTA0IDI4MCA4MSAyNDAgMjMwIDIxMiAxNTYgMTE0IDMxIDY5IDE0NiA5NiA2NiAyNyA2MyAxMzQgNTIgNjggMjQ0IAorMTg2IDg4IDEzOSAxNjIgMTExIDUzIDgxIDY0IDE2MiAyODcgMzAgNiAxOTAgNTkgMTI4IDEzMSAyMzUgMjQ2IDEwMSAyMTEgOTMgMjQ5IAorMjA1IDIyMiAyNTAgNTcgODcgNzYgMjA2IDI4NSAxMTUgMTg1IDI1IDI3NCAzNCAyNjQgNjYgMjUzIDE3NiAyMTEgMjE5IDE4MSA2OSA1IAorNTEgMjE2IDc3IDU4IDI0MSAyNDMgMzIgMjIzIDExIDIyNCAyMTUgMjI1IDEwMiAxMTMgMyAxMzYgOTMgMTIzIDI3MyA1NiA3NCAxNjUgCisyMzAgODYgMjI0IDM5IDE1NyAyNjggMjg5IDE5NyAyOTUgODMgMTA1IDIxNyAxNCAyOTMgMjAzIDUgMTI3IDEwMyAxOTMgMzcgMTE2IAorMTIyIDI2MCAyMzYgNyAyNjggMzcgMjQyIDE0NSAzMyAxMTAgMjAxIDEyNSAyMzggMTMgODkgMjkzIDI3IDIzOSAyMDIgMjc5IDE5NCA1MCAKKzI3IDE4OSAxNTcgMTI3IDE1MyA0NSA0MyA3OCAxMjEgMTA2IDY5IDI3MiAxMTkgMTQxIDIwMyAxNjYgODIgNDIgNTAgMTg4IDUzIDUgCisxNzcgMTQ4IDE1MiAyMzQgNDIgMTAwIDIyIDIwNSA0NiAxODIgMTMyIDI2MyAxNzkgNjMgMjc1IDk3IDEyOSAxOTQgMTkxIDcyIDI1MCAKKzEwNyAxMzIgMTM3IDI0NyAyOTAgOTkgMjk2IDI3MiAyOTUgMTE4IDM3IDgxIDE5MCA5NCA2MCAyMDYgMTA5IDQ3IDI2MCAxMTAgNzUgCisxOTMgMTYzIDEzOSAyODggNDMgMTI4IDI1NyAyNTggMTkgMjc3IDEyIDI1MiAxNDggMjc4IDE2NiAxMTcgMjc2IDEyNSA2MiAyNDcgMTY0IAorNzYgMjIxIDk2IDEwMSAyNjEgMTM4IDggMjQ2IDIyNyAxNDMgMTY4IDMyIDk3IDc5IDE0OSAzOSAzMSAyNDUgMTIzIDIxIDE5MiAxMzUgCisyMDYgMjM1IDcwIDMzIDI4NiAyNjkgNTAgNjIgMTIxIDIzMiAxIDQ1IDI5NSAyNDQgNjAgMTU2IDY0IDI4OCA4IDEwNSA5MSA4MiAyMTggCisyNyAxMTMgMjcwIDIwNCAxOCAyNDkgNzkgMTk5IDg0IDE4MyAyODYgMTI4IDUgMSAxNzEgMjI3IDE3IDIzNiAyNTkgMjIzIDE4NyAyOTIgCisxNDAgNDkgMzAxIDI1NiAxMDQgMTU0IDE0OSAxNjUgNTQgMTggMjk5IDIxNSA0OSAxMjUgMTg4IDE3OSAyOCAyNTIgMjIgMjU1IDkxIDMyIAorODIgMjY4IDE2MyAyNjUgMjIwIDIwOSAyIDU4IDExNSA5IDI1OSA0NyAyMTAgNjUgMTQgMjQzIDE1OCAxNTUgODYgOTggMTYgODIgOTIgCis5NSAzOCA5NCAxMCAxNjEgNDggOTcgMjU1IDIxNyAyNjYgMjQ4IDE0MiAyNjYgMTIyIDExOSAxOTEgMjQ4IDE2IDMyIDQ3IDM0IDg4IDg5IAorMjYgNTAgMTIgNzYgODAgNTEgNDAgOSAxMzMgMjQgNDQgMTkxIDEyMiA4NCAyNTkgMTczIDE0MiAxNDAgOTkgNDQgMTUgNTQgMTU5IDQyIAorMjc2IDMwMSAxMzAgMTcyIDc5IDI3NSA2MiAxOTcgMTE5IDE1IDE4MCA5MSAyMDggMTUwIDE5MyAyODkgNzEgNjEgMjE5IDIzMSAxMTQgCisxNTcgMSAyMjEgMjcyIDE2OSAxODYgMjY0IDIwNyA4NyAyMzcgMTYxIDIyNCAxNjUgMTgwIDQxIDcyIDg5IDE1MiAyODQgODcgMjUyIAorMjc0IDIxMCAyNDEgMjkzIDc3IDI4NCA1MiAyMjkgMTk5IDM0IDEzOCAxMzQgMTc4IDE3IDYwIDI4MiAyOTggNjEgOTMgMjk5IDM5IDI4MyAKKzIwMCA2MiA3MSAxODcgMjQyIDQgMjkwIDQ5IDI1MSAxMjAgNDMgMTEzIDE0NCAxODEgMjQ1IDczIDI3OCA0MCAxODUgMjAxIDI1MSAyNjEgCis4OCAyNjUgOTQgMTg2IDEzOCAxODQgMjIzIDYxIDU4IDY1IDE3NSAxMDcgNiAyMDUgODEgMTE0IDIwNyAxMzcgNzEgMTEgMTc0IDE3MCAKKzczIDE1MiAxMDggMTEwIDI1IDE0OCAxMSA5OCAyODMgMTUwIDE3IDIyMSAxNDYgMjM3IDExMSA4OCAxMyAxMzkgMzYgMTc5IDE4OSAyMDcgCisyNjMgMyA4NiA0OCAyNzMgMjEgNTEgOTAgNTQgMjg1IDY1IDQ5IDE3NSAyMzMgMjkgMjgwIDI1NyA2IDY0IDM2IDUzIDI1NyAxMzIgODcgCisxMTEgMjI5IDU4IDI5MSAyODggMTg0IDE3MyAxNiAyMDggMjQgMTcwIDIxNCAxOTcgMTY5IDYwIDMwIDQxIDIxMyAxMzQgMiAyMzQgOTIgCisxNDUgODMgMTU1IDUxIDE2NiAyNDMgMjA4IDIwMCAyMzggNDggMjEgNjYgMjAzIDQwIDU5IDE3OCAxNzYgODUgMTk2IDEwNiAxOTUgMjA0IAorMTk0IDE1IDQgMjMgMjgzIDI0IDI5NiAxNDYgNjEgNDMgMjU0IDE4OSAzMSAxOTUgNzggMjYyIDE1MSAxMzAgMjIyIDEyNCAzNCAxMiAKKzIwMiAxMDMgMTI2IDIxNiAxMTIgMjkyIDE0IDExNyAyMjYgODAgMSAyOTcgMTU5IDE4MyAxOSAxNTEgODAgMTc3IDI3NCA4NCA3IDIxOCAKKzI5NCAxODEgMTA0IDI4IDEyNiA5MCAxODAgMjE3IDE0MCAyMjUgNjcgOTAgMjMwIDI2MiAyOTIgMjY2IDcyIDc0IDM5IDI5OCAxMSA0OCAKKzE0NyAzMDAgMjc4IDIxNiAyNTMgMjY1IF4KKzYzOCAxIDc1IDY1IDIyNyA1OCAxMDggMjQwIDI2NyAyNjcgMTg1IDcxIDEzIDk1IDIxMiA3MSAyMzUgMjg1IDE1NCAyMzggNDggMTQ0IAorMTQgMjg4IDIyMSAyMjggNDMgMTY1IDYgMjgzIDI4MCAxNzIgMTI1IDE2IDEyMSAxNDUgMTIyIDI5NyA3NCAzNiAyMjcgMTcgNTEgMjExIAorNCA2NCAxNTcgMSAzOCAyMjQgMjU0IDI4MCAxMzEgNjggMjkxIDE2MiAxNjEgOTQgMTQyIDE0IDE2NSAyNjkgMTQxIDI1MSAyOTggMTQxIAorMjkyIDUxIDE3MCAyNTEgMzUgMTk4IDE3IDEwIDE1NCAyNzkgMTA1IDE3MyAxOTIgMjcyIDI0OSA3OSAxOCAzNiAyNjggNzQgODAgMTcwIAorMjkyIDkyIDIyNyAyODAgMjEzIDE4MiA0NSA4MCAxMjkgMTUwIDYzIDQ5IDI5NiAxODUgMTEyIDcwIDEyNCAxNzEgNTUgMjYzIDUxIDEyOSAKKzEwOSA2IDIwIDMzIDIwMSA4NCAxNDkgMjE1IDk3IDE2OCAzMiAyMTYgMjcgMjM0IDEzMyAyODcgMTEwIDExNCAyNDggMTkwIDkgMTgzIAorMTU2IDE5NCAyMjggMTI1IDI3OSA2NCAxMTYgMTYzIDkgMjY1IDI3MCAyNTIgNjEgOCAxMTYgMjA0IDY2IDI5NCAyMjkgMjM2IDg5IDE2MyAKKzkxIDE2MCAyNCA4NSAyOSAxNDkgMjU2IDE1NCAxOTcgMjEwIDExNSA1NSAxMDggMTU4IDY4IDIwOSA0OCAxMDMgMTc2IDI1OSAyNjIgMjUgCisxNSAxMCAzMSAyMyAxOCA3NyAyMSAxMDMgMjU4IDY5IDE2IDE2MiAyMDIgMTUxIDE3MSAyNzcgMTQ5IDI5NyAyOTYgMjI2IDE2OSA5OSAKKzgzIDcwIDgzIDI5IDI2IDY3IDEwMSAzOSAzMSA2NCA3NSAxMDYgMjg0IDIgNjcgMjI0IDI5NSAzMyAxNjAgMjQ2IDI3NSAyNzUgMTIgNjkgCis5OCA1NyAyNjAgNjkgMTM5IDExNCAyODkgMjQ3IDM4IDE0MiA1NSAyMjIgMjk4IDEwMCAyMzUgMjIgMjExIDI2NyAyMjYgMTI4IDQyIDU0IAorMTk2IDE4NCAxIDI2MCAyNSAxOTYgMTQzIDI0OCAyMzEgMTUxIDIxMiAzMCAxNzggMjU2IDE5NSAyNTQgMjM5IDc0IDM5IDI4IDI2MyAKKzEzMyAyNCAxNjcgMTQzIDIwNyAxNzQgMTIyIDM0IDEzMSA2NSAxODYgMjIwIDc5IDI4MSAyODMgMjM5IDExNSA5NiA1NyAxMzcgMTE3IAorNTIgMTggMTE4IDc4IDEzMiAyMTcgNTMgNDQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI5NSA3NCAzMDIgMjc1IDIzNCAxNzQgNDAgMTM5IAorNzMgMjMyIDIxOCAxNjQgMTU4IDI3IDE1MiAxOSAyMjkgMjc3IDIzMSAxOTIgNTAgNTkgNTIgMjQwIDQgMjAgMjE0IDMwIDMwMSAyMDggCisyODIgNDYgMTA2IDI0MyAyNDkgMzggMjY1IDcgNSA5MCAyNzEgMTUgMTMgMTM2IDI2OSAxMDAgMTk0IDI2OSAxODIgNCAyMyAxMDAgMjc2IAorNzkgMjQwIDIyNiAyMTAgMTU2IDExMiAyOSA2NyAxNDIgOTYgNjAgMjMgNTkgMTM0IDUwIDYyIDI0MiAxODIgODYgMTM3IDE1OCAxMDkgCis0NyA3NyA2MiAxNjAgMjg3IDI4IDE5MCA1MyAxMjYgMTI3IDIzNSAyNDQgOTcgMjA5IDg5IDI0NSAyMDUgMjE4IDI0NiA1MyA4NSA3MCAKKzIwNiAyODUgMTEzIDE4MSAxOSAyNzAgMzAgMjYwIDY2IDI1MyAxNzIgMjA3IDIxNSAxNzkgNjMgNSA0OSAyMTQgNzEgNTQgMjM3IDI0MSAKKzMwIDIxOSA5IDIyNCAyMTMgMjIzIDEwMiAxMDkgMyAxMzQgOTEgMTE5IDI3MSA1NiA3MCAxNjUgMjI4IDg0IDIyMiAzNSAxNTcgMjY0IAorMjg1IDE5NSAyOTUgNzcgMTAzIDIxNyAxMiAyOTEgMjAzIDMwMyAxMjMgMTAxIDMwMiAxOTMgMzUgMTE2IDEyMiAyNTYgMjM2IDcgMjY4IAorMzMgMjQyIDE0MSAyOSAxMDggMTk5IDEyNSAyMzggNyA4NyAyODkgMjUgMjM3IDIwMCAyNzcgMTkwIDUwIDIxIDE4NSAxNTMgMTI3IDE1MyAKKzQ1IDM5IDcyIDEyMSAxMDQgNjUgMjY4IDExNSAxMzcgMTk5IDE2NiA3NiAzNiA0NiAxODggNTMgMyAxNzUgMTQ4IDE0OCAyMzAgNDAgOTggCisxNiAyMDMgNDAgMTgwIDEzMCAyNjEgMTc3IDYzIDI3MSA5NyAxMjcgMTk0IDE4NyA2OCAyNTAgMTA1IDEzMiAxMzUgMjQzIDI5MCA5NSAKKzI5NCAyNzAgMjkzIDExOCAzNyA3NSAxODggOTQgNjAgMjA0IDEwNyA0NyAyNTggMTEwIDczIDE5MSAxNjEgMTM1IDI4NCA0MyAxMjQgCisyNTMgMjU0IDE3IDI3MyAxMiAyNTAgMTQ2IDI3NCAxNjQgMTE3IDI3NCAxMjMgNjAgMjQ1IDE2NCA3NiAyMTcgOTQgMTAxIDI2MSAxMzYgCis2IDI0MiAyMjMgMTQzIDE2NiAzMiA5MyA3NSAxNDcgMzcgMzEgMjQ1IDEyMyAxOSAxODggMTM1IDIwMiAyMzMgNjYgMzEgMjg2IDI2NSAKKzQ4IDYyIDExOSAyMzAgMzAzIDQxIDI5MSAyNDQgNTYgMTUyIDYwIDI4NiAyIDEwNSA5MSA3OCAyMTQgMjcgMTExIDI2NiAyMDAgMTQgCisyNDcgNzkgMTk5IDg0IDE4MSAyODIgMTI4IDEgMzAxIDE2NyAyMjUgMTcgMjMyIDI1OSAyMjEgMTg3IDI5MCAxMzYgNDcgMjk5IDI1MiAKKzEwMiAxNTAgMTQ1IDE2MyAxNTcgXgorNjUzIDAgMTggMjk5IDIwNyA0MSAxMTcgMTg0IDE3OSAxNiAyNTIgMTggMjU1IDgzIDIwIDgyIDI2NCAxNTUgMjU3IDIxNiAyMDEgMjk2IAorNTQgMTA3IDMwMyAyNTUgMzkgMjAyIDYxIDIgMjM1IDE1NCAxNTEgODYgOTQgMTYgNzggODQgOTEgMzAgODYgNiAxNTMgMzYgOTMgMjUxIAorMjA5IDI2MiAyNDAgMTM0IDI2NiAxMTQgMTE5IDE4NyAyNDQgOCAyNCAzNSAyMiA3NiA4MSAyNiAzOCA4IDY4IDgwIDQzIDMyIDEgMTI5IAorMjQgNDQgMTkxIDExOCA3MiAyNTEgMTY1IDEzOCAxNDAgOTkgNDAgMTEgNTQgMTUxIDQyIDI3NiAzMDEgMTIyIDE2NCA2NyAyNzEgNTAgCisxODkgMTE1IDcgMTgwIDg3IDIwMCAxNDYgMTg1IDI4NSA2NyA1MyAyMTkgMjMxIDEwNiAxNTMgMSAyMTcgMjcyIDE2NSAxODIgMjY0IAorMTk5IDc1IDIzNyAxNTcgMjE2IDE1NyAxNzIgMzMgNzIgNzcgMTUyIDI4MCA4NyAyNDQgMjcwIDIwNiAyNDEgMjkzIDc3IDI4NCA0MCAKKzIyOSAxOTEgMzAgMTMwIDEzMCAxNzQgMjk4IDEzIDQ4IDI3NCAyOTggNTcgOTMgMjk1IDI3IDI4MyAxOTYgNTQgNjMgMTc5IDIzNCA0IAorMjgyIDM3IDI0MyAxMjAgMzEgMTEzIDEzNiAxODEgMjM3IDY5IDI3NCAzNiAxODEgMTkzIDI1MSAyNTMgODAgMjYxIDkwIDE4NiAxMzggCisxODQgMjIzIDYxIDQ2IDUzIDE3NSAxMDcgNiAxOTcgODEgMTE0IDIwNyAxMjkgNTkgMzA1IDE3MCAxNjIgNzMgMTQ4IDEwMCAxMDIgMTcgCisxNDAgMTEgOTggMjc1IDE0MiA1IDIyMSAxNDYgMjI5IDEwMyA4OCA5IDEzOSAyOCAxNzEgMTg5IDIwMyAyNTUgMzAxIDc4IDQwIDI3MyA5IAorNTEgODYgNTAgMjc3IDU3IDQ5IDE3MSAyMzMgMjEgMjc2IDI1NyAzMDQgNjQgMzIgNDUgMjUzIDEyNCA3OSAxMTEgMjIxIDU4IDI4NyAKKzI4OCAxNzYgMTY5IDEyIDIwNCAyMCAxNzAgMjA2IDE5NyAxNjkgNTYgMjIgNDEgMjA1IDEyNiAzMDAgMjM0IDkyIDE0NSA3OSAxNTUgMzkgCisxNTggMjQzIDIwOCAyMDAgMjM0IDQ4IDIxIDU4IDE5OSA0MCA1NSAxNzggMTcyIDc3IDE5NiA5OCAxODcgMjAwIDE5MCAzIDIzIDI3OSAKKzE2IDI5NiAxNDIgNDkgMzkgMjQ2IDE4NSAyMyAxOTEgNzQgMjU0IDE1MSAxMzAgMjE4IDExNiAzNCA0IDE5NCA5NSAxMjIgMjA4IDExMiAKKzI5MiA2IDEwOSAyMTggNzIgMjk1IDI4OSAxNTkgMTc1IDE5IDE0MyA3NiAxNjkgMjc0IDgwIDMwNSAyMTQgMjg2IDE3MyAxMDQgMjAgCisxMjYgODIgMTc2IDIxMyAxMzYgMjI1IDU1IDkwIDIzMCAyNjIgMjg0IDI1OCA2MCA3MCAzOSAyOTAgMyA0NCAxNDcgMzAwIDI3OCAyMTYgCisyNDUgMzUgNzUgNjMgMjIzIDUyIDEwNCAyMzggMjYzIDI2NyAxODUgNjcgOSA5NSAyMTAgNzEgMjMzIDI4MyAxNTIgMjM2IDQyIDE0NCA4IAorMjg2IDIxNyAyMjggNDEgMTYxIDIgMjc5IDI3OCAxNzIgMTIxIDE0IDExOSAxNDMgMTIwIDI5MyA2OCAzNiAyMjUgMTEgNDUgMjA5IDU4IAorMTU1IDMwMSAzNCAyMjIgMjUyIDI4MCAxMzEgNjIgMjkxIDE2MiAxNjEgOTAgMTQyIDE0IDE2MyAyNjcgMTQxIDI0OSAyOTQgMTM5IDI5MCAKKzQ3IDE2OCAyNDcgMjkgMTk4IDEzIDQgMTUwIDI3NyAxMDEgMTczIDE5MiAyNjggMjQ3IDczIDE2IDM0IDI2NiA3MCA3NCAxNjYgMjg4IAorODggMjI3IDI3NiAyMTMgMTgwIDQzIDc2IDEyNSAxNTAgNTkgNDMgMjk0IDE4MyAxMDggNjggMTI0IDE2NyA1MyAyNjMgNDkgMTI3IDEwOSAKKzE0IDMxIDIwMSA3OCAzMDIgMTQ5IDIxNSA5NSAxNjYgMjYgMjEyIDIxIDIzMiAxMzMgMjgzIDEwOCAxMTIgMjQ4IDE4OCA5IDE4MyAxNTIgCisxOTIgMjI0IDEyMyAyNzkgNjAgMTE0IDE2MyA1IDI2NSAyNzAgMjUwIDU5IDggMTEyIDIwNCA2NCAyOTQgMjI3IDIzMiA4OSAxNTkgODcgCisxNTYgMjIgODUgMjMgMTQ3IDI1NiAxNTQgMTk1IDIxMCAxMTUgNTEgMzA0IDEwOCAxNTYgNjYgMjA5IDQ0IDEwMyAxNzYgMjU3IDI2MCAKKzE5IDExIDEwIDI3IDIxIDE0IDc1IDE5IDk5IDI1OCA2OSAxMiAxNjAgMjAyIDE0OSAxNzEgMjc3IDE0NSAyOTcgMjkyIDIyNCAxNjcgOTcgCis4MSA3MCA4MyAyOSAyNCA2NyA5NyAzNyAyNSA2MiA3MyAxMDQgMjgyIDIgNjEgMjIwIDI5MyAzMyAxNjAgMjQ2IDI3MyAyNzEgNiA2NSAKKzk0IDUxIDI2MCA2MyAxMzUgMTEwIDI4OSAyNDcgMzggMTQwIDU1IDIyMiAyOTYgOTggMjMxIDE4IDIxMSAyNjUgMjI2IDEyNiAzOCA1MiAKKzE5MiAxODAgMzA1IDI1OCAyNSAxOTQgMTM5IDI0NiAyMjkgMTQ3IDIxMiAzMCAxNzQgMjU0IDE5NSAyNTQgMjM5IDcyIDMzIDI4IDI1OSAKKzEzMSAxOCAxNjcgMTQxIDIwNSAxNzAgMTE4IDI4IDEyNyA2NSAxODIgMjIwIDc1IDI4MSAyODEgMjM3IDExMyA5MiA1NyAxMzcgMTEzIAorNDggMTIgMTE2IDc4IDEyOCAyMTUgNTEgNDIgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI5MSAxNjEgXgorNjUzIDAgMjk2IDI3NSAyMjggMTc0IDM0IDEzNiA2NyAyMjkgMjE4IDE1OCAxNTggMjQgMTQ5IDEzIDIyMyAyNzEgMjI1IDE4NiA0MSA1OSAKKzUyIDIzNCAzMDIgMjAgMjE0IDIxIDI5NSAyMDIgMjgyIDQ2IDEwNiAyNDAgMjQ5IDI5IDI2MiA0IDIgODcgMjcxIDE1IDQgMTM2IDI2OSAKKzEwMCAxODggMjYzIDE4MiAxIDE0IDk0IDI3MCA3NiAyNDAgMjIwIDIwNyAxNTYgMTA5IDI2IDY0IDEzNiA5NiA1MSAxNyA1MyAxMzQgNDcgCis1MyAyMzkgMTc2IDgzIDEzNCAxNTIgMTA2IDM4IDcxIDU5IDE1NyAyODcgMjUgMjk4IDE5MCA0NCAxMjMgMTIxIDIzNSAyNDEgOTEgMjA2IAorODMgMjM5IDIwNSAyMTIgMjQwIDQ3IDgyIDYxIDIwNiAyODUgMTEwIDE3NSAxMCAyNjQgMjQgMjU0IDY2IDI1MyAxNjYgMjAxIDIwOSAKKzE3NiA1NCA1IDQ2IDIxMSA2MiA0OCAyMzEgMjM4IDI3IDIxMyA2IDIyNCAyMTAgMjIwIDEwMiAxMDMgMyAxMzEgODggMTEzIDI2OCA1NiAKKzY0IDE2NSAyMjUgODEgMjE5IDI5IDE1NyAyNTggMjc5IDE5MiAyOTUgNjggMTAwIDIxNyA5IDI4OCAyMDMgMjk3IDExNyA5OCAzMDIgCisxOTMgMzIgMTE2IDEyMiAyNTAgMjM2IDcgMjY4IDI3IDI0MiAxMzUgMjMgMTA1IDE5NiAxMjUgMjM4IDMwNSA4NCAyODMgMjIgMjM0IAorMTk3IDI3NCAxODQgNTAgMTIgMTc5IDE0NyAxMjcgMTUzIDQ1IDMzIDYzIDEyMSAxMDEgNTkgMjYyIDEwOSAxMzEgMTkzIDE2NiA2NyAyNyAKKzQwIDE4OCA1MyAxNzIgMTQ4IDE0MiAyMjQgMzcgOTUgNyAyMDAgMzEgMTc3IDEyNyAyNTggMTc0IDYzIDI2NSA5NyAxMjQgMTk0IDE4MSAKKzYyIDI1MCAxMDIgMTMyIDEzMiAyMzcgMjkwIDg5IDI5MSAyNjcgMjkwIDExOCAzNyA2NiAxODUgOTQgNjAgMjAxIDEwNCA0NyAyNTUgCisxMTAgNzAgMTg4IDE1OCAxMjkgMjc4IDQzIDExOCAyNDcgMjQ4IDE0IDI2NyAxMiAyNDcgMTQzIDI2OCAxNjEgMTE3IDI3MSAxMjAgNTcgCisyNDIgMTY0IDc2IDIxMSA5MSAxMDEgMjYxIDEzMyAzIDIzNiAyMTcgMTQzIDE2MyAzMiA4NyA2OSAxNDQgMzQgMzEgMjQ1IDEyMyAxNiAKKzE4MiAxMzUgMTk2IDIzMCA2MCAyOCAyODYgMjU5IDQ1IDYyIDExNiAyMjcgMzAzIDM1IDI4NSAyNDQgNTAgMTQ2IDU0IDI4MyAzMDAgCisxMDUgOTEgNzIgMjA4IDI3IDEwOCAyNjAgMTk0IDggMjQ0IDc5IDE5OSA4NCAxNzggMjc2IDEyOCAzMDIgMjk4IDE2MSAyMjIgMTcgMjI2IAorMjU5IDIxOCAxODcgMjg3IDEzMCA0NCAyOTYgMjQ2IDk5IDE0NCAxMzkgMTYwIDQ0IDE4IDI5OSAyMDUgMzkgMTE1IDE4MyAxNzkgMTMgCisyNTIgMTcgMjU1IDgxIDE3IDgyIDI2MyAxNTMgMjU1IDIxNSAxOTkgMjk0IDUzIDEwNSAzMDEgMjU0IDM3IDIwMCA2MCAzMDYgMjMzIAorMTUzIDE1MCA4NiA5MyAxNiA3NyA4MiA5MCAyOCA4NCA1IDE1MSAzMyA5MiAyNTAgMjA3IDI2MSAyMzggMTMyIDI2NiAxMTIgMTE5IDE4NiAKKzI0MyA2IDIyIDMyIDE5IDczIDc5IDI2IDM1IDcgNjYgODAgNDEgMzAgMzA2IDEyOCAyNCA0NCAxOTEgMTE3IDY5IDI0OSAxNjMgMTM3IAorMTQwIDk5IDM5IDEwIDU0IDE0OSA0MiAyNzYgMzAxIDEyMCAxNjIgNjQgMjcwIDQ3IDE4NyAxMTQgNSAxODAgODYgMTk4IDE0NSAxODMgCisyODQgNjYgNTEgMjE5IDIzMSAxMDQgMTUyIDEgMjE2IDI3MiAxNjQgMTgxIDI2NCAxOTcgNzIgMjM3IDE1NiAyMTQgMTU1IDE3MCAzMSAKKzcyIDc0IDE1MiAyNzkgODcgMjQyIDI2OSAyMDUgMjQxIDI5MyA3NyAyODQgMzcgMjI5IDE4OSAyOSAxMjggMTI5IDE3MyAyOTcgMTIgNDUgCisyNzIgMjk4IDU2IDkzIDI5NCAyNCAyODMgMTk1IDUyIDYxIDE3NyAyMzIgNCAyODAgMzQgMjQxIDEyMCAyOCAxMTMgMTM0IDE4MSAyMzUgCis2OCAyNzMgMzUgMTgwIDE5MSAyNTEgMjUxIDc4IDI2MCA4OSAxODYgMTM4IDE4NCAyMjMgNjEgNDMgNTAgMTc1IDEwNyA2IDE5NSA4MSAKKzExNCAyMDcgMTI3IDU2IDMwMyAxNjkgMTYwIDczIDE0NyA5OCAxMDAgMTUgMTM4IDExIDk4IDI3MyAxNDAgMiAyMjEgMTQ2IDIyNyAxMDEgCis4OCA4IDEzOSAyNiAxNjkgMTg5IDIwMiAyNTMgMzAwIDc2IDM4IDI3MyA2IDUxIDg1IDQ5IDI3NSA1NSA0OSAxNzAgMjMzIDE5IDI3NSAKKzI1NyAzMDMgNjQgMzEgNDMgMjUyIDEyMiA3NyAxMTEgMjE5IDU4IDI4NiAyODggMTc0IDE2OCAxMSAyMDMgMTkgMTcwIDIwNCAxOTcgCisxNjkgNTUgMjAgNDEgMjAzIDEyNCAyOTkgMjM0IDkyIDE0NSA3OCAxNTUgMzYgMTU2IDI0MyAyMDggMjAwIDIzMyA0OCAyMSA1NiAxOTggCis0MCA1NCAxNzggMTcxIDc1IDE5NiA5NiAxODUgMTk5IDE4OSAzMDYgMjMgMjc4IDE0IDI5NiAxNDEgNDYgMzggMjQ0IDE4NCAyMSAxOTAgCis3MyAyNTIgMTUxIDEzMCAyMTcgMTE0IDM0IDIgMTkyIDkzIDEyMSAyMDYgMTEyIDI5MiA0IDEwNyAyMTYgNzAgMjkzIDExMiBeCis2NDYgMSAxNTkgMTY5IDE5IDEzNyA3MyAxNjMgMjc0IDc3IDMwMiAyMTEgMjgwIDE2NyAxMDQgMTQgMTI2IDc2IDE3MyAyMTAgMTMzIAorMjI1IDQ2IDkwIDIzMCAyNjIgMjc4IDI1MiA1MSA2NyAzOSAyODQgMzA2IDQxIDE0NyAzMDAgMjc4IDIxNiAyMzkgMzUgNzUgNjAgMjE3IAorNDMgOTggMjM1IDI1NyAyNjcgMTg1IDYxIDMgOTUgMjA3IDcxIDIzMCAyODAgMTQ5IDIzMyAzMyAxNDQgMzA4IDI4MyAyMTEgMjI4IDM4IAorMTU1IDMwNSAyNzMgMjc1IDE3MiAxMTUgMTEgMTE2IDE0MCAxMTcgMjg3IDU5IDM2IDIyMiAyIDM2IDIwNiAzMDMgNDkgMTUyIDI5NSAyOCAKKzIxOSAyNDkgMjgwIDEzMSA1MyAyOTEgMTYyIDE2MSA4NCAxNDIgMTQgMTYwIDI2NCAxNDEgMjQ2IDI4OCAxMzYgMjg3IDQxIDE2NSAyNDEgCisyMCAxOTggNyAzMDQgMTQ0IDI3NCA5NSAxNzMgMTkyIDI2MiAyNDQgNjQgMTMgMzEgMjYzIDY0IDY1IDE2MCAyODIgODIgMjI3IDI3MCAKKzIxMyAxNzcgNDAgNzAgMTE5IDE1MCA1MyAzNCAyOTEgMTgwIDEwMiA2NSAxMjQgMTYxIDUwIDI2MyA0NiAxMjQgMTA5IDMwMCA1IDI4IAorMjAxIDY5IDI5OSAxNDkgMjE1IDkyIDE2MyAxNyAyMDYgMTIgMjI5IDEzMyAyNzcgMTA1IDEwOSAyNDggMTg1IDkgMTgzIDE0NiAxODkgCisyMTggMTIwIDI3OSA1NCAxMTEgMTYzIDMwOCAyNjUgMjcwIDI0NyA1NiA4IDEwNiAyMDQgNjEgMjk0IDIyNCAyMjYgODkgMTUzIDgxIAorMTUwIDE5IDg1IDE0IDE0NCAyNTYgMTU0IDE5MiAyMTAgMTE1IDQ1IDMwNCAxMDggMTUzIDYzIDIwOSAzOCAxMDMgMTc2IDI1NCAyNTcgCisxMCA1IDEwIDIxIDE4IDggNzIgMTYgOTMgMjU4IDY5IDYgMTU3IDIwMiAxNDYgMTcxIDI3NyAxMzkgMjk3IDI4NiAyMjEgMTY0IDk0IDc4IAorNzAgODMgMjkgMjEgNjcgOTEgMzQgMTYgNTkgNzAgMTAxIDI3OSAyIDUyIDIxNCAyOTAgMzMgMTYwIDI0NiAyNzAgMjY1IDMwNiA1OSA4OCAKKzQyIDI2MCA1NCAxMjkgMTA0IDI4OSAyNDcgMzggMTM3IDU1IDIyMiAyOTMgOTUgMjI1IDEyIDIxMSAyNjIgMjI2IDEyMyAzMiA0OSAxODYgCisxNzQgMzA1IDI1NSAyNSAxOTEgMTMzIDI0MyAyMjYgMTQxIDIxMiAzMCAxNjggMjUxIDE5NSAyNTQgMjM5IDY5IDI0IDI4IDI1MyAxMjggCis5IDE2NyAxMzggMjAyIDE2NCAxMTIgMTkgMTIxIDY1IDE3NiAyMjAgNjkgMjgxIDI3OCAyMzQgMTEwIDg2IDU3IDEzNyAxMDcgNDIgMyAKKzExMyA3OCAxMjIgMjEyIDQ4IDM5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyODUgNzQgMjkyIDI3NSAyMjQgMTc0IDMwIDEzNCA2MyAyMjcgCisyMTggMTU0IDE1OCAyMiAxNDcgOSAyMTkgMjY3IDIyMSAxODIgMzUgNTkgNTIgMjMwIDI5OCAyMCAyMTQgMTUgMjkxIDE5OCAyODIgNDYgCisxMDYgMjM4IDI0OSAyMyAyNjAgMiA4NSAyNzEgMTUgMzA3IDEzNiAyNjkgMTAwIDE4NCAyNTkgMTgyIDMwOCA4IDkwIDI2NiA3NCAyNDAgCisyMTYgMjA1IDE1NiAxMDcgMjQgNjIgMTMyIDk2IDQ1IDEzIDQ5IDEzNCA0NSA0NyAyMzcgMTcyIDgxIDEzMiAxNDggMTA0IDMyIDY3IDU3IAorMTU1IDI4NyAyMyAyOTQgMTkwIDM4IDEyMSAxMTcgMjM1IDIzOSA4NyAyMDQgNzkgMjM1IDIwNSAyMDggMjM2IDQzIDgwIDU1IDIwNiAKKzI4NSAxMDggMTcxIDQgMjYwIDIwIDI1MCA2NiAyNTMgMTYyIDE5NyAyMDUgMTc0IDQ4IDUgNDQgMjA5IDU2IDQ0IDIyNyAyMzYgMjUgCisyMDkgNCAyMjQgMjA4IDIxOCAxMDIgOTkgMyAxMjkgODYgMTA5IDI2NiA1NiA2MCAxNjUgMjIzIDc5IDIxNyAyNSAxNTcgMjU0IDI3NSAKKzE5MCAyOTUgNjIgOTggMjE3IDcgMjg2IDIwMyAyOTMgMTEzIDk2IDMwMiAxOTMgMzAgMTE2IDEyMiAyNDYgMjM2IDcgMjY4IDIzIDI0MiAKKzEzMSAxOSAxMDMgMTk0IDEyNSAyMzggMzAxIDgyIDI3OSAyMCAyMzIgMTk1IDI3MiAxODAgNTAgNiAxNzUgMTQzIDEyNyAxNTMgNDUgMjkgCis1NyAxMjEgOTkgNTUgMjU4IDEwNSAxMjcgMTg5IDE2NiA2MSAyMSAzNiAxODggNTMgMzA3IDE3MCAxNDggMTM4IDIyMCAzNSA5MyAxIAorMTk4IDI1IDE3NSAxMjUgMjU2IDE3MiA2MyAyNjEgOTcgMTIyIDE5NCAxNzcgNTggMjUwIDEwMCAxMzIgMTMwIDIzMyAyOTAgODUgMjg5IAorMjY1IDI4OCAxMTggMzcgNjAgMTgzIDk0IDYwIDE5OSAxMDIgNDcgMjUzIDExMCA2OCAxODYgMTU2IDEyNSAyNzQgNDMgMTE0IDI0MyAKKzI0NCAxMiAyNjMgMTIgMjQ1IDE0MSAyNjQgMTU5IDExNyAyNjkgMTE4IDU1IDI0MCAxNjQgNzYgMjA3IDg5IDEwMSAyNjEgMTMxIDEgCisyMzIgMjEzIDE0MyAxNjEgMzIgODMgNjUgMTQyIDMyIDMxIDI0NSAxMjMgMTQgMTc4IDEzNSAxOTIgMjI4IDU2IDI2IDI4NiAyNTUgNDMgCis2MiAxMTQgMjI1IDMwMyAzMSAyODEgMjQ0IDQ2IDE0MiA1MCAyODEgMjk2IDEwNSA5MSAyMzggXgorNjQ3IDAgMjAwIDI3IDEwNCAyNTIgMTg2IDI0MCA3OSAxOTkgODQgMTc0IDI2OCAxMjggMjk4IDI5NCAxNTMgMjE4IDE3IDIxOCAyNTkgCisyMTQgMTg3IDI4MyAxMjIgNDAgMjkyIDIzOCA5NSAxMzYgMTMxIDE1NiAzNiAxOCAyOTkgMTk3IDMxIDEwNyAxNzkgMTc5IDEgMjUyIDEzIAorMjU1IDczIDUgODIgMjU5IDE0NSAyNDcgMjExIDE5MSAyODYgNDkgOTcgMjkzIDI1MCAyOSAxOTIgNTYgMjk4IDIyNSAxNDkgMTQ2IDg2IAorODkgMTYgNzMgNzQgODYgMjAgNzYgMSAxNDMgMjEgODggMjQ2IDE5OSAyNTcgMjMwIDEyNCAyNjYgMTA0IDExOSAxODIgMjM5IDMwOSAxNCAKKzIwIDcgNjEgNzEgMjYgMjMgMyA1OCA4MCAzMyAyMiAzMDIgMTI0IDI0IDQ0IDE5MSAxMTMgNTcgMjQxIDE1NSAxMzMgMTQwIDk5IDM1IDYgCis1NCAxNDEgNDIgMjc2IDMwMSAxMTIgMTU0IDUyIDI2NiAzNSAxNzkgMTEwIDMwOCAxODAgODIgMTkwIDE0MSAxNzUgMjgwIDYyIDQzIAorMjE5IDIzMSA5NiAxNDggMSAyMTIgMjcyIDE2MCAxNzcgMjY0IDE4OSA2MCAyMzcgMTUyIDIwNiAxNDcgMTYyIDIzIDcyIDYyIDE1MiAKKzI3NSA4NyAyMzQgMjY1IDIwMSAyNDEgMjkzIDc3IDI4NCAyNSAyMjkgMTgxIDI1IDEyMCAxMjUgMTY5IDI5MyA4IDMzIDI2NCAyOTggNTIgCis5MyAyOTAgMTIgMjgzIDE5MSA0NCA1MyAxNjkgMjI0IDQgMjcyIDIyIDIzMyAxMjAgMTYgMTEzIDEyNiAxODEgMjI3IDY0IDI2OSAzMSAKKzE3NiAxODMgMjUxIDI0MyA3MCAyNTYgODUgMTg2IDEzOCAxODQgMjIzIDYxIDMxIDM4IDE3NSAxMDcgNiAxODcgODEgMTE0IDIwNyAxMTkgCis0NCAyOTUgMTY1IDE1MiA3MyAxNDMgOTAgOTIgNyAxMzAgMTEgOTggMjY1IDEzMiAzMDEgMjIxIDE0NiAyMTkgOTMgODggNCAxMzkgMTggCisxNjEgMTg5IDE5OCAyNDUgMjk2IDY4IDMwIDI3MyAzMDUgNTEgODEgNDUgMjY3IDQ3IDQ5IDE2NiAyMzMgMTEgMjcxIDI1NyAyOTkgNjQgCisyNyAzNSAyNDggMTE0IDY5IDExMSAyMTEgNTggMjgyIDI4OCAxNjYgMTY0IDcgMTk5IDE1IDE3MCAxOTYgMTk3IDE2OSA1MSAxMiA0MSAKKzE5NSAxMTYgMjk1IDIzNCA5MiAxNDUgNzQgMTU1IDI0IDE0OCAyNDMgMjA4IDIwMCAyMjkgNDggMjEgNDggMTk0IDQwIDUwIDE3OCAxNjcgCis2NyAxOTYgODggMTc3IDE5NSAxODUgMjk5IDMwNiAyMyAyNzQgNiAyOTYgMTM3IDM0IDM0IDIzNiAxODAgMTMgMTg2IDY5IDI0NCAxNTEgCisxMzAgMjEzIDEwNiAzNCAzMDUgMTg0IDg1IDExNyAxOTggMTEyIDI5MiAzMDcgOTkgMjA4IDYyIDI4NSAyNzkgMTU5IDE2NSAxOSAxMzMgCis3MSAxNTkgMjc0IDc1IDMwMCAyMDkgMjc2IDE2MyAxMDQgMTAgMTI2IDcyIDE3MSAyMDggMTMxIDIyNSA0MCA5MCAyMzAgMjYyIDI3NCAKKzI0OCA0NSA2NSAzOSAyODAgMzA0IDM5IDE0NyAzMDAgMjc4IDIxNiAyMzUgMzUgNzUgNTggMjEzIDM3IDk0IDIzMyAyNTMgMjY3IDE4NSAKKzU3IDMxMCA5NSAyMDUgNzEgMjI4IDI3OCAxNDcgMjMxIDI3IDE0NCAzMDQgMjgxIDIwNyAyMjggMzYgMTUxIDMwMyAyNjkgMjczIDE3MiAKKzExMSA5IDExNCAxMzggMTE1IDI4MyA1MyAzNiAyMjAgMzA3IDMwIDIwNCAzMDEgNDMgMTUwIDI5MSAyNCAyMTcgMjQ3IDI4MCAxMzEgNDcgCisyOTEgMTYyIDE2MSA4MCAxNDIgMTQgMTU4IDI2MiAxNDEgMjQ0IDI4NCAxMzQgMjg1IDM3IDE2MyAyMzcgMTQgMTk4IDMgMzAwIDE0MCAKKzI3MiA5MSAxNzMgMTkyIDI1OCAyNDIgNTggMTEgMjkgMjYxIDYwIDU5IDE1NiAyNzggNzggMjI3IDI2NiAyMTMgMTc1IDM4IDY2IDExNSAKKzE1MCA0OSAyOCAyODkgMTc4IDk4IDYzIDEyNCAxNTcgNDggMjYzIDQ0IDEyMiAxMDkgMjk2IDMxMCAyNiAyMDEgNjMgMjk3IDE0OSAyMTUgCis5MCAxNjEgMTEgMjAyIDYgMjI3IDEzMyAyNzMgMTAzIDEwNyAyNDggMTgzIDkgMTgzIDE0MiAxODcgMjE0IDExOCAyNzkgNTAgMTA5IAorMTYzIDMwNiAyNjUgMjcwIDI0NSA1NCA4IDEwMiAyMDQgNTkgMjk0IDIyMiAyMjIgODkgMTQ5IDc3IDE0NiAxNyA4NSA4IDE0MiAyNTYgCisxNTQgMTkwIDIxMCAxMTUgNDEgMzA0IDEwOCAxNTEgNjEgMjA5IDM0IDEwMyAxNzYgMjUyIDI1NSA0IDEgMTAgMTcgMTYgNCA3MCAxNCAKKzg5IDI1OCA2OSAyIDE1NSAyMDIgMTQ0IDE3MSAyNzcgMTM1IDI5NyAyODIgMjE5IDE2MiA5MiA3NiA3MCA4MyAyOSAxOSA2NyA4NyAzMiAKKzEwIDU3IDY4IDk5IDI3NyAyIDQ2IDIxMCAyODggMzMgMTYwIDI0NiAyNjggMjYxIDMwMiA1NSA4NCAzNiAyNjAgNDggMTI1IDEwMCAyODkgCisyNDcgMzggMTM1IDU1IDIyMiAyOTEgOTMgMjIxIDggMjExIDI2MCAyMjYgMTIxIDI4IDQ3IDE4MiAxNzAgMzA1IDI1MyAyNSAxODkgMTI5IAorMjQxIDIyNCAxMzcgMjEyIDMwIDE2NCAyNDkgMTk1IDI1NCAyMzkgODYgXgorNjY1IDAgMTUgMjggMjQ3IDEyNSAxNjcgMTM1IDE5OSAxNTggMTA2IDEwIDExNSA2NSAxNzAgMjIwIDYzIDI4MSAyNzUgMjMxIDEwNyA4MCAKKzU3IDEzNyAxMDEgMzYgMzA2IDExMCA3OCAxMTYgMjA5IDQ1IDM2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNzkgNzQgMjg2IDI3NSAyMTggCisxNzQgMjQgMTMxIDU3IDIyNCAyMTggMTQ4IDE1OCAxOSAxNDQgMyAyMTMgMjYxIDIxNSAxNzYgMjYgNTkgNTIgMjI0IDI5MiAyMCAyMTQgCis2IDI4NSAxOTIgMjgyIDQ2IDEwNiAyMzUgMjQ5IDE0IDI1NyAzMTEgMzA5IDgyIDI3MSAxNSAzMDEgMTM2IDI2OSAxMDAgMTc4IDI1MyAKKzE4MiAzMDggMzExIDg0IDI2MCA3MSAyNDAgMjEwIDIwMiAxNTYgMTA0IDIxIDU5IDEyNiA5NiAzNiA3IDQzIDEzNCA0MiAzOCAyMzQgCisxNjYgNzggMTI5IDE0MiAxMDEgMjMgNjEgNTQgMTUyIDI4NyAyMCAyODggMTkwIDI5IDExOCAxMTEgMjM1IDIzNiA4MSAyMDEgNzMgMjI5IAorMjA1IDIwMiAyMzAgMzcgNzcgNDYgMjA2IDI4NSAxMDUgMTY1IDMwNyAyNTQgMTQgMjQ0IDY2IDI1MyAxNTYgMTkxIDE5OSAxNzEgMzkgNSAKKzQxIDIwNiA0NyAzOCAyMjEgMjMzIDIyIDIwMyAxIDIyNCAyMDUgMjE1IDEwMiA5MyAzIDEyNiA4MyAxMDMgMjYzIDU2IDU0IDE2NSAyMjAgCis3NiAyMTQgMTkgMTU3IDI0OCAyNjkgMTg3IDI5NSA1MyA5NSAyMTcgNCAyODMgMjAzIDI4NyAxMDcgOTMgMzAyIDE5MyAyNyAxMTYgMTIyIAorMjQwIDIzNiA3IDI2OCAxNyAyNDIgMTI1IDEzIDEwMCAxOTEgMTI1IDIzOCAyOTUgNzkgMjczIDE3IDIyOSAxOTIgMjY5IDE3NCA1MCAKKzMwOSAxNjkgMTM3IDEyNyAxNTMgNDUgMjMgNDggMTIxIDk2IDQ5IDI1MiA5OSAxMjEgMTgzIDE2NiA1MiAxMiAzMCAxODggNTMgMzA3IAorMTY3IDE0OCAxMzIgMjE0IDMyIDkwIDMwNCAxOTUgMTYgMTcyIDEyMiAyNTMgMTY5IDYzIDI1NSA5NyAxMTkgMTk0IDE3MSA1MiAyNTAgCis5NyAxMzIgMTI3IDIyNyAyOTAgNzkgMjg2IDI2MiAyODUgMTE4IDM3IDUxIDE4MCA5NCA2MCAxOTYgOTkgNDcgMjUwIDExMCA2NSAxODMgCisxNTMgMTE5IDI2OCA0MyAxMDggMjM3IDIzOCA5IDI1NyAxMiAyNDIgMTM4IDI1OCAxNTYgMTE3IDI2NiAxMTUgNTIgMjM3IDE2NCA3NiAKKzIwMSA4NiAxMDEgMjYxIDEyOCAzMTAgMjI2IDIwNyAxNDMgMTU4IDMyIDc3IDU5IDEzOSAyOSAzMSAyNDUgMTIzIDExIDE3MiAxMzUgCisxODYgMjI1IDUwIDIzIDI4NiAyNDkgNDAgNjIgMTExIDIyMiAzMDMgMjUgMjc1IDI0NCA0MCAxMzYgNDQgMjc4IDI5MCAxMDUgOTEgNjIgCisxOTggMjcgMTAzIDI1MCAxODQgMzEwIDIzOSA3OSAxOTkgODQgMTczIDI2NiAxMjggMjk3IDI5MyAxNTEgMjE3IDE3IDIxNiAyNTkgMjEzIAorMTg3IDI4MiAxMjAgMzkgMjkxIDIzNiA5NCAxMzQgMTI5IDE1NSAzNCAxOCAyOTkgMTk1IDI5IDEwNSAxNzggMTc5IDMxMCAyNTIgMTIgCisyNTUgNzEgMiA4MiAyNTggMTQzIDI0NSAyMTAgMTg5IDI4NCA0OCA5NSAyOTEgMjQ5IDI3IDE5MCA1NSAyOTYgMjIzIDE0OCAxNDUgODYgCis4OCAxNiA3MiA3MiA4NSAxOCA3NCAxNDEgMTggODcgMjQ1IDE5NyAyNTYgMjI4IDEyMiAyNjYgMTAyIDExOSAxODEgMjM4IDMwOCAxMiAKKzE3IDQgNTggNjkgMjYgMjAgMiA1NiA4MCAzMSAyMCAzMDEgMTIzIDI0IDQ0IDE5MSAxMTIgNTQgMjM5IDE1MyAxMzIgMTQwIDk5IDM0IDUgCis1NCAxMzkgNDIgMjc2IDMwMSAxMTAgMTUyIDQ5IDI2NSAzMiAxNzcgMTA5IDMwNyAxODAgODEgMTg4IDE0MCAxNzMgMjc5IDYxIDQxIAorMjE5IDIzMSA5NCAxNDcgMSAyMTEgMjcyIDE1OSAxNzYgMjY0IDE4NyA1NyAyMzcgMTUxIDIwNCAxNDUgMTYwIDIxIDcyIDU5IDE1MiAKKzI3NCA4NyAyMzIgMjY0IDIwMCAyNDEgMjkzIDc3IDI4NCAyMiAyMjkgMTc5IDI0IDExOCAxMjQgMTY4IDI5MiA3IDMwIDI2MiAyOTggNTEgCis5MyAyODkgOSAyODMgMTkwIDQyIDUxIDE2NyAyMjIgNCAyNzAgMTkgMjMxIDEyMCAxMyAxMTMgMTI0IDE4MSAyMjUgNjMgMjY4IDMwIAorMTc1IDE4MSAyNTEgMjQxIDY4IDI1NSA4NCAxODYgMTM4IDE4NCAyMjMgNjEgMjggMzUgMTc1IDEwNyA2IDE4NSA4MSAxMTQgMjA3IDExNyAKKzQxIDI5MyAxNjQgMTUwIDczIDE0MiA4OCA5MCA1IDEyOCAxMSA5OCAyNjMgMTMwIDI5OSAyMjEgMTQ2IDIxNyA5MSA4OCAzIDEzOSAxNiAKKzE1OSAxODkgMTk3IDI0MyAyOTUgNjYgMjggMjczIDMwMyA1MSA4MCA0NCAyNjUgNDUgNDkgMTY1IDIzMyA5IDI3MCAyNTcgMjk4IDY0IAorMjYgMzMgMjQ3IDExMiA2NyAxMTEgMjA5IDU4IDI4MSAyODggMTY0IDE2MyA2IDE5OCAxNCAxNzAgMTk0IDE5NyAxNjkgNTAgMTAgNDEgCisxOTMgMTE0IDI5NCAyMzQgOTIgMTQ1IDczIDE1NSAyMSAxNDYgMjQzIDIwOCAyMDAgMjI4IDQ4IDIxIDQ2IDE5MyA0MCA0OSAxNzggMTY2IAorNjUgMTk2IDg2IDE3NSAxOTQgMTg0IDI5NyAzMDYgMjMgMjczIDIwNiBeCis2NDEgMCAyOTYgMTM0IDI1IDMxIDIzMCAxNzcgNyAxODMgNjYgMjM4IDE1MSAxMzAgMjEwIDEwMCAzNCAzMDIgMTc4IDc5IDExNCAxOTIgCisxMTIgMjkyIDMwNCA5MyAyMDIgNTYgMjc5IDI3MyAxNTkgMTU5IDE5IDEyNyA2OCAxNTMgMjc0IDcyIDI5NyAyMDYgMjcwIDE1NyAxMDQgCis0IDEyNiA2NiAxNjggMjA1IDEyOCAyMjUgMzEgOTAgMjMwIDI2MiAyNjggMjQyIDM2IDYyIDM5IDI3NCAzMDEgMzYgMTQ3IDMwMCAyNzggCisyMTYgMjI5IDM1IDc1IDU1IDIwNyAyOCA4OCAyMzAgMjQ3IDI2NyAxODUgNTEgMzA3IDk1IDIwMiA3MSAyMjUgMjc1IDE0NCAyMjggMTggCisxNDQgMjk4IDI3OCAyMDEgMjI4IDMzIDE0NSAzMDAgMjYzIDI3MCAxNzIgMTA1IDYgMTExIDEzNSAxMTIgMjc3IDQ0IDM2IDIxNyAzMDEgCisyMSAyMDEgMjk4IDM0IDE0NyAyODUgMTggMjE0IDI0NCAyODAgMTMxIDM4IDI5MSAxNjIgMTYxIDc0IDE0MiAxNCAxNTUgMjU5IDE0MSAKKzI0MSAyNzggMTMxIDI4MiAzMSAxNjAgMjMxIDUgMTk4IDMxMSAyOTQgMTM0IDI2OSA4NSAxNzMgMTkyIDI1MiAyMzkgNDkgOCAyNiAyNTggCis1NCA1MCAxNTAgMjcyIDcyIDIyNyAyNjAgMjEzIDE3MiAzNSA2MCAxMDkgMTUwIDQzIDE5IDI4NiAxNzUgOTIgNjAgMTI0IDE1MSA0NSAKKzI2MyA0MSAxMTkgMTA5IDI5MCAzMDQgMjMgMjAxIDU0IDI5NCAxNDkgMjE1IDg3IDE1OCAyIDE5NiAzMTEgMjI0IDEzMyAyNjcgMTAwIAorMTA0IDI0OCAxODAgOSAxODMgMTM2IDE4NCAyMDggMTE1IDI3OSA0NCAxMDYgMTYzIDMwMyAyNjUgMjcwIDI0MiA1MSA4IDk2IDIwNCA1NiAKKzI5NCAyMTkgMjE2IDg5IDE0MyA3MSAxNDAgMTQgODUgMzEzIDEzOSAyNTYgMTU0IDE4NyAyMTAgMTE1IDM1IDMwNCAxMDggMTQ4IDU4IAorMjA5IDI4IDEwMyAxNzYgMjQ5IDI1MiAzMDkgMzA5IDEwIDExIDEzIDMxMiA2NyAxMSA4MyAyNTggNjkgMzEwIDE1MiAyMDIgMTQxIDE3MSAKKzI3NyAxMjkgMjk3IDI3NiAyMTYgMTU5IDg5IDczIDcwIDgzIDI5IDE2IDY3IDgxIDI5IDEgNTQgNjUgOTYgMjc0IDIgMzcgMjA0IDI4NSAKKzMzIDE2MCAyNDYgMjY1IDI1NSAyOTYgNDkgNzggMjcgMjYwIDM5IDExOSA5NCAyODkgMjQ3IDM4IDEzMiA1NSAyMjIgMjg4IDkwIDIxNSAKKzIgMjExIDI1NyAyMjYgMTE4IDIyIDQ0IDE3NiAxNjQgMzA1IDI1MCAyNSAxODYgMTIzIDIzOCAyMjEgMTMxIDIxMiAzMCAxNTggMjQ2IAorMTk1IDI1NCAyMzkgNjQgOSAyOCAyNDMgMTIzIDMwOCAxNjcgMTMzIDE5NyAxNTQgMTAyIDQgMTExIDY1IDE2NiAyMjAgNTkgMjgxIDI3MyAKKzIyOSAxMDUgNzYgNTcgMTM3IDk3IDMyIDMwMiAxMDggNzggMTEyIDIwNyA0MyAzNCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjc1IDc0IAorMjgyIDI3NSAyMTQgMTc0IDIwIDEyOSA1MyAyMjIgMjE4IDE0NCAxNTggMTcgMTQyIDMxMyAyMDkgMjU3IDIxMSAxNzIgMjAgNTkgNTIgCisyMjAgMjg4IDIwIDIxNCAyODEgMTg4IDI4MiA0NiAxMDYgMjMzIDI0OSA4IDI1NSAzMTEgMzA5IDgwIDI3MSAxNSAyOTcgMTM2IDI2OSAKKzEwMCAxNzQgMjQ5IDE4MiAzMDggMzA3IDgwIDI1NiA2OSAyNDAgMjA2IDIwMCAxNTYgMTAyIDE5IDU3IDEyMiA5NiAzMCAzIDM5IDEzNCAKKzQwIDMyIDIzMiAxNjIgNzYgMTI3IDEzOCA5OSAxNyA1NyA1MiAxNTAgMjg3IDE4IDI4NCAxOTAgMjMgMTE2IDEwNyAyMzUgMjM0IDc3IAorMTk5IDY5IDIyNSAyMDUgMTk4IDIyNiAzMyA3NSA0MCAyMDYgMjg1IDEwMyAxNjEgMzAzIDI1MCAxMCAyNDAgNjYgMjUzIDE1MiAxODcgCisxOTUgMTY5IDMzIDUgMzkgMjA0IDQxIDM0IDIxNyAyMzEgMjAgMTk5IDMxMyAyMjQgMjAzIDIxMyAxMDIgODkgMyAxMjQgODEgOTkgMjYxIAorNTYgNTAgMTY1IDIxOCA3NCAyMTIgMTUgMTU3IDI0NCAyNjUgMTg1IDI5NSA0NyA5MyAyMTcgMiAyODEgMjAzIDI4MyAxMDMgOTEgMzAyIAorMTkzIDI1IDExNiAxMjIgMjM2IDIzNiA3IDI2OCAxMyAyNDIgMTIxIDkgOTggMTg5IDEyNSAyMzggMjkxIDc3IDI2OSAxNSAyMjcgMTkwIAorMjY3IDE3MCA1MCAzMDUgMTY1IDEzMyAxMjcgMTUzIDQ1IDE5IDQyIDEyMSA5NCA0NSAyNDggOTUgMTE3IDE3OSAxNjYgNDYgNiAyNiAKKzE4OCA1MyAzMDcgMTY1IDE0OCAxMjggMjEwIDMwIDg4IDMwMCAxOTMgMTAgMTcwIDEyMCAyNTEgMTY3IDYzIDI1MSA5NyAxMTcgMTk0IAorMTY3IDQ4IDI1MCA5NSAxMzIgMTI1IDIyMyAyOTAgNzUgMjg0IDI2MCAyODMgMTE4IDM3IDQ1IDE3OCA5NCA2MCAxOTQgOTcgNDcgMjQ4IAorMTEwIDYzIDE4MSAxNTEgMTE1IDI2NCA0MyAxMDQgMjMzIDIzNCA3IDI1MyAxMiAyNDAgMTM2IDI1NCAxNTQgMTE3IDI2NCAxMTMgNTAgCisyMzUgMTY0IDc2IDE5NyA4NCAxMDEgMjYxIDEyNiAzMTAgMjIyIDIwMyAxNDMgMjc2IF4KKzY1NiAwIDMyIDY5IDUxIDEzNSAyNSAzMSAyNDUgMTIzIDcgMTY0IDEzNSAxNzggMjIxIDQyIDE5IDI4NiAyNDEgMzYgNjIgMTA3IDIxOCAKKzMwMyAxNyAyNjcgMjQ0IDMyIDEyOCAzNiAyNzQgMjgyIDEwNSA5MSA1NCAxOTAgMjcgOTkgMjQyIDE3NiAzMDYgMjM1IDc5IDE5OSA4NCAKKzE2OSAyNTggMTI4IDI5MyAyODkgMTQzIDIxMyAxNyAyMDggMjU5IDIwOSAxODcgMjc4IDExMiAzNSAyODcgMjI4IDkwIDEyNiAxMjEgCisxNTEgMjYgMTggMjk5IDE4NyAyMSA5NyAxNzQgMTc5IDMwMiAyNTIgOCAyNTUgNjMgMzA2IDgyIDI1NCAxMzUgMjM3IDIwNiAxODEgMjc2IAorNDQgODcgMjgzIDI0NSAxOSAxODIgNTEgMjg4IDIxNSAxNDQgMTQxIDg2IDg0IDE2IDY4IDY0IDgxIDEwIDY2IDMxMiAxMzMgNiA4MyAKKzI0MSAxODkgMjUyIDIyMCAxMTQgMjY2IDk0IDExOSAxNzcgMjM0IDMwNCA0IDUgMzA4IDQ2IDYxIDI2IDggMzE0IDQ4IDgwIDIzIDEyIAorMjk3IDExOSAyNCA0NCAxOTEgMTA4IDQyIDIzMSAxNDUgMTI4IDE0MCA5OSAzMCAxIDU0IDEzMSA0MiAyNzYgMzAxIDEwMiAxNDQgMzcgCisyNjEgMjAgMTY5IDEwNSAzMDMgMTgwIDc3IDE4MCAxMzYgMTY1IDI3NSA1NyAzMyAyMTkgMjMxIDg2IDE0MyAxIDIwNyAyNzIgMTU1IAorMTcyIDI2NCAxNzkgNDUgMjM3IDE0NyAxOTYgMTM3IDE1MiAxMyA3MiA0NyAxNTIgMjcwIDg3IDIyNCAyNjAgMTk2IDI0MSAyOTMgNzcgCisyODQgMTAgMjI5IDE3MSAyMCAxMTAgMTIwIDE2NCAyODggMyAxOCAyNTQgMjk4IDQ3IDkzIDI4NSAzMTMgMjgzIDE4NiAzNCA0MyAxNTkgCisyMTQgNCAyNjIgNyAyMjMgMTIwIDEgMTEzIDExNiAxODEgMjE3IDU5IDI2NCAyNiAxNzEgMTczIDI1MSAyMzMgNjAgMjUxIDgwIDE4NiAKKzEzOCAxODQgMjIzIDYxIDE2IDIzIDE3NSAxMDcgNiAxNzcgODEgMTE0IDIwNyAxMDkgMjkgMjg1IDE2MCAxNDIgNzMgMTM4IDgwIDgyIAorMzEzIDEyMCAxMSA5OCAyNTUgMTIyIDI5MSAyMjEgMTQ2IDIwOSA4MyA4OCAzMTUgMTM5IDggMTUxIDE4OSAxOTMgMjM1IDI5MSA1OCAyMCAKKzI3MyAyOTUgNTEgNzYgNDAgMjU3IDM3IDQ5IDE2MSAyMzMgMSAyNjYgMjU3IDI5NCA2NCAyMiAyNSAyNDMgMTA0IDU5IDExMSAyMDEgNTggCisyNzcgMjg4IDE1NiAxNTkgMiAxOTQgMTAgMTcwIDE4NiAxOTcgMTY5IDQ2IDIgNDEgMTg1IDEwNiAyOTAgMjM0IDkyIDE0NSA2OSAxNTUgCis5IDEzOCAyNDMgMjA4IDIwMCAyMjQgNDggMjEgMzggMTg5IDQwIDQ1IDE3OCAxNjIgNTcgMTk2IDc4IDE2NyAxOTAgMTgwIDI4OSAzMDYgCisyMyAyNjkgMzEyIDI5NiAxMzIgMTkgMjkgMjI2IDE3NSAzIDE4MSA2NCAyMzQgMTUxIDEzMCAyMDggOTYgMzQgMzAwIDE3NCA3NSAxMTIgCisxODggMTEyIDI5MiAzMDIgODkgMTk4IDUyIDI3NSAyNjkgMTU5IDE1NSAxOSAxMjMgNjYgMTQ5IDI3NCA3MCAyOTUgMjA0IDI2NiAxNTMgCisxMDQgMTI2IDYyIDE2NiAyMDMgMTI2IDIyNSAyNSA5MCAyMzAgMjYyIDI2NCAyMzggMzAgNjAgMzkgMjcwIDI5OSAzNCAxNDcgMzAwIAorMjc4IDIxNiAyMjUgMzUgNzUgNTMgMjAzIDIyIDg0IDIyOCAyNDMgMjY3IDE4NSA0NyAzMDUgOTUgMjAwIDcxIDIyMyAyNzMgMTQyIDIyNiAKKzEyIDE0NCAyOTQgMjc2IDE5NyAyMjggMzEgMTQxIDI5OCAyNTkgMjY4IDE3MiAxMDEgNCAxMDkgMTMzIDExMCAyNzMgMzggMzYgMjE1IAorMjk3IDE1IDE5OSAyOTYgMjggMTQ1IDI4MSAxNCAyMTIgMjQyIDI4MCAxMzEgMzIgMjkxIDE2MiAxNjEgNzAgMTQyIDE0IDE1MyAyNTcgCisxNDEgMjM5IDI3NCAxMjkgMjgwIDI3IDE1OCAyMjcgMzE1IDE5OCAzMDkgMjkwIDEzMCAyNjcgODEgMTczIDE5MiAyNDggMjM3IDQzIDYgCisyNCAyNTYgNTAgNDQgMTQ2IDI2OCA2OCAyMjcgMjU2IDIxMyAxNzAgMzMgNTYgMTA1IDE1MCAzOSAxMyAyODQgMTczIDg4IDU4IDEyNCAKKzE0NyA0MyAyNjMgMzkgMTE3IDEwOSAyODYgMzAwIDIxIDIwMSA0OCAyOTIgMTQ5IDIxNSA4NSAxNTYgMzEyIDE5MiAzMDcgMjIyIDEzMyAKKzI2MyA5OCAxMDIgMjQ4IDE3OCA5IDE4MyAxMzIgMTgyIDIwNCAxMTMgMjc5IDQwIDEwNCAxNjMgMzAxIDI2NSAyNzAgMjQwIDQ5IDggOTIgCisyMDQgNTQgMjk0IDIxNyAyMTIgODkgMTM5IDY3IDEzNiAxMiA4NSAzMDkgMTM3IDI1NiAxNTQgMTg1IDIxMCAxMTUgMzEgMzA0IDEwOCAKKzE0NiA1NiAyMDkgMjQgMTAzIDE3NiAyNDcgMjUwIDMwNSAzMDcgMTAgNyAxMSAzMTAgNjUgOSA3OSAyNTggNjkgMzA4IDE1MCAyMDIgCisxMzkgMTcxIDI3NyAxMjUgMjk3IDI3MiAyMTQgMTU3IDg3IDcxIDcwIDgzIDI5IDE0IDY3IDc3IDI3IDMxMSA1MiA2MyA5NCAyNzIgMiAKKzMxIDIwMCAyODMgMzMgMTYwIDI0NiAyNjMgMjUxIDI5MiA0NSA3NCAyMSAyNjAgMzMgMTE1IDkwIDI4OSAyNDcgMzggMTMwIDU1IDIyMiAKKzI4NiA4OCAyMTEgMjI3IF4KKzY2OCAwIDIxMSAyNTQgMjI2IDExNSAxNiA0MSAxNzAgMTU4IDMwNSAyNDcgMjUgMTgzIDExNyAyMzUgMjE4IDEyNSAyMTIgMzAgMTUyIAorMjQzIDE5NSAyNTQgMjM5IDYxIDI4IDIzNyAxMjAgMzAyIDE2NyAxMzAgMTk0IDE0OCA5NiAzMTIgMTA1IDY1IDE2MCAyMjAgNTMgMjgxIAorMjcwIDIyNiAxMDIgNzAgNTcgMTM3IDkxIDI2IDI5NiAxMDUgNzggMTA2IDIwNCA0MCAzMSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjY5IAorNzQgMjc2IDI3NSAyMDggMTc0IDE0IDEyNiA0NyAyMTkgMjE4IDEzOCAxNTggMTQgMTM5IDMxMCAyMDMgMjUxIDIwNSAxNjYgMTEgNTkgCis1MiAyMTQgMjgyIDIwIDIxNCAzMDggMjc1IDE4MiAyODIgNDYgMTA2IDIzMCAyNDkgMzE2IDI1MiAzMTEgMzA5IDc3IDI3MSAxNSAyOTEgCisxMzYgMjY5IDEwMCAxNjggMjQzIDE4MiAzMDggMzAxIDc0IDI1MCA2NiAyNDAgMjAwIDE5NyAxNTYgOTkgMTYgNTQgMTE2IDk2IDIxIAorMzE0IDMzIDEzNCAzNyAyMyAyMjkgMTU2IDczIDEyNCAxMzIgOTYgOCA1MSA0OSAxNDcgMjg3IDE1IDI3OCAxOTAgMTQgMTEzIDEwMSAKKzIzNSAyMzEgNzEgMTk2IDYzIDIxOSAyMDUgMTkyIDIyMCAyNyA3MiAzMSAyMDYgMjg1IDEwMCAxNTUgMjk3IDI0NCA0IDIzNCA2NiAyNTMgCisxNDYgMTgxIDE4OSAxNjYgMjQgNSAzNiAyMDEgMzIgMjggMjExIDIyOCAxNyAxOTMgMzEzIDIyNCAyMDAgMjEwIDEwMiA4MyAzIDEyMSAKKzc4IDkzIDI1OCA1NiA0NCAxNjUgMjE1IDcxIDIwOSA5IDE1NyAyMzggMjU5IDE4MiAyOTUgMzggOTAgMjE3IDMxNiAyNzggMjAzIDI3NyAKKzk3IDg4IDMwMiAxOTMgMjIgMTE2IDEyMiAyMzAgMjM2IDcgMjY4IDcgMjQyIDExNSAzIDk1IDE4NiAxMjUgMjM4IDI4NSA3NCAyNjMgMTIgCisyMjQgMTg3IDI2NCAxNjQgNTAgMjk5IDE1OSAxMjcgMTI3IDE1MyA0NSAxMyAzMyAxMjEgOTEgMzkgMjQyIDg5IDExMSAxNzMgMTY2IDM3IAorMzE0IDIwIDE4OCA1MyAzMDcgMTYyIDE0OCAxMjIgMjA0IDI3IDg1IDI5NCAxOTAgMSAxNjcgMTE3IDI0OCAxNjQgNjMgMjQ1IDk3IDExNCAKKzE5NCAxNjEgNDIgMjUwIDkyIDEzMiAxMjIgMjE3IDI5MCA2OSAyODEgMjU3IDI4MCAxMTggMzcgMzYgMTc1IDk0IDYwIDE5MSA5NCA0NyAKKzI0NSAxMTAgNjAgMTc4IDE0OCAxMDkgMjU4IDQzIDk4IDIyNyAyMjggNCAyNDcgMTIgMjM3IDEzMyAyNDggMTUxIDExNyAyNjEgMTEwIAorNDcgMjMyIDE2NCA3NiAxOTEgODEgMTAxIDI2MSAxMjMgMzEwIDIxNiAxOTcgMTQzIDE1MyAzMiA2NyA0OSAxMzQgMjQgMzEgMjQ1IDEyMyAKKzYgMTYyIDEzNSAxNzYgMjIwIDQwIDE4IDI4NiAyMzkgMzUgNjIgMTA2IDIxNyAzMDMgMTUgMjY1IDI0NCAzMCAxMjYgMzQgMjczIDI4MCAKKzEwNSA5MSA1MiAxODggMjcgOTggMjQwIDE3NCAzMDUgMjM0IDc5IDE5OSA4NCAxNjggMjU2IDEyOCAyOTIgMjg4IDE0MSAyMTIgMTcgCisyMDYgMjU5IDIwOCAxODcgMjc3IDExMCAzNCAyODYgMjI2IDg5IDEyNCAxMTkgMTUwIDI0IDE4IDI5OSAxODUgMTkgOTUgMTczIDE3OSAKKzMwMCAyNTIgNyAyNTUgNjEgMzA0IDgyIDI1MyAxMzMgMjM1IDIwNSAxNzkgMjc0IDQzIDg1IDI4MSAyNDQgMTcgMTgwIDUwIDI4NiAyMTMgCisxNDMgMTQwIDg2IDgzIDE2IDY3IDYyIDgwIDggNjQgMzEyIDEzMSAzIDgyIDI0MCAxODcgMjUxIDIxOCAxMTIgMjY2IDkyIDExOSAxNzYgCisyMzMgMzAzIDIgMiAzMDYgNDMgNTkgMjYgNSAzMTQgNDYgODAgMjEgMTAgMjk2IDExOCAyNCA0NCAxOTEgMTA3IDM5IDIyOSAxNDMgMTI3IAorMTQwIDk5IDI5IDU0IDEyOSA0MiAyNzYgMzAxIDEwMCAxNDIgMzQgMjYwIDE3IDE2NyAxMDQgMzAyIDE4MCA3NiAxNzggMTM1IDE2MyAKKzI3NCA1NiAzMSAyMTkgMjMxIDg0IDE0MiAxIDIwNiAyNzIgMTU0IDE3MSAyNjQgMTc3IDQyIDIzNyAxNDYgMTk0IDEzNSAxNTAgMTEgNzIgCis0NCAxNTIgMjY5IDg3IDIyMiAyNTkgMTk1IDI0MSAyOTMgNzcgMjg0IDcgMjI5IDE2OSAxOSAxMDggMTE5IDE2MyAyODcgMiAxNSAyNTIgCisyOTggNDYgOTMgMjg0IDMxMSAyODMgMTg1IDMyIDQxIDE1NyAyMTIgNCAyNjAgNCAyMjEgMTIwIDMxNSAxMTMgMTE0IDE4MSAyMTUgNTggCisyNjMgMjUgMTcwIDE3MSAyNTEgMjMxIDU4IDI1MCA3OSAxODYgMTM4IDE4NCAyMjMgNjEgMTMgMjAgMTc1IDEwNyA2IDE3NSA4MSAxMTQgCisyMDcgMTA3IDI2IDI4MyAxNTkgMTQwIDczIDEzNyA3OCA4MCAzMTIgMTE4IDExIDk4IDI1MyAxMjAgMjg5IDIyMSAxNDYgMjA3IDgxIDg4IAorMzE1IDEzOSA2IDE0OSAxODkgMTkyIDIzMyAyOTAgNTYgMTggMjczIDI5MyA1MSA3NSAzOSAyNTUgMzUgNDkgMTYwIDIzMyAzMTYgMjY1IAorMjU3IDI5MyA2NCAyMSAyMyAyNDIgMTAyIDU3IDExMSAxOTkgNTggMjc2IDI4OCAxNTQgMTU4IDEgMTkzIDkgMTcwIDE4NCAxOTcgMTY5IAorNDUgNDEgMTgzIDEwNCAyODkgMjM0IDkyIDE0NSA2OCAxNTUgNiAxMzYgMjQzIDIwOCAyMDMgXgorNjU2IDAgMjIxIDQ4IDIxIDMyIDE4NiA0MCA0MiAxNzggMTU5IDUxIDE5NiA3MiAxNjEgMTg3IDE3NyAyODMgMzA2IDIzIDI2NiAzMDkgCisyOTYgMTI5IDEwIDI2IDIyMCAxNzIgMzE2IDE3OCA2MSAyMjggMTUxIDEzMCAyMDUgOTAgMzQgMjk3IDE2OCA2OSAxMDkgMTgyIDExMiAKKzI5MiAyOTkgODMgMTkyIDQ2IDI2OSAyNjMgMTU5IDE0OSAxOSAxMTcgNjMgMTQzIDI3NCA2NyAyOTIgMjAxIDI2MCAxNDcgMTA0IDMxMyAKKzEyNiA1NiAxNjMgMjAwIDEyMyAyMjUgMTYgOTAgMjMwIDI2MiAyNTggMjMyIDIxIDU3IDM5IDI2NCAyOTYgMzEgMTQ3IDMwMCAyNzggCisyMTYgMjE5IDM1IDc1IDUwIDE5NyAxMyA3OCAyMjUgMjM3IDI2NyAxODUgNDEgMzAyIDk1IDE5NyA3MSAyMjAgMjcwIDEzOSAyMjMgMyAKKzE0NCAyODggMjczIDE5MSAyMjggMjggMTM1IDI5NSAyNTMgMjY1IDE3MiA5NSAxIDEwNiAxMzAgMTA3IDI2NyAyOSAzNiAyMTIgMjkxIDYgCisxOTYgMjkzIDE5IDE0MiAyNzUgOCAyMDkgMjM5IDI4MCAxMzEgMjMgMjkxIDE2MiAxNjEgNjQgMTQyIDE0IDE1MCAyNTQgMTQxIDIzNiAKKzI2OCAxMjYgMjc3IDIxIDE1NSAyMjEgMzA5IDE5OCAzMDYgMjg0IDEyNCAyNjQgNzUgMTczIDE5MiAyNDIgMjM0IDM0IDMgMjEgMjUzIAorNDQgMzUgMTQwIDI2MiA2MiAyMjcgMjUwIDIxMyAxNjcgMzAgNTAgOTkgMTUwIDMzIDQgMjgxIDE3MCA4MiA1NSAxMjQgMTQxIDQwIDI2MyAKKzM2IDExNCAxMDkgMjgwIDI5NCAxOCAyMDEgMzkgMjg5IDE0OSAyMTUgODIgMTUzIDMwNiAxODYgMzAxIDIxOSAxMzMgMjU3IDk1IDk5IAorMjQ4IDE3NSA5IDE4MyAxMjYgMTc5IDE5OCAxMTAgMjc5IDM0IDEwMSAxNjMgMjk4IDI2NSAyNzAgMjM3IDQ2IDggODYgMjA0IDUxIDI5NCAKKzIxNCAyMDYgODkgMTMzIDYxIDEzMCA5IDg1IDMwMyAxMzQgMjU2IDE1NCAxODIgMjEwIDExNSAyNSAzMDQgMTA4IDE0MyA1MyAyMDkgMTggCisxMDMgMTc2IDI0NCAyNDcgMjk5IDMwNCAxMCAxIDggMzA3IDYyIDYgNzMgMjU4IDY5IDMwNSAxNDcgMjAyIDEzNiAxNzEgMjc3IDExOSAKKzI5NyAyNjYgMjExIDE1NCA4NCA2OCA3MCA4MyAyOSAxMSA2NyA3MSAyNCAzMDUgNDkgNjAgOTEgMjY5IDIgMjIgMTk0IDI4MCAzMyAxNjAgCisyNDYgMjYwIDI0NSAyODYgMzkgNjggMTIgMjYwIDI0IDEwOSA4NCAyODkgMjQ3IDM4IDEyNyA1NSAyMjIgMjgzIDg1IDIwNSAzMTEgMjExIAorMjUyIDIyNiAxMTMgMTIgMzkgMTY2IDE1NCAzMDUgMjQ1IDI1IDE4MSAxMTMgMjMzIDIxNiAxMjEgMjEyIDMwIDE0OCAyNDEgMTk1IDI1NCAKKzIzOSA1OSAzMTMgMjggMjMzIDExOCAyOTggMTY3IDEyOCAxOTIgMTQ0IDkyIDMwOCAxMDEgNjUgMTU2IDIyMCA0OSAyODEgMjY4IDIyNCAKKzEwMCA2NiA1NyAxMzcgODcgMjIgMjkyIDEwMyA3OCAxMDIgMjAyIDM4IDI5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjUgNzQgMjcyIAorMjc1IDIwNCAxNzQgMTAgMTI0IDQzIDIxNyAyMTggMTM0IDE1OCAxMiAxMzcgMzA4IDE5OSAyNDcgMjAxIDE2MiA1IDU5IDUyIDIxMCAKKzI3OCAyMCAyMTQgMzA0IDI3MSAxNzggMjgyIDQ2IDEwNiAyMjggMjQ5IDMxMiAyNTAgMzExIDMwOSA3NSAyNzEgMTUgMjg3IDEzNiAyNjkgCisxMDAgMTY0IDIzOSAxODIgMzA4IDI5NyA3MCAyNDYgNjQgMjQwIDE5NiAxOTUgMTU2IDk3IDE0IDUyIDExMiA5NiAxNSAzMTIgMjkgMTM0IAorMzUgMTcgMjI3IDE1MiA3MSAxMjIgMTI4IDk0IDIgNDcgNDcgMTQ1IDI4NyAxMyAyNzQgMTkwIDggMTExIDk3IDIzNSAyMjkgNjcgMTk0IAorNTkgMjE1IDIwNSAxODggMjE2IDIzIDcwIDI1IDIwNiAyODUgOTggMTUxIDI5MyAyNDAgMjMwIDY2IDI1MyAxNDIgMTc3IDE4NSAxNjQgCisxOCA1IDM0IDE5OSAyNiAyNCAyMDcgMjI2IDE1IDE4OSAzMTMgMjI0IDE5OCAyMDggMTAyIDc5IDMgMTE5IDc2IDg5IDI1NiA1NiA0MCAKKzE2NSAyMTMgNjkgMjA3IDUgMTU3IDIzNCAyNTUgMTgwIDI5NSAzMiA4OCAyMTcgMzE2IDI3NiAyMDMgMjczIDkzIDg2IDMwMiAxOTMgMjAgCisxMTYgMTIyIDIyNiAyMzYgNyAyNjggMyAyNDIgMTExIDMxOCA5MyAxODQgMTI1IDIzOCAyODEgNzIgMjU5IDEwIDIyMiAxODUgMjYyIAorMTYwIDUwIDI5NSAxNTUgMTIzIDEyNyAxNTMgNDUgOSAyNyAxMjEgODkgMzUgMjM4IDg1IDEwNyAxNjkgMTY2IDMxIDMxMCAxNiAxODggCis1MyAzMDcgMTYwIDE0OCAxMTggMjAwIDI1IDgzIDI5MCAxODggMzE0IDE2NSAxMTUgMjQ2IDE2MiA2MyAyNDEgOTcgMTEyIDE5NCAxNTcgCiszOCAyNTAgOTAgMTMyIDEyMCAyMTMgMjkwIDY1IDI3OSAyNTUgMjc4IDExOCAzNyAzMCAxNzMgOTQgNjAgMTg5IDkyIDQ3IDI0MyAxMTAgCis1OCAxNzYgMTQ2IDEwNSAyNTQgNDMgOTQgMjIzIDIyNCAyIDI0MyAxMiAyMzUgMTMxIDI0NCAxNDkgMTE3IDI1OSAxMDggNDUgMjMwIAorMTY0IDc2IDE4NyA3OSAxMDEgMjYxIDEwOSBeCis2NTYgMCAzMTAgMjA4IDE4OSAxNDMgMTQ5IDMyIDU5IDQxIDEzMCAyMCAzMSAyNDUgMTIzIDIgMTU0IDEzNSAxNjggMjE2IDMyIDE0IAorMjg2IDIzMSAzMSA2MiAxMDIgMjEzIDMwMyA3IDI1NyAyNDQgMjIgMTE4IDI2IDI2OSAyNzIgMTA1IDkxIDQ0IDE4MCAyNyA5NCAyMzIgCisxNjYgMzAxIDIzMCA3OSAxOTkgODQgMTY0IDI0OCAxMjggMjg4IDI4NCAxMzMgMjA4IDE3IDE5OCAyNTkgMjA0IDE4NyAyNzMgMTAyIDMwIAorMjgyIDIxOCA4NSAxMTYgMTExIDE0NiAxNiAxOCAyOTkgMTc3IDExIDg3IDE2OSAxNzkgMjkyIDI1MiAzIDI1NSA1MyAyOTYgODIgMjQ5IAorMTI1IDIyNyAyMDEgMTcxIDI2NiAzOSA3NyAyNzMgMjQwIDkgMTcyIDQ2IDI3OCAyMDUgMTM5IDEzNiA4NiA3OSAxNiA2MyA1NCA3NiA1NiAKKzMxMiAxMjMgMzEyIDc4IDIzNiAxNzkgMjQ3IDIxMCAxMDQgMjY2IDg0IDExOSAxNzIgMjI5IDI5OSAzMTUgMzExIDI5OCAzMSA1MSAyNiAKKzMxNCAzMTQgMzggODAgMTMgMiAyOTIgMTE0IDI0IDQ0IDE5MSAxMDMgMjcgMjIxIDEzNSAxMjMgMTQwIDk5IDI1IDMxNyA1NCAxMjEgNDIgCisyNzYgMzAxIDkyIDEzNCAyMiAyNTYgNSAxNTkgMTAwIDI5OCAxODAgNzIgMTcwIDEzMSAxNTUgMjcwIDUyIDIzIDIxOSAyMzEgNzYgMTM4IAorMSAyMDIgMjcyIDE1MCAxNjcgMjY0IDE2OSAzMCAyMzcgMTQyIDE4NiAxMjcgMTQyIDMgNzIgMzIgMTUyIDI2NSA4NyAyMTQgMjU1IDE5MSAKKzI0MSAyOTMgNzcgMjg0IDMxNiAyMjkgMTYxIDE1IDEwMCAxMTUgMTU5IDI4MyAzMTkgMyAyNDQgMjk4IDQyIDkzIDI4MCAzMDMgMjgzIAorMTgxIDI0IDMzIDE0OSAyMDQgNCAyNTIgMzEzIDIxMyAxMjAgMzA3IDExMyAxMDYgMTgxIDIwNyA1NCAyNTkgMjEgMTY2IDE2MyAyNTEgCisyMjMgNTAgMjQ2IDc1IDE4NiAxMzggMTg0IDIyMyA2MSAxIDggMTc1IDEwNyA2IDE2NyA4MSAxMTQgMjA3IDk5IDE0IDI3NSAxNTUgMTMyIAorNzMgMTMzIDcwIDcyIDMwOCAxMTAgMTEgOTggMjQ1IDExMiAyODEgMjIxIDE0NiAxOTkgNzMgODggMzE1IDEzOSAzMTkgMTQxIDE4OSAKKzE4OCAyMjUgMjg2IDQ4IDEwIDI3MyAyODUgNTEgNzEgMzUgMjQ3IDI3IDQ5IDE1NiAyMzMgMzEyIDI2MSAyNTcgMjg5IDY0IDE3IDE1IAorMjM4IDk0IDQ5IDExMSAxOTEgNTggMjcyIDI4OCAxNDYgMTU0IDMxOCAxODkgNSAxNzAgMTc2IDE5NyAxNjkgNDEgMzEzIDQxIDE3NSA5NiAKKzI4NSAyMzQgOTIgMTQ1IDY0IDE1NSAzMTUgMTI4IDI0MyAyMDggMjAwIDIxOSA0OCAyMSAyOCAxODQgNDAgNDAgMTc4IDE1NyA0NyAxOTYgCis2OCAxNTcgMTg1IDE3NSAyNzkgMzA2IDIzIDI2NCAzMDcgMjk2IDEyNyA0IDI0IDIxNiAxNzAgMzE0IDE3NiA1OSAyMjQgMTUxIDEzMCAKKzIwMyA4NiAzNCAyOTUgMTY0IDY1IDEwNyAxNzggMTEyIDI5MiAyOTcgNzkgMTg4IDQyIDI2NSAyNTkgMTU5IDE0NSAxOSAxMTMgNjEgCisxMzkgMjc0IDY1IDI5MCAxOTkgMjU2IDE0MyAxMDQgMzExIDEyNiA1MiAxNjEgMTk4IDEyMSAyMjUgMTAgOTAgMjMwIDI2MiAyNTQgMjI4IAorMTUgNTUgMzkgMjYwIDI5NCAyOSAxNDcgMzAwIDI3OCAyMTYgMjE1IDM1IDc1IDQ4IDE5MyA3IDc0IDIyMyAyMzMgMjY3IDE4NSAzNyAKKzMwMCA5NSAxOTUgNzEgMjE4IDI2OCAxMzcgMjIxIDMxOCAxNDQgMjg0IDI3MSAxODcgMjI4IDI2IDEzMSAyOTMgMjQ5IDI2MyAxNzIgOTEgCiszMjAgMTA0IDEyOCAxMDUgMjYzIDIzIDM2IDIxMCAyODcgMTk0IDI5MSAxMyAxNDAgMjcxIDQgMjA3IDIzNyAyODAgMTMxIDE3IDI5MSAKKzE2MiAxNjEgNjAgMTQyIDE0IDE0OCAyNTIgMTQxIDIzNCAyNjQgMTI0IDI3NSAxNyAxNTMgMjE3IDMwNSAxOTggMzA0IDI4MCAxMjAgCisyNjIgNzEgMTczIDE5MiAyMzggMjMyIDI4IDEgMTkgMjUxIDQwIDI5IDEzNiAyNTggNTggMjI3IDI0NiAyMTMgMTY1IDI4IDQ2IDk1IAorMTUwIDI5IDMxOSAyNzkgMTY4IDc4IDUzIDEyNCAxMzcgMzggMjYzIDM0IDExMiAxMDkgMjc2IDI5MCAxNiAyMDEgMzMgMjg3IDE0OSAKKzIxNSA4MCAxNTEgMzAyIDE4MiAyOTcgMjE3IDEzMyAyNTMgOTMgOTcgMjQ4IDE3MyA5IDE4MyAxMjIgMTc3IDE5NCAxMDggMjc5IDMwIAorOTkgMTYzIDI5NiAyNjUgMjcwIDIzNSA0NCA4IDgyIDIwNCA0OSAyOTQgMjEyIDIwMiA4OSAxMjkgNTcgMTI2IDcgODUgMjk5IDEzMiAKKzI1NiAxNTQgMTgwIDIxMCAxMTUgMjEgMzA0IDEwOCAxNDEgNTEgMjA5IDE0IDEwMyAxNzYgMjQyIDI0NSAyOTUgMzAyIDEwIDMxOCA2IAorMzA1IDYwIDQgNjkgMjU4IDY5IDMwMyAxNDUgMjAyIDEzNCAxNzEgMjc3IDExNSAyOTcgMjYyIDIwOSAxNTIgODIgNjYgNzAgODMgMjkgOSAKKzY3IDY3IDIyIDMwMSA0NyA1OCA4OSAyNjcgMiAxNiAxOTAgMjc4IDMzIDE2MCAyNDYgMjU4IDI0MSAyODIgMzUgNjQgNiAyNjAgMTggCisxMDUgODAgMjg5IDI0NyAzOCAxMjUgNTUgMjkyIF4KKzxECisKK0g+U0hTIFR5cGUgMyBTdHJpbmdzPEgKK0Q+Cis0NSAwIDE0IDUgMyAxIDQgMTYgMTIgMjAgMSA2IDE1IDExIDE4IDQgMTcgMTYgNiAxMCAzIDIgOSA5IDE0IDYgMiA4IDYgNyAxMCAxNyAKKzEyIDIwIDYgNyA1IDE2IDEgNCAyIDE3IDEwIDE1IDggMjAgMSBeCis8RAorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E1NDhjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbgpAQCAtMCwwICsxLDE3IEBACis8IS0tIEJ1cyB0aGF0IGxpc3RlbnMgb24gYSBkZWJ1ZyBwaXBlIGFuZCBkb2Vzbid0IGNyZWF0ZSBhbnkgcmVzdHJpY3Rpb25zIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPmRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlcjwvbGlzdGVuPgorICA8bGlzdGVuPnVuaXg6dG1wZGlyPUBURVNUX1NPQ0tFVF9ESVJAPC9saXN0ZW4+CisgIDx0eXBlPnN5c3RlbTwvdHlwZT4KKyAgPHNlcnZpY2VoZWxwZXI+QFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllAPC9zZXJ2aWNlaGVscGVyPgorICA8c2VydmljZWRpcj5AVEVTVF9JTlZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkA8L3NlcnZpY2VkaXI+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IHJlY2VpdmVfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IG93bj0iKiIvPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdmZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZi5pbgpAQCAtMCwwICsxLDE3IEBACis8IS0tIEJ1cyB0aGF0IGxpc3RlbnMgb24gYSBkZWJ1ZyBwaXBlIGFuZCBkb2Vzbid0IGNyZWF0ZSBhbnkgcmVzdHJpY3Rpb25zIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPmRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlcjwvbGlzdGVuPgorICA8bGlzdGVuPnVuaXg6dG1wZGlyPUBURVNUX1NPQ0tFVF9ESVJAPC9saXN0ZW4+CisgIDx0eXBlPnN5c3RlbTwvdHlwZT4KKyAgPHNlcnZpY2VoZWxwZXI+QFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUllAPC9zZXJ2aWNlaGVscGVyPgorICA8c2VydmljZWRpcj5AVEVTVF9WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVJAPC9zZXJ2aWNlZGlyPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5jb25mIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTcwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmNvbmYKQEAgLTAsMCArMSwzMiBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+NTAwMDwvbGltaXQ+ICAgCisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjUwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MzAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9InNlcnZpY2Vfc3RhcnRfdGltZW91dCI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjYwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+NTA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+ODA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+NjQ8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj4yNTY8L2xpbWl0PgorCisgIDxzZWxpbnV4PgorICAgICAgICA8YXNzb2NpYXRlIG93bj0ib3JnLmZyZWVkZXNrdG9wLkZyb2JhdGlvbmFyeU1lYXN1cmVzIgorICAgICAgICAgY29udGV4dD0ibXlfc2VsaW51eF9jb250ZXh0X3QiLz4KKyAgICAgICAgPGFzc29jaWF0ZSBvd249Im9yZy5mcmVlZGVza3RvcC5CbGFoQmxhaEJsYWgiCisgICAgICAgICBjb250ZXh0PSJmb29fdCIvPgorICA8L3NlbGludXg+CisKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kL2Jhc2ljLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQvYmFzaWMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA5ZDcxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kL2Jhc2ljLmNvbmYKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGM1MDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0gQnVzIHRoYXQgbGlzdGVucyBvbiBhIGRlYnVnIHBpcGUgYW5kIHJlcXVpcmVzIFNIQTEgYXV0aCwgdXNlZCB0byB0ZXN0IFNIQTEgLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+ZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dW5peDp0bXBkaXI9QFRFU1RfU09DS0VUX0RJUkA8L2xpc3Rlbj4KKyAgPHNlcnZpY2VkaXI+QFRFU1RfVkFMSURfU0VSVklDRV9ESVJAPC9zZXJ2aWNlZGlyPgorICA8YXV0aD5EQlVTX0NPT0tJRV9TSEExPC9hdXRoPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNDI5NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYuaW4KQEAgLTAsMCArMSwxNSBAQAorPCEtLSBCdXMgdGhhdCBsaXN0ZW5zIG9uIGEgZGVidWcgcGlwZSBhbmQgZG9lc24ndCBjcmVhdGUgYW55IHJlc3RyaWN0aW9ucyAtLT4KKworPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPGxpc3Rlbj5kZWJ1Zy1waXBlOm5hbWU9dGVzdC1zZXJ2ZXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj51bml4OnRtcGRpcj1AVEVTVF9TT0NLRVRfRElSQDwvbGlzdGVuPgorICA8c2VydmljZWRpcj5AVEVTVF9WQUxJRF9TRVJWSUNFX0RJUkA8L3NlcnZpY2VkaXI+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IHJlY2VpdmVfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IG93bj0iKiIvPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2VudGl0aWVzLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2VudGl0aWVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzY2VhNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZW50aXRpZXMuY29uZgpAQCAtMCwwICsxLDE0IEBACis8IS0tIFRoaXMgY29uZmlnIGZpbGUgY29udGFpbnMgWE1MIGVudGl0aWVzIC0tPgorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vLyZsdDtiYXImZ3Q7PC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy4mIzEwMDs8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3IvJmFtcDtzaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZSYjMTE1OyI+bm9uZXhpc3RlbnQuY29uZiYjMTEwOzwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSImIzEwMDtlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWFueS1ydWxlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTkwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZgpAQCAtMCwwICsxLDU5IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAvPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiBzZW5kX21lbWJlcj0iUmVib290Ii8+IAorICAgIDxkZW55IHJlY2VpdmVfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiByZWNlaXZlX21lbWJlcj0iUmVib290Ii8+CisgICAgPGRlbnkgc2VuZF9wYXRoPSIvZm9vL2Jhci9TeXN0ZW1PYmplY3RUaGluZyIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvPiAKKyAgICA8ZGVueSBvd249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgcmVjZWl2ZV9zZW5kZXI9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSB1c2VyPSJyb290Ii8+CisgICAgPGRlbnkgZ3JvdXA9ImJpbiIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuQmFyIiBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkZvbyIgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorICA8L3BvbGljeT4KKworICA8cG9saWN5IGNvbnRleHQ9Im1hbmRhdG9yeSI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgICA8ZGVueSBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvPiAKKyAgICA8ZGVueSByZWNlaXZlX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIgcmVjZWl2ZV9tZW1iZXI9IlJlYm9vdCIvPgorICAgIDxkZW55IHNlbmRfcGF0aD0iL2Zvby9iYXIvU3lzdGVtT2JqZWN0VGhpbmciIHNlbmRfbWVtYmVyPSJSZWJvb3QiLz4gCisgICAgPGRlbnkgb3duPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgIDxkZW55IHJlY2VpdmVfc2VuZGVyPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgdXNlcj0icm9vdCIvPgorICAgIDxkZW55IGdyb3VwPSJiaW4iLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJlcnJvciIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9InNpZ25hbCIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5CYXIiIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuRm9vIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iIHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgPC9wb2xpY3k+CisKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+NTAwMDwvbGltaXQ+ICAgCisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjUwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MzAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9InNlcnZpY2Vfc3RhcnRfdGltZW91dCI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjYwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+NTA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+ODA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+NjQ8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj4yNTY8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIj41MTI8L2xpbWl0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZC90ZXN0LmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5kL3Rlc3QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYwYTFmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW0uZC90ZXN0LmNvbmYKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPCEtLSBUaGUgZm9sbG93aW5nIGRlbW9uc3RyYXRlcyBob3cgdG8gcHVuY2ggaG9sZXMgaW4gYSBkZWZhdWx0IGRlbnktYWxsIAorICAgICAgIHBvbGljeSBzbyB0aGF0IGEgcGFydGljdWxhciB1c2VyIGNhbiBvd24gYSBzZXJ2aWNlLCBhbmQgb3RoZXIgCisgICAgICAgY29ubmVjdGlvbnMgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0IC0tPgorCisgIDwhLS0gT25seSByb290IGNhbiBvd24gdGhlIEZvb1NlcnZpY2Ugc2VydmljZSwgYW5kIAorICAgICAgIHRoaXMgdXNlciBjYW4gb25seSBzZW5kIHRoZSBvbmUga2luZCBvZiBtZXNzYWdlIC0tPgorICA8cG9saWN5IHVzZXI9InJvb3QiPgorICAgIDxhbGxvdyBvd249Im9yZy5mb28uRm9vU2VydmljZSIvPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmZvby5Gb29Ccm9hZGNhc3RJbnRlcmZhY2UiLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBBbGxvdyBhbnkgY29ubmVjdGlvbiB0byByZWNlaXZlIHRoZSBtZXNzYWdlLCBidXQgCisgICAgICAgb25seSBpZiB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IHRoZSBvd25lciBvZiBGb29TZXJ2aWNlIC0tPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0ib3JnLmZvby5Gb29Ccm9hZGNhc3RJbnRlcmZhY2UiIHJlY2VpdmVfc2VuZGVyPSJvcmcuZm9vLkZvb1NlcnZpY2UiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTIxODZiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlCkBAIC0wLDAgKzEsMzMgQEAKKyMgTWVzc2FnZSB3aXRoIGFuIGFycmF5IG9mIGFycmF5IG9mIHVpbnQzMgorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CisKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCisKK0xFTkdUSCBBcnJheQorU1RBUlRfTEVOR1RIIEFycmF5CisKKyMjIGFycmF5IG9mIHVpbnQzMgorTEVOR1RIIFN1YkFycmF5MQorU1RBUlRfTEVOR1RIIFN1YkFycmF5MQorVUlOVDMyIDEKK1VJTlQzMiAyCitVSU5UMzIgMworRU5EX0xFTkdUSCBTdWJBcnJheTEKKworIyMgYXJyYXkgb2YgdWludDMyCitMRU5HVEggU3ViQXJyYXkyCitTVEFSVF9MRU5HVEggU3ViQXJyYXkyCitVSU5UMzIgNAorVUlOVDMyIDUKK0VORF9MRU5HVEggU3ViQXJyYXkyCisKK0VORF9MRU5HVEggQXJyYXkKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC1zaW1wbGUubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0LXNpbXBsZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjkyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC1zaW1wbGUubWVzc2FnZQpAQCAtMCwwICsxLDE1IEBACisjIEEgc2ltcGxlIGRpY3QKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBESUNUCitMRU5HVEggRGljdAorU1RBUlRfTEVOR1RIIERpY3QKK1NUUklORyAnaW50MzInCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitFTkRfTEVOR1RIIERpY3QKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0Lm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5OTdiMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0Lm1lc3NhZ2UKQEAgLTAsMCArMSw0NyBAQAorIyBEaWN0IHdpdGggZGlmZmVyZW50IHZhbHVlcworCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0CitTVEFSVF9MRU5HVEggRGljdAorU1RSSU5HICdib29sZWFuJworVFlQRSBCT09MRUFOCitCWVRFIDEKK1NUUklORyAnaW50MzInCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitTVFJJTkcgJ3VpbnQzMicKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitTVFJJTkcgJ2RvdWJsZScKK1RZUEUgRE9VQkxFCitET1VCTEUgMy4xNDE1OTI2NTM1ODkKK1NUUklORyAnc3RyaW5nJworVFlQRSBTVFJJTkcKK1NUUklORyAnVGhpcyBpcyBhIHN0cmluZycKK1NUUklORyAnYm9vbGVhbl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgQk9PTEVBTgorQk9PTEVBTl9BUlJBWSB7IHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UgfQorU1RSSU5HICdpbnQzMl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgSU5UMzIKK0lOVDMyX0FSUkFZIHsgMSwgLTIsIDMsIC00LCA1LCAtNiwgNywgLTgsIDksIC0xMCB9CitTVFJJTkcgJ3VpbnQzMl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitVSU5UMzJfQVJSQVkgeyAxMSwgMTIsIDMxNCwgMTkxMSwgNTc2OTIsIDEyMzcsIDI4MzQgfQorU1RSSU5HICdkb3VibGVfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorRE9VQkxFX0FSUkFZIHsgMC4xLCAwLjIsIDMuMTQxNTkyNiwgMi43MTgzLCAxMC4wLCA5Ljk5IH0KK1NUUklORyAnc3RyaW5nX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBTVFJJTkcKK1NUUklOR19BUlJBWSB7ICdIZWxsbycsICdUaGlzJywgJ0lzJywgJ0EnLCAnU3RyaW5nJywgJ0FycmF5IScgfQorRU5EX0xFTkdUSCBEaWN0CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjA0MmMwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlCkBAIC0wLDAgKzEsNjMgQEAKKyMgRW1wdHkgYXJyYXlzIGFuZCBzdHJpbmdzCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgU1RSSU5HCitJTlQzMiAwCitCWVRFIDAgIyBTdHJpbmdzIG5lZWQgdG8gYmUgTlVMTC10ZXJtaW5hdGVkCitUWVBFIEFSUkFZCitUWVBFIEJPT0xFQU4KK0lOVDMyIDAKK1RZUEUgQVJSQVkKK1RZUEUgSU5UMzIKK0lOVDMyIDAKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitJTlQzMiAwCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorSU5UMzIgMAorVFlQRSBBUlJBWQorVFlQRSBCWVRFCitJTlQzMiAwCitUWVBFIEFSUkFZCitUWVBFIFNUUklORworSU5UMzIgMAorVFlQRSBESUNUCitJTlQzMiAwCisKKyMgQSBkaWN0IHdpdGggZW1wdHkgYXJyYXlzCitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0CitTVEFSVF9MRU5HVEggRGljdAorU1RSSU5HICdib29sZWFuX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBCT09MRUFOCitJTlQzMiAwCitTVFJJTkcgJ2ludDMyX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBJTlQzMgorSU5UMzIgMAorU1RSSU5HICd1aW50MzJfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorSU5UMzIgMAorU1RSSU5HICdkb3VibGVfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorSU5UMzIgMAorU1RSSU5HICdieXRlX2FycmF5JworVFlQRSBBUlJBWSAKK1RZUEUgQllURQorSU5UMzIgMAorU1RSSU5HICdzdHJpbmdfYXJyYXknIH0KK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitJTlQzMiAwCitFTkRfTEVOR1RIIERpY3QKKworRU5EX0xFTkdUSCBCb2R5CisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9sb3RzLW9mLWFyZ3VtZW50cy5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhYWUwZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9sb3RzLW9mLWFyZ3VtZW50cy5tZXNzYWdlCkBAIC0wLDAgKzEsNjUgQEAKKyMgTWVzc2FnZSB3aXRoIGxvdHMgb2YgZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgTklMCitUWVBFIEJZVEUKK0JZVEUgNDIKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitUWVBFIERPVUJMRQorRE9VQkxFIDMuMTQxNTkyNjUzNTg5CitUWVBFIFNUUklORworU1RSSU5HICdUaGlzIGlzIGEgc3RyaW5nJworVFlQRSBBUlJBWQorVFlQRSBCT09MRUFOCitCT09MRUFOX0FSUkFZIHsgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSB9CitUWVBFIEFSUkFZCitUWVBFIElOVDMyCitJTlQzMl9BUlJBWSB7IDEsIC0yLCAzLCAtNCwgNSwgLTYsIDcsIC04LCA5LCAtMTAgfQorVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKK1VJTlQzMl9BUlJBWSB7IDExLCAxMiwgMzE0LCAxOTExLCA1NzY5MiwgMTIzNywgMjgzNCB9CitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorRE9VQkxFX0FSUkFZIHsgMC4xLCAwLjIsIDMuMTQxNTkyNiwgMi43MTgzLCAxMC4wLCA5Ljk5IH0KK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitTVFJJTkdfQVJSQVkgeyAnSGVsbG8nLCAnVGhpcycsICdJcycsICdBJywgJ1N0cmluZycsICdBcnJheSEnIH0KK1RZUEUgQ1VTVE9NCitTVFJJTkcgJ25hbWVkIHR5cGUnCitCWVRFX0FSUkFZIHsgJ2InLCAnaScsICduJywgJ2EnLCAncicsICd5JywgJ2QnLCAnYScsICd0JywgJ2EnIH0KKworVFlQRSBBUlJBWQorVFlQRSBESUNUCitMRU5HVEggQXJyYXkKK1NUQVJUX0xFTkdUSCBBcnJheQorCitMRU5HVEggRGljdDEKK1NUQVJUX0xFTkdUSCBEaWN0MQorU1RSSU5HICdrZXkxJworVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorU1RSSU5HICdrZXkyJworVFlQRSBVSU5UMzIKK1VJTlQzMiAweDg3NjU0MzIKK0VORF9MRU5HVEggRGljdDEKKworTEVOR1RIIERpY3QyCitTVEFSVF9MRU5HVEggRGljdDIKK1NUUklORyAna2V5MScKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK1NUUklORyAna2V5MicKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitFTkRfTEVOR1RIIERpY3QyCisKK0VORF9MRU5HVEggQXJyYXkKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL25vLXBhZGRpbmcubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRmNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL25vLXBhZGRpbmcubWVzc2FnZQpAQCAtMCwwICsxLDIyIEBACisjIyBNZXNzYWdlIHdpdGggbm8gaGVhZGVyIHBhZGRpbmcKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitSRVFVSVJFRF9GSUVMRFMKKworIyMgdGhpcyBieXRlIGFycmF5IGlzIGZpbGxlZCB3aXRoIHplcm9zIHRvIHRoZSBuYXR1cmFsIGxlbmd0aCAKKyMjIG9mIHRoZSBoZWFkZXIKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIEFSUkFZCitUWVBFIEJZVEUKK0FMSUdOIDQKK0xFTkdUSCBUaGlzQnl0ZUFycmF5CitTVEFSVF9MRU5HVEggVGhpc0J5dGVBcnJheQorQllURSAxCitBTElHTiA4IDEKK0VORF9MRU5HVEggVGhpc0J5dGVBcnJheQorCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTQ5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2UKQEAgLTAsMCArMSwzMCBAQAorIyMgTWVzc2FnZSBvZiBvcHBvc2l0ZSBlbmRpYW5uZXNzLCB3aXRoIGxvdHMgb2YgcmFuZG9tIGZpZWxkcyBpbiBpdAorCitPUFBPU0lURV9FTkRJQU4KKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitSRVFVSVJFRF9GSUVMRFMKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgSU5UMzIKK0lOVDMyIDB4ZmVlYgorCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorCitUWVBFIElOVDMyCitJTlQzMiA4OTc2NTQzMgorVFlQRSBVSU5UMzIKK1VJTlQzMiAweGZmZmZmZmYKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0hlbGxvIHRoaXMgaXMgYSBzdHJpbmcnCitUWVBFIERPVUJMRQorRE9VQkxFIDMuMTQxNTkKKworVFlQRSBOSUwKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwNmZkMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZQpAQCAtMCwwICsxLDk5IEBACisjIyBNZXNzYWdlIHdpdGggcmVjdXJzaXZlIHR5cGVzCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworUkVRVUlSRURfRklFTERTCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorCisjIEV2ZXJ5dGhpbmcgaXMgaW5zaWRlIGEgZGljdAorVFlQRSBESUNUCitMRU5HVEggRGljdDEKK1NUQVJUX0xFTkdUSCBEaWN0MQorCisjIGZpcnN0IGRpY3QgZW50cnkgaXMgYW4gYXJyYXkgb2YgYXJyYXkgb2YgdWludDMyCitTVFJJTkcgJ21lZ2EtdWludC1hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitMRU5HVEggQXJyYXkxCitTVEFSVF9MRU5HVEggQXJyYXkxCisKK0xFTkdUSCBBcnJheTFfMQorU1RBUlRfTEVOR1RIIEFycmF5MV8xCitVSU5UMzJfQVJSQVkgeyAxLCAyLCAzLCA0LCA1fQorVUlOVDMyX0FSUkFZIHsgMiwgMywgNCwgNSwgMX0KK1VJTlQzMl9BUlJBWSB7IDMsIDQsIDUsIDEsIDJ9CitFTkRfTEVOR1RIIEFycmF5MV8xCisKK0xFTkdUSCBBcnJheTFfMgorU1RBUlRfTEVOR1RIIEFycmF5MV8yCitVSU5UMzJfQVJSQVkgeyA0LCA1LCA2LCA3LCA4fQorVUlOVDMyX0FSUkFZIHsgNSwgNiwgNywgOCwgNH0KK0VORF9MRU5HVEggQXJyYXkxXzIKKworRU5EX0xFTkdUSCBBcnJheTEKKworIyBzZWNvbmQgZGljdCBlbnRyeSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzCitTVFJJTkcgJ3N0cmluZy1hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitTVFJJTkdfQVJSQVkgeyAnYScsICdzdHJpbmcnLCAnYXJyYXknfQorCisjIHRoaXJkIGRpY3QgZW50cnkgaXMgYW5vdGhlciBkaWN0CitTVFJJTkcgJ25lc3RlZC1kaWN0JworVFlQRSBESUNUCitMRU5HVEggRGljdDIKK1NUQVJUX0xFTkdUSCBEaWN0MgorCitTVFJJTkcgJ3N0cmluZycKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EgZGVlcGx5IG5lc3RlZCBzdHJpbmcnICAgICAKKworU1RSSU5HICdzdXBlci1uZXN0ZWQtZGljdCcKK1RZUEUgRElDVAorTEVOR1RIIERpY3QzCitTVEFSVF9MRU5HVEggRGljdDMKKworU1RSSU5HICdkb3VibGUtYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorRE9VQkxFX0FSUkFZIHsxLjAsIDIuMCwgMy4wfQorCitTVFJJTkcgJ2RpY3QtYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERJQ1QKK0xFTkdUSCBBcnJheTIKK1NUQVJUX0xFTkdUSCBBcnJheTIKKworTEVOR1RIIERpY3Q0CitTVEFSVF9MRU5HVEggRGljdDQKK1NUUklORyAna2V5NCcKK1RZUEUgQllURQorQllURSAnNCcKK0VORF9MRU5HVEggRGljdDQKKworTEVOR1RIIERpY3Q1CitTVEFSVF9MRU5HVEggRGljdDUKK1NUUklORyAna2V5NScKK1RZUEUgQllURQorQllURSAnNScKK0VORF9MRU5HVEggRGljdDUKKworRU5EX0xFTkdUSCBBcnJheTIKKworU1RSSU5HICdib29sZWFuJworVFlQRSBCT09MRUFOCitCT09MRUFOIGZhbHNlCisKK0VORF9MRU5HVEggRGljdDMKKworRU5EX0xFTkdUSCBEaWN0MgorCitFTkRfTEVOR1RIIERpY3QxCisKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTk2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2UKQEAgLTAsMCArMSwzMCBAQAorIyMgbGlrZSBzaW1wbGVzdC5tZXNzYWdlLCBidXQgZG9lc24ndCB1c2UgVkFMSURfSEVBREVSCisjIyBjb252ZW5pZW5jZSBjb21tYW5kLiBtb3N0bHkgdG8gdGVzdCB0aGUgdGVzdCBmcmFtZXdvcmsuCisKK0xJVFRMRV9FTkRJQU4KK0JZVEUgJ2wnCitCWVRFIDEKK0JZVEUgMAorQllURSAwCitMRU5HVEggSGVhZGVyCitMRU5HVEggQm9keQorIyMgY2xpZW50IHNlcmlhbAorSU5UMzIgNworCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAnJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0Lm1lc3NhZ2UgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWRkYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0Lm1lc3NhZ2UKQEAgLTAsMCArMSwxMCBAQAorIyMgc2ltcGxlc3QgcG9zc2libGUgdmFsaWQgbWVzc2FnZQorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1hY3F1aXJlLXNlcnZpY2UubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1hY3F1aXJlLXNlcnZpY2UubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTlmM2JiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWFjcXVpcmUtc2VydmljZS5tZXNzYWdlCkBAIC0wLDAgKzEsMjYgQEAKKyMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuQWNxdWlyZVNlcnZpY2UgbWVzc2FnZQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdBY3F1aXJlU2VydmljZScKK0hFQURFUl9GSUVMRCBERVNUSU5BVElPTgorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgU0lHTkFUVVJFCitUWVBFIFNUUklORworU1RSSU5HICdzdScKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuU2FtcGxlJworVFlQRSBVSU5UMzIKK1VJTlQzMiAwCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1oZWxsby5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWhlbGxvLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ODM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1oZWxsby5tZXNzYWdlCkBAIC0wLDAgKzEsMjIgQEAKKyMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG8gbWVzc2FnZQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdIZWxsbycKK0hFQURFUl9GSUVMRCBERVNUSU5BVElPTgorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgU0lHTkFUVVJFCitUWVBFIFNUUklORworU1RSSU5HICcnCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWxpc3Qtc2VydmljZXMubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMGFlYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2UKQEAgLTAsMCArMSwyMiBAQAorIyBTdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0U2VydmljZXMgbWVzc2FnZQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdMaXN0U2VydmljZXMnCitIRUFERVJfRklFTEQgREVTVElOQVRJT04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAnJworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1zZXJ2aWNlLWV4aXN0cy5tZXNzYWdlIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLXNlcnZpY2UtZXhpc3RzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1N2ViNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1zZXJ2aWNlLWV4aXN0cy5tZXNzYWdlCkBAIC0wLDAgKzEsMjQgQEAKKyMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuU2VydmljZUV4aXN0cyBtZXNzYWdlCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvb3JnL2ZyZWVkZXNrdG9wL0RCdXMnCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ1NlcnZpY2VFeGlzdHMnCitIRUFERVJfRklFTEQgREVTVElOQVRJT04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAncycKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuU2FtcGxlJworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvdW5rbm93bi1oZWFkZXItZmllbGQubWVzc2FnZSBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjN2Q2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvdW5rbm93bi1oZWFkZXItZmllbGQubWVzc2FnZQpAQCAtMCwwICsxLDE5IEBACisjIyBtZXNzYWdlIHdpdGggYSAnbmFtZScgaGVhZGVyIGZpZWxkIGFuZCB1bmtub3duICd1bmtuJyBmaWVsZAorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgRElDVAorTEVOR1RIIERpY3QKK1NUQVJUX0xFTkdUSCBEaWN0CitTVFJJTkcgJ2ludDMyJworVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorRU5EX0xFTkdUSCBEaWN0CisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGU1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbgpAQCAtMCwwICsxLDUgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZQorRXhlYz1AVEVTVF9TRVJWSUNFX0JJTkFSWUAKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMTZkMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZS5pbgpAQCAtMCwwICsxLDUgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2UKK0V4ZWM9QFRFU1RfU0VHRkFVTFRfQklOQVJZQAorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NWUxNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsCitFeGVjPUBURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZQCAidGhpcyBzaG91bGQgJ2ZhaWwnIGJlY2F1c2Ugb2YgYW4gdW50ZXJtaW5hdGVkIHF1b3RlIAorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzNmNlNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzCitFeGVjPUBURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZQCAtdGVzdCAidGhhdCIgJ3dlIGdldCcgYmFjayAtLXdoYXQgIndlIHB1dCBpbiIKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlci5zZXJ2aWNlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2JkYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlcgorRXhlYz1AVEVTVF9QUklWU0VSVkVSX0JJTkFSWUAKKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbiBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMjM1MQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UKK0V4ZWM9QFRFU1RfU0VSVklDRV9CSU5BUllACisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmY2FjMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsMyBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZQorRXhlYz1AVEVTVF9TRVJWSUNFX0JJTkFSWUAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlIGZvcmsKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjN2I1NQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZQorRXhlYz1AVEVTVF9TRUdGQVVMVF9CSU5BUllACisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW4gYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDRjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsCitFeGVjPUBURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZQCAidGhpcyBzaG91bGQgJ2ZhaWwnIGJlY2F1c2Ugb2YgYW4gdW50ZXJtaW5hdGVkIHF1b3RlIAorCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTY4ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbgpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2VzcworRXhlYz1AVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWUAgLXRlc3QgInRoYXQiICd3ZSBnZXQnIGJhY2sgLS13aGF0ICJ3ZSBwdXQgaW4iCisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxMWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzQgQEAKK0lOQ0xVREVTPS1JJCh0b3Bfc3JjZGlyKSAkKERCVVNfQ0xJRU5UX0NGTEFHUykgJChEQlVTX0dMSUJfQ0ZMQUdTKSAkKERCVVNfVEVTVF9DRkxBR1MpIC1EREJVU19DT01QSUxBVElPTgorCisjIyBub3RlIHRoYXQgVEVTVFMgaGFzIHNwZWNpYWwgbWVhbmluZyAoc3R1ZmYgdG8gdXNlIGluIG1ha2UgY2hlY2spCisjIyBzbyBpZiBhZGRpbmcgdGVzdHMgbm90IHRvIGJlIHJ1biBpbiBtYWtlIGNoZWNrLCBkb24ndCBhZGQgdGhlbSB0byAKKyMjIFRFU1RTCitpZiBEQlVTX0JVSUxEX1RFU1RTCitURVNUU19FTlZJUk9OTUVOVD1EQlVTX1RPUF9CVUlMRERJUj1AYWJzX3RvcF9idWlsZGRpckAgREJVU19UT1BfU1JDRElSPUBhYnNfdG9wX3NyY2RpckAKK1RFU1RTPXJ1bi10ZXN0LnNoIHJ1bi10ZXN0LXN5c3RlbXNlcnZlci5zaAorZWxzZQorVEVTVFM9CitlbmRpZgorCitFWFRSQV9ESVNUPXJ1bi10ZXN0LnNoIHJ1bi10ZXN0LXN5c3RlbXNlcnZlci5zaCB0ZXN0LXdhaXQtZm9yLWVjaG8ucHkgdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkKKworaWYgREJVU19CVUlMRF9URVNUUworCisjIyB3ZSB1c2Ugbm9pbnN0X1BST0dSQU1TIG5vdCBjaGVja19QUk9HUkFNUyBmb3IgVEVTVFMgc28gdGhhdCB3ZQorIyMgYnVpbGQgZXZlbiB3aGVuIG5vdCBkb2luZyAibWFrZSBjaGVjayIKK25vaW5zdF9QUk9HUkFNUz10ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCB0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0IHRlc3QtdGhyZWFkcy1pbml0IHRlc3QtaWRzIHRlc3Qtc2h1dGRvd24gdGVzdC1wcml2c2VydmVyIHRlc3QtcHJpdnNlcnZlci1jbGllbnQgdGVzdC1hdXRvbGF1bmNoCisKK0FNX0NQUEZMQUdTID0gLUREQlVTX1NUQVRJQ19CVUlMRAordGVzdF9wZW5kaW5nX2NhbGxfZGlzcGF0Y2hfU09VUkNFUyA9CQlcCisJdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2guYworCit0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhICQoREJVU19URVNUX0xJQlMpCit0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9MREZMQUdTPUBSX0RZTkFNSUNfTERGTEFHQAorCit0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X1NPVVJDRVMgPQkJXAorCXRlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQuYworCit0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X0xEQUREPSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChEQlVTX1RFU1RfTElCUykKK3Rlc3RfcGVuZGluZ19jYWxsX3RpbWVvdXRfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKwordGVzdF90aHJlYWRzX2luaXRfU09VUkNFUyA9ICAgICAgICAgICAgXAorCXRlc3QtdGhyZWFkcy1pbml0LmMKKwordGVzdF90aHJlYWRzX2luaXRfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSAkKERCVVNfVEVTVF9MSUJTKQordGVzdF90aHJlYWRzX2luaXRfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKwordGVzdF9pZHNfU09VUkNFUyA9ICAgICAgICAgICAgXAorCXRlc3QtaWRzLmMKKwordGVzdF9pZHNfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSAkKERCVVNfVEVTVF9MSUJTKQordGVzdF9pZHNfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKwordGVzdF9zaHV0ZG93bl9TT1VSQ0VTID0gICAgICAgICAgICBcCisJdGVzdC1zaHV0ZG93bi5jCisKK3Rlc3Rfc2h1dGRvd25fQ0ZMQUdTPQordGVzdF9zaHV0ZG93bl9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCit0ZXN0X3NodXRkb3duX0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdACisKK3Rlc3RfcHJpdnNlcnZlcl9TT1VSQ0VTID0gICAgICAgICAgICBcCisJdGVzdC1wcml2c2VydmVyLmMKKwordGVzdF9wcml2c2VydmVyX0NGTEFHUz0KK3Rlc3RfcHJpdnNlcnZlcl9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCit0ZXN0X3ByaXZzZXJ2ZXJfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKwordGVzdF9wcml2c2VydmVyX2NsaWVudF9TT1VSQ0VTID0gICAgICAgICAgICBcCisJdGVzdC1wcml2c2VydmVyLWNsaWVudC5jCisKK3Rlc3RfcHJpdnNlcnZlcl9jbGllbnRfQ0ZMQUdTPQordGVzdF9wcml2c2VydmVyX2NsaWVudF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCit0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50X0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdACisKK3Rlc3RfYXV0b2xhdW5jaF9TT1VSQ0VTID0gICAgICAgICAgICBcCisJdGVzdC1hdXRvbGF1bmNoLmMKKwordGVzdF9hdXRvbGF1bmNoX0NGTEFHUz0KK3Rlc3RfYXV0b2xhdW5jaF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCit0ZXN0X2F1dG9sYXVuY2hfTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKworZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmluIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4ZmYzYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsOTEyIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitAREJVU19CVUlMRF9URVNUU19UUlVFQFRFU1RTID0gcnVuLXRlc3Quc2ggcnVuLXRlc3Qtc3lzdGVtc2VydmVyLnNoCitAREJVU19CVUlMRF9URVNUU19UUlVFQG5vaW5zdF9QUk9HUkFNUyA9ICBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAl0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCQoRVhFRVhUKSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAl0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0JChFWEVFWFQpIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtdGhyZWFkcy1pbml0JChFWEVFWFQpIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtaWRzJChFWEVFWFQpIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3Qtc2h1dGRvd24kKEVYRUVYVCkgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJdGVzdC1wcml2c2VydmVyJChFWEVFWFQpIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtcHJpdnNlcnZlci1jbGllbnQkKEVYRUVYVCkgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJdGVzdC1hdXRvbGF1bmNoJChFWEVFWFQpCitzdWJkaXIgPSB0ZXN0L25hbWUtdGVzdAorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9hcy1hYy1leHBhbmQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvY29tcGlsZXIubTQgJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCAkKHRvcF9zcmNkaXIpL200L2x0c3VnYXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00ICQodG9wX3NyY2RpcikvbTQvbHR+b2Jzb2xldGUubTQgXAorCSQodG9wX3NyY2RpcikvbTQvcGtnLm00ICQodG9wX3NyY2RpcikvbTQvdHAtY29tcGlsZXItZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKK2FtX190ZXN0X2F1dG9sYXVuY2hfU09VUkNFU19ESVNUID0gdGVzdC1hdXRvbGF1bmNoLmMKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAYW1fdGVzdF9hdXRvbGF1bmNoX09CSkVDVFMgPSB0ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLiQoT0JKRVhUKQordGVzdF9hdXRvbGF1bmNoX09CSkVDVFMgPSAkKGFtX3Rlc3RfYXV0b2xhdW5jaF9PQkpFQ1RTKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF9hdXRvbGF1bmNoX0RFUEVOREVOQ0lFUyA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJLi4vbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJJChhbV9fREVQRU5ERU5DSUVTXzEpCitBTV9WX2x0ID0gJChhbV9fdl9sdF8kKFYpKQorYW1fX3ZfbHRfID0gJChhbV9fdl9sdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X2x0XzAgPSAtLXNpbGVudAordGVzdF9hdXRvbGF1bmNoX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSBcCisJJCh0ZXN0X2F1dG9sYXVuY2hfQ0ZMQUdTKSAkKENGTEFHUykgJCh0ZXN0X2F1dG9sYXVuY2hfTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK2FtX190ZXN0X2lkc19TT1VSQ0VTX0RJU1QgPSB0ZXN0LWlkcy5jCitAREJVU19CVUlMRF9URVNUU19UUlVFQGFtX3Rlc3RfaWRzX09CSkVDVFMgPSB0ZXN0LWlkcy4kKE9CSkVYVCkKK3Rlc3RfaWRzX09CSkVDVFMgPSAkKGFtX3Rlc3RfaWRzX09CSkVDVFMpCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfaWRzX0RFUEVOREVOQ0lFUyA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJJChhbV9fREVQRU5ERU5DSUVTXzEpCit0ZXN0X2lkc19MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJCh0ZXN0X2lkc19MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9fdGVzdF9wZW5kaW5nX2NhbGxfZGlzcGF0Y2hfU09VUkNFU19ESVNUID0gIFwKKwl0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaC5jCitAREJVU19CVUlMRF9URVNUU19UUlVFQGFtX3Rlc3RfcGVuZGluZ19jYWxsX2Rpc3BhdGNoX09CSkVDVFMgPSAgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2guJChPQkpFWFQpCit0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9PQkpFQ1RTID0gIFwKKwkkKGFtX3Rlc3RfcGVuZGluZ19jYWxsX2Rpc3BhdGNoX09CSkVDVFMpCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfcGVuZGluZ19jYWxsX2Rpc3BhdGNoX0RFUEVOREVOQ0lFUyA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJJChhbV9fREVQRU5ERU5DSUVTXzEpCit0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgXAorCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJCh0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorYW1fX3Rlc3RfcGVuZGluZ19jYWxsX3RpbWVvdXRfU09VUkNFU19ESVNUID0gIFwKKwl0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LmMKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAYW1fdGVzdF9wZW5kaW5nX2NhbGxfdGltZW91dF9PQkpFQ1RTID0gIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQuJChPQkpFWFQpCit0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X09CSkVDVFMgPSAgXAorCSQoYW1fdGVzdF9wZW5kaW5nX2NhbGxfdGltZW91dF9PQkpFQ1RTKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X0RFUEVOREVOQ0lFUyA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJJChhbV9fREVQRU5ERU5DSUVTXzEpCit0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKHRlc3RfcGVuZGluZ19jYWxsX3RpbWVvdXRfTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK2FtX190ZXN0X3ByaXZzZXJ2ZXJfU09VUkNFU19ESVNUID0gdGVzdC1wcml2c2VydmVyLmMKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAYW1fdGVzdF9wcml2c2VydmVyX09CSkVDVFMgPSB0ZXN0X3ByaXZzZXJ2ZXItdGVzdC1wcml2c2VydmVyLiQoT0JKRVhUKQordGVzdF9wcml2c2VydmVyX09CSkVDVFMgPSAkKGFtX3Rlc3RfcHJpdnNlcnZlcl9PQkpFQ1RTKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3ByaXZzZXJ2ZXJfREVQRU5ERU5DSUVTID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAkuLi9saWJkYnVzLXRlc3R1dGlscy5sYSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3Rlc3RfcHJpdnNlcnZlcl9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDIFwKKwkkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgXAorCSQodGVzdF9wcml2c2VydmVyX0NGTEFHUykgJChDRkxBR1MpICQodGVzdF9wcml2c2VydmVyX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACithbV9fdGVzdF9wcml2c2VydmVyX2NsaWVudF9TT1VSQ0VTX0RJU1QgPSB0ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAYW1fdGVzdF9wcml2c2VydmVyX2NsaWVudF9PQkpFQ1RTID0gdGVzdF9wcml2c2VydmVyX2NsaWVudC10ZXN0LXByaXZzZXJ2ZXItY2xpZW50LiQoT0JKRVhUKQordGVzdF9wcml2c2VydmVyX2NsaWVudF9PQkpFQ1RTID0gJChhbV90ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50X09CSkVDVFMpCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfREVQRU5ERU5DSUVTID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAkuLi9saWJkYnVzLXRlc3R1dGlscy5sYSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3Rlc3RfcHJpdnNlcnZlcl9jbGllbnRfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyBcCisJJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpIFwKKwkkKHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQodGVzdF9wcml2c2VydmVyX2NsaWVudF9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9fdGVzdF9zaHV0ZG93bl9TT1VSQ0VTX0RJU1QgPSB0ZXN0LXNodXRkb3duLmMKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAYW1fdGVzdF9zaHV0ZG93bl9PQkpFQ1RTID0gIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3Rfc2h1dGRvd24tdGVzdC1zaHV0ZG93bi4kKE9CSkVYVCkKK3Rlc3Rfc2h1dGRvd25fT0JKRUNUUyA9ICQoYW1fdGVzdF9zaHV0ZG93bl9PQkpFQ1RTKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3NodXRkb3duX0RFUEVOREVOQ0lFUyA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJLi4vbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJJChhbV9fREVQRU5ERU5DSUVTXzEpCit0ZXN0X3NodXRkb3duX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKHRlc3Rfc2h1dGRvd25fQ0ZMQUdTKSBcCisJJChDRkxBR1MpICQodGVzdF9zaHV0ZG93bl9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACithbV9fdGVzdF90aHJlYWRzX2luaXRfU09VUkNFU19ESVNUID0gdGVzdC10aHJlYWRzLWluaXQuYworQERCVVNfQlVJTERfVEVTVFNfVFJVRUBhbV90ZXN0X3RocmVhZHNfaW5pdF9PQkpFQ1RTID0gIFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtdGhyZWFkcy1pbml0LiQoT0JKRVhUKQordGVzdF90aHJlYWRzX2luaXRfT0JKRUNUUyA9ICQoYW1fdGVzdF90aHJlYWRzX2luaXRfT0JKRUNUUykKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF90aHJlYWRzX2luaXRfREVQRU5ERU5DSUVTID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK3Rlc3RfdGhyZWFkc19pbml0X0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgXAorCSQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKHRlc3RfdGhyZWFkc19pbml0X0xERkxBR1MpICQoTERGTEFHUykgXAorCS1vICRACitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSBcCisJJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCisJJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQU1fVl9DQyA9ICQoYW1fX3ZfQ0NfJChWKSkKK2FtX192X0NDXyA9ICQoYW1fX3ZfQ0NfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9DQ18wID0gQGVjaG8gIiAgQ0MgICAgIiAkQDsKK0FNX1ZfYXQgPSAkKGFtX192X2F0XyQoVikpCithbV9fdl9hdF8gPSAkKGFtX192X2F0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfYXRfMCA9IEAKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorQU1fVl9DQ0xEID0gJChhbV9fdl9DQ0xEXyQoVikpCithbV9fdl9DQ0xEXyA9ICQoYW1fX3ZfQ0NMRF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X0NDTERfMCA9IEBlY2hvICIgIENDTEQgICIgJEA7CitBTV9WX0dFTiA9ICQoYW1fX3ZfR0VOXyQoVikpCithbV9fdl9HRU5fID0gJChhbV9fdl9HRU5fJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9HRU5fMCA9IEBlY2hvICIgIEdFTiAgICIgJEA7CitTT1VSQ0VTID0gJCh0ZXN0X2F1dG9sYXVuY2hfU09VUkNFUykgJCh0ZXN0X2lkc19TT1VSQ0VTKSBcCisJJCh0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9TT1VSQ0VTKSBcCisJJCh0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X1NPVVJDRVMpIFwKKwkkKHRlc3RfcHJpdnNlcnZlcl9TT1VSQ0VTKSAkKHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfU09VUkNFUykgXAorCSQodGVzdF9zaHV0ZG93bl9TT1VSQ0VTKSAkKHRlc3RfdGhyZWFkc19pbml0X1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGFtX190ZXN0X2F1dG9sYXVuY2hfU09VUkNFU19ESVNUKSBcCisJJChhbV9fdGVzdF9pZHNfU09VUkNFU19ESVNUKSBcCisJJChhbV9fdGVzdF9wZW5kaW5nX2NhbGxfZGlzcGF0Y2hfU09VUkNFU19ESVNUKSBcCisJJChhbV9fdGVzdF9wZW5kaW5nX2NhbGxfdGltZW91dF9TT1VSQ0VTX0RJU1QpIFwKKwkkKGFtX190ZXN0X3ByaXZzZXJ2ZXJfU09VUkNFU19ESVNUKSBcCisJJChhbV9fdGVzdF9wcml2c2VydmVyX2NsaWVudF9TT1VSQ0VTX0RJU1QpIFwKKwkkKGFtX190ZXN0X3NodXRkb3duX1NPVVJDRVNfRElTVCkgXAorCSQoYW1fX3Rlc3RfdGhyZWFkc19pbml0X1NPVVJDRVNfRElTVCkKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK2FtX190dHlfY29sb3JzID0gXAorcmVkPTsgZ3JuPTsgbGduPTsgYmx1PTsgc3RkPQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRklMRVZFUlNJT04gPSBAQlVJTERfRklMRVZFUlNJT05ACitCVUlMRF9USU1FU1RBTVAgPSBAQlVJTERfVElNRVNUQU1QQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREJVU19CSU5ESVIgPSBAREJVU19CSU5ESVJACitEQlVTX0JVU19DRkxBR1MgPSBAREJVU19CVVNfQ0ZMQUdTQAorREJVU19CVVNfTElCUyA9IEBEQlVTX0JVU19MSUJTQAorREJVU19DTElFTlRfQ0ZMQUdTID0gQERCVVNfQ0xJRU5UX0NGTEFHU0AKK0RCVVNfQ0xJRU5UX0xJQlMgPSBAREJVU19DTElFTlRfTElCU0AKK0RCVVNfQ09OU09MRV9BVVRIX0RJUiA9IEBEQlVTX0NPTlNPTEVfQVVUSF9ESVJACitEQlVTX0NPTlNPTEVfT1dORVJfRklMRSA9IEBEQlVTX0NPTlNPTEVfT1dORVJfRklMRUAKK0RCVVNfREFFTU9ORElSID0gQERCVVNfREFFTU9ORElSQAorREJVU19EQVRBRElSID0gQERCVVNfREFUQURJUkAKK0RCVVNfSEFWRV9JTlQ2NCA9IEBEQlVTX0hBVkVfSU5UNjRACitEQlVTX0lOVDE2X1RZUEUgPSBAREJVU19JTlQxNl9UWVBFQAorREJVU19JTlQzMl9UWVBFID0gQERCVVNfSU5UMzJfVFlQRUAKK0RCVVNfSU5UNjRfQ09OU1RBTlQgPSBAREJVU19JTlQ2NF9DT05TVEFOVEAKK0RCVVNfSU5UNjRfVFlQRSA9IEBEQlVTX0lOVDY0X1RZUEVACitEQlVTX0xBVU5DSEVSX0NGTEFHUyA9IEBEQlVTX0xBVU5DSEVSX0NGTEFHU0AKK0RCVVNfTEFVTkNIRVJfTElCUyA9IEBEQlVTX0xBVU5DSEVSX0xJQlNACitEQlVTX0xJQkVYRUNESVIgPSBAREJVU19MSUJFWEVDRElSQAorREJVU19NQUpPUl9WRVJTSU9OID0gQERCVVNfTUFKT1JfVkVSU0lPTkAKK0RCVVNfTUlDUk9fVkVSU0lPTiA9IEBEQlVTX01JQ1JPX1ZFUlNJT05ACitEQlVTX01JTk9SX1ZFUlNJT04gPSBAREJVU19NSU5PUl9WRVJTSU9OQAorREJVU19QQVRIX09SX0FCU1RSQUNUID0gQERCVVNfUEFUSF9PUl9BQlNUUkFDVEAKK0RCVVNfUFJFRklYID0gQERCVVNfUFJFRklYQAorREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1MgPSBAREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1NACitEQlVTX1NFU1NJT05fU09DS0VUX0RJUiA9IEBEQlVTX1NFU1NJT05fU09DS0VUX0RJUkAKK0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MgPSBAREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0AKK0RCVVNfU1lTVEVNX1BJRF9GSUxFID0gQERCVVNfU1lTVEVNX1BJRF9GSUxFQAorREJVU19TWVNURU1fU09DS0VUID0gQERCVVNfU1lTVEVNX1NPQ0tFVEAKK0RCVVNfVEVTVF9DRkxBR1MgPSBAREJVU19URVNUX0NGTEFHU0AKK0RCVVNfVEVTVF9MSUJTID0gQERCVVNfVEVTVF9MSUJTQAorREJVU19VSU5UNjRfQ09OU1RBTlQgPSBAREJVU19VSU5UNjRfQ09OU1RBTlRACitEQlVTX1VTRVIgPSBAREJVU19VU0VSQAorREJVU19WRVJTSU9OID0gQERCVVNfVkVSU0lPTkAKK0RCVVNfWF9DRkxBR1MgPSBAREJVU19YX0NGTEFHU0AKK0RCVVNfWF9MSUJTID0gQERCVVNfWF9MSUJTQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RPWFlHRU4gPSBARE9YWUdFTkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRVhQQU5ERURfQklORElSID0gQEVYUEFOREVEX0JJTkRJUkAKK0VYUEFOREVEX0RBVEFESVIgPSBARVhQQU5ERURfREFUQURJUkAKK0VYUEFOREVEX0xJQkRJUiA9IEBFWFBBTkRFRF9MSUJESVJACitFWFBBTkRFRF9MSUJFWEVDRElSID0gQEVYUEFOREVEX0xJQkVYRUNESVJACitFWFBBTkRFRF9MT0NBTFNUQVRFRElSID0gQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJACitFWFBBTkRFRF9QUkVGSVggPSBARVhQQU5ERURfUFJFRklYQAorRVhQQU5ERURfU1lTQ09ORkRJUiA9IEBFWFBBTkRFRF9TWVNDT05GRElSQAorRkdSRVAgPSBARkdSRVBACitHRVRURVhUX1BBQ0tBR0UgPSBAR0VUVEVYVF9QQUNLQUdFQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMQVVOQ0hDVEwgPSBATEFVTkNIQ1RMQAorTEFVTkNIRF9BR0VOVF9ESVIgPSBATEFVTkNIRF9BR0VOVF9ESVJACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlhNTF9DRkxBR1MgPSBATElCWE1MX0NGTEFHU0AKK0xJQlhNTF9MSUJTID0gQExJQlhNTF9MSUJTQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK0xUX0FHRSA9IEBMVF9BR0VACitMVF9DVVJSRU5UID0gQExUX0NVUlJFTlRACitMVF9SRVZJU0lPTiA9IEBMVF9SRVZJU0lPTkAKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU4ySFRNTCA9IEBNQU4ySFRNTEAKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JDID0gQFJDQAorUl9EWU5BTUlDX0xERkxBRyA9IEBSX0RZTkFNSUNfTERGTEFHQAorU0VDVElPTl9MREZMQUdTID0gQFNFQ1RJT05fTERGTEFHU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitURVNUX0JVU19CSU5BUlkgPSBAVEVTVF9CVVNfQklOQVJZQAorVEVTVF9FWElUX0JJTkFSWSA9IEBURVNUX0VYSVRfQklOQVJZQAorVEVTVF9JTlZBTElEX1NFUlZJQ0VfRElSID0gQFRFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUkAKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVIgPSBAVEVTVF9JTlZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkAKK1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkgPSBAVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWUAKK1RFU1RfUFJJVlNFUlZFUl9CSU5BUlkgPSBAVEVTVF9QUklWU0VSVkVSX0JJTkFSWUAKK1RFU1RfU0VHRkFVTFRfQklOQVJZID0gQFRFU1RfU0VHRkFVTFRfQklOQVJZQAorVEVTVF9TRVJWSUNFX0JJTkFSWSA9IEBURVNUX1NFUlZJQ0VfQklOQVJZQAorVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWSA9IEBURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZQAorVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWSA9IEBURVNUX1NMRUVQX0ZPUkVWRVJfQklOQVJZQAorVEVTVF9TT0NLRVRfRElSID0gQFRFU1RfU09DS0VUX0RJUkAKK1RFU1RfVkFMSURfU0VSVklDRV9ESVIgPSBAVEVTVF9WQUxJRF9TRVJWSUNFX0RJUkAKK1RFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSID0gQFRFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lORFJFUyA9IEBXSU5EUkVTQAorWE1LTUYgPSBAWE1LTUZACitYTUxUTyA9IEBYTUxUT0AKK1hTTFRQUk9DID0gQFhTTFRQUk9DQAorWF9DRkxBR1MgPSBAWF9DRkxBR1NACitYX0VYVFJBX0xJQlMgPSBAWF9FWFRSQV9MSUJTQAorWF9MSUJTID0gQFhfTElCU0AKK1hfUFJFX0xJQlMgPSBAWF9QUkVfTElCU0AKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0FSID0gQGFjX2N0X0FSQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc3lzdGVtZHN5c3RlbXVuaXRkaXIgPSBAc3lzdGVtZHN5c3RlbXVuaXRkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0lOQ0xVREVTID0gLUkkKHRvcF9zcmNkaXIpICQoREJVU19DTElFTlRfQ0ZMQUdTKSAkKERCVVNfR0xJQl9DRkxBR1MpICQoREJVU19URVNUX0NGTEFHUykgLUREQlVTX0NPTVBJTEFUSU9OCitAREJVU19CVUlMRF9URVNUU19UUlVFQFRFU1RTX0VOVklST05NRU5UID0gREJVU19UT1BfQlVJTERESVI9QGFic190b3BfYnVpbGRkaXJAIERCVVNfVE9QX1NSQ0RJUj1AYWJzX3RvcF9zcmNkaXJACitFWFRSQV9ESVNUID0gcnVuLXRlc3Quc2ggcnVuLXRlc3Qtc3lzdGVtc2VydmVyLnNoIHRlc3Qtd2FpdC1mb3ItZWNoby5weSB0ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUBBTV9DUFBGTEFHUyA9IC1EREJVU19TVEFUSUNfQlVJTEQKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF9wZW5kaW5nX2NhbGxfZGlzcGF0Y2hfU09VUkNFUyA9IFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMKKworQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChEQlVTX1RFU1RfTElCUykKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF9wZW5kaW5nX2NhbGxfZGlzcGF0Y2hfTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X1NPVVJDRVMgPSBcCitAREJVU19CVUlMRF9URVNUU19UUlVFQAl0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LmMKKworQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSAkKERCVVNfVEVTVF9MSUJTKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF90aHJlYWRzX2luaXRfU09VUkNFUyA9IFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtdGhyZWFkcy1pbml0LmMKKworQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3RocmVhZHNfaW5pdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgJChEQlVTX1RFU1RfTElCUykKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF90aHJlYWRzX2luaXRfTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X2lkc19TT1VSQ0VTID0gXAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUAJdGVzdC1pZHMuYworCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfaWRzX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSAkKERCVVNfVEVTVF9MSUJTKQorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X2lkc19MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3Rfc2h1dGRvd25fU09VUkNFUyA9IFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3Qtc2h1dGRvd24uYworCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3Rfc2h1dGRvd25fQ0ZMQUdTID0gCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3Rfc2h1dGRvd25fTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3Rfc2h1dGRvd25fTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3ByaXZzZXJ2ZXJfU09VUkNFUyA9IFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtcHJpdnNlcnZlci5jCisKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF9wcml2c2VydmVyX0NGTEFHUyA9IAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X3ByaXZzZXJ2ZXJfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfcHJpdnNlcnZlcl9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfU09VUkNFUyA9IFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtcHJpdnNlcnZlci1jbGllbnQuYworCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfQ0ZMQUdTID0gCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X2F1dG9sYXVuY2hfU09VUkNFUyA9IFwKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVACXRlc3QtYXV0b2xhdW5jaC5jCisKK0BEQlVTX0JVSUxEX1RFU1RTX1RSVUVAdGVzdF9hdXRvbGF1bmNoX0NGTEFHUyA9IAorQERCVVNfQlVJTERfVEVTVFNfVFJVRUB0ZXN0X2F1dG9sYXVuY2hfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIC4uL2xpYmRidXMtdGVzdHV0aWxzLmxhICQoREJVU19URVNUX0xJQlMpCitAREJVU19CVUlMRF9URVNUU19UUlVFQHRlc3RfYXV0b2xhdW5jaF9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB0ZXN0L25hbWUtdGVzdC9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSB0ZXN0L25hbWUtdGVzdC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisJQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAordGVzdC1hdXRvbGF1bmNoJChFWEVFWFQpOiAkKHRlc3RfYXV0b2xhdW5jaF9PQkpFQ1RTKSAkKHRlc3RfYXV0b2xhdW5jaF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB0ZXN0LWF1dG9sYXVuY2gkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKHRlc3RfYXV0b2xhdW5jaF9MSU5LKSAkKHRlc3RfYXV0b2xhdW5jaF9PQkpFQ1RTKSAkKHRlc3RfYXV0b2xhdW5jaF9MREFERCkgJChMSUJTKQordGVzdC1pZHMkKEVYRUVYVCk6ICQodGVzdF9pZHNfT0JKRUNUUykgJCh0ZXN0X2lkc19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB0ZXN0LWlkcyQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQodGVzdF9pZHNfTElOSykgJCh0ZXN0X2lkc19PQkpFQ1RTKSAkKHRlc3RfaWRzX0xEQUREKSAkKExJQlMpCit0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCQoRVhFRVhUKTogJCh0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9PQkpFQ1RTKSAkKHRlc3RfcGVuZGluZ19jYWxsX2Rpc3BhdGNoX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHRlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJCh0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9MSU5LKSAkKHRlc3RfcGVuZGluZ19jYWxsX2Rpc3BhdGNoX09CSkVDVFMpICQodGVzdF9wZW5kaW5nX2NhbGxfZGlzcGF0Y2hfTERBREQpICQoTElCUykKK3Rlc3QtcGVuZGluZy1jYWxsLXRpbWVvdXQkKEVYRUVYVCk6ICQodGVzdF9wZW5kaW5nX2NhbGxfdGltZW91dF9PQkpFQ1RTKSAkKHRlc3RfcGVuZGluZ19jYWxsX3RpbWVvdXRfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQodGVzdF9wZW5kaW5nX2NhbGxfdGltZW91dF9MSU5LKSAkKHRlc3RfcGVuZGluZ19jYWxsX3RpbWVvdXRfT0JKRUNUUykgJCh0ZXN0X3BlbmRpbmdfY2FsbF90aW1lb3V0X0xEQUREKSAkKExJQlMpCit0ZXN0LXByaXZzZXJ2ZXIkKEVYRUVYVCk6ICQodGVzdF9wcml2c2VydmVyX09CSkVDVFMpICQodGVzdF9wcml2c2VydmVyX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHRlc3QtcHJpdnNlcnZlciQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQodGVzdF9wcml2c2VydmVyX0xJTkspICQodGVzdF9wcml2c2VydmVyX09CSkVDVFMpICQodGVzdF9wcml2c2VydmVyX0xEQUREKSAkKExJQlMpCit0ZXN0LXByaXZzZXJ2ZXItY2xpZW50JChFWEVFWFQpOiAkKHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfT0JKRUNUUykgJCh0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHRlc3QtcHJpdnNlcnZlci1jbGllbnQkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKHRlc3RfcHJpdnNlcnZlcl9jbGllbnRfTElOSykgJCh0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50X09CSkVDVFMpICQodGVzdF9wcml2c2VydmVyX2NsaWVudF9MREFERCkgJChMSUJTKQordGVzdC1zaHV0ZG93biQoRVhFRVhUKTogJCh0ZXN0X3NodXRkb3duX09CSkVDVFMpICQodGVzdF9zaHV0ZG93bl9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB0ZXN0LXNodXRkb3duJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJCh0ZXN0X3NodXRkb3duX0xJTkspICQodGVzdF9zaHV0ZG93bl9PQkpFQ1RTKSAkKHRlc3Rfc2h1dGRvd25fTERBREQpICQoTElCUykKK3Rlc3QtdGhyZWFkcy1pbml0JChFWEVFWFQpOiAkKHRlc3RfdGhyZWFkc19pbml0X09CSkVDVFMpICQodGVzdF90aHJlYWRzX2luaXRfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdGVzdC10aHJlYWRzLWluaXQkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKHRlc3RfdGhyZWFkc19pbml0X0xJTkspICQodGVzdF90aHJlYWRzX2luaXRfT0JKRUNUUykgJCh0ZXN0X3RocmVhZHNfaW5pdF9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdC1pZHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0LXRocmVhZHMtaW5pdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdF9hdXRvbGF1bmNoLXRlc3QtYXV0b2xhdW5jaC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdF9wcml2c2VydmVyLXRlc3QtcHJpdnNlcnZlci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdF9wcml2c2VydmVyX2NsaWVudC10ZXN0LXByaXZzZXJ2ZXItY2xpZW50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90ZXN0X3NodXRkb3duLXRlc3Qtc2h1dGRvd24uUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKwordGVzdF9hdXRvbGF1bmNoLXRlc3QtYXV0b2xhdW5jaC5vOiB0ZXN0LWF1dG9sYXVuY2guYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfYXV0b2xhdW5jaF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdGVzdF9hdXRvbGF1bmNoLXRlc3QtYXV0b2xhdW5jaC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS90ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLlRwbyAtYyAtbyB0ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLm8gYHRlc3QgLWYgJ3Rlc3QtYXV0b2xhdW5jaC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LWF1dG9sYXVuY2guYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvdGVzdF9hdXRvbGF1bmNoLXRlc3QtYXV0b2xhdW5jaC5UcG8gJChERVBESVIpL3Rlc3RfYXV0b2xhdW5jaC10ZXN0LWF1dG9sYXVuY2guUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0LWF1dG9sYXVuY2guYycgb2JqZWN0PSd0ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfYXV0b2xhdW5jaF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB0ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLm8gYHRlc3QgLWYgJ3Rlc3QtYXV0b2xhdW5jaC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LWF1dG9sYXVuY2guYworCit0ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLm9iajogdGVzdC1hdXRvbGF1bmNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X2F1dG9sYXVuY2hfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHRlc3RfYXV0b2xhdW5jaC10ZXN0LWF1dG9sYXVuY2gub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS90ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLlRwbyAtYyAtbyB0ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLm9iaiBgaWYgdGVzdCAtZiAndGVzdC1hdXRvbGF1bmNoLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdC1hdXRvbGF1bmNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlc3QtYXV0b2xhdW5jaC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90ZXN0X2F1dG9sYXVuY2gtdGVzdC1hdXRvbGF1bmNoLlRwbyAkKERFUERJUikvdGVzdF9hdXRvbGF1bmNoLXRlc3QtYXV0b2xhdW5jaC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlc3QtYXV0b2xhdW5jaC5jJyBvYmplY3Q9J3Rlc3RfYXV0b2xhdW5jaC10ZXN0LWF1dG9sYXVuY2gub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X2F1dG9sYXVuY2hfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdGVzdF9hdXRvbGF1bmNoLXRlc3QtYXV0b2xhdW5jaC5vYmogYGlmIHRlc3QgLWYgJ3Rlc3QtYXV0b2xhdW5jaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3QtYXV0b2xhdW5jaC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LWF1dG9sYXVuY2guYyc7IGZpYAorCit0ZXN0X3ByaXZzZXJ2ZXItdGVzdC1wcml2c2VydmVyLm86IHRlc3QtcHJpdnNlcnZlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcml2c2VydmVyX0NGTEFHUykgJChDRkxBR1MpIC1NVCB0ZXN0X3ByaXZzZXJ2ZXItdGVzdC1wcml2c2VydmVyLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Rlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIuVHBvIC1jIC1vIHRlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIubyBgdGVzdCAtZiAndGVzdC1wcml2c2VydmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3QtcHJpdnNlcnZlci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90ZXN0X3ByaXZzZXJ2ZXItdGVzdC1wcml2c2VydmVyLlRwbyAkKERFUERJUikvdGVzdF9wcml2c2VydmVyLXRlc3QtcHJpdnNlcnZlci5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlc3QtcHJpdnNlcnZlci5jJyBvYmplY3Q9J3Rlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcml2c2VydmVyX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHRlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIubyBgdGVzdCAtZiAndGVzdC1wcml2c2VydmVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3QtcHJpdnNlcnZlci5jCisKK3Rlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIub2JqOiB0ZXN0LXByaXZzZXJ2ZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJpdnNlcnZlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdGVzdF9wcml2c2VydmVyLXRlc3QtcHJpdnNlcnZlci5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Rlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIuVHBvIC1jIC1vIHRlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIub2JqIGBpZiB0ZXN0IC1mICd0ZXN0LXByaXZzZXJ2ZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0ZXN0LXByaXZzZXJ2ZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGVzdC1wcml2c2VydmVyLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3Rlc3RfcHJpdnNlcnZlci10ZXN0LXByaXZzZXJ2ZXIuVHBvICQoREVQRElSKS90ZXN0X3ByaXZzZXJ2ZXItdGVzdC1wcml2c2VydmVyLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVzdC1wcml2c2VydmVyLmMnIG9iamVjdD0ndGVzdF9wcml2c2VydmVyLXRlc3QtcHJpdnNlcnZlci5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3RfcHJpdnNlcnZlcl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB0ZXN0X3ByaXZzZXJ2ZXItdGVzdC1wcml2c2VydmVyLm9iaiBgaWYgdGVzdCAtZiAndGVzdC1wcml2c2VydmVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdC1wcml2c2VydmVyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlc3QtcHJpdnNlcnZlci5jJzsgZmlgCisKK3Rlc3RfcHJpdnNlcnZlcl9jbGllbnQtdGVzdC1wcml2c2VydmVyLWNsaWVudC5vOiB0ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50X0NGTEFHUykgJChDRkxBR1MpIC1NVCB0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50LXRlc3QtcHJpdnNlcnZlci1jbGllbnQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvdGVzdF9wcml2c2VydmVyX2NsaWVudC10ZXN0LXByaXZzZXJ2ZXItY2xpZW50LlRwbyAtYyAtbyB0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50LXRlc3QtcHJpdnNlcnZlci1jbGllbnQubyBgdGVzdCAtZiAndGVzdC1wcml2c2VydmVyLWNsaWVudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3Rlc3RfcHJpdnNlcnZlcl9jbGllbnQtdGVzdC1wcml2c2VydmVyLWNsaWVudC5UcG8gJChERVBESVIpL3Rlc3RfcHJpdnNlcnZlcl9jbGllbnQtdGVzdC1wcml2c2VydmVyLWNsaWVudC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlc3QtcHJpdnNlcnZlci1jbGllbnQuYycgb2JqZWN0PSd0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50LXRlc3QtcHJpdnNlcnZlci1jbGllbnQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcml2c2VydmVyX2NsaWVudF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50LXRlc3QtcHJpdnNlcnZlci1jbGllbnQubyBgdGVzdCAtZiAndGVzdC1wcml2c2VydmVyLWNsaWVudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKKwordGVzdF9wcml2c2VydmVyX2NsaWVudC10ZXN0LXByaXZzZXJ2ZXItY2xpZW50Lm9iajogdGVzdC1wcml2c2VydmVyLWNsaWVudC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9wcml2c2VydmVyX2NsaWVudF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdGVzdF9wcml2c2VydmVyX2NsaWVudC10ZXN0LXByaXZzZXJ2ZXItY2xpZW50Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvdGVzdF9wcml2c2VydmVyX2NsaWVudC10ZXN0LXByaXZzZXJ2ZXItY2xpZW50LlRwbyAtYyAtbyB0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50LXRlc3QtcHJpdnNlcnZlci1jbGllbnQub2JqIGBpZiB0ZXN0IC1mICd0ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdC1wcml2c2VydmVyLWNsaWVudC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9hdCkkKGFtX19tdikgJChERVBESVIpL3Rlc3RfcHJpdnNlcnZlcl9jbGllbnQtdGVzdC1wcml2c2VydmVyLWNsaWVudC5UcG8gJChERVBESVIpL3Rlc3RfcHJpdnNlcnZlcl9jbGllbnQtdGVzdC1wcml2c2VydmVyLWNsaWVudC5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlc3QtcHJpdnNlcnZlci1jbGllbnQuYycgb2JqZWN0PSd0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50LXRlc3QtcHJpdnNlcnZlci1jbGllbnQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0X3ByaXZzZXJ2ZXJfY2xpZW50X0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHRlc3RfcHJpdnNlcnZlcl9jbGllbnQtdGVzdC1wcml2c2VydmVyLWNsaWVudC5vYmogYGlmIHRlc3QgLWYgJ3Rlc3QtcHJpdnNlcnZlci1jbGllbnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlc3QtcHJpdnNlcnZlci1jbGllbnQuYyc7IGZpYAorCit0ZXN0X3NodXRkb3duLXRlc3Qtc2h1dGRvd24ubzogdGVzdC1zaHV0ZG93bi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9zaHV0ZG93bl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdGVzdF9zaHV0ZG93bi10ZXN0LXNodXRkb3duLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Rlc3Rfc2h1dGRvd24tdGVzdC1zaHV0ZG93bi5UcG8gLWMgLW8gdGVzdF9zaHV0ZG93bi10ZXN0LXNodXRkb3duLm8gYHRlc3QgLWYgJ3Rlc3Qtc2h1dGRvd24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGVzdC1zaHV0ZG93bi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90ZXN0X3NodXRkb3duLXRlc3Qtc2h1dGRvd24uVHBvICQoREVQRElSKS90ZXN0X3NodXRkb3duLXRlc3Qtc2h1dGRvd24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0LXNodXRkb3duLmMnIG9iamVjdD0ndGVzdF9zaHV0ZG93bi10ZXN0LXNodXRkb3duLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3Rfc2h1dGRvd25fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdGVzdF9zaHV0ZG93bi10ZXN0LXNodXRkb3duLm8gYHRlc3QgLWYgJ3Rlc3Qtc2h1dGRvd24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGVzdC1zaHV0ZG93bi5jCisKK3Rlc3Rfc2h1dGRvd24tdGVzdC1zaHV0ZG93bi5vYmo6IHRlc3Qtc2h1dGRvd24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHRlc3Rfc2h1dGRvd25fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHRlc3Rfc2h1dGRvd24tdGVzdC1zaHV0ZG93bi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3Rlc3Rfc2h1dGRvd24tdGVzdC1zaHV0ZG93bi5UcG8gLWMgLW8gdGVzdF9zaHV0ZG93bi10ZXN0LXNodXRkb3duLm9iaiBgaWYgdGVzdCAtZiAndGVzdC1zaHV0ZG93bi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3Qtc2h1dGRvd24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGVzdC1zaHV0ZG93bi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS90ZXN0X3NodXRkb3duLXRlc3Qtc2h1dGRvd24uVHBvICQoREVQRElSKS90ZXN0X3NodXRkb3duLXRlc3Qtc2h1dGRvd24uUG8KK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKEFNX1ZfQ0MpIEBBTV9CQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0LXNodXRkb3duLmMnIG9iamVjdD0ndGVzdF9zaHV0ZG93bi10ZXN0LXNodXRkb3duLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdF9zaHV0ZG93bl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB0ZXN0X3NodXRkb3duLXRlc3Qtc2h1dGRvd24ub2JqIGBpZiB0ZXN0IC1mICd0ZXN0LXNodXRkb3duLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVzdC1zaHV0ZG93bi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0LXNodXRkb3duLmMnOyBmaWAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworY2hlY2stVEVTVFM6ICQoVEVTVFMpCisJQGZhaWxlZD0wOyBhbGw9MDsgeGZhaWw9MDsgeHBhc3M9MDsgc2tpcD0wOyBcCisJc3JjZGlyPSQoc3JjZGlyKTsgZXhwb3J0IHNyY2RpcjsgXAorCWxpc3Q9JyAkKFRFU1RTKSAnOyBcCisJJChhbV9fdHR5X2NvbG9ycyk7IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKKwkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKKwkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKKwkJeHBhc3M9YGV4cHIgJCR4cGFzcyArIDFgOyBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPVhQQVNTOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJY29sPSQkZ3JuOyByZXM9UEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICBlc2FjOyBcCisJICAgIGVsaWYgdGVzdCAkJD8gLW5lIDc3OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhmYWlsPWBleHByICQkeGZhaWwgKyAxYDsgXAorCQljb2w9JCRsZ247IHJlcz1YRkFJTDsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPUZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbHNlIFwKKwkgICAgICBza2lwPWBleHByICQkc2tpcCArIDFgOyBcCisJICAgICAgY29sPSQkYmx1OyByZXM9U0tJUDsgXAorCSAgICBmaTsgXAorCSAgICBlY2hvICIkJHtjb2x9JCRyZXMkJHtzdGR9OiAkJHRzdCI7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIHRlc3QgIiQkYWxsIiAtZXEgMTsgdGhlbiBcCisJICAgIHRlc3RzPSJ0ZXN0IjsgXAorCSAgICBBbGw9IiI7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0cz0idGVzdHMiOyBcCisJICAgIEFsbD0iQWxsICI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAorCSAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMDsgdGhlbiBcCisJICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgcGFzc2VkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMTsgdGhlbiBmYWlsdXJlcz1mYWlsdXJlOyBlbHNlIGZhaWx1cmVzPWZhaWx1cmVzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIGJlaGF2ZWQgYXMgZXhwZWN0ZWQgKCQkeGZhaWwgZXhwZWN0ZWQgJCRmYWlsdXJlcykiOyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBmYWlsZWQiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAxOyB0aGVuIHBhc3Nlcz1wYXNzOyBlbHNlIHBhc3Nlcz1wYXNzZXM7IGZpOyBcCisJICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgJCRwYXNzZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwkgIGRhc2hlcz0iJCRiYW5uZXIiOyBcCisJICBza2lwcGVkPSIiOyBcCisJICBpZiB0ZXN0ICIkJHNraXAiIC1uZSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCRza2lwIiAtZXEgMTsgdGhlbiBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0IHdhcyBub3QgcnVuKSI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0cyB3ZXJlIG5vdCBydW4pIjsgXAorCSAgICBmaTsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHNraXBwZWQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKKwkgICAgICBkYXNoZXM9IiQkc2tpcHBlZCI7IFwKKwkgIGZpOyBcCisJICByZXBvcnQ9IiI7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtbmUgMCAmJiB0ZXN0IC1uICIkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IHRoZW4gXAorCSAgICByZXBvcnQ9IlBsZWFzZSByZXBvcnQgdG8gJChQQUNLQUdFX0JVR1JFUE9SVCkiOyBcCisJICAgIHRlc3QgYGVjaG8gIiQkcmVwb3J0IiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHJlcG9ydCI7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9YGVjaG8gIiQkZGFzaGVzIiB8IHNlZCBzLy4vPS9nYDsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgZWNobyAiJCRncm4kJGRhc2hlcyI7IFwKKwkgIGVsc2UgXAorCSAgICBlY2hvICIkJHJlZCQkZGFzaGVzIjsgXAorCSAgZmk7IFwKKwkgIGVjaG8gIiQkYmFubmVyIjsgXAorCSAgdGVzdCAteiAiJCRza2lwcGVkIiB8fCBlY2hvICIkJHNraXBwZWQiOyBcCisJICB0ZXN0IC16ICIkJHJlcG9ydCIgfHwgZWNobyAiJCRyZXBvcnQiOyBcCisJICBlY2hvICIkJGRhc2hlcyQkc3RkIjsgXAorCSAgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyBcCisJZWxzZSA6OyBmaQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1URVNUUworY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RQUk9HUkFNUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBjaGVjay1hbSBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLVRFU1RTIGNoZWNrLWFtIGNsZWFuIFwKKwljbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIFwKKwlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LXN5c3RlbXNlcnZlci5zaCBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LXN5c3RlbXNlcnZlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kM2I4ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Qtc3lzdGVtc2VydmVyLnNoCkBAIC0wLDAgKzEsNTAgQEAKKyMhIC9iaW4vc2gKK2RpZSgpCit7CisgICAgaWYgISB0ZXN0IC16ICIkREJVU19TRVNTSU9OX0JVU19QSUQiIDsgdGhlbgorICAgICAgICBlY2hvICJraWxsaW5nIG1lc3NhZ2UgYnVzICIkREJVU19TRVNTSU9OX0JVU19QSUQgPiYyCisgICAgICAgIGtpbGwgLTkgJERCVVNfU0VTU0lPTl9CVVNfUElECisgICAgZmkKKyAgICBlY2hvICRTQ1JJUFROQU1FOiAkKiA+JjIKKworICAgIGV4aXQgMQorfQorCitTQ1JJUFROQU1FPSQwCitNT0RFPSQxCisKKyMjIHNvIHRoZSB0ZXN0cyBjYW4gY29tcGxhaW4gaWYgeW91IGZhaWwgdG8gdXNlIHRoZSBzY3JpcHQgdG8gbGF1bmNoIHRoZW0KK0RCVVNfVEVTVF9OQU1FX1JVTl9URVNUX1NDUklQVD0xCitleHBvcnQgREJVU19URVNUX05BTUVfUlVOX1RFU1RfU0NSSVBUCisKK1NPVVJDRV9DT05GSUdfRklMRT0kREJVU19UT1BfU1JDRElSL3Rlc3QvbmFtZS10ZXN0L3RtcC1zZXNzaW9uLWxpa2Utc3lzdGVtLmNvbmYKK2V4cG9ydCBTT1VSQ0VfQ09ORklHX0ZJTEUKKyMgUmVydW4gb3Vyc2VsdmVzIHdpdGggdG1wIHNlc3Npb24gYnVzIGlmIHdlJ3JlIG5vdCBhbHJlYWR5CitpZiB0ZXN0IC16ICIkREJVU19URVNUX05BTUVfSU5fU1lTX1JVTl9URVNUIjsgdGhlbgorICBEQlVTX1RFU1RfTkFNRV9JTl9TWVNfUlVOX1RFU1Q9MQorICBleHBvcnQgREJVU19URVNUX05BTUVfSU5fU1lTX1JVTl9URVNUCisgIGV4ZWMgJERCVVNfVE9QX1NSQ0RJUi90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2ggJFNDUklQVE5BTUUgJE1PREUKK2ZpIAorCitpZiB0ZXN0IC1uICIkREJVU19URVNUX01PTklUT1IiOyB0aGVuCisgIGRidXMtbW9uaXRvciAtLXNlc3Npb24gJgorZmkKKworZWNobyAicnVubmluZyB0ZXN0LWV4cGVjdGVkLWVjaG8tZmFpbCIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90b29scy9kYnVzLXNlbmQgLS1wcmludC1yZXBseSAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UgL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUgb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZS5FY2hvIHN0cmluZzpoaSA+ZWNoby1lcnJvci1vdXRwdXQudG1wIDI+JjEKK2lmICEgZ3JlcCAtcSAnREJ1cy5FcnJvcicgZWNoby1lcnJvci1vdXRwdXQudG1wOyB0aGVuCisgIGVjaG8gIkRpZG4ndCBnZXQgZXhwZWN0ZWQgZmFpbHVyZTsgb3V0cHV0IHdhczoiCisgIGVjaG8gIj09PT09IgorICBjYXQgZWNoby1lcnJvci1vdXRwdXQudG1wCisgIGVjaG8gIj09PT09IgorICBleGl0IDEKK2ZpCisKK2VjaG8gInJ1bm5pbmcgdGVzdCBlY2hvIHNpZ25hbCIKK2lmICEgcHl0aG9uICREQlVTX1RPUF9TUkNESVIvdGVzdC9uYW1lLXRlc3QvdGVzdC13YWl0LWZvci1lY2hvLnB5OyB0aGVuCisgIGVjaG8gIkZhaWxlZCB0ZXN0LXdhaXQtZm9yLWVjaG8iCisgIGV4aXQgMQorZmkKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTcwMDU1YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoCkBAIC0wLDAgKzEsNTggQEAKKyMhIC9iaW4vc2gKKworZGllKCkKK3sKKyAgICBpZiAhIHRlc3QgLXogIiREQlVTX1NFU1NJT05fQlVTX1BJRCIgOyB0aGVuCisgICAgICAgIGVjaG8gImtpbGxpbmcgbWVzc2FnZSBidXMgIiREQlVTX1NFU1NJT05fQlVTX1BJRCA+JjIKKyAgICAgICAga2lsbCAtOSAkREJVU19TRVNTSU9OX0JVU19QSUQKKyAgICBmaQorICAgIGVjaG8gJFNDUklQVE5BTUU6ICQqID4mMgorCisgICAgZXhpdCAxCit9CisKKworU0NSSVBUTkFNRT0kMAorTU9ERT0kMQorCisjIyBzbyB0aGUgdGVzdHMgY2FuIGNvbXBsYWluIGlmIHlvdSBmYWlsIHRvIHVzZSB0aGUgc2NyaXB0IHRvIGxhdW5jaCB0aGVtCitEQlVTX1RFU1RfTkFNRV9SVU5fVEVTVF9TQ1JJUFQ9MQorZXhwb3J0IERCVVNfVEVTVF9OQU1FX1JVTl9URVNUX1NDUklQVAorCisjIFJlcnVuIG91cnNlbHZlcyB3aXRoIHRtcCBzZXNzaW9uIGJ1cyBpZiB3ZSdyZSBub3QgYWxyZWFkeQoraWYgdGVzdCAteiAiJERCVVNfVEVTVF9OQU1FX0lOX1JVTl9URVNUIjsgdGhlbgorICBEQlVTX1RFU1RfTkFNRV9JTl9SVU5fVEVTVD0xCisgIGV4cG9ydCBEQlVTX1RFU1RfTkFNRV9JTl9SVU5fVEVTVAorICBleGVjICREQlVTX1RPUF9TUkNESVIvdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoICRTQ1JJUFROQU1FICRNT0RFCitmaSAKKworaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9NT05JVE9SIjsgdGhlbgorICBkYnVzLW1vbml0b3IgLS1zZXNzaW9uICYKK2ZpCisKK2VjaG8gInJ1bm5pbmcgdGVzdC1pZHMiCiske0RCVVNfVE9QX0JVSUxERElSfS9saWJ0b29sIC0tbW9kZT1leGVjdXRlICRERUJVRyAkREJVU19UT1BfQlVJTERESVIvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMgfHwgZGllICJ0ZXN0LWlkcyBmYWlsZWQiCisKK2VjaG8gInJ1bm5pbmcgdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2giCiske0RCVVNfVE9QX0JVSUxERElSfS9saWJ0b29sIC0tbW9kZT1leGVjdXRlICRERUJVRyAkREJVU19UT1BfQlVJTERESVIvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2ggfHwgZGllICJ0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCBmYWlsZWQiCisKK2VjaG8gInJ1bm5pbmcgdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0IHx8IGRpZSAidGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCBmYWlsZWQiCisKK2VjaG8gInJ1bm5pbmcgdGVzdC10aHJlYWRzLWluaXQiCiske0RCVVNfVE9QX0JVSUxERElSfS9saWJ0b29sIC0tbW9kZT1leGVjdXRlICRERUJVRyAkREJVU19UT1BfQlVJTERESVIvdGVzdC9uYW1lLXRlc3QvdGVzdC10aHJlYWRzLWluaXQgfHwgZGllICJ0ZXN0LXRocmVhZHMtaW5pdCBmYWlsZWQiCisKK2VjaG8gInJ1bm5pbmcgdGVzdC1wcml2c2VydmVyLWNsaWVudCIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXItY2xpZW50IHx8IGRpZSAidGVzdC1wcml2c2VydmVyLWNsaWVudCBmYWlsZWQiCisKK2VjaG8gInJ1bm5pbmcgdGVzdC1zaHV0ZG93biIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90ZXN0L25hbWUtdGVzdC90ZXN0LXNodXRkb3duIHx8IGRpZSAidGVzdC1zaHV0ZG93biBmYWlsZWQiCisKK2VjaG8gInJ1bm5pbmcgdGVzdCBhY3RpdmF0aW9uIGZvcmtpbmciCitpZiAhIHB5dGhvbiAkREJVU19UT1BfU1JDRElSL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYWN0aXZhdGlvbi1mb3JraW5nLnB5OyB0aGVuCisgIGVjaG8gIkZhaWxlZCB0ZXN0LWFjdGl2YXRpb24tZm9ya2luZyIKKyAgZXhpdCAxCitmaQorCitlY2hvICJydW5uaW5nIHRlc3QtYXV0b2xhdW5jaCIKKyR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wgLS1tb2RlPWV4ZWN1dGUgJERFQlVHICREQlVTX1RPUF9CVUlMRERJUi90ZXN0L25hbWUtdGVzdC90ZXN0LWF1dG9sYXVuY2ggfHwgZGllICJ0ZXN0LWF1dG9sYXVuY2ggZmFpbGVkIgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgyMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkKQEAgLTAsMCArMSw2MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcyxzeXMKKwordHJ5OgorICAgIGltcG9ydCBnb2JqZWN0CisgICAgaW1wb3J0IGRidXMKKyAgICBpbXBvcnQgZGJ1cy5tYWlubG9vcC5nbGliCitleGNlcHQ6CisgICAgcHJpbnQgIkZhaWxlZCBpbXBvcnQsIGFib3J0aW5nIHRlc3QiCisgICAgc3lzLmV4aXQoMCkKKworZGJ1cy5tYWlubG9vcC5nbGliLkRCdXNHTWFpbkxvb3Aoc2V0X2FzX2RlZmF1bHQ9VHJ1ZSkKK2xvb3AgPSBnb2JqZWN0Lk1haW5Mb29wKCkKKworZXhpdGNvZGUgPSAwCisKK2J1cyA9IGRidXMuU2Vzc2lvbkJ1cygpCitidXNfaWZhY2UgPSBkYnVzLkludGVyZmFjZShidXMuZ2V0X29iamVjdCgnb3JnLmZyZWVkZXNrdG9wLkRCdXMnLCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJyksICdvcmcuZnJlZWRlc2t0b3AuREJ1cycpCisKK28gPSBidXMuZ2V0X29iamVjdCgnb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlJywgJy9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlJykKK2kgPSBkYnVzLkludGVyZmFjZShvLCAnb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZScpCisKKyMgU3RhcnQgaXQgdXAKK3JlcGx5ID0gaS5FY2hvKCJoZWxsbyB3b3JsZCIpCitwcmludCAiVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlIGluaXRpYWwgcmVwbHkgT0siCisKK2RlZiBpZ25vcmUoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBwYXNzCisKKyMgTm93IG1vbml0b3IgZm9yIGV4aXRzLCB3aGVuIHRoYXQgaGFwcGVucywgc3RhcnQgaXQgdXAgYWdhaW4uCisjIFRoZSBnb2FsIGhlcmUgaXMgdG8gdHJ5IHRvIGhpdCBhbnkgcmFjZSBjb25kaXRpb25zIGluIGFjdGl2YXRpb24uCitjb3VudGVyID0gMAorZGVmIG9uX2ZvcmtpbmdfZWNob19vd25lcl9jaGFuZ2VkKG5hbWUsIG9sZCwgbmV3KToKKyAgICBnbG9iYWwgY291bnRlcgorICAgIGdsb2JhbCBvCisgICAgZ2xvYmFsIGkKKyAgICBpZiBjb3VudGVyID4gMTA6CisgICAgICAgIHByaW50ICJBY3RpdmF0ZWQgMTAgdGltZXMgT0ssIFRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZSBwYXNzIgorICAgICAgICBsb29wLnF1aXQoKQorICAgICAgICByZXR1cm4KKyAgICBjb3VudGVyICs9IDEKKyAgICBpZiBuZXcgPT0gJyc6CisgICAgICAgIG8gPSBidXMuZ2V0X29iamVjdCgnb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlJywgJy9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlJykKKyAgICAgICAgaSA9IGRidXMuSW50ZXJmYWNlKG8sICdvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlJykKKyAgICAgICAgaS5FY2hvKCJjb3VudGVyICVyIiAlIGNvdW50ZXIpCisgICAgICAgIGkuRXhpdChyZXBseV9oYW5kbGVyPWlnbm9yZSwgZXJyb3JfaGFuZGxlcj1pZ25vcmUpCisKK2J1c19pZmFjZS5jb25uZWN0X3RvX3NpZ25hbCgnTmFtZU93bmVyQ2hhbmdlZCcsIG9uX2ZvcmtpbmdfZWNob19vd25lcl9jaGFuZ2VkLCBhcmcwPSdvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UnKQorCitpLkV4aXQocmVwbHlfaGFuZGxlcj1pZ25vcmUsIGVycm9yX2hhbmRsZXI9aWdub3JlKQorCitkZWYgY2hlY2tfY291bnRlcigpOgorICAgIGlmIGNvdW50ZXIgPT0gMDoKKyAgICAgICAgcHJpbnQgIkZhaWxlZCB0byBnZXQgTmFtZU93bmVyQ2hhbmdlZCBmb3IgVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlIgorICAgICAgICBzeXMuZXhpdCgxKQorZ29iamVjdC50aW1lb3V0X2FkZCgxNTAwMCwgY2hlY2tfY291bnRlcikKKworbG9vcC5ydW4oKQorc3lzLmV4aXQoMCkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYXV0b2xhdW5jaC5jIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1hdXRvbGF1bmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1MTk4OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYXV0b2xhdW5jaC5jCkBAIC0wLDAgKzEsNTAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSAiZGJ1cy9kYnVzLXN5c2RlcHMuaCIKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubiA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBfZGJ1c19zZXRlbnYgKCJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiLCBOVUxMKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgY29ubiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogRmFpbGVkIHRvIGF1dG9sYXVuY2ggc2Vzc2lvbiBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisjZWxzZQorICAvKiBXZSBkb24ndCBuZWNlc3NhcmlseSBleHBlY3QgaXQgdG8gKndvcmsqIHdpdGhvdXQgWCAoYWx0aG91Z2ggaXQgbWlnaHQgLQorICAgKiBmb3IgaW5zdGFuY2Ugb24gTWFjIE9TIGl0IG1pZ2h0IGhhdmUgdXNlZCBsYXVuY2hkKS4gSnVzdCBjaGVjayB0aGF0IHRoZQorICAgKiByZXN1bHRzIGFyZSBjb25zaXN0ZW50LiAqLworCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSAmJiBjb25uICE9IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEF1dG9sYXVuY2hlZCBzZXNzaW9uIGJ1cywgYnV0IGFuIGVycm9yIHdhcyBzZXQhXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikgJiYgY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gYXV0b2xhdW5jaCBzZXNzaW9uIGJ1cyBidXQgbm8gZXJyb3Igd2FzIHNldFxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LWlkcy5jIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYzZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYwpAQCAtMCwwICsxLDU2IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlKQoreworICBmcHJpbnRmIChzdGRlcnIsICIqKiogdGVzdC1pZHM6ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGNoYXIgKmlkOworICBjaGFyICpzZXJ2ZXJfaWQ7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gc3lzdGVtIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBzZXJ2ZXJfaWQgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlcnZlcl9pZCAoY29ubmVjdGlvbik7CisgIGlmIChzZXJ2ZXJfaWQgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBidXMgc2VydmVyIElEIHJldHJpZXZlZFxuIik7CisgIC8qIHByaW50ZigiJyVzJ1xuIiwgc2VydmVyX2lkKTsgKi8KKyAgaWYgKHN0cmxlbiAoc2VydmVyX2lkKSAhPSAzMikKKyAgICBkaWUgKCJCdXMgc2VydmVyIGlkIHNob3VsZCBoYXZlIGxlbmd0aCAzMlxuIik7CisgIGRidXNfZnJlZSAoc2VydmVyX2lkKTsKKworICBpZCA9IGRidXNfYnVzX2dldF9pZCAoY29ubmVjdGlvbiwgTlVMTCk7CisgIGlmIChpZCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIGJ1cyBJRCByZXRyaWV2ZWRcbiIpOworICAvKiBwcmludGYoIiclcydcbiIsIGlkKTsgKi8KKyAgaWYgKHN0cmxlbiAoaWQpICE9IDMyKQorICAgIGRpZSAoIkJ1cyBJRCBzaG91bGQgaGF2ZSBsZW5ndGggMzJcbiIpOworICBkYnVzX2ZyZWUgKGlkKTsgIAorICAKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IElEcyBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2guYyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ODJkNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorKiBUZXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgc3R1Y2sgcG9sbGluZyBhIGRidXMgY29ubmVjdGlvbgorKiB3aGljaCBoYXMgbm8gZGF0YSBvbiB0aGUgc29ja2V0LiAgVGhpcyB3YXMgYW4gaXNzdWUgd2hlcmUKKyogb25lIHBlbmRpbmcgY2FsbCB3b3VsZCByZWFkIGFsbCB0aGUgZGF0YSBvZmYgdGhlIGJ1cworKiBhbmQgdGhlIHNlY29uZCBwZW5kaW5nIGNhbGwgd291bGQgbm90IGNoZWNrIHRvIHNlZQorKiBpZiBpdHMgZGF0YSBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgYmVmb3JlIHBvbGxpbmcgdGhlIGNvbm5lY3Rpb24KKyogYW5kIGJsb2NraW5nLgorKiovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkCitfcnVuX2l0ZXJhdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4pCit7CisgIERCdXNQZW5kaW5nQ2FsbCAqZWNob19wZW5kaW5nOworICBEQnVzUGVuZGluZ0NhbGwgKmRidXNfcGVuZGluZzsKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICplY2hvID0gImVjaG8iOworCisgIC8qIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpOworCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmVjaG9fcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisgIAorICAvKiBzZW5kIHRoZSBzZWNvbmQgbWVzc2FnZSAqLworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmRidXNfcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgLyogYmxvY2sgb24gdGhlIHNlY29uZCBtZXNzYWdlIChzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5KSAqLworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoZGJ1c19wZW5kaW5nKTsKKworICAvKiBibG9jayBvbiB0aGUgZmlyc3QgbWVzc2FnZSAqLworICAvKiBpZiBpdCBkb2VzIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkgY2hhbmNlcyAKKyAgICAgYXJlIHdlIGhpdCB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKGVjaG9fcGVuZGluZyk7CisKKyAgLyogY2hlY2sgdGhlIHJlcGx5IG9ubHkgdG8gbWFrZSBzdXJlIHdlCisgICAgIGFyZSBub3QgZ2V0dGluZyBlcnJvcnMgdW5yZWxhdGVkCisgICAgIHRvIHRoZSBibG9jayBpbiBwb2xsIGJ1ZyAqLworICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChlY2hvX3BlbmRpbmcpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgTlVMTCAqKipcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBwcmludGYgKCJGYWlsZWQ6IFJlcGx5IGlzIGVycm9yOiAlcyAqKipcbiIsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAocmVwbHkpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0gCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChkYnVzX3BlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAoZWNob19wZW5kaW5nKTsKKyAgCit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgbG9uZyBzdGFydF90dl9zZWMsIHN0YXJ0X3R2X3VzZWM7CisgIGxvbmcgZW5kX3R2X3NlYywgZW5kX3R2X3VzZWM7CisgIGludCBpOworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIC8qIFRpbWUgZWFjaCBpdGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHRha2UgbW9yZSB0aGFuIDUgc2Vjb25kcworICAgICB0byBjb21wbGV0ZS4gIE91dHNpZGUgaW5mbHVlbmNlcyBtYXkgY2F1c2UgY29ubmVjdGlvbnMgdG8gdGFrZSBsb25nZXIKKyAgICAgYnV0IGlmIGl0IGRvZXMgYW5kIHdlIGFyZSBzdHVjayBpbiBhIHBvbGwgY2FsbCB0aGVuIHdlIGtub3cgdGhlIAorICAgICBzdHVjayBpbiBwb2xsIGJ1ZyBoYXMgY29tZSBiYWNrIHRvIGhhdW50IHVzICovCisKKyAgcHJpbnRmICgiKioqIFRlc3Rpbmcgc3R1Y2sgaW4gcG9sbFxuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbm4gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisKKyAgLyogcnVuIDEwMCB0aW1lcyB0byBtYWtlIHN1cmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIHsKKyAgICAgIGxvbmcgZGVsdGE7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZzdGFydF90dl9zZWMsICZzdGFydF90dl91c2VjKTsKKyAgICAgIF9ydW5faXRlcmF0aW9uIChjb25uKTsKKyAgICAgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZlbmRfdHZfc2VjLCAmZW5kX3R2X3VzZWMpOworCisgICAgICAvKiB3ZSBqdXN0IGNhcmUgYWJvdXQgc2Vjb25kcyAqLworICAgICAgZGVsdGEgPSBlbmRfdHZfc2VjIC0gc3RhcnRfdHZfc2VjOworICAgICAgcHJpbnRmICgiSXRlciAlaTogJWxpc1xuIiwgaSwgZGVsdGEpOworICAgICAgaWYgKGRlbHRhID49IDUpCisgICAgICAgIHsKKwkgIHByaW50ZiAoIkZhaWxlZDogbG9va3MgbGlrZSB3ZSBtaWdodCBoYXZlIGJlZW4gYmUgc3R1Y2sgaW4gcG9sbCAqKipcbiIpOworCSAgZXhpdCAoMSk7CisJfQorICAgIH0KKyAKKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm4sIG1ldGhvZCwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKworICBwcmludGYgKCJTdWNjZXNzICoqKlxuIik7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTExM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qKgorKiBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHBlbmRpbmcgY2FsbHMgc3VjY2VlZCB3aGVuIGdpdmVuIGEgZGVmYXVsdCwKKyogc3BlY2lmaWMgYW5kIGluZmluaXRlIHRpbWVvdXQuCisqKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQKK19tZXRob2RfY2FsbCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisJICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIERCdXNNZXNzYWdlICptZXRob2Q7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgY2hhciAqZWNobyA9ICJlY2hvIjsKKworICAvKiBzZW5kIHRoZSBtZXNzYWdlICovCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlbGF5RWNobyIpOworCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJnBlbmRpbmcsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworICAKKyAgLyogYmxvY2sgb24gdGhlIG1lc3NhZ2UgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKHBlbmRpbmcpOworCisgIC8qIGNoZWNrIHRoZSByZXBseSBvbmx5IHRvIG1ha2Ugc3VyZSB3ZQorICAgICBhcmUgbm90IGdldHRpbmcgZXJyb3JzIHVucmVsYXRlZAorICAgICB0byB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgcmVwbHkgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAocGVuZGluZyk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiRmFpbGVkOiBSZXBseSBpcyBOVUxMICoqKlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAocmVwbHkpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgZXJyb3I6ICVzICoqKlxuIiwgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChyZXBseSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfSAKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworfQorCitzdGF0aWMgdm9pZAorX3J1bl9pdGVyYXRpb24gKERCdXNDb25uZWN0aW9uICpjb25uKQoreworICBfbWV0aG9kX2NhbGwgKGNvbm4sIC0xKTsKKyAgX21ldGhvZF9jYWxsIChjb25uLCAxMDAwMCk7CisgIF9tZXRob2RfY2FsbCAoY29ubiwgSU5UX01BWCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgbG9uZyBzdGFydF90dl9zZWMsIHN0YXJ0X3R2X3VzZWM7CisgIGxvbmcgZW5kX3R2X3NlYywgZW5kX3R2X3VzZWM7CisgIGludCBpOworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHByaW50ZiAoIioqKiBUZXN0aW5nIHBlbmRpbmcgY2FsbCB0aW1lb3V0c1xuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbm4gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisKKyAgLyogcnVuIDEwMCB0aW1lcyB0byBtYWtlIHN1cmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIHsKKyAgICAgIGxvbmcgZGVsdGE7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZzdGFydF90dl9zZWMsICZzdGFydF90dl91c2VjKTsKKyAgICAgIF9ydW5faXRlcmF0aW9uIChjb25uKTsKKyAgICAgIF9kYnVzX2dldF9jdXJyZW50X3RpbWUgKCZlbmRfdHZfc2VjLCAmZW5kX3R2X3VzZWMpOworCisgICAgICAvKiB3ZSBqdXN0IGNhcmUgYWJvdXQgc2Vjb25kcyAqLworICAgICAgZGVsdGEgPSBlbmRfdHZfc2VjIC0gc3RhcnRfdHZfc2VjOworICAgICAgcHJpbnRmICgiSXRlciAlaTogJWxpc1xuIiwgaSwgZGVsdGEpOworICAgIH0KKyAKKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm4sIG1ldGhvZCwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKworICBwcmludGYgKCJTdWNjZXNzICoqKlxuIik7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLWNsaWVudC5jIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLWNsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDNmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKQEAgLTAsMCArMSwxNjkgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICIuLi90ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICBleGl0ICgxKTsKK30KKworI2RlZmluZSBQUklWU0VSVkVSX1NFUlZJQ0UgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyIgorI2RlZmluZSBQUklWU0VSVkVSX0lOVEVSRkFDRSBQUklWU0VSVkVSX1NFUlZJQ0UKKyNkZWZpbmUgUFJJVlNFUlZFUl9ESUVEX1JVTEUgXAorICAgICAgInR5cGU9J3NpZ25hbCcsc2VuZGVyPSciIERCVVNfU0VSVklDRV9EQlVTICInLCIgXAorICAgICAgImludGVyZmFjZT0nIiBEQlVTX0lOVEVSRkFDRV9EQlVTICInLG1lbWJlcj0nTmFtZU93bmVyQ2hhbmdlZCcsIiBcCisgICAgICAiYXJnMD0nIiBQUklWU0VSVkVSX1NFUlZJQ0UgIicsYXJnMj0nJyIKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitmaWx0ZXJfc2Vzc2lvbl9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgKnNlcnZpY2VfZGllZF9wID0gdXNlcl9kYXRhOworICBjb25zdCBjaGFyICpuYW1lLCAqb2xkX293bmVyLCAqbmV3X293bmVyOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikgJiYKKyAgICAgIGRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykgJiYKKyAgICAgIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZvbGRfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuZXdfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSAmJgorICAgICAgc3RyY21wIChuYW1lLCBQUklWU0VSVkVSX1NFUlZJQ0UpID09IDAgJiYKKyAgICAgIG9sZF9vd25lclswXSAhPSAnXDAnICYmCisgICAgICBuZXdfb3duZXJbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICAqc2VydmljZV9kaWVkX3AgPSBUUlVFOworICAgIH0KKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdCAKK2ZpbHRlcl9wcml2YXRlX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBkYnVzX2Jvb2xfdCAqcHJpdmF0ZV9jb25uX2xvc3RfcCA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIHsKKyAgICAgICpwcml2YXRlX2Nvbm5fbG9zdF9wID0gVFJVRTsKKyAgICB9CisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK29wZW5fc2h1dGRvd25fcHJpdmF0ZV9jb25uZWN0aW9uIChkYnVzX2Jvb2xfdCB1c2VfZ3VpZCkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTG9vcCAqbG9vcDsKKyAgREJ1c0Nvbm5lY3Rpb24gKnNlc3Npb247CisgIERCdXNNZXNzYWdlICptc2c7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c0Nvbm5lY3Rpb24gKnByaXZjb25uOworICBjaGFyICphZGRyOworICBjaGFyICpjb21tYTsKKyAgZGJ1c19ib29sX3Qgc2VydmljZV9kaWVkOworICBkYnVzX2Jvb2xfdCBwcml2YXRlX2Nvbm5fbG9zdDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIHNlcnZpY2VfZGllZCA9IEZBTFNFOworICBwcml2YXRlX2Nvbm5fbG9zdCA9IEZBTFNFOworCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKworICBzZXNzaW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworICBpZiAoIXNlc3Npb24pCisgICAgZGllICgiY291bGRuJ3QgYWNjZXNzIHNlc3Npb24gYnVzXG4iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKHNlc3Npb24sIEZBTFNFKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBzZXNzaW9uKTsKKworICBkYnVzX2J1c19hZGRfbWF0Y2ggKHNlc3Npb24sIFBSSVZTRVJWRVJfRElFRF9SVUxFLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgZGllICgiY291bGRuJ3QgYWRkIG1hdGNoIHJ1bGUgXCIlc1wiOiAlczogJXMiLCBQUklWU0VSVkVSX0RJRURfUlVMRSwKKyAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKHNlc3Npb24sIGZpbHRlcl9zZXNzaW9uX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX2RpZWQsIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBmaWx0ZXIgdG8gc2Vzc2lvbiBidXNcbiIpOworCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFBSSVZTRVJWRVJfU0VSVklDRSwgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklWU0VSVkVSX0lOVEVSRkFDRSwgIkdldFByaXZhdGVBZGRyZXNzIik7CisgIGlmICghKHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKHNlc3Npb24sIG1zZywgLTEsICZlcnJvcikpKQorICAgIGRpZSAoImNvdWxkbid0IHNlbmQgbWVzc2FnZTogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChyZXBseSwgJmVycm9yLCBEQlVTX1RZUEVfU1RSSU5HLCAmYWRkciwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGRpZSAoImNvdWxkbid0IHBhcnNlIG1lc3NhZ2UgcmVwbHltXG4iKTsKKyAgcHJpbnRmICgiZ290IHByaXZhdGUgdGVtcCBhZGRyZXNzICVzXG4iLCBhZGRyKTsKKyAgYWRkciA9IHN0cmR1cCAoYWRkcik7CisgIGlmICghdXNlX2d1aWQpCisgICAgeworICAgICAgY2hhciAqY29tbWEgPSBzdHJyY2hyIChhZGRyLCAnLCcpOworICAgICAgaWYgKGNvbW1hKQorICAgICAgICAqY29tbWEgPSAnXDAnOworICAgIH0KKyAgcHJpdmNvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoYWRkciwgJmVycm9yKTsKKyAgZnJlZSAoYWRkcik7CisgIGlmICghcHJpdmNvbm4pCisgICAgZGllICgiY291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXIgZGlyZWN0IGNvbm5lY3Rpb246ICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKHByaXZjb25uLCBGQUxTRSk7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKHByaXZjb25uLCBmaWx0ZXJfcHJpdmF0ZV9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdmF0ZV9jb25uX2xvc3QsIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBmaWx0ZXIgdG8gcHJpdmF0ZSBjb25uZWN0aW9uXG4iKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBwcml2Y29ubik7CisKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoUFJJVlNFUlZFUl9TRVJWSUNFLCAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSVZTRVJWRVJfSU5URVJGQUNFLCAiUXVpdCIpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChzZXNzaW9uLCBtc2csIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IHNlbmQgUXVpdCBtZXNzYWdlXG4iKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworCisgIHdoaWxlICghc2VydmljZV9kaWVkIHx8ICFwcml2YXRlX2Nvbm5fbG9zdCkKKyAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGxvb3AsIFRSVUUpOworCisgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChzZXNzaW9uLCBmaWx0ZXJfc2Vzc2lvbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZpY2VfZGllZCk7CisgIGRidXNfYnVzX3JlbW92ZV9tYXRjaCAoc2Vzc2lvbiwgUFJJVlNFUlZFUl9ESUVEX1JVTEUsIE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIHNlc3Npb24pOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKHNlc3Npb24pOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAobG9vcCwgcHJpdmNvbm4pOworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAocHJpdmNvbm4sIGZpbHRlcl9wcml2YXRlX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdmF0ZV9jb25uX2xvc3QpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKHByaXZjb25uKTsKKworICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoVFJVRSk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoVFJVRSk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoRkFMU0UpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgb3Blbl9zaHV0ZG93bl9wcml2YXRlX2Nvbm5lY3Rpb24gKEZBTFNFKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLmMgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE5OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLmMKQEAgLTAsMCArMSwxMjMgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICIuLi90ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICBleGl0ICgxKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFNlcnZpY2VEYXRhIFRlc3RTZXJ2aWNlRGF0YTsKKworc3RydWN0IFRlc3RTZXJ2aWNlRGF0YQoreworICBEQnVzTG9vcCAqbG9vcDsKKyAgY2hhciAqcHJpdmF0ZV9hZGRyOworfTsKKworc3RhdGljIHZvaWQKK25ld19jb25uZWN0aW9uX2NhbGxiYWNrIChEQnVzU2VydmVyICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpuZXdfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgVGVzdFNlcnZpY2VEYXRhICp0ZXN0ZGF0YSA9IGRhdGE7CisKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKHRlc3RkYXRhLT5sb29wLCBuZXdfY29ubmVjdGlvbikpCisgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChuZXdfY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdCAKK2ZpbHRlcl9zZXNzaW9uX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBUZXN0U2VydmljZURhdGEgKnRlc3RkYXRhID0gdXNlcl9kYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRQcml2YXRlQWRkcmVzcyIpKQorICAgIHsKKyAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgICAgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksIERCVVNfVFlQRV9TVFJJTkcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJih0ZXN0ZGF0YS0+cHJpdmF0ZV9hZGRyKSwgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCk7CisgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1aXQiKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzZXJ2ZXIgZXhpdGluZyBsb29wXG4iKTsKKyAgICAgIF9kYnVzX2xvb3BfcXVpdCAodGVzdGRhdGEtPmxvb3ApOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNDb25uZWN0aW9uICpzZXNzaW9uOworICBUZXN0U2VydmljZURhdGEgKnRlc3RkYXRhOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisKKyAgdGVzdGRhdGEgPSBkYnVzX25ldyAoVGVzdFNlcnZpY2VEYXRhLCAxKTsKKyAgdGVzdGRhdGEtPmxvb3AgPSBsb29wOworCisgIHNlc3Npb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisgIGlmICghc2Vzc2lvbikKKyAgICBkaWUgKCJjb3VsZG4ndCBhY2Nlc3Mgc2Vzc2lvbiBidXMiKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGxvb3AsIHNlc3Npb24pOworCisgIGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoc2Vzc2lvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyIiwgMCwgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIGRpZSAoImNvdWxkbid0IHJlcXVlc3QgbmFtZTogJXMiLCBlcnJvci5tZXNzYWdlKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXNzaW9uLCBmaWx0ZXJfc2Vzc2lvbl9tZXNzYWdlLCB0ZXN0ZGF0YSwgTlVMTCkpCisgICAgZGllICgiY291bGRuJ3QgYWRkIGZpbHRlciIpOworCisjaWZkZWYgREJVU19DTUFLRQorICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKFRFU1RfTElTVEVOLCAmZXJyb3IpOworI2Vsc2UKKyAgc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuICgidW5peDp0bXBkaXI9L3RtcCIsICZlcnJvcik7CisjZW5kaWYKKyAgaWYgKCFzZXJ2ZXIpCisgICAgZGllIChlcnJvci5tZXNzYWdlKTsKKyAgdGVzdGRhdGEtPnByaXZhdGVfYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChzZXJ2ZXIpOworICBwcmludGYgKCJ0ZXN0IHNlcnZlciBsaXN0ZW5pbmcgb24gJXNcbiIsIHRlc3RkYXRhLT5wcml2YXRlX2FkZHIpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoc2VydmVyLCBuZXdfY29ubmVjdGlvbl9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZGF0YSwgTlVMTCk7CisKKyAgaWYgKCF0ZXN0X3NlcnZlcl9zZXR1cCAobG9vcCwgc2VydmVyKSkKKyAgICBkaWUgKCJzZXJ2ZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAic2VydmVyIHJ1bm5pbmcgbWFpbmxvb3BcbiIpOworICBfZGJ1c19sb29wX3J1biAobG9vcCk7CisgIGZwcmludGYgKHN0ZGVyciwgInNlcnZlciBtYWlubG9vcCBxdWl0XG4iKTsKKworICB0ZXN0X3NlcnZlcl9zaHV0ZG93biAobG9vcCwgc2VydmVyKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIHNlc3Npb24pOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoc2Vzc2lvbik7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisKKyAgZGJ1c19mcmVlICh0ZXN0ZGF0YSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LXNodXRkb3duLmMgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LXNodXRkb3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2YzFjYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtc2h1dGRvd24uYwpAQCAtMCwwICsxLDY4IEBACisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICIuLi90ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIHRlc3Qtc2h1dGRvd246ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorb3Blbl9kZXN0cm95X3NoYXJlZF9zZXNzaW9uX2J1c19jb25uZWN0aW9uICh2b2lkKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBjaGFyICpzZXNzaW9uX2FkZHJfbm9fZ3VpZDsKKyAgY2hhciAqY29tbWE7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgc2Vzc2lvbl9hZGRyX25vX2d1aWQgPSBzdHJkdXAgKGdldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIpKTsKKyAgY29tbWEgPSBzdHJjaHIgKHNlc3Npb25fYWRkcl9ub19ndWlkLCAnLCcpOworICBpZiAoY29tbWEgPT0gTlVMTCkKKyAgICBkaWUgKCJDb3VsZG4ndCBmaW5kIEdVSUQgaW4gc2Vzc2lvbiBidXMgYWRkcmVzcyIpOworICAqY29tbWEgPSAnXDAnOworICAgIAorICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKHNlc3Npb25fYWRkcl9ub19ndWlkLCAmZXJyb3IpOworICBmcmVlIChzZXNzaW9uX2FkZHJfbm9fZ3VpZCk7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgZGllICgiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byB0ZW1wIHNlc3Npb24gYnVzXG4iKTsKKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAobG9vcCwgY29ubmVjdGlvbik7CisgCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7IAorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIG9wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAoKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIG9wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAoKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIG9wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAoKTsKKworICBkYnVzX3NodXRkb3duICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIqKiogVGVzdCBzaHV0ZG93biBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC9uYW1lLXRlc3QvdGVzdC10aHJlYWRzLWluaXQuYyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyMjg1MgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmMKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogVGVzdCB0byBtYWtlIHN1cmUgbGF0ZSB0aHJlYWQgaW5pdGlhbGl6YXRpb24gd29ya3MKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg+CisKK3N0YXRpYyB2b2lkCitfcnVuX2l0ZXJhdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4pCit7CisgIERCdXNQZW5kaW5nQ2FsbCAqZWNob19wZW5kaW5nOworICBEQnVzUGVuZGluZ0NhbGwgKmRidXNfcGVuZGluZzsKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICplY2hvID0gImVjaG8iOworCisgIC8qIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpOworCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmVjaG9fcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisgIAorICAvKiBzZW5kIHRoZSBzZWNvbmQgbWVzc2FnZSAqLworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmRidXNfcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgLyogYmxvY2sgb24gdGhlIHNlY29uZCBtZXNzYWdlIChzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5KSAqLworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoZGJ1c19wZW5kaW5nKTsKKworICAvKiBibG9jayBvbiB0aGUgZmlyc3QgbWVzc2FnZSAqLworICAvKiBpZiBpdCBkb2VzIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkgY2hhbmNlcyAKKyAgICAgYXJlIHdlIGhpdCB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKGVjaG9fcGVuZGluZyk7CisKKyAgLyogY2hlY2sgdGhlIHJlcGx5IG9ubHkgdG8gbWFrZSBzdXJlIHdlCisgICAgIGFyZSBub3QgZ2V0dGluZyBlcnJvcnMgdW5yZWxhdGVkCisgICAgIHRvIHRoZSBibG9jayBpbiBwb2xsIGJ1ZyAqLworICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChlY2hvX3BlbmRpbmcpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkZhaWxlZDogUmVwbHkgaXMgTlVMTCAqKipcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBwcmludGYgKCJGYWlsZWQ6IFJlcGx5IGlzIGVycm9yOiAlcyAqKipcbiIsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAocmVwbHkpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0gCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChkYnVzX3BlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAoZWNob19wZW5kaW5nKTsKKyAgCit9CitzdGF0aWMgdm9pZAorY2hlY2tfbXV0ZXhfbG9jayAoREJ1c011dGV4ICptdXRleDEsIAorICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICptdXRleDIsIAorICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfc2FtZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChtdXRleDEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobXV0ZXgyICE9IE5VTEwpOworICAKKyAgaWYgKGlzX3NhbWUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChtdXRleDEgPT0gbXV0ZXgyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKG11dGV4MSAhPSBtdXRleDIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2NvbmR2YXJfbG9jayAoREJ1c0NvbmRWYXIgKmNvbmR2YXIxLCAgCisgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICpjb25kdmFyMiwgICAKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfc2FtZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChjb25kdmFyMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25kdmFyMiAhPSBOVUxMKTsKKworICBpZiAoaXNfc2FtZSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvbmR2YXIxID09IGNvbmR2YXIyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvbmR2YXIxICE9IGNvbmR2YXIyKTsKKyAgICB9Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTXV0ZXggKm11dGV4MSwgKmRpc3BhdGNoX211dGV4MSwgKmlvX3BhdGhfbXV0ZXgxOworICBEQnVzQ29uZFZhciAqZGlzcGF0Y2hfY29uZDEsICppb19wYXRoX2NvbmQxOworICBEQnVzTXV0ZXggKm11dGV4MiwgKmRpc3BhdGNoX211dGV4MiwgKmlvX3BhdGhfbXV0ZXgyOworICBEQnVzQ29uZFZhciAqZGlzcGF0Y2hfY29uZDIsICppb19wYXRoX2NvbmQyOworCisgIHByaW50ZiAoIioqKiBUZXN0aW5nIGxhdGUgdGhyZWFkIGluaXRcbiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgKGNvbm4sICZtdXRleDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfY29uZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX2NvbmQxKTsKKyAgX3J1bl9pdGVyYXRpb24gKGNvbm4pOworICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChjb25uLCAmbXV0ZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9tdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9jb25kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfY29uZDIpOworCisgIGNoZWNrX211dGV4X2xvY2sgKG11dGV4MSwgbXV0ZXgyLCBUUlVFKTsKKyAgY2hlY2tfbXV0ZXhfbG9jayAoZGlzcGF0Y2hfbXV0ZXgxLCBkaXNwYXRjaF9tdXRleDIsIFRSVUUpOworICBjaGVja19tdXRleF9sb2NrIChpb19wYXRoX211dGV4MSwgaW9fcGF0aF9tdXRleDIsIFRSVUUpOworICBjaGVja19jb25kdmFyX2xvY2sgKGRpc3BhdGNoX2NvbmQxLCBkaXNwYXRjaF9jb25kMiwgVFJVRSk7CisgIGNoZWNrX2NvbmR2YXJfbG9jayAoaW9fcGF0aF9jb25kMSwgaW9fcGF0aF9jb25kMiwgVFJVRSk7CisKKyAgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAoKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChjb25uLCAmbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9tdXRleDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9jb25kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfY29uZDEpOworCisgIGNoZWNrX211dGV4X2xvY2sgKG11dGV4MSwgbXV0ZXgyLCBGQUxTRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGRpc3BhdGNoX211dGV4MSwgZGlzcGF0Y2hfbXV0ZXgyLCBGQUxTRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGlvX3BhdGhfbXV0ZXgxLCBpb19wYXRoX211dGV4MiwgRkFMU0UpOworICBjaGVja19jb25kdmFyX2xvY2sgKGRpc3BhdGNoX2NvbmQxLCBkaXNwYXRjaF9jb25kMiwgRkFMU0UpOworICBjaGVja19jb25kdmFyX2xvY2sgKGlvX3BhdGhfY29uZDEsIGlvX3BhdGhfY29uZDIsIEZBTFNFKTsKKworICBfcnVuX2l0ZXJhdGlvbiAoY29ubik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgKGNvbm4sICZtdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9tdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX211dGV4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX2NvbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9jb25kMik7CisKKyAgY2hlY2tfbXV0ZXhfbG9jayAobXV0ZXgxLCBtdXRleDIsIFRSVUUpOworICBjaGVja19tdXRleF9sb2NrIChkaXNwYXRjaF9tdXRleDEsIGRpc3BhdGNoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGlvX3BhdGhfbXV0ZXgxLCBpb19wYXRoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX2NvbmR2YXJfbG9jayAoZGlzcGF0Y2hfY29uZDEsIGRpc3BhdGNoX2NvbmQyLCBUUlVFKTsKKyAgY2hlY2tfY29uZHZhcl9sb2NrIChpb19wYXRoX2NvbmQxLCBpb19wYXRoX2NvbmQyLCBUUlVFKTsKKworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdCIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubiwgbWV0aG9kLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworCisgIHByaW50ZiAoIlN1Y2Nlc3MgKioqXG4iKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LXdhaXQtZm9yLWVjaG8ucHkgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90ZXN0LXdhaXQtZm9yLWVjaG8ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQwOWU0NQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtd2FpdC1mb3ItZWNoby5weQpAQCAtMCwwICsxLDQxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zLHN5cworCit0cnk6CisgICAgaW1wb3J0IGdvYmplY3QKKyAgICBpbXBvcnQgZGJ1cworICAgIGltcG9ydCBkYnVzLm1haW5sb29wLmdsaWIKK2V4Y2VwdDoKKyAgICBwcmludCAiRmFpbGVkIGltcG9ydCwgYWJvcnRpbmcgdGVzdCIKKyAgICBzeXMuZXhpdCgwKQorCitkYnVzLm1haW5sb29wLmdsaWIuREJ1c0dNYWluTG9vcChzZXRfYXNfZGVmYXVsdD1UcnVlKQorbG9vcCA9IGdvYmplY3QuTWFpbkxvb3AoKQorCitleGl0Y29kZSA9IDAKKworZGVmIGhhbmRsZV9ub3JlY2VpcHQoKToKKyAgICBwcmludCAiRmFpbGVkIHRvIGdldCBzaWduYWwiCisgICAgZ2xvYmFsIGV4aXRjb2RlCisgICAgZXhpdGNvZGUgPSAxCisgICAgbG9vcC5xdWl0KCkKKworZ29iamVjdC50aW1lb3V0X2FkZCg3MDAwLCBoYW5kbGVfbm9yZWNlaXB0KQorCitidXMgPSBkYnVzLlNlc3Npb25CdXMoKQorCitkZWYgc2lnaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgorICAgIHByaW50ICJnb3Qgc2lnbmFsIgorICAgIGxvb3AucXVpdCgpICAgCisKK2J1cy5hZGRfc2lnbmFsX3JlY2VpdmVyKHNpZ2hhbmRsZXIsIGRidXNfaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlJywgc2lnbmFsX25hbWU9J0ZvbycpCisKK28gPSBidXMuZ2V0X29iamVjdCgnb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UnLCAnL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUnKQoraSA9IGRidXMuSW50ZXJmYWNlKG8sICdvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlJykKK2RlZiBudWxsaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgorICAgIHBhc3MKK2kuRW1pdEZvbyhyZXBseV9oYW5kbGVyPW51bGxoYW5kbGVyLCBlcnJvcl9oYW5kbGVyPW51bGxoYW5kbGVyKQorCitsb29wLnJ1bigpCitzeXMuZXhpdChleGl0Y29kZSkKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvbmFtZS10ZXN0L3RtcC1zZXNzaW9uLWxpa2Utc3lzdGVtLmNvbmYgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90bXAtc2Vzc2lvbi1saWtlLXN5c3RlbS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YWIxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L25hbWUtdGVzdC90bXAtc2Vzc2lvbi1saWtlLXN5c3RlbS5jb25mCkBAIC0wLDAgKzEsOTEgQEAKKzwhLS0gVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgY29udHJvbHMgdGhlIHBlci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMuCisgICAgIEFkZCBhIHNlc3Npb24tbG9jYWwuY29uZiBhbmQgZWRpdCB0aGF0IHJhdGhlciB0aGFuIGNoYW5naW5nIHRoaXMgCisgICAgIGZpbGUgZGlyZWN0bHkuIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKworICA8IS0tIElmIHdlIGZvcmssIGtlZXAgdGhlIHVzZXIncyBvcmlnaW5hbCB1bWFzayB0byBhdm9pZCBhZmZlY3RpbmcKKyAgICAgICB0aGUgYmVoYXZpb3Igb2YgY2hpbGQgcHJvY2Vzc2VzLiAtLT4KKyAgPGtlZXBfdW1hc2svPgorCisgIDxzeXNsb2cvPgorCisgIDxsaXN0ZW4+dW5peDp0bXBkaXI9L3RtcDwvbGlzdGVuPgorCisgIDxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIC8+CisKKyAgPCEtLSBpbnRlbmRlZCB0byBtYXRjaCBzeXN0ZW0gYnVzIC0tPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsIHVzZXJzIGNhbiBjb25uZWN0IHRvIHN5c3RlbSBidXMgLS0+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKworICAgIDwhLS0gSG9sZXMgbXVzdCBiZSBwdW5jaGVkIGluIHNlcnZpY2UgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IKKyAgICAgICAgIG5hbWUgb3duZXJzaGlwIGFuZCBzZW5kaW5nIG1ldGhvZCBjYWxscyAtLT4KKyAgICA8ZGVueSBvd249IioiLz4KKyAgICA8ZGVueSBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisKKyAgICA8IS0tIFNpZ25hbHMgYW5kIHJlcGx5IG1lc3NhZ2VzIChtZXRob2QgcmV0dXJucywgZXJyb3JzKSBhcmUgYWxsb3dlZAorICAgICAgICAgYnkgZGVmYXVsdCAtLT4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJzaWduYWwiLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgc2VuZF90eXBlPSJlcnJvciIvPgorCisgICAgPCEtLSBBbGwgbWVzc2FnZXMgbWF5IGJlIHJlY2VpdmVkIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0iZXJyb3IiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV90eXBlPSJzaWduYWwiLz4KKworICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIHRhbGsgdG8gdGhlIG1lc3NhZ2UgYnVzIC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIvPgorICAgIDwhLS0gQnV0IGRpc2FsbG93IHNvbWUgc3BlY2lmaWMgYnVzIHNlcnZpY2VzIC0tPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX21lbWJlcj0iVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50Ii8+CisKKyAgICA8IS0tIFNwZWNpZmljIHRvIHRoZSB0ZXN0IHN1aXRlIC0tPgorICAgIDxhbGxvdyBvd249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIi8+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUiLz4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiCisgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIgorICAgICAgICAgICBzZW5kX21lbWJlcj0iRW1pdEZvbyIvPgorICA8L3BvbGljeT4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgICA8YWxsb3cgb3duPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIvPgorICAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiCisgICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUiLz4KKyAgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiCisgICAgICAgICAgICBzZW5kX21lbWJlcj0iRW1pdEZvbyIvPgorICA8L3BvbGljeT4KKworICA8IS0tIEZvciB0aGUgc2Vzc2lvbiBidXMsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlbGF0aXZlbHktbG93IGxpbWl0cyAKKyAgICAgICB3aXRoIGVzc2VudGlhbGx5IGluZmluaXRlIGxpbWl0cywgc2luY2UgdGhlIGJ1cyBpcyBqdXN0IHJ1bm5pbmcgCisgICAgICAgYXMgdGhlIHVzZXIgYW55d2F5LCB1c2luZyB1cCBidXMgcmVzb3VyY2VzIGlzIG5vdCBzb21ldGhpbmcgd2UgbmVlZCAKKyAgICAgICB0byB3b3JyeSBhYm91dC4gSW4gc29tZSBjYXNlcywgd2UgZG8gc2V0IHRoZSBsaW1pdHMgbG93ZXIgdGhhbiAKKyAgICAgICAiYWxsIGF2YWlsYWJsZSBtZW1vcnkiIGlmIGV4Y2VlZGluZyB0aGUgbGltaXQgaXMgYWxtb3N0IGNlcnRhaW5seSBhIGJ1ZywgCisgICAgICAgaGF2aW5nIHRoZSBidXMgZW5mb3JjZSBhIGxpbWl0IGlzIG5pY2VyIHRoYW4gYSBodWdlIG1lbW9yeSBsZWFrLiBCdXQgdGhlIAorICAgICAgIGludGVudCBpcyB0aGF0IHRoZXNlIGxpbWl0cyBzaG91bGQgbmV2ZXIgYmUgaGl0LiAtLT4KKworICA8IS0tIHRoZSBtZW1vcnkgbGltaXRzIGFyZSAxRyBpbnN0ZWFkIG9mIHNheSA0RyBiZWNhdXNlIHRoZXkgY2FuJ3QgZXhjZWVkIDMyLWJpdCBzaWduZWQgaW50IG1heCAtLT4KKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+MTAwMDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MTAwMDAwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiPjEyMDAwMDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+MjQwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMiPjEwMDAwMDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj4xMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjEwMDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+MTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iPjUwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJyZXBseV90aW1lb3V0Ij4zMDAwMDA8L2xpbWl0PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3Qvc2hlbGwtdGVzdC5jIGIvZGJ1cy0xLjQuMTAvdGVzdC9zaGVsbC10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3OWE5YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3Qvc2hlbGwtdGVzdC5jCkBAIC0wLDAgKzEsMTA5IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgREJVU19DT01QSUxBVElPTgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2hlbGwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2NvbW1hbmRfbGluZSAoY29uc3QgY2hhciAqYXJnMSwgLi4uKQoreworICBpbnQgaSwgb3JpZ2luYWxfYXJnYywgc2hlbGxfYXJnYzsKKyAgY2hhciAqKnNoZWxsX2FyZ3Y7CisgIGNoYXIgKipvcmlnaW5hbF9hcmd2OworICBjaGFyICpjb21tYW5kX2xpbmUsICp0bXA7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzTGlzdCAqbGlzdCA9IE5VTEwsICpub2RlOworICB2YV9saXN0IHZhcl9hcmdzOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgdmFfc3RhcnQgKHZhcl9hcmdzLCBhcmcxKTsKKyAgX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0LCAoY2hhciAqKWFyZzEpOworICBkbworICAgIHsKKyAgICAgIHRtcCA9IHZhX2FyZyAodmFyX2FyZ3MsIGNoYXIgKik7CisgICAgICBpZiAoIXRtcCkKKyAgICAgICAgYnJlYWs7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QsIHRtcCk7CisgICAgfSB3aGlsZSAodG1wKTsKKyAgdmFfZW5kICh2YXJfYXJncyk7CisKKyAgb3JpZ2luYWxfYXJnYyA9IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QpOworICBvcmlnaW5hbF9hcmd2ID0gZGJ1c19uZXcgKGNoYXIgKiwgb3JpZ2luYWxfYXJnYyk7CisgIF9kYnVzX3N0cmluZ19pbml0ICgmc3RyKTsKKyAgZm9yIChpID0gMCwgbm9kZSA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0KTsgaSA8IG9yaWdpbmFsX2FyZ2MgJiYgbm9kZTsKKyAgICAgICBpKyssIG5vZGUgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0LCBub2RlKSkKKyAgICB7CisgICAgICBvcmlnaW5hbF9hcmd2W2ldID0gbm9kZS0+ZGF0YTsKKyAgICAgIGlmIChpID4gMCkKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnICcpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgb3JpZ2luYWxfYXJndltpXSk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QpOworICBjb21tYW5kX2xpbmUgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpOworICBwcmludGYgKCJcblxuVGVzdGluZyBjb21tYW5kIGxpbmUgJyVzJ1xuIiwgY29tbWFuZF9saW5lKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGlmICghX2RidXNfc2hlbGxfcGFyc2VfYXJndiAoY29tbWFuZF9saW5lLCAmc2hlbGxfYXJnYywgJnNoZWxsX2FyZ3YsICZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgcGFyc2luZyBjb21tYW5kIGxpbmU6ICVzXG4iLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICIiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc2hlbGxfYXJnYyAhPSBvcmlnaW5hbF9hcmdjKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiTnVtYmVyIG9mIGFyZ3VtZW50cyByZXR1cm5lZCAoJWQpIGRvbid0IG1hdGNoIG9yaWdpbmFsICglZClcbiIsCisgICAgICAgICAgICAgICAgICBzaGVsbF9hcmdjLCBvcmlnaW5hbF9hcmdjKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0gCisgICAgICBwcmludGYgKCJOdW1iZXIgb2YgYXJndW1lbnRzOiAlZFxuIiwgc2hlbGxfYXJnYyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2hlbGxfYXJnYzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqdW5xdW90ZWQ7CisgICAgICAgICAgCisgICAgICAgICAgdW5xdW90ZWQgPSBfZGJ1c19zaGVsbF91bnF1b3RlIChvcmlnaW5hbF9hcmd2W2ldKTsKKyAgICAgICAgICBpZiAoc3RyY21wICh1bnF1b3RlZCA/IHVucXVvdGVkIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgc2hlbGxfYXJndltpXSA/IHNoZWxsX2FyZ3ZbaV0gOiAiIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIlBvc2l0aW9uICVkLCByZXR1cm5lZCBhcmd1bWVudCAoJXMpIGRvZXMgbm90IG1hdGNoIG9yaWdpbmFsICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaSwgc2hlbGxfYXJndltpXSwgdW5xdW90ZWQpOworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIGRidXNfZnJlZSAodW5xdW90ZWQpOworICAgICAgICAgIGlmIChzaGVsbF9hcmd2W2ldKQorICAgICAgICAgICAgcHJpbnRmICgiQXJndW1lbnQgJWQgPSAlc1xuIiwgaSwgc2hlbGxfYXJndltpXSk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2hlbGxfYXJndik7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpZiAoIXRlc3RfY29tbWFuZF9saW5lICgiY29tbWFuZCIsICItcyIsICItLWZvcmNlLXNodXRkb3duIiwgIlwiYSBzdHJpbmdcIiIsICIxMjMiLCBOVUxMKQorICAgICAgfHwgIXRlc3RfY29tbWFuZF9saW5lICgiY29tbWFuZCIsICItcyIsIE5VTEwpCisgICAgICB8fCAhdGVzdF9jb21tYW5kX2xpbmUgKCIvb3B0L2dub21lL2Jpbi9zZXJ2aWNlLXN0YXJ0IiwgTlVMTCkKKyAgICAgIHx8ICF0ZXN0X2NvbW1hbmRfbGluZSAoImdyZXAiLCAiLWwiLCAiLXIiLCAiLWkiLCAiJ3doYXRldmVyJyIsICJmaWxlcyouYyIsIE5VTEwpCisgICAgICB8fCAhdGVzdF9jb21tYW5kX2xpbmUgKCIvaG9tZS9ib3N0b24vam9obnAvZGV2ZWwtbG9jYWwvZGJ1cy90ZXN0L3Rlc3Qtc2VnZmF1bHQiLCBOVUxMKQorICAgICAgfHwgIXRlc3RfY29tbWFuZF9saW5lICgibHMiLCAiLWwiLCAiLWEiLCAiLS1jb2xvcnMiLCBfZGJ1c19nZXRfdG1wZGlyKCksIE5VTEwpCisgICAgICB8fCAhdGVzdF9jb21tYW5kX2xpbmUgKCJyc3luYy10by1zZXJ2ZXIiLCBOVUxMKQorICAgICAgfHwgIXRlc3RfY29tbWFuZF9saW5lICgidGVzdC1zZWdmYXVsdCIsICItLW5vLXNlZ2ZhdWx0IiwgTlVMTCkKKyAgICAgIHx8ICF0ZXN0X2NvbW1hbmRfbGluZSAoImV2b2x1dGlvbiIsICJtYWlsdG86cGVwZUBjdWNvLmNvbSIsIE5VTEwpCisgICAgICB8fCAhdGVzdF9jb21tYW5kX2xpbmUgKCJydW4iLCAiXCJhIFxuIG11bHRpbGluZVwiIiwgTlVMTCkKKyAgICAgIHx8IHRlc3RfY29tbWFuZF9saW5lICgibHMiLCAiXCJhIHdyb25nIHN0cmluZyciLCBOVUxMKSAvKiBpbnZhbGlkIGNvbW1hbmQgbGluZSAqLyApCisgICAgcmV0dXJuIC0xOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L3NwYXduLXRlc3QuYyBiL2RidXMtMS40LjEwL3Rlc3Qvc3Bhd24tdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTU1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L3NwYXduLXRlc3QuYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNkZWZpbmUgREJVU19DT01QSUxBVElPTiAvKiBjaGVhdCBhbmQgdXNlIGRidXMtc3lzZGVwcyAqLworI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNwYXduLmg+CisjdW5kZWYgREJVU19DT01QSUxBVElPTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCitzZXR1cF9mdW5jICh2b2lkICpkYXRhKQoreworICBwcmludGYgKCJlbnRlcmluZyBzZXR1cCBmdW5jLlxuIik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjaGFyICoqYXJndl9jb3B5OworICBpbnQgaTsKKyAgREJ1c0Vycm9yIGVycm9yOworICAKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIllvdSBuZWVkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRvIGxhdW5jaC5cbiIpOworCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGFyZ3ZfY29weSA9IGRidXNfbmV3IChjaGFyICosIGFyZ2MpOworICBmb3IgKGkgPSAwOyBpIDwgYXJnYyAtIDE7IGkrKykKKyAgICBhcmd2X2NvcHkgW2ldID0gYXJndltpICsgMV07CisgIGFyZ3ZfY29weVthcmdjIC0gMV0gPSBOVUxMOworICAKKyAgaWYgKCFfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKE5VTEwsIGFyZ3ZfY29weSwgTlVMTCwgc2V0dXBfZnVuYywgTlVMTCwgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgbGF1bmNoIGFwcGxpY2F0aW9uOiBcIiVzXCJcbiIsCisJICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgIH0KKworICBkYnVzX2ZyZWUoYXJndl9jb3B5KTsKKyAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L3Rlc3QtZXhpdC5jIGIvZGJ1cy0xLjQuMTAvdGVzdC90ZXN0LWV4aXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM1ODE4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC90ZXN0LWV4aXQuYwpAQCAtMCwwICsxLDcgQEAKKy8qIFRoaXMgaXMgYSBwcm9jZXNzIHRoYXQganVzdCBleGl0cyB3aXRoIGEgZmFpbHVyZSBjb2RlICovCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvdGVzdC1uYW1lcy5jIGIvZGJ1cy0xLjQuMTAvdGVzdC90ZXN0LW5hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczNjYzNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvdGVzdC1uYW1lcy5jCkBAIC0wLDAgKzEsNzggQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIHRlc3QtbmFtZXM6ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorVGVzdE5hbWUoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGNvbnN0IGNoYXIgKm5hbWUsIGludCBleHBlY3RlZFN1Y2Nlc3MpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgICh2b2lkKSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGNvbm5lY3Rpb24sIG5hbWUsIDAsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBpZiAoZXhwZWN0ZWRTdWNjZXNzKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBhY3F1aXJpbmcgbmFtZSAnJXMnOiAlc1xuIiwgbmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYgKHN0ZG91dCwgIkV4cGVjdGVkIEVycm9yIGFjcXVpcmluZyBuYW1lICclcyc6ICVzXG4iLCBuYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogRmFpbGVkIHRvIGFjcXVpcmUgbmFtZSAnJXMnOiAlc1xuIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgaWYgKGV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIGlmICghZXhwZWN0ZWRTdWNjZXNzKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmV4cGVjdGVkIFN1Y2Nlc3MgYWNxdWlyaW5nIG5hbWUgJyVzJ1xuIiwgbmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYgKHN0ZG91dCwgIlN1Y2Nlc3NmdWxseSBhY3F1aXJlZCBuYW1lICclcydcbiIsIG5hbWUpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBNYW5hZ2VkIHRvIGFjcXVpcmUgbmFtZSAnJXMnXG4iLCBuYW1lKTsKKyAgICAgIGlmICghZXhwZWN0ZWRTdWNjZXNzKQorICAgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK2ludAorbWFpbiAoaW50ICAgIGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBzeXN0ZW0gYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgaWYgKGxvb3AgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3QiLCBUUlVFKTsKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3QtMiIsIFRSVUUpOworICBUZXN0TmFtZShjb25uZWN0aW9uLCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdF8yIiwgVFJVRSk7CisjaWYgMAorICBUZXN0TmFtZShjb25uZWN0aW9uLCAiVGVzdF8yIiwgVFJVRSk7CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBuYW1lIGV4aXRpbmdcbiIpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L3Rlc3Qtc2VnZmF1bHQuYyBiL2RidXMtMS40LjEwL3Rlc3QvdGVzdC1zZWdmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOWEyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L3Rlc3Qtc2VnZmF1bHQuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGlzIGlzIHNpbXBseSBhIHByb2Nlc3MgdGhhdCBzZWdmYXVsdHMgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBIQVZFX1NJR05BTF9ICisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0VUUkxJTUlUCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGNoYXIgKnA7ICAKKworI2lmIEhBVkVfU0VUUkxJTUlUCisgIHN0cnVjdCBybGltaXQgciA9IHsgMCwgfTsKKyAgCisgIGdldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZyKTsKKyAgci5ybGltX2N1ciA9IDA7CisgIHNldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZyKTsKKyAgCisgIHJhaXNlIChTSUdTRUdWKTsKKyNlbmRpZgorICBwID0gTlVMTDsKKyAgKnAgPSAnYSc7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvdGVzdC1zZXJ2aWNlLmMgYi9kYnVzLTEuNC4xMC90ZXN0L3Rlc3Qtc2VydmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjdlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L3Rlc3Qtc2VydmljZS5jCkBAIC0wLDAgKzEsNDk4IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhbHJlYWR5X3F1aXQgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoZWxsb19mcm9tX3NlbGZfcmVwbHlfcmVjZWl2ZWQgPSBGQUxTRTsKKworc3RhdGljIHZvaWQKK3F1aXQgKHZvaWQpCit7CisgIGlmICghYWxyZWFkeV9xdWl0KQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBhbHJlYWR5X3F1aXQgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIHRlc3Qtc2VydmljZTogJXMiLCBtZXNzYWdlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19oZWxsb19mcm9tX3NlbGZfcmVwbHkgKERCdXNQZW5kaW5nQ2FsbCAqcGNhbGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c01lc3NhZ2UgKmVjaG9fbWVzc2FnZSwgKmVjaG9fcmVwbHkgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAKKyAgaW50IHR5cGU7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgCisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NUQVJURVIsICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gYWN0aXZhdGluZyBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGRpZSgibm8gbWVtb3J5Iik7CisgICAgfQorCisgIAorICBlY2hvX21lc3NhZ2UgPSAoREJ1c01lc3NhZ2UgKil1c2VyX2RhdGE7CisgICAgCisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBjYWxsKTsKKyAgICAKKyAgdHlwZSA9IGRidXNfbWVzc2FnZV9nZXRfdHlwZSAocmVwbHkpOworICAgIAorICBpZiAodHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBwcmludGYgKCJSZXBseSBmcm9tIEhlbGxvRnJvbVNlbGYgcmVjZWl2ZWRcbiIpOworICAgICAKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChlY2hvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgICAgZWNob19yZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKGVjaG9fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICAgIGlmIChlY2hvX3JlcGx5ID09IE5VTEwpCisgICAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgICAgfSAKKyAgICAgIGVsc2UKKyAgICAgICAgeyAgCisgICAgICAgICAgZWNob19yZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAoZWNob19tZXNzYWdlKTsKKyAgICAgICAgICBpZiAoZWNob19yZXBseSA9PSBOVUxMKQorICAgICAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKGVjaG9fcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgZWNob19yZXBseSwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgICAgICAKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoZWNob19yZXBseSk7CisgICAgfQorICBlbHNlIGlmICh0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCByZXBseSk7CisgICAgICBwcmludGYgKCJFcnJvciB0eXBlIGluIHJlcGx5OiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgIGlmIChzdHJjbXAgKGVycm9yLm5hbWUsIERCVVNfRVJST1JfTk9fTUVNT1JZKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBlY2hvX3JlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAoZWNob19yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICAgIGlmIChlY2hvX3JlcGx5ID09IE5VTEwpCisgICAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIGVjaG9fcmVwbHksIE5VTEwpKQorICAgICAgICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGVjaG9fcmVwbHkpOworICAgICAgICB9CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZFxuIik7CisKKyAgaGVsbG9fZnJvbV9zZWxmX3JlcGx5X3JlY2VpdmVkID0gVFJVRTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGVjaG9fbWVzc2FnZSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwY2FsbCk7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX3J1bl9oZWxsb19mcm9tX3NlbGYgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNNZXNzYWdlICpyZXBseSwgKnNlbGZfbWVzc2FnZTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwY2FsbDsKKyAgY2hhciAqczsKKworICBfZGJ1c192ZXJib3NlICgic2VuZGluZyByZXBseSB0byBFY2hvIG1ldGhvZFxuIik7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorICAgIHByaW50ZiAoIlNlbmRpbmcgSGVsbG9Gcm9tU2VsZlxuIik7CisKKyBfZGJ1c192ZXJib3NlICgiKioqIFNlbmRpbmcgbWVzc2FnZSB0byBzZWxmXG4iKTsKKyBzZWxmX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsb0Zyb21TZWxmIik7CisgIAorICBpZiAoc2VsZl9tZXNzYWdlID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm5lY3Rpb24sIHNlbGZfbWVzc2FnZSwgJnBjYWxsLCAtMSkpCisgICAgZGllKCJObyBtZW1vcnkiKTsKKyAgCisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworICBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjYWxsLCBjaGVja19oZWxsb19mcm9tX3NlbGZfcmVwbHksICh2b2lkICopbWVzc2FnZSwgTlVMTCkpCisgICAgZGllKCJObyBtZW1vcnkiKTsKKyAgICAKKyAgcHJpbnRmICgiU2VudCBIZWxsb0Zyb21TZWxmXG4iKTsKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitoYW5kbGVfZWNobyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGNoYXIgKnM7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRWNobyBtZXRob2RcbiIpOworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGZwcmludGYgKHN0ZGVyciwgIkVjaG8gc2VydmljZSBlY2hvZWQgc3RyaW5nOiBcIiVzXCJcbiIsIHMpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX2RlbGF5X2VjaG8gKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICpzOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzbGVlcGluZyBmb3IgYSBzaG9ydCB0aW1lXG4iKTsKKworICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKDUwKTsKKworICBfZGJ1c192ZXJib3NlICgic2VuZGluZyByZXBseSB0byBEZWxheUVjaG8gbWV0aG9kXG4iKTsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBmcHJpbnRmIChzdGRlcnIsICJEZWxheUVjaG8gc2VydmljZSBlY2hvZWQgc3RyaW5nOiBcIiVzXCJcbiIsIHMpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIHZvaWQKK3BhdGhfdW5yZWdpc3RlcmVkX2Z1bmMgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICAvKiBjb25uZWN0aW9uIHdhcyBmaW5hbGl6ZWQgKi8KK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitwYXRoX21lc3NhZ2VfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpKQorICAgIHJldHVybiBoYW5kbGVfZWNobyAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlbGF5RWNobyIpKQorICAgIHJldHVybiBoYW5kbGVfZGVsYXlfZWNobyAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXRGb28iKSkKKyAgICB7CisgICAgICAvKiBFbWl0IHRoZSBGb28gc2lnbmFsICovCisgICAgICBEQnVzTWVzc2FnZSAqc2lnbmFsOworICAgICAgZG91YmxlIHZfRE9VQkxFOworCisgICAgICBfZGJ1c192ZXJib3NlICgiZW1pdHRpbmcgc2lnbmFsIEZvb1xuIik7CisgICAgICAKKyAgICAgIHNpZ25hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vIik7CisgICAgICBpZiAoc2lnbmFsID09IE5VTEwpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIHZfRE9VQkxFID0gNDIuNjsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChzaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0RPVUJMRSwgJnZfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgc2lnbmFsLCBOVUxMKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgICAgCisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVuSGVsbG9Gcm9tU2VsZiIpKQorICAgIHsKKyAgICAgIHJldHVybiBoYW5kbGVfcnVuX2hlbGxvX2Zyb21fc2VsZiAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsb0Zyb21TZWxmIikpCisgICAgeworICAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgIHByaW50ZiAoIlJlY2VpdmVkIHRoZSBIZWxsb0Zyb21TZWxmIG1lc3NhZ2VcbiIpOworICAgICAgICAKKyAgICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgICAgICAgCisgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKworICAgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNPYmplY3RQYXRoVlRhYmxlCitlY2hvX3Z0YWJsZSA9IHsKKyAgcGF0aF91bnJlZ2lzdGVyZWRfZnVuYywKKyAgcGF0aF9tZXNzYWdlX2Z1bmMsCisgIE5VTEwsCit9OworCisKK3N0YXRpYyBjb25zdCBjaGFyKiBlY2hvX3BhdGggPSAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiIDsKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitmaWx0ZXJfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgaW50IHJlc3VsdDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGRidXNfYm9vbF90IGRvX2Zvcms7CisKKyAgaWYgKGFyZ2MgIT0gMykKKyAgICB7CisgICAgICBuYW1lID0gIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIjsKKyAgICAgIGRvX2ZvcmsgPSBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuYW1lID0gYXJndlsxXTsKKyNpZm5kZWYgREJVU19XSU4KKyAgICAgIGRvX2ZvcmsgPSBzdHJjbXAgKGFyZ3ZbMl0sICJmb3JrIikgPT0gMDsKKyNlbHNlCisgICAgICBkb19mb3JrID0gRkFMU0U7CisjZW5kaWYKKyAgICB9CisKKyAgLyogVGhlIGJhcmUgbWluaW11bSBmb3Igc2ltdWxhdGluZyBhIHByb2dyYW0gImRhZW1vbml6aW5nIjsgdGhlIGludGVudAorICAgKiBpcyB0byB0ZXN0IHNlcnZpY2VzIHdoaWNoIG1vdmUgZnJvbSBiZWluZyBsZWdhY3kgaW5pdCBzY3JpcHRzIHRvCisgICAqIGFjdGl2YXRlZCBzZXJ2aWNlcy4KKyAgICogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD01NDUyNjcKKyAgICovCisjaWZuZGVmIERCVVNfV0lOCisgICBpZiAoZG9fZm9yaykKKyAgICB7CisgICAgICBwaWRfdCBwaWQgPSBmb3JrICgpOworICAgICAgaWYgKHBpZCAhPSAwKQorICAgICAgICBleGl0ICgwKTsKKyAgICAgIHNsZWVwICgxKTsKKyAgICB9CisjZW5kaWYKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NUQVJURVIsICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gYWN0aXZhdGluZyBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9mdW5jLCBOVUxMLCBOVUxMKSkKKyAgICBkaWUgKCJObyBtZW1vcnkiKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9fcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlY2hvX3Z0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgMHhkZWFkYmVlZikpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgeworICAgIHZvaWQgKmQ7CisgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEgKGNvbm5lY3Rpb24sIGVjaG9fcGF0aCwgJmQpKQorICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisgICAgaWYgKGQgIT0gKHZvaWQqKSAweGRlYWRiZWVmKQorICAgICAgZGllICgiZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhKCkgZG9lc24ndCBzZWVtIHRvIHdvcmsgcmlnaHRcbiIpOworICB9CisKKyAgcmVzdWx0ID0gZGJ1c19idXNfcmVxdWVzdF9uYW1lIChjb25uZWN0aW9uLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqIEZhaWxlZCB0byBhY3F1aXJlIHNlcnZpY2U6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIAorICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBlbnRlcmluZyBtYWluIGxvb3BcbiIpOworICBfZGJ1c19sb29wX3J1biAobG9vcCk7CisgIAorICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChjb25uZWN0aW9uLCBmaWx0ZXJfZnVuYywgTlVMTCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICBsb29wID0gTlVMTDsKKyAgCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgZXhpdGluZ1xuIik7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmMgYi9kYnVzLTEuNC4xMC90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzE2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCkBAIC0wLDAgKzEsMTk2IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhbHJlYWR5X3F1aXQgPSBGQUxTRTsKK3N0YXRpYyBjb25zdCBjaGFyKiBlY2hvX3BhdGggPSAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiOworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgYXJnYzsKKyAgY2hhciAqKmFyZ3Y7Cit9IEVjaG9EYXRhOworCitzdGF0aWMgdm9pZAorcXVpdCAodm9pZCkKK3sKKyAgaWYgKCFhbHJlYWR5X3F1aXQpCisgICAgeworICAgICAgX2RidXNfbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGFscmVhZHlfcXVpdCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlKQoreworICBmcHJpbnRmIChzdGRlcnIsICIqKiogdGVzdC1zZXJ2aWNlOiAlcyIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitoYW5kbGVfZWNobyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBpbnQgaTsKKyAgRWNob0RhdGEgKmQ7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRWNobyBtZXRob2RcbiIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChjb25uZWN0aW9uLCBlY2hvX3BhdGgsICh2b2lkICoqKSZkKSkKKyAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICBmb3IgKGkgPSAwOyBpIDwgZC0+YXJnYzsgKytpKQorICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwgREJVU19UWVBFX1NUUklORywgJihkLT5hcmd2W2ldKSkpCisgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGZwcmludGYgKHN0ZGVyciwgIlNoZWxsIGVjaG8gc2VydmljZSBlY2hvZWQgdGhlIGNvbW1hbmQgbGluZVxuIik7CisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK3BhdGhfdW5yZWdpc3RlcmVkX2Z1bmMgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICAvKiBjb25uZWN0aW9uIHdhcyBmaW5hbGl6ZWQgKi8KK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitwYXRoX21lc3NhZ2VfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpKQorICAgIHJldHVybiBoYW5kbGVfZWNobyAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0UGF0aFZUYWJsZQorZWNob192dGFibGUgPSB7CisgIHBhdGhfdW5yZWdpc3RlcmVkX2Z1bmMsCisgIHBhdGhfbWVzc2FnZV9mdW5jLAorICBOVUxMLAorfTsKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitmaWx0ZXJfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzRXJyb3IgZXJyb3I7CisgIEVjaG9EYXRhIGVjaG9fZGF0YTsKKyAgaW50IHJlc3VsdDsKKyAgCisgIGVjaG9fZGF0YS5hcmdjID0gYXJnYzsKKyAgZWNob19kYXRhLmFyZ3YgPSBhcmd2OworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TVEFSVEVSLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIGFjdGl2YXRpbmcgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBpZiAobG9vcCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBpZiAoIXRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgY29ubmVjdGlvbikpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZnVuYywgTlVMTCwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWNob192dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopICZlY2hvX2RhdGEpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisgIHsKKyAgICB2b2lkICpkOworICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChjb25uZWN0aW9uLCBlY2hvX3BhdGgsICZkKSkKKyAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAgIGlmIChkICE9ICh2b2lkKikgJmVjaG9fZGF0YSkKKyAgICAgIGRpZSAoImRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHJpZ2h0XG4iKTsKKyAgfQorICAKKyAgcmVzdWx0ID0gZGJ1c19idXNfcmVxdWVzdF9uYW1lIChjb25uZWN0aW9uLCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqIEZhaWxlZCB0byBhY3F1aXJlIHNlcnZpY2U6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgZW50ZXJpbmcgbWFpbiBsb29wXG4iKTsKKyAgX2RidXNfbG9vcF9ydW4gKGxvb3ApOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAobG9vcCwgY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGNvbm5lY3Rpb24sIGZpbHRlcl9mdW5jLCBOVUxMKTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisgIGxvb3AgPSBOVUxMOworICAKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYyBiL2RidXMtMS40LjEwL3Rlc3QvdGVzdC1zbGVlcC1mb3JldmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0NzY5YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rlc3QvdGVzdC1zbGVlcC1mb3JldmVyLmMKQEAgLTAsMCArMSwyMiBAQAorLyogVGhpcyBpcyBhIHByb2Nlc3MgdGhhdCBqdXN0IHNsZWVwcyBpbmZpbml0ZWx5LiAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGRlZmluZSBzbGVlcCBTbGVlcAorI2VuZGlmCisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHdoaWxlICgxKQorICAgIHNsZWVwICgxMDAwMDAwMCk7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90ZXN0L3Rlc3QtdXRpbHMuYyBiL2RidXMtMS40LjEwL3Rlc3QvdGVzdC11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2Q3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90ZXN0L3Rlc3QtdXRpbHMuYwpAQCAtMCwwICsxLDM1MCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCit9IENEYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2Nvbm5lY3Rpb25fd2F0Y2hfY2FsbGJhY2sgKERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgcmV0dXJuIGRidXNfd2F0Y2hfaGFuZGxlICh3YXRjaCwgY29uZGl0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfd2F0Y2ggKERCdXNXYXRjaCAqd2F0Y2gsCisJICAgdm9pZCAgICAgICpkYXRhKQoreworICBDRGF0YSAqY2QgPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoY2QtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl93YXRjaF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfd2F0Y2ggKERCdXNXYXRjaCAqd2F0Y2gsCisJICAgICAgdm9pZCAgICAgICpkYXRhKQoreworICBDRGF0YSAqY2QgPSBkYXRhOworICAKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNkLT5sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGNvbm5lY3Rpb25fd2F0Y2hfY2FsbGJhY2ssIGNkKTsgIAorfQorCitzdGF0aWMgdm9pZAorY29ubmVjdGlvbl90aW1lb3V0X2NhbGxiYWNrIChEQnVzVGltZW91dCAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKQoreworICAvKiBDYW4gcmV0dXJuIEZBTFNFIG9uIE9PTSBidXQgd2UganVzdCBsZXQgaXQgZmlyZSBhZ2FpbiBsYXRlciAqLworICBkYnVzX3RpbWVvdXRfaGFuZGxlICh0aW1lb3V0KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisJICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY2QtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LCBjb25uZWN0aW9uX3RpbWVvdXRfY2FsbGJhY2ssIGNkLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV90aW1lb3V0IChEQnVzVGltZW91dCAqdGltZW91dCwKKwkJdm9pZCAgICAgICAgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfdGltZW91dCAoY2QtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIGNvbm5lY3Rpb25fdGltZW91dF9jYWxsYmFjaywgY2QpOworfQorCitzdGF0aWMgdm9pZAorZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Rpc3BhdGNoU3RhdHVzIG5ld19zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTG9vcCAqbG9vcCA9IGRhdGE7CisgIAorICBpZiAobmV3X3N0YXR1cyAhPSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFKQorICAgIHsKKyAgICAgIHdoaWxlICghX2RidXNfbG9vcF9xdWV1ZV9kaXNwYXRjaCAobG9vcCwgY29ubmVjdGlvbikpCisgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjZGF0YV9mcmVlICh2b2lkICpkYXRhKQoreworICBDRGF0YSAqY2QgPSBkYXRhOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY2QtPmNvbm5lY3Rpb24pOworICBfZGJ1c19sb29wX3VucmVmIChjZC0+bG9vcCk7CisgIAorICBkYnVzX2ZyZWUgKGNkKTsKK30KKworc3RhdGljIENEYXRhKgorY2RhdGFfbmV3IChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIENEYXRhICpjZDsKKworICBjZCA9IGRidXNfbmV3MCAoQ0RhdGEsIDEpOworICBpZiAoY2QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjZC0+bG9vcCA9IGxvb3A7CisgIGNkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjZC0+Y29ubmVjdGlvbik7CisgIF9kYnVzX2xvb3BfcmVmIChjZC0+bG9vcCk7CisKKyAgcmV0dXJuIGNkOworfQorCitkYnVzX2Jvb2xfdAordGVzdF9jb25uZWN0aW9uX3NldHVwIChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIENEYXRhICpjZDsKKworICBjZCA9IE5VTEw7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCwgTlVMTCk7CisgIAorICBjZCA9IGNkYXRhX25ldyAobG9vcCwgY29ubmVjdGlvbik7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisKKyAgLyogQmVjYXVzZSBkYnVzLW1haW5sb29wLmMgY2hlY2tzIGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCgpLAorICAgKiBkYnVzX3dhdGNoX2dldF9lbmFibGVkKCkgZGlyZWN0bHksIHdlIGRvbid0IGhhdmUgdG8gcHJvdmlkZQorICAgKiAidG9nZ2xlZCIgY2FsbGJhY2tzLgorICAgKi8KKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZCwgY2RhdGFfZnJlZSkpCisgICAgZ290byBub21lbTsKKworCisgIGNkID0gY2RhdGFfbmV3IChsb29wLCBjb25uZWN0aW9uKTsKKyAgaWYgKGNkID09IE5VTEwpCisgICAgZ290byBub21lbTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkLCBjZGF0YV9mcmVlKSkKKyAgICBnb3RvIG5vbWVtOworCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworICAKKyBub21lbToKKyAgaWYgKGNkKQorICAgIGNkYXRhX2ZyZWUgKGNkKTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAordGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyB0aW1lb3V0IGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKK30gU2VydmVyRGF0YTsKKworc3RhdGljIHZvaWQKK3NlcnZlcmRhdGFfZnJlZSAodm9pZCAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqc2QgPSBkYXRhOworCisgIGRidXNfc2VydmVyX3VucmVmIChzZC0+c2VydmVyKTsKKyAgX2RidXNfbG9vcF91bnJlZiAoc2QtPmxvb3ApOworICAKKyAgZGJ1c19mcmVlIChzZCk7Cit9CisKK3N0YXRpYyBTZXJ2ZXJEYXRhKgorc2VydmVyZGF0YV9uZXcgKERCdXNMb29wICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICpzZXJ2ZXIpCit7CisgIFNlcnZlckRhdGEgKnNkOworCisgIHNkID0gZGJ1c19uZXcwIChTZXJ2ZXJEYXRhLCAxKTsKKyAgaWYgKHNkID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc2QtPmxvb3AgPSBsb29wOworICBzZC0+c2VydmVyID0gc2VydmVyOworCisgIGRidXNfc2VydmVyX3JlZiAoc2QtPnNlcnZlcik7CisgIF9kYnVzX2xvb3BfcmVmIChzZC0+bG9vcCk7CisKKyAgcmV0dXJuIHNkOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlcnZlcl93YXRjaF9jYWxsYmFjayAoREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgLyogRklYTUUgdGhpcyBjYW4gYmUgZG9uZSBpbiBkYnVzLW1haW5sb29wLmMKKyAgICogaWYgdGhlIGNvZGUgaW4gYWN0aXZhdGlvbi5jIGZvciB0aGUgYmFieXNpdHRlcgorICAgKiB3YXRjaCBoYW5kbGVyIGlzIGZpeGVkLgorICAgKi8KKworICByZXR1cm4gZGJ1c193YXRjaF9oYW5kbGUgKHdhdGNoLCBjb25kaXRpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9zZXJ2ZXJfd2F0Y2ggKERCdXNXYXRjaCAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqY29udGV4dCA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb250ZXh0LT5sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLCBzZXJ2ZXJfd2F0Y2hfY2FsbGJhY2ssIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VydmVyX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKmRhdGEpCit7CisgIFNlcnZlckRhdGEgKmNvbnRleHQgPSBkYXRhOworICAKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNvbnRleHQtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgc2VydmVyX3dhdGNoX2NhbGxiYWNrLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK3NlcnZlcl90aW1lb3V0X2NhbGxiYWNrIChEQnVzVGltZW91dCAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpCit7CisgIC8qIGNhbiByZXR1cm4gRkFMU0Ugb24gT09NIGJ1dCB3ZSBqdXN0IGxldCBpdCBmaXJlIGFnYWluIGxhdGVyICovCisgIGRidXNfdGltZW91dF9oYW5kbGUgKHRpbWVvdXQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9zZXJ2ZXJfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpjb250ZXh0ID0gZGF0YTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY29udGV4dC0+bG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIHNlcnZlcl90aW1lb3V0X2NhbGxiYWNrLCBjb250ZXh0LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9zZXJ2ZXJfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpjb250ZXh0ID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNvbnRleHQtPmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIHNlcnZlcl90aW1lb3V0X2NhbGxiYWNrLCBjb250ZXh0KTsKK30KKworZGJ1c19ib29sX3QKK3Rlc3Rfc2VydmVyX3NldHVwIChEQnVzTG9vcCAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgKnNlcnZlcikKK3sKKyAgU2VydmVyRGF0YSAqc2Q7CisKKyAgc2QgPSBzZXJ2ZXJkYXRhX25ldyAobG9vcCwgc2VydmVyKTsKKyAgaWYgKHNkID09IE5VTEwpCisgICAgZ290byBub21lbTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJkYXRhX2ZyZWUpKQorICAgIHsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIHNkID0gc2VydmVyZGF0YV9uZXcgKGxvb3AsIHNlcnZlcik7CisgIGlmIChzZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2ZXJfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCwgc2VydmVyZGF0YV9mcmVlKSkKKyAgICB7CisgICAgICBnb3RvIG5vbWVtOworICAgIH0gICAKKyAgcmV0dXJuIFRSVUU7CisKKyBub21lbToKKyAgaWYgKHNkKQorICAgIHNlcnZlcmRhdGFfZnJlZSAoc2QpOworICAKKyAgdGVzdF9zZXJ2ZXJfc2h1dGRvd24gKGxvb3AsIHNlcnZlcik7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK3Rlc3Rfc2VydmVyX3NodXRkb3duIChEQnVzTG9vcCAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICAgKnNlcnZlcikKK3sKKyAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoc2VydmVyKTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgKHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2V0dGluZyB3YXRjaCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsKKyAgCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgdGltZW91dCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsgIAorfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdGVzdC90ZXN0LXV0aWxzLmggYi9kYnVzLTEuNC4xMC90ZXN0L3Rlc3QtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFlNTVlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdGVzdC90ZXN0LXV0aWxzLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBURVNUX1VUSUxTX0gKKyNkZWZpbmUgVEVTVF9VVElMU19ICisjaWZuZGVmIERCVVNfQ09NUElMQVRJT04KKyNkZWZpbmUgREJVU19DT01QSUxBVElPTiAvKiBDaGVhdCBhbmQgdXNlIHByaXZhdGUgc3R1ZmYgKi8KKyNlbmRpZgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1haW5sb29wLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI3VuZGVmIERCVVNfQ09NUElMQVRJT04KKworZGJ1c19ib29sX3QgdGVzdF9jb25uZWN0aW9uX3NldHVwICAgICAgICAgICAgICAgICAoREJ1c0xvb3AgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gICAgICAgICAgICAgIChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIHRlc3RfY29ubmVjdGlvbl9kaXNwYXRjaF9hbGxfbWVzc2FnZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90IHRlc3RfY29ubmVjdGlvbl9kaXNwYXRjaF9vbmVfbWVzc2FnZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworZGJ1c19ib29sX3QgdGVzdF9zZXJ2ZXJfc2V0dXAgICAgICAgICAgICAgICAgICAgICAoREJ1c0xvb3AgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgKnNlcnZlcik7Cit2b2lkICAgICAgICB0ZXN0X3NlcnZlcl9zaHV0ZG93biAgICAgICAgICAgICAgICAgIChEQnVzTG9vcCAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAqc2VydmVyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90b29scy9NYWtlZmlsZS5hbSBiL2RidXMtMS40LjEwL3Rvb2xzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODhjODUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90b29scy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU3IEBACitjb25maWdkaXI9JChzeXNjb25mZGlyKS9kYnVzLTEKKworSU5DTFVERVM9LUkkKHRvcF9zcmNkaXIpICQoREJVU19DTElFTlRfQ0ZMQUdTKSAkKERCVVNfWF9DRkxBR1MpIC1EREJVU19MT0NBTEVESVI9XCJARVhQQU5ERURfREFUQURJUkAvbG9jYWxlXCIgLUREQlVTX0NPTVBJTEFUSU9OIC1EREJVU19NQUNISU5FX1VVSURfRklMRT1cIiIkKGxvY2Fsc3RhdGVkaXIpL2xpYi9kYnVzL21hY2hpbmUtaWQiXCIKKworZXh0cmFfYmluX3Byb2dyYW1zPQoraWYgREJVU19VTklYCitleHRyYV9iaW5fcHJvZ3JhbXMgKz0gZGJ1cy1jbGVhbnVwLXNvY2tldHMgZGJ1cy11dWlkZ2VuCitlbmRpZgorCitiaW5fUFJPR1JBTVM9ZGJ1cy1sYXVuY2ggZGJ1cy1zZW5kIGRidXMtbW9uaXRvciAkKGV4dHJhX2Jpbl9wcm9ncmFtcykKKworZGJ1c19zZW5kX1NPVVJDRVM9CQkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuYwkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuaAkJCVwKKwlkYnVzLXNlbmQuYworCitkYnVzX21vbml0b3JfU09VUkNFUz0JCQkJXAorCWRidXMtbW9uaXRvci5jCQkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuYwkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuaAorCitpZiBEQlVTX1dJTgorZGJ1c19sYXVuY2hfU09VUkNFUz0JCQkJXAorCWRidXMtbGF1bmNoLXdpbi5jCQkJXAorCWRidXMtbGF1bmNoLmgKK2Vsc2UKK2RidXNfbGF1bmNoX1NPVVJDRVM9CQkJCVwKKwlkYnVzLWxhdW5jaC5jCQkJCVwKKwlkYnVzLWxhdW5jaC14MTEuYwkJCVwKKwlkYnVzLWxhdW5jaC5oCitlbmRpZgorCitkYnVzX2NsZWFudXBfc29ja2V0c19TT1VSQ0VTPQkJCVwKKwlkYnVzLWNsZWFudXAtc29ja2V0cy5jCisKK2RidXNfdXVpZGdlbl9TT1VSQ0VTPQkJCQlcCisJZGJ1cy11dWlkZ2VuLmMKKworZGJ1c19zZW5kX0xEQUREPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgJChEQlVTX0NMSUVOVF9MSUJTKQorZGJ1c19zZW5kX0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdACisKK2RidXNfbW9uaXRvcl9MREFERD0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhICQoREJVU19DTElFTlRfTElCUykKK2RidXNfbW9uaXRvcl9MREZMQUdTPUBSX0RZTkFNSUNfTERGTEFHQAorCitkYnVzX3V1aWRnZW5fTERBREQ9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSAkKERCVVNfQ0xJRU5UX0xJQlMpCitkYnVzX3V1aWRnZW5fTERGTEFHUz1AUl9EWU5BTUlDX0xERkxBR0AKKworZGJ1c19sYXVuY2hfTERBREQ9ICQoREJVU19YX0xJQlMpICQoREJVU19DTElFTlRfTElCUykKK2RidXNfbGF1bmNoX0xERkxBR1M9QFJfRFlOQU1JQ19MREZMQUdACisKK0VYVFJBX0RJU1QgPSBydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2ggc3RydG9sbC5jIHN0cnRvdWxsLmMKK0NMRUFORklMRVMgPSAJCQkJXAorCXJ1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5jb25mCisKKyNjcmVhdGUgdGhlIC92YXIvbGliL2RhdGEgZGlyZWN0b3J5IGZvciBkYnVzLXV1aWRnZW4KK2xvY2Fsc3RhdGVsaWJkaXIgPSAkKGxvY2Fsc3RhdGVkaXIpL2xpYi9kYnVzCitsb2NhbHN0YXRlbGliX0RBVEEgPQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvTWFrZWZpbGUuaW4gYi9kYnVzLTEuNC4xMC90b29scy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDc5NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw3NjYgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorQERCVVNfVU5JWF9UUlVFQGFtX19hcHBlbmRfMSA9IGRidXMtY2xlYW51cC1zb2NrZXRzIGRidXMtdXVpZGdlbgorYmluX1BST0dSQU1TID0gZGJ1cy1sYXVuY2gkKEVYRUVYVCkgZGJ1cy1zZW5kJChFWEVFWFQpIFwKKwlkYnVzLW1vbml0b3IkKEVYRUVYVCkgJChhbV9fRVhFRVhUXzIpCitzdWJkaXIgPSB0b29scworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9hcy1hYy1leHBhbmQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvY29tcGlsZXIubTQgJCh0b3Bfc3JjZGlyKS9tNC9saWJ0b29sLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCAkKHRvcF9zcmNkaXIpL200L2x0c3VnYXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00ICQodG9wX3NyY2RpcikvbTQvbHR+b2Jzb2xldGUubTQgXAorCSQodG9wX3NyY2RpcikvbTQvcGtnLm00ICQodG9wX3NyY2RpcikvbTQvdHAtY29tcGlsZXItZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC90cC1jb21waWxlci13YXJuaW5ncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorQERCVVNfVU5JWF9UUlVFQGFtX19FWEVFWFRfMSA9IGRidXMtY2xlYW51cC1zb2NrZXRzJChFWEVFWFQpIFwKK0BEQlVTX1VOSVhfVFJVRUAJZGJ1cy11dWlkZ2VuJChFWEVFWFQpCithbV9fRVhFRVhUXzIgPSAkKGFtX19FWEVFWFRfMSkKK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIiBcCisJIiQoREVTVERJUikkKGxvY2Fsc3RhdGVsaWJkaXIpIgorUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKK2FtX2RidXNfY2xlYW51cF9zb2NrZXRzX09CSkVDVFMgPSBkYnVzLWNsZWFudXAtc29ja2V0cy4kKE9CSkVYVCkKK2RidXNfY2xlYW51cF9zb2NrZXRzX09CSkVDVFMgPSAkKGFtX2RidXNfY2xlYW51cF9zb2NrZXRzX09CSkVDVFMpCitkYnVzX2NsZWFudXBfc29ja2V0c19MREFERCA9ICQoTERBREQpCitBTV9WX2x0ID0gJChhbV9fdl9sdF8kKFYpKQorYW1fX3ZfbHRfID0gJChhbV9fdl9sdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X2x0XzAgPSAtLXNpbGVudAorYW1fX2RidXNfbGF1bmNoX1NPVVJDRVNfRElTVCA9IGRidXMtbGF1bmNoLmMgZGJ1cy1sYXVuY2gteDExLmMgXAorCWRidXMtbGF1bmNoLmggZGJ1cy1sYXVuY2gtd2luLmMKK0BEQlVTX1dJTl9GQUxTRUBhbV9kYnVzX2xhdW5jaF9PQkpFQ1RTID0gZGJ1cy1sYXVuY2guJChPQkpFWFQpIFwKK0BEQlVTX1dJTl9GQUxTRUAJZGJ1cy1sYXVuY2gteDExLiQoT0JKRVhUKQorQERCVVNfV0lOX1RSVUVAYW1fZGJ1c19sYXVuY2hfT0JKRUNUUyA9IGRidXMtbGF1bmNoLXdpbi4kKE9CSkVYVCkKK2RidXNfbGF1bmNoX09CSkVDVFMgPSAkKGFtX2RidXNfbGF1bmNoX09CSkVDVFMpCithbV9fREVQRU5ERU5DSUVTXzEgPQorZGJ1c19sYXVuY2hfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKQorZGJ1c19sYXVuY2hfTElOSyA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSQoZGJ1c19sYXVuY2hfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fZGJ1c19tb25pdG9yX09CSkVDVFMgPSBkYnVzLW1vbml0b3IuJChPQkpFWFQpIFwKKwlkYnVzLXByaW50LW1lc3NhZ2UuJChPQkpFWFQpCitkYnVzX21vbml0b3JfT0JKRUNUUyA9ICQoYW1fZGJ1c19tb25pdG9yX09CSkVDVFMpCitkYnVzX21vbml0b3JfREVQRU5ERU5DSUVTID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2RidXNfbW9uaXRvcl9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChkYnVzX21vbml0b3JfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fZGJ1c19zZW5kX09CSkVDVFMgPSBkYnVzLXByaW50LW1lc3NhZ2UuJChPQkpFWFQpIFwKKwlkYnVzLXNlbmQuJChPQkpFWFQpCitkYnVzX3NlbmRfT0JKRUNUUyA9ICQoYW1fZGJ1c19zZW5kX09CSkVDVFMpCitkYnVzX3NlbmRfREVQRU5ERU5DSUVTID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2RidXNfc2VuZF9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChkYnVzX3NlbmRfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fZGJ1c191dWlkZ2VuX09CSkVDVFMgPSBkYnVzLXV1aWRnZW4uJChPQkpFWFQpCitkYnVzX3V1aWRnZW5fT0JKRUNUUyA9ICQoYW1fZGJ1c191dWlkZ2VuX09CSkVDVFMpCitkYnVzX3V1aWRnZW5fREVQRU5ERU5DSUVTID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2RidXNfdXVpZGdlbl9MSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChkYnVzX3V1aWRnZW5fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgXAorCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCSQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0FNX1ZfQ0MgPSAkKGFtX192X0NDXyQoVikpCithbV9fdl9DQ18gPSAkKGFtX192X0NDXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfQ0NfMCA9IEBlY2hvICIgIENDICAgICIgJEA7CitBTV9WX2F0ID0gJChhbV9fdl9hdF8kKFYpKQorYW1fX3ZfYXRfID0gJChhbV9fdl9hdF8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X2F0XzAgPSBACitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0FNX1ZfQ0NMRCA9ICQoYW1fX3ZfQ0NMRF8kKFYpKQorYW1fX3ZfQ0NMRF8gPSAkKGFtX192X0NDTERfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9DQ0xEXzAgPSBAZWNobyAiICBDQ0xEICAiICRAOworQU1fVl9HRU4gPSAkKGFtX192X0dFTl8kKFYpKQorYW1fX3ZfR0VOXyA9ICQoYW1fX3ZfR0VOXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfR0VOXzAgPSBAZWNobyAiICBHRU4gICAiICRAOworU09VUkNFUyA9ICQoZGJ1c19jbGVhbnVwX3NvY2tldHNfU09VUkNFUykgJChkYnVzX2xhdW5jaF9TT1VSQ0VTKSBcCisJJChkYnVzX21vbml0b3JfU09VUkNFUykgJChkYnVzX3NlbmRfU09VUkNFUykgXAorCSQoZGJ1c191dWlkZ2VuX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGRidXNfY2xlYW51cF9zb2NrZXRzX1NPVVJDRVMpIFwKKwkkKGFtX19kYnVzX2xhdW5jaF9TT1VSQ0VTX0RJU1QpICQoZGJ1c19tb25pdG9yX1NPVVJDRVMpIFwKKwkkKGRidXNfc2VuZF9TT1VSQ0VTKSAkKGRidXNfdXVpZGdlbl9TT1VSQ0VTKQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworREFUQSA9ICQobG9jYWxzdGF0ZWxpYl9EQVRBKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRklMRVZFUlNJT04gPSBAQlVJTERfRklMRVZFUlNJT05ACitCVUlMRF9USU1FU1RBTVAgPSBAQlVJTERfVElNRVNUQU1QQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREJVU19CSU5ESVIgPSBAREJVU19CSU5ESVJACitEQlVTX0JVU19DRkxBR1MgPSBAREJVU19CVVNfQ0ZMQUdTQAorREJVU19CVVNfTElCUyA9IEBEQlVTX0JVU19MSUJTQAorREJVU19DTElFTlRfQ0ZMQUdTID0gQERCVVNfQ0xJRU5UX0NGTEFHU0AKK0RCVVNfQ0xJRU5UX0xJQlMgPSBAREJVU19DTElFTlRfTElCU0AKK0RCVVNfQ09OU09MRV9BVVRIX0RJUiA9IEBEQlVTX0NPTlNPTEVfQVVUSF9ESVJACitEQlVTX0NPTlNPTEVfT1dORVJfRklMRSA9IEBEQlVTX0NPTlNPTEVfT1dORVJfRklMRUAKK0RCVVNfREFFTU9ORElSID0gQERCVVNfREFFTU9ORElSQAorREJVU19EQVRBRElSID0gQERCVVNfREFUQURJUkAKK0RCVVNfSEFWRV9JTlQ2NCA9IEBEQlVTX0hBVkVfSU5UNjRACitEQlVTX0lOVDE2X1RZUEUgPSBAREJVU19JTlQxNl9UWVBFQAorREJVU19JTlQzMl9UWVBFID0gQERCVVNfSU5UMzJfVFlQRUAKK0RCVVNfSU5UNjRfQ09OU1RBTlQgPSBAREJVU19JTlQ2NF9DT05TVEFOVEAKK0RCVVNfSU5UNjRfVFlQRSA9IEBEQlVTX0lOVDY0X1RZUEVACitEQlVTX0xBVU5DSEVSX0NGTEFHUyA9IEBEQlVTX0xBVU5DSEVSX0NGTEFHU0AKK0RCVVNfTEFVTkNIRVJfTElCUyA9IEBEQlVTX0xBVU5DSEVSX0xJQlNACitEQlVTX0xJQkVYRUNESVIgPSBAREJVU19MSUJFWEVDRElSQAorREJVU19NQUpPUl9WRVJTSU9OID0gQERCVVNfTUFKT1JfVkVSU0lPTkAKK0RCVVNfTUlDUk9fVkVSU0lPTiA9IEBEQlVTX01JQ1JPX1ZFUlNJT05ACitEQlVTX01JTk9SX1ZFUlNJT04gPSBAREJVU19NSU5PUl9WRVJTSU9OQAorREJVU19QQVRIX09SX0FCU1RSQUNUID0gQERCVVNfUEFUSF9PUl9BQlNUUkFDVEAKK0RCVVNfUFJFRklYID0gQERCVVNfUFJFRklYQAorREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1MgPSBAREJVU19TRVNTSU9OX0JVU19ERUZBVUxUX0FERFJFU1NACitEQlVTX1NFU1NJT05fU09DS0VUX0RJUiA9IEBEQlVTX1NFU1NJT05fU09DS0VUX0RJUkAKK0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MgPSBAREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU0AKK0RCVVNfU1lTVEVNX1BJRF9GSUxFID0gQERCVVNfU1lTVEVNX1BJRF9GSUxFQAorREJVU19TWVNURU1fU09DS0VUID0gQERCVVNfU1lTVEVNX1NPQ0tFVEAKK0RCVVNfVEVTVF9DRkxBR1MgPSBAREJVU19URVNUX0NGTEFHU0AKK0RCVVNfVEVTVF9MSUJTID0gQERCVVNfVEVTVF9MSUJTQAorREJVU19VSU5UNjRfQ09OU1RBTlQgPSBAREJVU19VSU5UNjRfQ09OU1RBTlRACitEQlVTX1VTRVIgPSBAREJVU19VU0VSQAorREJVU19WRVJTSU9OID0gQERCVVNfVkVSU0lPTkAKK0RCVVNfWF9DRkxBR1MgPSBAREJVU19YX0NGTEFHU0AKK0RCVVNfWF9MSUJTID0gQERCVVNfWF9MSUJTQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RPWFlHRU4gPSBARE9YWUdFTkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRVhQQU5ERURfQklORElSID0gQEVYUEFOREVEX0JJTkRJUkAKK0VYUEFOREVEX0RBVEFESVIgPSBARVhQQU5ERURfREFUQURJUkAKK0VYUEFOREVEX0xJQkRJUiA9IEBFWFBBTkRFRF9MSUJESVJACitFWFBBTkRFRF9MSUJFWEVDRElSID0gQEVYUEFOREVEX0xJQkVYRUNESVJACitFWFBBTkRFRF9MT0NBTFNUQVRFRElSID0gQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJACitFWFBBTkRFRF9QUkVGSVggPSBARVhQQU5ERURfUFJFRklYQAorRVhQQU5ERURfU1lTQ09ORkRJUiA9IEBFWFBBTkRFRF9TWVNDT05GRElSQAorRkdSRVAgPSBARkdSRVBACitHRVRURVhUX1BBQ0tBR0UgPSBAR0VUVEVYVF9QQUNLQUdFQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMQVVOQ0hDVEwgPSBATEFVTkNIQ1RMQAorTEFVTkNIRF9BR0VOVF9ESVIgPSBATEFVTkNIRF9BR0VOVF9ESVJACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlhNTF9DRkxBR1MgPSBATElCWE1MX0NGTEFHU0AKK0xJQlhNTF9MSUJTID0gQExJQlhNTF9MSUJTQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK0xUX0FHRSA9IEBMVF9BR0VACitMVF9DVVJSRU5UID0gQExUX0NVUlJFTlRACitMVF9SRVZJU0lPTiA9IEBMVF9SRVZJU0lPTkAKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU4ySFRNTCA9IEBNQU4ySFRNTEAKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JDID0gQFJDQAorUl9EWU5BTUlDX0xERkxBRyA9IEBSX0RZTkFNSUNfTERGTEFHQAorU0VDVElPTl9MREZMQUdTID0gQFNFQ1RJT05fTERGTEFHU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitURVNUX0JVU19CSU5BUlkgPSBAVEVTVF9CVVNfQklOQVJZQAorVEVTVF9FWElUX0JJTkFSWSA9IEBURVNUX0VYSVRfQklOQVJZQAorVEVTVF9JTlZBTElEX1NFUlZJQ0VfRElSID0gQFRFU1RfSU5WQUxJRF9TRVJWSUNFX0RJUkAKK1RFU1RfSU5WQUxJRF9TRVJWSUNFX1NZU1RFTV9ESVIgPSBAVEVTVF9JTlZBTElEX1NFUlZJQ0VfU1lTVEVNX0RJUkAKK1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkgPSBAVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWUAKK1RFU1RfUFJJVlNFUlZFUl9CSU5BUlkgPSBAVEVTVF9QUklWU0VSVkVSX0JJTkFSWUAKK1RFU1RfU0VHRkFVTFRfQklOQVJZID0gQFRFU1RfU0VHRkFVTFRfQklOQVJZQAorVEVTVF9TRVJWSUNFX0JJTkFSWSA9IEBURVNUX1NFUlZJQ0VfQklOQVJZQAorVEVTVF9TSEVMTF9TRVJWSUNFX0JJTkFSWSA9IEBURVNUX1NIRUxMX1NFUlZJQ0VfQklOQVJZQAorVEVTVF9TTEVFUF9GT1JFVkVSX0JJTkFSWSA9IEBURVNUX1NMRUVQX0ZPUkVWRVJfQklOQVJZQAorVEVTVF9TT0NLRVRfRElSID0gQFRFU1RfU09DS0VUX0RJUkAKK1RFU1RfVkFMSURfU0VSVklDRV9ESVIgPSBAVEVTVF9WQUxJRF9TRVJWSUNFX0RJUkAKK1RFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSID0gQFRFU1RfVkFMSURfU0VSVklDRV9TWVNURU1fRElSQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lORFJFUyA9IEBXSU5EUkVTQAorWE1LTUYgPSBAWE1LTUZACitYTUxUTyA9IEBYTUxUT0AKK1hTTFRQUk9DID0gQFhTTFRQUk9DQAorWF9DRkxBR1MgPSBAWF9DRkxBR1NACitYX0VYVFJBX0xJQlMgPSBAWF9FWFRSQV9MSUJTQAorWF9MSUJTID0gQFhfTElCU0AKK1hfUFJFX0xJQlMgPSBAWF9QUkVfTElCU0AKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0FSID0gQGFjX2N0X0FSQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc3lzdGVtZHN5c3RlbXVuaXRkaXIgPSBAc3lzdGVtZHN5c3RlbXVuaXRkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK2NvbmZpZ2RpciA9ICQoc3lzY29uZmRpcikvZGJ1cy0xCitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKSAkKERCVVNfQ0xJRU5UX0NGTEFHUykgJChEQlVTX1hfQ0ZMQUdTKSAtRERCVVNfTE9DQUxFRElSPVwiQEVYUEFOREVEX0RBVEFESVJAL2xvY2FsZVwiIC1EREJVU19DT01QSUxBVElPTiAtRERCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIiJChsb2NhbHN0YXRlZGlyKS9saWIvZGJ1cy9tYWNoaW5lLWlkIlwiCitleHRyYV9iaW5fcHJvZ3JhbXMgPSAkKGFtX19hcHBlbmRfMSkKK2RidXNfc2VuZF9TT1VSQ0VTID0gXAorCWRidXMtcHJpbnQtbWVzc2FnZS5jCQkJXAorCWRidXMtcHJpbnQtbWVzc2FnZS5oCQkJXAorCWRidXMtc2VuZC5jCisKK2RidXNfbW9uaXRvcl9TT1VSQ0VTID0gXAorCWRidXMtbW9uaXRvci5jCQkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuYwkJCVwKKwlkYnVzLXByaW50LW1lc3NhZ2UuaAorCitAREJVU19XSU5fRkFMU0VAZGJ1c19sYXVuY2hfU09VUkNFUyA9IFwKK0BEQlVTX1dJTl9GQUxTRUAJZGJ1cy1sYXVuY2guYwkJCQlcCitAREJVU19XSU5fRkFMU0VACWRidXMtbGF1bmNoLXgxMS5jCQkJXAorQERCVVNfV0lOX0ZBTFNFQAlkYnVzLWxhdW5jaC5oCisKK0BEQlVTX1dJTl9UUlVFQGRidXNfbGF1bmNoX1NPVVJDRVMgPSBcCitAREJVU19XSU5fVFJVRUAJZGJ1cy1sYXVuY2gtd2luLmMJCQlcCitAREJVU19XSU5fVFJVRUAJZGJ1cy1sYXVuY2guaAorCitkYnVzX2NsZWFudXBfc29ja2V0c19TT1VSQ0VTID0gXAorCWRidXMtY2xlYW51cC1zb2NrZXRzLmMKKworZGJ1c191dWlkZ2VuX1NPVVJDRVMgPSBcCisJZGJ1cy11dWlkZ2VuLmMKKworZGJ1c19zZW5kX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhICQoREJVU19DTElFTlRfTElCUykKK2RidXNfc2VuZF9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACitkYnVzX21vbml0b3JfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgJChEQlVTX0NMSUVOVF9MSUJTKQorZGJ1c19tb25pdG9yX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKK2RidXNfdXVpZGdlbl9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYSAkKERCVVNfQ0xJRU5UX0xJQlMpCitkYnVzX3V1aWRnZW5fTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorZGJ1c19sYXVuY2hfTERBREQgPSAkKERCVVNfWF9MSUJTKSAkKERCVVNfQ0xJRU5UX0xJQlMpCitkYnVzX2xhdW5jaF9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACitFWFRSQV9ESVNUID0gcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoIHN0cnRvbGwuYyBzdHJ0b3VsbC5jCitDTEVBTkZJTEVTID0gXAorCXJ1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5jb25mCisKKworI2NyZWF0ZSB0aGUgL3Zhci9saWIvZGF0YSBkaXJlY3RvcnkgZm9yIGRidXMtdXVpZGdlbgorbG9jYWxzdGF0ZWxpYmRpciA9ICQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMKK2xvY2Fsc3RhdGVsaWJfREFUQSA9IAorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CitpbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGJpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorCXNlZCAncy8kKEVYRUVYVCkkJC8vJyB8IFwKKwl3aGlsZSByZWFkIHAgcDE7IGRvIGlmIHRlc3QgLWYgJCRwIHx8IHRlc3QgLWYgJCRwMTsgXAorCSAgdGhlbiBlY2hvICIkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuO2gnIC1lICdzfC4qfC58JyBcCisJICAgIC1lICdwO3g7cywuKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLycgfCBcCisJc2VkICdOO047TjtzLFxuLCAsZycgfCBcCisJJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMSB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCAkJDMgIi8iICQkNCwgJCQxOyB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgJyQoREVTVERJUikkKGJpbmRpcikkJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoYmluZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitjbGVhbi1iaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CitkYnVzLWNsZWFudXAtc29ja2V0cyQoRVhFRVhUKTogJChkYnVzX2NsZWFudXBfc29ja2V0c19PQkpFQ1RTKSAkKGRidXNfY2xlYW51cF9zb2NrZXRzX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGRidXMtY2xlYW51cC1zb2NrZXRzJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJChMSU5LKSAkKGRidXNfY2xlYW51cF9zb2NrZXRzX09CSkVDVFMpICQoZGJ1c19jbGVhbnVwX3NvY2tldHNfTERBREQpICQoTElCUykKK2RidXMtbGF1bmNoJChFWEVFWFQpOiAkKGRidXNfbGF1bmNoX09CSkVDVFMpICQoZGJ1c19sYXVuY2hfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZGJ1cy1sYXVuY2gkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGRidXNfbGF1bmNoX0xJTkspICQoZGJ1c19sYXVuY2hfT0JKRUNUUykgJChkYnVzX2xhdW5jaF9MREFERCkgJChMSUJTKQorZGJ1cy1tb25pdG9yJChFWEVFWFQpOiAkKGRidXNfbW9uaXRvcl9PQkpFQ1RTKSAkKGRidXNfbW9uaXRvcl9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBkYnVzLW1vbml0b3IkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGRidXNfbW9uaXRvcl9MSU5LKSAkKGRidXNfbW9uaXRvcl9PQkpFQ1RTKSAkKGRidXNfbW9uaXRvcl9MREFERCkgJChMSUJTKQorZGJ1cy1zZW5kJChFWEVFWFQpOiAkKGRidXNfc2VuZF9PQkpFQ1RTKSAkKGRidXNfc2VuZF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBkYnVzLXNlbmQkKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGRidXNfc2VuZF9MSU5LKSAkKGRidXNfc2VuZF9PQkpFQ1RTKSAkKGRidXNfc2VuZF9MREFERCkgJChMSUJTKQorZGJ1cy11dWlkZ2VuJChFWEVFWFQpOiAkKGRidXNfdXVpZGdlbl9PQkpFQ1RTKSAkKGRidXNfdXVpZGdlbl9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBkYnVzLXV1aWRnZW4kKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKGRidXNfdXVpZGdlbl9MSU5LKSAkKGRidXNfdXVpZGdlbl9PQkpFQ1RTKSAkKGRidXNfdXVpZGdlbl9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1cy1jbGVhbnVwLXNvY2tldHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXMtbGF1bmNoLXdpbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1cy1sYXVuY2gteDExLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzLWxhdW5jaC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1cy1tb25pdG9yLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kYnVzLXByaW50LW1lc3NhZ2UuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RidXMtc2VuZC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGJ1cy11dWlkZ2VuLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCitpbnN0YWxsLWxvY2Fsc3RhdGVsaWJEQVRBOiAkKGxvY2Fsc3RhdGVsaWJfREFUQSkKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGxvY2Fsc3RhdGVsaWJkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChsb2NhbHN0YXRlbGliZGlyKSIKKwlAbGlzdD0nJChsb2NhbHN0YXRlbGliX0RBVEEpJzsgdGVzdCAtbiAiJChsb2NhbHN0YXRlbGliZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChsb2NhbHN0YXRlbGliZGlyKSciOyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobG9jYWxzdGF0ZWxpYmRpcikiIHx8IGV4aXQgJCQ/OyBcCisJZG9uZQorCit1bmluc3RhbGwtbG9jYWxzdGF0ZWxpYkRBVEE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsb2NhbHN0YXRlbGliX0RBVEEpJzsgdGVzdCAtbiAiJChsb2NhbHN0YXRlbGliZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAorCXRlc3QgLW4gIiQkZmlsZXMiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChsb2NhbHN0YXRlbGliZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKGxvY2Fsc3RhdGVsaWJkaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoREFUQSkKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGJpbmRpcikiICIkKERFU1RESVIpJChsb2NhbHN0YXRlbGliZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1sb2NhbHN0YXRlbGliREFUQQorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtbG9jYWxzdGF0ZWxpYkRBVEEKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYmluUFJPR1JBTVMgXAorCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLWxvY2Fsc3RhdGVsaWJEQVRBIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKKwlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtYmluUFJPR1JBTVMgXAorCXVuaW5zdGFsbC1sb2NhbHN0YXRlbGliREFUQQorCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmMgYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjcwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY2xlYW51cC1zb2NrZXRzLmMgIGRidXMtY2xlYW51cC1zb2NrZXRzIHV0aWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyIE1pY2hhZWwgTWVla3MKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIE5PVCBsaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlLAorICogYXMgaXQgaXMgYmFzZWQgb24gbGluYy1jbGVhbnVwLXNvY2tldHMgd2hpY2ggaXMgTEdQTC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgKDEpCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKSAwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkKgoreG1hbGxvYyAoc2l6ZV90IGJ5dGVzKQoreworICB2b2lkICptZW07CisKKyAgaWYgKGJ5dGVzID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtID0gbWFsbG9jIChieXRlcyk7CisKKyAgaWYgKG1lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkFsbG9jYXRpb24gb2YgJWQgYnl0ZXMgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgKGludCkgYnl0ZXMpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkKgoreHJlYWxsb2MgKHZvaWQgKm9sZCwgc2l6ZV90IGJ5dGVzKQoreworICB2b2lkICptZW07CisKKyAgaWYgKGJ5dGVzID09IDApCisgICAgeworICAgICAgZnJlZSAob2xkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBtZW0gPSByZWFsbG9jIChvbGQsIGJ5dGVzKTsKKworICBpZiAobWVtID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVhbGxvY2F0aW9uIG9mICVkIGJ5dGVzIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpIGJ5dGVzKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gbWVtOworfQorCisjaWZkZWYgQUZfVU5JWAorCit0eXBlZGVmIGVudW0KKyAgeworICAgIFNPQ0tFVF9VTktOT1dOLAorICAgIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFLAorICAgIFNPQ0tFVF9ERUFELAorICAgIFNPQ0tFVF9BTElWRSwKKyAgICBTT0NLRVRfVU5MSU5LRUQKKyAgfSBTb2NrZXRTdGF0dXM7CisKK3N0YXRpYyBpbnQgYWxpdmVfY291bnQgPSAwOworc3RhdGljIGludCBjbGVhbmVkX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdW5oYW5kbGVkX2NvdW50ID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50ICAgZmQ7CisgIFNvY2tldFN0YXR1cyBzdGF0dXM7CisgIGludCAgIG5fcmV0cmllczsKK30gU29ja2V0RW50cnk7CisKK3N0YXRpYyBTb2NrZXRFbnRyeSoKK3NvY2tldF9lbnRyeV9uZXcgKGNvbnN0IGNoYXIgKmRpciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lKQoreworICBTb2NrZXRFbnRyeSAqc2U7CisgIGludCBsZW47CisKKyAgc2UgPSB4bWFsbG9jIChzaXplb2YgKFNvY2tldEVudHJ5KSk7CisKKyAgbGVuID0gc3RybGVuIChkaXIpICsgc3RybGVuIChmbmFtZSkgKyAyOyAvKiAyID0gbnVsIGFuZCAnLycgKi8KKyAgc2UtPm5hbWUgPSB4bWFsbG9jIChsZW4pOworCisgIHN0cmNweSAoc2UtPm5hbWUsIGRpcik7CisgIHN0cmNhdCAoc2UtPm5hbWUsICIvIik7CisgIHN0cmNhdCAoc2UtPm5hbWUsIGZuYW1lKTsKKworICBzZS0+ZmQgPSAtMTsKKworICBzZS0+c3RhdHVzID0gU09DS0VUX1VOS05PV047CisKKyAgc2UtPm5fcmV0cmllcyA9IDA7CisKKyAgcmV0dXJuIHNlOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9zb2NrZXRfZW50cnkgKFNvY2tldEVudHJ5ICpzZSkKK3sKKyAgaWYgKHNlKQorICAgIHsKKyAgICAgIGZyZWUgKHNlLT5uYW1lKTsKKyAgICAgIGlmIChzZS0+ZmQgPj0gMCkKKyAgICAgICAgY2xvc2UgKHNlLT5mZCk7CisgICAgICBmcmVlIChzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZnJlZV9zb2NrZXRfZW50cmllcyAoU29ja2V0RW50cnkqKiBlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBuX2VudHJpZXMpCit7CisgIGludCBpOworCisgIGlmIChlbnRyaWVzKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2VudHJpZXM7ICsraSkKKyAgICAgICAgZnJlZV9zb2NrZXRfZW50cnkgKGVudHJpZXNbaV0pOworICAgICAgZnJlZSAoZW50cmllcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVhZF9zb2NrZXRzIChjb25zdCBjaGFyICAgICpkaXIsCisgICAgICAgICAgICAgIFNvY2tldEVudHJ5ICoqKmVudHJpZXNfcCwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqbl9lbnRyaWVzX3ApCit7CisgIERJUiAgICpkaXJoOworICBzdHJ1Y3QgZGlyZW50ICpkZW50OworICBTb2NrZXRFbnRyeSAqKmVudHJpZXM7CisgIGludCBuX2VudHJpZXM7CisgIGludCBhbGxvY2F0ZWQ7CisKKyAgbl9lbnRyaWVzID0gMDsKKyAgYWxsb2NhdGVkID0gMjsKKyAgZW50cmllcyA9IHhtYWxsb2MgKHNpemVvZiAoU29ja2V0RW50cnkqKSAqIGFsbG9jYXRlZCk7CisKKyAgZGlyaCA9IG9wZW5kaXIgKGRpcik7CisgIGlmIChkaXJoID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZGlyZWN0b3J5ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGRpciwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgd2hpbGUgKChkZW50ID0gcmVhZGRpciAoZGlyaCkpKQorICAgIHsKKyAgICAgIFNvY2tldEVudHJ5ICpzZTsKKworICAgICAgaWYgKHN0cm5jbXAgKGRlbnQtPmRfbmFtZSwgImRidXMtIiwgNSkgIT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHNlID0gc29ja2V0X2VudHJ5X25ldyAoZGlyLCBkZW50LT5kX25hbWUpOworCisgICAgICBpZiAobl9lbnRyaWVzID09IGFsbG9jYXRlZCkKKyAgICAgICAgeworICAgICAgICAgIGFsbG9jYXRlZCAqPSAyOworICAgICAgICAgIGVudHJpZXMgPSB4cmVhbGxvYyAoZW50cmllcywgc2l6ZW9mIChTb2NrZXRFbnRyeSopICogYWxsb2NhdGVkKTsKKyAgICAgICAgfQorCisgICAgICBlbnRyaWVzW25fZW50cmllc10gPSBzZTsKKyAgICAgIG5fZW50cmllcyArPSAxOworICAgIH0KKworICBjbG9zZWRpciAoZGlyaCk7CisKKyAgKmVudHJpZXNfcCA9IGVudHJpZXM7CisgICpuX2VudHJpZXNfcCA9IG5fZW50cmllczsKK30KKworc3RhdGljIFNvY2tldFN0YXR1cworb3Blbl9zb2NrZXQgKFNvY2tldEVudHJ5ICpzZSkKK3sKKyAgaW50IHJldDsKKyAgc3RydWN0IHNvY2thZGRyX3VuIHNhZGRyOworCisgIGlmIChzZS0+bl9yZXRyaWVzID4gNSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBnaXZpbmcgdXAgb24gc29ja2V0ICVzIGFmdGVyIHNldmVyYWwgcmV0cmllczsgdW5hYmxlIHRvIGRldGVybWluZSBzb2NrZXQncyBzdGF0dXNcbiIsCisgICAgICAgICAgICAgICBzZS0+bmFtZSk7CisgICAgICByZXR1cm4gU09DS0VUX0ZBSUxFRF9UT19IQU5ETEU7CisgICAgfQorCisgIHNlLT5uX3JldHJpZXMgKz0gMTsKKworICBzZS0+ZmQgPSBzb2NrZXQgKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHNlLT5mZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV2FybmluZzogZmFpbGVkIHRvIG9wZW4gYSBzb2NrZXQgdG8gdXNlIGZvciBjb25uZWN0aW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIFNPQ0tFVF9VTktOT1dOOworICAgIH0KKworICBpZiAoZmNudGwgKHNlLT5mZCwgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IGZhaWxlZCBzZXQgc29ja2V0ICVzIG5vbmJsb2NraW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHNlLT5uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBTT0NLRVRfVU5LTk9XTjsKKyAgICB9CisKKworICBtZW1zZXQgKCZzYWRkciwgJ1wwJywgc2l6ZW9mIChzYWRkcikpOyAvKiBudWwtdGVybWluYXRlcyB0aGUgc3VuX3BhdGggKi8KKworICBzYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RybmNweSAoc2FkZHIuc3VuX3BhdGgsIHNlLT5uYW1lLCBzaXplb2YgKHNhZGRyLnN1bl9wYXRoKSAtIDEpOworCisgIGRvCisgICAgeworICAgICAgcmV0ID0gY29ubmVjdCAoc2UtPmZkLCAoc3RydWN0IHNvY2thZGRyKikgJnNhZGRyLCBzaXplb2YgKHNhZGRyKSk7CisgICAgfQorICB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKHJldCA+PSAwKQorICAgIHJldHVybiBTT0NLRVRfQUxJVkU7CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKGVycm5vKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRUlOUFJPR1JFU1M6CisgICAgICAgIGNhc2UgRUFHQUlOOgorICAgICAgICAgIHJldHVybiBTT0NLRVRfVU5LTk9XTjsKKyAgICAgICAgY2FzZSBFQ09OTlJFRlVTRUQ6CisgICAgICAgICAgcmV0dXJuIFNPQ0tFVF9ERUFEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IHVuZXhwZWN0ZWQgZXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHNlLT5uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICByZXR1cm4gU09DS0VUX0ZBSUxFRF9UT19IQU5ETEU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9zb2NrZXRzIChTb2NrZXRFbnRyeSAqKmVudHJpZXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBuX2VudHJpZXMpCit7CisgIGludCBpOworICBpbnQgbl91bmtub3duOworCisgIG5fdW5rbm93biA9IDA7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9lbnRyaWVzKQorICAgIHsKKyAgICAgIFNvY2tldEVudHJ5ICpzZTsKKyAgICAgIFNvY2tldFN0YXR1cyBzdGF0dXM7CisKKyAgICAgIHNlID0gZW50cmllc1tpXTsKKyAgICAgICsraTsKKworICAgICAgaWYgKHNlLT5mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3IsIHNvY2tldCBoYXMgZmQgIGtlcHQgb3BlbiB3aGlsZSBzdGF0dXMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzZS0+c3RhdHVzKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPnN0YXR1cyAhPSBTT0NLRVRfVU5LTk9XTikKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHN0YXR1cyA9IG9wZW5fc29ja2V0IChzZSk7CisKKyAgICAgIHN3aXRjaCAoc3RhdHVzKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU09DS0VUX0RFQUQ6CisgICAgICAgICAgY2xlYW5lZF9jb3VudCArPSAxOworICAgICAgICAgIGlmICh1bmxpbmsgKHNlLT5uYW1lKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IEZhaWxlZCB0byBkZWxldGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzZS0+bmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgICAgICAgICAgc2UtPnN0YXR1cyA9IFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlLT5zdGF0dXMgPSBTT0NLRVRfVU5MSU5LRUQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTT0NLRVRfQUxJVkU6CisgICAgICAgICAgYWxpdmVfY291bnQgKz0gMTsKKyAgICAgICAgICAvKiBGQUxMIFRIUlUgKi8KKworICAgICAgICBjYXNlIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOgorICAgICAgICBjYXNlIFNPQ0tFVF9VTktOT1dOOgorICAgICAgICAgIHNlLT5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTT0NLRVRfVU5MSU5LRUQ6CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN0YXR1cyBmcm9tIG9wZW5fc29ja2V0KCksIHNob3VsZCBub3QgaGFwcGVuXG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPmZkID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZSAoc2UtPmZkKTsKKyAgICAgICAgICBzZS0+ZmQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2UtPnN0YXR1cyA9PSBTT0NLRVRfVU5LTk9XTikKKyAgICAgICAgbl91bmtub3duICs9IDE7CisgICAgfQorCisgIHJldHVybiBuX3Vua25vd24gPT0gMDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFuX2RpciAoY29uc3QgY2hhciAqZGlyKQoreworICBTb2NrZXRFbnRyeSAqKmVudHJpZXM7CisgIGludCBuX2VudHJpZXM7CisKKyAgcmVhZF9zb2NrZXRzIChkaXIsICZlbnRyaWVzLCAmbl9lbnRyaWVzKTsKKworICAvKiBvcGVuX3NvY2tldCgpIHdpbGwgZmFpbCBjb25jbHVzaXZlbHkgYWZ0ZXIKKyAgICogc2V2ZXJhbCByZXRyaWVzLCBzbyB0aGlzIGxvb3AgaXMgZ3VhcmFudGVlZAorICAgKiB0byB0ZXJtaW5hdGUgZXZlbnR1YWxseQorICAgKi8KKyAgd2hpbGUgKCFoYW5kbGVfc29ja2V0cyAoZW50cmllcywgbl9lbnRyaWVzKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gZGV0ZXJtaW5lIHN0YXRlIG9mIHNvbWUgc29ja2V0cywgcmV0cnlpbmcgaW4gMiBzZWNvbmRzXG4iKTsKKyAgICAgIHNsZWVwICgyKTsKKyAgICB9CisKKyAgdW5oYW5kbGVkX2NvdW50ICs9IChuX2VudHJpZXMgLSBhbGl2ZV9jb3VudCAtIGNsZWFuZWRfY291bnQpOworCisgIGZyZWVfc29ja2V0X2VudHJpZXMgKGVudHJpZXMsIG5fZW50cmllcyk7Cit9CisKKyNlbmRpZiAvKiBBRl9VTklYICovCisKK3N0YXRpYyB2b2lkCit1c2FnZSAoaW50IGVjb2RlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJkYnVzLWNsZWFudXAtc29ja2V0cyBbLS12ZXJzaW9uXSBbLS1oZWxwXSA8c29ja2V0ZGlyPlxuIik7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIFNvY2tldCBDbGVhbnVwIFV0aWxpdHkgJXNcbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy5cbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAyIE1pY2hhZWwgTWVla3NcbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgVkVSU0lPTik7CisgIGV4aXQgKDApOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisgIGludCBzYXdfZG91YmxlZGFzaDsKKyAgY29uc3QgY2hhciAqZGlybmFtZTsKKworICBzYXdfZG91YmxlZGFzaCA9IEZBTFNFOworICBkaXJuYW1lID0gTlVMTDsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgYXJnYykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLWhlbHAiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItaCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi0/IikgPT0gMCkKKyAgICAgICAgdXNhZ2UgKDApOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXZlcnNpb24iKSA9PSAwKQorICAgICAgICB2ZXJzaW9uICgpOworICAgICAgZWxzZSBpZiAoIXNhd19kb3VibGVkYXNoKQorCXsKKyAgICAgICAgICBpZiAoc3RyY21wIChhcmcsICItLSIpID09IDApCisgICAgICAgICAgICBzYXdfZG91YmxlZGFzaCA9IFRSVUU7CisgICAgICAgICAgZWxzZSBpZiAoKmFyZyA9PSAnLScpCisgICAgICAgICAgICB1c2FnZSAoMSk7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRpcm5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1jbGVhbnVwLXNvY2tldHMgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBkaXJlY3RvcnkgbmFtZVxuIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGlybmFtZSA9IGFyZzsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIERlZmF1bHQgdG8gc2Vzc2lvbiBzb2NrZXQgZGlyLCB1c3VhbGx5IC90bXAgKi8KKyAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKKyAgICBkaXJuYW1lID0gREJVU19TRVNTSU9OX1NPQ0tFVF9ESVI7CisKKyNpZmRlZiBBRl9VTklYCisgIGNsZWFuX2RpciAoZGlybmFtZSk7CisKKyAgcHJpbnRmICgiQ2xlYW5lZCB1cCAlZCBzb2NrZXRzIGluICVzOyAlZCBzb2NrZXRzIGFyZSBzdGlsbCBpbiB1c2U7ICVkIGluIHVua25vd24gc3RhdGVcbiIsCisgICAgICAgICAgY2xlYW5lZF9jb3VudCwgZGlybmFtZSwgYWxpdmVfY291bnQsIHVuaGFuZGxlZF9jb3VudCk7CisjZWxzZQorICBwcmludGYgKCJUaGlzIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFVOSVggZG9tYWluIHNvY2tldHMsIHNvIGRidXMtY2xlYW51cC1zb2NrZXRzIGRvZXMgbm90aGluZ1xuIik7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rvb2xzL2RidXMtbGF1bmNoLXdpbi5jIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1sYXVuY2gtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0YmYwZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rvb2xzL2RidXMtbGF1bmNoLXdpbi5jCkBAIC0wLDAgKzEsMTcwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbGF1bmNoLXdpbi5jICBkYnVzLWxhdW5jaCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmbmRlZiBVTklDT0RFCisjZGVmaW5lIFVOSUNPREUgMQorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qIFNhdmUgc3RyaW5nIGZ1bmN0aW9ucy4gIEluc3RlYWQgb2YgZmlndXJpbmcgb3V0IHRoZSBleGFjdCBfTVNDX1ZFUgorICAgdGhhdCB3b3JrLCBvdmVycmlkZSBmb3IgZXZlcnlib2R5LiAgKi8KKworI2RlZmluZSBlcnJub190IGludAorI2RlZmluZSB3Y3NjYXRfcyBteV93Y3NjYXRfcworI2RlZmluZSB3Y3NjcHlfcyBteV93Y3NjcHlfcworCitzdGF0aWMgZXJybm9fdAord2NzY2F0X3MgKHdjaGFyX3QgKmRlc3QsIHNpemVfdCBzaXplLCB3Y2hhcl90ICpzcmMpIAoreworICBhc3NlcnQgKHNpemVvZiAod2NoYXJfdCkgKiAod2NzbGVuIChkZXN0KSArIHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjYXQgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBlcnJub190Cit3Y3NjcHlfcyAod2NoYXJfdCAqZGVzdCwgc2l6ZV90IHNpemUsIHdjaGFyX3QgKnNyYykKK3sKKyAgYXNzZXJ0IChzaXplb2YgKHdjaGFyX3QpICogKHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjcHkgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisvKiBUT0RPICh0bCk6IFRoaXMgV2luZG93cyB2ZXJzaW9uIG9mIGRidXMtbGF1bmNoIGlzIGN1cnJldGx5IHJhdGhlcgorICogcG9pbnRsZXNzIGFzIGl0IGRvZXNuJ3QgdGFrZSB0aGUgc2FtZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhcyB0aGUKKyAqIFVOSVggZGJ1cy1sYXVuY2ggZG9lcy4gQSBtYWluIHBvaW50IG9mIHRoZSBkYnVzLWxhdW5jaCBjb21tYW5kIGlzCisgKiB0byBwYXNzIGl0IGZvciBpbnN0YW5jZSBhIC0tY29uZmlnLWZpbGUgb3B0aW9uIHRvIG1ha2UgdGhlIHN0YXJ0ZWQKKyAqIGRidXMtZGFlbW9uIHVzZSB0aGF0IGNvbmZpZyBmaWxlLgorICogCisgKiBUaGlzIHZlcnNpb24gYWxzbyBkb2Vzbid0IHByaW50IG91dCBhbnkgaW5mb3JtYXRpb24sIHdoaWNoIGlzIGEKKyAqIG1haW4gcG9pbnQgb2YgdGhlIFVOSVggb25lLiBJdCBzaG91bGQgYXQgbGVhc3Qgc3VwcG9ydCB0aGUKKyAqIC0tc2gtc3ludGF4IG9wdGlvbiwgYW5kIG1heWJlIGFsc28gYSAtLWNtZC1zeW50YXggdG8gcHJpbnQgb3V0IHRoZQorICogdmFyaWFibGUgc2V0dGluZ3MgaW4gY21kLmV4ZSBzeW50YXg/CisgKiAKKyAqIE5PVEUgKHJoKTogVGhlIG1haW4gdGFzayBvZiBkYnVzLWxhdW5jaCBpcyAoZnJvbSB0aGUgbWFuIHBhZ2UpIHRvIHN0YXJ0IAorICogYSBzZXNzaW9uIGJ1cyBhbmQgdGhpcyBpcyBhcmNoaWV2ZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50aW9uLiAKKyAqIAorICogQWRkaXRpb25hbCBvbiB3aW5kb3dzIHRoZSBzZXNzaW9uIGJ1cyBzdGFydGluZyBpbiBub3QgaW50ZWdyYXRlZCAKKyAqIGludG8gdGhlIGxvZ29uIHByb2Nlc3MsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFueSAtLXN5bnRheCBvcHRpb24uIAorICogSW4gZmFjdCAoYXQgbGVhc3QgZm9yIGtkZSBvbiB3aW5kb3dzKSB0aGUgc2Vzc2lvbiBidXMgaXMgYXV0b3N0YXJ0ZWQgCisgKiB3aXRoIHRoZSBmaXJzdCBhcHBsaWNhdGlvbiByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBidXMuIAorICoKKyAqLworCisjZGVmaW5lIEFVVE9fQUNUSVZBVEVfQ09OU09MRV9XSEVOX1ZFUkJPU0VfTU9ERSAxCisKKyNkZWZpbmUgRElNKHgpIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisjZGVmaW5lIFdDU1RSSU5HSUZZXyh4KSBMICMjIHgKKyNkZWZpbmUgV0NTVFJJTkdJRlkoeCkgV0NTVFJJTkdJRllfKHgpCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB3Y2hhcl90IGRidXNEYWVtb25QYXRoW01BWF9QQVRIICogMiArIDFdOworICB3Y2hhcl90IGNvbW1hbmRbTUFYX1BBVEggKiAyICsgMV07CisgIHdjaGFyX3QgKnA7CisgIHdjaGFyX3QgKmRhZW1vbl9uYW1lOworICBpbnQgcmVzdWx0OworICBpbnQgc2hvd0NvbnNvbGUgPSAwOworI2lmZGVmIERCVVNfV0lOQ0UKKyAgY2hhciAqcyA9IE5VTEw7CisjZWxzZQorICBjaGFyICpzID0gZ2V0ZW52KCJEQlVTX1ZFUkJPU0UiKTsKKyNlbmRpZgorICBpbnQgdmVyYm9zZSA9IHMgJiYgKnMgIT0gJ1wwJyA/IDEgOiAwOworCisgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisgIFNUQVJUVVBJTkZPVyBzaTsKKyAgQk9PTCBpbmhlcml0ID0gVFJVRTsKKyAgRFdPUkQgZmxhZ3MgPSAwOworCisjaWZkZWYgQVVUT19BQ1RJVkFURV9DT05TT0xFX1dIRU5fVkVSQk9TRV9NT0RFCisgIGlmICh2ZXJib3NlKQorICAgICAgc2hvd0NvbnNvbGUgPSAxOyAKKyNlbmRpZgorICBHZXRNb2R1bGVGaWxlTmFtZVcgKE5VTEwsIGRidXNEYWVtb25QYXRoLCBESU0gKGRidXNEYWVtb25QYXRoKSk7CisgIAorICBkYWVtb25fbmFtZSA9IFdDU1RSSU5HSUZZKERCVVNfREFFTU9OX05BTUUpIEwiLmV4ZSI7CisgIAorICBpZiAoKHAgPSB3Y3NyY2hyIChkYnVzRGFlbW9uUGF0aCwgTCdcXCcpKSkgCisgICAgeworICAgICAgcFsxXSA9IEwnXDAnOworICAgICAgd2NzY2F0X3MgKGRidXNEYWVtb25QYXRoLCBzaXplb2YgKGRidXNEYWVtb25QYXRoKSwgZGFlbW9uX25hbWUpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJlcnJvcjogY291bGQgbm90IGV4dHJhY3QgcGF0aCBmcm9tIGN1cnJlbnQgIgorICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbnMgbW9kdWxlIGZpbGVuYW1lXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0gCisKKyNpZmRlZiBEQlVTX1dJTkNFCisgICAvKiBXaW5kb3dzIENFIGhhcyBhIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbiBvZiBjbWRsaW5lOiBTdGFydCB3aXRoIGFyZ3ZbMV0uICAqLworICAgd2NzY3B5X3MgKGNvbW1hbmQsIHNpemVvZiAoY29tbWFuZCksIEwiLS1zZXNzaW9uIik7CisgICBpZiAodmVyYm9zZSkKKyAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWxzICVsc1xuIiwgZGJ1c0RhZW1vblBhdGgsIGNvbW1hbmQpOworI2Vsc2UKKyAgIGNvbW1hbmRbMF0gPSBMJ1wwJzsKKyAgIC8qIFdpbmRvd3MgQ0UgaGFzIGEgZGlmZmVyZW50IGludGVycHJldGF0aW9uIG9mIGNtZGxpbmU6IFN0YXJ0IHdpdGggYXJndlsxXS4gICovCisgICB3Y3NjcHlfcyAoY29tbWFuZCwgc2l6ZW9mIChjb21tYW5kKSwgZGJ1c0RhZW1vblBhdGgpOworICAgd2NzY2F0X3MgKGNvbW1hbmQsIHNpemVvZiAoY29tbWFuZCksIEwiIC0tc2Vzc2lvbiIpOworICAgaWYgKHZlcmJvc2UpCisgICAgIGZwcmludGYgKHN0ZGVyciwgIiVsc1xuIiwgY29tbWFuZCk7CisjZW5kaWYKKyAgCisgIG1lbXNldCAoJnNpLCAwLCBzaXplb2YgKHNpKSk7CisgIG1lbXNldCAoJnBpLCAwLCBzaXplb2YgKHBpKSk7CisgIHNpLmNiID0gc2l6ZW9mIChzaSk7CisgIAorICBpZiAodmVyYm9zZSkKKyAgICBmbGFncyB8PSBDUkVBVEVfTkVXX0NPTlNPTEU7CisKKyNpZmRlZiBEQlVTX1dJTkNFCisgIGluaGVyaXQgPSBGQUxTRTsKKyNlbHNlCisgIGZsYWdzIHw9IE5PUk1BTF9QUklPUklUWV9DTEFTUzsKKyAgaWYgKCF2ZXJib3NlKQorICAgIGZsYWdzIHw9IERFVEFDSEVEX1BST0NFU1M7CisjZW5kaWYKKworICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzVyAoZGJ1c0RhZW1vblBhdGgsIGNvbW1hbmQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0LCBmbGFncywgMCwgMCwgJnNpLCAmcGkpOworCisgIGlmIChyZXN1bHQgPT0gMCkgCisgICAgeworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkIG5vdCBzdGFydCAiIERCVVNfREFFTU9OX05BTUUgIi4gZXJyb3I9JWRcbiIsCisgICAgICAgICAgICAgICAgIEdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gNDsKKyAgICB9CisgICAKKyAgQ2xvc2VIYW5kbGUgKHBpLmhQcm9jZXNzKTsKKyAgQ2xvc2VIYW5kbGUgKHBpLmhUaHJlYWQpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMgYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLWxhdW5jaC14MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM0NGFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1sYXVuY2guaCAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnb0BrZGUub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1sYXVuY2guaCIKKworI2lmZGVmIERCVVNfQlVJTERfWDExCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorCitEaXNwbGF5ICp4ZGlzcGxheSA9IE5VTEw7CitzdGF0aWMgQXRvbSBzZWxlY3Rpb25fYXRvbTsKK3N0YXRpYyBBdG9tIGFkZHJlc3NfYXRvbTsKK3N0YXRpYyBBdG9tIHBpZF9hdG9tOworCitzdGF0aWMgaW50Cit4X2lvX2Vycm9yX2hhbmRsZXIgKERpc3BsYXkgKnhkaXNwbGF5KQoreworICB2ZXJib3NlICgiWCBJTyBlcnJvclxuIik7CisgIGtpbGxfYnVzX2FuZF9leGl0ICgwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcHJlZml4IChjaGFyICpzLAorICAgICAgICAgICAgICAgY2hhciAqcHJlZml4KQoreworICBpbnQgcGxlbjsKKworICBwbGVuID0gc3RybGVuIChwcmVmaXgpOworCisgIGlmIChzdHJuY21wIChzLCBwcmVmaXgsIHBsZW4pID09IDApCisgICAgeworICAgICAgbWVtbW92ZSAocywgcyArIHBsZW4sIHN0cmxlbiAocykgLSBwbGVuICsgMSk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2dldF9ob21lZGlyICh2b2lkKQoreworICBjb25zdCBjaGFyICpob21lOworICAKKyAgaG9tZSA9IGdldGVudiAoIkhPTUUiKTsKKyAgaWYgKGhvbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB0cnkgZnJvbSB0aGUgdXNlciBkYXRhYmFzZSAqLworICAgICAgc3RydWN0IHBhc3N3ZCAqdXNlciA9IGdldHB3dWlkIChnZXR1aWQoKSk7CisgICAgICBpZiAodXNlciAhPSBOVUxMKQorICAgICAgICBob21lID0gdXNlci0+cHdfZGlyOworICAgIH0KKworICBpZiAoaG9tZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IGdldCB1c2VyIGhvbWUgZGlyZWN0b3J5XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gaG9tZTsKK30KKworI2RlZmluZSBEQlVTX0RJUiAiLmRidXMiCisjZGVmaW5lIERCVVNfU0VTU0lPTl9CVVNfRElSICJzZXNzaW9uLWJ1cyIKKworc3RhdGljIGNoYXIgKgorZ2V0X3Nlc3Npb25fZmlsZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgcHJlZml4W10gPSAiLyIgREJVU19ESVIgIi8iIERCVVNfU0VTU0lPTl9CVVNfRElSICIvIjsKKyAgY29uc3QgY2hhciAqbWFjaGluZTsKKyAgY29uc3QgY2hhciAqaG9tZTsKKyAgY2hhciAqZGlzcGxheTsKKyAgY2hhciAqcmVzdWx0OworICBjaGFyICpwOworCisgIG1hY2hpbmUgPSBnZXRfbWFjaGluZV91dWlkICgpOworICBpZiAobWFjaGluZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGRpc3BsYXkgPSB4c3RyZHVwIChnZXRlbnYgKCJESVNQTEFZIikpOworICBpZiAoZGlzcGxheSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmJvc2UgKCJYMTEgaW50ZWdyYXRpb24gZGlzYWJsZWQgYmVjYXVzZSBYMTEgaXMgbm90IHJ1bm5pbmdcbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIHJlbW92ZSB0aGUgc2NyZWVuIHBhcnQgb2YgdGhlIGRpc3BsYXkgbmFtZSAqLworICBwID0gc3RycmNociAoZGlzcGxheSwgJzonKTsKKyAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKCA7ICpwOyArK3ApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJy4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIC8qIE5vdGUgdGhhdCB3ZSBsZWF2ZSB0aGUgaG9zdG5hbWUgaW4gdGhlIGRpc3BsYXkgbW9zdCBvZiB0aGUKKyAgICogdGltZS4gVGhlIGlkZWEgaXMgdGhhdCB3ZSB3YW50IHRvIGJlIHBlci0obWFjaGluZSxkaXNwbGF5LHVzZXIpCisgICAqIHRyaXBsZXQgdG8gYmUgZXh0cmEtc3VyZSB3ZSBnZXQgYSBidXMgd2UgY2FuIGNvbm5lY3QgdG8uIElkZWFsbHkKKyAgICogd2UnZCByZWNvZ25pemUgd2hlbiB0aGUgaG9zdG5hbWUgbWF0Y2hlcyB0aGUgbWFjaGluZSB3ZSdyZSBvbiBpbgorICAgKiBhbGwgY2FzZXM7IHdlIGRvIHRyeSB0byBkcm9wIGxvY2FsaG9zdCBhbmQgbG9jYWxob3N0LmxvY2FsZG9tYWluCisgICAqIGFzIGEgc3BlY2lhbCBjb21tb24gY2FzZSBzbyB0aGF0IGFsdGVybmF0ZSBzcGVsbGluZ3Mgb2YgRElTUExBWQorICAgKiBkb24ndCByZXN1bHQgaW4gZXh0cmEgYnVzIGluc3RhbmNlcy4KKyAgICoKKyAgICogV2UgYWxzbyBraWxsIHRoZSAiOiIgaWYgdGhlcmUncyBub3RoaW5nIGluIGZyb250IG9mIGl0LiBUaGlzCisgICAqIGF2b2lkcyBhbiB1Z2x5IGRvdWJsZSB1bmRlcnNjb3JlIGluIHRoZSBmaWxlbmFtZS4KKyAgICovCisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICJsb2NhbGhvc3QubG9jYWxkb21haW46Iik7CisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICJsb2NhbGhvc3Q6Iik7CisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICI6Iik7CisKKyAgLyogcmVwbGFjZSB0aGUgOiBpbiB0aGUgZGlzcGxheSB3aXRoIF8gaWYgdGhlIDogaXMgc3RpbGwgdGhlcmUuCisgICAqIHVzZSBfIGluc3RlYWQgb2YgLSBzaW5jZSBpdCBjYW4ndCBiZSBpbiBob3N0bmFtZXMuCisgICAqLworICBmb3IgKHAgPSBkaXNwbGF5OyAqcDsgKytwKQorICAgIHsKKyAgICAgIGlmICgqcCA9PSAnOicpCisgICAgICAgICpwID0gJ18nOworICAgIH0KKyAgCisgIGhvbWUgPSBnZXRfaG9tZWRpciAoKTsKKyAgCisgIHJlc3VsdCA9IG1hbGxvYyAoc3RybGVuIChob21lKSArIHN0cmxlbiAocHJlZml4KSArIHN0cmxlbiAobWFjaGluZSkgKworICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoZGlzcGxheSkgKyAyKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICAgIGZyZWUgKGRpc3BsYXkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHN0cmNweSAocmVzdWx0LCBob21lKTsKKyAgc3RyY2F0IChyZXN1bHQsIHByZWZpeCk7CisgIHN0cmNhdCAocmVzdWx0LCBtYWNoaW5lKTsKKyAgc3RyY2F0IChyZXN1bHQsICItIik7CisgIHN0cmNhdCAocmVzdWx0LCBkaXNwbGF5KTsKKyAgZnJlZSAoZGlzcGxheSk7CisKKyAgdmVyYm9zZSAoInNlc3Npb24gZmlsZTogJXNcbiIsIHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitlbnN1cmVfc2Vzc2lvbl9kaXJlY3RvcnkgKHZvaWQpCit7CisgIGNvbnN0IGNoYXIgKmhvbWU7CisgIGNoYXIgKmRpcjsKKyAgCisgIGhvbWUgPSBnZXRfaG9tZWRpciAoKTsKKworICAvKiBiZSBzdXJlIHdlIGhhdmUgc3BhY2UgZm9yIC8gYW5kIG51bCAqLworICBkaXIgPSBtYWxsb2MgKHN0cmxlbiAoaG9tZSkgKyBzdHJsZW4gKERCVVNfRElSKSArIHN0cmxlbiAoREJVU19TRVNTSU9OX0JVU19ESVIpICsgMyk7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJubyBtZW1vcnlcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICAKKyAgc3RyY3B5IChkaXIsIGhvbWUpOworICBzdHJjYXQgKGRpciwgIi8iKTsKKyAgc3RyY2F0IChkaXIsIERCVVNfRElSKTsKKworICBpZiAobWtkaXIgKGRpciwgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIC8qIG9ubHkgcHJpbnQgYSB3YXJuaW5nIGhlcmUsIHdyaXRpbmcgdGhlIHNlc3Npb24gZmlsZSBpdHNlbGYgd2lsbCBmYWlsIGxhdGVyICovCisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlICVzXG4iLCBkaXIpOworICAgIH0KKworICBzdHJjYXQgKGRpciwgIi8iKTsKKyAgc3RyY2F0IChkaXIsIERCVVNfU0VTU0lPTl9CVVNfRElSKTsKKworICBpZiAobWtkaXIgKGRpciwgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIC8qIG9ubHkgcHJpbnQgYSB3YXJuaW5nIGhlcmUsIHdyaXRpbmcgdGhlIHNlc3Npb24gZmlsZSBpdHNlbGYgd2lsbCBmYWlsIGxhdGVyICovCisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlICVzXG4iLCBkaXIpOworICAgIH0KKyAgCisgIGZyZWUgKGRpcik7Cit9CisKK3N0YXRpYyBEaXNwbGF5ICoKK29wZW5feDExICh2b2lkKQoreworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICByZXR1cm4geGRpc3BsYXk7CisKKyAgeGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkgKE5VTEwpOworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJib3NlICgiQ29ubmVjdGVkIHRvIFgxMSBkaXNwbGF5ICclcydcbiIsIERpc3BsYXlTdHJpbmcgKHhkaXNwbGF5KSk7CisgICAgICBYU2V0SU9FcnJvckhhbmRsZXIgKHhfaW9fZXJyb3JfaGFuZGxlcik7CisgICAgfQorICByZXR1cm4geGRpc3BsYXk7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfeF9hdG9tcyAoRGlzcGxheSAqZGlzcGxheSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgc2VsZWN0aW9uX3ByZWZpeFtdID0gIl9EQlVTX1NFU1NJT05fQlVTX1NFTEVDVElPTl8iOworICBzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzX3ByZWZpeFtdID0gIl9EQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiOworICBzdGF0aWMgY29uc3QgY2hhciBwaWRfcHJlZml4W10gPSAiX0RCVVNfU0VTU0lPTl9CVVNfUElEIjsKKyAgc3RhdGljIGludCBpbml0ID0gRkFMU0U7CisgIGNoYXIgKmF0b21fbmFtZTsKKyAgY29uc3QgY2hhciAqbWFjaGluZTsKKyAgY2hhciAqdXNlcl9uYW1lOworICBzdHJ1Y3QgcGFzc3dkICp1c2VyOworCisgIGlmIChpbml0KQorICAgIHJldHVybiBUUlVFOworCisgIG1hY2hpbmUgPSBnZXRfbWFjaGluZV91dWlkICgpOworICBpZiAobWFjaGluZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICB1c2VyID0gZ2V0cHd1aWQgKGdldHVpZCAoKSk7CisgIGlmICh1c2VyID09IE5VTEwpCisgICAgeworICAgICAgdmVyYm9zZSAoIkNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHVzZXIgaW5mb3JtYXRpb25zOyBhYm9ydGluZyBYMTEgaW50ZWdyYXRpb24uXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHVzZXJfbmFtZSA9IHhzdHJkdXAodXNlci0+cHdfbmFtZSk7CisKKyAgYXRvbV9uYW1lID0gbWFsbG9jIChzdHJsZW4gKG1hY2hpbmUpICsgc3RybGVuICh1c2VyX25hbWUpICsgMiArCisgICAgICAgICAgICAgICAgICAgICAgTUFYIChzdHJsZW4gKHNlbGVjdGlvbl9wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYIChzdHJsZW4gKGFkZHJlc3NfcHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuIChwaWRfcHJlZml4KSkpKTsKKyAgaWYgKGF0b21fbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmJvc2UgKCJDb3VsZCBub3QgY3JlYXRlIFgxMSBhdG9tczsgYWJvcnRpbmcgWDExIGludGVncmF0aW9uLlxuIik7CisgICAgICBmcmVlICh1c2VyX25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBjcmVhdGUgdGhlIHNlbGVjdGlvbiBhdG9tICovCisgIHN0cmNweSAoYXRvbV9uYW1lLCBzZWxlY3Rpb25fcHJlZml4KTsKKyAgc3RyY2F0IChhdG9tX25hbWUsIHVzZXJfbmFtZSk7CisgIHN0cmNhdCAoYXRvbV9uYW1lLCAiXyIpOworICBzdHJjYXQgKGF0b21fbmFtZSwgbWFjaGluZSk7CisgIHNlbGVjdGlvbl9hdG9tID0gWEludGVybkF0b20gKGRpc3BsYXksIGF0b21fbmFtZSwgRkFMU0UpOworCisgIC8qIGNyZWF0ZSB0aGUgYWRkcmVzcyBwcm9wZXJ0eSBhdG9tICovCisgIHN0cmNweSAoYXRvbV9uYW1lLCBhZGRyZXNzX3ByZWZpeCk7CisgIGFkZHJlc3NfYXRvbSA9IFhJbnRlcm5BdG9tIChkaXNwbGF5LCBhdG9tX25hbWUsIEZBTFNFKTsKKworICAvKiBjcmVhdGUgdGhlIFBJRCBwcm9wZXJ0eSBhdG9tICovCisgIHN0cmNweSAoYXRvbV9uYW1lLCBwaWRfcHJlZml4KTsKKyAgcGlkX2F0b20gPSBYSW50ZXJuQXRvbSAoZGlzcGxheSwgYXRvbV9uYW1lLCBGQUxTRSk7CisKKyAgZnJlZSAoYXRvbV9uYW1lKTsKKyAgZnJlZSAodXNlcl9uYW1lKTsKKyAgaW5pdCA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQorCisvKgorICogR2V0cyB0aGUgZGFlbW9uIGFkZHJlc3MgZnJvbSB0aGUgWDExIGRpc3BsYXkuCisgKiBSZXR1cm5zIEZBTFNFIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gUmV0dXJuaW5nCisgKiBUUlVFIGRvZXMgbm90IG1lYW4gdGhlIGFkZHJlc3MgZXhpc3RzLgorICovCitpbnQKK3gxMV9nZXRfYWRkcmVzcyAoY2hhciAqKnBhZGRyZXNzLCBwaWRfdCAqcGlkLCBsb25nICp3aWQpCit7CisgIGludCByZXN1bHQ7CisgIEF0b20gdHlwZTsKKyAgV2luZG93IG93bmVyOworICBpbnQgZm9ybWF0OworICB1bnNpZ25lZCBsb25nIGl0ZW1zOworICB1bnNpZ25lZCBsb25nIGFmdGVyOworICBjaGFyICpkYXRhOworCisgICpwYWRkcmVzcyA9IE5VTEw7CisKKyAgLyogbG9jYXRlIHRoZSBzZWxlY3Rpb24gb3duZXIgKi8KKyAgb3duZXIgPSBYR2V0U2VsZWN0aW9uT3duZXIgKHhkaXNwbGF5LCBzZWxlY3Rpb25fYXRvbSk7CisgIGlmIChvd25lciA9PSBOb25lKQorICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAvKiBubyBvd25lciAqLworICBpZiAod2lkICE9IE5VTEwpCisgICAgKndpZCA9IChsb25nKSBvd25lcjsKKworICAvKiBnZXQgdGhlIGJ1cyBhZGRyZXNzICovCisgIHJlc3VsdCA9IFhHZXRXaW5kb3dQcm9wZXJ0eSAoeGRpc3BsYXksIG93bmVyLCBhZGRyZXNzX2F0b20sIDAsIDEwMjQsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEFfU1RSSU5HLCAmdHlwZSwgJmZvcm1hdCwgJml0ZW1zLCAmYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKikgJmRhdGEpOworICBpZiAocmVzdWx0ICE9IFN1Y2Nlc3MgfHwgdHlwZSA9PSBOb25lIHx8IGFmdGVyICE9IDAgfHwgZGF0YSA9PSBOVUxMIHx8IGZvcm1hdCAhPSA4KQorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAvKiBlcnJvciAqLworCisgICpwYWRkcmVzcyA9IHhzdHJkdXAgKGRhdGEpOworICBYRnJlZSAoZGF0YSk7CisKKyAgLyogZ2V0IHRoZSBQSUQgKi8KKyAgaWYgKHBpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgICpwaWQgPSAwOworICAgICAgcmVzdWx0ID0gWEdldFdpbmRvd1Byb3BlcnR5ICh4ZGlzcGxheSwgb3duZXIsIHBpZF9hdG9tLCAwLCBzaXplb2YgcGlkLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEFfQ0FSRElOQUwsICZ0eXBlLCAmZm9ybWF0LCAmaXRlbXMsICZhZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiopICZkYXRhKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gU3VjY2VzcyAmJiB0eXBlICE9IE5vbmUgJiYgYWZ0ZXIgPT0gMCAmJiBkYXRhICE9IE5VTEwgJiYgZm9ybWF0ID09IDMyKQorICAgICAgICAqcGlkID0gKHBpZF90KSAqKGxvbmcqKSBkYXRhOworICAgICAgWEZyZWUgKGRhdGEpOworICAgIH0KKworICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiBTYXZlcyB0aGUgYWRkcmVzcyBpbiB0aGUgWDExIGRpc3BsYXkuIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICogSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm5zIC0xLiBJZiB0aGUgc2VsZWN0aW9uIGFscmVhZHkgZXhpc3RzLAorICogcmV0dXJucyAxLiAoaS5lLiBhbm90aGVyIGRhZW1vbiBpcyBhbHJlYWR5IHJ1bm5pbmcpCisgKi8KK3N0YXRpYyBXaW5kb3cKK3NldF9hZGRyZXNzX2luX3gxMShjaGFyICphZGRyZXNzLCBwaWRfdCBwaWQpCit7CisgIGNoYXIgKmN1cnJlbnRfYWRkcmVzczsKKyAgV2luZG93IHdpZCA9IE5vbmU7CisgIHVuc2lnbmVkIGxvbmcgcGlkMzI7IC8qIFhsaWIgcHJvcGVydHkgZnVuY3Rpb25zIHdhbnQgX2xvbmdfIG5vdCAzMi1iaXQgZm9yIGZvcm1hdCAiMzIiICovCisgIAorICAvKiBsb2NrIHRoZSBYMTEgZGlzcGxheSB0byBtYWtlIHN1cmUgd2UncmUgZG9pbmcgdGhpcyBhdG9taWNhbGx5ICovCisgIFhHcmFiU2VydmVyICh4ZGlzcGxheSk7CisKKyAgaWYgKCF4MTFfZ2V0X2FkZHJlc3MgKCZjdXJyZW50X2FkZHJlc3MsIE5VTEwsIE5VTEwpKQorICAgIHsKKyAgICAgIC8qIGVycm9yISAqLworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChjdXJyZW50X2FkZHJlc3MgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBzb21lb25lIHNhdmVkIHRoZSBhZGRyZXNzIGluIHRoZSBtZWFudGltZSAqLworICAgICAgZnJlZSAoY3VycmVudF9hZGRyZXNzKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBDcmVhdGUgb3VyIHdpbmRvdyAqLworICB3aWQgPSBYQ3JlYXRlV2luZG93ICh4ZGlzcGxheSwgUm9vdFdpbmRvdyAoeGRpc3BsYXksIDApLCAtMjAsIC0yMCwgMTAsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBDb3B5RnJvbVBhcmVudCwgSW5wdXRPbmx5LCBDb3B5RnJvbVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCk7CisgIHZlcmJvc2UgKCJDcmVhdGVkIHdpbmRvdyAlZFxuIiwgd2lkKTsKKworICAvKiBTYXZlIHRoZSBwcm9wZXJ0eSBpbiB0aGUgd2luZG93ICovCisgIFhDaGFuZ2VQcm9wZXJ0eSAoeGRpc3BsYXksIHdpZCwgYWRkcmVzc19hdG9tLCBYQV9TVFJJTkcsIDgsIFByb3BNb2RlUmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWFkZHJlc3MsIHN0cmxlbiAoYWRkcmVzcykpOworICBwaWQzMiA9IHBpZDsKKyAgWENoYW5nZVByb3BlcnR5ICh4ZGlzcGxheSwgd2lkLCBwaWRfYXRvbSwgWEFfQ0FSRElOQUwsIDMyLCBQcm9wTW9kZVJlcGxhY2UsCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikmcGlkMzIsIDEpOworCisgIC8qIE5vdyBncmFiIHRoZSBzZWxlY3Rpb24gKi8KKyAgWFNldFNlbGVjdGlvbk93bmVyICh4ZGlzcGxheSwgc2VsZWN0aW9uX2F0b20sIHdpZCwgQ3VycmVudFRpbWUpOworCisgb3V0OgorICAvKiBVbmdyYWIgdGhlIHNlcnZlciB0byBsZXQgb3RoZXIgcGVvcGxlIHVzZSBpdCB0b28gKi8KKyAgWFVuZ3JhYlNlcnZlciAoeGRpc3BsYXkpOworCisgIC8qIEFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgdW5ncmFiIGdldHMgc2VudCB0byBYMTEgKi8KKyAgWEZsdXNoICh4ZGlzcGxheSk7CisKKyAgcmV0dXJuIHdpZDsKK30KKworLyoKKyAqIFNhdmVzIHRoZSBzZXNzaW9uIGFkZHJlc3MgaW4gc2Vzc2lvbiBmaWxlLiBSZXR1cm5zIFRSVUUgb24KKyAqIHN1Y2Nlc3MsIEZBTFNFIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIGludAorc2V0X2FkZHJlc3NfaW5fZmlsZSAoY2hhciAqYWRkcmVzcywgcGlkX3QgcGlkLCBXaW5kb3cgd2lkKQoreworICBjaGFyICpzZXNzaW9uX2ZpbGU7CisgIEZJTEUgKmY7CisKKyAgZW5zdXJlX3Nlc3Npb25fZGlyZWN0b3J5ICgpOworICBzZXNzaW9uX2ZpbGUgPSBnZXRfc2Vzc2lvbl9maWxlKCk7CisgIGlmIChzZXNzaW9uX2ZpbGUgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZiA9IGZvcGVuIChzZXNzaW9uX2ZpbGUsICJ3Iik7CisgIGZyZWUgKHNlc3Npb25fZmlsZSk7CisgIGlmIChmID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgICAgIC8qIHNvbWUga2luZCBvZiBlcnJvciAqLworICBmcHJpbnRmIChmLAorICAgICAgICAgICAiIyBUaGlzIGZpbGUgYWxsb3dzIHByb2Nlc3NlcyBvbiB0aGUgbWFjaGluZSB3aXRoIGlkICVzIHVzaW5nIFxuIgorICAgICAgICAgICAiIyBkaXNwbGF5ICVzIHRvIGZpbmQgdGhlIEQtQnVzIHNlc3Npb24gYnVzIHdpdGggdGhlIGJlbG93IGFkZHJlc3MuXG4iCisgICAgICAgICAgICIjIElmIHRoZSBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdCB3aWxsXG4iCisgICAgICAgICAgICIjIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhpcyBmaWxlLlxuIgorICAgICAgICAgICAiIyBTZWUgXCJtYW4gZGJ1cy1sYXVuY2hcIiBmb3IgbW9yZSBkZXRhaWxzLlxuIgorICAgICAgICAgICAiREJVU19TRVNTSU9OX0JVU19BRERSRVNTPSVzXG4iCisgICAgICAgICAgICJEQlVTX1NFU1NJT05fQlVTX1BJRD0lbGRcbiIKKyAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JWxkXG4iLAorICAgICAgICAgICBnZXRfbWFjaGluZV91dWlkICgpLAorICAgICAgICAgICBnZXRlbnYgKCJESVNQTEFZIiksCisgICAgICAgICAgIGFkZHJlc3MsIChsb25nKXBpZCwgKGxvbmcpd2lkKTsKKworICBmY2xvc2UgKGYpOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK3gxMV9zYXZlX2FkZHJlc3MgKGNoYXIgKmFkZHJlc3MsIHBpZF90IHBpZCwgbG9uZyAqd2lkKQoreworICBXaW5kb3cgaWQgPSBzZXRfYWRkcmVzc19pbl94MTEgKGFkZHJlc3MsIHBpZCk7CisgIGlmIChpZCAhPSBOb25lKQorICAgIHsKKyAgICAgIGlmICghc2V0X2FkZHJlc3NfaW5fZmlsZSAoYWRkcmVzcywgcGlkLCBpZCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHdpZCAhPSBOVUxMKQorICAgICAgICAqd2lkID0gKGxvbmcpIGlkOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAoreDExX2luaXQgKHZvaWQpCit7CisgIHJldHVybiBvcGVuX3gxMSAoKSAhPSBOVUxMICYmIGluaXRfeF9hdG9tcyAoeGRpc3BsYXkpOworfQorCit2b2lkCit4MTFfaGFuZGxlX2V2ZW50ICh2b2lkKQoreworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICB7ICAgICAgCisgICAgICB3aGlsZSAoWFBlbmRpbmcgKHhkaXNwbGF5KSkKKyAgICAgICAgeworICAgICAgICAgIFhFdmVudCBpZ25vcmVkOworICAgICAgICAgIFhOZXh0RXZlbnQgKHhkaXNwbGF5LCAmaWdub3JlZCk7CisgICAgICAgIH0KKyAgICB9Cit9ICAKKworI2Vsc2UKK3ZvaWQgZHVtbXlfZGJ1c19sYXVuY2hfeDExICh2b2lkKTsKKwordm9pZCBkdW1teV9kYnVzX2xhdW5jaF94MTEgKHZvaWQpIHsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90b29scy9kYnVzLWxhdW5jaC5jIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1sYXVuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmFhYzJjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1sYXVuY2guYwpAQCAtMCwwICsxLDEyMjggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1sYXVuY2guYyAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ29Aa2RlLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbGF1bmNoLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorI2luY2x1ZGUgPFgxMS9YbGliLmg+CitleHRlcm4gRGlzcGxheSAqeGRpc3BsYXk7CisjZW5kaWYKKworc3RhdGljIGNoYXIqIG1hY2hpbmVfdXVpZCA9IE5VTEw7CisKK2NvbnN0IGNoYXIqCitnZXRfbWFjaGluZV91dWlkICh2b2lkKQoreworICByZXR1cm4gbWFjaGluZV91dWlkOworfQorCitzdGF0aWMgdm9pZAorc2F2ZV9tYWNoaW5lX3V1aWQgKGNvbnN0IGNoYXIgKnV1aWRfYXJnKQoreworICBpZiAoc3RybGVuICh1dWlkX2FyZykgIT0gMzIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAibWFjaGluZSBJRCAnJXMnIGxvb2tzIGxpa2UgaXQncyB0aGUgd3JvbmcgbGVuZ3RoLCBzaG91bGQgYmUgMzIgaGV4IGRpZ2l0cyIsCisgICAgICAgICAgICAgICB1dWlkX2FyZyk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgbWFjaGluZV91dWlkID0geHN0cmR1cCAodXVpZF9hcmcpOworfQorCisjZGVmaW5lIFVVSURfTUFYTEVOIDQwCisvKiBSZWFkIHRoZSBtYWNoaW5lIHV1aWQgZnJvbSBmaWxlIGlmIG5lZWRlZC4gUmV0dXJucyBUUlVFIGlmIG1hY2hpbmVfdXVpZCBpcworICogc2V0IGFmdGVyIHRoaXMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQKK3JlYWRfbWFjaGluZV91dWlkX2lmX25lZWRlZCAodm9pZCkKK3sKKyAgRklMRSAqZjsKKyAgY2hhciB1dWlkW1VVSURfTUFYTEVOXTsKKyAgc2l6ZV90IGxlbjsKKyAgaW50IHJldCA9IEZBTFNFOworCisgIGlmIChtYWNoaW5lX3V1aWQgIT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBmID0gZm9wZW4gKERCVVNfTUFDSElORV9VVUlEX0ZJTEUsICJyIik7CisgIGlmIChmID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChmZ2V0cyAodXVpZCwgVVVJRF9NQVhMRU4sIGYpID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgbGVuID0gc3RybGVuICh1dWlkKTsKKyAgaWYgKGxlbiA8IDMyKQorICAgIGdvdG8gb3V0OworCisgIC8qIHJzdHJpcCB0aGUgcmVhZCB1dWlkICovCisgIHdoaWxlIChsZW4gPiAzMSAmJiBpc3NwYWNlKHV1aWRbbGVuIC0gMV0pKQorICAgIGxlbi0tOworCisgIGlmIChsZW4gIT0gMzIpCisgICAgZ290byBvdXQ7CisKKyAgdXVpZFtsZW5dID0gJ1wwJzsKKyAgbWFjaGluZV91dWlkID0geHN0cmR1cCAodXVpZCk7CisgIHZlcmJvc2UgKCJVSUQ6ICVzXG4iLCBtYWNoaW5lX3V1aWQpOworICByZXQgPSBUUlVFOworCitvdXQ6CisgIGZjbG9zZShmKTsKKyAgcmV0dXJuIHJldDsKK30KKworCit2b2lkCit2ZXJib3NlIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgc3RhdGljIGludCB2ZXJib3NlID0gVFJVRTsKKyAgc3RhdGljIGludCB2ZXJib3NlX2luaXR0ZWQgPSBGQUxTRTsKKyAgCisgIC8qIHRoaW5ncyBhcmUgd3JpdHRlbiBhIGJpdCBvZGRseSBoZXJlIHNvIHRoYXQKKyAgICogaW4gdGhlIG5vbi12ZXJib3NlIGNhc2Ugd2UganVzdCBoYXZlIHRoZSBvbmUKKyAgICogY29uZGl0aW9uYWwgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICovCisgIGlmICghdmVyYm9zZSkKKyAgICByZXR1cm47CisgIAorICBpZiAoIXZlcmJvc2VfaW5pdHRlZCkKKyAgICB7CisgICAgICB2ZXJib3NlID0gZ2V0ZW52ICgiREJVU19WRVJCT1NFIikgIT0gTlVMTDsKKyAgICAgIHZlcmJvc2VfaW5pdHRlZCA9IFRSVUU7CisgICAgICBpZiAoIXZlcmJvc2UpCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiJWx1OiAiLCAodW5zaWduZWQgbG9uZykgZ2V0cGlkICgpKTsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworfQorCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1sYXVuY2ggWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tc2gtc3ludGF4XSBbLS1jc2gtc3ludGF4XSBbLS1hdXRvLXN5bnRheF0gWy0tZXhpdC13aXRoLXNlc3Npb25dXG4iKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAordmVyc2lvbiAodm9pZCkKK3sKKyAgcHJpbnRmICgiRC1CdXMgTWVzc2FnZSBCdXMgTGF1bmNoZXIgJXNcbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy5cbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgVkVSU0lPTik7CisgIGV4aXQgKDApOworfQorCitjaGFyICoKK3hzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgaW50IGxlbjsKKyAgY2hhciAqY29weTsKKyAgCisgIGlmIChzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGxlbiA9IHN0cmxlbiAoc3RyKTsKKworICBjb3B5ID0gbWFsbG9jIChsZW4gKyAxKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKGNvcHksIHN0ciwgbGVuICsgMSk7CisgIAorICByZXR1cm4gY29weTsKK30KKwordHlwZWRlZiBlbnVtCit7CisgIFJFQURfU1RBVFVTX09LLCAgICAvKio8IFJlYWQgc3VjY2VlZGVkICovCisgIFJFQURfU1RBVFVTX0VSUk9SLCAvKio8IFNvbWUga2luZCBvZiBlcnJvciAqLworICBSRUFEX1NUQVRVU19FT0YgICAgLyoqPCBFT0YgcmV0dXJuZWQgKi8KK30gUmVhZFN0YXR1czsKKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfbGluZSAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICAgY2hhciAgICAgICpidWYsCisgICAgICAgICAgIHNpemVfdCAgICAgbWF4bGVuKQoreworICBzaXplX3QgYnl0ZXMgPSAwOworICBSZWFkU3RhdHVzIHJldHZhbDsKKworICBtZW1zZXQgKGJ1ZiwgJ1wwJywgbWF4bGVuKTsKKyAgbWF4bGVuIC09IDE7IC8qIGVuc3VyZSBudWwgdGVybSAqLworICAKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOyAgICAKKyAgICAgIHNpemVfdCB0b19yZWFkOworICAgICAgCisgICAgYWdhaW46CisgICAgICB0b19yZWFkID0gbWF4bGVuIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjaHVuayA9IHJlYWQgKGZkLAorICAgICAgICAgICAgICAgICAgICBidWYgKyBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgdG9fcmVhZCk7CisgICAgICBpZiAoY2h1bmsgPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgIAorICAgICAgaWYgKGNodW5rIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA9PSBSRUFEX1NUQVRVU19FT0YgJiYKKyAgICAgIGJ5dGVzID4gMCkKKyAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19PSzsKKyAgCisgIC8qIHdoYWNrIG5ld2xpbmUgKi8KKyAgaWYgKHJldHZhbCAhPSBSRUFEX1NUQVRVU19FUlJPUiAmJgorICAgICAgYnl0ZXMgPiAwICYmCisgICAgICBidWZbYnl0ZXMtMV0gPT0gJ1xuJykKKyAgICBidWZbYnl0ZXMtMV0gPSAnXDAnOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfcGlkIChpbnQgICAgICAgIGZkLAorICAgICAgICAgIHBpZF90ICAgICAqYnVmKQoreworICBzaXplX3QgYnl0ZXMgPSAwOworICBSZWFkU3RhdHVzIHJldHZhbDsKKworICByZXR2YWwgPSBSRUFEX1NUQVRVU19PSzsKKyAgCisgIHdoaWxlIChUUlVFKQorICAgIHsKKyAgICAgIHNzaXplX3QgY2h1bms7ICAgIAorICAgICAgc2l6ZV90IHRvX3JlYWQ7CisgICAgICAKKyAgICBhZ2FpbjoKKyAgICAgIHRvX3JlYWQgPSBzaXplb2YgKHBpZF90KSAtIGJ5dGVzOworCisgICAgICBpZiAodG9fcmVhZCA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFyKilidWYpICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VPRjsKKyAgICAgICAgICBicmVhazsgLyogRU9GICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgLyogY2h1bmsgPiAwICovCisJYnl0ZXMgKz0gY2h1bms7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitkb193cml0ZSAoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW47CisgIGludCByZXQ7CisgIAorICBieXRlc193cml0dGVuID0gMDsKKyAgCisgYWdhaW46CisgIAorICByZXQgPSB3cml0ZSAoZmQsICgoY29uc3QgY2hhciopYnVmKSArIGJ5dGVzX3dyaXR0ZW4sIGNvdW50IC0gYnl0ZXNfd3JpdHRlbik7CisKKyAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIGRhdGEgdG8gcGlwZSEgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7IC8qIGdpdmUgdXAsIHdlIHN1Y2sgKi8KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGJ5dGVzX3dyaXR0ZW4gKz0gcmV0OworICAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCBjb3VudCkKKyAgICBnb3RvIGFnYWluOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfcGlkIChpbnQgICBmZCwKKyAgICAgICAgICAgcGlkX3QgcGlkKQoreworICBkb193cml0ZSAoZmQsICZwaWQsIHNpemVvZiAocGlkKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3dhaXRwaWQgKHBpZF90IHBpZCkKK3sKKyAgaW50IHJldDsKKyAgCisgYWdhaW46CisgIHJldCA9IHdhaXRwaWQgKHBpZCwgTlVMTCwgMCk7CisKKyAgaWYgKHJldCA8IDAgJiYKKyAgICAgIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHBpZF90IGJ1c19waWRfdG9fa2lsbCA9IC0xOworCitzdGF0aWMgdm9pZAora2lsbF9idXModm9pZCkKK3sKKyAgdmVyYm9zZSAoIktpbGxpbmcgbWVzc2FnZSBidXMgYW5kIGV4aXRpbmcgYmFieXNpdHRlclxuIik7CisgIGtpbGwgKGJ1c19waWRfdG9fa2lsbCwgU0lHVEVSTSk7CisgIHNsZWVwICgzKTsKKyAga2lsbCAoYnVzX3BpZF90b19raWxsLCBTSUdLSUxMKTsKK30KKwordm9pZAora2lsbF9idXNfYW5kX2V4aXQgKGludCBleGl0Y29kZSkKK3sKKyAgLyogaW4gY2FzZSB0aGVzZSBwb2ludCB0byBhbnkgTkZTIG1vdW50cywgZ2V0IHJpZCBvZiB0aGVtIGltbWVkaWF0ZWx5ICovCisgIGNsb3NlICgwKTsKKyAgY2xvc2UgKDEpOworICBjbG9zZSAoMik7CisKKyAga2lsbF9idXMoKTsKKworICBleGl0IChleGl0Y29kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF92YXJpYWJsZXMgKGNvbnN0IGNoYXIgKmJ1c19hZGRyZXNzLCBwaWRfdCBidXNfcGlkLCBsb25nIGJ1c193aWQsCisJCSBpbnQgY19zaGVsbF9zeW50YXgsIGludCBib3VybmVfc2hlbGxfc3ludGF4LAorCQkgaW50IGJpbmFyeV9zeW50YXgpCit7CisgIGlmIChiaW5hcnlfc3ludGF4KQorICAgIHsKKyAgICAgIGRvX3dyaXRlICgxLCBidXNfYWRkcmVzcywgc3RybGVuIChidXNfYWRkcmVzcykgKyAxKTsKKyAgICAgIGRvX3dyaXRlICgxLCAmYnVzX3BpZCwgc2l6ZW9mIGJ1c19waWQpOworICAgICAgZG9fd3JpdGUgKDEsICZidXNfd2lkLCBzaXplb2YgYnVzX3dpZCk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmIChjX3NoZWxsX3N5bnRheCkKKyAgICB7CisgICAgICBwcmludGYgKCJzZXRlbnYgREJVU19TRVNTSU9OX0JVU19BRERSRVNTICclcyc7XG4iLCBidXNfYWRkcmVzcyk7CQorICAgICAgcHJpbnRmICgic2V0IERCVVNfU0VTU0lPTl9CVVNfUElEPSVsZDtcbiIsIChsb25nKSBidXNfcGlkKTsKKyAgICAgIGlmIChidXNfd2lkKQorICAgICAgICBwcmludGYgKCJzZXQgREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0lbGQ7XG4iLCAobG9uZykgYnVzX3dpZCk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgfQorICBlbHNlIGlmIChib3VybmVfc2hlbGxfc3ludGF4KQorICAgIHsKKyAgICAgIHByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nJXMnO1xuIiwgYnVzX2FkZHJlc3MpOworICAgICAgcHJpbnRmICgiZXhwb3J0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUztcbiIpOworICAgICAgcHJpbnRmICgiREJVU19TRVNTSU9OX0JVU19QSUQ9JWxkO1xuIiwgKGxvbmcpIGJ1c19waWQpOworICAgICAgaWYgKGJ1c193aWQpCisgICAgICAgIHByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JWxkO1xuIiwgKGxvbmcpIGJ1c193aWQpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0lc1xuIiwgYnVzX2FkZHJlc3MpOworICAgICAgcHJpbnRmICgiREJVU19TRVNTSU9OX0JVU19QSUQ9JWxkXG4iLCAobG9uZykgYnVzX3BpZCk7CisgICAgICBpZiAoYnVzX3dpZCkKKwlwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX1dJTkRPV0lEPSVsZFxuIiwgKGxvbmcpIGJ1c193aWQpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KK30KKworc3RhdGljIGludCBnb3Rfc2lnaHVwID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitzaWduYWxfaGFuZGxlciAoaW50IHNpZykKK3sKKyAgc3dpdGNoIChzaWcpCisgICAgeworI2lmZGVmIFNJR0hVUAorICAgIGNhc2UgU0lHSFVQOgorI2VuZGlmCisgICAgY2FzZSBTSUdJTlQ6CisgICAgY2FzZSBTSUdURVJNOgorICAgICAgZ290X3NpZ2h1cCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitraWxsX2J1c193aGVuX3Nlc3Npb25fZW5kcyAodm9pZCkKK3sKKyAgaW50IHR0eV9mZDsKKyAgaW50IHhfZmQ7CisgIGZkX3NldCByZWFkX3NldDsKKyAgZmRfc2V0IGVycl9zZXQ7CisgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworICBzaWdzZXRfdCBlbXB0eV9tYXNrOworICAKKyAgLyogaW5zdGFsbCBTSUdIVVAgaGFuZGxlciAqLworICBnb3Rfc2lnaHVwID0gRkFMU0U7CisgIHNpZ2VtcHR5c2V0ICgmZW1wdHlfbWFzayk7CisgIGFjdC5zYV9oYW5kbGVyID0gc2lnbmFsX2hhbmRsZXI7CisgIGFjdC5zYV9tYXNrICAgID0gZW1wdHlfbWFzazsKKyAgYWN0LnNhX2ZsYWdzICAgPSAwOworICBzaWdhY3Rpb24gKFNJR0hVUCwgICZhY3QsIE5VTEwpOworICBzaWdhY3Rpb24gKFNJR1RFUk0sICAmYWN0LCBOVUxMKTsKKyAgc2lnYWN0aW9uIChTSUdJTlQsICAmYWN0LCBOVUxMKTsKKyAgCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyAgeDExX2luaXQoKTsKKyAgaWYgKHhkaXNwbGF5ICE9IE5VTEwpCisgICAgeworICAgICAgeF9mZCA9IENvbm5lY3Rpb25OdW1iZXIgKHhkaXNwbGF5KTsKKyAgICB9CisgIGVsc2UKKyAgICB4X2ZkID0gLTE7CisjZWxzZQorICB4X2ZkID0gLTE7CisjZW5kaWYKKworICBpZiAoaXNhdHR5ICgwKSkKKyAgICB0dHlfZmQgPSAwOworICBlbHNlCisgICAgdHR5X2ZkID0gLTE7CisKKyAgaWYgKHR0eV9mZCA+PSAwKQorICAgIHZlcmJvc2UgKCJzdGRpbiBpc2F0dHkoKSwgbW9uaXRvcmluZyBpdFxuIik7CisgIGVsc2UKKyAgICB2ZXJib3NlICgic3RkaW4gd2FzIG5vdCBhIFRUWSwgbm90IG1vbml0b3JpbmcgaXRcbiIpOyAgCisgIAorICBpZiAodHR5X2ZkIDwgMCAmJiB4X2ZkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJObyB0ZXJtaW5hbCBvbiBzdGFuZGFyZCBpbnB1dCBhbmQgbm8gWCBkaXNwbGF5OyBjYW5ub3QgYXR0YWNoIG1lc3NhZ2UgYnVzIHRvIHNlc3Npb24gbGlmZXRpbWVcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICAKKyAgd2hpbGUgKFRSVUUpCisgICAgeworI2lmZGVmIERCVVNfQlVJTERfWDExCisgICAgICAvKiBEdW1wIGV2ZW50cyBvbiB0aGUgZmxvb3IsIGFuZCBsZXQKKyAgICAgICAqIElPIGVycm9yIGhhbmRsZXIgcnVuIGlmIHdlIGxvc2UKKyAgICAgICAqIHRoZSBYIGNvbm5lY3Rpb24uIEl0J3MgaW1wb3J0YW50IHRvCisgICAgICAgKiBydW4gdGhpcyBiZWZvcmUgZ29pbmcgaW50byBzZWxlY3QoKSBzaW5jZQorICAgICAgICogd2UgbWlnaHQgaGF2ZSBxdWV1ZWQgb3V0Z29pbmcgbWVzc2FnZXMgb3IKKyAgICAgICAqIGV2ZW50cy4KKyAgICAgICAqLworICAgICAgeDExX2hhbmRsZV9ldmVudCAoKTsKKyNlbmRpZgorICAgICAgCisgICAgICBGRF9aRVJPICgmcmVhZF9zZXQpOworICAgICAgRkRfWkVSTyAoJmVycl9zZXQpOworCisgICAgICBpZiAodHR5X2ZkID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBGRF9TRVQgKHR0eV9mZCwgJnJlYWRfc2V0KTsKKyAgICAgICAgICBGRF9TRVQgKHR0eV9mZCwgJmVycl9zZXQpOworICAgICAgICB9CisKKyAgICAgIGlmICh4X2ZkID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBGRF9TRVQgKHhfZmQsICZyZWFkX3NldCk7CisgICAgICAgICAgRkRfU0VUICh4X2ZkLCAmZXJyX3NldCk7CisgICAgICAgIH0KKworICAgICAgc2VsZWN0IChNQVggKHR0eV9mZCwgeF9mZCkgKyAxLAorICAgICAgICAgICAgICAmcmVhZF9zZXQsIE5VTEwsICZlcnJfc2V0LCBOVUxMKTsKKworICAgICAgaWYgKGdvdF9zaWdodXApCisgICAgICAgIHsKKyAgICAgICAgICB2ZXJib3NlICgiR290IFNJR0hVUCwgZXhpdGluZ1xuIik7CisgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDApOworICAgICAgICB9CisgICAgICAKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorICAgICAgLyogRXZlbnRzIHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSB3ZSBzZWxlY3QgYWdhaW4KKyAgICAgICAqLworICAgICAgaWYgKHhfZmQgPj0gMCkKKyAgICAgICAgdmVyYm9zZSAoIlggZmQgY29uZGl0aW9uIHJlYWRpbmcgPSAlZCBlcnJvciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBGRF9JU1NFVCAoeF9mZCwgJnJlYWRfc2V0KSwKKyAgICAgICAgICAgICAgICAgRkRfSVNTRVQgKHhfZmQsICZlcnJfc2V0KSk7CisjZW5kaWYKKworICAgICAgaWYgKHR0eV9mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKEZEX0lTU0VUICh0dHlfZmQsICZyZWFkX3NldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBieXRlc19yZWFkOworICAgICAgICAgICAgICBjaGFyIGRpc2NhcmRbNTEyXTsKKworICAgICAgICAgICAgICB2ZXJib3NlICgiVFRZIHJlYWR5IGZvciByZWFkaW5nXG4iKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSByZWFkICh0dHlfZmQsIGRpc2NhcmQsIHNpemVvZiAoZGlzY2FyZCkpOworCisgICAgICAgICAgICAgIHZlcmJvc2UgKCJSZWFkICVkIGJ5dGVzIGZyb20gVFRZIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQsIGVycm5vKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChieXRlc19yZWFkID09IDApCisgICAgICAgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDApOyAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZXNfcmVhZCA8IDAgJiYgZXJybm8gIT0gRUlOVFIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIEkgZG9uJ3QgdGhpbms7IHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgKiBzcGlubmluZyBvbiB0aGUgZmQgZm9yZXZlciB3ZSBleGl0LgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJkYnVzLWxhdW5jaDogZXJyb3IgcmVhZGluZyBmcm9tIHN0ZGluOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChGRF9JU1NFVCAodHR5X2ZkLCAmZXJyX3NldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHZlcmJvc2UgKCJUVFkgaGFzIGVycm9yIGNvbmRpdGlvblxuIik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBraWxsX2J1c19hbmRfZXhpdCAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitiYWJ5c2l0IChpbnQgICBleGl0X3dpdGhfc2Vzc2lvbiwKKyAgICAgICAgIHBpZF90IGNoaWxkX3BpZCwKKyAgICAgICAgIGludCAgIHJlYWRfYnVzX3BpZF9mZCkgIC8qIHJlYWQgcGlkIGZyb20gaGVyZSAqLworeworICBpbnQgcmV0OworICBpbnQgZGV2X251bGxfZmQ7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgdmVyYm9zZSAoImJhYnlzaXR0aW5nLCBleGl0X3dpdGhfc2Vzc2lvbiA9ICVkLCBjaGlsZF9waWQgPSAlbGQsIHJlYWRfYnVzX3BpZF9mZCA9ICVkXG4iLAorICAgICAgICAgICBleGl0X3dpdGhfc2Vzc2lvbiwgKGxvbmcpIGNoaWxkX3BpZCwgcmVhZF9idXNfcGlkX2ZkKTsKKyAgCisgIC8qIFdlIGNoZGlyICgiLyIpIHNpbmNlIHdlIGFyZSBwZXJzaXN0ZW50IGFuZCBkYWVtb24tbGlrZSwgYW5kIGZvcmsKKyAgICogYWdhaW4gc28gZGJ1cy1sYXVuY2ggY2FuIHJlYXAgdGhlIHBhcmVudC4gIEhvd2V2ZXIsIHdlIGRvbid0CisgICAqIHNldHNpZCgpIG9yIGNsb3NlIGZkIDAgYmVjYXVzZSB0aGUgaWRlYSBpcyB0byByZW1haW4gYXR0YWNoZWQKKyAgICogdG8gdGhlIHR0eSBhbmQgdGhlIFggc2VydmVyIGluIG9yZGVyIHRvIGtpbGwgdGhlIG1lc3NhZ2UgYnVzCisgICAqIHdoZW4gdGhlIHNlc3Npb24gZW5kcy4KKyAgICovCisKKyAgaWYgKGNoZGlyICgiLyIpIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgY2hhbmdlIHRvIHJvb3QgZGlyZWN0b3J5OiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIENsb3NlIHN0ZG91dC9zdGRlcnIgc28gd2UgZG9uJ3QgYmxvY2sgYW4gImV2YWwiIG9yIG90aGVyd2lzZQorICAgKiBsb2NrIHVwLiBzdGRvdXQgaXMgc3RpbGwgY2hhaW5pbmcgdGhyb3VnaCB0byBkYnVzLWxhdW5jaAorICAgKiBhbmQgaW4gdHVybiB0byB0aGUgcGFyZW50IHNoZWxsLgorICAgKi8KKyAgZGV2X251bGxfZmQgPSBvcGVuICgiL2Rldi9udWxsIiwgT19SRFdSKTsKKyAgaWYgKGRldl9udWxsX2ZkID49IDApCisgICAgeworICAgICAgaWYgKCFleGl0X3dpdGhfc2Vzc2lvbikKKyAgICAgICAgZHVwMiAoZGV2X251bGxfZmQsIDApOworICAgICAgZHVwMiAoZGV2X251bGxfZmQsIDEpOworICAgICAgcyA9IGdldGVudiAoIkRCVVNfREVCVUdfT1VUUFVUIik7CisgICAgICBpZiAocyA9PSBOVUxMIHx8ICpzID09ICdcMCcpCisgICAgICAgIGR1cDIgKGRldl9udWxsX2ZkLCAyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiAvZGV2L251bGw6ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAvKiBjb250aW51ZSwgd2h5IG5vdCAqLworICAgIH0KKyAgCisgIHJldCA9IGZvcmsgKCk7CisKKyAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZm9yaygpIGZhaWxlZCBpbiBiYWJ5c2l0dGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChyZXQgPiAwKQorICAgIHsKKyAgICAgIC8qIFBhcmVudCByZWFwcyBwcmUtZm9yayBwYXJ0IG9mIGJ1cyBkYWVtb24sIHRoZW4gZXhpdHMgYW5kIGlzCisgICAgICAgKiByZWFwZWQgc28gdGhlIGJhYnlzaXR0ZXIgaXNuJ3QgYSB6b21iaWUKKyAgICAgICAqLworCisgICAgICB2ZXJib3NlICgiPT09IEJhYnlzaXR0ZXIncyBpbnRlcm1lZGlhdGUgcGFyZW50IGNvbnRpbnVlcyBhZ2FpblxuIik7CisgICAgICAKKyAgICAgIGlmIChkb193YWl0cGlkIChjaGlsZF9waWQpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgd2FpdHBpZCgpIHdhaXRpbmcgZm9yIGJ1cyBkYWVtb24ncyBwYXJlbnRcbiIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIHZlcmJvc2UgKCJCYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudCBleGl0aW5nXG4iKTsKKyAgICAgIAorICAgICAgZXhpdCAoMCk7CisgICAgfQorCisgIC8qIENoaWxkIGNvbnRpbnVlcyAqLworICB2ZXJib3NlICgiPT09IEJhYnlzaXR0ZXIgcHJvY2VzcyBjcmVhdGVkXG4iKTsKKworICB2ZXJib3NlICgiUmVhZGluZyBQSUQgZnJvbSBidXNcbiIpOworICAgICAgCisgIHN3aXRjaCAocmVhZF9waWQgKHJlYWRfYnVzX3BpZF9mZCwgJmJ1c19waWRfdG9fa2lsbCkpCisgICAgeworICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFQURfU1RBVFVTX0VPRjoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVPRiBpbiBkYnVzLWxhdW5jaCByZWFkaW5nIFBJRCBmcm9tIGJ1cyBkYWVtb25cbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFQURfU1RBVFVTX0VSUk9SOgorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gZGJ1cy1sYXVuY2ggcmVhZGluZyBQSUQgZnJvbSBidXMgZGFlbW9uOiAlc1xuIiwKKwkgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICB2ZXJib3NlICgiR290IFBJRCAlbGQgZnJvbSBkYWVtb25cbiIsCisgICAgICAgICAgIChsb25nKSBidXNfcGlkX3RvX2tpbGwpOworICAKKyAgaWYgKGV4aXRfd2l0aF9zZXNzaW9uKQorICAgIHsKKyAgICAgIC8qIEJ1cyBpcyBub3cgc3RhcnRlZCBhbmQgbGF1bmNoZXIgaGFzIG5lZWRlZCBpbmZvOworICAgICAgICogd2UgY29ubmVjdCB0byBYIGRpc3BsYXkgYW5kIHR0eSBhbmQgd2FpdCB0bworICAgICAgICoga2lsbCBidXMgaWYgcmVxdWVzdGVkLgorICAgICAgICovCisgICAgICAKKyAgICAgIGtpbGxfYnVzX3doZW5fc2Vzc2lvbl9lbmRzICgpOworICAgIH0KKworICB2ZXJib3NlICgiQmFieXNpdHRlciBleGl0aW5nXG4iKTsKKyAgCisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAorZG9fY2xvc2Vfc3RkZXJyICh2b2lkKQoreworICBpbnQgZmQ7CisKKyAgZmZsdXNoIChzdGRlcnIpOworCisgIC8qIGRidXMtbGF1bmNoIGlzIGEgVW5peC1vbmx5IHByb2dyYW0sIHNvIHdlIGNhbiByZWx5IG9uIC9kZXYvbnVsbCBiZWluZyB0aGVyZS4KKyAgICogV2UncmUgaW5jbHVkaW5nIHVuaXN0ZC5oIGFuZCB3ZSdyZSBkZWFsaW5nIHdpdGggc2gvY3NoIGxhdW5jaCBzZXF1ZW5jZXMuLi4KKyAgICovCisgIGZkID0gb3BlbiAoIi9kZXYvbnVsbCIsIE9fUkRXUik7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnRlcm5hbCBlcnJvcjogY2Fubm90IG9wZW4gL2Rldi9udWxsOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGNsb3NlICgyKTsKKyAgaWYgKGR1cDIgKGZkLCAyKSA9PSAtMSkKKyAgICB7CisgICAgICAvKiBlcnJvcjsgd2UgY2FuJ3QgcmVwb3J0IGFuIGVycm9yIGFueW1vcmUuLi4gKi8KKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgY2xvc2UgKGZkKTsKK30KKworc3RhdGljIHZvaWQKK3Bhc3NfaW5mbyAoY29uc3QgY2hhciAqcnVucHJvZywgY29uc3QgY2hhciAqYnVzX2FkZHJlc3MsIHBpZF90IGJ1c19waWQsCisgICAgICAgICAgIGxvbmcgYnVzX3dpZCwgaW50IGNfc2hlbGxfc3ludGF4LCBpbnQgYm91cm5lX3NoZWxsX3N5bnRheCwKKyAgICAgICAgICAgaW50IGJpbmFyeV9zeW50YXgsCisgICAgICAgICAgIGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IHJlbWFpbmluZ19hcmdzKQoreworICBjaGFyICplbnZ2YXIgPSBOVUxMOworICBjaGFyICoqYXJncyA9IE5VTEw7CisKKyAgaWYgKHJ1bnByb2cpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGVudnZhciA9IG1hbGxvYyAoc3RybGVuICgiREJVU19TRVNTSU9OX0JVU19BRERSRVNTPSIpICsKKyAgICAgICAgICBzdHJsZW4gKGJ1c19hZGRyZXNzKSArIDEpOworICAgICAgYXJncyA9IG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogKChhcmdjLXJlbWFpbmluZ19hcmdzKSsyKSk7CisKKyAgICAgIGlmIChlbnZ2YXIgPT0gTlVMTCB8fCBhcmdzID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgIGFyZ3NbMF0gPSB4c3RyZHVwIChydW5wcm9nKTsKKyAgICAgIGlmICghYXJnc1swXSkKKyAgICAgICAgZ290byBvb207CisgICAgIGZvciAoaSA9IDE7IGkgPD0gKGFyZ2MtcmVtYWluaW5nX2FyZ3MpOyBpKyspCisgICAgICB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFyZ3ZbcmVtYWluaW5nX2FyZ3MraS0xXSkrMTsKKyAgICAgICAgYXJnc1tpXSA9IG1hbGxvYyAobGVuKTsKKyAgICAgICAgaWYgKCFhcmdzW2ldKQorICAgICAgICAgIGdvdG8gb29tOworICAgICAgICBzdHJuY3B5IChhcmdzW2ldLCBhcmd2W3JlbWFpbmluZ19hcmdzK2ktMV0sIGxlbik7CisgICAgICAgfQorICAgICBhcmdzW2ldID0gTlVMTDsKKworICAgICBzdHJjcHkgKGVudnZhciwgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iKTsKKyAgICAgc3RyY2F0IChlbnZ2YXIsIGJ1c19hZGRyZXNzKTsKKyAgICAgcHV0ZW52IChlbnZ2YXIpOworCisgICAgIGV4ZWN2cCAocnVucHJvZywgYXJncyk7CisgICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkbid0IGV4ZWMgJXM6ICVzXG4iLCBydW5wcm9nLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgZXhpdCAoMSk7CisgICAgfQorICAgZWxzZQorICAgIHsKKyAgICAgIHByaW50X3ZhcmlhYmxlcyAoYnVzX2FkZHJlc3MsIGJ1c19waWQsIGJ1c193aWQsIGNfc2hlbGxfc3ludGF4LAorICAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCwgYmluYXJ5X3N5bnRheCk7CisgICAgfQorICB2ZXJib3NlICgiZGJ1cy1sYXVuY2ggZXhpdGluZ1xuIik7CisKKyAgZmZsdXNoIChzdGRvdXQpOworICBmZmx1c2ggKHN0ZGVycik7CisgIGNsb3NlICgxKTsKKyAgY2xvc2UgKDIpOworICBleGl0ICgwKTsKK29vbToKKyAgaWYgKGVudnZhcikKKyAgICBmcmVlIChlbnZ2YXIpOworCisgIGlmIChhcmdzKQorICAgIGZyZWUgKGFyZ3MpOworCisgIGZwcmludGYgKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkhIik7CisgIGV4aXQgKDEpOworfQorCisjZGVmaW5lIFJFQURfRU5EICAwCisjZGVmaW5lIFdSSVRFX0VORCAxCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICpwcmV2X2FyZzsKKyAgY29uc3QgY2hhciAqc2huYW1lOworICBjb25zdCBjaGFyICpydW5wcm9nID0gTlVMTDsKKyAgaW50IHJlbWFpbmluZ19hcmdzID0gMDsKKyAgaW50IGV4aXRfd2l0aF9zZXNzaW9uOworICBpbnQgYmluYXJ5X3N5bnRheCA9IEZBTFNFOworICBpbnQgY19zaGVsbF9zeW50YXggPSBGQUxTRTsKKyAgaW50IGJvdXJuZV9zaGVsbF9zeW50YXggPSBGQUxTRTsKKyAgaW50IGF1dG9fc2hlbGxfc3ludGF4ID0gRkFMU0U7CisgIGludCBhdXRvbGF1bmNoID0gRkFMU0U7CisgIGludCByZXF1aXJlc19hcmcgPSBGQUxTRTsKKyAgaW50IGNsb3NlX3N0ZGVyciA9IEZBTFNFOworICBpbnQgaTsKKyAgaW50IHJldDsKKyAgaW50IGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVsyXTsKKyAgaW50IGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlWzJdOworICBpbnQgYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVsyXTsKKyAgY2hhciAqY29uZmlnX2ZpbGU7CisgIAorICBleGl0X3dpdGhfc2Vzc2lvbiA9IEZBTFNFOworICBjb25maWdfZmlsZSA9IE5VTEw7CisgIAorICBwcmV2X2FyZyA9IE5VTEw7CisgIGkgPSAxOworICB3aGlsZSAoaSA8IGFyZ2MpCisgICAgeworICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKyAKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0taGVscCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi1oIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLT8iKSA9PSAwKQorICAgICAgICB1c2FnZSAoMCk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tYXV0by1zeW50YXgiKSA9PSAwKQorICAgICAgICBhdXRvX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi1jIikgPT0gMCB8fAorICAgICAgICAgICAgICAgc3RyY21wIChhcmcsICItLWNzaC1zeW50YXgiKSA9PSAwKQorICAgICAgICBjX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi1zIikgPT0gMCB8fAorICAgICAgICAgICAgICAgc3RyY21wIChhcmcsICItLXNoLXN5bnRheCIpID09IDApCisgICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXggPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWJpbmFyeS1zeW50YXgiKSA9PSAwKQorICAgICAgICBiaW5hcnlfc3ludGF4ID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgdmVyc2lvbiAoKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1leGl0LXdpdGgtc2Vzc2lvbiIpID09IDApCisgICAgICAgIGV4aXRfd2l0aF9zZXNzaW9uID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1jbG9zZS1zdGRlcnIiKSA9PSAwKQorICAgICAgICBjbG9zZV9zdGRlcnIgPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWF1dG9sYXVuY2g9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqczsKKworICAgICAgICAgIGlmIChhdXRvbGF1bmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICItLWF1dG9sYXVuY2ggZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBhdXRvbGF1bmNoID0gVFJVRTsKKworICAgICAgICAgIHMgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK3M7CisKKyAgICAgICAgICBzYXZlX21hY2hpbmVfdXVpZCAocyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1hdXRvbGF1bmNoIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChhdXRvbGF1bmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICItLWF1dG9sYXVuY2ggZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBhdXRvbGF1bmNoID0gVFJVRTsKKworICAgICAgICAgIHNhdmVfbWFjaGluZV91dWlkIChhcmcpOworCSAgcmVxdWlyZXNfYXJnID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1hdXRvbGF1bmNoIikgPT0gMCkKKwlyZXF1aXJlc19hcmcgPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWNvbmZpZy1maWxlPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBpZiAoY29uZmlnX2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS1jb25maWctZmlsZSBnaXZlbiB0d2ljZVxuIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBjb25maWdfZmlsZSA9IHhzdHJkdXAgKGZpbGUpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIi0tY29uZmlnLWZpbGUgZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbmZpZ19maWxlID0geHN0cmR1cCAoYXJnKTsKKwkgIHJlcXVpcmVzX2FyZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorCXJlcXVpcmVzX2FyZyA9IFRSVUU7CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS0iKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb24gYCVzJyBpcyB1bmtub3duLlxuIiwgYXJnKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBydW5wcm9nID0gYXJndltpKzFdOworICAgICAgICAgICAgICByZW1haW5pbmdfYXJncyA9IGkrMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJICBydW5wcm9nID0gYXJnOworCSAgcmVtYWluaW5nX2FyZ3MgPSBpKzE7CisJICBicmVhazsKKwl9CisgICAgICAKKyAgICAgIHByZXZfYXJnID0gYXJnOworICAgICAgCisgICAgICArK2k7CisgICAgfQorICBpZiAocmVxdWlyZXNfYXJnKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50LlxuIiwgcHJldl9hcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChhdXRvX3NoZWxsX3N5bnRheCkKKyAgICB7CisgICAgICBpZiAoKHNobmFtZSA9IGdldGVudiAoIlNIRUxMIikpICE9IE5VTEwpCisgICAgICAgeworICAgICAgICAgaWYgKCFzdHJuY21wIChzaG5hbWUgKyBzdHJsZW4gKHNobmFtZSkgLSAzLCAiY3NoIiwgMykpCisgICAgICAgICAgIGNfc2hlbGxfc3ludGF4ID0gVFJVRTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICAgfQorICAgICAgZWxzZQorICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXggPSBUUlVFOworICAgIH0gIAorCisgIGlmIChleGl0X3dpdGhfc2Vzc2lvbikKKyAgICB2ZXJib3NlICgiLS1leGl0LXdpdGgtc2Vzc2lvbiBlbmFibGVkXG4iKTsKKworICBpZiAoYXV0b2xhdW5jaCkKKyAgICB7ICAgICAgCisjaWZuZGVmIERCVVNfQlVJTERfWDExCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJBdXRvbGF1bmNoIHJlcXVlc3RlZCwgYnV0IFgxMSBzdXBwb3J0IG5vdCBjb21waWxlZCBpbi5cbiIKKwkgICAgICAgIkNhbm5vdCBjb250aW51ZS5cbiIpOworICAgICAgZXhpdCAoMSk7CisjZWxzZSAvKiBEQlVTX0JVSUxEX1gxMSAqLworI2lmbmRlZiBEQlVTX0VOQUJMRV9YMTFfQVVUT0xBVU5DSAorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiWDExIGF1dG9sYXVuY2ggc3VwcG9ydCBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuXG4iKTsKKyAgICAgIGV4aXQgKDEpOworI2Vsc2UgLyogREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0ggKi8KKyAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICBwaWRfdCBwaWQ7CisgICAgICBsb25nIHdpZDsKKyAgICAgIAorICAgICAgaWYgKGdldF9tYWNoaW5lX3V1aWQgKCkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk1hY2hpbmUgVVVJRCBub3QgcHJvdmlkZWQgYXMgYXJnIHRvIC0tYXV0b2xhdW5jaFxuIik7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgdmVyYm9zZSAoIkF1dG9sYXVuY2ggZW5hYmxlZCAodXNpbmcgWDExKS5cbiIpOworICAgICAgaWYgKCFleGl0X3dpdGhfc2Vzc2lvbikKKwl7CisJICB2ZXJib3NlICgiLS1leGl0LXdpdGgtc2Vzc2lvbiBhdXRvbWF0aWNhbGx5IGVuYWJsZWRcbiIpOworCSAgZXhpdF93aXRoX3Nlc3Npb24gPSBUUlVFOworCX0KKworICAgICAgaWYgKCF4MTFfaW5pdCAoKSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJBdXRvbGF1bmNoIGVycm9yOiBYMTEgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgIGlmICgheDExX2dldF9hZGRyZXNzICgmYWRkcmVzcywgJnBpZCwgJndpZCkpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiQXV0b2xhdW5jaCBlcnJvcjogWDExIGNvbW11bmljYXRpb24gZXJyb3IuXG4iKTsKKwkgIGV4aXQgKDEpOworCX0KKworICAgICAgaWYgKGFkZHJlc3MgIT0gTlVMTCkKKwl7CisJICB2ZXJib3NlICgiZGJ1cy1kYWVtb24gaXMgYWxyZWFkeSBydW5uaW5nLiBSZXR1cm5pbmcgZXhpc3RpbmcgcGFyYW1ldGVycy5cbiIpOworCSAgcGFzc19pbmZvIChydW5wcm9nLCBhZGRyZXNzLCBwaWQsIHdpZCwgY19zaGVsbF9zeW50YXgsCisJCQkgICBib3VybmVfc2hlbGxfc3ludGF4LCBiaW5hcnlfc3ludGF4LCBhcmdjLCBhcmd2LCByZW1haW5pbmdfYXJncyk7CisJICBleGl0ICgwKTsKKwl9CisjZW5kaWYgLyogREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0ggKi8KKyAgICB9CisgIGVsc2UgaWYgKHJlYWRfbWFjaGluZV91dWlkX2lmX25lZWRlZCgpKQorICAgIHsKKyAgICAgIHgxMV9pbml0KCk7CisjZW5kaWYgLyogREJVU19CVUlMRF9YMTEgKi8KKyAgICB9CisKKworICBpZiAocGlwZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlKSA8IDAgfHwKKyAgICAgIHBpcGUgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGUpIDwgMCB8fAorICAgICAgcGlwZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGUpIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBwaXBlOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldCA9IGZvcmsgKCk7CisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBmb3JrOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChyZXQgPT0gMCkKKyAgICB7CisgICAgICAvKiBDaGlsZCAqLworI2RlZmluZSBNQVhfRkRfTEVOIDY0CisgICAgICBjaGFyIHdyaXRlX3BpZF9mZF9hc19zdHJpbmdbTUFYX0ZEX0xFTl07CisgICAgICBjaGFyIHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nW01BWF9GRF9MRU5dOworCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyAgICAgIHhkaXNwbGF5ID0gTlVMTDsKKyNlbmRpZgorCisgICAgICBpZiAoY2xvc2Vfc3RkZXJyKQorCWRvX2Nsb3NlX3N0ZGVyciAoKTsKKworICAgICAgdmVyYm9zZSAoIj09PSBCYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudCBjcmVhdGVkXG4iKTsKKworICAgICAgLyogRm9yayBvbmNlIG1vcmUgdG8gY3JlYXRlIGJhYnlzaXR0ZXIgKi8KKyAgICAgIAorICAgICAgcmV0ID0gZm9yayAoKTsKKyAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIGZvcms6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChyZXQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgLyogSW4gYmFieXNpdHRlciAqLworICAgICAgICAgIHZlcmJvc2UgKCI9PT0gQmFieXNpdHRlcidzIGludGVybWVkaWF0ZSBwYXJlbnQgY29udGludWVzXG4iKTsKKyAgICAgICAgICAKKyAgICAgICAgICBjbG9zZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisJICBjbG9zZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworICAgICAgICAgIGNsb3NlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisgICAgICAgICAgY2xvc2UgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1dSSVRFX0VORF0pOworCisgICAgICAgICAgLyogYmFieXNpdCgpIHdpbGwgZm9yayAqYWdhaW4qCisgICAgICAgICAgICogYW5kIHdpbGwgYWxzbyByZWFwIHRoZSBwcmUtZm9ya2VkIGJ1cworICAgICAgICAgICAqIGRhZW1vbgorICAgICAgICAgICAqLworICAgICAgICAgIGJhYnlzaXQgKGV4aXRfd2l0aF9zZXNzaW9uLCByZXQsCisgICAgICAgICAgICAgICAgICAgYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgfQorCisgICAgICB2ZXJib3NlICgiPT09IEJ1cyBleGVjIHByb2Nlc3MgY3JlYXRlZFxuIik7CisgICAgICAKKyAgICAgIC8qIE5vdyB3ZSBhcmUgdGhlIGJ1cyBwcm9jZXNzICh3ZWxsLCBhbG1vc3Q7CisgICAgICAgKiBkYnVzLWRhZW1vbiBpdHNlbGYgZm9ya3MgYWdhaW4pCisgICAgICAgKi8KKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgIGNsb3NlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgc3ByaW50ZiAod3JpdGVfcGlkX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgICIlZCIsIGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgc3ByaW50ZiAod3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICAiJWQiLCBidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworCisgICAgICB2ZXJib3NlICgiQ2FsbGluZyBleGVjKClcbiIpOworIAorI2lmZGVmIERCVVNfQlVJTERfVEVTVFMgCisgICAgICAvKiBleGVjIGZyb20gdGVzdGRpciAqLworICAgICAgaWYgKGdldGVudigiREJVU19VU0VfVEVTVF9CSU5BUlkiKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZXhlY2wgKFRFU1RfQlVTX0JJTkFSWSwKKyAgICAgICAgICAgICAgICAgVEVTVF9CVVNfQklOQVJZLAorICAgICAgICAgICAgICAgICAiLS1mb3JrIiwKKyAgICAgICAgICAgICAgICAgIi0tcHJpbnQtcGlkIiwgd3JpdGVfcGlkX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgICAgIi0tcHJpbnQtYWRkcmVzcyIsIHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICAgICBjb25maWdfZmlsZSA/ICItLWNvbmZpZy1maWxlIiA6ICItLXNlc3Npb24iLAorICAgICAgICAgICAgICAgICBjb25maWdfZmlsZSwgLyogaGFzIHRvIGJlIGxhc3QgaW4gdGhpcyB2YXJhcmdzIGxpc3QgKi8KKyAgICAgICAgICAgICAgICAgTlVMTCk7IAorCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSB0ZXN0IG1lc3NhZ2UgYnVzIGRhZW1vbiAlczogJXMuIFdpbGwgdHJ5IGFnYWluIHdpdGggdGhlIHN5c3RlbSBwYXRoLlxuIiwKKyAgICAgICAgICAgICAgICAgICBURVNUX0JVU19CSU5BUlksIHN0cmVycm9yIChlcnJubykpOworICAgICAgICB9CisgI2VuZGlmIC8qIERCVVNfQlVJTERfVEVTVFMgKi8KKworICAgICAgZXhlY2wgKERCVVNfREFFTU9ORElSIi9kYnVzLWRhZW1vbiIsCisgICAgICAgICAgICAgREJVU19EQUVNT05ESVIiL2RidXMtZGFlbW9uIiwKKyAgICAgICAgICAgICAiLS1mb3JrIiwKKyAgICAgICAgICAgICAiLS1wcmludC1waWQiLCB3cml0ZV9waWRfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICItLXByaW50LWFkZHJlc3MiLCB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICBjb25maWdfZmlsZSA/ICItLWNvbmZpZy1maWxlIiA6ICItLXNlc3Npb24iLAorICAgICAgICAgICAgIGNvbmZpZ19maWxlLCAvKiBoYXMgdG8gYmUgbGFzdCBpbiB0aGlzIHZhcmFyZ3MgbGlzdCAqLworICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4ZWN1dGUgbWVzc2FnZSBidXMgZGFlbW9uICVzOiAlcy4gIFdpbGwgdHJ5IGFnYWluIHdpdGhvdXQgZnVsbCBwYXRoLlxuIiwKKyAgICAgICAgICAgICAgIERCVVNfREFFTU9ORElSIi9kYnVzLWRhZW1vbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgCisgICAgICAvKgorICAgICAgICogSWYgaXQgZmFpbGVkLCB0cnkgcnVubmluZyB3aXRob3V0IGZ1bGwgUEFUSC4gIE5vdGUgdGhpcyBpcyBuZWVkZWQKKyAgICAgICAqIGJlY2F1c2UgdGhlIGJ1aWxkIHByb2Nlc3MgYnVpbGRzIHRoZSBydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuY29uZgorICAgICAgICogZmlsZSBhbmQgdGhlIGRidXMtZGFlbW9uIHdpbGwgbm90IGJlIGluIHRoZSBpbnN0YWxsIGxvY2F0aW9uIGR1cmluZworICAgICAgICogYnVpbGQgdGltZS4KKyAgICAgICAqLworICAgICAgZXhlY2xwICgiZGJ1cy1kYWVtb24iLAorICAgICAgICAgICAgICAiZGJ1cy1kYWVtb24iLAorICAgICAgICAgICAgICAiLS1mb3JrIiwKKyAgICAgICAgICAgICAgIi0tcHJpbnQtcGlkIiwgd3JpdGVfcGlkX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgIi0tcHJpbnQtYWRkcmVzcyIsIHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICBjb25maWdfZmlsZSA/ICItLWNvbmZpZy1maWxlIiA6ICItLXNlc3Npb24iLAorICAgICAgICAgICAgICBjb25maWdfZmlsZSwgLyogaGFzIHRvIGJlIGxhc3QgaW4gdGhpcyB2YXJhcmdzIGxpc3QgKi8KKyAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSBtZXNzYWdlIGJ1cyBkYWVtb246ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQYXJlbnQgKi8KKyNkZWZpbmUgTUFYX1BJRF9MRU4gNjQKKyAgICAgIHBpZF90IGJ1c19waWQ7ICAKKyAgICAgIGNoYXIgYnVzX2FkZHJlc3NbTUFYX0FERFJfTEVOXTsKKyAgICAgIGNoYXIgYnVmW01BWF9QSURfTEVOXTsKKyAgICAgIGNoYXIgKmVuZDsKKyAgICAgIGxvbmcgd2lkID0gMDsKKyAgICAgIGxvbmcgdmFsOworICAgICAgaW50IHJldDI7CisKKyAgICAgIHZlcmJvc2UgKCI9PT0gUGFyZW50IGRidXMtbGF1bmNoIGNvbnRpbnVlc1xuIik7CisgICAgICAKKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgIGNsb3NlIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZVtSRUFEX0VORF0pOworCisgICAgICB2ZXJib3NlICgiV2FpdGluZyBmb3IgYmFieXNpdHRlcidzIGludGVybWVkaWF0ZSBwYXJlbnRcbiIpOworICAgICAgCisgICAgICAvKiBJbW1lZGlhdGVseSByZWFwIHBhcmVudCBvZiBiYWJ5c2l0dGVyCisgICAgICAgKiAod2hpY2ggd2FzIGNyZWF0ZWQganVzdCBmb3IgdXMgdG8gcmVhcCkKKyAgICAgICAqLworICAgICAgaWYgKGRvX3dhaXRwaWQgKHJldCkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIHdhaXRwaWQoKSBmb3IgYmFieXNpdHRlciBpbnRlcm1lZGlhdGUgcHJvY2VzczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgdmVyYm9zZSAoIlJlYWRpbmcgYWRkcmVzcyBmcm9tIGJ1c1xuIik7CisgICAgICAKKyAgICAgIC8qIFJlYWQgdGhlIHBpcGUgZGF0YSwgcHJpbnQsIGFuZCBleGl0ICovCisgICAgICBzd2l0Y2ggKHJlYWRfbGluZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtSRUFEX0VORF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2FkZHJlc3MsIE1BWF9BRERSX0xFTikpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19PSzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRU9GIGluIGRidXMtbGF1bmNoIHJlYWRpbmcgYWRkcmVzcyBmcm9tIGJ1cyBkYWVtb25cbiIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFQURfU1RBVFVTX0VSUk9SOgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGRidXMtbGF1bmNoIHJlYWRpbmcgYWRkcmVzcyBmcm9tIGJ1cyBkYWVtb246ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKworICAgICAgdmVyYm9zZSAoIlJlYWRpbmcgUElEIGZyb20gZGFlbW9uXG4iKTsKKyAgICAgIC8qIE5vdyByZWFkIGRhdGEgKi8KKyAgICAgIHN3aXRjaCAocmVhZF9saW5lIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdLCBidWYsIE1BWF9QSURfTEVOKSkKKwl7CisJY2FzZSBSRUFEX1NUQVRVU19PSzoKKwkgIGJyZWFrOworCWNhc2UgUkVBRF9TVEFUVVNfRU9GOgorCSAgZnByaW50ZiAoc3RkZXJyLCAiRU9GIHJlYWRpbmcgUElEIGZyb20gYnVzIGRhZW1vblxuIik7CisJICBleGl0ICgxKTsKKwkgIGJyZWFrOworCWNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisJICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciByZWFkaW5nIFBJRCBmcm9tIGJ1cyBkYWVtb246ICVzXG4iLAorCQkgICBzdHJlcnJvciAoZXJybm8pKTsKKwkgIGV4aXQgKDEpOworCSAgYnJlYWs7CisJfQorCisgICAgICBlbmQgPSBOVUxMOworICAgICAgdmFsID0gc3RydG9sIChidWYsICZlbmQsIDApOworICAgICAgaWYgKGJ1ZiA9PSBlbmQgfHwgZW5kID09IE5VTEwpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIGJ1cyBQSUQgXCIlc1wiOiAlc1xuIiwKKwkJICAgYnVmLCBzdHJlcnJvciAoZXJybm8pKTsKKwkgIGV4aXQgKDEpOworCX0KKworICAgICAgYnVzX3BpZCA9IHZhbDsKKworICAgICAgY2xvc2UgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtSRUFEX0VORF0pOworCisjaWZkZWYgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gKKyAgICAgIGlmICh4ZGlzcGxheSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSgiU2F2aW5nIHgxMSBhZGRyZXNzXG4iKTsKKyAgICAgICAgICByZXQyID0geDExX3NhdmVfYWRkcmVzcyAoYnVzX2FkZHJlc3MsIGJ1c19waWQsICZ3aWQpOworICAgICAgICAgIC8qIE9ubHkgZ2V0IGFuIGV4aXN0aW5nIGRidXMgc2Vzc2lvbiB3aGVuIGF1dG9sYXVuY2hpbmcgKi8KKyAgICAgICAgICBpZiAoYXV0b2xhdW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHJldDIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIC8qIGFub3RoZXIgd2luZG93IGdvdCBhZGRlZC4gUmV0dXJuIGl0cyBhZGRyZXNzICovCisgICAgICAgICAgICAgICAgICBidXNfcGlkX3RvX2tpbGwgPSBidXNfcGlkOworICAgICAgICAgICAgICAgICAgaWYgKHgxMV9nZXRfYWRkcmVzcyAoJmFkZHJlc3MsICZidXNfcGlkLCAmd2lkKQorICAgICAgICAgICAgICAgICAgICAgICAmJiBhZGRyZXNzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlICgiZGJ1cy1kYWVtb24gaXMgYWxyZWFkeSBydW5uaW5nLiBSZXR1cm5pbmcgZXhpc3RpbmcgcGFyYW1ldGVycy5cbiIpOworICAgICAgICAgICAgICAgICAgICAgIC8qIEtpbGwgdGhlIG9sZCBidXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICBraWxsX2J1cygpOworICAgICAgICAgICAgICAgICAgICAgIHBhc3NfaW5mbyAocnVucHJvZywgYWRkcmVzcywgYnVzX3BpZCwgd2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2hlbGxfc3ludGF4LCBib3VybmVfc2hlbGxfc3ludGF4LCBiaW5hcnlfc3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MsIGFyZ3YsIHJlbWFpbmluZ19hcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAocmV0MiA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3Igc2F2aW5nIGJ1cyBpbmZvcm1hdGlvbi5cbiIpOworICAgICAgICAgICAgICAgICAgYnVzX3BpZF90b19raWxsID0gYnVzX3BpZDsKKyAgICAgICAgICAgICAgICAgIGtpbGxfYnVzX2FuZF9leGl0ICgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKiBGb3J3YXJkIHRoZSBwaWQgdG8gdGhlIGJhYnlzaXR0ZXIgKi8KKyAgICAgIHdyaXRlX3BpZCAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSwgYnVzX3BpZCk7CisgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgICBwYXNzX2luZm8gKHJ1bnByb2csIGJ1c19hZGRyZXNzLCBidXNfcGlkLCB3aWQsIGNfc2hlbGxfc3ludGF4LAorICAgICAgICAgICAgICBib3VybmVfc2hlbGxfc3ludGF4LCBiaW5hcnlfc3ludGF4LCBhcmdjLCBhcmd2LCByZW1haW5pbmdfYXJncyk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1sYXVuY2guaCBiL2RidXMtMS40LjEwL3Rvb2xzL2RidXMtbGF1bmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyMGJiOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rvb2xzL2RidXMtbGF1bmNoLmgKQEAgLTAsMCArMSw1NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWxhdW5jaC5oICBkYnVzLWxhdW5jaCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19MQVVOQ0hfSAorI2RlZmluZSBEQlVTX0xBVU5DSF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgKDEpCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAoMCkKKyNlbmRpZgorCisjdW5kZWYgIE1BWAorI2RlZmluZSBNQVgoYSwgYikgICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworI2RlZmluZSBNQVhfQUREUl9MRU4gNTEyCisKKy8qIGRlZmluZWQgaW4gZGJ1cy1sYXVuY2guYyAqLwordm9pZCB2ZXJib3NlIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitjaGFyICp4c3RyZHVwIChjb25zdCBjaGFyICpzdHIpOwordm9pZCBraWxsX2J1c19hbmRfZXhpdCAoaW50IGV4aXRjb2RlKTsKKworY29uc3QgY2hhciogZ2V0X21hY2hpbmVfdXVpZCAodm9pZCk7CisKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorLyogZGVmaW5lZCBpbiBkYnVzLWxhdW5jaC14MTEuYyAqLworaW50IHgxMV9pbml0ICh2b2lkKTsKK2ludCB4MTFfZ2V0X2FkZHJlc3MgKGNoYXIgKipwYWRkcmVzcywgcGlkX3QgKnBpZCwgbG9uZyAqd2lkKTsKK2ludCB4MTFfc2F2ZV9hZGRyZXNzIChjaGFyICphZGRyZXNzLCBwaWRfdCBwaWQsIGxvbmcgKndpZCk7Cit2b2lkIHgxMV9oYW5kbGVfZXZlbnQgKHZvaWQpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1tb25pdG9yLmMgYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLW1vbml0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRiNWMwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1tb25pdG9yLmMKQEAgLTAsMCArMSw0MDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tb25pdG9yLmMgIFV0aWxpdHkgcHJvZ3JhbSB0byBtb25pdG9yIG1lc3NhZ2VzIG9uIHRoZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIERCVVNfV0lOCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyN1bmRlZiBpbnRlcmZhY2UKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiZGJ1cy1wcmludC1tZXNzYWdlLmgiCisKKyNpZmRlZiBEQlVTX1dJTgorCisvKiBnZXR0aW1lb2ZkYXkgaXMgbm90IGRlZmluZWQgb24gd2luZG93cyAqLworI2RlZmluZSBEQlVTX1NFQ09ORFNfU0lOQ0VfMTYwMSAxMTY0NDQ3MzYwMExMCisjZGVmaW5lIERCVVNfVVNFQ19JTl9TRUMgICAgICAgIDEwMDAwMDBMTAorCisjaWZkZWYgREJVU19XSU5DRQorCisjaWZuZGVmIF9JT0xCRgorI2RlZmluZSBfSU9MQkYgMHg0MAorI2VuZGlmCisjaWZuZGVmIF9JT05CRgorI2RlZmluZSBfSU9OQkYgMHgwNAorI2VuZGlmCisKK3ZvaWQKK0dldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIChMUEZJTEVUSU1FIGZ0cCkKK3sKKyAgU1lTVEVNVElNRSBzdDsKKyAgR2V0U3lzdGVtVGltZSAoJnN0KTsKKyAgU3lzdGVtVGltZVRvRmlsZVRpbWUgKCZzdCwgZnRwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitnZXR0aW1lb2ZkYXkgKHN0cnVjdCB0aW1ldmFsICpfX3AsCisJICAgICAgdm9pZCAqX190KQoreworICB1bmlvbiB7CisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbnMxMDA7IC8qdGltZSBzaW5jZSAxIEphbiAxNjAxIGluIDEwMG5zIHVuaXRzICovCisgICAgICBGSUxFVElNRSAgICAgICAgICAgZnQ7CisgICAgfSBub3c7CisKKyAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgKCZub3cuZnQpOworICBfX3AtPnR2X3VzZWMgPSAobG9uZykgKChub3cubnMxMDAgLyAxMExMKSAlIERCVVNfVVNFQ19JTl9TRUMpOworICBfX3AtPnR2X3NlYyAgPSAobG9uZykoKChub3cubnMxMDAgLyAxMExMKSAvIERCVVNfU0VDT05EU19TSU5DRV8xNjAxKSAtIERCVVNfU0VDT05EU19TSU5DRV8xNjAxKTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK21vbml0b3JfZmlsdGVyX2Z1bmMgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKwkJICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisJCSAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIHByaW50X21lc3NhZ2UgKG1lc3NhZ2UsIEZBTFNFKTsKKyAgCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgZXhpdCAoMCk7CisgIAorICAvKiBDb25jZXB0dWFsbHkgd2Ugd2FudCB0aGlzIHRvIGJlCisgICAqIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVELCBidXQgdGhpcyByYWlzZXMKKyAgICogc29tZSBwcm9ibGVtcy4gIFNlZSBidWcgMTcxOS4KKyAgICovCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBfX0FQUExFX18KKyNkZWZpbmUgUFJPRklMRV9USU1FRF9GT1JNQVQgIiVzXHQlbHVcdCVkIgorI2Vsc2UKKyNkZWZpbmUgUFJPRklMRV9USU1FRF9GT1JNQVQgIiVzXHQlbHVcdCVsdSIKKyNlbmRpZgorI2RlZmluZSBUUkFQX05VTExfU1RSSU5HKHN0cikgKChzdHIpID8gKHN0cikgOiAiPG5vbmU+IikKKwordHlwZWRlZiBlbnVtCit7CisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMID0gMSwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19SRVBMWV9TRVJJQUwgPSAyLAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFTkRFUiA9IDQsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfREVTVElOQVRJT04gPSA4LAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1BBVEggPSAxNiwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19JTlRFUkZBQ0UgPSAzMiwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19NRU1CRVIgPSA2NCwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19FUlJPUl9OQU1FID0gMTI4Cit9IFByb2ZpbGVBdHRyaWJ1dGVGbGFnczsKKworc3RhdGljIHZvaWQKK3Byb2ZpbGVfcHJpbnRfd2l0aF9hdHRycyAoY29uc3QgY2hhciAqdHlwZSwgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgIHN0cnVjdCB0aW1ldmFsICp0LCBQcm9maWxlQXR0cmlidXRlRmxhZ3MgYXR0cnMpCit7CisgIHByaW50ZiAoUFJPRklMRV9USU1FRF9GT1JNQVQsIHR5cGUsIHQtPnR2X3NlYywgdC0+dHZfdXNlYyk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRVJJQUwpCisgICAgcHJpbnRmICgiXHQldSIsIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19SRVBMWV9TRVJJQUwpCisgICAgcHJpbnRmICgiXHQldSIsIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRU5ERVIpCisgICAgcHJpbnRmICgiXHQlcyIsIFRSQVBfTlVMTF9TVFJJTkcgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfREVTVElOQVRJT04pCisgICAgcHJpbnRmICgiXHQlcyIsIFRSQVBfTlVMTF9TVFJJTkcgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19QQVRIKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19JTlRFUkZBQ0UpCisgICAgcHJpbnRmICgiXHQlcyIsIFRSQVBfTlVMTF9TVFJJTkcgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfTUVNQkVSKQorICAgIHByaW50ZiAoIlx0JXMiLCBUUkFQX05VTExfU1RSSU5HIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0VSUk9SX05BTUUpCisgICAgcHJpbnRmICgiXHQlcyIsIFRSQVBfTlVMTF9TVFJJTkcgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkpKTsKKworICBwcmludGYgKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfbWVzc2FnZV9wcm9maWxlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgc3RydWN0IHRpbWV2YWwgdDsKKworICBpZiAoZ2V0dGltZW9mZGF5ICgmdCwgTlVMTCkgPCAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoInVuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3dpdGNoIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKQorICAgIHsKKyAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisJcHJvZmlsZV9wcmludF93aXRoX2F0dHJzICgibWMiLCBtZXNzYWdlLCAmdCwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfUEFUSCB8CisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0lOVEVSRkFDRSB8CisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX01FTUJFUik7CisJYnJlYWs7CisgICAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk46CisJcHJvZmlsZV9wcmludF93aXRoX2F0dHJzICgibXIiLCBtZXNzYWdlLCAmdCwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfREVTVElOQVRJT04gfAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19SRVBMWV9TRVJJQUwpOworCWJyZWFrOworICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUjoKKwlwcm9maWxlX3ByaW50X3dpdGhfYXR0cnMgKCJlcnIiLCBtZXNzYWdlLCAmdCwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMIHwKKwkgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfREVTVElOQVRJT04gfAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19SRVBMWV9TRVJJQUwpOworCWJyZWFrOworICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisJcHJvZmlsZV9wcmludF93aXRoX2F0dHJzICgic2lnIiwgbWVzc2FnZSwgJnQsCisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCB8CisJICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1BBVEggfAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19JTlRFUkZBQ0UgfAorCSAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19NRU1CRVIpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlwcmludGYgKFBST0ZJTEVfVElNRURfRk9STUFUICJcbiIsICJ0dW4iLCB0LnR2X3NlYywgdC50dl91c2VjKTsKKwlicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorcHJvZmlsZV9maWx0ZXJfZnVuYyAoREJ1c0Nvbm5lY3Rpb24JKmNvbm5lY3Rpb24sCisJCSAgICAgREJ1c01lc3NhZ2UJKm1lc3NhZ2UsCisJCSAgICAgdm9pZAkJKnVzZXJfZGF0YSkKK3sKKyAgcHJpbnRfbWVzc2FnZV9wcm9maWxlIChtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIGV4aXQgKDApOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSAoY2hhciAqbmFtZSwgaW50IGVjb2RlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgWy0tc3lzdGVtIHwgLS1zZXNzaW9uIHwgLS1hZGRyZXNzIEFERFJFU1NdIFstLW1vbml0b3IgfCAtLXByb2ZpbGUgXSBbd2F0Y2ggZXhwcmVzc2lvbnNdXG4iLCBuYW1lKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAorb25seV9vbmVfdHlwZSAoZGJ1c19ib29sX3QgKnNlZW5fYnVzX3R5cGUsCisgICAgICAgICAgICAgICBjaGFyICAgICAgICAqbmFtZSkKK3sKKyAgaWYgKCpzZWVuX2J1c190eXBlKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkkgb25seSBzdXBwb3J0IG1vbml0b3Jpbmcgb25lIGJ1cyBhdCBhIHRpbWUhXG4iKTsKKyAgICAgIHVzYWdlIChuYW1lLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqc2Vlbl9idXNfdHlwZSA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3Qgc2lnaW50X3JlY2VpdmVkID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitzaWdpbnRfaGFuZGxlciAoaW50IHNpZ251bSkKK3sKKyAgc2lnaW50X3JlY2VpdmVkID0gVFJVRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQnVzVHlwZSB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgREJ1c0hhbmRsZU1lc3NhZ2VGdW5jdGlvbiBmaWx0ZXJfZnVuYyA9IG1vbml0b3JfZmlsdGVyX2Z1bmM7CisgIGNoYXIgKmFkZHJlc3MgPSBOVUxMOworICBkYnVzX2Jvb2xfdCBzZWVuX2J1c190eXBlID0gRkFMU0U7CisgIAorICBpbnQgaSA9IDAsIGogPSAwLCBudW1GaWx0ZXJzID0gMDsKKyAgY2hhciAqKmZpbHRlcnMgPSBOVUxMOworCisgIC8qIFNldCBzdGRvdXQgdG8gYmUgdW5idWZmZXJlZDsgdGhpcyBpcyBiYXNpY2FsbHkgc28gdGhhdCBpZiBwZW9wbGUKKyAgICogZG8gZGJ1cy1tb25pdG9yID4gZmlsZSwgdGhlbiBzZW5kIFNJR0lOVCB2aWEgQ29udHJvbC1DLCB0aGV5CisgICAqIGRvbid0IGxvc2UgdGhlIGxhc3QgY2h1bmsgb2YgbWVzc2FnZXMuCisgICAqLworCisjaWZkZWYgREJVU19XSU4KKyAgc2V0dmJ1ZiAoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworI2Vsc2UKKyAgc2V0dmJ1ZiAoc3Rkb3V0LCBOVUxMLCBfSU9MQkYsIDApOworI2VuZGlmCisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSkKKyAgICAgICAgeworICAgICAgICAgIG9ubHlfb25lX3R5cGUgKCZzZWVuX2J1c190eXBlLCBhcmd2WzBdKTsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICItLXNlc3Npb24iKSkKKyAgICAgICAgeworICAgICAgICAgIG9ubHlfb25lX3R5cGUgKCZzZWVuX2J1c190eXBlLCBhcmd2WzBdKTsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1hZGRyZXNzIikpCisgICAgICAgIHsKKyAgICAgICAgICBvbmx5X29uZV90eXBlICgmc2Vlbl9idXNfdHlwZSwgYXJndlswXSk7CisKKyAgICAgICAgICBpZiAoaSsxIDwgYXJnYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWRkcmVzcyA9IGFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVzYWdlIChhcmd2WzBdLCAxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1oZWxwIikpCisJdXNhZ2UgKGFyZ3ZbMF0sIDApOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1tb25pdG9yIikpCisJZmlsdGVyX2Z1bmMgPSBtb25pdG9yX2ZpbHRlcl9mdW5jOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1wcm9maWxlIikpCisJZmlsdGVyX2Z1bmMgPSBwcm9maWxlX2ZpbHRlcl9mdW5jOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS0iKSkKKwljb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKGFyZ1swXSA9PSAnLScpCisJdXNhZ2UgKGFyZ3ZbMF0sIDEpOworICAgICAgZWxzZSB7CisJbnVtRmlsdGVycysrOworICAgICAgIGZpbHRlcnMgPSAoY2hhciAqKilyZWFsbG9jKGZpbHRlcnMsIG51bUZpbHRlcnMgKiBzaXplb2YoY2hhciAqKSk7CisJZmlsdGVyc1tqXSA9IChjaGFyICopbWFsbG9jKChzdHJsZW4oYXJnKSArIDEpICogc2l6ZW9mKGNoYXIgKikpOworCXNucHJpbnRmKGZpbHRlcnNbal0sIHN0cmxlbihhcmcpICsgMSwgIiVzIiwgYXJnKTsKKwlqKys7CisgICAgICB9CisgICAgfQorCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmIChhZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuIChhZGRyZXNzLCAmZXJyb3IpOworICAgICAgaWYgKGNvbm5lY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWRidXNfYnVzX3JlZ2lzdGVyIChjb25uZWN0aW9uLCAmZXJyb3IpKQorICAgICAgCSAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byByZWdpc3RlciBjb25uZWN0aW9uIHRvIGJ1cyBhdCAlczogJXNcbiIsCisgICAgICAJICAgICAgICAgICAgICAgYWRkcmVzcywgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAJICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKHR5cGUsICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqd2hlcmU7CisgICAgICBpZiAoYWRkcmVzcyAhPSBOVUxMKQorICAgICAgICB3aGVyZSA9IGFkZHJlc3M7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIERCVVNfQlVTX1NZU1RFTToKKyAgICAgICAgICAgICAgd2hlcmUgPSAic3lzdGVtIGJ1cyI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEQlVTX0JVU19TRVNTSU9OOgorICAgICAgICAgICAgICB3aGVyZSA9ICJzZXNzaW9uIGJ1cyI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgd2hlcmUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byAlczogJXNcbiIsCisgICAgICAgICAgICAgICB3aGVyZSwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChudW1GaWx0ZXJzKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggKGNvbm5lY3Rpb24sIGZpbHRlcnNbaV0sICZlcnJvcik7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gc2V0dXAgbWF0Y2ggXCIlc1wiOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tpXSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisJICBmcmVlKGZpbHRlcnNbaV0pOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorCQkgICAgICAgICAgInR5cGU9J3NpZ25hbCciLAorCQkgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgZ290byBsb3NlOworICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorCQkgICAgICAgICAgInR5cGU9J21ldGhvZF9jYWxsJyIsCisJCSAgICAgICAgICAmZXJyb3IpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICBnb3RvIGxvc2U7CisgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggKGNvbm5lY3Rpb24sCisJCSAgICAgICAgICAidHlwZT0nbWV0aG9kX3JldHVybiciLAorCQkgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgZ290byBsb3NlOworICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorCQkgICAgICAgICAgInR5cGU9J2Vycm9yJyIsCisJCSAgICAgICAgICAmZXJyb3IpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICBnb3RvIGxvc2U7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGNvbm5lY3Rpb24sIGZpbHRlcl9mdW5jLCBOVUxMLCBOVUxMKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkbid0IGFkZCBmaWx0ZXIhXG4iKTsKKyAgICBleGl0ICgxKTsKKyAgfQorCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaChjb25uZWN0aW9uLCAtMSkpCisgICAgOworICBleGl0ICgwKTsKKyBsb3NlOgorICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMgYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQwMGFjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wcmludC1tZXNzYWdlLmggIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgb3V0IGEgbWVzc2FnZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1wcmludC1tZXNzYWdlLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKworc3RhdGljIGNvbnN0IGNoYXIqCit0eXBlX3RvX25hbWUgKGludCBtZXNzYWdlX3R5cGUpCit7CisgIHN3aXRjaCAobWVzc2FnZV90eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDoKKyAgICAgIHJldHVybiAic2lnbmFsIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorICAgICAgcmV0dXJuICJtZXRob2QgY2FsbCI7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgICAgcmV0dXJuICJtZXRob2QgcmV0dXJuIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiKHVua25vd24gbWVzc2FnZSB0eXBlKSI7CisgICAgfQorfQorCisjZGVmaW5lIElOREVOVCAzCisKK3N0YXRpYyB2b2lkCitpbmRlbnQgKGludCBkZXB0aCkKK3sKKyAgd2hpbGUgKGRlcHRoLS0gPiAwKQorICAgIHByaW50ZiAoIiAgICIpOyAvKiBJTkRFTlQgc3BhY2VzLiAqLworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaGV4ICh1bnNpZ25lZCBjaGFyICpieXRlcywgdW5zaWduZWQgaW50IGxlbiwgaW50IGRlcHRoKQoreworICB1bnNpZ25lZCBpbnQgaSwgY29sdW1uczsKKworICBwcmludGYgKCJhcnJheSBvZiBieXRlcyBbXG4iKTsKKworICBpbmRlbnQgKGRlcHRoICsgMSk7CisKKyAgLyogRWFjaCBieXRlIHRha2VzIDMgY2VsbHMgKHR3byBoZXhpdHMsIGFuZCBhIHNwYWNlKSwgZXhjZXB0IHRoZSBsYXN0IG9uZS4gKi8KKyAgY29sdW1ucyA9ICg4MCAtICgoZGVwdGggKyAxKSAqIElOREVOVCkpIC8gMzsKKworICBpZiAoY29sdW1ucyA8IDgpCisgICAgY29sdW1ucyA9IDg7CisKKyAgaSA9IDA7CisKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgcHJpbnRmICgiJTAyeCIsIGJ5dGVzW2ldKTsKKyAgICAgIGkrKzsKKworICAgICAgaWYgKGkgIT0gbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgJSBjb2x1bW5zID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICAgICAgICAgIGluZGVudCAoZGVwdGggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBwcmludGYgKCJcbiIpOworICBpbmRlbnQgKGRlcHRoKTsKKyAgcHJpbnRmICgiXVxuIik7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9TSVpFIDEwMAorCitzdGF0aWMgdm9pZAorcHJpbnRfYXkgKERCdXNNZXNzYWdlSXRlciAqaXRlciwgaW50IGRlcHRoKQoreworICAvKiBOb3QgdXNpbmcgREJ1c1N0cmluZyBiZWNhdXNlIGl0J3Mgbm90IHB1YmxpYyBBUEkuIEl0J3MgMjAwOSwgYW5kIEknbQorICAgKiBtYW51YWxseSBncm93aW5nIGEgc3RyaW5nIGNodW5rIGJ5IGNodW5rLgorICAgKi8KKyAgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBtYWxsb2MgKERFRkFVTFRfU0laRSArIDEpOworICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKKyAgdW5zaWduZWQgaW50IG1heCA9IERFRkFVTFRfU0laRTsKKyAgZGJ1c19ib29sX3QgYWxsX2FzY2lpID0gVFJVRTsKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlcikpCisgICAgICAgICAgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciB2YWw7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICBieXRlc1tsZW5dID0gdmFsOworICAgICAgbGVuKys7CisKKyAgICAgIGlmICh2YWwgPCAzMiB8fCB2YWwgPiAxMjYpCisgICAgICAgIGFsbF9hc2NpaSA9IEZBTFNFOworCisgICAgICBpZiAobGVuID09IG1heCkKKyAgICAgICAgeworICAgICAgICAgIG1heCAqPSAyOworICAgICAgICAgIGJ5dGVzID0gcmVhbGxvYyAoYnl0ZXMsIG1heCArIDEpOworICAgICAgICB9CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKGl0ZXIpOworICAgIH0KKworICBpZiAoYWxsX2FzY2lpKQorICAgIHsKKyAgICAgIGJ5dGVzW2xlbl0gPSAnXDAnOworICAgICAgcHJpbnRmICgiYXJyYXkgb2YgYnl0ZXMgXCIlc1wiXG4iLCBieXRlcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRfaGV4IChieXRlcywgbGVuLCBkZXB0aCk7CisgICAgfQorCisgIGZyZWUgKGJ5dGVzKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2l0ZXIgKERCdXNNZXNzYWdlSXRlciAqaXRlciwgZGJ1c19ib29sX3QgbGl0ZXJhbCwgaW50IGRlcHRoKQoreworICBkbworICAgIHsKKyAgICAgIGludCB0eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVyKTsKKworICAgICAgaWYgKHR5cGUgPT0gREJVU19UWVBFX0lOVkFMSUQpCisJYnJlYWs7CisgICAgICAKKyAgICAgIGluZGVudChkZXB0aCk7CisKKyAgICAgIHN3aXRjaCAodHlwZSkKKwl7CisJY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorCSAgeworCSAgICBjaGFyICp2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIGlmICghbGl0ZXJhbCkKKwkgICAgICBwcmludGYgKCJzdHJpbmcgXCIiKTsKKwkgICAgcHJpbnRmICgiJXMiLCB2YWwpOworCSAgICBpZiAoIWxpdGVyYWwpCisJICAgICAgcHJpbnRmICgiXCJcbiIpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKwkgIHsKKwkgICAgY2hhciAqdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworCSAgICBpZiAoIWxpdGVyYWwpCisJICAgICAgcHJpbnRmICgic2lnbmF0dXJlIFwiIik7CisJICAgIHByaW50ZiAoIiVzIiwgdmFsKTsKKwkgICAgaWYgKCFsaXRlcmFsKQorCSAgICAgIHByaW50ZiAoIlwiXG4iKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKwkgIHsKKwkgICAgY2hhciAqdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworCSAgICBpZiAoIWxpdGVyYWwpCisJICAgICAgcHJpbnRmICgib2JqZWN0IHBhdGggXCIiKTsKKwkgICAgcHJpbnRmICgiJXMiLCB2YWwpOworCSAgICBpZiAoIWxpdGVyYWwpCisJICAgICAgcHJpbnRmICgiXCJcbiIpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX0lOVDE2OgorCSAgeworCSAgICBkYnVzX2ludDE2X3QgdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworCSAgICBwcmludGYgKCJpbnQxNiAlZFxuIiwgdmFsKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9VSU5UMTY6CisJICB7CisJICAgIGRidXNfdWludDE2X3QgdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworCSAgICBwcmludGYgKCJ1aW50MTYgJXVcbiIsIHZhbCk7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisJICB7CisJICAgIGRidXNfaW50MzJfdCB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIHByaW50ZiAoImludDMyICVkXG4iLCB2YWwpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgREJVU19UWVBFX1VJTlQzMjoKKwkgIHsKKwkgICAgZGJ1c191aW50MzJfdCB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIHByaW50ZiAoInVpbnQzMiAldVxuIiwgdmFsKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9JTlQ2NDoKKwkgIHsKKwkgICAgZGJ1c19pbnQ2NF90IHZhbDsKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyNpZmRlZiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUgorICAgICAgICBwcmludGYgKCJpbnQ2NCAlIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAiZFxuIiwgdmFsKTsKKyNlbHNlCisgICAgICAgIHByaW50ZiAoImludDY0IChvbWl0dGVkKVxuIik7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisJICB7CisJICAgIGRidXNfdWludDY0X3QgdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworI2lmZGVmIERCVVNfSU5UNjRfUFJJTlRGX01PRElGSUVSCisgICAgICAgIHByaW50ZiAoInVpbnQ2NCAlIiBEQlVTX0lOVDY0X1BSSU5URl9NT0RJRklFUiAidVxuIiwgdmFsKTsKKyNlbHNlCisgICAgICAgIHByaW50ZiAoInVpbnQ2NCAob21pdHRlZClcbiIpOworI2VuZGlmCisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorCSAgeworCSAgICBkb3VibGUgdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworCSAgICBwcmludGYgKCJkb3VibGUgJWdcbiIsIHZhbCk7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBEQlVTX1RZUEVfQllURToKKwkgIHsKKwkgICAgdW5zaWduZWQgY2hhciB2YWw7CisJICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisJICAgIHByaW50ZiAoImJ5dGUgJWRcbiIsIHZhbCk7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKwkgIHsKKwkgICAgZGJ1c19ib29sX3QgdmFsOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworCSAgICBwcmludGYgKCJib29sZWFuICVzXG4iLCB2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorCSAgeworCSAgICBEQnVzTWVzc2FnZUl0ZXIgc3ViaXRlcjsKKworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChpdGVyLCAmc3ViaXRlcik7CisKKwkgICAgcHJpbnRmICgidmFyaWFudCAiKTsKKwkgICAgcHJpbnRfaXRlciAoJnN1Yml0ZXIsIGxpdGVyYWwsIGRlcHRoKzEpOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIERCVVNfVFlQRV9BUlJBWToKKwkgIHsKKwkgICAgaW50IGN1cnJlbnRfdHlwZTsKKwkgICAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoaXRlciwgJnN1Yml0ZXIpOworCisJICAgIGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnN1Yml0ZXIpOworCisJICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0JZVEUpCisJICAgICAgeworCQlwcmludF9heSAoJnN1Yml0ZXIsIGRlcHRoKTsKKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIHByaW50ZigiYXJyYXkgW1xuIik7CisJICAgIHdoaWxlIChjdXJyZW50X3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisJICAgICAgeworCQlwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisKKwkJZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworCQljdXJyZW50X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZzdWJpdGVyKTsKKworCQlpZiAoY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorCQkgIHByaW50ZiAoIiwiKTsKKwkgICAgICB9CisJICAgIGluZGVudChkZXB0aCk7CisJICAgIHByaW50ZigiXVxuIik7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisJICB7CisJICAgIERCdXNNZXNzYWdlSXRlciBzdWJpdGVyOworCisJICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKGl0ZXIsICZzdWJpdGVyKTsKKworCSAgICBwcmludGYoImRpY3QgZW50cnkoXG4iKTsKKwkgICAgcHJpbnRfaXRlciAoJnN1Yml0ZXIsIGxpdGVyYWwsIGRlcHRoKzEpOworCSAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisJICAgIHByaW50X2l0ZXIgKCZzdWJpdGVyLCBsaXRlcmFsLCBkZXB0aCsxKTsKKwkgICAgaW5kZW50KGRlcHRoKTsKKwkgICAgcHJpbnRmKCIpXG4iKTsKKwkgICAgYnJlYWs7CisJICB9CisJICAgIAorCWNhc2UgREJVU19UWVBFX1NUUlVDVDoKKwkgIHsKKwkgICAgaW50IGN1cnJlbnRfdHlwZTsKKwkgICAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisKKwkgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoaXRlciwgJnN1Yml0ZXIpOworCisJICAgIHByaW50Zigic3RydWN0IHtcbiIpOworCSAgICB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnN1Yml0ZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKwkgICAgICB7CisJCXByaW50X2l0ZXIgKCZzdWJpdGVyLCBsaXRlcmFsLCBkZXB0aCsxKTsKKwkJZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworCQlpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmc3ViaXRlcikgIT0gREJVU19UWVBFX0lOVkFMSUQpCisJCSAgcHJpbnRmICgiLCIpOworCSAgICAgIH0KKwkgICAgaW5kZW50KGRlcHRoKTsKKwkgICAgcHJpbnRmKCJ9XG4iKTsKKwkgICAgYnJlYWs7CisJICB9CisJICAgIAorCWRlZmF1bHQ6CisJICBwcmludGYgKCIgKGRidXMtbW9uaXRvciB0b28gZHVtYiB0byBkZWNpcGhlciBhcmcgdHlwZSAnJWMnKVxuIiwgdHlwZSk7CisJICBicmVhazsKKwl9CisgICAgfSB3aGlsZSAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoaXRlcikpOworfQorCit2b2lkCitwcmludF9tZXNzYWdlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwgZGJ1c19ib29sX3QgbGl0ZXJhbCkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIGNvbnN0IGNoYXIgKnNlbmRlcjsKKyAgY29uc3QgY2hhciAqZGVzdGluYXRpb247CisgIGludCBtZXNzYWdlX3R5cGU7CisKKyAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKTsKKyAgc2VuZGVyID0gZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpOworICBkZXN0aW5hdGlvbiA9IGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpOworICAKKyAgaWYgKCFsaXRlcmFsKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVzIHNlbmRlcj0lcyAtPiBkZXN0PSVzIiwKKwkgICAgICB0eXBlX3RvX25hbWUgKG1lc3NhZ2VfdHlwZSksCisJICAgICAgc2VuZGVyID8gc2VuZGVyIDogIihudWxsIHNlbmRlcikiLAorCSAgICAgIGRlc3RpbmF0aW9uID8gZGVzdGluYXRpb24gOiAiKG51bGwgZGVzdGluYXRpb24pIik7CisgIAorICAgICAgc3dpdGNoIChtZXNzYWdlX3R5cGUpCisJeworCWNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisJY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisJICBwcmludGYgKCIgc2VyaWFsPSV1IHBhdGg9JXM7IGludGVyZmFjZT0lczsgbWVtYmVyPSVzXG4iLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpLAorCQkgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisJCSAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorCQkgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSk7CisJICBicmVhazsKKyAgICAgIAorCWNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjoKKwkgIHByaW50ZiAoIiByZXBseV9zZXJpYWw9JXVcbiIsCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpKTsKKwkgIGJyZWFrOworCisJY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUjoKKwkgIHByaW50ZiAoIiBlcnJvcl9uYW1lPSVzIHJlcGx5X3NlcmlhbD0ldVxuIiwKKwkJICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBwcmludGYgKCJcbiIpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgIHByaW50X2l0ZXIgKCZpdGVyLCBsaXRlcmFsLCAxKTsKKyAgZmZsdXNoIChzdGRvdXQpOworICAKK30KKwpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmggYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjcwMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmgKQEAgLTAsMCArMSwzMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXByaW50LW1lc3NhZ2UuaCAgVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBvdXQgYSBtZXNzYWdlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfUFJJTlRfTUVTU0FHRV9ICisjZGVmaW5lIERCVVNfUFJJTlRfTUVTU0FHRV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCit2b2lkIHByaW50X21lc3NhZ2UgKERCdXNNZXNzYWdlICptZXNzYWdlLCBkYnVzX2Jvb2xfdCBsaXRlcmFsKTsKKworI2VuZGlmIC8qIERCVVNfUFJJTlRfTUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90b29scy9kYnVzLXNlbmQuYyBiL2RidXMtMS40LjEwL3Rvb2xzL2RidXMtc2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZGYxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLXNlbmQuYwpAQCAtMCwwICsxLDU0MiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlbmQuYyAgVXRpbGl0eSBwcm9ncmFtIHRvIHNlbmQgbWVzc2FnZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2lmbmRlZiBIQVZFX1NUUlRPTEwKKyN1bmRlZiBzdHJ0b2xsCisjZGVmaW5lIHN0cnRvbGwgbXlzdHJ0b2xsCisjaW5jbHVkZSAic3RydG9sbC5jIgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJUT1VMTAorI3VuZGVmIHN0cnRvdWxsCisjZGVmaW5lIHN0cnRvdWxsIG15c3RydG91bGwKKyNpbmNsdWRlICJzdHJ0b3VsbC5jIgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTkNFCisjaWZuZGVmIHN0cmR1cAorI2RlZmluZSBzdHJkdXAgX3N0cmR1cAorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImRidXMtcHJpbnQtbWVzc2FnZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqYXBwbmFtZTsKKworc3RhdGljIHZvaWQKK3VzYWdlIChpbnQgZWNvZGUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAlcyBbLS1oZWxwXSBbLS1zeXN0ZW0gfCAtLXNlc3Npb24gfCAtLWFkZHJlc3M9QUREUkVTU10gWy0tZGVzdD1OQU1FXSBbLS10eXBlPVRZUEVdIFstLXByaW50LXJlcGx5PShsaXRlcmFsKV0gWy0tcmVwbHktdGltZW91dD1NU0VDXSA8ZGVzdGluYXRpb24gb2JqZWN0IHBhdGg+IDxtZXNzYWdlIG5hbWU+IFtjb250ZW50cyAuLi5dXG4iLCBhcHBuYW1lKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kX2FyZyAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGRidXNfdWludDE2X3QgdWludDE2OworICBkYnVzX2ludDE2X3QgaW50MTY7CisgIGRidXNfdWludDMyX3QgdWludDMyOworICBkYnVzX2ludDMyX3QgaW50MzI7CisgIGRidXNfdWludDY0X3QgdWludDY0OworICBkYnVzX2ludDY0X3QgaW50NjQ7CisgIGRvdWJsZSBkOworICB1bnNpZ25lZCBjaGFyIGJ5dGU7CisgIGRidXNfYm9vbF90IHZfQk9PTEVBTjsKKyAgCisgIC8qIEZJWE1FIC0gd2UgYXJlIGlnbm9yaW5nIE9PTSByZXR1cm5zIG9uIGFsbCB0aGVzZSBmdW5jdGlvbnMgKi8KKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgYnl0ZSA9IHN0cnRvdWwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0JZVEUsICZieXRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgZCA9IHN0cnRvZCAodmFsdWUsIE5VTEwpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfRE9VQkxFLCAmZCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgaW50MTYgPSBzdHJ0b2wgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0lOVDE2LCAmaW50MTYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICB1aW50MTYgPSBzdHJ0b3VsICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9VSU5UMTYsICZ1aW50MTYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICAgIGludDMyID0gc3RydG9sICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9JTlQzMiwgJmludDMyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgdWludDMyID0gc3RydG91bCAodmFsdWUsIE5VTEwsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmdWludDMyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgICBpbnQ2NCA9IHN0cnRvbGwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0lOVDY0LCAmaW50NjQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICB1aW50NjQgPSBzdHJ0b3VsbCAodmFsdWUsIE5VTEwsIDApOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfVUlOVDY0LCAmdWludDY0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX09CSkVDVF9QQVRILCAmdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgaWYgKHN0cmNtcCAodmFsdWUsICJ0cnVlIikgPT0gMCkKKwl7CisJICB2X0JPT0xFQU4gPSBUUlVFOworCSAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfQk9PTEVBTiwgJnZfQk9PTEVBTik7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wICh2YWx1ZSwgImZhbHNlIikgPT0gMCkKKwl7CisJICB2X0JPT0xFQU4gPSBGQUxTRTsKKwkgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0JPT0xFQU4sICZ2X0JPT0xFQU4pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiIGluc3RlYWQgb2YgXCIlc1wiXG4iLCBhcHBuYW1lLCB2YWx1ZSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICVjXG4iLCBhcHBuYW1lLCAoY2hhcikgdHlwZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmRfYXJyYXkgKERCdXNNZXNzYWdlSXRlciAqaXRlciwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBjb25zdCBjaGFyICp2YWw7CisgIGNoYXIgKmR1cHZhbCA9IHN0cmR1cCAodmFsdWUpOworCisgIHZhbCA9IHN0cnRvayAoZHVwdmFsLCAiLCIpOworICB3aGlsZSAodmFsICE9IE5VTEwpCisgICAgeworICAgICAgYXBwZW5kX2FyZyAoaXRlciwgdHlwZSwgdmFsKTsKKyAgICAgIHZhbCA9IHN0cnRvayAoTlVMTCwgIiwiKTsKKyAgICB9CisgIGZyZWUgKGR1cHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmRfZGljdCAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQga2V5dHlwZSwgaW50IHZhbHR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBjb25zdCBjaGFyICp2YWw7CisgIGNoYXIgKmR1cHZhbCA9IHN0cmR1cCAodmFsdWUpOworCisgIHZhbCA9IHN0cnRvayAoZHVwdmFsLCAiLCIpOworICB3aGlsZSAodmFsICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisgICAgICAKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyIChpdGVyLAorCQkJCQlEQlVTX1RZUEVfRElDVF9FTlRSWSwKKwkJCQkJTlVMTCwKKwkJCQkJJnN1Yml0ZXIpOworCisgICAgICBhcHBlbmRfYXJnICgmc3ViaXRlciwga2V5dHlwZSwgdmFsKTsKKyAgICAgIHZhbCA9IHN0cnRvayAoTlVMTCwgIiwiKTsKKyAgICAgIGlmICh2YWwgPT0gTlVMTCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczogTWFsZm9ybWVkIGRpY3Rpb25hcnlcbiIsIGFwcG5hbWUpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgYXBwZW5kX2FyZyAoJnN1Yml0ZXIsIHZhbHR5cGUsIHZhbCk7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoaXRlciwgJnN1Yml0ZXIpOworICAgICAgdmFsID0gc3RydG9rIChOVUxMLCAiLCIpOworICAgIH0gCisgIGZyZWUgKGR1cHZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGVfZnJvbV9uYW1lIChjb25zdCBjaGFyICphcmcpCit7CisgIGludCB0eXBlOworICBpZiAoIXN0cmNtcCAoYXJnLCAic3RyaW5nIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9TVFJJTkc7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDE2IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQxNjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDE2IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UMTY7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDMyIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDMyIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UMzI7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDY0IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQ2NDsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDY0IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UNjQ7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImRvdWJsZSIpKQorICAgIHR5cGUgPSBEQlVTX1RZUEVfRE9VQkxFOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJieXRlIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9CWVRFOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJib29sZWFuIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9CT09MRUFOOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJvYmpwYXRoIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9PQkpFQ1RfUEFUSDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBVbmtub3duIHR5cGUgXCIlc1wiXG4iLCBhcHBuYW1lLCBhcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICByZXR1cm4gdHlwZTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgaW50IHByaW50X3JlcGx5OworICBpbnQgcHJpbnRfcmVwbHlfbGl0ZXJhbDsKKyAgaW50IHJlcGx5X3RpbWVvdXQ7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBpbnQgaTsKKyAgREJ1c0J1c1R5cGUgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgIGNvbnN0IGNoYXIgKmRlc3QgPSBOVUxMOworICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKyAgY29uc3QgY2hhciAqcGF0aCA9IE5VTEw7CisgIGludCBtZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw7CisgIGNvbnN0IGNoYXIgKnR5cGVfc3RyID0gTlVMTDsKKyAgY29uc3QgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisgIGludCBzZXNzaW9uX29yX3N5c3RlbSA9IEZBTFNFOworCisgIGFwcG5hbWUgPSBhcmd2WzBdOworICAKKyAgaWYgKGFyZ2MgPCAzKQorICAgIHVzYWdlICgxKTsKKworICBwcmludF9yZXBseSA9IEZBTFNFOworICBwcmludF9yZXBseV9saXRlcmFsID0gRkFMU0U7CisgIHJlcGx5X3RpbWVvdXQgPSAtMTsKKyAgCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjICYmIG5hbWUgPT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworCSAgdHlwZSA9IERCVVNfQlVTX1NZU1RFTTsKKyAgICAgICAgICBzZXNzaW9uX29yX3N5c3RlbSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworCSAgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgICAgICAgICAgc2Vzc2lvbl9vcl9zeXN0ZW0gPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tYWRkcmVzcyIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGFkZHJlc3MgPSBzdHJjaHIgKGFyZywgJz0nKTsKKworICAgICAgICAgIGlmIChhZGRyZXNzID09IE5VTEwpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJcIi0tYWRkcmVzcz1cIiByZXF1aXJlcyBhbiBBRERSRVNTXG4iKTsKKyAgICAgICAgICAgICAgdXNhZ2UgKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChhcmcsICItLXByaW50LXJlcGx5IiwgMTMpID09IDApCisJeworCSAgcHJpbnRfcmVwbHkgPSBUUlVFOworCSAgbWVzc2FnZV90eXBlID0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw7CisJICBpZiAoKihhcmcgKyAxMykgIT0gJ1wwJykKKwkgICAgcHJpbnRfcmVwbHlfbGl0ZXJhbCA9IFRSVUU7CisJfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXJlcGx5LXRpbWVvdXQ9IikgPT0gYXJnKQorCXsKKwkgIHJlcGx5X3RpbWVvdXQgPSBzdHJ0b2wgKHN0cmNociAoYXJnLCAnPScpICsgMSwKKwkJCQkgIE5VTEwsIDEwKTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tZGVzdD0iKSA9PSBhcmcpCisJZGVzdCA9IHN0cmNociAoYXJnLCAnPScpICsgMTsKKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS10eXBlPSIpID09IGFyZykKKwl0eXBlX3N0ciA9IHN0cmNociAoYXJnLCAnPScpICsgMTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1oZWxwIikpCisJdXNhZ2UgKDApOworICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICctJykKKwl1c2FnZSAoMSk7CisgICAgICBlbHNlIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIHBhdGggPSBhcmc7CisgICAgICBlbHNlIC8qIG5hbWUgPT0gTlVMTCBndWFyYW50ZWVkIGJ5IHRoZSAnd2hpbGUnIGxvb3AgKi8KKyAgICAgICAgbmFtZSA9IGFyZzsKKyAgICB9CisKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICB1c2FnZSAoMSk7CisKKyAgaWYgKHNlc3Npb25fb3Jfc3lzdGVtICYmCisgICAgICAoYWRkcmVzcyAhPSBOVUxMKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcIi0tYWRkcmVzc1wiIG1heSBub3QgYmUgdXNlZCB3aXRoIFwiLS1zeXN0ZW1cIiBvciBcIi0tc2Vzc2lvblwiXG4iKTsKKyAgICAgIHVzYWdlICgxKTsKKyAgICB9CisKKyAgaWYgKHR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHR5cGVfc3RyKTsKKyAgICAgIGlmICghKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCB8fAorICAgICAgICAgICAgbWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJNZXNzYWdlIHR5cGUgXCIlc1wiIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgdHlwZV9zdHIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgfQorICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGlmIChhZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuIChhZGRyZXNzLCAmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKHR5cGUsICZlcnJvcik7CisgICAgfQorCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBcIiVzXCIgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgKGFkZHJlc3MgIT0gTlVMTCkgPyBhZGRyZXNzIDoKKyAgICAgICAgICAgICAgICAgKCh0eXBlID09IERCVVNfQlVTX1NZU1RFTSkgPyAic3lzdGVtIiA6ICJzZXNzaW9uIiksCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAobWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKQorICAgIHsKKyAgICAgIGNoYXIgKmxhc3RfZG90OworCisgICAgICBsYXN0X2RvdCA9IHN0cnJjaHIgKG5hbWUsICcuJyk7CisgICAgICBpZiAobGFzdF9kb3QgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk11c3QgdXNlIG9yZy5teWRvbWFpbi5JbnRlcmZhY2UuTWV0aG9kIG5vdGF0aW9uLCBubyBkb3QgaW4gXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICAqbGFzdF9kb3QgPSAnXDAnOworICAgICAgCisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9kb3QgKyAxKTsKKyAgICAgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAobWVzc2FnZSwgVFJVRSk7CisgICAgfQorICBlbHNlIGlmIChtZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKQorICAgIHsKKyAgICAgIGNoYXIgKmxhc3RfZG90OworCisgICAgICBsYXN0X2RvdCA9IHN0cnJjaHIgKG5hbWUsICcuJyk7CisgICAgICBpZiAobGFzdF9kb3QgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk11c3QgdXNlIG9yZy5teWRvbWFpbi5JbnRlcmZhY2UuU2lnbmFsIG5vdGF0aW9uLCBubyBkb3QgaW4gXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICAqbGFzdF9kb3QgPSAnXDAnOworICAgICAgCisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKHBhdGgsIG5hbWUsIGxhc3RfZG90ICsgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3IsIHVua25vd24gbWVzc2FnZSB0eXBlXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkbid0IGFsbG9jYXRlIEQtQnVzIG1lc3NhZ2VcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChkZXN0ICYmICFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCBkZXN0KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJOb3QgZW5vdWdoIG1lbW9yeVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIAorICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworCisgIHdoaWxlIChpIDwgYXJnYykKKyAgICB7CisgICAgICBjaGFyICphcmc7CisgICAgICBjaGFyICpjOworICAgICAgaW50IHR5cGU7CisgICAgICBpbnQgc2Vjb25kYXJ5X3R5cGU7CisgICAgICBpbnQgY29udGFpbmVyX3R5cGU7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnRhcmdldF9pdGVyOworICAgICAgREJ1c01lc3NhZ2VJdGVyIGNvbnRhaW5lcl9pdGVyOworCisgICAgICB0eXBlID0gREJVU19UWVBFX0lOVkFMSUQ7CisgICAgICBhcmcgPSBhcmd2W2krK107CisgICAgICBjID0gc3RyY2hyIChhcmcsICc6Jyk7CisKKyAgICAgIGlmIChjID09IE5VTEwpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IERhdGEgaXRlbSBcIiVzXCIgaXMgYmFkbHkgZm9ybWVkXG4iLCBhcmd2WzBdLCBhcmcpOworCSAgZXhpdCAoMSk7CisJfQorCisgICAgICAqKGMrKykgPSAwOworCisgICAgICBjb250YWluZXJfdHlwZSA9IERCVVNfVFlQRV9JTlZBTElEOworCisgICAgICBpZiAoc3RyY21wIChhcmcsICJ2YXJpYW50IikgPT0gMCkKKwljb250YWluZXJfdHlwZSA9IERCVVNfVFlQRV9WQVJJQU5UOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJhcnJheSIpID09IDApCisJY29udGFpbmVyX3R5cGUgPSBEQlVTX1RZUEVfQVJSQVk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImRpY3QiKSA9PSAwKQorCWNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX0RJQ1RfRU5UUlk7CisKKyAgICAgIGlmIChjb250YWluZXJfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKwl7CisJICBhcmcgPSBjOworCSAgYyA9IHN0cmNociAoYXJnLCAnOicpOworCSAgaWYgKGMgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBEYXRhIGl0ZW0gXCIlc1wiIGlzIGJhZGx5IGZvcm1lZFxuIiwgYXJndlswXSwgYXJnKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCSAgKihjKyspID0gMDsKKwl9CisKKyAgICAgIGlmIChhcmdbMF0gPT0gMCkKKwl0eXBlID0gREJVU19UWVBFX1NUUklORzsKKyAgICAgIGVsc2UKKwl0eXBlID0gdHlwZV9mcm9tX25hbWUgKGFyZyk7CisKKyAgICAgIGlmIChjb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSkKKwl7CisJICBjaGFyIHNpZ1s1XTsKKwkgIGFyZyA9IGM7CisJICBjID0gc3RyY2hyIChjLCAnOicpOworCSAgaWYgKGMgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBEYXRhIGl0ZW0gXCIlc1wiIGlzIGJhZGx5IGZvcm1lZFxuIiwgYXJndlswXSwgYXJnKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCSAgKihjKyspID0gMDsKKwkgIHNlY29uZGFyeV90eXBlID0gdHlwZV9mcm9tX25hbWUgKGFyZyk7CisJICBzaWdbMF0gPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjsKKwkgIHNpZ1sxXSA9IHR5cGU7CisJICBzaWdbMl0gPSBzZWNvbmRhcnlfdHlwZTsKKwkgIHNpZ1szXSA9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUjsKKwkgIHNpZ1s0XSA9ICdcMCc7CisJICBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsCisJCQkJCSAgICBEQlVTX1RZUEVfQVJSQVksCisJCQkJCSAgICBzaWcsCisJCQkJCSAgICAmY29udGFpbmVyX2l0ZXIpOworCSAgdGFyZ2V0X2l0ZXIgPSAmY29udGFpbmVyX2l0ZXI7CisJfQorICAgICAgZWxzZSBpZiAoY29udGFpbmVyX3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisJeworCSAgY2hhciBzaWdbMl07CisJICBzaWdbMF0gPSB0eXBlOworCSAgc2lnWzFdID0gJ1wwJzsKKwkgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKwkJCQkJICAgIGNvbnRhaW5lcl90eXBlLAorCQkJCQkgICAgc2lnLAorCQkJCQkgICAgJmNvbnRhaW5lcl9pdGVyKTsKKwkgIHRhcmdldF9pdGVyID0gJmNvbnRhaW5lcl9pdGVyOworCX0KKyAgICAgIGVsc2UKKwl0YXJnZXRfaXRlciA9ICZpdGVyOworCisgICAgICBpZiAoY29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorCXsKKwkgIGFwcGVuZF9hcnJheSAodGFyZ2V0X2l0ZXIsIHR5cGUsIGMpOworCX0KKyAgICAgIGVsc2UgaWYgKGNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9ESUNUX0VOVFJZKQorCXsKKwkgIGFwcGVuZF9kaWN0ICh0YXJnZXRfaXRlciwgdHlwZSwgc2Vjb25kYXJ5X3R5cGUsIGMpOworCX0KKyAgICAgIGVsc2UKKwlhcHBlbmRfYXJnICh0YXJnZXRfaXRlciwgdHlwZSwgYyk7CisKKyAgICAgIGlmIChjb250YWluZXJfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKwl7CisJICBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLAorCQkJCQkgICAgICZjb250YWluZXJfaXRlcik7CisJfQorICAgIH0KKworICBpZiAocHJpbnRfcmVwbHkpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgICAgICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVwbHlfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciAlczogJXNcbiIsCisJCSAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKHJlcGx5KQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRfbWVzc2FnZSAocmVwbHksIHByaW50X3JlcGx5X2xpdGVyYWwpOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIE5VTEwpOworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZsdXNoIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy11dWlkZ2VuLmMgYi9kYnVzLTEuNC4xMC90b29scy9kYnVzLXV1aWRnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJhMWNmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvZGJ1cy11dWlkZ2VuLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11dWlkZ2VuLmMgIFV0aWxpdHkgcHJvZ3JhbSB0byBjcmVhdGUgVVVJRHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy11dWlkZ2VuLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK3N0YXRpYyB2b2lkCit1c2FnZSAoY2hhciAqbmFtZSwgaW50IGVjb2RlKQoreworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIG5hbWUgPSAiZGJ1cy11dWlkZ2VuIjsKKyAgCisgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAlcyBbLS1lbnN1cmVbPUZJTEVOQU1FXV0gWy0tZ2V0Wz1GSUxFTkFNRV1dXG4iLCBuYW1lKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAordmVyc2lvbiAodm9pZCkKK3sKKyAgcHJpbnRmICgiRC1CdXMgVVVJRCBHZW5lcmF0b3IgJXNcbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy5cbiIKKyAgICAgICAgICAiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLlxuIgorICAgICAgICAgICJUaGVyZSBpcyBOTyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIsCisgICAgICAgICAgVkVSU0lPTik7CisgIGV4aXQgKDApOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9hcmcgKGNvbnN0IGNoYXIgICphcmcsCisgICAgICAgICBjb25zdCBjaGFyICAqb3B0aW9uLAorICAgICAgICAgY29uc3QgY2hhciAqKnZhbHVlX3ApCit7CisgIGNvbnN0IGNoYXIgKmZuOworCisgIGlmIChzdHJsZW4oYXJnKSA8IHN0cmxlbihvcHRpb24pKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGZuID0gYXJnICsgc3RybGVuKG9wdGlvbik7CisKKyAgaWYgKCEoKmZuID09ICc9JyB8fCAqZm4gPT0gJyAnIHx8ICpmbiA9PSAnXDAnKSkKKyAgICB7CisgICAgICB1c2FnZSAoTlVMTCwgMSk7CisgICAgfQorICAKKyAgaWYgKCpmbiA9PSAnPScpCisgICAgKytmbjsKKyAgCisgIHdoaWxlICgqZm4gPT0gJyAnICYmICpmbiAhPSAnXDAnKQorICAgICsrZm47CisgIAorICBpZiAoKmZuICE9ICdcMCcpCisgICAgeworICAgICAgKnZhbHVlX3AgPSBmbjsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICBkYnVzX2Jvb2xfdCBlbnN1cmVfdXVpZDsKKyAgZGJ1c19ib29sX3QgZ2V0X3V1aWQ7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBlbnN1cmVfdXVpZCA9IEZBTFNFOworICBnZXRfdXVpZCA9IEZBTFNFOworICAKKyAgZmlsZW5hbWUgPSBOVUxMOworCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgaWYgKHN0cm5jbXAgKGFyZywgIi0tZW5zdXJlIiwgc3RybGVuKCItLWVuc3VyZSIpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZ2V0X2FyZyAoYXJnLCAiLS1lbnN1cmUiLCAmZmlsZW5hbWUpOworICAgICAgICAgIGVuc3VyZV91dWlkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAoYXJnLCAiLS1nZXQiLCBzdHJsZW4oIi0tZ2V0IikpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBnZXRfYXJnIChhcmcsICItLWdldCIsICZmaWxlbmFtZSk7CisgICAgICAgICAgZ2V0X3V1aWQgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0taGVscCIpID09IDApCisJdXNhZ2UgKGFyZ3ZbMF0sIDApOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXZlcnNpb24iKSA9PSAwKQorICAgICAgICB2ZXJzaW9uICgpOworICAgICAgZWxzZQorICAgICAgICB1c2FnZSAoYXJndlswXSwgMSk7CisgICAgfQorCisgIGlmIChnZXRfdXVpZCAmJiBlbnN1cmVfdXVpZCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBzcGVjaWZ5IGJvdGggLS1nZXQgYW5kIC0tZW5zdXJlXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIAorICBpZiAoZ2V0X3V1aWQgfHwgZW5zdXJlX3V1aWQpCisgICAgeworICAgICAgY2hhciAqdXVpZDsKKyAgICAgIGlmIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2V0X3V1aWQgKGZpbGVuYW1lLCAmdXVpZCwgZW5zdXJlX3V1aWQsICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZ2V0X3V1aWQpIC8qIHByaW50IG5vdGhpbmcgb24gLS1lbnN1cmUgKi8KKyAgICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCB1dWlkKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHV1aWQpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqdXVpZDsKKyAgICAgIGlmIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfY3JlYXRlX3V1aWQgKCZ1dWlkKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCB1dWlkKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHV1aWQpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgIk5vIG1lbW9yeSIpOworICAgICAgICB9CisgICAgfQorCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBleGl0ICgwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90b29scy9sY292LmFtIGIvZGJ1cy0xLjQuMTAvdG9vbHMvbGNvdi5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE0OTkxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLjQuMTAvdG9vbHMvbGNvdi5hbQpAQCAtMCwwICsxLDQzIEBACisjIENvcHlyaWdodCDCqSAyMDA4LTIwMTEgQ29sbGFib3JhIEx0ZC4KKyMgQ29weXJpZ2h0IMKpIDIwMDgtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyMgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworbGNvdi1yZXNldDoKKwlsY292IC0tZGlyZWN0b3J5IEBhYnNfdG9wX3NyY2RpckAgLS16ZXJvY291bnRlcnMKKworbGNvdi1yZXBvcnQ6CisJbGNvdiAtLWRpcmVjdG9yeSBAYWJzX3RvcF9zcmNkaXJAIC0tY2FwdHVyZSBcCisJCS0tb3V0cHV0LWZpbGUgQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaW5mbworCSQobWtkaXJfcCkgQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaHRtbAorCWdpdF9jb21taXQ9YEdJVF9ESVI9QGFic190b3Bfc3JjZGlyQC8uZ2l0IGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVoIDI+L2Rldi9udWxsYDtcCisJZ2VuaHRtbCAtLXRpdGxlICJAUEFDS0FHRV9TVFJJTkdAICQkZ2l0X2NvbW1pdCIgXAorCQktLW91dHB1dC1kaXJlY3RvcnkgQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaHRtbCBsY292LmluZm8KKwlAZWNobworCUBlY2hvICdsY292IHJlcG9ydCBjYW4gYmUgZm91bmQgaW46JworCUBlY2hvICdmaWxlOi8vQGFic190b3BfYnVpbGRkaXJAL2xjb3YuaHRtbC9pbmRleC5odG1sJworCUBlY2hvCisKK2xjb3YtY2hlY2s6CisJJChNQUtFKSBsY292LXJlc2V0CisJJChNQUtFKSBjaGVjayAkKExDT1ZfQ0hFQ0tfQVJHUykKKwkkKE1BS0UpIGxjb3YtcmVwb3J0CisKKyMjIHZpbTpzZXQgZnQ9YXV0b21ha2U6CmRpZmYgLS1naXQgYS9kYnVzLTEuNC4xMC90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2ggYi9kYnVzLTEuNC4xMC90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTgyMTg0YQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMtMS40LjEwL3Rvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaApAQCAtMCwwICsxLDc2IEBACisjISAvYmluL2Jhc2gKKworU0NSSVBUTkFNRT0kMAorV1JBUFBFRF9TQ1JJUFQ9JDEKK3NoaWZ0CisKK2RpZSgpIAoreworICAgIGlmICEgdGVzdCAteiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIiA7IHRoZW4KKyAgICAgICAgZWNobyAia2lsbGluZyBtZXNzYWdlIGJ1cyAiJERCVVNfU0VTU0lPTl9CVVNfUElEID4mMgorICAgICAgICBraWxsIC05ICREQlVTX1NFU1NJT05fQlVTX1BJRAorICAgIGZpCisgICAgZWNobyAkU0NSSVBUTkFNRTogJCogPiYyCisgICAgZXhpdCAxCit9CisKK2lmIHRlc3QgLXogIiREQlVTX1RPUF9CVUlMRERJUiIgOyB0aGVuCisgICAgZGllICJNdXN0IHNldCBEQlVTX1RPUF9CVUlMRERJUiIKK2ZpCisKKyMjIGNvbnZlbmllbnQgdG8gYmUgYWJsZSB0byBjdHJsK0Mgd2l0aG91dCBsZWFraW5nIHRoZSBtZXNzYWdlIGJ1cyBwcm9jZXNzCit0cmFwICdkaWUgIlJlY2VpdmVkIFNJR0lOVCInIElOVAorCitDT05GSUdfRklMRT0uL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5jb25mCitTRVJWSUNFX0RJUj0iJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzIgorRVNDQVBFRF9TRVJWSUNFX0RJUj1gZWNobyAkU0VSVklDRV9ESVIgfCBzZWQgLWUgJ3MvXC8vXFxcXFxcLy9nJ2AKK2VjaG8gImVzY2FwZWQgc2VydmljZSBkaXIgaXM6ICRFU0NBUEVEX1NFUlZJQ0VfRElSIiA+JjIKKworaWYgdGVzdCAteiAiJFNPVVJDRV9DT05GSUdfRklMRSI7IHRoZW4KKyAgICBTT1VSQ0VfQ09ORklHX0ZJTEU9IiREQlVTX1RPUF9CVUlMRERJUi9idXMvc2Vzc2lvbi5jb25mIjsKK2ZpCisjIyBjcmVhdGUgYSBjb25maWd1cmF0aW9uIGZpbGUgYmFzZWQgb24gdGhlIHN0YW5kYXJkIHNlc3Npb24uY29uZgorY2F0ICRTT1VSQ0VfQ09ORklHX0ZJTEUgfCAgXAorICAgIHNlZCAtZSAncy88c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy4qJC88c2VydmljZWRpcj4nJEVTQ0FQRURfU0VSVklDRV9ESVInPFwvc2VydmljZWRpcj4vZycgfCAgXAorICAgIHNlZCAtZSAncy88aW5jbHVkZS4qJC8vZycgICAgICAgICAgICAgICAgXAorICA+ICRDT05GSUdfRklMRQorCitlY2hvICJDcmVhdGVkIGNvbmZpZ3VyYXRpb24gZmlsZSAkQ09ORklHX0ZJTEUiID4mMgorCitpZiAhIHRlc3QgLWUgIiREQlVTX1RPUF9CVUlMRERJUiIvYnVzL2RidXMtZGFlbW9uIDsgdGhlbgorICAgIGRpZSAiJERCVVNfVE9QX0JVSUxERElSL2J1cy9kYnVzLWRhZW1vbiBkb2VzIG5vdCBleGlzdCIKK2ZpCisKK1BBVEg9IiREQlVTX1RPUF9CVUlMRERJUiIvYnVzOiRQQVRICitleHBvcnQgUEFUSAorCisjIyB0aGUgbGlidG9vbCBzY3JpcHQgZm91bmQgYnkgdGhlIHBhdGggc2VhcmNoIHNob3VsZCBhbHJlYWR5IGRvIHRoaXMsIGJ1dAorTERfTElCUkFSWV9QQVRIPSREQlVTX1RPUF9CVUlMRERJUi9kYnVzLy5saWJzOiRMRF9MSUJSQVJZX1BBVEgKK2V4cG9ydCBMRF9MSUJSQVJZX1BBVEgKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUwordW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKKworZWNobyAiUnVubmluZyAkREJVU19UT1BfQlVJTERESVIvdG9vbHMvZGJ1cy1sYXVuY2ggLS1zaC1zeW50YXggLS1jb25maWctZmlsZT0kQ09ORklHX0ZJTEUiID4mMgorCitEQlVTX1VTRV9URVNUX0JJTkFSWT0xIAorZXhwb3J0IERCVVNfVVNFX1RFU1RfQklOQVJZCitldmFsIGAkREJVU19UT1BfQlVJTERESVIvdG9vbHMvZGJ1cy1sYXVuY2ggLS1zaC1zeW50YXggLS1jb25maWctZmlsZT0kQ09ORklHX0ZJTEVgCisKK2lmIHRlc3QgLXogIiREQlVTX1NFU1NJT05fQlVTX1BJRCIgOyB0aGVuCisgICAgZGllICJGYWlsZWQgdG8gbGF1bmNoIG1lc3NhZ2UgYnVzIGZvciB0ZXN0IHNjcmlwdCB0byBydW4iCitmaQorCitlY2hvICJTdGFydGVkIGJ1cyBwaWQgJERCVVNfU0VTU0lPTl9CVVNfUElEIGF0ICREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiID4mMgorCisjIEV4ZWN1dGUgd3JhcHBlZCBzY3JpcHQKK2VjaG8gIlJ1bm5pbmcgJFdSQVBQRURfU0NSSVBUICRAIiA+JjIKKyRXUkFQUEVEX1NDUklQVCAiJEAiIHx8IGRpZSAic2NyaXB0IFwiJFdSQVBQRURfU0NSSVBUXCIgZmFpbGVkIgorCitraWxsIC1URVJNICREQlVTX1NFU1NJT05fQlVTX1BJRCB8fCBkaWUgIk1lc3NhZ2UgYnVzIHZhbmlzaGVkISBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQiICYmIGVjaG8gIktpbGxlZCBkYWVtb24gJERCVVNfU0VTU0lPTl9CVVNfUElEIiA+JjIKKworc2xlZXAgMgorCisjIyBiZSBzdXJlIGl0IHJlYWxseSBkaWVkIAora2lsbCAtOSAkREJVU19TRVNTSU9OX0JVU19QSUQgPiAvZGV2L251bGwgMj4mMSB8fCB0cnVlCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZGJ1cy0xLjQuMTAvdG9vbHMvc3RydG9sbC5jIGIvZGJ1cy0xLjQuMTAvdG9vbHMvc3RydG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjU3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90b29scy9zdHJ0b2xsLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIERCVVNfV0lOQ0UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBpc3NwYWNlCisjZGVmaW5lIGlzc3BhY2UoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcgfHwgKGMpID09ICdccicgfHwgKGMpID09ICdcbicpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyNpZm5kZWYgTExPTkdfTUFYCisjICAgZGVmaW5lIExMT05HX01BWAk5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01JTgorIyAgIGRlZmluZSBMTE9OR19NSU4JKC1MTE9OR19NQVggLSAxTEwpCisjZW5kaWYKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworI2lmbmRlZiBVTExPTkdfTUFYCisjICAgZGVmaW5lIFVMTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwKKyNlbmRpZgorLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGxvbmcgaW50ZWdlci4KKyAqCisgKiBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCisgKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgorICovCitsb25nIGxvbmcgc3RydG9sbCAoY29uc3QgY2hhciosIGNoYXIgKiosIGludCk7CisKK2xvbmcgbG9uZworc3RydG9sbChjb25zdCBjaGFyICogbnB0ciwgY2hhciAqKiBlbmRwdHIsIGludCBiYXNlKQoreworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgbG9uZyBsb25nIGFjYzsKKwljaGFyIGM7CisJdW5zaWduZWQgbG9uZyBsb25nIGN1dG9mZjsKKwlpbnQgbmVnLCBhbnksIGN1dGxpbTsKKworCS8qCisJICogU2tpcCB3aGl0ZSBzcGFjZSBhbmQgcGljayB1cCBsZWFkaW5nICsvLSBzaWduIGlmIGFueS4KKwkgKiBJZiBiYXNlIGlzIDAsIGFsbG93IDB4IGZvciBoZXggYW5kIDAgZm9yIG9jdGFsLCBlbHNlCisJICogYXNzdW1lIGRlY2ltYWw7IGlmIGJhc2UgaXMgYWxyZWFkeSAxNiwgYWxsb3cgMHguCisJICovCisJcyA9IG5wdHI7CisJZG8geworCQljID0gKnMrKzsKKwl9IHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKWMpKTsKKwlpZiAoYyA9PSAnLScpIHsKKwkJbmVnID0gMTsKKwkJYyA9ICpzKys7CisJfSBlbHNlIHsKKwkJbmVnID0gMDsKKwkJaWYgKGMgPT0gJysnKQorCQkJYyA9ICpzKys7CisJfQorCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCisJICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSAmJgorCSAgICAoKHNbMV0gPj0gJzAnICYmIHNbMV0gPD0gJzknKSB8fAorCSAgICAoc1sxXSA+PSAnQScgJiYgc1sxXSA8PSAnRicpIHx8CisJICAgIChzWzFdID49ICdhJyAmJiBzWzFdIDw9ICdmJykpKSB7CisJCWMgPSBzWzFdOworCQlzICs9IDI7CisJCWJhc2UgPSAxNjsKKwl9CisJaWYgKGJhc2UgPT0gMCkKKwkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOworCWFjYyA9IGFueSA9IDA7CisJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwkJZ290byBub2NvbnY7CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIGN1dG9mZiB2YWx1ZSBiZXR3ZWVuIGxlZ2FsIG51bWJlcnMgYW5kIGlsbGVnYWwKKwkgKiBudW1iZXJzLiAgVGhhdCBpcyB0aGUgbGFyZ2VzdCBsZWdhbCB2YWx1ZSwgZGl2aWRlZCBieSB0aGUKKwkgKiBiYXNlLiAgQW4gaW5wdXQgbnVtYmVyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUsIGlmCisJICogZm9sbG93ZWQgYnkgYSBsZWdhbCBpbnB1dCBjaGFyYWN0ZXIsIGlzIHRvbyBiaWcuICBPbmUgdGhhdAorCSAqIGlzIGVxdWFsIHRvIHRoaXMgdmFsdWUgbWF5IGJlIHZhbGlkIG9yIG5vdDsgdGhlIGxpbWl0CisJICogYmV0d2VlbiB2YWxpZCBhbmQgaW52YWxpZCBudW1iZXJzIGlzIHRoZW4gYmFzZWQgb24gdGhlIGxhc3QKKwkgKiBkaWdpdC4gIEZvciBpbnN0YW5jZSwgaWYgdGhlIHJhbmdlIGZvciBxdWFkcyBpcworCSAqIFstOTIyMzM3MjAzNjg1NDc3NTgwOC4uOTIyMzM3MjAzNjg1NDc3NTgwN10gYW5kIHRoZSBpbnB1dCBiYXNlCisJICogaXMgMTAsIGN1dG9mZiB3aWxsIGJlIHNldCB0byA5MjIzMzcyMDM2ODU0Nzc1ODAgYW5kIGN1dGxpbSB0bworCSAqIGVpdGhlciA3IChuZWc9PTApIG9yIDggKG5lZz09MSksIG1lYW5pbmcgdGhhdCBpZiB3ZSBoYXZlCisJICogYWNjdW11bGF0ZWQgYSB2YWx1ZSA+IDkyMjMzNzIwMzY4NTQ3NzU4MCwgb3IgZXF1YWwgYnV0IHRoZQorCSAqIG5leHQgZGlnaXQgaXMgPiA3IChvciA4KSwgdGhlIG51bWJlciBpcyB0b28gYmlnLCBhbmQgd2Ugd2lsbAorCSAqIHJldHVybiBhIHJhbmdlIGVycm9yLgorCSAqCisJICogU2V0ICdhbnknIGlmIGFueSBgZGlnaXRzJyBjb25zdW1lZDsgbWFrZSBpdCBuZWdhdGl2ZSB0byBpbmRpY2F0ZQorCSAqIG92ZXJmbG93LgorCSAqLworCWN1dG9mZiA9IG5lZyA/ICh1bnNpZ25lZCBsb25nIGxvbmcpLShMTE9OR19NSU4gKyBMTE9OR19NQVgpICsgTExPTkdfTUFYCisJICAgIDogTExPTkdfTUFYOworCWN1dGxpbSA9IGN1dG9mZiAlIGJhc2U7CisJY3V0b2ZmIC89IGJhc2U7CisJZm9yICggOyA7IGMgPSAqcysrKSB7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCWMgLT0gJzAnOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkJCWMgLT0gJ0EnIC0gMTA7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQkJYyAtPSAnYScgLSAxMDsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWlmIChjID49IGJhc2UpCisJCQlicmVhazsKKwkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKQorCQkJYW55ID0gLTE7CisJCWVsc2UgeworCQkJYW55ID0gMTsKKwkJCWFjYyAqPSBiYXNlOworCQkJYWNjICs9IGM7CisJCX0KKwl9CisJaWYgKGFueSA8IDApIHsKKwkJYWNjID0gbmVnID8gTExPTkdfTUlOIDogTExPTkdfTUFYOworI2lmZGVmIERCVVNfV0lOQ0UKKwkJU2V0TGFzdEVycm9yIChFUlJPUl9BUklUSE1FVElDX09WRVJGTE9XKTsKKyNlbHNlCisJCWVycm5vID0gRVJBTkdFOworI2VuZGlmCisJfSBlbHNlIGlmICghYW55KSB7Citub2NvbnY6CisjaWZkZWYgREJVU19XSU5DRQorCQlTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyNlbHNlCisJCWVycm5vID0gRUlOVkFMOworI2VuZGlmCisJfSBlbHNlIGlmIChuZWcpCisJCWFjYyA9IC1hY2M7CisJaWYgKGVuZHB0ciAhPSBOVUxMKQorCQkqZW5kcHRyID0gKGNoYXIgKikoYW55ID8gcyAtIDEgOiBucHRyKTsKKwlyZXR1cm4gKGFjYyk7Cit9CisKZGlmZiAtLWdpdCBhL2RidXMtMS40LjEwL3Rvb2xzL3N0cnRvdWxsLmMgYi9kYnVzLTEuNC4xMC90b29scy9zdHJ0b3VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWM1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEuNC4xMC90b29scy9zdHJ0b3VsbC5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBEQlVTX1dJTkNFCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgaXNzcGFjZQorI2RlZmluZSBpc3NwYWNlKGMpICgoYykgPT0gJyAnIHx8IChjKSA9PSAnXHQnIHx8IChjKSA9PSAnXHInIHx8IChjKSA9PSAnXG4nKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjaWZuZGVmIExMT05HX01BWAorIyAgIGRlZmluZSBMTE9OR19NQVgJOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZW5kaWYKKworI2lmbmRlZiBMTE9OR19NSU4KKyMgICBkZWZpbmUgTExPTkdfTUlOCSgtTExPTkdfTUFYIC0gMUxMKQorI2VuZGlmCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDAuKSAgKi8KKyNpZm5kZWYgVUxMT05HX01BWAorIyAgIGRlZmluZSBVTExPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBsb25nIGludGVnZXIuCisgKgorICogQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQorICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIHN0cnRvdWxsIChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZworc3RydG91bGwoY29uc3QgY2hhciAqIG5wdHIsIGNoYXIgKiogZW5kcHRyLCBpbnQgYmFzZSkKK3sKKwljb25zdCBjaGFyICpzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBhY2M7CisJY2hhciBjOworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXRvZmY7CisJaW50IG5lZywgYW55LCBjdXRsaW07CisKKwkvKgorCSAqIFNlZSBzdHJ0b3EgZm9yIGNvbW1lbnRzIGFzIHRvIHRoZSBsb2dpYyB1c2VkLgorCSAqLworCXMgPSBucHRyOworCWRvIHsKKwkJYyA9ICpzKys7CisJfSB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhciljKSk7CisJaWYgKGMgPT0gJy0nKSB7CisJCW5lZyA9IDE7CisJCWMgPSAqcysrOworCX0gZWxzZSB7CisJCW5lZyA9IDA7CisJCWlmIChjID09ICcrJykKKwkJCWMgPSAqcysrOworCX0KKwlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgorCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykgJiYKKwkgICAgKChzWzFdID49ICcwJyAmJiBzWzFdIDw9ICc5JykgfHwKKwkgICAgKHNbMV0gPj0gJ0EnICYmIHNbMV0gPD0gJ0YnKSB8fAorCSAgICAoc1sxXSA+PSAnYScgJiYgc1sxXSA8PSAnZicpKSkgeworCQljID0gc1sxXTsKKwkJcyArPSAyOworCQliYXNlID0gMTY7CisJfQorCWlmIChiYXNlID09IDApCisJCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKKwlhY2MgPSBhbnkgPSAwOworCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCisJCWdvdG8gbm9jb252OworCisJY3V0b2ZmID0gVUxMT05HX01BWCAvIGJhc2U7CisJY3V0bGltID0gVUxMT05HX01BWCAlIGJhc2U7CisJZm9yICggOyA7IGMgPSAqcysrKSB7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCWMgLT0gJzAnOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkJCWMgLT0gJ0EnIC0gMTA7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQkJYyAtPSAnYScgLSAxMDsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWlmIChjID49IGJhc2UpCisJCQlicmVhazsKKwkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IChhY2MgPT0gY3V0b2ZmICYmIGMgPiBjdXRsaW0pKQorCQkJYW55ID0gLTE7CisJCWVsc2UgeworCQkJYW55ID0gMTsKKwkJCWFjYyAqPSBiYXNlOworCQkJYWNjICs9IGM7CisJCX0KKwl9CisJaWYgKGFueSA8IDApIHsKKwkJYWNjID0gVUxMT05HX01BWDsKKyNpZmRlZiBEQlVTX1dJTkNFCisJCVNldExhc3RFcnJvciAoRVJST1JfQVJJVEhNRVRJQ19PVkVSRkxPVyk7CisjZWxzZQorCQllcnJubyA9IEVSQU5HRTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoIWFueSkgeworbm9jb252OgorI2lmZGVmIERCVVNfV0lOQ0UKKwkJU2V0TGFzdEVycm9yIChFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisjZWxzZQorCQllcnJubyA9IEVJTlZBTDsKKyNlbmRpZgorCX0gZWxzZSBpZiAobmVnKQorCQlhY2MgPSAtYWNjOworCWlmIChlbmRwdHIgIT0gTlVMTCkKKwkJKmVuZHB0ciA9IChjaGFyICopKGFueSA/IHMgLSAxIDogbnB0cik7CisJcmV0dXJuIChhY2MpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy50YXIuZ3ogYi9kYnVzLnRhci5negpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQxZGUwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy50YXIuZ3oKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZGJ1cy51cmwgYi9kYnVzLnVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjVhZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy51cmwKQEAgLTAsMCArMSBAQAoraHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL3JlbGVhc2VzL2RidXMvZGJ1cy0xLjQuMTAudGFyLmd6CmRpZmYgLS1naXQgYS9kYnVzLnZlcnNpb24gYi9kYnVzLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5Zjc5YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMudmVyc2lvbgpAQCAtMCwwICsxIEBACisxLjQuMTAK